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

界面编程

开发平台:

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. #include "stdafx.h"
  22. #if (!defined __EXTDOCKBAR_H)
  23. #include "ExtDockBar.h"
  24. #endif
  25. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  26. #if (!defined __EXT_CONTROLBAR_TABBED_FEATURES_H)
  27. #include "ExtControlBarTabbedFeatures.h"
  28. #endif // __EXT_CONTROLBAR_TABBED_FEATURES_H
  29. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  30. #if _MFC_VER < 0x700
  31. #include <../src/AfxImpl.h>
  32. #else
  33. #include <../src/mfc/AfxImpl.h>
  34. #endif
  35. #if (!defined __EXT_MEMORY_DC_H)
  36. #include <../Src/ExtMemoryDC.h>
  37. #endif
  38. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  39. #if (!defined __EXTCUSTOMIZE_H)
  40. #include <ExtCustomize.h>
  41. #endif
  42. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  43. #include <Resources/Resource.h>
  44. #ifdef _DEBUG
  45. #define new DEBUG_NEW
  46. #undef THIS_FILE
  47. static char THIS_FILE[] = __FILE__;
  48. #endif
  49. /////////////////////////////////////////////////////////////////////////
  50. // CExtDockBar window
  51. IMPLEMENT_DYNCREATE( CExtDockBar, CDockBar );
  52. IMPLEMENT_CExtPmBridge_MEMBERS( CExtDockBar );
  53. BEGIN_MESSAGE_MAP(CExtDockBar, CDockBar)
  54. //{{AFX_MSG_MAP(CExtDockBar)
  55. //}}AFX_MSG_MAP
  56. ON_WM_CONTEXTMENU()
  57. ON_WM_CANCELMODE()
  58. ON_WM_ERASEBKGND()
  59. ON_MESSAGE( WM_SIZEPARENT, OnSizeParent )
  60. ON_WM_NCCALCSIZE()
  61. ON_WM_NCPAINT()
  62. ON_WM_DESTROY()
  63. ON_MESSAGE( WM_HELPHITTEST, OnHelpHitTest )
  64. END_MESSAGE_MAP()
  65. bool CExtDockBar::g_bControlBarFixSizePixel = true;
  66. bool CExtDockBar::g_bExtendedRepositioning = false;
  67. bool CExtDockBar::g_bDockBarClassRegistered = false;
  68. CExtDockBar::CExtDockBar(
  69. UINT nCircleNo // = 0
  70. )
  71. : m_nCircleNo( nCircleNo )
  72. , m_bLockedOptimize( false )
  73. , m_pDockBarOuter( NULL )
  74. , m_pDockBarInner( NULL )
  75. , m_rcLastInvisiblePreCalc( 0, 0, 0, 0 )
  76. , m_bInDynamicLayoutUpdate( false )
  77. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  78. , m_pWndAutoHideArea( NULL )
  79. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  80. {
  81. VERIFY( RegisterDockBarClass() );
  82. PmBridge_Install();
  83. }
  84. CExtDockBar::~CExtDockBar()
  85. {
  86. PmBridge_Uninstall();
  87. }
  88. bool CExtDockBar::RegisterDockBarClass()
  89. {
  90. if( g_bDockBarClassRegistered )
  91. return true;
  92. WNDCLASS _wndClassInfo;
  93. HINSTANCE hInst = ::AfxGetInstanceHandle();
  94. if( ! ::GetClassInfo( hInst, __EXT_DOCKBAR_CLASS_NAME, &_wndClassInfo ) )
  95. {
  96. _wndClassInfo.style = CS_GLOBALCLASS|CS_DBLCLKS;
  97. _wndClassInfo.lpfnWndProc = ::DefWindowProc;
  98. _wndClassInfo.cbClsExtra = _wndClassInfo.cbWndExtra = 0;
  99. _wndClassInfo.hInstance = hInst;
  100. _wndClassInfo.hIcon = NULL;
  101. _wndClassInfo.hCursor = ::LoadCursor( NULL, IDC_ARROW );
  102. ASSERT( _wndClassInfo.hCursor != NULL );
  103. _wndClassInfo.hbrBackground = NULL;
  104. _wndClassInfo.lpszMenuName = NULL;
  105. _wndClassInfo.lpszClassName = __EXT_DOCKBAR_CLASS_NAME;
  106. if( !::AfxRegisterClass( &_wndClassInfo ) )
  107. {
  108. ASSERT( FALSE );
  109. //AfxThrowResourceException();
  110. return false;
  111. }
  112. }
  113. g_bDockBarClassRegistered = true;
  114. return true;
  115. }
  116. void CExtDockBar::PreSubclassWindow()
  117. {
  118. CDockBar::PreSubclassWindow();
  119. }
  120. BOOL CExtDockBar::PreCreateWindow(CREATESTRUCT& cs)
  121. {
  122. if( ( !RegisterDockBarClass() )
  123. || ( !CWnd::PreCreateWindow(cs) )
  124. )
  125. {
  126. ASSERT( FALSE );
  127. return FALSE;
  128. }
  129. cs.lpszClass = __EXT_DOCKBAR_CLASS_NAME;
  130. return TRUE;
  131. }
  132. LRESULT CExtDockBar::OnHelpHitTest(WPARAM wParam, LPARAM lParam)
  133. {
  134. wParam;
  135. lParam;
  136. return 0L;
  137. }
  138. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  139. void CExtDockBar::OnCustomizeModeEnter()
  140. {
  141. ASSERT_VALID( this );
  142. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  143. if( _GetCircleNo() > 0 )
  144. return;
  145. if( m_pWndAutoHideArea == NULL )
  146. return;
  147. ASSERT_VALID( m_pWndAutoHideArea );
  148. m_pWndAutoHideArea->OnCustomizeModeEnter();
  149. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  150. }
  151. void CExtDockBar::OnCustomizeModeLeave()
  152. {
  153. ASSERT_VALID( this );
  154. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  155. if( _GetCircleNo() > 0 )
  156. return;
  157. if( m_pWndAutoHideArea == NULL )
  158. return;
  159. ASSERT_VALID( m_pWndAutoHideArea );
  160. m_pWndAutoHideArea->OnCustomizeModeLeave();
  161. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  162. }
  163. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  164. void CExtDockBar::OnCancelMode()
  165. {
  166. ASSERT_VALID( this );
  167. CDockBar::OnCancelMode();
  168. BOOL bHelpMode =
  169. ::AfxGetApp()->m_bHelpMode
  170. || CExtControlBar::FindHelpMode( this )
  171. ;
  172. if( !bHelpMode )
  173. CExtPopupMenuWnd::CancelMenuTracking();
  174. CWnd::CancelToolTips();
  175. //ASSERT( !CExtPopupMenuWnd::IsMenuTracking() );
  176. }
  177. CFrameWnd * CExtDockBar::_GetDockingFrameImpl()
  178. {
  179. ASSERT_VALID( this );
  180. return
  181. CExtControlBar::_GetDockingFrameImpl( (CControlBar *)this );
  182. }
  183. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  184. bool CExtDockBar::_AppendAddRemoveButtonsCustomizeMenu(
  185. CExtPopupMenuWnd * pPopup,
  186. CControlBar * pBarEventSrc
  187. )
  188. {
  189. ASSERT_VALID( pPopup );
  190. ASSERT_VALID( pBarEventSrc );
  191. ASSERT( pBarEventSrc->GetSafeHwnd() != NULL && ::IsWindow(pBarEventSrc->GetSafeHwnd()) );
  192. if( ! pBarEventSrc->IsKindOf(RUNTIME_CLASS(CExtToolControlBar)) )
  193. {
  194. ASSERT( FALSE );
  195. return false;
  196. }
  197. CExtCustomizeSite * pSite =
  198. CExtCustomizeSite::GetCustomizeSite( pBarEventSrc->m_hWnd );
  199. if( pSite == NULL )
  200. return true;
  201. if( ! pSite->BarIsRegistered((CExtToolControlBar*)pBarEventSrc) )
  202. return true;
  203. CExtSafeString strProfileName =
  204. g_CmdManager->ProfileNameFromWnd( pBarEventSrc->m_hWnd );
  205. ASSERT( !strProfileName.IsEmpty() );
  206. VERIFY(
  207. g_CmdManager->UpdateFromMenu(
  208. strProfileName,
  209. IDR_MENU_CUSTOMIZE_CMDS,
  210. true
  211. )
  212. );
  213. pSite->BarDefCmdTargetSet((CExtToolControlBar*)pBarEventSrc);
  214. bool bUserBar = false;
  215. VERIFY(
  216. pSite->GetToolbarCustomizeInfo(
  217. (CExtToolControlBar*)pBarEventSrc, NULL, NULL, NULL,
  218. &bUserBar
  219. )
  220. );
  221. CExtCmdItem * pCmdItem =
  222. g_CmdManager->CmdGetPtr(
  223. strProfileName,
  224. ID_EXT_ADD_REMOVE_BUTTONS
  225. );
  226. CExtSafeString strAddRemoveButtons;
  227. if( pCmdItem )
  228. strAddRemoveButtons = pCmdItem->m_sMenuText;
  229. if( strAddRemoveButtons.IsEmpty() )
  230. strAddRemoveButtons = _T("&Add/remove buttons");
  231. VERIFY(
  232. pPopup->ItemInsert(
  233. (UINT)CExtPopupMenuWnd::TYPE_POPUP,
  234. -1,
  235. strAddRemoveButtons
  236. )
  237. );
  238. CExtPopupMenuWnd::MENUITEMDATA & miARB =
  239. pPopup->ItemGetInfo( pPopup->ItemGetCount() - 1 );
  240. miARB.SetChildCombine();
  241. miARB.SetToolButton();
  242. miARB.SetToolWrap();
  243. CExtPopupMenuWnd * pAddRemoveButtons = miARB.GetPopup();
  244. ASSERT( pAddRemoveButtons != NULL );
  245. VERIFY( pAddRemoveButtons->ItemInsert( ID_EXT_CUSTOMIZE ) );
  246. CExtPopupMenuWnd::MENUITEMDATA & miCustomize =
  247. pAddRemoveButtons->ItemGetInfo(
  248. pAddRemoveButtons->ItemGetCount() - 1
  249. );
  250. miCustomize.SetForceEnabled();
  251. if( ! bUserBar )
  252. {
  253. bool bAddResetBarHere = true;
  254. if( pBarEventSrc->m_pDockBar != NULL )
  255. {
  256. ASSERT_VALID( pBarEventSrc->m_pDockBar );
  257. MfcControlBarVector_t vBars;
  258. if( pBarEventSrc->IsFloating() )
  259. vBars.Add( pBarEventSrc );
  260. else
  261. {
  262. int nPos = pBarEventSrc->m_pDockBar->FindBar( pBarEventSrc );
  263. ASSERT( nPos >= 0 && nPos < pBarEventSrc->m_pDockBar->m_arrBars.GetSize() );
  264. for( nPos--; nPos >= 0 && pBarEventSrc->m_pDockBar->m_arrBars[nPos] != NULL; nPos-- );
  265. nPos++;
  266. ASSERT( nPos >= 0 && nPos < pBarEventSrc->m_pDockBar->m_arrBars.GetSize() );
  267. for( ; pBarEventSrc->m_pDockBar->m_arrBars[nPos] != NULL && nPos < pBarEventSrc->m_pDockBar->m_arrBars.GetSize(); nPos++ )
  268. {
  269. CControlBar * pBarInRow = (CControlBar *)pBarEventSrc->m_pDockBar->m_arrBars[nPos];
  270. if( pBarInRow == NULL || __PLACEHODLER_BAR_PTR(pBarInRow) )
  271. continue;
  272. ASSERT_VALID( pBarInRow );
  273. ASSERT_KINDOF( CControlBar, pBarInRow );
  274. if( !pBarInRow->IsKindOf(RUNTIME_CLASS(CExtToolControlBar)) )
  275. continue;
  276. vBars.Add( pBarInRow );
  277. }
  278. } // else from if( pBarEventSrc->IsFloating() )
  279. int nCount = (int)vBars.GetSize();
  280. ASSERT( nCount >= 1 );
  281. for( int i = 0; i < nCount; )
  282. {
  283. CExtToolControlBar * pBar = (CExtToolControlBar*)vBars[i];
  284. ASSERT_VALID( pBar );
  285. ASSERT_KINDOF( CExtToolControlBar, pBar );
  286. if( ( !pSite->BarIsRegistered(pBar) )
  287. || ( !pBar->OnCustomizeCanShowHideButtons() )
  288. )
  289. {
  290. vBars.RemoveAt( i );
  291. nCount--;
  292. continue;
  293. }
  294. bool bUserItem = false;
  295. VERIFY(
  296. pSite->GetToolbarCustomizeInfo(
  297. pBar, NULL, NULL, NULL,
  298. &bUserItem
  299. )
  300. );
  301. if( bUserItem )
  302. {
  303. vBars.RemoveAt( i );
  304. nCount--;
  305. continue;
  306. }
  307. i++;
  308. } // for( int i = 0; i < nCount; i++ )
  309. ASSERT( nCount == vBars.GetSize() );
  310. if( nCount > 0 )
  311. {
  312. bAddResetBarHere = false;
  313. int i = 0;
  314. for( i = 0; i < nCount; i++ )
  315. {
  316. CExtToolControlBar * pBar = (CExtToolControlBar*)vBars[i];
  317. ASSERT_VALID( pBar );
  318. ASSERT_KINDOF( CExtToolControlBar, pBar );
  319. CString sBarName;
  320. pBar->GetWindowText( sBarName );
  321. VERIFY(
  322. pAddRemoveButtons->ItemInsert(
  323. (UINT)CExtPopupMenuWnd::TYPE_POPUP,
  324. i,
  325. (LPCTSTR)sBarName
  326. )
  327. );
  328. CExtPopupMenuWnd::MENUITEMDATA & mi = pAddRemoveButtons->ItemGetInfo(i);
  329. CExtPopupMenuWnd * pFolder = mi.GetPopup();
  330. ASSERT_VALID( pFolder );
  331. pBar->OnCustomizeInitShowHideButtonMenu( pFolder );
  332. ASSERT( pFolder->ItemGetCount() > 0 );
  333. VERIFY( pFolder->ItemInsert() );
  334. VERIFY( pFolder->ItemInsert( ID_EXT_RESET_TOOLBAR ) );
  335. CExtPopupMenuWnd::MENUITEMDATA & miResetToolbar =
  336. pFolder->ItemGetInfo(
  337. pFolder->ItemGetCount() - 1
  338. );
  339. miResetToolbar.SetForceEnabled();
  340. miResetToolbar.SetCmdDeliverCb(
  341. (CExtPopupMenuWnd::MENUITEMDATA::pCbItemClick)
  342. CExtToolControlBar::stat_CbCmdDeliver
  343. );
  344. miResetToolbar.LParamSet( (LPARAM)pBar );
  345. } // for( i = 0; i < nCount; i++ )
  346. VERIFY(
  347. pAddRemoveButtons->ItemInsert(
  348. (UINT)CExtPopupMenuWnd::TYPE_SEPARATOR,
  349. i
  350. )
  351. );
  352. } // if( nCount > 0 )
  353. } // if( pBarEventSrc->m_pDockBar != NULL )
  354. if( bAddResetBarHere )
  355. {
  356. VERIFY( pAddRemoveButtons->ItemInsert( ID_EXT_RESET_TOOLBAR ) );
  357. CExtPopupMenuWnd::MENUITEMDATA & miResetToolbar =
  358. pAddRemoveButtons->ItemGetInfo(
  359. pAddRemoveButtons->ItemGetCount() - 1
  360. );
  361. miResetToolbar.SetForceEnabled();
  362. miResetToolbar.SetCmdDeliverCb(
  363. (CExtPopupMenuWnd::MENUITEMDATA::pCbItemClick)
  364. CExtToolControlBar::stat_CbCmdDeliver
  365. );
  366. miResetToolbar.LParamSet( (LPARAM)pBarEventSrc );
  367. } // if( bAddResetBarHere )
  368. } // if( ! bUserBar )
  369. return true;
  370. }
  371. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  372. bool CExtDockBar::_ConstructDockSiteControlBarPopupMenu(
  373. CFrameWnd * pFrame,
  374. CExtPopupMenuWnd * pPopup,
  375. SHORT nHelperNotificationType,
  376. CControlBar * pBarEventSrc,
  377. UINT nMsgID, // = WM_NULL
  378. CObject * pObjectSrc // = NULL
  379. )
  380. {
  381. ASSERT_VALID( pFrame );
  382. ASSERT( pPopup != NULL );
  383. CExtControlBar::POPUP_MENU_EVENT_DATA _pmed(
  384. nHelperNotificationType,
  385. pPopup,
  386. pBarEventSrc,
  387. CPoint( -1, -1 ),
  388. nMsgID,
  389. pObjectSrc
  390. );
  391. bool bPreNotificationPassed = _pmed.NotifyTarget( false );
  392. if( !bPreNotificationPassed )
  393. {
  394. ExtControlBarVector_t vBars;
  395. CExtControlBar::_GetFrameControlBars(
  396. NULL,
  397. pFrame,
  398. vBars
  399. );
  400. bool bOleInplaceItemActivated =
  401. CExtControlBar::IsOleIpObjActive( pFrame );
  402. int nBarsCount = (int)vBars.GetSize();
  403. CExtControlBar * pPrevBar = NULL;
  404. for( int i=0; i<nBarsCount; i++ )
  405. {
  406. CExtControlBar * pBar = vBars[i];
  407. ASSERT_VALID( pBar );
  408. if( pBar->GetSafeHwnd() == NULL
  409. || ( ! ::IsWindow(pBar->GetSafeHwnd()) )
  410. )
  411. continue;
  412. // do not include dynamic bars
  413. if( pBar->IsKindOf( RUNTIME_CLASS(CExtDynControlBar) ) )
  414. continue;
  415. // do not include temporary hidden bars
  416. if( pBar->m_nStateFlags &
  417. //(CControlBar::delayHide | CControlBar::tempHide)
  418. CControlBar::tempHide
  419. )
  420. continue;
  421. // do not include some bars when OLE inplace object active
  422. if( bOleInplaceItemActivated &&
  423. (pBar->m_dwStyle & CBRS_HIDE_INPLACE)
  424. )
  425. continue;
  426. // do not include bars without caption
  427. CString sBarText;
  428. pBar->GetWindowText( sBarText );
  429. if( sBarText.IsEmpty() )
  430. {
  431. // do not include bars without window text to menu
  432. // ASSERT( FALSE );
  433. continue;
  434. }
  435. if( pPrevBar != NULL
  436. &&
  437. pPrevBar->IsFixedDockStyle() != pBar->IsFixedDockStyle()
  438. )
  439. {
  440. VERIFY(
  441. pPopup->ItemInsert(
  442. CExtPopupMenuWnd::TYPE_SEPARATOR
  443. )
  444. );
  445. }
  446. int nBarID = pBar->GetDlgCtrlID();
  447. ASSERT( CExtCmdManager::IsCommand(nBarID) );
  448. CExtCmdItem _cmd;
  449. _cmd.m_nCmdID = nBarID;
  450. _cmd.m_sMenuText = sBarText;
  451. _cmd.TipsLoad();
  452. g_CmdManager->CmdSetup(
  453. g_CmdManager->ProfileNameFromWnd( pFrame->GetSafeHwnd() ),
  454. _cmd
  455. );
  456. if( pBar->OnConstructDockSiteControlBarPopupMenu(pPopup) )
  457. pPrevBar = pBar;
  458. } // for( int i=0; i<nBarsCount; i++ )
  459. } // if( !bPreNotificationPassed )
  460. // remove double separators
  461. INT nCount = pPopup->ItemGetCount();
  462. for( INT nItem = 1; nItem < nCount; )
  463. {
  464. CExtPopupMenuWnd::MENUITEMDATA & _miiPrev =
  465. pPopup->ItemGetInfo( nItem - 1 );
  466. if( !_miiPrev.IsSeparator() )
  467. {
  468. nItem++;
  469. continue;
  470. }
  471. CExtPopupMenuWnd::MENUITEMDATA & _miiCurr =
  472. pPopup->ItemGetInfo( nItem );
  473. if( !_miiCurr.IsSeparator() )
  474. {
  475. nItem++;
  476. continue;
  477. }
  478. pPopup->ItemRemove( nItem );
  479. nCount--;
  480. } // for( INT nItem = 1; nItem < nCount; )
  481. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  482. bool bAddCustomizeCmd = false;
  483. if( (!bPreNotificationPassed)
  484. && ( nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CONTROLBAR_CTX
  485. || nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CONTROLBAR_NC_CTX
  486. || nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_DOCKBAR_CTX
  487. || nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_STATUSBAR_CTX
  488. || nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_MINIFRAME_NC_CTX
  489. )
  490. && CExtCustomizeSite::GetCustomizeSite( pBarEventSrc->GetSafeHwnd() ) != NULL
  491. )
  492. bAddCustomizeCmd = true;
  493. if( bAddCustomizeCmd
  494. && pBarEventSrc->GetSafeHwnd() != NULL
  495. && pBarEventSrc->IsKindOf( RUNTIME_CLASS( CExtToolControlBar ) )
  496. && ( ! ((CExtToolControlBar*)pBarEventSrc)->m_bCustomizationAllowed )
  497. )
  498. bAddCustomizeCmd = false;
  499. if( bAddCustomizeCmd )
  500. { // add customize command
  501. LPCTSTR strCmdProfile =  g_CmdManager->ProfileNameFromWnd( pFrame->m_hWnd );
  502. if( strCmdProfile != NULL
  503. && g_CmdManager->CmdGetPtr( strCmdProfile, ID_EXT_CUSTOMIZE ) != NULL
  504. )
  505. {
  506. // add tail separator
  507. nCount = pPopup->ItemGetCount();
  508. if( nCount > 0 )
  509. {
  510. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  511. pPopup->ItemGetInfo( nCount - 1 );
  512. if( !_mii.IsSeparator() )
  513. pPopup->ItemInsert();
  514. } // if( nCount > 0 )
  515. VERIFY( pPopup->ItemInsert( ID_EXT_CUSTOMIZE ) );
  516. CExtPopupMenuWnd::MENUITEMDATA & mi =
  517. pPopup->ItemGetInfo(
  518. pPopup->ItemGetCount() - 1
  519. );
  520. mi.SetForceEnabled();
  521. } // if( strCmdProfile != NULL ...
  522. } // add customize command
  523. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  524. _pmed.NotifyTarget( true );
  525. // remove tail separator
  526. nCount = pPopup->ItemGetCount();
  527. if( nCount > 0 )
  528. {
  529. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  530. pPopup->ItemGetInfo( nCount - 1 );
  531. if( _mii.IsSeparator() )
  532. pPopup->ItemRemove( nCount - 1 );
  533. } // if( nCount > 0 )
  534. return true;
  535. }
  536. void CExtDockBar::OnContextMenu(CWnd* pWnd, CPoint point)
  537. {
  538. ASSERT_VALID( this );
  539. pWnd;
  540. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  541. CExtCustomizeSite * pSite =
  542. CExtCustomizeSite::GetCustomizeSite( m_hWnd );
  543. if( pSite != NULL
  544. && pSite->IsCustomizeMode()
  545. )
  546. return;
  547. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  548. if( CExtControlBar::FindHelpMode(this) )
  549. return;
  550. // find any control bar
  551. CControlBar * pBar = NULL;
  552. for( int nPos = 0; nPos < m_arrBars.GetSize(); nPos++ )
  553. {
  554. pBar = GetDockedControlBar(nPos);
  555. if( pBar != NULL )
  556. {
  557. ASSERT_VALID( pBar );
  558. break;
  559. }
  560. }
  561. if( pBar == NULL )
  562. return;
  563. CFrameWnd * pFrame = _GetDockingFrameImpl();
  564. HWND hWndTrack = pBar->GetOwner()->GetSafeHwnd();
  565. ASSERT( hWndTrack != NULL && ::IsWindow(hWndTrack) );
  566. CExtPopupMenuWnd * pPopup =
  567. CExtPopupMenuWnd::InstantiatePopupMenu(
  568. GetSafeHwnd(),
  569. RUNTIME_CLASS(CExtPopupMenuWnd),
  570. this
  571. );
  572. VERIFY( pPopup->CreatePopupMenu(hWndTrack) );
  573. if( ! _ConstructDockSiteControlBarPopupMenu(
  574. pFrame,
  575. pPopup,
  576. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_DOCKBAR_CTX,
  577. this,
  578. WM_CONTEXTMENU,
  579. NULL
  580. )
  581. )
  582. {
  583. delete pPopup;
  584. return;
  585. }
  586. if( pPopup->ItemGetCount() == 0 )
  587. {
  588. delete pPopup;
  589. return;
  590. }
  591. ::SetFocus( hWndTrack );
  592. if( ! pPopup->TrackPopupMenu(
  593. TPMX_OWNERDRAW_FIXED,
  594. point.x,
  595. point.y,
  596. NULL,
  597. this,
  598. NULL,
  599. NULL,
  600. true
  601. )
  602. )
  603. {
  604. //delete pPopup;
  605. }
  606. }
  607. void CExtDockBar::DoPaint( CDC * pDC )
  608. {
  609. ASSERT_VALID( this );
  610. ASSERT_VALID( pDC );
  611. CExtPaintManager::stat_ExcludeChildAreas(
  612. pDC->GetSafeHdc(),
  613. GetSafeHwnd()
  614. );
  615. CRect rcClient;
  616. GetClientRect( &rcClient );
  617. CExtMemoryDC dc( pDC, &rcClient );
  618. ASSERT( dc.GetSafeHdc() != NULL );
  619. if( dc.GetSafeHdc() != NULL )
  620. pDC = &dc;
  621. PmBridge_GetPM()->PaintDockBarClientArea(
  622. *pDC,
  623. rcClient,
  624. this
  625. );
  626. PmBridge_GetPM()->OnPaintSessionComplete( this );
  627. }
  628. BOOL CExtDockBar::OnEraseBkgnd( CDC* pDC )
  629. {
  630. ASSERT_VALID( this );
  631. ASSERT_VALID( pDC );
  632. pDC;
  633. // CExtPaintManager::stat_ExcludeChildAreas(
  634. // *pDC,
  635. // *this
  636. // );
  637. // return CDockBar::OnEraseBkgnd(pDC);
  638. return TRUE;
  639. }
  640. void CExtDockBar::OnDynamicLayoutUpdate()
  641. {
  642. ASSERT_VALID( this );
  643. ASSERT_KINDOF( CExtDockBar, this );
  644. if( m_bLockedOptimize )
  645. return;
  646. if( m_bInDynamicLayoutUpdate )
  647. return;
  648. m_bInDynamicLayoutUpdate = true;
  649. ASSERT( m_arrBars.GetSize() >= 1 );
  650. for( INT nBar = 1; nBar < m_arrBars.GetSize(); nBar++ )
  651. {
  652. CExtControlBar * pBar = (CExtControlBar *)
  653. m_arrBars[ nBar ];
  654. if( pBar == NULL )
  655. continue;
  656. if( __PLACEHODLER_BAR_PTR(pBar) )
  657. continue;
  658. ASSERT_VALID( pBar );
  659. ASSERT_KINDOF( CExtControlBar, pBar );
  660. if( pBar->IsFixedMode() || pBar->IsFixedDockStyle() )
  661. continue;
  662. if( !pBar->IsVisible() )
  663. continue;
  664. if( !pBar->IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  665. continue;
  666. ASSERT_VALID( ((CExtDynControlBar *)pBar)->m_pWndDynDocker );
  667. ((CExtDynControlBar *)pBar)->m_pWndDynDocker->OnDynamicLayoutUpdate();
  668. }
  669. m_bInDynamicLayoutUpdate = false;
  670. }
  671. void CExtDockBar::OnDynamicLayoutOptimize()
  672. {
  673. if( m_bLockedOptimize )
  674. return;
  675. ASSERT( m_arrBars.GetSize() >= 1 );
  676. for( INT nBar = 1; nBar < m_arrBars.GetSize(); nBar++ )
  677. {
  678. CExtControlBar * pBar = (CExtControlBar *)
  679. m_arrBars[ nBar ];
  680. if( pBar == NULL )
  681. continue;
  682. if( __PLACEHODLER_BAR_PTR(pBar) )
  683. continue;
  684. ASSERT_VALID( pBar );
  685. ASSERT_KINDOF( CExtControlBar, pBar );
  686. if( pBar->IsFixedMode() || pBar->IsFixedDockStyle() )
  687. continue;
  688. if( !pBar->IsVisible() )
  689. continue;
  690. if( !pBar->IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  691. continue;
  692. ASSERT_VALID( ((CExtDynControlBar *)pBar)->m_pWndDynDocker );
  693. ((CExtDynControlBar *)pBar)->m_pWndDynDocker->OnDynamicLayoutOptimize();
  694. }
  695. }
  696. CSize CExtDockBar::CalcFixedLayout(
  697. BOOL bStretch,
  698. BOOL bHorz
  699. )
  700. {
  701. // based on MFC's source of
  702. // CDockBar::CalcFixedLayout()
  703. ASSERT_VALID(this);
  704. CSize sizeFixed =
  705. CControlBar::CalcFixedLayout( bStretch, bHorz );
  706. // get max size
  707. CSize sizeMax;
  708. if( !m_rectLayout.IsRectEmpty() )
  709. sizeMax = m_rectLayout.Size();
  710. else
  711. {
  712. CFrameWnd * pFrame = GetParentFrame();
  713. CRect rcFrameWindow;
  714. pFrame->GetClientRect( &rcFrameWindow );
  715. sizeMax = rcFrameWindow.Size();
  716. }
  717. // prepare for layout
  718. AFX_SIZEPARENTPARAMS layout;
  719. layout.hDWP = m_bLayoutQuery ?
  720. NULL : ::BeginDeferWindowPos( (int)m_arrBars.GetSize() );
  721. CPoint pt( 0, 0 );
  722. int nWidth = 0;
  723. BOOL bWrapped = FALSE;
  724. for( int nPos = 0; nPos < m_arrBars.GetSize(); nPos++ )
  725. { // layout all the control bars
  726. CControlBar * pBar = GetDockedControlBar(nPos);
  727. void * pVoid = m_arrBars[nPos];
  728. if( pBar != NULL )
  729. {
  730. CRect rcBarWin, rcBarClient;
  731. pBar->GetWindowRect( &rcBarWin );
  732. pBar->ScreenToClient( & rcBarWin );
  733. pBar->GetClientRect( &rcBarClient );
  734. CSize sizeBarMin =
  735. rcBarWin.Size() - rcBarClient.Size();
  736. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  737. {
  738. if( ! ((CExtControlBar*)pBar)->IsFixedMode() )
  739. {
  740. sizeBarMin =
  741. CSize(
  742. ((CExtControlBar *)pBar)->_CalcDesiredMinHW(),
  743. ((CExtControlBar *)pBar)->_CalcDesiredMinVH()
  744. );
  745. } // if( ! ((CExtControlBar*)pBar)->IsFixedMode() )
  746. } // if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  747. if( pBar->IsVisible() )
  748. {
  749. // get ideal rect for bar
  750. DWORD dwMode = 0;
  751. if( (pBar->m_dwStyle & CBRS_SIZE_DYNAMIC)
  752. &&
  753. (pBar->m_dwStyle & CBRS_FLOATING)
  754. )
  755. dwMode |= LM_HORZ | LM_MRUWIDTH;
  756. else if(pBar->m_dwStyle & CBRS_ORIENT_HORZ)
  757. dwMode |= LM_HORZ | LM_HORZDOCK;
  758. else
  759. dwMode |=  LM_VERTDOCK;
  760. CSize sizeBar =
  761. pBar->CalcDynamicLayout(-1, dwMode);
  762. CRect rc(pt, sizeBar);
  763. // get current rect for bar
  764. CRect rcBar;
  765. pBar->GetWindowRect( &rcBar );
  766. ScreenToClient( &rcBar );
  767. if( bHorz )
  768. {
  769. // Offset Calculated Rect out to Actual
  770. if( rcBar.left > rc.left
  771. && !m_bFloating
  772. )
  773. rc.OffsetRect(
  774. rcBar.left - rc.left,
  775. 0
  776. );
  777. // If ControlBar goes off the right, then right justify
  778. if( rc.right > sizeMax.cx
  779. && !m_bFloating
  780. )
  781. {
  782. int x = rc.Width();
  783. x = max(sizeMax.cx - x, pt.x);
  784. rc.OffsetRect(
  785. x - rc.left,
  786. 0
  787. );
  788. if( rc.right  > sizeMax.cx )
  789. rc.right -= rc.right - sizeMax.cx;
  790. }
  791. // If ControlBar has been wrapped, then left justify
  792. if( bWrapped )
  793. {
  794. bWrapped = FALSE;
  795. rc.OffsetRect( - rc.left, 0 );
  796. }
  797. // If ControlBar is completely invisible, then wrap it
  798. else if(
  799. rc.Width() < sizeBarMin.cx
  800. ||
  801. (rc.left >= sizeMax.cx)
  802. && (nPos > 0) && (m_arrBars[nPos - 1] != NULL)
  803. )
  804. {
  805. if( !pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  806. || (
  807. pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  808. &&
  809. ((CExtControlBar*)pBar)->IsFixedMode()
  810. )
  811. )
  812. {
  813. m_arrBars.InsertAt(
  814. nPos,
  815. (CObject*)NULL
  816. );
  817. pBar = NULL;
  818. pVoid = NULL;
  819. bWrapped = TRUE;
  820. }
  821. }
  822. if( !bWrapped )
  823. {
  824. if(rc != rcBar)
  825. {
  826. if( !m_bLayoutQuery &&
  827. !(pBar->m_dwStyle & CBRS_FLOATING)
  828. )
  829. pBar->m_pDockContext->
  830. m_rectMRUDockPos = rc;
  831. AfxRepositionWindow(
  832. &layout,
  833. pBar->m_hWnd,
  834. &rc
  835. );
  836. }
  837. pt.x = rc.left + sizeBar.cx;
  838. nWidth = max(nWidth, sizeBar.cy);
  839. } // if( !bWrapped )
  840. } // if( bHorz )
  841. else
  842. {
  843. // Offset Calculated Rect out to Actual
  844. if( rcBar.top > rc.top
  845. && !m_bFloating
  846. )
  847. rc.OffsetRect(
  848. 0,
  849. rcBar.top - rc.top
  850. );
  851. // If ControlBar goes off the bottom, then bottom justify
  852. if( rc.bottom > sizeMax.cy
  853. && !m_bFloating
  854. )
  855. {
  856. int y = rc.Height();
  857. y = max(sizeMax.cy - y, pt.y);
  858. rc.OffsetRect(
  859. 0,
  860. y - rc.top
  861. );
  862. if( rc.bottom  > sizeMax.cy )
  863. rc.bottom -= rc.bottom - sizeMax.cy;
  864. }
  865. // If ControlBar has been wrapped, then top justify
  866. if( bWrapped )
  867. {
  868. bWrapped = FALSE;
  869. rc.OffsetRect( 0, - rc.top );
  870. }
  871. // If ControlBar is completely invisible, then wrap it
  872. else if(
  873. rc.Height() < sizeBarMin.cy
  874. ||
  875. (rc.top >= sizeMax.cy)
  876. && (nPos > 0) && (m_arrBars[nPos - 1] != NULL)
  877. )
  878. {
  879. if( !pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) 
  880. || (
  881. pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  882. &&
  883. ((CExtControlBar*)pBar)->IsFixedMode()
  884. )
  885. )
  886. {
  887. m_arrBars.InsertAt(
  888. nPos,
  889. (CObject*)NULL
  890. );
  891. pBar = NULL;
  892. pVoid = NULL;
  893. bWrapped = TRUE;
  894. }
  895. }
  896. if( !bWrapped )
  897. {
  898. if(rc != rcBar)
  899. {
  900. if( !m_bLayoutQuery
  901. && !(pBar->m_dwStyle & CBRS_FLOATING)
  902. && pBar->m_pDockContext != NULL
  903. )
  904. pBar->m_pDockContext->
  905. m_rectMRUDockPos = rc;
  906. AfxRepositionWindow(
  907. &layout,
  908. pBar->m_hWnd,
  909. &rc
  910. );
  911. }
  912. pt.y = rc.top + sizeBar.cy;
  913. nWidth = max(nWidth, sizeBar.cx);
  914. } // if( !bWrapped )
  915. } // else from if( bHorz )
  916. // if( !m_bLayoutQuery && pBar != NULL )
  917. // {
  918. // if( pBar->IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  919. // {
  920. // ASSERT_VALID( ((CExtDynControlBar *)pBar)->m_pWndDynDocker );
  921. // ((CExtDynControlBar *)pBar)->m_pWndDynDocker->OnDynamicLayoutUpdate();
  922. // }
  923. // }
  924. } // if( pBar->IsVisible() )
  925. if( !bWrapped )
  926. // handle any delay/show hide for the bar
  927. pBar->RecalcDelayShow( &layout );
  928. } // if( pBar != NULL )
  929. else
  930. {
  931. if( g_bExtendedRepositioning )
  932. {
  933. // try to remove wrapping:
  934. // are we have free space in the end of previous row?
  935. if( nPos > 0 && nPos != m_arrBars.GetSize()-1 )
  936. {
  937. int nPosPrev = nPos-1;
  938. CControlBar * pPrevBar = NULL;
  939. do
  940. {
  941. pPrevBar = GetDockedControlBar(nPosPrev--);
  942. if( pPrevBar != NULL
  943. && pPrevBar->IsVisible()
  944. && (!pPrevBar->IsFloating())
  945. )
  946. {
  947. // get ideal rect for prev bar
  948. DWORD dwMode = 0;
  949. if( (pPrevBar->m_dwStyle & CBRS_SIZE_DYNAMIC)
  950. &&
  951. (pPrevBar->m_dwStyle & CBRS_FLOATING)
  952. )
  953. dwMode |= LM_HORZ | LM_MRUWIDTH;
  954. else if(pPrevBar->m_dwStyle & CBRS_ORIENT_HORZ)
  955. dwMode |= LM_HORZ | LM_HORZDOCK;
  956. else
  957. dwMode |=  LM_VERTDOCK;
  958. CSize sizePrevBar =
  959. pPrevBar->CalcDynamicLayout(-1, dwMode);
  960. CRect rcPrev(pt, sizePrevBar);
  961. if( bHorz )
  962. {
  963. if( rcPrev.right > sizeMax.cx
  964. && !m_bFloating
  965. )
  966. pPrevBar = NULL;
  967. }
  968. else
  969. {
  970. if( rcPrev.bottom > sizeMax.cy
  971. && !m_bFloating
  972. )
  973. pPrevBar = NULL;
  974. }
  975. if( pPrevBar != NULL )
  976. break;
  977. }
  978. pPrevBar = NULL;
  979. } while( nPosPrev >= 0 );
  980. if( pPrevBar != NULL )
  981. {
  982. m_arrBars.RemoveAt(nPos);
  983. nPos--;
  984. continue;
  985. }
  986. } // if( nPos > 0 && nPos != m_arrBars.GetSize()-1 )
  987. } // if( g_bExtendedRepositioning )
  988. } // else from if( pBar != NULL )
  989. if( pBar == NULL && pVoid == NULL && nWidth != 0 )
  990. {
  991. // end of row because pBar == NULL
  992. if( bHorz )
  993. {
  994. pt.y += nWidth;
  995. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  996. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  997. pt.x = 0;
  998. sizeFixed.cy--;
  999. }
  1000. else
  1001. {
  1002. pt.x += nWidth;
  1003. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  1004. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  1005. pt.y = 0;
  1006. sizeFixed.cx--;
  1007. }
  1008. nWidth = 0;
  1009. }
  1010. } // layout all the control bars
  1011. if( !m_bLayoutQuery )
  1012. {
  1013. ASSERT( layout.hDWP != NULL );
  1014. if( layout.hDWP != NULL )
  1015. {
  1016. VERIFY( ::EndDeferWindowPos(layout.hDWP) );
  1017. }
  1018. } // if( !m_bLayoutQuery )
  1019. // adjust size for borders on the dock bar itself
  1020. CRect rc( 0, 0, 0, 0 );
  1021. CalcInsideRect(rc, bHorz);
  1022. if( (!bStretch || !bHorz) && sizeFixed.cx != 0 )
  1023. sizeFixed.cx +=
  1024. -rc.right + rc.left
  1025. + g_bControlBarFixSizePixel ? 1 : 0;
  1026. if( (!bStretch || bHorz) && sizeFixed.cy != 0 )
  1027. sizeFixed.cy +=
  1028. -rc.bottom + rc.top
  1029. + g_bControlBarFixSizePixel ? 1 : 0;
  1030. if( ! m_bLayoutQuery )
  1031. OnDynamicLayoutUpdate();
  1032. return sizeFixed;
  1033. }
  1034. void CExtDockBar::RemoveAllPlaceHolders(
  1035. bool bSearchPlaceHolder // = true
  1036. )
  1037. {
  1038. ASSERT_VALID( this );
  1039. INT nCount = (INT)m_arrBars.GetSize();
  1040. ASSERT( nCount > 0 );
  1041. ASSERT( m_arrBars[0] == NULL );
  1042. MfcControlBarVector_t vPlaceHolders;
  1043. INT nBar = 0; 
  1044. for( nBar = 1; nBar < nCount; nBar++ )
  1045. {
  1046. CControlBar * pBar = (CControlBar *) m_arrBars[ nBar ];
  1047. if( pBar == NULL )
  1048. continue;
  1049. if( __PLACEHODLER_BAR_PTR(pBar) )
  1050. {
  1051. vPlaceHolders.Add( pBar );
  1052. continue;
  1053. }
  1054. ASSERT_VALID( pBar );
  1055. ASSERT_KINDOF( CControlBar, pBar );
  1056. } // for( nBar = 1; nBar < nCount; nBar++ )
  1057. nCount = (INT)vPlaceHolders.GetSize();
  1058. for( nBar = 0; nBar < nCount; nBar++ )
  1059. {
  1060. CControlBar * pBar = vPlaceHolders[nBar];
  1061. RemovePlaceHolder( pBar, bSearchPlaceHolder );
  1062. } // for( nBar = 0; nBar < nCount; nBar++ )
  1063. }
  1064. void CExtDockBar::RemovePlaceHolder(
  1065. CControlBar * pBar,
  1066. bool bSearchPlaceHolder, // = true
  1067. bool * p_bRemoved // = NULL
  1068. )
  1069. {
  1070. if( p_bRemoved != NULL )
  1071. *p_bRemoved = false;
  1072. // remove remembered docking position
  1073. #if _MFC_VER >= 0x710
  1074. if (DWORD_PTR(pBar) > 0x0FFFF)
  1075. pBar = (CControlBar*)(DWORD_PTR)_AfxGetDlgCtrlID(pBar->m_hWnd);
  1076. #else
  1077. if( HIWORD(pBar) != 0 )
  1078. pBar = (CControlBar*)_AfxGetDlgCtrlID(pBar->m_hWnd);
  1079. #endif
  1080. int nOldPos = FindBar(pBar);
  1081. if( nOldPos > 0)
  1082. {
  1083. m_arrBars.RemoveAt(nOldPos);
  1084. // remove section indicator (NULL) if nothing else in section
  1085. if( m_arrBars[nOldPos-1] == NULL
  1086. && m_arrBars[nOldPos] == NULL
  1087. )
  1088. m_arrBars.RemoveAt(nOldPos);
  1089. if( p_bRemoved != NULL )
  1090. *p_bRemoved = true;
  1091. return;
  1092. }
  1093. if( !bSearchPlaceHolder )
  1094. return;
  1095. _RemovePlaceHolder(
  1096. m_pDockSite,
  1097. pBar,
  1098. p_bRemoved
  1099. );
  1100. }
  1101. void CExtDockBar::_RemovePlaceHolder(
  1102. CFrameWnd * pFrame,
  1103. CControlBar * pBar,
  1104. bool * p_bRemoved // = NULL
  1105. )
  1106. {
  1107. ASSERT_VALID( pFrame );
  1108. ASSERT( pBar != NULL ); // may be placeholder ID
  1109. POSITION pos = pFrame->m_listControlBars.GetHeadPosition();
  1110. for( ; pos != NULL; )
  1111. {
  1112. CControlBar * pTestBar = (CControlBar *)
  1113. pFrame->m_listControlBars.GetNext( pos );
  1114. ASSERT_VALID( pTestBar );
  1115. ASSERT_KINDOF( CControlBar, pTestBar );
  1116. if( !pTestBar->IsDockBar() )
  1117. {
  1118. if( pTestBar->IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  1119. {
  1120. CExtDockDynBar * pDynDocker =
  1121. ((CExtDynControlBar*)pTestBar)->
  1122. m_pWndDynDocker;
  1123. ASSERT_VALID( pDynDocker );
  1124. bool bRemoved = false;
  1125. pDynDocker->RemovePlaceHolder(
  1126. pBar,
  1127. false,
  1128. &bRemoved
  1129. );
  1130. if( bRemoved )
  1131. {
  1132. if( p_bRemoved != NULL )
  1133. *p_bRemoved = true;
  1134. return;
  1135. }
  1136. }
  1137. continue;
  1138. }
  1139. ASSERT_KINDOF( CDockBar, pTestBar );
  1140. // dirty, but safe
  1141. bool bRemoved = false;
  1142. ((CExtDockBar *)pTestBar)->RemovePlaceHolder(
  1143. pBar,
  1144. false,
  1145. &bRemoved
  1146. );
  1147. if( bRemoved )
  1148. {
  1149. if( p_bRemoved != NULL )
  1150. *p_bRemoved = true;
  1151. return;
  1152. }
  1153. }
  1154. }
  1155. void CExtDockBar::_SlideDockControlBar(
  1156. CControlBar* pBar,
  1157. LPCRECT lpRect,
  1158. BOOL bMovingEnabled,
  1159. const POINT * ptDesiredMid // = NULL
  1160. )
  1161. {
  1162. ASSERT_VALID( this);
  1163. ASSERT_VALID( pBar );
  1164. ASSERT_KINDOF( CControlBar, pBar );
  1165. CRect rcBar;
  1166. pBar->GetWindowRect( &rcBar );
  1167. if( pBar->m_pDockBar == this
  1168. && (lpRect == NULL || rcBar == *lpRect)
  1169. )
  1170. {
  1171. // already docked and no change in position
  1172. return;
  1173. }
  1174. // set CBRS_FLOAT_MULTI style if docking bar has it
  1175. if( m_bFloating
  1176. && (pBar->m_dwDockStyle & CBRS_FLOAT_MULTI)
  1177. )
  1178. m_dwStyle |= CBRS_FLOAT_MULTI;
  1179. m_dwStyle &= ~(CBRS_SIZE_FIXED | CBRS_SIZE_DYNAMIC);
  1180. m_dwStyle |=
  1181. pBar->m_dwStyle & (CBRS_SIZE_FIXED | CBRS_SIZE_DYNAMIC);
  1182. if( !(m_dwStyle & CBRS_FLOAT_MULTI) )
  1183. {
  1184. CString sTitle;
  1185. pBar->GetWindowText( sTitle );
  1186. AfxSetWindowText( m_hWnd, (LPCTSTR)sTitle );
  1187. }
  1188. // align correctly and turn on all borders
  1189. DWORD dwStyle = pBar->GetBarStyle();
  1190. dwStyle &= ~(CBRS_ALIGN_ANY);
  1191. dwStyle |=  (m_dwStyle & CBRS_ALIGN_ANY) | CBRS_BORDER_ANY;
  1192. if( m_bFloating )
  1193. dwStyle |= CBRS_FLOATING;
  1194. else
  1195. dwStyle &= ~CBRS_FLOATING;
  1196. pBar->SetBarStyle( dwStyle );
  1197. // hide first if changing to a new docking site to avoid flashing
  1198. bool bShow = false;
  1199. if( bMovingEnabled &&
  1200. pBar->m_pDockBar != this && pBar->IsWindowVisible() )
  1201. {
  1202. pBar->SetWindowPos(NULL, 0, 0, 0, 0,
  1203. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_HIDEWINDOW);
  1204. bShow = true;
  1205. }
  1206. int nPos = -1;
  1207. if( lpRect != NULL )
  1208. {
  1209. // insert into appropriate row
  1210. CRect rc( lpRect );
  1211. ScreenToClient( &rc );
  1212. CPoint ptMid(
  1213. (ptDesiredMid == NULL) ?
  1214. rc.left + rc.Width()/2 : ptDesiredMid->x,
  1215. (ptDesiredMid == NULL) ?
  1216. rc.top + rc.Height()/2 : ptDesiredMid->y
  1217. );
  1218. nPos = _InsertByPointImpl( pBar, rc, ptMid );
  1219. ASSERT_VALID( this );
  1220. ASSERT_BAR_LOCATION_IN_ROW( this, pBar );
  1221. // position at requested position
  1222. if( bMovingEnabled )
  1223. pBar->SetWindowPos(
  1224. NULL,
  1225. rc.left, rc.top, rc.Width(), rc.Height(),
  1226. SWP_NOREDRAW ////|SWP_NOSENDCHANGING 
  1227. |SWP_NOZORDER|SWP_NOOWNERZORDER
  1228. |SWP_NOACTIVATE|SWP_NOCOPYBITS
  1229. );
  1230. }
  1231. else
  1232. {
  1233. // always add on current row, then create new one
  1234. m_arrBars.Add(pBar);
  1235. m_arrBars.Add(NULL);
  1236. ASSERT_VALID( this );
  1237. ASSERT_BAR_LOCATION_IN_ROW( this, pBar );
  1238. // align off the edge initially
  1239. if( bMovingEnabled )
  1240. pBar->SetWindowPos(
  1241. NULL,
  1242. -afxData.cxBorder2, -afxData.cyBorder2,
  1243. 0, 0,
  1244. SWP_NOREDRAW ////|SWP_NOSENDCHANGING 
  1245. |SWP_NOZORDER|SWP_NOOWNERZORDER
  1246. |SWP_NOACTIVATE|SWP_NOCOPYBITS
  1247. |SWP_NOSIZE
  1248. );
  1249. }
  1250. // attach it to the docking site
  1251. if( pBar->GetParent() != this )
  1252. pBar->SetParent(this);
  1253. if( pBar->m_pDockBar == this )
  1254. {
  1255. //pBar->m_pDockBar->
  1256. RemoveControlBar(
  1257. pBar,
  1258. nPos,
  1259. 0,
  1260. false // (!bMovingEnabled) ? true : false
  1261. );
  1262. ASSERT_VALID( this );
  1263. } // if( pBar->m_pDockBar == this )
  1264. else if( pBar->m_pDockBar != NULL )
  1265. {
  1266. ASSERT_KINDOF( CDockBar, pBar->m_pDockBar );
  1267. if( pBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  1268. {
  1269. bool bOptimizeDockBarLayout = false;
  1270. if( !((CExtDockBar *)(pBar->m_pDockBar))->m_bFloating )
  1271. bOptimizeDockBarLayout = true;
  1272. ((CExtDockBar *)(pBar->m_pDockBar))->
  1273. RemoveControlBar(
  1274. pBar,
  1275. -1,
  1276. m_bFloating && !pBar->m_pDockBar->m_bFloating,
  1277. false // (!bMovingEnabled) ? true : false
  1278. );
  1279. ASSERT_VALID( this );
  1280. if( bOptimizeDockBarLayout )
  1281. ((CExtDockBar *)(pBar->m_pDockBar))->OnDynamicLayoutOptimize();
  1282. }
  1283. else
  1284. {
  1285. pBar->m_pDockBar->
  1286. RemoveControlBar(
  1287. pBar,
  1288. //ph//
  1289. 0, //-1,
  1290. m_bFloating && !pBar->m_pDockBar->m_bFloating
  1291. );
  1292. ASSERT_VALID( this );
  1293. }
  1294. } // else if( pBar->m_pDockBar != NULL )
  1295. pBar->m_pDockBar = this;
  1296. ASSERT( pBar->m_pDockContext != NULL );
  1297. pBar->m_pDockContext->m_uMRUDockID = GetDlgCtrlID();
  1298. if( lpRect != NULL )
  1299. pBar->m_pDockContext->m_rectMRUDockPos = *lpRect;
  1300. if( bShow )
  1301. {
  1302. ASSERT(!pBar->IsWindowVisible());
  1303. //pBar->SetWindowPos(NULL, 0, 0, 0, 0,
  1304. // SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW);
  1305. pBar->SetWindowPos(NULL,
  1306. lpRect->left,
  1307. lpRect->top,
  1308. lpRect->right-lpRect->left,
  1309. lpRect->bottom-lpRect->top,
  1310. SWP_NOSIZE/*|SWP_NOMOVE*/|SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW);
  1311. }
  1312. // remove any place holder for pBar in this dockbar
  1313. RemovePlaceHolder( pBar, true );
  1314. ASSERT_VALID( this );
  1315. // // get parent frame for recalc layout
  1316. //CFrameWnd* pFrameWnd = GetDockingFrame();
  1317. // pFrameWnd->DelayRecalcLayout();
  1318. _OptimizeCircles();
  1319. }
  1320. void CExtDockBar::_NewRowDockControlBar(
  1321. CControlBar * pExtBarDocked,
  1322. CControlBar * pExtBarNew,
  1323. bool bLessIndex
  1324. )
  1325. {
  1326. ASSERT_VALID( this);
  1327. ASSERT_VALID( pExtBarDocked );
  1328. ASSERT_KINDOF( CControlBar, pExtBarDocked );
  1329. ASSERT_VALID( pExtBarNew );
  1330. ASSERT_KINDOF( CControlBar, pExtBarNew );
  1331. CFrameWnd * pNewDockingFrameWnd = pExtBarNew->GetDockingFrame();
  1332. INT nNewDockBarGetDockedVisibleCount = -1;
  1333. BOOL bNewFloating = pExtBarNew->IsFloating();
  1334. BOOL bNewExt = pExtBarNew->IsKindOf( RUNTIME_CLASS(CExtControlBar) );
  1335. if( pExtBarNew->GetParent() != this )
  1336. {
  1337. if( bNewExt )
  1338. ((CExtControlBar *)pExtBarNew)->m_bUpdatingChain = true;
  1339. pExtBarNew->SetWindowPos(
  1340. NULL, 0, 0, 0, 0,
  1341. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  1342. |SWP_HIDEWINDOW
  1343. );
  1344. pExtBarNew->SetParent( this );
  1345. if( bNewExt )
  1346. ((CExtControlBar *)pExtBarNew)->m_bUpdatingChain = false;
  1347. }
  1348. // align correctly and turn on all borders
  1349. DWORD dwStyle = pExtBarNew->GetBarStyle();
  1350. dwStyle &= ~(CBRS_ALIGN_ANY);
  1351. dwStyle |=  (m_dwStyle & CBRS_ALIGN_ANY) | CBRS_BORDER_ANY;
  1352. if( m_bFloating )
  1353. dwStyle |= CBRS_FLOATING;
  1354. else
  1355. dwStyle &= ~CBRS_FLOATING;
  1356. pExtBarNew->SetBarStyle( dwStyle );
  1357. INT nCountOfSideBars = (INT)m_arrBars.GetSize();
  1358. CControlBar * pRemoveBar = NULL;
  1359. HWND hWndDockBarOld = NULL;
  1360. if( pExtBarNew->m_pDockBar != this )
  1361. {
  1362. if( pExtBarNew->m_pDockBar != NULL )
  1363. {
  1364. nNewDockBarGetDockedVisibleCount =
  1365. GetDockedVisibleCount();
  1366. ASSERT_VALID( pExtBarNew->m_pDockBar );
  1367. ASSERT_KINDOF( CDockBar, pExtBarNew->m_pDockBar );
  1368. if( pExtBarNew->IsWindowVisible() )
  1369. pExtBarNew->SetWindowPos(
  1370. NULL, 0, 0, 0, 0,
  1371. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  1372. |SWP_HIDEWINDOW
  1373. );
  1374. ASSERT_VALID( pExtBarNew->m_pDockBar );
  1375. if( !pExtBarNew->m_pDockBar->m_bFloating
  1376. && pExtBarNew->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar))
  1377. )
  1378. {
  1379. hWndDockBarOld = pExtBarNew->m_pDockBar->GetSafeHwnd();
  1380. ((CExtDockBar *)pExtBarNew->m_pDockBar)->RemoveControlBar( pExtBarNew );
  1381. // optimized at final state with all circles
  1382. // ((CExtDockBar *)pExtBarNew->m_pDockBar)->OnDynamicLayoutOptimize();
  1383. }
  1384. else
  1385. pExtBarNew->m_pDockBar->RemoveControlBar( pExtBarNew );
  1386. //ASSERT_VALID( pExtBarNew->m_pDockBar ); this may be already destroyed floating dockbar
  1387. } // if( pExtBarNew->m_pDockBar != NULL )
  1388. } // if( pExtBarNew->m_pDockBar != this )
  1389. else
  1390. {
  1391. if( pExtBarDocked != pExtBarNew )
  1392. {
  1393. INT nPos = FindBar( pExtBarNew );
  1394. ASSERT( nPos >= 0 && nPos < nCountOfSideBars );
  1395. m_arrBars.RemoveAt( nPos );
  1396. nCountOfSideBars --;
  1397. ASSERT( nCountOfSideBars > 1 );
  1398. if(   ( nCountOfSideBars == nPos
  1399. && m_arrBars[nPos-1] == NULL )
  1400. ||
  1401.   ( nCountOfSideBars > nPos
  1402. && m_arrBars[nPos-1] == NULL
  1403. && m_arrBars[nPos] == NULL
  1404. )
  1405. )
  1406. {
  1407. // remove empty row
  1408. m_arrBars.RemoveAt( nPos-1 );
  1409. nCountOfSideBars --;
  1410. }
  1411. ASSERT_VALID( this );
  1412. } // if( pExtBarDocked != pExtBarNew )
  1413. else
  1414. pRemoveBar = pExtBarNew;
  1415. } // else from if( pExtBarNew->m_pDockBar != this )
  1416. INT nIdxDockedBar = FindBar( pExtBarDocked );
  1417. ASSERT( nIdxDockedBar >= 0 && nIdxDockedBar < nCountOfSideBars );
  1418. INT nIncrement = bLessIndex ? -1 : 1;
  1419. INT nIdx = 0;
  1420. for( nIdx = nIdxDockedBar; true; nIdx += nIncrement )
  1421. {
  1422. CControlBar * pBar = (CControlBar *) m_arrBars[ nIdx ];
  1423. if( nIdx == 0
  1424. || nIdx == (nCountOfSideBars-1)
  1425. || pBar == NULL
  1426. )
  1427. {
  1428. ASSERT( m_arrBars[0] == NULL );
  1429. m_arrBars.InsertAt( nIdx, pExtBarNew );
  1430. m_arrBars.InsertAt( nIdx, (CControlBar *)NULL );
  1431. ASSERT_VALID( this );
  1432. break;
  1433. }
  1434. #ifdef _DEBUG
  1435. if( __PLACEHODLER_BAR_PTR(pBar) )
  1436. continue;
  1437. ASSERT_VALID( pBar );
  1438. ASSERT_KINDOF( CControlBar, pBar );
  1439. #endif // _DEBUG
  1440. } // for( nIdx = nIdxDockedBar; true; nIdx += nIncrement )
  1441. CDockBar * pOldDockBar = pExtBarNew->m_pDockBar;
  1442. pExtBarNew->m_pDockBar = this;
  1443. ASSERT_BAR_LOCATION_IN_ROW( this, pExtBarNew );
  1444. ASSERT( pExtBarNew->m_pDockContext != NULL );
  1445. pExtBarNew->m_pDockContext->m_uMRUDockID = GetDlgCtrlID();
  1446. if( pRemoveBar != NULL )
  1447. {
  1448. INT nPos = FindBar( pRemoveBar, nIdx+1 );
  1449. nCountOfSideBars = (INT)m_arrBars.GetSize();
  1450. ASSERT( nPos >= 0 && nPos < nCountOfSideBars );
  1451. m_arrBars.RemoveAt( nPos );
  1452. nCountOfSideBars --;
  1453. ASSERT( nCountOfSideBars > 1 );
  1454. if(   ( nCountOfSideBars == nPos
  1455. && m_arrBars[nPos-1] == NULL )
  1456. ||
  1457.   ( nCountOfSideBars > nPos
  1458. && m_arrBars[nPos-1] == NULL
  1459. && m_arrBars[nPos] == NULL
  1460. )
  1461. )
  1462. {
  1463. // remove empty row
  1464. m_arrBars.RemoveAt( nPos-1 );
  1465. // nCountOfSideBars --;
  1466. }
  1467. ASSERT_VALID( this );
  1468. }
  1469. if( bNewFloating && nNewDockBarGetDockedVisibleCount == 0 )
  1470. {
  1471. if( pOldDockBar->GetDockedCount() == 0 )
  1472. pNewDockingFrameWnd->DestroyWindow();
  1473. else
  1474. pNewDockingFrameWnd->ShowWindow( SW_HIDE );
  1475. }
  1476. // else
  1477. // pNewDockingFrameWnd->DelayRecalcLayout();
  1478. // ASSERT( !pExtBarNew->IsWindowVisible() );
  1479. pExtBarNew->SetWindowPos(NULL, 0, 0, 0, 0,
  1480. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  1481. |SWP_SHOWWINDOW|SWP_FRAMECHANGED
  1482. );
  1483. OnDynamicLayoutUpdate();
  1484. if( hWndDockBarOld != NULL
  1485. && hWndDockBarOld != GetSafeHwnd()
  1486. && ::IsWindow(hWndDockBarOld)
  1487. )
  1488. {
  1489. CWnd * pWndDockBar = FromHandlePermanent( hWndDockBarOld );
  1490. if( pWndDockBar != NULL
  1491. && pWndDockBar->GetSafeHwnd() == hWndDockBarOld
  1492. )
  1493. {
  1494. ASSERT( pWndDockBar != this );
  1495. ASSERT_KINDOF( CExtDockBar, pWndDockBar );
  1496. ((CExtDockBar *)pWndDockBar)->OnDynamicLayoutUpdate();
  1497. }
  1498. }
  1499. CFrameWnd * pFrame = GetParentFrame();
  1500. ASSERT_VALID( pFrame );
  1501. if( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
  1502. _OptimizeCircles();
  1503. }
  1504. void CExtDockBar::_InnerOuterDockControlBar(
  1505. CControlBar * pBar,
  1506. bool bInner
  1507. )
  1508. {
  1509. ASSERT_VALID( this );
  1510. ASSERT_VALID( pBar );
  1511. ASSERT_KINDOF( CControlBar, pBar );
  1512. UINT nOwnID = GetDlgCtrlID();
  1513. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nOwnID );
  1514. bool bDockAtStartIdx = false;
  1515. if( nOwnID == AFX_IDW_DOCKBAR_RIGHT
  1516. || nOwnID == AFX_IDW_DOCKBAR_BOTTOM
  1517. )
  1518. bDockAtStartIdx = true;
  1519. if( !bInner )
  1520. bDockAtStartIdx = false;
  1521. if( pBar->m_pDockBar == this )
  1522. {
  1523. INT nCountOfBars = (INT)m_arrBars.GetSize();
  1524. ASSERT( nCountOfBars > 2 );
  1525. if( m_arrBars[1] == pBar )
  1526. return;
  1527. INT nBarPos = FindBar( pBar );
  1528. ASSERT( nBarPos > 0 && nBarPos < nCountOfBars );
  1529. m_arrBars.RemoveAt( nBarPos );
  1530. nCountOfBars --;
  1531. if( m_arrBars[nBarPos - 1] == NULL
  1532. && m_arrBars[ nBarPos ] == NULL
  1533. )
  1534. {
  1535. m_arrBars.RemoveAt( nBarPos );
  1536. nCountOfBars --;
  1537. }
  1538. //ASSERT_VALID( this );
  1539. if( bDockAtStartIdx )
  1540. {
  1541. m_arrBars.InsertAt( 1, pBar );
  1542. nCountOfBars++;
  1543. ASSERT( nCountOfBars == m_arrBars.GetSize() );
  1544. if( nCountOfBars < 3 || m_arrBars[2] != NULL )
  1545. m_arrBars.InsertAt( 2, (CControlBar *)NULL );
  1546. ASSERT_VALID( this );
  1547. } // if( bDockAtStartIdx )
  1548. else
  1549. {
  1550. m_arrBars.InsertAt( nCountOfBars, (CControlBar *)NULL );
  1551. m_arrBars.InsertAt( nCountOfBars, pBar );
  1552. ASSERT_VALID( this );
  1553. } // else from if( bDockAtStartIdx )
  1554. } // if( pBar->m_pDockBar == this )
  1555. else
  1556. {
  1557. CFrameWnd * pDockingFrameWnd = pBar->GetDockingFrame();
  1558. INT nDockBarGetDockedVisibleCount = -1;
  1559. BOOL bFloating = pBar->IsFloating();
  1560. ASSERT( pBar->GetParent() != this );
  1561. pBar->SetWindowPos(
  1562. NULL, 0, 0, 0, 0,
  1563. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  1564. |SWP_HIDEWINDOW
  1565. );
  1566. pBar->SetParent( this );
  1567. // align correctly and turn on all borders
  1568. DWORD dwStyle = pBar->GetBarStyle();
  1569. dwStyle &= ~(CBRS_ALIGN_ANY);
  1570. dwStyle |=  (m_dwStyle & CBRS_ALIGN_ANY) | CBRS_BORDER_ANY;
  1571. if( m_bFloating )
  1572. dwStyle |= CBRS_FLOATING;
  1573. else
  1574. dwStyle &= ~CBRS_FLOATING;
  1575. pBar->SetBarStyle( dwStyle );
  1576. ASSERT( pBar->m_pDockBar != this );
  1577. if( pBar->IsWindowVisible() )
  1578. pBar->SetWindowPos(
  1579. NULL, 0, 0, 0, 0,
  1580. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  1581. |SWP_HIDEWINDOW
  1582. );
  1583. if( pBar->m_pDockBar != NULL )
  1584. {
  1585. ASSERT_VALID( pBar->m_pDockBar );
  1586. ASSERT_KINDOF( CDockBar, pBar->m_pDockBar );
  1587. if( !pBar->m_pDockBar->m_bFloating
  1588. && pBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar))
  1589. )
  1590. {
  1591. ((CExtDockBar *)pBar->m_pDockBar)->RemoveControlBar( pBar );
  1592. ((CExtDockBar *)pBar->m_pDockBar)->OnDynamicLayoutOptimize();
  1593. }
  1594. else
  1595. pBar->m_pDockBar->RemoveControlBar( pBar );
  1596. //ASSERT_VALID( pBar->m_pDockBar ); this may be already destroyed floating dockbar
  1597. }
  1598. //ASSERT_VALID( this );
  1599. INT nCountOfBars = (INT)m_arrBars.GetSize();
  1600. ASSERT( nCountOfBars > 0 );
  1601. if( bDockAtStartIdx )
  1602. {
  1603. m_arrBars.InsertAt( 1, pBar );
  1604. nCountOfBars++;
  1605. if( nCountOfBars < 3 || m_arrBars[2] != NULL )
  1606. m_arrBars.InsertAt( 2, (CControlBar *)NULL );
  1607. ASSERT_VALID( this );
  1608. } // if( bDockAtStartIdx )
  1609. else
  1610. {
  1611. m_arrBars.InsertAt( nCountOfBars, (CControlBar *)NULL );
  1612. m_arrBars.InsertAt( nCountOfBars, pBar );
  1613. if( nCountOfBars > 1 // (+ v.2.24) - fixes initial mutual sizes in row/col problem
  1614.    && m_arrBars[nCountOfBars-1] == NULL
  1615.    )
  1616.    m_arrBars.RemoveAt( nCountOfBars-1, 1 );
  1617. ASSERT_VALID( this );
  1618. } // else from if( bDockAtStartIdx )
  1619. CDockBar * pOldDockBar = pBar->m_pDockBar;
  1620. pBar->m_pDockBar = this;
  1621. ASSERT_BAR_LOCATION_IN_ROW( this, pBar );
  1622. ASSERT( pBar->m_pDockContext != NULL );
  1623. pBar->m_pDockContext->m_uMRUDockID = GetDlgCtrlID();
  1624. if( bFloating && nDockBarGetDockedVisibleCount == 0 )
  1625. {
  1626. if( pOldDockBar->GetDockedCount() == 0 )
  1627. pDockingFrameWnd->DestroyWindow();
  1628. else
  1629. pDockingFrameWnd->ShowWindow( SW_HIDE );
  1630. }
  1631. // else
  1632. // pDockingFrameWnd->DelayRecalcLayout();
  1633. // ASSERT( !pBar->IsWindowVisible() );
  1634. pBar->SetWindowPos(NULL, 0, 0, 0, 0,
  1635. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  1636. |SWP_SHOWWINDOW|SWP_FRAMECHANGED
  1637. );
  1638. ASSERT_VALID( this );
  1639. } // else from if( pBar->m_pDockBar == this )
  1640. _OptimizeCircles();
  1641. }
  1642. void CExtDockBar::_LockSequenceOptimization( bool bLock )
  1643. {
  1644. ASSERT_VALID( this );
  1645. ASSERT_KINDOF( CExtDockBar, this );
  1646. m_bLockedOptimize = bLock;
  1647. }
  1648. void CExtDockDynBar::_LockSequenceOptimization( bool bLock )
  1649. {
  1650. ASSERT_VALID( this );
  1651. ASSERT_KINDOF( CExtDockDynBar, this );
  1652. m_bLockedOptimize = bLock;
  1653. CExtDynControlBar * pDynBar =
  1654. STATIC_DOWNCAST(
  1655. CExtDynControlBar,
  1656. GetParent()
  1657. );
  1658. ASSERT( pDynBar->m_pWndDynDocker == this );
  1659. ASSERT_VALID( pDynBar->m_pDockBar );
  1660. if(  pDynBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  1661. ((CExtDockBar *)pDynBar->m_pDockBar)->_LockSequenceOptimization( bLock );
  1662. }
  1663. void CExtDockBar::DockControlBar(
  1664. CControlBar * pBar,
  1665. LPCRECT lpRect, // = NULL
  1666. bool bSmoothMode, // = false
  1667. bool bForceNoOptimize // = false
  1668. )
  1669. {
  1670. ASSERT_VALID(this);
  1671. ASSERT_VALID(pBar);
  1672. ASSERT_KINDOF(CControlBar, pBar);
  1673. CRect rectBar;
  1674. pBar->GetWindowRect( &rectBar );
  1675. if( pBar->m_pDockBar == this
  1676. && (lpRect == NULL || rectBar == *lpRect)
  1677. )
  1678. return; // already docked and no change in position
  1679. // set CBRS_FLOAT_MULTI style if docking bar has it
  1680. if( m_bFloating && (pBar->m_dwDockStyle & CBRS_FLOAT_MULTI) )
  1681. m_dwStyle |= CBRS_FLOAT_MULTI;
  1682. m_dwStyle &= ~(CBRS_SIZE_FIXED | CBRS_SIZE_DYNAMIC);
  1683. m_dwStyle |= pBar->m_dwStyle & (CBRS_SIZE_FIXED | CBRS_SIZE_DYNAMIC);
  1684. if( ( m_dwStyle & CBRS_FLOAT_MULTI ) != 0 )
  1685. {
  1686. CString sTitle;
  1687. pBar->GetWindowText( sTitle );
  1688. AfxSetWindowText( m_hWnd, (LPCTSTR)sTitle );
  1689. }
  1690. // align correctly and turn on all borders
  1691. DWORD dwStyle = pBar->GetBarStyle();
  1692. dwStyle &= ~(CBRS_ALIGN_ANY);
  1693. dwStyle |=  (m_dwStyle & CBRS_ALIGN_ANY) | CBRS_BORDER_ANY;
  1694. if( m_bFloating )
  1695. dwStyle |= CBRS_FLOATING;
  1696. else
  1697. dwStyle &= ~CBRS_FLOATING;
  1698. pBar->SetBarStyle(dwStyle);
  1699. // hide first if changing to a new docking site to avoid flashing
  1700. BOOL bShow = FALSE;
  1701. if( pBar->m_pDockBar != this && pBar->IsWindowVisible() )
  1702. {
  1703. pBar->SetWindowPos(
  1704. NULL,
  1705. 0, 0, 0, 0,
  1706. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_HIDEWINDOW
  1707. );
  1708. bShow = TRUE;
  1709. }
  1710. int nPos = -1;
  1711. if( lpRect != NULL )
  1712. {
  1713. // insert into appropriate row
  1714. CRect rect(lpRect);
  1715. ScreenToClient(&rect);
  1716. CPoint ptMid(rect.left + rect.Width()/2, rect.top + rect.Height()/2);
  1717. //nPos = Insert(pBar, rect, ptMid);
  1718. nPos = CDockBar::Insert(pBar, rect, ptMid);
  1719. ASSERT( nPos > 0 && nPos < (m_arrBars.GetSize()-1) );
  1720. // adjust with the previous full-row-mode neiborhood
  1721. // based on the fixed-style docking algorithm
  1722. CControlBar * pBarNeiborhood =
  1723. (CControlBar *)(m_arrBars[nPos-1]);
  1724. if( pBarNeiborhood != NULL
  1725. && (! (__PLACEHODLER_BAR_PTR(pBarNeiborhood)) )
  1726. )
  1727. {
  1728. ASSERT_VALID( pBarNeiborhood );
  1729. CExtControlBar * pExtBarNeiborhood =
  1730. DYNAMIC_DOWNCAST( CExtControlBar, pBarNeiborhood );
  1731. if( pExtBarNeiborhood != NULL
  1732. && pExtBarNeiborhood->IsFixedDockStyle()
  1733. && pExtBarNeiborhood->_GetFullRowMode()
  1734. )
  1735. m_arrBars.InsertAt( nPos++, (CControlBar *)NULL );
  1736. }
  1737. // adjust with the next full-row-mode neiborhood
  1738. // based on the fixed-style docking algorithm
  1739. pBarNeiborhood =
  1740. (CControlBar *)(m_arrBars[nPos+1]);
  1741. if( pBarNeiborhood != NULL
  1742. && (! (__PLACEHODLER_BAR_PTR(pBarNeiborhood)) )
  1743. )
  1744. {
  1745. ASSERT_VALID( pBarNeiborhood );
  1746. CExtControlBar * pExtBarNeiborhood =
  1747. DYNAMIC_DOWNCAST( CExtControlBar, pBarNeiborhood );
  1748. if( pExtBarNeiborhood != NULL
  1749. && pExtBarNeiborhood->IsFixedDockStyle()
  1750. && pExtBarNeiborhood->_GetFullRowMode()
  1751. )
  1752. m_arrBars.InsertAt( nPos+1, (CControlBar *)NULL );
  1753. }
  1754. // position at requested position
  1755. pBar->SetWindowPos(NULL, rect.left, rect.top, rect.Width(),
  1756. rect.Height(), SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS);
  1757. }
  1758. else
  1759. {
  1760. // always add on current row, then create new one
  1761. m_arrBars.Add(pBar);
  1762. m_arrBars.Add(NULL);
  1763. // align off the edge initially
  1764. pBar->SetWindowPos(
  1765. NULL,
  1766. -afxData.cxBorder2, -afxData.cyBorder2, 0, 0,
  1767. SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS
  1768. );
  1769. }
  1770. // attach it to the docking site
  1771. if( pBar->GetParent() != this )
  1772. {
  1773. CExtControlBar * pExtBar = DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1774. if( pExtBar != NULL
  1775. && pExtBar->IsFixedMode()
  1776. && pExtBar->IsFixedDockStyle()
  1777. )
  1778. {
  1779. CFrameWnd * pFrame = pExtBar->GetParentFrame();
  1780. ASSERT_VALID( pFrame );
  1781. if( pFrame != pExtBar->m_pDockSite )
  1782. {
  1783. ASSERT_KINDOF( CMiniDockFrameWnd, pFrame );
  1784. pFrame->ShowWindow( SW_HIDE );
  1785. CExtPaintManager::stat_PassPaintMessages();
  1786. } // if( pFrame != pBar->m_pDockSite )
  1787. }
  1788. pBar->SetParent(this);
  1789. }
  1790. if( pBar->m_pDockBar == this )
  1791. RemoveControlBar(pBar, nPos);
  1792. else if( pBar->m_pDockBar != NULL )
  1793. {
  1794. ASSERT_KINDOF( CDockBar, pBar->m_pDockBar );
  1795. if( pBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  1796. {
  1797. bool bOptimizeDockBarLayout = false;
  1798. if( !((CExtDockBar *)(pBar->m_pDockBar))->m_bFloating )
  1799. bOptimizeDockBarLayout = true;
  1800. ((CExtDockBar *)(pBar->m_pDockBar))->RemoveControlBar( pBar, -1, m_bFloating && (!pBar->m_pDockBar->m_bFloating), false );
  1801. ASSERT_VALID( this );
  1802. if( bOptimizeDockBarLayout && (!bForceNoOptimize) && ( IsKindOf(RUNTIME_CLASS(CExtDockBar)) && (! m_bLockedOptimize ) ) )
  1803. ((CExtDockBar *)(pBar->m_pDockBar))->OnDynamicLayoutOptimize();
  1804. }
  1805. else
  1806. {
  1807. pBar->m_pDockBar->RemoveControlBar( pBar, 0, m_bFloating && (!pBar->m_pDockBar->m_bFloating) );
  1808. ASSERT_VALID( this );
  1809. }
  1810. }
  1811. pBar->m_pDockBar = this;
  1812. if( bShow )
  1813. {
  1814. ASSERT(!pBar->IsWindowVisible());
  1815. pBar->SetWindowPos(
  1816. NULL,
  1817. 0, 0, 0, 0,
  1818. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW
  1819. );
  1820. }
  1821. else if( bSmoothMode && lpRect != NULL )
  1822. {
  1823. CRect rcSmooth( *lpRect );
  1824. ScreenToClient( &rcSmooth );
  1825. pBar->SetWindowPos(
  1826. NULL,
  1827. rcSmooth.left, rcSmooth.top,
  1828. rcSmooth.Width(), rcSmooth.Height(),
  1829. SWP_NOZORDER|SWP_NOACTIVATE
  1830. ////|SWP_NOSENDCHANGING 
  1831. |SWP_NOREDRAW
  1832. );
  1833. } // else if( bSmoothMode && lpRect != NULL )
  1834. // remove any place holder for pBar in this dockbar
  1835. if( (! m_bFloating )  )
  1836. RemovePlaceHolder( pBar, true );
  1837. ASSERT_VALID( this );
  1838. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  1839. && ((CExtControlBar*)pBar)->_GetFullRowMode()
  1840. )
  1841. {
  1842. nPos = FindBar( pBar );
  1843. ASSERT( nPos > 0 && nPos < (m_arrBars.GetSize()-1) );
  1844. if( m_arrBars[nPos+1] == NULL )
  1845. {
  1846. if( m_arrBars[nPos-1] != NULL )
  1847. {
  1848. m_arrBars.InsertAt( nPos, (CControlBar *)NULL );
  1849. ASSERT_VALID( this );
  1850. }
  1851. } // if( m_arrBars[nPos+1] == NULL )
  1852. else
  1853. {
  1854. if( m_arrBars[nPos-1] == NULL )
  1855. {
  1856. m_arrBars.InsertAt( nPos+1, (CControlBar *)NULL );
  1857. ASSERT_VALID( this );
  1858. }
  1859. else
  1860. {
  1861. int nPos2 = nPos-1;
  1862. for( ; m_arrBars[nPos2] != NULL; nPos2-- );
  1863. ASSERT( nPos2 >= 0 );
  1864. m_arrBars.RemoveAt( nPos );
  1865. m_arrBars.InsertAt( nPos2, pBar );
  1866. m_arrBars.InsertAt( nPos2, (CControlBar *)NULL );
  1867. ASSERT_VALID( this );
  1868. }
  1869. } // else from if( m_arrBars[nPos+1] == NULL )
  1870. }
  1871. // get parent frame for recalc layout
  1872. CFrameWnd* pFrameWnd = GetDockingFrame();
  1873. pFrameWnd->DelayRecalcLayout();
  1874. // OPTFIX:
  1875. // if( (!bForceNoOptimize) && (! pFrameWnd->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) ) )
  1876. // _OptimizeCircles();
  1877. }
  1878. void CExtDockBar::DrawBorders(CDC* pDC, CRect& rect)
  1879. {
  1880. ASSERT_VALID( this );
  1881. ASSERT_VALID( pDC );
  1882. CExtPaintManager::PAINTCONTROLBARBORDERSDATA _pcbbd(
  1883. this,
  1884. CExtPaintManager::__CB_OUTER_DOCKBAR,
  1885. m_dwStyle, // |CBRS_BORDER_ANY|CBRS_BORDER_3D
  1886. rect
  1887. );
  1888. PmBridge_GetPM()->PaintControlBarBorders( *pDC, _pcbbd );
  1889. }
  1890. void CExtDockBar::DrawGripper(CDC* pDC, const CRect& rect)
  1891. {
  1892. ASSERT_VALID( this );
  1893. pDC,
  1894. rect;
  1895. }
  1896. LRESULT CExtDockBar::OnSizeParent(WPARAM wParam, LPARAM lParam)
  1897. {
  1898. ASSERT_VALID( this );
  1899. wParam;
  1900. // if( CExtControlBar::g_bUpdatingDragState )
  1901. // return 0;
  1902. if( m_bLockedOptimize )
  1903. return 0;
  1904. LRESULT lResult = 0L;
  1905. AFX_SIZEPARENTPARAMS * lpLayout =
  1906. (AFX_SIZEPARENTPARAMS *) lParam;
  1907. ASSERT( lpLayout != NULL );
  1908. BOOL bLayoutQuery = m_bLayoutQuery;
  1909. CRect rectLayout = m_rectLayout;
  1910. m_bLayoutQuery = (lpLayout->hDWP == NULL);
  1911. m_rectLayout = lpLayout->rect;
  1912. DWORD dwStyle = RecalcDelayShow( lpLayout );
  1913. if( ( (dwStyle&WS_VISIBLE) != 0 )
  1914. && ( (dwStyle&CBRS_ALIGN_ANY) != 0 )
  1915. )
  1916. {
  1917. CRect rect = lpLayout->rect;
  1918. CSize sizeAvail = rect.Size();
  1919. DWORD dwMode = lpLayout->bStretch ? LM_STRETCH : 0;
  1920. if( ( (m_dwStyle&CBRS_SIZE_DYNAMIC) != 0 )
  1921. && ( (m_dwStyle&CBRS_FLOATING ) != 0 )
  1922. )
  1923. dwMode |= LM_HORZ|LM_MRUWIDTH;
  1924. else if( (dwStyle&CBRS_ORIENT_HORZ) != 0 )
  1925. dwMode |= LM_HORZ|LM_HORZDOCK;
  1926. else
  1927. dwMode |=  LM_VERTDOCK;
  1928. CSize size = CalcDynamicLayout( -1, dwMode );
  1929. size.cx = min( size.cx, sizeAvail.cx );
  1930. size.cy = min( size.cy, sizeAvail.cy );
  1931. if( (dwStyle&CBRS_ORIENT_HORZ) != 0 )
  1932. {
  1933. lpLayout->sizeTotal.cy += size.cy;
  1934. lpLayout->sizeTotal.cx = max( lpLayout->sizeTotal.cx, size.cx );
  1935. if( (dwStyle&CBRS_ALIGN_TOP) != 0 )
  1936. lpLayout->rect.top += size.cy;
  1937. else if( (dwStyle&CBRS_ALIGN_BOTTOM) != 0 )
  1938. {
  1939. rect.top = rect.bottom - size.cy;
  1940. lpLayout->rect.bottom -= size.cy;
  1941. }
  1942. }
  1943. else if( (dwStyle&CBRS_ORIENT_VERT) != 0 )
  1944. {
  1945. lpLayout->sizeTotal.cx += size.cx;
  1946. lpLayout->sizeTotal.cy = max( lpLayout->sizeTotal.cy, size.cy );
  1947. HWND hWndParent = ::GetParent( m_hWnd );
  1948. ASSERT( hWndParent != NULL && ::IsWindow(hWndParent) );
  1949. __EXT_MFC_LONG_PTR dwStyleEx = ::__EXT_MFC_GetWindowLong( hWndParent, GWL_EXSTYLE );
  1950. bool bParentRTL = ( (dwStyleEx&WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  1951. if( bParentRTL )
  1952. {
  1953. if( (dwStyle&CBRS_ALIGN_RIGHT) != 0 )
  1954. lpLayout->rect.left += size.cx;
  1955. else if( (dwStyle&CBRS_ALIGN_LEFT) != 0 )
  1956. {
  1957. rect.left = rect.right - size.cx;
  1958. lpLayout->rect.right -= size.cx;
  1959. }
  1960. } // if( bParentRTL )
  1961. else
  1962. {
  1963. if( (dwStyle&CBRS_ALIGN_LEFT) != 0 )
  1964. lpLayout->rect.left += size.cx;
  1965. else if( (dwStyle&CBRS_ALIGN_RIGHT) != 0 )
  1966. {
  1967. rect.left = rect.right - size.cx;
  1968. lpLayout->rect.right -= size.cx;
  1969. }
  1970. } // else from if( bParentRTL )
  1971. }
  1972. #ifdef _DEBUG
  1973. else
  1974. {
  1975. ASSERT(FALSE);
  1976. }
  1977. #endif // _DEBUG
  1978. rect.right = rect.left + size.cx;
  1979. rect.bottom = rect.top + size.cy;
  1980. if( lpLayout->hDWP != NULL )
  1981. AfxRepositionWindow( lpLayout, m_hWnd, &rect );
  1982. }
  1983. m_bLayoutQuery = bLayoutQuery;
  1984. m_rectLayout = rectLayout;
  1985. if( (m_dwStyle & CBRS_ALIGN_ANY) == 0 )
  1986. return lResult;
  1987. UINT nOwnID = GetDlgCtrlID();
  1988. if( nOwnID == AFX_IDW_DOCKBAR_FLOAT )
  1989. return lResult;
  1990. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nOwnID );
  1991. if( lpLayout->hDWP != NULL )
  1992. Invalidate();
  1993. m_rcLastInvisiblePreCalc = lpLayout->rect;
  1994. if( nOwnID == AFX_IDW_DOCKBAR_LEFT
  1995. || nOwnID == AFX_IDW_DOCKBAR_RIGHT
  1996. )
  1997. {
  1998. HWND hWndParent = ::GetParent( m_hWnd );
  1999. ASSERT( hWndParent != NULL && ::IsWindow(hWndParent) );
  2000. __EXT_MFC_LONG_PTR dwStyleEx = ::__EXT_MFC_GetWindowLong( hWndParent, GWL_EXSTYLE );
  2001. bool bParentRTL = ( (dwStyleEx&WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  2002. if( bParentRTL )
  2003. {
  2004. if( nOwnID == AFX_IDW_DOCKBAR_LEFT )
  2005. nOwnID = AFX_IDW_DOCKBAR_RIGHT;
  2006. else
  2007. nOwnID = AFX_IDW_DOCKBAR_LEFT;
  2008. } // if( bParentRTL )
  2009. }
  2010. switch( nOwnID )
  2011. {
  2012. case AFX_IDW_DOCKBAR_TOP:
  2013. m_rcLastInvisiblePreCalc.bottom = m_rcLastInvisiblePreCalc.top;
  2014. break;
  2015. case AFX_IDW_DOCKBAR_BOTTOM:
  2016. m_rcLastInvisiblePreCalc.top = m_rcLastInvisiblePreCalc.bottom;
  2017. break;
  2018. case AFX_IDW_DOCKBAR_LEFT:
  2019. m_rcLastInvisiblePreCalc.right = m_rcLastInvisiblePreCalc.left;
  2020. break;
  2021. case AFX_IDW_DOCKBAR_RIGHT:
  2022. m_rcLastInvisiblePreCalc.left = m_rcLastInvisiblePreCalc.right;
  2023. break;
  2024. #ifdef _DEBUG
  2025. default:
  2026. ASSERT( FALSE );
  2027. break;
  2028. #endif // _DEBUG
  2029. } // switch( nOwnID )
  2030. CFrameWnd * pFrame = _GetDockingFrameImpl();
  2031. ASSERT_VALID( pFrame );
  2032. ASSERT_KINDOF( CFrameWnd, pFrame );
  2033. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  2034. pFrame->ClientToScreen( &m_rcLastInvisiblePreCalc );
  2035. return lResult;
  2036. }
  2037. BOOL CExtDockBar::RemoveControlBar(
  2038. CControlBar * pBar,
  2039. int nPosExclude, // -1
  2040. int nAddPlaceHolder, // = 0
  2041. bool bEnableFrameDelayRecalcLayout // = true
  2042. )
  2043. {
  2044. //ph//
  2045. // temp
  2046. if( pBar->IsKindOf( RUNTIME_CLASS(CExtControlBar) )
  2047. && (! ((CExtControlBar*)pBar)->IsFixedDockStyle() )
  2048. )
  2049. nAddPlaceHolder = 0;
  2050. ASSERT_VALID( this );
  2051. ASSERT(
  2052. nAddPlaceHolder == 1
  2053. || nAddPlaceHolder == 0
  2054. || nAddPlaceHolder == -1
  2055. );
  2056. ASSERT_VALID( this );
  2057. ASSERT( pBar != NULL );
  2058. int nPos = FindBar( pBar, nPosExclude );
  2059. ASSERT( nPos > 0 );
  2060. if( nAddPlaceHolder == 1 )
  2061. {
  2062. m_arrBars[ nPos ] = (void*) (__EXT_MFC_UINT_PTR)
  2063. _AfxGetDlgCtrlID( pBar->m_hWnd );
  2064. // check for already existing place holder
  2065. int nPosOld =
  2066. FindBar(
  2067. (CControlBar *) m_arrBars[ nPos ],
  2068. nPos
  2069. );
  2070. if( nPosOld > 0 )
  2071. {
  2072. m_arrBars.RemoveAt( nPos );
  2073. // remove section indicator (NULL) if nothing
  2074. // else in section
  2075. if( m_arrBars[ nPos - 1 ] == NULL
  2076. && m_arrBars[ nPos ] == NULL
  2077. )
  2078. m_arrBars.RemoveAt( nPos );
  2079. } // if( nPosOld > 0 )
  2080. } // if( nAddPlaceHolder == 1 )
  2081. else
  2082. {
  2083. m_arrBars.RemoveAt( nPos );
  2084. if( m_arrBars[nPos-1] == NULL
  2085. && m_arrBars[nPos] == NULL
  2086. )
  2087. m_arrBars.RemoveAt( nPos );
  2088. // Remove any pre-existing place holders.
  2089. if( nAddPlaceHolder != -1 )
  2090. RemovePlaceHolder( pBar, true );
  2091. } // else from if( nAddPlaceHolder == 1 )
  2092. // don't do anything more in the shutdown case!
  2093. if( pBar->m_pDockContext == NULL )
  2094. return FALSE;
  2095. // get parent frame for recalc layout/frame destroy
  2096. CFrameWnd * pFrameWnd = GetDockingFrame();
  2097. if( m_bFloating && GetDockedVisibleCount() == 0 )
  2098. {
  2099. if( GetDockedCount() == 0 )
  2100. {
  2101. pFrameWnd->DestroyWindow();
  2102. return TRUE; // Self-Destruct
  2103. }
  2104. else
  2105. pFrameWnd->ShowWindow( SW_HIDE );
  2106. } // if( m_bFloating && GetDockedVisibleCount() == 0 )
  2107. else
  2108. {
  2109. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2110. if( IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  2111. {
  2112. CExtDynTabControlBar * pTabbedBar =
  2113. STATIC_DOWNCAST(
  2114. CExtDynTabControlBar,
  2115. GetParent()
  2116. );
  2117. //pTabbedBar->SyncSwitcher();
  2118. pTabbedBar->OnRepositionSingleChild();
  2119. }
  2120. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2121. if( bEnableFrameDelayRecalcLayout )
  2122. pFrameWnd->DelayRecalcLayout();
  2123. } // else from if( m_bFloating && GetDockedVisibleCount() == 0 )
  2124. return TRUE;
  2125. }
  2126. int CExtDockBar::Insert(
  2127. CControlBar * pBarIns,
  2128. CRect rect,
  2129. CPoint ptMid
  2130. )
  2131. {
  2132. return _InsertByPointImpl( pBarIns, rect, ptMid );
  2133. }
  2134. int CExtDockBar::_InsertByPointImpl(
  2135. CControlBar * pBarIns,
  2136. CRect rect,
  2137. CPoint ptMid
  2138. )
  2139. {
  2140. ASSERT_VALID( this );
  2141. ASSERT( pBarIns != NULL );
  2142. // ASSERT( pBarIns->m_pDockBar == this );
  2143. BOOL bExtBar = pBarIns->IsKindOf(RUNTIME_CLASS(CExtControlBar));
  2144. BOOL bExtFixedBar = FALSE;
  2145. if( bExtBar )
  2146. bExtFixedBar =  ((CExtControlBar *)pBarIns)->IsFixedMode();
  2147. BOOL bFixedBar = !bExtBar || bExtFixedBar;
  2148. INT nPos = 0, nPosInsAfter = -1, nWidth = 0, nTotalWidth = 0;
  2149. INT nCountOfSideBars = (INT)m_arrBars.GetSize();
  2150. BOOL bHorz = m_dwStyle & CBRS_ORIENT_HORZ;
  2151. CRect rcDockBarWnd;
  2152. GetWindowRect( &rcDockBarWnd );
  2153. if( rcDockBarWnd.PtInRect(ptMid) )
  2154. {
  2155. for( ; nPos < nCountOfSideBars; nPos++ )
  2156. {
  2157. CControlBar * pBar = GetDockedControlBar( nPos );
  2158. if( pBar != NULL && pBar->IsVisible() )
  2159. {
  2160. CRect rcBar;
  2161. pBar->GetWindowRect( &rcBar );
  2162. //ScreenToClient( &rcBar );
  2163. nWidth =
  2164. max(
  2165. nWidth,
  2166. bHorz ? rcBar.Size().cy : rcBar.Size().cx - 1
  2167. );
  2168. if( bHorz
  2169. ? ( rect.left > rcBar.left )
  2170. : ( rect.top  > rcBar.top  )
  2171. )
  2172. {
  2173. //nPosInsAfter = nPos; // orig
  2174. if( bFixedBar )
  2175. {
  2176. if( !pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  2177. nPosInsAfter = nPos;
  2178. else if(
  2179. ((CExtControlBar *)pBar)->IsFixedMode()
  2180. )
  2181. nPosInsAfter = nPos;
  2182. }
  2183. else
  2184. nPosInsAfter = nPos;
  2185. }
  2186. if( bFixedBar
  2187. && rcBar.PtInRect( ptMid )
  2188. )
  2189. {
  2190. INT nDistUp = 0, nDistDown = 0;
  2191. if( bHorz )
  2192. {
  2193. nDistUp = ptMid.y - rcBar.top;
  2194. nDistDown = rcBar.bottom - ptMid.y;
  2195. } // if( bHorz )
  2196. else
  2197. {
  2198. nDistUp = ptMid.x - rcBar.left;
  2199. nDistDown = rcBar.right - ptMid.x;
  2200. } // else from if( bHorz )
  2201. bool bNextRow = ( nDistUp < nDistDown ) ? false : true;
  2202. CControlBar * pFirstBar =
  2203. CExtControlBar::_GetFirstControlBarInRow(
  2204. pBar,
  2205. bNextRow
  2206. );
  2207. ASSERT_VALID( pFirstBar );
  2208. nPosInsAfter = FindBar( pFirstBar );
  2209. ASSERT( nPosInsAfter > 0 && nPosInsAfter < nCountOfSideBars );
  2210. if( bNextRow )
  2211. {
  2212. m_arrBars.InsertAt( nPosInsAfter+1, pBarIns );
  2213. m_arrBars.InsertAt( nPosInsAfter+1, (CObject*)NULL );
  2214. ASSERT_VALID( this );
  2215. ASSERT_BAR_LOCATION_IN_ROW( this, pBarIns );
  2216. return nPosInsAfter+2;
  2217. }
  2218. else
  2219. {
  2220. m_arrBars.InsertAt( nPosInsAfter, (CObject*)NULL );
  2221. m_arrBars.InsertAt( nPosInsAfter, pBarIns );
  2222. ASSERT_VALID( this );
  2223. ASSERT_BAR_LOCATION_IN_ROW( this, pBarIns );
  2224. return nPosInsAfter+1;
  2225. }
  2226. // if( !bNextRow )
  2227. /// nPosInsAfter --;
  2228. // break;
  2229. }
  2230. } // if( pBar != NULL && pBar->IsVisible() )
  2231. else
  2232. {
  2233. if( pBar != NULL )
  2234. continue;
  2235. // end of row because pBar == NULL
  2236. nTotalWidth += nWidth - afxData.cyBorder2;
  2237. nWidth = 0;
  2238. if( (bHorz ? ptMid.y : ptMid.x) < nTotalWidth )
  2239. {
  2240. if( nPos == 0 ) // first section
  2241. {
  2242. m_arrBars.InsertAt( 1, (CObject*)NULL );
  2243. m_arrBars.InsertAt( 1, pBarIns );
  2244. ASSERT_VALID( this );
  2245. ASSERT_BAR_LOCATION_IN_ROW( this, pBarIns );
  2246. return 1;
  2247. } // if( nPos == 0 )
  2248. else
  2249. {
  2250. if( !bFixedBar )
  2251. {
  2252. m_arrBars.InsertAt( nPos, pBarIns );
  2253. ASSERT_VALID( this );
  2254. ASSERT_BAR_LOCATION_IN_ROW( this, pBarIns );
  2255. }
  2256. //if( nPosInsAfter < 0 || !bFixedBar )
  2257. if( nPosInsAfter < 0 )
  2258. break;
  2259. ASSERT( nPosInsAfter >= 0 && nPosInsAfter <= nCountOfSideBars );
  2260. CControlBar * pBar2 = (CControlBar *)m_arrBars[ nPosInsAfter ];
  2261. if( pBar2 == NULL )
  2262. break;
  2263. if(  __PLACEHODLER_BAR_PTR(pBar2) )
  2264. break;
  2265. CRect rcBar2;
  2266. pBar2->GetWindowRect( &rcBar2 );
  2267. INT nDistUp = 0, nDistDown = 0;
  2268. if( bHorz )
  2269. {
  2270. nDistUp = ptMid.y - rcBar2.top;
  2271. nDistDown = rcBar2.bottom - ptMid.y;
  2272. } // if( bHorz )
  2273. else
  2274. {
  2275. nDistUp = ptMid.x - rcBar2.left;
  2276. nDistDown = rcBar2.right - ptMid.x;
  2277. } // else from if( bHorz )
  2278. bool bNextRow = ( nDistUp < nDistDown ) ? false : true;
  2279. CControlBar * pFirstBar =
  2280. CExtControlBar::_GetFirstControlBarInRow(
  2281. pBar2,
  2282. bNextRow
  2283. );
  2284. ASSERT_VALID( pFirstBar );
  2285. nPosInsAfter = FindBar( pFirstBar );
  2286. ASSERT( nPosInsAfter > 0 && nPosInsAfter < nCountOfSideBars );
  2287. if( bNextRow )
  2288. {
  2289. m_arrBars.InsertAt( nPosInsAfter+1, pBarIns );
  2290. m_arrBars.InsertAt( nPosInsAfter+1, (CObject*)NULL );
  2291. ASSERT_VALID( this );
  2292. ASSERT_BAR_LOCATION_IN_ROW( this, pBarIns );
  2293. return nPosInsAfter+2;
  2294. }
  2295. else
  2296. {
  2297. m_arrBars.InsertAt( nPosInsAfter, (CObject*)NULL );
  2298. m_arrBars.InsertAt( nPosInsAfter, pBarIns );
  2299. ASSERT_VALID( this );
  2300. ASSERT_BAR_LOCATION_IN_ROW( this, pBarIns );
  2301. return nPosInsAfter+1;
  2302. }
  2303. } // else from if( nPos == 0 )
  2304. }
  2305. // nPosInsAfter = nPos;
  2306. } // else from if( pBar != NULL && pBar->IsVisible() )
  2307. } // for( ; nPos < nCountOfSideBars; nPos++ )
  2308. } // if( rcDockBarWnd.PtInRect(ptMid) )
  2309. if( nPosInsAfter < 0 )
  2310. {
  2311. INT nDistUp = 0, nDistDown = 0;
  2312. if( bHorz )
  2313. {
  2314. nDistUp = ptMid.y - rcDockBarWnd.top;
  2315. nDistDown = rcDockBarWnd.bottom - ptMid.y;
  2316. } // if( bHorz )
  2317. else
  2318. {
  2319. nDistUp = ptMid.x - rcDockBarWnd.left;
  2320. nDistDown = rcDockBarWnd.right - ptMid.x;
  2321. } // else from if( bHorz )
  2322. bool bNextRow =
  2323. ( abs(nDistUp) < abs(nDistDown) )
  2324. ? false : true;
  2325. nPosInsAfter = bNextRow ? (nCountOfSideBars-1) : 1;
  2326. }
  2327. ASSERT( nPosInsAfter < nCountOfSideBars );
  2328. if( nPosInsAfter == nCountOfSideBars-1 )
  2329. m_arrBars.InsertAt( nCountOfSideBars, (CObject*)NULL ); // upper bound NULL
  2330. if( m_arrBars[ nPosInsAfter ] != NULL )
  2331. {
  2332. if( nPosInsAfter+1 < nCountOfSideBars
  2333. && m_arrBars[nPosInsAfter+1] != NULL
  2334. )
  2335. m_arrBars.InsertAt( nPosInsAfter+1, (CObject*)NULL );
  2336. }
  2337. m_arrBars.InsertAt( nPosInsAfter+1, pBarIns );
  2338. for( nPos = nPosInsAfter; nPos > 0; nPos-- )
  2339. {
  2340. CControlBar * pBar = (CControlBar *)m_arrBars[nPos];
  2341. if( pBar == NULL )
  2342. break;
  2343. if( __PLACEHODLER_BAR_PTR(pBar) )
  2344. {
  2345. pBar = _GetDockingFrameImpl()->GetControlBar( LOWORD( DWORD( (__EXT_MFC_DWORD_PTR) pBar ) ) );
  2346. if( pBar == NULL )
  2347. continue;
  2348. }
  2349. BOOL bPrevFixedCheck = TRUE;
  2350. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  2351. && !((CExtControlBar *)pBar)->IsFixedMode()
  2352. )
  2353. bPrevFixedCheck = FALSE;
  2354. if( bFixedBar != bPrevFixedCheck )
  2355. {
  2356. m_arrBars.InsertAt( nPosInsAfter+1, (CObject*)NULL );
  2357. nPosInsAfter++;
  2358. }
  2359. break;
  2360. } // for( INT nPos = nPosInsAfter; nPos > 0; nPos-- )
  2361. // ASSERT( FindBar(pBarIns) == (nPosInsAfter+1) );
  2362. ASSERT_VALID( this );
  2363. ASSERT_BAR_LOCATION_IN_ROW( this, pBarIns );
  2364. return nPosInsAfter+1;
  2365. }
  2366. #ifdef _DEBUG
  2367. void CExtDockBar::_AssertValid_CheckBarRows() const
  2368. {
  2369. ASSERT( this != NULL );
  2370. if( m_hWnd == NULL )
  2371. return;
  2372. if( ! ::IsWindow(m_hWnd) )
  2373. return;
  2374. CRect rcMyWnd;
  2375. GetWindowRect( &rcMyWnd );
  2376. CSize sizeMyWnd = rcMyWnd.Size();
  2377. if( sizeMyWnd.cx < 40 || sizeMyWnd.cy < 40 )
  2378. return;
  2379. INT nCountOfSideBars = (INT)m_arrBars.GetSize();
  2380. ASSERT( nCountOfSideBars >= 0 );
  2381. if( nCountOfSideBars > 0 )
  2382. {
  2383. // first should be NULL
  2384. CControlBar * pFirstPosBar = (CControlBar *) m_arrBars[ 0 ];
  2385. ASSERT( pFirstPosBar == NULL );
  2386. if( m_nCircleNo == 0 )
  2387. return;
  2388. // walk all rows and verify no empty rows
  2389. INT nRowEntryCount = 0; // including placeholders
  2390. INT nBar = 1;
  2391. if( nCountOfSideBars > 2  )
  2392. {
  2393. for( ; nBar < nCountOfSideBars; nBar++ )
  2394. {
  2395. CControlBar * pBar = (CControlBar *) m_arrBars[ nBar ];
  2396. if( pBar == NULL )
  2397. {
  2398. ASSERT( nRowEntryCount > 0 );
  2399. nRowEntryCount = 0;
  2400. continue;
  2401. }
  2402. nRowEntryCount++;
  2403. } // for( ; nBar < nCountOfSideBars; nBar++ )
  2404. }
  2405. }
  2406. }
  2407. void CExtDockBar::_AssertValid_FixedBarNotInNonfixedRow(
  2408. CDockBar * pDockBar,
  2409. CControlBar * pBar
  2410. )
  2411. {
  2412. // verify bar and its dockbar
  2413. ASSERT_VALID( pBar );
  2414. ASSERT_KINDOF( CControlBar, pBar->m_pDockBar );
  2415. ASSERT( !pBar->IsDockBar() );
  2416. ASSERT( !pBar->IsKindOf(RUNTIME_CLASS(CDockBar)) );
  2417. // ASSERT( !pBar->IsFloating() );
  2418. // ASSERT( pBar->m_pDockBar != NULL );
  2419. // ASSERT_VALID( pBar->m_pDockBar );
  2420. // ASSERT_KINDOF( CExtDockBar, pBar->m_pDockBar );
  2421. //CExtDockBar * pDockBar = (CExtDockBar *)pBar->m_pDockBar;
  2422. ASSERT_VALID( pDockBar );
  2423. ASSERT_KINDOF( CDockBar, pDockBar );
  2424. bool bCheckingFixedBar = true;
  2425. // verify bar is not a kind of resizable bar
  2426. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  2427. {
  2428. CExtControlBar * pExtBar = (CExtControlBar *)pBar;
  2429. if( !pExtBar->IsFixedDockStyle() )
  2430. bCheckingFixedBar = false;
  2431. }
  2432. INT nCountOfSideBars = (INT)pDockBar->m_arrBars.GetSize();
  2433. ASSERT( nCountOfSideBars > 0 );
  2434. INT nBarPosInDockBar = pDockBar->FindBar( pBar );
  2435. ASSERT( nBarPosInDockBar > 0 && nBarPosInDockBar < nCountOfSideBars );
  2436. // walk to begin of row
  2437. INT nBar = nBarPosInDockBar-1;
  2438. for( ; nBar > 0; nBar-- )
  2439. {
  2440. CControlBar * pBarExamine = (CControlBar *)
  2441. pDockBar->m_arrBars[ nBar ];
  2442. if( pBarExamine == NULL )
  2443. break; // ok
  2444. if( __PLACEHODLER_BAR_PTR(pBarExamine) )
  2445. continue;
  2446. ASSERT_VALID( pBarExamine );
  2447. ASSERT_KINDOF( CControlBar, pBarExamine );
  2448. ASSERT( pBarExamine->m_pDockBar == pDockBar );
  2449. bool bFixedBar = true;
  2450. if( pBarExamine->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  2451. {
  2452. CExtControlBar * pExtBar = (CExtControlBar *)pBarExamine;
  2453. //ASSERT( pExtBar->IsFixedMode() );
  2454. if( !pExtBar->IsFixedDockStyle() )
  2455. bFixedBar = false;
  2456. }
  2457. ASSERT( bCheckingFixedBar == bFixedBar );
  2458. }
  2459. // walk to end of row
  2460. for( nBar = nBarPosInDockBar+1; nBar < nCountOfSideBars; nBar++ )
  2461. {
  2462. CControlBar * pBarExamine = (CControlBar *)
  2463. pDockBar->m_arrBars[ nBar ];
  2464. if( pBarExamine == NULL )
  2465. break; // ok
  2466. if( __PLACEHODLER_BAR_PTR(pBarExamine) )
  2467. continue;
  2468. ASSERT_VALID( pBarExamine );
  2469. ASSERT_KINDOF( CControlBar, pBarExamine );
  2470. ASSERT( pBarExamine->m_pDockBar == pDockBar );
  2471. bool bFixedBar = true;
  2472. if( pBarExamine->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  2473. {
  2474. CExtControlBar * pExtBar = (CExtControlBar *)pBarExamine;
  2475. //ASSERT( pExtBar->IsFixedMode() );
  2476. if( !pExtBar->IsFixedDockStyle() )
  2477. bFixedBar = false;
  2478. }
  2479. ASSERT( bCheckingFixedBar == bFixedBar );
  2480. }
  2481. }
  2482. #endif // _DEBUG
  2483. void CExtDockBar::OnNcCalcSize(
  2484. BOOL bCalcValidRects,
  2485. NCCALCSIZE_PARAMS * lpncsp
  2486. )
  2487. {
  2488. ASSERT_VALID( this );
  2489. bCalcValidRects;
  2490. lpncsp;
  2491. #if (defined __DEBUG_PAINTING_AREAS_DOCKBAR__ )
  2492. CRect & rcClientLoc =
  2493. reinterpret_cast < CRect & > ( lpncsp->rgrc[0] );
  2494. rcClientLoc.DeflateRect( 0, 0, 1, 1 );
  2495. #endif // __DEBUG_PAINTING_AREAS_DOCKBAR__
  2496. }
  2497. void CExtDockBar::OnNcPaint()
  2498. {
  2499. ASSERT_VALID( this );
  2500. #if (defined __DEBUG_PAINTING_AREAS_DOCKBAR__ )
  2501. CRect rcBarWnd, rcBarClient;
  2502. GetWindowRect( &rcBarWnd );
  2503. GetClientRect( &rcBarClient );
  2504. ClientToScreen( &rcBarClient );
  2505. if( rcBarWnd == rcBarClient )
  2506. return;
  2507. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  2508. rcBarWnd.OffsetRect( ptDevOffset );
  2509. rcBarClient.OffsetRect( ptDevOffset );
  2510. CWindowDC dcBarWnd( this );
  2511. ASSERT( dcBarWnd.GetSafeHdc() != NULL );
  2512. dcBarWnd.ExcludeClipRect( &rcBarClient );
  2513. BOOL bDynamicDockBar = IsKindOf( RUNTIME_CLASS(CExtDockDynBar) );
  2514. COLORREF clrDebugMargin = bDynamicDockBar
  2515. ? RGB( 255, 255, 0 )
  2516. : RGB( 255, 0, 255 );
  2517. dcBarWnd.FillSolidRect( &rcBarWnd, clrDebugMargin );
  2518. #endif // __DEBUG_PAINTING_AREAS_DOCKBAR__
  2519. }
  2520. CExtDockBar * CExtDockBar::_GetInCircle(
  2521. UINT nDockBarID,
  2522. bool bEnableCreateNew // = true
  2523. )
  2524. {
  2525. ASSERT_VALID( this );
  2526. UINT nOwnID = GetDlgCtrlID();
  2527. if( nDockBarID == nOwnID )
  2528. return this;
  2529. CFrameWnd * pFrame = GetParentFrame();
  2530. ASSERT_VALID( pFrame );
  2531. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  2532. return
  2533. _GetInCircle(
  2534. pFrame,
  2535. m_nCircleNo,
  2536. nDockBarID,
  2537. bEnableCreateNew
  2538. );
  2539. }
  2540. CExtDockBar * CExtDockBar::_GetInCircle(
  2541. CFrameWnd * pFrame,
  2542. UINT nCircleNo,
  2543. UINT nDockBarID,
  2544. bool bEnableCreateNew // = true
  2545. )
  2546. {
  2547. ASSERT_VALID( pFrame );
  2548. POSITION pos = pFrame->m_listControlBars.GetHeadPosition();
  2549. ASSERT( pos != NULL );
  2550. while( pos != NULL )
  2551. {
  2552. CControlBar * pBar = (CControlBar *)
  2553. pFrame->m_listControlBars.GetNext( pos );
  2554. ASSERT_VALID( pBar );
  2555. ASSERT_KINDOF( CControlBar, pBar );
  2556. if( !pBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  2557. continue;
  2558. UINT nID = pBar->GetDlgCtrlID();
  2559. if( nID != nDockBarID )
  2560. continue;
  2561. UINT nCircleNo2 = ((CExtDockBar *)pBar)->_GetCircleNo();
  2562. if( nCircleNo == nCircleNo2 )
  2563. return ((CExtDockBar *)pBar);
  2564. } // while( pos != NULL )
  2565. if( !bEnableCreateNew )
  2566. return NULL;
  2567. _CreateInnerCircle( pFrame );
  2568. CExtDockBar * pDockBar =
  2569. _GetInCircle(
  2570. pFrame,
  2571. nCircleNo,
  2572. nDockBarID,
  2573. bEnableCreateNew
  2574. );
  2575. ASSERT_VALID( pDockBar );
  2576. return pDockBar;
  2577. }
  2578. UINT CExtDockBar::_CreateInnerCircle()
  2579. {
  2580. ASSERT_VALID( this );
  2581. if( _GetDockBarInner() != NULL )
  2582. {
  2583. ASSERT_VALID( _GetDockBarInner() );
  2584. return ( _GetCircleNo() + 1 );
  2585. }
  2586. CFrameWnd * pFrame = GetParentFrame();
  2587. ASSERT_VALID( pFrame );
  2588. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  2589. return _CreateInnerCircle( pFrame );
  2590. }
  2591. UINT CExtDockBar::_CreateInnerCircle( CFrameWnd * pFrame )
  2592. {
  2593. ASSERT_VALID( pFrame );
  2594. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  2595. UINT nCircleNo = 0;
  2596. CExtDockBar * vInnerCircle[4] = { NULL, NULL, NULL, NULL };
  2597. CExtDockBar * vCreatingCircle[4] = { NULL, NULL, NULL, NULL };
  2598. POSITION pos = pFrame->m_listControlBars.GetHeadPosition();
  2599. ASSERT( pos != NULL );
  2600. while( pos != NULL )
  2601. {
  2602. CControlBar * pBar = (CControlBar *)
  2603. pFrame->m_listControlBars.GetNext( pos );
  2604. ASSERT_VALID( pBar );
  2605. ASSERT_KINDOF( CControlBar, pBar );
  2606. if( !pBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  2607. continue;
  2608. if( pBar->IsKindOf(RUNTIME_CLASS(CExtDockDynBar)) )
  2609. continue;
  2610. UINT nCircleNo2 = ((CExtDockBar *)pBar)->_GetCircleNo();
  2611. if( nCircleNo2 < nCircleNo )
  2612. continue;
  2613. nCircleNo = nCircleNo2;
  2614. UINT nID = pBar->GetDlgCtrlID();
  2615. //if( nID == AFX_IDW_DOCKBAR_FLOAT )
  2616. // continue;
  2617. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nID );
  2618. switch( nID )
  2619. {
  2620. case AFX_IDW_DOCKBAR_TOP:
  2621. vInnerCircle[0] = ((CExtDockBar *)pBar);
  2622. break;
  2623. case AFX_IDW_DOCKBAR_BOTTOM:
  2624. vInnerCircle[1] = ((CExtDockBar *)pBar);
  2625. break;
  2626. case AFX_IDW_DOCKBAR_LEFT:
  2627. vInnerCircle[2] = ((CExtDockBar *)pBar);
  2628. break;
  2629. case AFX_IDW_DOCKBAR_RIGHT:
  2630. vInnerCircle[3] = ((CExtDockBar *)pBar);
  2631. break;
  2632. #ifdef _DEBUG
  2633. default:
  2634. ASSERT( FALSE );
  2635. break;
  2636. #endif // _DEBUG
  2637. } // switch( nID )
  2638. } // while( pos != NULL )
  2639. ASSERT( vInnerCircle[0] != NULL );
  2640. ASSERT( vInnerCircle[1] != NULL );
  2641. ASSERT( vInnerCircle[2] != NULL );
  2642. ASSERT( vInnerCircle[3] != NULL );
  2643. #ifdef _DEBUG
  2644. if( vInnerCircle[0]->m_pDockBarInner == NULL )
  2645. {
  2646. ASSERT( vInnerCircle[1]->m_pDockBarInner == NULL );
  2647. ASSERT( vInnerCircle[2]->m_pDockBarInner == NULL );
  2648. ASSERT( vInnerCircle[3]->m_pDockBarInner == NULL );
  2649. }
  2650. else
  2651. {
  2652. ASSERT( vInnerCircle[1]->m_pDockBarInner != NULL );
  2653. ASSERT( vInnerCircle[2]->m_pDockBarInner != NULL );
  2654. ASSERT( vInnerCircle[3]->m_pDockBarInner != NULL );
  2655. }
  2656. if( vInnerCircle[0]->m_pDockBarOuter == NULL )
  2657. {
  2658. ASSERT( vInnerCircle[1]->m_pDockBarOuter == NULL );
  2659. ASSERT( vInnerCircle[2]->m_pDockBarOuter == NULL );
  2660. ASSERT( vInnerCircle[3]->m_pDockBarOuter == NULL );
  2661. }
  2662. else
  2663. {
  2664. ASSERT( vInnerCircle[1]->m_pDockBarOuter != NULL );
  2665. ASSERT( vInnerCircle[2]->m_pDockBarOuter != NULL );
  2666. ASSERT( vInnerCircle[3]->m_pDockBarOuter != NULL );
  2667. }
  2668. #endif // _DEBUG
  2669. nCircleNo ++;
  2670. for( INT i = 0; i<4; i++ )
  2671. {
  2672. CExtDockBar * pBar = vInnerCircle[i];
  2673. UINT nID = pBar->GetDlgCtrlID();
  2674. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nID );
  2675. ASSERT( vCreatingCircle[i] == NULL );
  2676. vCreatingCircle[i] =
  2677. new CExtDockBar( nCircleNo );
  2678. static const DWORD dwAlignFlags[4] =
  2679. {
  2680. CBRS_ALIGN_TOP,
  2681. CBRS_ALIGN_BOTTOM,
  2682. CBRS_ALIGN_LEFT,
  2683. CBRS_ALIGN_RIGHT
  2684. };
  2685. DWORD dwStyle =
  2686. WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN
  2687. |dwAlignFlags[i] // |CBRS_ALIGN_ANY
  2688. ;
  2689. VERIFY(
  2690. vCreatingCircle[i]->Create( pFrame, dwStyle, nID )
  2691. );
  2692. ASSERT( pBar->m_pDockBarInner == NULL );
  2693. ASSERT( vCreatingCircle[i]->m_pDockBarInner == NULL );
  2694. ASSERT( vCreatingCircle[i]->m_pDockBarOuter == NULL );
  2695. pBar->m_pDockBarInner = vCreatingCircle[i];
  2696. vCreatingCircle[i]->m_pDockBarOuter = pBar;
  2697. vCreatingCircle[i]->SetBarStyle( pBar->GetBarStyle() );
  2698. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2699. vCreatingCircle[i]->m_pWndAutoHideArea =
  2700. pBar->m_pWndAutoHideArea;
  2701. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2702. if( (pBar->GetStyle() & WS_VISIBLE) != NULL
  2703. && pBar->GetDockedVisibleCount() != 0
  2704. )
  2705. {
  2706. pBar->GetWindowRect( &vCreatingCircle[i]->m_rcLastInvisiblePreCalc );
  2707. switch( nID )
  2708. {
  2709. case AFX_IDW_DOCKBAR_TOP:
  2710. ASSERT( vCreatingCircle[i]->m_rcLastInvisiblePreCalc.left <= vCreatingCircle[i]->m_rcLastInvisiblePreCalc.right );
  2711. vCreatingCircle[i]->m_rcLastInvisiblePreCalc.bottom = vCreatingCircle[i]->m_rcLastInvisiblePreCalc.top; // + 1;
  2712. break;
  2713. case AFX_IDW_DOCKBAR_BOTTOM:
  2714. ASSERT( vCreatingCircle[i]->m_rcLastInvisiblePreCalc.left <= vCreatingCircle[i]->m_rcLastInvisiblePreCalc.right );
  2715. vCreatingCircle[i]->m_rcLastInvisiblePreCalc.top = vCreatingCircle[i]->m_rcLastInvisiblePreCalc.bottom; //  - 1;
  2716. break;
  2717. case AFX_IDW_DOCKBAR_LEFT:
  2718. ASSERT( vCreatingCircle[i]->m_rcLastInvisiblePreCalc.top <= vCreatingCircle[i]->m_rcLastInvisiblePreCalc.bottom );
  2719. vCreatingCircle[i]->m_rcLastInvisiblePreCalc.right = vCreatingCircle[i]->m_rcLastInvisiblePreCalc.left; //  + 1;
  2720. break;
  2721. case AFX_IDW_DOCKBAR_RIGHT:
  2722. ASSERT( vCreatingCircle[i]->m_rcLastInvisiblePreCalc.top <= vCreatingCircle[i]->m_rcLastInvisiblePreCalc.bottom );
  2723. vCreatingCircle[i]->m_rcLastInvisiblePreCalc.left = vCreatingCircle[i]->m_rcLastInvisiblePreCalc.right; //  - 1;
  2724. break;
  2725. #ifdef _DEBUG
  2726. default:
  2727. ASSERT( FALSE );
  2728. break;
  2729. #endif // _DEBUG
  2730. } // switch( nID )
  2731. } // if( (pBar->GetStyle()&WS_VISIBLE) != NULL  .....
  2732. else
  2733. vCreatingCircle[i]->m_rcLastInvisiblePreCalc = pBar->m_rcLastInvisiblePreCalc;
  2734. // reposition created circle in parent HWND list
  2735. switch( nID )
  2736. {
  2737. case AFX_IDW_DOCKBAR_TOP:
  2738. ASSERT( i == 0 );
  2739. ASSERT( vCreatingCircle[i] != NULL );
  2740. ASSERT( vCreatingCircle[i]->GetSafeHwnd() != NULL );
  2741. ASSERT( ::IsWindow( vCreatingCircle[i]->GetSafeHwnd() ) );
  2742. ASSERT( vInnerCircle[3] != NULL );
  2743. ASSERT( vInnerCircle[3]->GetSafeHwnd() != NULL );
  2744. ASSERT( ::IsWindow( vInnerCircle[3]->GetSafeHwnd() ) );
  2745. VERIFY(
  2746. ::SetWindowPos(
  2747. vCreatingCircle[i]->GetSafeHwnd(),
  2748. vInnerCircle[3]->GetSafeHwnd(),
  2749. 0, 0, 0, 0,
  2750. SWP_NOSIZE|SWP_NOMOVE
  2751. |SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOCOPYBITS
  2752. ////|SWP_NOSENDCHANGING 
  2753. )
  2754. );
  2755. break;
  2756. case AFX_IDW_DOCKBAR_BOTTOM:
  2757. case AFX_IDW_DOCKBAR_LEFT:
  2758. case AFX_IDW_DOCKBAR_RIGHT:
  2759. ASSERT( i >= 1 && i <= 3 );
  2760. ASSERT( vCreatingCircle[i] != NULL );
  2761. ASSERT( vCreatingCircle[i]->GetSafeHwnd() != NULL );
  2762. ASSERT( ::IsWindow( vCreatingCircle[i]->GetSafeHwnd() ) );
  2763. ASSERT( vCreatingCircle[i-1] != NULL );
  2764. ASSERT( vCreatingCircle[i-1]->GetSafeHwnd() != NULL );
  2765. ASSERT( ::IsWindow( vCreatingCircle[i-1]->GetSafeHwnd() ) );
  2766. VERIFY(
  2767. ::SetWindowPos(
  2768. vCreatingCircle[i]->GetSafeHwnd(),
  2769. vCreatingCircle[i-1]->GetSafeHwnd(),
  2770. 0, 0, 0, 0,
  2771. SWP_NOSIZE|SWP_NOMOVE
  2772. |SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOCOPYBITS
  2773. ////|SWP_NOSENDCHANGING 
  2774. )
  2775. );
  2776. break;
  2777. #ifdef _DEBUG
  2778. default:
  2779. ASSERT( FALSE );
  2780. break;
  2781. #endif // _DEBUG
  2782. } // switch( nID )
  2783. }
  2784. ASSERT( vInnerCircle[0]->m_pDockBarInner != NULL );
  2785. ASSERT( vInnerCircle[1]->m_pDockBarInner != NULL );
  2786. ASSERT( vInnerCircle[2]->m_pDockBarInner != NULL );
  2787. ASSERT( vInnerCircle[3]->m_pDockBarInner != NULL );
  2788. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2789. if( vInnerCircle[0]->m_pWndAutoHideArea != NULL )
  2790. {
  2791. vInnerCircle[0]->m_pWndAutoHideArea->AdjustOrder();
  2792. vInnerCircle[1]->m_pWndAutoHideArea->AdjustOrder();
  2793. vInnerCircle[2]->m_pWndAutoHideArea->AdjustOrder();
  2794. vInnerCircle[3]->m_pWndAutoHideArea->AdjustOrder();
  2795. }
  2796. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2797. ASSERT( nCircleNo > 0 );
  2798. return nCircleNo;
  2799. }
  2800. void CExtDockBar::_InjectInnerCircle()
  2801. {
  2802. ASSERT_VALID( this );
  2803. _InjectCircle( m_nCircleNo + 1 );
  2804. }
  2805. void CExtDockBar::_InjectCircle( UINT nCircleNo )
  2806. {
  2807. ASSERT_VALID( this );
  2808. ASSERT( nCircleNo > 0 );
  2809. CFrameWnd * pFrame = GetParentFrame();
  2810. ASSERT_VALID( pFrame );
  2811. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  2812. _InjectCircle( pFrame, nCircleNo );
  2813. }
  2814. void CExtDockBar::_InjectCircle( CFrameWnd * pFrame, UINT nCircleNo )
  2815. {
  2816. ASSERT_VALID( pFrame );
  2817. ASSERT( nCircleNo > 0 );
  2818. CExtDockBar * vCircleOld[4];
  2819. vCircleOld[0] = (CExtDockBar *)pFrame->GetControlBar( AFX_IDW_DOCKBAR_TOP );
  2820. vCircleOld[1] = (CExtDockBar *)pFrame->GetControlBar( AFX_IDW_DOCKBAR_BOTTOM );
  2821. vCircleOld[2] = (CExtDockBar *)pFrame->GetControlBar( AFX_IDW_DOCKBAR_LEFT );
  2822. vCircleOld[3] = (CExtDockBar *)pFrame->GetControlBar( AFX_IDW_DOCKBAR_RIGHT );
  2823. bool bEmptyCircleExist = true;
  2824. INT nDockSide = 0; 
  2825. for( nDockSide = 0; nDockSide < 4; nDockSide++ )
  2826. {
  2827. ASSERT_VALID( vCircleOld[nDockSide] );
  2828. ASSERT_KINDOF( CExtDockBar, vCircleOld[nDockSide] );
  2829. ASSERT( vCircleOld[nDockSide]->_GetCircleNo() == 0 );
  2830. vCircleOld[nDockSide] = vCircleOld[nDockSide]->_GetBarByCircleNo( nCircleNo );
  2831. ASSERT_VALID( vCircleOld[nDockSide] );
  2832. ASSERT( vCircleOld[nDockSide]->_GetCircleNo() == nCircleNo );
  2833. if( ! vCircleOld[nDockSide]->_CanBeSafeOptimized() )
  2834. bEmptyCircleExist = false;
  2835. } // for( nDockSide = 0; nDockSide < 4; nDockSide++ )
  2836. if( bEmptyCircleExist )
  2837. {
  2838. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2839. if( vCircleOld[0]->m_pWndAutoHideArea != NULL )
  2840. {
  2841. vCircleOld[0]->m_pWndAutoHideArea->AdjustOrder();
  2842. vCircleOld[1]->m_pWndAutoHideArea->AdjustOrder();
  2843. vCircleOld[2]->m_pWndAutoHideArea->AdjustOrder();
  2844. vCircleOld[3]->m_pWndAutoHideArea->AdjustOrder();
  2845. }
  2846. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2847. return;
  2848. }
  2849. CExtDockBar * vCircleNew[4] = { NULL, NULL, NULL, NULL };
  2850. for( nDockSide = 0; nDockSide < 4; nDockSide++ )
  2851. {
  2852. ASSERT_VALID( vCircleOld[nDockSide] );
  2853. ASSERT( vCircleOld[nDockSide]->_GetCircleNo() == nCircleNo );
  2854. UINT nID = vCircleOld[nDockSide]->GetDlgCtrlID();
  2855. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nID );
  2856. vCircleNew[nDockSide] =
  2857. new CExtDockBar( nCircleNo );
  2858. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2859. vCircleNew[nDockSide]->m_pWndAutoHideArea =
  2860. vCircleOld[nDockSide]->m_pWndAutoHideArea;
  2861. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2862. static const DWORD dwAlignFlags[4] =
  2863. {
  2864. CBRS_ALIGN_TOP,
  2865. CBRS_ALIGN_BOTTOM,
  2866. CBRS_ALIGN_LEFT,
  2867. CBRS_ALIGN_RIGHT
  2868. };
  2869. DWORD dwStyle =
  2870. WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN
  2871. |dwAlignFlags[nDockSide] // |CBRS_ALIGN_ANY
  2872. ;
  2873. VERIFY(
  2874. vCircleNew[nDockSide]->Create( pFrame, dwStyle, nID )
  2875. );
  2876. ASSERT( vCircleNew[nDockSide]->m_pDockBarInner == NULL );
  2877. ASSERT( vCircleNew[nDockSide]->m_pDockBarOuter == NULL );
  2878. ASSERT( vCircleOld[nDockSide]->m_pDockBarOuter != NULL );
  2879. ASSERT( vCircleOld[nDockSide]->m_pDockBarOuter->m_pDockBarInner == vCircleOld[nDockSide] );
  2880. vCircleOld[nDockSide]->m_pDockBarOuter->m_pDockBarInner = vCircleNew[nDockSide];
  2881. vCircleNew[nDockSide]->m_pDockBarOuter = vCircleOld[nDockSide]->m_pDockBarOuter;
  2882. vCircleOld[nDockSide]->m_pDockBarOuter = vCircleNew[nDockSide];
  2883. vCircleNew[nDockSide]->m_pDockBarInner = vCircleOld[nDockSide];
  2884. vCircleNew[nDockSide]->SetBarStyle(
  2885. vCircleOld[nDockSide]->GetBarStyle()
  2886. );
  2887. if( (vCircleOld[nDockSide]->GetStyle() & WS_VISIBLE) != NULL
  2888. && vCircleOld[nDockSide]->GetDockedVisibleCount() != 0
  2889. )
  2890. {
  2891. vCircleOld[nDockSide]->GetWindowRect(
  2892. &(vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc)
  2893. );
  2894. switch( nID )
  2895. {
  2896. case AFX_IDW_DOCKBAR_TOP:
  2897. ASSERT( vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.left <= vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.right );
  2898. vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.bottom = vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.top; // + 1;
  2899. break;
  2900. case AFX_IDW_DOCKBAR_BOTTOM:
  2901. ASSERT( vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.left <= vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.right );
  2902. vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.top = vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.bottom; //  - 1;
  2903. break;
  2904. case AFX_IDW_DOCKBAR_LEFT:
  2905. ASSERT( vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.top <= vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.bottom );
  2906. vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.right = vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.left; //  + 1;
  2907. break;
  2908. case AFX_IDW_DOCKBAR_RIGHT:
  2909. ASSERT( vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.top <= vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.bottom );
  2910. vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.left = vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc.right; //  - 1;
  2911. break;
  2912. #ifdef _DEBUG
  2913. default:
  2914. ASSERT( FALSE );
  2915. break;
  2916. #endif // _DEBUG
  2917. } // switch( nID )
  2918. } // if( (vCircleOld[nDockSide]->GetStyle()&WS_VISIBLE) != NULL  .....
  2919. else
  2920. vCircleNew[nDockSide]->m_rcLastInvisiblePreCalc =
  2921. vCircleOld[nDockSide]->m_rcLastInvisiblePreCalc;
  2922. for( CExtDockBar * pResetNoBar = vCircleOld[nDockSide];
  2923. pResetNoBar != NULL;
  2924. pResetNoBar = pResetNoBar->m_pDockBarInner
  2925. )
  2926. pResetNoBar->m_nCircleNo++;
  2927. switch( nID )
  2928. {
  2929. case AFX_IDW_DOCKBAR_TOP:
  2930. ASSERT( nDockSide == 0 );
  2931. ASSERT( vCircleOld[3]->m_pDockBarOuter != NULL );
  2932. ASSERT( vCircleOld[3]->m_pDockBarOuter->GetSafeHwnd() != NULL );
  2933. ASSERT( ::IsWindow( vCircleOld[3]->m_pDockBarOuter->GetSafeHwnd() ) );
  2934. ASSERT( vCircleNew[nDockSide] != NULL );
  2935. ASSERT( vCircleNew[nDockSide]->GetSafeHwnd() != NULL );
  2936. ASSERT( ::IsWindow( vCircleNew[nDockSide]->GetSafeHwnd() ) );
  2937. VERIFY(
  2938. ::SetWindowPos(
  2939. vCircleNew[nDockSide]->GetSafeHwnd(),
  2940. vCircleOld[3]->m_pDockBarOuter->GetSafeHwnd(),
  2941. 0, 0, 0, 0,
  2942. SWP_NOSIZE|SWP_NOMOVE
  2943. |SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOCOPYBITS
  2944. ////|SWP_NOSENDCHANGING 
  2945. )
  2946. );
  2947. break;
  2948. case AFX_IDW_DOCKBAR_BOTTOM:
  2949. case AFX_IDW_DOCKBAR_LEFT:
  2950. case AFX_IDW_DOCKBAR_RIGHT:
  2951. ASSERT( nDockSide > 0 );
  2952. ASSERT( vCircleNew[nDockSide-1] != NULL );
  2953. ASSERT( vCircleNew[nDockSide-1]->GetSafeHwnd() != NULL );
  2954. ASSERT( ::IsWindow( vCircleNew[nDockSide-1]->GetSafeHwnd() ) );
  2955. ASSERT( vCircleNew[nDockSide] != NULL );
  2956. ASSERT( vCircleNew[nDockSide]->GetSafeHwnd() != NULL );
  2957. ASSERT( ::IsWindow( vCircleNew[nDockSide]->GetSafeHwnd() ) );
  2958. VERIFY(
  2959. ::SetWindowPos(
  2960. vCircleNew[nDockSide]->GetSafeHwnd(),
  2961. vCircleNew[nDockSide-1]->GetSafeHwnd(),
  2962. 0, 0, 0, 0,
  2963. SWP_NOSIZE|SWP_NOMOVE
  2964. |SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOCOPYBITS
  2965. ////|SWP_NOSENDCHANGING 
  2966. )
  2967. );
  2968. break;
  2969. #ifdef _DEBUG
  2970. default:
  2971. ASSERT( FALSE );
  2972. break;
  2973. #endif // _DEBUG
  2974. } // switch( nID )
  2975. // VERIFY(
  2976. // ::SetWindowPos(
  2977. // vCircleNew[nDockSide]->GetSafeHwnd(),
  2978. // vCircleOld[nDockSide]->m_pDockBarOuter->_GetHwndForInjectingAfter(),
  2979. // 0, 0, 0, 0,
  2980. // SWP_NOSIZE|SWP_NOMOVE
  2981. // |SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOCOPYBITS
  2982. // ////|SWP_NOSENDCHANGING 
  2983. // )
  2984. // );
  2985. } // for( nDockSide = 0; nDockSide < 4; nDockSide++ )
  2986. ASSERT_VALID( vCircleNew[0] );
  2987. ASSERT_VALID( vCircleNew[1] );
  2988. ASSERT_VALID( vCircleNew[2] );
  2989. ASSERT_VALID( vCircleNew[3] );
  2990. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2991. if( vCircleNew[0]->m_pWndAutoHideArea != NULL )
  2992. {
  2993. vCircleNew[0]->m_pWndAutoHideArea->AdjustOrder();
  2994. vCircleNew[1]->m_pWndAutoHideArea->AdjustOrder();
  2995. vCircleNew[2]->m_pWndAutoHideArea->AdjustOrder();
  2996. vCircleNew[3]->m_pWndAutoHideArea->AdjustOrder();
  2997. }
  2998. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2999. }
  3000. #ifdef _DEBUG
  3001. void CExtDockBar::_Assert_HwndIsDockbar(
  3002. HWND hWndDockBar,
  3003. UINT nDockBarID,
  3004. UINT nCircleNo
  3005. )
  3006. {
  3007. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  3008. ASSERT( hWndDockBar != NULL );
  3009. ASSERT( ::IsWindow( hWndDockBar ) );
  3010. CWnd * pWndDockBar = CWnd::FromHandlePermanent( hWndDockBar );
  3011. ASSERT_VALID( pWndDockBar );
  3012. CExtDockBar * pDockBar =
  3013. STATIC_DOWNCAST( CExtDockBar, pWndDockBar );
  3014. UINT nRealDockBarID = pDockBar->GetDlgCtrlID();
  3015. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nRealDockBarID );
  3016. ASSERT( nDockBarID == nRealDockBarID );
  3017. UINT nRealCircleNo = pDockBar->_GetCircleNo();
  3018. ASSERT( nRealCircleNo == nCircleNo );
  3019. }
  3020. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3021. void CExtDockBar::_Assert_HwndIsAutoHider(
  3022. HWND hWndAutoHider,
  3023. UINT nAutoHiderID
  3024. )
  3025. {
  3026. ASSERT( hWndAutoHider != NULL );
  3027. ASSERT( ::IsWindow( hWndAutoHider ) );
  3028. CWnd * pWndAutoHider = CWnd::FromHandlePermanent( hWndAutoHider );
  3029. ASSERT_VALID( pWndAutoHider );
  3030. CExtDynAutoHideArea * pAutoHider =
  3031. STATIC_DOWNCAST( CExtDynAutoHideArea, pWndAutoHider );
  3032. UINT nRealAutoHiderID = pAutoHider->GetDlgCtrlID();
  3033. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nRealAutoHiderID );
  3034. ASSERT( nAutoHiderID == nRealAutoHiderID );
  3035. }
  3036. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3037. #endif // _DEBUG
  3038. //HWND CExtDockBar::_GetHwndForInjectingAfter()
  3039. //{
  3040. // ASSERT_VALID( this );
  3041. //HWND hWndOwn = GetSafeHwnd();
  3042. // ASSERT( hWndOwn != NULL );
  3043. // ASSERT( ::IsWindow( hWndOwn ) );
  3044. //
  3045. //UINT nOwnID = GetDlgCtrlID();
  3046. // ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nOwnID );
  3047. //
  3048. //HWND hWndAutoHideArea = m_pWndAutoHideArea->GetSafeHwnd();
  3049. //UINT nOwnCircleNo =  _GetCircleNo();
  3050. //
  3051. //HWND hWndInsertAfter =
  3052. // (hWndAutoHideArea != NULL && nOwnCircleNo == 0)
  3053. // ? hWndAutoHideArea
  3054. // : hWndOwn
  3055. // ;
  3056. // switch( nOwnID )
  3057. // {
  3058. // case AFX_IDW_DOCKBAR_TOP:
  3059. // {
  3060. // // get dockbar in same circle (nOwnCircleNo) - bottom
  3061. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3062. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_BOTTOM, nOwnCircleNo );
  3063. // // get dockbar in same circle (nOwnCircleNo) - left
  3064. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3065. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_LEFT, nOwnCircleNo );
  3066. // // get dockbar in same circle (nOwnCircleNo) - right
  3067. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3068. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_RIGHT, nOwnCircleNo );
  3069. // if( nOwnCircleNo == 0 && hWndAutoHideArea != NULL )
  3070. // {
  3071. // // get autohider - top
  3072. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3073. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_TOP );
  3074. // // get autohider - bottom
  3075. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3076. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_BOTTOM );
  3077. // // get autohider - left
  3078. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3079. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_LEFT );
  3080. // // get autohider - right
  3081. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3082. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_RIGHT );
  3083. // }
  3084. // }
  3085. // break; // case AFX_IDW_DOCKBAR_TOP
  3086. // case AFX_IDW_DOCKBAR_BOTTOM:
  3087. // {
  3088. // // get dockbar in same circle (nOwnCircleNo) - left
  3089. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3090. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_LEFT, nOwnCircleNo );
  3091. // // get dockbar in same circle (nOwnCircleNo) - right
  3092. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3093. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_RIGHT, nOwnCircleNo );
  3094. // if( nOwnCircleNo == 0 && hWndAutoHideArea != NULL )
  3095. // {
  3096. // // get autohider - top
  3097. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3098. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_TOP );
  3099. // // get autohider - bottom
  3100. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3101. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_BOTTOM );
  3102. // // get autohider - left
  3103. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3104. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_LEFT );
  3105. // // get autohider - right
  3106. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3107. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_RIGHT );
  3108. // }
  3109. // // get dockbar in next circle (nOwnCircleNo+1) - top
  3110. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3111. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_TOP, (nOwnCircleNo+1) );
  3112. // }
  3113. // break; // case AFX_IDW_DOCKBAR_BOTTOM
  3114. // case AFX_IDW_DOCKBAR_LEFT:
  3115. // {
  3116. // // get dockbar in same circle (nOwnCircleNo) - right
  3117. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3118. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_RIGHT, nOwnCircleNo );
  3119. // if( nOwnCircleNo == 0 && hWndAutoHideArea != NULL )
  3120. // {
  3121. // // get autohider - top
  3122. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3123. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_TOP );
  3124. // // get autohider - bottom
  3125. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3126. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_BOTTOM );
  3127. // // get autohider - left
  3128. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3129. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_LEFT );
  3130. // // get autohider - right
  3131. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3132. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_RIGHT );
  3133. // }
  3134. // // get dockbar in next circle (nOwnCircleNo+1) - top
  3135. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3136. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_TOP, (nOwnCircleNo+1) );
  3137. // // get dockbar in next circle (nOwnCircleNo+1) - bottom
  3138. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3139. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_BOTTOM, (nOwnCircleNo+1) );
  3140. // }
  3141. // break; // case AFX_IDW_DOCKBAR_LEFT
  3142. // case AFX_IDW_DOCKBAR_RIGHT:
  3143. // {
  3144. // if( nOwnCircleNo == 0 && hWndAutoHideArea != NULL )
  3145. // {
  3146. // // get autohider - top
  3147. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3148. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_TOP );
  3149. // // get autohider - bottom
  3150. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3151. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_BOTTOM );
  3152. // // get autohider - left
  3153. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3154. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_LEFT );
  3155. // // get autohider - right
  3156. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3157. // ASSERT_HWND_IS_AUTOHIDER( hWndInsertAfter, AFX_IDW_DOCKBAR_RIGHT );
  3158. // }
  3159. // // get dockbar in next circle (nOwnCircleNo+1) - top
  3160. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3161. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_TOP, (nOwnCircleNo+1) );
  3162. // // get dockbar in next circle (nOwnCircleNo+1) - bottom
  3163. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3164. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_BOTTOM, (nOwnCircleNo+1) );
  3165. // // get dockbar in next circle (nOwnCircleNo+1) - left
  3166. // hWndInsertAfter = ::GetWindow( hWndInsertAfter, GW_HWNDNEXT );
  3167. // ASSERT_HWND_IS_DOCKBAR( hWndInsertAfter, AFX_IDW_DOCKBAR_LEFT, (nOwnCircleNo+1) );
  3168. // }
  3169. // break; // case AFX_IDW_DOCKBAR_RIGHT
  3170. //#ifdef _DEBUG
  3171. // default:
  3172. // ASSERT( FALSE );
  3173. // break;
  3174. //#endif // _DEBUG
  3175. // } // switch( nOwnID )
  3176. //
  3177. //
  3178. // ASSERT( hWndInsertAfter != NULL );
  3179. // return hWndInsertAfter;
  3180. //}
  3181. CExtDockBar * CExtDockBar::_GetBarByCircleNo( UINT nCircleNo )
  3182. {
  3183. ASSERT_VALID( this );
  3184. if( nCircleNo == m_nCircleNo )
  3185. return this;
  3186. if( nCircleNo < m_nCircleNo )
  3187. {
  3188. ASSERT( m_nCircleNo > 0 );
  3189. ASSERT( m_pDockBarOuter != NULL );
  3190. return m_pDockBarOuter->_GetBarByCircleNo( nCircleNo );
  3191. }
  3192. if( m_pDockBarInner == NULL )
  3193. {
  3194. #ifdef _DEBUG
  3195. UINT nNewCircle =
  3196. #endif // _DEBUG
  3197. _CreateInnerCircle();
  3198. ASSERT( nNewCircle == (m_nCircleNo + 1) );
  3199. }
  3200. ASSERT( m_pDockBarInner != NULL );
  3201. ASSERT( m_pDockBarInner->m_nCircleNo == (m_nCircleNo + 1) );
  3202. return m_pDockBarInner->_GetBarByCircleNo( nCircleNo );
  3203. }
  3204. LRESULT CExtDockBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  3205. {
  3206. if( message == WM_PRINT
  3207. || message == WM_PRINTCLIENT
  3208. )
  3209. {
  3210. CDC * pDC = CDC::FromHandle( (HDC) wParam );
  3211. CRect rcWnd, rcClient;
  3212. GetWindowRect( &rcWnd );
  3213. GetClientRect( &rcClient );
  3214. ClientToScreen( rcClient );
  3215. rcClient.OffsetRect( -rcWnd.TopLeft() );
  3216. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  3217. //  if( (lParam&PRF_NONCLIENT) != 0 )
  3218. //  {
  3219. //  pDC->ExcludeClipRect(rcClient);
  3220. //  // draw borders in non-client area
  3221. //  DrawBorders( pDC, rcWnd );
  3222. //  // draw gripper in non-client area
  3223. //  DrawGripper( pDC, rcWnd );
  3224. //  pDC->SelectClipRgn( NULL );
  3225. //  }
  3226. if( (lParam&(PRF_CLIENT|PRF_ERASEBKGND)) != 0 )
  3227. {
  3228. CPoint ptVpOffset( 0, 0 );
  3229. if( (lParam&PRF_NONCLIENT) != 0 )
  3230. {
  3231. ptVpOffset.x = rcWnd.left - rcClient.left;
  3232. ptVpOffset.y = rcWnd.top - rcClient.top;
  3233. }
  3234. if( ptVpOffset.x != 0
  3235. || ptVpOffset.y != 0
  3236. )
  3237. pDC->OffsetViewportOrg(
  3238. -ptVpOffset.x,
  3239. -ptVpOffset.y
  3240. );
  3241. DoPaint( pDC );
  3242. if( ptVpOffset.x != 0
  3243. || ptVpOffset.y != 0
  3244. )
  3245. pDC->OffsetViewportOrg(
  3246. ptVpOffset.x,
  3247. ptVpOffset.y
  3248. );
  3249. } // if( (lParam&(PRF_CLIENT|PRF_ERASEBKGND)) != 0 )
  3250. if( (lParam&PRF_CHILDREN) != 0 )
  3251. CExtPaintManager::stat_PrintChildren(
  3252. m_hWnd,
  3253. message,
  3254. pDC->GetSafeHdc(),
  3255. lParam,
  3256. false
  3257. );
  3258. return (!0);
  3259. }
  3260. switch( message )
  3261. {
  3262. case WM_CREATE:
  3263. EnableToolTips();
  3264. break;
  3265. case WM_DESTROY:
  3266. case WM_NCDESTROY:
  3267. if( m_pDockBarInner != NULL )
  3268. {
  3269. ASSERT( m_pDockBarInner->m_pDockBarOuter == this );
  3270. m_pDockBarInner->m_pDockBarOuter = NULL;
  3271. m_pDockBarInner = NULL;
  3272. }
  3273. if( m_pDockBarOuter != NULL )
  3274. {
  3275. ASSERT( m_pDockBarOuter->m_pDockBarInner == this );
  3276. m_pDockBarOuter->m_pDockBarInner = NULL;
  3277. m_pDockBarOuter = NULL;
  3278. }
  3279. break;
  3280. } // switch( message )
  3281. return CControlBar::WindowProc(message, wParam, lParam);
  3282. }
  3283. BOOL CExtDockBar::PreTranslateMessage(MSG* pMsg)
  3284. {
  3285. // return CDockBar::PreTranslateMessage( pMsg );
  3286. pMsg;
  3287. return FALSE;
  3288. }
  3289. void CExtDockBar::_OptimizeCircles()
  3290. {
  3291. ASSERT_VALID( this );
  3292. CFrameWnd * pFrame = GetParentFrame();
  3293. ASSERT_VALID( pFrame );
  3294. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  3295. if( !m_bLockedOptimize )
  3296. _OptimizeCircles( pFrame );
  3297. }
  3298. void CExtDockBar::_OptimizeCircles( CFrameWnd * pFrame )
  3299. {
  3300. ASSERT_VALID( pFrame );
  3301. CExtDockBar * vCircle[4];
  3302. vCircle[0] = (CExtDockBar*)pFrame->GetControlBar( AFX_IDW_DOCKBAR_TOP );
  3303. if( vCircle[0] == NULL )
  3304. return;
  3305. ASSERT_VALID( vCircle[0] );
  3306. ASSERT_KINDOF( CExtDockBar, vCircle[0] );
  3307. ASSERT( vCircle[0]->_GetCircleNo() == 0 );
  3308. vCircle[1] = (CExtDockBar*)pFrame->GetControlBar( AFX_IDW_DOCKBAR_BOTTOM );
  3309. ASSERT_VALID( vCircle[1] );
  3310. ASSERT_KINDOF( CExtDockBar, vCircle[1] );
  3311. ASSERT( vCircle[1]->_GetCircleNo() == 0 );
  3312. vCircle[2] = (CExtDockBar*)pFrame->GetControlBar( AFX_IDW_DOCKBAR_LEFT );
  3313. ASSERT_VALID( vCircle[2] );
  3314. ASSERT_KINDOF( CExtDockBar, vCircle[2] );
  3315. ASSERT( vCircle[2]->_GetCircleNo() == 0 );
  3316. vCircle[3] = (CExtDockBar*)pFrame->GetControlBar( AFX_IDW_DOCKBAR_RIGHT );
  3317. ASSERT_VALID( vCircle[3] );
  3318. ASSERT_KINDOF( CExtDockBar, vCircle[3] );
  3319. ASSERT( vCircle[3]->_GetCircleNo() == 0 );
  3320. if( vCircle[0]->_GetDockBarInner() == NULL )
  3321. return;
  3322. vCircle[0] = vCircle[0]->_GetDockBarInner();
  3323. ASSERT( vCircle[0] != NULL );
  3324. ASSERT_KINDOF( CExtDockBar, vCircle[0] );
  3325. ASSERT( vCircle[0]->_GetCircleNo() == 1 );
  3326. vCircle[1] = vCircle[1]->_GetDockBarInner();
  3327. ASSERT( vCircle[1] != NULL );
  3328. ASSERT_KINDOF( CExtDockBar, vCircle[1] );
  3329. ASSERT( vCircle[1]->_GetCircleNo() == 1 );
  3330. vCircle[2] = vCircle[2]->_GetDockBarInner();
  3331. ASSERT( vCircle[2] != NULL );
  3332. ASSERT_KINDOF( CExtDockBar, vCircle[2] );
  3333. ASSERT( vCircle[2]->_GetCircleNo() == 1 );
  3334. vCircle[3] = vCircle[3]->_GetDockBarInner();
  3335. ASSERT( vCircle[3] != NULL );
  3336. ASSERT_KINDOF( CExtDockBar, vCircle[3] );
  3337. ASSERT( vCircle[3]->_GetCircleNo() == 1 );
  3338. //bool bCreateInnerCircle = true;
  3339. UINT nCircleShift = 0;
  3340. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3341. bool bAutoHidersPassed = false;
  3342. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3343. while( vCircle[0] != NULL )
  3344. {
  3345. ASSERT( vCircle[0] != NULL );
  3346. ASSERT_KINDOF( CExtDockBar, vCircle[0] );
  3347. ASSERT( vCircle[1] != NULL );
  3348. ASSERT_KINDOF( CExtDockBar, vCircle[1] );
  3349. ASSERT( vCircle[2] != NULL );
  3350. ASSERT_KINDOF( CExtDockBar, vCircle[2] );
  3351. ASSERT( vCircle[3] != NULL );
  3352. ASSERT_KINDOF( CExtDockBar, vCircle[3] );
  3353. ASSERT( vCircle[0]->m_nCircleNo == vCircle[1]->m_nCircleNo );
  3354. ASSERT( vCircle[0]->m_nCircleNo == vCircle[2]->m_nCircleNo );
  3355. ASSERT( vCircle[0]->m_nCircleNo == vCircle[3]->m_nCircleNo );
  3356. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3357. if( !bAutoHidersPassed )
  3358. {
  3359. bAutoHidersPassed = true;
  3360. if( vCircle[0]->m_pWndAutoHideArea != NULL )
  3361. {
  3362. vCircle[0]->m_pWndAutoHideArea->AdjustOrder();
  3363. vCircle[1]->m_pWndAutoHideArea->AdjustOrder();
  3364. vCircle[2]->m_pWndAutoHideArea->AdjustOrder();
  3365. vCircle[3]->m_pWndAutoHideArea->AdjustOrder();
  3366. }
  3367. }
  3368. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3369. if( nCircleShift != 0 )
  3370. {
  3371. ASSERT( vCircle[0]->m_nCircleNo > nCircleShift );
  3372. vCircle[0]->m_nCircleNo -= nCircleShift;
  3373. vCircle[1]->m_nCircleNo -= nCircleShift;
  3374. vCircle[2]->m_nCircleNo -= nCircleShift;
  3375. vCircle[3]->m_nCircleNo -= nCircleShift;
  3376. }
  3377. CExtDockBar * vCircleOptimize[4];
  3378. vCircleOptimize[0] = vCircle[0];
  3379. vCircleOptimize[1] = vCircle[1];
  3380. vCircleOptimize[2] = vCircle[2];
  3381. vCircleOptimize[3] = vCircle[3];
  3382. // bool bLastCircle =
  3383. // ( vCircle[0]->_GetDockBarInner() != NULL ) ? true : false;
  3384. vCircle[0] = vCircle[0]->_GetDockBarInner();
  3385. vCircle[1] = vCircle[1]->_GetDockBarInner();
  3386. vCircle[2] = vCircle[2]->_GetDockBarInner();
  3387. vCircle[3] = vCircle[3]->_GetDockBarInner();
  3388. if( vCircleOptimize[0]->_CanBeSafeOptimized()
  3389. && vCircleOptimize[1]->_CanBeSafeOptimized()
  3390. && vCircleOptimize[2]->_CanBeSafeOptimized()
  3391. && vCircleOptimize[3]->_CanBeSafeOptimized()
  3392. )
  3393. {
  3394. // if( bLastCircle )
  3395. // {
  3396. // bCreateInnerCircle = false;
  3397. // break;
  3398. // }
  3399. #ifdef __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  3400. ASSERT( !vCircleOptimize[0]->m_bLockedOptimize );
  3401. ASSERT( !vCircleOptimize[1]->m_bLockedOptimize );
  3402. ASSERT( !vCircleOptimize[2]->m_bLockedOptimize );
  3403. ASSERT( !vCircleOptimize[3]->m_bLockedOptimize );
  3404. #endif // __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  3405. vCircleOptimize[0]->_SafeOptimizeInnerOuterChain();
  3406. vCircleOptimize[1]->_SafeOptimizeInnerOuterChain();
  3407. vCircleOptimize[2]->_SafeOptimizeInnerOuterChain();
  3408. vCircleOptimize[3]->_SafeOptimizeInnerOuterChain();
  3409. nCircleShift++;
  3410. }
  3411. else
  3412. {
  3413. #ifdef __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  3414. ASSERT( !vCircleOptimize[0]->m_bLockedOptimize );
  3415. ASSERT( !vCircleOptimize[1]->m_bLockedOptimize );
  3416. ASSERT( !vCircleOptimize[2]->m_bLockedOptimize );
  3417. ASSERT( !vCircleOptimize[3]->m_bLockedOptimize );
  3418. #endif // __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  3419. vCircleOptimize[0]->OnDynamicLayoutOptimize();
  3420. vCircleOptimize[1]->OnDynamicLayoutOptimize();
  3421. vCircleOptimize[2]->OnDynamicLayoutOptimize();
  3422. vCircleOptimize[3]->OnDynamicLayoutOptimize();
  3423. }
  3424. } // while( vCircle[0] != NULL )
  3425. // if( bCreateInnerCircle )
  3426. // _CreateInnerCircle( pFrame );
  3427. CArray < HWND, HWND > arrHwndsToDynOptimize;
  3428. bool bDeepOptimize = false;
  3429. POSITION pos = pFrame->m_listControlBars.GetHeadPosition();
  3430. for( ; pos != NULL; )
  3431. {
  3432. CExtDynControlBar * pBar =
  3433. DYNAMIC_DOWNCAST(
  3434. CExtDynControlBar,
  3435. ((CObject *)(pFrame->m_listControlBars.GetNext(pos)))
  3436. );
  3437. if( pBar == NULL )
  3438. continue;
  3439. ASSERT( !pBar->IsFixedMode() );
  3440. HWND hWnd = pBar->m_pWndDynDocker->GetSafeHwnd();
  3441. if( hWnd == NULL
  3442. || ! ::IsWindow( hWnd )
  3443. )
  3444. continue;
  3445. //if( !pBar->IsFloating() )
  3446. {
  3447. INT nDockedCount =
  3448. pBar->m_pWndDynDocker->GetDockedCount();
  3449. if( nDockedCount > 0 )
  3450. continue;
  3451. bDeepOptimize = true;
  3452. } // if( !pBar->IsFloating() )
  3453. arrHwndsToDynOptimize.Add( hWnd );
  3454. }
  3455. for( INT nHwndIdx = 0; nHwndIdx < arrHwndsToDynOptimize.GetSize(); nHwndIdx++ )
  3456. {
  3457. HWND hWnd = arrHwndsToDynOptimize[ nHwndIdx ];
  3458. ASSERT( hWnd != NULL );
  3459. if( !::IsWindow( hWnd ) )
  3460. continue;
  3461. CWnd * pWndChild = CWnd::FromHandlePermanent( hWnd );
  3462. if( pWndChild == NULL )
  3463. continue;
  3464. CExtDockDynBar * pDockBar =
  3465. DYNAMIC_DOWNCAST(
  3466. CExtDockDynBar,
  3467. pWndChild
  3468. );
  3469. if( pDockBar == NULL )
  3470. continue;
  3471. #ifdef __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  3472. ASSERT( !pDockBar->m_bLockedOptimize );
  3473. #endif // __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  3474. pDockBar->OnDynamicLayoutOptimize();
  3475. }
  3476. if( bDeepOptimize )
  3477. _OptimizeCircles( pFrame );
  3478. }
  3479. void CExtDockBar::_SafeOptimizeInnerOuterChain()
  3480. {
  3481. ASSERT( this != NULL );
  3482. ASSERT_KINDOF( CExtDockBar, this );
  3483. ASSERT( GetSafeHwnd() != NULL );
  3484. ASSERT( ::IsWindow(GetSafeHwnd()) );
  3485. if( m_pDockBarInner != NULL )
  3486. {
  3487. ASSERT( m_pDockBarInner->m_pDockBarOuter == this );
  3488. m_pDockBarInner->m_pDockBarOuter = m_pDockBarOuter;
  3489. }
  3490. if( m_pDockBarOuter != NULL )
  3491. {
  3492. ASSERT( m_pDockBarOuter->m_pDockBarInner == this );
  3493. m_pDockBarOuter->m_pDockBarInner = m_pDockBarInner;
  3494. }
  3495. m_pDockBarInner = NULL;
  3496. m_pDockBarOuter = NULL;
  3497. CFrameWnd * pFrame = GetParentFrame();
  3498. ASSERT( pFrame != NULL );
  3499. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  3500. POSITION pos = pFrame->m_listControlBars.Find( this );
  3501. ASSERT( pos != NULL );
  3502. pFrame->m_listControlBars.RemoveAt( pos );
  3503. BOOL bAutoDelete = m_bAutoDelete;
  3504. DestroyWindow();
  3505. if( !bAutoDelete )
  3506. delete this;
  3507. }
  3508. bool CExtDockBar::_CanBeSafeOptimized()
  3509. {
  3510. ASSERT( this != NULL );
  3511. ASSERT_KINDOF( CExtDockBar, this );
  3512. for( INT nPos = 0; nPos < m_arrBars.GetSize(); nPos++ )
  3513. {
  3514. void * pBar = m_arrBars[ nPos ];
  3515. if( pBar != NULL ) // placeholer or child control bar
  3516. return false;
  3517. }
  3518. return true;
  3519. }
  3520. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3521. CExtDynAutoHideArea * CExtDockBar::_GetAutoHideArea()
  3522. {
  3523. return m_pWndAutoHideArea;
  3524. }
  3525. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3526. void CExtDockBar::_HandleDestruction()
  3527. {
  3528. __PROF_UIS_MANAGE_STATE;
  3529. m_bLockedOptimize = true;
  3530. bool bFirstDestroyed = true;
  3531. for( int nBar = int(m_arrBars.GetSize()) - 1; nBar > 0 ; nBar-- )
  3532. {
  3533. ASSERT( m_arrBars[0] == NULL );
  3534. CExtControlBar * pBar = (CExtControlBar *)
  3535. m_arrBars[ nBar ];
  3536. if( bFirstDestroyed )
  3537. {
  3538. ASSERT( pBar == NULL );
  3539. bFirstDestroyed = false;
  3540. continue;
  3541. }
  3542. if( pBar == NULL )
  3543. {
  3544. m_arrBars.RemoveAt( nBar );
  3545. continue;
  3546. }
  3547. if( __PLACEHODLER_BAR_PTR(pBar) )
  3548. {
  3549. m_arrBars.RemoveAt( nBar );
  3550. continue;
  3551. }
  3552. ASSERT_VALID( pBar );
  3553. ASSERT_KINDOF( CExtControlBar, pBar );
  3554. ASSERT_VALID( pBar->m_pDockSite );
  3555. ASSERT( pBar->m_pDockContext != NULL );
  3556. ASSERT( pBar->m_pDockBar == this );
  3557. pBar->m_bUpdatingChain = true;
  3558. pBar->m_pDockBar = NULL;
  3559. if( pBar->IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  3560. {
  3561. CExtDockDynBar * pDynDocker =
  3562. ((CExtDynControlBar*)pBar)->m_pWndDynDocker;
  3563. ASSERT_VALID( pDynDocker );
  3564. pDynDocker->_HandleDestruction();
  3565. }
  3566. ASSERT( pBar->m_bUpdatingChain );
  3567. if( pBar->GetParent() != pBar->m_pDockSite )
  3568. pBar->SetParent( pBar->m_pDockSite );
  3569. pBar->m_bUpdatingChain = false;
  3570. m_arrBars.RemoveAt( nBar );
  3571. }
  3572. m_bLockedOptimize = false;
  3573. }
  3574. void CExtDockBar::OnDestroy()
  3575. {
  3576. __PROF_UIS_MANAGE_STATE;
  3577. _HandleDestruction();
  3578. CDockBar::OnDestroy();
  3579. }
  3580. BOOL CExtDockBar::Create( CWnd * pParentWnd, DWORD dwStyle, UINT nID )
  3581. {
  3582. if( ! CDockBar::Create( pParentWnd, dwStyle, nID ) )
  3583. {
  3584. ASSERT( FALSE );
  3585. return FALSE;
  3586. }
  3587. CRect rc;
  3588. pParentWnd->GetClientRect( &rc );
  3589. switch( nID )
  3590. {
  3591. case AFX_IDW_DOCKBAR_TOP:
  3592. rc.bottom = rc.top;
  3593. break;
  3594. case AFX_IDW_DOCKBAR_BOTTOM:
  3595. rc.top = rc.bottom;
  3596. break;
  3597. case AFX_IDW_DOCKBAR_LEFT:
  3598. rc.right = rc.left;
  3599. break;
  3600. case AFX_IDW_DOCKBAR_RIGHT:
  3601. rc.left = rc.right;
  3602. break;
  3603. } // switch( nID )
  3604. MoveWindow( &rc, FALSE );
  3605. if( ( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) != 0 ) )
  3606. {
  3607. CWnd::ModifyStyleEx(
  3608. WS_EX_LAYOUTRTL|WS_EX_RTLREADING,
  3609. 0,
  3610. SWP_FRAMECHANGED
  3611. );
  3612. ASSERT( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) == 0 );
  3613. } // if( ( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) != 0 ) )
  3614. return TRUE;
  3615. }
  3616. BOOL CExtDockBar::DestroyWindow()
  3617. {
  3618. __PROF_UIS_MANAGE_STATE;
  3619. _HandleDestruction();
  3620. return  CDockBar::DestroyWindow();
  3621. }
  3622. /////////////////////////////////////////////////////////////////////////
  3623. // CExtDockDynBar window
  3624. IMPLEMENT_DYNCREATE(CExtDockDynBar, CExtDockBar);
  3625. BEGIN_MESSAGE_MAP(CExtDockDynBar, CExtDockBar)
  3626. //{{AFX_MSG_MAP(CExtDockDynBar)
  3627. ON_WM_SIZE()
  3628. //}}AFX_MSG_MAP
  3629. END_MESSAGE_MAP()
  3630. CExtDockDynBar::CExtDockDynBar(
  3631. UINT nCircleNo
  3632. )
  3633. : CExtDockBar( nCircleNo )
  3634. , m_bHelperDockSiteModified( false )
  3635. , m_bHelperSizing( false )
  3636. {
  3637. m_bAutoDelete = TRUE;
  3638. }
  3639. /////////////////////////////////////////////////////////////////////////
  3640. // CExtDynControlBar window
  3641. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3642. CExtDynAutoHideArea * CExtDockDynBar::_GetAutoHideArea()
  3643. {
  3644. CExtControlBar * pExtBar = 
  3645. STATIC_DOWNCAST(
  3646. CExtControlBar,
  3647. GetParent()
  3648. );
  3649. ASSERT( pExtBar->m_pDockBar != NULL );
  3650. CExtDockBar * pDockBar =
  3651. DYNAMIC_DOWNCAST(
  3652. CExtDockBar,
  3653. pExtBar->m_pDockBar
  3654. );
  3655. if( pDockBar == NULL )
  3656. return NULL;
  3657. return pDockBar->_GetAutoHideArea();
  3658. }
  3659. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3660. void CExtDockDynBar::VisibleLayoutItem_t::_AssignFromOther(
  3661. const CExtDockDynBar::VisibleLayoutItem_t & other
  3662. )
  3663. {
  3664. m_vRow.RemoveAll();
  3665. INT nSize = (INT)other.m_vRow.GetSize();
  3666. if( nSize == 0 )
  3667. {
  3668. m_vRow.FreeExtra();
  3669. return;
  3670. }
  3671. m_vRow.SetSize( nSize );
  3672. for( INT nBar = 0; nBar < nSize; nBar++ )
  3673. {
  3674. CExtControlBar * pExtBar = other.m_vRow[ nBar ];
  3675. ASSERT( pExtBar != NULL );
  3676. ASSERT( !pExtBar->IsFixedMode() );
  3677. #ifdef _DEBUG
  3678. if( __PLACEHODLER_BAR_PTR(pExtBar) )
  3679. {
  3680. ASSERT( FALSE );
  3681. }
  3682. #endif // _DEBUG
  3683. m_vRow.SetAt( nBar, pExtBar );
  3684. } // for( INT nBar = 0; nBar < nSize; nBar++ )
  3685. }
  3686. CExtDockDynBar::VisibleLayoutItem_t::VisibleLayoutItem_t()
  3687. : m_nRowMetric( 0 )
  3688. , m_nRowMinMetric( 0 )
  3689. , m_nRowExtent( 0 )
  3690. , m_nRowMinExtent( 0 )
  3691. , m_bOverflowMode( false )
  3692. {
  3693. }
  3694. CExtDockDynBar::VisibleLayoutItem_t::VisibleLayoutItem_t(
  3695. const CExtDockDynBar::VisibleLayoutItem_t & other
  3696. )
  3697. {
  3698. _AssignFromOther( other );
  3699. }
  3700. CExtDockDynBar::VisibleLayoutItem_t::~VisibleLayoutItem_t()
  3701. {
  3702. }
  3703. CExtDockDynBar::VisibleLayoutItem_t &
  3704. CExtDockDynBar::VisibleLayoutItem_t::operator = (
  3705. const CExtDockDynBar::VisibleLayoutItem_t & other
  3706. )
  3707. {
  3708. _AssignFromOther( other );
  3709. return * this;
  3710. }
  3711. bool CExtDockDynBar::VisibleLayoutItem_t::IsEmpty() const
  3712. {
  3713. if( m_vRow.GetSize() == 0 )
  3714. return true;
  3715. return false;
  3716. }
  3717. bool CExtDockDynBar::VisibleLayoutItem_t::IsRowMinSized() const
  3718. {
  3719. ASSERT( m_nRowMetric >= m_nRowMinMetric );
  3720. return (m_nRowMetric == m_nRowMinMetric ) ? true : false;
  3721. }
  3722. void CExtDockDynBar::VisibleLayout_t::_Clean()
  3723. {
  3724. INT nSize = (INT)m_vRows.GetSize();
  3725. for( INT nRow = 0; nRow < nSize; nRow++ )
  3726. {
  3727. VisibleLayoutItem_t * pVLI = m_vRows.GetAt( nRow );
  3728. ASSERT( pVLI != NULL );
  3729. delete pVLI;
  3730. }
  3731. m_vRows.RemoveAll();
  3732. m_vRows.FreeExtra();
  3733. }
  3734. CExtDockDynBar::VisibleLayout_t::VisibleLayout_t()
  3735. : m_nTotalMetric( 0 )
  3736. , m_nTotalMinMetric( 0 )
  3737. , m_nTotalMinExtent( 0 )
  3738. , m_nTotalBarsCount( 0 )
  3739. , m_nDelayShowCount( 0 )
  3740. {
  3741. }
  3742. CExtDockDynBar::VisibleLayout_t::~VisibleLayout_t()
  3743. {
  3744. _Clean();
  3745. }
  3746. void CExtDockDynBar::VisibleLayout_t::AddBarPointer(
  3747. CExtControlBar * pExtBar
  3748. )
  3749. {
  3750. ASSERT_VALID( pExtBar );
  3751. ASSERT( !pExtBar->IsFixedMode() );
  3752. if( !pExtBar->IsVisible() )
  3753. return;
  3754. #ifdef _DEBUG
  3755. if( __PLACEHODLER_BAR_PTR(pExtBar) )
  3756. {
  3757. ASSERT( FALSE );
  3758. }
  3759. #endif // _DEBUG
  3760. VisibleLayoutItem_t * pVLI = NULL;
  3761. INT nRowCount = (INT)m_vRows.GetSize();
  3762. if( nRowCount == 0 )
  3763. {
  3764. pVLI = new VisibleLayoutItem_t;
  3765. m_vRows.Add( pVLI );
  3766. }
  3767. else
  3768. pVLI = m_vRows[ nRowCount - 1 ];
  3769. ASSERT( pVLI != NULL );
  3770. pVLI->m_vRow.Add( pExtBar );
  3771. m_nTotalBarsCount++;
  3772. }
  3773. void CExtDockDynBar::VisibleLayout_t::MakeNewRow()
  3774. {
  3775. INT nRowCount = (INT)m_vRows.GetSize();
  3776. if( nRowCount == 0 )
  3777. {
  3778. VisibleLayoutItem_t * pVLI = new VisibleLayoutItem_t;
  3779. m_vRows.Add( pVLI );
  3780. return;
  3781. }
  3782. VisibleLayoutItem_t * pVLI = m_vRows.GetAt( nRowCount - 1 );
  3783. ASSERT( pVLI != NULL );
  3784. if( pVLI->IsEmpty() )
  3785. return;
  3786. pVLI = new VisibleLayoutItem_t;
  3787. m_vRows.Add( pVLI );
  3788. }
  3789. bool CExtDockDynBar::VisibleLayout_t::IsEmpty() const
  3790. {
  3791. INT nRowCount = (INT)m_vRows.GetSize();
  3792. if( nRowCount == 0 )
  3793. return true;
  3794. if( nRowCount == 1 )
  3795. {
  3796. VisibleLayoutItem_t * pVLI = m_vRows.GetAt( 0 );
  3797. if( pVLI->IsEmpty() )
  3798. return true;
  3799. }
  3800. #ifdef _DEBUG
  3801. else
  3802. {
  3803. VisibleLayoutItem_t * pVLI = m_vRows.GetAt( 0 );
  3804. ASSERT( !pVLI->IsEmpty() );
  3805. }
  3806. #endif // _DEBUG
  3807. return false;
  3808. }
  3809. void CExtDockDynBar::_VisibleLayoutBuild(
  3810. VisibleLayout_t & _vl
  3811. )
  3812. {
  3813. ASSERT_VALID( this );
  3814. ASSERT( _vl.IsEmpty() );
  3815. CRect rcDockBarReal;
  3816. GetClientRect( &rcDockBarReal );
  3817. CSize _size = rcDockBarReal.Size();
  3818. INT nCount = (INT)m_arrBars.GetSize();
  3819. ASSERT( nCount > 0 );
  3820. ASSERT( m_arrBars[0] == NULL );
  3821. UINT nOwnID = GetDlgCtrlID();
  3822. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nOwnID );
  3823. BOOL bHorz = ( nOwnID == AFX_IDW_DOCKBAR_TOP || nOwnID == AFX_IDW_DOCKBAR_BOTTOM );
  3824. ASSERT( m_arrBars[0] == NULL );
  3825. for( INT nBar = 1; nBar < nCount; nBar++ )
  3826. {
  3827. CExtControlBar * pExtBar = (CExtControlBar *) m_arrBars[nBar];
  3828. if( pExtBar == NULL )
  3829. {
  3830. if( nBar == (nCount-1) )
  3831. break;
  3832. _vl.MakeNewRow();
  3833. continue;
  3834. }
  3835. if( __PLACEHODLER_BAR_PTR(pExtBar) )
  3836. continue;
  3837. ASSERT_VALID( pExtBar );
  3838. ASSERT_KINDOF( CExtControlBar, pExtBar );
  3839. ASSERT( !pExtBar->IsFixedMode() );
  3840. if( pExtBar->m_bDelayShowInvoked )
  3841. _vl.m_nDelayShowCount ++;
  3842. if( ! pExtBar->IsVisible() )
  3843. {
  3844. pExtBar->m_bDelayShowInvoked = false;
  3845. continue;
  3846. }
  3847. _vl.AddBarPointer( pExtBar );
  3848. } // for( INT nBar = 1; nBar < nCount; nBar++ )
  3849. INT nRowsCount = (INT)_vl.m_vRows.GetSize(), nRow;
  3850. if( nRowsCount == 0 )
  3851. return;
  3852. for( nRow = 0; nRow < nRowsCount; nRow ++ )
  3853. {
  3854. VisibleLayoutItem_t * pVLI = _vl.m_vRows[ nRow ];
  3855. ASSERT( pVLI != NULL );
  3856. pVLI->m_bOverflowMode = false;
  3857. INT nRowSize = (INT)pVLI->m_vRow.GetSize(), nBar;
  3858. if( nRowSize <= 1 )
  3859. continue;
  3860. for( nBar = 0; nBar < nRowSize; nBar++ )
  3861. {
  3862. CExtControlBar * pExtBar = pVLI->m_vRow[ nBar ];
  3863. ASSERT( pExtBar != NULL );
  3864. if( bHorz    && pExtBar->m_sizeDockedH.cx >= _size.cx )
  3865. pVLI->m_bOverflowMode = true;
  3866. else
  3867. if( (!bHorz) && pExtBar->m_sizeDockedV.cy >= _size.cy )
  3868. pVLI->m_bOverflowMode = true;
  3869. if( pVLI->m_bOverflowMode )
  3870. break;
  3871. }
  3872. }
  3873. for( nRow = 0; nRow < nRowsCount; nRow ++ )
  3874. {
  3875. VisibleLayoutItem_t * pVLI = _vl.m_vRows[ nRow ];
  3876. ASSERT( pVLI != NULL );
  3877. INT nRowSize = (INT)pVLI->m_vRow.GetSize();
  3878. if( nRowSize == 0 )
  3879. continue;
  3880. ASSERT( nRowSize > 0 );
  3881. CExtControlBar * pExtBar = pVLI->m_vRow[ 0 ];
  3882. ASSERT( pExtBar != NULL );
  3883. if( pVLI->m_bOverflowMode )
  3884. {
  3885. if( bHorz )
  3886. pExtBar->m_sizeDockedH.cx = _size.cx / nRowSize;
  3887. else
  3888. pExtBar->m_sizeDockedV.cy = _size.cy / nRowSize;
  3889. }
  3890. LONG nMinHW = pExtBar->_CalcDesiredMinHW();
  3891. LONG nMinVH = pExtBar->_CalcDesiredMinVH();
  3892. pVLI->m_nRowMinMetric = bHorz
  3893. ? nMinVH
  3894. : nMinHW;
  3895. pVLI->m_nRowMetric = bHorz
  3896. ? pExtBar->m_sizeDockedH.cy
  3897. : pExtBar->m_sizeDockedV.cx;
  3898. _vl.m_nTotalMetric += pVLI->m_nRowMetric;
  3899. INT nRowMinMetric = bHorz
  3900. ? nMinVH
  3901. : nMinHW;
  3902. INT nRowMinExtent = bHorz
  3903. ? nMinHW
  3904. : nMinVH;
  3905. INT nRowExtent = bHorz
  3906. ? pExtBar->m_sizeDockedH.cx
  3907. : pExtBar->m_sizeDockedV.cy;
  3908. for( INT nBar = 1; nBar < nRowSize; nBar++ )
  3909. {
  3910. pExtBar = pVLI->m_vRow[ nBar ];
  3911. ASSERT( pExtBar != NULL );
  3912. if( pVLI->m_bOverflowMode )
  3913. {
  3914. if( bHorz )
  3915. pExtBar->m_sizeDockedH.cx = _size.cx / nRowSize;
  3916. else
  3917. pExtBar->m_sizeDockedV.cy = _size.cy / nRowSize;
  3918. }
  3919. LONG nMinHW = pExtBar->_CalcDesiredMinHW();
  3920. LONG nMinVH = pExtBar->_CalcDesiredMinVH();
  3921. INT nBarMinMetric = bHorz
  3922. ? nMinVH
  3923. : nMinHW;
  3924. nRowMinMetric =
  3925. min( nRowMinMetric, nBarMinMetric );
  3926. nRowMinExtent += bHorz
  3927. ? nMinHW
  3928. : nMinVH;
  3929. nRowExtent += bHorz
  3930. ? pExtBar->m_sizeDockedH.cx
  3931. : pExtBar->m_sizeDockedV.cy;
  3932. }
  3933. _vl.m_nTotalMinMetric += nRowMinMetric;
  3934. _vl.m_nTotalMinExtent = max( nRowMinExtent, _vl.m_nTotalMinExtent );
  3935. pVLI->m_nRowExtent = nRowExtent;
  3936. } // for( INT nRow = 0; nRow < nRowsCount; nRow ++ )
  3937. }
  3938. void CExtDockDynBar::_VisibleLayoutAlign(
  3939. VisibleLayout_t & _vl,
  3940. CSize _size
  3941. )
  3942. {
  3943. ASSERT_VALID( this );
  3944. ASSERT( !_vl.IsEmpty() );
  3945. ASSERT( _size.cx > 0 && _size.cy > 0 );
  3946. if( ! ( m_bHelperSizing || _vl.m_nDelayShowCount > 0L ) )
  3947. return;
  3948. m_bHelperSizing = false;
  3949. CRect rcDockBarReal;
  3950. GetClientRect( &rcDockBarReal );
  3951. _size = rcDockBarReal.Size();
  3952. if( _size.cx <= 0 || _size.cy <= 0 )
  3953. return;
  3954. UINT nOwnID = GetDlgCtrlID();
  3955. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nOwnID );
  3956. BOOL bHorz = ( nOwnID == AFX_IDW_DOCKBAR_TOP || nOwnID == AFX_IDW_DOCKBAR_BOTTOM );
  3957. INT nRowsCount = (INT)_vl.m_vRows.GetSize();
  3958. ASSERT( nRowsCount > 0 );
  3959. INT nDesiredMetric = bHorz ? _size.cy : _size.cx;
  3960. INT nIncrement = ( _vl.m_nTotalMetric < nDesiredMetric ) ? 1 : -1;
  3961. INT nDiff = abs(_vl.m_nTotalMetric - nDesiredMetric);
  3962. // align direction 1 (row metrics)
  3963. bool bResetRowMetrics = true;
  3964. while( nDiff != 0 )
  3965. {
  3966. bResetRowMetrics = false;
  3967. ASSERT( nDiff >= 0 );
  3968. INT nRowsMinSized = 0;
  3969. for( INT nRow = 0; nRow < nRowsCount; nRow ++ )
  3970. {
  3971. VisibleLayoutItem_t * pVLI = _vl.m_vRows[ nRow ];
  3972. ASSERT( pVLI != NULL );
  3973. //ASSERT( !pVLI->IsEmpty() );
  3974. INT nRowSize = (INT)pVLI->m_vRow.GetSize();
  3975. // TO FIX:
  3976. if( nRowSize == 0 )
  3977. continue;
  3978. ASSERT( nRowSize > 0 );
  3979. if( nIncrement < 0 && pVLI->IsRowMinSized() )
  3980. {
  3981. nRowsMinSized ++;
  3982. if( nRowsCount == nRowsMinSized )
  3983. break;
  3984. continue;
  3985. }
  3986. pVLI->m_nRowMetric += nIncrement;
  3987. nDiff--;
  3988. for( INT nBar = 0; nBar < nRowSize; nBar++ )
  3989. {
  3990. CExtControlBar * pExtBar = pVLI->m_vRow[ nBar ];
  3991. ASSERT( pExtBar != NULL );
  3992. LONG & nRowMetricRef = bHorz
  3993. ? pExtBar->m_sizeDockedH.cy
  3994. : pExtBar->m_sizeDockedV.cx;
  3995. nRowMetricRef += nIncrement;
  3996. } // for( INT nBar = 0; nBar < nRowSize; nBar++ )
  3997. if( nDiff == 0 )
  3998. break;
  3999. } // for( INT nRow = 0; nRow < nRowsCount; nRow ++ )
  4000. if( nRowsCount == nRowsMinSized )
  4001. break;
  4002. } // while( nDiff != 0 )
  4003. if( bResetRowMetrics )
  4004. {
  4005. for( INT nRow = 0; nRow < nRowsCount; nRow ++ )
  4006. {
  4007. VisibleLayoutItem_t * pVLI = _vl.m_vRows[ nRow ];
  4008. ASSERT( pVLI != NULL );
  4009. INT nRowSize = (INT)pVLI->m_vRow.GetSize();
  4010. if( nRowSize == 0 )
  4011. continue;
  4012. ASSERT( nRowSize > 0 );