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++

// 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;
}