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

对话框与窗口

开发平台:

Visual C++

  1. // XTPToolBar.cpp : implementation of the CXTPToolBar 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/XTPVC80Helpers.h"
  23. #include "Common/XTPVC50Helpers.h"
  24. #include "Common/XTPResourceManager.h"
  25. #include "Common/XTPImageManager.h"
  26. #include "Common/XTPColorManager.h"
  27. #include "Common/XTPDrawHelpers.h"
  28. #include "Common/XTPToolTipContext.h"
  29. #include "XTPToolBar.h"
  30. #include "XTPCommandBars.h"
  31. #include "XTPDockBar.h"
  32. #include "XTPControls.h"
  33. #include "XTPControl.h"
  34. #include "XTPPaintManager.h"
  35. #include "XTPMouseManager.h"
  36. #include "XTPControlPopup.h"
  37. #include "XTPPopupBar.h"
  38. #include "XTPControlButton.h"
  39. #include "XTPDockContext.h"
  40. #include "XTPShortcutManager.h"
  41. #ifdef _DEBUG
  42. #define new DEBUG_NEW
  43. #undef THIS_FILE
  44. static char THIS_FILE[] = __FILE__;
  45. #endif
  46. #define _XTP_CBRS_ALL            0x0040FFFFL
  47. IMPLEMENT_XTP_COMMANDBAR(CXTPToolBar, CXTPCommandBar)
  48. class CXTPToolBar::CControlButtonHide: public CXTPControlButton
  49. {
  50. public:
  51. CControlButtonHide()
  52. {
  53. m_dwFlags = xtpFlagManualUpdate | xtpFlagSkipFocus | xtpFlagNoMovable;
  54. }
  55. void Draw(CDC* pDC);
  56. void SetBeginGroup(BOOL /*bBeginGroup*/)
  57. {
  58. }
  59. void OnExecute()
  60. {
  61. ASSERT(m_pParent);
  62. if (m_pParent) ((CXTPToolBar*)m_pParent)->SetVisible(FALSE);
  63. }
  64. virtual BOOL IsCustomizeMovable() const
  65. {
  66. return FALSE;
  67. }
  68. };
  69. void CXTPToolBar::CControlButtonHide::Draw(CDC* pDC)
  70. {
  71. GetPaintManager()->DrawSpecialControl(pDC, xtpButtonHideFloating, this, m_pParent, TRUE, NULL);
  72. }
  73. class CXTPToolBar::CControlButtonCustomize: public CXTPControlButton
  74. {
  75. public:
  76. CControlButtonCustomize()
  77. {
  78. m_pControl = NULL;
  79. m_pToolBar = NULL;
  80. }
  81. virtual void OnExecute()
  82. {
  83. ASSERT(m_pParent);
  84. if (!m_pParent)
  85. return;
  86. CXTPCommandBars* pCommandBars = m_pParent->GetCommandBars();
  87. ASSERT(pCommandBars);
  88. if (!pCommandBars)
  89. return;
  90. pCommandBars->GetCommandBarsOptions()->bDirtyState = TRUE;
  91. if (m_pControl)
  92. {
  93. if (m_pControl->GetHideFlags() & xtpHideCustomize)
  94. m_pControl->SetHideFlag(xtpHideCustomize, FALSE);
  95. else m_pControl->SetHideFlag(xtpHideCustomize, TRUE);
  96. SetChecked((m_pControl->GetHideFlags() & xtpHideCustomize) == 0);
  97. m_pControl->GetParent()->OnRecalcLayout();
  98. m_pParent->InvalidateParents();
  99. }
  100. if (m_pToolBar)
  101. {
  102. pCommandBars->ClosePopups();
  103. m_pToolBar->Reset(TRUE);
  104. }
  105. }
  106. CXTPControl* m_pControl;
  107. CXTPToolBar* m_pToolBar;
  108. };
  109. class CXTPToolBar::CControlButtonExpand: public CXTPControlPopup
  110. {
  111. public:
  112. CControlButtonExpand()
  113. {
  114. m_controlType = xtpControlButtonPopup;
  115. m_bHiddenExists = FALSE;
  116. m_dwFlags = xtpFlagLeftPopup | xtpFlagManualUpdate | xtpFlagNoMovable;
  117. m_pCommandBar = CXTPPopupBar::CreatePopupBar(0);
  118. }
  119. void Draw(CDC* pDC);
  120. BOOL OnSetPopup(BOOL bPopup);
  121. void SetRect(CRect rcControl)
  122. {
  123. m_rcControl = rcControl;
  124. m_bHiddenExists = IsHiddenExists();
  125. };
  126. void SetBeginGroup(BOOL /*bBeginGroup*/)
  127. {
  128. }
  129. BOOL IsHiddenExists();
  130. virtual BOOL IsCaptionVisible() const
  131. {
  132. return FALSE;
  133. }
  134. virtual BOOL IsCustomizeMovable() const
  135. {
  136. return FALSE;
  137. }
  138. private:
  139. BOOL m_bHiddenExists;
  140. };
  141. BOOL CXTPToolBar::CControlButtonExpand::IsHiddenExists()
  142. {
  143. for (int i = 0; i < m_pParent->GetControlCount(); i++)
  144. {
  145. if (m_pParent->GetControl(i)->GetHideFlags() == xtpHideWrap)
  146. return TRUE;
  147. }
  148. return FALSE;
  149. }
  150. void CXTPToolBar::CControlButtonExpand::Draw(CDC* pDC)
  151. {
  152. GetPaintManager()->DrawSpecialControl(pDC, m_pParent->GetPosition() == xtpBarFloating ?
  153. xtpButtonExpandFloating: xtpButtonExpandToolbar, this, m_pParent, TRUE, &m_bHiddenExists);
  154. }
  155. BOOL CXTPToolBar::CControlButtonExpand::OnSetPopup(BOOL bPopup)
  156. {
  157. m_bPopup = bPopup;
  158. if (bPopup)
  159. {
  160. if (m_pCommandBar)
  161. m_pCommandBar->InternalRelease();
  162. m_pCommandBar = NULL;
  163. CWnd* pSite = m_pParent->GetSite();
  164. if (pSite)
  165. {
  166. XTP_COMMANDBARS_CREATEBAR cs;
  167. ZeroMemory(&cs, sizeof(cs));
  168. cs.bExpandBar = TRUE;
  169. if (pSite->SendMessage(WM_XTP_CREATECOMMANDBAR, 0, (LPARAM)&cs) != 0)
  170. {
  171. m_pCommandBar = DYNAMIC_DOWNCAST(CXTPPopupBar, cs.pCommandBar);
  172. }
  173. }
  174. if (m_pCommandBar == NULL) m_pCommandBar = CXTPPopupToolBar::CreatePopupToolBar(m_pParent->GetCommandBars());
  175. m_pCommandBar->EnableCustomization(FALSE);
  176. CXTPCommandBars* pCommandBars = m_pParent->GetCommandBars();
  177. if (pCommandBars && ((CXTPToolBar*)m_pParent)->m_pDockContext)
  178. {
  179. pCommandBars->GetHiddenControls((CXTPToolBar*)m_pParent, m_pCommandBar);
  180. if (pCommandBars->GetCommandBarsOptions()->bShowExpandButtonAlways || pCommandBars->IsCustomizeAvail())
  181. {
  182. CXTPControlPopup* pControl = (CXTPControlPopup*)m_pCommandBar->GetControls()->Add(xtpControlPopup, XTP_ID_CUSTOMIZE_ADDORREMOVE);
  183. pControl->SetFlags(xtpFlagManualUpdate);
  184. pControl->SetBeginGroup(m_pCommandBar->GetControlCount() > 1);
  185. pCommandBars->GetAddOrRemovePopup((CXTPToolBar*)m_pParent, pControl->GetCommandBar());
  186. }
  187. }
  188. else
  189. {
  190. ((CXTPToolBar*)m_pParent)->_GetHiddenControls(m_pCommandBar);
  191. }
  192. m_pCommandBar->Popup(this, IsKeyboardSelected(GetSelected()));
  193. }
  194. else
  195. {
  196. ASSERT(m_pCommandBar);
  197. if (m_pCommandBar) m_pCommandBar->SetTrackingMode(FALSE);
  198. }
  199. RedrawParent();
  200. return TRUE;
  201. }
  202. CXTPToolBar::CXTPToolBar()
  203. {
  204. m_pDockBar = 0;
  205. m_pDockContext = 0;
  206. m_bBuiltIn = TRUE;
  207. m_bTearOff = FALSE;
  208. m_bCloseable = TRUE;
  209. m_bTemporary = FALSE;
  210. m_bShowExpandButton = TRUE;
  211. m_bPreviewMode = m_bPreviewVisible = FALSE;
  212. m_bContextMenuPresent = TRUE;
  213. m_bInRecalcLayout = FALSE;
  214. m_pDockContext = new CXTPDockContext(this);
  215. m_dwFlags = xtpFlagAlignAny | xtpFlagFloating | xtpFlagHideWrap;
  216. CXTPDrawHelpers::RegisterWndClass(0, _T("XTPToolBar"), CS_DBLCLKS);
  217. }
  218. BOOL CXTPToolBar::CreateToolBar(DWORD dwStyle, CWnd* pParentWnd, UINT nID)
  219. {
  220. m_dwStyle = dwStyle & _XTP_CBRS_ALL;
  221. dwStyle = dwStyle & ~_XTP_CBRS_ALL;
  222. dwStyle = dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
  223. if (!CWnd::CreateEx(0, _T("XTPToolBar"), NULL, dwStyle, CRect(0, 0, 0, 0), pParentWnd, nID))
  224. return FALSE;
  225. m_barPosition = xtpBarTop;
  226. SAFE_DELETE(m_pDockContext);
  227. m_dwFlags &= ~ (xtpFlagAlignAny | xtpFlagFloating | xtpFlagHideWrap);
  228. if ((m_dwStyle & CBRS_TOOLTIPS) && m_pCommandBars == 0)
  229. EnableToolTips();
  230. return TRUE;
  231. }
  232. void CXTPToolBar::EnableDocking(DWORD dwFlags)
  233. {
  234. ASSERT(m_pCommandBars);
  235. m_dwFlags = dwFlags;
  236. }
  237. CXTPToolBar::~CXTPToolBar()
  238. {
  239. SAFE_DELETE(m_pDockContext)
  240. }
  241. BOOL CXTPCommandBar::SetButtons(UINT* pButtons, int nCount)
  242. {
  243. m_pControls->RemoveAll();
  244. BOOL bSeparator = FALSE;
  245. CWnd* pSite = GetSite();
  246. for (int i = 0; i < nCount; i++)
  247. {
  248. if (pButtons[i] == 0)
  249. bSeparator = TRUE;
  250. else
  251. {
  252. XTPControlType controlType = xtpControlButton;
  253. XTPButtonStyle buttonStyle = xtpButtonAutomatic;
  254. CXTPControl* pControl = NULL;
  255. UINT nID = pButtons[i];
  256. XTP_COMMANDBARS_CREATECONTROL cs;
  257. if (pSite)
  258. {
  259. cs.nID = nID;
  260. cs.pControl = NULL;
  261. cs.bToolBar = TRUE;
  262. cs.pMenu = NULL;
  263. cs.nIndex = i;
  264. cs.strCaption = GetTitle();
  265. cs.controlType = controlType;
  266. cs.pCommandBar = this;
  267. cs.buttonStyle = buttonStyle;
  268. if (pSite->SendMessage(WM_XTP_BEFORECREATECONTROL, 0, (LPARAM)&cs) != 0)
  269. {
  270. pControl = cs.pControl;
  271. controlType = cs.controlType;
  272. buttonStyle = cs.buttonStyle;
  273. nID = cs.nID;
  274. }
  275. }
  276. if (pControl == NULL)
  277. {
  278. pControl = m_pControls->Add(controlType, nID);
  279. if (pControl)
  280. {
  281. pControl->SetStyle(buttonStyle);
  282. if (controlType == xtpControlPopup) pControl->SetIconId(nID);
  283. }
  284. }
  285. else m_pControls->Add(pControl, nID);
  286. if (bSeparator)
  287. {
  288. pControl->SetBeginGroup(TRUE);
  289. bSeparator = FALSE;
  290. }
  291. if (pSite)
  292. {
  293. cs.pControl = pControl;
  294. pSite->SendMessage(WM_XTP_AFTERCREATECONTROL, 0, (LPARAM)&cs);
  295. }
  296. }
  297. }
  298. return TRUE;
  299. }
  300. BOOL CXTPToolBar::LoadToolBar(UINT nIDResource, BOOL bLoadIcons)
  301. {
  302. m_nBarID = nIDResource;
  303. if (!CXTPCommandBar::LoadToolBar(nIDResource, bLoadIcons))
  304. return FALSE;
  305. m_pControls->CreateOriginalControls();
  306. return TRUE;
  307. }
  308. BOOL CXTPCommandBar::LoadToolBar(UINT nIDResource, BOOL bLoadIcons)
  309. {
  310. LPCTSTR lpszResourceName = MAKEINTRESOURCE(nIDResource);
  311. struct CToolBarData
  312. {
  313. WORD wVersion;
  314. WORD wWidth;
  315. WORD wHeight;
  316. WORD wItemCount;
  317. WORD* items()
  318. { return (WORD*)(this + 1); }
  319. };
  320. m_pControls->RemoveAll();
  321. ASSERT(GetControlCount() == 0);
  322. ASSERT_VALID(this);
  323. ASSERT(lpszResourceName != NULL);
  324. if (!lpszResourceName)
  325. return FALSE;
  326. // determine location of the bitmap in resource fork
  327. HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, RT_TOOLBAR);
  328. if (!hInst)
  329. return FALSE;
  330. HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, RT_TOOLBAR);
  331. if (hRsrc == NULL)
  332. return FALSE;
  333. HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
  334. if (hGlobal == NULL)
  335. return FALSE;
  336. CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);
  337. if (pData == NULL)
  338. return FALSE;
  339. ASSERT(pData->wVersion == 1);
  340. int i;
  341. UINT* pItems = new UINT[pData->wItemCount];
  342. for (i = 0; i < pData->wItemCount; i++)
  343. pItems[i] = pData->items()[i];
  344. BOOL bResult = SetButtons(pItems, pData->wItemCount);
  345. if (bLoadIcons)
  346. {
  347. CXTPImageManager* pImageManager = GetImageManager();
  348. if (!pImageManager->SetIcons(nIDResource, pItems,
  349. pData->wItemCount, CSize(pData->wWidth, pData->wHeight)))
  350. bResult = FALSE;
  351. if (pData->wWidth != 16)
  352. {
  353. SetIconSize(CSize(pData->wWidth, pData->wHeight));
  354. }
  355. }
  356. delete[] pItems;
  357. UnlockResource(hGlobal);
  358. FreeResource(hGlobal);
  359. return bResult;
  360. }
  361. BOOL CXTPToolBar::SetPosition(XTPBarPosition barPosition)
  362. {
  363. CXTPCommandBars* pCommandBars = GetCommandBars();
  364. if (!pCommandBars)
  365. return FALSE;
  366. if (IsDockingPosition(barPosition))
  367. {
  368. if (!pCommandBars->DockCommandBar(this, barPosition))
  369. return FALSE;
  370. }
  371. else if (barPosition == xtpBarFloating)
  372. {
  373. if (!pCommandBars->FloatCommandBar(this))
  374. return FALSE;
  375. }
  376. else
  377. return FALSE;
  378. ASSERT(m_barPosition == barPosition);
  379. return TRUE;
  380. }
  381. BEGIN_MESSAGE_MAP(CXTPToolBar, CXTPCommandBar)
  382. ON_WM_SETCURSOR()
  383. ON_WM_RBUTTONDOWN()
  384. ON_WM_NCCREATE()
  385. ON_WM_NCACTIVATE()
  386. ON_MESSAGE(WM_FLOATSTATUS, OnFloatStatus)
  387. ON_WM_MOUSEACTIVATE()
  388. ON_WM_LBUTTONDOWN()
  389. ON_WM_NCHITTEST_EX()
  390. ON_WM_NCLBUTTONDOWN()
  391. ON_WM_SETFOCUS()
  392. ON_WM_CLOSE()
  393. ON_MESSAGE(WM_SIZEPARENT, OnSizeParent)
  394. ON_WM_LBUTTONDBLCLK()
  395. END_MESSAGE_MAP()
  396. BOOL CXTPToolBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  397. {
  398. if (GetShowGripper() && (IsDockingPosition(GetPosition())) &&
  399. m_pDockContext && ((m_dwFlags & (xtpFlagAlignAny | xtpFlagFloating)) != 0))
  400. {
  401. CXTPClientRect rcGripper(this);
  402. CRect rcBorder = GetPaintManager()->GetCommandBarBorders(this);
  403. CSize szGripper = GetPaintManager()->DrawCommandBarGripper(NULL, this, FALSE);
  404. if (IsDialogBar())
  405. {
  406. rcGripper.right = rcGripper.left + rcBorder.left + szGripper.cx;
  407. rcGripper.left += 3;
  408. rcGripper.bottom = rcGripper.top + rcBorder.top + szGripper.cy;
  409. }
  410. else if (IsVerticalPosition(GetPosition()))
  411. {
  412. rcGripper.bottom = rcGripper.top + rcBorder.top + szGripper.cy;
  413. }
  414. else
  415. {
  416. rcGripper.right = rcGripper.left + rcBorder.left + szGripper.cx;
  417. }
  418. POINT pt;
  419. GetCursorPos(&pt);
  420. ScreenToClient(&pt);
  421. if (rcGripper.PtInRect(pt))
  422. {
  423. SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEALL));
  424. return TRUE;
  425. }
  426. }
  427. return CXTPCommandBar::OnSetCursor(pWnd, nHitTest, message);
  428. }
  429. INT_PTR CXTPCommandBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
  430. {
  431. ASSERT_VALID(this);
  432. ASSERT(::IsWindow(m_hWnd));
  433. if (IsTrackingMode() == TRUE_POPUP && GetPosition() != xtpBarPopup)
  434. return -1;
  435. if (m_nPopuped != -1)
  436. return -1;
  437. BOOL bToolBarAccelTips = FALSE;
  438. CXTPCommandBars* pCommandBars = GetCommandBars();
  439. CXTPMouseManager* pMouseManager = pCommandBars->GetMouseManager();
  440. if (pMouseManager->IsMouseLocked() || pMouseManager->IsTrackedLock(this))
  441. return -1;
  442. if (pCommandBars)
  443. {
  444. if (!pCommandBars->GetCommandBarsOptions()->bToolBarScreenTips)
  445. return -1;
  446. bToolBarAccelTips = pCommandBars->GetCommandBarsOptions()->bToolBarAccelTips;
  447. }
  448. CXTPControl* pControl = m_pControls->HitTest(point);
  449. if (!pControl)
  450. return -1;
  451. if (m_barType == xtpBarTypePopup && (!pCommandBars || (!pCommandBars->GetCommandBarsOptions()->bShowPopupBarToolTips &&
  452. ((pControl->GetFlags() & xtpFlagShowPopupBarTip) == 0))))
  453. {
  454. return -1;
  455. }
  456. INT_PTR nHit = pControl->OnToolHitTest(point, pTI);
  457. if (nHit != -1)
  458. {
  459. if (pTI->hwnd != m_hWnd)
  460. return -1;
  461. if (pTI != NULL && pTI->cbSize == sizeof(XTP_TOOLTIP_TOOLINFO_EX))
  462. {
  463. if (((XTP_TOOLTIP_TOOLINFO_EX*)pTI)->pToolInfo != NULL) ((XTP_TOOLTIP_TOOLINFO_EX*)pTI)->pToolInfo->pObject = pControl;
  464. }
  465. return nHit;
  466. }
  467. nHit = pControl->GetIconId();
  468. CRect rect = pControl->GetRect();
  469. CString strTip = pControl->GetTooltip();
  470. if (strTip.GetLength() == 0)
  471. return -1;
  472. CString strShortcut = pControl->m_strShortcutText;
  473. if (pCommandBars && bToolBarAccelTips)
  474. {
  475. if (strShortcut.IsEmpty())
  476. {
  477. strShortcut = pControl->m_strShortcutTextAuto;
  478. if (!pCommandBars->GetShortcutManager()->FindDefaultAccelerator((UINT)pControl->GetID(), strShortcut))
  479. strShortcut.Empty();
  480. }
  481. if ((strShortcut.GetLength() > 0) && (strTip[0] != '<'))
  482. {
  483. strTip += _T(" (") + strShortcut +_T(")");
  484. }
  485. }
  486. CXTPToolTipContext::FillInToolInfo(pTI, m_hWnd, rect, nHit,
  487. strTip, strTip, pControl->GetDescription(), GetImageManager());
  488. if (pTI != NULL && pTI->cbSize == sizeof(XTP_TOOLTIP_TOOLINFO_EX))
  489. {
  490. if (((XTP_TOOLTIP_TOOLINFO_EX*)pTI)->pToolInfo != NULL) ((XTP_TOOLTIP_TOOLINFO_EX*)pTI)->pToolInfo->pObject = pControl;
  491. }
  492. // found matching rect, return the ID of the button
  493. return nHit != 0 ? nHit : -1;
  494. }
  495. void CXTPToolBar::OnRButtonDown(UINT nFlags, CPoint point)
  496. {
  497. CXTPControl* pControl = m_pControls->HitTest(point);
  498. if (pControl && pControl->OnRButtonDown(point))
  499. return;
  500. CXTPCommandBars* pCommandBars = GetCommandBars();
  501. if (!pCommandBars) return;
  502. if (IsCustomizeMode())
  503. {
  504. CXTPCommandBar::OnRButtonDown(nFlags, point);
  505. return;
  506. }
  507. SetTrackingMode(FALSE);
  508. SetSelected(-1);
  509. Redraw();
  510. ClientToScreen(&point);
  511. pCommandBars->ContextMenu(this, point);
  512. }
  513. BOOL CXTPToolBar::Create(CWnd* pParentWnd, BOOL bFloat)
  514. {
  515. if (!IsWindow(m_hWnd))
  516. {
  517. DWORD dwStyle = (bFloat ? WS_POPUP : WS_CHILD) | MFS_SYNCACTIVE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
  518. CPoint pt = m_pDockContext ? m_pDockContext->m_ptMRUFloatPos : CPoint(100, 100);
  519. CXTPCommandBars* pCommandBars = GetCommandBars();
  520. int nLayoutRTL = pCommandBars && pCommandBars->IsLayoutRTL() ? WS_EX_LAYOUTRTL : 0;
  521. if (!CWnd::CreateEx(nLayoutRTL, _T("XTPToolBar"), m_strTitle, dwStyle, CRect(pt, CSize(0, 0)), pParentWnd, 0))
  522. return FALSE;
  523. ShowWindow(SW_SHOWNA);
  524. }
  525. if (!bFloat)
  526. {
  527. ModifyStyle(WS_POPUP, WS_CHILD);
  528. }
  529. else
  530. {
  531. SetWindowLongPtr(m_hWnd, GWLP_HWNDPARENT, (LONG_PTR)0);
  532. ModifyStyle(WS_CHILD, WS_POPUP | MFS_SYNCACTIVE);
  533. SetWindowLongPtr(m_hWnd, GWLP_HWNDPARENT, (LONG_PTR)pParentWnd->m_hWnd);
  534. }
  535. return TRUE;
  536. }
  537. CRect CXTPToolBar::GetBorders()
  538. {
  539. if (GetPosition() == xtpBarFloating)
  540. {
  541. return CRect(3, 3, 3, 3);
  542. }
  543. CRect rcBorder = GetPaintManager()->GetCommandBarBorders(this);
  544. if (GetShowGripper())
  545. rcBorder.TopLeft() += GetPaintManager()->DrawCommandBarGripper(NULL, this, FALSE);
  546. return rcBorder;
  547. }
  548. CSize CXTPToolBar::CalcDockingLayout(int nLength, DWORD dwMode, int nWidth)
  549. {
  550. CClientDC dc(this);
  551. CXTPFontDC font(&dc, GetPaintManager()->GetCommandBarFont(this));
  552. CXTPControlPopup* pPopupExp = NULL;
  553. CRect rcBorder(GetBorders());
  554. CXTPControl* pHide = m_pControls->FindControl(XTP_ID_TOOLBAR_HIDE);
  555. if (pHide)
  556. {
  557. pHide->SetHideFlags(xtpHideGeneric);
  558. }
  559. BOOL bShowExpandButtonAlways = FALSE;
  560. CXTPCommandBars* pCommandBars = GetCommandBars();
  561. if (pCommandBars) bShowExpandButtonAlways = pCommandBars->GetCommandBarsOptions()->bShowExpandButtonAlways;
  562. BOOL bCommit = TRUE;
  563. CSize sz = 0;
  564. if (m_bShowExpandButton)
  565. {
  566. pPopupExp = (CXTPControlPopup*)m_pControls->FindControl(XTP_ID_TOOLBAR_EXPAND);
  567. if (!pPopupExp)
  568. {
  569. pPopupExp = (CXTPControlPopup*)m_pControls->Add(new CControlButtonExpand(), XTP_ID_TOOLBAR_EXPAND, _T(""), -1, TRUE);
  570. }
  571. pPopupExp->SetHideFlags(xtpHideGeneric);
  572. if (bShowExpandButtonAlways)
  573. {
  574. if (dwMode & LM_HORZDOCK)
  575. rcBorder.right += 11;
  576. else
  577. rcBorder.bottom += 11;
  578. }
  579. else
  580. {
  581. if (dwMode & LM_COMMIT)
  582. {
  583. sz = m_pControls->CalcDynamicSize(&dc, nLength, dwMode, rcBorder, nWidth);
  584. if (((CControlButtonExpand*)pPopupExp)->IsHiddenExists())
  585. {
  586. if (dwMode & LM_HORZDOCK)
  587. rcBorder.right += 11; else rcBorder.bottom += 11;
  588. }
  589. else
  590. {
  591. bCommit = FALSE;
  592. pPopupExp = NULL;
  593. }
  594. }
  595. else
  596. {
  597. sz = m_pControls->CalcDynamicSize(&dc, nLength, dwMode, rcBorder, nWidth);
  598. CSize szMin = m_pControls->CalcDynamicSize(&dc, 1, dwMode, rcBorder, nWidth);
  599. if (m_pControls->GetVisibleCount() > 1)
  600. {
  601. if (dwMode & LM_HORZDOCK)
  602. sz.cx = max(sz.cx, szMin.cx + 11); else
  603. sz.cy = max(sz.cy, szMin.cy + 11);
  604. }
  605. pPopupExp = NULL;
  606. bCommit = FALSE;
  607. }
  608. }
  609. }
  610. if (bCommit)
  611. sz = m_pControls->CalcDynamicSize(&dc, nLength, dwMode, rcBorder, nWidth);
  612. if (pPopupExp)
  613. {
  614. pPopupExp->SetHideFlags(xtpNoHide);
  615. GetPaintManager()->DrawSpecialControl(0, xtpButtonExpandToolbar, pPopupExp, this, FALSE, &sz);
  616. }
  617. if ((m_nIdleFlags & xtpIdleLayout) && (dwMode & LM_COMMIT))
  618. {
  619. m_nIdleFlags &= ~xtpIdleLayout;
  620. Redraw();
  621. }
  622. return sz;
  623. }
  624. CSize CXTPToolBar::CalcDynamicLayout(int nLength, DWORD nMode)
  625. {
  626. ASSERT(!(nMode & LM_HORZDOCK || nMode & LM_VERTDOCK));
  627. CClientDC dc(this);
  628. CXTPFontDC font(&dc, GetPaintManager()->GetCommandBarFont(this));
  629. int nTitleSize = GetPaintManager()->DrawCommandBarGripper(&dc, this, FALSE).cy;
  630. CRect rcBorder(GetBorders());
  631. rcBorder.top += nTitleSize + 1;
  632. CXTPControlPopup* pPopupExp = NULL;
  633. CXTPControl* pHide = NULL;
  634. if (IsCloseable())
  635. {
  636. pHide = m_pControls->FindControl(XTP_ID_TOOLBAR_HIDE);
  637. if (!pHide)
  638. {
  639. pHide = (CXTPControlPopup*)m_pControls->Add(new CControlButtonHide(), XTP_ID_TOOLBAR_HIDE, _T(""), -1, TRUE);
  640. }
  641. pHide->SetHideFlags(xtpHideGeneric);
  642. }
  643. if (m_bShowExpandButton && m_pCommandBars)
  644. {
  645. pPopupExp = (CXTPControlPopup*)m_pControls->FindControl(XTP_ID_TOOLBAR_EXPAND);
  646. if (!pPopupExp)
  647. {
  648. pPopupExp = (CXTPControlPopup*)m_pControls->Add(new CControlButtonExpand(), XTP_ID_TOOLBAR_EXPAND, _T(""), -1, TRUE);
  649. }
  650. pPopupExp->SetHideFlags(xtpHideGeneric);
  651. }
  652. CSize sz;
  653. if (m_barType == xtpBarTypePopup)
  654. {
  655. UpdateShortcuts();
  656. sz = m_pControls->CalcPopupSize(&dc, 0, 0, rcBorder);
  657. }
  658. else
  659. sz = m_pControls->CalcDynamicSize(&dc, nLength, nMode, rcBorder);
  660. int nLeft = sz.cx - 3;
  661. if (pHide)
  662. {
  663. pHide->SetHideFlags(xtpNoHide);
  664. pHide->SetRect(CRect(nLeft - nTitleSize, 3, nLeft, 3 + nTitleSize));
  665. nLeft -= nTitleSize;
  666. if (pPopupExp) pPopupExp->SetWrap(TRUE);
  667. }
  668. BOOL bShowExpandButtonAlways = TRUE;
  669. CXTPCommandBars* pCommandBars = GetCommandBars();
  670. if (pCommandBars) bShowExpandButtonAlways = pCommandBars->GetCommandBarsOptions()->bShowExpandButtonAlways;
  671. if (pPopupExp && nLeft - nTitleSize > 0 && bShowExpandButtonAlways)
  672. {
  673. pPopupExp->SetWrap(TRUE);
  674. pPopupExp->SetHideFlags(xtpNoHide);
  675. pPopupExp->SetRect(CRect(nLeft - nTitleSize, 3, nLeft, 3 + nTitleSize));
  676. }
  677. if ((m_nIdleFlags & xtpIdleLayout) && (nMode & LM_COMMIT))
  678. {
  679. m_nIdleFlags &= ~xtpIdleLayout;
  680. Redraw();
  681. }
  682. return sz;
  683. }
  684. void CXTPToolBar::OnRecalcLayout()
  685. {
  686. if (!GetSafeHwnd())
  687. return;
  688. if (!IsVisible())
  689. return;
  690. if (m_bInRecalcLayout)
  691. return;
  692. m_bInRecalcLayout = TRUE;
  693. if (m_barPosition != xtpBarFloating)
  694. {
  695. CXTPCommandBars* pCommandBars = GetCommandBars();
  696. if (pCommandBars)
  697. {
  698. pCommandBars->RecalcFrameLayout();
  699. }
  700. else
  701. {
  702. CWnd* pSite = GetSite();
  703. CXTPClientRect rc(pSite);
  704. if (pSite) pSite->SendMessage(WM_SIZE, 0, MAKELPARAM(rc.Width(), rc.Height()));
  705. }
  706. }
  707. else if (IsVisible())
  708. {
  709. CSize sz = CalcDynamicLayout(-1, LM_MRUWIDTH | LM_HORZ | LM_COMMIT);
  710. CRect rc;
  711. GetWindowRect(&rc);
  712. MoveWindow(rc.left, rc.top, sz.cx, sz.cy, TRUE);
  713. }
  714. Redraw();
  715. m_bInRecalcLayout = FALSE;
  716. }
  717. BOOL CXTPToolBar::OnNcCreate(LPCREATESTRUCT lpCreateStruct)
  718. {
  719. if (!CXTPCommandBar::OnNcCreate(lpCreateStruct))
  720. return FALSE;
  721. if (GetStyle() & MFS_SYNCACTIVE)
  722. {
  723. // syncronize activation state with top level parent
  724. CWnd* pParentWnd = GetTopLevelParent();
  725. ASSERT(pParentWnd != NULL);
  726. if (!pParentWnd)
  727. return FALSE;
  728. CWnd* pActiveWnd = GetForegroundWindow();
  729. BOOL bActive = (pParentWnd == pActiveWnd) ||
  730. (pParentWnd->GetLastActivePopup() == pActiveWnd &&
  731. pActiveWnd->SendMessage(WM_FLOATSTATUS, FS_SYNCACTIVE) != 0);
  732. // the WM_FLOATSTATUS does the actual work
  733. SendMessage(WM_FLOATSTATUS, bActive ? FS_ACTIVATE : FS_DEACTIVATE);
  734. }
  735. return TRUE;
  736. }
  737. LRESULT CXTPToolBar::OnFloatStatus(WPARAM wParam, LPARAM)
  738. {
  739. // FS_SYNCACTIVE is used to detect MFS_SYNCACTIVE windows
  740. LRESULT lResult = ((GetStyle() & MFS_SYNCACTIVE) && (wParam & FS_SYNCACTIVE));
  741. if (m_barPosition != xtpBarFloating || !m_bVisible)
  742. return lResult;
  743. BOOL bSyncActivate = TRUE;
  744. CXTPCommandBars* pCommandBars = GetCommandBars();
  745. if (pCommandBars) bSyncActivate = pCommandBars->GetCommandBarsOptions()->bSyncFloatingBars;
  746. if (bSyncActivate)
  747. {
  748. if ((wParam & FS_DEACTIVATE) && !IsTopParentActive())
  749. {
  750. SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
  751. }
  752. if ((wParam & FS_ACTIVATE) && !IsWindowVisible() && IsTopParentActive())
  753. {
  754. // check if parent invisible or minimized window
  755. DWORD dwStyle = ::GetWindowLong(::GetForegroundWindow(), GWL_STYLE);
  756. if ((dwStyle & WS_VISIBLE) && !(dwStyle & WS_MINIMIZE))
  757. SetWindowPos(NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
  758. }
  759. }
  760. if (wParam & (FS_SHOW | FS_HIDE))
  761. {
  762. SetWindowPos(NULL, 0, 0, 0, 0,
  763. ((wParam & FS_SHOW) ? SWP_SHOWWINDOW : SWP_HIDEWINDOW) | SWP_NOZORDER |
  764. SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
  765. }
  766. if (wParam & (FS_ENABLE | FS_DISABLE))
  767. EnableWindow((wParam & FS_ENABLE) != 0);
  768. return lResult;
  769. }
  770. BOOL CXTPToolBar::IsFloatingFrameFocused() const
  771. {
  772. if (!IsTopParentActive())
  773. return FALSE;
  774. CWnd* pWnd = CWnd::GetFocus();
  775. while (pWnd && IsWindow(pWnd->GetSafeHwnd()))
  776. {
  777. pWnd = pWnd->GetParentFrame();
  778. if (DYNAMIC_DOWNCAST(CMiniFrameWnd, pWnd))
  779. return TRUE;
  780. }
  781. return FALSE;
  782. }
  783. int CXTPToolBar::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
  784. {
  785. if (m_barPosition == xtpBarFloating || IsFloatingFrameFocused() || IsCustomizeMode())
  786. return MA_NOACTIVATE;
  787. return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
  788. }
  789. BOOL CXTPToolBar::OnNcActivate(BOOL bActive)
  790. {
  791. return bActive ? FALSE : CWnd::OnNcActivate(bActive);
  792. }
  793. void CXTPToolBar::OnLButtonDown(UINT nFlags, CPoint point)
  794. {
  795. if (m_barPosition == xtpBarFloating)
  796. SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
  797. if (m_pControls->HitTest(point) == NULL)
  798. {
  799. m_pCommandBars->ClosePopups();
  800. if (m_pDockContext && ((m_dwFlags & (xtpFlagAlignAny | xtpFlagFloating)) != 0))
  801. {
  802. ClientToScreen(&point);
  803. m_pDockContext->StartDrag(point);
  804. }
  805. }
  806. else
  807. {
  808. CXTPCommandBar::OnLButtonDown(nFlags, point);
  809. }
  810. }
  811. void CXTPToolBar::OnLButtonDblClk(UINT nFlags, CPoint point)
  812. {
  813. if (m_pControls->HitTest(point) == NULL)
  814. {
  815. if (m_pDockContext)
  816. {
  817. m_pDockContext->ToggleDocking();
  818. return;
  819. }
  820. }
  821. CXTPCommandBar::OnLButtonDblClk(nFlags, point);
  822. }
  823. LRESULT CXTPToolBar::OnNcHitTest(CPoint point)
  824. {
  825. if (m_barPosition != xtpBarFloating)
  826. return CXTPCommandBar::OnNcHitTest(point);
  827. if (m_barType == xtpBarTypePopup)
  828. return CXTPCommandBar::OnNcHitTest(point);
  829. CRect rectWindow;
  830. GetWindowRect(&rectWindow);
  831. rectWindow.InflateRect(-3, -3);
  832. if (point.y < rectWindow.top) return HTTOP;
  833. if (point.y >= rectWindow.bottom) return HTBOTTOM;
  834. if (point.x < rectWindow.left) return HTLEFT;
  835. if (point.x >= rectWindow.right) return HTRIGHT;
  836. return CXTPCommandBar::OnNcHitTest(point);
  837. }
  838. void CXTPToolBar::OnNcLButtonDown(UINT nHitTest, CPoint point)
  839. {
  840. if (!m_pDockContext)
  841. return;
  842. if (nHitTest >= HTSIZEFIRST && nHitTest <= HTSIZELAST)
  843. {
  844. ActivateTopParent();
  845. SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
  846. m_pCommandBars->ClosePopups();
  847. m_pDockContext->StartResize(nHitTest, point);
  848. return;
  849. }
  850. CXTPCommandBar::OnNcLButtonDown(nHitTest, point);
  851. }
  852. void CXTPToolBar::OnClose()
  853. {
  854. }
  855. BOOL CXTPToolBar::IsWindowVisible() const
  856. {
  857. return GetSafeHwnd() && IsVisible() && CWnd::IsWindowVisible() && !CXTPWindowRect(this).IsRectEmpty();
  858. }
  859. void CXTPToolBar::SetVisible(BOOL bVisible)
  860. {
  861. if (m_bVisible == bVisible)
  862. return;
  863. m_bVisible = bVisible;
  864. if (!bVisible)
  865. {
  866. SetTrackingMode(FALSE);
  867. }
  868. ShowWindow(bVisible ? SW_SHOWNA : SW_HIDE);
  869. CXTPCommandBars* pCommandBars = GetCommandBars();
  870. if (bVisible)
  871. {
  872. OnRecalcLayout();
  873. }
  874. else if (IsDockingPosition(m_barPosition))
  875. {
  876. if (pCommandBars)
  877. {
  878. pCommandBars->RecalcFrameLayout();
  879. }
  880. else
  881. {
  882. CWnd* pSite = GetSite();
  883. CXTPClientRect rc(pSite);
  884. if (pSite) pSite->SendMessage(WM_SIZE, 0, MAKELPARAM(rc.Width(), rc.Height()));
  885. }
  886. }
  887. if (pCommandBars)
  888. {
  889. BOOL bRemove = m_bTearOff && !bVisible;
  890. pCommandBars->GetSite()->SendMessage(WM_XTP_TOOLBARVISIBLECHANGED, (WPARAM)this, (LPARAM)m_bVisible);
  891. if (bRemove)
  892. pCommandBars->Remove(this);
  893. pCommandBars->GetCommandBarsOptions()->bDirtyState = TRUE;
  894. }
  895. }
  896. LRESULT CXTPToolBar::OnSizeParent(WPARAM, LPARAM lParam)
  897. {
  898. AFX_SIZEPARENTPARAMS* lpLayout = (AFX_SIZEPARENTPARAMS*)lParam;
  899. if (GetStyle() & WS_VISIBLE)
  900. {
  901. // align the control bar
  902. CRect rect;
  903. rect.CopyRect(&lpLayout->rect);
  904. CSize sizeAvail = rect.Size();  // maximum size available
  905. // get maximum requested size
  906. DWORD dwMode = LM_HORZDOCK | LM_HORZ | LM_COMMIT;
  907. if (GetFlags() & xtpFlagStretched) dwMode |= LM_STRETCH;
  908. if (GetFlags() & xtpFlagHideWrap) dwMode |= LM_HIDEWRAP;
  909. if (lpLayout->hDWP == NULL) dwMode &= ~LM_COMMIT;
  910. CSize size = CalcDockingLayout(sizeAvail.cx, dwMode);
  911. size.cx = min(size.cx, sizeAvail.cx);
  912. size.cy = min(size.cy, sizeAvail.cy);
  913. lpLayout->sizeTotal.cy += size.cy;
  914. lpLayout->sizeTotal.cx = max(lpLayout->sizeTotal.cx, size.cx);
  915. lpLayout->rect.top += size.cy;
  916. rect.right = rect.left + size.cx;
  917. rect.bottom = rect.top + size.cy;
  918. // only resize the window if doing layout and not just rect query
  919. if (lpLayout->hDWP != NULL)
  920. AfxRepositionWindow(lpLayout, m_hWnd, &rect);
  921. Redraw();
  922. }
  923. return 0;
  924. }
  925. CSize CXTPCommandBar::GetAutoIconSize(BOOL bLarge) const
  926. {
  927. return GetPaintManager()->GetAutoIconSize(bLarge);
  928. }
  929. CSize CXTPCommandBar::GetIconSize() const
  930. {
  931. CXTPCommandBars* pCommandBars = GetCommandBars();
  932. if (!pCommandBars)
  933. return m_szIcons != CSize(0) ? m_szIcons : CSize(16, 16);
  934. if (GetType() == xtpBarTypePopup)
  935. {
  936. return m_szIcons != CSize(0) ? m_szIcons : pCommandBars->m_pOptions->szPopupIcons != CSize(0) ? pCommandBars->m_pOptions->szPopupIcons : GetAutoIconSize(FALSE);
  937. }
  938. CSize sz = m_szIcons != CSize(0) ? m_szIcons: (pCommandBars->m_pOptions->szIcons != CSize(0) ? pCommandBars->m_pOptions->szIcons : GetAutoIconSize(FALSE));
  939. if (pCommandBars->m_pOptions->bLargeIcons && m_szButtons == CSize(0))
  940. {
  941. sz = pCommandBars->m_pOptions->szLargeIcons != CSize(0) ? pCommandBars->m_pOptions->szLargeIcons : GetAutoIconSize(TRUE);
  942. }
  943. return sz;
  944. }
  945. CSize CXTPCommandBar::GetLargeIconSize(BOOL bAutoSize) const
  946. {
  947. CXTPCommandBars* pCommandBars = GetCommandBars();
  948. if (!pCommandBars)
  949. return m_szIcons != CSize(0) ? CSize(2 * m_szIcons.cx, 2 * m_szIcons.cy) : CSize(32, 32);
  950. CSize sz = m_szIcons != CSize(0) ? m_szIcons: (pCommandBars->m_pOptions->szIcons != CSize(0) ?
  951. pCommandBars->m_pOptions->szIcons : CSize(16, 16));
  952. if (m_szButtons == CSize(0))
  953. {
  954. sz = pCommandBars->m_pOptions->szLargeIcons != CSize(0) ?
  955. pCommandBars->m_pOptions->szLargeIcons : (bAutoSize ? GetAutoIconSize(TRUE) : CSize(sz.cx * 2, sz.cy * 2));
  956. }
  957. return sz;
  958. }
  959. CSize CXTPCommandBar::GetButtonSize() const
  960. {
  961. if (m_szButtons != CSize(0)) return m_szButtons;
  962. CSize szIcon = GetIconSize();
  963. return CSize(szIcon.cx + 6, szIcon.cy + 6);
  964. }
  965. void CXTPCommandBar::ShowTextBelowIcons(BOOL bTextBelow)
  966.  {
  967. m_bTextBelow = bTextBelow;
  968. DelayLayout();
  969. }
  970. BOOL CXTPCommandBar::IsTextBelowIcons() const
  971. {
  972. if (m_bTextBelow != XTP_BOOL_DEFAULT)
  973. return m_bTextBelow;
  974. CXTPCommandBars* pCommandBars = GetCommandBars();
  975. if (pCommandBars)
  976. {
  977. return pCommandBars->m_pOptions->bShowTextBelowIcons;
  978. }
  979. return FALSE;
  980. }
  981. int CXTPToolBar::_FindNearest(CXTPControls* pControls, CXTPControl* pFind, int nPos, BOOL /*bVisible*/) const
  982. {
  983. if (pFind == NULL)
  984. return -1;
  985. int nResult = -1;
  986. for (int i = nPos; i < pControls->GetCount(); i++)
  987. {
  988. CXTPControl* pControl = pControls->GetAt(i);
  989. if (pControl->GetID() == pFind->GetID() && pControl->GetType() == pFind->GetType())
  990. {
  991. return i;
  992. }
  993. }
  994. return nResult;
  995. }
  996. void CXTPToolBar::Reset(BOOL bShowWarningMessage)
  997. {
  998. if (m_bBuiltIn && m_nBarID != 0 && IsCustomizable())
  999. {
  1000. if (bShowWarningMessage)
  1001. {
  1002. CString strMessage, strTitle = GetTitle(), strReset;
  1003. VERIFY(XTPResourceManager()->LoadString(&strReset, XTP_IDS_CONFIRM_RESET));
  1004. strMessage.Format(strReset, (LPCTSTR)strTitle);
  1005. CXTPPushRoutingFrame push(GetFrameSite());
  1006. if (XTPResourceManager()->ShowMessageBox(strMessage, MB_ICONWARNING | MB_OKCANCEL) != IDOK)
  1007. return;
  1008. }
  1009. if (m_pControls->m_pOriginalControls != NULL)
  1010. {
  1011. m_pControls->RemoveAll();
  1012. CXTPControls* pControls = m_pControls->m_pOriginalControls;
  1013. for (int i = 0; i < pControls->GetCount(); i++)
  1014. {
  1015. CXTPControl* pControl = pControls->GetAt(i);
  1016. if (!pControl->m_bTemporary)
  1017. m_pControls->AddClone(pControl, -1, TRUE);
  1018. }
  1019. }
  1020. else
  1021. {
  1022. LoadToolBar(m_nBarID, FALSE);
  1023. }
  1024. CWnd* pWnd = GetSite();
  1025. if (pWnd && ::IsWindow(pWnd->m_hWnd)) pWnd->SendMessage(WM_XTP_CUSTOMIZATION_RESETTOOLBAR, 0, (LPARAM)this);
  1026. OnInitialUpdate();
  1027. OnRecalcLayout();
  1028. }
  1029. }
  1030. void CXTPToolBar::BuildCustomizePopup(CXTPCommandBar* pExpandBar)
  1031. {
  1032. CXTPCommandBars* pCommandBars = GetCommandBars();
  1033. if (!pCommandBars)
  1034. return;
  1035. CXTPControls* pOriginalControls = m_pControls->m_pOriginalControls ? m_pControls->m_pOriginalControls->Duplicate(FALSE) : new CXTPControls();
  1036. ASSERT(pOriginalControls);
  1037. int nOriginal = 0;
  1038. int nToolBar = 0;
  1039. while (nToolBar < GetControlCount())
  1040. {
  1041. if ((GetControl(nToolBar)->GetHideFlags() & xtpHideCustomize) != 0)
  1042. {
  1043. int nSelected = m_nSelected;
  1044. int nPopuped = m_nPopuped;
  1045. GetControls()->Remove(nToolBar);
  1046. if (nPopuped != -1) m_nPopuped = nPopuped + (nToolBar < nPopuped ? - 1 : 0);
  1047. if (nSelected != -1) m_nSelected = nSelected + (nToolBar < nSelected ? - 1 : 0);
  1048. }
  1049. else
  1050. nToolBar++;
  1051. }
  1052. nToolBar = 0;
  1053. while (nOriginal < pOriginalControls->GetCount() || nToolBar < GetControlCount())
  1054. {
  1055. CXTPControl* pOriginal = nOriginal < pOriginalControls->GetCount() ? pOriginalControls->GetAt(nOriginal) : NULL;
  1056. CXTPControl* pControl = nToolBar < GetControlCount() ? m_pControls->GetAt(nToolBar) : NULL;
  1057. int nNearest = _FindNearest(m_pControls, pOriginal, nToolBar, TRUE);
  1058. int nNearestOriginal = _FindNearest(pOriginalControls, pControl, nOriginal);
  1059. if (nNearest == -1 && pOriginal)
  1060. {
  1061. int nSelected = m_nSelected;
  1062. int nPopuped = m_nPopuped;
  1063. pControl = m_pControls->AddClone(pOriginal, nToolBar);
  1064. if (nPopuped != -1) m_nPopuped = nPopuped + (nToolBar <= nPopuped ? 1 : 0);
  1065. if (nSelected != -1) m_nSelected = nSelected + (nToolBar <= nSelected ? 1 : 0);
  1066. nNearestOriginal = nToolBar;
  1067. pControl->SetHideFlag(xtpHideCustomize, TRUE);
  1068. nOriginal++;
  1069. nToolBar++;
  1070. }
  1071. else
  1072. {
  1073. if (nNearest == nToolBar) nOriginal++;
  1074. else if (nNearestOriginal != -1) pOriginalControls->Remove(nNearestOriginal);
  1075. nToolBar++;
  1076. }
  1077. ASSERT(pControl);
  1078. if (!pControl)
  1079. {
  1080. continue;
  1081. }
  1082. if (pControl->GetID() == XTP_ID_TOOLBAR_HIDE || pControl->GetID() == XTP_ID_TOOLBAR_EXPAND)
  1083. {
  1084. continue;
  1085. }
  1086. if (pControl->GetAction() && !pControl->GetAction()->IsVisible())
  1087. continue;
  1088. if ((pControl->GetHideFlags() & (xtpHideGeneric | xtpHideDocTemplate | xtpHideRibbonTab)) != 0)
  1089. {
  1090. continue;
  1091. }
  1092. if (!pControl->IsCustomizeMovable())
  1093. {
  1094. continue;
  1095. }
  1096. CControlButtonCustomize* pButton = (CControlButtonCustomize*)pExpandBar->GetControls()->Add(new CControlButtonCustomize(), 0);
  1097. pButton->SetCaption(pControl->GetCaption());
  1098. XTPControlType controlType = pControl->GetType();
  1099. if ((controlType == xtpControlPopup) || (controlType == xtpControlButtonPopup) || (controlType == xtpControlSplitButtonPopup) || (controlType == xtpControlButton))
  1100. pButton->SetIconId(pControl->GetIconId());
  1101. CString strShortcut = pControl->m_strShortcutText;
  1102. if (strShortcut.IsEmpty())
  1103. pCommandBars->GetShortcutManager()->FindDefaultAccelerator(pControl->GetID(), strShortcut);
  1104. pButton->SetShortcutText(strShortcut);
  1105. pButton->SetEnabled(nNearestOriginal != -1);
  1106. pButton->SetChecked((pControl->GetHideFlags() & xtpHideCustomize) == 0);
  1107. pButton->m_pControl = pControl;
  1108. }
  1109. pOriginalControls->InternalRelease();
  1110. if (m_pControls->m_pOriginalControls && !m_bTearOff && m_bBuiltIn)
  1111. {
  1112. CControlButtonCustomize* pButton = (CControlButtonCustomize*)pExpandBar->GetControls()->Add(new CControlButtonCustomize(), XTP_ID_CUSTOMIZE_RESET);
  1113. pButton->SetFlags(xtpFlagManualUpdate);
  1114. pButton->SetBeginGroup(TRUE);
  1115. pButton->m_pToolBar = this;
  1116. }
  1117. }
  1118. void CXTPToolBar::OnSetPreviewMode(BOOL bPreview)
  1119. {
  1120. if (m_bPreviewMode == bPreview)
  1121. return;
  1122. m_bPreviewMode = bPreview;
  1123. if (bPreview)
  1124. {
  1125. m_bPreviewVisible = m_bVisible;
  1126. if (m_bVisible)
  1127. {
  1128. m_bVisible = FALSE;
  1129. ShowWindow(SW_HIDE);
  1130. }
  1131. }
  1132. else if (m_bPreviewVisible)
  1133. {
  1134. m_bVisible = TRUE;
  1135. ShowWindow(SW_SHOWNA);
  1136. if (GetType() == xtpBarTypeMenuBar)
  1137. {
  1138. CFrameWnd* pFrameWnd = GetFrameSite();
  1139. if (pFrameWnd && pFrameWnd->GetSafeHwnd()) pFrameWnd->OnUpdateFrameMenu(0);
  1140. }
  1141. }
  1142. }
  1143. void CXTPToolBar::Copy(CXTPCommandBar* pCommandBar, BOOL bRecursive)
  1144. {
  1145. CXTPCommandBar::Copy(pCommandBar, bRecursive);
  1146. m_bBuiltIn = ((CXTPToolBar*)pCommandBar)->m_bBuiltIn;
  1147. m_bTearOff = ((CXTPToolBar*)pCommandBar)->m_bTearOff;
  1148. m_bCloseable = ((CXTPToolBar*)pCommandBar)->m_bCloseable;
  1149. }
  1150. BOOL CXTPToolBar::OnHookKeyDown(UINT nChar, LPARAM lParam)
  1151. {
  1152. if (m_pDockContext == NULL && nChar == VK_TAB && GetParent())
  1153. {
  1154. CWnd* pWndNext = GetParent()->GetNextDlgTabItem(this,
  1155. (GetKeyState(VK_SHIFT) < 0));
  1156. if (pWndNext != NULL && pWndNext != this)
  1157. {
  1158. pWndNext->SetFocus();
  1159. SetTrackingMode(FALSE);
  1160. return TRUE;
  1161. }
  1162. }
  1163. return CXTPCommandBar::OnHookKeyDown(nChar, lParam);
  1164. }
  1165. void CXTPToolBar::OnSetFocus(CWnd* pOldWnd)
  1166. {
  1167. if (!m_hwndFocus && pOldWnd) m_hwndFocus = pOldWnd->GetSafeHwnd();
  1168. CXTPCommandBar::OnSetFocus(pOldWnd);
  1169. if (m_pDockContext == NULL)
  1170. {
  1171. SetTrackingMode(TRUE, TRUE);
  1172. }
  1173. }
  1174. BOOL CXTPToolBar::ShouldSerializeBar()
  1175. {
  1176. if (!IsCustomizable())
  1177. return FALSE;
  1178. if (GetControls()->GetOriginalControls() && !GetControls()->IsChanged())
  1179. return FALSE;
  1180. return TRUE;
  1181. }