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

对话框与窗口

开发平台:

Visual C++

  1. // XTPShortcutBarItem.cpp : implementation of the CXTPShortcutBar class.
  2. //
  3. // This file is a part of the XTREME SHORTCUTBAR 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/XTPDrawHelpers.h"
  25. #include "Common/XTPToolTipContext.h"
  26. #include "Common/XTPImageManager.h"
  27. #include "Common/XTPSystemHelpers.h"
  28. #ifdef _XTP_INCLUDE_COMMANDBARS
  29. #include "CommandBars/Resource.h"
  30. #include "CommandBars/XTPToolBar.h"
  31. #include "CommandBars/XTPCommandBars.h"
  32. #include "CommandBars/XTPPopupBar.h"
  33. #include "CommandBars/XTPControls.h"
  34. #include "CommandBars/XTPControlButton.h"
  35. #include "CommandBars/XTPControlPopup.h"
  36. #include "CommandBars/XTPMouseManager.h"
  37. #endif
  38. #include "XTPShortcutBarPane.h"
  39. #include "XTPShortcutBar.h"
  40. #ifdef _DEBUG
  41. #define new DEBUG_NEW
  42. #undef THIS_FILE
  43. static char THIS_FILE[] = __FILE__;
  44. #endif
  45. #define XTP_ID_SHORTCUT_SELECTED 8000
  46. #define XTP_ID_SHORTCUT_CUSTOMIZE 8001
  47. CXTPShortcutBarItem::CXTPShortcutBarItem(CXTPShortcutBar* pShortcutBar, UINT nID, CWnd* pWnd)
  48. {
  49. CString strCaption;
  50. if (strCaption.LoadString(nID))
  51. {
  52. m_strCaption = m_strTooltip = strCaption;
  53. int nShortCutPos = strCaption.Find ('n');
  54. if (nShortCutPos != -1)
  55. {
  56. m_strTooltip = strCaption.Mid(nShortCutPos + 1);
  57. m_strCaption = strCaption.Left (nShortCutPos);
  58. }
  59. }
  60. m_pShortcutBar = pShortcutBar;
  61. m_bVisible = TRUE;
  62. m_rcItem.SetRectEmpty();
  63. m_hwndChild = pWnd->GetSafeHwnd();
  64. m_nID = nID;
  65. m_bExpandButton = FALSE;
  66. m_dwData = 0;
  67. m_bSelected = FALSE;
  68. m_nIconId = -1;
  69. m_bExpanded = FALSE;
  70. m_bHidden = FALSE;
  71. EnableAutomation();
  72. }
  73. CXTPShortcutBarItem::CXTPShortcutBarItem(CXTPShortcutBar* pShortcutBar)
  74. {
  75. m_pShortcutBar = pShortcutBar;
  76. m_bExpandButton = TRUE;
  77. m_nID = -1;
  78. m_nIconId = -1;
  79. XTPResourceManager()->LoadString(&m_strCaption, XTP_IDS_SHORTCUT_CONFIGURE);
  80. m_strTooltip = m_strCaption;
  81. m_hwndChild = NULL;
  82. m_bVisible = TRUE;
  83. m_bExpanded = FALSE;
  84. m_bHidden = FALSE;
  85. m_dwData = 0;
  86. m_bSelected = FALSE;
  87. EnableAutomation();
  88. }
  89. CXTPImageManagerIcon* CXTPShortcutBarItem::GetImage(int nWidth) const
  90. {
  91. return m_pShortcutBar->GetImageManager()->GetImage(GetIconId(), nWidth);
  92. }
  93. void CXTPShortcutBarItem::SetClientWindow(CWnd* pWnd)
  94. {
  95. if (m_hwndChild)
  96. {
  97. ::ShowWindow(m_hwndChild, SW_HIDE);
  98. }
  99. m_hwndChild = pWnd->GetSafeHwnd();
  100. m_pShortcutBar->Reposition();
  101. }
  102. void CXTPShortcutBarItem::SetCaption(LPCTSTR strCaption)
  103. {
  104. if (m_strCaption != strCaption)
  105. {
  106. m_strCaption = strCaption;
  107. m_pShortcutBar->RedrawControl();
  108. }
  109. }
  110. int CXTPShortcutBarItem::GetIconId() const
  111. {
  112. return m_nIconId <= 0 ? m_nID: m_nIconId;
  113. }
  114. void CXTPShortcutBarItem::SetIconId(int nId)
  115. {
  116. if (m_nIconId != nId)
  117. {
  118. m_nIconId = nId;
  119. m_pShortcutBar->RedrawControl();
  120. }
  121. }
  122. void CXTPShortcutBarItem::SetTooltip(LPCTSTR strTooltip)
  123. {
  124. m_strTooltip = strTooltip;
  125. m_pShortcutBar->Reposition();
  126. }
  127. void CXTPShortcutBarItem::SetID(int nID)
  128. {
  129. m_nID = nID;
  130. }
  131. int CXTPShortcutBarItem::GetID() const
  132. {
  133. return m_nID;
  134. }
  135. BOOL CXTPShortcutBarItem::IsSelected() const
  136. {
  137. if (m_pShortcutBar->IsSingleSelection())
  138. return m_pShortcutBar->GetSelectedItem() == this;
  139. return m_bSelected;
  140. }
  141. void CXTPShortcutBarItem::SetSelected(BOOL bSelected)
  142. {
  143. if (m_pShortcutBar->IsSingleSelection())
  144. {
  145. if (bSelected)
  146. {
  147. m_pShortcutBar->SelectItem(this);
  148. }
  149. }
  150. else
  151. {
  152. m_bSelected = bSelected;
  153. m_pShortcutBar->RedrawControl();
  154. }
  155. }
  156. void CXTPShortcutBarItem::SetVisible(BOOL bVisible)
  157. {
  158. if (m_bVisible != bVisible)
  159. {
  160. m_bVisible = bVisible;
  161. m_pShortcutBar->Reposition();
  162. }
  163. }
  164. BOOL CXTPShortcutBarItem::IsVisible() const
  165. {
  166. return m_bVisible;
  167. }
  168. BOOL CXTPShortcutBarItem::IsHidden() const
  169. {
  170. return m_bHidden;
  171. }
  172. /////////////////////////////////////////////////////////////////////////////
  173. // CXTPShortcutBar
  174. CXTPShortcutBar::CXTPShortcutBar()
  175. {
  176. m_pPaintManager = new CXTPShortcutBarOffice2003Theme;
  177. m_pPaintManager->RefreshMetrics();
  178. m_paintTheme = xtpShortcutThemeOffice2003;
  179. m_nExpandedLines = 1;
  180. m_nDesiredExpandedLinesHeight = 0;
  181. m_szItem = CSize(22, 32);
  182. m_rcClient.SetRectEmpty();
  183. // Add expand button
  184. m_arrItems.Add(new CXTPShortcutBarItem(this));
  185. m_hSizeCursor = AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(IDC_SIZENS));
  186. m_bTrackingSize = FALSE;
  187. m_pPressedItem = m_pSelectedItem = m_pHotItem = NULL;
  188. m_hwndClient = NULL;
  189. m_nMinClientHeight = 200;
  190. m_bAllowResize = TRUE;
  191. m_bClientPaneVisible = TRUE;
  192. m_pImageManager = NULL;
  193. m_bSingleSelection = TRUE;
  194. m_bShowActiveItemOnTop = FALSE;
  195. m_bAllowFreeResize = FALSE;
  196. m_bAllowCollapse = TRUE;
  197. m_bShowGripper = TRUE;
  198. m_hHandCursor = AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649));
  199. if (m_hHandCursor == 0)
  200. m_hHandCursor = XTPResourceManager()->LoadCursor(XTP_IDC_HAND);
  201. m_pToolTipContext = new CXTPToolTipContext;
  202. m_bPreSubclassWindow = TRUE;
  203. RegisterWindowClass();
  204. }
  205. CXTPShortcutBar::~CXTPShortcutBar()
  206. {
  207. CMDTARGET_RELEASE(m_pPaintManager);
  208. for (int i = 0; i < m_arrItems.GetSize(); i++)
  209. {
  210. m_arrItems[i]->InternalRelease();
  211. }
  212. CMDTARGET_RELEASE(m_pImageManager);
  213. CMDTARGET_RELEASE(m_pToolTipContext);
  214. }
  215. BOOL CXTPShortcutBar::RegisterWindowClass(HINSTANCE hInstance /*= NULL*/)
  216. {
  217. return XTPDrawHelpers()->RegisterWndClass(hInstance, _T("XTPShortcutBar"), 0);
  218. }
  219. void CXTPShortcutBar::RedrawControl()
  220. {
  221. if (GetSafeHwnd()) Invalidate(FALSE);
  222. }
  223. void CXTPShortcutBar::ShowExpandButton(BOOL bShow)
  224. {
  225. ASSERT(GetItemCount() > 0);
  226. ASSERT(GetItem(GetItemCount() - 1)->IsItemExpandButton());
  227. if (GetItemCount() > 0)
  228. {
  229. GetItem(GetItemCount() - 1)->SetVisible(bShow);
  230. Reposition();
  231. }
  232. }
  233. BOOL CXTPShortcutBar::IsExpandButtonVisible() const
  234. {
  235. ASSERT(GetItemCount() > 0);
  236. ASSERT(GetItem(GetItemCount() - 1)->IsItemExpandButton());
  237. return GetItemCount() > 0 && GetItem(GetItemCount() - 1)->IsVisible();
  238. }
  239. CXTPImageManager* CXTPShortcutBar::GetImageManager() const
  240. {
  241. return m_pImageManager ? m_pImageManager : XTPImageManager();
  242. }
  243. void CXTPShortcutBar::SetImageManager(CXTPImageManager* pImageManager)
  244. {
  245. if (m_pImageManager)
  246. m_pImageManager->InternalRelease();
  247. m_pImageManager = pImageManager;
  248. Reposition();
  249. }
  250. BOOL CXTPShortcutBar::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
  251. {
  252. if (!CreateEx(WS_EX_STATICEDGE, _T("XTPShortcutBar"),
  253. NULL, dwStyle, rect, pParentWnd, nID))
  254. {
  255. return FALSE;
  256. }
  257. return TRUE;
  258. }
  259. BOOL CXTPShortcutBar::PreCreateWindow(CREATESTRUCT& cs)
  260. {
  261. if (!CWnd::PreCreateWindow(cs))
  262. return FALSE;
  263. //
  264. // PreCreateWindow is called when a control is dynamically
  265. // created. We want to set m_bPreSubclassWindow to FALSE
  266. // here so the control is initialized from CWnd::Create and
  267. // not CWnd::PreSubclassWindow.
  268. //
  269. m_bPreSubclassWindow = FALSE;
  270. return TRUE;
  271. }
  272. void CXTPShortcutBar::PreSubclassWindow()
  273. {
  274. CWnd::PreSubclassWindow();
  275. if (m_bPreSubclassWindow) Reposition();
  276. }
  277. void CXTPShortcutBar::SetTheme(XTPShortcutBarPaintTheme paintTheme)
  278. {
  279. CMDTARGET_RELEASE(m_pPaintManager);
  280. if (paintTheme == xtpShortcutThemeOfficeXP) m_pPaintManager = new CXTPShortcutBarOfficeXPTheme();
  281. else if (paintTheme == xtpShortcutThemeOffice2003) m_pPaintManager = new CXTPShortcutBarOffice2003Theme();
  282. else if (paintTheme == xtpShortcutThemeOffice2007) m_pPaintManager = new CXTPShortcutBarOffice2007Theme();
  283. else m_pPaintManager = new CXTPShortcutBarOffice2000Theme();
  284. m_paintTheme = paintTheme;
  285. m_pPaintManager->RefreshMetrics();
  286. if (m_hWnd)
  287. {
  288. Reposition();
  289. RedrawWindow(0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN | RDW_FRAME);
  290. }
  291. }
  292. void CXTPShortcutBar::SetCustomTheme(CXTPShortcutBarPaintManager* pPaintManager)
  293. {
  294. if (!pPaintManager)
  295. return;
  296. CMDTARGET_RELEASE(m_pPaintManager);
  297. m_pPaintManager = pPaintManager;
  298. m_pPaintManager->RefreshMetrics();
  299. Reposition();
  300. RedrawWindow(0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
  301. }
  302. void CXTPShortcutBar::SetExpandedLinesCount(int nLinesCount)
  303. {
  304. m_nDesiredExpandedLinesHeight = nLinesCount * m_szItem.cy;
  305. Reposition();
  306. }
  307. void CXTPShortcutBar::SetExpandedLinesHeight(int nHeight)
  308. {
  309. m_nDesiredExpandedLinesHeight = nHeight;
  310. Reposition();
  311. }
  312. CXTPShortcutBarItem* CXTPShortcutBar::AddItem(UINT nID, CWnd* pWnd)
  313. {
  314. CXTPShortcutBarItem* pItem = new CXTPShortcutBarItem(this, nID, pWnd);
  315. m_arrItems.InsertAt(m_arrItems.GetSize() - 1, pItem);
  316. Reposition();
  317. return pItem;
  318. }
  319. int CXTPShortcutBar::GetVisibleItemsCount() const
  320. {
  321. int nCount = 0;
  322. for (int i = 0; i < m_arrItems.GetSize(); i++)
  323. {
  324. if (m_arrItems[i]->m_bVisible) nCount++;
  325. }
  326. return nCount;
  327. }
  328. int CXTPShortcutBar::GetCollapsedItemsCount() const
  329. {
  330. int nCount = 0;
  331. for (int i = 0; i < m_arrItems.GetSize(); i++)
  332. {
  333. if (m_arrItems[i]->m_bVisible && !m_arrItems[i]->m_bHidden && !m_arrItems[i]->m_bExpanded)
  334. nCount++;
  335. }
  336. return nCount;
  337. }
  338. void CXTPShortcutBar::Reposition()
  339. {
  340. if (!m_hWnd)
  341. return;
  342. static BOOL bReposition = FALSE;
  343. if (bReposition)
  344. return;
  345. bReposition = TRUE;
  346. CXTPClientRect rcShortcutBar(this);
  347. int nWidth = rcShortcutBar.Width();
  348. int nHeight = rcShortcutBar.Height();
  349. int nGripperHeight = m_bShowGripper ? m_pPaintManager->DrawGripper(NULL, this, FALSE) : 0;
  350. for (int nItem = 0; nItem < m_arrItems.GetSize(); nItem++)
  351. m_arrItems[nItem]->m_bHidden = FALSE;
  352. int nVisibleItemsCount = GetVisibleItemsCount();
  353. BOOL bShowActiveItemOnTop = m_bShowActiveItemOnTop && m_bClientPaneVisible;
  354. int nExpandedItem = 0;
  355. if (!m_bClientPaneVisible)
  356. {
  357. m_nExpandedLines = nVisibleItemsCount;
  358. nGripperHeight = 0;
  359. m_rcGripper.SetRectEmpty();
  360. m_rcClient.SetRectEmpty();
  361. nHeight = min(nHeight, m_nExpandedLines * m_szItem.cy);
  362. if (nHeight - m_nExpandedLines * m_szItem.cy < 0)
  363. {
  364. m_nExpandedLines = nHeight/ m_szItem.cy;
  365. nHeight = m_nExpandedLines * m_szItem.cy;
  366. }
  367. nHeight--;
  368. }
  369. else
  370. {
  371. int nTopItemHeight = 0;
  372. if (bShowActiveItemOnTop)
  373. {
  374. for (; nExpandedItem < m_arrItems.GetSize(); nExpandedItem++)
  375. {
  376. CXTPShortcutBarItem* pItem = GetItem(nExpandedItem);
  377. if (!pItem->m_bVisible)
  378. continue;
  379. pItem->m_bExpanded = TRUE;
  380. pItem->m_rcItem.SetRect(0, nTopItemHeight, nWidth, nTopItemHeight + m_szItem.cy);
  381. nVisibleItemsCount--;
  382. nTopItemHeight += m_szItem.cy;
  383. if (m_pSelectedItem == pItem)
  384. break;
  385. }
  386. }
  387. int nClientHeight = 0;
  388. int nMinClientHeight = m_nMinClientHeight;
  389. CXTPShortcutBarPane* pPaneClient = DYNAMIC_DOWNCAST(CXTPShortcutBarPane, CWnd::FromHandle(m_hwndClient));
  390. if (pPaneClient) nMinClientHeight = max(nMinClientHeight, pPaneClient->GetMinimumClientHeight());
  391. if (bShowActiveItemOnTop && m_hwndClient == NULL)
  392. {
  393. nGripperHeight = 0;
  394. nClientHeight = nTopItemHeight;
  395. nMinClientHeight = 0;
  396. m_nExpandedLines = (nHeight - nClientHeight - nGripperHeight) / m_szItem.cy;
  397. if (m_nExpandedLines > nVisibleItemsCount)
  398. {
  399. m_nExpandedLines = nVisibleItemsCount;
  400. }
  401. if ((m_nExpandedLines < nVisibleItemsCount) && !m_bAllowCollapse)
  402. {
  403. nClientHeight = nHeight - nGripperHeight - m_szItem.cy * nVisibleItemsCount;
  404. m_nExpandedLines = nVisibleItemsCount;
  405. }
  406. if (m_nExpandedLines < 1)
  407. {
  408. nClientHeight = nHeight - nGripperHeight - m_szItem.cy;
  409. m_nExpandedLines = 1;
  410. }
  411. }
  412. else if (m_bAllowFreeResize)
  413. {
  414. nClientHeight = nHeight - m_nDesiredExpandedLinesHeight - nGripperHeight;
  415. if (nClientHeight - nTopItemHeight < nMinClientHeight)
  416. {
  417. nClientHeight = nMinClientHeight + nTopItemHeight;
  418. }
  419. m_nExpandedLines = (nHeight - nClientHeight - nGripperHeight) / m_szItem.cy;
  420. if (m_nExpandedLines > nVisibleItemsCount)
  421. {
  422. m_nExpandedLines = nVisibleItemsCount;
  423. }
  424. if ((m_nExpandedLines < nVisibleItemsCount) && !m_bAllowCollapse)
  425. {
  426. nClientHeight = nHeight - nGripperHeight - m_szItem.cy * nVisibleItemsCount;
  427. m_nExpandedLines = nVisibleItemsCount;
  428. }
  429. if (m_nExpandedLines < 1)
  430. {
  431. nClientHeight = nHeight - nGripperHeight - m_szItem.cy;
  432. m_nExpandedLines = 1;
  433. }
  434. }
  435. else
  436. {
  437. m_nExpandedLines = m_nDesiredExpandedLinesHeight / m_szItem.cy;
  438. if (nHeight - nTopItemHeight - m_nExpandedLines * m_szItem.cy - nGripperHeight < nMinClientHeight)
  439. {
  440. m_nExpandedLines = (nHeight - nTopItemHeight - nGripperHeight - nMinClientHeight) / m_szItem.cy;
  441. }
  442. if (m_nExpandedLines > nVisibleItemsCount || !m_bAllowCollapse)
  443. m_nExpandedLines = nVisibleItemsCount;
  444. if (m_nExpandedLines < 1)
  445. m_nExpandedLines = 1;
  446. nClientHeight = nHeight - m_nExpandedLines * m_szItem.cy - nGripperHeight;
  447. }
  448. m_rcGripper.SetRect(0, nClientHeight, nWidth, nClientHeight + nGripperHeight);
  449. m_rcClient.SetRect(0, nTopItemHeight, nWidth, nClientHeight);
  450. if (bShowActiveItemOnTop && nVisibleItemsCount == 0)
  451. {
  452. m_rcClient.SetRect(0, nTopItemHeight, nWidth, nHeight);
  453. m_rcGripper.SetRectEmpty();
  454. }
  455. }
  456. BOOL bExpandButtonVisible = IsExpandButtonVisible();
  457. int nExpandedLines = m_nExpandedLines;
  458. for (; nExpandedItem < m_arrItems.GetSize(); nExpandedItem++)
  459. {
  460. CXTPShortcutBarItem* pItem = GetItem(nExpandedItem);
  461. if (!pItem->m_bVisible)
  462. continue;
  463. if (m_pSelectedItem == pItem && bShowActiveItemOnTop)
  464. continue;
  465. if ((!(nExpandedLines == 1 && !bExpandButtonVisible && nVisibleItemsCount == 1))
  466. && (nExpandedLines < 2)) break;
  467. pItem->m_bExpanded = TRUE;
  468. int nItemTop = m_rcGripper.bottom + (m_nExpandedLines - nExpandedLines) * m_szItem.cy;
  469. pItem->m_rcItem.SetRect(0, nItemTop, nWidth, nItemTop +  m_szItem.cy);
  470. nExpandedLines--;
  471. nVisibleItemsCount--;
  472. }
  473. int nCollapsedCount = min(nVisibleItemsCount, nWidth / m_szItem.cx) - 1;
  474. int nCollapsedPos = nWidth - m_szItem.cx * (nCollapsedCount + 1);
  475. for (int nCollapsedItem = nExpandedItem; nCollapsedItem < m_arrItems.GetSize(); nCollapsedItem++)
  476. {
  477. CXTPShortcutBarItem* pItem = GetItem(nCollapsedItem);
  478. if (!pItem->m_bVisible)
  479. continue;
  480. if (m_pSelectedItem == pItem && bShowActiveItemOnTop)
  481. continue;
  482. pItem->m_bExpanded = FALSE;
  483. if (pItem->IsItemExpandButton())
  484. pItem->m_rcItem.SetRect(nWidth - m_szItem.cx, rcShortcutBar.Height() - m_szItem.cy, nWidth, rcShortcutBar.Height());
  485. else if ((nCollapsedCount > 0) || ((nCollapsedCount == 0) && !bExpandButtonVisible))
  486. pItem->m_rcItem.SetRect(nCollapsedPos, rcShortcutBar.Height() - m_szItem.cy, nCollapsedPos + m_szItem.cx, rcShortcutBar.Height());
  487. else
  488. pItem->m_bHidden = TRUE;
  489. nCollapsedPos += m_szItem.cx;
  490. nCollapsedCount--;
  491. }
  492. if (m_hwndClient)
  493. {
  494. ::MoveWindow(m_hwndClient, m_rcClient.left, m_rcClient.top, m_rcClient.Width(), m_rcClient.Height(), TRUE);
  495. }
  496. Invalidate(FALSE);
  497. bReposition = FALSE;
  498. OnRepositionDone();
  499. }
  500. void CXTPShortcutBar::OnRepositionDone()
  501. {
  502. }
  503. INT_PTR CXTPShortcutBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
  504. {
  505. ASSERT_VALID(this);
  506. ASSERT(::IsWindow(m_hWnd));
  507. // check child windows first by calling CControlBar
  508. INT_PTR nHit = CWnd::OnToolHitTest(point, pTI);
  509. if (nHit != -1)
  510. return nHit;
  511. #if !defined(_XTP_ACTIVEX) && defined(_XTP_INCLUDE_COMMANDBARS)
  512. if (XTPMouseManager()->IsTrackedLock(NULL) || XTPMouseManager()->IsMouseLocked())
  513. return -1;
  514. #endif
  515. CXTPShortcutBarItem* pItem = HitTest(point);
  516. if (!pItem)
  517. return -1;
  518. CClientDC dc(CWnd::FromHandle(m_hWnd));
  519. BOOL bShowToolTip = !pItem->IsExpanded() ||
  520. GetPaintManager()->IsShortcutItemTruncated(&dc, pItem);
  521. if (bShowToolTip)
  522. {
  523. nHit = pItem->GetID();
  524. if (pItem->IsItemExpandButton())
  525. nHit = XTP_IDS_SHORTCUT_CONFIGURE;
  526. CString strTip = pItem->GetTooltip();
  527. if (strTip.GetLength() == 0)
  528. return -1;
  529. CXTPToolTipContext::FillInToolInfo(pTI, m_hWnd, pItem->GetItemRect(),
  530. nHit, strTip, pItem->GetCaption(), strTip, GetImageManager());
  531. return nHit;
  532. }
  533. return -1;
  534. }
  535. CXTPShortcutBarItem* CXTPShortcutBar::HitTest(CPoint pt) const
  536. {
  537. for (int i = 0; i < m_arrItems.GetSize(); i++)
  538. {
  539. CXTPShortcutBarItem* pItem = m_arrItems[i];
  540. if (pItem->m_bVisible && !pItem->m_bHidden && pItem->m_rcItem.PtInRect(pt))
  541. return m_arrItems[i];
  542. }
  543. return NULL;
  544. }
  545. void CXTPShortcutBar::SetHotItem(CXTPShortcutBarItem* pItem)
  546. {
  547. if (m_pHotItem == pItem)
  548. return;
  549. m_pHotItem = pItem;
  550. Invalidate(FALSE);
  551. if (m_pHotItem)
  552. {
  553. TRACKMOUSEEVENT tme =
  554. {
  555. sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd, 0
  556. };
  557. _TrackMouseEvent(&tme);
  558. }
  559. }
  560. void CXTPShortcutBar::SelectItem(CXTPShortcutBarItem* pItem)
  561. {
  562. if (!pItem)
  563. return;
  564. if (pItem->IsItemExpandButton())
  565. {
  566. OnExpandButtonDown(pItem);
  567. return;
  568. }
  569. if ((m_pSelectedItem == pItem) && m_bSingleSelection)
  570. return;
  571. if (GetOwner()->SendMessage(XTPWM_SHORTCUTBAR_NOTIFY, XTP_SBN_SELECTION_CHANGING, (LPARAM)pItem) == -1)
  572. return;
  573. if (pItem->m_hwndChild != m_hwndClient)
  574. {
  575. if (m_hwndClient)
  576. {
  577. ::ShowWindow(m_hwndClient, SW_HIDE);
  578. }
  579. m_hwndClient = pItem->m_hwndChild;
  580. if (m_hwndClient)
  581. {
  582. ::ShowWindow(m_hwndClient, SW_SHOW);
  583. }
  584. }
  585. if (m_bSingleSelection)
  586. {
  587. m_pSelectedItem = pItem;
  588. }
  589. else
  590. {
  591. pItem->m_bSelected = !pItem->m_bSelected;
  592. }
  593. Reposition();
  594. GetOwner()->SendMessage(XTPWM_SHORTCUTBAR_NOTIFY, XTP_SBN_SELECTION_CHANGED, (LPARAM)pItem);
  595. }
  596. void CXTPShortcutBar::OnExpandButtonDown(CXTPShortcutBarItem* pExpandButton)
  597. {
  598. #ifdef _XTP_INCLUDE_COMMANDBARS
  599. CXTPPopupBar* pPopup = CXTPPopupBar::CreatePopupBar(NULL);
  600. if (m_bClientPaneVisible)
  601. {
  602. pPopup->GetControls()->Add(xtpControlButton, XTP_ID_SHORTCUT_SHOW_MORE);
  603. pPopup->GetControls()->Add(xtpControlButton, XTP_ID_SHORTCUT_SHOW_FEWER);
  604. }
  605. CXTPControlPopup* pControlAddOrRemove = (CXTPControlPopup*)pPopup->GetControls()->Add(xtpControlPopup, XTP_ID_CUSTOMIZE_ADDORREMOVE);
  606. pControlAddOrRemove->SetFlags(xtpFlagManualUpdate);
  607. for (int j = 0; j < m_arrItems.GetSize() - 1; j++)
  608. {
  609. CXTPShortcutBarItem* pItem = m_arrItems[j];
  610. CXTPControl* pControl = pControlAddOrRemove->GetCommandBar()->GetControls()->Add(xtpControlButton, XTP_ID_SHORTCUT_CUSTOMIZE);
  611. pControl->SetIconId(pItem->GetID());
  612. pControl->SetCaption(pItem->GetCaption());
  613. pControl->SetTag((DWORD_PTR)pItem);
  614. pControl->SetChecked(pItem->m_bVisible);
  615. pControl->SetFlags(xtpFlagManualUpdate);
  616. }
  617. BOOL bBeginGroup = TRUE;
  618. for (int i = 0; i < m_arrItems.GetSize(); i++)
  619. {
  620. CXTPShortcutBarItem* pItem = m_arrItems[i];
  621. if (pItem->m_bVisible && pItem->m_bHidden)
  622. {
  623. CXTPControl* pControl = pPopup->GetControls()->Add(xtpControlButton, XTP_ID_SHORTCUT_SELECTED);
  624. pControl->SetIconId(pItem->GetID());
  625. pControl->SetCaption(pItem->GetCaption());
  626. pControl->SetTag((DWORD_PTR)pItem);
  627. pControl->SetFlags(xtpFlagManualUpdate);
  628. pControl->SetBeginGroup(bBeginGroup);
  629. bBeginGroup = FALSE;
  630. }
  631. }
  632. CPoint pt(pExpandButton->GetItemRect().right, pExpandButton->GetItemRect().CenterPoint().y);
  633. ClientToScreen(&pt);
  634. CXTPCommandBars::TrackPopupMenu(pPopup, 0, pt.x, pt.y, this);
  635. pPopup->InternalRelease();
  636. SetHotItem(NULL);
  637. #else
  638. CMenu menu;
  639. menu.CreatePopupMenu();
  640. if (m_bClientPaneVisible)
  641. {
  642. CString str;
  643. XTPResourceManager()->LoadString(&str, XTP_ID_SHORTCUT_SHOW_MORE);
  644. menu.AppendMenu(MF_STRING, XTP_ID_SHORTCUT_SHOW_MORE, str);
  645. if (GetVisibleItemsCount() == m_nExpandedLines)
  646. menu.EnableMenuItem(XTP_ID_SHORTCUT_SHOW_MORE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
  647. XTPResourceManager()->LoadString(&str, XTP_ID_SHORTCUT_SHOW_FEWER);
  648. menu.AppendMenu(MF_STRING, XTP_ID_SHORTCUT_SHOW_FEWER, str);
  649. if (m_nExpandedLines <= 1)
  650. menu.EnableMenuItem(XTP_ID_SHORTCUT_SHOW_FEWER, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
  651. }
  652. BOOL bBeginGroup = m_bClientPaneVisible;
  653. for (int i = 0; i < m_arrItems.GetSize(); i++)
  654. {
  655. CXTPShortcutBarItem* pItem = m_arrItems[i];
  656. if (pItem->m_bVisible && pItem->m_bHidden)
  657. {
  658. if (bBeginGroup)
  659. {
  660. menu.AppendMenu(MF_SEPARATOR);
  661. }
  662. menu.AppendMenu(MF_STRING, i + 1, pItem->GetCaption());
  663. bBeginGroup = FALSE;
  664. }
  665. }
  666. CPoint pt(pExpandButton->GetItemRect().right, pExpandButton->GetItemRect().CenterPoint().y);
  667. ClientToScreen(&pt);
  668. int nCmd = menu.TrackPopupMenu(TPM_RETURNCMD, pt.x, pt.y, this);
  669. if (nCmd > 0)
  670. {
  671. if (nCmd > m_arrItems.GetSize())
  672. SendMessage(WM_COMMAND, nCmd);
  673. else
  674. {
  675. SelectItem(m_arrItems[nCmd - 1]);
  676. }
  677. }
  678. #endif
  679. }
  680. BEGIN_MESSAGE_MAP(CXTPShortcutBar, CWnd)
  681. //{{AFX_MSG_MAP(CXTPShortcutBar)
  682. ON_WM_PAINT()
  683. ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
  684. ON_WM_ERASEBKGND()
  685. ON_WM_SIZE()
  686. ON_WM_CREATE()
  687. ON_WM_NCPAINT()
  688. ON_WM_SETCURSOR()
  689. ON_WM_MOUSEMOVE()
  690. ON_WM_LBUTTONDOWN()
  691. ON_WM_LBUTTONUP()
  692. ON_WM_CAPTURECHANGED()
  693. ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
  694. ON_WM_SYSCOLORCHANGE()
  695. ON_COMMAND(XTP_ID_SHORTCUT_SHOW_MORE, OnShowMoreButtons)
  696. ON_COMMAND(XTP_ID_SHORTCUT_SHOW_FEWER, OnShowFewerButtons)
  697. ON_UPDATE_COMMAND_UI(XTP_ID_SHORTCUT_SHOW_MORE, OnUpdateShowMoreButtons)
  698. ON_UPDATE_COMMAND_UI(XTP_ID_SHORTCUT_SHOW_FEWER, OnUpdateShowFewerButtons)
  699. ON_WM_RBUTTONDOWN()
  700. ON_WM_RBUTTONUP()
  701. //}}AFX_MSG_MAP
  702. #ifdef _XTP_INCLUDE_COMMANDBARS
  703. ON_MESSAGE(WM_XTP_COMMAND, OnExpandPopupExecute)
  704. #endif
  705. END_MESSAGE_MAP()
  706. /////////////////////////////////////////////////////////////////////////////
  707. // CXTPShortcutBar message handlers
  708. void CXTPShortcutBar::OnPaint()
  709. {
  710. CPaintDC dcPaint(this); // device context for painting
  711. CXTPBufferDC dc(dcPaint);
  712. OnDraw(&dc);
  713. }
  714. LRESULT CXTPShortcutBar::OnPrintClient(WPARAM wParam, LPARAM /*lParam*/)
  715. {
  716. CDC* pDC = CDC::FromHandle((HDC)wParam);
  717. if (pDC)
  718. {
  719. OnDraw(pDC);
  720. }
  721. return TRUE;
  722. }
  723. void CXTPShortcutBar::OnDraw(CDC* pDC)
  724. {
  725. CXTPClientRect rc(this);
  726. m_pPaintManager->FillShortcutBar(pDC, this);
  727. if (m_bClientPaneVisible && m_bShowGripper && !m_rcGripper.IsRectEmpty())
  728. m_pPaintManager->DrawGripper(pDC, this, TRUE);
  729. for (int i = 0; i < m_arrItems.GetSize(); i++)
  730. {
  731. CXTPShortcutBarItem* pItem = m_arrItems[i];
  732. if (!pItem->m_bVisible || pItem->m_bHidden)
  733. continue;
  734. m_pPaintManager->DrawShortcutItem(pDC, pItem);
  735. }
  736. }
  737. BOOL CXTPShortcutBar::OnEraseBkgnd(CDC* /*pDC*/)
  738. {
  739. return TRUE;
  740. }
  741. void CXTPShortcutBar::OnSize(UINT nType, int cx, int cy)
  742. {
  743. CWnd::OnSize(nType, cx, cy);
  744. Reposition();
  745. }
  746. int CXTPShortcutBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
  747. {
  748. if (CWnd::OnCreate(lpCreateStruct) == -1)
  749. return -1;
  750. Reposition();
  751. return 0;
  752. }
  753. void CXTPShortcutBar::OnNcPaint()
  754. {
  755. CWindowDC dc(this); // device context for painting
  756. m_pPaintManager->DrawShortcutBarFrame(&dc, this);
  757. }
  758. BOOL CXTPShortcutBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  759. {
  760. CPoint pt;
  761. GetCursorPos(&pt);
  762. ScreenToClient(&pt);
  763. if ((m_bTrackingSize || m_rcGripper.PtInRect(pt)) && m_bAllowResize && m_bShowGripper)
  764. {
  765. ::SetCursor(m_hSizeCursor);
  766. return TRUE;
  767. }
  768. if (m_pHotItem != NULL && m_hHandCursor)
  769. {
  770. ::SetCursor(m_hHandCursor);
  771. return TRUE;
  772. }
  773. return CWnd::OnSetCursor(pWnd, nHitTest, message);
  774. }
  775. void CXTPShortcutBar::OnMouseMove(UINT nFlags, CPoint point)
  776. {
  777. #ifdef _XTP_INCLUDE_COMMANDBARS
  778. if (XTPMouseManager()->IsTrackedLock(0))
  779. return;
  780. #endif
  781. if (m_bTrackingSize)
  782. {
  783. CXTPClientRect rc(this);
  784. SetExpandedLinesHeight(rc.Height() - point.y);
  785. }
  786. else
  787. {
  788. CXTPShortcutBarItem* pItem = HitTest(point);
  789. if (pItem != m_pHotItem)
  790. {
  791. SetHotItem(pItem);
  792. }
  793. }
  794. CWnd::OnMouseMove(nFlags, point);
  795. }
  796. void CXTPShortcutBar::OnLButtonDown(UINT nFlags, CPoint point)
  797. {
  798. if (m_rcGripper.PtInRect(point) && m_bAllowResize)
  799. {
  800. m_bTrackingSize = TRUE;
  801. SetCapture();
  802. return;
  803. }
  804. CXTPShortcutBarItem* pItem = HitTest(point);
  805. if (pItem)
  806. {
  807. m_pPressedItem = pItem;
  808. Invalidate(FALSE);
  809. SetCapture();
  810. return;
  811. }
  812. CWnd::OnLButtonDown(nFlags, point);
  813. }
  814. void CXTPShortcutBar::OnLButtonUp(UINT nFlags, CPoint point)
  815. {
  816. CWnd::OnLButtonUp(nFlags, point);
  817. m_bTrackingSize = FALSE;
  818. CXTPShortcutBarItem* pPressedItem = m_pPressedItem;
  819. m_pPressedItem = NULL;
  820. ReleaseCapture();
  821. if (pPressedItem)
  822. {
  823. if (m_pHotItem == pPressedItem)
  824. {
  825. SelectItem(pPressedItem);
  826. }
  827. else
  828. {
  829. Invalidate(FALSE);
  830. }
  831. }
  832. }
  833. void CXTPShortcutBar::OnCaptureChanged(CWnd* pWnd)
  834. {
  835. m_bTrackingSize = FALSE;
  836. if (m_pPressedItem)
  837. {
  838. m_pPressedItem = NULL;
  839. Invalidate(FALSE);
  840. }
  841. CWnd::OnCaptureChanged(pWnd);
  842. }
  843. void CXTPShortcutBar::OnRButtonDown(UINT nFlags, CPoint point)
  844. {
  845. OnMouseMove(nFlags, point);
  846. GetOwner()->SendMessage(XTPWM_SHORTCUTBAR_NOTIFY, XTP_SBN_RCLICK, MAKELONG(point.x, point.y));
  847. GetCursorPos(&point);
  848. ScreenToClient(&point);
  849. OnMouseMove(nFlags, point);
  850. CWnd::OnRButtonDown(nFlags, point);
  851. }
  852. void CXTPShortcutBar::OnRButtonUp(UINT nFlags, CPoint point)
  853. {
  854. CWnd::OnRButtonUp(nFlags, point);
  855. }
  856. void CXTPShortcutBar::OnMouseLeave()
  857. {
  858. #ifdef _XTP_INCLUDE_COMMANDBARS
  859. if (!XTPMouseManager()->IsTrackedLock(0))
  860. #endif
  861. SetHotItem(NULL);
  862. }
  863. void CXTPShortcutBar::OnSysColorChange()
  864. {
  865. CWnd::OnSysColorChange();
  866. m_pPaintManager->RefreshMetrics();
  867. Reposition();
  868. }
  869. CXTPShortcutBarItem* CXTPShortcutBar::FindItem(int nID) const
  870. {
  871. for (int i = 0; i < m_arrItems.GetSize(); i++)
  872. {
  873. if (m_arrItems[i]->GetID() == nID)
  874. return m_arrItems[i];
  875. }
  876. return NULL;
  877. }
  878. void CXTPShortcutBar::LoadState(LPCTSTR lpszProfileName)
  879. {
  880. m_nDesiredExpandedLinesHeight = AfxGetApp()->GetProfileInt(lpszProfileName, _T("DesiredExpandedLinesHeight"), m_nDesiredExpandedLinesHeight);
  881. CDWordArray arrHiddenItems;
  882. LPBYTE lpbData;
  883. UINT dwDataSize;
  884. if (AfxGetApp()->GetProfileBinary(lpszProfileName, _T("Hidden"), &lpbData, &dwDataSize))
  885. {
  886. try
  887. {
  888. CMemFile file(lpbData, dwDataSize);
  889. CArchive ar (&file, CArchive::load);
  890. arrHiddenItems.Serialize(ar);
  891. for (int i = 0; i < arrHiddenItems.GetSize(); i++)
  892. {
  893. CXTPShortcutBarItem* pItem = FindItem(arrHiddenItems[i]);
  894. if (pItem && !pItem->IsItemExpandButton()) pItem->m_bVisible = FALSE;
  895. }
  896. }
  897. catch (CMemoryException* pEx)
  898. {
  899. pEx->Delete ();
  900. }
  901. catch (CArchiveException* pEx)
  902. {
  903. pEx->Delete ();
  904. }
  905. delete[] lpbData;
  906. }
  907. Reposition();
  908. }
  909. void CXTPShortcutBar::SaveState(LPCTSTR lpszProfileName)
  910. {
  911. AfxGetApp()->WriteProfileInt(lpszProfileName, _T("DesiredExpandedLinesHeight"), m_nDesiredExpandedLinesHeight);
  912. CDWordArray arrHiddenItems;
  913. for (int i = 0; i < m_arrItems.GetSize(); i++)
  914. {
  915. if (!m_arrItems[i]->IsVisible() && !m_arrItems[i]->IsItemExpandButton())
  916. arrHiddenItems.Add(m_arrItems[i]->GetID());
  917. }
  918. try
  919. {
  920. CMemFile file;
  921. CArchive ar (&file, CArchive::store);
  922. arrHiddenItems.Serialize(ar);
  923. ar.Flush ();
  924. DWORD dwDataSize = (DWORD)file.GetPosition();
  925. LPBYTE lpbData = file.Detach();
  926. AfxGetApp()->WriteProfileBinary(lpszProfileName, _T("Hidden"), lpbData, dwDataSize);
  927. ar.Close();
  928. file.Close();
  929. free (lpbData);
  930. }
  931. catch (CMemoryException* pEx)
  932. {
  933. pEx->Delete ();
  934. }
  935. catch (CArchiveException* pEx)
  936. {
  937. pEx->Delete ();
  938. }
  939. }
  940. int CXTPShortcutBar::GetItemCount() const
  941. {
  942. return (int)m_arrItems.GetSize();
  943. }
  944. CXTPShortcutBarItem* CXTPShortcutBar::GetItem(int nIndex) const
  945. {
  946. if (nIndex >= 0 && nIndex < m_arrItems.GetSize())
  947. return m_arrItems[nIndex];
  948. return NULL;
  949. }
  950. void CXTPShortcutBar::RemoveItem(int nID)
  951. {
  952. m_pHotItem = NULL;
  953. m_pPressedItem = NULL;
  954. for (int i = 0; i < m_arrItems.GetSize(); i++)
  955. {
  956. CXTPShortcutBarItem* pItem = m_arrItems[i];
  957. if (pItem->GetID() == nID)
  958. {
  959. if (pItem == m_pSelectedItem) m_pSelectedItem = NULL;
  960. m_arrItems.RemoveAt(i);
  961. pItem->InternalRelease();
  962. Reposition();
  963. return;
  964. }
  965. }
  966. }
  967. void CXTPShortcutBar::RemoveAllItems()
  968. {
  969. m_pHotItem = NULL;
  970. m_pPressedItem = NULL;
  971. m_pSelectedItem = NULL;
  972. for (int i = (int)m_arrItems.GetSize() - 1; i >= 0 ; i--)
  973. {
  974. CXTPShortcutBarItem* pItem = m_arrItems[i];
  975. if (!pItem->IsItemExpandButton())
  976. {
  977. m_arrItems.RemoveAt(i);
  978. pItem->InternalRelease();
  979. }
  980. }
  981. Reposition();
  982. }
  983. void CXTPShortcutBar::OnShowMoreButtons()
  984. {
  985. SetExpandedLinesCount(m_nExpandedLines + 1);
  986. }
  987. void CXTPShortcutBar::OnShowFewerButtons()
  988. {
  989. SetExpandedLinesCount(m_nExpandedLines - 1);
  990. }
  991. void CXTPShortcutBar::OnUpdateShowMoreButtons(CCmdUI* pCmdUI)
  992. {
  993. pCmdUI->Enable(GetVisibleItemsCount() != m_nExpandedLines);
  994. }
  995. void CXTPShortcutBar::OnUpdateShowFewerButtons(CCmdUI* pCmdUI)
  996. {
  997. pCmdUI->Enable(m_nExpandedLines > 1);
  998. }
  999. CXTPToolTipContext* CXTPShortcutBar::GetToolTipContext() const
  1000. {
  1001. return m_pToolTipContext;
  1002. }
  1003. BOOL CXTPShortcutBar::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
  1004. {
  1005. if (m_pToolTipContext)
  1006. {
  1007. m_pToolTipContext->FilterToolTipMessage(this, message, wParam, lParam);
  1008. }
  1009. return CWnd::OnWndMsg(message, wParam, lParam, pResult);
  1010. }
  1011. LRESULT CXTPShortcutBar::OnExpandPopupExecute(WPARAM wParam, LPARAM lParam)
  1012. {
  1013. #ifdef _XTP_INCLUDE_COMMANDBARS
  1014. if (wParam == XTP_ID_SHORTCUT_SELECTED)
  1015. {
  1016. CXTPControl* pControl = ((NMXTPCONTROL*)lParam)->pControl;
  1017. SelectItem((CXTPShortcutBarItem*)pControl->GetTag());
  1018. return 1;
  1019. }
  1020. if (wParam == XTP_ID_SHORTCUT_CUSTOMIZE)
  1021. {
  1022. CXTPControl* pControl = ((NMXTPCONTROL*)lParam)->pControl;
  1023. CXTPShortcutBarItem* pItem = (CXTPShortcutBarItem*)pControl->GetTag();
  1024. pItem->m_bVisible = !pItem->m_bVisible;
  1025. Reposition();
  1026. return 1;
  1027. }
  1028. #else
  1029. wParam;
  1030. lParam;
  1031. #endif
  1032. return 0;
  1033. }
  1034. void CXTPShortcutBar::SetLayoutRTL(BOOL bRightToLeft)
  1035. {
  1036. if (!XTPSystemVersion()->IsLayoutRTLSupported())
  1037. return;
  1038. if (!m_hWnd)
  1039. return;
  1040. ModifyStyleEx(bRightToLeft ? 0 : WS_EX_LAYOUTRTL, !bRightToLeft ? 0 : WS_EX_LAYOUTRTL);
  1041. GetImageManager()->DrawReverted(bRightToLeft);
  1042. Reposition();
  1043. }