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

对话框与窗口

开发平台:

Visual C++

  1. // XTPMarkupContext.cpp: implementation of the CXTPMarkupContext 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/XTPToolTipContext.h"
  22. #include "XTPMarkupObject.h"
  23. #include "XTPMarkupContext.h"
  24. #include "XTPMarkupFrameworkElement.h"
  25. #include "XTPMarkupInline.h"
  26. #include "XTPMarkupUIElement.h"
  27. #include "XTPMarkupInline.h"
  28. #include "XTPMarkupBorder.h"
  29. #include "XTPMarkupStackPanel.h"
  30. #include "XTPMarkupGrid.h"
  31. #include "XTPMarkupCanvas.h"
  32. #include "XTPMarkupImage.h"
  33. #include "XTPMarkupPage.h"
  34. #include "XTPMarkupShape.h"
  35. #include "XTPMarkupTextBlock.h"
  36. #include "XTPMarkupButton.h"
  37. #include "XTPMarkupScrollViewer.h"
  38. #include "XTPMarkupResourceDictionary.h"
  39. #include "XTPMarkupBuilder.h"
  40. #include "XTPMarkupParser.h"
  41. #include "XTPMarkupDrawingContext.h"
  42. #include "XTPMarkupKeyboardNavigation.h"
  43. #ifdef _DEBUG
  44. #undef THIS_FILE
  45. static char THIS_FILE[]=__FILE__;
  46. #define new DEBUG_NEW
  47. #endif
  48. class CXTPMarkupContext::CXTPMarkupFontArray : public CXTPMarkupTypedSimpleStack<CXTPMarkupFont>
  49. {
  50. };
  51. CXTPMarkupFont::CXTPMarkupFont()
  52. {
  53. m_pMarkupContext = NULL;
  54. m_hFont = NULL;
  55. m_pNextChain = NULL;
  56. }
  57. CXTPMarkupFont::~CXTPMarkupFont()
  58. {
  59. if (m_pMarkupContext)
  60. {
  61. VERIFY(m_pMarkupContext->m_pFonts->Remove(this));
  62. }
  63. DeleteObject(m_hFont);
  64. }
  65. //////////////////////////////////////////////////////////////////////////
  66. // CXTPMarkupDelegateMap
  67. class CXTPMarkupDelegateMap
  68. {
  69. public:
  70. CXTPMarkupDelegateMap();
  71. ~CXTPMarkupDelegateMap();
  72. public:
  73. void RemoveAll();
  74. void Add(LPCWSTR lpszDelegate, CXTPMarkupDelegate* pDelegate);
  75. CXTPMarkupDelegate* Lookup(LPCWSTR lpszDelegate) const;
  76. protected:
  77. CMap<LPCWSTR, LPCWSTR, CXTPMarkupDelegate*, CXTPMarkupDelegate*> m_mapDelegates;
  78. };
  79. CXTPMarkupDelegateMap::CXTPMarkupDelegateMap()
  80. {
  81. }
  82. CXTPMarkupDelegateMap::~CXTPMarkupDelegateMap()
  83. {
  84. RemoveAll();
  85. }
  86. void CXTPMarkupDelegateMap::RemoveAll()
  87. {
  88. POSITION pos = m_mapDelegates.GetStartPosition();
  89. while (pos)
  90. {
  91. LPCWSTR lpszDelegate;
  92. CXTPMarkupDelegate* pDelegate;
  93. m_mapDelegates.GetNextAssoc(pos, lpszDelegate, pDelegate);
  94. MARKUP_RELEASE(pDelegate);
  95. }
  96. m_mapDelegates.RemoveAll();
  97. }
  98. void CXTPMarkupDelegateMap::Add(LPCWSTR lpszDelegate, CXTPMarkupDelegate* pDelegate)
  99. {
  100. m_mapDelegates.SetAt(lpszDelegate, pDelegate);
  101. }
  102. CXTPMarkupDelegate* CXTPMarkupDelegateMap::Lookup(LPCWSTR lpszDelegate) const
  103. {
  104. CXTPMarkupDelegate* pDelegate = NULL;
  105. if (!m_mapDelegates.Lookup(lpszDelegate, pDelegate))
  106. return NULL;
  107. return pDelegate;
  108. }
  109. template<> inline BOOL AFXAPI CompareElements(const LPCWSTR* pElement1, const LPCWSTR* pElement2)
  110. {
  111. return wcscmp(*pElement1, *pElement2) == 0;
  112. }
  113. class CXTPMarkupContext::CInputElementCollection : public CXTPMarkupCollection
  114. {
  115. public:
  116. CInputElementCollection()
  117. {
  118. m_pElementType = MARKUP_TYPE(CXTPMarkupInputElement);
  119. m_bLogicalParent = FALSE;
  120. }
  121. public:
  122. CXTPMarkupInputElement* GetItem(int nIndex) const {
  123. return (CXTPMarkupInputElement*)m_arrItems[nIndex];
  124. }
  125. CXTPMarkupInputElement* GetTailItem() const {
  126. return (CXTPMarkupInputElement*)m_arrItems[GetCount() - 1];
  127. }
  128. };
  129. class CXTPMarkupContext::CTooltipContext : public CXTPToolTipContext
  130. {
  131. public:
  132. CTooltipContext(CXTPMarkupContext* pMarkupContext)
  133. {
  134. m_pMarkupContext = pMarkupContext;
  135. }
  136. INT_PTR OnToolHitTest(CWnd* /*pWnd*/, CPoint point, TOOLINFO* pToolInfo)
  137. {
  138. return m_pMarkupContext->OnToolHitTest(point, pToolInfo);
  139. }
  140. protected:
  141. CXTPMarkupContext* m_pMarkupContext;
  142. };
  143. //////////////////////////////////////////////////////////////////////////
  144. // CXTPMarkupContext
  145. CXTPMarkupContext::CXTPMarkupContext()
  146. {
  147. NONCLIENTMETRICS ncm = { sizeof(NONCLIENTMETRICS) };
  148. VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
  149. m_dwRef = 1;
  150. m_logFont = ncm.lfMessageFont;
  151. m_clrForeground = 0;
  152. m_pImageManager = NULL;
  153. m_pMouseOver = NULL;
  154. m_pMouseCapture = NULL;
  155. m_pActiveElement = NULL;
  156. m_hContextWnd = NULL;
  157. m_pHandlers = NULL;
  158. m_pDelegates = NULL;
  159. m_pFonts = NULL;
  160. m_pKeyboardNavigation = new CXTPMarkupKeyboardNavigation(this);
  161. m_pTooltipContext = new CTooltipContext(this);
  162. m_pTooltipContext->SetStyle(xtpToolTipMarkup);
  163. RegisterClasses();
  164. }
  165. void CXTPMarkupContext::RegisterClasses()
  166. {
  167. static BOOL bRegistered = FALSE;
  168. if (bRegistered)
  169. return;
  170. bRegistered = TRUE;
  171. CXTPMarkupType::RegisterAll();
  172. CXTPMarkupSetter::RegisterType();
  173. CXTPMarkupFrameworkElement::RegisterType();
  174. CXTPMarkupUIElement::RegisterType();
  175. CXTPMarkupTextElement::RegisterType();
  176. CXTPMarkupBorder::RegisterType();
  177. CXTPMarkupCanvas::RegisterType();
  178. CXTPMarkupSolidColorBrush::RegisterType();
  179. CXTPMarkupGradientStop::RegisterType();
  180. CXTPMarkupLinearGradientBrush::RegisterType();
  181. CXTPMarkupColumnDefinition::RegisterType();
  182. CXTPMarkupRowDefinition::RegisterType();
  183. CXTPMarkupGrid::RegisterType();
  184. CXTPMarkupImage::RegisterType();
  185. CXTPMarkupPanel::RegisterType();
  186. CXTPMarkupControl::RegisterType();
  187. CXTPMarkupContentControl::RegisterType();
  188. CXTPMarkupButtonBase::RegisterType();
  189. CXTPMarkupToggleButton::RegisterType();
  190. CXTPMarkupButton::RegisterType();
  191. CXTPMarkupFrameworkContentElement::RegisterType();
  192. CXTPMarkupInline::RegisterType();
  193. CXTPMarkupRun::RegisterType();
  194. CXTPMarkupHyperlink::RegisterType();
  195. CXTPMarkupInputElement::RegisterType();
  196. CXTPMarkupPage::RegisterType();
  197. CXTPMarkupShape::RegisterType();
  198. CXTPMarkupPolygon::RegisterType();
  199. CXTPMarkupPolyline::RegisterType();
  200. CXTPMarkupLine::RegisterType();
  201. CXTPMarkupStackPanel::RegisterType();
  202. CXTPMarkupWrapPanel::RegisterType();
  203. CXTPMarkupTextBlock::RegisterType();
  204. CXTPMarkupScrollViewer::RegisterType();
  205. CXTPMarkupStyle::RegisterType();
  206. }
  207. CXTPMarkupContext::~CXTPMarkupContext()
  208. {
  209. if (m_pImageManager)
  210. {
  211. ((CCmdTarget*)m_pImageManager)->InternalRelease();
  212. }
  213. ASSERT(m_dwRef <= 1);
  214. MARKUP_RELEASE(m_pMouseOver);
  215. MARKUP_RELEASE(m_pKeyboardNavigation);
  216. ASSERT(m_pFonts == NULL || m_pFonts->IsEmpty());
  217. SAFE_DELETE(m_pHandlers);
  218. SAFE_DELETE(m_pDelegates);
  219. SAFE_DELETE(m_pFonts);
  220. CMDTARGET_RELEASE(m_pTooltipContext);
  221. }
  222. CXTPMarkupObject* CXTPMarkupContext::CreateMarkupObject(CXTPMarkupType* pType)
  223. {
  224. CXTPMarkupObject* pObject = pType->CreateObject();
  225. if (!pObject)
  226. return NULL;
  227. if (pObject->IsKindOf(MARKUP_TYPE(CXTPMarkupInputElement)))
  228. {
  229. ((CXTPMarkupInputElement*)pObject)->m_pMarkupContext = this;
  230. m_dwRef++;
  231. }
  232. return (CXTPMarkupObject*)pObject;
  233. }
  234. void CXTPMarkupContext::FinalizeMarkupObject(CXTPMarkupInputElement* pInputElement)
  235. {
  236. if (pInputElement == m_pMouseOver)
  237. m_pMouseOver = NULL;
  238. if (pInputElement == m_pActiveElement)
  239. m_pActiveElement = NULL;
  240. pInputElement->m_pMarkupContext = NULL;
  241. Release();
  242. }
  243. CXTPMarkupUIElement* CXTPMarkupContext::Parse(LPCSTR lpszBuffer)
  244. {
  245. if (!lpszBuffer)
  246. return NULL;
  247. CXTPMarkupParser sc;
  248. sc.SetBuffer(lpszBuffer, lpszBuffer + strlen(lpszBuffer));
  249. CXTPMarkupBuilder builder(this);
  250. return builder.Parse(&sc);
  251. }
  252. CXTPMarkupUIElement* CXTPMarkupContext::Parse(LPCWSTR lpszBuffer)
  253. {
  254. if (!lpszBuffer)
  255. return NULL;
  256. CXTPMarkupParser sc;
  257. sc.SetBuffer(lpszBuffer, lpszBuffer + wcslen(lpszBuffer));
  258. CXTPMarkupBuilder builder(this);
  259. return builder.Parse(&sc);
  260. }
  261. BOOL CXTPMarkupContext::CompareFont(LOGFONT* pLogFont1, LOGFONT* pLogFont2)
  262. {
  263. if (pLogFont1->lfHeight != pLogFont2->lfHeight)
  264. return FALSE;
  265. if (pLogFont1->lfWeight != pLogFont2->lfWeight)
  266. return FALSE;
  267. if (pLogFont1->lfItalic != pLogFont2->lfItalic)
  268. return FALSE;
  269. if (_tcscmp(pLogFont1->lfFaceName, pLogFont2->lfFaceName) != 0)
  270. return FALSE;
  271. return TRUE;
  272. }
  273. CXTPMarkupFont* CXTPMarkupContext::GetFont(LOGFONT* pLogFont)
  274. {
  275. if (m_pFonts == NULL)
  276. m_pFonts = new CXTPMarkupFontArray();
  277. CXTPMarkupFont* pFont;
  278. for (pFont = m_pFonts->GetHead(); pFont != NULL; pFont = pFont->m_pNextChain)
  279. {
  280. if (CompareFont(&pFont->m_lf, pLogFont))
  281. {
  282. pFont->AddRef();
  283. return pFont;
  284. }
  285. }
  286. pFont = new CXTPMarkupFont();
  287. m_pFonts->AddTail(pFont);
  288. pFont->m_lf = *pLogFont;
  289. pFont->m_hFont = ::CreateFontIndirect(pLogFont);
  290. pFont->m_pMarkupContext = this;
  291. return pFont;
  292. }
  293. BOOL CXTPMarkupContext::IsVisualChild(CXTPMarkupObject* pParent, CXTPMarkupObject* pChild)
  294. {
  295. while (pChild)
  296. {
  297. if (pChild == pParent)
  298. return TRUE;
  299. pChild = pChild->GetLogicalParent();
  300. }
  301. return FALSE;
  302. }
  303. void CXTPMarkupContext::BuildInputList(CXTPMarkupObject* pUIElement, CInputElementCollection* arrObjects)
  304. {
  305. CXTPMarkupObject* pParent = pUIElement;
  306. while (pParent)
  307. {
  308. if (pParent->IsKindOf(MARKUP_TYPE(CXTPMarkupInputElement)))
  309. {
  310. arrObjects->Add((CXTPMarkupInputElement*)pParent);
  311. pParent->AddRef();
  312. }
  313. pParent = pParent->GetLogicalParent();
  314. }
  315. }
  316. INT_PTR CXTPMarkupContext::OnToolHitTest(CPoint /*point*/, TOOLINFO* pToolInfo)
  317. {
  318. CInputElementCollection listMouseOver;
  319. BuildInputList(m_pMouseOver, &listMouseOver);
  320. for (int i = 0; i < listMouseOver.GetCount(); i++)
  321. {
  322. CXTPMarkupInputElement* pInputElement = listMouseOver.GetItem(i);
  323. CXTPMarkupObject* pToolTip = pInputElement->GetToolTip();
  324. if (pToolTip && IsStringObject(pToolTip))
  325. {
  326. CXTPToolTipContext::FillInToolInfo(pToolInfo, m_hContextWnd, GetClientBoundingRect(pInputElement),
  327. (INT_PTR)pInputElement, (LPCWSTR)*((CXTPMarkupString*)pToolTip));
  328. return pToolInfo->uId;
  329. }
  330. }
  331. return -1;
  332. }
  333. void CXTPMarkupContext::HandleMouseEnter(CXTPMarkupInputElement* pMouseOver, CPoint point)
  334. {
  335. if (m_pMouseOver == pMouseOver)
  336. return;
  337. if (!pMouseOver)
  338. m_pActiveElement = NULL;
  339. CInputElementCollection listOldMouseOver;
  340. CInputElementCollection listNewMouseOver;
  341. BuildInputList(m_pMouseOver, &listOldMouseOver);
  342. BuildInputList(pMouseOver, &listNewMouseOver);
  343. while (listOldMouseOver.GetCount() > 0 && listNewMouseOver.GetCount() > 0 &&
  344. listOldMouseOver.GetTailItem() == listNewMouseOver.GetTailItem())
  345. {
  346. listNewMouseOver.Remove(listNewMouseOver.GetCount() - 1);
  347. listOldMouseOver.Remove(listOldMouseOver.GetCount() - 1);
  348. }
  349. CXTPMarkupMouseEventArgs eMouseLeaveEventArgs(CXTPMarkupInputElement::m_pMouseLeaveEvent);
  350. CXTPMarkupMouseEventArgs eMouseEnterEventArgs(CXTPMarkupInputElement::m_pMouseEnterEvent);
  351. eMouseLeaveEventArgs.SetSource(m_pMouseOver);
  352. eMouseLeaveEventArgs.m_hWnd = m_hContextWnd;
  353. eMouseLeaveEventArgs.m_point = point;
  354. eMouseEnterEventArgs.SetSource(pMouseOver);
  355. eMouseEnterEventArgs.m_hWnd = m_hContextWnd;
  356. eMouseEnterEventArgs.m_point = point;
  357. MARKUP_RELEASE(m_pMouseOver);
  358. m_pMouseOver = pMouseOver;
  359. MARKUP_ADDREF(m_pMouseOver);
  360. int i;
  361. for (i = 0; i < listOldMouseOver.GetCount(); i++)
  362. {
  363. CXTPMarkupInputElement* pInputElement = listOldMouseOver.GetItem(i);
  364. pInputElement->RaiseEvent(&eMouseLeaveEventArgs);
  365. if (eMouseLeaveEventArgs.IsHandled())
  366. break;
  367. pInputElement->OnMouseLeave(&eMouseLeaveEventArgs);
  368. if (eMouseLeaveEventArgs.IsHandled())
  369. break;
  370. }
  371. for (i = 0; i < listNewMouseOver.GetCount(); i++)
  372. {
  373. CXTPMarkupInputElement* pInputElement = listNewMouseOver.GetItem(i);
  374. pInputElement->RaiseEvent(&eMouseEnterEventArgs);
  375. if (eMouseEnterEventArgs.IsHandled())
  376. break;
  377. pInputElement->OnMouseEnter(&eMouseEnterEventArgs);
  378. if (eMouseEnterEventArgs.IsHandled())
  379. break;
  380. }
  381. }
  382. void CXTPMarkupContext::HandleMouseMove(CXTPMarkupUIElement* pUIElement, CPoint point)
  383. {
  384. CXTPMarkupInputElement* pObject = pUIElement->InputHitTest(point);
  385. if (m_pMouseCapture)
  386. {
  387. if ((pObject == NULL) || !IsVisualChild(m_pMouseCapture, pObject))
  388. pObject = NULL;
  389. else
  390. pObject = m_pMouseCapture;
  391. }
  392. if (m_pMouseOver != pObject)
  393. {
  394. HandleMouseEnter(pObject, point);
  395. if (m_pMouseOver)
  396. {
  397. TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hContextWnd, 0 };
  398. _TrackMouseEvent (&tme);
  399. }
  400. if (!HandleSetCursor())
  401. {
  402. SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
  403. }
  404. }
  405. m_pActiveElement = m_pMouseOver ? pUIElement : NULL;
  406. if (m_pMouseOver)
  407. {
  408. CInputElementCollection listNewMouseOver;
  409. BuildInputList(m_pMouseOver, &listNewMouseOver);
  410. CXTPMarkupMouseEventArgs eMouseMoveEventArgs(CXTPMarkupInputElement::m_pMouseMoveEvent);
  411. eMouseMoveEventArgs.SetSource(m_pMouseOver);
  412. eMouseMoveEventArgs.m_hWnd = m_hContextWnd;
  413. eMouseMoveEventArgs.m_point = point;
  414. for (int i = 0; i < listNewMouseOver.GetCount(); i++)
  415. {
  416. CXTPMarkupInputElement* pInputElement = listNewMouseOver.GetItem(i);
  417. pInputElement->RaiseEvent(&eMouseMoveEventArgs);
  418. if (eMouseMoveEventArgs.IsHandled())
  419. break;
  420. pInputElement->OnMouseMove(&eMouseMoveEventArgs);
  421. if (eMouseMoveEventArgs.IsHandled())
  422. break;
  423. }
  424. }
  425. }
  426. BOOL CXTPMarkupContext::HandleSetCursor()
  427. {
  428. if (m_pMouseOver)
  429. {
  430. CInputElementCollection listNewMouseOver;
  431. BuildInputList(m_pMouseOver, &listNewMouseOver);
  432. CXTPMarkupQueryCursorEventArgs eQueryCursorEventArgs;
  433. eQueryCursorEventArgs.SetSource(m_pMouseOver);
  434. for (int i = 0; i < listNewMouseOver.GetCount(); i++)
  435. {
  436. CXTPMarkupInputElement* pInputElement = listNewMouseOver.GetItem(i);
  437. pInputElement->OnQueryCursor(&eQueryCursorEventArgs);
  438. if (!eQueryCursorEventArgs.IsHandled())
  439. continue;
  440. if (eQueryCursorEventArgs.m_hCursor)
  441. {
  442. ::SetCursor(eQueryCursorEventArgs.m_hCursor);
  443. return TRUE;
  444. }
  445. return FALSE;
  446. }
  447. }
  448. return FALSE;
  449. }
  450. BOOL CXTPMarkupContext::HandleMouseWheel(int nDelta)
  451. {
  452. if (m_pMouseOver)
  453. {
  454. CInputElementCollection listNewMouseOver;
  455. BuildInputList(m_pMouseOver, &listNewMouseOver);
  456. CXTPMarkupMouseWheelEventArgs eMouseWheelEventArgs;
  457. eMouseWheelEventArgs.m_nDelta = nDelta;
  458. eMouseWheelEventArgs.SetSource(m_pMouseOver);
  459. for (int i = 0; i < listNewMouseOver.GetCount(); i++)
  460. {
  461. CXTPMarkupInputElement* pInputElement = listNewMouseOver.GetItem(i);
  462. pInputElement->OnMouseWheel(&eMouseWheelEventArgs);
  463. if (eMouseWheelEventArgs.IsHandled())
  464. return TRUE;
  465. }
  466. }
  467. return FALSE;
  468. }
  469. BOOL CXTPMarkupContext::HandleMouseUpDown(UINT message, WPARAM /*wParam*/, LPARAM lParam)
  470. {
  471. CXTPMarkupInputElement* pMouseOver = m_pMouseOver;
  472. if (m_pMouseCapture)
  473. pMouseOver = m_pMouseCapture;
  474. if (!pMouseOver)
  475. return FALSE;
  476. CInputElementCollection listNewMouseOver;
  477. BuildInputList(pMouseOver, &listNewMouseOver);
  478. CXTPMarkupMouseButtonEventArgs eMouseButtonEventArgs(
  479. message == WM_LBUTTONDOWN  || message == WM_LBUTTONDBLCLK ? CXTPMarkupInputElement::m_pMouseLeftButtonDownEvent :
  480. message == WM_LBUTTONUP ? CXTPMarkupInputElement::m_pMouseLeftButtonUpEvent :
  481. message == WM_RBUTTONDOWN ? CXTPMarkupInputElement::m_pMouseRightButtonDownEvent :
  482. message == WM_RBUTTONUP ? CXTPMarkupInputElement::m_pMouseRightButtonUpEvent : NULL);
  483. eMouseButtonEventArgs.SetSource(pMouseOver);
  484. eMouseButtonEventArgs.m_hWnd = m_hContextWnd;
  485. eMouseButtonEventArgs.m_point = lParam;
  486. for (int i = 0; i < listNewMouseOver.GetCount(); i++)
  487. {
  488. CXTPMarkupInputElement* pInputElement = listNewMouseOver.GetItem(i);
  489. pInputElement->RaiseEvent(&eMouseButtonEventArgs);
  490. if (eMouseButtonEventArgs.IsHandled())
  491. break;
  492. if (message == WM_LBUTTONDOWN || message == WM_LBUTTONDBLCLK)
  493. {
  494. pInputElement->OnMouseLeftButtonDown(&eMouseButtonEventArgs);
  495. }
  496. else if (message == WM_LBUTTONUP)
  497. {
  498. pInputElement->OnMouseLeftButtonUp(&eMouseButtonEventArgs);
  499. }
  500. else if (message == WM_RBUTTONDOWN)
  501. {
  502. pInputElement->OnMouseRightButtonDown(&eMouseButtonEventArgs);
  503. }
  504. else if (message == WM_RBUTTONUP)
  505. {
  506. pInputElement->OnMouseRightButtonUp(&eMouseButtonEventArgs);
  507. }
  508. if (eMouseButtonEventArgs.IsHandled())
  509. break;
  510. }
  511. return eMouseButtonEventArgs.IsHandled();
  512. }
  513. void CXTPMarkupContext::CaptureMouse(CXTPMarkupInputElement* pUIElement)
  514. {
  515. m_pMouseCapture = pUIElement;
  516. ::SetCapture(m_hContextWnd);
  517. }
  518. void CXTPMarkupContext::ReleaseMouseCapture(CXTPMarkupInputElement* /*pUIElement*/)
  519. {
  520. m_pMouseCapture = NULL;
  521. ::ReleaseCapture();
  522. }
  523. BOOL CXTPMarkupContext::OnWndMsg(CXTPMarkupUIElement* pUIElement, UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
  524. {
  525. if (!m_hContextWnd)
  526. return FALSE;
  527. if (m_pActiveElement && m_pActiveElement != pUIElement)
  528. return FALSE;
  529. if (message == WM_MOUSEMOVE)
  530. {
  531. HandleMouseMove(pUIElement, CPoint(lParam));
  532. }
  533. if (message == WM_DESTROY || message == WM_MOUSELEAVE)
  534. {
  535. HandleMouseEnter(NULL, CPoint(-1, -1));
  536. }
  537. if ((message >= WM_MOUSEFIRST && message <= WM_MOUSELAST) || (message == WM_MOUSELEAVE))
  538. {
  539. m_pTooltipContext->FilterToolTipMessage(CWnd::FromHandle(m_hContextWnd), message, wParam, lParam);
  540. }
  541. if (message == WM_SETCURSOR)
  542. {
  543. if (HandleSetCursor())
  544. {
  545. *pResult = TRUE;
  546. return TRUE;
  547. }
  548. }
  549. if (message == WM_MOUSEWHEEL)
  550. {
  551. if (HandleMouseWheel((short) HIWORD(wParam)))
  552. {
  553. *pResult = TRUE;
  554. return TRUE;
  555. }
  556. }
  557. if (message == WM_LBUTTONDOWN || message == WM_RBUTTONDOWN || message == WM_LBUTTONUP || message == WM_RBUTTONUP || message == WM_LBUTTONDBLCLK)
  558. {
  559. if (HandleMouseUpDown(message, wParam, lParam))
  560. return TRUE;
  561. }
  562. if (message == WM_CAPTURECHANGED && m_pMouseCapture)
  563. {
  564. CXTPMarkupMouseEventArgs eLostMouseCaptureEventArgs(CXTPMarkupInputElement::m_pLostMouseCaptureEvent);
  565. eLostMouseCaptureEventArgs.SetSource(m_pMouseCapture);
  566. CXTPMarkupInputElement* pInputElement = m_pMouseCapture;
  567. pInputElement->RaiseEvent(&eLostMouseCaptureEventArgs);
  568. if (!eLostMouseCaptureEventArgs.IsHandled())
  569. {
  570. pInputElement->OnLostMouseCapture(&eLostMouseCaptureEventArgs);
  571. }
  572. m_pMouseCapture = NULL;
  573. }
  574. if (message == WM_KEYDOWN || message == WM_SETFOCUS || message == WM_KILLFOCUS)
  575. {
  576. if (m_pKeyboardNavigation->OnWndMsg(message, wParam, lParam, pResult))
  577. return TRUE;
  578. }
  579. return FALSE;
  580. }
  581. void CXTPMarkupContext::RaiseEvent(CXTPMarkupObject* pSource, CXTPMarkupRoutedEventArgs* pEventArgs)
  582. {
  583. if (m_pHandlers) m_pHandlers->Raise(pSource, pEventArgs);
  584. }
  585. void CXTPMarkupContext::AddHandler(CXTPMarkupRoutedEvent* pEvent, CXTPMarkupDelegate* pDelegate)
  586. {
  587. if (m_pHandlers == NULL)
  588. m_pHandlers = new CXTPMarkupEventHandlerMap();
  589. m_pHandlers->Add(pEvent, pDelegate);
  590. }
  591. void CXTPMarkupContext::SetDelegate(LPWSTR lpszHandler, CXTPMarkupDelegate* pDelegate)
  592. {
  593. if (m_pDelegates == NULL)
  594. m_pDelegates = new CXTPMarkupDelegateMap();
  595. m_pDelegates->Add(lpszHandler, pDelegate);
  596. }
  597. CXTPMarkupDelegate* CXTPMarkupContext::LookupDelegate(LPCWSTR lpszDelegate) const
  598. {
  599. if (m_pDelegates == NULL)
  600. return NULL;
  601. return m_pDelegates->Lookup(lpszDelegate);
  602. }
  603. CRect CXTPMarkupContext::GetClientBoundingRect(CXTPMarkupInputElement* pInputElement)
  604. {
  605. CRect rc(0, 0, 0, 0);
  606. if (!pInputElement)
  607. return rc;
  608. CXTPMarkupVisual* pVisual = NULL;
  609. if (pInputElement->IsKindOf(MARKUP_TYPE(CXTPMarkupVisual)))
  610. {
  611. pVisual = (CXTPMarkupVisual*)pInputElement;
  612. rc = pVisual->GetBoundRect();
  613. }
  614. else if (pInputElement->IsKindOf(MARKUP_TYPE(CXTPMarkupFrameworkContentElement)))
  615. {
  616. pVisual = ((CXTPMarkupFrameworkContentElement*)pInputElement)->GetParent();
  617. rc = ((CXTPMarkupFrameworkContentElement*)pInputElement)->GetBoundRect();
  618. }
  619. if (!pVisual)
  620. return rc;
  621. while (pVisual != 0)
  622. {
  623. rc.OffsetRect(pVisual->GetVisualOffset());
  624. pVisual = pVisual->GetVisualParent();
  625. }
  626. return rc;
  627. }
  628. void CXTPMarkupContext::OnInvalidateVisual(CXTPMarkupUIElement* pUIElement)
  629. {
  630. //TRACE(_T("OnInvalidateVisualn"));
  631. if (m_hContextWnd)
  632. {
  633. InvalidateRect(m_hContextWnd, GetClientBoundingRect(pUIElement), FALSE);
  634. }
  635. }
  636. void CXTPMarkupContext::OnInvalidateArrange(CXTPMarkupUIElement* /*pUIElement*/)
  637. {
  638. //TRACE(_T("OnInvalidateArrangen"));
  639. if (m_hContextWnd)
  640. {
  641. InvalidateRect(m_hContextWnd, NULL, FALSE);
  642. }
  643. }
  644. void CXTPMarkupContext::Release()
  645. {
  646. if (m_dwRef == 0)
  647. return;
  648. LONG lResult = InterlockedDecrement(&m_dwRef);
  649. if (lResult == 0)
  650. {
  651. delete this;
  652. }
  653. }