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

对话框与窗口

开发平台:

Visual C++

  1. // XTPMarkupInline.cpp: implementation of the CXTPMarkupInline 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/XTPSystemHelpers.h"
  22. #include "Common/resource.h"
  23. #include "XTPMarkupResourceDictionary.h"
  24. #include "XTPMarkupInline.h"
  25. #include "XTPMarkupDrawingContext.h"
  26. #include "XTPMarkupBuilder.h"
  27. #include "XTPMarkupTextBlock.h"
  28. #include "XTPMarkupContext.h"
  29. #include "XTPMarkupButton.h"
  30. #ifdef _DEBUG
  31. #undef THIS_FILE
  32. static char THIS_FILE[]=__FILE__;
  33. #define new DEBUG_NEW
  34. #endif
  35. //////////////////////////////////////////////////////////////////////////
  36. // CXTPMarkupFrameworkContentElement
  37. CXTPMarkupDependencyProperty* CXTPMarkupFrameworkContentElement::m_pTagProperty = NULL;
  38. IMPLEMENT_MARKUPCLASS(L"FrameworkContentElement", CXTPMarkupFrameworkContentElement, CXTPMarkupInputElement);
  39. void CXTPMarkupFrameworkContentElement::RegisterMarkupClass()
  40. {
  41. CXTPMarkupFrameworkElement::RegisterType();
  42. m_pTagProperty = CXTPMarkupFrameworkElement::m_pTagProperty->AddOwner(MARKUP_TYPE(CXTPMarkupFrameworkContentElement));
  43. }
  44. CXTPMarkupFrameworkContentElement::CXTPMarkupFrameworkContentElement()
  45. {
  46. }
  47. void CXTPMarkupFrameworkContentElement::OnPropertyChanged(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pOldValue, CXTPMarkupObject* pNewValue)
  48. {
  49. CXTPMarkupInputElement::OnPropertyChanged(pProperty, pOldValue, pNewValue);
  50. FireTriggers(pProperty, pNewValue);
  51. if (pProperty->GetFlags() & CXTPMarkupPropertyMetadata::flagAffectsMeasure)
  52. {
  53. CXTPMarkupFrameworkElement* pParent = GetParent();
  54. if (pParent) pParent->InvalidateMeasure();
  55. }
  56. if (pProperty->GetFlags() & CXTPMarkupPropertyMetadata::flagAffectsArrange)
  57. {
  58. CXTPMarkupFrameworkElement* pParent = GetParent();
  59. if (pParent) pParent->InvalidateArrange();
  60. }
  61. if (pProperty->GetFlags() & CXTPMarkupPropertyMetadata::flagAffectsRender)
  62. {
  63. CXTPMarkupFrameworkElement* pParent = GetParent();
  64. if (pParent) pParent->InvalidateVisual();
  65. }
  66. }
  67. CXTPMarkupFrameworkElement* CXTPMarkupFrameworkContentElement::GetParent() const
  68. {
  69. CXTPMarkupObject* pParent = m_pLogicalParent;
  70. while (pParent)
  71. {
  72. if (pParent->IsKindOf(MARKUP_TYPE(CXTPMarkupFrameworkElement)))
  73. return (CXTPMarkupFrameworkElement*)pParent;
  74. pParent = pParent->GetLogicalParent();
  75. }
  76. return NULL;
  77. }
  78. //////////////////////////////////////////////////////////////////////////
  79. //
  80. CXTPMarkupDependencyProperty* CXTPMarkupTextElement::m_pBackgroundProperty = NULL;
  81. CXTPMarkupDependencyProperty* CXTPMarkupTextElement::m_pForegroundProperty = NULL;
  82. CXTPMarkupDependencyProperty* CXTPMarkupTextElement::m_pFontSizeProperty = NULL;
  83. CXTPMarkupDependencyProperty* CXTPMarkupTextElement::m_pFontWeightProperty = NULL;
  84. CXTPMarkupDependencyProperty* CXTPMarkupTextElement::m_pFontFamilyProperty = NULL;
  85. CXTPMarkupDependencyProperty* CXTPMarkupTextElement::m_pFontStyleProperty = NULL;
  86. CXTPMarkupDependencyProperty* CXTPMarkupTextElement::m_pTextDecorationsProperty = NULL;
  87. CXTPMarkupDependencyProperty* CXTPMarkupTextElement::m_pFontQualityProperty = NULL;
  88. //////////////////////////////////////////////////////////////////////////
  89. // CXTPMarkupTextElement
  90. IMPLEMENT_MARKUPCLASS(L"TextElement", CXTPMarkupTextElement, CXTPMarkupFrameworkContentElement);
  91. void CXTPMarkupTextElement::RegisterMarkupClass()
  92. {
  93. m_pBackgroundProperty = CXTPMarkupDependencyProperty::RegisterAttached(L"Background", MARKUP_TYPE(CXTPMarkupBrush), MARKUP_TYPE(CXTPMarkupTextElement),
  94. new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagInherited | CXTPMarkupPropertyMetadata::flagAffectsRender));
  95. m_pForegroundProperty = CXTPMarkupDependencyProperty::RegisterAttached(L"Foreground", MARKUP_TYPE(CXTPMarkupBrush), MARKUP_TYPE(CXTPMarkupTextElement),
  96. new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagInherited | CXTPMarkupPropertyMetadata::flagAffectsRender));
  97. m_pFontSizeProperty = CXTPMarkupDependencyProperty::RegisterAttached(L"FontSize", MARKUP_TYPE(CXTPMarkupInt), MARKUP_TYPE(CXTPMarkupTextElement),
  98. new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagInherited | CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  99. m_pFontWeightProperty = CXTPMarkupDependencyProperty::RegisterAttached(L"FontWeight", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupTextElement),
  100. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertFontWeight, CXTPMarkupPropertyMetadata::flagInherited | CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  101. m_pFontFamilyProperty = CXTPMarkupDependencyProperty::RegisterAttached(L"FontFamily", MARKUP_TYPE(CXTPMarkupString), MARKUP_TYPE(CXTPMarkupTextElement),
  102. new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagInherited | CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  103. m_pFontStyleProperty = CXTPMarkupDependencyProperty::RegisterAttached(L"FontStyle", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupTextElement),
  104. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertFontStyle, CXTPMarkupPropertyMetadata::flagInherited | CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  105. m_pTextDecorationsProperty = CXTPMarkupDependencyProperty::RegisterAttached(L"TextDecorations", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupTextElement),
  106. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertTextDecorations, CXTPMarkupPropertyMetadata::flagInherited | CXTPMarkupPropertyMetadata::flagAffectsRender));
  107. m_pFontQualityProperty = CXTPMarkupDependencyProperty::RegisterAttached(L"FontQuality", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupTextElement),
  108. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertFontQuality, CXTPMarkupPropertyMetadata::flagInherited | CXTPMarkupPropertyMetadata::flagAffectsRender));
  109. }
  110. CXTPMarkupTextElement::CXTPMarkupTextElement()
  111. {
  112. }
  113. CXTPMarkupTextElement::~CXTPMarkupTextElement()
  114. {
  115. }
  116. void CXTPMarkupTextElement::SetBackground(CXTPMarkupBrush* pBrush)
  117. {
  118. SetValue(m_pBackgroundProperty, pBrush);
  119. }
  120. void CXTPMarkupTextElement::SetBackground(COLORREF clr)
  121. {
  122. SetValue(m_pBackgroundProperty, new CXTPMarkupSolidColorBrush(clr));
  123. }
  124. void CXTPMarkupTextElement::SetBackground(CXTPMarkupObject* pObject, CXTPMarkupBrush* pBrush)
  125. {
  126. pObject->SetValue(m_pBackgroundProperty, pBrush);
  127. }
  128. CXTPMarkupBrush* CXTPMarkupTextElement::GetBackground() const
  129. {
  130. return MARKUP_STATICCAST(CXTPMarkupBrush, GetValue(m_pBackgroundProperty));
  131. }
  132. void CXTPMarkupTextElement::SetForeground(CXTPMarkupBrush* pBrush)
  133. {
  134. SetValue(m_pForegroundProperty, pBrush);
  135. }
  136. void CXTPMarkupTextElement::SetForeground(COLORREF clr)
  137. {
  138. SetValue(m_pForegroundProperty, new CXTPMarkupSolidColorBrush(clr));
  139. }
  140. void CXTPMarkupTextElement::SetForeground(CXTPMarkupObject* pObject, CXTPMarkupBrush* pBrush)
  141. {
  142. pObject->SetValue(m_pForegroundProperty, pBrush);
  143. }
  144. CXTPMarkupBrush* CXTPMarkupTextElement::GetForeground() const
  145. {
  146. return MARKUP_STATICCAST(CXTPMarkupBrush, GetValue(m_pForegroundProperty));
  147. }
  148. void CXTPMarkupTextElement::SetFontSize(int nFontSize)
  149. {
  150. SetValue(m_pFontSizeProperty, new CXTPMarkupInt(nFontSize));
  151. }
  152. int CXTPMarkupTextElement::GetFontSize() const
  153. {
  154. CXTPMarkupInt* pFontSize = MARKUP_STATICCAST(CXTPMarkupInt, GetValue(m_pFontSizeProperty));
  155. if (!pFontSize)
  156. return -12;
  157. return *pFontSize;
  158. }
  159. void CXTPMarkupTextElement::SetFontWeight(int nFontWeight)
  160. {
  161. SetValue(m_pFontWeightProperty, CXTPMarkupEnum::CreateValue(nFontWeight));
  162. }
  163. int CXTPMarkupTextElement::GetFontWeight() const
  164. {
  165. CXTPMarkupEnum* pFontWeigh = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pFontWeightProperty));
  166. if (!pFontWeigh)
  167. return FW_NORMAL;
  168. return *pFontWeigh;
  169. }
  170. void CXTPMarkupTextElement::SetFontStyle(int nFontStyle)
  171. {
  172. SetValue(m_pFontStyleProperty, CXTPMarkupEnum::CreateValue(nFontStyle));
  173. }
  174. int CXTPMarkupTextElement::GetFontStyle() const
  175. {
  176. CXTPMarkupEnum* pFontStyle = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pFontStyleProperty));
  177. if (!pFontStyle)
  178. return 0;
  179. return *pFontStyle;
  180. }
  181. void CXTPMarkupTextElement::SetTextDecorations(int nTextDecorations)
  182. {
  183. SetValue(m_pTextDecorationsProperty, CXTPMarkupEnum::CreateValue(nTextDecorations));
  184. }
  185. int CXTPMarkupTextElement::GetTextDecorations() const
  186. {
  187. CXTPMarkupEnum* pTextDecorations = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pTextDecorationsProperty));
  188. if (!pTextDecorations)
  189. return 0;
  190. return *pTextDecorations;
  191. }
  192. void CXTPMarkupTextElement::SetFontFamily(LPCWSTR lpszFontFamily)
  193. {
  194. SetValue(m_pFontFamilyProperty, CXTPMarkupString::CreateValue(lpszFontFamily));
  195. }
  196. LPCWSTR CXTPMarkupTextElement::GetFontFamily() const
  197. {
  198. CXTPMarkupString* pFontFamily = MARKUP_STATICCAST(CXTPMarkupString, GetValue(m_pFontFamilyProperty));
  199. if (!pFontFamily)
  200. return NULL;
  201. return *pFontFamily;
  202. }
  203. CXTPMarkupInputElement* CXTPMarkupFrameworkContentElement::InputHitTest(CPoint /*point*/) const
  204. {
  205. return (CXTPMarkupInputElement*)this;
  206. }
  207. CRect CXTPMarkupFrameworkContentElement::GetBoundRect() const
  208. {
  209. return GetParent()->GetBoundRect();
  210. }
  211. //////////////////////////////////////////////////////////////////////////
  212. // CXTPMarkupInline
  213. CXTPMarkupDependencyProperty* CXTPMarkupInline::m_pBaselineAlignmentProperty = NULL;
  214. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupInline, CXTPMarkupTextElement);
  215. void CXTPMarkupInline::RegisterMarkupClass()
  216. {
  217. m_pBaselineAlignmentProperty = CXTPMarkupDependencyProperty::Register(L"BaselineAlignment", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupInline),
  218. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertBaselineAlignment, CXTPMarkupPropertyMetadata::flagAffectsArrange));
  219. }
  220. CXTPMarkupInline::CXTPMarkupInline()
  221. {
  222. m_nIndex = -1;
  223. }
  224. CXTPMarkupInline::~CXTPMarkupInline()
  225. {
  226. }
  227. POSITION CXTPMarkupInline::GetContentStartPosition() const
  228. {
  229. return MARKUP_POSITION_EOF;
  230. };
  231. void CXTPMarkupInline::GetContentNextPosition(POSITION& pos) const
  232. {
  233. pos = NULL;
  234. }
  235. BOOL CXTPMarkupInline::IsWordBreakPosition(POSITION /*pos*/) const
  236. {
  237. return FALSE;
  238. }
  239. BOOL CXTPMarkupInline::IsLineBreakPosition(POSITION /*pos*/) const
  240. {
  241. return FALSE;
  242. }
  243. BOOL CXTPMarkupInline::IsWhiteSpacePosition(POSITION /*pos*/) const
  244. {
  245. return FALSE;
  246. }
  247. void CXTPMarkupInline::PrepareMeasure(CXTPMarkupDrawingContext* /*pDC*/)
  248. {
  249. }
  250. CSize CXTPMarkupInline::Measure(CXTPMarkupDrawingContext* /*pDC*/, POSITION /*posStart*/, POSITION /*posEnd*/)
  251. {
  252. return CSize(0, 0);
  253. }
  254. int CXTPMarkupInline::GetBaseline() const
  255. {
  256. return 0;
  257. }
  258. void CXTPMarkupInline::Arrange(CRect /*rcFinalRect*/, POSITION /*posStart*/, POSITION /*posEnd*/)
  259. {
  260. }
  261. void CXTPMarkupInline::Render(CXTPMarkupDrawingContext* /*pDC*/, CRect /*rc*/, POSITION /*posStart*/, POSITION /*posEnd*/)
  262. {
  263. }
  264. CXTPMarkupInline* CXTPMarkupInline::GetFirstInline() const
  265. {
  266. return (CXTPMarkupInline*)this;
  267. }
  268. CXTPMarkupInline* CXTPMarkupInline::GetNextInline() const
  269. {
  270. CXTPMarkupInlineCollection* pOwner = MARKUP_DYNAMICCAST(CXTPMarkupInlineCollection, m_pLogicalParent);
  271. if (!pOwner)
  272. return NULL;
  273. if (pOwner->GetCount() > m_nIndex + 1)
  274. return pOwner->GetInline(m_nIndex + 1)->GetFirstInline();
  275. if (MARKUP_DYNAMICCAST(CXTPMarkupSpan, pOwner->GetLogicalParent()))
  276. return ((CXTPMarkupSpan*)(pOwner->GetLogicalParent()))->GetNextInline();
  277. return NULL;
  278. }
  279. CXTPMarkupTextBlock* CXTPMarkupInline::GetTextBlock() const
  280. {
  281. return MARKUP_STATICCAST(CXTPMarkupTextBlock, GetParent());
  282. }
  283. //////////////////////////////////////////////////////////////////////////
  284. // CXTPMarkupRun
  285. CXTPMarkupDependencyProperty* CXTPMarkupRun::m_pTextProperty = NULL;
  286. IMPLEMENT_MARKUPCLASS(L"Run", CXTPMarkupRun, CXTPMarkupInline);
  287. void CXTPMarkupRun::RegisterMarkupClass()
  288. {
  289. m_pTextProperty = CXTPMarkupDependencyProperty::Register(L"Text", MARKUP_TYPE(CXTPMarkupString), MARKUP_TYPE(CXTPMarkupRun),
  290. new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  291. }
  292. CXTPMarkupRun::CXTPMarkupRun()
  293. {
  294. m_nBaseline = 0;
  295. m_pFont = NULL;
  296. }
  297. CXTPMarkupRun::~CXTPMarkupRun()
  298. {
  299. MARKUP_RELEASE(m_pFont);
  300. }
  301. void CXTPMarkupRun::OnFinalRelease()
  302. {
  303. MARKUP_RELEASE(m_pFont);
  304. CXTPMarkupInline::OnFinalRelease();
  305. }
  306. void CXTPMarkupRun::SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pContent)
  307. {
  308. if (IsStringObject(pContent))
  309. {
  310. SetValue(m_pTextProperty, pContent);
  311. }
  312. else
  313. {
  314. CXTPMarkupInline::SetContentObject(pBuilder, pContent);
  315. }
  316. }
  317. BOOL CXTPMarkupRun::HasContentObject() const
  318. {
  319. return GetValue(m_pTextProperty) != NULL;
  320. }
  321. int CXTPMarkupRun::GetBaseline() const
  322. {
  323. return m_nBaseline;
  324. }
  325. CString CXTPMarkupRun::GetText() const
  326. {
  327. CXTPMarkupString* pString = MARKUP_STATICCAST(CXTPMarkupString, GetValue(m_pTextProperty));
  328. if (!pString)
  329. return _T("");
  330. return CString((LPCWSTR)*pString);
  331. }
  332. void CXTPMarkupRun::SetText(LPCWSTR lpszText)
  333. {
  334. SetValue(m_pTextProperty, CXTPMarkupString::CreateValue(lpszText));
  335. }
  336. void CXTPMarkupRun::SetText(CXTPMarkupString* pText)
  337. {
  338. SetValue(m_pTextProperty, pText);
  339. }
  340. POSITION CXTPMarkupRun::GetContentStartPosition() const
  341. {
  342. CXTPMarkupString* pString = MARKUP_STATICCAST(CXTPMarkupString, GetValue(m_pTextProperty));
  343. if (!pString)
  344. return MARKUP_POSITION_EOF;
  345. LPCWSTR lpszText = (LPCWSTR)(*pString);
  346. if ((!lpszText) || (*lpszText == ''))
  347. return MARKUP_POSITION_EOF;
  348. return (POSITION)lpszText;
  349. }
  350. void CXTPMarkupRun::GetContentNextPosition(POSITION& pos) const
  351. {
  352. if (!pos || pos == MARKUP_POSITION_EOF)
  353. return;
  354. LPCWSTR lpszText = (LPCWSTR)pos;
  355. if (*lpszText == '')
  356. {
  357. pos = MARKUP_POSITION_EOF;
  358. }
  359. else
  360. {
  361. lpszText++;
  362. pos = (POSITION)lpszText;
  363. }
  364. }
  365. BOOL CXTPMarkupRun::IsWordBreakPosition(POSITION pos) const
  366. {
  367. if (!pos)
  368. return FALSE;
  369. LPCWSTR lpszText = (LPCWSTR)pos;
  370. return *lpszText == _T(' ') || *lpszText == _T('t') || *lpszText == _T('n');
  371. }
  372. BOOL CXTPMarkupRun::IsWhiteSpacePosition(POSITION pos) const
  373. {
  374. if (!pos)
  375. return FALSE;
  376. LPCWSTR lpszText = (LPCWSTR)pos;
  377. return *lpszText == _T(' ') || *lpszText == _T('t');
  378. }
  379. BOOL CXTPMarkupRun::IsLineBreakPosition(POSITION pos) const
  380. {
  381. if (!pos)
  382. return FALSE;
  383. LPCWSTR lpszText = (LPCWSTR)pos;
  384. return *lpszText == _T('n');
  385. }
  386. void CXTPMarkupRun::GetLogFont(LOGFONT* pLogFont) const
  387. {
  388. memcpy(pLogFont, GetMarkupContext()->GetDefaultLogFont(), sizeof(LOGFONT));
  389. CXTPMarkupInt* pFontSize = MARKUP_STATICCAST(CXTPMarkupInt, GetValue(m_pFontSizeProperty));
  390. if (pFontSize)
  391. {
  392. pLogFont->lfHeight = - *pFontSize;
  393. }
  394. CXTPMarkupEnum* pFontWeight = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pFontWeightProperty));
  395. if (pFontWeight)
  396. {
  397. pLogFont->lfWeight = *pFontWeight;
  398. }
  399. CXTPMarkupEnum* pFontStyle = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pFontStyleProperty));
  400. if (pFontStyle)
  401. {
  402. pLogFont->lfItalic = *pFontStyle ? (BYTE)1 : (BYTE)0;
  403. }
  404. CXTPMarkupEnum* pFontQuality = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pFontQualityProperty));
  405. if (pFontQuality && XTPSystemVersion()->IsClearTypeTextQualitySupported())
  406. {
  407. pLogFont->lfQuality = (BYTE)*pFontQuality;
  408. }
  409. CXTPMarkupString* pFontFamily = MARKUP_STATICCAST(CXTPMarkupString, GetValue(m_pFontFamilyProperty));
  410. if (pFontFamily)
  411. {
  412. LPCWSTR lpszFaceName = *pFontFamily;
  413. LPTSTR lpszLogFontFaceName = pLogFont->lfFaceName;
  414. while ((*lpszLogFontFaceName++ = (TCHAR)*(lpszFaceName++)) != 0);
  415. }
  416. }
  417. void CXTPMarkupRun::PrepareMeasure(CXTPMarkupDrawingContext* pDC)
  418. {
  419. LOGFONT lf;
  420. GetLogFont(&lf);
  421. if (m_pFont == NULL || !CXTPMarkupContext::CompareFont(&m_pFont->m_lf, &lf))
  422. {
  423. CXTPMarkupFont* pFont = GetMarkupContext()->GetFont(&lf);
  424. MARKUP_RELEASE(m_pFont);
  425. m_pFont = pFont;
  426. }
  427. pDC->SetFont(m_pFont);
  428. TEXTMETRIC tm;
  429. GetTextMetrics(pDC->GetSafeHdc(), &tm);
  430. m_nBaseline = tm.tmDescent;
  431. }
  432. CSize CXTPMarkupRun::Measure(CXTPMarkupDrawingContext* pDC, POSITION posStart, POSITION posEnd)
  433. {
  434. if (posStart == NULL || posEnd == NULL || posEnd == posStart || posEnd == MARKUP_POSITION_EOF)
  435. return CSize(0, 0);
  436. LPCWSTR lpszText = (LPCWSTR)posStart;
  437. int nCount = int(posEnd - posStart) / sizeof(WCHAR);
  438. pDC->SetFont(m_pFont);
  439. SIZE sz = pDC->GetTextExtent(lpszText, nCount);
  440. return sz;
  441. }
  442. void CXTPMarkupRun::Render(CXTPMarkupDrawingContext* pDC, CRect rc, POSITION posStart, POSITION posEnd)
  443. {
  444. if (posStart == NULL || posEnd == NULL || posEnd == posStart || posEnd == MARKUP_POSITION_EOF)
  445. return;
  446. LPCWSTR lpszText = (LPCWSTR)posStart;
  447. UINT nCount = UINT(posEnd - posStart) / sizeof(WCHAR);
  448. pDC->SetFont(m_pFont);
  449. pDC->DrawTextLine(lpszText, nCount, rc);
  450. }
  451. //////////////////////////////////////////////////////////////////////////
  452. // CXTPMarkupLineBreak
  453. IMPLEMENT_MARKUPCLASS(L"LineBreak", CXTPMarkupLineBreak, CXTPMarkupRun);
  454. void CXTPMarkupLineBreak::RegisterMarkupClass()
  455. {
  456. }
  457. CXTPMarkupLineBreak::CXTPMarkupLineBreak()
  458. {
  459. SetText(L"n");
  460. }
  461. //////////////////////////////////////////////////////////////////////////
  462. // CXTPMarkupInlineCollection
  463. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupInlineCollection, CXTPMarkupCollection);
  464. void CXTPMarkupInlineCollection::RegisterMarkupClass()
  465. {
  466. }
  467. CXTPMarkupInlineCollection::CXTPMarkupInlineCollection()
  468. {
  469. m_pElementType = MARKUP_TYPE(CXTPMarkupInline);
  470. }
  471. CXTPMarkupInlineCollection::~CXTPMarkupInlineCollection()
  472. {
  473. }
  474. void CXTPMarkupInlineCollection::OnItemAdded(CXTPMarkupObject* pItem, int nIndex)
  475. {
  476. ((CXTPMarkupInline*)pItem)->m_nIndex = nIndex;
  477. }
  478. void CXTPMarkupInlineCollection::SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pContent)
  479. {
  480. CXTPMarkupInputElement* pParent = MARKUP_DYNAMICCAST(CXTPMarkupInputElement, m_pLogicalParent);
  481. ASSERT(pParent);
  482. if (!pParent)
  483. {
  484. pBuilder->ThrowBuilderException(CXTPMarkupBuilder::FormatString(_T("'%ls' object cannot be added to '%ls'. Object cannot be converted to type 'CXTPMarkupInline'"),
  485. (LPCTSTR)pContent->GetType()->m_lpszClassName, (LPCTSTR)GetType()->m_lpszClassName));
  486. }
  487. if (IsStringObject(pContent))
  488. {
  489. CXTPMarkupRun* pRun = MARKUP_CREATE(CXTPMarkupRun, pParent->GetMarkupContext());
  490. pRun->SetText((CXTPMarkupString*)pContent);
  491. Add(pRun);
  492. }
  493. else if (pContent->IsKindOf(MARKUP_TYPE(CXTPMarkupInline)))
  494. {
  495. Add((CXTPMarkupInline*)pContent);
  496. }
  497. else if  (pContent->IsKindOf(MARKUP_TYPE(CXTPMarkupUIElement)))
  498. {
  499. CXTPMarkupInlineUIContainer* pInlineUIContainer = MARKUP_CREATE(CXTPMarkupInlineUIContainer, pParent->GetMarkupContext());
  500. pInlineUIContainer->SetChild((CXTPMarkupUIElement*)pContent);
  501. Add(pInlineUIContainer);
  502. }
  503. else
  504. {
  505. pBuilder->ThrowBuilderException(CXTPMarkupBuilder::FormatString(_T("'%ls' object cannot be added to '%ls'. Object cannot be converted to type 'CXTPMarkupInline'"),
  506. (LPCTSTR)pContent->GetType()->m_lpszClassName, (LPCTSTR)GetType()->m_lpszClassName));
  507. }
  508. }
  509. //////////////////////////////////////////////////////////////////////////
  510. // CXTPMarkupSpan
  511. IMPLEMENT_MARKUPCLASS(L"Span", CXTPMarkupSpan, CXTPMarkupInline);
  512. void CXTPMarkupSpan::RegisterMarkupClass()
  513. {
  514. }
  515. CXTPMarkupSpan::CXTPMarkupSpan()
  516. {
  517. m_pInlines = new CXTPMarkupInlineCollection();
  518. m_pInlines->SetLogicalParent(this);
  519. }
  520. CXTPMarkupSpan::~CXTPMarkupSpan()
  521. {
  522. if (m_pInlines)
  523. {
  524. m_pInlines->SetLogicalParent(NULL);
  525. m_pInlines->Release();
  526. }
  527. }
  528. void CXTPMarkupSpan::SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pContent)
  529. {
  530. m_pInlines->SetContentObject(pBuilder, pContent);
  531. }
  532. BOOL CXTPMarkupSpan::HasContentObject() const
  533. {
  534. return m_pInlines->HasContentObject();
  535. }
  536. BOOL CXTPMarkupSpan::AllowWhiteSpaceContent() const
  537. {
  538. return TRUE;
  539. }
  540. CXTPMarkupInline* CXTPMarkupSpan::GetFirstInline() const
  541. {
  542. return m_pInlines->GetCount() > 0 ? m_pInlines->GetInline(0)->GetFirstInline() : (CXTPMarkupInline*)this;
  543. }
  544. //////////////////////////////////////////////////////////////////////////
  545. // CXTPMarkupBold
  546. IMPLEMENT_MARKUPCLASS(L"Bold", CXTPMarkupBold, CXTPMarkupSpan);
  547. void CXTPMarkupBold::RegisterMarkupClass()
  548. {
  549. }
  550. CXTPMarkupBold::CXTPMarkupBold()
  551. {
  552. SetFontWeight(FW_BOLD);
  553. }
  554. //////////////////////////////////////////////////////////////////////////
  555. // CXTPMarkupHyperlink
  556. CXTPMarkupRoutedEvent* CXTPMarkupHyperlink::m_pClickEvent = NULL;
  557. IMPLEMENT_MARKUPCLASS(L"Hyperlink", CXTPMarkupHyperlink, CXTPMarkupSpan);
  558. void CXTPMarkupHyperlink::RegisterMarkupClass()
  559. {
  560. CXTPMarkupStyle::RegisterType();
  561. CXTPMarkupButtonBase::RegisterType();
  562. CXTPMarkupSolidColorBrush::RegisterType();
  563. CXTPMarkupHyperlink::RegisterType();
  564. CXTPMarkupType* pType = MARKUP_TYPE(CXTPMarkupHyperlink);
  565. CXTPMarkupStyle* pStyle = new CXTPMarkupStyle();
  566. pStyle->GetSetters()->Add(new CXTPMarkupSetter(CXTPMarkupHyperlink::m_pTextDecorationsProperty, CXTPMarkupEnum::CreateValue(1)));
  567. pStyle->GetSetters()->Add(new CXTPMarkupSetter(CXTPMarkupHyperlink::m_pForegroundProperty, new CXTPMarkupSolidColorBrush(RGB(0, 0, 255))));
  568. pStyle->GetSetters()->Add(new CXTPMarkupSetter(CXTPMarkupHyperlink::m_pCursorProperty, new CXTPMarkupInt(32649)));
  569. CXTPMarkupTriggerCollection* pTriggers = new CXTPMarkupTriggerCollection();
  570. CXTPMarkupTrigger* pTrigger = new CXTPMarkupTrigger(CXTPMarkupHyperlink::m_pIsMouseOverProperty, CXTPMarkupBool::CreateTrueValue());
  571. CXTPMarkupSetterColection* pSetters = new CXTPMarkupSetterColection();
  572. pSetters->Add(new CXTPMarkupSetter(CXTPMarkupHyperlink::m_pForegroundProperty, new CXTPMarkupSolidColorBrush(RGB(255, 0, 0))));
  573. pTrigger->SetSetters(pSetters);
  574. pTriggers->Add(pTrigger);
  575. pStyle->SetTriggers(pTriggers);
  576. pType->SetTypeStyle(pStyle);
  577. m_pClickEvent = (CXTPMarkupRoutedEvent*)CXTPMarkupButtonBase::m_pClickEvent->AddOwner(MARKUP_TYPE(CXTPMarkupHyperlink));
  578. }
  579. CXTPMarkupHyperlink::CXTPMarkupHyperlink()
  580. {
  581. m_bPressed = FALSE;
  582. }
  583. void CXTPMarkupHyperlink::OnMouseLeftButtonUp(CXTPMarkupMouseButtonEventArgs* e)
  584. {
  585. if (m_bPressed)
  586. {
  587. m_bPressed = FALSE;
  588. OnClick();
  589. e->SetHandled();
  590. }
  591. }
  592. void CXTPMarkupHyperlink::OnMouseLeftButtonDown(CXTPMarkupMouseButtonEventArgs* e)
  593. {
  594. m_bPressed = TRUE;
  595. e->SetHandled();
  596. }
  597. void CXTPMarkupHyperlink::OnClick()
  598. {
  599. CXTPMarkupRoutedEventArgs e(m_pClickEvent, this);
  600. RaiseEvent(&e);
  601. }
  602. //////////////////////////////////////////////////////////////////////////
  603. // CXTPMarkupItalic
  604. IMPLEMENT_MARKUPCLASS(L"Italic", CXTPMarkupItalic, CXTPMarkupSpan);
  605. void CXTPMarkupItalic::RegisterMarkupClass()
  606. {
  607. }
  608. CXTPMarkupItalic::CXTPMarkupItalic()
  609. {
  610. SetFontStyle(1);
  611. }
  612. //////////////////////////////////////////////////////////////////////////
  613. // CXTPMarkupUnderline
  614. IMPLEMENT_MARKUPCLASS(L"Underline", CXTPMarkupUnderline, CXTPMarkupSpan);
  615. void CXTPMarkupUnderline::RegisterMarkupClass()
  616. {
  617. }
  618. CXTPMarkupUnderline::CXTPMarkupUnderline()
  619. {
  620. SetTextDecorations(1);
  621. }
  622. //////////////////////////////////////////////////////////////////////////
  623. // CXTPMarkupInlineUIContainer
  624. IMPLEMENT_MARKUPCLASS(L"InlineUIContainer", CXTPMarkupInlineUIContainer, CXTPMarkupInline);
  625. void CXTPMarkupInlineUIContainer::RegisterMarkupClass()
  626. {
  627. }
  628. CXTPMarkupInlineUIContainer::CXTPMarkupInlineUIContainer()
  629. {
  630. m_pChild = NULL;
  631. }
  632. CXTPMarkupInlineUIContainer::CXTPMarkupInlineUIContainer(CXTPMarkupUIElement* pElement)
  633. {
  634. m_pChild = NULL;
  635. SetChild(pElement);
  636. }
  637. CXTPMarkupInlineUIContainer::~CXTPMarkupInlineUIContainer()
  638. {
  639. MARKUP_RELEASE(m_pChild);
  640. }
  641. CXTPMarkupUIElement* CXTPMarkupInlineUIContainer::GetChild() const
  642. {
  643. return m_pChild;
  644. }
  645. void CXTPMarkupInlineUIContainer::SetChild(CXTPMarkupUIElement* pChild)
  646. {
  647. if (m_pChild)
  648. {
  649. m_pChild->SetLogicalParent(NULL);
  650. MARKUP_RELEASE(m_pChild);
  651. }
  652. m_pChild = pChild;
  653. if (m_pChild)
  654. {
  655. m_pChild->SetLogicalParent(this);
  656. }
  657. }
  658. void CXTPMarkupInlineUIContainer::SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pContent)
  659. {
  660. if (!pContent->IsKindOf(MARKUP_TYPE(CXTPMarkupUIElement)))
  661. {
  662. pBuilder->ThrowBuilderException(CXTPMarkupBuilder::FormatString(_T("'%ls' object cannot be added to '%ls'. Object cannot be converted to type 'CXTPMarkupUIElement'"),
  663. (LPCTSTR)pContent->GetType()->m_lpszClassName, (LPCTSTR)GetType()->m_lpszClassName));
  664. }
  665. SetChild((CXTPMarkupUIElement*)pContent);
  666. }
  667. BOOL CXTPMarkupInlineUIContainer::HasContentObject() const
  668. {
  669. return m_pChild != NULL;
  670. }
  671. POSITION CXTPMarkupInlineUIContainer::GetContentStartPosition() const
  672. {
  673. return m_pChild ? MARKUP_POSITION_START : MARKUP_POSITION_EOF;
  674. };
  675. void CXTPMarkupInlineUIContainer::GetContentNextPosition(POSITION& pos) const
  676. {
  677. pos = (pos == MARKUP_POSITION_START ? MARKUP_POSITION_END : MARKUP_POSITION_EOF);
  678. }
  679. BOOL CXTPMarkupInlineUIContainer::IsWordBreakPosition(POSITION pos) const
  680. {
  681. return pos == MARKUP_POSITION_START || pos == MARKUP_POSITION_END;
  682. }
  683. CSize CXTPMarkupInlineUIContainer::Measure(CXTPMarkupDrawingContext* pDC, POSITION posStart, POSITION /*posEnd*/)
  684. {
  685. if (!m_pChild || posStart != MARKUP_POSITION_START)
  686. return CSize(0, 0);
  687. m_pChild->Measure(pDC, CSize(32000, 32000));
  688. return m_pChild->GetDesiredSize();
  689. }
  690. void CXTPMarkupInlineUIContainer::Arrange(CRect rcFinalRect, POSITION posStart, POSITION /*posEnd*/)
  691. {
  692. if (!m_pChild || posStart != MARKUP_POSITION_START)
  693. return;
  694. m_pChild->Arrange(rcFinalRect);
  695. }
  696. void CXTPMarkupInlineUIContainer::Render(CXTPMarkupDrawingContext* pDC, CRect /*rc*/, POSITION posStart, POSITION /*posEnd*/)
  697. {
  698. if (!m_pChild  || posStart != MARKUP_POSITION_START)
  699. return;
  700. m_pChild->Render(pDC);
  701. }
  702. CXTPMarkupInputElement* CXTPMarkupInlineUIContainer::InputHitTest(CPoint point) const
  703. {
  704. CXTPMarkupInputElement* pObject = m_pChild ? m_pChild->InputHitTest(point) : (CXTPMarkupInputElement*)this;
  705. if (pObject)
  706. return pObject;
  707. return (CXTPMarkupInputElement*)this;
  708. }