You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1845 lines
56 KiB
C++
1845 lines
56 KiB
C++
// XTPMarkupBuilder.cpp: implementation of the CXTPMarkupBuilder class.
|
|
//
|
|
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "Common/XTPVc80Helpers.h"
|
|
|
|
#include "XTPMarkupBuilder.h"
|
|
#include "XTPMarkupParser.h"
|
|
#include "XTPMarkupObject.h"
|
|
#include "XTPMarkupInputElement.h"
|
|
#include "XTPMarkupUIElement.h"
|
|
#include "XTPMarkupFrameworkElement.h"
|
|
#include "XTPMarkupControl.h"
|
|
|
|
#include "XTPMarkupDrawingContext.h"
|
|
#include "XTPMarkupContext.h"
|
|
#include "XTPMarkupTextBlock.h"
|
|
#include "Text/XTPMarkupInline.h"
|
|
#include "Text/XTPMarkupRun.h"
|
|
#include "XTPMarkupScrollViewer.h"
|
|
#include "XTPMarkupResourceDictionary.h"
|
|
#include "XTPMarkupShape.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
class CXTPMarkupObjectProperty : public CXTPMarkupObject
|
|
{
|
|
DECLARE_MARKUPCLASS(CXTPMarkupObjectProperty)
|
|
public:
|
|
CXTPMarkupObjectProperty(CXTPMarkupDependencyProperty* pProperty = 0)
|
|
{
|
|
m_pProperty = pProperty;
|
|
m_pContent = NULL;
|
|
m_pCollection = NULL;
|
|
}
|
|
|
|
~CXTPMarkupObjectProperty()
|
|
{
|
|
MARKUP_RELEASE(m_pContent);
|
|
MARKUP_RELEASE(m_pCollection);
|
|
}
|
|
|
|
virtual void SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pContent)
|
|
{
|
|
CXTPMarkupType* pContentType = m_pProperty->GetPropetyType();
|
|
|
|
if (pContent->IsKindOf(pContentType))
|
|
{
|
|
m_pContent = pContent;
|
|
}
|
|
else if (IsStringObject(pContent))
|
|
{
|
|
m_pContent = pContent;
|
|
}
|
|
else
|
|
{
|
|
if (m_pContent == NULL)
|
|
{
|
|
m_pCollection = pBuilder->GetMarkupContext()->CreateMarkupObject(m_pProperty->GetPropetyType());
|
|
if (m_pCollection) m_pCollection->SetContentObject(pBuilder, pContent);
|
|
|
|
m_pContent = m_pCollection;
|
|
m_pCollection = NULL;
|
|
}
|
|
else
|
|
{
|
|
m_pContent->SetContentObject(pBuilder, pContent);
|
|
}
|
|
}
|
|
}
|
|
|
|
CXTPMarkupObject* FindResource(const CXTPMarkupObject* pKey) const
|
|
{
|
|
if (m_pContent)
|
|
return CXTPMarkupResourceDictionary::FindResource(m_pContent, pKey);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* m_pContent;
|
|
CXTPMarkupObject* m_pCollection;
|
|
CXTPMarkupDependencyProperty* m_pProperty;
|
|
};
|
|
|
|
IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupObjectProperty, CXTPMarkupObject)
|
|
|
|
void CXTPMarkupObjectProperty::RegisterMarkupClass()
|
|
{
|
|
|
|
}
|
|
|
|
class CXTPMarkupColorKey : public CXTPMarkupObject
|
|
{
|
|
DECLARE_MARKUPCLASS(CXTPMarkupColorKey);
|
|
|
|
public:
|
|
CXTPMarkupColorKey(int nIndex = 0)
|
|
{
|
|
m_nIndex = nIndex;
|
|
}
|
|
|
|
public:
|
|
int m_nIndex;
|
|
};
|
|
|
|
IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupColorKey, CXTPMarkupObject)
|
|
|
|
void CXTPMarkupColorKey::RegisterMarkupClass()
|
|
{
|
|
|
|
}
|
|
|
|
class CXTPMarkupBrushKey : public CXTPMarkupObject
|
|
{
|
|
DECLARE_MARKUPCLASS(CXTPMarkupBrushKey);
|
|
|
|
public:
|
|
CXTPMarkupBrushKey(int nIndex = 0)
|
|
{
|
|
m_nIndex = nIndex;
|
|
}
|
|
|
|
public:
|
|
int m_nIndex;
|
|
};
|
|
|
|
IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupBrushKey, CXTPMarkupObject)
|
|
|
|
void CXTPMarkupBrushKey::RegisterMarkupClass()
|
|
{
|
|
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPMarkupBuilder::CStaticExtension
|
|
|
|
class CXTPMarkupBuilder::CStaticExtension
|
|
{
|
|
public:
|
|
CStaticExtension();
|
|
~CStaticExtension();
|
|
public:
|
|
CXTPMarkupObject* ProvideValue(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue);
|
|
|
|
public:
|
|
CXTPMarkupObject* GetSystemColor(LPCWSTR lpszValue);
|
|
CXTPMarkupObject* GetSystemBrush(LPCWSTR lpszValue);
|
|
CXTPMarkupObject* GetSystemColor(int nIndex);
|
|
CXTPMarkupObject* GetSystemBrush(int nIndex);
|
|
CXTPMarkupObject* GetSystemColorKey(LPCWSTR lpszValue);
|
|
CXTPMarkupObject* GetSystemBrushKey(LPCWSTR lpszValue);
|
|
int GetSystemIndex(LPCWSTR lpszValue, int nLength);
|
|
|
|
private:
|
|
CXTPMarkupBrush* m_pBrushes[31];
|
|
CXTPMarkupColor* m_pColors[31];
|
|
|
|
CXTPMarkupObject* m_pBrushKeys[31];
|
|
CXTPMarkupObject* m_pColorKeys[31];
|
|
|
|
};
|
|
|
|
CXTPMarkupBuilder::CStaticExtension::CStaticExtension()
|
|
{
|
|
memset(m_pBrushes, 0, sizeof(m_pBrushes));
|
|
memset(m_pColors, 0, sizeof(m_pColors));
|
|
memset(m_pBrushKeys, 0, sizeof(m_pBrushKeys));
|
|
memset(m_pColorKeys, 0, sizeof(m_pColorKeys));
|
|
}
|
|
|
|
CXTPMarkupBuilder::CStaticExtension::~CStaticExtension()
|
|
{
|
|
for (int i = 0; i < 31; i++)
|
|
{
|
|
MARKUP_RELEASE(m_pBrushes[i]);
|
|
MARKUP_RELEASE(m_pColors[i]);
|
|
MARKUP_RELEASE(m_pBrushKeys[i]);
|
|
MARKUP_RELEASE(m_pColorKeys[i]);
|
|
}
|
|
}
|
|
|
|
int CXTPMarkupBuilder::CStaticExtension::GetSystemIndex(LPCWSTR lpszValue, int nLength)
|
|
{
|
|
if (wcsncmp(L"ActiveBorder", lpszValue, nLength) == 0) return 10;
|
|
if (wcsncmp(L"ActiveCaption", lpszValue, nLength) == 0) return 2;
|
|
if (wcsncmp(L"ActiveCaptionText", lpszValue, nLength) == 0) return 9;
|
|
if (wcsncmp(L"AppWorkspace", lpszValue, nLength) == 0) return 12;
|
|
if (wcsncmp(L"Control", lpszValue, nLength) == 0) return 15;
|
|
if (wcsncmp(L"ControlDark", lpszValue, nLength) == 0) return 0x10;
|
|
if (wcsncmp(L"ControlDarkDark", lpszValue, nLength) == 0) return 0x15;
|
|
if (wcsncmp(L"ControlLight", lpszValue, nLength) == 0) return 0x16;
|
|
if (wcsncmp(L"ControlLightLight", lpszValue, nLength) == 0) return 20;
|
|
if (wcsncmp(L"ControlText", lpszValue, nLength) == 0) return 0x12;
|
|
if (wcsncmp(L"Desktop", lpszValue, nLength) == 0) return 1;
|
|
if (wcsncmp(L"GradientActiveCaption", lpszValue, nLength) == 0) return 0x1b;
|
|
if (wcsncmp(L"GradientInactiveCaption", lpszValue, nLength) == 0) return 0x1c;
|
|
if (wcsncmp(L"GrayText", lpszValue, nLength) == 0) return 0x11;
|
|
if (wcsncmp(L"Highlight", lpszValue, nLength) == 0) return 13;
|
|
if (wcsncmp(L"HighlightText", lpszValue, nLength) == 0) return 14;
|
|
if (wcsncmp(L"HotTrack", lpszValue, nLength) == 0) return 0x1a;
|
|
if (wcsncmp(L"InactiveBorder", lpszValue, nLength) == 0) return 11;
|
|
if (wcsncmp(L"InactiveCaption", lpszValue, nLength) == 0) return 3;
|
|
if (wcsncmp(L"InactiveCaptionText", lpszValue, nLength) == 0) return 0x13;
|
|
if (wcsncmp(L"Info", lpszValue, nLength) == 0) return 0x18;
|
|
if (wcsncmp(L"InfoText", lpszValue, nLength) == 0) return 0x17;
|
|
if (wcsncmp(L"Menu", lpszValue, nLength) == 0) return 4;
|
|
if (wcsncmp(L"MenuBar", lpszValue, nLength) == 0) return 30;
|
|
if (wcsncmp(L"MenuHighlight", lpszValue, nLength) == 0) return 0x1d;
|
|
if (wcsncmp(L"MenuText", lpszValue, nLength) == 0) return 7;
|
|
if (wcsncmp(L"ScrollBar", lpszValue, nLength) == 0) return 0;
|
|
if (wcsncmp(L"Window", lpszValue, nLength) == 0) return 5;
|
|
if (wcsncmp(L"WindowFrame", lpszValue, nLength) == 0) return 6;
|
|
if (wcsncmp(L"WindowText", lpszValue, nLength) == 0) return 8;
|
|
|
|
return 0;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemColor(LPCWSTR lpszValue)
|
|
{
|
|
int nLength = (int)wcslen(lpszValue);
|
|
if (nLength < 20)
|
|
return NULL;
|
|
|
|
if (wcsncmp(lpszValue, L"SystemColors.", 13) != 0)
|
|
return NULL;
|
|
|
|
if (wcscmp(lpszValue + nLength - 5, L"Color") != 0)
|
|
return NULL;
|
|
|
|
int nIndex = GetSystemIndex(lpszValue + 13, nLength - 13 - 5);
|
|
if (nIndex == 0)
|
|
return NULL;
|
|
|
|
return GetSystemColor(nIndex);
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemColor(int nIndex)
|
|
{
|
|
if (m_pColors[nIndex] == NULL)
|
|
{
|
|
m_pColors[nIndex] = new CXTPMarkupColor(GetSysColor(nIndex) | 0xFF000000);
|
|
}
|
|
|
|
MARKUP_ADDREF(m_pColors[nIndex]);
|
|
return m_pColors[nIndex];
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemColorKey(LPCWSTR lpszValue)
|
|
{
|
|
int nLength = (int)wcslen(lpszValue);
|
|
if (nLength < 20)
|
|
return NULL;
|
|
|
|
if (wcsncmp(lpszValue, L"SystemColors.", 13) != 0)
|
|
return NULL;
|
|
|
|
if (wcscmp(lpszValue + nLength - 8, L"ColorKey") != 0)
|
|
return NULL;
|
|
|
|
int nIndex = GetSystemIndex(lpszValue + 13, nLength - 13 - 8);
|
|
if (nIndex == 0)
|
|
return NULL;
|
|
|
|
if (m_pColorKeys[nIndex] == NULL)
|
|
{
|
|
m_pColorKeys[nIndex] = new CXTPMarkupColorKey(nIndex);
|
|
}
|
|
|
|
MARKUP_ADDREF(m_pColorKeys[nIndex]);
|
|
return m_pColorKeys[nIndex];
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemBrushKey(LPCWSTR lpszValue)
|
|
{
|
|
int nLength = (int)wcslen(lpszValue);
|
|
if (nLength < 20)
|
|
return NULL;
|
|
|
|
if (wcsncmp(lpszValue, L"SystemColors.", 13) != 0)
|
|
return NULL;
|
|
|
|
if (wcscmp(lpszValue + nLength - 8, L"BrushKey") != 0)
|
|
return NULL;
|
|
|
|
int nIndex = GetSystemIndex(lpszValue + 13, nLength - 13 - 8);
|
|
if (nIndex == 0)
|
|
return NULL;
|
|
|
|
if (m_pBrushKeys[nIndex] == NULL)
|
|
{
|
|
m_pBrushKeys[nIndex] = new CXTPMarkupBrushKey(nIndex);
|
|
}
|
|
|
|
MARKUP_ADDREF(m_pBrushKeys[nIndex]);
|
|
return m_pBrushKeys[nIndex];
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemBrush(LPCWSTR lpszValue)
|
|
{
|
|
int nLength = (int)wcslen(lpszValue);
|
|
if (nLength < 20)
|
|
return NULL;
|
|
|
|
if (wcsncmp(lpszValue, L"SystemColors.", 13) != 0)
|
|
return NULL;
|
|
|
|
if (wcscmp(lpszValue + nLength - 5, L"Brush") != 0)
|
|
return NULL;
|
|
|
|
int nIndex = GetSystemIndex(lpszValue + 13, nLength - 13 - 5);
|
|
if (nIndex == 0)
|
|
return NULL;
|
|
|
|
return GetSystemBrush(nIndex);
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemBrush(int nIndex)
|
|
{
|
|
if (m_pBrushes[nIndex] == NULL)
|
|
{
|
|
m_pBrushes[nIndex] = new CXTPMarkupSolidColorBrush(GetSysColor(nIndex) | 0xFF000000);
|
|
}
|
|
|
|
MARKUP_ADDREF(m_pBrushes[nIndex]);
|
|
return m_pBrushes[nIndex];
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::ProvideValue(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue)
|
|
{
|
|
CXTPMarkupObject* pObject = GetSystemColor(lpszValue);
|
|
if (pObject)
|
|
return pObject;
|
|
|
|
pObject = GetSystemBrush(lpszValue);
|
|
if (pObject)
|
|
return pObject;
|
|
|
|
pObject = GetSystemColorKey(lpszValue);
|
|
if (pObject)
|
|
return pObject;
|
|
|
|
pObject = GetSystemBrushKey(lpszValue);
|
|
if (pObject)
|
|
return pObject;
|
|
|
|
pBuilder->ThrowBuilderException(pBuilder->FormatString(_T("Cannot find the static member '%ls'"), (LPCTSTR)lpszValue));
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPMarkupBuilder::CStaticResourceExtension
|
|
|
|
class CXTPMarkupBuilder::CStaticResourceExtension
|
|
{
|
|
public:
|
|
CStaticResourceExtension();
|
|
~CStaticResourceExtension();
|
|
public:
|
|
CXTPMarkupObject* ProvideValue(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue);
|
|
CXTPMarkupObject* FindResources(CXTPMarkupObject* pElement, CXTPMarkupObject* pValue);
|
|
CXTPMarkupObject* ResolveKey(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue);
|
|
|
|
};
|
|
|
|
CXTPMarkupBuilder::CStaticResourceExtension::CStaticResourceExtension()
|
|
{
|
|
}
|
|
|
|
CXTPMarkupBuilder::CStaticResourceExtension::~CStaticResourceExtension()
|
|
{
|
|
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticResourceExtension::FindResources(CXTPMarkupObject* pElement, CXTPMarkupObject* pKey)
|
|
{
|
|
if (pElement->IsKindOf(MARKUP_TYPE(CXTPMarkupFrameworkElement)))
|
|
{
|
|
CXTPMarkupObject* pValue = ((CXTPMarkupFrameworkElement*)pElement)->FindResource(pKey);
|
|
if (pValue)
|
|
return pValue;
|
|
}
|
|
|
|
if (pElement->IsKindOf(MARKUP_TYPE(CXTPMarkupFrameworkContentElement)))
|
|
{
|
|
CXTPMarkupObject* pValue = ((CXTPMarkupFrameworkContentElement*)pElement)->FindResource(pKey);
|
|
if (pValue)
|
|
return pValue;
|
|
}
|
|
|
|
if (pElement->IsKindOf(MARKUP_TYPE(CXTPMarkupStyle)))
|
|
{
|
|
CXTPMarkupObject* pValue = ((CXTPMarkupStyle*)pElement)->FindResource(pKey);
|
|
if (pValue)
|
|
return pValue;
|
|
}
|
|
|
|
if (pElement->IsKindOf(MARKUP_TYPE(CXTPMarkupObjectProperty)))
|
|
{
|
|
CXTPMarkupObject* pValue = ((CXTPMarkupObjectProperty*)pElement)->FindResource(pKey);
|
|
if (pValue)
|
|
return pValue;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticResourceExtension::ResolveKey(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue)
|
|
{
|
|
while (*lpszValue == ' ' || *lpszValue == '\n' || *lpszValue == '\r')
|
|
lpszValue++;
|
|
|
|
if (lpszValue[0] == '{')
|
|
{
|
|
if (lpszValue[1] == '}')
|
|
{
|
|
lpszValue = lpszValue + 2;
|
|
}
|
|
else
|
|
{
|
|
return pBuilder->ResolveMarkupExtension(lpszValue + 1);
|
|
}
|
|
}
|
|
|
|
return CXTPMarkupString::CreateValue(lpszValue);
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CStaticResourceExtension::ProvideValue(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue)
|
|
{
|
|
CXTPMarkupObject* pKey = ResolveKey(pBuilder, lpszValue);
|
|
if (!pKey)
|
|
return NULL;
|
|
|
|
POSITION pos = pBuilder->m_arrObjects.GetTailPosition();
|
|
while (pos)
|
|
{
|
|
CXTPMarkupObject* pElement = pBuilder->m_arrObjects.GetPrev(pos);
|
|
|
|
CXTPMarkupObject* pValue = FindResources(pElement, pKey);
|
|
|
|
if (pValue)
|
|
{
|
|
MARKUP_RELEASE(pKey);
|
|
MARKUP_ADDREF(pValue);
|
|
return pValue;
|
|
}
|
|
}
|
|
|
|
if (pKey->IsKindOf(MARKUP_TYPE(CXTPMarkupColorKey)))
|
|
{
|
|
CXTPMarkupObject* pValue = pBuilder->GetStaticExtension()->GetSystemColor(((CXTPMarkupColorKey*)pKey)->m_nIndex);
|
|
MARKUP_RELEASE(pKey);
|
|
return pValue;
|
|
}
|
|
|
|
if (pKey->IsKindOf(MARKUP_TYPE(CXTPMarkupBrushKey)))
|
|
{
|
|
CXTPMarkupObject* pValue = pBuilder->GetStaticExtension()->GetSystemBrush(((CXTPMarkupBrushKey*)pKey)->m_nIndex);
|
|
MARKUP_RELEASE(pKey);
|
|
return pValue;
|
|
}
|
|
|
|
MARKUP_RELEASE(pKey);
|
|
|
|
pBuilder->ThrowBuilderException(pBuilder->FormatString(_T("Cannot find resource named '%ls'. Resource names are case sensitive"), (LPCTSTR)lpszValue));
|
|
|
|
return 0;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPMarkupBuilder
|
|
|
|
CXTPMarkupBuilder::CStaticExtension* CXTPMarkupBuilder::GetStaticExtension()
|
|
{
|
|
if (m_pStaticExtension == NULL)
|
|
{
|
|
m_pStaticExtension = new CStaticExtension();
|
|
}
|
|
|
|
return m_pStaticExtension ;
|
|
}
|
|
|
|
CXTPMarkupBuilder::CStaticResourceExtension* CXTPMarkupBuilder::GetStaticResourceExtension()
|
|
{
|
|
if (m_pStaticResourceExtension == NULL)
|
|
{
|
|
m_pStaticResourceExtension = new CStaticResourceExtension();
|
|
}
|
|
|
|
return m_pStaticResourceExtension ;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPMarkupBuilderException
|
|
|
|
IMPLEMENT_DYNAMIC(CXTPMarkupBuilderException, CException)
|
|
|
|
CXTPMarkupBuilderException::CXTPMarkupBuilderException(LPCTSTR lpszError)
|
|
{
|
|
m_bInitialized = TRUE;
|
|
m_bLoaded = TRUE;
|
|
|
|
m_szMessage[255] = 0;
|
|
STRNCPY_S(m_szMessage, 256, lpszError, 255);
|
|
}
|
|
|
|
BOOL CXTPMarkupBuilderException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext)
|
|
{
|
|
ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));
|
|
if (!lpszError)
|
|
return FALSE;
|
|
|
|
if (pnHelpContext != NULL)
|
|
*pnHelpContext = 0;
|
|
|
|
// if we didn't load our string (eg, we're a console app)
|
|
lstrcpyn(lpszError, m_szMessage, nMaxError);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CStringBuilder
|
|
|
|
class CXTPMarkupBuilder::CStringBuilder
|
|
{
|
|
public:
|
|
CStringBuilder();
|
|
~CStringBuilder();
|
|
|
|
public:
|
|
void Add(LPCWSTR lpszWord);
|
|
void Empty();
|
|
|
|
int GetLength() const
|
|
{
|
|
return m_nLength;
|
|
}
|
|
|
|
LPCWSTR GetBuffer()
|
|
{
|
|
ASSERT(m_lpszData);
|
|
ASSERT(m_nLength < m_nAlloc);
|
|
m_lpszData[m_nLength] = 0;
|
|
|
|
return m_lpszData;
|
|
}
|
|
|
|
protected:
|
|
int m_nAlloc;
|
|
int m_nLength;
|
|
LPWSTR m_lpszData;
|
|
};
|
|
|
|
CXTPMarkupBuilder::CStringBuilder::CStringBuilder()
|
|
{
|
|
m_nAlloc = 0;
|
|
m_nLength = 0;
|
|
m_lpszData = NULL;
|
|
}
|
|
|
|
CXTPMarkupBuilder::CStringBuilder::~CStringBuilder()
|
|
{
|
|
if (m_lpszData)
|
|
{
|
|
delete[] m_lpszData;
|
|
}
|
|
}
|
|
|
|
void CXTPMarkupBuilder::CStringBuilder::Add(LPCWSTR lpszWord)
|
|
{
|
|
int nWordLength = (int)wcslen(lpszWord);
|
|
|
|
if (m_nAlloc < m_nLength + nWordLength + 1)
|
|
{
|
|
int nAlloc = m_nLength + max(256, nWordLength + 1);
|
|
LPWSTR lpszData = new WCHAR[nAlloc];
|
|
|
|
if (m_nLength > 0) memcpy(lpszData, m_lpszData, m_nLength * sizeof(WCHAR));
|
|
if (m_lpszData) delete[] m_lpszData;
|
|
|
|
m_lpszData = lpszData;
|
|
m_nAlloc = nAlloc;
|
|
}
|
|
|
|
memcpy(m_lpszData + m_nLength, lpszWord, nWordLength * sizeof(WCHAR));
|
|
m_nLength += nWordLength;
|
|
}
|
|
|
|
void CXTPMarkupBuilder::CStringBuilder::Empty()
|
|
{
|
|
m_nLength = 0;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CXTPMarkupBuilder::CXTPMarkupBuilder(CXTPMarkupContext* pContext)
|
|
{
|
|
m_pMarkupContext = pContext;
|
|
ASSERT(m_pMarkupContext);
|
|
|
|
m_pStaticExtension = NULL;
|
|
m_pStaticResourceExtension = NULL;
|
|
}
|
|
|
|
CXTPMarkupBuilder::~CXTPMarkupBuilder()
|
|
{
|
|
SAFE_DELETE(m_pStaticExtension);
|
|
SAFE_DELETE(m_pStaticResourceExtension);
|
|
}
|
|
|
|
|
|
inline LPWSTR DupString(LPCWSTR lpszString)
|
|
{
|
|
int nLen = (int)wcslen(lpszString);
|
|
LPWSTR lpcw = new WCHAR[nLen + 1];
|
|
MEMCPY_S(lpcw, lpszString, (nLen + 1) * sizeof(WCHAR));
|
|
return lpcw;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CreateObject(LPCWSTR lpszTag)
|
|
{
|
|
CXTPMarkupType* pType = CXTPMarkupType::LookupTag(lpszTag);
|
|
if (!pType)
|
|
return NULL;
|
|
|
|
CXTPMarkupObject* pMarkupObject = m_pMarkupContext->CreateMarkupObject(pType);
|
|
|
|
if (!pMarkupObject)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
return pMarkupObject;
|
|
}
|
|
|
|
CString CXTPMarkupBuilder::FormatString(LPCTSTR lpszFormat, LPCTSTR lpszParameter)
|
|
{
|
|
CString str;
|
|
str.Format(lpszFormat, lpszParameter);
|
|
return str;
|
|
}
|
|
|
|
CString CXTPMarkupBuilder::FormatString(LPCTSTR lpszFormat, LPCTSTR lpszParameter1, LPCTSTR lpszParameter2)
|
|
{
|
|
CString str;
|
|
str.Format(lpszFormat, lpszParameter1, lpszParameter2);
|
|
return str;
|
|
}
|
|
|
|
CString CXTPMarkupBuilder::FormatString(LPCTSTR lpszFormat, LPCTSTR lpszParameter1, LPCTSTR lpszParameter2, LPCTSTR lpszParameter3)
|
|
{
|
|
CString str;
|
|
str.Format(lpszFormat, lpszParameter1, lpszParameter2, lpszParameter3);
|
|
return str;
|
|
}
|
|
|
|
CXTPMarkupDependencyProperty* CXTPMarkupBuilder::FindProperty(LPCWSTR lpszTag, LPCWSTR lpszAttribute)
|
|
{
|
|
CXTPMarkupType* pType = CXTPMarkupType::LookupTag(lpszTag);
|
|
if (!pType)
|
|
return NULL;
|
|
|
|
return CXTPMarkupDependencyProperty::FindProperty(pType, lpszAttribute);
|
|
}
|
|
|
|
CXTPMarkupDependencyProperty* CXTPMarkupBuilder::FindProperty(CXTPMarkupType* pRuntimeClass, LPCWSTR lpszAttribute)
|
|
{
|
|
LPCWSTR lpszAttributeDot = wcschr(lpszAttribute, L'.');
|
|
|
|
if (lpszAttributeDot != NULL)
|
|
{
|
|
*(LPWSTR)lpszAttributeDot = 0;
|
|
CXTPMarkupDependencyProperty* pProperty = FindProperty(lpszAttribute, lpszAttributeDot + 1);
|
|
*(LPWSTR)lpszAttributeDot = '.';
|
|
|
|
return pProperty;
|
|
}
|
|
|
|
if (!pRuntimeClass)
|
|
return NULL;
|
|
|
|
return CXTPMarkupDependencyProperty::FindProperty(pRuntimeClass, lpszAttribute);
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertValue(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pValue)
|
|
{
|
|
CXTPMarkupObject* pNewValue = NULL;
|
|
|
|
if (pProperty->GetMetadata() && pProperty->GetMetadata()->m_pConverter)
|
|
{
|
|
pNewValue = (*pProperty->GetMetadata()->m_pConverter)(this, pValue);
|
|
}
|
|
|
|
if (pNewValue == NULL)
|
|
{
|
|
CXTPMarkupAutoPtr pConverter(GetMarkupContext()->CreateMarkupObject(pProperty->GetPropetyType()));
|
|
pNewValue = pConverter->ConvertFrom(this, pValue);
|
|
}
|
|
|
|
if (!pNewValue)
|
|
{
|
|
ThrowBuilderException(CXTPMarkupBuilder::FormatString(_T("Cannot convert string in attribute '%ls' to object of type '%ls'"),
|
|
(LPCTSTR)pProperty->GetName(), (LPCTSTR)pProperty->GetPropetyType()->m_lpszClassName));
|
|
}
|
|
return pNewValue;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::CreateTypeKey(LPCWSTR lpszType)
|
|
{
|
|
CXTPMarkupType* pType = CXTPMarkupType::LookupTag(lpszType);
|
|
if (!pType)
|
|
{
|
|
ThrowBuilderException(FormatString(_T("Cannot find type '%ls'"), (LPCTSTR)lpszType));
|
|
return NULL;
|
|
}
|
|
|
|
pType->AddRef();
|
|
return pType;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ResolveMarkupExtension(LPCWSTR lpszValue)
|
|
{
|
|
int nLength = (int)wcslen(lpszValue);
|
|
|
|
if (lpszValue[nLength - 1] != '}')
|
|
{
|
|
ThrowBuilderException(_T("Markup extension expressions must end with '}'"));
|
|
}
|
|
|
|
*((LPWSTR)lpszValue + nLength - 1) = '\0';
|
|
|
|
if (wcsncmp(lpszValue, L"x:Static ", 9) == 0)
|
|
{
|
|
return GetStaticExtension()->ProvideValue(this, lpszValue + 9);
|
|
}
|
|
|
|
if (wcsncmp(lpszValue, L"StaticResource ", 15) == 0)
|
|
{
|
|
return GetStaticResourceExtension()->ProvideValue(this, lpszValue + 15);
|
|
}
|
|
|
|
if (wcsncmp(lpszValue, L"DynamicResource ", 16) == 0)
|
|
{
|
|
return GetStaticResourceExtension()->ProvideValue(this, lpszValue + 16);
|
|
}
|
|
|
|
if (wcsncmp(lpszValue, L"x:Type ", 7) == 0)
|
|
{
|
|
return CreateTypeKey(lpszValue + 7);
|
|
}
|
|
|
|
ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszValue));
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupUIElement* CXTPMarkupBuilder::Parse(CXTPMarkupParser* pParser)
|
|
{
|
|
m_strLastError.Empty();
|
|
|
|
if (!pParser->FindFirstTag())
|
|
{
|
|
m_strLastError = _T("Data at the root level is invalid");
|
|
return NULL;
|
|
}
|
|
|
|
ASSERT(m_arrObjects.IsEmpty());
|
|
|
|
CXTPMarkupObject* pRootElement = NULL;
|
|
CXTPMarkupObject* pContentObject = NULL;
|
|
|
|
CStringBuilder strBody;
|
|
|
|
BOOL bBodySpace = FALSE;
|
|
|
|
TRY
|
|
{
|
|
for (;;)
|
|
{
|
|
CXTPMarkupParser::TokenType t = pParser->GetNextToken();
|
|
|
|
switch (t)
|
|
{
|
|
case CXTPMarkupParser::tokenError:
|
|
{
|
|
ThrowBuilderException(FormatString(_T("%ls"), (LPCTSTR)pParser->GetValue()));
|
|
}
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenEof:
|
|
{
|
|
if (pRootElement == NULL)
|
|
ThrowBuilderException(_T("Root element is missing"));
|
|
|
|
if (!m_arrObjects.IsEmpty())
|
|
{
|
|
ThrowBuilderException(FormatString(_T("Unexpected end of file has occurred. The following elements are not closed: '%ls'"), (LPCTSTR)m_arrObjects.GetTail()->m_lpMarkupTag));
|
|
}
|
|
|
|
}
|
|
goto FINISH;
|
|
|
|
case CXTPMarkupParser::tokenTagStart:
|
|
{
|
|
if (m_arrObjects.IsEmpty() && pRootElement)
|
|
{
|
|
ThrowBuilderException(_T("There are multiple root elements"));
|
|
}
|
|
|
|
if (!m_arrObjects.IsEmpty())
|
|
{
|
|
CXTPMarkupObject* pLastObject = m_arrObjects.GetTail();
|
|
if (strBody.GetLength() > 0)
|
|
{
|
|
if (bBodySpace) strBody.Add(L" ");
|
|
pContentObject = CXTPMarkupString::CreateValue(strBody.GetBuffer(), strBody.GetLength());
|
|
pLastObject->SetContentObject(this, pContentObject);
|
|
pContentObject = NULL;
|
|
}
|
|
else if (bBodySpace && pLastObject->HasContentObject() && pLastObject->AllowWhiteSpaceContent())
|
|
{
|
|
pContentObject = CXTPMarkupString::CreateValue(L" ", 1);
|
|
pLastObject->SetContentObject(this, pContentObject);
|
|
pContentObject = NULL;
|
|
}
|
|
}
|
|
|
|
strBody.Empty();
|
|
bBodySpace = FALSE;
|
|
|
|
LPCWSTR lpszTagName = pParser->GetTagName();
|
|
LPCWSTR lpszAttributeDot = wcschr(lpszTagName, L'.');
|
|
|
|
CXTPMarkupObject* pObject = NULL;
|
|
|
|
if (lpszAttributeDot != NULL)
|
|
{
|
|
*(LPWSTR)lpszAttributeDot = 0;
|
|
CXTPMarkupDependencyProperty* pProperty = FindProperty(lpszTagName, lpszAttributeDot + 1);
|
|
*(LPWSTR)lpszAttributeDot = '.';
|
|
|
|
if (!pProperty)
|
|
{
|
|
ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszTagName));
|
|
}
|
|
|
|
if (m_arrObjects.IsEmpty())
|
|
{
|
|
ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszTagName));
|
|
}
|
|
|
|
/*if (!m_arrObjects.GetTail()->IsPropertySupported(pProperty))
|
|
{
|
|
ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszTagName));
|
|
}*/
|
|
|
|
pObject = new CXTPMarkupObjectProperty(pProperty);
|
|
|
|
m_arrObjects.AddTail(pObject);
|
|
}
|
|
else
|
|
{
|
|
pObject = CreateObject(lpszTagName);
|
|
if (!pObject)
|
|
{
|
|
ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszTagName));
|
|
}
|
|
|
|
m_arrObjects.AddTail(pObject);
|
|
}
|
|
pObject->m_lpMarkupTag = DupString(lpszTagName);
|
|
}
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenTagEnd:
|
|
{
|
|
LPCWSTR lpszTagName = pParser->GetTagName();
|
|
|
|
if (m_arrObjects.IsEmpty())
|
|
{
|
|
ThrowBuilderException(_T("Unexpected end tag"));
|
|
}
|
|
|
|
pRootElement = m_arrObjects.RemoveTail();
|
|
|
|
if (wcscmp(pRootElement->m_lpMarkupTag, lpszTagName) != 0)
|
|
{
|
|
ThrowBuilderException(FormatString(_T("The '%ls' start tag does not match the end tag of '%ls'"), (LPCTSTR)pRootElement->m_lpMarkupTag, (LPCTSTR)lpszTagName));
|
|
}
|
|
|
|
if (strBody.GetLength() > 0)
|
|
{
|
|
pContentObject = CXTPMarkupString::CreateValue(strBody.GetBuffer(), strBody.GetLength());
|
|
pRootElement->SetContentObject(this, pContentObject);
|
|
pContentObject = NULL;
|
|
}
|
|
strBody.Empty();
|
|
bBodySpace = FALSE;
|
|
|
|
if (pRootElement->IsKindOf(MARKUP_TYPE(CXTPMarkupObjectProperty)))
|
|
{
|
|
CXTPMarkupObjectProperty* pObjectProperty = (CXTPMarkupObjectProperty*)pRootElement;
|
|
|
|
if (pObjectProperty->m_pContent == NULL)
|
|
ThrowBuilderException(FormatString(_T("'%ls' property does not have a value"), (LPCTSTR)pObjectProperty->m_pProperty->GetName()));
|
|
|
|
ASSERT(!m_arrObjects.IsEmpty());
|
|
|
|
pRootElement = pObjectProperty->m_pContent;
|
|
CXTPMarkupDependencyProperty* pProperty = pObjectProperty->m_pProperty;
|
|
|
|
MARKUP_ADDREF(pObjectProperty->m_pContent);
|
|
MARKUP_RELEASE(pObjectProperty);
|
|
|
|
m_arrObjects.GetTail()->SetPropertyObject(this, pProperty, pRootElement);
|
|
pRootElement = NULL;
|
|
}
|
|
else if (!m_arrObjects.IsEmpty())
|
|
{
|
|
m_arrObjects.GetTail()->SetContentObject(this, pRootElement);
|
|
pRootElement = NULL;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenAttribute:
|
|
{
|
|
LPCWSTR lpszAtributeName = pParser->GetAttributeName();
|
|
|
|
if (m_arrObjects.IsEmpty())
|
|
{
|
|
ThrowBuilderException(_T("Unexpected error"));
|
|
}
|
|
|
|
if (wcsncmp(lpszAtributeName, L"xmlns", 5) == 0)
|
|
break;
|
|
|
|
CXTPMarkupObject* pObject = m_arrObjects.GetTail();
|
|
|
|
CXTPMarkupDependencyProperty* pProperty = FindProperty(pObject->GetType(), lpszAtributeName);
|
|
|
|
if (!pProperty)
|
|
{
|
|
ThrowBuilderException(FormatString(_T("The property '%ls' does not exist in XML namespace"), (LPCTSTR)lpszAtributeName));
|
|
}
|
|
|
|
/*if (!pObject->IsPropertySupported(pProperty))
|
|
{
|
|
ThrowBuilderException(FormatString(_T("The property '%ls' does not exist in XML namespace"), (LPCTSTR)lpszAtributeName));
|
|
}*/
|
|
|
|
pContentObject = NULL;
|
|
|
|
LPCWSTR lpszValue = pParser->GetValue();
|
|
if (lpszValue[0] == '{')
|
|
{
|
|
if (lpszValue[1] == '}')
|
|
{
|
|
lpszValue = lpszValue + 2;
|
|
}
|
|
else
|
|
{
|
|
pContentObject = ResolveMarkupExtension(lpszValue + 1);
|
|
}
|
|
}
|
|
|
|
if (!pContentObject) pContentObject = CXTPMarkupString::CreateValue(lpszValue);
|
|
pObject->SetPropertyObject(this, pProperty, pContentObject);
|
|
pContentObject = NULL;
|
|
}
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenSpace:
|
|
bBodySpace = TRUE;
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenWord:
|
|
{
|
|
if (m_arrObjects.IsEmpty())
|
|
{
|
|
ThrowBuilderException(_T("Data at the root level is invalid"));
|
|
}
|
|
|
|
if (bBodySpace)
|
|
{
|
|
if (strBody.GetLength() > 0 || m_arrObjects.GetTail()->HasContentObject())
|
|
strBody.Add(L" ");
|
|
}
|
|
bBodySpace = FALSE;
|
|
|
|
strBody.Add(pParser->GetValue());
|
|
}
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenPIStart:
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenPIEnd:
|
|
{
|
|
LPCWSTR lpszValue = pParser->GetValue();
|
|
LPCWSTR lpszEncoding = wcsstr(lpszValue, L"encoding");
|
|
if (lpszEncoding)
|
|
{
|
|
BOOL bUTF8 = wcsncmp(lpszEncoding + 10, L"utf-8", 5) == 0;
|
|
if (bUTF8)
|
|
{
|
|
pParser->SetEncoding(CP_UTF8);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenCommentStart:
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenCommentEnd:
|
|
break;
|
|
|
|
case CXTPMarkupParser::tokenData:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
CATCH (CXTPMarkupBuilderException, e)
|
|
{
|
|
//e->ReportError(MB_ICONEXCLAMATION | MB_OK);
|
|
TCHAR szErrorMessage[512];
|
|
UINT nHelpContext;
|
|
|
|
if (e->GetErrorMessage(szErrorMessage, 512, &nHelpContext))
|
|
{
|
|
m_strLastError.Format(_T("%s. Line %i, position %i"), szErrorMessage, pParser->GetLine() + 1, pParser->GetPosition() + 1);
|
|
TRACE(m_strLastError);
|
|
}
|
|
|
|
MARKUP_RELEASE(pRootElement);
|
|
}
|
|
END_CATCH
|
|
|
|
FINISH:
|
|
|
|
MARKUP_RELEASE(pContentObject);
|
|
|
|
while (!m_arrObjects.IsEmpty())
|
|
{
|
|
m_arrObjects.RemoveTail()->Release();
|
|
}
|
|
|
|
if (pRootElement && !pRootElement->IsKindOf(MARKUP_TYPE(CXTPMarkupUIElement)))
|
|
{
|
|
m_strLastError = _T("Root element have to be 'CXTPMarkupUIElement' type");
|
|
TRACE(m_strLastError);
|
|
|
|
MARKUP_RELEASE(pRootElement);
|
|
return NULL;
|
|
}
|
|
|
|
if (pRootElement)
|
|
{
|
|
((CXTPMarkupUIElement*)pRootElement)->Apply();
|
|
}
|
|
|
|
return (CXTPMarkupUIElement*)pRootElement;
|
|
}
|
|
|
|
|
|
BOOL CXTPMarkupBuilder::ColorStringToKnownColor(LPCWSTR lpszValue, COLORREF& clr)
|
|
{
|
|
int nLength = (int)wcslen(lpszValue);
|
|
|
|
WCHAR ch = lpszValue[0];
|
|
if (ch >= 'a' && ch <= 'z')
|
|
ch = (TCHAR)(ch + 'A' - 'a');
|
|
else if (ch < 'A' || ch > 'Z')
|
|
return FALSE;
|
|
|
|
switch (nLength)
|
|
{
|
|
case 3:
|
|
if (ch == _T('R') && _wcsicmp(lpszValue, L"RED") == 0) return clr = 0xff0000ff;
|
|
if (ch == _T('T') && _wcsicmp(lpszValue, L"TAN") == 0) return clr = 0xff8cb4d2;
|
|
return FALSE;
|
|
case 4:
|
|
switch (ch)
|
|
{
|
|
case _T('A'): if (_wcsicmp(lpszValue, L"AQUA") == 0) return clr = 0xffffff00; return FALSE;
|
|
case _T('B'): if (_wcsicmp(lpszValue, L"BLUE") == 0) return clr = 0xffff0000; return FALSE;
|
|
case _T('C'): if (_wcsicmp(lpszValue, L"CYAN") == 0) return clr = 0xffffff00; return FALSE;
|
|
case _T('G'):
|
|
if (_wcsicmp(lpszValue, L"GOLD") == 0) return clr = 0xff00d7ff;
|
|
if (_wcsicmp(lpszValue, L"GRAY") == 0) return clr = 0xff808080;
|
|
return FALSE;
|
|
case _T('L'): if (_wcsicmp(lpszValue, L"LIME") == 0) return clr = 0xff00ff00; return FALSE;
|
|
case _T('N'): if (_wcsicmp(lpszValue, L"NAVY") == 0) return clr = 0xff800000; return FALSE;
|
|
case _T('P'):
|
|
if (_wcsicmp(lpszValue, L"PERU") == 0) return clr = 0xff3f85cd;
|
|
if (_wcsicmp(lpszValue, L"PINK") == 0) return clr = 0xffcbc0ff;
|
|
if (_wcsicmp(lpszValue, L"PLUM") == 0) return clr = 0xffdda0dd;
|
|
return FALSE;
|
|
case _T('S'): if (_wcsicmp(lpszValue, L"SNOW") == 0) return clr = 0xfffafaff; return FALSE;
|
|
case _T('T'): if (_wcsicmp(lpszValue, L"TEAL") == 0) return clr = 0xff808000; return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 5:
|
|
switch (ch)
|
|
{
|
|
case _T('A'): if (_wcsicmp(lpszValue, L"AZURE") == 0) return clr = 0xfffffff0; return FALSE;
|
|
case _T('B'):
|
|
if (_wcsicmp(lpszValue, L"BEIGE") == 0) return clr = 0xffdcf5f5;
|
|
if (_wcsicmp(lpszValue, L"BLACK") == 0) return clr = 0xff000000;
|
|
if (_wcsicmp(lpszValue, L"BROWN") == 0) return clr = 0xff2a2aa5;
|
|
return FALSE;
|
|
case _T('C'): if (_wcsicmp(lpszValue, L"CORAL") == 0) return clr = 0xff507fff; return FALSE;
|
|
case _T('G'): if (_wcsicmp(lpszValue, L"GREEN") == 0) return clr = 0xff008000; return FALSE;
|
|
case _T('I'): if (_wcsicmp(lpszValue, L"IVORY") == 0) return clr = 0xfff0ffff; return FALSE;
|
|
case _T('K'): if (_wcsicmp(lpszValue, L"KHAKI") == 0) return clr = 0xff8ce6f0; return FALSE;
|
|
case _T('L'): if (_wcsicmp(lpszValue, L"LINEN") == 0) return clr = 0xffe6f0fa; return FALSE;
|
|
case _T('O'): if (_wcsicmp(lpszValue, L"OLIVE") == 0) return clr = 0xff008080; return FALSE;
|
|
case _T('W'):
|
|
if (_wcsicmp(lpszValue, L"WHEAT") == 0) return clr = 0xffb3def5;
|
|
if (_wcsicmp(lpszValue, L"WHITE") == 0) return clr = 0xffffffff;
|
|
return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 6:
|
|
switch (ch)
|
|
{
|
|
case _T('M'): if (_wcsicmp(lpszValue, L"MAROON") == 0) return clr = 0xff000080; return FALSE;
|
|
case _T('O'):
|
|
if (_wcsicmp(lpszValue, L"ORANGE") == 0) return clr = 0xff00a5ff;
|
|
if (_wcsicmp(lpszValue, L"ORCHID") == 0) return clr = 0xffd670da;
|
|
return FALSE;
|
|
case _T('P'): if (_wcsicmp(lpszValue, L"PURPLE") == 0) return clr = 0xff800080; return FALSE;
|
|
case _T('S'):
|
|
if (_wcsicmp(lpszValue, L"SALMON") == 0) return clr = 0xff7280fa;
|
|
if (_wcsicmp(lpszValue, L"SIENNA") == 0) return clr = 0xff2d52a0;
|
|
if (_wcsicmp(lpszValue, L"SILVER") == 0) return clr = 0xffc0c0c0;
|
|
return FALSE;
|
|
case _T('T'): if (_wcsicmp(lpszValue, L"TOMATO") == 0) return clr = 0xff4763ff; return FALSE;
|
|
case _T('V'): if (_wcsicmp(lpszValue, L"VIOLET") == 0) return clr = 0xffee82ee; return FALSE;
|
|
case _T('Y'): if (_wcsicmp(lpszValue, L"YELLOW") == 0) return clr = 0xff00ffff; return FALSE;
|
|
case _T('I'): if (_wcsicmp(lpszValue, L"INDIGO") == 0) return clr = 0xff82004b; return FALSE;
|
|
case _T('B'): if (_wcsicmp(lpszValue, L"BISQUE") == 0) return clr = 0xffc4e4ff; return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 7:
|
|
switch (ch)
|
|
{
|
|
case _T('C'): if (_wcsicmp(lpszValue, L"CRIMSON") == 0) return clr = 0xff3c14dc; return FALSE;
|
|
case _T('D'):
|
|
if (_wcsicmp(lpszValue, L"DARKRED") == 0) return clr = 0xff00008b;
|
|
if (_wcsicmp(lpszValue, L"DIMGRAY") == 0) return clr = 0xff696969;
|
|
return FALSE;
|
|
case _T('F'): if (_wcsicmp(lpszValue, L"FUCHSIA") == 0) return clr = 0xffff00ff; return FALSE;
|
|
case _T('H'): if (_wcsicmp(lpszValue, L"HOTPINK") == 0) return clr = 0xffb469ff; return FALSE;
|
|
case _T('M'): if (_wcsicmp(lpszValue, L"MAGENTA") == 0) return clr = 0xffff00ff; return FALSE;
|
|
case _T('O'): if (_wcsicmp(lpszValue, L"OLDLACE") == 0)return clr = 0xffe6f5fd; return FALSE;
|
|
case _T('S'): if (_wcsicmp(lpszValue, L"SKYBLUE") == 0) return clr = 0xffebce87; return FALSE;
|
|
case _T('T'): if (_wcsicmp(lpszValue, L"THISTLE") == 0) return clr = 0xffd8bfd8; return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 8:
|
|
switch (ch)
|
|
{
|
|
case _T('C'): if (_wcsicmp(lpszValue, L"CORNSILK") == 0) return clr = 0xffdcf8ff; return FALSE;
|
|
case _T('D'):
|
|
if (_wcsicmp(lpszValue, L"DARKBLUE") == 0) return clr = 0xff8b0000;
|
|
if (_wcsicmp(lpszValue, L"DARKCYAN") == 0) return clr = 0xff8b8b00;
|
|
if (_wcsicmp(lpszValue, L"DARKGRAY") == 0) return clr = 0xffa9a9a9;
|
|
if (_wcsicmp(lpszValue, L"DEEPPINK") == 0) return clr = 0xff9314ff;
|
|
return FALSE;
|
|
case _T('H'): if (_wcsicmp(lpszValue, L"HONEYDEW") == 0) return clr = 0xfff0fff0; return FALSE;
|
|
case _T('L'): if (_wcsicmp(lpszValue, L"LAVENDER") == 0) return clr = 0xfffae6e6; return FALSE;
|
|
case _T('M'): if (_wcsicmp(lpszValue, L"MOCCASIN") == 0) return clr = 0xffb5e4ff; return FALSE;
|
|
case _T('S'):
|
|
if (_wcsicmp(lpszValue, L"SEAGREEN") == 0) return clr = 0xff578b2e;
|
|
if (_wcsicmp(lpszValue, L"SEASHELL") == 0) return clr = 0xffeef5ff;
|
|
return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 9:
|
|
switch (ch)
|
|
{
|
|
case _T('A'): if (_wcsicmp(lpszValue, L"ALICEBLUE") == 0) return clr = 0xfffff8f0; return FALSE;
|
|
case _T('B'): if (_wcsicmp(lpszValue, L"BURLYWOOD") == 0) return clr = 0xff87b8de; return FALSE;
|
|
case _T('C'):
|
|
if (_wcsicmp(lpszValue, L"CADETBLUE") == 0) return clr = 0xffa09e5f;
|
|
if (_wcsicmp(lpszValue, L"CHOCOLATE") == 0) return clr = 0xff1e69d2;
|
|
return FALSE;
|
|
case _T('D'):
|
|
if (_wcsicmp(lpszValue, L"DARKGREEN") == 0) return clr = 0xff006400;
|
|
if (_wcsicmp(lpszValue, L"DARKKHAKI") == 0) return clr = 0xff6bb7bd;
|
|
return FALSE;
|
|
case _T('F'): if (_wcsicmp(lpszValue, L"FIREBRICK") == 0) return clr = 0xff2222b2; return FALSE;
|
|
case _T('G'):
|
|
if (_wcsicmp(lpszValue, L"GAINSBORO") == 0) return clr = 0xffdcdcdc;
|
|
if (_wcsicmp(lpszValue, L"GOLDENROD") == 0) return clr = 0xff20a5da;
|
|
return FALSE;
|
|
case _T('I'): if (_wcsicmp(lpszValue, L"INDIANRED") == 0)return clr = 0xff5c5ccd; return FALSE;
|
|
case _T('L'):
|
|
if (_wcsicmp(lpszValue, L"LAWNGREEN") == 0)return clr = 0xff00fc7c;
|
|
if (_wcsicmp(lpszValue, L"LIGHTBLUE") == 0) return clr = 0xffe6d8ad;
|
|
if (_wcsicmp(lpszValue, L"LIGHTCYAN") == 0) return clr = 0xffffffe0;
|
|
if (_wcsicmp(lpszValue, L"LIGHTGRAY") == 0) return clr = 0xffd3d3d3;
|
|
if (_wcsicmp(lpszValue, L"LIGHTPINK") == 0) return clr = 0xffc1b6ff;
|
|
if (_wcsicmp(lpszValue, L"LIMEGREEN") == 0) return clr = 0xff32cd32;
|
|
return FALSE;
|
|
case _T('M'):
|
|
if (_wcsicmp(lpszValue, L"MINTCREAM") == 0) return clr = 0xfffafff5;
|
|
if (_wcsicmp(lpszValue, L"MISTYROSE") == 0) return clr = 0xffe1e4ff;
|
|
return FALSE;
|
|
case _T('O'):
|
|
if (_wcsicmp(lpszValue, L"OLIVEDRAB") == 0) return clr = 0xff238e6b;
|
|
if (_wcsicmp(lpszValue, L"ORANGERED") == 0) return clr = 0xff0045ff;
|
|
return FALSE;
|
|
case _T('P'):
|
|
if (_wcsicmp(lpszValue, L"PALEGREEN") == 0) return clr = 0xff98fb98;
|
|
if (_wcsicmp(lpszValue, L"PEACHPUFF") == 0) return clr = 0xffb9daff;
|
|
return FALSE;
|
|
case _T('R'):
|
|
if (_wcsicmp(lpszValue, L"ROSYBROWN") == 0) return clr = 0xff8f8fbc;
|
|
if (_wcsicmp(lpszValue, L"ROYALBLUE") == 0) return clr = 0xffe16941;
|
|
return FALSE;
|
|
case _T('S'):
|
|
if (_wcsicmp(lpszValue, L"SLATEBLUE") == 0) return clr = 0xffcd5a6a;
|
|
if (_wcsicmp(lpszValue, L"SLATEGRAY") == 0) return clr = 0xff908070;
|
|
if (_wcsicmp(lpszValue, L"STEELBLUE") == 0) return clr = 0xffb48246;
|
|
return FALSE;
|
|
case _T('T'): if (_wcsicmp(lpszValue, L"TURQUOISE") == 0) return clr = 0xffd0e040; return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 10:
|
|
switch (ch)
|
|
{
|
|
case _T('A'): if (_wcsicmp(lpszValue, L"AQUAMARINE") == 0) return clr = 0xffd4ff7f; return FALSE;
|
|
case _T('B'): if (_wcsicmp(lpszValue, L"BLUEVIOLET") == 0) return clr = 0xffe22b8a; return FALSE;
|
|
case _T('C'): if (_wcsicmp(lpszValue, L"CHARTREUSE") == 0) return clr = 0xff00ff7f; return FALSE;
|
|
case _T('D'):
|
|
if (_wcsicmp(lpszValue, L"DARKORANGE") == 0) return clr = 0xff008cff;
|
|
if (_wcsicmp(lpszValue, L"DARKORCHID") == 0) return clr = 0xffcc3299;
|
|
if (_wcsicmp(lpszValue, L"DARKSALMON") == 0) return clr = 0xff7a96e9;
|
|
if (_wcsicmp(lpszValue, L"DARKVIOLET") == 0) return clr = 0xffd30094;
|
|
if (_wcsicmp(lpszValue, L"DODGERBLUE") == 0) return clr = 0xffff901e;
|
|
return FALSE;
|
|
case _T('G'): if (_wcsicmp(lpszValue, L"GHOSTWHITE") == 0) return clr = 0xfffff8f8; return FALSE;
|
|
case _T('L'):
|
|
if (_wcsicmp(lpszValue, L"LIGHTCORAL") == 0) return clr = 0xff8080f0;
|
|
if (_wcsicmp(lpszValue, L"LIGHTGREEN") == 0) return clr = 0xff90ee90;
|
|
return FALSE;
|
|
case _T('M'):
|
|
if (_wcsicmp(lpszValue, L"MEDIUMBLUE") == 0) return clr = 0xffcd0000; return FALSE;
|
|
case _T('P'):
|
|
if (_wcsicmp(lpszValue, L"PAPAYAWHIP") == 0) return clr = 0xffd5efff;
|
|
if (_wcsicmp(lpszValue, L"POWDERBLUE") == 0) return clr = 0xffe6e0b0;
|
|
return FALSE;
|
|
case _T('S'): if (_wcsicmp(lpszValue, L"SANDYBROWN") == 0) return clr = 0xff60a4f4; return FALSE;
|
|
case _T('W'): if (_wcsicmp(lpszValue, L"WHITESMOKE") == 0) return clr = 0xfff5f5f5; return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 11:
|
|
switch (ch)
|
|
{
|
|
case _T('D'):
|
|
if (_wcsicmp(lpszValue, L"DARKMAGENTA") == 0) return clr = 0xff8b008b;
|
|
if (_wcsicmp(lpszValue, L"DEEPSKYBLUE") == 0) return clr = 0xffffbf00;
|
|
return FALSE;
|
|
case _T('F'):
|
|
if (_wcsicmp(lpszValue, L"FLORALWHITE") == 0) return clr = 0xfff0faff;
|
|
if (_wcsicmp(lpszValue, L"FORESTGREEN") == 0) return clr = 0xff228b22;
|
|
return FALSE;
|
|
case _T('G'): if (_wcsicmp(lpszValue, L"GREENYELLOW") == 0) return clr = 0xff2fffad; return FALSE;
|
|
case _T('L'):
|
|
if (_wcsicmp(lpszValue, L"LIGHTSALMON") == 0) return clr = 0xff7aa0ff;
|
|
if (_wcsicmp(lpszValue, L"LIGHTYELLOW") == 0) return clr = 0xffe0ffff;
|
|
return FALSE;
|
|
case _T('N'):
|
|
if (_wcsicmp(lpszValue, L"NAVAJOWHITE") == 0) return clr = 0xffaddeff;
|
|
return FALSE;
|
|
case _T('S'):
|
|
if (_wcsicmp(lpszValue, L"SADDLEBROWN") == 0) return clr = 0xff13458b;
|
|
if (_wcsicmp(lpszValue, L"SPRINGGREEN") == 0) return clr = 0xff7fff00;
|
|
return FALSE;
|
|
case _T('T'): if (_wcsicmp(lpszValue, L"TRANSPARENT") == 0) {clr = 0x00ffffff; return TRUE;} return FALSE;
|
|
case _T('Y'): if (_wcsicmp(lpszValue, L"YELLOWGREEN") == 0) return clr = 0xff32cd9a; return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 12:
|
|
switch (ch)
|
|
{
|
|
case _T('L'):
|
|
if (_wcsicmp(lpszValue, L"LIGHTSKYBLUE") == 0) return clr = 0xffface87;
|
|
if (_wcsicmp(lpszValue, L"LEMONCHIFFON") == 0) return clr = 0xffcdfaff;
|
|
return FALSE;
|
|
case _T('M'):
|
|
if (_wcsicmp(lpszValue, L"MEDIUMORCHID") == 0) return clr = 0xffd355ba;
|
|
if (_wcsicmp(lpszValue, L"MEDIUMPURPLE") == 0) return clr = 0xffdb7093;
|
|
if (_wcsicmp(lpszValue, L"MIDNIGHTBLUE") == 0) return clr = 0xff701919;
|
|
return FALSE;
|
|
case _T('D'): if (_wcsicmp(lpszValue, L"DARKSEAGREEN") == 0) return clr = 0xff8fbc8f; return FALSE;
|
|
case _T('A'): if (_wcsicmp(lpszValue, L"ANTIQUEWHITE") == 0) return clr = 0xffd7ebfa; return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 13:
|
|
switch (ch)
|
|
{
|
|
case _T('D'):
|
|
if (_wcsicmp(lpszValue, L"DARKSLATEBLUE") == 0) return clr = 0xff8b3d48;
|
|
if (_wcsicmp(lpszValue, L"DARKSLATEGRAY") == 0) return clr = 0xff4f4f2f;
|
|
if (_wcsicmp(lpszValue, L"DARKGOLDENROD") == 0) return clr = 0xff0b86b8;
|
|
if (_wcsicmp(lpszValue, L"DARKTURQUOISE") == 0) return clr = 0xffd1ce00;
|
|
return FALSE;
|
|
case _T('L'):
|
|
if (_wcsicmp(lpszValue, L"LIGHTSEAGREEN") == 0) return clr = 0xffaab220;
|
|
if (_wcsicmp(lpszValue, L"LAVENDERBLUSH") == 0) return clr = 0xfff5f0ff;
|
|
return FALSE;
|
|
case _T('P'):
|
|
if (_wcsicmp(lpszValue, L"PALEGOLDENROD") == 0) return clr = 0xffaae8ee;
|
|
if (_wcsicmp(lpszValue, L"PALETURQUOISE") == 0) return clr = 0xffeeeeaf;
|
|
if (_wcsicmp(lpszValue, L"PALEVIOLETRED") == 0) return clr = 0xff9370db;
|
|
return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 14:
|
|
switch (ch)
|
|
{
|
|
case _T('B'): if (_wcsicmp(lpszValue, L"BLANCHEDALMOND") == 0) return clr = 0xffcdebff; return FALSE;
|
|
case _T('C'): if (_wcsicmp(lpszValue, L"CORNFLOWERBLUE") == 0) return clr = 0xffed9564; return FALSE;
|
|
case _T('D'): if (_wcsicmp(lpszValue, L"DARKOLIVEGREEN") == 0) return clr = 0xff2f6b55; return FALSE;
|
|
case _T('L'):
|
|
if (_wcsicmp(lpszValue, L"LIGHTSLATEGRAY") == 0) return clr = 0xff998877;
|
|
if (_wcsicmp(lpszValue, L"LIGHTSTEELBLUE") == 0) return clr = 0xffdec4b0;
|
|
return FALSE;
|
|
case _T('M'): if (_wcsicmp(lpszValue, L"MEDIUMSEAGREEN") == 0) return clr = 0xff71b33c; return FALSE;
|
|
}
|
|
return FALSE;
|
|
case 15:
|
|
if (_wcsicmp(lpszValue, L"MEDIUMSLATEBLUE") == 0) return clr = 0xffee687b;
|
|
if (_wcsicmp(lpszValue, L"MEDIUMTURQUOISE") == 0) return clr = 0xffccd148;
|
|
if (_wcsicmp(lpszValue, L"MEDIUMVIOLETRED") == 0) return clr = 0xff8515c7;
|
|
return FALSE;
|
|
case 16:
|
|
if (_wcsicmp(lpszValue, L"MEDIUMAQUAMARINE") == 0) return clr = 0xffaacd66;
|
|
return FALSE;
|
|
case 17:
|
|
if (_wcsicmp(lpszValue, L"MEDIUMSPRINGGREEN") == 0) return clr = 0xff9afa00;
|
|
return FALSE;
|
|
case 20:
|
|
if (_wcsicmp(lpszValue, L"LIGHTGOLDENRODYELLOW") == 0) return clr = 0xffd2fafa;
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertTextDecorations(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
|
|
if (_wcsicmp(lpszValue, L"Underline") == 0)
|
|
return CXTPMarkupEnum::CreateValue(1);
|
|
|
|
if (_wcsicmp(lpszValue, L"Strikethrough") == 0)
|
|
return CXTPMarkupEnum::CreateValue(2);
|
|
|
|
if (_wcsicmp(lpszValue, L"") == 0)
|
|
return CXTPMarkupEnum::CreateValue(0);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertFontWeight(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
switch (nLength)
|
|
{
|
|
case 4:
|
|
if (_wcsicmp(lpszValue, L"Bold") == 0) return CXTPMarkupEnum::CreateValue(FW_BOLD);
|
|
if (_wcsicmp(lpszValue, L"Thin") == 0) return CXTPMarkupEnum::CreateValue(FW_THIN);
|
|
return NULL;
|
|
|
|
case 5:
|
|
if (_wcsicmp(lpszValue, L"Light") == 0) return CXTPMarkupEnum::CreateValue(FW_LIGHT);
|
|
if (_wcsicmp(lpszValue, L"Black") == 0) return CXTPMarkupEnum::CreateValue(FW_BLACK);
|
|
if (_wcsicmp(lpszValue, L"Heavy") == 0) return CXTPMarkupEnum::CreateValue(FW_HEAVY);
|
|
return NULL;
|
|
|
|
case 6:
|
|
if (_wcsicmp(lpszValue, L"Normal") == 0) return CXTPMarkupEnum::CreateValue(FW_NORMAL);
|
|
if (_wcsicmp(lpszValue, L"Medium") == 0) return CXTPMarkupEnum::CreateValue(FW_MEDIUM);
|
|
return NULL;
|
|
|
|
case 7:
|
|
if (_wcsicmp(lpszValue, L"Regular") == 0) return CXTPMarkupEnum::CreateValue(FW_REGULAR);
|
|
return NULL;
|
|
|
|
case 8:
|
|
if (_wcsicmp(lpszValue, L"SemiBold") == 0) return CXTPMarkupEnum::CreateValue(FW_SEMIBOLD);
|
|
if (_wcsicmp(lpszValue, L"DemiBold") == 0) return CXTPMarkupEnum::CreateValue(FW_DEMIBOLD);
|
|
return NULL;
|
|
|
|
case 9:
|
|
if (_wcsicmp(lpszValue, L"ExtraBold") == 0) return CXTPMarkupEnum::CreateValue(FW_EXTRABOLD);
|
|
if (_wcsicmp(lpszValue, L"UltraBold") == 0) return CXTPMarkupEnum::CreateValue(FW_ULTRABOLD);
|
|
return NULL;
|
|
|
|
case 10:
|
|
if (_wcsicmp(lpszValue, L"ExtraLight") == 0) return CXTPMarkupEnum::CreateValue(FW_EXTRALIGHT);
|
|
if (_wcsicmp(lpszValue, L"ExtraBlack") == 0) return CXTPMarkupEnum::CreateValue(950);
|
|
return NULL;
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertFontQuality(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 9 && _wcsicmp(lpszValue, L"ClearType") == 0)
|
|
return CXTPMarkupEnum::CreateValue(5);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertLength(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"Auto") == 0)
|
|
return new CXTPMarkupInt(INT_MAX);
|
|
|
|
int nValue = _wtoi(lpszValue);
|
|
if (nValue == 0)
|
|
return new CXTPMarkupInt(nValue);
|
|
|
|
if ((nLength > 2) && _wcsicmp(lpszValue + nLength - 2, L"pt") == 0)
|
|
{
|
|
return new CXTPMarkupInt(MulDiv(nValue, 96, 72));
|
|
}
|
|
|
|
if ((nLength > 2) && _wcsicmp(lpszValue + nLength - 2, L"in") == 0)
|
|
{
|
|
return new CXTPMarkupInt(nValue * 96);
|
|
}
|
|
|
|
if ((nLength > 2) && _wcsicmp(lpszValue + nLength - 2, L"cm") == 0)
|
|
{
|
|
return new CXTPMarkupInt(int((double)nValue * 37.79528));
|
|
}
|
|
|
|
if ((nLength > 2) && _wcsicmp(lpszValue + nLength - 2, L"mm") == 0)
|
|
{
|
|
return new CXTPMarkupInt(int((double)nValue * 3.779528));
|
|
}
|
|
|
|
return new CXTPMarkupInt(nValue);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertFontStyle(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Normal") == 0)
|
|
return CXTPMarkupEnum::CreateValue(0);
|
|
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Italic") == 0)
|
|
return CXTPMarkupEnum::CreateValue(1);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertVerticalAlignment(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 3 && _wcsicmp(lpszValue, L"Top") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupVerticalAlignmentTop);
|
|
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Center") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupVerticalAlignmentCenter);
|
|
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Bottom") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupVerticalAlignmentBottom);
|
|
|
|
if (nLength == 7 && _wcsicmp(lpszValue, L"Stretch") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupVerticalAlignmentStretch);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertHorizontalAlignment(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"Left") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupHorizontalAlignmentLeft);
|
|
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Center") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupHorizontalAlignmentCenter);
|
|
|
|
if (nLength == 5 && _wcsicmp(lpszValue, L"Right") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupHorizontalAlignmentRight);
|
|
|
|
if (nLength == 7 && _wcsicmp(lpszValue, L"Stretch") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupHorizontalAlignmentStretch);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertTextWrapping(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"Wrap") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextWrap);
|
|
|
|
if (nLength == 16 && _wcsicmp(lpszValue, L"WrapWithOverflow") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextWrapWithOverflow);
|
|
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"NoWrap") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextNoWrap);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertTextTrimming(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"None") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextTrimmingNone);
|
|
|
|
if (nLength == 17 && _wcsicmp(lpszValue, L"CharacterEllipsis") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextTrimmingCharacterEllipsis);
|
|
|
|
if (nLength == 12 && _wcsicmp(lpszValue, L"WordEllipsis") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextTrimmingWordEllipsis);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertTextAlignment(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Center") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextAlignmentCenter);
|
|
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"Left") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextAlignmentLeft);
|
|
|
|
if (nLength == 5 &&_wcsicmp(lpszValue, L"Right") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextAlignmentRight);
|
|
|
|
if (nLength == 7 &&_wcsicmp(lpszValue, L"Justify") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupTextAlignmentJustify);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertOrientation(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 10 && _wcsicmp(lpszValue, L"Horizontal") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupOrientationHorizontal);
|
|
|
|
if (nLength == 8 && _wcsicmp(lpszValue, L"Vertical") == 0)
|
|
return CXTPMarkupEnum::CreateValue(xtpMarkupOrientationVertical);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertBaselineAlignment(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 3 && _wcsicmp(lpszValue, L"Top") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineTop);
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Center") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineCenter);
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Bottom") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineBottom);
|
|
if (nLength == 8 && _wcsicmp(lpszValue, L"Baseline") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaseline);
|
|
if (nLength == 7 && _wcsicmp(lpszValue, L"TextTop") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineTextTop);
|
|
if (nLength == 10 && _wcsicmp(lpszValue, L"TextBottom") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineTextBottom);
|
|
if (nLength == 9 && _wcsicmp(lpszValue, L"Subscript") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineSubscript);
|
|
if (nLength == 11 && _wcsicmp(lpszValue, L"Superscript") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineSuperscript);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertCursor(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"None") == 0) return new CXTPMarkupInt(0);
|
|
if (nLength == 2 && _wcsicmp(lpszValue, L"No") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_NO);
|
|
if (nLength == 5 && _wcsicmp(lpszValue, L"Arrow") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_ARROW);
|
|
if (nLength == 11 && _wcsicmp(lpszValue, L"AppStarting") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_APPSTARTING);
|
|
if (nLength == 5 && _wcsicmp(lpszValue, L"Cross") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_CROSS);
|
|
if (nLength == 5 && _wcsicmp(lpszValue, L"IBeam") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_IBEAM);
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"SizeAll") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZEALL);
|
|
if (nLength == 8 && _wcsicmp(lpszValue, L"SizeNESW") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZENESW);
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"SizeNS") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZENS);
|
|
if (nLength == 8 && _wcsicmp(lpszValue, L"SizeNWSE") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZENWSE);
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"SizeWE") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZEWE);
|
|
if (nLength == 7 && _wcsicmp(lpszValue, L"UpArrow") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_UPARROW);
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"Wait") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_WAIT);
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"Hand") == 0) return new CXTPMarkupInt((DWORD)32649);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertVisibility(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 7 && _wcsicmp(lpszValue, L"Visible") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupVisibilityVisible);
|
|
if (nLength == 6 && _wcsicmp(lpszValue, L"Hidden") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupVisibilityHidden);
|
|
if (nLength == 9 && _wcsicmp(lpszValue, L"Collapsed") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupVisibilityCollapsed);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertContent(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
CXTPMarkupRun* pRun = MARKUP_CREATE(CXTPMarkupRun, pBuilder->GetMarkupContext());
|
|
pRun->SetText((CXTPMarkupString*)pObject);
|
|
MARKUP_ADDREF(pObject);
|
|
|
|
CXTPMarkupTextBlock* pTextBlock = MARKUP_CREATE(CXTPMarkupTextBlock, pBuilder->GetMarkupContext());
|
|
pTextBlock->GetInlines()->Add(pRun);
|
|
|
|
return pTextBlock;
|
|
}
|
|
return pObject;
|
|
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertScrollBarVisibility(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"Auto") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupScrollBarAuto);
|
|
if (nLength == 7 && _wcsicmp(lpszValue, L"Visible") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupScrollBarVisible);
|
|
if (nLength == 8 && _wcsicmp(lpszValue, L"Disabled") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupScrollBarDisabled);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
CXTPMarkupObject* CXTPMarkupBuilder::ConvertStretch(CXTPMarkupBuilder* /*pBuilder*/, CXTPMarkupObject* pObject)
|
|
{
|
|
if (IsStringObject(pObject))
|
|
{
|
|
LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
|
|
int nLength = ((CXTPMarkupString*)pObject)->GetLength();
|
|
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"None") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupStretchNone);
|
|
if (nLength == 4 && _wcsicmp(lpszValue, L"Fill") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupStretchFill);
|
|
if (nLength == 7 && _wcsicmp(lpszValue, L"Uniform") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupStretchUniform);
|
|
if (nLength == 13 && _wcsicmp(lpszValue, L"UniformToFill") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupStretchUniformToFill);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
BOOL CXTPMarkupBuilder::ConvertDouble(LPCWSTR& lpszValue, double& dValue, TCHAR cStop, BOOL bCheckTail)
|
|
{
|
|
if (!lpszValue)
|
|
return FALSE;
|
|
|
|
while (*lpszValue == ' ') lpszValue++;
|
|
|
|
dValue = 0;
|
|
BOOL bSign = FALSE;
|
|
if (*lpszValue == '-')
|
|
{
|
|
bSign = TRUE;
|
|
lpszValue++;
|
|
}
|
|
else if (*lpszValue == '+')
|
|
{
|
|
lpszValue++;
|
|
}
|
|
|
|
LPCWSTR lpszNext = lpszValue;
|
|
|
|
if (*lpszNext == 0)
|
|
return FALSE;
|
|
|
|
BOOL bDecimal = 0;
|
|
double dDecimal = 0;
|
|
|
|
while (*lpszNext != 0)
|
|
{
|
|
WCHAR c = *lpszNext;
|
|
|
|
if (c == ' ' || c == cStop)
|
|
{
|
|
if (lpszNext == lpszValue)
|
|
return FALSE;
|
|
|
|
if (c == ' ')
|
|
{
|
|
while (*lpszNext == ' ') lpszNext++;
|
|
}
|
|
|
|
if (cStop != 0 && *lpszNext == cStop)
|
|
lpszNext++;
|
|
break;
|
|
}
|
|
|
|
if (c == '.')
|
|
{
|
|
if (bDecimal)
|
|
return FALSE;
|
|
bDecimal = TRUE;
|
|
dDecimal = 1;
|
|
|
|
if (lpszValue == lpszNext)
|
|
lpszValue = ++lpszNext;
|
|
else lpszNext++;
|
|
|
|
continue;
|
|
}
|
|
|
|
if (c <'0' || c > '9')
|
|
return FALSE;
|
|
|
|
if (!bDecimal)
|
|
{
|
|
dValue = 10 * dValue + (c - '0');
|
|
}
|
|
else
|
|
{
|
|
dDecimal /= 10;
|
|
dValue += dDecimal * double(c - '0');
|
|
}
|
|
|
|
lpszNext++;
|
|
}
|
|
|
|
if (lpszNext == lpszValue)
|
|
return FALSE;
|
|
|
|
lpszValue = lpszNext;
|
|
while (*lpszValue == ' ') lpszValue++;
|
|
|
|
if (bCheckTail && lpszValue[0] != 0)
|
|
return FALSE;
|
|
|
|
if (bSign) dValue = -dValue;
|
|
|
|
return TRUE;
|
|
}
|