XTPMarkupBuilder.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:55k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPMarkupBuilder.cpp: implementation of the CXTPMarkupBuilder class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPVc80Helpers.h"
  22. #include "XTPMarkupBuilder.h"
  23. #include "XTPMarkupParser.h"
  24. #include "XTPMarkupObject.h"
  25. #include "XTPMarkupDrawingContext.h"
  26. #include "XTPMarkupContext.h"
  27. #include "XTPMarkupTextBlock.h"
  28. #include "XTPMarkupInline.h"
  29. #include "XTPMarkupScrollViewer.h"
  30. #include "XTPMarkupResourceDictionary.h"
  31. #include "XTPMarkupShape.h"
  32. #ifdef _DEBUG
  33. #undef THIS_FILE
  34. static char THIS_FILE[]=__FILE__;
  35. #define new DEBUG_NEW
  36. #endif
  37. class CXTPMarkupObjectProperty : public CXTPMarkupObject
  38. {
  39. DECLARE_MARKUPCLASS(CXTPMarkupObjectProperty)
  40. public:
  41. CXTPMarkupObjectProperty(CXTPMarkupDependencyProperty* pProperty = 0)
  42. {
  43. m_pProperty = pProperty;
  44. m_pContent = NULL;
  45. m_pCollection = NULL;
  46. }
  47. ~CXTPMarkupObjectProperty()
  48. {
  49. MARKUP_RELEASE(m_pContent);
  50. MARKUP_RELEASE(m_pCollection);
  51. }
  52. virtual void SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pContent)
  53. {
  54. CXTPMarkupType* pContentType = m_pProperty->GetPropetyType();
  55. if (pContent->IsKindOf(pContentType))
  56. {
  57. m_pContent = pContent;
  58. }
  59. else if (IsStringObject(pContent))
  60. {
  61. m_pContent = pContent;
  62. }
  63. else
  64. {
  65. if (m_pContent == NULL)
  66. {
  67. m_pCollection = pBuilder->GetMarkupContext()->CreateMarkupObject(m_pProperty->GetPropetyType());
  68. if (m_pCollection) m_pCollection->SetContentObject(pBuilder, pContent);
  69. m_pContent = m_pCollection;
  70. m_pCollection = NULL;
  71. }
  72. else
  73. {
  74. m_pContent->SetContentObject(pBuilder, pContent);
  75. }
  76. }
  77. }
  78. CXTPMarkupObject* FindResource(const CXTPMarkupObject* pKey) const
  79. {
  80. if (m_pContent)
  81. return CXTPMarkupResourceDictionary::FindResource(m_pContent, pKey);
  82. return NULL;
  83. }
  84. CXTPMarkupObject* m_pContent;
  85. CXTPMarkupObject* m_pCollection;
  86. CXTPMarkupDependencyProperty* m_pProperty;
  87. };
  88. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupObjectProperty, CXTPMarkupObject)
  89. void CXTPMarkupObjectProperty::RegisterMarkupClass()
  90. {
  91. }
  92. class CXTPMarkupColorKey : public CXTPMarkupObject
  93. {
  94. DECLARE_MARKUPCLASS(CXTPMarkupColorKey);
  95. public:
  96. CXTPMarkupColorKey(int nIndex = 0)
  97. {
  98. m_nIndex = nIndex;
  99. }
  100. public:
  101. int m_nIndex;
  102. };
  103. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupColorKey, CXTPMarkupObject)
  104. void CXTPMarkupColorKey::RegisterMarkupClass()
  105. {
  106. }
  107. class CXTPMarkupBrushKey : public CXTPMarkupObject
  108. {
  109. DECLARE_MARKUPCLASS(CXTPMarkupBrushKey);
  110. public:
  111. CXTPMarkupBrushKey(int nIndex = 0)
  112. {
  113. m_nIndex = nIndex;
  114. }
  115. public:
  116. int m_nIndex;
  117. };
  118. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupBrushKey, CXTPMarkupObject)
  119. void CXTPMarkupBrushKey::RegisterMarkupClass()
  120. {
  121. }
  122. //////////////////////////////////////////////////////////////////////////
  123. // CXTPMarkupBuilder::CStaticExtension
  124. class CXTPMarkupBuilder::CStaticExtension
  125. {
  126. public:
  127. CStaticExtension();
  128. ~CStaticExtension();
  129. public:
  130. CXTPMarkupObject* ProvideValue(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue);
  131. public:
  132. CXTPMarkupObject* GetSystemColor(LPCWSTR lpszValue);
  133. CXTPMarkupObject* GetSystemBrush(LPCWSTR lpszValue);
  134. CXTPMarkupObject* GetSystemColor(int nIndex);
  135. CXTPMarkupObject* GetSystemBrush(int nIndex);
  136. CXTPMarkupObject* GetSystemColorKey(LPCWSTR lpszValue);
  137. CXTPMarkupObject* GetSystemBrushKey(LPCWSTR lpszValue);
  138. int GetSystemIndex(LPCWSTR lpszValue, int nLength);
  139. private:
  140. CXTPMarkupBrush* m_pBrushes[31];
  141. CXTPMarkupColor* m_pColors[31];
  142. CXTPMarkupObject* m_pBrushKeys[31];
  143. CXTPMarkupObject* m_pColorKeys[31];
  144. };
  145. CXTPMarkupBuilder::CStaticExtension::CStaticExtension()
  146. {
  147. memset(m_pBrushes, 0, sizeof(m_pBrushes));
  148. memset(m_pColors, 0, sizeof(m_pColors));
  149. memset(m_pBrushKeys, 0, sizeof(m_pBrushKeys));
  150. memset(m_pColorKeys, 0, sizeof(m_pColorKeys));
  151. }
  152. CXTPMarkupBuilder::CStaticExtension::~CStaticExtension()
  153. {
  154. for (int i = 0; i < 31; i++)
  155. {
  156. MARKUP_RELEASE(m_pBrushes[i]);
  157. MARKUP_RELEASE(m_pColors[i]);
  158. MARKUP_RELEASE(m_pBrushKeys[i]);
  159. MARKUP_RELEASE(m_pColorKeys[i]);
  160. }
  161. }
  162. int CXTPMarkupBuilder::CStaticExtension::GetSystemIndex(LPCWSTR lpszValue, int nLength)
  163. {
  164. if (wcsncmp(L"ActiveBorder", lpszValue, nLength) == 0) return 10;
  165. if (wcsncmp(L"ActiveCaption", lpszValue, nLength) == 0) return 2;
  166. if (wcsncmp(L"ActiveCaptionText", lpszValue, nLength) == 0) return 9;
  167. if (wcsncmp(L"AppWorkspace", lpszValue, nLength) == 0) return 12;
  168. if (wcsncmp(L"Control", lpszValue, nLength) == 0) return 15;
  169. if (wcsncmp(L"ControlDark", lpszValue, nLength) == 0) return 0x10;
  170. if (wcsncmp(L"ControlDarkDark", lpszValue, nLength) == 0) return 0x15;
  171. if (wcsncmp(L"ControlLight", lpszValue, nLength) == 0) return 0x16;
  172. if (wcsncmp(L"ControlLightLight", lpszValue, nLength) == 0) return 20;
  173. if (wcsncmp(L"ControlText", lpszValue, nLength) == 0) return 0x12;
  174. if (wcsncmp(L"Desktop", lpszValue, nLength) == 0) return 1;
  175. if (wcsncmp(L"GradientActiveCaption", lpszValue, nLength) == 0) return 0x1b;
  176. if (wcsncmp(L"GradientInactiveCaption", lpszValue, nLength) == 0) return 0x1c;
  177. if (wcsncmp(L"GrayText", lpszValue, nLength) == 0) return 0x11;
  178. if (wcsncmp(L"Highlight", lpszValue, nLength) == 0) return 13;
  179. if (wcsncmp(L"HighlightText", lpszValue, nLength) == 0) return 14;
  180. if (wcsncmp(L"HotTrack", lpszValue, nLength) == 0) return 0x1a;
  181. if (wcsncmp(L"InactiveBorder", lpszValue, nLength) == 0) return 11;
  182. if (wcsncmp(L"InactiveCaption", lpszValue, nLength) == 0) return 3;
  183. if (wcsncmp(L"InactiveCaptionText", lpszValue, nLength) == 0) return 0x13;
  184. if (wcsncmp(L"Info", lpszValue, nLength) == 0) return 0x18;
  185. if (wcsncmp(L"InfoText", lpszValue, nLength) == 0) return 0x17;
  186. if (wcsncmp(L"Menu", lpszValue, nLength) == 0) return 4;
  187. if (wcsncmp(L"MenuBar", lpszValue, nLength) == 0) return 30;
  188. if (wcsncmp(L"MenuHighlight", lpszValue, nLength) == 0) return 0x1d;
  189. if (wcsncmp(L"MenuText", lpszValue, nLength) == 0) return 7;
  190. if (wcsncmp(L"ScrollBar", lpszValue, nLength) == 0) return 0;
  191. if (wcsncmp(L"Window", lpszValue, nLength) == 0) return 5;
  192. if (wcsncmp(L"WindowFrame", lpszValue, nLength) == 0) return 6;
  193. if (wcsncmp(L"WindowText", lpszValue, nLength) == 0) return 8;
  194. return 0;
  195. }
  196. CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemColor(LPCWSTR lpszValue)
  197. {
  198. int nLength = (int)wcslen(lpszValue);
  199. if (nLength < 20)
  200. return NULL;
  201. if (wcsncmp(lpszValue, L"SystemColors.", 13) != 0)
  202. return NULL;
  203. if (wcscmp(lpszValue + nLength - 5, L"Color") != 0)
  204. return NULL;
  205. int nIndex = GetSystemIndex(lpszValue + 13, nLength - 13 - 5);
  206. if (nIndex == 0)
  207. return NULL;
  208. return GetSystemColor(nIndex);
  209. }
  210. CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemColor(int nIndex)
  211. {
  212. if (m_pColors[nIndex] == NULL)
  213. {
  214. m_pColors[nIndex] = new CXTPMarkupColor(GetSysColor(nIndex));
  215. }
  216. MARKUP_ADDREF(m_pColors[nIndex]);
  217. return m_pColors[nIndex];
  218. }
  219. CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemColorKey(LPCWSTR lpszValue)
  220. {
  221. int nLength = (int)wcslen(lpszValue);
  222. if (nLength < 20)
  223. return NULL;
  224. if (wcsncmp(lpszValue, L"SystemColors.", 13) != 0)
  225. return NULL;
  226. if (wcscmp(lpszValue + nLength - 8, L"ColorKey") != 0)
  227. return NULL;
  228. int nIndex = GetSystemIndex(lpszValue + 13, nLength - 13 - 8);
  229. if (nIndex == 0)
  230. return NULL;
  231. if (m_pColorKeys[nIndex] == NULL)
  232. {
  233. m_pColorKeys[nIndex] = new CXTPMarkupColorKey(nIndex);
  234. }
  235. MARKUP_ADDREF(m_pColorKeys[nIndex]);
  236. return m_pColorKeys[nIndex];
  237. }
  238. CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemBrushKey(LPCWSTR lpszValue)
  239. {
  240. int nLength = (int)wcslen(lpszValue);
  241. if (nLength < 20)
  242. return NULL;
  243. if (wcsncmp(lpszValue, L"SystemColors.", 13) != 0)
  244. return NULL;
  245. if (wcscmp(lpszValue + nLength - 8, L"BrushKey") != 0)
  246. return NULL;
  247. int nIndex = GetSystemIndex(lpszValue + 13, nLength - 13 - 8);
  248. if (nIndex == 0)
  249. return NULL;
  250. if (m_pBrushKeys[nIndex] == NULL)
  251. {
  252. m_pBrushKeys[nIndex] = new CXTPMarkupBrushKey(nIndex);
  253. }
  254. MARKUP_ADDREF(m_pBrushKeys[nIndex]);
  255. return m_pBrushKeys[nIndex];
  256. }
  257. CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemBrush(LPCWSTR lpszValue)
  258. {
  259. int nLength = (int)wcslen(lpszValue);
  260. if (nLength < 20)
  261. return NULL;
  262. if (wcsncmp(lpszValue, L"SystemColors.", 13) != 0)
  263. return NULL;
  264. if (wcscmp(lpszValue + nLength - 5, L"Brush") != 0)
  265. return NULL;
  266. int nIndex = GetSystemIndex(lpszValue + 13, nLength - 13 - 5);
  267. if (nIndex == 0)
  268. return NULL;
  269. return GetSystemBrush(nIndex);
  270. }
  271. CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::GetSystemBrush(int nIndex)
  272. {
  273. if (m_pBrushes[nIndex] == NULL)
  274. {
  275. m_pBrushes[nIndex] = new CXTPMarkupSolidColorBrush(GetSysColor(nIndex));
  276. }
  277. MARKUP_ADDREF(m_pBrushes[nIndex]);
  278. return m_pBrushes[nIndex];
  279. }
  280. CXTPMarkupObject* CXTPMarkupBuilder::CStaticExtension::ProvideValue(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue)
  281. {
  282. CXTPMarkupObject* pObject = GetSystemColor(lpszValue);
  283. if (pObject)
  284. return pObject;
  285. pObject = GetSystemBrush(lpszValue);
  286. if (pObject)
  287. return pObject;
  288. pObject = GetSystemColorKey(lpszValue);
  289. if (pObject)
  290. return pObject;
  291. pObject = GetSystemBrushKey(lpszValue);
  292. if (pObject)
  293. return pObject;
  294. pBuilder->ThrowBuilderException(pBuilder->FormatString(_T("Cannot find the static member  '%ls'"), (LPCTSTR)lpszValue));
  295. return NULL;
  296. }
  297. //////////////////////////////////////////////////////////////////////////
  298. // CXTPMarkupBuilder::CStaticResourceExtension
  299. class CXTPMarkupBuilder::CStaticResourceExtension
  300. {
  301. public:
  302. CStaticResourceExtension();
  303. ~CStaticResourceExtension();
  304. public:
  305. CXTPMarkupObject* ProvideValue(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue);
  306. CXTPMarkupObject* FindResources(CXTPMarkupObject* pElement, CXTPMarkupObject* pValue);
  307. CXTPMarkupObject* ResolveKey(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue);
  308. };
  309. CXTPMarkupBuilder::CStaticResourceExtension::CStaticResourceExtension()
  310. {
  311. }
  312. CXTPMarkupBuilder::CStaticResourceExtension::~CStaticResourceExtension()
  313. {
  314. }
  315. CXTPMarkupObject* CXTPMarkupBuilder::CStaticResourceExtension::FindResources(CXTPMarkupObject* pElement, CXTPMarkupObject* pKey)
  316. {
  317. if (pElement->IsKindOf(MARKUP_TYPE(CXTPMarkupFrameworkElement)))
  318. {
  319. CXTPMarkupObject* pValue = ((CXTPMarkupFrameworkElement*)pElement)->FindResource(pKey);
  320. if (pValue)
  321. return pValue;
  322. }
  323. if (pElement->IsKindOf(MARKUP_TYPE(CXTPMarkupFrameworkContentElement)))
  324. {
  325. CXTPMarkupObject* pValue = ((CXTPMarkupFrameworkContentElement*)pElement)->FindResource(pKey);
  326. if (pValue)
  327. return pValue;
  328. }
  329. if (pElement->IsKindOf(MARKUP_TYPE(CXTPMarkupStyle)))
  330. {
  331. CXTPMarkupObject* pValue = ((CXTPMarkupStyle*)pElement)->FindResource(pKey);
  332. if (pValue)
  333. return pValue;
  334. }
  335. if (pElement->IsKindOf(MARKUP_TYPE(CXTPMarkupObjectProperty)))
  336. {
  337. CXTPMarkupObject* pValue = ((CXTPMarkupObjectProperty*)pElement)->FindResource(pKey);
  338. if (pValue)
  339. return pValue;
  340. }
  341. return NULL;
  342. }
  343. CXTPMarkupObject* CXTPMarkupBuilder::CStaticResourceExtension::ResolveKey(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue)
  344. {
  345. if (lpszValue[0] == '{')
  346. {
  347. if (lpszValue[1] == '}')
  348. {
  349. lpszValue = lpszValue + 2;
  350. }
  351. else
  352. {
  353. return pBuilder->ResolveMarkupExtension(lpszValue + 1);
  354. }
  355. }
  356. return CXTPMarkupString::CreateValue(lpszValue);
  357. }
  358. CXTPMarkupObject* CXTPMarkupBuilder::CStaticResourceExtension::ProvideValue(CXTPMarkupBuilder* pBuilder, LPCWSTR lpszValue)
  359. {
  360. CXTPMarkupObject* pKey = ResolveKey(pBuilder, lpszValue);
  361. if (!pKey)
  362. return NULL;
  363. POSITION pos = pBuilder->m_arrObjects.GetTailPosition();
  364. while (pos)
  365. {
  366. CXTPMarkupObject* pElement = pBuilder->m_arrObjects.GetPrev(pos);
  367. CXTPMarkupObject* pValue = FindResources(pElement, pKey);
  368. if (pValue)
  369. {
  370. MARKUP_RELEASE(pKey);
  371. MARKUP_ADDREF(pValue);
  372. return pValue;
  373. }
  374. }
  375. if (pKey->IsKindOf(MARKUP_TYPE(CXTPMarkupColorKey)))
  376. {
  377. CXTPMarkupObject* pValue = pBuilder->GetStaticExtension()->GetSystemColor(((CXTPMarkupColorKey*)pKey)->m_nIndex);
  378. MARKUP_RELEASE(pKey);
  379. return pValue;
  380. }
  381. if (pKey->IsKindOf(MARKUP_TYPE(CXTPMarkupBrushKey)))
  382. {
  383. CXTPMarkupObject* pValue = pBuilder->GetStaticExtension()->GetSystemBrush(((CXTPMarkupBrushKey*)pKey)->m_nIndex);
  384. MARKUP_RELEASE(pKey);
  385. return pValue;
  386. }
  387. MARKUP_RELEASE(pKey);
  388. pBuilder->ThrowBuilderException(pBuilder->FormatString(_T("Cannot find resource named '%ls'. Resource names are case sensitive"), (LPCTSTR)lpszValue));
  389. return 0;
  390. }
  391. //////////////////////////////////////////////////////////////////////////
  392. // CXTPMarkupBuilder
  393. CXTPMarkupBuilder::CStaticExtension* CXTPMarkupBuilder::GetStaticExtension()
  394. {
  395. if (m_pStaticExtension == NULL)
  396. {
  397. m_pStaticExtension = new CStaticExtension();
  398. }
  399. return m_pStaticExtension ;
  400. }
  401. CXTPMarkupBuilder::CStaticResourceExtension* CXTPMarkupBuilder::GetStaticResourceExtension()
  402. {
  403. if (m_pStaticResourceExtension == NULL)
  404. {
  405. m_pStaticResourceExtension = new CStaticResourceExtension();
  406. }
  407. return m_pStaticResourceExtension ;
  408. }
  409. //////////////////////////////////////////////////////////////////////////
  410. // CXTPMarkupBuilderException
  411. IMPLEMENT_DYNAMIC(CXTPMarkupBuilderException, CException)
  412. CXTPMarkupBuilderException::CXTPMarkupBuilderException(LPCTSTR lpszError)
  413. {
  414. m_bInitialized = TRUE;
  415. m_bLoaded = TRUE;
  416. m_szMessage[255] = 0;
  417. STRNCPY_S(m_szMessage, 256, lpszError, 255);
  418. }
  419. BOOL CXTPMarkupBuilderException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext)
  420. {
  421. ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));
  422. if (!lpszError)
  423. return FALSE;
  424. if (pnHelpContext != NULL)
  425. *pnHelpContext = 0;
  426. // if we didn't load our string (eg, we're a console app)
  427. lstrcpyn(lpszError, m_szMessage, nMaxError);
  428. return TRUE;
  429. }
  430. //////////////////////////////////////////////////////////////////////////
  431. // CStringBuilder
  432. class CXTPMarkupBuilder::CStringBuilder
  433. {
  434. public:
  435. CStringBuilder();
  436. ~CStringBuilder();
  437. public:
  438. void Add(LPCWSTR lpszWord);
  439. void Empty();
  440. int GetLength() const
  441. {
  442. return m_nLength;
  443. }
  444. LPCWSTR GetBuffer()
  445. {
  446. ASSERT(m_lpszData);
  447. ASSERT(m_nLength < m_nAlloc);
  448. m_lpszData[m_nLength] = 0;
  449. return m_lpszData;
  450. }
  451. protected:
  452. int m_nAlloc;
  453. int m_nLength;
  454. LPWSTR m_lpszData;
  455. };
  456. CXTPMarkupBuilder::CStringBuilder::CStringBuilder()
  457. {
  458. m_nAlloc = 0;
  459. m_nLength = 0;
  460. m_lpszData = NULL;
  461. }
  462. CXTPMarkupBuilder::CStringBuilder::~CStringBuilder()
  463. {
  464. if (m_lpszData)
  465. {
  466. delete[] m_lpszData;
  467. }
  468. }
  469. void CXTPMarkupBuilder::CStringBuilder::Add(LPCWSTR lpszWord)
  470. {
  471. int nWordLength = (int)wcslen(lpszWord);
  472. if (m_nAlloc < m_nLength + nWordLength + 1)
  473. {
  474. int nAlloc = m_nLength + max(256, nWordLength + 1);
  475. LPWSTR lpszData = new WCHAR[nAlloc];
  476. if (m_nLength > 0) memcpy(lpszData, m_lpszData, m_nLength * sizeof(WCHAR));
  477. if (m_lpszData) delete[] m_lpszData;
  478. m_lpszData = lpszData;
  479. m_nAlloc = nAlloc;
  480. }
  481. memcpy(m_lpszData + m_nLength, lpszWord, nWordLength * sizeof(WCHAR));
  482. m_nLength += nWordLength;
  483. }
  484. void CXTPMarkupBuilder::CStringBuilder::Empty()
  485. {
  486. m_nLength = 0;
  487. }
  488. //////////////////////////////////////////////////////////////////////
  489. // Construction/Destruction
  490. //////////////////////////////////////////////////////////////////////
  491. CXTPMarkupBuilder::CXTPMarkupBuilder(CXTPMarkupContext* pContext)
  492. {
  493. m_pMarkupContext = pContext;
  494. ASSERT(m_pMarkupContext);
  495. m_pStaticExtension = NULL;
  496. m_pStaticResourceExtension = NULL;
  497. }
  498. CXTPMarkupBuilder::~CXTPMarkupBuilder()
  499. {
  500. SAFE_DELETE(m_pStaticExtension);
  501. SAFE_DELETE(m_pStaticResourceExtension);
  502. }
  503. inline LPWSTR DupString(LPCWSTR lpszString)
  504. {
  505. int nLen = (int)wcslen(lpszString);
  506. LPWSTR lpcw = new WCHAR[nLen + 1];
  507. MEMCPY_S(lpcw, lpszString, (nLen + 1) * sizeof(WCHAR));
  508. return lpcw;
  509. }
  510. CXTPMarkupObject* CXTPMarkupBuilder::CreateObject(LPCWSTR lpszTag)
  511. {
  512. CXTPMarkupType* pType = CXTPMarkupType::LookupTag(lpszTag);
  513. if (!pType)
  514. return NULL;
  515. CXTPMarkupObject* pMarkupObject = m_pMarkupContext->CreateMarkupObject(pType);
  516. if (!pMarkupObject)
  517. {
  518. return NULL;
  519. }
  520. return pMarkupObject;
  521. }
  522. CString CXTPMarkupBuilder::FormatString(LPCTSTR lpszFormat, LPCTSTR lpszParameter)
  523. {
  524. CString str;
  525. str.Format(lpszFormat, lpszParameter);
  526. return str;
  527. }
  528. CString CXTPMarkupBuilder::FormatString(LPCTSTR lpszFormat, LPCTSTR lpszParameter1, LPCTSTR lpszParameter2)
  529. {
  530. CString str;
  531. str.Format(lpszFormat, lpszParameter1, lpszParameter2);
  532. return str;
  533. }
  534. CString CXTPMarkupBuilder::FormatString(LPCTSTR lpszFormat, LPCTSTR lpszParameter1, LPCTSTR lpszParameter2, LPCTSTR lpszParameter3)
  535. {
  536. CString str;
  537. str.Format(lpszFormat, lpszParameter1, lpszParameter2, lpszParameter3);
  538. return str;
  539. }
  540. CXTPMarkupDependencyProperty* CXTPMarkupBuilder::FindProperty(LPCWSTR lpszTag, LPCWSTR lpszAttribute)
  541. {
  542. CXTPMarkupType* pType = CXTPMarkupType::LookupTag(lpszTag);
  543. if (!pType)
  544. return NULL;
  545. return CXTPMarkupDependencyProperty::FindProperty(pType, lpszAttribute);
  546. }
  547. CXTPMarkupDependencyProperty* CXTPMarkupBuilder::FindProperty(CXTPMarkupType* pRuntimeClass, LPCWSTR lpszAttribute)
  548. {
  549. LPCWSTR lpszAttributeDot = wcschr(lpszAttribute, L'.');
  550. if (lpszAttributeDot != NULL)
  551. {
  552. *(LPWSTR)lpszAttributeDot = 0;
  553. CXTPMarkupDependencyProperty* pProperty = FindProperty(lpszAttribute, lpszAttributeDot + 1);
  554. *(LPWSTR)lpszAttributeDot = '.';
  555. return pProperty;
  556. }
  557. if (!pRuntimeClass)
  558. return NULL;
  559. return CXTPMarkupDependencyProperty::FindProperty(pRuntimeClass, lpszAttribute);
  560. }
  561. CXTPMarkupObject* CXTPMarkupBuilder::ConvertValue(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pValue)
  562. {
  563. CXTPMarkupObject* pNewValue = NULL;
  564. if (pProperty->GetMetadata() && pProperty->GetMetadata()->m_pConverter)
  565. {
  566. pNewValue = (*pProperty->GetMetadata()->m_pConverter)(GetMarkupContext(), pValue);
  567. }
  568. if (pNewValue == NULL)
  569. {
  570. CXTPMarkupObject* pConverter = GetMarkupContext()->CreateMarkupObject(pProperty->GetPropetyType());
  571. pNewValue = pConverter->ConvertFrom(pValue);
  572. MARKUP_RELEASE(pConverter);
  573. }
  574. if (!pNewValue)
  575. {
  576. ThrowBuilderException(CXTPMarkupBuilder::FormatString(_T("Cannot convert string in attribute '%ls' to object of type '%ls'"),
  577. (LPCTSTR)pProperty->GetName(), (LPCTSTR)pProperty->GetPropetyType()->m_lpszClassName));
  578. }
  579. return pNewValue;
  580. }
  581. CXTPMarkupObject* CXTPMarkupBuilder::CreateTypeKey(LPCWSTR lpszType)
  582. {
  583. CXTPMarkupType* pType = CXTPMarkupType::LookupTag(lpszType);
  584. if (!pType)
  585. {
  586. ThrowBuilderException(FormatString(_T("Cannot find type '%ls'"), (LPCTSTR)lpszType));
  587. return NULL;
  588. }
  589. pType->AddRef();
  590. return pType;
  591. }
  592. CXTPMarkupObject* CXTPMarkupBuilder::ResolveMarkupExtension(LPCWSTR lpszValue)
  593. {
  594. int nLength = (int)wcslen(lpszValue);
  595. if (lpszValue[nLength - 1] != '}')
  596. {
  597. ThrowBuilderException(_T("Markup extension expressions must end with '}'"));
  598. }
  599. *((LPWSTR)lpszValue + nLength - 1) = '';
  600. if (wcsncmp(lpszValue, L"x:Static ", 9) == 0)
  601. {
  602. return GetStaticExtension()->ProvideValue(this, lpszValue + 9);
  603. }
  604. if (wcsncmp(lpszValue, L"StaticResource ", 15) == 0)
  605. {
  606. return GetStaticResourceExtension()->ProvideValue(this, lpszValue + 15);
  607. }
  608. if (wcsncmp(lpszValue, L"DynamicResource ", 16) == 0)
  609. {
  610. return GetStaticResourceExtension()->ProvideValue(this, lpszValue + 16);
  611. }
  612. if (wcsncmp(lpszValue, L"x:Type ", 7) == 0)
  613. {
  614. return CreateTypeKey(lpszValue + 7);
  615. }
  616. ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszValue));
  617. return NULL;
  618. }
  619. CXTPMarkupUIElement* CXTPMarkupBuilder::Parse(CXTPMarkupParser* pParser)
  620. {
  621. m_strLastError.Empty();
  622. if (!pParser->FindFirstTag())
  623. {
  624. m_strLastError = _T("Data at the root level is invalid");
  625. return NULL;
  626. }
  627. ASSERT(m_arrObjects.IsEmpty());
  628. CXTPMarkupObject* pRootElement = NULL;
  629. CXTPMarkupObject* pContentObject = NULL;
  630. CStringBuilder strBody;
  631. BOOL bBodySpace = FALSE;
  632. TRY
  633. {
  634. for (;;)
  635. {
  636. CXTPMarkupParser::TokenType t = pParser->GetNextToken();
  637. switch(t)
  638. {
  639. case CXTPMarkupParser::tokenError:
  640. {
  641. ThrowBuilderException(FormatString(_T("%ls"), (LPCTSTR)pParser->GetValue()));
  642. }
  643. break;
  644. case CXTPMarkupParser::tokenEof:
  645. {
  646. if (pRootElement == NULL)
  647. ThrowBuilderException(_T("Root element is missing"));
  648. if (!m_arrObjects.IsEmpty())
  649. {
  650. ThrowBuilderException(FormatString(_T("Unexpected end of file has occurred. The following elements are not closed: '%ls'"), (LPCTSTR)m_arrObjects.GetTail()->m_lpMarkupTag));
  651. }
  652. }
  653. goto FINISH;
  654. case CXTPMarkupParser::tokenTagStart:
  655. {
  656. if (m_arrObjects.IsEmpty() && pRootElement)
  657. {
  658. ThrowBuilderException(_T("There are multiple root elements"));
  659. }
  660. if (!m_arrObjects.IsEmpty())
  661. {
  662. CXTPMarkupObject* pLastObject = m_arrObjects.GetTail();
  663. if (strBody.GetLength() > 0)
  664. {
  665. if (bBodySpace) strBody.Add(L" ");
  666. pContentObject = CXTPMarkupString::CreateValue(strBody.GetBuffer(), strBody.GetLength());
  667. pLastObject->SetContentObject(this, pContentObject);
  668. pContentObject = NULL;
  669. }
  670. else if (bBodySpace && pLastObject->HasContentObject() && pLastObject->AllowWhiteSpaceContent())
  671. {
  672. pContentObject = CXTPMarkupString::CreateValue(L" ", 1);
  673. pLastObject->SetContentObject(this, pContentObject);
  674. pContentObject = NULL;
  675. }
  676. }
  677. strBody.Empty();
  678. bBodySpace = FALSE;
  679. LPCWSTR lpszTagName = pParser->GetTagName();
  680. LPCWSTR lpszAttributeDot = wcschr(lpszTagName, L'.');
  681. CXTPMarkupObject* pObject = NULL;
  682. if (lpszAttributeDot != NULL)
  683. {
  684. *(LPWSTR)lpszAttributeDot = 0;
  685. CXTPMarkupDependencyProperty* pProperty = FindProperty(lpszTagName, lpszAttributeDot + 1);
  686. *(LPWSTR)lpszAttributeDot = '.';
  687. if (!pProperty)
  688. {
  689. ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszTagName));
  690. }
  691. if (m_arrObjects.IsEmpty())
  692. {
  693. ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszTagName));
  694. }
  695. /*if (!m_arrObjects.GetTail()->IsPropertySupported(pProperty))
  696. {
  697. ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszTagName));
  698. }*/
  699. pObject = new CXTPMarkupObjectProperty(pProperty);
  700. m_arrObjects.AddTail(pObject);
  701. }
  702. else
  703. {
  704. pObject = CreateObject(lpszTagName);
  705. if (!pObject)
  706. {
  707. ThrowBuilderException(FormatString(_T("The tag '%ls' does not exist in XML namespace"), (LPCTSTR)lpszTagName));
  708. }
  709. m_arrObjects.AddTail(pObject);
  710. }
  711. pObject->m_lpMarkupTag = DupString(lpszTagName);
  712. }
  713. break;
  714. case CXTPMarkupParser::tokenTagEnd:
  715. {
  716. LPCWSTR lpszTagName = pParser->GetTagName();
  717. if (m_arrObjects.IsEmpty())
  718. {
  719. ThrowBuilderException(_T("Unexpected end tag"));
  720. }
  721. pRootElement = m_arrObjects.RemoveTail();
  722. if (wcscmp(pRootElement->m_lpMarkupTag, lpszTagName) != 0)
  723. {
  724. ThrowBuilderException(FormatString(_T("The '%ls' start tag does not match the end tag of '%ls'"), (LPCTSTR)pRootElement->m_lpMarkupTag, (LPCTSTR)lpszTagName));
  725. }
  726. if (strBody.GetLength() > 0)
  727. {
  728. pContentObject = CXTPMarkupString::CreateValue(strBody.GetBuffer(), strBody.GetLength());
  729. pRootElement->SetContentObject(this, pContentObject);
  730. pContentObject = NULL;
  731. }
  732. strBody.Empty();
  733. bBodySpace = FALSE;
  734. if (pRootElement->IsKindOf(MARKUP_TYPE(CXTPMarkupObjectProperty)))
  735. {
  736. CXTPMarkupObjectProperty* pObjectProperty = (CXTPMarkupObjectProperty*)pRootElement;
  737. if (pObjectProperty->m_pContent == NULL)
  738. ThrowBuilderException(FormatString(_T("'%ls' property does not have a value"), (LPCTSTR)pObjectProperty->m_pProperty->GetName()));
  739. ASSERT(!m_arrObjects.IsEmpty());
  740. m_arrObjects.GetTail()->SetPropertyObject(this, pObjectProperty->m_pProperty, pObjectProperty->m_pContent);
  741. MARKUP_ADDREF(pObjectProperty->m_pContent);
  742. MARKUP_RELEASE(pObjectProperty);
  743. pRootElement = NULL;
  744. }
  745. else if (!m_arrObjects.IsEmpty())
  746. {
  747. m_arrObjects.GetTail()->SetContentObject(this, pRootElement);
  748. pRootElement = NULL;
  749. }
  750. }
  751. break;
  752. case CXTPMarkupParser::tokenAttribute:
  753. {
  754. LPCWSTR lpszAtributeName = pParser->GetAttributeName();
  755. if (m_arrObjects.IsEmpty())
  756. {
  757. ThrowBuilderException(_T("Unexpected error"));
  758. }
  759. if (wcsncmp(lpszAtributeName, L"xmlns", 5) == 0)
  760. break;
  761. CXTPMarkupObject* pObject = m_arrObjects.GetTail();
  762. CXTPMarkupDependencyProperty* pProperty = FindProperty(pObject->GetType(), lpszAtributeName);
  763. if (!pProperty)
  764. {
  765. ThrowBuilderException(FormatString(_T("The property '%ls' does not exist in XML namespace"), (LPCTSTR)lpszAtributeName));
  766. }
  767. /*if (!pObject->IsPropertySupported(pProperty))
  768. {
  769. ThrowBuilderException(FormatString(_T("The property '%ls' does not exist in XML namespace"), (LPCTSTR)lpszAtributeName));
  770. }*/
  771. pContentObject = NULL;
  772. LPCWSTR lpszValue = pParser->GetValue();
  773. if (lpszValue[0] == '{')
  774. {
  775. if (lpszValue[1] == '}')
  776. {
  777. lpszValue = lpszValue + 2;
  778. }
  779. else
  780. {
  781. pContentObject = ResolveMarkupExtension(lpszValue + 1);
  782. }
  783. }
  784. if (!pContentObject) pContentObject = CXTPMarkupString::CreateValue(lpszValue);
  785. pObject->SetPropertyObject(this, pProperty, pContentObject);
  786. pContentObject = NULL;
  787. }
  788. break;
  789. case CXTPMarkupParser::tokenSpace:
  790. bBodySpace = TRUE;
  791. break;
  792. case CXTPMarkupParser::tokenWord:
  793. {
  794. if (m_arrObjects.IsEmpty())
  795. {
  796. ThrowBuilderException(_T("Data at the root level is invalid"));
  797. }
  798. if (bBodySpace)
  799. {
  800. if (strBody.GetLength() > 0 || m_arrObjects.GetTail()->HasContentObject())
  801. strBody.Add(L" ");
  802. }
  803. bBodySpace = FALSE;
  804. strBody.Add(pParser->GetValue());
  805. }
  806. break;
  807. case CXTPMarkupParser::tokenPIStart:
  808. break;
  809. case CXTPMarkupParser::tokenPIEnd:
  810. {
  811. LPCWSTR lpszValue = pParser->GetValue();
  812. LPCWSTR lpszEncoding = wcsstr(lpszValue, L"encoding");
  813. if (lpszEncoding)
  814. {
  815. BOOL bUTF8 = wcsncmp(lpszEncoding + 10, L"utf-8", 5) == 0;
  816. if (bUTF8)
  817. {
  818. pParser->SetEncoding(CP_UTF8);
  819. }
  820. }
  821. }
  822. break;
  823. case CXTPMarkupParser::tokenCommentStart:
  824. break;
  825. case CXTPMarkupParser::tokenCommentEnd:
  826. break;
  827. case CXTPMarkupParser::tokenData:
  828. break;
  829. }
  830. }
  831. }
  832. CATCH (CXTPMarkupBuilderException, e)
  833. {
  834. //e->ReportError(MB_ICONEXCLAMATION | MB_OK);
  835. TCHAR szErrorMessage[512];
  836. UINT nHelpContext;
  837. if (e->GetErrorMessage(szErrorMessage, 512, &nHelpContext))
  838. {
  839. m_strLastError.Format(_T("%s. Line %i, position %i"), szErrorMessage, pParser->GetLine() + 1, pParser->GetPosition() + 1);
  840. TRACE(m_strLastError);
  841. }
  842. MARKUP_RELEASE(pRootElement);
  843. }
  844. END_CATCH
  845. FINISH:
  846. MARKUP_RELEASE(pContentObject);
  847. while (!m_arrObjects.IsEmpty())
  848. {
  849. m_arrObjects.RemoveTail()->Release();
  850. }
  851. if (pRootElement && !pRootElement->IsKindOf(MARKUP_TYPE(CXTPMarkupUIElement)))
  852. {
  853. m_strLastError = _T("Root element have to be 'CXTPMarkupUIElement' type");
  854. TRACE(m_strLastError);
  855. MARKUP_RELEASE(pRootElement);
  856. return NULL;
  857. }
  858. if (pRootElement)
  859. {
  860. ((CXTPMarkupUIElement*)pRootElement)->Apply();
  861. }
  862. return (CXTPMarkupUIElement*)pRootElement;
  863. }
  864. BOOL CXTPMarkupBuilder::ColorStringToKnownColor(LPCWSTR lpszValue, COLORREF& clr)
  865. {
  866. int nLength = (int)wcslen(lpszValue);
  867. WCHAR ch = lpszValue[0];
  868. if (ch >= 'a' && ch <= 'z')
  869. ch = (TCHAR)(ch + 'A' - 'a');
  870. else if (ch < 'A' || ch > 'Z')
  871. return FALSE;
  872. switch (nLength)
  873. {
  874. case 3:
  875. if (ch == 'R' && _wcsicmp(lpszValue, L"RED") == 0) return clr = 0x0000ff;
  876. if (ch == _T('T') && _wcsicmp(lpszValue, L"TAN") == 0) return clr = 0x8cb4d2;
  877. return FALSE;
  878. case 4:
  879. switch (ch)
  880. {
  881. case _T('A'): if (_wcsicmp(lpszValue, L"AQUA") == 0) return clr = 0xffff00; return FALSE;
  882. case _T('B'): if (_wcsicmp(lpszValue, L"BLUE") == 0) return clr = 0xff0000; return FALSE;
  883. case _T('C'): if (_wcsicmp(lpszValue, L"CYAN") == 0) return clr = 0xffff00; return FALSE;
  884. case _T('G'):
  885. if (_wcsicmp(lpszValue, L"GOLD") == 0) return clr = 0x00d7ff;
  886. if (_wcsicmp(lpszValue, L"GRAY") == 0) return clr = 0x808080;
  887. return FALSE;
  888. case _T('L'): if (_wcsicmp(lpszValue, L"LIME") == 0)clr = 0x00ff00; return FALSE;
  889. case _T('N'): if (_wcsicmp(lpszValue, L"NAVY") == 0)return clr = 0x800000; return FALSE;
  890. case _T('P'):
  891. if (_wcsicmp(lpszValue, L"PERU") == 0) return clr = 0x3f85cd;
  892. if (_wcsicmp(lpszValue, L"PINK") == 0) return clr = 0xcbc0ff;
  893. if (_wcsicmp(lpszValue, L"PLUM") == 0) return clr = 0xdda0dd;
  894. return FALSE;
  895. case _T('S'): if (_wcsicmp(lpszValue, L"SNOW") == 0) return clr = 0xfafaff; return FALSE;
  896. case _T('T'): if (_wcsicmp(lpszValue, L"TEAL") == 0) return clr = 0x808000; return FALSE;
  897. }
  898. return FALSE;
  899. case 5:
  900. switch (ch)
  901. {
  902. case _T('A'): if (_wcsicmp(lpszValue, L"AZURE") == 0) return clr = 0xfffff0; return FALSE;
  903. case _T('B'):
  904. if (_wcsicmp(lpszValue, L"BEIGE") == 0) return clr = 0xdcf5f5;
  905. if (_wcsicmp(lpszValue, L"BLACK") == 0) { clr = 0; return TRUE; }
  906. if (_wcsicmp(lpszValue, L"BROWN") == 0) return clr = 0x2a2aa5;
  907. return FALSE;
  908. case _T('C'): if (_wcsicmp(lpszValue, L"CORAL") == 0) return clr = 0x507fff; return FALSE;
  909. case _T('G'): if (_wcsicmp(lpszValue, L"GREEN") == 0) return clr = 0x008000; return FALSE;
  910. case _T('I'): if (_wcsicmp(lpszValue, L"IVORY") == 0) return clr = 0xf0ffff; return FALSE;
  911. case _T('K'): if (_wcsicmp(lpszValue, L"KHAKI") == 0) return clr = 0x8ce6f0; return FALSE;
  912. case _T('L'): if (_wcsicmp(lpszValue, L"LINEN") == 0) return clr = 0xe6f0fa; return FALSE;
  913. case _T('O'): if (_wcsicmp(lpszValue, L"OLIVE") == 0) return clr = 0x008080; return FALSE;
  914. case _T('W'):
  915. if (_wcsicmp(lpszValue, L"WHEAT") == 0) return clr = 0xb3def5;
  916. if (_wcsicmp(lpszValue, L"WHITE") == 0) return clr = 0xffffff;
  917. return FALSE;
  918. }
  919. return FALSE;
  920. case 6:
  921. switch (ch)
  922. {
  923. case _T('M'): if (_wcsicmp(lpszValue, L"MAROON") == 0) return clr = 0x000080; return FALSE;
  924. case _T('O'):
  925. if (_wcsicmp(lpszValue, L"ORANGE") == 0) return clr = 0x00a5ff;
  926. if (_wcsicmp(lpszValue, L"ORCHID") == 0) return clr = 0xd670da;
  927. return FALSE;
  928. case _T('P'): if (_wcsicmp(lpszValue, L"PURPLE") == 0) return clr = 0x800080; return FALSE;
  929. case _T('S'):
  930. if (_wcsicmp(lpszValue, L"SALMON") == 0) return clr = 0x7280fa;
  931. if (_wcsicmp(lpszValue, L"SIENNA") == 0) return clr = 0x2d52a0;
  932. if (_wcsicmp(lpszValue, L"SILVER") == 0) return clr = 0xc0c0c0;
  933. return FALSE;
  934. case _T('T'): if (_wcsicmp(lpszValue, L"TOMATO") == 0) return clr = 0x4763ff; return FALSE;
  935. case _T('V'): if (_wcsicmp(lpszValue, L"VIOLET") == 0) return clr = 0xee82ee; return FALSE;
  936. case _T('Y'): if (_wcsicmp(lpszValue, L"YELLOW") == 0) return clr = 0x00ffff; return FALSE;
  937. case _T('I'): if (_wcsicmp(lpszValue, L"INDIGO") == 0) return clr = 0x82004b; return FALSE;
  938. case _T('B'): if (_wcsicmp(lpszValue, L"BISQUE") == 0) return clr = 0xc4e4ff; return FALSE;
  939. }
  940. return FALSE;
  941. case 7:
  942. switch (ch)
  943. {
  944. case _T('C'): if (_wcsicmp(lpszValue, L"CRIMSON") == 0) return clr = 0x3c14dc; return FALSE;
  945. case _T('D'):
  946. if (_wcsicmp(lpszValue, L"DARKRED") == 0) return clr = 0x00008b;
  947. if (_wcsicmp(lpszValue, L"DIMGRAY") == 0) return clr = 0x696969;
  948. return FALSE;
  949. case _T('F'): if (_wcsicmp(lpszValue, L"FUCHSIA") == 0) return clr = 0xff00ff; return FALSE;
  950. case _T('H'): if (_wcsicmp(lpszValue, L"HOTPINK") == 0) return clr = 0xb469ff; return FALSE;
  951. case _T('M'): if (_wcsicmp(lpszValue, L"MAGENTA") == 0) return clr = 0xff00ff; return FALSE;
  952. case _T('O'): if (_wcsicmp(lpszValue, L"OLDLACE") == 0)return clr = 0xe6f5fd; return FALSE;
  953. case _T('S'): if (_wcsicmp(lpszValue, L"SKYBLUE") == 0) return clr = 0xebce87; return FALSE;
  954. case _T('T'): if (_wcsicmp(lpszValue, L"THISTLE") == 0) return clr = 0xd8bfd8; return FALSE;
  955. }
  956. return FALSE;
  957. case 8:
  958. switch (ch)
  959. {
  960. case _T('C'): if (_wcsicmp(lpszValue, L"CORNSILK") == 0) return clr = 0xdcf8ff; return FALSE;
  961. case _T('D'):
  962. if (_wcsicmp(lpszValue, L"DARKBLUE") == 0) return clr = 0x8b0000;
  963. if (_wcsicmp(lpszValue, L"DARKCYAN") == 0) return clr = 0x8b8b00;
  964. if (_wcsicmp(lpszValue, L"DARKGRAY") == 0) return clr = 0xa9a9a9;
  965. if (_wcsicmp(lpszValue, L"DEEPPINK") == 0) return clr = 0x9314ff;
  966. return FALSE;
  967. case _T('H'): if (_wcsicmp(lpszValue, L"HONEYDEW") == 0) return clr = 0xf0fff0; return FALSE;
  968. case _T('L'): if (_wcsicmp(lpszValue, L"LAVENDER") == 0) return clr = 0xfae6e6; return FALSE;
  969. case _T('M'): if (_wcsicmp(lpszValue, L"MOCCASIN") == 0) return clr = 0xb5e4ff; return FALSE;
  970. case _T('S'):
  971. if (_wcsicmp(lpszValue, L"SEAGREEN") == 0) return clr = 0x578b2e;
  972. if (_wcsicmp(lpszValue, L"SEASHELL") == 0) return clr = 0xeef5ff;
  973. return FALSE;
  974. }
  975. return FALSE;
  976. case 9:
  977. switch (ch)
  978. {
  979. case _T('A'): if (_wcsicmp(lpszValue, L"ALICEBLUE") == 0) return clr = 0xfff8f0; return FALSE;
  980. case _T('B'): if (_wcsicmp(lpszValue, L"BURLYWOOD") == 0) return clr = 0x87b8de; return FALSE;
  981. case _T('C'):
  982. if (_wcsicmp(lpszValue, L"CADETBLUE") == 0) return clr = 0xa09e5f;
  983. if (_wcsicmp(lpszValue, L"CHOCOLATE") == 0) return clr = 0x1e69d2;
  984. return FALSE;
  985. case _T('D'):
  986. if (_wcsicmp(lpszValue, L"DARKGREEN") == 0) return clr = 0x006400;
  987. if (_wcsicmp(lpszValue, L"DARKKHAKI") == 0) return clr = 0x6bb7bd;
  988. return FALSE;
  989. case _T('F'): if (_wcsicmp(lpszValue, L"FIREBRICK") == 0) return clr = 0x2222b2; return FALSE;
  990. case _T('G'):
  991. if (_wcsicmp(lpszValue, L"GAINSBORO") == 0) return clr = 0xdcdcdc;
  992. if (_wcsicmp(lpszValue, L"GOLDENROD") == 0) return clr = 0x20a5da;
  993. return FALSE;
  994. case _T('I'): if (_wcsicmp(lpszValue, L"INDIANRED") == 0)return clr = 0x5c5ccd; return FALSE;
  995. case _T('L'):
  996. if (_wcsicmp(lpszValue, L"LAWNGREEN") == 0)return clr = 0x00fc7c;
  997. if (_wcsicmp(lpszValue, L"LIGHTBLUE") == 0) return clr = 0xe6d8ad;
  998. if (_wcsicmp(lpszValue, L"LIGHTCYAN") == 0) return clr = 0xffffe0;
  999. if (_wcsicmp(lpszValue, L"LIGHTGRAY") == 0) return clr = 0xd3d3d3;
  1000. if (_wcsicmp(lpszValue, L"LIGHTPINK") == 0) return clr = 0xc1b6ff;
  1001. if (_wcsicmp(lpszValue, L"LIMEGREEN") == 0) return clr = 0x32cd32;
  1002. return FALSE;
  1003. case _T('M'):
  1004. if (_wcsicmp(lpszValue, L"MINTCREAM") == 0) return clr = 0xfafff5;
  1005. if (_wcsicmp(lpszValue, L"MISTYROSE") == 0) return clr = 0xe1e4ff;
  1006. return FALSE;
  1007. case _T('O'):
  1008. if (_wcsicmp(lpszValue, L"OLIVEDRAB") == 0) return clr = 0x238e6b;
  1009. if (_wcsicmp(lpszValue, L"ORANGERED") == 0) return clr = 0x0045ff;
  1010. return FALSE;
  1011. case _T('P'):
  1012. if (_wcsicmp(lpszValue, L"PALEGREEN") == 0) return clr = 0x98fb98;
  1013. if (_wcsicmp(lpszValue, L"PEACHPUFF") == 0) return clr = 0xb9daff;
  1014. return FALSE;
  1015. case _T('R'):
  1016. if (_wcsicmp(lpszValue, L"ROSYBROWN") == 0) return clr = 0x8f8fbc;
  1017. if (_wcsicmp(lpszValue, L"ROYALBLUE") == 0) return clr = 0xe16941;
  1018. return FALSE;
  1019. case _T('S'):
  1020. if (_wcsicmp(lpszValue, L"SLATEBLUE") == 0) return clr = 0xcd5a6a;
  1021. if (_wcsicmp(lpszValue, L"SLATEGRAY") == 0)  return clr = 0x908070;
  1022. if (_wcsicmp(lpszValue, L"STEELBLUE") == 0) return clr = 0xb48246;
  1023. return FALSE;
  1024. case _T('T'): if (_wcsicmp(lpszValue, L"TURQUOISE") == 0) return clr = 0xd0e040; return FALSE;
  1025. }
  1026. return FALSE;
  1027. case 10:
  1028. switch (ch)
  1029. {
  1030. case _T('A'): if (_wcsicmp(lpszValue, L"AQUAMARINE") == 0) return clr = 0xd4ff7f; return FALSE;
  1031. case _T('B'): if (_wcsicmp(lpszValue, L"BLUEVIOLET") == 0) return clr = 0xe22b8a; return FALSE;
  1032. case _T('C'): if (_wcsicmp(lpszValue, L"CHARTREUSE") == 0) return clr = 0x00ff7f; return FALSE;
  1033. case _T('D'):
  1034. if (_wcsicmp(lpszValue, L"DARKORANGE") == 0) return clr = 0x008cff;
  1035. if (_wcsicmp(lpszValue, L"DARKORCHID") == 0) return clr = 0xcc3299;
  1036. if (_wcsicmp(lpszValue, L"DARKSALMON") == 0) return clr = 0x7a96e9;
  1037. if (_wcsicmp(lpszValue, L"DARKVIOLET") == 0) return clr = 0xd30094;
  1038. if (_wcsicmp(lpszValue, L"DODGERBLUE") == 0) return clr = 0xff901e;
  1039. return FALSE;
  1040. case _T('G'): if (_wcsicmp(lpszValue, L"GHOSTWHITE") == 0) return clr = 0xfff8f8; return FALSE;
  1041. case _T('L'):
  1042. if (_wcsicmp(lpszValue, L"LIGHTCORAL") == 0)  return clr = 0x8080f0;
  1043. if (_wcsicmp(lpszValue, L"LIGHTGREEN") == 0) return clr = 0x90ee90;
  1044. return FALSE;
  1045. case _T('M'):
  1046. if (_wcsicmp(lpszValue, L"MEDIUMBLUE") == 0) return clr = 0xcd0000; return FALSE;
  1047. case _T('P'):
  1048. if (_wcsicmp(lpszValue, L"PAPAYAWHIP") == 0) return clr = 0xd5efff;
  1049. if (_wcsicmp(lpszValue, L"POWDERBLUE") == 0) return clr = 0xe6e0b0;
  1050. return FALSE;
  1051. case _T('S'): if (_wcsicmp(lpszValue, L"SANDYBROWN") == 0) return clr = 0x60a4f4; return FALSE;
  1052. case _T('W'): if (_wcsicmp(lpszValue, L"WHITESMOKE") == 0) return clr = 0xf5f5f5; return FALSE;
  1053. }
  1054. return FALSE;
  1055. case 11:
  1056. switch (ch)
  1057. {
  1058. case _T('D'):
  1059. if (_wcsicmp(lpszValue, L"DARKMAGENTA") == 0) return clr = 0x8b008b;
  1060. if (_wcsicmp(lpszValue, L"DEEPSKYBLUE") == 0) return clr = 0xffbf00;
  1061. return FALSE;
  1062. case _T('F'):
  1063. if (_wcsicmp(lpszValue, L"FLORALWHITE") == 0)  return clr = 0xf0faff;
  1064. if (_wcsicmp(lpszValue, L"FORESTGREEN") == 0) return clr = 0x228b22;
  1065. return FALSE;
  1066. case _T('G'): if (_wcsicmp(lpszValue, L"GREENYELLOW") == 0) return clr = 0x2fffad; return FALSE;
  1067. case _T('L'):
  1068. if (_wcsicmp(lpszValue, L"LIGHTSALMON") == 0)  return clr = 0x7aa0ff;
  1069. if (_wcsicmp(lpszValue, L"LIGHTYELLOW") == 0) return clr = 0xe0ffff;
  1070. return FALSE;
  1071. case _T('N'):
  1072. if (_wcsicmp(lpszValue, L"NAVAJOWHITE") == 0) return clr = 0xaddeff;
  1073. return FALSE;
  1074. case _T('S'):
  1075. if (_wcsicmp(lpszValue, L"SADDLEBROWN") == 0) return clr = 0x13458b;
  1076. if (_wcsicmp(lpszValue, L"SPRINGGREEN") == 0) return clr = 0x7fff00;
  1077. return FALSE;
  1078. case _T('T'): if (_wcsicmp(lpszValue, L"TRANSPARENT") == 0) return 0; return FALSE;
  1079. case _T('Y'): if (_wcsicmp(lpszValue, L"YELLOWGREEN") == 0) return clr = 0x32cd9a; return FALSE;
  1080. }
  1081. return FALSE;
  1082. case 12:
  1083. switch (ch)
  1084. {
  1085. case _T('L'):
  1086. if (_wcsicmp(lpszValue, L"LIGHTSKYBLUE") == 0) return clr = 0xface87;
  1087. if (_wcsicmp(lpszValue, L"LEMONCHIFFON") == 0)   return clr = 0xcdfaff;
  1088. return FALSE;
  1089. case _T('M'):
  1090. if (_wcsicmp(lpszValue, L"MEDIUMORCHID") == 0) return clr = 0xd355ba;
  1091. if (_wcsicmp(lpszValue, L"MEDIUMPURPLE") == 0) return clr = 0xdb7093;
  1092. if (_wcsicmp(lpszValue, L"MIDNIGHTBLUE") == 0) return clr = 0x701919;
  1093. return FALSE;
  1094. case _T('D'): if (_wcsicmp(lpszValue, L"DARKSEAGREEN") == 0) return clr = 0x8fbc8f; return FALSE;
  1095. case _T('A'): if (_wcsicmp(lpszValue, L"ANTIQUEWHITE") == 0) return clr = 0xd7ebfa; return FALSE;
  1096. }
  1097. return FALSE;
  1098. case 13:
  1099. switch (ch)
  1100. {
  1101. case _T('D'):
  1102. if (_wcsicmp(lpszValue, L"DARKSLATEBLUE") == 0) return clr = 0x8b3d48;
  1103. if (_wcsicmp(lpszValue, L"DARKSLATEGRAY") == 0) return clr = 0x4f4f2f;
  1104. if (_wcsicmp(lpszValue, L"DARKGOLDENROD") == 0) return clr = 0x0b86b8;
  1105. if (_wcsicmp(lpszValue, L"DARKTURQUOISE") == 0) return clr = 0xd1ce00;
  1106. return FALSE;
  1107. case _T('L'):
  1108. if (_wcsicmp(lpszValue, L"LIGHTSEAGREEN") == 0) return clr = 0xaab220;
  1109. if (_wcsicmp(lpszValue, L"LAVENDERBLUSH") == 0) return clr = 0xf5f0ff;
  1110. return FALSE;
  1111. case _T('P'):
  1112. if (_wcsicmp(lpszValue, L"PALEGOLDENROD") == 0) return clr = 0xaae8ee;
  1113. if (_wcsicmp(lpszValue, L"PALETURQUOISE") == 0) return clr = 0xeeeeaf;
  1114. if (_wcsicmp(lpszValue, L"PALEVIOLETRED") == 0) return clr = 0x9370db;
  1115. return FALSE;
  1116. }
  1117. return FALSE;
  1118. case 14:
  1119. switch (ch)
  1120. {
  1121. case _T('B'): if (_wcsicmp(lpszValue, L"BLANCHEDALMOND") == 0) return clr = 0xcdebff; return FALSE;
  1122. case _T('C'): if (_wcsicmp(lpszValue, L"CORNFLOWERBLUE") == 0) return clr = 0xed9564; return FALSE;
  1123. case _T('D'): if (_wcsicmp(lpszValue, L"DARKOLIVEGREEN") == 0) return clr = 0x2f6b55; return FALSE;
  1124. case _T('L'):
  1125. if (_wcsicmp(lpszValue, L"LIGHTSLATEGRAY") == 0) return clr = 0x998877;
  1126. if (_wcsicmp(lpszValue, L"LIGHTSTEELBLUE") == 0) return clr = 0xdec4b0;
  1127. return FALSE;
  1128. case _T('M'): if (_wcsicmp(lpszValue, L"MEDIUMSEAGREEN") == 0) return clr = 0x71b33c; return FALSE;
  1129. }
  1130. return FALSE;
  1131. case 15:
  1132. if (_wcsicmp(lpszValue, L"MEDIUMSLATEBLUE") == 0) return clr = 0xee687b;
  1133. if (_wcsicmp(lpszValue, L"MEDIUMTURQUOISE") == 0) return clr = 0xccd148;
  1134. if (_wcsicmp(lpszValue, L"MEDIUMVIOLETRED") == 0) return clr = 0x8515c7;
  1135. return FALSE;
  1136. case 16:
  1137. if (_wcsicmp(lpszValue, L"MEDIUMAQUAMARINE") == 0) return clr = 0xaacd66;
  1138. return FALSE;
  1139. case 17:
  1140. if (_wcsicmp(lpszValue, L"MEDIUMSPRINGGREEN") == 0) return clr = 0x9afa00;
  1141. return FALSE;
  1142. case 20:
  1143. if (_wcsicmp(lpszValue, L"LIGHTGOLDENRODYELLOW") == 0) return clr = 0xd2fafa;
  1144. return FALSE;
  1145. }
  1146. return FALSE;
  1147. }
  1148. CXTPMarkupObject* CXTPMarkupBuilder::ConvertTextDecorations(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1149. {
  1150. if (IsStringObject(pObject))
  1151. {
  1152. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1153. if (_wcsicmp(lpszValue, L"Underline") == 0)
  1154. return CXTPMarkupEnum::CreateValue(1);
  1155. if (_wcsicmp(lpszValue, L"Strikethrough") == 0)
  1156. return CXTPMarkupEnum::CreateValue(2);
  1157. if (_wcsicmp(lpszValue, L"") == 0)
  1158. return CXTPMarkupEnum::CreateValue(0);
  1159. }
  1160. return NULL;
  1161. }
  1162. CXTPMarkupObject* CXTPMarkupBuilder::ConvertFontWeight(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1163. {
  1164. if (IsStringObject(pObject))
  1165. {
  1166. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1167. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1168. switch (nLength)
  1169. {
  1170. case 4:
  1171. if (_wcsicmp(lpszValue, L"Bold") == 0) return CXTPMarkupEnum::CreateValue(FW_BOLD);
  1172. if (_wcsicmp(lpszValue, L"Thin") == 0) return CXTPMarkupEnum::CreateValue(FW_THIN);
  1173. return NULL;
  1174. case 5:
  1175. if (_wcsicmp(lpszValue, L"Light") == 0) return CXTPMarkupEnum::CreateValue(FW_LIGHT);
  1176. if (_wcsicmp(lpszValue, L"Black") == 0) return CXTPMarkupEnum::CreateValue(FW_BLACK);
  1177. if (_wcsicmp(lpszValue, L"Heavy") == 0) return CXTPMarkupEnum::CreateValue(FW_HEAVY);
  1178. return NULL;
  1179. case 6:
  1180. if (_wcsicmp(lpszValue, L"Normal") == 0) return CXTPMarkupEnum::CreateValue(FW_NORMAL);
  1181. if (_wcsicmp(lpszValue, L"Medium") == 0) return CXTPMarkupEnum::CreateValue(FW_MEDIUM);
  1182. return NULL;
  1183. case 7:
  1184. if (_wcsicmp(lpszValue, L"Regular") == 0) return CXTPMarkupEnum::CreateValue(FW_REGULAR);
  1185. return NULL;
  1186. case 8:
  1187. if (_wcsicmp(lpszValue, L"SemiBold") == 0) return CXTPMarkupEnum::CreateValue(FW_SEMIBOLD);
  1188. if (_wcsicmp(lpszValue, L"DemiBold") == 0) return CXTPMarkupEnum::CreateValue(FW_DEMIBOLD);
  1189. return NULL;
  1190. case 9:
  1191. if (_wcsicmp(lpszValue, L"ExtraBold") == 0) return CXTPMarkupEnum::CreateValue(FW_EXTRABOLD);
  1192. if (_wcsicmp(lpszValue, L"UltraBold") == 0) return CXTPMarkupEnum::CreateValue(FW_ULTRABOLD);
  1193. return NULL;
  1194. case 10:
  1195. if (_wcsicmp(lpszValue, L"ExtraLight") == 0) return CXTPMarkupEnum::CreateValue(FW_EXTRALIGHT);
  1196. if (_wcsicmp(lpszValue, L"ExtraBlack") == 0) return CXTPMarkupEnum::CreateValue(950);
  1197. return NULL;
  1198. }
  1199. }
  1200. return NULL;
  1201. }
  1202. CXTPMarkupObject* CXTPMarkupBuilder::ConvertFontQuality(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1203. {
  1204. if (IsStringObject(pObject))
  1205. {
  1206. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1207. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1208. if (nLength == 9 && _wcsicmp(lpszValue, L"ClearType") == 0)
  1209. return CXTPMarkupEnum::CreateValue(5);
  1210. }
  1211. return NULL;
  1212. }
  1213. CXTPMarkupObject* CXTPMarkupBuilder::ConvertFontStyle(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1214. {
  1215. if (IsStringObject(pObject))
  1216. {
  1217. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1218. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1219. if (nLength == 6 && _wcsicmp(lpszValue, L"Normal") == 0)
  1220. return CXTPMarkupEnum::CreateValue(0);
  1221. if (nLength == 6 && _wcsicmp(lpszValue, L"Italic") == 0)
  1222. return CXTPMarkupEnum::CreateValue(1);
  1223. }
  1224. return NULL;
  1225. }
  1226. //////////////////////////////////////////////////////////////////////////
  1227. CXTPMarkupObject* CXTPMarkupBuilder::ConvertVerticalAlignment(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1228. {
  1229. if (IsStringObject(pObject))
  1230. {
  1231. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1232. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1233. if (nLength == 3 && _wcsicmp(lpszValue, L"Top") == 0)
  1234. return CXTPMarkupEnum::CreateValue(xtpMarkupVerticalAlignmentTop);
  1235. if (nLength == 6 && _wcsicmp(lpszValue, L"Center") == 0)
  1236. return CXTPMarkupEnum::CreateValue(xtpMarkupVerticalAlignmentCenter);
  1237. if (nLength == 6 && _wcsicmp(lpszValue, L"Bottom") == 0)
  1238. return CXTPMarkupEnum::CreateValue(xtpMarkupVerticalAlignmentBottom);
  1239. if (nLength == 7 && _wcsicmp(lpszValue, L"Stretch") == 0)
  1240. return CXTPMarkupEnum::CreateValue(xtpMarkupVerticalAlignmentStretch);
  1241. }
  1242. return NULL;
  1243. }
  1244. CXTPMarkupObject* CXTPMarkupBuilder::ConvertHorizontalAlignment(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1245. {
  1246. if (IsStringObject(pObject))
  1247. {
  1248. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1249. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1250. if (nLength == 4 && _wcsicmp(lpszValue, L"Left") == 0)
  1251. return CXTPMarkupEnum::CreateValue(xtpMarkupHorizontalAlignmentLeft);
  1252. if (nLength == 6 && _wcsicmp(lpszValue, L"Center") == 0)
  1253. return CXTPMarkupEnum::CreateValue(xtpMarkupHorizontalAlignmentCenter);
  1254. if (nLength == 5 && _wcsicmp(lpszValue, L"Right") == 0)
  1255. return CXTPMarkupEnum::CreateValue(xtpMarkupHorizontalAlignmentRight);
  1256. if (nLength == 7 && _wcsicmp(lpszValue, L"Stretch") == 0)
  1257. return CXTPMarkupEnum::CreateValue(xtpMarkupHorizontalAlignmentStretch);
  1258. }
  1259. return NULL;
  1260. }
  1261. CXTPMarkupObject* CXTPMarkupBuilder::ConvertTextWrapping(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1262. {
  1263. if (IsStringObject(pObject))
  1264. {
  1265. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1266. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1267. if (nLength == 4 && _wcsicmp(lpszValue, L"Wrap") == 0)
  1268. return CXTPMarkupEnum::CreateValue(1);
  1269. if (nLength == 6 && _wcsicmp(lpszValue, L"NoWrap") == 0)
  1270. return CXTPMarkupEnum::CreateValue(0);
  1271. }
  1272. return NULL;
  1273. }
  1274. CXTPMarkupObject* CXTPMarkupBuilder::ConvertTextTrimming(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1275. {
  1276. if (IsStringObject(pObject))
  1277. {
  1278. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1279. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1280. if (nLength == 4 && _wcsicmp(lpszValue, L"None") == 0)
  1281. return CXTPMarkupEnum::CreateValue(xtpMarkupTextTrimmingNone);
  1282. if (nLength == 17 && _wcsicmp(lpszValue, L"CharacterEllipsis") == 0)
  1283. return CXTPMarkupEnum::CreateValue(xtpMarkupTextTrimmingCharacterEllipsis);
  1284. if (nLength == 12 && _wcsicmp(lpszValue, L"WordEllipsis") == 0)
  1285. return CXTPMarkupEnum::CreateValue(xtpMarkupTextTrimmingWordEllipsis);
  1286. }
  1287. return NULL;
  1288. }
  1289. CXTPMarkupObject* CXTPMarkupBuilder::ConvertTextAlignment(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1290. {
  1291. if (IsStringObject(pObject))
  1292. {
  1293. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1294. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1295. if (nLength == 6 && _wcsicmp(lpszValue, L"Center") == 0)
  1296. return CXTPMarkupEnum::CreateValue(xtpMarkupTextAlignmentCenter);
  1297. if (nLength == 4 && _wcsicmp(lpszValue, L"Left") == 0)
  1298. return CXTPMarkupEnum::CreateValue(xtpMarkupTextAlignmentLeft);
  1299. if (nLength == 5 &&_wcsicmp(lpszValue, L"Right") == 0)
  1300. return CXTPMarkupEnum::CreateValue(xtpMarkupTextAlignmentRight);
  1301. }
  1302. return NULL;
  1303. }
  1304. CXTPMarkupObject* CXTPMarkupBuilder::ConvertOrientation(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1305. {
  1306. if (IsStringObject(pObject))
  1307. {
  1308. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1309. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1310. if (nLength == 10 && _wcsicmp(lpszValue, L"Horizontal") == 0)
  1311. return CXTPMarkupEnum::CreateValue(xtpMarkupOrientationHorizontal);
  1312. if (nLength == 8 && _wcsicmp(lpszValue, L"Vertical") == 0)
  1313. return CXTPMarkupEnum::CreateValue(xtpMarkupOrientationVertical);
  1314. }
  1315. return NULL;
  1316. }
  1317. CXTPMarkupObject* CXTPMarkupBuilder::ConvertBaselineAlignment(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1318. {
  1319. if (IsStringObject(pObject))
  1320. {
  1321. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1322. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1323. if (nLength == 3 && _wcsicmp(lpszValue, L"Top") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineTop);
  1324. if (nLength == 6 && _wcsicmp(lpszValue, L"Center") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineCenter);
  1325. if (nLength == 6 && _wcsicmp(lpszValue, L"Bottom") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineBottom);
  1326. if (nLength == 8 && _wcsicmp(lpszValue, L"Baseline") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaseline);
  1327. if (nLength == 7 && _wcsicmp(lpszValue, L"TextTop") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineTextTop);
  1328. if (nLength == 10 && _wcsicmp(lpszValue, L"TextBottom") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineTextBottom);
  1329. if (nLength == 9 && _wcsicmp(lpszValue, L"Subscript") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineSubscript);
  1330. if (nLength == 11 && _wcsicmp(lpszValue, L"Superscript") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupBaselineSuperscript);
  1331. }
  1332. return NULL;
  1333. }
  1334. CXTPMarkupObject* CXTPMarkupBuilder::ConvertCursor(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1335. {
  1336. if (IsStringObject(pObject))
  1337. {
  1338. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1339. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1340. if (nLength == 4 && _wcsicmp(lpszValue, L"None") == 0) return new CXTPMarkupInt(0);
  1341. if (nLength == 2 && _wcsicmp(lpszValue, L"No") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_NO);
  1342. if (nLength == 5 && _wcsicmp(lpszValue, L"Arrow") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_ARROW);
  1343. if (nLength == 11 && _wcsicmp(lpszValue, L"AppStarting") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_APPSTARTING);
  1344. if (nLength == 5 && _wcsicmp(lpszValue, L"Cross") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_CROSS);
  1345. if (nLength == 5 && _wcsicmp(lpszValue, L"IBeam") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_IBEAM);
  1346. if (nLength == 6 && _wcsicmp(lpszValue, L"SizeAll") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZEALL);
  1347. if (nLength == 8 && _wcsicmp(lpszValue, L"SizeNESW") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZENESW);
  1348. if (nLength == 6 && _wcsicmp(lpszValue, L"SizeNS") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZENS);
  1349. if (nLength == 8 && _wcsicmp(lpszValue, L"SizeNWSE") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZENWSE);
  1350. if (nLength == 6 && _wcsicmp(lpszValue, L"SizeWE") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_SIZEWE);
  1351. if (nLength == 7 && _wcsicmp(lpszValue, L"UpArrow") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_UPARROW);
  1352. if (nLength == 4 && _wcsicmp(lpszValue, L"Wait") == 0) return new CXTPMarkupInt((DWORD)(DWORD_PTR)IDC_WAIT);
  1353. if (nLength == 4 && _wcsicmp(lpszValue, L"Hand") == 0) return new CXTPMarkupInt((DWORD)32649);
  1354. }
  1355. return NULL;
  1356. }
  1357. CXTPMarkupObject* CXTPMarkupBuilder::ConvertVisibility(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1358. {
  1359. if (IsStringObject(pObject))
  1360. {
  1361. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1362. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1363. if (nLength == 7 && _wcsicmp(lpszValue, L"Visible") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupVisibilityVisible);
  1364. if (nLength == 6 && _wcsicmp(lpszValue, L"Hidden") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupVisibilityHidden);
  1365. if (nLength == 9 && _wcsicmp(lpszValue, L"Collapsed") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupVisibilityCollapsed);
  1366. }
  1367. return NULL;
  1368. }
  1369. CXTPMarkupObject* CXTPMarkupBuilder::ConvertContent(CXTPMarkupContext* pContext, CXTPMarkupObject* pObject)
  1370. {
  1371. if (IsStringObject(pObject))
  1372. {
  1373. CXTPMarkupRun* pRun = MARKUP_CREATE(CXTPMarkupRun, pContext);
  1374. pRun->SetText((CXTPMarkupString*)pObject);
  1375. MARKUP_ADDREF(pObject);
  1376. CXTPMarkupTextBlock* pTextBlock = MARKUP_CREATE(CXTPMarkupTextBlock, pContext);
  1377. pTextBlock->GetInlines()->Add(pRun);
  1378. return pTextBlock;
  1379. }
  1380. return pObject;
  1381. }
  1382. CXTPMarkupObject* CXTPMarkupBuilder::ConvertScrollBarVisibility(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1383. {
  1384. if (IsStringObject(pObject))
  1385. {
  1386. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1387. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1388. if (nLength == 4 && _wcsicmp(lpszValue, L"Auto") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupScrollBarAuto);
  1389. if (nLength == 7 && _wcsicmp(lpszValue, L"Visible") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupScrollBarVisible);
  1390. if (nLength == 8 && _wcsicmp(lpszValue, L"Disabled") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupScrollBarDisabled);
  1391. }
  1392. return NULL;
  1393. }
  1394. CXTPMarkupObject* CXTPMarkupBuilder::ConvertStretch(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  1395. {
  1396. if (IsStringObject(pObject))
  1397. {
  1398. LPCWSTR lpszValue = *((CXTPMarkupString*)pObject);
  1399. int nLength = ((CXTPMarkupString*)pObject)->GetLength();
  1400. if (nLength == 4 && _wcsicmp(lpszValue, L"None") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupStretchNone);
  1401. if (nLength == 4 && _wcsicmp(lpszValue, L"Fill") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupStretchFill);
  1402. if (nLength == 7 && _wcsicmp(lpszValue, L"Uniform") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupStretchUniform);
  1403. if (nLength == 13 && _wcsicmp(lpszValue, L"UniformToFill") == 0) return CXTPMarkupEnum::CreateValue(xtpMarkupStretchUniformToFill);
  1404. }
  1405. return NULL;
  1406. }