ExtDockBar.h
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:26k
源码类别:

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #if (!defined __EXTDOCKBAR_H)
  22. #define __EXTDOCKBAR_H
  23. #if (!defined __EXT_MFC_DEF_H)
  24. #include <ExtMfcDef.h>
  25. #endif // __EXT_MFC_DEF_H
  26. #if (!defined __AFXPRIV_H__)
  27. #include <AfxPriv.h>
  28. #endif
  29. #if (!defined __EXT_CONTROLBAR_H)
  30. #include <ExtControlBar.h>
  31. #endif
  32. #if (!defined __EXT_TOOLCONTROLBAR_H)
  33. #include <ExtToolControlBar.h>
  34. #endif
  35. #if (!defined __EXT_MENUCONTROLBAR_H)
  36. #include <ExtMenuControlBar.h>
  37. #endif
  38. #if (!defined __EXT_POPUP_MENU_WND_H)
  39. #include <ExtPopupMenuWnd.h>
  40. #endif
  41. #if (!defined __EXT_PAINT_MANAGER_H)
  42. #include <ExtPaintManager.h>
  43. #endif
  44. #if (!defined __EXT_MFC_NO_TAB_CTRL)
  45. #if (!defined __EXT_TABWND_H)
  46. #include <ExtTabWnd.h>
  47. #endif
  48. #endif // (!defined __EXT_MFC_NO_TAB_CTRL)
  49. #if _MSC_VER >= 1000
  50. #pragma once
  51. #endif // _MSC_VER >= 1000
  52. #ifdef _DEBUG
  53. #define ASSERT_BAR_LOCATION_IN_ROW( __DOCK_BAR, __BAR__ ) 
  54. CExtDockBar::_AssertValid_FixedBarNotInNonfixedRow( 
  55. __DOCK_BAR, 
  56. __BAR__ 
  57. )
  58. #endif
  59. #if (!defined ASSERT_BAR_LOCATION_IN_ROW)
  60. #define ASSERT_BAR_LOCATION_IN_ROW( __DOCK_BAR, __BAR__ )
  61. #endif
  62. #ifdef _DEBUG
  63. #define ASSERT_DOCKBAR_DLGCTRLID( __ID__ ) 
  64. ASSERT( 
  65. __ID__ == AFX_IDW_DOCKBAR_FLOAT 
  66. || __ID__ == AFX_IDW_DOCKBAR_LEFT 
  67. || __ID__ == AFX_IDW_DOCKBAR_TOP 
  68. || __ID__ == AFX_IDW_DOCKBAR_RIGHT 
  69. || __ID__ == AFX_IDW_DOCKBAR_BOTTOM 
  70. )
  71. #define ASSERT_DOCKBAR_DLGCTRLID_DOCKED( __ID__ ) 
  72. ASSERT( 
  73. __ID__ == AFX_IDW_DOCKBAR_LEFT 
  74. || __ID__ == AFX_IDW_DOCKBAR_TOP 
  75. || __ID__ == AFX_IDW_DOCKBAR_RIGHT 
  76. || __ID__ == AFX_IDW_DOCKBAR_BOTTOM 
  77. )
  78. #define ASSERT_HWND_IS_DOCKBAR( __hWndDockBar__, __nDockBarID__, __nCircleNo__ ) 
  79. CExtDockBar::_Assert_HwndIsDockbar( 
  80. __hWndDockBar__, 
  81. __nDockBarID__, 
  82. __nCircleNo__ 
  83. )
  84. #define ASSERT_HWND_IS_AUTOHIDER( __hWndAutoHider__, __nAutoHiderID__ ) 
  85. CExtDockBar::_Assert_HwndIsAutoHider( 
  86. __hWndAutoHider__, 
  87. __nAutoHiderID__ 
  88. )
  89. #else // _DEBUG
  90. #define ASSERT_DOCKBAR_DLGCTRLID( __ID__ )
  91. #define ASSERT_DOCKBAR_DLGCTRLID_DOCKED( __ID__ )
  92. #define ASSERT_HWND_IS_DOCKBAR( __hWndDockBar__, __nDockBarID__, __nCircleNo__ )
  93. #define ASSERT_HWND_IS_AUTOHIDER( __hWndAutoHider__, __nAutoHiderID__ )
  94. #endif // not _DEBUG
  95. //#define __DEBUG_PAINTING_AREAS_DOCKBAR__
  96. //#define __DEBUG_PAINTING_AREAS_EXTRESIZABLEBAR__
  97. /// #define __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  98. class CExtDockBar;
  99. class CExtDockDynBar;
  100. class CExtDynControlBar;
  101. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  102. class CExtDynTabWnd;
  103. class CExtDynTabControlBar;
  104. class CExtDynAutoHideArea;
  105. class CExtDynAutoHideSlider;
  106. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  107. /////////////////////////////////////////////////////////////////////////
  108. // CExtDockBar window
  109. class __PROF_UIS_API CExtDockBar
  110. : public CDockBar
  111. , CExtPmBridge
  112. {
  113. friend class CExtBarButton;
  114. friend class CExtBarContentExpandButton;
  115. friend class CExtControlBar;
  116. friend class CExtControlBar::InternalDockStateBar;
  117. friend class CExtControlBar::InternalDockStateSite;
  118. friend class CExtToolControlBar;
  119. friend class CExtMiniDockFrameWnd;
  120. friend class CExtDynControlBar;
  121. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  122. friend class CExtDynTabControlBar;
  123. friend class CExtDynAutoHideArea;
  124. friend class CExtDynAutoHideSlider;
  125. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  126. DECLARE_DYNCREATE( CExtDockBar );
  127. DECLARE_CExtPmBridge_MEMBERS( CExtPmBridge );
  128. protected:
  129. static bool g_bControlBarFixSizePixel;
  130. bool m_bLockedOptimize:1;
  131. UINT m_nCircleNo;
  132. CExtDockBar
  133. * m_pDockBarOuter,
  134. * m_pDockBarInner;
  135. CRect m_rcLastInvisiblePreCalc;
  136. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  137. CExtDynAutoHideArea * m_pWndAutoHideArea;
  138. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  139. public:
  140. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  141. virtual void OnCustomizeModeEnter();
  142. virtual void OnCustomizeModeLeave();
  143. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  144. bool _IsLayoutQuery()
  145. {
  146. return CDockBar::m_bLayoutQuery ? true : false;
  147. }
  148. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  149. virtual CExtDynAutoHideArea * _GetAutoHideArea();
  150. const CExtDynAutoHideArea * _GetAutoHideArea() const
  151. {
  152. return ( ((CExtDockBar *)this)->_GetAutoHideArea() );
  153. }
  154. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  155. CExtDockBar(
  156. UINT nCircleNo = 0
  157. );
  158. virtual ~CExtDockBar();
  159. UINT _GetCircleNo() const
  160. {
  161. ASSERT( this != NULL );
  162. return m_nCircleNo;
  163. }
  164. CExtDockBar * _GetDockBarInner()
  165. {
  166. ASSERT( this != NULL );
  167. return m_pDockBarInner;
  168. }
  169. const CExtDockBar * _GetDockBarInner() const
  170. {
  171. ASSERT( this != NULL );
  172. return m_pDockBarInner;
  173. }
  174. CExtDockBar * _GetDockBarOuter()
  175. {
  176. ASSERT( this != NULL );
  177. return m_pDockBarOuter;
  178. }
  179. const CExtDockBar * _GetDockBarOuter() const
  180. {
  181. ASSERT( this != NULL );
  182. return m_pDockBarOuter;
  183. }
  184. CExtDockBar * _GetDockBarInnerTop()
  185. {
  186. ASSERT( this != NULL );
  187. if( m_pDockBarInner == NULL )
  188. return this;
  189. CExtDockBar * pBar = m_pDockBarInner;
  190. while( pBar->m_pDockBarInner != NULL )
  191. pBar = pBar->m_pDockBarInner;
  192. return pBar;
  193. }
  194. const CExtDockBar * _GetDockBarInnerTop() const
  195. {
  196. ASSERT( this != NULL );
  197. if( m_pDockBarInner == NULL )
  198. return this;
  199. const CExtDockBar * pBar = m_pDockBarInner;
  200. while( pBar->m_pDockBarInner != NULL )
  201. pBar = pBar->m_pDockBarInner;
  202. return pBar;
  203. }
  204. CExtDockBar * _GetDockBarOuterTop()
  205. {
  206. ASSERT( this != NULL );
  207. if( m_pDockBarOuter == NULL )
  208. return this;
  209. CExtDockBar * pBar = m_pDockBarOuter;
  210. while( pBar->m_pDockBarOuter != NULL )
  211. pBar = pBar->m_pDockBarOuter;
  212. return pBar;
  213. }
  214. const CExtDockBar * _GetDockBarOuterTop() const
  215. {
  216. ASSERT( this != NULL );
  217. if( m_pDockBarOuter == NULL )
  218. return this;
  219. const CExtDockBar * pBar = m_pDockBarOuter;
  220. while( pBar->m_pDockBarOuter != NULL )
  221. pBar = pBar->m_pDockBarOuter;
  222. return pBar;
  223. }
  224. CExtDockBar * _GetBarByCircleNo( UINT nCircleNo );
  225. const CRect & _GetLastInvisiblePreCalcRect() const
  226. {
  227. ASSERT_VALID( this );
  228. return m_rcLastInvisiblePreCalc;
  229. }
  230. void _GetPreCalcWindowRect( CRect & rcPreCalc )
  231. {
  232. ASSERT_VALID( this );
  233. // bool bDockBarIsVisible =
  234. // ( (GetStyle() & WS_VISIBLE) != 0
  235. // &&
  236. // GetDockedVisibleCount() > 0
  237. // ) ? true : false;
  238. // if( bDockBarIsVisible )
  239. // {
  240. // ASSERT( GetSafeHwnd() != NULL );
  241. // ASSERT( ::IsWindow(GetSafeHwnd()) );
  242. // GetWindowRect( &rcPreCalc );
  243. // }
  244. // else
  245. rcPreCalc = _GetLastInvisiblePreCalcRect();
  246. }
  247. CExtDockBar * _GetInCircle(
  248. UINT nDockBarID,
  249. bool bEnableCreateNew = true
  250. );
  251. static CExtDockBar * _GetInCircle(
  252. CFrameWnd * pFrame,
  253. UINT nCircleNo,
  254. UINT nDockBarID,
  255. bool bEnableCreateNew = true
  256. );
  257. UINT _CreateInnerCircle();
  258. static UINT _CreateInnerCircle( CFrameWnd * pFrame );
  259. void _InjectInnerCircle();
  260. void _InjectCircle( UINT nCircleNo );
  261. static void _InjectCircle( CFrameWnd * pFrame, UINT nCircleNo );
  262. // HWND _GetHwndForInjectingAfter();
  263. static bool g_bExtendedRepositioning;
  264. CControlBar * _GetDockedControlBar( int nPos ) const
  265. {
  266. ASSERT_VALID( this );
  267. return CDockBar::GetDockedControlBar( nPos );
  268. }
  269. void RemoveAllPlaceHolders(
  270. bool bSearchPlaceHolder = true
  271. );
  272. void RemovePlaceHolder(
  273. CControlBar * pBar,
  274. bool bSearchPlaceHolder = true,
  275. bool * p_bRemoved = NULL
  276. );
  277. static void _RemovePlaceHolder(
  278. CFrameWnd * pFrame,
  279. CControlBar * pBar,
  280. bool * p_bRemoved = NULL
  281. );
  282. void _SlideDockControlBar(
  283. CControlBar* pBar,
  284. LPCRECT lpRect,
  285. BOOL bMovingEnabled,
  286. const POINT * ptDesiredMid = NULL
  287. );
  288. void _NewRowDockControlBar(
  289. CControlBar * pExtBarDocked,
  290. CControlBar * pExtBarNew,
  291. bool bLessIndex
  292. );
  293. void _InnerOuterDockControlBar(
  294. CControlBar * pBar,
  295. bool bInner
  296. );
  297. virtual void _LockSequenceOptimization( bool bLock );
  298. void DockControlBar(
  299. CControlBar * pBar,
  300. LPCRECT lpRect = NULL,
  301. bool bSmoothMode = false,
  302. bool bForceNoOptimize = false
  303. );
  304. void _OptimizeCircles();
  305. static void _OptimizeCircles( CFrameWnd * pFrame );
  306. bool _CanBeSafeOptimized();
  307. void _SafeOptimizeInnerOuterChain();
  308.     CFrameWnd * _GetDockingFrameImpl();
  309. BOOL RemoveControlBar(
  310. CControlBar * pBar,
  311. int nPosExclude = -1,
  312. int nAddPlaceHolder = 0,
  313. bool bEnableFrameDelayRecalcLayout = true
  314. );
  315. static bool _ConstructDockSiteControlBarPopupMenu(
  316. CFrameWnd * pFrame,
  317. CExtPopupMenuWnd * pPopup,
  318. SHORT nHelperNotificationType,
  319. CControlBar * pBarEventSrc,
  320. UINT nMsgID = WM_NULL,
  321. CObject * pObjectSrc = NULL
  322. );
  323. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  324. static bool _AppendAddRemoveButtonsCustomizeMenu(
  325. CExtPopupMenuWnd * pPopup,
  326. CControlBar * pBarEventSrc
  327. );
  328. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  329. protected:
  330. int _InsertByPointImpl(
  331. CControlBar * pBar,
  332. CRect rect,
  333. CPoint ptMid
  334. );
  335. int Insert(
  336. CControlBar * pBar,
  337. CRect rect,
  338. CPoint ptMid
  339. );
  340. public:
  341. #ifdef _DEBUG
  342. void _AssertValid_CheckBarRows() const;
  343. static void _AssertValid_FixedBarNotInNonfixedRow(
  344. CDockBar * pDockBar,
  345. CControlBar * pBar
  346. );
  347. static void _Assert_HwndIsDockbar(
  348. HWND hWndDockBar,
  349. UINT nDockBarID,
  350. UINT nCircleNo
  351. );
  352. static void _Assert_HwndIsDockbar(
  353. CWnd * pWnd,
  354. UINT nDockBarID,
  355. UINT nCircleNo
  356. )
  357. {
  358. HWND hWndDockBar = pWnd->GetSafeHwnd();
  359. _Assert_HwndIsDockbar(
  360. hWndDockBar,
  361. nDockBarID,
  362. nCircleNo
  363. );
  364. }
  365. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  366. static void _Assert_HwndIsAutoHider(
  367. HWND hWndAutoHider,
  368. UINT nAutoHiderID
  369. );
  370. static void _Assert_HwndIsAutoHider(
  371. CWnd * pWndAutoHider,
  372. UINT nAutoHiderID
  373. )
  374. {
  375. HWND hWndAutoHider = pWndAutoHider->GetSafeHwnd();
  376. _Assert_HwndIsAutoHider(
  377. hWndAutoHider,
  378. nAutoHiderID
  379. );
  380. }
  381. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  382. virtual void AssertValid() const
  383. {
  384. ASSERT( this != NULL );
  385. _AssertValid_CheckBarRows();
  386. CDockBar::AssertValid();
  387. if( m_pDockBarInner != NULL )
  388. {
  389. ASSERT_KINDOF( CExtDockBar, m_pDockBarInner );
  390. ASSERT( m_pDockBarInner->m_pDockBarOuter == this );
  391. // ASSERT( m_pDockBarInner->m_nCircleNo == (m_nCircleNo+1) );
  392.    ASSERT( m_pDockBarInner->m_nCircleNo >= (m_nCircleNo+1) );
  393. }
  394. if( m_pDockBarOuter != NULL )
  395. {
  396. ASSERT_KINDOF( CExtDockBar, m_pDockBarOuter );
  397. ASSERT( m_pDockBarOuter->m_pDockBarInner == this );
  398. // ASSERT( m_pDockBarOuter->m_nCircleNo == (m_nCircleNo-1) );
  399.    ASSERT( m_pDockBarOuter->m_nCircleNo <= (m_nCircleNo-1) );
  400. }
  401. }
  402. virtual void Dump( CDumpContext & dc ) const
  403. {
  404. CDockBar::Dump( dc );
  405. }
  406. #endif
  407. protected:
  408. bool m_bInDynamicLayoutUpdate:1;
  409. static bool g_bDockBarClassRegistered;
  410. static bool RegisterDockBarClass();
  411. void _HandleDestruction();
  412. public:
  413. BOOL Create( CWnd * pParentWnd, DWORD dwStyle, UINT nID );
  414. virtual BOOL DestroyWindow();
  415. virtual void OnDynamicLayoutUpdate();
  416. virtual void OnDynamicLayoutOptimize();
  417. // this is the one and only method of interest
  418. virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
  419. virtual void DoPaint( CDC * pDC );
  420. void DrawBorders(CDC* pDC, CRect& rect);
  421. void DrawGripper(CDC* pDC, const CRect& rect);
  422. // Overrides
  423. // ClassWizard generated virtual function overrides
  424. //{{AFX_VIRTUAL(CExtDockBar)
  425. protected:
  426. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  427. public:
  428. virtual BOOL PreTranslateMessage(MSG* pMsg);
  429. //}}AFX_VIRTUAL
  430. protected:
  431. virtual void PreSubclassWindow();
  432. virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
  433. //{{AFX_MSG(CExtDockBar)
  434. afx_msg void OnDestroy();
  435. //}}AFX_MSG
  436. afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
  437. afx_msg void OnCancelMode();
  438. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  439. afx_msg LRESULT OnSizeParent(WPARAM wParam, LPARAM lParam);
  440. afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
  441. afx_msg void OnNcPaint();
  442. afx_msg LRESULT OnHelpHitTest(WPARAM wParam, LPARAM lParam);
  443. DECLARE_MESSAGE_MAP()
  444. }; // class CExtDockBar
  445. #define __EXT_DOCKBAR_CLASS_NAME _T("ProfUIS-DockBar")
  446. /////////////////////////////////////////////////////////////////////////
  447. // CExtDockDynBar window
  448. class __PROF_UIS_API CExtDockDynBar : public CExtDockBar
  449. {
  450. public:
  451. struct __PROF_UIS_API VisibleLayoutItem_t
  452. {
  453. CArray < CExtControlBar *, CExtControlBar * & > m_vRow;
  454. LONG m_nRowMetric;
  455. LONG m_nRowMinMetric;
  456. LONG m_nRowExtent;
  457. LONG m_nRowMinExtent;
  458. bool m_bOverflowMode:1;
  459. void _AssignFromOther(
  460. const VisibleLayoutItem_t & other
  461. );
  462. VisibleLayoutItem_t();
  463. VisibleLayoutItem_t(
  464. const VisibleLayoutItem_t & other
  465. );
  466. ~VisibleLayoutItem_t();
  467. VisibleLayoutItem_t & operator = (
  468. const VisibleLayoutItem_t & other
  469. );
  470. bool IsEmpty() const;
  471. bool IsRowMinSized() const;
  472. }; // struct VisibleLayoutItem_t
  473. struct __PROF_UIS_API VisibleLayout_t
  474. {
  475. CArray < VisibleLayoutItem_t *, VisibleLayoutItem_t * & > m_vRows;
  476. LONG m_nTotalMetric;
  477. LONG m_nTotalMinMetric;
  478. LONG m_nTotalMinExtent;
  479. LONG m_nTotalBarsCount;
  480. LONG m_nDelayShowCount;
  481. void _Clean();
  482. VisibleLayout_t();
  483. ~VisibleLayout_t();
  484. void AddBarPointer( CExtControlBar * pBar );
  485. void MakeNewRow();
  486. bool IsEmpty() const;
  487. }; // struct VisibleLayout_t
  488. void _VisibleLayoutBuild(
  489. VisibleLayout_t & _vl
  490. );
  491. void _VisibleLayoutAlign(
  492. VisibleLayout_t & _vl,
  493. CSize _size
  494. );
  495. public:
  496. CExtDockDynBar( UINT nCircleNo = 0 );
  497. DECLARE_DYNCREATE( CExtDockDynBar );
  498. virtual void OnDynamicLayoutUpdate();
  499. virtual void OnDynamicLayoutOptimize();
  500. // this is the one and only method of interest
  501. virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
  502. virtual void CalcOrderedVector(
  503. ExtControlBarVector_t & vBars
  504. );
  505. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  506. virtual CExtDynAutoHideArea * _GetAutoHideArea();
  507. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  508. protected:
  509. bool m_bHelperDockSiteModified:1;
  510. public:
  511. bool m_bHelperSizing:1;
  512. virtual void _LockSequenceOptimization( bool bLock );
  513. #ifdef _DEBUG
  514. virtual void AssertValid() const
  515. {
  516. CExtDockBar::AssertValid();
  517. ASSERT( m_bAutoDelete );
  518. if( m_bHelperDockSiteModified
  519. && m_pDockSite != NULL
  520. )
  521. {
  522. // must be unregistered
  523. POSITION pos = m_pDockSite->m_listControlBars.Find( (void *)this );
  524. ASSERT( pos == NULL );
  525. }
  526. }
  527. virtual void Dump( CDumpContext & dc ) const
  528. {
  529. CExtDockBar::Dump( dc );
  530. }
  531. #endif
  532. // Overrides
  533. // ClassWizard generated virtual function overrides
  534. //{{AFX_VIRTUAL(CExtDockDynBar)
  535. public:
  536. virtual BOOL PreTranslateMessage(MSG* pMsg);
  537. //}}AFX_VIRTUAL
  538. //{{AFX_MSG(CExtDockDynBar)
  539. afx_msg void OnSize(UINT nType, int cx, int cy);
  540. //}}AFX_MSG
  541. DECLARE_MESSAGE_MAP()
  542. friend class CExtControlBar::InternalDockStateBar;
  543. }; // class CExtDockDynBar
  544. /////////////////////////////////////////////////////////////////////////
  545. // CExtDynControlBar window
  546. class __PROF_UIS_API CExtDynControlBar : public CExtControlBar
  547. {
  548. protected:
  549. bool m_bHelperDockSiteModified:1;
  550. public:
  551. CExtDockDynBar * m_pWndDynDocker;
  552. CExtDynControlBar();
  553. DECLARE_DYNCREATE( CExtDynControlBar );
  554. #ifdef _DEBUG
  555. virtual void AssertValid() const
  556. {
  557. CExtControlBar::AssertValid();
  558. ASSERT( m_bAutoDelete );
  559. if( m_pWndDynDocker != NULL
  560. && m_pDockSite != NULL
  561. )
  562. {
  563. ASSERT_VALID( m_pWndDynDocker );
  564. }
  565. }
  566. virtual void Dump( CDumpContext & dc ) const
  567. {
  568. CExtControlBar::Dump( dc );
  569. }
  570. #endif
  571. public:
  572. virtual void OnRepositionSingleChild(
  573. int cx = -1, // if negative - get from client area
  574. int cy = -1,
  575. bool bRedraw = true
  576. );
  577. virtual bool NcButtons_HandleClick(
  578. CExtBarNcAreaButton * pNcAreaButton,
  579. CPoint point,
  580. CExtControlBar * pBarEventSource,
  581. CExtControlBar * pBarActiveInContainer
  582. );
  583. virtual void NcButtons_PostClick(
  584. CExtBarNcAreaButton * pNcAreaButton,
  585. CPoint point,
  586. CExtControlBar * pBarEventSource,
  587. CExtControlBar * pBarActiveInContainer
  588. );
  589. virtual bool NcButtons_HandleQueryVisibility(
  590. bool & bButtonIsVisible,
  591. CExtBarNcAreaButton * pNcAreaButton,
  592. CExtControlBar * pBarEventSource,
  593. CExtControlBar * pBarActiveInContainer
  594. );
  595. virtual bool NcButtons_HandleDraw(
  596. CDC & dc,
  597. CExtBarNcAreaButton * pNcAreaButton,
  598. CExtControlBar * pBarEventSource,
  599. CExtControlBar * pBarActiveInContainer
  600. );
  601. virtual bool NcButtons_HandleHitTest(
  602. UINT & nExternalHT,
  603. CPoint point,
  604. CExtBarNcAreaButton * pNcAreaButton,
  605. CExtControlBar * pBarEventSource,
  606. CExtControlBar * pBarActiveInContainer
  607. );
  608. virtual bool NcButtons_HandleQueryCursor(
  609. HCURSOR & hExternalCursor,
  610. CPoint point,
  611. CExtBarNcAreaButton * pNcAreaButton,
  612. CExtControlBar * pBarEventSource,
  613. CExtControlBar * pBarActiveInContainer
  614. );
  615. virtual bool NcButtons_HandleReposition(
  616. CExtBarNcAreaButton * pPrevBtn,
  617. CExtBarNcAreaButton * pNcAreaButton,
  618. CExtControlBar * pBarEventSource,
  619. CExtControlBar * pBarActiveInContainer
  620. );
  621. virtual bool NcButtons_HandleToolHitTest(
  622. __EXT_MFC_INT_PTR & hExternalToolHT,
  623. CPoint point,
  624. TOOLINFO * pTI,
  625. CExtBarNcAreaButton * pNcAreaButton,
  626. CExtControlBar * pBarEventSource,
  627. CExtControlBar * pBarActiveInContainer
  628. );
  629. virtual bool FlashCaption(
  630. INT nFlashCount = -1, // negative value cancels current flashing
  631. INT nStepMilliseconds = 250,
  632. COLORREF clrFlashText = RGB(255,255,255),
  633. COLORREF clrFlashBackground = RGB(255,0,0)
  634. );
  635. virtual UINT TearOffCommandGet() const;
  636. virtual void TearOffCommandSet( UINT nCmdID );
  637. virtual bool _FloatStateChangingIsEnabled(
  638. const CExtControlBar * pBarQuerySrc
  639. ) const;
  640. virtual bool _NcMenuButtonIsEnabled(
  641. const CExtControlBar * pBarQuerySrc
  642. ) const;
  643. virtual bool _ClosingIsEnabled(
  644. const CExtControlBar * pBarQuerySrc
  645. ) const;
  646. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  647. virtual bool _AutoHidingIsEnabled(
  648. const CExtControlBar * pBarQuerySrc
  649. ) const;
  650. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  651. virtual bool _DraggingIsEnabled(
  652. const CExtControlBar * pBarQuerySrc
  653. ) const;
  654. virtual bool _RowResizingIsEnabled(
  655. const CExtControlBar * pBarQuerySrc
  656. ) const;
  657. virtual bool _RowRecalcingIsEnabled(
  658. const CExtControlBar * pBarQuerySrc
  659. ) const;
  660. virtual bool IsBarWithGripper(
  661. bool * pbGripperAtTop = NULL,
  662. bool * pbTextOnGripper = NULL
  663. ) const;
  664. virtual bool _DisplayingGet() const;
  665. virtual void _DisplayingSet( bool bDisplaying );
  666. virtual void OnShowControlBarChain(
  667. bool bShow,
  668. bool bDelay,
  669. bool bOnlyOneBar = false
  670. );
  671. virtual void OnControlBarPositionChange(
  672. CExtControlBar * pBarEventSrc,
  673. e_control_bar_position_changing_t eCBPC,
  674. bool bInitial,
  675. bool bFinal
  676. );
  677. virtual void DoPaintNC( CDC * pDC );
  678. virtual void DoPaint( CDC * pDC );
  679. virtual void DoEraseBk( CDC * pDC );
  680. protected:
  681. virtual void PostNcDestroy();
  682. virtual bool _CanDockToTabbedContainers(
  683. CExtControlBar * pDestBar
  684. ) const;
  685. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  686. virtual CExtDynTabControlBar * _GetNearestTabbedContainer();
  687. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  688. virtual void _OnNcMiniFrameActivate( bool bActive );
  689. virtual CSize _CalcLayoutMinSize() const;
  690. virtual INT _CalcDesiredMinHW() const;
  691. virtual INT _CalcDesiredMinVH() const;
  692. virtual CSize _CalcDesiredMinFloatedSize() const;
  693. mutable INT m_nDelVisUpdateCounter;
  694. public:
  695. virtual bool _IsDelayedVisibilityUpdateEnabled() const;
  696. virtual void DelayShow( BOOL bShow );
  697. virtual CSize CalcDynamicLayout(
  698. int nLength,
  699. DWORD nMode
  700. );
  701. virtual CExtDockDynBar * OnCreateDynamicDockBarObject();
  702. public:
  703. // Overrides
  704. // ClassWizard generated virtual function overrides
  705. //{{AFX_VIRTUAL(CExtDynControlBar)
  706. protected:
  707. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  708. //}}AFX_VIRTUAL
  709. public:
  710. virtual BOOL DestroyWindow();
  711. //{{AFX_MSG(CExtDynControlBar)
  712. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  713. //}}AFX_MSG
  714. DECLARE_MESSAGE_MAP()
  715. }; // class CExtDynControlBar
  716. /////////////////////////////////////////////////////////////////////////
  717. // CExtDockOuterBar window
  718. class __PROF_UIS_API CExtDockOuterBar : public CExtDockBar
  719. {
  720. public:
  721. struct __PROF_UIS_API OuterLayoutItemData
  722. {
  723. void _AssignFromOther(
  724. const OuterLayoutItemData & other
  725. );
  726. public:
  727. CControlBar * m_pBar;
  728. bool m_bVisible:1;
  729. CSize m_sizeCalcDynamic, m_sizeBarMin;
  730. CRect m_rcPreCalc, m_rcReal;
  731. OuterLayoutItemData();
  732. OuterLayoutItemData(
  733. CControlBar * pBar,
  734. BOOL bHorz,
  735. const SIZE & sizeMax
  736. );
  737. OuterLayoutItemData(
  738. const OuterLayoutItemData & other
  739. )
  740. {
  741. _AssignFromOther( other );
  742. }
  743. OuterLayoutItemData & operator = (
  744. const OuterLayoutItemData & other
  745. )
  746. {
  747. _AssignFromOther( other );
  748. return *this;
  749. }
  750. }; // struct OuterLayoutItemData
  751. typedef
  752. CArray < OuterLayoutItemData, OuterLayoutItemData >
  753. dockbar_outer_layout_t;
  754. void _RedockInRow(
  755. CExtControlBar * pBarSlide,
  756. int nShiftDesired,
  757. bool * p_bInplaceResizing = NULL
  758. );
  759. bool _ReDockToNewRow(
  760. CControlBar * pBarSlide,
  761. MfcControlBarVector_t & vRow,
  762. int nShiftDesired
  763. );
  764. private:
  765. void _SwapInRowWithAffixment(
  766. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  767. int nIdxLess,
  768. int nIdxGreater
  769. );
  770. bool _CompressSubRow(
  771. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  772. int nSubRowStartPos,
  773. int nSubRowEndPos,
  774. int nExtentMax,
  775. bool bHorz,
  776. bool & bAdjustWithAffixment,
  777. bool * p_bFullyOccupiedLayout = NULL
  778. );
  779. void _CalcFixedRowLayout(
  780. CSize & sizeFixed,
  781. CSize & sizeMax,
  782. CPoint & pt,
  783. BOOL bHorz,
  784. AFX_SIZEPARENTPARAMS & layout,
  785. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  786. int * p_nSubRowCount = NULL,
  787. bool * p_bFullyOccupiedLayout = NULL
  788. );
  789. void _AdjustByTotalRowExtent(
  790. int & nTotalRowExtent,
  791. CSize & sizeFixed,
  792. CPoint & pt,
  793. BOOL bHorz
  794. );
  795. void _PreAdjustWithAffixment(
  796. bool bHorz,
  797. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  798. CExtDockOuterBar::OuterLayoutItemData & olidAdjustedSrc,
  799. int nBarAdjustedSrc,
  800. CExtControlBar::InternalAffixmentData * pAffixmentDataAdjustedSrc,
  801. int nExtentMax
  802. );
  803. void _PostAdjustWithAffixment(
  804. bool bHorz,
  805. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  806. CExtDockOuterBar::OuterLayoutItemData & olidAdjustedSrc,
  807. int nBarAdjustedSrc,
  808. CExtControlBar::InternalAffixmentData * pAffixmentDataAdjustedSrc,
  809. int nExtentMax
  810. );
  811. int _ShiftSubRowWithAffixment(
  812. bool bHorz,
  813. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  814. int nReviewStart,
  815. int nReviewEnd,
  816. int nAdjustShift,
  817. int nExtentMax
  818. );
  819. void _AlignSubRowAffixmentHW(
  820. bool bHorz,
  821. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  822. int nSubRowStartPos,
  823. int nSubRowEndPos
  824. );
  825. typedef
  826. CArray < int, int >
  827. AffixmentOrderVector_t;
  828. void _CalcAffixmentOrderVector(
  829. bool bHorz,
  830. AffixmentOrderVector_t & arrAffixmentOrder,
  831. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  832. bool bResetAffixmentDataIfNeeded = false,
  833. int nSubRowStartPos = 0,
  834. int nSubRowEndPos = -1
  835. );
  836. public:
  837. CExtDockOuterBar();
  838. DECLARE_DYNCREATE( CExtDockOuterBar );
  839. virtual void OnDynamicLayoutUpdate();
  840. virtual void OnDynamicLayoutOptimize();
  841. // this is the one and only method of interest
  842. virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
  843. void _AffixmentBringToTop( CExtControlBar * pBar );
  844. void _DelayDockSiteRecalc();
  845. protected:
  846. bool m_bInDockSiteDelayedRecalc:1;
  847. bool m_bDockSiteRecalcIsDelayed:1;
  848. void _DelayDockSiteRecalc_Start();
  849. bool _DelayDockSiteRecalc_Update();
  850. public:
  851. #ifdef _DEBUG
  852. virtual void AssertValid() const
  853. {
  854. CExtDockBar::AssertValid();
  855. }
  856. virtual void Dump( CDumpContext & dc ) const
  857. {
  858. CExtDockBar::Dump( dc );
  859. }
  860. #endif
  861. // Overrides
  862. // ClassWizard generated virtual function overrides
  863. //{{AFX_VIRTUAL(CExtDockOuterBar)
  864. //}}AFX_VIRTUAL
  865. //{{AFX_MSG(CExtDockOuterBar)
  866. afx_msg void OnTimer(__EXT_MFC_UINT_PTR nIDEvent);
  867. afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  868. //}}AFX_MSG
  869. afx_msg void OnSysColorChange();
  870. afx_msg void OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection);
  871. afx_msg LRESULT OnDisplayChange( WPARAM wParam, LPARAM lParam );
  872. afx_msg LRESULT OnThemeChanged( WPARAM wParam, LPARAM lParam );
  873. DECLARE_MESSAGE_MAP()
  874. friend class CExtControlBar::InternalDockStateBar;
  875. friend class CExtControlBar::InternalDraggingState_t;
  876. }; // class CExtDockOuterBar
  877. #if _MFC_VER >= 0x710
  878. #define __PLACEHODLER_BAR_PTR( __CB__ ) 
  879. ( ( DWORD_PTR(__CB__) ) <= 0x0FFFF )
  880. #else
  881. #define __PLACEHODLER_BAR_PTR( __CB__ ) 
  882. ( ( HIWORD(__CB__) ) == 0 )
  883. #endif
  884. #endif // __EXTDOCKBAR_H