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

对话框与窗口

开发平台:

Visual C++

  1. // XTPMarkupInputElement.cpp: implementation of the CXTPMarkupInputElement 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 "XTPMarkupInputElement.h"
  22. #include "XTPMarkupContext.h"
  23. #include "XTPMarkupBuilder.h"
  24. #include "XTPMarkupUIElement.h"
  25. #include "XTPMarkupResourceDictionary.h"
  26. #include "XTPMarkupKeyboardNavigation.h"
  27. #ifdef _DEBUG
  28. #undef THIS_FILE
  29. static char THIS_FILE[]=__FILE__;
  30. #define new DEBUG_NEW
  31. #endif
  32. //////////////////////////////////////////////////////////////////////////
  33. // CXTPMarkupRoutedEvent
  34. CXTPMarkupRoutedEvent::CXTPMarkupRoutedEvent()
  35. {
  36. }
  37. CXTPMarkupRoutedEvent* CXTPMarkupRoutedEvent::RegisterRoutedEvent(LPCWSTR lpszName, RoutingStrategy routingStrategy, CXTPMarkupType* pOwnerType)
  38. {
  39. CXTPMarkupRoutedEvent* pEvent = (CXTPMarkupRoutedEvent*)RegisterCommon(new CXTPMarkupRoutedEvent(), lpszName, MARKUP_TYPE(CXTPMarkupString), pOwnerType, FALSE);
  40. if (routingStrategy != routingDirect)
  41. {
  42. pEvent->m_pMetadata = new CXTPMarkupPropertyMetadata(NULL, routingStrategy);
  43. }
  44. return pEvent;
  45. }
  46. //////////////////////////////////////////////////////////////////////////
  47. // CXTPMarkupRoutedEventArgs
  48. CXTPMarkupRoutedEventArgs::CXTPMarkupRoutedEventArgs(CXTPMarkupRoutedEvent* pEvent, CXTPMarkupObject* pSource)
  49. {
  50. m_pSource = pSource;
  51. m_pEvent = pEvent;
  52. m_bHandled = FALSE;
  53. }
  54. CXTPMarkupRoutedEventArgs::CXTPMarkupRoutedEventArgs()
  55. {
  56. m_pSource = NULL;
  57. m_pEvent = NULL;
  58. m_bHandled = FALSE;
  59. }
  60. CXTPMarkupMouseEventArgs::CXTPMarkupMouseEventArgs(CXTPMarkupRoutedEvent* pEvent)
  61. : CXTPMarkupRoutedEventArgs(pEvent, NULL)
  62. {
  63. m_hWnd = 0;
  64. m_point = 0;
  65. }
  66. CPoint CXTPMarkupMouseEventArgs::GetPosition(CXTPMarkupInputElement* relativeTo)
  67. {
  68. CPoint pt = m_point;
  69. CXTPMarkupObject* pVisual = relativeTo;
  70. while (pVisual != 0)
  71. {
  72. if (pVisual->IsKindOf(MARKUP_TYPE(CXTPMarkupVisual)))
  73. {
  74. pt -= ((CXTPMarkupVisual*)pVisual)->GetVisualOffset();
  75. }
  76. pVisual = pVisual->GetLogicalParent();
  77. }
  78. return pt;
  79. }
  80. CXTPMarkupMouseButtonEventArgs::CXTPMarkupMouseButtonEventArgs(CXTPMarkupRoutedEvent* pEvent)
  81. : CXTPMarkupMouseEventArgs(pEvent)
  82. {
  83. }
  84. CXTPMarkupQueryCursorEventArgs::CXTPMarkupQueryCursorEventArgs()
  85. : CXTPMarkupMouseEventArgs(NULL)
  86. {
  87. }
  88. CXTPMarkupMouseWheelEventArgs::CXTPMarkupMouseWheelEventArgs()
  89. : CXTPMarkupMouseEventArgs(NULL)
  90. {
  91. }
  92. //////////////////////////////////////////////////////////////////////////
  93. // CXTPMarkupEventHandlerMap
  94. CXTPMarkupEventHandlerMap::CXTPMarkupEventHandlerMap()
  95. {
  96. }
  97. CXTPMarkupEventHandlerMap::~CXTPMarkupEventHandlerMap()
  98. {
  99. RemoveAll();
  100. }
  101. void CXTPMarkupEventHandlerMap::RemoveAll()
  102. {
  103. POSITION pos = m_mapHandlers.GetStartPosition();
  104. while (pos)
  105. {
  106. CPtrList* pHandlers;
  107. CXTPMarkupRoutedEvent* pEvent;
  108. m_mapHandlers.GetNextAssoc(pos, pEvent, pHandlers);
  109. while (!pHandlers->IsEmpty())
  110. {
  111. CXTPMarkupDelegate* pDelegate = (CXTPMarkupDelegate*)pHandlers->RemoveTail();
  112. MARKUP_RELEASE(pDelegate);
  113. }
  114. delete pHandlers;
  115. }
  116. m_mapHandlers.RemoveAll();
  117. }
  118. void CXTPMarkupEventHandlerMap::Add(CXTPMarkupRoutedEvent* pEvent, CXTPMarkupDelegate* pDelegate)
  119. {
  120. CPtrList* pHandlers;
  121. if (!m_mapHandlers.Lookup(pEvent, pHandlers))
  122. {
  123. pHandlers  = new CPtrList();
  124. m_mapHandlers.SetAt(pEvent, pHandlers);
  125. }
  126. pHandlers->AddTail(pDelegate);
  127. }
  128. void CXTPMarkupEventHandlerMap::Raise(CXTPMarkupObject* pSender, CXTPMarkupRoutedEventArgs* pEventArgs)
  129. {
  130. CPtrList* pHandlers;
  131. if (!m_mapHandlers.Lookup(pEventArgs->GetEvent(), pHandlers))
  132. return;
  133. POSITION pos = pHandlers->GetHeadPosition();
  134. while (pos)
  135. {
  136. CXTPMarkupDelegate* pDelegate = (CXTPMarkupDelegate*)pHandlers->GetNext(pos);
  137. pDelegate->Execute(pSender, pEventArgs);
  138. }
  139. }
  140. //////////////////////////////////////////////////////////////////////////
  141. // CXTPMarkupInputElement
  142. CXTPMarkupDependencyProperty* CXTPMarkupInputElement::m_pCursorProperty = NULL;
  143. CXTPMarkupDependencyProperty* CXTPMarkupInputElement::m_pIsMouseOverProperty = NULL;
  144. CXTPMarkupDependencyProperty* CXTPMarkupInputElement::m_pIsKeyboardFocusedProperty = NULL;
  145. CXTPMarkupDependencyProperty* CXTPMarkupInputElement::m_pResourcesProperty = NULL;
  146. CXTPMarkupDependencyProperty* CXTPMarkupInputElement::m_pStyleProperty = NULL;
  147. CXTPMarkupDependencyProperty* CXTPMarkupInputElement::m_pIsFocusableProperty = NULL;
  148. CXTPMarkupDependencyProperty* CXTPMarkupInputElement::m_pToolTipProperty = NULL;
  149. CXTPMarkupRoutedEvent* CXTPMarkupInputElement::m_pMouseLeaveEvent = NULL;
  150. CXTPMarkupRoutedEvent* CXTPMarkupInputElement::m_pMouseEnterEvent = NULL;
  151. CXTPMarkupRoutedEvent* CXTPMarkupInputElement::m_pMouseLeftButtonUpEvent = NULL;
  152. CXTPMarkupRoutedEvent* CXTPMarkupInputElement::m_pMouseLeftButtonDownEvent = NULL;
  153. CXTPMarkupRoutedEvent* CXTPMarkupInputElement::m_pMouseRightButtonUpEvent = NULL;
  154. CXTPMarkupRoutedEvent* CXTPMarkupInputElement::m_pMouseRightButtonDownEvent = NULL;
  155. CXTPMarkupRoutedEvent* CXTPMarkupInputElement::m_pMouseMoveEvent = NULL;
  156. CXTPMarkupRoutedEvent* CXTPMarkupInputElement::m_pLostMouseCaptureEvent = NULL;
  157. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupInputElement, CXTPMarkupObject);
  158. void CXTPMarkupInputElement::RegisterMarkupClass()
  159. {
  160. CXTPMarkupStyle::RegisterType();
  161. m_pCursorProperty = CXTPMarkupDependencyProperty::Register(L"Cursor", MARKUP_TYPE(CXTPMarkupInt), MARKUP_TYPE(CXTPMarkupInputElement),
  162. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertCursor));
  163. m_pIsMouseOverProperty = CXTPMarkupDependencyProperty::Register(L"IsMouseOver", MARKUP_TYPE(CXTPMarkupBool), MARKUP_TYPE(CXTPMarkupInputElement),
  164. new CXTPMarkupPropertyMetadata(CXTPMarkupBool::CreateFalseValue()));
  165. m_pResourcesProperty = CXTPMarkupStyle::m_pResourcesProperty->AddOwner(MARKUP_TYPE(CXTPMarkupInputElement));
  166. m_pStyleProperty = CXTPMarkupDependencyProperty::Register(L"Style", MARKUP_TYPE(CXTPMarkupStyle), MARKUP_TYPE(CXTPMarkupInputElement),
  167. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupInputElement::OnStylePropertyChanged));
  168. m_pIsKeyboardFocusedProperty = CXTPMarkupDependencyProperty::Register(L"IsKeyboardFocused", MARKUP_TYPE(CXTPMarkupBool), MARKUP_TYPE(CXTPMarkupInputElement),
  169. new CXTPMarkupPropertyMetadata(CXTPMarkupBool::CreateFalseValue(), CXTPMarkupPropertyMetadata::flagAffectsRender));
  170. m_pIsFocusableProperty = CXTPMarkupDependencyProperty::Register(L"IsFocusable", MARKUP_TYPE(CXTPMarkupBool), MARKUP_TYPE(CXTPMarkupInputElement),
  171. new CXTPMarkupPropertyMetadata(CXTPMarkupBool::CreateFalseValue()));
  172. m_pToolTipProperty = CXTPMarkupDependencyProperty::Register(L"ToolTip", MARKUP_TYPE(CXTPMarkupObject), MARKUP_TYPE(CXTPMarkupInputElement));
  173. m_pMouseLeaveEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"MouseLeave",
  174. CXTPMarkupRoutedEvent::routingDirect, MARKUP_TYPE(CXTPMarkupInputElement));
  175. m_pMouseEnterEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"MouseEnter",
  176. CXTPMarkupRoutedEvent::routingDirect, MARKUP_TYPE(CXTPMarkupInputElement));
  177. m_pMouseLeftButtonUpEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"MouseLeftButtonUp",
  178. CXTPMarkupRoutedEvent::routingDirect, MARKUP_TYPE(CXTPMarkupInputElement));
  179. m_pMouseLeftButtonDownEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"MouseLeftButtonDown",
  180. CXTPMarkupRoutedEvent::routingDirect, MARKUP_TYPE(CXTPMarkupInputElement));
  181. m_pMouseRightButtonUpEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"MouseRightButtonUp",
  182. CXTPMarkupRoutedEvent::routingDirect, MARKUP_TYPE(CXTPMarkupInputElement));
  183. m_pMouseRightButtonDownEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"MouseRightButtonDown",
  184. CXTPMarkupRoutedEvent::routingDirect, MARKUP_TYPE(CXTPMarkupInputElement));
  185. m_pMouseMoveEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"MouseMove",
  186. CXTPMarkupRoutedEvent::routingDirect, MARKUP_TYPE(CXTPMarkupInputElement));
  187. m_pLostMouseCaptureEvent= CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"pLostMouseCapture",
  188. CXTPMarkupRoutedEvent::routingDirect, MARKUP_TYPE(CXTPMarkupInputElement));
  189. }
  190. CXTPMarkupInputElement::CXTPMarkupInputElement()
  191. {
  192. m_pMarkupContext = NULL;
  193. m_pHandlers = NULL;
  194. m_pActiveTriggers = NULL;
  195. m_pTriggerProperties = NULL;
  196. m_pStyleCache = NULL;
  197. }
  198. CXTPMarkupInputElement::~CXTPMarkupInputElement()
  199. {
  200. SAFE_DELETE(m_pHandlers);
  201. MARKUP_RELEASE(m_pActiveTriggers);
  202. MARKUP_RELEASE(m_pTriggerProperties);
  203. }
  204. void CXTPMarkupInputElement::OnMouseLeave(CXTPMarkupMouseEventArgs* /*e*/)
  205. {
  206. SetValue(m_pIsMouseOverProperty, NULL);
  207. }
  208. void CXTPMarkupInputElement::OnMouseEnter(CXTPMarkupMouseEventArgs* /*e*/)
  209. {
  210. SetValue(m_pIsMouseOverProperty, CXTPMarkupBool::CreateTrueValue());
  211. }
  212. void CXTPMarkupInputElement::OnMouseMove(CXTPMarkupMouseEventArgs* /*e*/)
  213. {
  214. }
  215. void CXTPMarkupInputElement::OnQueryCursor(CXTPMarkupQueryCursorEventArgs* e)
  216. {
  217. CXTPMarkupInt* pCursor = MARKUP_STATICCAST(CXTPMarkupInt, GetValue(m_pCursorProperty));
  218. if (pCursor)
  219. {
  220. e->SetHandled();
  221. e->m_hCursor = AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE((int)*pCursor));
  222. }
  223. }
  224. void CXTPMarkupInputElement::OnMouseWheel(CXTPMarkupMouseWheelEventArgs* /*e*/)
  225. {
  226. }
  227. void CXTPMarkupInputElement::OnMouseLeftButtonUp(CXTPMarkupMouseButtonEventArgs* /*e*/)
  228. {
  229. }
  230. void CXTPMarkupInputElement::OnMouseRightButtonUp(CXTPMarkupMouseButtonEventArgs* /*e*/)
  231. {
  232. }
  233. void CXTPMarkupInputElement::OnMouseLeftButtonDown(CXTPMarkupMouseButtonEventArgs* /*e*/)
  234. {
  235. }
  236. void CXTPMarkupInputElement::OnMouseRightButtonDown(CXTPMarkupMouseButtonEventArgs* /*e*/)
  237. {
  238. }
  239. void CXTPMarkupInputElement::OnLostMouseCapture(CXTPMarkupMouseEventArgs* /*e*/)
  240. {
  241. }
  242. void CXTPMarkupInputElement::RaiseEvent(CXTPMarkupRoutedEventArgs* pEventArgs)
  243. {
  244. if (pEventArgs->GetEvent() == NULL)
  245. {
  246. ASSERT(FALSE);
  247. return;
  248. }
  249. if (pEventArgs->GetEvent()->GetFlags() & CXTPMarkupRoutedEvent::routingBubble)
  250. {
  251. CXTPMarkupObject* pParent = this;
  252. while (pParent)
  253. {
  254. if (pParent->IsKindOf(MARKUP_TYPE(CXTPMarkupInputElement)))
  255. {
  256. CXTPMarkupEventHandlerMap* pHandlers = ((CXTPMarkupInputElement*)pParent)->m_pHandlers;
  257. if (pHandlers) pHandlers->Raise(pParent, pEventArgs);
  258. if (pEventArgs->IsHandled())
  259. return;
  260. }
  261. pParent = pParent->GetLogicalParent();
  262. }
  263. CXTPMarkupContext* pMarkupContext = GetMarkupContext();
  264. if (pMarkupContext)
  265. {
  266. pMarkupContext->RaiseEvent(this, pEventArgs);
  267. }
  268. }
  269. else
  270. {
  271. if (m_pHandlers) m_pHandlers->Raise(this, pEventArgs);
  272. }
  273. }
  274. void CXTPMarkupInputElement::AddHandler(CXTPMarkupRoutedEvent* pEvent, CXTPMarkupDelegate* pDelegate)
  275. {
  276. if (m_pHandlers == NULL)
  277. m_pHandlers = new CXTPMarkupEventHandlerMap();
  278. m_pHandlers->Add(pEvent, pDelegate);
  279. }
  280. CXTPMarkupInputElement* CXTPMarkupInputElement::InputHitTest(CPoint /*point*/) const
  281. {
  282. return NULL;
  283. }
  284. void CXTPMarkupInputElement::SetPropertyObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pValue)
  285. {
  286. if (pProperty->IsEvent())
  287. {
  288. CXTPMarkupContext* pMarkupContext = GetMarkupContext();
  289. if (!pMarkupContext)
  290. {
  291. pBuilder->ThrowBuilderException(_T("Markup Context is NULL"));
  292. }
  293. LPCWSTR lpszDelegate = (LPCWSTR)*((CXTPMarkupString*)pValue);
  294. CXTPMarkupDelegate* pDelegate = pMarkupContext->LookupDelegate(lpszDelegate);
  295. if (!pDelegate)
  296. {
  297. pBuilder->ThrowBuilderException(CXTPMarkupBuilder::FormatString(_T("'%ls' delegate not found"), (LPCTSTR)lpszDelegate));
  298. }
  299. AddHandler((CXTPMarkupRoutedEvent*)pProperty,  pDelegate);
  300. MARKUP_RELEASE(pValue);
  301. MARKUP_ADDREF(pDelegate);
  302. return;
  303. }
  304. CXTPMarkupObject::SetPropertyObject(pBuilder, pProperty, pValue);
  305. }
  306. void CXTPMarkupInputElement::OnFinalRelease()
  307. {
  308. ASSERT(m_pMarkupContext);
  309. if (m_pMarkupContext)
  310. {
  311. m_pMarkupContext->FinalizeMarkupObject(this);
  312. }
  313. CXTPMarkupObject::OnFinalRelease();
  314. }
  315. void CXTPMarkupInputElement::CaptureMouse()
  316. {
  317. m_pMarkupContext->CaptureMouse(this);
  318. }
  319. void CXTPMarkupInputElement::ReleaseMouseCapture()
  320. {
  321. m_pMarkupContext->ReleaseMouseCapture(this);
  322. }
  323. void CXTPMarkupInputElement::ApplyTree(CXTPMarkupObject* pChild)
  324. {
  325. int nCount = pChild->GetLogicalChildrenCount();
  326. for (int i = 0; i < nCount; i++)
  327. {
  328. CXTPMarkupObject* p = pChild->GetLogicalChild(i);
  329. ApplyTree(p);
  330. }
  331. if (pChild->IsKindOf(MARKUP_TYPE(CXTPMarkupInputElement)))
  332. {
  333. ((CXTPMarkupInputElement*)pChild)->OnApply();
  334. }
  335. }
  336. void CXTPMarkupInputElement::Apply()
  337. {
  338. ApplyTree(this);
  339. }
  340. CXTPMarkupObject* CXTPMarkupInputElement::FindResource(const CXTPMarkupObject* pKey) const
  341. {
  342. return CXTPMarkupResourceDictionary::FindResource(this, pKey);
  343. }
  344. void CXTPMarkupInputElement::OnApply()
  345. {
  346. if (m_pStyleCache == NULL)
  347. {
  348. CXTPMarkupType* pType = GetType();
  349. if (!pType)
  350. return;
  351. CXTPMarkupStyle* pStyle = MARKUP_DYNAMICCAST(CXTPMarkupStyle, FindResource(pType));
  352. if (pStyle)
  353. {
  354. pStyle->Seal();
  355. m_pStyleCache = pStyle;
  356. }
  357. }
  358. if (m_pStyleCache != NULL)
  359. {
  360. FireTriggers(NULL, NULL);
  361. }
  362. }
  363. class CXTPMarkupActiveTriggerCollection : public CXTPMarkupTriggerCollection
  364. {
  365. public:
  366. CXTPMarkupActiveTriggerCollection()
  367. {
  368. m_bLogicalParent = FALSE;
  369. }
  370. };
  371. BOOL CXTPMarkupInputElement::AddStyleTriggers(CXTPMarkupStyle* pStyle, CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pNewValue)
  372. {
  373. BOOL bChanged = FALSE;
  374. CXTPMarkupStyle* pBasedStyle = pStyle->GetBasedStyle();
  375. if (pBasedStyle)
  376. {
  377. bChanged = AddStyleTriggers(pBasedStyle, pProperty, pNewValue);
  378. }
  379. CXTPMarkupTriggerCollection* pTriggers = pStyle->GetTriggers();
  380. if (!pTriggers)
  381. return bChanged;
  382. BOOL bAllProperties = (pProperty == NULL);
  383. for (int i = pTriggers->GetCount() - 1; i >= 0; i--)
  384. {
  385. CXTPMarkupTrigger* pTrigger = pTriggers->GetItem(i);
  386. if (bAllProperties)
  387. {
  388. pProperty = pTrigger->GetTriggerProperty();
  389. pNewValue = GetValue(pProperty);
  390. }
  391. if (pTrigger->GetTriggerProperty() == pProperty && pTrigger->GetTriggerValue()->IsEqual(pNewValue))
  392. {
  393. if (!m_pActiveTriggers)
  394. {
  395. m_pActiveTriggers = new CXTPMarkupActiveTriggerCollection();
  396. }
  397. pTrigger->AddRef();
  398. m_pActiveTriggers->Add(pTrigger);
  399. bChanged = TRUE;
  400. }
  401. }
  402. return bChanged;
  403. }
  404. void CXTPMarkupInputElement::FireTriggers(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pNewValue)
  405. {
  406. BOOL bChanged = FALSE;
  407. int i;
  408. CMap<CXTPMarkupDependencyProperty*, CXTPMarkupDependencyProperty*, CXTPMarkupObject*, CXTPMarkupObject*> mapOldValues;
  409. if (m_pActiveTriggers)
  410. {
  411. for (i = m_pActiveTriggers->GetCount() - 1; i >= 0; i--)
  412. {
  413. CXTPMarkupTrigger* pTrigger = m_pActiveTriggers->GetItem(i);
  414. if (pTrigger->GetTriggerProperty() == pProperty)
  415. {
  416. if (!pTrigger->GetTriggerValue()->IsEqual(pNewValue))
  417. {
  418. CXTPMarkupSetterColection* pSetters = pTrigger->GetSetters();
  419. for (int j = 0; j < pSetters->GetCount(); j++)
  420. {
  421. CXTPMarkupSetter* pSetter = pSetters->GetItem(j);
  422. CXTPMarkupDependencyProperty* pSetterProperty = pSetter->GetSetterProperty();
  423. CXTPMarkupObject* pOldValue = m_pTriggerProperties->Lookup(pSetterProperty);
  424. CXTPMarkupObject* pTempValue;
  425. if (!mapOldValues.Lookup(pSetterProperty, pTempValue))
  426. {
  427. MARKUP_ADDREF(pOldValue);
  428. mapOldValues.SetAt(pSetterProperty, pOldValue);
  429. }
  430. m_pTriggerProperties->Set(pSetterProperty, NULL);
  431. }
  432. m_pActiveTriggers->Remove(i);
  433. bChanged = TRUE;
  434. }
  435. }
  436. }
  437. }
  438. if (m_pStyleCache)
  439. {
  440. bChanged = AddStyleTriggers(m_pStyleCache, pProperty, pNewValue) || bChanged;
  441. }
  442. else if (GetType()->GetTypeStyle())
  443. {
  444. bChanged = AddStyleTriggers(GetType()->GetTypeStyle(), pProperty, pNewValue) || bChanged;
  445. }
  446. if (bChanged)
  447. {
  448. if (!m_pTriggerProperties)
  449. m_pTriggerProperties = new CXTPMarkupProperties(NULL);
  450. for (i = 0; i < m_pActiveTriggers->GetCount(); i++)
  451. {
  452. CXTPMarkupTrigger* pTrigger = m_pActiveTriggers->GetItem(i);
  453. CXTPMarkupSetterColection* pSetters = pTrigger->GetSetters();
  454. for (int j = 0; j < pSetters->GetCount(); j++)
  455. {
  456. CXTPMarkupSetter* pSetter = pSetters->GetItem(j);
  457. CXTPMarkupObject* pValue = pSetter->GetSetterValue();
  458. CXTPMarkupDependencyProperty* pSetterProperty = pSetter->GetSetterProperty();
  459. CXTPMarkupObject* pOldValue = m_pTriggerProperties->Lookup(pSetterProperty);
  460. if (!pValue->IsEqual(pOldValue))
  461. {
  462. CXTPMarkupObject* pTempValue;
  463. if (!mapOldValues.Lookup(pSetterProperty, pTempValue))
  464. {
  465. MARKUP_ADDREF(pOldValue);
  466. mapOldValues.SetAt(pSetterProperty, pOldValue);
  467. }
  468. pValue->AddRef();
  469. m_pTriggerProperties->Set(pSetterProperty, pValue);
  470. }
  471. }
  472. }
  473. }
  474. POSITION pos = mapOldValues.GetStartPosition();
  475. while (pos)
  476. {
  477. CXTPMarkupDependencyProperty* pProperty;
  478. CXTPMarkupObject* pOldValue;
  479. mapOldValues.GetNextAssoc(pos, pProperty, pOldValue);
  480. CXTPMarkupObject* pNewValue = m_pTriggerProperties->Lookup(pProperty);
  481. if (!::IsEqual(pNewValue, pOldValue))
  482. {
  483. OnPropertyChanged(pProperty, pOldValue, pNewValue);
  484. if (pProperty->GetFlags() & CXTPMarkupPropertyMetadata::flagInherited)
  485. {
  486. RecursePropertyChanged(pProperty, pOldValue, pNewValue);
  487. }
  488. }
  489. MARKUP_RELEASE(pOldValue);
  490. }
  491. }
  492. void CXTPMarkupInputElement::OnStylePropertyChanged(CXTPMarkupObject* d, CXTPMarkupPropertyChangedEventArgs* e)
  493. {
  494. CXTPMarkupInputElement* pElement = MARKUP_DYNAMICCAST(CXTPMarkupInputElement, d);
  495. if (!pElement)
  496. {
  497. ASSERT(FALSE);
  498. return;
  499. }
  500. CXTPMarkupStyle* pStyle = MARKUP_STATICCAST(CXTPMarkupStyle, e->m_pNewValue);
  501. if (pStyle)
  502. {
  503. pStyle->Seal();
  504. }
  505. pElement->m_pStyleCache = pStyle;
  506. }
  507. CXTPMarkupObject* CXTPMarkupInputElement::GetValueCore(CXTPMarkupDependencyProperty* pProperty) const
  508. {
  509. CXTPMarkupObject* pValue = CXTPMarkupObject::GetValueCore(pProperty);
  510. if (pValue)
  511. return pValue;
  512. if (m_pTriggerProperties)
  513. {
  514. pValue = m_pTriggerProperties->Lookup(pProperty);
  515. if (pValue)
  516. return pValue;
  517. }
  518. if (m_pStyleCache)
  519. {
  520. pValue = m_pStyleCache->GetStyleValue(pProperty);
  521. if (pValue)
  522. return pValue;
  523. }
  524. CXTPMarkupStyle* pTypeStyle = GetType()->GetTypeStyle();
  525. if (pTypeStyle)
  526. return pTypeStyle->GetStyleValue(pProperty);
  527. return NULL;
  528. }
  529. void CXTPMarkupInputElement::Focus()
  530. {
  531. if (!m_pMarkupContext)
  532. return;
  533. m_pMarkupContext->GetKeyboardNavigation()->Focus(this);
  534. }