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

对话框与窗口

开发平台:

Visual C++

  1. // XTPControl.cpp : implementation of the CXTPControl class.
  2. //
  3. // This file is a part of the XTREME COMMANDBARS 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 "Resource.h"
  22. #include "Common/Resource.h"
  23. #include "Common/XTPResourceManager.h"
  24. #include "Common/XTPImageManager.h"
  25. #include "XTPControl.h"
  26. #include "XTPControls.h"
  27. #include "XTPMouseManager.h"
  28. #include "XTPCommandBar.h"
  29. #include "XTPPaintManager.h"
  30. #include "XTPToolbar.h"
  31. #include "XTPCommandBars.h"
  32. #include "XTPPopupBar.h"
  33. #include "XTPCustomizeTools.h"
  34. #include "XTPSoundManager.h"
  35. #ifdef _DEBUG
  36. #define new DEBUG_NEW
  37. #undef THIS_FILE
  38. static char THIS_FILE[] = __FILE__;
  39. #endif
  40. IMPLEMENT_DYNAMIC(CXTPControlAction, CCmdTarget)
  41. //////////////////////////////////////////////////////////////////////////
  42. // CXTPControlAction
  43. CXTPControlAction::CXTPControlAction(CXTPControlActions* pActions)
  44. {
  45. m_nId = 0;
  46. m_nIconId = 0;
  47. m_nHelpId = 0;
  48. m_nTag = 0;
  49. m_bVisible = TRUE;
  50. m_bChecked = FALSE;
  51. m_bEnabled = TRUE;
  52. m_pTarget = NULL;
  53. m_pActions = pActions;
  54. }
  55. CXTPControlAction::~CXTPControlAction()
  56. {
  57. ASSERT(m_arrControls.GetSize() == 0);
  58. if (m_pTarget)
  59. {
  60. CMDTARGET_RELEASE(m_pTarget);
  61. }
  62. }
  63. void CXTPControlAction::AddControl(CXTPControl* pControl)
  64. {
  65. for (int i = 0; i < m_arrControls.GetSize(); i++)
  66. {
  67. if (m_arrControls[i] == pControl)
  68. return;
  69. }
  70. m_arrControls.Add(pControl);
  71. pControl->m_bEnabled = -1;
  72. pControl->m_bChecked = -1;
  73. pControl->m_nId = m_nId;
  74. pControl->m_strCaption.Empty();
  75. pControl->m_strTooltipText.Empty();
  76. pControl->m_strDescriptionText.Empty();
  77. pControl->m_strCategory.Empty();
  78. pControl->m_strShortcutText.Empty();
  79. pControl->m_strKeyboardTip.Empty();
  80. }
  81. void CXTPControlAction::RemoveControl(CXTPControl* pControl)
  82. {
  83. for (int i = 0; i < m_arrControls.GetSize(); i++)
  84. {
  85. if (m_arrControls[i] == pControl)
  86. {
  87. m_arrControls.RemoveAt(i);
  88. pControl->m_bEnabled = TRUE;
  89. pControl->m_bChecked = FALSE;
  90. return;
  91. }
  92. }
  93. }
  94. void CXTPControlAction::OnChanged(int nProperty)
  95. {
  96. for (int i = 0; i < m_arrControls.GetSize(); i++)
  97. {
  98. m_arrControls[i]->OnActionChanged(nProperty);
  99. }
  100. }
  101. void CXTPControlAction::OnChanging(int nProperty)
  102. {
  103. for (int i = 0; i < m_arrControls.GetSize(); i++)
  104. {
  105. m_arrControls[i]->OnActionChanging(nProperty);
  106. }
  107. }
  108. void CXTPControlAction::RedrawControls()
  109. {
  110. for (int i = 0; i < m_arrControls.GetSize(); i++)
  111. {
  112. m_arrControls[i]->RedrawParent();
  113. }
  114. }
  115. void CXTPControlAction::RepositionControls()
  116. {
  117. for (int i = 0; i < m_arrControls.GetSize(); i++)
  118. {
  119. m_arrControls[i]->DelayLayoutParent();
  120. }
  121. }
  122. void CXTPControlAction::OnRemoved()
  123. {
  124. while (m_arrControls.GetSize() > 0)
  125. {
  126. m_arrControls[0]->SetAction(NULL);
  127. }
  128. }
  129. void CXTPControlAction::SetCaption(UINT nIDCaption)
  130. {
  131. CString strCaption;
  132. if (strCaption.LoadString(nIDCaption))
  133. {
  134. SetCaption(strCaption);
  135. }
  136. }
  137. void CXTPControlAction::SetCaption(LPCTSTR lpszCaption)
  138. {
  139. CString strCaption(lpszCaption);
  140. int nShortCutPos = strCaption.Find ('t');
  141. if (nShortCutPos != -1)
  142. {
  143. strCaption.ReleaseBuffer(nShortCutPos);
  144. }
  145. if (m_strCaption != strCaption)
  146. {
  147. OnChanging(3);
  148. m_strCaption = strCaption;
  149. OnChanged(3);
  150. RepositionControls();
  151. }
  152. }
  153. void CXTPControlAction::SetEditHint(LPCTSTR lpszEditHint)
  154. {
  155. if (m_strEditHint != lpszEditHint)
  156. {
  157. OnChanging(4);
  158. m_strEditHint = lpszEditHint;
  159. OnChanged(4);
  160. }
  161. }
  162. void CXTPControlAction::SetPrompt(LPCTSTR lpszPrompt)
  163. {
  164. if (lpszPrompt == NULL || lpszPrompt[0] == _T(''))
  165. return;
  166. if (_tcschr(lpszPrompt, _T('n')) != NULL)
  167. {
  168. AfxExtractSubString(m_strTooltipText, lpszPrompt, 1);
  169. AfxExtractSubString(m_strDescriptionText, lpszPrompt, 0);
  170. }
  171. else
  172. {
  173. m_strDescriptionText = m_strTooltipText = lpszPrompt;
  174. }
  175. if (m_strKeyboardTip.IsEmpty())
  176. {
  177. AfxExtractSubString(m_strKeyboardTip, lpszPrompt, 3);
  178. }
  179. }
  180. BOOL CXTPControlAction::GetEnabled() const
  181. {
  182. if (GetCommandBars()->IsCustomizeMode())
  183. return TRUE;
  184. return m_bEnabled;
  185. }
  186. CXTPCommandBars* CXTPControlAction::GetCommandBars() const
  187. {
  188. return m_pActions->m_pCommandBars;
  189. }
  190. CXTPControl* CXTPControlAction::GetControl(int nIndex) const
  191. {
  192. return m_arrControls[nIndex];
  193. }
  194. int CXTPControlAction::GetCount() const
  195. {
  196. return (int)m_arrControls.GetSize();
  197. }
  198. //////////////////////////////////////////////////////////////////////////
  199. // CXTPControlActions
  200. CXTPControlActions::CXTPControlActions(CXTPCommandBars* pCommandBars)
  201. {
  202. m_pCommandBars = pCommandBars;
  203. }
  204. CXTPControlActions::~CXTPControlActions()
  205. {
  206. RemoveAll();
  207. }
  208. CXTPControlAction* CXTPControlActions::GetAt(int nIndex) const
  209. {
  210. return m_arrActions.GetAt(nIndex);
  211. }
  212. int CXTPControlActions::GetCount() const
  213. {
  214. return (int)m_arrActions.GetSize();
  215. }
  216. CXTPControlAction* CXTPControlActions::FindAction(int nId) const
  217. {
  218. if (nId <= 0 || nId >= 0xFFFFFFF)
  219. return NULL;
  220. int num = GetCount();
  221. if (num == 0)
  222. return NULL;
  223. CXTPControlAction* const* lo = m_arrActions.GetData();
  224. CXTPControlAction* const* hi = lo + (num - 1);
  225. CXTPControlAction* const* mid;
  226. while (lo <= hi)
  227. {
  228. int half = num / 2;
  229. if (half)
  230. {
  231. mid = lo + (num & 1 ? half : (half - 1));
  232. if ((*mid)->GetID() == nId)
  233. return (*mid);
  234. if ((*mid)->GetID() > nId)
  235. {
  236. hi = mid - 1;
  237. num = num & 1 ? half : half - 1;
  238. }
  239. else
  240. {
  241. lo = mid + 1;
  242. num = half;
  243. }
  244. }
  245. else if (num)
  246. return (*lo)->GetID() == nId ? (*lo) : NULL;
  247. else
  248. break;
  249. }
  250. return NULL;
  251. }
  252. void CXTPControlActions::RemoveAll()
  253. {
  254. for (int i = 0; i < GetCount(); i++)
  255. {
  256. CXTPControlAction* pAction = GetAt(i);
  257. pAction->OnRemoved();
  258. pAction->InternalRelease();
  259. }
  260. m_arrActions.RemoveAll();
  261. }
  262. void CXTPControlActions::Remove(int nId)
  263. {
  264. for (int i = 0; i < GetCount(); i++)
  265. {
  266. CXTPControlAction* pAction = GetAt(i);
  267. if (pAction->GetID() == nId)
  268. {
  269. m_arrActions.RemoveAt(i);
  270. pAction->OnRemoved();
  271. pAction->InternalRelease();
  272. return;
  273. }
  274. }
  275. }
  276. void CXTPControlActions::Insert(CXTPControlAction* pAction)
  277. {
  278. int nIndex = 0;
  279. for (; nIndex < GetCount(); nIndex++)
  280. {
  281. if (GetAt(nIndex)->GetID() > pAction->GetID())
  282. break;
  283. }
  284. m_arrActions.InsertAt(nIndex, pAction);
  285. }
  286. void CXTPControlActions::SetActionId(CXTPControlAction* pAction, int nId)
  287. {
  288. ASSERT(FindAction(nId) == NULL);
  289. pAction->m_nId = nId;
  290. }
  291. CXTPControlAction* CXTPControlActions::Add(int nId, CXTPControlAction* pAction)
  292. {
  293. SetActionId(pAction, nId);
  294. CString strPrompt;
  295. if (XTPResourceManager()->LoadString(&strPrompt, nId))
  296. {
  297. pAction->SetPrompt(strPrompt);
  298. }
  299. Insert(pAction);
  300. return pAction;
  301. }
  302. CXTPControlAction* CXTPControlActions::Add(int nId)
  303. {
  304. CXTPControlAction* pAction = FindAction(nId);
  305. if (pAction)
  306. return pAction;
  307. pAction = new CXTPControlAction(this);
  308. return Add(nId, pAction);
  309. }
  310. void CXTPControlActions::CreateFromMenu(CMenu* pMenu)
  311. {
  312. int nCount = ::GetMenuItemCount(pMenu->m_hMenu);
  313. for (int nIndex = 0; nIndex < nCount; nIndex++)
  314. {
  315. // Check to see if the item is a separator, we don't want
  316. // to use GetMenuItemID(i) because it may not equal zero.
  317. MENUITEMINFO info = { sizeof(MENUITEMINFO), MIIM_TYPE | MIIM_STATE};
  318. ::GetMenuItemInfo(pMenu->m_hMenu, nIndex, TRUE, &info);
  319. int nID = (int)pMenu->GetMenuItemID(nIndex);
  320. BOOL bSeparator = ((info.fType & MFT_SEPARATOR) == MFT_SEPARATOR) || (nID == 0);
  321. if (!bSeparator)
  322. {
  323. CMenu* pPopupMenu = pMenu->GetSubMenu(nIndex);
  324. CString strCaption;
  325. XTPResourceManager()->GetMenuLocaleString(pMenu, nIndex, strCaption, MF_BYPOSITION);
  326. if (pPopupMenu)
  327. {
  328. nID = 0;
  329. }
  330. int iPos = strCaption.Find(_T('t'));
  331. if (pPopupMenu &&  iPos > 0)
  332. {
  333. nID = _ttoi(strCaption.Mid(iPos + 1));
  334. strCaption.ReleaseBuffer(iPos);
  335. }
  336. if (nID > 0)
  337. {
  338. CXTPControlAction* pAction = Add(nID);
  339. pAction->SetCaption(strCaption);
  340. CString strPrompt;
  341. if (XTPResourceManager()->LoadString(&strPrompt, nID))
  342. {
  343. pAction->SetPrompt(strPrompt);
  344. }
  345. }
  346. if (pPopupMenu)
  347. {
  348. CreateFromMenu(pPopupMenu);
  349. }
  350. }
  351. }
  352. }
  353. //////////////////////////////////////////////////////////////////////////
  354. // CXTPControl
  355. CXTPControl::CXTPControl()
  356. {
  357. EnableAutomation();
  358. m_nId = 0;
  359. m_nIconId = 0;
  360. m_nHelpId = 0;
  361. m_nCustomIconId = 0;
  362. m_nTag = 0;
  363. m_nIndex = 0;
  364. m_dwFlags = 0;
  365. m_rcControl.SetRectEmpty();
  366. m_rcRow.SetRectEmpty();
  367. m_pParent = 0;
  368. m_pControls = 0;
  369. m_bExpanded = FALSE;
  370. m_bChecked = FALSE;
  371. m_bEnabled = TRUE;
  372. m_bBeginGroup = FALSE;
  373. m_bEnabled = TRUE;
  374. m_bTemporary = FALSE;
  375. m_bSelected = FALSE;
  376. m_bPressed = FALSE;
  377. m_bWrap = FALSE;
  378. m_dwHideFlags = xtpNoHide;
  379. m_controlType = xtpControlError;
  380. m_bDefaultItem = FALSE;
  381. m_buttonStyle = xtpButtonAutomatic;
  382. m_buttonCustomStyle = xtpButtonUndefined;
  383. m_buttonRibbonStyle = xtpButtonAutomatic;
  384. m_bCloseSubMenuOnClick = TRUE;
  385. m_pRibbonGroup = NULL;
  386. m_pAction = 0;
  387. m_nWidth = 0;
  388. m_nHeight = 0;
  389. m_szIcon = CSize(0, 0);
  390. m_nExecuteOnPressInterval = 0;
  391. }
  392. CXTPControl::~CXTPControl()
  393. {
  394. if (m_pAction)
  395. {
  396. m_pAction->RemoveControl(this);
  397. m_pAction = NULL;
  398. }
  399. }
  400. void CXTPControl::SetAction(CXTPControlAction* pAction)
  401. {
  402. if (m_pAction)
  403. {
  404. m_pAction->RemoveControl(this);
  405. m_pAction = NULL;
  406. }
  407. if (pAction)
  408. {
  409. m_pAction = pAction;
  410. m_pAction->AddControl(this);
  411. }
  412. }
  413. void CXTPControl::OnRemoved()
  414. {
  415. SetAction(NULL);
  416. }
  417. XTPButtonStyle CXTPControl::GetStyle() const
  418. {
  419. return m_buttonCustomStyle != xtpButtonUndefined ? m_buttonCustomStyle :
  420. m_buttonStyle != xtpButtonAutomatic ? m_buttonStyle :
  421. m_buttonRibbonStyle != xtpButtonAutomatic || !m_pParent ? m_buttonRibbonStyle : m_pParent->GetDefaultButtonStyle();
  422. }
  423. CSize CXTPControl::GetSize(CDC* pDC)
  424. {
  425. return GetPaintManager()->DrawControl(pDC, this, FALSE);
  426. }
  427. void CXTPControl::Draw(CDC* pDC)
  428. {
  429. GetPaintManager()->DrawControl(pDC, this);
  430. }
  431. void CXTPControl::DelayRedrawParent()
  432. {
  433. if (m_pParent && IsWindow(m_pParent->GetSafeHwnd()))
  434. ((CXTPCommandBar*)m_pParent)->DelayRedraw();
  435. }
  436. void CXTPControl::DelayLayoutParent()
  437. {
  438. if (m_pParent) m_pParent->DelayLayout();
  439. }
  440. void CXTPControl::RedrawParent(BOOL bAnimate)
  441. {
  442. if (!IsVisible())
  443. return;
  444. if (m_pParent) m_pParent->Redraw(GetRect(), bAnimate);
  445. }
  446. void CXTPControl::ScreenToClient(CPoint* point)
  447. {
  448. ASSERT(m_pParent);
  449. if (m_pParent)
  450. ((CWnd*)m_pParent)->ScreenToClient(point);
  451. }
  452. BOOL CXTPControl::OnSetSelected(int bSelected)
  453. {
  454. if (bSelected == m_bSelected)
  455. return FALSE;
  456. if (IsKeyboardSelected(bSelected) && m_pParent->m_nPopuped != GetIndex())
  457. m_pParent->SetPopuped(-1);
  458. m_bSelected = bSelected;
  459. m_pParent->OnControlSelected(bSelected, this);
  460. if (GetEnabled() || IsKeyboardSelected(bSelected) || !bSelected)
  461. RedrawParent(!bSelected);
  462. return TRUE;
  463. }
  464. void CXTPControl::OnMouseHover()
  465. {
  466. if (m_pParent->SetPopuped(-1))
  467. {
  468. if (m_pParent->IsTrackingMode() == TRUE_POPUP && m_pParent->GetPosition() != xtpBarPopup)
  469. m_pParent->SetTrackingMode(FALSE);
  470. }
  471. }
  472. void CXTPControl::SetPrompt(LPCTSTR lpszPrompt)
  473. {
  474. if (lpszPrompt == NULL || lpszPrompt[0] == _T(''))
  475. return;
  476. if (_tcschr(lpszPrompt, _T('n')) != NULL)
  477. {
  478. AfxExtractSubString(m_strTooltipText, lpszPrompt, 1);
  479. AfxExtractSubString(m_strDescriptionText, lpszPrompt, 0);
  480. }
  481. else
  482. {
  483. m_strDescriptionText = m_strTooltipText = lpszPrompt;
  484. }
  485. if (m_strCaption.IsEmpty())
  486. {
  487. if (!AfxExtractSubString(m_strCaption, lpszPrompt, 2))
  488. {
  489. m_strCaption = m_strTooltipText;
  490. OnCaptionChanged();
  491. }
  492. }
  493. if (m_strKeyboardTip.IsEmpty())
  494. {
  495. AfxExtractSubString(m_strKeyboardTip, lpszPrompt, 3);
  496. }
  497. }
  498. void CXTPControl::SetID(int nId)
  499. {
  500. if (m_nId == nId)
  501. return;
  502. CString strPrompt;
  503. if (XTPResourceManager()->LoadString(&strPrompt, nId))
  504. {
  505. SetPrompt(strPrompt);
  506. }
  507. m_nId = nId;
  508. }
  509. void CXTPControl::OnActionChanged(int nProperty)
  510. {
  511. if (nProperty == 3)
  512. {
  513. OnCaptionChanged();
  514. }
  515. }
  516. void CXTPControl::SetCaption(UINT nIDCaption)
  517. {
  518. CString strCaption;
  519. if (strCaption.LoadString(nIDCaption))
  520. {
  521. SetCaption(strCaption);
  522. }
  523. }
  524. void CXTPControl::SetCaption(LPCTSTR lpszCaption)
  525. {
  526. CString strCaption(lpszCaption);
  527. BOOL bDelayLayout = FALSE;
  528. int nShortCutPos = strCaption.Find ('t');
  529. if (nShortCutPos != -1)
  530. {
  531. CString strShortcutTextAuto = strCaption.Mid(nShortCutPos + 1);
  532. if (m_strShortcutTextAuto != strShortcutTextAuto)
  533. {
  534. m_strShortcutTextAuto = strShortcutTextAuto;
  535. bDelayLayout = TRUE;
  536. }
  537. strCaption.ReleaseBuffer(nShortCutPos);
  538. }
  539. if (m_strCaption != strCaption)
  540. {
  541. m_strCaption = strCaption;
  542. OnCaptionChanged();
  543. bDelayLayout = TRUE;
  544. }
  545. if (bDelayLayout)
  546. {
  547. DelayLayoutParent();
  548. }
  549. }
  550. AFX_INLINE void NotifyExecute(CXTPControl* pControl, CWnd* pOwner)
  551. {
  552. NMXTPCONTROL tagNMCONTROL;
  553. if (pControl->NotifySite(pOwner, CBN_XTP_EXECUTE, &tagNMCONTROL) == 0)
  554. {
  555. pOwner->SendMessage(WM_COMMAND, pControl->GetID());
  556. }
  557. }
  558. //Click Helper
  559. void CXTPControl::ClickToolBarButton(CRect rcActiveRect)
  560. {
  561. #define XTP_TID_CLICKTICK 0x10AD
  562. if (rcActiveRect.IsRectEmpty())
  563. rcActiveRect = m_rcControl;
  564. m_pParent->SetPopuped(-1);
  565. m_pParent->SetSelected(m_nIndex);
  566. m_bPressed = TRUE;
  567. RedrawParent();
  568. InternalAddRef();
  569. BOOL bExecuteOnTimer = m_nExecuteOnPressInterval > 0;
  570. CWnd* pOwner = m_pParent->GetOwnerSite();
  571. m_pParent->SetCapture();
  572. HWND hWndCapture = m_pParent->GetSafeHwnd();
  573. CPoint pt(0, 0);
  574. BOOL bClick = FALSE;
  575. if (bExecuteOnTimer)
  576. {
  577. m_pParent->SetTimer(XTP_TID_CLICKTICK, m_nExecuteOnPressInterval, NULL);
  578. NotifyExecute(this, pOwner);
  579. }
  580. while (::GetCapture() == hWndCapture)
  581. {
  582. MSG msg;
  583. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  584. if (msg.message == WM_LBUTTONUP)
  585. {
  586. bClick = m_bSelected && ((!pt.x && !pt.y) || rcActiveRect.PtInRect(pt));
  587. break;
  588. }
  589. if (m_pParent == NULL)
  590. break;
  591. if (msg.message == WM_TIMER && msg.wParam == XTP_TID_CLICKTICK)
  592. {
  593. if (m_bSelected)
  594. {
  595. NotifyExecute(this, pOwner);
  596. }
  597. }
  598. if (msg.message == WM_MOUSEMOVE)
  599. {
  600. pt = CPoint(LOWORD(msg.lParam), HIWORD(msg.lParam));
  601. if (OnSetSelected(rcActiveRect.PtInRect(pt)))
  602. {
  603. RedrawParent();
  604. }
  605. continue;
  606. }
  607. DispatchMessage (&msg);
  608. }
  609. if (bExecuteOnTimer && m_pParent->GetSafeHwnd())
  610. {
  611. m_pParent->KillTimer(XTP_TID_CLICKTICK);
  612. }
  613. m_bPressed = bClick && !bExecuteOnTimer && NeedPressOnExecute() ? TRUE_KEYBOARD : FALSE;
  614. ReleaseCapture();
  615. if (m_bSelected && m_pParent)
  616. {
  617. m_pParent->SetSelected(-1);
  618. m_bSelected = FALSE;
  619. m_pParent->m_nClickedControl = GetIndex();
  620. }
  621. if (bClick && !bExecuteOnTimer)
  622. {
  623. OnExecute();
  624. if (m_bPressed)
  625. {
  626. m_bPressed = FALSE;
  627. RedrawParent();
  628. }
  629. }
  630. else
  631. {
  632. RedrawParent();
  633. }
  634. InternalRelease();
  635. }
  636. LRESULT CXTPControl::NotifySite(UINT code)
  637. {
  638. if (!m_pParent)
  639. return 0;
  640. NMXTPCONTROL tagNMCONTROL;
  641. return NotifySite(m_pParent->GetOwnerSite(), code, &tagNMCONTROL);
  642. }
  643. LRESULT CXTPControl::NotifySite(UINT code, NMXTPCONTROL* pNM)
  644. {
  645. if (!m_pParent)
  646. return 0;
  647. return NotifySite(m_pParent->GetOwnerSite(), code, pNM);
  648. }
  649. LRESULT CXTPControl::NotifySite(CWnd* pSite, UINT code, NMXTPCONTROL* pNM)
  650. {
  651. if (pSite == 0)
  652. {
  653. if (!m_pParent)
  654. return 0;
  655. pSite = m_pParent->GetOwnerSite();
  656. }
  657. pNM->hdr.code = code ;
  658. pNM->hdr.idFrom = GetID();
  659. pNM->hdr.hwndFrom = 0;
  660. pNM->pControl = this;
  661. LRESULT lResult = pSite->SendMessage(WM_XTP_COMMAND, GetID(), (LPARAM)pNM);
  662. if (lResult || !m_pParent)
  663. return lResult;
  664. AFX_NOTIFY notify;
  665. notify.pResult = &lResult;
  666. notify.pNMHDR = (NMHDR*)pNM;
  667. if (pSite->OnCmdMsg(GetID(), MAKELONG(code, WM_NOTIFY), &notify, NULL))
  668. {
  669. return lResult;
  670. }
  671. return 0;
  672. }
  673. BOOL CXTPControl::NeedPressOnExecute() const
  674. {
  675. if (m_pParent && m_pParent->GetPosition() == xtpBarPopup)
  676. return FALSE;
  677. return TRUE;
  678. }
  679. void CXTPControl::OnExecute()
  680. {
  681. XTPSoundManager()->PlaySystemSound(xtpSoundMenuCommand);
  682. m_bPressed = NeedPressOnExecute() ? TRUE_KEYBOARD : FALSE;
  683. CXTPCommandBar* pCommandBar = m_pParent->GetRootParent();
  684. BOOL bRecursePopup = pCommandBar->m_bRecursePopup;
  685. CWnd* pOwner = m_pParent->GetOwnerSite();
  686. CXTPCommandBars* pCommandBars = m_pParent->GetCommandBars();
  687. if (pCommandBars)
  688. {
  689. if (m_nId) pCommandBars->SetCommandUsed(m_nId);
  690. CXTPPopupBar* pPopupBar = DYNAMIC_DOWNCAST(CXTPPopupBar, m_pParent);
  691. if (pPopupBar && pPopupBar->GetControlPopup() && ((CXTPControl*)pPopupBar->GetControlPopup())->GetID())
  692. {
  693. pCommandBars->SetCommandUsed(((CXTPControl*)pPopupBar->GetControlPopup())->GetID());
  694. }
  695. }
  696. if (pCommandBar->m_pReturnCmd)
  697. {
  698. if (bRecursePopup)
  699. pCommandBar->OnTrackLost();
  700. else pCommandBars->ClosePopups();
  701. *pCommandBar->m_pReturnCmd = m_nId;
  702. return;
  703. }
  704. InternalAddRef();
  705. if (m_bCloseSubMenuOnClick)
  706. {
  707. if (bRecursePopup)
  708. pCommandBar->OnTrackLost();
  709. else if (pCommandBars)
  710. pCommandBars->ClosePopups();
  711. else
  712. XTPMouseManager()->SendTrackLost();
  713. }
  714. if (m_nId == 0)
  715. {
  716. InternalRelease();
  717. return;
  718. }
  719. NotifyExecute(this, pOwner);
  720. if ((!m_bCloseSubMenuOnClick || m_bPressed) && m_pParent)
  721. {
  722. m_bPressed = FALSE;
  723. m_pParent->OnIdleUpdateCmdUI(0, 0);
  724. RedrawParent();
  725. }
  726. InternalRelease();
  727. }
  728. BOOL CXTPControl::IsCursorOver() const
  729. {
  730. CPoint pt;
  731. GetCursorPos(&pt);
  732. m_pParent->ScreenToClient(&pt);
  733. return m_rcControl.PtInRect(pt);
  734. }
  735. void CXTPControl::Copy(CXTPControl* pControl, BOOL /*bRecursive*/)
  736. {
  737. m_nId = pControl->m_nId;
  738. SetAction(pControl->GetAction());
  739. m_nTag = pControl->m_nTag;
  740. m_dwFlags = pControl->m_dwFlags;
  741. m_controlType = pControl->m_controlType;
  742. m_strCaption = pControl->m_strCaption;
  743. m_strShortcutText = pControl->m_strShortcutText;
  744. m_strShortcutTextAuto = pControl->m_strShortcutTextAuto;
  745. m_strTooltipText = pControl->m_strTooltipText;
  746. m_strDescriptionText = pControl->m_strDescriptionText;
  747. m_strParameter = pControl->m_strParameter;
  748. m_strKeyboardTip = pControl->m_strKeyboardTip;
  749. m_nCustomIconId = pControl->m_nCustomIconId;
  750. m_nIconId = pControl->m_nIconId;
  751. m_nHelpId = pControl->m_nHelpId;
  752. m_bTemporary = pControl->m_bTemporary;
  753. m_strCustomCaption = pControl->m_strCustomCaption;
  754. m_strCategory = pControl->m_strCategory;
  755. m_dwHideFlags = pControl->m_dwHideFlags;
  756. m_bDefaultItem = pControl->m_bDefaultItem;
  757. m_bEnabled = pControl->m_bEnabled;
  758. m_bChecked = pControl->m_bChecked;
  759. m_buttonCustomStyle = pControl->m_buttonCustomStyle;
  760. m_buttonStyle = pControl->m_buttonStyle;
  761. m_nWidth = max(GetCustomizeMinWidth(), pControl->m_nWidth);
  762. m_nHeight = pControl->m_nHeight;
  763. m_szIcon = pControl->m_szIcon;
  764. m_bBeginGroup = pControl->m_bBeginGroup;
  765. m_bCloseSubMenuOnClick = pControl->m_bCloseSubMenuOnClick;
  766. m_nExecuteOnPressInterval = pControl->m_nExecuteOnPressInterval;
  767. m_mapDocTemplatesAssigned.Copy(pControl->m_mapDocTemplatesAssigned);
  768. m_mapDocTemplatesExcluded.Copy(pControl->m_mapDocTemplatesExcluded);
  769. OnCaptionChanged();
  770. }
  771. BOOL CXTPControl::Compare(CXTPControl* pOther)
  772. {
  773. if (GetStyle() != pOther->GetStyle())
  774. return FALSE;
  775. if (GetType() != pOther->GetType())
  776. return FALSE;
  777. if (GetID() != pOther->GetID())
  778. return FALSE;
  779. if (GetFlags() != pOther->GetFlags())
  780. return FALSE;
  781. if (GetBeginGroup() != pOther->GetBeginGroup())
  782. return FALSE;
  783. if (GetIconId() != pOther->GetIconId())
  784. return FALSE;
  785. if (m_strCaption != pOther->m_strCaption)
  786. return FALSE;
  787. if (m_strTooltipText != pOther->m_strTooltipText)
  788. return FALSE;
  789. if (m_strDescriptionText != pOther->m_strDescriptionText)
  790. return FALSE;
  791. if (m_strCustomCaption != pOther->m_strCustomCaption)
  792. return FALSE;
  793. if (m_buttonCustomStyle != pOther->m_buttonCustomStyle)
  794. return FALSE;
  795. if (m_strParameter != pOther->m_strParameter)
  796. return FALSE;
  797. if ((m_dwHideFlags & xtpHideCustomize) != (pOther->m_dwHideFlags & xtpHideCustomize))
  798. return FALSE;
  799. if (m_nWidth != pOther->m_nWidth)
  800. return FALSE;
  801. return TRUE;
  802. }
  803. IMPLEMENT_XTP_CONTROL(CXTPControl, CCmdTarget)
  804. BOOL CXTPControl::IsCustomizeMode() const
  805. {
  806. return m_pParent ? m_pParent->IsCustomizeMode() : FALSE;
  807. }
  808. void CXTPControl::OnInvertTracker(CDC* pDC, CRect rect)
  809. {
  810. ASSERT(!rect.IsRectEmpty());
  811. pDC->InvertRect(CRect(rect.left, rect.top, rect.right, rect.top + 2));
  812. pDC->InvertRect(CRect(rect.left, rect.bottom - 2, rect.right, rect.bottom));
  813. pDC->InvertRect(CRect(rect.left, rect.top + 2, rect.left + 2, rect.bottom - 2));
  814. pDC->InvertRect(CRect(rect.right - 2, rect.top + 2, rect.right, rect.bottom - 2));
  815. }
  816. void CXTPControl::OnCustomizeMouseMove(CPoint point)
  817. {
  818. if (IsCustomizeResizeAllow() && m_rcControl.PtInRect(point) && ((point.x - m_rcControl.left <= 2) || (m_rcControl.right - point.x <= 2)))
  819. {
  820. ::SetCursor(XTPResourceManager()->LoadCursor(XTP_IDC_VRESIZE));
  821. }
  822. }
  823. BOOL CXTPControl::CustomizeStartResize(CPoint point)
  824. {
  825. if (m_rcControl.PtInRect(point) && ((point.x - m_rcControl.left <= 2) || (m_rcControl.right - point.x <= 2)))
  826. {
  827. CXTPCommandBars* pCommandBars = m_pParent->GetCommandBars();
  828. ASSERT(pCommandBars);
  829. ASSERT(pCommandBars->m_pDragSelected == this);
  830. pCommandBars->m_pDragSelected = NULL;
  831. m_pParent->Redraw();
  832. m_pParent->UpdateWindow();
  833. CRect rectTracker = m_rcControl;
  834. m_pParent->ClientToScreen(rectTracker);
  835. m_pParent->SetCapture();
  836. ::SetCursor(XTPResourceManager()->LoadCursor(XTP_IDC_VRESIZE));
  837. CDC* pDC = 0;
  838. CWnd* pWnd = CWnd::GetDesktopWindow();
  839. if (pWnd->LockWindowUpdate())
  840. pDC = pWnd->GetDCEx(NULL, DCX_WINDOW | DCX_CACHE | DCX_LOCKWINDOWUPDATE);
  841. else
  842. pDC = pWnd->GetDCEx(NULL, DCX_WINDOW | DCX_CACHE);
  843. OnInvertTracker(pDC, rectTracker);
  844. int nMinWidth = GetCustomizeMinWidth();
  845. BOOL bLeftAnchor = (point.x - m_rcControl.left <= 2);
  846. LONG& lTrackerAnchor = bLeftAnchor ? rectTracker.left : rectTracker.right;
  847. int nOffset = bLeftAnchor ? m_rcControl.left - point.x : m_rcControl.right - point.x;
  848. BOOL bAccept = FALSE;
  849. while (CWnd::GetCapture() == m_pParent)
  850. {
  851. MSG msg;
  852. if (!GetMessage(&msg, NULL, 0, 0))
  853. break;
  854. if (msg.message == WM_MOUSEMOVE)
  855. {
  856. point = CPoint(msg.lParam);
  857. m_pParent->ClientToScreen(&point);
  858. point.x += nOffset;
  859. point.x = bLeftAnchor ? min(point.x, rectTracker.right - nMinWidth) :
  860. max(point.x, rectTracker.left + nMinWidth);
  861. if (lTrackerAnchor != point.x)
  862. {
  863. OnInvertTracker(pDC, rectTracker);
  864. lTrackerAnchor = point.x;
  865. OnInvertTracker(pDC, rectTracker);
  866. }
  867. }
  868. else if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE) break;
  869. else if (msg.message == WM_LBUTTONUP)
  870. {
  871. bAccept = TRUE;
  872. break;
  873. }
  874. else  ::DispatchMessage(&msg);
  875. }
  876. OnInvertTracker(pDC, rectTracker);
  877. if (CWnd::GetCapture() == m_pParent) ReleaseCapture();
  878. pWnd->UnlockWindowUpdate();
  879. if (pDC != NULL)
  880. {
  881. pWnd->ReleaseDC(pDC);
  882. pDC = NULL;
  883. }
  884. pCommandBars->m_pDragSelected = this;
  885. int nWidth = rectTracker.Width();
  886. if (bAccept && rectTracker.Width() != m_rcControl.Width())
  887. {
  888. if (GetParent()->GetType() == xtpBarTypePopup)
  889. nWidth -= GetPaintManager()->GetPopupBarGripperWidth(GetParent());
  890. SetWidth(nWidth);
  891. m_pParent->OnRecalcLayout();
  892. }
  893. m_pParent->Redraw();
  894. return TRUE;
  895. }
  896. return FALSE;
  897. }
  898. void CXTPControl::CustomizeStartDrag(CPoint pt)
  899. {
  900. ASSERT(m_pParent);
  901. if (!m_pParent)
  902. return;
  903. CXTPCommandBars* pCommandBars = m_pParent->GetCommandBars();
  904. ASSERT(pCommandBars);
  905. if (!pCommandBars)
  906. return;
  907. if ((pCommandBars->m_pDragSelected == this) && IsCustomizeResizeAllow() &&
  908. CustomizeStartResize(pt))
  909. {
  910. return;
  911. }
  912. pCommandBars->SetDragControl(this);
  913. CXTPCustomizeDropSource* pDropSource = pCommandBars->GetDropSource();
  914. DROPEFFECT dropEffect = pDropSource->DoDragDrop(this);
  915. if (dropEffect == DROPEFFECT_NONE || dropEffect == DROPEFFECT_MOVE)
  916. {
  917. CXTPCommandBar* pParent = m_pParent;
  918. pParent->SetPopuped(-1);
  919. pParent->SetSelected(-1);
  920. if (pCommandBars->GetDragControl() == this)
  921. pCommandBars->SetDragControl(NULL);
  922. if (GetBeginGroup() && m_nIndex < m_pControls->GetCount() - 1)
  923. m_pControls->GetAt(m_nIndex + 1)->SetBeginGroup(TRUE);
  924. if (m_nIndex == 0 && m_pControls->GetCount() > 1)
  925. m_pControls->GetAt(1)->SetBeginGroup(FALSE);
  926. m_pControls->Remove(this);
  927. pParent->OnRecalcLayout();
  928. }
  929. pCommandBars->SetDragControl(pCommandBars->GetDragControl());
  930. }
  931. void CXTPControl::OnCustomizeDragOver(CXTPControl* /*pDataObject*/, CPoint /*point*/, DROPEFFECT& /*dropEffect*/)
  932. {
  933. m_pParent->SetPopuped(-1);
  934. m_pParent->SetSelected(-1);
  935. }
  936. BOOL CXTPControl::IsCustomizeDragOverAvail(CXTPCommandBar* /*pCommandBar*/, CPoint /*point*/, DROPEFFECT& /*dropEffect*/)
  937. {
  938. return TRUE;
  939. }
  940. BOOL CXTPControl::IsCustomizeResizeAllow() const
  941. {
  942. return FALSE;
  943. }
  944. CXTPImageManager* CXTPControl::GetImageManager() const
  945. {
  946. if (m_pParent)
  947. return m_pParent->GetImageManager();
  948. if (m_pControls)
  949. {
  950. CXTPCommandBars* pCommandBars = m_pControls->GetCommandBars();
  951. if (pCommandBars)
  952. return pCommandBars->GetImageManager();
  953. }
  954. return XTPImageManager();
  955. }
  956. CXTPPaintManager* CXTPControl::GetPaintManager() const
  957. {
  958. if (m_pParent)
  959. return m_pParent->GetPaintManager();
  960. if (m_pControls)
  961. {
  962. CXTPCommandBars* pCommandBars = m_pControls->GetCommandBars();
  963. if (pCommandBars)
  964. return pCommandBars->GetPaintManager();
  965. }
  966. return XTPPaintManager();
  967. }
  968. CXTPImageManagerIcon* CXTPControl::GetImage(int nWidth) const
  969. {
  970. if (GetIconId() != 0)
  971. return GetImageManager()->GetImage(GetIconId(), nWidth);
  972. return NULL;
  973. }
  974. void CXTPControl::SetExpanded(BOOL bExpanded)
  975. {
  976. m_bExpanded = bExpanded;
  977. if (!bExpanded) SetHideFlags(GetHideFlags() & ~xtpHideExpand);
  978. }
  979. BOOL CXTPControl::IsItemDefault() const
  980. {
  981. return m_bDefaultItem;
  982. }
  983. void CXTPControl::SetItemDefault(BOOL bDefault)
  984. {
  985. if (bDefault != m_bDefaultItem)
  986. {
  987. m_bDefaultItem = bDefault;
  988. DelayLayoutParent();
  989. }
  990. }
  991. void CXTPControl::SetFlags(DWORD dwFlags)
  992. {
  993. m_dwFlags = dwFlags;
  994. }
  995. DWORD CXTPControl::GetFlags() const
  996. {
  997. return m_dwFlags;
  998. }
  999. BOOL CXTPControl::IsCustomizeMovable() const
  1000. {
  1001. if (m_pParent && m_pParent->IsCustomizable() && ((GetFlags() & xtpFlagNoMovable) == 0))
  1002. return TRUE;
  1003. if (!m_pParent)
  1004. return FALSE;
  1005. CXTPCommandBars* pCommandBars = m_pParent->GetCommandBars();
  1006. if (pCommandBars && pCommandBars->m_bDesignerMode)
  1007. return TRUE;
  1008. return FALSE;
  1009. }
  1010. void CXTPControl::CDocTemplateMap::Copy(CDocTemplateMap& map)
  1011. {
  1012. RemoveAll();
  1013. UINT nIDResource;
  1014. BOOL bValue;
  1015. POSITION pos = map.GetStartPosition();
  1016. while (pos)
  1017. {
  1018. map.GetNextAssoc(pos, nIDResource, bValue);
  1019. SetAt(nIDResource, bValue);
  1020. }
  1021. }
  1022. CXTPControl* CXTPControl::FromUI(CCmdUI* pCmdUI)
  1023. {
  1024. CXTPCommandBar* pCommandBar = DYNAMIC_DOWNCAST(CXTPCommandBar, pCmdUI->m_pOther);
  1025. if (!pCommandBar)
  1026. return NULL;
  1027. CXTPControls* pControls = pCommandBar->GetControls();
  1028. if ((int)pCmdUI->m_nIndex < pControls->GetCount())
  1029. return pControls->GetAt(pCmdUI->m_nIndex);
  1030. return NULL;
  1031. }
  1032. BOOL CXTPControl::OnLButtonDblClk(CPoint point)
  1033. {
  1034. OnClick(FALSE, point);
  1035. return TRUE;
  1036. }
  1037. void CXTPControl::Reset()
  1038. {
  1039. if (m_nCustomIconId != 0 || !m_strCustomCaption.IsEmpty() || m_buttonCustomStyle != xtpButtonUndefined)
  1040. {
  1041. m_nCustomIconId = 0;
  1042. m_buttonCustomStyle = xtpButtonUndefined;
  1043. if (!m_strCustomCaption.IsEmpty())
  1044. {
  1045. m_strCustomCaption = _T("");
  1046. OnCaptionChanged();
  1047. }
  1048. GetParent()->OnRecalcLayout();
  1049. }
  1050. }
  1051. void CXTPControl::SetCustomIcon(HICON hIcon)
  1052. {
  1053. CXTPImageManager* pImageManager = GetImageManager();
  1054. if (pImageManager)
  1055. {
  1056. m_nCustomIconId = pImageManager->AddCustomIcon(hIcon);
  1057. }
  1058. }
  1059. CSize CXTPControl::GetButtonSize() const
  1060. {
  1061. return m_pParent->GetButtonSize();
  1062. }
  1063. CSize CXTPControl::GetIconSize() const
  1064. {
  1065. if (m_szIcon != CSize(0, 0))
  1066. return m_szIcon;
  1067. return m_pParent->GetIconSize();
  1068. }
  1069. #ifndef _XTP_INCLUDE_RIBBON
  1070. BOOL CXTPControl::HasDwmCompositedRect() const
  1071. {
  1072. return FALSE;
  1073. }
  1074. #endif
  1075. void CXTPControl::OnUnderlineActivate()
  1076. {
  1077. OnExecute();
  1078. }
  1079. BOOL CXTPControl::IsCaptionVisible() const
  1080. {
  1081. if (GetParent()->GetType() == xtpBarTypePopup)
  1082. return TRUE;
  1083. if (GetCaption().IsEmpty())
  1084. return FALSE;
  1085. XTPButtonStyle buttonStyle = GetStyle();
  1086. if ((buttonStyle == xtpButtonCaption) || (buttonStyle == xtpButtonIconAndCaption) || (buttonStyle == xtpButtonIconAndCaptionBelow))
  1087. return TRUE;
  1088. if (buttonStyle == xtpButtonIcon)
  1089. return FALSE;
  1090. switch (GetType())
  1091. {
  1092. case xtpControlPopup:
  1093. case xtpControlLabel:
  1094. case xtpControlCheckBox:
  1095. case xtpControlRadioButton:
  1096. return TRUE;
  1097. case xtpControlButton:
  1098. case xtpControlButtonPopup:
  1099. case xtpControlSplitButtonPopup:
  1100. CXTPImageManagerIcon* pImage = GetImage(0);
  1101. return pImage == NULL;
  1102. }
  1103. return FALSE;
  1104. }
  1105. CCmdTarget* CXTPControl::GetAccessible()
  1106. {
  1107. return this;
  1108. }
  1109. HRESULT CXTPControl::GetAccessibleParent(IDispatch* FAR* ppdispParent)
  1110. {
  1111. SAFE_MANAGE_STATE(m_pModuleState);
  1112. *ppdispParent = NULL;
  1113. if (m_pParent)
  1114. {
  1115. *ppdispParent = m_pParent->GetIDispatch(TRUE);
  1116. return S_OK;
  1117. }
  1118. return E_FAIL;
  1119. }
  1120. HRESULT CXTPControl::GetAccessibleChildCount(long FAR* pChildCount)
  1121. {
  1122. if (pChildCount == 0)
  1123. return E_INVALIDARG;
  1124. *pChildCount = GetCommandBar() ? 1 : 0;
  1125. return S_OK;
  1126. }
  1127. HRESULT CXTPControl::GetAccessibleChild(VARIANT varChild, IDispatch* FAR* ppdispChild)
  1128. {
  1129. SAFE_MANAGE_STATE(m_pModuleState);
  1130. *ppdispChild = NULL;
  1131. if (GetChildIndex(&varChild) == 1)
  1132. {
  1133. CXTPCommandBar* pCommandBar = GetCommandBar();
  1134. if (pCommandBar)
  1135. {
  1136. *ppdispChild = pCommandBar->GetIDispatch(TRUE);
  1137. }
  1138. }
  1139. return S_OK;
  1140. }
  1141. HRESULT CXTPControl::GetAccessibleName(VARIANT varChild, BSTR* pszName)
  1142. {
  1143. SAFE_MANAGE_STATE(m_pModuleState);
  1144. if (GetChildIndex(&varChild) != CHILDID_SELF)
  1145. return E_INVALIDARG;
  1146. CString strCaption = GetCaption();
  1147. CXTPPaintManager::StripMnemonics(strCaption);
  1148. if (!GetShortcutText().IsEmpty())
  1149. strCaption = strCaption + _T('t') + GetShortcutText();
  1150. if (strCaption.IsEmpty())
  1151. {
  1152. strCaption = GetTooltip();
  1153. }
  1154. *pszName = strCaption.AllocSysString();
  1155. return S_OK;
  1156. }
  1157. HRESULT CXTPControl::GetAccessibleDescription(VARIANT varChild, BSTR* pszDescription)
  1158. {
  1159. if (GetChildIndex(&varChild) != CHILDID_SELF)
  1160. return E_INVALIDARG;
  1161. *pszDescription = GetDescription().AllocSysString();
  1162. return S_OK;
  1163. }
  1164. HRESULT CXTPControl::GetAccessibleRole(VARIANT varChild, VARIANT* pvarRole)
  1165. {
  1166. pvarRole->vt = VT_EMPTY;
  1167. if (m_pParent && m_pParent->GetSafeHwnd() && GetChildIndex(&varChild) == CHILDID_SELF)
  1168. {
  1169. pvarRole->vt = VT_I4;
  1170. pvarRole->lVal = m_pParent->GetType() == xtpBarTypeNormal || m_pParent->GetType() == xtpBarTypeRibbon ?
  1171. GetCommandBar() ? ROLE_SYSTEM_BUTTONMENU: ROLE_SYSTEM_PUSHBUTTON : ROLE_SYSTEM_MENUITEM;
  1172. return S_OK;
  1173. }
  1174. return E_INVALIDARG;
  1175. }
  1176. HRESULT CXTPControl::AccessibleSelect(long /*flagsSelect*/, VARIANT varChild)
  1177. {
  1178. SAFE_MANAGE_STATE(m_pModuleState);
  1179. if (GetChildIndex(&varChild) != CHILDID_SELF)
  1180. return E_INVALIDARG;
  1181. if (m_pParent && m_pParent->GetSafeHwnd())
  1182. {
  1183. m_pParent->SetTrackingMode(TRUE, FALSE);
  1184. m_pParent->SetSelected(m_nIndex, TRUE);
  1185. }
  1186. return S_OK;
  1187. }
  1188. #ifndef STATE_SYSTEM_HASPOPUP
  1189. #define STATE_SYSTEM_HASPOPUP   (0x40000000)
  1190. #endif //STATE_SYSTEM_HASPOPUP
  1191. HRESULT CXTPControl::GetAccessibleState(VARIANT varChild, VARIANT* pvarState)
  1192. {
  1193. if (GetChildIndex(&varChild) != CHILDID_SELF)
  1194. return E_INVALIDARG;
  1195. pvarState->vt = VT_I4;
  1196. pvarState->lVal = STATE_SYSTEM_FOCUSABLE |
  1197. (m_bSelected ? STATE_SYSTEM_FOCUSED | STATE_SYSTEM_SELECTED | STATE_SYSTEM_HOTTRACKED : 0);
  1198. if (!m_pParent->IsVisible() || !IsVisible())
  1199. pvarState->lVal |= STATE_SYSTEM_INVISIBLE;
  1200. if (!GetEnabled())
  1201. pvarState->lVal |= STATE_SYSTEM_UNAVAILABLE;
  1202. if (GetChecked())
  1203. pvarState->lVal |= STATE_SYSTEM_CHECKED;
  1204. if (GetPressed())
  1205. pvarState->lVal |= STATE_SYSTEM_PRESSED;
  1206. if (GetCommandBar())
  1207. pvarState->lVal |= STATE_SYSTEM_HASPOPUP;
  1208. return S_OK;
  1209. }
  1210. HRESULT CXTPControl::GetAccessibleDefaultAction(VARIANT varChild, BSTR* pszDefaultAction)
  1211. {
  1212. if (GetChildIndex(&varChild) != CHILDID_SELF)
  1213. return E_INVALIDARG;
  1214. *pszDefaultAction = SysAllocString(L"Click");
  1215. return S_OK;
  1216. }
  1217. HRESULT CXTPControl::AccessibleDoDefaultAction(VARIANT varChild)
  1218. {
  1219. SAFE_MANAGE_STATE(m_pModuleState);
  1220. if (GetChildIndex(&varChild) != CHILDID_SELF)
  1221. return E_INVALIDARG;
  1222. OnClick(TRUE);
  1223. return S_OK;
  1224. }
  1225. HRESULT CXTPControl::AccessibleLocation(long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varChild)
  1226. {
  1227. *pxLeft = *pyTop = *pcxWidth = *pcyHeight = 0;
  1228. if (GetChildIndex(&varChild) != CHILDID_SELF)
  1229. return E_INVALIDARG;
  1230. if (!m_pParent->GetSafeHwnd())
  1231. return S_OK;
  1232. if (!IsVisible())
  1233. return S_OK;
  1234. CRect rcControl = GetRect();
  1235. m_pParent->ClientToScreen(&rcControl);
  1236. *pxLeft = rcControl.left;
  1237. *pyTop = rcControl.top;
  1238. *pcxWidth = rcControl.Width();
  1239. *pcyHeight = rcControl.Height();
  1240. return S_OK;
  1241. }
  1242. HRESULT CXTPControl::AccessibleHitTest(long xLeft, long yTop, VARIANT* pvarID)
  1243. {
  1244. if (pvarID == NULL)
  1245. return E_INVALIDARG;
  1246. pvarID->vt = VT_EMPTY;
  1247. if (!m_pParent->GetSafeHwnd())
  1248. return S_FALSE;
  1249. if (!CXTPWindowRect(m_pParent).PtInRect(CPoint(xLeft, yTop)))
  1250. return S_FALSE;
  1251. pvarID->vt = VT_I4;
  1252. pvarID->lVal = 0;
  1253. CPoint pt(xLeft, yTop);
  1254. m_pParent->ScreenToClient(&pt);
  1255. if (!GetRect().PtInRect(pt))
  1256. return S_FALSE;
  1257. return S_OK;
  1258. }
  1259. void CXTPControl::SetVisible(BOOL bVisible)
  1260. {
  1261. DWORD dwHideFlags = m_dwHideFlags;
  1262. if (!bVisible) SetHideFlags(m_dwHideFlags | xtpHideGeneric); else SetHideFlags(m_dwHideFlags & ~xtpHideGeneric);
  1263. if (dwHideFlags != m_dwHideFlags) DelayLayoutParent();
  1264. }
  1265. BEGIN_INTERFACE_MAP(CXTPControl, CCmdTarget)
  1266. INTERFACE_PART(CXTPControl, IID_IAccessible, ExternalAccessible)
  1267. END_INTERFACE_MAP()