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

界面编程

开发平台:

Visual C++

  1. for( INT nBar = 0; nBar < nRowSize; nBar++ )
  2. {
  3. CExtControlBar * pExtBar = pVLI->m_vRow[ nBar ];
  4. ASSERT( pExtBar != NULL );
  5. LONG & nRowMetricRef = bHorz
  6. ? pExtBar->m_sizeDockedH.cy
  7. : pExtBar->m_sizeDockedV.cx;
  8. nRowMetricRef = pVLI->m_nRowMetric;
  9. } // for( INT nBar = 0; nBar < nRowSize; nBar++ )
  10. } // for( INT nRow = 0; nRow < nRowsCount; nRow ++ )
  11. } // if( bResetRowMetrics )
  12. // align direction 2 (row extents)
  13. nDesiredMetric = bHorz ? _size.cx : _size.cy;
  14. INT nRow = 0;
  15. bool bFinish = false;
  16. for( nRow = 0; nRow < nRowsCount; nRow ++ )
  17. {
  18. VisibleLayoutItem_t * pVLI = _vl.m_vRows[ nRow ];
  19. ASSERT( pVLI != NULL );
  20. if( pVLI->IsEmpty() )
  21. continue;
  22. INT nIncrement = ( pVLI->m_nRowExtent < nDesiredMetric ) ? 1 : -1;
  23. INT nDiff = abs( pVLI->m_nRowExtent - nDesiredMetric );
  24. bool bHaveDisplayingBars = false;
  25. for( int nDisplaying = 0; nDisplaying < 2 && nDiff != 0; nDisplaying++ )
  26. {
  27. bool bAllMinSized = false;
  28. INT nPass = 0;
  29. for( ; nDiff != 0; nPass ++ )
  30. {
  31. ASSERT( nDiff >= 0 );
  32. INT nRowSize = (INT)pVLI->m_vRow.GetSize();
  33. if( nRowSize == 0 )
  34. continue;
  35. ASSERT( nRowSize > 0 );
  36. INT nBarsMinSized = 0;
  37. INT nCountDisplaying = 0;
  38. for( INT nBar = 0; nBar < nRowSize; nBar++ )
  39. {
  40. CExtControlBar * pExtBar = pVLI->m_vRow[ nBar ];
  41. ASSERT( pExtBar != NULL );
  42. if( pExtBar->_DisplayingGet() )
  43. {
  44. nCountDisplaying ++;
  45. if( nCountDisplaying == nRowSize
  46. || nPass > nRowSize
  47. )
  48. {
  49. bHaveDisplayingBars = false;
  50. bFinish = true;
  51. INT nRowSize = (INT)pVLI->m_vRow.GetSize();
  52. for( INT nBar = 0; nBar < nRowSize; nBar++ )
  53. {
  54. CExtControlBar * pExtBar = pVLI->m_vRow[ nBar ];
  55. ASSERT( pExtBar != NULL );
  56. if( pExtBar->_DisplayingGet() )
  57. {
  58. if( nPass <= nRowSize )
  59. bFinish = false;
  60. pExtBar->_DisplayingSet( false );
  61. }
  62. } // for( INT nBar = 0; nBar < nRowSize; nBar++ )
  63. if( bFinish )
  64. break;
  65. }
  66. if( nDisplaying == 0
  67. && nRowSize > 1
  68. )
  69. {
  70. bHaveDisplayingBars = true;
  71. continue;
  72. }
  73. } // if( pExtBar->_DisplayingGet() )
  74. LONG & nBarMetricRef = bHorz
  75. ? pExtBar->m_sizeDockedH.cx
  76. : pExtBar->m_sizeDockedV.cy;
  77. if( nIncrement < 0 )
  78. {
  79. LONG nBarMinMetric = bHorz
  80. ? pExtBar->_CalcDesiredMinHW()
  81. : pExtBar->_CalcDesiredMinVH();
  82. //ASSERT( nBarMetricRef >= nBarMinMetric );
  83. if( nBarMetricRef < nBarMinMetric )
  84. nBarMetricRef = nBarMinMetric;
  85. if( nBarMetricRef <= nBarMinMetric )
  86. {
  87. nBarsMinSized ++;
  88. if( nBarsMinSized == nRowSize )
  89. {
  90. if( nDisplaying > 0 )
  91. bAllMinSized = true;
  92. break;
  93. }
  94. continue;
  95. }
  96. } // if( nIncrement < 0 )
  97. nBarMetricRef += nIncrement;
  98. nDiff --;
  99. if( nDiff == 0 )
  100. break;
  101. } // for( INT nBar = 0; nBar < nRowSize; nBar++ )
  102. if( bFinish )
  103. break;
  104. if( nBarsMinSized == nRowSize )
  105. {
  106. if( nDisplaying > 0 )
  107. bAllMinSized = true;
  108. break;
  109. }
  110. //  if( nDisplaying == 0 )
  111. //  break;
  112. } // for( ; nDiff != 0; nPass ++ )
  113. if( bFinish )
  114. break;
  115. if( bAllMinSized && nDisplaying > 0  )
  116. break;
  117. if( bHaveDisplayingBars && nDisplaying == 0 )
  118. {
  119. INT nRowSize = (INT)pVLI->m_vRow.GetSize();
  120. for( INT nBar = 0; nBar < nRowSize; nBar++ )
  121. {
  122. CExtControlBar * pExtBar = pVLI->m_vRow[ nBar ];
  123. ASSERT( pExtBar != NULL );
  124. pExtBar->_DisplayingSet( false );
  125. } // for( INT nBar = 0; nBar < nRowSize; nBar++ )
  126. bHaveDisplayingBars = false;
  127. } // if( bHaveDisplayingBars && nDisplaying == 0 )
  128. } // for( int nDisplaying = 0; nDisplaying < 2 && nDiff != 0; nDisplaying++ )
  129. } // for( nRow = 0; nRow < nRowsCount; nRow ++ )
  130. ASSERT( _vl.m_nTotalBarsCount > 0 );
  131. HANDLE hDWP = ::BeginDeferWindowPos( _vl.m_nTotalBarsCount );
  132. ASSERT( hDWP != NULL );
  133. // apply new layout
  134. CPoint ptOffs( 0, 0 );
  135. for( nRow = 0; nRow < nRowsCount; nRow ++ )
  136. {
  137. VisibleLayoutItem_t * pVLI = _vl.m_vRows[ nRow ];
  138. ASSERT( pVLI != NULL );
  139. //ASSERT( !pVLI->IsEmpty() );
  140. INT nRowSize = (INT)pVLI->m_vRow.GetSize();
  141. if( nRowSize == 0 )
  142. continue;
  143. ASSERT( nRowSize > 0 );
  144. INT nRowOffset = 0;
  145. for( INT nBar = 0; nBar < nRowSize; nBar++ )
  146. {
  147. CExtControlBar * pExtBar = pVLI->m_vRow[ nBar ];
  148. ASSERT( pExtBar != NULL );
  149. if( nBar == 0 )
  150. nRowOffset = bHorz
  151. ? pExtBar->m_sizeDockedH.cy
  152. : pExtBar->m_sizeDockedV.cx;
  153. CRect rcBar(
  154. ptOffs,
  155. bHorz
  156. ? pExtBar->m_sizeDockedH
  157. : pExtBar->m_sizeDockedV
  158. );
  159. if( hDWP != NULL )
  160. {
  161. hDWP =
  162. ::DeferWindowPos(
  163. hDWP,
  164. pExtBar->GetSafeHwnd(),
  165. NULL,
  166. rcBar.left, rcBar.top,
  167. rcBar.Width(), rcBar.Height(),
  168. SWP_NOZORDER|SWP_NOOWNERZORDER
  169. |SWP_NOACTIVATE|SWP_FRAMECHANGED
  170. );
  171. ASSERT( hDWP != NULL );
  172. }
  173. if( hDWP == NULL )
  174. pExtBar->MoveWindow( &rcBar );
  175. if( bHorz )
  176. ptOffs.x += pExtBar->m_sizeDockedH.cx;
  177. else
  178. ptOffs.y += pExtBar->m_sizeDockedV.cy;
  179. pExtBar->m_bDelayShowInvoked = false;
  180. } // for( INT nBar = 0; nBar < nRowSize; nBar++ )
  181. if( bHorz )
  182. {
  183. ptOffs.x = 0;
  184. ptOffs.y += nRowOffset;
  185. }
  186. else
  187. {
  188. ptOffs.x += nRowOffset;
  189. ptOffs.y = 0;
  190. }
  191. } // for( nRow = 0; nRow < nRowsCount; nRow ++ )
  192. ASSERT( hDWP != NULL );
  193. if( hDWP != NULL )
  194. ::EndDeferWindowPos( hDWP );
  195. for( nRow = 0; nRow < nRowsCount; nRow ++ )
  196. {
  197. VisibleLayoutItem_t * pVLI = _vl.m_vRows[ nRow ];
  198. ASSERT( pVLI != NULL );
  199. INT nRowSize = (INT)pVLI->m_vRow.GetSize();
  200. if( nRowSize == 0 )
  201. continue;
  202. ASSERT( nRowSize > 0 );
  203. for( INT nBar = 0; nBar < nRowSize; nBar++ )
  204. {
  205. CExtControlBar * pExtBar = pVLI->m_vRow[ nBar ];
  206. ASSERT( pExtBar != NULL );
  207. pExtBar->_DisplayingSet( false );
  208. //if( bHorz )
  209. // pExtBar->m_pDockContext->m_sizeLast = pExtBar->m_sizeDockedH;
  210. //else
  211. // pExtBar->m_pDockContext->m_sizeLast = pExtBar->m_sizeDockedV;
  212. // HWND hWnd = pExtBar->GetParent()->GetSafeHwnd();
  213. // for( ; hWnd != NULL; hWnd = ::GetParent( hWnd ) )
  214. // {
  215. // if( ((::__EXT_MFC_GetWindowLong(hWnd,GWL_STYLE))&WS_CHILD) == 0 )
  216. // break;
  217. // CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  218. // if( pWnd == NULL
  219. // || pWnd->IsKindOf( RUNTIME_CLASS( CFrameWnd ) )
  220. // )
  221. // break;
  222. // CExtControlBar * pBar = DYNAMIC_DOWNCAST( CExtControlBar, pWnd );
  223. // if( pBar == NULL )
  224. // continue;
  225. // pBar->_DisplayingSet( false );
  226. // }
  227. pExtBar->OnRepositionSingleChild();
  228. } // for( INT nBar = 0; nBar < nRowSize; nBar++ )
  229. } // for( nRow = 0; nRow < nRowsCount; nRow ++ )
  230. }
  231. IMPLEMENT_DYNCREATE(CExtDynControlBar, CExtControlBar);
  232. BEGIN_MESSAGE_MAP(CExtDynControlBar, CExtControlBar)
  233. //{{AFX_MSG_MAP(CExtDynControlBar)
  234. ON_WM_CREATE()
  235. //}}AFX_MSG_MAP
  236. END_MESSAGE_MAP()
  237. CExtDynControlBar::CExtDynControlBar()
  238. : m_pWndDynDocker( NULL )
  239. , m_bHelperDockSiteModified( false )
  240. , m_nDelVisUpdateCounter( 0 )
  241. {
  242. m_bAppearInDockSiteControlBarPopupMenu = false;
  243. m_bAutoDelete = TRUE;
  244. }
  245. CExtDockDynBar * CExtDynControlBar::OnCreateDynamicDockBarObject()
  246. {
  247. return ( new CExtDockDynBar( 0 ) );
  248. }
  249. void CExtDynControlBar::PostNcDestroy()
  250. {
  251. CExtControlBar::PostNcDestroy();
  252. }
  253. BOOL CExtDynControlBar::DestroyWindow()
  254. {
  255. return CExtControlBar::DestroyWindow();
  256. }
  257. LRESULT CExtDynControlBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  258. {
  259. // if( m_pDockSite != NULL
  260. // && m_pDockSite->IsKindOf( RUNTIME_CLASS(CMDIChildWnd) )
  261. // )
  262. // {
  263. // if( message == WM_DESTROY )
  264. // {
  265. // //#ifdef _DEBUG
  266. // // if( m_pDockSite != NULL )
  267. // // {
  268. // // ASSERT( m_pDockSite->m_listControlBars.Find(this) == NULL );
  269. // // }
  270. // //#endif
  271. // if( m_pDockContext != NULL )
  272. // {
  273. // m_pDockBar = NULL;
  274. // delete m_pDockContext;
  275. // m_pDockContext = NULL;
  276. // }
  277. // if( m_pWndDynDocker->GetSafeHwnd() != NULL )
  278. // {
  279. // m_pWndDynDocker->m_arrBars.RemoveAll();
  280. // m_pWndDynDocker->m_arrBars.Add( NULL );
  281. // }
  282. // }
  283. // else if( message == WM_SIZE || WM_WINDOWPOSCHANGED )
  284. // {
  285. // if(! m_bHelperDockSiteModified )
  286. // {
  287. // if( m_pDockSite != NULL )
  288. // {
  289. // POSITION pos = m_pDockSite->m_listControlBars.Find( this );
  290. // if( pos != NULL )
  291. // {
  292. // m_pDockSite->m_listControlBars.RemoveAt( pos );
  293. // m_bHelperDockSiteModified = true;
  294. // }
  295. // CFrameWnd * pFrame = GetParentFrame();
  296. // if( pFrame != m_pDockSite )
  297. // {
  298. // pos = pFrame->m_listControlBars.Find( this );
  299. // if( pos != NULL )
  300. // pFrame->m_listControlBars.RemoveAt( pos );
  301. // }
  302. // }
  303. // }
  304. // }
  305. // }
  306. LRESULT lResult =
  307. CExtControlBar::WindowProc( message,  wParam,  lParam );
  308. return lResult;
  309. }
  310. int CExtDynControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  311. {
  312. if( CExtControlBar::OnCreate(lpCreateStruct) == -1 )
  313. {
  314. ASSERT( FALSE );
  315. return -1;
  316. }
  317. UINT nOwnID = GetDlgCtrlID();
  318. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  319. if( IsKindOf( RUNTIME_CLASS(CExtDynTabControlBar) )
  320. && nOwnID == AFX_IDW_DOCKBAR_FLOAT
  321. )
  322. {
  323. nOwnID = AFX_IDW_DOCKBAR_TOP;
  324. SetDlgCtrlID( nOwnID );
  325. }
  326. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  327. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nOwnID );
  328. ASSERT( m_pWndDynDocker == NULL );
  329. m_pWndDynDocker = OnCreateDynamicDockBarObject();
  330. ASSERT( m_pWndDynDocker != NULL );
  331. CFrameWnd * pParentFrame =
  332. STATIC_DOWNCAST( CFrameWnd, GetParent() );
  333. ASSERT_VALID( pParentFrame );
  334. if( !m_pWndDynDocker->Create(
  335. pParentFrame,
  336. WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN
  337. |CBRS_ALIGN_TOP //|CBRS_ALIGN_ANY
  338. |CBRS_BORDER_ANY
  339. ,
  340. nOwnID
  341. )
  342. )
  343. {
  344. ASSERT( FALSE );
  345. return -1;
  346. }
  347. m_pWndDynDocker->SetParent( this );
  348. EnableToolTips();
  349. return 0;
  350. }
  351. bool CExtDynControlBar::NcButtons_HandleClick(
  352. CExtBarNcAreaButton * pNcAreaButton,
  353. CPoint point,
  354. CExtControlBar * pBarEventSource,
  355. CExtControlBar * pBarActiveInContainer
  356. )
  357. {
  358. ASSERT_VALID( this );
  359. #ifdef _DEBUG
  360. if( pBarEventSource != NULL )
  361. {
  362. ASSERT_VALID( pNcAreaButton );
  363. }
  364. if( pBarEventSource != NULL )
  365. {
  366. ASSERT_VALID( pBarEventSource );
  367. }
  368. #endif // _DEBUG
  369. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  370. CExtControlBar * pActiveInTabbedBar = NULL;
  371. CExtDynTabControlBar * pTabbedBar = NULL;
  372. if( CExtControlBar::g_bCloseOnlyOneBarInTabGroup )
  373. {
  374. pTabbedBar =
  375. DYNAMIC_DOWNCAST( CExtDynTabControlBar, this );
  376. if( pTabbedBar != NULL )
  377. {
  378. LONG nTabSel = pTabbedBar->GetSwitcherSelection();
  379. if( nTabSel >= 0 )
  380. pActiveInTabbedBar = pTabbedBar->GetBarAt( nTabSel, true );
  381. } // if( pTabbedBar != NULL )
  382. } // if( CExtControlBar::g_bCloseOnlyOneBarInTabGroup )
  383. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  384. bool bRetVal = false;
  385. HWND hWndOwn = GetSafeHwnd();
  386. ASSERT( hWndOwn != NULL && ::IsWindow( hWndOwn ) );
  387. CExtDockDynBar * _pWndDynDocker = m_pWndDynDocker;
  388. ASSERT_VALID( _pWndDynDocker );
  389. HWND hWndDynDocker = _pWndDynDocker->GetSafeHwnd();
  390. ASSERT( hWndDynDocker != NULL && ::IsWindow( hWndDynDocker ) );
  391. INT nBar, nCount = (INT)_pWndDynDocker->m_arrBars.GetSize();
  392. CList < HWND, HWND > _listWndsToNotify;
  393. for( nBar = 0; nBar < nCount; nBar++ )
  394. {
  395. CControlBar * pBar = (CControlBar *)
  396. _pWndDynDocker->m_arrBars[nBar];
  397. if( pBar == NULL )
  398. continue;
  399. if( __PLACEHODLER_BAR_PTR(pBar) )
  400. continue;
  401. CExtControlBar * pExtBar =
  402. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  403. if( pExtBar == NULL )
  404. continue;
  405. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  406. if( CExtControlBar::g_bCloseOnlyOneBarInTabGroup && pTabbedBar != NULL )
  407. {
  408. if( pExtBar != pActiveInTabbedBar )
  409. continue;
  410. } // if( CExtControlBar::g_bCloseOnlyOneBarInTabGroup && pTabbedBar != NULL )
  411. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  412. ASSERT( pExtBar->GetSafeHwnd() != NULL );
  413. _listWndsToNotify.AddTail( pExtBar->m_hWnd );
  414. } // for( nBar = 0; nBar < nCount; nBar++ )
  415. POSITION pos = _listWndsToNotify.GetHeadPosition();
  416. HWND hWndBarEventSource = pBarEventSource->GetSafeHwnd();
  417. for( ; pos != NULL; )
  418. {
  419. HWND hWnd = _listWndsToNotify.GetNext( pos );
  420. if( ! ::IsWindow( hWnd ) )
  421. continue;
  422. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  423. if( pWnd == NULL )
  424. continue;
  425. CExtControlBar * pExtBar =
  426. DYNAMIC_DOWNCAST( CExtControlBar, pWnd );
  427. if( pExtBar == NULL )
  428. continue;
  429. if( pExtBar->NcButtons_HandleClick(
  430. pNcAreaButton,
  431. point,
  432. pBarEventSource,
  433. pBarActiveInContainer
  434. )
  435. )
  436. bRetVal = true;
  437. if( ! :: IsWindow( hWndBarEventSource ) )
  438. {
  439. pNcAreaButton = NULL;
  440. pBarEventSource = NULL;
  441. pBarActiveInContainer = NULL;
  442. }
  443. } // for( ; pos != NULL; )
  444. if( ! ::IsWindow( hWndOwn ) )
  445. return true;
  446. if( CWnd::FromHandlePermanent( hWndOwn ) != this )
  447. return true;
  448. if( ! ::IsWindow( hWndDynDocker ) )
  449. return true;
  450. if( CWnd::FromHandlePermanent( hWndDynDocker ) != _pWndDynDocker )
  451. return true;
  452. if( ! bRetVal )
  453. {
  454. if( ! CExtControlBar::NcButtons_HandleClick(
  455. pNcAreaButton,
  456. point,
  457. pBarEventSource,
  458. pBarActiveInContainer
  459. )
  460. )
  461. bRetVal = false;
  462. } // if( ! bRetVal )
  463. return bRetVal;
  464. }
  465. void CExtDynControlBar::OnRepositionSingleChild(
  466. int cx, // = -1 // if negative - get from client area
  467. int cy, // = -1
  468. bool bRedraw // = true
  469. )
  470. {
  471. ASSERT_VALID( this );
  472. if( m_pWndDynDocker->GetSafeHwnd() == NULL )
  473. return;
  474. ASSERT_VALID( m_pWndDynDocker );
  475. CRect rcCurrent;
  476. m_pWndDynDocker->GetWindowRect( &rcCurrent );
  477. ScreenToClient( &rcCurrent );
  478. CRect rcClient;
  479. if( cx < 0 || cy < 0 )
  480. GetClientRect( &rcClient );
  481. else
  482. rcClient.SetRect( 0, 0, cx, cy );
  483. if( rcCurrent != rcClient )
  484. m_pWndDynDocker->MoveWindow( &rcClient, bRedraw ? TRUE : FALSE );
  485. else if( bRedraw )
  486. {
  487. CExtDockDynBar::VisibleLayout_t _vl;
  488. m_pWndDynDocker->_VisibleLayoutBuild( _vl );
  489. CSize _size = rcClient.Size();
  490. if( (! _vl.IsEmpty() ) && _size.cx > 0 && _size.cy > 0 )
  491. {
  492. m_pWndDynDocker->m_bHelperSizing = true;
  493. m_pWndDynDocker->_VisibleLayoutAlign( _vl, _size );
  494. }
  495. }
  496. m_pWndDynDocker->OnDynamicLayoutUpdate();
  497. }
  498. void CExtDynControlBar::NcButtons_PostClick(
  499. CExtBarNcAreaButton * pNcAreaButton,
  500. CPoint point,
  501. CExtControlBar * pBarEventSource,
  502. CExtControlBar * pBarActiveInContainer
  503. )
  504. {
  505. ASSERT_VALID( this );
  506. #ifdef _DEBUG
  507. if( pBarEventSource != NULL )
  508. {
  509. ASSERT_VALID( pNcAreaButton );
  510. }
  511. if( pBarEventSource != NULL )
  512. {
  513. ASSERT_VALID( pBarEventSource );
  514. }
  515. #endif // _DEBUG
  516. HWND hWndOwn = GetSafeHwnd();
  517. ASSERT( hWndOwn != NULL && ::IsWindow( hWndOwn ) );
  518. CExtDockDynBar * _pWndDynDocker = m_pWndDynDocker;
  519. ASSERT_VALID( _pWndDynDocker );
  520. HWND hWndDynDocker = _pWndDynDocker->GetSafeHwnd();
  521. ASSERT( hWndDynDocker != NULL && ::IsWindow( hWndDynDocker ) );
  522. INT nBar, nCount = (INT)_pWndDynDocker->m_arrBars.GetSize();
  523. CList < HWND, HWND > _listWndsToNotify;
  524. for( nBar = 0; nBar < nCount; nBar++ )
  525. {
  526. CControlBar * pBar = (CControlBar *)
  527. _pWndDynDocker->m_arrBars[nBar];
  528. if( pBar == NULL )
  529. continue;
  530. if( __PLACEHODLER_BAR_PTR(pBar) )
  531. continue;
  532. CExtControlBar * pExtBar =
  533. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  534. if( pExtBar == NULL )
  535. continue;
  536. ASSERT( pExtBar->GetSafeHwnd() != NULL );
  537. _listWndsToNotify.AddTail( pExtBar->m_hWnd );
  538. } // for( nBar = 0; nBar < nCount; nBar++ )
  539. POSITION pos = _listWndsToNotify.GetHeadPosition();
  540. HWND hWndBarEventSource = pBarEventSource->GetSafeHwnd();
  541. for( ; pos != NULL; )
  542. {
  543. HWND hWnd = _listWndsToNotify.GetNext( pos );
  544. if( ! ::IsWindow( hWnd ) )
  545. continue;
  546. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  547. if( pWnd == NULL )
  548. continue;
  549. CExtControlBar * pExtBar =
  550. DYNAMIC_DOWNCAST( CExtControlBar, pWnd );
  551. if( pExtBar == NULL )
  552. continue;
  553. pExtBar->NcButtons_PostClick(
  554. pNcAreaButton,
  555. point,
  556. pBarEventSource,
  557. pBarActiveInContainer
  558. );
  559. if( ! ::IsWindow( hWndOwn ) )
  560. return;
  561. if( CWnd::FromHandlePermanent( hWndOwn ) != this )
  562. return;
  563. if( ! ::IsWindow( hWndDynDocker ) )
  564. return;
  565. if( CWnd::FromHandlePermanent( hWndDynDocker ) != _pWndDynDocker )
  566. return;
  567. if( ! :: IsWindow( hWndBarEventSource ) )
  568. {
  569. pNcAreaButton = NULL;
  570. pBarEventSource = NULL;
  571. pBarActiveInContainer = NULL;
  572. }
  573. } // for( ; pos != NULL; )
  574. if( ! ::IsWindow( hWndOwn ) )
  575. return;
  576. if( CWnd::FromHandlePermanent( hWndOwn ) != this )
  577. return;
  578. if( ! ::IsWindow( hWndDynDocker ) )
  579. return;
  580. if( CWnd::FromHandlePermanent( hWndDynDocker ) != _pWndDynDocker )
  581. return;
  582. CExtControlBar::NcButtons_PostClick(
  583. pNcAreaButton,
  584. point,
  585. pBarEventSource,
  586. pBarActiveInContainer
  587. );
  588. }
  589. bool CExtDynControlBar::NcButtons_HandleQueryVisibility(
  590. bool & bButtonIsVisible,
  591. CExtBarNcAreaButton * pNcAreaButton,
  592. CExtControlBar * pBarEventSource,
  593. CExtControlBar * pBarActiveInContainer
  594. )
  595. {
  596. ASSERT_VALID( this );
  597. ASSERT_VALID( pNcAreaButton );
  598. ASSERT_VALID( pBarEventSource );
  599. #if (defined _DEBUG)
  600. if( pBarActiveInContainer != NULL )
  601. {
  602. ASSERT_VALID( pBarActiveInContainer );
  603. }
  604. #endif // (defined _DEBUG)
  605. ASSERT_VALID( m_pWndDynDocker );
  606. INT nBar, nCount = (INT)m_pWndDynDocker->m_arrBars.GetSize();
  607. for( nBar = 0; nBar < nCount; nBar++ )
  608. {
  609. CControlBar * pBar = (CControlBar *)
  610. m_pWndDynDocker->m_arrBars[nBar];
  611. if( pBar == NULL )
  612. continue;
  613. if( __PLACEHODLER_BAR_PTR(pBar) )
  614. continue;
  615. CExtControlBar * pExtBar =
  616. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  617. if( pExtBar == NULL )
  618. continue;
  619. if( pExtBar->NcButtons_HandleQueryVisibility(
  620. bButtonIsVisible,
  621. pNcAreaButton,
  622. pBarEventSource,
  623. pBarActiveInContainer
  624. )
  625. )
  626. return true;
  627. } // for( nBar = 0; nBar < nCount; nBar++ )
  628. return
  629. CExtControlBar::NcButtons_HandleQueryVisibility(
  630. bButtonIsVisible,
  631. pNcAreaButton,
  632. pBarEventSource,
  633. pBarActiveInContainer
  634. );
  635. }
  636. bool CExtDynControlBar::NcButtons_HandleDraw(
  637. CDC & dc,
  638. CExtBarNcAreaButton * pNcAreaButton,
  639. CExtControlBar * pBarEventSource,
  640. CExtControlBar * pBarActiveInContainer
  641. )
  642. {
  643. ASSERT_VALID( this );
  644. ASSERT_VALID( pNcAreaButton );
  645. ASSERT_VALID( pBarEventSource );
  646. #if (defined _DEBUG)
  647. if( pBarActiveInContainer != NULL )
  648. {
  649. ASSERT_VALID( pBarActiveInContainer );
  650. }
  651. #endif // (defined _DEBUG)
  652. ASSERT_VALID( m_pWndDynDocker );
  653. INT nBar, nCount = (INT)m_pWndDynDocker->m_arrBars.GetSize();
  654. for( nBar = 0; nBar < nCount; nBar++ )
  655. {
  656. CControlBar * pBar = (CControlBar *)
  657. m_pWndDynDocker->m_arrBars[nBar];
  658. if( pBar == NULL )
  659. continue;
  660. if( __PLACEHODLER_BAR_PTR(pBar) )
  661. continue;
  662. CExtControlBar * pExtBar =
  663. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  664. if( pExtBar == NULL )
  665. continue;
  666. if( pExtBar->NcButtons_HandleDraw(
  667. dc,
  668. pNcAreaButton,
  669. pBarEventSource,
  670. pBarActiveInContainer
  671. )
  672. )
  673. return true;
  674. } // for( nBar = 0; nBar < nCount; nBar++ )
  675. return
  676. CExtControlBar::NcButtons_HandleDraw(
  677. dc,
  678. pNcAreaButton,
  679. pBarEventSource,
  680. pBarActiveInContainer
  681. );
  682. }
  683. bool CExtDynControlBar::NcButtons_HandleHitTest(
  684. UINT & nExternalHT,
  685. CPoint point,
  686. CExtBarNcAreaButton * pNcAreaButton,
  687. CExtControlBar * pBarEventSource,
  688. CExtControlBar * pBarActiveInContainer
  689. )
  690. {
  691. ASSERT_VALID( this );
  692. ASSERT_VALID( pNcAreaButton );
  693. ASSERT_VALID( pBarEventSource );
  694. #if (defined _DEBUG)
  695. if( pBarActiveInContainer != NULL )
  696. {
  697. ASSERT_VALID( pBarActiveInContainer );
  698. }
  699. #endif // (defined _DEBUG)
  700. ASSERT_VALID( m_pWndDynDocker );
  701. INT nBar, nCount = (INT)m_pWndDynDocker->m_arrBars.GetSize();
  702. for( nBar = 0; nBar < nCount; nBar++ )
  703. {
  704. CControlBar * pBar = (CControlBar *)
  705. m_pWndDynDocker->m_arrBars[nBar];
  706. if( pBar == NULL )
  707. continue;
  708. if( __PLACEHODLER_BAR_PTR(pBar) )
  709. continue;
  710. CExtControlBar * pExtBar =
  711. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  712. if( pExtBar == NULL )
  713. continue;
  714. if( pExtBar->NcButtons_HandleHitTest(
  715. nExternalHT,
  716. point,
  717. pNcAreaButton,
  718. pBarEventSource,
  719. pBarActiveInContainer
  720. )
  721. )
  722. return true;
  723. } // for( nBar = 0; nBar < nCount; nBar++ )
  724. return
  725. CExtControlBar::NcButtons_HandleHitTest(
  726. nExternalHT,
  727. point,
  728. pNcAreaButton,
  729. pBarEventSource,
  730. pBarActiveInContainer
  731. );
  732. }
  733. bool CExtDynControlBar::NcButtons_HandleQueryCursor(
  734. HCURSOR & hExternalCursor,
  735. CPoint point,
  736. CExtBarNcAreaButton * pNcAreaButton,
  737. CExtControlBar * pBarEventSource,
  738. CExtControlBar * pBarActiveInContainer
  739. )
  740. {
  741. ASSERT_VALID( this );
  742. ASSERT_VALID( pNcAreaButton );
  743. ASSERT_VALID( pBarEventSource );
  744. #if (defined _DEBUG)
  745. if( pBarActiveInContainer != NULL )
  746. {
  747. ASSERT_VALID( pBarActiveInContainer );
  748. }
  749. #endif // (defined _DEBUG)
  750. ASSERT_VALID( m_pWndDynDocker );
  751. INT nBar, nCount = (INT)m_pWndDynDocker->m_arrBars.GetSize();
  752. for( nBar = 0; nBar < nCount; nBar++ )
  753. {
  754. CControlBar * pBar = (CControlBar *)
  755. m_pWndDynDocker->m_arrBars[nBar];
  756. if( pBar == NULL )
  757. continue;
  758. if( __PLACEHODLER_BAR_PTR(pBar) )
  759. continue;
  760. CExtControlBar * pExtBar =
  761. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  762. if( pExtBar == NULL )
  763. continue;
  764. if( pExtBar->NcButtons_HandleQueryCursor(
  765. hExternalCursor,
  766. point,
  767. pNcAreaButton,
  768. pBarEventSource,
  769. pBarActiveInContainer
  770. )
  771. )
  772. return true;
  773. } // for( nBar = 0; nBar < nCount; nBar++ )
  774. return
  775. CExtControlBar::NcButtons_HandleQueryCursor(
  776. hExternalCursor,
  777. point,
  778. pNcAreaButton,
  779. pBarEventSource,
  780. pBarActiveInContainer
  781. );
  782. }
  783. bool CExtDynControlBar::NcButtons_HandleReposition(
  784. CExtBarNcAreaButton * pPrevBtn,
  785. CExtBarNcAreaButton * pNcAreaButton,
  786. CExtControlBar * pBarEventSource,
  787. CExtControlBar * pBarActiveInContainer
  788. )
  789. {
  790. ASSERT_VALID( this );
  791. ASSERT_VALID( pNcAreaButton );
  792. ASSERT_VALID( pBarEventSource );
  793. #if (defined _DEBUG)
  794. if( pPrevBtn != NULL )
  795. {
  796. ASSERT_VALID( pPrevBtn );
  797. }
  798. #endif // (defined _DEBUG)
  799. #if (defined _DEBUG)
  800. if( pBarActiveInContainer != NULL )
  801. {
  802. ASSERT_VALID( pBarActiveInContainer );
  803. }
  804. #endif // (defined _DEBUG)
  805. ASSERT_VALID( m_pWndDynDocker );
  806. INT nBar, nCount = (INT)m_pWndDynDocker->m_arrBars.GetSize();
  807. for( nBar = 0; nBar < nCount; nBar++ )
  808. {
  809. CControlBar * pBar = (CControlBar *)
  810. m_pWndDynDocker->m_arrBars[nBar];
  811. if( pBar == NULL )
  812. continue;
  813. if( __PLACEHODLER_BAR_PTR(pBar) )
  814. continue;
  815. CExtControlBar * pExtBar =
  816. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  817. if( pExtBar == NULL )
  818. continue;
  819. if( pExtBar->NcButtons_HandleReposition(
  820. pPrevBtn,
  821. pNcAreaButton,
  822. pBarEventSource,
  823. pBarActiveInContainer
  824. )
  825. )
  826. return true;
  827. } // for( nBar = 0; nBar < nCount; nBar++ )
  828. return
  829. CExtControlBar::NcButtons_HandleReposition(
  830. pPrevBtn,
  831. pNcAreaButton,
  832. pBarEventSource,
  833. pBarActiveInContainer
  834. );
  835. }
  836. bool CExtDynControlBar::NcButtons_HandleToolHitTest(
  837. __EXT_MFC_INT_PTR & hExternalToolHT,
  838. CPoint point,
  839. TOOLINFO * pTI,
  840. CExtBarNcAreaButton * pNcAreaButton,
  841. CExtControlBar * pBarEventSource,
  842. CExtControlBar * pBarActiveInContainer
  843. )
  844. {
  845. ASSERT_VALID( this );
  846. ASSERT_VALID( pNcAreaButton );
  847. ASSERT_VALID( pBarEventSource );
  848. #if (defined _DEBUG)
  849. if( pBarActiveInContainer != NULL )
  850. {
  851. ASSERT_VALID( pBarActiveInContainer );
  852. }
  853. #endif // (defined _DEBUG)
  854. ASSERT_VALID( m_pWndDynDocker );
  855. INT nBar, nCount = (INT)m_pWndDynDocker->m_arrBars.GetSize();
  856. for( nBar = 0; nBar < nCount; nBar++ )
  857. {
  858. CControlBar * pBar = (CControlBar *)
  859. m_pWndDynDocker->m_arrBars[nBar];
  860. if( pBar == NULL )
  861. continue;
  862. if( __PLACEHODLER_BAR_PTR(pBar) )
  863. continue;
  864. CExtControlBar * pExtBar =
  865. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  866. if( pExtBar == NULL )
  867. continue;
  868. if( pExtBar->NcButtons_HandleToolHitTest(
  869. hExternalToolHT,
  870. point,
  871. pTI,
  872. pNcAreaButton,
  873. pBarEventSource,
  874. pBarActiveInContainer
  875. )
  876. )
  877. return true;
  878. } // for( nBar = 0; nBar < nCount; nBar++ )
  879. return
  880. CExtControlBar::NcButtons_HandleToolHitTest(
  881. hExternalToolHT,
  882. point,
  883. pTI,
  884. pNcAreaButton,
  885. pBarEventSource,
  886. pBarActiveInContainer
  887. );
  888. }
  889. bool CExtDynControlBar::FlashCaption(
  890. INT nFlashCount, // = -1 // negative value cancels current flashing
  891. INT nStepMilliseconds, // = 250
  892. COLORREF clrFlashText, // = RGB(255,255,255),
  893. COLORREF clrFlashBackground // = RGB(255,0,0)
  894. )
  895. {
  896. ASSERT_VALID( this );
  897. nFlashCount;
  898. nStepMilliseconds;
  899. clrFlashText;
  900. clrFlashBackground;
  901. // control bar containers should not flash their captions
  902. return false;
  903. }
  904. UINT CExtDynControlBar::TearOffCommandGet() const
  905. {
  906. ASSERT_VALID( this );
  907. return 0;
  908. }
  909. void CExtDynControlBar::TearOffCommandSet( UINT nCmdID )
  910. {
  911. ASSERT_VALID( this );
  912. nCmdID;
  913. ASSERT( FALSE );
  914. }
  915. bool CExtDynControlBar::_FloatStateChangingIsEnabled(
  916. const CExtControlBar * pBarQuerySrc
  917. ) const
  918. {
  919. ASSERT_VALID( this );
  920. if( m_pWndDynDocker == NULL )
  921. return CExtControlBar::_FloatStateChangingIsEnabled( pBarQuerySrc );
  922. ASSERT_VALID( m_pWndDynDocker );
  923.   ASSERT_VALID( pBarQuerySrc );
  924. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  925. for( int nBar = 0; nBar < nCount; nBar++ )
  926. {
  927. CControlBar * pBar = (CControlBar *)
  928. m_pWndDynDocker->m_arrBars[nBar];
  929. if( pBar == NULL )
  930. continue;
  931. if( __PLACEHODLER_BAR_PTR(pBar) )
  932. continue;
  933. CExtControlBar * pExtBar =
  934. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  935. if( pExtBar == NULL )
  936. continue;
  937. if( ! pExtBar->_FloatStateChangingIsEnabled( pBarQuerySrc ) )
  938. return false;
  939. } // for( int nBar = 0; nBar < nCount; nBar++ )
  940. return CExtControlBar::_FloatStateChangingIsEnabled( pBarQuerySrc );
  941. }
  942. bool CExtDynControlBar::_NcMenuButtonIsEnabled(
  943. const CExtControlBar * pBarQuerySrc
  944. ) const
  945. {
  946. ASSERT_VALID( this );
  947. if( m_pWndDynDocker == NULL )
  948. return CExtControlBar::_NcMenuButtonIsEnabled( pBarQuerySrc );
  949. ASSERT_VALID( m_pWndDynDocker );
  950.   ASSERT_VALID( pBarQuerySrc );
  951. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  952. for( int nBar = 0; nBar < nCount; nBar++ )
  953. {
  954. CControlBar * pBar = (CControlBar *)
  955. m_pWndDynDocker->m_arrBars[nBar];
  956. if( pBar == NULL )
  957. continue;
  958. if( __PLACEHODLER_BAR_PTR(pBar) )
  959. continue;
  960. CExtControlBar * pExtBar =
  961. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  962. if( pExtBar == NULL )
  963. continue;
  964. if( ! pExtBar->_NcMenuButtonIsEnabled( pBarQuerySrc ) )
  965. return false;
  966. } // for( int nBar = 0; nBar < nCount; nBar++ )
  967. return CExtControlBar::_NcMenuButtonIsEnabled( pBarQuerySrc );
  968. }
  969. bool CExtDynControlBar::_ClosingIsEnabled(
  970. const CExtControlBar * pBarQuerySrc
  971. ) const
  972. {
  973. ASSERT_VALID( this );
  974. if( m_pWndDynDocker == NULL )
  975. return CExtControlBar::_ClosingIsEnabled( pBarQuerySrc );
  976. ASSERT_VALID( m_pWndDynDocker );
  977.   ASSERT_VALID( pBarQuerySrc );
  978. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  979. for( int nBar = 0; nBar < nCount; nBar++ )
  980. {
  981. CControlBar * pBar = (CControlBar *)
  982. m_pWndDynDocker->m_arrBars[nBar];
  983. if( pBar == NULL )
  984. continue;
  985. if( __PLACEHODLER_BAR_PTR(pBar) )
  986. continue;
  987. CExtControlBar * pExtBar =
  988. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  989. if( pExtBar == NULL )
  990. continue;
  991. if( ! pExtBar->_ClosingIsEnabled( pBarQuerySrc ) )
  992. return false;
  993. } // for( int nBar = 0; nBar < nCount; nBar++ )
  994. return CExtControlBar::_ClosingIsEnabled( pBarQuerySrc );
  995. }
  996. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  997. bool CExtDynControlBar::_AutoHidingIsEnabled(
  998. const CExtControlBar * pBarQuerySrc
  999. ) const
  1000. {
  1001. ASSERT_VALID( this );
  1002. if( m_pWndDynDocker == NULL )
  1003. return CExtControlBar::_AutoHidingIsEnabled( pBarQuerySrc );
  1004. ASSERT_VALID( m_pWndDynDocker );
  1005.   ASSERT_VALID( pBarQuerySrc );
  1006. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  1007. for( int nBar = 0; nBar < nCount; nBar++ )
  1008. {
  1009. CControlBar * pBar = (CControlBar *)
  1010. m_pWndDynDocker->m_arrBars[nBar];
  1011. if( pBar == NULL )
  1012. continue;
  1013. if( __PLACEHODLER_BAR_PTR(pBar) )
  1014. continue;
  1015. CExtControlBar * pExtBar =
  1016. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1017. if( pExtBar == NULL )
  1018. continue;
  1019. if( ! pExtBar->_AutoHidingIsEnabled( pBarQuerySrc ) )
  1020. return false;
  1021. } // for( int nBar = 0; nBar < nCount; nBar++ )
  1022. return CExtControlBar::_AutoHidingIsEnabled( pBarQuerySrc );
  1023. }
  1024. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1025. bool CExtDynControlBar::_DraggingIsEnabled(
  1026. const CExtControlBar * pBarQuerySrc
  1027. ) const
  1028. {
  1029. ASSERT_VALID( this );
  1030. if( m_pWndDynDocker == NULL )
  1031. return CExtControlBar::_DraggingIsEnabled( pBarQuerySrc );
  1032. ASSERT_VALID( m_pWndDynDocker );
  1033.   ASSERT_VALID( pBarQuerySrc );
  1034. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  1035. for( int nBar = 0; nBar < nCount; nBar++ )
  1036. {
  1037. CControlBar * pBar = (CControlBar *)
  1038. m_pWndDynDocker->m_arrBars[nBar];
  1039. if( pBar == NULL )
  1040. continue;
  1041. if( __PLACEHODLER_BAR_PTR(pBar) )
  1042. continue;
  1043. CExtControlBar * pExtBar =
  1044. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1045. if( pExtBar == NULL )
  1046. continue;
  1047. if( ! pExtBar->_DraggingIsEnabled( pBarQuerySrc ) )
  1048. return false;
  1049. } // for( int nBar = 0; nBar < nCount; nBar++ )
  1050. return CExtControlBar::_DraggingIsEnabled( pBarQuerySrc );
  1051. }
  1052. bool CExtDynControlBar::_RowResizingIsEnabled(
  1053. const CExtControlBar * pBarQuerySrc
  1054. ) const
  1055. {
  1056. ASSERT_VALID( this );
  1057. if( m_pWndDynDocker == NULL )
  1058. return CExtControlBar::_RowResizingIsEnabled( pBarQuerySrc );
  1059. ASSERT_VALID( m_pWndDynDocker );
  1060.   ASSERT_VALID( pBarQuerySrc );
  1061. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  1062. for( int nBar = 0; nBar < nCount; nBar++ )
  1063. {
  1064. CControlBar * pBar = (CControlBar *)
  1065. m_pWndDynDocker->m_arrBars[nBar];
  1066. if( pBar == NULL )
  1067. continue;
  1068. if( __PLACEHODLER_BAR_PTR(pBar) )
  1069. continue;
  1070. CExtControlBar * pExtBar =
  1071. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1072. if( pExtBar == NULL )
  1073. continue;
  1074. if( ! pExtBar->_RowResizingIsEnabled( pBarQuerySrc ) )
  1075. return false;
  1076. } // for( int nBar = 0; nBar < nCount; nBar++ )
  1077. return CExtControlBar::_RowResizingIsEnabled( pBarQuerySrc );
  1078. }
  1079. bool CExtDynControlBar::_RowRecalcingIsEnabled(
  1080. const CExtControlBar * pBarQuerySrc
  1081. ) const
  1082. {
  1083. ASSERT_VALID( this );
  1084. if( m_pWndDynDocker == NULL )
  1085. return CExtControlBar::_RowRecalcingIsEnabled( pBarQuerySrc );
  1086. ASSERT_VALID( m_pWndDynDocker );
  1087. ASSERT_VALID( pBarQuerySrc );
  1088. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  1089. for( int nBar = 0; nBar < nCount; nBar++ )
  1090. {
  1091. CControlBar * pBar = (CControlBar *)
  1092. m_pWndDynDocker->m_arrBars[nBar];
  1093. if( pBar == NULL )
  1094. continue;
  1095. if( __PLACEHODLER_BAR_PTR(pBar) )
  1096. continue;
  1097. CExtControlBar * pExtBar =
  1098. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1099. if( pExtBar == NULL )
  1100. continue;
  1101. if( ! pExtBar->_RowRecalcingIsEnabled( pBarQuerySrc ) )
  1102. return false;
  1103. } // for( int nBar = 0; nBar < nCount; nBar++ )
  1104. return CExtControlBar::_RowRecalcingIsEnabled( pBarQuerySrc );
  1105. }
  1106. bool CExtDynControlBar::IsBarWithGripper(
  1107. bool * pbGripperAtTop, // = NULL
  1108. bool * pbTextOnGripper // = NULL
  1109. ) const
  1110. {
  1111. ASSERT_VALID( this );
  1112. if( pbGripperAtTop != NULL )
  1113. *pbGripperAtTop = false;
  1114. if( pbTextOnGripper != NULL )
  1115. *pbTextOnGripper = false;
  1116. return false;
  1117. }
  1118. bool CExtDynControlBar::_DisplayingGet() const
  1119. {
  1120. ASSERT_VALID( this );
  1121. ASSERT_VALID( m_pWndDynDocker );
  1122. if( CExtControlBar::_DisplayingGet() )
  1123. return true;
  1124. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  1125. for( int nBar = 0; nBar < nCount; nBar++ )
  1126. {
  1127. CControlBar * pBar = (CControlBar *)
  1128. m_pWndDynDocker->m_arrBars[nBar];
  1129. if( pBar == NULL )
  1130. continue;
  1131. if( __PLACEHODLER_BAR_PTR(pBar) )
  1132. continue;
  1133. CExtControlBar * pExtBar =
  1134. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1135. if( pExtBar != NULL
  1136. && pExtBar->_DisplayingGet()
  1137. )
  1138. return true;
  1139. } // for( int nBar = 0; nBar < nCount; nBar++ )
  1140. return false;
  1141. }
  1142. void CExtDynControlBar::_DisplayingSet( bool bDisplaying )
  1143. {
  1144. ASSERT_VALID( this );
  1145. ASSERT_VALID( m_pWndDynDocker );
  1146. CExtControlBar::_DisplayingSet( bDisplaying );
  1147. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  1148. for( int nBar = 0; nBar < nCount; nBar++ )
  1149. {
  1150. CControlBar * pBar = (CControlBar *)
  1151. m_pWndDynDocker->m_arrBars[nBar];
  1152. if( pBar == NULL )
  1153. continue;
  1154. if( __PLACEHODLER_BAR_PTR(pBar) )
  1155. continue;
  1156. CExtControlBar * pExtBar =
  1157. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1158. if( pExtBar != NULL )
  1159. pExtBar->_DisplayingSet( bDisplaying );
  1160. } // for( int nBar = 0; nBar < nCount; nBar++ )
  1161. }
  1162. void CExtDynControlBar::OnShowControlBarChain(
  1163. bool bShow,
  1164. bool bDelay,
  1165. bool bOnlyOneBar // = false
  1166. )
  1167. {
  1168. ASSERT_VALID( this );
  1169. ASSERT_VALID( m_pWndDynDocker );
  1170. CFrameWnd * pFrame = _GetDockingFrameImpl();
  1171. ASSERT_VALID( pFrame );
  1172. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  1173. for( int nBar = 0; nBar < nCount; nBar++ )
  1174. {
  1175. CControlBar * pBar = (CControlBar *)
  1176. m_pWndDynDocker->m_arrBars[nBar];
  1177. if( pBar == NULL )
  1178. continue;
  1179. if( __PLACEHODLER_BAR_PTR(pBar) )
  1180. continue;
  1181. CExtControlBar * pExtBar =
  1182. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1183. if( pExtBar != NULL )
  1184. pExtBar->OnShowControlBarChain(
  1185. bShow,
  1186. true, //bDelay
  1187. bOnlyOneBar
  1188. );
  1189. else
  1190. pFrame->ShowControlBar(
  1191. pBar,
  1192. bShow ? TRUE : FALSE,
  1193. true //bDelay ? TRUE : FALSE
  1194. );
  1195. } // for( int nBar = 0; nBar < nCount; nBar++ )
  1196. _DisplayingSet( false );
  1197. CExtControlBar::_DisplayingSet( true );
  1198. pFrame->ShowControlBar(
  1199. this,
  1200. bShow ? TRUE : FALSE,
  1201. true // bDelay ? TRUE : FALSE
  1202. );
  1203. if( ! bDelay )
  1204. {
  1205.   CFrameWnd * pFrame = GetParentFrame();
  1206. pFrame->RecalcLayout();
  1207. }
  1208. }
  1209. void CExtDynControlBar::OnControlBarPositionChange(
  1210. CExtControlBar * pBarEventSrc,
  1211. e_control_bar_position_changing_t eCBPC,
  1212. bool bInitial,
  1213. bool bFinal
  1214. )
  1215. {
  1216. ASSERT_VALID( this );
  1217. if( m_pWndDynDocker != NULL )
  1218. {
  1219. ASSERT_VALID( m_pWndDynDocker );
  1220. int nCount = (int)m_pWndDynDocker->m_arrBars.GetSize();
  1221. for( int nBar = 0; nBar < nCount; nBar++ )
  1222. {
  1223. CControlBar * pBar = (CControlBar *)
  1224. m_pWndDynDocker->m_arrBars[nBar];
  1225. if( pBar == NULL )
  1226. continue;
  1227. if( __PLACEHODLER_BAR_PTR(pBar) )
  1228. continue;
  1229. CExtControlBar * pExtBar =
  1230. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1231. if( pExtBar == NULL )
  1232. continue;
  1233. pExtBar->OnControlBarPositionChange(
  1234. pBarEventSrc,
  1235. eCBPC,
  1236. bInitial,
  1237. bFinal
  1238. );
  1239. } // for( int nBar = 0; nBar < nCount; nBar++ )
  1240. } // if( m_pWndDynDocker != NULL )
  1241. CExtControlBar::OnControlBarPositionChange(
  1242. pBarEventSrc,
  1243. eCBPC,
  1244. bInitial,
  1245. bFinal
  1246. );
  1247. }
  1248. void CExtDynControlBar::DoPaintNC( CDC * pDC )
  1249. {
  1250. ASSERT_VALID( this );
  1251. ASSERT_VALID( pDC );
  1252. ASSERT( pDC->GetSafeHdc() != NULL );
  1253. CWnd * pWnd = GetParent();
  1254. if( pWnd->IsKindOf( RUNTIME_CLASS( CExtDockBar ) ) )
  1255. {
  1256. CExtControlBar::DoPaintNC( pDC );
  1257. return;
  1258. }
  1259. CRect rcClient, rcBar;
  1260. GetClientRect( rcClient );
  1261. ClientToScreen( rcClient );
  1262. GetWindowRect( rcBar );
  1263. rcClient.OffsetRect( -rcBar.TopLeft() );
  1264. rcBar.OffsetRect( -rcBar.TopLeft() );
  1265. pDC->ExcludeClipRect( rcClient );
  1266. if( (! PmBridge_GetPM()->GetCb2DbTransparentMode(this) )
  1267. || (! PmBridge_GetPM()->PaintDockerBkgnd( false, *pDC, this ) )
  1268. )
  1269. pDC->FillSolidRect(
  1270. &rcBar,
  1271. PmBridge_GetPM()->GetColor(
  1272. CExtPaintManager::CLR_3DFACE_OUT, this
  1273. )
  1274. );
  1275. }
  1276. void CExtDynControlBar::DoPaint( CDC * pDC )
  1277. {
  1278. CWnd * pWnd = GetParent();
  1279. if( pWnd->IsKindOf( RUNTIME_CLASS( CExtDockBar ) ) )
  1280. {
  1281. CExtControlBar::DoPaint( pDC );
  1282. return;
  1283. }
  1284. if( (! PmBridge_GetPM()->GetCb2DbTransparentMode(this) )
  1285. || (! PmBridge_GetPM()->PaintDockerBkgnd( true, *pDC, this ) )
  1286. )
  1287. {
  1288. CRect rc;
  1289. GetClientRect( &rc );
  1290. pDC->FillSolidRect(
  1291. &rc,
  1292. PmBridge_GetPM()->GetColor(
  1293. CExtPaintManager::CLR_3DFACE_OUT, this
  1294. )
  1295. );
  1296. }
  1297. }
  1298. void CExtDynControlBar::DoEraseBk( CDC * pDC )
  1299. {
  1300. CWnd * pWnd = GetParent();
  1301. if( pWnd->IsKindOf( RUNTIME_CLASS( CExtDockBar ) ) )
  1302. {
  1303. CExtControlBar::DoEraseBk( pDC );
  1304. return;
  1305. }
  1306. if( (! PmBridge_GetPM()->GetCb2DbTransparentMode(this) )
  1307. || (! PmBridge_GetPM()->PaintDockerBkgnd( true, *pDC, this ) )
  1308. )
  1309. {
  1310. CRect rc;
  1311. GetClientRect( &rc );
  1312. pDC->FillSolidRect(
  1313. &rc,
  1314. PmBridge_GetPM()->GetColor(
  1315. CExtPaintManager::CLR_3DFACE_OUT, this
  1316. )
  1317. );
  1318. }
  1319. }
  1320. bool CExtDynControlBar::_CanDockToTabbedContainers(
  1321. CExtControlBar * pDestBar
  1322. ) const
  1323. {
  1324. ASSERT_VALID( this );
  1325. if( ! CExtControlBar::_CanDockToTabbedContainers( pDestBar ) )
  1326. return false;
  1327. if( m_pWndDynDocker == NULL )
  1328. return false;
  1329. for( int i = 0; i < m_pWndDynDocker->m_arrBars.GetSize(); i++ )
  1330. {
  1331. CExtControlBar * pBar = (CExtControlBar *)
  1332. m_pWndDynDocker->m_arrBars[i];
  1333. if( pBar == NULL )
  1334. continue;
  1335. if( __PLACEHODLER_BAR_PTR(pBar) )
  1336. continue;
  1337. ASSERT_VALID( pBar );
  1338. ASSERT_KINDOF( CExtControlBar, pBar );
  1339. if( !pBar->_CanDockToTabbedContainers(pDestBar) )
  1340. return false;
  1341. } // for( int i = 0; i < m_pWndDynDocker->m_arrBars.GetSize(); i++ )
  1342. return true;
  1343. }
  1344. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1345. CExtDynTabControlBar * CExtDynControlBar::_GetNearestTabbedContainer()
  1346. {
  1347. ASSERT_VALID( this );
  1348. return CExtControlBar::_GetNearestTabbedContainer();
  1349. }
  1350. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1351. void CExtDynControlBar::_OnNcMiniFrameActivate( bool bActive )
  1352. {
  1353. ASSERT_VALID( this );
  1354. if( m_pWndDynDocker == NULL )
  1355. return;
  1356. for( int i = 0; i < m_pWndDynDocker->m_arrBars.GetSize(); i++ )
  1357. {
  1358. CExtControlBar * pBar = (CExtControlBar *)
  1359. m_pWndDynDocker->m_arrBars[i];
  1360. if( pBar == NULL )
  1361. continue;
  1362. if( __PLACEHODLER_BAR_PTR(pBar) )
  1363. continue;
  1364. ASSERT_VALID( pBar );
  1365. ASSERT_KINDOF( CExtControlBar, pBar );
  1366. pBar->_OnNcMiniFrameActivate( bActive );
  1367. } // for( int i = 0; i < m_pWndDynDocker->m_arrBars.GetSize(); i++ )
  1368. }
  1369. CSize CExtDynControlBar::_CalcLayoutMinSize() const
  1370. {
  1371. ASSERT_VALID( this );
  1372. CExtDockDynBar * pDockBar = 
  1373. STATIC_DOWNCAST( CExtDockDynBar, GetWindow(GW_CHILD) );
  1374. ASSERT_VALID( pDockBar );
  1375. ASSERT_KINDOF( CExtDockDynBar, pDockBar );
  1376. CExtDockDynBar::VisibleLayout_t _vl;
  1377. pDockBar->_VisibleLayoutBuild( _vl );
  1378. UINT nDockBarID = pDockBar->GetDlgCtrlID();
  1379. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  1380. BOOL bHorz = ( nDockBarID == AFX_IDW_DOCKBAR_TOP || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM );
  1381. CSize _size(
  1382. bHorz ? _vl.m_nTotalMinMetric : _vl.m_nTotalMinExtent,
  1383. bHorz ? _vl.m_nTotalMinExtent : _vl.m_nTotalMinExtent
  1384. );
  1385. return _size;
  1386. }
  1387. INT CExtDynControlBar::_CalcDesiredMinHW() const
  1388. {
  1389. //return _CalcLayoutMinSize().cx;
  1390. if( GetSafeHwnd() == NULL )
  1391. return 0;
  1392. CExtDockDynBar * pDockBar = 
  1393. STATIC_DOWNCAST( CExtDockDynBar, GetWindow(GW_CHILD) );
  1394. ASSERT_VALID( pDockBar );
  1395. ASSERT_KINDOF( CExtDockDynBar, pDockBar );
  1396. INT nRetVal = 0;
  1397. LONG nBarIdx, nBarCount = LONG( pDockBar->m_arrBars.GetSize() );
  1398. for( nBarIdx = 0; nBarIdx < nBarCount; nBarIdx++ )
  1399. {
  1400. CControlBar * pBar = (CControlBar *)
  1401. pDockBar->m_arrBars[ nBarIdx ];
  1402. if( pBar == NULL )
  1403. continue;
  1404. if( __PLACEHODLER_BAR_PTR( pBar ) )
  1405. continue;
  1406. ASSERT_VALID( pBar );
  1407. ASSERT_KINDOF( CControlBar, pBar );
  1408. ASSERT( pBar->m_pDockBar == pDockBar );
  1409. CExtControlBar * pExtBar =
  1410. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1411. if( pExtBar == NULL )
  1412. continue;
  1413. INT nMetric = pExtBar->_CalcDesiredMinHW();
  1414. nRetVal = max( nRetVal, nMetric );
  1415. } // for( nBarIdx = 0; nBarIdx < nBarCount; nBarIdx++ )
  1416. return nRetVal;
  1417. }
  1418. INT CExtDynControlBar::_CalcDesiredMinVH() const
  1419. {
  1420. //return _CalcLayoutMinSize().cy;
  1421. CExtDockDynBar * pDockBar = 
  1422. STATIC_DOWNCAST( CExtDockDynBar, GetWindow(GW_CHILD) );
  1423. ASSERT_VALID( pDockBar );
  1424. ASSERT_KINDOF( CExtDockDynBar, pDockBar );
  1425. INT nRetVal = 0;
  1426. LONG nBarIdx, nBarCount = LONG( pDockBar->m_arrBars.GetSize() );
  1427. for( nBarIdx = 0; nBarIdx < nBarCount; nBarIdx++ )
  1428. {
  1429. CControlBar * pBar = (CControlBar *)
  1430. pDockBar->m_arrBars[ nBarIdx ];
  1431. if( pBar == NULL )
  1432. continue;
  1433. if( __PLACEHODLER_BAR_PTR( pBar ) )
  1434. continue;
  1435. ASSERT_VALID( pBar );
  1436. ASSERT_KINDOF( CControlBar, pBar );
  1437. ASSERT( pBar->m_pDockBar == pDockBar );
  1438. CExtControlBar * pExtBar =
  1439. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  1440. if( pExtBar == NULL )
  1441. continue;
  1442. INT nMetric = pExtBar->_CalcDesiredMinVH();
  1443. nRetVal = max( nRetVal, nMetric );
  1444. } // for( nBarIdx = 0; nBarIdx < nBarCount; nBarIdx++ )
  1445. return nRetVal;
  1446. }
  1447. CSize CExtDynControlBar::_CalcDesiredMinFloatedSize() const
  1448. {
  1449. return _CalcLayoutMinSize();
  1450. }
  1451. bool CExtDynControlBar::_IsDelayedVisibilityUpdateEnabled() const
  1452. {
  1453. ASSERT_VALID( this );
  1454. // return ( m_nDelVisUpdateCounter != 0 ) ? true : false;
  1455. return false;
  1456. }
  1457. void CExtDynControlBar::DelayShow( BOOL bShow )
  1458. {
  1459. ASSERT_VALID( this );
  1460. CExtControlBar::DelayShow( bShow );
  1461. // if( m_bUpdatingChain )
  1462. // return;
  1463. // m_nDelVisUpdateCounter ++;
  1464. // _UpdateVisibilityInChain();
  1465. // _UpdateVisibilityInRow();
  1466. // m_nDelVisUpdateCounter --;
  1467. }
  1468. CSize CExtDynControlBar::CalcDynamicLayout(
  1469. int nLength,
  1470. DWORD nMode
  1471. )
  1472. {
  1473. CSize _size = CExtControlBar::CalcDynamicLayout( nLength, nMode );
  1474. if( m_pDockBar == NULL ) // (+ v.2.23) - shutdown mode
  1475. return _size;
  1476. ASSERT_VALID( m_pDockBar );
  1477. if( ((CExtDockBar *)m_pDockBar)->m_bLayoutQuery )
  1478. return _size;
  1479. if( m_pWndDynDocker->GetSafeHwnd() == NULL )
  1480. return _size;
  1481. INT nDockedVisibleCount = m_pWndDynDocker->GetDockedVisibleCount();
  1482. if( nDockedVisibleCount == 0 )
  1483. {
  1484. m_pDockSite->ShowControlBar( this, FALSE, FALSE );
  1485. _size.cx = _size.cy = 0;
  1486. }
  1487. CFrameWnd * pParentFrame = GetParentFrame();
  1488. if( pParentFrame->IsKindOf( RUNTIME_CLASS( CMiniFrameWnd ) ) )
  1489. {
  1490. ASSERT_VALID( m_pWndDynDocker );
  1491. ASSERT( ::IsWindow( m_pWndDynDocker->GetSafeHwnd() ) );
  1492. //!!//
  1493. // m_pWndDynDocker->OnDynamicLayoutUpdate();
  1494. // pParentFrame->SetWindowPos(
  1495. // NULL, 0, 0, 0, 0,
  1496. // SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  1497. // |SWP_FRAMECHANGED
  1498. // );
  1499. // pParentFrame->SendMessage( WM_NCPAINT );
  1500. ASSERT_VALID( m_pDockBar );
  1501. if( ( ! m_pWndDynDocker->m_bLockedOptimize )
  1502. && pParentFrame == m_pDockBar->GetParent()
  1503. )
  1504. m_pWndDynDocker->OnDynamicLayoutUpdate();
  1505. } // if( ....
  1506. return _size;
  1507. }
  1508. void CExtDockDynBar::OnDynamicLayoutUpdate()
  1509. {
  1510. ASSERT_VALID( this );
  1511. ASSERT_KINDOF( CExtDockDynBar, this );
  1512. if( m_bLockedOptimize )
  1513. return;
  1514. if( m_bInDynamicLayoutUpdate )
  1515. return;
  1516. m_bInDynamicLayoutUpdate = true;
  1517. UINT nDockBarID = GetDlgCtrlID();
  1518. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  1519. BOOL bHorz = ( nDockBarID == AFX_IDW_DOCKBAR_TOP || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM );
  1520. CalcFixedLayout( TRUE, bHorz );
  1521. m_bInDynamicLayoutUpdate = false;
  1522. CExtDockBar::OnDynamicLayoutUpdate();
  1523. }
  1524. void CExtDockDynBar::OnDynamicLayoutOptimize()
  1525. {
  1526. ASSERT_VALID( this );
  1527. ASSERT_VALID( m_pDockSite );
  1528. if( m_bLockedOptimize )
  1529. {
  1530. #ifdef _DEBUG
  1531. #ifdef __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  1532. INT nDockedCount = GetDockedCount();
  1533. ASSERT( nDockedCount != 0 );
  1534. #endif // __DEBUG_LOCKING_OPTIMIZATION_ASSERTS__
  1535. #endif // _DEBUG
  1536. return;
  1537. }
  1538. bool bOptimizeChilds = false;
  1539. INT nSinglePos = -1;
  1540. bool bPlaceHolder = false;
  1541. ASSERT( m_arrBars.GetSize() >= 1 );
  1542. INT nDockedCount = GetDockedCount();
  1543. if( nDockedCount != 0 )
  1544. {
  1545. ASSERT( nDockedCount >= 1 );
  1546. for( INT nBar = 1; nBar < m_arrBars.GetSize(); nBar++ )
  1547. {
  1548. CControlBar * pBar = (CControlBar *)m_arrBars[ nBar ];
  1549. if( pBar == NULL )
  1550. continue;
  1551. if( __PLACEHODLER_BAR_PTR(pBar) )
  1552. {
  1553. if( nSinglePos >= 0 && !bPlaceHolder )
  1554. {
  1555. bOptimizeChilds = true;
  1556. break;
  1557. }
  1558. nSinglePos = nBar;
  1559. bPlaceHolder = true;
  1560. continue;
  1561. }
  1562. else
  1563. {
  1564. ASSERT_VALID( pBar );
  1565. ASSERT_KINDOF( CControlBar, pBar );
  1566. if( nSinglePos >= 0 )
  1567. {
  1568. bOptimizeChilds = true;
  1569. break;
  1570. }
  1571. nSinglePos = nBar;
  1572. }
  1573. } // for( INT nBar = 1; nBar < m_arrBars.GetSize(); nBar++ )
  1574. } // if( nDockedCount != 0 )
  1575. if( bOptimizeChilds )
  1576. {
  1577. CExtDockBar::OnDynamicLayoutOptimize();
  1578. return;
  1579. }
  1580. CFrameWnd * pDockSite = m_pDockSite;
  1581. CMiniFrameWnd * pMiniFrame =
  1582. DYNAMIC_DOWNCAST(
  1583. CMiniFrameWnd,
  1584. GetParentFrame()
  1585. );
  1586. if( pMiniFrame != NULL )
  1587. pMiniFrame->DelayRecalcLayout();
  1588. CExtDynControlBar * pDynBar =
  1589. STATIC_DOWNCAST( CExtDynControlBar, GetParent() );
  1590. ASSERT_VALID( pDynBar );
  1591. ASSERT( pDockSite == pDynBar->m_pDockSite );
  1592. CDockBar * pDockBarParent = 
  1593. STATIC_DOWNCAST( CDockBar, pDynBar->GetParent() );
  1594. ASSERT_VALID( pDockBarParent );
  1595. ASSERT( pDockSite == pDockBarParent->m_pDockSite );
  1596. HWND hWndOwn = GetSafeHwnd();
  1597. if( nSinglePos == -1 )
  1598. { // optimizing empty dynamic docker
  1599. pDynBar->m_pDockBar = NULL;
  1600. // pDockSite->RemoveControlBar( pDynBar );
  1601. pDockSite->RemoveControlBar( this );
  1602. ASSERT( pDynBar->m_bAutoDelete );
  1603. HWND hWndDynBar = pDynBar->GetSafeHwnd();
  1604. pDockBarParent->RemoveControlBar( pDynBar );
  1605. if( ::IsWindow(hWndDynBar) )
  1606. pDynBar->DestroyWindow();
  1607. if( pMiniFrame == NULL )
  1608. pDockSite->DelayRecalcLayout();
  1609. ASSERT( pDockSite->m_listControlBars.Find(pDynBar) == NULL );
  1610. if( ! ( ::IsWindow(hWndOwn) ) )
  1611. return;
  1612. if( pDockBarParent->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  1613. ((CExtDockBar *)pDockBarParent)->OnDynamicLayoutUpdate();
  1614. return;
  1615. } // optimizing empty dynamic docker
  1616. if( bPlaceHolder )
  1617. { // optimizing placeholder dynamic docker
  1618. return;
  1619. } // optimizing placeholder dynamic docker
  1620. // optimizing singlebar dynamic docker
  1621. CExtControlBar * pSingleBar = (CExtControlBar *)m_arrBars[ nSinglePos ];
  1622. ASSERT_VALID( pSingleBar );
  1623. ASSERT_KINDOF( CExtControlBar, pSingleBar );
  1624. ASSERT( !pSingleBar->IsFixedMode() );
  1625. CRect wrSingleBar;
  1626. pDynBar->GetWindowRect( &wrSingleBar );
  1627. CSize sizeSingleBar = wrSingleBar.Size();
  1628. INT nDynPos = pDockBarParent->FindBar( pDynBar );
  1629. ASSERT( nDynPos > 0 );
  1630. pDockBarParent->m_arrBars[ nDynPos ] = pSingleBar;
  1631. pSingleBar->m_pDockBar = pDockBarParent;
  1632. if( pSingleBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  1633. && !((CExtControlBar*)pSingleBar)->IsFixedMode()
  1634. )
  1635. {
  1636. if( pDockBarParent->GetBarStyle() & CBRS_ORIENT_HORZ )
  1637. ((CExtControlBar*)pSingleBar)->
  1638. SetInitDesiredSizeHorizontal( sizeSingleBar );
  1639. else
  1640. ((CExtControlBar*)pSingleBar)->
  1641. SetInitDesiredSizeVertical( sizeSingleBar );
  1642. DWORD dwStyle = pSingleBar->GetBarStyle();
  1643. dwStyle &= ~(CBRS_ALIGN_ANY);
  1644. dwStyle |=  (pDynBar->m_dwStyle & CBRS_ALIGN_ANY) | CBRS_BORDER_ANY;
  1645. pSingleBar->SetBarStyle( dwStyle );
  1646. }
  1647. m_arrBars.RemoveAll();
  1648. m_arrBars.Add( (CControlBar *)NULL );
  1649. pSingleBar->SetParent( pDockBarParent );
  1650. pSingleBar->m_pDockBar = pDockBarParent;
  1651. pDynBar->m_pDockBar = NULL;
  1652. // pDockSite->RemoveControlBar( pDynBar );
  1653. pDockSite->RemoveControlBar( this );
  1654. ASSERT( pDynBar->m_bAutoDelete );
  1655. pDynBar->DestroyWindow();
  1656. /*
  1657. // pSingleBar->m_bUpdatingChain = true;
  1658. pDockBarParent->ScreenToClient( &wrSingleBar );
  1659. pSingleBar->SetWindowPos(
  1660. NULL,
  1661. wrSingleBar.left, wrSingleBar.top,
  1662. sizeSingleBar.cx, sizeSingleBar.cy,
  1663. SWP_NOZORDER|SWP_NOOWNERZORDER
  1664. |SWP_NOACTIVATE
  1665. |SWP_FRAMECHANGED
  1666. //|SWP_NOREDRAW
  1667. );
  1668. // pSingleBar->m_bUpdatingChain = false;
  1669. */
  1670. if( pMiniFrame == NULL )
  1671. pDockSite->DelayRecalcLayout();
  1672. ASSERT( pDockSite->m_listControlBars.Find(pDynBar) == NULL );
  1673. if( pDockBarParent->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  1674. ((CExtDockBar *)pDockBarParent)->OnDynamicLayoutUpdate();
  1675. }
  1676. CSize CExtDockDynBar::CalcFixedLayout(
  1677. BOOL bStretch,
  1678. BOOL bHorz
  1679. )
  1680. {
  1681. ASSERT_VALID( this );
  1682. ASSERT( ! m_bFloating );
  1683. bHorz;
  1684. VisibleLayout_t _vl;
  1685. _VisibleLayoutBuild( _vl );
  1686. CRect rect;
  1687. GetWindowRect( &rect );
  1688. CSize _size = rect.Size();
  1689. if( (! _vl.IsEmpty() ) && bStretch && _size.cx > 0 && _size.cy > 0 )
  1690. _VisibleLayoutAlign( _vl, _size );
  1691. return _size;
  1692. }
  1693. void CExtDockDynBar::CalcOrderedVector(
  1694. ExtControlBarVector_t & vBars
  1695. )
  1696. {
  1697. ASSERT_VALID( this );
  1698. INT nCount = (INT)m_arrBars.GetSize();
  1699. ASSERT( nCount > 0 );
  1700. ASSERT( m_arrBars[0] == NULL );
  1701. for( INT nBar = 1; nBar < nCount; nBar++ )
  1702. {
  1703. CExtControlBar * pBar = (CExtControlBar *) m_arrBars[nBar];
  1704. if( pBar == NULL )
  1705. continue;
  1706. if( __PLACEHODLER_BAR_PTR( pBar ) )
  1707. continue;
  1708. ASSERT_VALID( pBar );
  1709. ASSERT_KINDOF( CExtControlBar, pBar );
  1710. ASSERT( !pBar->IsFixedMode() );
  1711. vBars.Add( pBar );
  1712. } // for( INT nBar = 1; nBar < nCount; nBar++ )
  1713. }
  1714. void CExtDockDynBar::OnSize(UINT nType, int cx, int cy) 
  1715. {
  1716. m_bHelperSizing = true;
  1717. CExtDockBar::OnSize(nType, cx, cy);
  1718. if( (! m_bHelperDockSiteModified )
  1719. && m_pDockSite != NULL
  1720. )
  1721. {
  1722. POSITION pos = m_pDockSite->m_listControlBars.Find( this );
  1723. if( pos != NULL )
  1724. {
  1725. m_pDockSite->m_listControlBars.RemoveAt( pos );
  1726. m_bHelperDockSiteModified = true;
  1727. }
  1728. }
  1729. /*
  1730. if( nType == SIZE_MINIMIZED )
  1731. return;
  1732. if( cx <= 0 || cy <= 0 )
  1733. return;
  1734. OnDynamicLayoutUpdate();
  1735. */
  1736. }
  1737. BOOL CExtDockDynBar::PreTranslateMessage(MSG* pMsg)
  1738. {
  1739. return CExtDockBar::PreTranslateMessage(pMsg);
  1740. }
  1741. /////////////////////////////////////////////////////////////////////////
  1742. // CExtDockOuterBar::OuterLayoutItemData
  1743. void CExtDockOuterBar::OuterLayoutItemData::_AssignFromOther(
  1744. const CExtDockOuterBar::OuterLayoutItemData & other
  1745. )
  1746. {
  1747. m_pBar = other.m_pBar;
  1748. m_bVisible = other.m_bVisible;
  1749. m_sizeCalcDynamic = other.m_sizeCalcDynamic;
  1750. m_sizeBarMin = other.m_sizeBarMin;
  1751. m_rcPreCalc = other.m_rcPreCalc;
  1752. m_rcReal = other.m_rcReal;
  1753. }
  1754. CExtDockOuterBar::OuterLayoutItemData::OuterLayoutItemData()
  1755. : m_pBar( NULL )
  1756. , m_bVisible( false )
  1757. , m_sizeCalcDynamic( 0, 0 )
  1758. , m_sizeBarMin( 0, 0 )
  1759. , m_rcPreCalc( 0, 0, 0, 0 )
  1760. , m_rcReal( 0, 0, 0, 0 )
  1761. {
  1762. }
  1763. CExtDockOuterBar::OuterLayoutItemData::OuterLayoutItemData(
  1764. CControlBar * pBar,
  1765. BOOL bHorz,
  1766. const SIZE & sizeMax
  1767. )
  1768. : m_pBar( pBar )
  1769. , m_sizeCalcDynamic( 0, 0 )
  1770. , m_sizeBarMin( 0, 0 )
  1771. , m_rcPreCalc( 0, 0, 0, 0 )
  1772. , m_rcReal( 0, 0, 0, 0 )
  1773. {
  1774. ASSERT_VALID( m_pBar );
  1775. ASSERT_KINDOF( CControlBar, pBar );
  1776. m_bVisible = pBar->IsVisible() ? true : false;
  1777. // if( m_bVisible
  1778. // && (pBar->m_nStateFlags & CControlBar::delayHide) != 0
  1779. // )
  1780. // m_bVisible = false;
  1781. // if( (!m_bVisible)
  1782. // && (pBar->m_nStateFlags & CControlBar::delayShow) != 0
  1783. // )
  1784. // m_bVisible = true;
  1785. if( !m_bVisible )
  1786. return;
  1787. // for _CalcFixedRowLayout
  1788. CRect rcBarWin, rcBarClient;
  1789. pBar->GetWindowRect( &rcBarWin );
  1790. pBar->ScreenToClient( & rcBarWin );
  1791. pBar->GetClientRect( &rcBarClient );
  1792. m_sizeBarMin = rcBarWin.Size() - rcBarClient.Size();
  1793. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  1794. {
  1795. m_sizeBarMin +=
  1796. ((CExtControlBar *)pBar)->
  1797. _CalcDesiredMinOuterSize( bHorz );
  1798. } // if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  1799. // get ideal rect for bar
  1800. DWORD dwMode = 0;
  1801. if( (pBar->m_dwStyle & CBRS_SIZE_DYNAMIC)
  1802. &&
  1803. (pBar->m_dwStyle & CBRS_FLOATING)
  1804. )
  1805. dwMode |= LM_HORZ | LM_MRUWIDTH;
  1806. else if(pBar->m_dwStyle & CBRS_ORIENT_HORZ)
  1807. dwMode |= LM_HORZ | LM_HORZDOCK;
  1808. else
  1809. dwMode |=  LM_VERTDOCK;
  1810. m_sizeCalcDynamic = pBar->CalcDynamicLayout(-1, dwMode);
  1811. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  1812. && ((CExtControlBar *)pBar)->_GetFullRowMode()
  1813. )
  1814. {
  1815. if(dwMode & LM_HORZDOCK)
  1816. m_sizeCalcDynamic.cx = sizeMax.cx;
  1817. else if(dwMode & LM_VERTDOCK)
  1818. m_sizeCalcDynamic.cy = sizeMax.cy;
  1819. }
  1820. }
  1821. /////////////////////////////////////////////////////////////////////////
  1822. // CExtDockOuterBar window
  1823. IMPLEMENT_DYNCREATE(CExtDockOuterBar, CExtDockBar);
  1824. BEGIN_MESSAGE_MAP(CExtDockOuterBar, CExtDockBar)
  1825. //{{AFX_MSG_MAP(CExtDockOuterBar)
  1826. ON_WM_TIMER()
  1827. ON_WM_LBUTTONDBLCLK()
  1828. //}}AFX_MSG_MAP
  1829. ON_WM_SYSCOLORCHANGE()
  1830. __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE()
  1831. ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
  1832. ON_MESSAGE(__ExtMfc_WM_THEMECHANGED, OnThemeChanged)
  1833. END_MESSAGE_MAP()
  1834. CExtDockOuterBar::CExtDockOuterBar()
  1835. : CExtDockBar( 0 )
  1836. , m_bInDockSiteDelayedRecalc( false )
  1837. , m_bDockSiteRecalcIsDelayed( false )
  1838. {
  1839. }
  1840. void CExtDockOuterBar::OnSysColorChange() 
  1841. {
  1842. CExtDockBar::OnSysColorChange();
  1843. //CExtPaintManager * pPM = PmBridge_GetPM();
  1844. // g_PaintManager.OnSysColorChange( this );
  1845. // g_CmdManager.OnSysColorChange( pPM, this );
  1846. }
  1847. void CExtDockOuterBar::OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection) 
  1848. {
  1849. CExtDockBar::OnSettingChange( uFlags, lpszSection );
  1850. //CExtPaintManager * pPM = PmBridge_GetPM();
  1851. // g_PaintManager.OnSettingChange( this, uFlags, lpszSection );
  1852. // g_CmdManager.OnSettingChange( pPM, this, uFlags, lpszSection );
  1853. }
  1854. LRESULT CExtDockOuterBar::OnDisplayChange( WPARAM wParam, LPARAM lParam )
  1855. {
  1856. LRESULT lResult = CExtDockBar::OnDisplayChange( wParam, lParam );
  1857. //CExtPaintManager * pPM = PmBridge_GetPM();
  1858. // g_PaintManager.OnDisplayChange( this, (INT)wParam, CPoint(lParam) );
  1859. // g_CmdManager.OnDisplayChange( pPM, this, (INT)wParam, CPoint(lParam) );
  1860. return lResult;
  1861. }
  1862. void CExtDockOuterBar::OnLButtonDblClk(UINT nFlags, CPoint point) 
  1863. {
  1864. if( CExtControlBar::FindHelpMode(this) )
  1865. return;
  1866. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1867. CExtCustomizeSite * pSite =
  1868. CExtCustomizeSite::GetCustomizeSite( m_hWnd );
  1869. if( pSite != NULL )
  1870. {
  1871. if( pSite->IsCustomizeMode() )
  1872. return;
  1873. pSite->DoFormCustomization();
  1874. return;
  1875. } // if( pSite != NULL )
  1876. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1877. CExtDockBar::OnLButtonDblClk(nFlags, point);
  1878. }
  1879. LRESULT CExtDockOuterBar::OnThemeChanged( WPARAM wParam, LPARAM lParam )
  1880. {
  1881. wParam;
  1882. lParam;
  1883. LRESULT lResult = Default();
  1884. //CExtPaintManager * pPM = PmBridge_GetPM();
  1885. // g_PaintManager.OnThemeChanged( this, wParam, lParam );
  1886. // g_CmdManager.OnThemeChanged( pPM, this, wParam, lParam );
  1887. return lResult;
  1888. }
  1889. void CExtDockOuterBar::OnDynamicLayoutUpdate()
  1890. {
  1891. CExtDockBar::OnDynamicLayoutUpdate();
  1892. }
  1893. void CExtDockOuterBar::OnDynamicLayoutOptimize()
  1894. {
  1895. CExtDockBar::OnDynamicLayoutOptimize();
  1896. }
  1897. void CExtDockOuterBar::_DelayDockSiteRecalc()
  1898. {
  1899. ASSERT_VALID( this );
  1900. if( m_bDockSiteRecalcIsDelayed )
  1901. return;
  1902. CExtDockOuterBar * pDocker = this;
  1903. if( GetDlgCtrlID() != AFX_IDW_DOCKBAR_TOP )
  1904. {
  1905. CFrameWnd * pFrame = STATIC_DOWNCAST( CFrameWnd, GetParent() );
  1906. ASSERT_VALID( pFrame );
  1907. CControlBar * pTempBar = pFrame->GetControlBar( AFX_IDW_DOCKBAR_TOP );
  1908. if( pTempBar == NULL )
  1909. pTempBar = pFrame->GetControlBar( AFX_IDW_DOCKBAR_BOTTOM );
  1910. if( pTempBar == NULL )
  1911. pTempBar = pFrame->GetControlBar( AFX_IDW_DOCKBAR_LEFT );
  1912. if( pTempBar == NULL )
  1913. pTempBar = pFrame->GetControlBar( AFX_IDW_DOCKBAR_RIGHT );
  1914. if( pTempBar != NULL )
  1915. pDocker = STATIC_DOWNCAST( CExtDockOuterBar, pTempBar );
  1916. } // if( GetDlgCtrlID() != AFX_IDW_DOCKBAR_TOP )
  1917. pDocker->_DelayDockSiteRecalc_Start();
  1918. }
  1919. void CExtDockOuterBar::_DelayDockSiteRecalc_Start()
  1920. {
  1921. ASSERT_VALID( this );
  1922. if( m_bDockSiteRecalcIsDelayed )
  1923. return;
  1924. m_bDockSiteRecalcIsDelayed = true;
  1925. if( _DelayDockSiteRecalc_Update() )
  1926. {
  1927. KillTimer( 901 );
  1928. m_bDockSiteRecalcIsDelayed = false;
  1929. }
  1930. else
  1931. SetTimer( 901, 1, NULL );
  1932. }
  1933. bool CExtDockOuterBar::_DelayDockSiteRecalc_Update()
  1934. {
  1935. ASSERT_VALID( this );
  1936. if( m_bInDockSiteDelayedRecalc )
  1937. return false;
  1938. CExtControlBar::InternalFriendlyFrameWnd * pFrame =
  1939. (CExtControlBar::InternalFriendlyFrameWnd *)
  1940. STATIC_DOWNCAST( CFrameWnd, GetParent() );
  1941. ASSERT_VALID( pFrame );
  1942. if( pFrame->IsInRecalcLayout()
  1943. || CExtControlBar::ProfileBarStateIsSerializing( pFrame )
  1944. || (pFrame->GetStyle()&WS_VISIBLE) == 0
  1945. )
  1946. return false;
  1947. m_bInDockSiteDelayedRecalc = true;
  1948. pFrame->RecalcLayout();
  1949. m_bInDockSiteDelayedRecalc = false;
  1950. return true;
  1951. }
  1952. void CExtDockOuterBar::OnTimer(__EXT_MFC_UINT_PTR nIDEvent) 
  1953. {
  1954. if( nIDEvent == 901 )
  1955. {
  1956. if( _DelayDockSiteRecalc_Update() )
  1957. {
  1958. KillTimer( 901 );
  1959. m_bDockSiteRecalcIsDelayed = false;
  1960. }
  1961. return;
  1962. } // if( nIDEvent == 901 )
  1963. CExtDockBar::OnTimer(nIDEvent);
  1964. }
  1965. void CExtDockOuterBar::_AffixmentBringToTop( CExtControlBar * pBar )
  1966. {
  1967. ASSERT_VALID( this );
  1968. ASSERT_VALID( pBar );
  1969. CExtControlBar::InternalAffixmentData * pAffixmentDataSrc =
  1970. pBar->_AffixmentGetOuter();
  1971. ASSERT( pAffixmentDataSrc != NULL );
  1972. ASSERT( FindBar(pBar) >= 0 );
  1973. ExtControlBarVector_t vBars;
  1974. pBar->_GetRowExtBars( vBars, false );
  1975. int nCount = (int)vBars.GetSize();
  1976. ASSERT( nCount > 0 );
  1977. pAffixmentDataSrc->m_nAffixmentWeight = 1;
  1978. /// pAffixmentDataSrc->m_rcAffixment.SetRectEmpty();
  1979. if( nCount == 1 )
  1980. return;
  1981. int nResetWeight = (int)m_arrBars.GetSize() * 4;
  1982. int nBar = 0; 
  1983. for( nBar = 0; nBar < nCount; )
  1984. {
  1985. CExtControlBar * pBar2 = vBars[nBar];
  1986. ASSERT_VALID( pBar2 );
  1987. if( pBar2 == pBar )
  1988. {
  1989. nBar++;
  1990. continue;
  1991. }
  1992. CExtControlBar::InternalAffixmentData * pAffixmentData2 =
  1993. pBar2->_AffixmentGetOuter();
  1994. if( pAffixmentData2 == NULL )
  1995. {
  1996. vBars.RemoveAt(nBar);
  1997. nCount--;
  1998. continue;
  1999. }
  2000. if( pAffixmentData2->IsEmpty() )
  2001. pAffixmentData2->m_nAffixmentWeight = nResetWeight++;
  2002. else
  2003. pAffixmentData2->m_nAffixmentWeight++;
  2004. nBar++;
  2005. } // for( nBar = 0; nBar < nCount; )
  2006. if( nCount <= 1 )
  2007. return;
  2008. // reset affixment weights
  2009. ExtControlBarVector_t vBars2;
  2010. for( nBar = 0; nBar < nCount; nBar++ )
  2011. {
  2012. CExtControlBar * pBarX = vBars[nBar];
  2013. int nCount2 = (int)vBars2.GetSize();
  2014. if( nCount2 == 0 )
  2015. {
  2016. vBars2.Add( pBarX );
  2017. continue;
  2018. }
  2019. CExtControlBar::InternalAffixmentData * pAffixmentDataX =
  2020. pBarX->_AffixmentGetOuter();
  2021. ASSERT( pAffixmentDataX != NULL );
  2022. int nWeightX = pAffixmentDataX->m_nAffixmentWeight;
  2023. for( int nBar2 = 0; nBar2 < nCount2; nBar2++ )
  2024. {
  2025. CExtControlBar * pBar2 = vBars2[nBar2];
  2026. ASSERT( pBar2 != pBarX );
  2027. CExtControlBar::InternalAffixmentData * pAffixmentData2 =
  2028. pBar2->_AffixmentGetOuter();
  2029. ASSERT( pAffixmentData2 != NULL );
  2030. int nWeight2 = pAffixmentData2->m_nAffixmentWeight;
  2031. ASSERT( nWeight2 != nWeightX );
  2032. if( nWeight2 > nWeightX )
  2033. {
  2034. vBars2.InsertAt( nBar2, pBarX );
  2035. break;
  2036. }
  2037. if( nBar2 == nCount2-1 )
  2038. {
  2039. vBars2.Add( pBarX );
  2040. break;
  2041. }
  2042. } // for( int nBar2 = 0; nBar2 < nCount2; nBar2++ )
  2043. } // for( nBar = 0; nBar < nCount; nBar++ )
  2044. ASSERT( vBars2.GetSize() == nCount );
  2045. ASSERT( vBars2[0]->_AffixmentGetOuter()->m_nAffixmentWeight == 1 );
  2046. // if( nCount == 2 )
  2047. // return;
  2048. for( nBar = 1; nBar < nCount; nBar++ )
  2049. {
  2050. CExtControlBar * pBarX = vBars2[nBar];
  2051. CExtControlBar::InternalAffixmentData * pAffixmentDataX =
  2052. pBarX->_AffixmentGetOuter();
  2053. ASSERT( pAffixmentDataX != NULL );
  2054. pAffixmentDataX->m_nAffixmentWeight = nBar + 1;
  2055. }
  2056. }
  2057. //#define __DEBUG_CExtDockOuterBar_CompressSubRow_ASSERT_CRITICAL_MINSIZE
  2058. bool CExtDockOuterBar::_CompressSubRow(
  2059. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  2060. int nSubRowStartPos,
  2061. int nSubRowEndPos,
  2062. int nExtentMax,
  2063. bool bHorz,
  2064. bool & bAdjustWithAffixment,
  2065. bool * p_bFullyOccupiedLayout // = NULL
  2066. )
  2067. {
  2068. ASSERT_VALID(this);
  2069. ASSERT( dbol.GetSize() > 0 );
  2070. ASSERT( nSubRowStartPos <= nSubRowEndPos );
  2071. ASSERT( 0 <= nSubRowStartPos && nSubRowStartPos < dbol.GetSize() );
  2072. ASSERT( 0 <= nSubRowEndPos   && nSubRowEndPos < dbol.GetSize() );
  2073. CArray < CRect, CRect > arrRcPreCalc;
  2074. int nPossibleBetween = 0;
  2075. //int nPossibleCs = 0;
  2076. int nExtentReal = 0;
  2077. int nBar = 0;
  2078. for( nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  2079. {
  2080. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2081. ASSERT_VALID( olid.m_pBar );
  2082. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2083. ASSERT( olid.m_bVisible );
  2084. CRect rcPreCalc( olid.m_rcPreCalc );
  2085. ASSERT( rcPreCalc.left >= 0 );
  2086. ASSERT( rcPreCalc.top >= 0 );
  2087. ASSERT( rcPreCalc.left <= rcPreCalc.right );
  2088. ASSERT( rcPreCalc.top <= rcPreCalc.bottom );
  2089. #ifdef __DEBUG_CExtDockOuterBar_CompressSubRow_ASSERT_CRITICAL_MINSIZE
  2090. ASSERT( rcPreCalc.Width() >= olid.m_sizeBarMin.cx );
  2091. ASSERT( rcPreCalc.Height() >= olid.m_sizeBarMin.cy );
  2092. #endif // __DEBUG_CExtDockOuterBar_CompressSubRow_ASSERT_CRITICAL_MINSIZE
  2093. int nBetween = 0;
  2094. if( nBar == nSubRowStartPos )
  2095. {
  2096. nBetween += bHorz
  2097. ? rcPreCalc.left
  2098. : rcPreCalc.top
  2099. ;
  2100. ASSERT( nBetween >= 0 );
  2101. } // if( nBar == nSubRowStartPos )
  2102. else
  2103. {
  2104. if( bHorz )
  2105. {
  2106. nBetween +=
  2107. rcPreCalc.left
  2108. - arrRcPreCalc.ElementAt(nBar-1-nSubRowStartPos).right
  2109. ;
  2110. ASSERT( nBetween >= 0 );
  2111. if( nBar == nSubRowEndPos )
  2112. nBetween += nExtentMax - rcPreCalc.right;
  2113. } // if( bHorz )
  2114. else
  2115. {
  2116. nBetween +=
  2117. rcPreCalc.top
  2118. - arrRcPreCalc.ElementAt(nBar-1-nSubRowStartPos).bottom
  2119. ;
  2120. ASSERT( nBetween >= 0 );
  2121. if( nBar == nSubRowEndPos )
  2122. nBetween += nExtentMax - rcPreCalc.bottom;
  2123. } // else from if( bHorz )
  2124. } // else from if( nBar == nSubRowStartPos )
  2125. // int nCsAvail = bHorz
  2126. // ? (rcPreCalc.Width() - olid.m_sizeBarMin.cx)
  2127. // : (rcPreCalc.Height() - olid.m_sizeBarMin.cy)
  2128. // ;
  2129. // ASSERT( nCsAvail >= 0 );
  2130. // nPossibleCs += nCsAvail;
  2131. nPossibleBetween += nBetween;
  2132. arrRcPreCalc.Add( rcPreCalc );
  2133. nExtentReal += bHorz
  2134. ? rcPreCalc.Width()
  2135. : rcPreCalc.Height()
  2136. ;
  2137. } // for( nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  2138. ASSERT( arrRcPreCalc.GetSize() == (nSubRowEndPos-nSubRowStartPos+1) );
  2139. //int nPossible = nPossibleBetween + nPossibleCs;
  2140. bool bRetVal = false;
  2141. int nCsRow = nExtentReal - nExtentMax /*- nPossibleBetween*/; //nPossibleCs;
  2142. if( nPossibleBetween > 0 )
  2143. nCsRow -= nPossibleBetween;
  2144. if( nPossibleBetween > 0 )
  2145. {
  2146. int nLeftPrev = nExtentMax;
  2147. for( int nBar = nSubRowEndPos; nBar >= nSubRowStartPos; nBar-- )
  2148. {
  2149. CRect & rcPreCalc = arrRcPreCalc.ElementAt( nBar-nSubRowStartPos );
  2150. int nShift =
  2151. nLeftPrev
  2152. - (bHorz ? rcPreCalc.right : rcPreCalc.bottom)
  2153. ;
  2154. if( nShift < 0 )
  2155. rcPreCalc.OffsetRect(
  2156. bHorz ? nShift : 0,
  2157. bHorz ? 0 : nShift
  2158. );
  2159. nLeftPrev = bHorz
  2160. ? rcPreCalc.left
  2161. : rcPreCalc.top
  2162. ;
  2163. } // for( int nBar = nSubRowEndPos; nBar >= nSubRowStartPos; nBar-- )
  2164. if( nLeftPrev >= 0 )
  2165. bRetVal = true;
  2166. // else
  2167. // nCsRow = -nLeftPrev;
  2168. } // if( nPossibleBetween > 0 )
  2169. bool bCompressionPassed = false;
  2170. if( (!bRetVal) && nCsRow >= 0 )
  2171. {
  2172. int nLeftPrev = nExtentMax;
  2173. for( int nBar = nSubRowEndPos; nBar >= nSubRowStartPos; nBar-- )
  2174. {
  2175. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2176. CRect & rcPreCalc = arrRcPreCalc.ElementAt( nBar-nSubRowStartPos );
  2177. int nCsAvail = bHorz
  2178. ? (rcPreCalc.Width() - olid.m_sizeBarMin.cx)
  2179. : (rcPreCalc.Height() - olid.m_sizeBarMin.cy)
  2180. ;
  2181. if( nCsAvail < 0 )
  2182. nCsAvail = 0;
  2183. //ASSERT( nCsAvail >= 0 );
  2184. if( nCsAvail > nCsRow )
  2185. nCsAvail = nCsRow;
  2186. bool bAdjust = false;
  2187. if( nCsRow > 0 )
  2188. {
  2189. nCsRow -= nCsAvail;
  2190. ASSERT( nCsRow >= 0 );
  2191. bAdjust = true;
  2192. }
  2193. int nShift =
  2194. nLeftPrev
  2195. - (bHorz ? rcPreCalc.right : rcPreCalc.bottom )
  2196. ;
  2197. //ASSERT( nShift >= 0 );
  2198. rcPreCalc.OffsetRect(
  2199. bHorz ? nShift : 0,
  2200. bHorz ? 0 : nShift
  2201. );
  2202. //if( nCsRow > 0 )
  2203. if( bAdjust )
  2204. (bHorz ? rcPreCalc.left : rcPreCalc.top) += nCsAvail;
  2205. nLeftPrev = bHorz ? rcPreCalc.left : rcPreCalc.top;
  2206. } // for( nBar = nSubRowEndPos; nBar >= nSubRowStartPos; nBar-- )
  2207. if( nCsRow == 0 && nLeftPrev >= 0 )
  2208. {
  2209. bRetVal = true;
  2210. if( nLeftPrev == 0
  2211. && (nSubRowStartPos < nSubRowEndPos)
  2212. )
  2213. { // if compression passed with full row layout with more than 1 bar
  2214. bCompressionPassed = true;
  2215. // re-compress with affixment
  2216. AffixmentOrderVector_t arrAffixmentOrder;
  2217. _CalcAffixmentOrderVector(
  2218. bHorz,
  2219. arrAffixmentOrder,
  2220. dbol,
  2221. false,
  2222. nSubRowStartPos,
  2223. nSubRowEndPos
  2224. );
  2225. ASSERT( arrAffixmentOrder.GetSize() == (nSubRowEndPos-nSubRowStartPos+1) );
  2226. bool bPerformReShift = false;
  2227. // last is not reviewed
  2228. for( int nOrderT = (int)arrAffixmentOrder.GetSize()-1; nOrderT > 0; nOrderT-- )
  2229. {
  2230. int nReviewIdx = arrAffixmentOrder[ nOrderT - 1 ];
  2231. OuterLayoutItemData & olidReview = dbol.ElementAt( nReviewIdx );
  2232. CExtControlBar * pExtBarReview =
  2233. DYNAMIC_DOWNCAST(
  2234. CExtControlBar,
  2235. olidReview.m_pBar
  2236. );
  2237. if( pExtBarReview == NULL )
  2238. continue;
  2239. CExtControlBar::InternalAffixmentData * pAffixmentDataReview =
  2240. pExtBarReview->_AffixmentGetOuter();
  2241. if( pAffixmentDataReview == NULL
  2242. || pAffixmentDataReview->IsEmpty()
  2243. )
  2244. continue;
  2245. CRect & rcPreCalcReview = arrRcPreCalc.ElementAt( nReviewIdx-nSubRowStartPos );
  2246. int nExtentBarReview = bHorz
  2247. ? rcPreCalcReview.Width()
  2248. : rcPreCalcReview.Height()
  2249. ;
  2250. int nExtentCompressedAffixmentReview = bHorz
  2251. ? pAffixmentDataReview->m_sizeCompressed.cx
  2252. : pAffixmentDataReview->m_sizeCompressed.cy
  2253. ;
  2254. if( nExtentCompressedAffixmentReview < nExtentBarReview )
  2255. continue;
  2256. int nCsExt = nExtentCompressedAffixmentReview - nExtentBarReview;
  2257. int nCsSrc = nCsExt;
  2258. for( int nCmpxIdx = (int)arrAffixmentOrder.GetSize(); nCmpxIdx > nOrderT ; nCmpxIdx-- )
  2259. {
  2260. int nCmpxIdxEffective = arrAffixmentOrder[ nCmpxIdx - 1 ];
  2261. OuterLayoutItemData & olidCmpx = dbol.ElementAt( nCmpxIdxEffective );
  2262. CExtControlBar * pExtBarCmpx =
  2263. DYNAMIC_DOWNCAST(
  2264. CExtControlBar,
  2265. olidCmpx.m_pBar
  2266. );
  2267. if( pExtBarCmpx == NULL )
  2268. continue;
  2269. CExtControlBar::InternalAffixmentData * pAffixmentDataCmpx =
  2270. pExtBarCmpx->_AffixmentGetOuter();
  2271. if( pAffixmentDataCmpx == NULL
  2272. || pAffixmentDataCmpx->IsEmpty()
  2273. )
  2274. continue;
  2275. ASSERT( pAffixmentDataReview->m_nAffixmentWeight <= pAffixmentDataCmpx->m_nAffixmentWeight );
  2276. CRect & rcPreCalcCmpx = arrRcPreCalc.ElementAt( nCmpxIdxEffective-nSubRowStartPos );
  2277. int nCsAvail = bHorz
  2278. ? (rcPreCalcCmpx.Width() - olidCmpx.m_sizeBarMin.cx)
  2279. : (rcPreCalcCmpx.Height() - olidCmpx.m_sizeBarMin.cy)
  2280. ;
  2281. //ASSERT( nCsAvail >= 0 );
  2282. if( nCsAvail < 0 )
  2283. continue;
  2284. nCsAvail = min( nCsAvail, nCsExt );
  2285. ASSERT( nCsAvail >= 0 );
  2286. if( nCsAvail == 0 )
  2287. continue;
  2288. (bHorz ? rcPreCalcCmpx.right : rcPreCalcCmpx.bottom ) -=
  2289. nCsAvail;
  2290. nCsExt -= nCsAvail;
  2291. bPerformReShift = true;
  2292. ASSERT( nCsExt >= 0 );
  2293. if( nCsExt == 0 )
  2294. break;
  2295. } // for( int nCmpxIdx = arrAffixmentOrder.GetSize(); nCmpxIdx > nOrderT ; nCmpxIdx-- )
  2296. ASSERT( 0 <= nCsExt && nCsExt <= nCsSrc );
  2297. if( nCsExt == nCsSrc )
  2298. continue;
  2299. ASSERT( bPerformReShift );
  2300. (bHorz ? rcPreCalcReview.right : rcPreCalcReview.bottom ) +=
  2301. (nCsSrc - nCsExt);
  2302. } // for( int nOrderT = arrAffixmentOrder.GetSize()-1; nOrderT > 0; nOrderT-- )
  2303. if( bPerformReShift )
  2304. {
  2305. int nRightPrev = 0;
  2306. for( int nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  2307. {
  2308. // OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2309. CRect & rcPreCalc = arrRcPreCalc.ElementAt( nBar-nSubRowStartPos );
  2310. int nShift =
  2311. nRightPrev
  2312. - (bHorz ? rcPreCalc.left : rcPreCalc.top )
  2313. ;
  2314. if( nShift != 0 )
  2315. rcPreCalc.OffsetRect(
  2316. bHorz ? nShift : 0,
  2317. bHorz ? 0 : nShift
  2318. );
  2319. nRightPrev = bHorz ? rcPreCalc.right : rcPreCalc.bottom;
  2320. } // for( nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  2321. } // if( bPerformReShift )
  2322. } // if compression passed with full row layout with more than 1 bar
  2323. } // if( nCsRow == 0 && nLeftPrev >= 0 )
  2324. } // if( (!bRetVal) && nCsRow >= 0 )
  2325. if( !bRetVal )
  2326. {
  2327. bAdjustWithAffixment = false;
  2328. return false;
  2329. } // if( !bRetVal )
  2330. bool bCalcFullyOccupiedLayout = 
  2331. (p_bFullyOccupiedLayout != NULL) ? true : false;
  2332. if( bCalcFullyOccupiedLayout
  2333. && (*p_bFullyOccupiedLayout)
  2334. )
  2335. bCalcFullyOccupiedLayout = false;
  2336. if( bCalcFullyOccupiedLayout
  2337. && nSubRowStartPos > 0
  2338. && nSubRowEndPos < (dbol.GetSize() - 1)
  2339. )
  2340. bCalcFullyOccupiedLayout = false;
  2341. if( bCalcFullyOccupiedLayout
  2342. && bCompressionPassed
  2343. )
  2344. {
  2345. bCalcFullyOccupiedLayout = false;
  2346. *p_bFullyOccupiedLayout = true;
  2347. }
  2348. int nPosRightPrev = 0;
  2349. for( nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  2350. {
  2351. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2352. olid.m_rcPreCalc = arrRcPreCalc.ElementAt( nBar-nSubRowStartPos );
  2353. ASSERT( olid.m_rcPreCalc.left >= 0 );
  2354. ASSERT( olid.m_rcPreCalc.right >= 0 );
  2355. ASSERT( olid.m_rcPreCalc.left <= olid.m_rcPreCalc.right );
  2356. ASSERT( olid.m_rcPreCalc.top <= olid.m_rcPreCalc.bottom );
  2357. #ifdef __DEBUG_CExtDockOuterBar_CompressSubRow_ASSERT_CRITICAL_MINSIZE
  2358. ASSERT( olid.m_rcPreCalc.Width() >= olid.m_sizeBarMin.cx );
  2359. ASSERT( olid.m_rcPreCalc.Height() >= olid.m_sizeBarMin.cy );
  2360. #endif // __DEBUG_CExtDockOuterBar_CompressSubRow_ASSERT_CRITICAL_MINSIZE
  2361. if( !bCalcFullyOccupiedLayout )
  2362. continue;
  2363. int nPosLeft = bHorz
  2364. ? olid.m_rcPreCalc.left
  2365. : olid.m_rcPreCalc.top
  2366. ;
  2367. if( nBar == nSubRowStartPos )
  2368. {
  2369. ASSERT( nPosLeft >= 0 );
  2370. if( nPosLeft > 0 )
  2371. {
  2372. bCalcFullyOccupiedLayout = false;
  2373. continue;
  2374. }
  2375. } // if( nBar == nSubRowStartPos )
  2376. ASSERT( nPosLeft >= nPosRightPrev );
  2377. if( nPosLeft > nPosRightPrev )
  2378. {
  2379. bCalcFullyOccupiedLayout = false;
  2380. continue;
  2381. }
  2382. nPosRightPrev = bHorz
  2383. ? olid.m_rcPreCalc.right
  2384. : olid.m_rcPreCalc.bottom
  2385. ;
  2386. if( nBar == nSubRowEndPos )
  2387. {
  2388. if( nPosRightPrev < nExtentMax )
  2389. {
  2390. bCalcFullyOccupiedLayout = false;
  2391. continue;
  2392. }
  2393. } // if( nBar == nSubRowEndPos )
  2394. } // for( nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  2395. if( bCalcFullyOccupiedLayout )
  2396. {
  2397. ASSERT( p_bFullyOccupiedLayout != NULL );
  2398. *p_bFullyOccupiedLayout = true;
  2399. }
  2400. return true;
  2401. }
  2402. void CExtDockOuterBar::_CalcFixedRowLayout(
  2403. CSize & sizeFixed,
  2404. CSize & sizeMax,
  2405. CPoint & pt,
  2406. BOOL bHorz,
  2407. AFX_SIZEPARENTPARAMS & layout,
  2408. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  2409. int * p_nSubRowCount, // = NULL
  2410. bool * p_bFullyOccupiedLayout // = NULL
  2411. )
  2412. {
  2413. ASSERT_VALID(this);
  2414. if( p_nSubRowCount != NULL )
  2415. *p_nSubRowCount = 1;
  2416. if( p_bFullyOccupiedLayout != NULL )
  2417. *p_bFullyOccupiedLayout = false;
  2418. int nCountOfBars = (int)dbol.GetSize();
  2419. ASSERT( nCountOfBars > 0 );
  2420. // pre-process hidden bars
  2421. int nBar = 0;
  2422. for( nBar = 0; nBar < nCountOfBars; )
  2423. {
  2424. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2425. ASSERT_VALID( olid.m_pBar );
  2426. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2427. if( !olid.m_bVisible )
  2428. {
  2429. olid.m_pBar->RecalcDelayShow( &layout );
  2430. dbol.RemoveAt( nBar );
  2431. nCountOfBars--;
  2432. continue;
  2433. }
  2434. olid.m_pBar->GetWindowRect( &olid.m_rcReal );
  2435. ScreenToClient( &olid.m_rcReal );
  2436. nBar++;
  2437. } // for( nBar = 0; nBar < nCountOfBars; )
  2438. // precalc layout (1), move according to affixement
  2439. AffixmentOrderVector_t arrAffixmentOrder;
  2440. _CalcAffixmentOrderVector(
  2441. bHorz ? true : false,
  2442. arrAffixmentOrder,
  2443. dbol,
  2444. true
  2445. );
  2446. ASSERT( arrAffixmentOrder.GetSize() == nCountOfBars );
  2447. // precalc layout (2), split to subrows
  2448. int nTotalRowExtent = 0;
  2449. int nSubRowStartPos = 0;
  2450. bool bAdjustWithAffixment = true;
  2451. bool bAlignSubRowAffixmentHW = true;
  2452. for( nBar = 0; nBar < nCountOfBars; nBar++ )
  2453. {
  2454. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2455. ASSERT_VALID( olid.m_pBar );
  2456. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2457. ASSERT( olid.m_bVisible );
  2458. olid.m_rcPreCalc = CRect( pt, olid.m_sizeCalcDynamic );
  2459. if( bHorz )
  2460. {
  2461. if( olid.m_rcReal.left > olid.m_rcPreCalc.left
  2462. && (!m_bFloating)
  2463. )
  2464. olid.m_rcPreCalc.OffsetRect(
  2465. olid.m_rcReal.left - olid.m_rcPreCalc.left,
  2466. 0
  2467. );
  2468. int nRest = olid.m_rcPreCalc.right - sizeMax.cx;
  2469. /// int nRest = sizeMax.cx - olid.m_rcPreCalc.left + olid.m_sizeBarMin.cx;
  2470. if( nRest >= 0
  2471. && ( !olid.m_pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  2472. || ( olid.m_pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  2473. && ((CExtControlBar*)olid.m_pBar)->IsFixedMode()
  2474. )
  2475. )
  2476. )
  2477. { // trying to make one multi-row or compress it
  2478. if( !_CompressSubRow(
  2479. dbol,
  2480. nSubRowStartPos,
  2481. nBar,
  2482. sizeMax.cx,
  2483. bHorz ? true : false,
  2484. bAdjustWithAffixment,
  2485. p_bFullyOccupiedLayout
  2486. )
  2487. )
  2488. {
  2489. if( p_nSubRowCount != NULL )
  2490. (*p_nSubRowCount)++;
  2491. if( p_bFullyOccupiedLayout != NULL )
  2492. *p_bFullyOccupiedLayout = true;
  2493. // ASSERT( bAlignSubRowAffixmentHW );
  2494. bAlignSubRowAffixmentHW = false;
  2495. _AlignSubRowAffixmentHW(
  2496. bHorz ? true : false,
  2497. dbol,
  2498. nSubRowStartPos,
  2499. nBar
  2500. );
  2501. bAdjustWithAffixment = false;
  2502. nSubRowStartPos = nBar;
  2503. _AdjustByTotalRowExtent(
  2504. nTotalRowExtent,
  2505. sizeFixed,
  2506. pt,
  2507. bHorz
  2508. );
  2509. ASSERT( pt.x == 0 );
  2510. olid.m_rcPreCalc = CRect( pt, olid.m_sizeCalcDynamic );
  2511. }
  2512. else
  2513. bAlignSubRowAffixmentHW = true;
  2514. } // trying to make one multi-row or compress it
  2515. pt.x =
  2516. //olid.m_rcPreCalc.left + olid.m_sizeCalcDynamic.cx
  2517. olid.m_rcPreCalc.right
  2518. ;
  2519. nTotalRowExtent = max( nTotalRowExtent, olid.m_sizeCalcDynamic.cy );
  2520. } // if( bHorz )
  2521. else
  2522. {
  2523. // offset calculated rect out to actual
  2524. if( olid.m_rcReal.top > olid.m_rcPreCalc.top
  2525. && (!m_bFloating)
  2526. )
  2527. olid.m_rcPreCalc.OffsetRect(
  2528. 0,
  2529. olid.m_rcReal.top - olid.m_rcPreCalc.top
  2530. );
  2531. int nRest = olid.m_rcPreCalc.bottom - sizeMax.cy;
  2532. /// int nRest = sizeMax.cy - olid.m_rcPreCalc.top + olid.m_sizeBarMin.cy;
  2533. if( nRest >= 0
  2534. && ( !olid.m_pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  2535. || ( olid.m_pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  2536. && ((CExtControlBar*)olid.m_pBar)->IsFixedMode()
  2537. )
  2538. )
  2539. )
  2540. { // trying to make one multi-row or compress it
  2541. if( !_CompressSubRow(
  2542. dbol,
  2543. nSubRowStartPos,
  2544. nBar,
  2545. sizeMax.cy,
  2546. bHorz ? true : false,
  2547. bAdjustWithAffixment,
  2548. p_bFullyOccupiedLayout
  2549. )
  2550. )
  2551. {
  2552. if( p_nSubRowCount != NULL )
  2553. (*p_nSubRowCount)++;
  2554. if( p_bFullyOccupiedLayout != NULL )
  2555. *p_bFullyOccupiedLayout = true;
  2556. // ASSERT( bAlignSubRowAffixmentHW );
  2557. bAlignSubRowAffixmentHW = false;
  2558. _AlignSubRowAffixmentHW(
  2559. bHorz ? true : false,
  2560. dbol,
  2561. nSubRowStartPos,
  2562. nBar
  2563. );
  2564. bAdjustWithAffixment = false;
  2565. nSubRowStartPos = nBar;
  2566. _AdjustByTotalRowExtent(
  2567. nTotalRowExtent,
  2568. sizeFixed,
  2569. pt,
  2570. bHorz
  2571. );
  2572. ASSERT( pt.y == 0 );
  2573. olid.m_rcPreCalc = CRect( pt, olid.m_sizeCalcDynamic );
  2574. }
  2575. else
  2576. bAlignSubRowAffixmentHW = true;
  2577. } // trying to make one multi-row or compress it
  2578. pt.y =
  2579. //olid.m_rcPreCalc.top + olid.m_sizeCalcDynamic.cy
  2580. olid.m_rcPreCalc.bottom
  2581. ;
  2582. nTotalRowExtent = max( nTotalRowExtent, olid.m_sizeCalcDynamic.cx );
  2583. } // else from if( bHorz )
  2584. } // for( nBar = 0; nBar < nCountOfBars; nBar++ )
  2585. if( bAlignSubRowAffixmentHW && (nCountOfBars > 0) )
  2586. {
  2587. ASSERT( nBar <= nCountOfBars );
  2588. if( nBar == nCountOfBars )
  2589. nBar = nCountOfBars - 1;
  2590. ASSERT( nSubRowStartPos <= nBar );
  2591. _AlignSubRowAffixmentHW(
  2592. bHorz ? true : false,
  2593. dbol,
  2594. nSubRowStartPos,
  2595. nBar
  2596. );
  2597. } // if( bAlignSubRowAffixmentHW && (nCountOfBars > 0) )
  2598. /* DEBUG **
  2599. *********************************************
  2600. *********************************************
  2601. int nPosLastTest = 0;
  2602. for( nBar = 0; bAdjustWithAffixment && nBar < nCountOfBars; nBar++ )
  2603. {
  2604. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2605. ASSERT_VALID( olid.m_pBar );
  2606. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2607. ASSERT( olid.m_bVisible );
  2608. int nPosCurrTest = bHorz
  2609. ? olid.m_rcPreCalc.left
  2610. : olid.m_rcPreCalc.top
  2611. ;
  2612. ASSERT( nPosLastTest <= nPosCurrTest );
  2613. if( nPosLastTest < nPosCurrTest )
  2614. break;
  2615. nPosLastTest = bHorz
  2616. ? olid.m_rcPreCalc.right
  2617. : olid.m_rcPreCalc.bottom
  2618. ;
  2619. } // for( nBar = 0; bAdjustWithAffixment && nBar < nCountOfBars; nBar++ )
  2620. int bMaxTest = bHorz ? sizeMax.cx : sizeMax.cy;
  2621. if( nBar == nCountOfBars
  2622. && nPosLastTest >= bMaxTest
  2623. )
  2624. bAdjustWithAffixment = false;
  2625. *********************************************
  2626. *********************************************
  2627. ** DEBUG */
  2628. if( bAdjustWithAffixment )
  2629. {
  2630. // pre adjust affixment
  2631. int nOrder = 0;
  2632. for( nOrder = nCountOfBars; nOrder > 0; nOrder-- )
  2633. {
  2634. int nBarAtOrder = arrAffixmentOrder[nOrder-1];
  2635. ASSERT( 0 <= nBarAtOrder && nBarAtOrder < nCountOfBars );
  2636. OuterLayoutItemData & olid = dbol.ElementAt( nBarAtOrder );
  2637. ASSERT_VALID( olid.m_pBar );
  2638. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2639. ASSERT( olid.m_bVisible );
  2640. CExtControlBar * pExtBar =
  2641. DYNAMIC_DOWNCAST(
  2642. CExtControlBar,
  2643. olid.m_pBar
  2644. );
  2645. if( pExtBar == NULL )
  2646. continue;
  2647. CExtControlBar::InternalAffixmentData * pAffixmentData =
  2648. pExtBar->_AffixmentGetOuter();
  2649. // if( pAffixmentData == NULL )
  2650. // continue;
  2651. // ASSERT( !pAffixmentData->IsEmpty() );
  2652. // ASSERT( !pAffixmentData->m_rcAffixment.IsRectEmpty() );
  2653. // if( olid.m_rcPreCalc == pAffixmentData->m_rcAffixment )
  2654. // continue;
  2655. if( pAffixmentData == NULL
  2656. || pAffixmentData->IsEmpty()
  2657. || pAffixmentData->m_rcAffixment.IsRectEmpty()
  2658. || olid.m_rcPreCalc == pAffixmentData->m_rcAffixment
  2659. )
  2660. continue;
  2661. _PreAdjustWithAffixment(
  2662. bHorz ? true : false,
  2663. dbol,
  2664. olid,
  2665. nBarAtOrder,
  2666. pAffixmentData,
  2667. bHorz ? sizeMax.cx : sizeMax.cy
  2668. );
  2669. } // for( nOrder = nCountOfBars; nOrder > 0; nOrder-- )
  2670. // post adjust affixment
  2671. for( nOrder = nCountOfBars; nOrder > 0; nOrder-- )
  2672. {
  2673. int nBarAtOrder = arrAffixmentOrder[nOrder-1];
  2674. ASSERT( 0 <= nBarAtOrder && nBarAtOrder < nCountOfBars );
  2675. OuterLayoutItemData & olid = dbol.ElementAt( nBarAtOrder );
  2676. ASSERT_VALID( olid.m_pBar );
  2677. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2678. ASSERT( olid.m_bVisible );
  2679. CExtControlBar * pExtBar =
  2680. DYNAMIC_DOWNCAST(
  2681. CExtControlBar,
  2682. olid.m_pBar
  2683. );
  2684. if( pExtBar == NULL )
  2685. continue;
  2686. CExtControlBar::InternalAffixmentData * pAffixmentData =
  2687. pExtBar->_AffixmentGetOuter();
  2688. // if( pAffixmentData == NULL )
  2689. // continue;
  2690. // ASSERT( !pAffixmentData->IsEmpty() );
  2691. // ASSERT( !pAffixmentData->m_rcAffixment.IsRectEmpty() );
  2692. // if( olid.m_rcPreCalc == pAffixmentData->m_rcAffixment )
  2693. // continue;
  2694. if( pAffixmentData == NULL
  2695. || pAffixmentData->IsEmpty()
  2696. || pAffixmentData->m_rcAffixment.IsRectEmpty()
  2697. || olid.m_rcPreCalc == pAffixmentData->m_rcAffixment
  2698. )
  2699. continue;
  2700. _PostAdjustWithAffixment(
  2701. bHorz ? true : false,
  2702. dbol,
  2703. olid,
  2704. nBarAtOrder,
  2705. pAffixmentData,
  2706. bHorz ? sizeMax.cx : sizeMax.cy
  2707. );
  2708. } // for( int nOrder = nCountOfBars; nOrder > 0; nOrder-- )
  2709. } // if( bAdjustWithAffixment )
  2710. // verify for minimal layouts
  2711. for( nBar = 0; nBar < nCountOfBars; nBar++ )
  2712. {
  2713. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2714. ASSERT_VALID( olid.m_pBar );
  2715. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2716. ASSERT( olid.m_bVisible );
  2717. if( bHorz )
  2718. {
  2719. int nRest = sizeMax.cx - olid.m_rcPreCalc.right;
  2720. if( nRest >= 0 )
  2721. continue;
  2722. olid.m_rcPreCalc.right = sizeMax.cx;
  2723. if( olid.m_rcPreCalc.Width() < olid.m_sizeBarMin.cx )
  2724. olid.m_rcPreCalc.right = olid.m_rcPreCalc.left + olid.m_sizeBarMin.cx;
  2725. } // if( bHorz )
  2726. else
  2727. {
  2728. int nRest = sizeMax.cy - olid.m_rcPreCalc.bottom;
  2729. if( nRest >= 0 )
  2730. continue;
  2731. olid.m_rcPreCalc.bottom = sizeMax.cy;
  2732. if( olid.m_rcPreCalc.Height() < olid.m_sizeBarMin.cy )
  2733. olid.m_rcPreCalc.bottom = olid.m_rcPreCalc.top + olid.m_sizeBarMin.cy;
  2734. } // else from if( bHorz )
  2735. }
  2736. // apply layout
  2737. if( !m_bLayoutQuery )
  2738. {
  2739. for( nBar = 0; nBar < nCountOfBars; nBar++ )
  2740. {
  2741. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  2742. ASSERT_VALID( olid.m_pBar );
  2743. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2744. ASSERT( olid.m_bVisible );
  2745. if( olid.m_rcPreCalc == olid.m_rcReal )
  2746. continue;
  2747. if( (olid.m_pBar->m_dwStyle & CBRS_FLOATING) == 0 )
  2748. olid.m_pBar->m_pDockContext->
  2749. m_rectMRUDockPos = olid.m_rcPreCalc;
  2750. AfxRepositionWindow(
  2751. &layout,
  2752. olid.m_pBar->m_hWnd,
  2753. &olid.m_rcPreCalc
  2754. );
  2755. } // for( nBar = 0; nBar < nCountOfBars; nBar++ )
  2756. } // if( !m_bLayoutQuery )
  2757. _AdjustByTotalRowExtent(
  2758. nTotalRowExtent,
  2759. sizeFixed,
  2760. pt,
  2761. bHorz
  2762. );
  2763. }
  2764. void CExtDockOuterBar::_PreAdjustWithAffixment(
  2765. bool bHorz,
  2766. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  2767. CExtDockOuterBar::OuterLayoutItemData & olidAdjustedSrc,
  2768. int nBarAdjustedSrc,
  2769. CExtControlBar::InternalAffixmentData * pAffixmentDataAdjustedSrc,
  2770. int nExtentMax
  2771. )
  2772. {
  2773. if( nExtentMax <= 0 )
  2774. return;
  2775. int nCountOfBars = (int)dbol.GetSize();
  2776. ASSERT( 0 <= nBarAdjustedSrc && nBarAdjustedSrc < nCountOfBars );
  2777. ASSERT( dbol.ElementAt(nBarAdjustedSrc).m_pBar == olidAdjustedSrc.m_pBar );
  2778. ASSERT( pAffixmentDataAdjustedSrc != NULL );
  2779. ASSERT( !pAffixmentDataAdjustedSrc->IsEmpty() );
  2780. int nPosAffixment = bHorz
  2781. ? pAffixmentDataAdjustedSrc->m_rcAffixment.left
  2782. : pAffixmentDataAdjustedSrc->m_rcAffixment.top
  2783. ;
  2784. int nPosPreCalc = bHorz
  2785. ? olidAdjustedSrc.m_rcPreCalc.left
  2786. : olidAdjustedSrc.m_rcPreCalc.top
  2787. ;
  2788. int nAdjustShift = nPosAffixment - nPosPreCalc;
  2789. if( nAdjustShift == 0 )
  2790. return;
  2791. // TRACE3(
  2792. // "     Bar 0x%08X      weight = %d      nAdjustShift = %dn",
  2793. // long(olidAdjustedSrc.m_pBar),
  2794. // pAffixmentDataAdjustedSrc->m_nAffixmentWeight,
  2795. // nAdjustShift
  2796. // );
  2797. _ShiftSubRowWithAffixment(
  2798. bHorz,
  2799. dbol,
  2800. ( nAdjustShift > 0 )
  2801. ? nBarAdjustedSrc
  2802. : 0
  2803. ,
  2804. ( nAdjustShift > 0 )
  2805. ? (nCountOfBars - 1)
  2806. : nBarAdjustedSrc
  2807. ,
  2808. nAdjustShift,
  2809. nExtentMax
  2810. );
  2811. }
  2812. void CExtDockOuterBar::_PostAdjustWithAffixment(
  2813. bool bHorz,
  2814. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  2815. CExtDockOuterBar::OuterLayoutItemData & olidAdjustedSrc,
  2816. int nBarAdjustedSrc,
  2817. CExtControlBar::InternalAffixmentData * pAffixmentDataAdjustedSrc,
  2818. int nExtentMax
  2819. )
  2820. {
  2821. if( nExtentMax <= 0 )
  2822. return;
  2823. int nCountOfBars = (int)dbol.GetSize();
  2824. ASSERT( 0 <= nBarAdjustedSrc && nBarAdjustedSrc < nCountOfBars );
  2825. ASSERT( dbol.ElementAt(nBarAdjustedSrc).m_pBar == olidAdjustedSrc.m_pBar );
  2826. ASSERT( pAffixmentDataAdjustedSrc != NULL );
  2827. ASSERT( !pAffixmentDataAdjustedSrc->IsEmpty() );
  2828. int nPosAffixment = bHorz
  2829. ? pAffixmentDataAdjustedSrc->m_rcAffixment.left
  2830. : pAffixmentDataAdjustedSrc->m_rcAffixment.top
  2831. ;
  2832. int nPosPreCalc = bHorz
  2833. ? olidAdjustedSrc.m_rcPreCalc.left
  2834. : olidAdjustedSrc.m_rcPreCalc.top
  2835. ;
  2836. int nPosPossibleToFix = nPosPreCalc;
  2837. int nAdjustShift = nPosAffixment - nPosPreCalc;
  2838. if( nAdjustShift == 0 )
  2839. return;
  2840. if( nAdjustShift < 0 )
  2841. {
  2842. if( nBarAdjustedSrc == 0 )
  2843. {
  2844. nPosPossibleToFix =
  2845. max( nPosPossibleToFix, 0 );
  2846. } // if( nBarAdjustedSrc == 0 )
  2847. else
  2848. {
  2849. OuterLayoutItemData & olid2 = dbol.ElementAt( nBarAdjustedSrc-1 );
  2850. ASSERT_VALID( olid2.m_pBar );
  2851. ASSERT_KINDOF( CControlBar, olid2.m_pBar );
  2852. ASSERT( olid2.m_bVisible );
  2853. nPosPossibleToFix = bHorz
  2854. ? olid2.m_rcPreCalc.right
  2855. : olid2.m_rcPreCalc.bottom
  2856. ;
  2857. } // else from if( nBarAdjustedSrc == 0 )
  2858. int nPossibleShift = nPosPossibleToFix - nPosPreCalc;
  2859. nAdjustShift = max( nAdjustShift, nPossibleShift );
  2860. } // if( nAdjustShift < 0 )
  2861. else
  2862. {
  2863. nPosPreCalc += bHorz
  2864. ? olidAdjustedSrc.m_rcPreCalc.Width()
  2865. : olidAdjustedSrc.m_rcPreCalc.Height()
  2866. ;
  2867. nPosPossibleToFix = nPosPreCalc;
  2868. if( nBarAdjustedSrc == (nCountOfBars-1) )
  2869. {
  2870. nPosPossibleToFix =
  2871. min( nPosPossibleToFix, nExtentMax );
  2872. } // if( nBarAdjustedSrc == (nCountOfBars-1) )
  2873. else
  2874. {
  2875. OuterLayoutItemData & olid2 = dbol.ElementAt( nBarAdjustedSrc+1 );
  2876. ASSERT_VALID( olid2.m_pBar );
  2877. ASSERT_KINDOF( CControlBar, olid2.m_pBar );
  2878. ASSERT( olid2.m_bVisible );
  2879. nPosPossibleToFix = bHorz
  2880. ? olid2.m_rcPreCalc.left
  2881. : olid2.m_rcPreCalc.top
  2882. ;
  2883. } // else from if( nBarAdjustedSrc == (nCountOfBars-1) )
  2884. int nPossibleShift = nPosPossibleToFix - nPosPreCalc;
  2885. nAdjustShift = min( nAdjustShift, nPossibleShift );
  2886. } // else from if( nAdjustShift < 0 )
  2887. if( nAdjustShift == 0 )
  2888. return;
  2889. olidAdjustedSrc.m_rcPreCalc.OffsetRect(
  2890. bHorz ? nAdjustShift : 0,
  2891. bHorz ? 0 : nAdjustShift
  2892. );
  2893. }
  2894. int CExtDockOuterBar::_ShiftSubRowWithAffixment(
  2895. bool bHorz,
  2896. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  2897. int nReviewStart,
  2898. int nReviewEnd,
  2899. int nAdjustShift,
  2900. int nExtentMax
  2901. )
  2902. {
  2903. ASSERT( dbol.GetSize() > 0 );
  2904. ASSERT( 0 <= nReviewStart && nReviewStart < dbol.GetSize() );
  2905. ASSERT( 0 <= nReviewEnd && nReviewEnd < dbol.GetSize() );
  2906. ASSERT( nReviewStart <= nReviewEnd );
  2907. ASSERT( nAdjustShift != 0 );
  2908. ASSERT( nExtentMax > 0 );
  2909. if( nReviewStart == nReviewEnd )
  2910. {
  2911. OuterLayoutItemData & olid = dbol.ElementAt( nReviewStart );
  2912. ASSERT_VALID( olid.m_pBar );
  2913. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  2914. ASSERT( olid.m_bVisible );
  2915. int nPosPreCalc = bHorz
  2916. ? olid.m_rcPreCalc.left
  2917. : olid.m_rcPreCalc.top
  2918. ;
  2919. ASSERT( nPosPreCalc >= 0 );
  2920. if( nAdjustShift > 0 )
  2921. {
  2922. ASSERT( nReviewStart == dbol.GetSize()-1 );
  2923. nPosPreCalc += bHorz
  2924. ? olid.m_rcPreCalc.Width()
  2925. : olid.m_rcPreCalc.Height()
  2926. ;
  2927. ASSERT( nPosPreCalc >= 0 );
  2928. ASSERT( nPosPreCalc <= nExtentMax );
  2929. if( nPosPreCalc == nExtentMax )
  2930. return 0;
  2931. int nRest = nExtentMax - nPosPreCalc;
  2932. ASSERT( nRest >= 0 );
  2933. nAdjustShift = min( nAdjustShift, nRest );
  2934. ASSERT( nAdjustShift >= 0 );
  2935. } // if( nAdjustShift > 0 )
  2936. else
  2937. {
  2938. ASSERT( nReviewStart == 0 );
  2939. // if( nPosPreCalc == 0 )
  2940. // return 0;
  2941. //if( nPosPreCalc < 0 )
  2942. // return 0;
  2943. nAdjustShift = max( (-nPosPreCalc), nAdjustShift );
  2944. ASSERT( nAdjustShift <= 0 );
  2945. } // else from if( nAdjustShift > 0 )
  2946. olid.m_rcPreCalc.OffsetRect(
  2947. bHorz ? nAdjustShift : 0,
  2948. bHorz ? 0 : nAdjustShift
  2949. );
  2950. ASSERT( olid.m_rcPreCalc.left >= 0 );
  2951. ASSERT( olid.m_rcPreCalc.top >= 0 );
  2952. return nAdjustShift;
  2953. } // if( nReviewStart == nReviewEnd )
  2954. if( nAdjustShift > 0 )
  2955. {
  2956. OuterLayoutItemData & olid1 = dbol.ElementAt( nReviewStart );
  2957. ASSERT_VALID( olid1.m_pBar );
  2958. ASSERT_KINDOF( CControlBar, olid1.m_pBar );
  2959. ASSERT( olid1.m_bVisible );
  2960. ASSERT( olid1.m_rcPreCalc.left >= 0 );
  2961. ASSERT( olid1.m_rcPreCalc.top >= 0 );
  2962. int nPosPreCalc1 = bHorz
  2963. ? olid1.m_rcPreCalc.right // (olid1.m_rcPreCalc.left + olid1.m_rcPreCalc.Width())
  2964. : olid1.m_rcPreCalc.bottom // (olid1.m_rcPreCalc.top + olid1.m_rcPreCalc.Height())
  2965. ;
  2966. ASSERT( nPosPreCalc1 >= 0 );
  2967. OuterLayoutItemData & olid2 = dbol.ElementAt( nReviewStart + 1 );
  2968. ASSERT_VALID( olid2.m_pBar );
  2969. ASSERT_KINDOF( CControlBar, olid2.m_pBar );
  2970. ASSERT( olid2.m_bVisible );
  2971. ASSERT( olid2.m_rcPreCalc.left >= 0 );
  2972. ASSERT( olid2.m_rcPreCalc.top >= 0 );
  2973. int nPosPreCalc2 = bHorz
  2974. ? olid2.m_rcPreCalc.left
  2975. : olid2.m_rcPreCalc.top
  2976. ;
  2977. ASSERT( nPosPreCalc2 >= 0 );
  2978. int nDist = nPosPreCalc2 - nPosPreCalc1;
  2979. ASSERT( nDist >= 0 );
  2980. nDist = min( nAdjustShift, nDist );
  2981. ASSERT( nDist <= nAdjustShift );
  2982. if( nDist == nAdjustShift )
  2983. {
  2984. olid1.m_rcPreCalc.OffsetRect(
  2985. bHorz ? nAdjustShift : 0,
  2986. bHorz ? 0 : nAdjustShift
  2987. );
  2988. ASSERT( olid1.m_rcPreCalc.left >= 0 );
  2989. ASSERT( olid1.m_rcPreCalc.top >= 0 );
  2990. return nAdjustShift;
  2991. }
  2992. int nSpaceToCompress = nAdjustShift - nDist;
  2993. ASSERT( nSpaceToCompress > 0 );
  2994. int nSpaceReallyCompressed =
  2995. _ShiftSubRowWithAffixment(
  2996. bHorz,
  2997. dbol,
  2998. nReviewStart + 1,
  2999. nReviewEnd,
  3000. nSpaceToCompress,
  3001. nExtentMax
  3002. );
  3003. ASSERT( nSpaceReallyCompressed >= 0 );
  3004. ASSERT( nSpaceReallyCompressed <= nSpaceToCompress );
  3005. /*?????*/ nAdjustShift = nSpaceReallyCompressed + nDist;
  3006. olid1.m_rcPreCalc.OffsetRect(
  3007. bHorz ? nAdjustShift : 0,
  3008. bHorz ? 0 : nAdjustShift
  3009. );
  3010. ASSERT( olid1.m_rcPreCalc.left >= 0 );
  3011. ASSERT( olid1.m_rcPreCalc.top >= 0 );
  3012. } // if( nAdjustShift > 0 )
  3013. else
  3014. {
  3015. OuterLayoutItemData & olid1 = dbol.ElementAt( nReviewEnd );
  3016. ASSERT_VALID( olid1.m_pBar );
  3017. ASSERT_KINDOF( CControlBar, olid1.m_pBar );
  3018. ASSERT( olid1.m_bVisible );
  3019. ASSERT( olid1.m_rcPreCalc.left >= 0 );
  3020. ASSERT( olid1.m_rcPreCalc.top >= 0 );
  3021. int nPosPreCalc1 = bHorz
  3022. ? olid1.m_rcPreCalc.left
  3023. : olid1.m_rcPreCalc.top
  3024. ;
  3025. ASSERT( nPosPreCalc1 >= 0 );
  3026. OuterLayoutItemData & olid2 = dbol.ElementAt( nReviewEnd - 1 );
  3027. ASSERT_VALID( olid2.m_pBar );
  3028. ASSERT_KINDOF( CControlBar, olid2.m_pBar );
  3029. ASSERT( olid2.m_bVisible );
  3030. ASSERT( olid2.m_rcPreCalc.left >= 0 );
  3031. ASSERT( olid2.m_rcPreCalc.top >= 0 );
  3032. int nPosPreCalc2 = bHorz
  3033. ? olid2.m_rcPreCalc.right // (olid2.m_rcPreCalc.left + olid2.m_rcPreCalc.Width())
  3034. : olid2.m_rcPreCalc.bottom // (olid2.m_rcPreCalc.top + olid2.m_rcPreCalc.Height())
  3035. ;
  3036. ASSERT( nPosPreCalc2 >= 0 );
  3037. int nDist = nPosPreCalc2 - nPosPreCalc1;
  3038. ASSERT( nDist <= 0 );
  3039. nDist = max( nAdjustShift, nDist );
  3040. ASSERT( nDist >= nAdjustShift );
  3041. if( nDist == nAdjustShift )
  3042. {
  3043. olid1.m_rcPreCalc.OffsetRect(
  3044. bHorz ? nAdjustShift : 0,
  3045. bHorz ? 0 : nAdjustShift
  3046. );
  3047. ASSERT( olid1.m_rcPreCalc.left >= 0 );
  3048. ASSERT( olid1.m_rcPreCalc.top >= 0 );
  3049. return nAdjustShift;
  3050. }
  3051. int nSpaceToCompress = nAdjustShift - nDist;
  3052. ASSERT( nSpaceToCompress < 0 );
  3053. int nSpaceReallyCompressed =
  3054. _ShiftSubRowWithAffixment(
  3055. bHorz,
  3056. dbol,
  3057. nReviewStart,
  3058. nReviewEnd - 1,
  3059. nSpaceToCompress,
  3060. nExtentMax
  3061. );
  3062. ASSERT( nSpaceReallyCompressed <= 0 );
  3063. ASSERT( nSpaceReallyCompressed >= nSpaceToCompress );
  3064. /*?????*/ nAdjustShift = nSpaceReallyCompressed + nDist;
  3065. olid1.m_rcPreCalc.OffsetRect(
  3066. bHorz ? nAdjustShift : 0,
  3067. bHorz ? 0 : nAdjustShift
  3068. );
  3069. ASSERT( olid2.m_rcPreCalc.left >= 0 );
  3070. ASSERT( olid2.m_rcPreCalc.top >= 0 );
  3071. } // else from if( nAdjustShift > 0 )
  3072. return nAdjustShift;
  3073. }
  3074. void CExtDockOuterBar::_AdjustByTotalRowExtent(
  3075. int & nTotalRowExtent,
  3076. CSize & sizeFixed,
  3077. CPoint & pt,
  3078. BOOL bHorz
  3079. )
  3080. {
  3081. if( nTotalRowExtent == 0 )
  3082. return;
  3083. if( bHorz )
  3084. {
  3085. pt.y += nTotalRowExtent;
  3086. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  3087. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  3088. pt.x = 0;
  3089. sizeFixed.cy--;
  3090. } // if( bHorz )
  3091. else
  3092. {
  3093. pt.x += nTotalRowExtent;
  3094. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  3095. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  3096. pt.y = 0;
  3097. sizeFixed.cx--;
  3098. } // else from if( bHorz )
  3099. nTotalRowExtent = 0;
  3100. }
  3101. CSize CExtDockOuterBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  3102. {
  3103. ASSERT_VALID(this);
  3104. CSize sizeFixed =
  3105. CControlBar::CalcFixedLayout( bStretch, bHorz );
  3106. CSize sizeMax;
  3107. if( !m_rectLayout.IsRectEmpty() )
  3108. sizeMax = m_rectLayout.Size();
  3109. else
  3110. {
  3111. CFrameWnd * pFrame = GetParentFrame();
  3112. CRect rcFrameWindow;
  3113. pFrame->GetClientRect( &rcFrameWindow );
  3114. sizeMax = rcFrameWindow.Size();
  3115. }
  3116. CPoint pt( 0, 0 );
  3117. int nCountOfBars = (int)m_arrBars.GetSize();
  3118. AFX_SIZEPARENTPARAMS layout;
  3119. layout.hDWP =
  3120. m_bLayoutQuery
  3121. ? NULL
  3122. : ( ::BeginDeferWindowPos(nCountOfBars) )
  3123. ;
  3124. dockbar_outer_layout_t dbol;
  3125. for( int nBar = 0; nBar < nCountOfBars; nBar++ )
  3126. {
  3127. CControlBar * pBar = (CControlBar *)m_arrBars[nBar];
  3128. if( pBar != NULL
  3129. && (!(__PLACEHODLER_BAR_PTR(pBar)))
  3130. )
  3131. {
  3132. ASSERT_VALID( pBar );
  3133. ASSERT_KINDOF( CControlBar, pBar );
  3134. dbol.Add(
  3135. OuterLayoutItemData(
  3136. pBar,
  3137. bHorz,
  3138. sizeMax
  3139. )
  3140. );
  3141. } // if( pBar != NULL && ...
  3142. if( pBar == NULL || nBar == (nCountOfBars-1) )
  3143. {
  3144. if( dbol.GetSize() == 0 )
  3145. continue;
  3146. _CalcFixedRowLayout(
  3147. sizeFixed,
  3148. sizeMax,
  3149. pt,
  3150. bHorz,
  3151. layout,
  3152. dbol
  3153. );
  3154. dbol.RemoveAll();
  3155. } // if( pBar == NULL || nBar == (nCountOfBars-1) )
  3156. } // for( int nBar = 0; nBar < nCountOfBars; nBar++ )
  3157. ASSERT( dbol.GetSize() == 0 );
  3158. if( !m_bLayoutQuery )
  3159. {
  3160. ASSERT( layout.hDWP != NULL );
  3161. if( layout.hDWP != NULL )
  3162. {
  3163. VERIFY( ::EndDeferWindowPos(layout.hDWP) );
  3164. }
  3165. } // if( !m_bLayoutQuery )
  3166. // adjust size for borders on the dock bar itself
  3167. CRect rc( 0, 0, 0, 0 );
  3168. CalcInsideRect(rc, bHorz);
  3169. if( (!bStretch || !bHorz) && sizeFixed.cx != 0 )
  3170. sizeFixed.cx +=
  3171. -rc.right + rc.left
  3172. + g_bControlBarFixSizePixel ? 1 : 0;
  3173. if( (!bStretch || bHorz) && sizeFixed.cy != 0 )
  3174. sizeFixed.cy +=
  3175. -rc.bottom + rc.top
  3176. + g_bControlBarFixSizePixel ? 1 : 0;
  3177. if( ! m_bLayoutQuery )
  3178. OnDynamicLayoutUpdate();
  3179. return sizeFixed;
  3180. }
  3181. void CExtDockOuterBar::_RedockInRow(
  3182. CExtControlBar * pBarSlide,
  3183. int nShiftDesired,
  3184. bool * p_bInplaceResizing // = NULL
  3185. )
  3186. {
  3187. ASSERT_VALID( this );
  3188. ASSERT_VALID( pBarSlide );
  3189. ASSERT( this == pBarSlide->GetParent() );
  3190. if( p_bInplaceResizing != NULL )
  3191. *p_bInplaceResizing = false;
  3192. if( nShiftDesired == 0 )
  3193. return;
  3194. int nCountOfBars = (int)m_arrBars.GetSize();
  3195. ASSERT( nCountOfBars > 1 );
  3196. int nSlideBarPos = FindBar( pBarSlide );
  3197. ASSERT( 0 < nSlideBarPos && nSlideBarPos < nCountOfBars );
  3198. CControlBar * pFirstBar =
  3199. pBarSlide->_GetFirstControlBarInRow(
  3200. pBarSlide,
  3201. false,
  3202. false,
  3203. false
  3204. );
  3205. ASSERT_VALID( pFirstBar );
  3206. int nFirstBarPos = FindBar( pFirstBar );
  3207. ASSERT( 0 < nFirstBarPos && nFirstBarPos < nCountOfBars );
  3208. ASSERT( nFirstBarPos <= nSlideBarPos );
  3209. UINT nDockBarID = GetDlgCtrlID();
  3210. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  3211. BOOL bHorz = 
  3212. ( nDockBarID == AFX_IDW_DOCKBAR_TOP
  3213. || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM )
  3214. ? TRUE : FALSE;
  3215. CRect rcSlideBarWnd;
  3216. pBarSlide->GetWindowRect( &rcSlideBarWnd );
  3217. ScreenToClient( &rcSlideBarWnd );
  3218. CSize sizeMax, sizeFakeFixed( 0, 0 );
  3219. if( !m_rectLayout.IsRectEmpty() )
  3220. sizeMax = m_rectLayout.Size();
  3221. else
  3222. {
  3223. CFrameWnd * pFrame = GetParentFrame();
  3224. CRect rcFrameWindow;
  3225. pFrame->GetClientRect( &rcFrameWindow );
  3226. sizeMax = rcFrameWindow.Size();
  3227. }
  3228. CPoint pt( 0, 0 );
  3229. if( bHorz )
  3230. pt.y = rcSlideBarWnd.top;
  3231. else
  3232. pt.x = rcSlideBarWnd.left;
  3233. CExtControlBar::InternalAffixmentData * pAffixmentData =
  3234. pBarSlide->_AffixmentGetOuter();
  3235. if( pAffixmentData != NULL )
  3236. {
  3237. ASSERT( !pAffixmentData->IsEmpty() );
  3238. if( pAffixmentData->m_rcAffixment.IsRectEmpty() )
  3239. {
  3240. pBarSlide->GetWindowRect( &pAffixmentData->m_rcAffixment );
  3241. ScreenToClient( &pAffixmentData->m_rcAffixment );
  3242. }
  3243. pAffixmentData->m_rcAffixment.OffsetRect(
  3244. bHorz ? nShiftDesired : 0,
  3245. bHorz ? 0 : nShiftDesired
  3246. );
  3247. if( bHorz )
  3248. {
  3249. if( pAffixmentData->m_rcAffixment.right >= sizeMax.cx )
  3250. pAffixmentData->m_rcAffixment.OffsetRect(
  3251. sizeMax.cx - pAffixmentData->m_rcAffixment.right,
  3252. 0
  3253. );
  3254. if( pAffixmentData->m_rcAffixment.left < 0 )
  3255. pAffixmentData->m_rcAffixment.OffsetRect(
  3256. - pAffixmentData->m_rcAffixment.left,
  3257. 0
  3258. );
  3259. } // if( bHorz )
  3260. else
  3261. {
  3262. if( pAffixmentData->m_rcAffixment.bottom >= sizeMax.cy )
  3263. pAffixmentData->m_rcAffixment.OffsetRect(
  3264. 0,
  3265. sizeMax.cy - pAffixmentData->m_rcAffixment.bottom
  3266. );
  3267. if( pAffixmentData->m_rcAffixment.top < 0 )
  3268. pAffixmentData->m_rcAffixment.OffsetRect(
  3269. 0,
  3270. - pAffixmentData->m_rcAffixment.top
  3271. );
  3272. } // else from if( bHorz )
  3273. }
  3274. dockbar_outer_layout_t dbol;
  3275. int nBar = 0;
  3276. for( nBar = nFirstBarPos; nBar < nCountOfBars; nBar++ )
  3277. {
  3278. CControlBar * pBar = (CControlBar *)m_arrBars[nBar];
  3279. if( pBar != NULL
  3280. && (!(__PLACEHODLER_BAR_PTR(pBar)))
  3281. )
  3282. {
  3283. ASSERT_VALID( pBar );
  3284. ASSERT_KINDOF( CControlBar, pBar );
  3285. OuterLayoutItemData olid(
  3286. pBar,
  3287. bHorz,
  3288. sizeMax
  3289. );
  3290. if( pBar == pBarSlide )
  3291. {
  3292. if( pAffixmentData == NULL )
  3293. olid.m_rcPreCalc.OffsetRect(
  3294. bHorz ? nShiftDesired : 0,
  3295. bHorz ? 0 : nShiftDesired
  3296. );
  3297. } // if( pBar == pBarSlide )
  3298. dbol.Add( olid );
  3299. } // if( pBar != NULL && ...
  3300. if( pBar == NULL || nBar == (nCountOfBars-1) )
  3301. break;
  3302. } // for( nBar = nFirstBarPos; nBar < nCountOfBars; nBar++ )
  3303. ASSERT( dbol.GetSize() != 0 );
  3304. int nSubRowCount = 0;
  3305. bool bFullyOccupiedLayout = false;
  3306. BOOL bLayoutQueryOld = m_bLayoutQuery;
  3307. CSize sizeFakeFixedOld( sizeFakeFixed ), sizeMaxOld( sizeMax );
  3308. CPoint ptOld( pt );
  3309. AFX_SIZEPARENTPARAMS layout;
  3310. layout.hDWP = NULL;
  3311. _CalcFixedRowLayout(
  3312. sizeFakeFixed,
  3313. sizeMax,
  3314. pt,
  3315. bHorz,
  3316. layout,
  3317. dbol,
  3318. &nSubRowCount,
  3319. &bFullyOccupiedLayout
  3320. );
  3321. m_bLayoutQuery = bLayoutQueryOld;
  3322. ASSERT( nSubRowCount >= 1 );
  3323. if( m_bLayoutQuery )
  3324. return;
  3325. ASSERT( (nCountOfBars - nFirstBarPos) > 0 );
  3326. sizeFakeFixed = sizeFakeFixedOld;
  3327. sizeMax = sizeMaxOld;
  3328. pt = ptOld;
  3329. nCountOfBars = (int)dbol.GetSize();
  3330. ASSERT( nCountOfBars > 0 );
  3331. layout.hDWP =
  3332. ::BeginDeferWindowPos(nCountOfBars);
  3333. // reasonable row shift offset
  3334. const int nRsOffset = 1; //2;
  3335. if( nCountOfBars > 1 && pAffixmentData != NULL )
  3336. {
  3337. int nSlideBarIdxInArray = -1;
  3338. for( int nBar = 0; nBar < nCountOfBars; nBar++ )
  3339. {
  3340. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  3341. ASSERT_VALID( olid.m_pBar );
  3342. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  3343. ASSERT( olid.m_bVisible );
  3344. if( olid.m_pBar == pBarSlide )
  3345. {
  3346. ASSERT( nSlideBarIdxInArray < 0 );
  3347. nSlideBarIdxInArray = nBar;
  3348. break;
  3349. }
  3350. } // for( nBar = 0; nBar < nCountOfBars; nBar++ )
  3351. ASSERT( 0 <= nSlideBarIdxInArray && nSlideBarIdxInArray < nCountOfBars );
  3352. OuterLayoutItemData & olid =
  3353. dbol.ElementAt( nSlideBarIdxInArray );
  3354. ASSERT_VALID( olid.m_pBar );
  3355. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  3356. ASSERT( olid.m_bVisible );
  3357. bool bTrySwapping = bFullyOccupiedLayout; // true; (+ v.2.22)
  3358. bool bUpAffxOnSwapping = true;
  3359. if( bFullyOccupiedLayout
  3360. && (nSubRowCount == 1)
  3361. )
  3362. { // if can analyze resizing in row
  3363. ASSERT( pAffixmentData != NULL );
  3364. if( nSlideBarIdxInArray > 0 )
  3365. { // do resizing pre-affixment, do not resize first in row
  3366. CSize sizeBarCalc = olid.m_rcPreCalc.Size();
  3367. if( nShiftDesired > 0 )
  3368. {
  3369. //ASSERT( (!bHorz) || sizeBarCalc.cx >= olid.m_sizeBarMin.cx );
  3370. //ASSERT( ( bHorz) || sizeBarCalc.cy >= olid.m_sizeBarMin.cy );
  3371. int nExtentPossibleByBar = bHorz
  3372. ? (sizeBarCalc.cx - olid.m_sizeBarMin.cx)
  3373. : (sizeBarCalc.cy - olid.m_sizeBarMin.cy)
  3374. ;
  3375. nExtentPossibleByBar =
  3376. min( nExtentPossibleByBar, nShiftDesired );
  3377. if( nExtentPossibleByBar > 0 )
  3378. {
  3379. bTrySwapping = false;
  3380. if( pAffixmentData->m_nAffixmentWeight != 1 )
  3381. _AffixmentBringToTop( pBarSlide );
  3382. if( bHorz )
  3383. {
  3384. int nNewAffixment = sizeBarCalc.cx - nExtentPossibleByBar;
  3385. if( nNewAffixment > olid.m_sizeCalcDynamic.cx )
  3386. nNewAffixment = olid.m_sizeCalcDynamic.cx;
  3387. if( pAffixmentData->m_sizeCompressed.cx != nNewAffixment )
  3388. pAffixmentData->m_sizeCompressed.cx = nNewAffixment;
  3389. else
  3390. bTrySwapping = true;
  3391. } // if( bHorz )
  3392. else
  3393. {
  3394. int nNewAffixment = sizeBarCalc.cy - nExtentPossibleByBar;
  3395. if( nNewAffixment > olid.m_sizeCalcDynamic.cy )
  3396. nNewAffixment = olid.m_sizeCalcDynamic.cy;
  3397. if( pAffixmentData->m_sizeCompressed.cy != nNewAffixment )
  3398. pAffixmentData->m_sizeCompressed.cy = nNewAffixment;
  3399. else
  3400. bTrySwapping = true;
  3401. } // else from if( bHorz )
  3402. } // if( nExtentPossibleByBar > 0 )
  3403. } // if( nShiftDesired > 0 )
  3404. else
  3405. {
  3406. //ASSERT( (!bHorz) || sizeBarCalc.cx >= olid.m_sizeBarMin.cx );
  3407. //ASSERT( ( bHorz) || sizeBarCalc.cy >= olid.m_sizeBarMin.cy );
  3408. int nExtentPossibleByBar = bHorz
  3409. ? (olid.m_sizeCalcDynamic.cx - sizeBarCalc.cx)
  3410. : (olid.m_sizeCalcDynamic.cy - sizeBarCalc.cy)
  3411. ;
  3412. nExtentPossibleByBar =
  3413. min( nExtentPossibleByBar, (-nShiftDesired) );
  3414. ASSERT( nExtentPossibleByBar >= 0 );
  3415. if( nExtentPossibleByBar > 0 )
  3416. {
  3417. bTrySwapping = false;
  3418. if( pAffixmentData->m_nAffixmentWeight != 1 )
  3419. _AffixmentBringToTop( pBarSlide );
  3420. if( bHorz )
  3421. {
  3422. int nNewAffixment = sizeBarCalc.cx + nExtentPossibleByBar;
  3423. if( nNewAffixment > olid.m_sizeCalcDynamic.cx )
  3424. nNewAffixment = olid.m_sizeCalcDynamic.cx;
  3425. if( pAffixmentData->m_sizeCompressed.cx != nNewAffixment )
  3426. pAffixmentData->m_sizeCompressed.cx = nNewAffixment;
  3427. else
  3428. bTrySwapping = true;
  3429. }
  3430. else
  3431. {
  3432. int nNewAffixment = sizeBarCalc.cy + nExtentPossibleByBar;
  3433. if( nNewAffixment > olid.m_sizeCalcDynamic.cy )
  3434. nNewAffixment = olid.m_sizeCalcDynamic.cy;
  3435. if( pAffixmentData->m_sizeCompressed.cy != nNewAffixment )
  3436. pAffixmentData->m_sizeCompressed.cy = nNewAffixment;
  3437. else
  3438. bTrySwapping = true;
  3439. }
  3440. } // if( nExtentPossibleByBar > 0 )
  3441. } // else from if( nShiftDesired > 0 )
  3442. } // do resizing pre-affixment, do not resize first in row
  3443. else
  3444. bUpAffxOnSwapping = false;
  3445. }  // if can analyze resizing in row
  3446. else if( (!bTrySwapping) && (nSubRowCount == 1) )
  3447. { // analyze left/right free space between bars is available (+ v.2.22)
  3448. ASSERT( !bFullyOccupiedLayout );
  3449. ASSERT( 0 <= nSlideBarIdxInArray && nSlideBarIdxInArray < nCountOfBars );
  3450. int nStartBar = nSlideBarIdxInArray + 1;
  3451. int nEndBar = nCountOfBars - 1;
  3452. if( nShiftDesired < 0 )
  3453. {
  3454. nStartBar = 0;
  3455. nEndBar = nSlideBarIdxInArray;
  3456. }
  3457. for( int nBarXSP = nStartBar; nBarXSP <= nEndBar; nBarXSP++ )
  3458. {
  3459. OuterLayoutItemData & olid = dbol.ElementAt( nBarXSP );
  3460. ASSERT_VALID( olid.m_pBar );
  3461. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  3462. ASSERT( olid.m_bVisible );
  3463. int nFreeBefore = 0;
  3464. CRect rcBarLocal( olid.m_rcReal );
  3465. if( nBarXSP == 0 )
  3466. nFreeBefore = bHorz ? rcBarLocal.left : rcBarLocal.top;
  3467. else
  3468. {
  3469. OuterLayoutItemData & olidPrev = dbol.ElementAt( nBarXSP-1 );
  3470. ASSERT_VALID( olidPrev.m_pBar );
  3471. ASSERT_KINDOF( CControlBar, olidPrev.m_pBar );
  3472. ASSERT( olidPrev.m_bVisible );
  3473. CRect rcBarLocalPrev( olidPrev.m_rcReal );
  3474. nFreeBefore = bHorz
  3475. ? (rcBarLocal.left - rcBarLocalPrev.right)
  3476. : (rcBarLocal.top - rcBarLocalPrev.bottom)
  3477. ;
  3478. } // else from if( nBarXSP == 0 )
  3479. if( nFreeBefore < 0 )
  3480. nFreeBefore = 0;
  3481. if( nShiftDesired < 0 && nFreeBefore == 0 )
  3482. {
  3483. if( nBarXSP == nEndBar )
  3484. {
  3485. bTrySwapping = true;
  3486. break;
  3487. }
  3488. continue;
  3489. } // if( nShiftDesired < 0  )
  3490. if( nShiftDesired > 0 && nFreeBefore > 0 )
  3491. break; // no swapping to right/bottom (have some space to slide)
  3492. if( nBarXSP == nEndBar && nShiftDesired > 0 )
  3493. {
  3494. CRect rcThisDocker;
  3495. GetClientRect( &rcThisDocker );
  3496. ASSERT( rcThisDocker.left == 0 && rcThisDocker.top == 0 );
  3497. if( rcThisDocker.right <= 0 || rcThisDocker.bottom <= 0 )
  3498. break; // empty space for anything
  3499. int nFreeAfter = bHorz
  3500. ? (rcThisDocker.right - rcBarLocal.right)
  3501. : (rcThisDocker.bottom - rcBarLocal.bottom)
  3502. ;
  3503. if( nFreeAfter <= 0 )
  3504. {
  3505. bTrySwapping = true;
  3506. break;
  3507. }
  3508. } // if( nBarXSP == nEndBar && nShiftDesired > 0 )
  3509. } // for( int nBarXSP = nStartBar; nBarXSP <= nEndBar; nBarXSP++ )
  3510. } // analyze left/right free space between bars is available (+ v.2.22)
  3511. if( bTrySwapping )
  3512. {
  3513. if( bUpAffxOnSwapping )
  3514. _AffixmentBringToTop( pBarSlide );
  3515. pAffixmentData->m_rcAffixment = olid.m_rcPreCalc;
  3516. if( nShiftDesired > 0 )
  3517. {
  3518. if( nSlideBarIdxInArray != (nCountOfBars-1) )
  3519. {
  3520. OuterLayoutItemData & olid2 =
  3521. dbol.ElementAt( nSlideBarIdxInArray + 1 );
  3522. ASSERT_VALID( olid2.m_pBar );
  3523. ASSERT_KINDOF( CControlBar, olid2.m_pBar );
  3524. ASSERT( olid2.m_bVisible );
  3525. CExtControlBar * pExtBar2 =
  3526. DYNAMIC_DOWNCAST(
  3527. CExtControlBar,
  3528. olid2.m_pBar
  3529. );
  3530. if( pExtBar2 != NULL )
  3531. {
  3532. CExtControlBar::InternalAffixmentData * pAffixmentData2 =
  3533. pExtBar2->_AffixmentGetOuter();
  3534. if( pAffixmentData2 != NULL )
  3535. {
  3536. int nPosAffx2 = bHorz
  3537. ? pAffixmentData2->m_rcAffixment.left
  3538. : pAffixmentData2->m_rcAffixment.top
  3539. ;
  3540. int nPosReal2 = bHorz
  3541. ? olid2.m_rcPreCalc.left
  3542. : olid2.m_rcPreCalc.top
  3543. ;
  3544. int n1stExtent = bHorz
  3545. ? olid.m_rcPreCalc.Width()
  3546. : olid.m_rcPreCalc.Height()
  3547. ;
  3548. // nPosReal2 += nRsOffset;
  3549. // nPosReal2 += nShiftDesired;
  3550. if( (nPosReal2 - n1stExtent) > nPosAffx2 )
  3551. _SwapInRowWithAffixment(
  3552. dbol,
  3553. nSlideBarIdxInArray,
  3554. nSlideBarIdxInArray + 1
  3555. );
  3556. else
  3557. {
  3558. int nPosReal = bHorz
  3559. ? olid.m_rcPreCalc.left
  3560. : olid.m_rcPreCalc.top
  3561. ;
  3562. int n2ndExtent = bHorz
  3563. ? olid2.m_rcPreCalc.Width()
  3564. : olid2.m_rcPreCalc.Height()
  3565. ;
  3566. if( ( (nPosReal2+n2ndExtent)
  3567. - (nPosReal+n1stExtent)
  3568. - nShiftDesired
  3569. - nRsOffset
  3570. )
  3571. <= 0
  3572. )
  3573. _SwapInRowWithAffixment(
  3574. dbol,
  3575. nSlideBarIdxInArray,
  3576. nSlideBarIdxInArray + 1
  3577. );
  3578. }
  3579. } // if( pAffixmentData2 != NULL )
  3580. } // if( pExtBar2 != NULL )
  3581. } // if( nSlideBarIdxInArray != (nCountOfBars-1) )
  3582. } // if( nShiftDesired > 0 )
  3583. else
  3584. {
  3585. if( nSlideBarIdxInArray != 0 )
  3586. {
  3587. OuterLayoutItemData & olid2 =
  3588. dbol.ElementAt( nSlideBarIdxInArray - 1 );
  3589. ASSERT_VALID( olid2.m_pBar );
  3590. ASSERT_KINDOF( CControlBar, olid2.m_pBar );
  3591. ASSERT( olid2.m_bVisible );
  3592. CExtControlBar * pExtBar2 =
  3593. DYNAMIC_DOWNCAST(
  3594. CExtControlBar,
  3595. olid2.m_pBar
  3596. );
  3597. if( pExtBar2 != NULL )
  3598. {
  3599. CExtControlBar::InternalAffixmentData * pAffixmentData2 =
  3600. pExtBar2->_AffixmentGetOuter();
  3601. if( pAffixmentData2 != NULL )
  3602. {
  3603. int nPosReal = bHorz
  3604. ? olid.m_rcPreCalc.left
  3605. : olid.m_rcPreCalc.top
  3606. ;
  3607. int nPosAffx2 = bHorz
  3608. ? pAffixmentData2->m_rcAffixment.left
  3609. : pAffixmentData2->m_rcAffixment.top
  3610. ;
  3611. // nPosReal -= nRsOffset;
  3612. // nPosReal += nShiftDesired;
  3613. if( nPosReal <= nPosAffx2 )
  3614. _SwapInRowWithAffixment(
  3615. dbol,
  3616. nSlideBarIdxInArray - 1,
  3617. nSlideBarIdxInArray
  3618. );
  3619. else
  3620. {
  3621. int nPosReal2 = bHorz
  3622. ? olid2.m_rcPreCalc.left
  3623. : olid2.m_rcPreCalc.top
  3624. ;
  3625. // int n1stExtent = bHorz
  3626. // ? olid.m_rcPreCalc.Width()
  3627. // : olid.m_rcPreCalc.Height()
  3628. // ;
  3629. // int n2ndExtent = bHorz
  3630. // ? olid2.m_rcPreCalc.Width()
  3631. // : olid2.m_rcPreCalc.Height()
  3632. // ;
  3633. if( ( (nPosReal /*+n1stExtent*/ )
  3634. - (nPosReal2 /*+n2ndExtent*/ )
  3635. + nShiftDesired
  3636. - nRsOffset
  3637. )
  3638. <= 0
  3639. )
  3640. _SwapInRowWithAffixment(
  3641. dbol,
  3642. nSlideBarIdxInArray - 1,
  3643. nSlideBarIdxInArray
  3644. );
  3645. }
  3646. } // if( pAffixmentData2 != NULL )
  3647. } // if( pExtBar2 != NULL )
  3648. } // if( nSlideBarIdxInArray != 0 )
  3649. } // else from if( nShiftDesired > 0 )
  3650. } // if( bTrySwapping )
  3651. else
  3652. {
  3653. if( p_bInplaceResizing != NULL )
  3654. *p_bInplaceResizing = bFullyOccupiedLayout; //true; (+ v.2.22)
  3655. } // else from if( bTrySwapping )
  3656. } // if( nCountOfBars > 1 && pAffixmentData != NULL )
  3657. _CalcFixedRowLayout(
  3658. sizeFakeFixed,
  3659. sizeMax,
  3660. pt,
  3661. bHorz,
  3662. layout,
  3663. dbol
  3664. );
  3665. ASSERT( layout.hDWP != NULL );
  3666. if( layout.hDWP != NULL )
  3667. {
  3668. VERIFY( ::EndDeferWindowPos(layout.hDWP) );
  3669. }
  3670. for( nBar = 0; nBar < dbol.GetSize(); nBar++ )
  3671. {
  3672. OuterLayoutItemData & olid =
  3673. dbol.ElementAt( nBar );
  3674. ASSERT_VALID( olid.m_pBar );
  3675. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  3676. if( !olid.m_bVisible )
  3677. continue;
  3678. CExtControlBar * pExtBar =
  3679. DYNAMIC_DOWNCAST( CExtControlBar, olid.m_pBar );
  3680. if( pExtBar == NULL )
  3681. continue;
  3682. pExtBar->RedrawWindow(
  3683. NULL, NULL,
  3684. RDW_INVALIDATE|RDW_UPDATENOW
  3685. |RDW_ERASE|RDW_ERASENOW
  3686. |RDW_ALLCHILDREN|RDW_NOFRAME
  3687. );
  3688. } // for( nBar = 0; nBar < dbol.GetSize(); nBar++ )
  3689. }
  3690. void CExtDockOuterBar::_SwapInRowWithAffixment(
  3691. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  3692. int nIdxLess,
  3693. int nIdxGreater
  3694. )
  3695. {
  3696. ASSERT( dbol.GetSize() > 1 );
  3697. ASSERT( 0 <= nIdxLess && nIdxLess <= dbol.GetSize() );
  3698. ASSERT( 0 <= nIdxGreater && nIdxGreater <= dbol.GetSize() );
  3699. ASSERT( (nIdxLess+1) == nIdxGreater );
  3700. OuterLayoutItemData & olid1 = dbol.ElementAt( nIdxLess );
  3701. ASSERT_VALID( olid1.m_pBar );
  3702. ASSERT_KINDOF( CControlBar, olid1.m_pBar );
  3703. ASSERT( olid1.m_bVisible );
  3704. CControlBar * pBar1 = olid1.m_pBar;
  3705. int nPosInternal1 = FindBar( pBar1 );
  3706. ASSERT( 0 < nPosInternal1 && nPosInternal1 < m_arrBars.GetSize() );
  3707. OuterLayoutItemData & olid2 = dbol.ElementAt( nIdxGreater );
  3708. ASSERT_VALID( olid2.m_pBar );
  3709. ASSERT_KINDOF( CControlBar, olid2.m_pBar );
  3710. ASSERT( olid2.m_bVisible );
  3711. CControlBar * pBar2 = olid2.m_pBar;
  3712. int nPosInternal2 = FindBar( pBar2 );
  3713. ASSERT( 0 < nPosInternal2 && nPosInternal2 < m_arrBars.GetSize() );
  3714. ASSERT( pBar1 != pBar2 );
  3715. ASSERT( nPosInternal1 != nPosInternal2 );
  3716. m_arrBars[ nPosInternal1 ] = pBar2;
  3717. m_arrBars[ nPosInternal2 ] = pBar1;
  3718. OuterLayoutItemData olid = dbol.ElementAt( nIdxGreater );
  3719. dbol.RemoveAt( nIdxGreater );
  3720. dbol.InsertAt( nIdxLess, olid );
  3721. }
  3722. bool CExtDockOuterBar::_ReDockToNewRow(
  3723. CControlBar * pBarSlide,
  3724. MfcControlBarVector_t & vRow,
  3725. int nShiftDesired
  3726. )
  3727. {
  3728. ASSERT_VALID( this );
  3729. ASSERT_VALID( pBarSlide );
  3730. ASSERT( pBarSlide->m_pDockBar == this );
  3731. ASSERT( pBarSlide->IsVisible() );
  3732. int nCountOfBars = (int)vRow.GetSize();
  3733. ASSERT( nCountOfBars > 0 );
  3734. UINT nDockBarID = GetDlgCtrlID();
  3735. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  3736. bool bHorz = 
  3737. ( nDockBarID == AFX_IDW_DOCKBAR_TOP
  3738. || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM )
  3739. ? TRUE : FALSE;
  3740. CRect rcBarSlide, rcBarSlideOrg, rcBarInsertBefore;
  3741. pBarSlide->GetWindowRect( &rcBarSlide );
  3742. ScreenToClient( &rcBarSlide );
  3743. rcBarSlideOrg = rcBarSlide;
  3744. int nExtentBarSlideMinPossible = 0;
  3745. if( pBarSlide->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  3746. {
  3747. CSize sizeBarSlideMinPossible =
  3748. ((CExtControlBar*)pBarSlide)->_CalcDesiredMinOuterSize(
  3749. bHorz ? TRUE : FALSE );
  3750. nExtentBarSlideMinPossible = bHorz
  3751. ? sizeBarSlideMinPossible.cx
  3752. : sizeBarSlideMinPossible.cy
  3753. ;
  3754. } // if( pBarSlide->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  3755. else
  3756. {
  3757. CRect rcBar;
  3758. pBarSlide->GetWindowRect( &rcBar );
  3759. nExtentBarSlideMinPossible = bHorz
  3760. ? rcBar.Width()
  3761. : rcBar.Height()
  3762. ;
  3763. } // else from if( pBarSlide->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  3764. int nExtentRowMinPossible = 0;
  3765. int nBar = 0;
  3766. for( nBar = 0; nBar < nCountOfBars; nBar++ )
  3767. {
  3768. CControlBar * pBar = vRow[nBar];
  3769. ASSERT_VALID( pBar );
  3770. ASSERT_KINDOF( CControlBar, pBar );
  3771. ASSERT( pBar->IsVisible() );
  3772. ASSERT( pBar != pBarSlide );
  3773. int nExtentBarMinPossible = 0;
  3774. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  3775. {
  3776. CSize sizeBarMinPossible =
  3777. ((CExtControlBar*)pBar)->_CalcDesiredMinOuterSize(
  3778. bHorz ? TRUE : FALSE );
  3779. nExtentBarMinPossible = bHorz
  3780. ? sizeBarMinPossible.cx
  3781. : sizeBarMinPossible.cy
  3782. ;
  3783. } // if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  3784. else
  3785. {
  3786. CRect rcBar;
  3787. pBar->GetWindowRect( &rcBar );
  3788. nExtentBarMinPossible = bHorz
  3789. ? rcBar.Width()
  3790. : rcBar.Height()
  3791. ;
  3792. } // else from if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  3793. nExtentRowMinPossible += nExtentBarMinPossible;
  3794. } // for( nBar = 0; nBar < nCountOfBars; nBar++ )
  3795. CRect rcThisDockerClient;
  3796. GetClientRect( &rcThisDockerClient );
  3797. int nMaxExtent = bHorz
  3798. ? rcThisDockerClient.Width()
  3799. : rcThisDockerClient.Height()
  3800. ;
  3801. int nExtentRest = nMaxExtent - nExtentRowMinPossible;
  3802. if( nExtentRest < nExtentBarSlideMinPossible )
  3803. return false;
  3804. int nSlidePosStart = bHorz
  3805. ? rcBarSlide.left
  3806. : rcBarSlide.top
  3807. ;
  3808. nSlidePosStart += nShiftDesired;
  3809. int nSlidePosEnd = bHorz
  3810. ? rcBarSlide.right
  3811. : rcBarSlide.bottom
  3812. ;
  3813. nSlidePosEnd += nShiftDesired;
  3814. if( nSlidePosStart < 0 )
  3815. {
  3816. nShiftDesired += nSlidePosStart;
  3817. nSlidePosStart = 0;
  3818. }
  3819. CControlBar * pBarInsertBefore = NULL;
  3820. bool bAppendMode = false;
  3821. for( nBar = 0; nBar < nCountOfBars; nBar++ )
  3822. {
  3823. CControlBar * pBar = vRow[nBar];
  3824. ASSERT_VALID( pBar );
  3825. ASSERT_KINDOF( CControlBar, pBar );
  3826. ASSERT( pBar->IsVisible() );
  3827. CRect rcBar;
  3828. pBar->GetWindowRect( &rcBar );
  3829. ScreenToClient( &rcBar );
  3830. int nBarInRowPosStart = bHorz
  3831. ? rcBar.left
  3832. : rcBar.top
  3833. ;
  3834. int nBarInRowPosEnd = bHorz
  3835. ? rcBar.right
  3836. : rcBar.bottom
  3837. ;
  3838. if( nSlidePosEnd <= nBarInRowPosStart )
  3839. {
  3840. rcBarInsertBefore = rcBar;
  3841. pBarInsertBefore = pBar;
  3842. } // if( nSlidePosEnd <= nBarInRowPosStart )
  3843. else
  3844. {
  3845. if( nSlidePosStart <= nBarInRowPosEnd )
  3846. {
  3847. int nBarInRowPosMid =
  3848. (nBarInRowPosEnd + nBarInRowPosStart) / 2;
  3849. if( nSlidePosStart <= nBarInRowPosMid )
  3850. {
  3851. rcBarInsertBefore = rcBar;
  3852. pBarInsertBefore = pBar;
  3853. break;
  3854. }
  3855. bAppendMode = true;
  3856. break;
  3857. } // if( nSlidePosStart <= nBarInRowPosEnd )
  3858. else
  3859. {
  3860. if( pBarInsertBefore != NULL )
  3861. break;
  3862. bAppendMode = true;
  3863. } // else from if( nSlidePosStart <= nBarInRowPosEnd )
  3864. } // else from if( nSlidePosStart <= nBarInRowPosStart )
  3865. } // for( nBar = 0; nBar < nCountOfBars; nBar++ )
  3866. if( pBarInsertBefore == NULL
  3867. && (!bAppendMode)
  3868. )
  3869. return false;
  3870. int nBarPos = FindBar( pBarSlide );
  3871. ASSERT( 0 < nBarPos && nBarPos < m_arrBars.GetSize() );
  3872. if( m_arrBars[nBarPos-1] == NULL
  3873. && m_arrBars[nBarPos+1] == NULL
  3874. )
  3875. m_arrBars.RemoveAt( nBarPos+1 );
  3876. m_arrBars.RemoveAt( nBarPos );
  3877. if( pBarInsertBefore != NULL )
  3878. {
  3879. if( bHorz )
  3880. {
  3881. rcBarSlide.OffsetRect(
  3882. nShiftDesired,
  3883. rcBarInsertBefore.top - rcBarSlide.top
  3884. );
  3885. if( rcBarInsertBefore.left < rcBarSlide.left )
  3886. rcBarSlide.OffsetRect(
  3887. rcBarInsertBefore.left - rcBarSlide.left,
  3888. 0
  3889. );
  3890. } // if( bHorz )
  3891. else
  3892. {
  3893. rcBarSlide.OffsetRect(
  3894. rcBarInsertBefore.left - rcBarSlide.left,
  3895. nShiftDesired
  3896. );
  3897. if( rcBarInsertBefore.top < rcBarSlide.top )
  3898. rcBarSlide.OffsetRect(
  3899. 0,
  3900. rcBarInsertBefore.top - rcBarSlide.top
  3901. );
  3902. } // else from if( bHorz )
  3903. nBarPos = FindBar( pBarInsertBefore );
  3904. ASSERT( 0 < nBarPos && nBarPos < m_arrBars.GetSize() );
  3905. m_arrBars.InsertAt( nBarPos, pBarSlide );
  3906. ASSERT_VALID( this );
  3907. } // if( pBarInsertBefore != NULL )
  3908. else
  3909. {
  3910. ASSERT( bAppendMode );
  3911. pBarInsertBefore = vRow[nCountOfBars-1];
  3912. ASSERT_VALID( pBarInsertBefore );
  3913. ASSERT_KINDOF( CControlBar, pBarInsertBefore );
  3914. ASSERT( pBarInsertBefore->IsVisible() );
  3915. pBarInsertBefore->GetWindowRect( &rcBarInsertBefore );
  3916. ScreenToClient( &rcBarInsertBefore );
  3917. if( bHorz )
  3918. {
  3919. rcBarSlide.OffsetRect(
  3920. nShiftDesired,
  3921. rcBarInsertBefore.top - rcBarSlide.top
  3922. );
  3923. if( rcBarSlide.left < rcBarInsertBefore.right )
  3924. rcBarSlide.OffsetRect(
  3925. rcBarInsertBefore.right - rcBarSlide.left,
  3926. 0
  3927. );
  3928. } // if( bHorz )
  3929. else
  3930. {
  3931. rcBarSlide.OffsetRect(
  3932. rcBarInsertBefore.left - rcBarSlide.left,
  3933. nShiftDesired
  3934. );
  3935. if( rcBarSlide.top < rcBarInsertBefore.bottom )
  3936. rcBarSlide.OffsetRect(
  3937. 0,
  3938. rcBarInsertBefore.bottom - rcBarSlide.top
  3939. );
  3940. } // else from if( bHorz )
  3941. nBarPos = FindBar( pBarInsertBefore );
  3942. ASSERT( 0 < nBarPos && nBarPos < m_arrBars.GetSize() );
  3943. for( nBarPos ++; m_arrBars[nBarPos] != NULL; nBarPos ++ )
  3944. {
  3945. ASSERT( nBarPos < m_arrBars.GetSize() );
  3946. }
  3947. m_arrBars.InsertAt( nBarPos, pBarSlide );
  3948. ASSERT_VALID( this );
  3949. } // else from if( pBarInsertBefore != NULL )
  3950. if( rcBarSlideOrg != rcBarSlide )
  3951. pBarSlide->SetWindowPos(
  3952. NULL,
  3953. rcBarSlide.left, rcBarSlide.top,
  3954. rcBarSlide.Width(), rcBarSlide.Height(),
  3955. SWP_NOZORDER|SWP_NOACTIVATE
  3956. ////|SWP_NOSENDCHANGING 
  3957. |SWP_NOREDRAW|SWP_NOCOPYBITS
  3958. );
  3959. return true;
  3960. }
  3961. void CExtDockOuterBar::_AlignSubRowAffixmentHW(
  3962. bool bHorz,
  3963. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  3964. int nSubRowStartPos,
  3965. int nSubRowEndPos
  3966. )
  3967. {
  3968. ASSERT_VALID(this);
  3969. ASSERT( dbol.GetSize() > 0 );
  3970. ASSERT( nSubRowStartPos <= nSubRowEndPos );
  3971. ASSERT( 0 <= nSubRowStartPos && nSubRowStartPos < dbol.GetSize() );
  3972. ASSERT( 0 <= nSubRowEndPos   && nSubRowEndPos < dbol.GetSize() );
  3973. if( nSubRowStartPos == nSubRowEndPos )
  3974. return;
  3975. int nIdxToAlignFirst = -1;
  3976. int nIdxToAlignLast = -1;
  3977. int nTotalAffixmentExtentHW = -1;
  3978. int nBar = 0;
  3979. for( nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  3980. {
  3981. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  3982. ASSERT_VALID( olid.m_pBar );
  3983. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  3984. ASSERT( olid.m_bVisible );
  3985. CExtControlBar * pExtBar =
  3986. DYNAMIC_DOWNCAST(
  3987. CExtControlBar,
  3988. olid.m_pBar
  3989. );
  3990. if( pExtBar == NULL )
  3991. continue;
  3992. if( !pExtBar->_AffixmentIsAlignedHW() )
  3993. continue;
  3994. ASSERT( pExtBar->_AffixmentGetOuter() != NULL );
  3995. int nBarAffixmentExtentHW = bHorz
  3996. ? olid.m_rcPreCalc.Height()
  3997. : olid.m_rcPreCalc.Width()
  3998. ;
  3999. nTotalAffixmentExtentHW =
  4000. max( nTotalAffixmentExtentHW, nBarAffixmentExtentHW );
  4001. if( nIdxToAlignFirst < 0 )
  4002. {
  4003. ASSERT( nIdxToAlignLast < 0 );
  4004. nIdxToAlignFirst = nIdxToAlignLast = nBar;
  4005. continue;
  4006. }
  4007. ASSERT( nIdxToAlignFirst >= nSubRowStartPos );
  4008. ASSERT( nIdxToAlignFirst <= nIdxToAlignLast );
  4009. nIdxToAlignLast = nBar;
  4010. } // for( nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  4011. ASSERT( nIdxToAlignFirst <= nIdxToAlignLast );
  4012. if( nTotalAffixmentExtentHW < 0
  4013. || nIdxToAlignFirst == nIdxToAlignLast
  4014. )
  4015. return;
  4016. ASSERT( nSubRowStartPos <= nIdxToAlignFirst && nIdxToAlignFirst <= nSubRowEndPos );
  4017. ASSERT( nSubRowStartPos <= nIdxToAlignLast  && nIdxToAlignLast  <= nSubRowEndPos );
  4018. for( nBar = nIdxToAlignFirst; nBar <= nIdxToAlignLast; nBar++ )
  4019. {
  4020. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  4021. ASSERT_VALID( olid.m_pBar );
  4022. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  4023. ASSERT( olid.m_bVisible );
  4024. CExtControlBar * pExtBar =
  4025. DYNAMIC_DOWNCAST(
  4026. CExtControlBar,
  4027. olid.m_pBar
  4028. );
  4029. if( pExtBar == NULL )
  4030. continue;
  4031. if( !pExtBar->_AffixmentIsAlignedHW() )
  4032. continue;
  4033. ASSERT( pExtBar->_AffixmentGetOuter() != NULL );
  4034. CRect & rcPreCalc = olid.m_rcPreCalc;
  4035. if( bHorz )
  4036. rcPreCalc.bottom = rcPreCalc.top + nTotalAffixmentExtentHW;
  4037. else
  4038. rcPreCalc.right = rcPreCalc.left + nTotalAffixmentExtentHW;
  4039. } // for( nBar = nIdxToAlignFirst; nBar <= nIdxToAlignLast; nBar++ )
  4040. }
  4041. void CExtDockOuterBar::_CalcAffixmentOrderVector(
  4042. bool bHorz,
  4043. AffixmentOrderVector_t & arrAffixmentOrder,
  4044. CExtDockOuterBar::dockbar_outer_layout_t & dbol,
  4045. bool bResetAffixmentDataIfNeeded, // = false
  4046. int nSubRowStartPos, // = 0
  4047. int nSubRowEndPos // = -1
  4048. )
  4049. {
  4050. ASSERT_VALID(this);
  4051. if( arrAffixmentOrder.GetSize() > 0 )
  4052. arrAffixmentOrder.RemoveAll();
  4053. if( dbol.GetSize() == 0 )
  4054. return;
  4055. ASSERT( 0 <= nSubRowStartPos && nSubRowStartPos < dbol.GetSize() );
  4056. if( nSubRowEndPos < 0 )
  4057. nSubRowEndPos = int(dbol.GetSize()) - 1;
  4058. ASSERT( 0 <= nSubRowEndPos   && nSubRowEndPos < dbol.GetSize() );
  4059. ASSERT( nSubRowStartPos <= nSubRowEndPos );
  4060. int nResetAffixmentWeight =
  4061. int(dbol.GetSize()) + nSubRowStartPos + 1;
  4062. for( int nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  4063. {
  4064. OuterLayoutItemData & olid = dbol.ElementAt( nBar );
  4065. ASSERT_VALID( olid.m_pBar );
  4066. ASSERT_KINDOF( CControlBar, olid.m_pBar );
  4067. ASSERT( olid.m_bVisible );
  4068. CExtControlBar * pExtBar =
  4069. DYNAMIC_DOWNCAST(
  4070. CExtControlBar,
  4071. olid.m_pBar
  4072. );
  4073. if( pExtBar == NULL )
  4074. {
  4075. arrAffixmentOrder.Add( nBar );
  4076. continue;
  4077. }
  4078. CExtControlBar::InternalAffixmentData * pAffixmentData =
  4079. pExtBar->_AffixmentGetOuter();
  4080. if( pAffixmentData == NULL )
  4081. {
  4082. arrAffixmentOrder.Add( nBar );
  4083. continue;
  4084. }
  4085. if( pAffixmentData->IsEmpty() )
  4086. {
  4087. if( bResetAffixmentDataIfNeeded )
  4088. pAffixmentData->m_nAffixmentWeight = nResetAffixmentWeight++;
  4089. else
  4090. {
  4091. arrAffixmentOrder.Add( nBar );
  4092. continue;
  4093. } // else from if( bResetAffixmentDataIfNeeded )
  4094. } // if( pAffixmentData->IsEmpty() )
  4095. if( pAffixmentData->m_rcAffixment.IsRectEmpty() )
  4096. {
  4097. if( bResetAffixmentDataIfNeeded )
  4098. pAffixmentData->m_rcAffixment = olid.m_rcReal;
  4099. else
  4100. {
  4101. arrAffixmentOrder.Add( nBar );
  4102. continue;
  4103. } // else from if( bResetAffixmentDataIfNeeded )
  4104. } // if( pAffixmentData->m_rcAffixment.IsRectEmpty() )
  4105. if( bResetAffixmentDataIfNeeded )
  4106. {
  4107. if( bHorz )
  4108. {
  4109. if( pAffixmentData->m_sizeCompressed.cx == 0 )
  4110. pAffixmentData->m_sizeCompressed.cx =
  4111. olid.m_rcReal.Width();
  4112. if( pAffixmentData->m_sizeCompressed.cx > olid.m_sizeCalcDynamic.cx )
  4113. pAffixmentData->m_sizeCompressed.cx = olid.m_sizeCalcDynamic.cx;
  4114. } // if( bHorz )
  4115. else
  4116. {
  4117. if( pAffixmentData->m_sizeCompressed.cy == 0 )
  4118. pAffixmentData->m_sizeCompressed.cy =
  4119. olid.m_rcReal.Height();
  4120. if( pAffixmentData->m_sizeCompressed.cy > olid.m_sizeCalcDynamic.cy )
  4121. pAffixmentData->m_sizeCompressed.cy = olid.m_sizeCalcDynamic.cy;
  4122. } // else from if( bHorz )
  4123. } // if( bResetAffixmentDataIfNeeded )
  4124. if( arrAffixmentOrder.GetSize() == 0 )
  4125. {
  4126. arrAffixmentOrder.Add( nBar );
  4127. continue;
  4128. }
  4129. int nReviewCount = nBar - nSubRowStartPos;
  4130. ASSERT( nReviewCount > 0 );
  4131. ASSERT( arrAffixmentOrder.GetSize() == nReviewCount );
  4132. for( int nOrder = 0; nOrder < nReviewCount; nOrder++ )
  4133. {
  4134. int nBarAtOrder = arrAffixmentOrder[nOrder];
  4135. ASSERT( nBarAtOrder < nBar );
  4136. OuterLayoutItemData & olid2 = dbol.ElementAt( nBarAtOrder );
  4137. ASSERT_VALID( olid2.m_pBar );
  4138. ASSERT( olid.m_pBar != olid2.m_pBar );
  4139. ASSERT_KINDOF( CControlBar, olid2.m_pBar );
  4140. ASSERT( olid2.m_bVisible );
  4141. CExtControlBar * pExtBar2 =
  4142. DYNAMIC_DOWNCAST(
  4143. CExtControlBar,
  4144. olid2.m_pBar
  4145. );
  4146. if( pExtBar2 == NULL )
  4147. {
  4148. arrAffixmentOrder.InsertAt( nOrder, nBar );
  4149. break;
  4150. }
  4151. CExtControlBar::InternalAffixmentData * pAffixmentData2 =
  4152. pExtBar2->_AffixmentGetOuter();
  4153. if( pAffixmentData2 == NULL )
  4154. {
  4155. arrAffixmentOrder.InsertAt( nOrder, nBar );
  4156. break;
  4157. }
  4158. ASSERT( !pAffixmentData2->IsEmpty() );
  4159. //  TO FIX: affixment recalc afrer tooggling docked/floating state
  4160. // ASSERT(
  4161. // pAffixmentData2->m_nAffixmentWeight
  4162. // != pAffixmentData->m_nAffixmentWeight
  4163. // );
  4164. if( pAffixmentData2->m_nAffixmentWeight
  4165. > pAffixmentData->m_nAffixmentWeight
  4166. )
  4167. {
  4168. arrAffixmentOrder.InsertAt( nOrder, nBar );
  4169. break;
  4170. }
  4171. if( nOrder == (nReviewCount - 1) )
  4172. {
  4173. arrAffixmentOrder.Add( nBar );
  4174. break;
  4175. }
  4176. } // for( int nOrder = 0; nOrder < nReviewCount; nOrder++ )
  4177. ASSERT( arrAffixmentOrder.GetSize() == (nReviewCount + 1) );
  4178. } // for( int nBar = nSubRowStartPos; nBar <= nSubRowEndPos; nBar++ )
  4179. ASSERT( arrAffixmentOrder.GetSize() == (nSubRowEndPos-nSubRowStartPos+1) );
  4180. }