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

界面编程

开发平台:

Visual C++

  1. wrFrame.bottom;
  2. break;
  3. case AFX_IDW_DOCKBAR_LEFT:
  4. arrDockBarAnalyze[nDockBarIdx].m_rcDockBarAnalyze.right +=
  5. nRdpExtraInnerDx;
  6. arrDockBarAnalyze[nDockBarIdx].m_rcDockBarAnalyze.left =
  7. wrFrame.left;
  8. break;
  9. case AFX_IDW_DOCKBAR_RIGHT:
  10. arrDockBarAnalyze[nDockBarIdx].m_rcDockBarAnalyze.left -=
  11. nRdpExtraInnerDx;
  12. arrDockBarAnalyze[nDockBarIdx].m_rcDockBarAnalyze.right =
  13. wrFrame.right;
  14. break;
  15. #ifdef _DEBUG
  16. default:
  17. {
  18. ASSERT( FALSE );
  19. }
  20. break;
  21. #endif // _DEBUG
  22. } // switch( arrDockBarAnalyze[nDockBarIdx].m_nDockBarID )
  23. if( arrDockBarAnalyze[nDockBarIdx].m_nDockBarID ==
  24. AFX_IDW_DOCKBAR_LEFT
  25. ||
  26. arrDockBarAnalyze[nDockBarIdx].m_nDockBarID ==
  27. AFX_IDW_DOCKBAR_RIGHT
  28. )
  29. {
  30. arrDockBarAnalyze[nDockBarIdx].m_rcDockBarAnalyze.top =
  31. arrDockBarAnalyze[0].m_rcDockBarAnalyze.bottom
  32. - nRdpExtraInnerDy;
  33. arrDockBarAnalyze[nDockBarIdx].m_rcDockBarAnalyze.bottom =
  34. arrDockBarAnalyze[1].m_rcDockBarAnalyze.top
  35. + nRdpExtraInnerDy;
  36. }
  37. CRect rcReDockAnalyze(
  38. arrDockBarAnalyze[nDockBarIdx].m_rcDockBarAnalyze
  39. );
  40. rcReDockAnalyze.InflateRect(
  41. nRdpExtraOuterDx,
  42. nRdpExtraOuterDy
  43. );
  44. if( !rcReDockAnalyze.PtInRect( ptTrack ) )
  45. arrDockBarAnalyze[nDockBarIdx].m_bForceExclude = true;
  46. } // for( nDockBarIdx = 0; nDockBarIdx < 4; nDockBarIdx++ )
  47. if( nIdxForceFirstReview >= 0 )
  48. {
  49. if( arrDockBarAnalyze[nIdxForceFirstReview].m_bForceExclude )
  50. arrDockBarAnalyze[nIdxForceFirstReview].m_bForceFirstReview = false;
  51. else
  52. {
  53. if( _DoFixed_OuterDockerAdjustment(
  54. ptTrack,
  55. arrDockBarAnalyze[nIdxForceFirstReview].m_pOuterDocker
  56. )
  57. )
  58. return;
  59. } // else from if( arrDockBarAnalyze[nDockBarIdx].m_bForceExclude )
  60. } // if( nIdxForceFirstReview >= 0 )
  61. for( nDockBarIdx = 0; nDockBarIdx < 4; nDockBarIdx++ )
  62. {
  63. ASSERT_VALID( arrDockBarAnalyze[nDockBarIdx].m_pOuterDocker );
  64. if( arrDockBarAnalyze[nDockBarIdx].m_bForceFirstReview
  65. || (! arrDockBarAnalyze[nDockBarIdx].m_bVisible )
  66. || arrDockBarAnalyze[nDockBarIdx].m_bForceExclude
  67. )
  68. continue;
  69. if( _DoFixed_OuterDockerAdjustment(
  70. ptTrack,
  71. arrDockBarAnalyze[nDockBarIdx].m_pOuterDocker
  72. )
  73. )
  74. return;
  75. } // for( nDockBarIdx = 0; nDockBarIdx < 4; nDockBarIdx++ )
  76. for( nDockBarIdx = 0; nDockBarIdx < 4; nDockBarIdx++ )
  77. {
  78. if( arrDockBarAnalyze[nDockBarIdx].m_bForceFirstReview
  79. || arrDockBarAnalyze[nDockBarIdx].m_bVisible
  80. || arrDockBarAnalyze[nDockBarIdx].m_bForceExclude
  81. )
  82. continue;
  83. if( _DoFixed_OuterDockerAdjustment(
  84. ptTrack,
  85. arrDockBarAnalyze[nDockBarIdx].m_pOuterDocker
  86. )
  87. )
  88. return;
  89. } // for( nDockBarIdx = 0; nDockBarIdx < 4; nDockBarIdx++ )
  90. _DoFixed_FloatingAdjustment( ptTrack );
  91. }
  92. void CExtControlBar::InternalDraggingState_t::CalcStateDynamic(
  93. CPoint ptTrack, // in screen coords
  94. bool bForceFloatMode
  95. )
  96. {
  97. ASSERT_VALID( this );
  98. ASSERT( !IsEmpty() );
  99. ASSERT_VALID( m_pExtBarSrc );
  100. if( m_pExtBarSrc->IsFixedDockStyle() )
  101. {
  102. ASSERT( m_pExtBarSrc->_IsShowContentWhenDragging() );
  103. _DoFixed_BasicAdjustment( ptTrack, bForceFloatMode );
  104. return;
  105. }
  106. CExtControlBar::eResizablePanelDockingType_t eResizablePanelDockingType =
  107. m_pExtBarSrc->OnQueryDockingType();
  108. bool bShowContent = m_pExtBarSrc->_IsShowContentWhenDragging();
  109. if( bShowContent
  110. && m_pExtBarSrc->IsDocked()
  111. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  112. && INT(eResizablePanelDockingType) < INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005)
  113. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  114. )
  115. {
  116. ASSERT_VALID( m_pExtBarSrc->m_pDockBar );
  117. CRect rcDockBar;
  118. m_pExtBarSrc->m_pDockBar->GetWindowRect( &rcDockBar );
  119. if( rcDockBar.PtInRect(ptTrack) )
  120. return;
  121. } // if( bShowContent ...
  122. TrackRectSetEmpty();
  123. eResizablePanelDockingType;
  124. static const DWORD _dwDockBarMap[4][2] =
  125. {
  126. { AFX_IDW_DOCKBAR_TOP,      CBRS_TOP    },
  127. { AFX_IDW_DOCKBAR_BOTTOM,   CBRS_BOTTOM },
  128. { AFX_IDW_DOCKBAR_LEFT,     CBRS_LEFT   },
  129. { AFX_IDW_DOCKBAR_RIGHT,    CBRS_RIGHT  },
  130. };
  131. // reasonable dockbar parts
  132. static const INT nRdpOuter = 16;
  133. static const INT nRdpInner = nRdpOuter*2;
  134. static const INT nRdpMostInner = 12;
  135. // reasonable controlbar part
  136. static const INT nRcpAnyHalfMin = 8;
  137. m_eCDT = __ECDT_FLOATED;
  138. m_pExtBarDst = NULL;
  139. //ExtBarDstSet( NULL );
  140. CRect rcBarWnd;
  141. INT nSrcMinHW = m_pExtBarSrc->_CalcDesiredMinHW();
  142. INT nSrcMinVH = m_pExtBarSrc->_CalcDesiredMinVH();
  143. if( nSrcMinHW < nRcpAnyHalfMin )
  144. nSrcMinHW = nRcpAnyHalfMin;
  145. if( nSrcMinVH < nRcpAnyHalfMin )
  146. nSrcMinVH = nRcpAnyHalfMin;
  147. INT nDstMinHW = nRcpAnyHalfMin; // some reasonable min width when horz docked
  148. INT nDstMinVH = nRcpAnyHalfMin; // some reasonable min height when vert docked
  149. CFrameWnd * pFrame = m_pExtBarSrc->_GetDockingFrameImpl();
  150. ASSERT_VALID( pFrame );
  151. CRect rcFrameWnd;
  152. pFrame->GetWindowRect( &rcFrameWnd );
  153. bool bForceFloat = bForceFloatMode;
  154. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  155. if( INT(eResizablePanelDockingType) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005)
  156. && (! bForceFloat )
  157. && m_pExtBarSrc->IsFloating()
  158. )
  159. {
  160. ASSERT( m_eCDT == __ECDT_FLOATED );
  161. HWND hWnd = ::WindowFromPoint( ptTrack );
  162. if( hWnd != NULL )
  163. {
  164. ASSERT( ::IsWindow(hWnd) );
  165. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  166. if( pWnd != NULL )
  167. {
  168. CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  169. DYNAMIC_DOWNCAST( CExtDynDockMarkerWnd, pWnd );
  170. if( pDynDockMarkerWnd != NULL
  171. && pDynDockMarkerWnd->IsStateApplyable()
  172. )
  173. { // if dockmarker is state applyable
  174. m_eCDT = pDynDockMarkerWnd->GetCDT();
  175. HWND hWnd = pDynDockMarkerWnd->GetMarkerTargetHWND();
  176. if( hWnd != NULL )
  177. {
  178. if( ::IsWindow(hWnd) )
  179. {
  180. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  181. if( pWnd != NULL )
  182. {
  183. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  184. if( m_eCDT == __ECDT_2005_BAR_NEW_TAB )
  185. {
  186. CExtDynTabControlBar * pTabbedBar =
  187. DYNAMIC_DOWNCAST( CExtDynTabControlBar, pWnd );
  188. if( pTabbedBar != NULL )
  189. {
  190. if( m_pExtBarSrc->_CanDockToTabbedContainers( pTabbedBar ) )
  191. {
  192. CRect rcTabSwitcher;
  193. pTabbedBar->GetSwitcherWindowRect( rcTabSwitcher );
  194. CPoint ptTrackFake(
  195. rcTabSwitcher.left + 2, // rcTabSwitcher.right - 2,
  196. rcTabSwitcher.CenterPoint().y
  197. );
  198. ExtBarDstSet( pTabbedBar );
  199. if( pTabbedBar->IsSwitcherVisible() )
  200. {
  201. m_eCDT = __ECDT_TABBED_REINDEX_NHM;
  202. ReindexPosCalc( ptTrackFake );
  203. } // if( pTabbedBar->IsSwitcherVisible() )
  204. else
  205. {
  206. m_eCDT = __ECDT_2005_BAR_NEW_TAB;
  207. TrackRectSet( &rcBarWnd );
  208. } // else from if( pTabbedBar->IsSwitcherVisible() )
  209. } // if( m_pExtBarSrc->_CanDockToTabbedContainers( pTabbedBar ) )
  210. else
  211. {
  212. m_eCDT = __ECDT_FLOATED;
  213. bForceFloatMode = true;
  214. }
  215. } // if( pTabbedBar != NULL )
  216. else
  217. {
  218. CExtControlBar * pDestBar =
  219. DYNAMIC_DOWNCAST( CExtControlBar, pWnd );
  220. if( pDestBar == NULL
  221. || (! m_pExtBarSrc->_CanDockToTabbedContainers( pDestBar ) )
  222. || (! pDestBar->_CanDockToTabbedContainers( m_pExtBarSrc ) )
  223. )
  224. {
  225. m_eCDT = __ECDT_FLOATED;
  226. bForceFloatMode = true;
  227. }
  228. else
  229. ExtBarDstSet( pDestBar );
  230. } // else from if( pTabbedBar != NULL )
  231. } // if( m_eCDT == __ECDT_2005_BAR_NEW_TAB )
  232. else
  233. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  234. if( m_eCDT == __ECDT_2005_BAR_TOP
  235. || m_eCDT == __ECDT_2005_BAR_BOTTOM
  236. || m_eCDT == __ECDT_2005_BAR_LEFT
  237. || m_eCDT == __ECDT_2005_BAR_RIGHT
  238. )
  239. {
  240. CExtControlBar * pDestBar =
  241. DYNAMIC_DOWNCAST( CExtControlBar, pWnd );
  242. if( pDestBar == NULL
  243. //|| (! m_pExtBarSrc->_CanDockToTabbedContainers( pDestBar ) )
  244. || (! m_pExtBarSrc->_CanDockLTRB( pDestBar ) )
  245. || (! pDestBar->_CanDockLTRB( m_pExtBarSrc ) )
  246. )
  247. {
  248. m_eCDT = __ECDT_FLOATED;
  249. bForceFloatMode = true;
  250. }
  251. else
  252. ExtBarDstSet( pDestBar );
  253. }
  254. } // if( pWnd != NULL )
  255. } // if( ::IsWindow(hWnd) )
  256. else
  257. {
  258. m_eCDT = __ECDT_FLOATED;
  259. bForceFloatMode = true;
  260. } // else from if( ::IsWindow(hWnd) )
  261. } // if( hWnd != NULL )
  262. if( m_eCDT != __ECDT_FLOATED )
  263. return;
  264. } // if dockmarker is state applyable
  265. } // if( pWnd != NULL )
  266. } // if( hWnd != NULL )
  267. }
  268. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  269. if(
  270. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  271. INT(eResizablePanelDockingType) < INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005)
  272. &&
  273. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  274. ( ! bForceFloat )
  275. && m_pExtBarSrc->IsFloating()
  276. && ( m_pExtBarSrc->IsKindOf(RUNTIME_CLASS(CExtDynControlBar))
  277. || (! bShowContent )
  278. )
  279. )
  280. {
  281. CFrameWnd * pFrameExcludeTest = m_pExtBarSrc->GetParentFrame();
  282. if( pFrameExcludeTest->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
  283. {
  284. CRect rcFrameExcludeText;
  285. pFrameExcludeTest->GetWindowRect( &rcFrameExcludeText );
  286. if( rcFrameExcludeText.PtInRect(ptTrack) )
  287. bForceFloat = true;
  288. }
  289. }
  290. if( (! CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) )
  291. && (! bForceFloat )
  292. )
  293. {
  294. ASSERT( m_eCDT == __ECDT_FLOATED );
  295. bool bCanDockToInnerCircles =
  296. m_pExtBarSrc->_CanDockToInnerCircles();
  297. if( bCanDockToInnerCircles
  298. //&&  (! bShowContent )
  299. )
  300. { // try to analyze docking into floating bars
  301. ExtControlBarVector_t vBars;
  302. m_pExtBarSrc->_GetFrameControlBars(
  303. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  304. ( INT(eResizablePanelDockingType) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005) )
  305. ? true : 
  306. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  307. false,
  308. vBars,
  309. (DWORD)(
  310. __GFECB_NONFIXED_NONMIN //|__GFECB_FIXED
  311. |__GFECB_FLOATED
  312. |__GFECB_VIS_ALL
  313. |__GFECB_BYPT_ONLY_WND
  314. ),
  315. ptTrack
  316. );
  317. CExtControlBar * pDesiredBar = NULL;
  318. INT nCountOfBars = (INT)vBars.GetSize();
  319. for( INT nBarIdx = 0; nBarIdx < nCountOfBars; nBarIdx++ )
  320. {
  321. CExtControlBar * pTestBar = vBars[nBarIdx];
  322. ASSERT_VALID( pTestBar );
  323. ASSERT( !pTestBar->IsFixedMode() );
  324. if( pTestBar == m_pExtBarSrc )
  325. continue;
  326. pDesiredBar = pTestBar;
  327. break;
  328. } // for( INT nBarIdx = 0; nBarIdx < nCountOfBars; nBarIdx++ )
  329. if( pDesiredBar != NULL )
  330. {
  331. ASSERT_VALID( pDesiredBar );
  332. //m_pExtBarDst = pDesiredBar;
  333. ExtBarDstSet( pDesiredBar );
  334. m_pExtBarDst->GetParentFrame()->GetWindowRect( &rcBarWnd );
  335. nDstMinHW = m_pExtBarDst->_CalcDesiredMinHW();
  336. nDstMinVH = m_pExtBarDst->_CalcDesiredMinVH();
  337. INT nWidth3   = nRdpInner; // rcBarWnd.Width();
  338. INT nHeight3  = nRdpInner; // rcBarWnd.Height();
  339. // INT nWidth2  = nWidth  / 2;
  340. // INT nHeight2 = nHeight / 2;
  341. // INT nWidth3  = nWidth  / 4;
  342. // INT nHeight3 = nHeight / 4;
  343. // UINT nDockBarID =
  344. // m_pExtBarDst->GetSafeDockBarDlgCtrlID();
  345. // ASSERT_DOCKBAR_DLGCTRLID( nDockBarID );
  346. // bool bHorz = 
  347. // ( nDockBarID == AFX_IDW_DOCKBAR_TOP
  348. // || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM
  349. // || nDockBarID == AFX_IDW_DOCKBAR_FLOAT
  350. // ) ? true : false;
  351. ASSERT( m_pExtBarDst->m_pDockBar != NULL );
  352. CDockBar * pDockBar =
  353. STATIC_DOWNCAST( CDockBar, m_pExtBarDst->m_pDockBar );
  354. ASSERT_VALID( pDockBar );
  355. bool bEnableInnerDock = true;
  356. // if( nDockBarID == AFX_IDW_DOCKBAR_LEFT
  357. // && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_LEFT) == 0
  358. // )
  359. // bEnableInnerDock = false;
  360. // if( nDockBarID == AFX_IDW_DOCKBAR_RIGHT
  361. // && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_RIGHT) == 0
  362. // )
  363. // bEnableInnerDock = false;
  364. // if( nDockBarID == AFX_IDW_DOCKBAR_TOP
  365. // && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_TOP) == 0
  366. // )
  367. // bEnableInnerDock = false;
  368. // if( nDockBarID == AFX_IDW_DOCKBAR_BOTTOM
  369. // && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_BOTTOM) == 0
  370. // )
  371. // bEnableInnerDock = false;
  372. if( bEnableInnerDock && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_ANY) != 0 )
  373. {
  374. m_bDeepHalfSplit = false;
  375. if( !m_pExtBarDst->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar))
  376. || m_pExtBarDst->IsFloating()
  377. )
  378. m_bDeepHalfSplit = true;
  379. CRect rcWndDockBar;
  380. pDockBar->GetWindowRect( &rcWndDockBar );
  381. CRect rcPart( rcBarWnd );
  382. do
  383. { // SINGLE LOOP
  384. INT nHalfHeight = rcBarWnd.Height()/2;
  385. if( rcBarWnd.Width() >= nSrcMinHW
  386. && nHalfHeight >= nSrcMinVH
  387. && nHalfHeight >= nDstMinVH
  388. )
  389. { // if can do half splitting
  390. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  391. BOOL bTabbedDest =
  392. m_pExtBarDst->IsKindOf(RUNTIME_CLASS(CExtDynTabControlBar))
  393. && ( ((CExtDynTabControlBar*)m_pExtBarDst)->IsSwitcherVisible() )
  394. ;
  395. INT nTabbedShift = 0;
  396. bool bCanDockToTabbedContainers =
  397. ( m_pExtBarSrc->_CanDockToTabbedContainers( m_pExtBarDst )
  398. && m_pExtBarDst->_CanDockToTabbedContainers( m_pExtBarSrc )
  399. ) ? true : false;
  400. if( bCanDockToTabbedContainers )
  401. {
  402. rcPart = rcBarWnd;
  403. rcPart.bottom = rcPart.top + nHeight3;
  404. if( rcPart.PtInRect(ptTrack) )
  405. {
  406. if( bTabbedDest )
  407. m_eCDT = __ECDT_TABBED_UPDATE;
  408. else
  409. m_eCDT = __ECDT_TABBED_NEW;
  410. rcPart = rcBarWnd;
  411. break;
  412. }
  413. nTabbedShift = nHeight3;
  414. rcPart.OffsetRect( 0, nTabbedShift );
  415. }
  416. else
  417. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  418. {
  419. rcPart = rcBarWnd;
  420. rcPart.bottom = rcPart.top + nHeight3;
  421. }
  422. bool bCanDockLTRB =
  423. ( m_pExtBarSrc->_CanDockLTRB( m_pExtBarDst )
  424. && m_pExtBarDst->_CanDockLTRB( m_pExtBarSrc )
  425. ) ? true : false;
  426. if( ! bCanDockLTRB )
  427. {
  428. m_eCDT = __ECDT_FLOATED;
  429. bForceFloatMode = true;
  430. break;
  431. } // if( bCanDockLTRB )
  432. if( rcPart.PtInRect(ptTrack) )
  433. {
  434. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  435. rcPart.OffsetRect( 0, -nTabbedShift );
  436. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  437. m_bDeepHalfSplit = true;
  438. m_eCDT = __ECDT_INNER_TOP;
  439. rcPart.bottom = rcPart.top + rcBarWnd.Height()/2; // + nHeight2;
  440. rcPart.left = min( rcPart.left, rcWndDockBar.left );
  441. rcPart.right = max( rcPart.right, rcWndDockBar.right );
  442. break;
  443. } // if( rcPart.PtInRect(ptTrack) )
  444. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  445. rcPart = rcBarWnd;
  446. INT nBottomShift = 0;
  447. if( bCanDockToTabbedContainers
  448. //&& (!bShowContent)
  449. && bTabbedDest
  450. )
  451. {
  452. CExtDynTabControlBar * pTabbedBar =
  453. (CExtDynTabControlBar *)m_pExtBarDst;
  454. CRect rcTabSwitcher;
  455. pTabbedBar->GetSwitcherWindowRect( rcTabSwitcher );
  456. if( rcTabSwitcher.PtInRect(ptTrack) )
  457. {
  458. m_eCDT = __ECDT_TABBED_REINDEX;
  459. ReindexPosCalc( ptTrack );
  460. break;
  461. }
  462. nBottomShift = rcTabSwitcher.Size().cy;
  463. }
  464. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  465. rcPart = rcBarWnd;
  466. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  467. rcPart.bottom -= nBottomShift;
  468. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  469. rcPart.top = rcPart.bottom - nHeight3;
  470. if( rcPart.PtInRect(ptTrack) )
  471. {
  472. m_bDeepHalfSplit = true;
  473. m_eCDT = __ECDT_INNER_BOTTOM;
  474. rcPart.top = rcPart.bottom - rcBarWnd.Height()/2; // - nHeight2;
  475. rcPart.left = min( rcPart.left, rcWndDockBar.left );
  476. rcPart.right = max( rcPart.right, rcWndDockBar.right );
  477. break;
  478. } // if( rcPart.PtInRect(ptTrack) )
  479. } // if can do half splitting
  480. INT nHalfWidth = rcBarWnd.Width()/2;
  481. if( rcBarWnd.Height() >= nSrcMinVH
  482. && nHalfWidth >= nSrcMinHW
  483. && nHalfWidth >= nDstMinHW
  484. )
  485. { // if can do half splitting
  486. rcPart = rcBarWnd;
  487. rcPart.right = rcPart.left + nWidth3;
  488. if( rcPart.PtInRect(ptTrack) )
  489. {
  490. m_bDeepHalfSplit = true;
  491. m_eCDT = __ECDT_INNER_LEFT;
  492. rcPart.right = rcPart.left + rcBarWnd.Width()/2; // + nWidth2;
  493. rcPart.top = min( rcPart.top, rcWndDockBar.top );
  494. rcPart.bottom = max( rcPart.bottom, rcWndDockBar.bottom );
  495. break;
  496. } // if( rcPart.PtInRect(ptTrack) )
  497. rcPart = rcBarWnd;
  498. rcPart.left = rcPart.right - nWidth3;
  499. if( rcPart.PtInRect(ptTrack) )
  500. {
  501. m_bDeepHalfSplit = true;
  502. m_eCDT = __ECDT_INNER_RIGHT;
  503. rcPart.left = rcPart.right - rcBarWnd.Width()/2; // - nWidth2;
  504. rcPart.top = min( rcPart.top, rcWndDockBar.top );
  505. rcPart.bottom = max( rcPart.bottom, rcWndDockBar.bottom );
  506. break;
  507. } // if( rcPart.PtInRect(ptTrack) )
  508. } // if can do half splitting
  509. } // SINGLE LOOP
  510. while( false );
  511. // if( m_bDeepHalfSplit )
  512. // {
  513. // if( m_pExtBarDst->IsSingleOnRow() )
  514. // m_bDeepHalfSplit = false;
  515. // } // if( m_bDeepHalfSplit )
  516. if( m_eCDT != __ECDT_FLOATED )
  517. {
  518. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  519. if( m_bDeepHalfSplit
  520. && ( m_eCDT == __ECDT_TABBED_NEW
  521. || m_eCDT == __ECDT_TABBED_UPDATE
  522. || m_eCDT == __ECDT_TABBED_REINDEX
  523. || m_eCDT == __ECDT_TABBED_REINDEX_NHM
  524. )
  525. )
  526. m_bDeepHalfSplit = false;
  527. ASSERT(
  528. ( m_bDeepHalfSplit
  529. && m_eCDT != __ECDT_TABBED_NEW
  530. && m_eCDT != __ECDT_TABBED_UPDATE
  531. && m_eCDT != __ECDT_TABBED_REINDEX
  532. && m_eCDT != __ECDT_TABBED_REINDEX_NHM
  533. )
  534. ||
  535. ( (!m_bDeepHalfSplit)
  536. && ( m_eCDT == __ECDT_TABBED_NEW
  537. || m_eCDT == __ECDT_TABBED_UPDATE
  538. || m_eCDT == __ECDT_TABBED_REINDEX
  539. || m_eCDT == __ECDT_TABBED_REINDEX_NHM
  540. )
  541. )
  542. );
  543. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  544. // if( bHorz )
  545. // {
  546. if( rcPart.Width() < nSrcMinHW )
  547. m_eCDT = __ECDT_FLOATED;
  548. // } // if( bHorz )
  549. // else
  550. // {
  551. if( rcPart.Height() < nSrcMinVH )
  552. m_eCDT = __ECDT_FLOATED;
  553. // } // else from if( bHorz )
  554. if( m_eCDT != __ECDT_FLOATED )
  555. rcBarWnd = rcPart;
  556. } // if( m_eCDT != __ECDT_FLOATED )
  557. } // if( bEnableInnerDock && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_ANY) != 0 )
  558. } // if( pDesiredBar != NULL )
  559. } // try to analyze docking into floating bars
  560. if( bCanDockToInnerCircles && m_eCDT == __ECDT_FLOATED && (!bForceFloatMode) )
  561. {
  562. // first try calc by circle 0 inner part
  563. CRect rcCircle0( 0, 0, 0, 0 );
  564. CExtDockBar * vDockBars0[4];
  565. INT nDockSide = 0;
  566. for( nDockSide = 0; nDockSide < 4;  nDockSide++ )
  567. {
  568. UINT nDockBarID =
  569. _dwDockBarMap[ nDockSide ] [ 0 ];
  570. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  571. vDockBars0[ nDockSide ] = (CExtDockBar *)
  572. pFrame->GetControlBar( nDockBarID );
  573. ASSERT_VALID( vDockBars0[ nDockSide ] );
  574. ASSERT_KINDOF( CExtDockBar, vDockBars0[ nDockSide ] );
  575. ASSERT( vDockBars0[ nDockSide ] -> _GetCircleNo() == 0 );
  576. CRect rcDockBar;
  577. vDockBars0[ nDockSide ]->_GetPreCalcWindowRect( rcDockBar );
  578. switch( nDockBarID )
  579. {
  580. case AFX_IDW_DOCKBAR_TOP:
  581. rcCircle0.top = rcDockBar.bottom;
  582. break;
  583. case AFX_IDW_DOCKBAR_BOTTOM:
  584. rcCircle0.bottom = rcDockBar.top;
  585. break;
  586. case AFX_IDW_DOCKBAR_LEFT:
  587. rcCircle0.left = rcDockBar.right;
  588. break;
  589. case AFX_IDW_DOCKBAR_RIGHT:
  590. rcCircle0.right = rcDockBar.left;
  591. break;
  592. #ifdef _DEBUG
  593. default:
  594. {
  595. ASSERT( FALSE );
  596. }
  597. break;
  598. #endif // _DEBUG
  599. } // switch( nDockBarID )
  600. } // for( nDockSide = 0; nDockSide < 4;  nDockSide++ )
  601. // ASSERT( rcFrameWnd.left <= rcCircle0.left );
  602. // ASSERT( rcFrameWnd.top <= rcCircle0.top );
  603. // ASSERT( rcFrameWnd.right >= rcCircle0.right );
  604. // ASSERT( rcFrameWnd.bottom >= rcCircle0.bottom );
  605. CRect rcTestCircle0( rcCircle0 );
  606. //rcTestCircle0.InflateRect( nRdpOuter, nRdpOuter );
  607. rcTestCircle0.InflateRect( nRdpMostInner, nRdpMostInner );
  608. if( rcCircle0.left < rcCircle0.right
  609. && rcCircle0.top < rcCircle0.bottom
  610. && rcTestCircle0.PtInRect( ptTrack )
  611. )
  612. { // if we have sense analyze docking into circle 0 inner part/circle 1 outer part
  613. for( nDockSide = 0; nDockSide < 4;  nDockSide++ )
  614. {
  615. DWORD dwDockStyle =
  616. _dwDockBarMap[ nDockSide ] [ 1 ];
  617. if( (m_pExtBarSrc->m_dwDockStyle & dwDockStyle) == 0 )
  618. continue; // can not dock at this side
  619. UINT nDockBarID =
  620. _dwDockBarMap[ nDockSide ] [ 0 ];
  621. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  622. CRect rcFrameAnalyze( rcTestCircle0 );
  623. switch( nDockBarID )
  624. {
  625. case AFX_IDW_DOCKBAR_TOP:
  626. {
  627. //rcFrameAnalyze.top -= nRdpMostInner;
  628. rcFrameAnalyze.bottom =
  629. rcFrameAnalyze.top + nRdpOuter;
  630. if( rcFrameAnalyze.PtInRect(ptTrack) )
  631. {
  632. m_eCDT = __ECDT_CIRCLE1_OUTER_TOP;
  633. m_nCircleNo = 1;
  634. rcBarWnd.top = rcCircle0.top;
  635. rcBarWnd.bottom =
  636. rcBarWnd.top +
  637. m_pExtBarSrc->m_sizeDockedH.cy;
  638. rcBarWnd.left = rcCircle0.left;
  639. rcBarWnd.right = rcCircle0.right;
  640. } // if( rcFrameAnalyze.PtInRect(ptTrack) )
  641. }
  642. break; // case AFX_IDW_DOCKBAR_TOP
  643. case AFX_IDW_DOCKBAR_BOTTOM:
  644. {
  645. //rcFrameAnalyze.bottom += nRdpMostInner;
  646. rcFrameAnalyze.top =
  647. rcFrameAnalyze.bottom - nRdpOuter;
  648. if( rcFrameAnalyze.PtInRect(ptTrack) )
  649. {
  650. m_eCDT = __ECDT_CIRCLE1_OUTER_BOTTOM;
  651. m_nCircleNo = 1;
  652. rcBarWnd.bottom = rcCircle0.bottom;
  653. rcBarWnd.top =
  654. rcBarWnd.bottom -
  655. m_pExtBarSrc->m_sizeDockedH.cy;
  656. rcBarWnd.left = rcCircle0.left;
  657. rcBarWnd.right = rcCircle0.right;
  658. } // if( rcFrameAnalyze.PtInRect(ptTrack) )
  659. }
  660. break; // case AFX_IDW_DOCKBAR_BOTTOM
  661. case AFX_IDW_DOCKBAR_LEFT:
  662. {
  663. //rcFrameAnalyze.left -= nRdpMostInner;
  664. rcFrameAnalyze.right =
  665. rcFrameAnalyze.left + nRdpOuter;
  666. if( rcFrameAnalyze.PtInRect(ptTrack) )
  667. {
  668. m_eCDT = __ECDT_CIRCLE1_OUTER_LEFT;
  669. m_nCircleNo = 1;
  670. rcBarWnd.left = rcCircle0.left;
  671. rcBarWnd.right =
  672. rcBarWnd.left +
  673. m_pExtBarSrc->m_sizeDockedV.cx;
  674. rcBarWnd.top = rcCircle0.top;
  675. rcBarWnd.bottom = rcCircle0.bottom;
  676. } // if( rcFrameAnalyze.PtInRect(ptTrack) )
  677. }
  678. break; // case AFX_IDW_DOCKBAR_LEFT
  679. case AFX_IDW_DOCKBAR_RIGHT:
  680. {
  681. //rcFrameAnalyze.right += nRdpMostInner;
  682. rcFrameAnalyze.left =
  683. rcFrameAnalyze.right - nRdpOuter;
  684. if( rcFrameAnalyze.PtInRect(ptTrack) )
  685. {
  686. m_eCDT = __ECDT_CIRCLE1_OUTER_RIGHT;
  687. m_nCircleNo = 1;
  688. rcBarWnd.right = rcCircle0.right;
  689. rcBarWnd.left =
  690. rcBarWnd.right -
  691. m_pExtBarSrc->m_sizeDockedV.cx;
  692. rcBarWnd.top = rcCircle0.top;
  693. rcBarWnd.bottom = rcCircle0.bottom;
  694. } // if( rcFrameAnalyze.PtInRect(ptTrack) )
  695. } // case AFX_IDW_DOCKBAR_RIGHT
  696. break;
  697. #ifdef _DEBUG
  698. default:
  699. {
  700. ASSERT( FALSE );
  701. }
  702. break;
  703. #endif // _DEBUG
  704. } // switch( nDockBarID )
  705. if( m_eCDT != __ECDT_FLOATED )
  706. break;
  707. } // for( nDockSide = 0; nDockSide < 4;  nDockSide++ )
  708. } // if we have sense analyze docking into circle 0 inner part/circle 1 outer part
  709. if( m_eCDT == __ECDT_FLOATED )
  710. { // try calc by most inner dockbars
  711. CRect rcFrameTest( rcFrameWnd );
  712. rcFrameTest.InflateRect( nRdpInner, nRdpInner );
  713. if( rcFrameTest.PtInRect( ptTrack ) )
  714. {
  715. CRect rcFrameInner;
  716. pFrame->GetClientRect( &rcFrameInner );
  717. RepositionBarsEx(
  718. pFrame,
  719. 0,
  720. 0x0FFFF,
  721. AFX_IDW_PANE_FIRST,
  722. CWnd::reposQuery,
  723. rcFrameInner,
  724. rcFrameInner
  725. );
  726. // pFrame->RepositionBars(
  727. // 0,
  728. // 0x0FFFF,
  729. // AFX_IDW_PANE_FIRST,
  730. // CWnd::reposQuery,
  731. // rcFrameInner,
  732. // rcFrameInner
  733. // );
  734. pFrame->ClientToScreen( &rcFrameInner );
  735. if( rcFrameInner.left < rcFrameInner.right
  736. && rcFrameInner.top < rcFrameInner.bottom
  737. && rcFrameInner.PtInRect( ptTrack )
  738. )
  739. { // if we have any space to dock into inner circle
  740. // ASSERT( rcFrameWnd.left <= rcFrameInner.left );
  741. // ASSERT( rcFrameWnd.top <= rcFrameInner.top );
  742. // ASSERT( rcFrameWnd.right >= rcFrameInner.right );
  743. // ASSERT( rcFrameWnd.bottom >= rcFrameInner.bottom );
  744. CSize _sizeMaxInner = rcFrameInner.Size();
  745. _sizeMaxInner.cx = ::MulDiv( _sizeMaxInner.cx, 3, 4 );
  746. _sizeMaxInner.cy = ::MulDiv( _sizeMaxInner.cy, 3, 4 );
  747. UINT nSrcBarCircleNo =
  748. ((CExtDockBar *)m_pExtBarSrc->m_pDockBar)->_GetCircleNo();
  749. for( nDockSide = 0; nDockSide < 4;  nDockSide++ )
  750. {
  751. DWORD dwDockStyle =
  752. _dwDockBarMap[ nDockSide ] [ 1 ];
  753. if( (m_pExtBarSrc->m_dwDockStyle & dwDockStyle) == 0 )
  754. continue; // can not dock at this side
  755. UINT nDockBarID =
  756. _dwDockBarMap[ nDockSide ] [ 0 ];
  757. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  758. CExtDockBar * pDockBar = vDockBars0[ nDockSide ];
  759. ASSERT_VALID( pDockBar );
  760. ASSERT_KINDOF( CExtDockBar, pDockBar );
  761. ASSERT( pDockBar->_GetCircleNo() == 0 );
  762. if( bShowContent && m_pExtBarSrc->IsDocked() )
  763. {
  764. ASSERT( m_pExtBarSrc->m_pDockBar != NULL );
  765. ASSERT_VALID( m_pExtBarSrc->m_pDockBar );
  766. ASSERT_KINDOF( CExtDockBar, m_pExtBarSrc->m_pDockBar );
  767. if( pDockBar == m_pExtBarSrc->m_pDockBar )
  768. {
  769. CRect rcDockBar;
  770. pDockBar->GetWindowRect( &rcDockBar );
  771. if( rcDockBar.PtInRect(ptTrack) )
  772. {
  773. m_eCDT = __ECDT_OWN_AREA;
  774. nDstMinHW = nSrcMinHW;
  775. nDstMinVH = nSrcMinVH;
  776. return;
  777. }
  778. continue;
  779. } // if( pDockBar == m_pExtBarSrc->m_pDockBar )
  780. } // if( bShowContent && m_pExtBarSrc->IsDocked() )
  781. pDockBar = pDockBar->_GetDockBarInnerTop();
  782. ASSERT_VALID( pDockBar );
  783. ASSERT_KINDOF( CExtDockBar, pDockBar );
  784. CRect rcFrameAnalyze( rcFrameInner );
  785. switch( nDockBarID )
  786. {
  787. case AFX_IDW_DOCKBAR_TOP:
  788. {
  789. rcFrameAnalyze.bottom =
  790. rcFrameAnalyze.top + nRdpMostInner;
  791. if( rcFrameAnalyze.PtInRect(ptTrack) )
  792. {
  793. m_eCDT = __ECDT_DOCKBAR_INNER_TOP;
  794. m_nCircleNo = pDockBar->_GetCircleNo();
  795. bool bDeepCircleTarget = false;
  796. if( m_nCircleNo <= (nSrcBarCircleNo + 2) )
  797. bDeepCircleTarget = true;
  798. if( !bDeepCircleTarget )
  799. {
  800. CExtDockBar * pBarLeft =
  801. pDockBar->_GetInCircle( AFX_IDW_DOCKBAR_LEFT );
  802. ASSERT_VALID( pBarLeft );
  803. CExtDockBar * pBarRight =
  804. pDockBar->_GetInCircle( AFX_IDW_DOCKBAR_RIGHT );
  805. ASSERT_VALID( pBarRight );
  806. if( !pBarLeft->_CanBeSafeOptimized()
  807. || !pBarLeft->_CanBeSafeOptimized()
  808. )
  809. bDeepCircleTarget = true;
  810. }
  811. if( bDeepCircleTarget )
  812. m_nCircleNo++;
  813. rcBarWnd.top = rcFrameInner.top;
  814. rcBarWnd.bottom =
  815. rcBarWnd.top
  816. +
  817. min(
  818. m_pExtBarSrc->m_sizeDockedH.cy,
  819. _sizeMaxInner.cy
  820. );
  821. rcBarWnd.left = rcFrameInner.left;
  822. rcBarWnd.right = rcFrameInner.right;
  823. } // if( rcFrameAnalyze.PtInRect(ptTrack) )
  824. }
  825. break; // case AFX_IDW_DOCKBAR_TOP
  826. case AFX_IDW_DOCKBAR_BOTTOM:
  827. {
  828. rcFrameAnalyze.top =
  829. rcFrameAnalyze.bottom - nRdpMostInner;
  830. if( rcFrameAnalyze.PtInRect(ptTrack) )
  831. {
  832. m_eCDT = __ECDT_DOCKBAR_INNER_BOTTOM;
  833. m_nCircleNo = pDockBar->_GetCircleNo();
  834. bool bDeepCircleTarget = false;
  835. if( m_nCircleNo <= (nSrcBarCircleNo + 2) )
  836. bDeepCircleTarget = true;
  837. if( !bDeepCircleTarget )
  838. {
  839. CExtDockBar * pBarLeft =
  840. pDockBar->_GetInCircle( AFX_IDW_DOCKBAR_LEFT );
  841. ASSERT_VALID( pBarLeft );
  842. CExtDockBar * pBarRight =
  843. pDockBar->_GetInCircle( AFX_IDW_DOCKBAR_RIGHT );
  844. ASSERT_VALID( pBarRight );
  845. if( !pBarLeft->_CanBeSafeOptimized()
  846. || !pBarLeft->_CanBeSafeOptimized()
  847. )
  848. bDeepCircleTarget = true;
  849. }
  850. if( bDeepCircleTarget )
  851. m_nCircleNo++;
  852. rcBarWnd.bottom = rcFrameInner.bottom;
  853. rcBarWnd.top =
  854. rcBarWnd.bottom
  855. -
  856. min(
  857. m_pExtBarSrc->m_sizeDockedH.cy,
  858. _sizeMaxInner.cy
  859. );
  860. rcBarWnd.left = rcFrameInner.left;
  861. rcBarWnd.right = rcFrameInner.right;
  862. } // if( rcFrameAnalyze.PtInRect(ptTrack) )
  863. }
  864. break; // case AFX_IDW_DOCKBAR_BOTTOM
  865. case AFX_IDW_DOCKBAR_LEFT:
  866. {
  867. rcFrameAnalyze.right =
  868. rcFrameAnalyze.left + nRdpMostInner;
  869. if( rcFrameAnalyze.PtInRect(ptTrack) )
  870. {
  871. m_eCDT = __ECDT_DOCKBAR_INNER_LEFT;
  872. m_nCircleNo = pDockBar->_GetCircleNo();
  873. bool bDeepCircleTarget = false;
  874. if( m_nCircleNo <= (nSrcBarCircleNo + 2) )
  875. bDeepCircleTarget = true;
  876. if( !bDeepCircleTarget )
  877. {
  878. CExtDockBar * pBarTop =
  879. pDockBar->_GetInCircle( AFX_IDW_DOCKBAR_TOP );
  880. ASSERT_VALID( pBarTop );
  881. CExtDockBar * pBarBottom =
  882. pDockBar->_GetInCircle( AFX_IDW_DOCKBAR_BOTTOM );
  883. ASSERT_VALID( pBarBottom );
  884. if( !pBarTop->_CanBeSafeOptimized()
  885. || !pBarBottom->_CanBeSafeOptimized()
  886. )
  887. bDeepCircleTarget = true;
  888. }
  889. if( bDeepCircleTarget )
  890. m_nCircleNo++;
  891. rcBarWnd.left = rcFrameInner.left;
  892. rcBarWnd.right =
  893. rcBarWnd.left
  894. +
  895. min(
  896. m_pExtBarSrc->m_sizeDockedV.cx,
  897. _sizeMaxInner.cx
  898. );
  899. rcBarWnd.top = rcFrameInner.top;
  900. rcBarWnd.bottom = rcFrameInner.bottom;
  901. } // if( rcFrameAnalyze.PtInRect(ptTrack) )
  902. }
  903. break; // case AFX_IDW_DOCKBAR_LEFT
  904. case AFX_IDW_DOCKBAR_RIGHT:
  905. {
  906. rcFrameAnalyze.left =
  907. rcFrameAnalyze.right - nRdpMostInner;
  908. if( rcFrameAnalyze.PtInRect(ptTrack) )
  909. {
  910. m_eCDT = __ECDT_DOCKBAR_INNER_RIGHT;
  911. m_nCircleNo = pDockBar->_GetCircleNo();
  912. bool bDeepCircleTarget = false;
  913. if( m_nCircleNo <= (nSrcBarCircleNo + 2) )
  914. bDeepCircleTarget = true;
  915. if( !bDeepCircleTarget )
  916. {
  917. CExtDockBar * pBarTop =
  918. pDockBar->_GetInCircle( AFX_IDW_DOCKBAR_TOP );
  919. ASSERT_VALID( pBarTop );
  920. CExtDockBar * pBarBottom =
  921. pDockBar->_GetInCircle( AFX_IDW_DOCKBAR_BOTTOM );
  922. ASSERT_VALID( pBarBottom );
  923. if( !pBarTop->_CanBeSafeOptimized()
  924. || !pBarBottom->_CanBeSafeOptimized()
  925. )
  926. bDeepCircleTarget = true;
  927. }
  928. if( bDeepCircleTarget )
  929. m_nCircleNo++;
  930. rcBarWnd.right = rcFrameInner.right;
  931. rcBarWnd.left =
  932. rcBarWnd.right
  933. -
  934. min(
  935. m_pExtBarSrc->m_sizeDockedV.cx,
  936. _sizeMaxInner.cx
  937. );
  938. rcBarWnd.top = rcFrameInner.top;
  939. rcBarWnd.bottom = rcFrameInner.bottom;
  940. } // if( rcFrameAnalyze.PtInRect(ptTrack) )
  941. } // case AFX_IDW_DOCKBAR_RIGHT
  942. break;
  943. #ifdef _DEBUG
  944. default:
  945. {
  946. ASSERT( FALSE );
  947. }
  948. break;
  949. #endif // _DEBUG
  950. } // switch( nDockBarID )
  951. if( m_eCDT != __ECDT_FLOATED )
  952. break;
  953. } // for( nDockSide = 0; nDockSide < 4;  nDockSide++ )
  954. } // if we have any space to dock into inner circle
  955. } // if( rcFrameTest.PtInRect( ptTrack ) )
  956. } // try calc by most inner dockbars
  957. } // if( bCanDockToInnerCircles && m_eCDT == __ECDT_FLOATED )
  958. if( m_eCDT == __ECDT_FLOATED && (!bForceFloatMode) )
  959. { // try calc by other bar
  960. ExtControlBarVector_t vBars;
  961. m_pExtBarSrc->_GetFrameControlBars(
  962. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  963. ( INT(eResizablePanelDockingType) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005) )
  964. ? true : 
  965. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  966. false,
  967. vBars,
  968. (DWORD)(
  969. __GFECB_NONFIXED_NONMIN //|__GFECB_FIXED
  970. |__GFECB_DOCKED
  971. |__GFECB_VIS_ALL
  972. |__GFECB_BYPT_ONLY_WND
  973. ),
  974. ptTrack
  975. );
  976. INT nCountOfBars = (INT)vBars.GetSize();
  977. ASSERT( nCountOfBars >= 0 && nCountOfBars <= 1 );
  978. if( nCountOfBars == 1 )
  979. {
  980. m_pExtBarDst = vBars[0];
  981. //ExtBarDstSet( vBars[0] );
  982. ASSERT_VALID( m_pExtBarDst );
  983. m_pExtBarDst->GetWindowRect( &rcBarWnd );
  984. if( m_pExtBarDst == m_pExtBarSrc )
  985. {
  986. m_eCDT = __ECDT_OWN_AREA;
  987. nDstMinHW = nSrcMinHW;
  988. nDstMinVH = nSrcMinVH;
  989. } // if( m_pExtBarDst == m_pExtBarSrc )
  990. else //if( ! bShowContent )
  991. {
  992. m_eCDT = __ECDT_FLOATED;
  993. bool bCanAnalyzeInnerParts = true;
  994. if( !bCanDockToInnerCircles )
  995. {
  996. ASSERT_VALID( m_pExtBarDst->m_pDockBar );
  997. CExtDockBar * pDockBarDst =
  998. STATIC_DOWNCAST( CExtDockBar, m_pExtBarDst->m_pDockBar );
  999. ASSERT_KINDOF( CExtDockBar, pDockBarDst );
  1000. if( pDockBarDst->_GetCircleNo() > 0 )
  1001. bCanAnalyzeInnerParts = false;
  1002. }
  1003. if( bCanAnalyzeInnerParts && m_pExtBarDst != NULL )
  1004. {
  1005. nDstMinHW = m_pExtBarDst->_CalcDesiredMinHW();
  1006. nDstMinVH = m_pExtBarDst->_CalcDesiredMinVH();
  1007. INT nWidth3   = nRdpInner; // rcBarWnd.Width();
  1008. INT nHeight3  = nRdpInner; // rcBarWnd.Height();
  1009. // INT nWidth2  = nWidth  / 2;
  1010. // INT nHeight2 = nHeight / 2;
  1011. // INT nWidth3  = nWidth  / 4;
  1012. // INT nHeight3 = nHeight / 4;
  1013. ASSERT_VALID( m_pExtBarDst );
  1014. UINT nDockBarID =
  1015. m_pExtBarDst->GetSafeDockBarDlgCtrlID();
  1016. if( nDockBarID == AFX_IDW_DOCKBAR_FLOAT )
  1017. nDockBarID = AFX_IDW_DOCKBAR_TOP;
  1018. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  1019. bool bHorz = 
  1020. ( nDockBarID == AFX_IDW_DOCKBAR_TOP
  1021. || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM
  1022. ) ? true : false;
  1023. ASSERT( m_pExtBarDst->m_pDockBar != NULL );
  1024. // CExtDockBar * pDockBar =
  1025. // STATIC_DOWNCAST( CExtDockBar, m_pExtBarDst->m_pDockBar );
  1026. CDockBar * pDockBar = m_pExtBarDst->m_pDockBar;
  1027. ASSERT_VALID( pDockBar );
  1028. // if( bShowContent && m_pExtBarSrc->IsDocked() )
  1029. // {
  1030. // ASSERT( m_pExtBarDst->IsDocked() );
  1031. // ASSERT_VALID( m_pExtBarSrc->m_pDockBar );
  1032. // if( m_pExtBarSrc->m_pDockBar == pDockBar )
  1033. // {
  1034. // CRect rcWndTargetBar, rcWndSrcBar;
  1035. // m_pExtBarDst->GetWindowRect( &rcWndTargetBar );
  1036. // m_pExtBarSrc->GetWindowRect( &rcWndSrcBar );
  1037. // rcWndTargetBar.InflateRect( 2, 2 );
  1038. // if( bHorz )
  1039. // {
  1040. // if( abs(rcWndSrcBar.top-rcWndTargetBar.bottom) <= 2
  1041. // || abs(rcWndSrcBar.bottom-rcWndTargetBar.top) <= 2
  1042. // )
  1043. // {
  1044. // rcWndSrcBar.InflateRect( 2, 0 );
  1045. // if( rcWndSrcBar.left < rcWndTargetBar.right
  1046. // && rcWndTargetBar.right < rcWndSrcBar.right
  1047. // ||
  1048. // rcWndSrcBar.left < rcWndTargetBar.left
  1049. // && rcWndTargetBar.left < rcWndSrcBar.right
  1050. // )
  1051. // {
  1052. // m_eCDT = __ECDT_OWN_AREA;
  1053. // nDstMinHW = nSrcMinHW;
  1054. // nDstMinVH = nSrcMinVH;
  1055. // return;
  1056. // }
  1057. // }
  1058. // } // if( bHorz )
  1059. // else
  1060. // {
  1061. // if( abs(rcWndSrcBar.left-rcWndTargetBar.right) <= 2
  1062. // || abs(rcWndSrcBar.right-rcWndTargetBar.left) <= 2
  1063. // )
  1064. // {
  1065. // rcWndSrcBar.InflateRect( 0, 2 );
  1066. // if( rcWndSrcBar.top < rcWndTargetBar.bottom
  1067. // && rcWndTargetBar.bottom < rcWndSrcBar.bottom
  1068. // ||
  1069. // rcWndSrcBar.top < rcWndTargetBar.top
  1070. // && rcWndTargetBar.top < rcWndSrcBar.bottom
  1071. // )
  1072. // {
  1073. // m_eCDT = __ECDT_OWN_AREA;
  1074. // nDstMinHW = nSrcMinHW;
  1075. // nDstMinVH = nSrcMinVH;
  1076. // return;
  1077. // }
  1078. // }
  1079. // } // else from if( bHorz )
  1080. // } // if( m_pExtBarSrc->m_pDockBar == pDockBar )
  1081. // } // if( bShowContent && m_pExtBarSrc->IsDocked() )
  1082. bool bEnableInnerDock = true;
  1083. if( nDockBarID == AFX_IDW_DOCKBAR_LEFT
  1084. && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_LEFT) == 0
  1085. )
  1086. bEnableInnerDock = false;
  1087. if( nDockBarID == AFX_IDW_DOCKBAR_RIGHT
  1088. && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_RIGHT) == 0
  1089. )
  1090. bEnableInnerDock = false;
  1091. if( nDockBarID == AFX_IDW_DOCKBAR_TOP
  1092. && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_TOP) == 0
  1093. )
  1094. bEnableInnerDock = false;
  1095. if( nDockBarID == AFX_IDW_DOCKBAR_BOTTOM
  1096. && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_BOTTOM) == 0
  1097. )
  1098. bEnableInnerDock = false;
  1099. if( bEnableInnerDock && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_ANY) != 0 )
  1100. {
  1101. m_bDeepHalfSplit = false;
  1102. if( !m_pExtBarDst->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar))
  1103. || m_pExtBarDst->IsFloating()
  1104. )
  1105. m_bDeepHalfSplit = true;
  1106. CRect rcWndDockBar;
  1107. pDockBar->GetWindowRect( &rcWndDockBar );
  1108. CRect rcPart( rcBarWnd );
  1109. do
  1110. { // SINGLE LOOP
  1111. INT nHalfHeight = nRdpInner*2; // rcBarWnd.Height()/2;
  1112. if( rcBarWnd.Width() >= nSrcMinHW
  1113. && nHalfHeight >= nSrcMinVH
  1114. && nHalfHeight >= nDstMinVH
  1115. )
  1116. { // if can do half splitting
  1117. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1118. BOOL bTabbedDest =
  1119. m_pExtBarDst->IsKindOf(RUNTIME_CLASS(CExtDynTabControlBar))
  1120. && ( ((CExtDynTabControlBar*)m_pExtBarDst)->IsSwitcherVisible() )
  1121. ;
  1122. INT nTabbedShift = 0;
  1123. bool bCanDockToTabbedContainers =
  1124. ( m_pExtBarSrc->_CanDockToTabbedContainers( m_pExtBarDst )
  1125. && m_pExtBarDst->_CanDockToTabbedContainers( m_pExtBarSrc )
  1126. ) ? true : false;
  1127. if( bCanDockToTabbedContainers )
  1128. {
  1129. rcPart = rcBarWnd;
  1130. if( g_bTabsAtTop )
  1131. rcPart.top = rcPart.bottom - nHeight3;
  1132. else
  1133. rcPart.bottom = rcPart.top + nHeight3;
  1134. if( rcPart.PtInRect(ptTrack) )
  1135. {
  1136. if( bTabbedDest )
  1137. m_eCDT = __ECDT_TABBED_UPDATE;
  1138. else
  1139. m_eCDT = __ECDT_TABBED_NEW;
  1140. rcPart = rcBarWnd;
  1141. break;
  1142. }
  1143. if( g_bTabsAtTop )
  1144. {
  1145. //rcPart = rcBarWnd;
  1146. m_pExtBarDst->GetClientRect( &rcPart );
  1147. rcPart.bottom = rcPart.top + nHeight3;
  1148. nTabbedShift = nHeight3;
  1149. //rcPart.OffsetRect( 0, nTabbedShift );
  1150. }
  1151. else
  1152. {
  1153. nTabbedShift = nHeight3;
  1154. rcPart.OffsetRect( 0, nTabbedShift );
  1155. }
  1156. }
  1157. else
  1158. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1159. {
  1160. rcPart = rcBarWnd;
  1161. rcPart.bottom = rcPart.top + nHeight3;
  1162. }
  1163. if( rcPart.PtInRect(ptTrack) )
  1164. {
  1165. if( !bShowContent || !bHorz )
  1166. {
  1167. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1168. if( g_bTabsAtTop )
  1169. rcPart.OffsetRect( 0, nTabbedShift );
  1170. else
  1171. rcPart.OffsetRect( 0, -nTabbedShift );
  1172. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1173. m_bDeepHalfSplit = true;
  1174. m_eCDT = __ECDT_INNER_TOP;
  1175. rcPart.bottom = rcPart.top + rcBarWnd.Height()/2; // + nHeight2;
  1176. if( bHorz && !m_bDeepHalfSplit )
  1177. {
  1178. rcPart.left = min( rcPart.left, rcWndDockBar.left );
  1179. rcPart.right = max( rcPart.right, rcWndDockBar.right );
  1180. }
  1181. break;
  1182. } // if( !bShowContent || !bHorz )
  1183. } // if( rcPart.PtInRect(ptTrack) )
  1184. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1185. rcPart = rcBarWnd;
  1186. INT nBottomShift = 0;
  1187. if( bCanDockToTabbedContainers
  1188. //&& (!bShowContent)
  1189. && bTabbedDest
  1190. )
  1191. {
  1192. CExtDynTabControlBar * pTabbedBar =
  1193. (CExtDynTabControlBar *)m_pExtBarDst;
  1194. CRect rcTabSwitcher;
  1195. pTabbedBar->GetSwitcherWindowRect( rcTabSwitcher );
  1196. if( rcTabSwitcher.PtInRect(ptTrack) )
  1197. {
  1198. m_eCDT = __ECDT_TABBED_REINDEX;
  1199. ReindexPosCalc( ptTrack );
  1200. break;
  1201. }
  1202. nBottomShift = rcTabSwitcher.Size().cy;
  1203. }
  1204. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1205. rcPart = rcBarWnd;
  1206. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1207. rcPart.bottom -= nBottomShift;
  1208. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1209. rcPart.top = rcPart.bottom - nHeight3;
  1210. if( rcPart.PtInRect(ptTrack) )
  1211. {
  1212. if( !bShowContent || !bHorz )
  1213. {
  1214. /*
  1215. CRect rcDeep(
  1216. rcPart.left,
  1217. rcPart.top,
  1218. rcPart.right,
  1219. rcPart.bottom-rcPart.Height()/2
  1220. );
  1221. m_bDeepHalfSplit =
  1222. rcDeep.PtInRect(ptTrack) ? true : false;
  1223. */
  1224. m_bDeepHalfSplit = true;
  1225. m_eCDT = __ECDT_INNER_BOTTOM;
  1226. rcPart.top = rcPart.bottom - rcBarWnd.Height()/2;// - nHeight2;
  1227. if( bHorz && !m_bDeepHalfSplit )
  1228. {
  1229. rcPart.left = min( rcPart.left, rcWndDockBar.left );
  1230. rcPart.right = max( rcPart.right, rcWndDockBar.right );
  1231. }
  1232. break;
  1233. } // if( !bShowContent || !bHorz )
  1234. } // if( rcPart.PtInRect(ptTrack) )
  1235. } // if can do half splitting
  1236. INT nHalfWidth = nRdpInner*2; // rcBarWnd.Width()/2;
  1237. if( rcBarWnd.Height() >= nSrcMinVH
  1238. && nHalfWidth >= nSrcMinHW
  1239. && nHalfWidth >= nDstMinHW
  1240. )
  1241. { // if can do half splitting
  1242. rcPart = rcBarWnd;
  1243. rcPart.right = rcPart.left + nWidth3;
  1244. if( rcPart.PtInRect(ptTrack) )
  1245. {
  1246. if( !bShowContent || bHorz )
  1247. {
  1248. /*
  1249. CRect rcDeep(
  1250. rcPart.left+rcPart.Width()/2,
  1251. rcPart.top,
  1252. rcPart.right,
  1253. rcPart.bottom
  1254. );
  1255. m_bDeepHalfSplit =
  1256. rcDeep.PtInRect(ptTrack) ? true : false;
  1257. */
  1258. m_bDeepHalfSplit = true;
  1259. m_eCDT = __ECDT_INNER_LEFT;
  1260. rcPart.right = rcPart.left + rcBarWnd.Width()/2; // + nWidth2;
  1261. if( !bHorz && !m_bDeepHalfSplit )
  1262. {
  1263. rcPart.top = min( rcPart.top, rcWndDockBar.top );
  1264. rcPart.bottom = max( rcPart.bottom, rcWndDockBar.bottom );
  1265. }
  1266. break;
  1267. } // if( !bShowContent || bHorz )
  1268. } // if( rcPart.PtInRect(ptTrack) )
  1269. rcPart = rcBarWnd;
  1270. rcPart.left = rcPart.right - nWidth3;
  1271. if( rcPart.PtInRect(ptTrack) )
  1272. {
  1273. if( !bShowContent || bHorz )
  1274. {
  1275. /*
  1276. CRect rcDeep(
  1277. rcPart.left,
  1278. rcPart.top,
  1279. rcPart.right-rcPart.Width()/2,
  1280. rcPart.bottom
  1281. );
  1282. m_bDeepHalfSplit =
  1283. rcDeep.PtInRect(ptTrack) ? true : false;
  1284. */
  1285. m_bDeepHalfSplit = true;
  1286. m_eCDT = __ECDT_INNER_RIGHT;
  1287. rcPart.left = rcPart.right - rcBarWnd.Width()/2; // - nWidth2;
  1288. if( !bHorz && !m_bDeepHalfSplit )
  1289. {
  1290. rcPart.top = min( rcPart.top, rcWndDockBar.top );
  1291. rcPart.bottom = max( rcPart.bottom, rcWndDockBar.bottom );
  1292. }
  1293. break;
  1294. } // if( !bShowContent || bHorz )
  1295. } // if( rcPart.PtInRect(ptTrack) )
  1296. } // if can do half splitting
  1297. } // SINGLE LOOP
  1298. while( false );
  1299. if( m_bDeepHalfSplit )
  1300. {
  1301. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1302. if( m_bDeepHalfSplit
  1303. && ( m_eCDT == __ECDT_TABBED_NEW
  1304. || m_eCDT == __ECDT_TABBED_UPDATE
  1305. || m_eCDT == __ECDT_TABBED_REINDEX
  1306. || m_eCDT == __ECDT_TABBED_REINDEX_NHM
  1307. )
  1308. )
  1309. m_bDeepHalfSplit = false;
  1310. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1311. // if( m_pExtBarDst->IsFloating()
  1312. // || m_pExtBarDst->IsSingleOnRow()
  1313. // )
  1314. // m_bDeepHalfSplit = false;
  1315. if( !m_pExtBarDst->IsFloating()
  1316. && m_pExtBarDst->IsSingleOnRow()
  1317. )
  1318. m_bDeepHalfSplit = false;
  1319. } // if( m_bDeepHalfSplit )
  1320. if( m_eCDT != __ECDT_FLOATED )
  1321. {
  1322. if( bHorz )
  1323. {
  1324. if( rcPart.Width() < nSrcMinHW )
  1325. m_eCDT = __ECDT_FLOATED;
  1326. } // if( bHorz )
  1327. else
  1328. {
  1329. if( rcPart.Height() < nSrcMinVH )
  1330. m_eCDT = __ECDT_FLOATED;
  1331. } // else from if( bHorz )
  1332. if( m_eCDT != __ECDT_FLOATED )
  1333. rcBarWnd = rcPart;
  1334. } // if( m_eCDT != __ECDT_FLOATED )
  1335. } // if( bEnableInnerDock && (m_pExtBarSrc->m_dwDockStyle&CBRS_ALIGN_ANY) != 0 )
  1336. } // if( bCanAnalyzeInnerParts && m_pExtBarDst != NULL )
  1337. } // else if( !bShowContent ) -> else from if( m_pExtBarDst == m_pExtBarSrc )
  1338. } // if( nCountOfBars == 1 )
  1339. } // try calc by other bar
  1340. } // if( !CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) ....
  1341. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  1342. if( INT(eResizablePanelDockingType) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005)
  1343. && m_eCDT != __ECDT_FLOATED
  1344. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1345. && m_eCDT != __ECDT_TABBED_REINDEX
  1346. && m_eCDT != __ECDT_TABBED_REINDEX_NHM
  1347. && m_eCDT != __ECDT_TABBED_UPDATE
  1348. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1349. )
  1350. m_eCDT = __ECDT_FLOATED;
  1351. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  1352. if( m_eCDT == __ECDT_FLOATED )
  1353. {
  1354. //m_pExtBarDst = NULL;
  1355. ExtBarDstSet( NULL );
  1356. if( m_pExtBarSrc->IsFloating() )
  1357. {
  1358. CMiniDockFrameWnd * pMiniFrame = 
  1359. DYNAMIC_DOWNCAST(
  1360. CMiniDockFrameWnd,
  1361. m_pExtBarSrc->GetDockingFrame()
  1362. );
  1363. ASSERT_VALID( pMiniFrame );
  1364. pMiniFrame->GetWindowRect( &rcBarWnd );
  1365. rcBarWnd.OffsetRect( -rcBarWnd.TopLeft() );
  1366. rcBarWnd.OffsetRect(
  1367. ptTrack - m_pExtBarSrc->m_ptHelperDragOffsetFloated
  1368. );
  1369. CRect rcGrip = m_pExtBarSrc->_RectGripGet();
  1370. INT nCyGripper = min( rcGrip.Width(), rcGrip.Height() );
  1371. rcBarWnd.OffsetRect( -nCyGripper, -nCyGripper/2 );
  1372. } // if( m_pExtBarSrc->IsFloating() )
  1373. else
  1374. {
  1375. rcBarWnd.SetRect(
  1376. ptTrack,
  1377. ptTrack + m_pExtBarSrc->m_sizeFloated
  1378. );
  1379. rcBarWnd.OffsetRect(
  1380. - m_pExtBarSrc->m_ptHelperDragOffsetFloated
  1381. );
  1382. } // else from if( m_pExtBarSrc->IsFloating() )
  1383. rcBarWnd.OffsetRect( rcFrameWnd.TopLeft() );
  1384. } // if( m_eCDT == __ECDT_FLOATED )
  1385. TrackRectSet( &rcBarWnd );
  1386. }
  1387. #define __RECALC_FRAME_STEPS( __FRAME_PTR__ ) 
  1388. ( (__FRAME_PTR__)->IsKindOf(RUNTIME_CLASS(CExtMiniDockFrameWnd)) 
  1389. ? (__FRAME_PTR__)->RecalcLayout() 
  1390. : (__FRAME_PTR__)->DelayRecalcLayout() )
  1391. void CExtControlBar::_DraggingDoDeepHalfSplit(
  1392. CExtControlBar * pExtBar,
  1393. UINT nHalfSplitID, // one of AFX_IDW_DOCKBAR_... docked value
  1394. int nPercentToOccupy // = 50 // greater then zero and less then one hundred
  1395. )
  1396. {
  1397. ASSERT_VALID( this );
  1398. ASSERT_KINDOF( CExtControlBar, this );
  1399. ASSERT( !IsFixedMode() );
  1400. ASSERT_VALID( m_pDockSite );
  1401. ASSERT_VALID( m_pDockBar );
  1402. ASSERT_KINDOF( CDockBar, m_pDockBar );
  1403. ASSERT_VALID( pExtBar );
  1404. ASSERT_KINDOF( CExtControlBar, pExtBar );
  1405. ASSERT( !pExtBar->IsFixedMode() );
  1406. ASSERT( 0 < nPercentToOccupy && nPercentToOccupy < 100 );
  1407. #ifdef _DEBUG
  1408. if( pExtBar->m_pDockBar != NULL )
  1409. {
  1410. ASSERT_VALID( pExtBar->m_pDockSite );
  1411. ASSERT_VALID( pExtBar->m_pDockBar );
  1412. ASSERT_KINDOF( CDockBar, pExtBar->m_pDockBar );
  1413. ASSERT( pExtBar->m_pDockSite == m_pDockSite );
  1414. }
  1415. #endif // _DEBUG
  1416. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nHalfSplitID );
  1417. CDockBar * pDockBarIn = m_pDockBar;
  1418. // STATIC_DOWNCAST( CExtDockBar, m_pDockBar );
  1419. CDockBar * pDockBarOut = pExtBar->m_pDockBar;
  1420. // STATIC_DOWNCAST( CExtDockBar, pExtBar->m_pDockBar );
  1421. CRect rcDyn;
  1422. GetWindowRect( &rcDyn );
  1423. CRect rcIn( rcDyn );
  1424. CRect rcOut( rcDyn );
  1425. pDockBarIn->ScreenToClient( &rcDyn );
  1426. UINT nNewID = AFX_IDW_DOCKBAR_TOP;
  1427. DWORD nBarStyle = CBRS_ALIGN_TOP;
  1428. switch( nHalfSplitID )
  1429. {
  1430. case AFX_IDW_DOCKBAR_TOP:
  1431. nNewID = AFX_IDW_DOCKBAR_LEFT;
  1432. nBarStyle = CBRS_ALIGN_LEFT;
  1433. //rcIn.top += rcIn.Height()/2;
  1434. rcIn.top += ::MulDiv( rcIn.Height(), nPercentToOccupy, 100 );
  1435. rcOut.bottom = rcIn.top;
  1436. break;
  1437. case AFX_IDW_DOCKBAR_BOTTOM:
  1438. nNewID = AFX_IDW_DOCKBAR_LEFT;
  1439. nBarStyle = CBRS_ALIGN_LEFT;
  1440. //rcIn.bottom -= rcIn.Height()/2;
  1441. rcIn.bottom -= ::MulDiv( rcIn.Height(), nPercentToOccupy, 100 );
  1442. rcOut.top = rcIn.bottom;
  1443. break;
  1444. case AFX_IDW_DOCKBAR_LEFT:
  1445. //rcIn.left += rcIn.Width()/2;
  1446. rcIn.left += ::MulDiv( rcIn.Width(), nPercentToOccupy, 100 );
  1447. rcOut.right = rcIn.left;
  1448. break;
  1449. case AFX_IDW_DOCKBAR_RIGHT:
  1450. //rcIn.right -= rcIn.Width()/2;
  1451. rcIn.right -= ::MulDiv( rcIn.Width(), nPercentToOccupy, 100 );
  1452. rcOut.left = rcIn.right;
  1453. break;
  1454. #ifdef _DEBUG
  1455. default:
  1456. {
  1457. ASSERT( FALSE );
  1458. }
  1459. break;
  1460. #endif // _DEBUG
  1461. } // switch( nHalfSplitID )
  1462. DWORD dwDynStyle =
  1463. GetStyle()
  1464. | (GetBarStyle() & CBRS_ALIGN_ANY)
  1465. ;
  1466. dwDynStyle |= CBRS_BORDER_ANY;
  1467. dwDynStyle &= ~( CBRS_FLOATING | CBRS_GRIPPER );
  1468. dwDynStyle |= CBRS_TOOLTIPS;
  1469. CExtDynControlBar * pDynBar = new CExtDynControlBar;
  1470. pDynBar->SetInitDesiredSizeHorizontal( m_sizeDockedH );
  1471. pDynBar->SetInitDesiredSizeVertical( m_sizeDockedV );
  1472. if( ! pDynBar->Create(
  1473. NULL,
  1474. m_pDockSite,
  1475. nNewID,
  1476. dwDynStyle
  1477. )
  1478. )
  1479. {
  1480. ASSERT( FALSE );
  1481. return;
  1482. }
  1483. ASSERT( pDynBar->m_pWndDynDocker != NULL );
  1484. ASSERT( pDynBar->m_pWndDynDocker->GetSafeHwnd() != NULL );
  1485. ASSERT( ::IsWindow(pDynBar->m_pWndDynDocker->GetSafeHwnd()) );
  1486. CFrameWnd * pDockSite = m_pDockSite;
  1487. pDynBar->m_pDockSite = m_pDockSite;
  1488. pDynBar->m_pDockBar = m_pDockBar;
  1489. pDynBar->EnableDocking( CBRS_ALIGN_ANY );
  1490. ASSERT( pDynBar->m_pDockContext != NULL );
  1491. ASSERT( pDynBar->m_pDockContext->m_pDockSite == m_pDockSite );
  1492. #ifdef _DEBUG
  1493. if( pDockBarOut != NULL )
  1494. {
  1495. INT nPosOut = pDockBarOut->FindBar( pExtBar );
  1496. ASSERT( nPosOut > 0 && nPosOut < pDockBarOut->m_arrBars.GetSize() );
  1497. }
  1498. #endif // _DEBUG
  1499. INT nPosIn = pDockBarIn->FindBar( this );
  1500. ASSERT( nPosIn > 0 && nPosIn < pDockBarIn->m_arrBars.GetSize() );
  1501. pDockBarIn->m_arrBars[ nPosIn ] = pDynBar;
  1502. pDynBar->m_pDockBar->m_bFloating = m_pDockBar->m_bFloating;
  1503. m_pDockBar = pDynBar->m_pWndDynDocker;
  1504. pExtBar->m_pDockBar = pDynBar->m_pWndDynDocker;
  1505. m_pDockBar->m_bFloating = FALSE;
  1506. if( pDynBar->m_pDockBar->m_bFloating )
  1507. pDynBar->m_pDockBar->SetBarStyle(
  1508. pDynBar->m_pDockBar->GetBarStyle()|CBRS_FLOATING
  1509. );
  1510. m_pDockBar->SetBarStyle(
  1511. m_pDockBar->GetBarStyle() & (~CBRS_FLOATING)
  1512. );
  1513. ASSERT( !m_bUpdatingChain );
  1514. ASSERT( !((CExtControlBar *)pDynBar)->m_bUpdatingChain );
  1515. ASSERT( !pExtBar->m_bUpdatingChain );
  1516. m_bUpdatingChain = true;
  1517. ((CExtControlBar *)pDynBar)->m_bUpdatingChain = true;
  1518. pExtBar->m_bUpdatingChain = true;
  1519. SetBarStyle( GetBarStyle() & (~CBRS_FLOATING) );
  1520. pExtBar->SetBarStyle( pExtBar->GetBarStyle() & (~CBRS_FLOATING) );
  1521. pDynBar->SetParent( pDockBarIn );
  1522. SetParent( pDynBar->m_pWndDynDocker );
  1523. pExtBar->SetParent( pDynBar->m_pWndDynDocker );
  1524. if( pDockBarOut != NULL )
  1525. {
  1526. ASSERT( pDockBarOut->FindBar( pExtBar ) >= 0 );
  1527. if( !pDockBarOut->m_bFloating
  1528. && pDockBarOut->IsKindOf(RUNTIME_CLASS(CExtDockBar))
  1529. )
  1530. {
  1531. VERIFY(
  1532. ((CExtDockBar *)pDockBarOut)->
  1533. RemoveControlBar( pExtBar, -1, 0, false )
  1534. );
  1535. }
  1536. else
  1537. {
  1538. VERIFY( pDockBarOut->RemoveControlBar(pExtBar) );
  1539. }
  1540. }
  1541. if( nHalfSplitID == AFX_IDW_DOCKBAR_TOP
  1542. || nHalfSplitID == AFX_IDW_DOCKBAR_LEFT
  1543. )
  1544. {
  1545. pDynBar->m_pWndDynDocker->m_arrBars.Add( pExtBar );
  1546. pDynBar->m_pWndDynDocker->m_arrBars.Add( this );
  1547. }
  1548. else
  1549. {
  1550. pDynBar->m_pWndDynDocker->m_arrBars.Add( this );
  1551. pDynBar->m_pWndDynDocker->m_arrBars.Add( pExtBar );
  1552. }
  1553. pDynBar->m_pWndDynDocker->m_arrBars.Add( NULL );
  1554. SetInitDesiredSizeHorizontal( rcIn.Size() );
  1555. SetInitDesiredSizeVertical( rcIn.Size() );
  1556. pExtBar->SetInitDesiredSizeHorizontal( rcOut.Size() );
  1557. pExtBar->SetInitDesiredSizeVertical( rcOut.Size() );
  1558. // if( bOptimizeDockBarLayout
  1559. // && ::IsWindow( hWndDockBarOut )
  1560. // )
  1561. // {
  1562. // ASSERT_VALID( pDockBarOut );
  1563. // ASSERT(
  1564. // CWnd::FromHandlePermanent(hWndDockBarOut)
  1565. // == pDockBarOut
  1566. // );
  1567. // ((CExtDockBar *)pDockBarOut)->OnDynamicLayoutOptimize();
  1568. // }
  1569. pDynBar->ScreenToClient( &rcIn );
  1570. pDynBar->ScreenToClient( &rcOut );
  1571. MoveWindow( &rcIn, FALSE );
  1572. pExtBar->MoveWindow( &rcOut, FALSE );
  1573. pDynBar->SetInitDesiredSizeFloating( rcDyn.Size() );
  1574. pDynBar->MoveWindow( &rcDyn, FALSE );
  1575. ASSERT_VALID( pDynBar );
  1576. ASSERT_VALID( pDynBar->m_pWndDynDocker );
  1577. m_bUpdatingChain = false;
  1578. ((CExtControlBar *)pDynBar)->m_bUpdatingChain = false;
  1579. pExtBar->m_bUpdatingChain = false;
  1580. //pDynBar->m_pWndDynDocker->OnDynamicLayoutUpdate();
  1581. CExtDockBar::_OptimizeCircles( m_pDockSite );
  1582. CFrameWnd * pFrame = pDynBar->GetParentFrame();
  1583. if( pFrame != NULL )
  1584. {
  1585. ASSERT_VALID( pFrame );
  1586. pFrame->RecalcLayout();
  1587. pDynBar->OnRepositionSingleChild();
  1588. pDynBar->OnNcAreaButtonsReinitialize();
  1589. pDynBar->OnNcAreaButtonsReposition();
  1590. ASSERT_VALID( pDynBar->m_pWndDynDocker );
  1591. pDynBar->m_pWndDynDocker->OnDynamicLayoutUpdate();
  1592. }
  1593. stat_AdjustOccCompatibilityTree( pDockSite );
  1594. }
  1595. bool CExtControlBar::_DraggingApplyState(
  1596. CExtControlBar::InternalDraggingState_t & _ds,
  1597. bool bFinalApply
  1598. )
  1599. {
  1600. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  1601. CExtDynDockMarkerWnd::UnHighlightAllMarkers();
  1602. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  1603. if( _ds.IsEmpty() )
  1604. return false;
  1605. CExtControlBar * pExtBarSrc = _ds.ExtBarSrcGet();
  1606. ASSERT_VALID( pExtBarSrc );
  1607. if( pExtBarSrc->IsFixedDockStyle() )
  1608. return false;
  1609. CFrameWnd * pFrame =
  1610. pExtBarSrc->_GetDockingFrameImpl();
  1611. ASSERT_VALID( pFrame );
  1612. CFrameWnd * pOldFrame =
  1613. pExtBarSrc->GetParentFrame();
  1614. ASSERT_VALID( pOldFrame );
  1615. HWND hWndOldFrame = pOldFrame->GetSafeHwnd();
  1616. CExtControlBar * pExtBarDst = _ds.ExtBarDstGet();
  1617. ExtControlBarVector_t vBarsDstRow;
  1618. INT nCountOfDstRowBars = 0;
  1619. UINT nDstDockBarID = AFX_IDW_DOCKBAR_FLOAT;
  1620. CDockBar * pDstDockBar = NULL;
  1621. bool bDstHorzDockBar = true;
  1622. bool bDstFloatBar = false;
  1623. INT nDstBarIdx = -1;
  1624. if( pExtBarDst != NULL )
  1625. {
  1626. ASSERT_VALID( pExtBarDst );
  1627. pExtBarDst->_GetRowExtBars( vBarsDstRow );
  1628. nCountOfDstRowBars = (INT)vBarsDstRow.GetSize();
  1629. ASSERT( nCountOfDstRowBars >= 1 );
  1630. nDstDockBarID = pExtBarDst->GetSafeDockBarDlgCtrlID();
  1631. ASSERT_DOCKBAR_DLGCTRLID( nDstDockBarID );
  1632. ASSERT( pExtBarDst->m_pDockBar != NULL );
  1633. pDstDockBar = pExtBarDst->m_pDockBar;
  1634. // STATIC_DOWNCAST(
  1635. // CExtDockBar,
  1636. // pExtBarDst->m_pDockBar
  1637. // );
  1638. ASSERT( pDstDockBar != NULL );
  1639. ASSERT_VALID( pDstDockBar );
  1640. if( nDstDockBarID == AFX_IDW_DOCKBAR_LEFT
  1641. || nDstDockBarID == AFX_IDW_DOCKBAR_RIGHT
  1642. )
  1643. bDstHorzDockBar = false;
  1644. if( nDstDockBarID == AFX_IDW_DOCKBAR_FLOAT )
  1645. bDstFloatBar = true;
  1646. nDstBarIdx = pDstDockBar->FindBar( pExtBarDst );
  1647. ASSERT( nDstBarIdx >= 0 );
  1648. } // if( pExtBarDst != NULL )
  1649. bool bInitialMode = false;
  1650. if( pExtBarSrc->m_pDockBar == NULL )
  1651. bInitialMode = true;
  1652. CRect rcTrack( _ds.TrackRectGet() );
  1653. e_calc_dock_type_t eCDT = _ds.GetCDT();
  1654. if( bFinalApply )
  1655. {
  1656. switch( eCDT )
  1657. {
  1658. case __ECDT_2005_OUTER_TOP:
  1659. VERIFY(
  1660. pExtBarSrc->DockControlBarInnerOuter(
  1661. AFX_IDW_DOCKBAR_TOP,
  1662. false,
  1663. NULL,
  1664. true
  1665. )
  1666. );
  1667. return true;
  1668. case __ECDT_2005_OUTER_BOTTOM:
  1669. VERIFY(
  1670. pExtBarSrc->DockControlBarInnerOuter(
  1671. AFX_IDW_DOCKBAR_BOTTOM,
  1672. false,
  1673. NULL,
  1674. true
  1675. )
  1676. );
  1677. return true;
  1678. case __ECDT_2005_OUTER_LEFT:
  1679. VERIFY(
  1680. pExtBarSrc->DockControlBarInnerOuter(
  1681. AFX_IDW_DOCKBAR_LEFT,
  1682. false,
  1683. NULL,
  1684. true
  1685. )
  1686. );
  1687. return true;
  1688. case __ECDT_2005_OUTER_RIGHT:
  1689. VERIFY(
  1690. pExtBarSrc->DockControlBarInnerOuter(
  1691. AFX_IDW_DOCKBAR_RIGHT,
  1692. false,
  1693. NULL,
  1694. true
  1695. )
  1696. );
  1697. return true;
  1698. case __ECDT_2005_INNER_TOP:
  1699. VERIFY(
  1700. pExtBarSrc->DockControlBarInnerOuter(
  1701. AFX_IDW_DOCKBAR_TOP,
  1702. true,
  1703. NULL,
  1704. true
  1705. )
  1706. );
  1707. return true;
  1708. case __ECDT_2005_INNER_BOTTOM:
  1709. VERIFY(
  1710. pExtBarSrc->DockControlBarInnerOuter(
  1711. AFX_IDW_DOCKBAR_BOTTOM,
  1712. true,
  1713. NULL,
  1714. true
  1715. )
  1716. );
  1717. return true;
  1718. case __ECDT_2005_INNER_LEFT:
  1719. VERIFY(
  1720. pExtBarSrc->DockControlBarInnerOuter(
  1721. AFX_IDW_DOCKBAR_LEFT,
  1722. true,
  1723. NULL,
  1724. true
  1725. )
  1726. );
  1727. return true;
  1728. case __ECDT_2005_INNER_RIGHT:
  1729. VERIFY(
  1730. pExtBarSrc->DockControlBarInnerOuter(
  1731. AFX_IDW_DOCKBAR_RIGHT,
  1732. true,
  1733. NULL,
  1734. true
  1735. )
  1736. );
  1737. return true;
  1738. case __ECDT_2005_BAR_TOP:
  1739. if( pExtBarDst == NULL )
  1740. return true;
  1741. VERIFY(
  1742. pExtBarSrc->DockControlBarLTRB(
  1743. pExtBarDst,
  1744. AFX_IDW_DOCKBAR_TOP
  1745. )
  1746. );
  1747. return true;
  1748. case __ECDT_2005_BAR_BOTTOM:
  1749. if( pExtBarDst == NULL )
  1750. return true;
  1751. VERIFY(
  1752. pExtBarSrc->DockControlBarLTRB(
  1753. pExtBarDst,
  1754. AFX_IDW_DOCKBAR_BOTTOM
  1755. )
  1756. );
  1757. return true;
  1758. case __ECDT_2005_BAR_LEFT:
  1759. if( pExtBarDst == NULL )
  1760. return true;
  1761. VERIFY(
  1762. pExtBarSrc->DockControlBarLTRB(
  1763. pExtBarDst,
  1764. AFX_IDW_DOCKBAR_LEFT
  1765. )
  1766. );
  1767. return true;
  1768. case __ECDT_2005_BAR_RIGHT:
  1769. if( pExtBarDst == NULL )
  1770. return true;
  1771. VERIFY(
  1772. pExtBarSrc->DockControlBarLTRB(
  1773. pExtBarDst,
  1774. AFX_IDW_DOCKBAR_RIGHT
  1775. )
  1776. );
  1777. return true;
  1778. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1779. case __ECDT_2005_BAR_NEW_TAB:
  1780. if( pExtBarDst == NULL )
  1781. return true;
  1782. ASSERT_VALID( pExtBarDst );
  1783. ASSERT_VALID( pDstDockBar );
  1784. VERIFY(
  1785. pExtBarDst->DockControlBarIntoTabbedContainer(
  1786. pExtBarSrc,
  1787. 0, //_ds.ReindexPosGet(), //-1,
  1788. NULL,
  1789. true
  1790. )
  1791. );
  1792. return true;
  1793. #endif // else from  (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1794. } // switch( eCDT )
  1795. } // if( bFinalApply )
  1796. switch( eCDT )
  1797. {
  1798. case __ECDT_OWN_AREA:
  1799. m_pDockSite->DelayRecalcLayout();
  1800. return true;
  1801. break;
  1802. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1803. case __ECDT_TABBED_NEW:
  1804. case __ECDT_TABBED_UPDATE:
  1805. case __ECDT_TABBED_REINDEX:
  1806. case __ECDT_TABBED_REINDEX_NHM:
  1807. {
  1808. if( pExtBarDst == NULL )
  1809. return TRUE;
  1810. ASSERT_VALID( pExtBarDst );
  1811. ASSERT_VALID( pDstDockBar );
  1812. VERIFY(
  1813. pExtBarDst->DockControlBarIntoTabbedContainer(
  1814. pExtBarSrc,
  1815. _ds.ReindexPosGet(), //-1,
  1816. NULL,
  1817. true
  1818. )
  1819. );
  1820. return true;
  1821. }
  1822. break;
  1823. case __ECDT_2005_BAR_NEW_TAB:
  1824. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1825. case __ECDT_2005_OUTER_TOP:
  1826. case __ECDT_2005_OUTER_BOTTOM:
  1827. case __ECDT_2005_OUTER_LEFT:
  1828. case __ECDT_2005_OUTER_RIGHT:
  1829. case __ECDT_2005_INNER_TOP:
  1830. case __ECDT_2005_INNER_BOTTOM:
  1831. case __ECDT_2005_INNER_LEFT:
  1832. case __ECDT_2005_INNER_RIGHT:
  1833. case __ECDT_2005_BAR_TOP:
  1834. case __ECDT_2005_BAR_BOTTOM:
  1835. case __ECDT_2005_BAR_LEFT:
  1836. case __ECDT_2005_BAR_RIGHT:
  1837. {
  1838. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  1839. CPoint ptCursor;
  1840. if( ::GetCursorPos( &ptCursor ) )
  1841. {
  1842. HWND hWnd = ::WindowFromPoint( ptCursor );
  1843. if( hWnd != NULL )
  1844. {
  1845. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  1846. if( pWnd != NULL )
  1847. {
  1848. CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  1849. DYNAMIC_DOWNCAST( CExtDynDockMarkerWnd, pWnd );
  1850. if( pDynDockMarkerWnd != NULL
  1851. && pDynDockMarkerWnd->IsStateApplyable()
  1852. )
  1853. { // if dock marker is state apply-able
  1854. eCDT = pDynDockMarkerWnd->GetCDT();
  1855. if( _ds.GetCDT() == eCDT )
  1856. {
  1857. pDynDockMarkerWnd->HighlightMarkerTarget();
  1858. return true;
  1859. } // if( _ds.GetCDT() == eCDT )
  1860. } // if dock marker is state apply-able
  1861. } // if( pWnd != NULL )
  1862. } // if( hWnd != NULL )
  1863. } // if( ::GetCursorPos( &ptCursor ) )
  1864. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  1865. }
  1866. return true;
  1867. case __ECDT_FLOATED:
  1868. {
  1869. bool bWasFloating = true;
  1870. if( ! pExtBarSrc->IsFloating() )
  1871. {
  1872. bWasFloating = false;
  1873. CExtControlBar * pUpSizeBar = (CExtControlBar *)
  1874. pExtBarSrc->_GetNextControlBarInRow(
  1875. pExtBarSrc, true, true, true
  1876. );
  1877. if( pUpSizeBar != NULL )
  1878. {
  1879. while( !pUpSizeBar->IsVisible() )
  1880. {
  1881. CExtControlBar * pUpSizeBar2 = (CExtControlBar *)
  1882. _GetNextControlBarInRow(
  1883. pUpSizeBar, true, true, true
  1884. );
  1885. if( pUpSizeBar2 == NULL )
  1886. break;
  1887. pUpSizeBar = pUpSizeBar2;
  1888. }
  1889. } // if( pUpSizeBar != NULL )
  1890. if( pUpSizeBar == NULL )
  1891. {
  1892. pUpSizeBar = (CExtControlBar *)
  1893. pExtBarSrc->_GetNextControlBarInRow(
  1894. pExtBarSrc, false, true, true
  1895. );
  1896. if( pUpSizeBar != NULL )
  1897. {
  1898. while( !pUpSizeBar->IsVisible() )
  1899. {
  1900. CExtControlBar * pUpSizeBar2 = (CExtControlBar *)
  1901. _GetNextControlBarInRow(
  1902. pUpSizeBar, false, true, true
  1903. );
  1904. if( pUpSizeBar2 == NULL )
  1905. break;
  1906. pUpSizeBar = pUpSizeBar2;
  1907. }
  1908. } // if( pUpSizeBar != NULL )
  1909. } // if( pUpSizeBar == NULL )
  1910. if( pUpSizeBar != NULL )
  1911. {
  1912. CRect rcBarWnd;
  1913. pExtBarSrc->GetWindowRect( &rcBarWnd );
  1914. ASSERT( !rcBarWnd.IsRectEmpty() );
  1915. bool bHorzUpsizing = pExtBarSrc->IsDockedHorizontally();
  1916. LONG nUpSize = bHorzUpsizing
  1917. ? rcBarWnd.Width()
  1918. : rcBarWnd.Height()
  1919. ;
  1920. LONG & ref_nMetric = bHorzUpsizing
  1921. ? pUpSizeBar->m_sizeDockedH.cx
  1922. : pUpSizeBar->m_sizeDockedV.cy;
  1923. ref_nMetric += nUpSize;
  1924. } // if( pUpSizeBar != NULL )
  1925. } // if( ! pExtBarSrc->IsFloating() )
  1926. CRect rcFrame;
  1927. pFrame->GetWindowRect( &rcFrame );
  1928. CPoint ptFloat( -rcFrame.TopLeft() );
  1929. ptFloat += rcTrack.TopLeft();
  1930. pExtBarSrc->FloatControlBar( ptFloat );
  1931. // if( !bWasFloating && !bInitialMode )
  1932. // pFrame->RecalcLayout();
  1933. ASSERT( m_pDockContext != NULL );
  1934. m_pDockContext->m_ptMRUFloatPos = ptFloat;
  1935. if( pExtBarSrc->_IsShowContentWhenDragging() )
  1936. {
  1937. /*pExtBarSrc->RedrawWindow(
  1938. NULL, NULL,
  1939. RDW_INVALIDATE | RDW_UPDATENOW
  1940. | RDW_ERASE | RDW_ERASENOW
  1941. | RDW_ALLCHILDREN
  1942. );*/
  1943. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1944. ASSERT_VALID( pExtBarSrc->m_pDockSite );
  1945. CExtDynAutoHideArea
  1946. * pAreaTop = NULL,
  1947. * pAreaBottom = NULL,
  1948. * pAreaLeft = NULL,
  1949. * pAreaRight = NULL;
  1950. CExtDynAutoHideArea::stat_FindAreas(
  1951. pExtBarSrc->m_pDockSite,
  1952. &pAreaTop,
  1953. &pAreaBottom,
  1954. &pAreaLeft,
  1955. &pAreaRight
  1956. );
  1957. if( pAreaTop != NULL )
  1958. pAreaTop->UpdateTabWnd();
  1959. if( pAreaBottom != NULL )
  1960. pAreaBottom->UpdateTabWnd();
  1961. if( pAreaLeft != NULL )
  1962. pAreaLeft->UpdateTabWnd();
  1963. if( pAreaRight != NULL )
  1964. pAreaRight->UpdateTabWnd();
  1965. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1966. }
  1967. else
  1968. {
  1969. ASSERT_VALID( pExtBarSrc->m_pDockSite );
  1970. pExtBarSrc->m_pDockSite->RecalcLayout();
  1971. }
  1972. return true;
  1973. } // case __ECDT_FLOATED
  1974. case __ECDT_INNER_TOP:
  1975. {
  1976. if( pExtBarDst == NULL )
  1977. return TRUE;
  1978. ASSERT_VALID( pExtBarDst );
  1979. /*
  1980. ASSERT_VALID( pDstDockBar );
  1981. ASSERT( nDstBarIdx >= 0 );
  1982. if( bDstHorzDockBar || bDstFloatBar
  1983. || _ds.IsDeepHalfSplit()
  1984. )
  1985. { // if full row or deep half split
  1986. if( _ds.IsDeepHalfSplit() )
  1987. {
  1988. pExtBarDst->_DraggingDoDeepHalfSplit(
  1989. pExtBarSrc,
  1990. AFX_IDW_DOCKBAR_TOP
  1991. );
  1992. if( !bInitialMode )
  1993. {
  1994. pFrame->RecalcLayout();
  1995. if( pOldFrame != pFrame
  1996. && ::IsWindow( hWndOldFrame )
  1997. )
  1998. {
  1999. ASSERT_VALID( pOldFrame );
  2000. __RECALC_FRAME_STEPS( pOldFrame );
  2001. }
  2002. }
  2003. } // if( _ds.IsDeepHalfSplit() )
  2004. else
  2005. {
  2006. for( INT nBarIdx = 0; nBarIdx < nCountOfDstRowBars; nBarIdx++ )
  2007. {
  2008. CExtControlBar * pExtBar = vBarsDstRow[nBarIdx];
  2009. ASSERT_VALID( pExtBar );
  2010. if( pExtBar == pExtBarSrc )
  2011. continue;
  2012. if( pExtBar->IsFixedMode() )
  2013. continue;
  2014. pExtBar->m_sizeDockedH.cy = rcTrack.Height();
  2015. } // for( INT nBarIdx = 0; nBarIdx < nCountOfDstRowBars; nBarIdx++ )
  2016. pExtBarSrc->m_sizeDockedH.cx = rcTrack.Width();
  2017. pExtBarSrc->m_sizeDockedH.cy = rcTrack.Height();
  2018. ASSERT_KINDOF( CExtDockBar, pDstDockBar );
  2019. ((CExtDockBar *)pDstDockBar)->
  2020. _NewRowDockControlBar(
  2021. pExtBarDst,
  2022. pExtBarSrc,
  2023. true
  2024. );
  2025. if( !bInitialMode )
  2026. {
  2027. pFrame->RecalcLayout();
  2028. if( pOldFrame != pFrame
  2029. && ::IsWindow( hWndOldFrame )
  2030. )
  2031. {
  2032. ASSERT_VALID( pOldFrame );
  2033. __RECALC_FRAME_STEPS( pOldFrame );
  2034. }
  2035. }
  2036. } // else from if( _ds.IsDeepHalfSplit() )
  2037. } // if full row or deep half split
  2038. else
  2039. { // if sizing bar half split
  2040. pExtBarDst->m_sizeDockedV.cy = rcTrack.Height();
  2041. pExtBarSrc->m_sizeDockedV.cy = rcTrack.Height();
  2042. pExtBarSrc->m_sizeDockedV.cx = pExtBarDst->m_sizeDockedV.cx;
  2043. ASSERT_KINDOF( CExtDockBar, pDstDockBar );
  2044. ((CExtDockBar *)pDstDockBar)->DockControlBar( pExtBarSrc, &rcTrack );
  2045. ASSERT_VALID( pDstDockBar );
  2046. if( !bInitialMode )
  2047. {
  2048. pFrame->RecalcLayout();
  2049. if( pOldFrame != pFrame
  2050. && ::IsWindow( hWndOldFrame )
  2051. )
  2052. {
  2053. ASSERT_VALID( pOldFrame );
  2054. __RECALC_FRAME_STEPS( pOldFrame );
  2055. }
  2056. pExtBarSrc->SetWindowPos(NULL, 0, 0, 0, 0,
  2057. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  2058. |SWP_FRAMECHANGED
  2059. );
  2060. }
  2061. } // if sizing bar half split
  2062. return true;
  2063. */
  2064. pExtBarSrc->DockControlBarLTRB(
  2065. pExtBarDst,
  2066. AFX_IDW_DOCKBAR_TOP
  2067. );
  2068. return true;
  2069. } // case __ECDT_INNER_TOP
  2070. case __ECDT_INNER_BOTTOM:
  2071. {
  2072. if( pExtBarDst == NULL )
  2073. return TRUE;
  2074. ASSERT_VALID( pExtBarDst );
  2075. /*
  2076. ASSERT_VALID( pDstDockBar );
  2077. ASSERT( nDstBarIdx >= 0 );
  2078. if( bDstHorzDockBar || bDstFloatBar
  2079. || _ds.IsDeepHalfSplit()
  2080. )
  2081. { // if full row or deep half split
  2082. if( _ds.IsDeepHalfSplit() )
  2083. {
  2084. pExtBarDst->_DraggingDoDeepHalfSplit(
  2085. pExtBarSrc,
  2086. AFX_IDW_DOCKBAR_BOTTOM
  2087. );
  2088. if( !bInitialMode )
  2089. {
  2090. pFrame->RecalcLayout();
  2091. if( pOldFrame != pFrame
  2092. && ::IsWindow( hWndOldFrame )
  2093. )
  2094. {
  2095. ASSERT_VALID( pOldFrame );
  2096. __RECALC_FRAME_STEPS( pOldFrame );
  2097. }
  2098. }
  2099. } // if( _ds.IsDeepHalfSplit() )
  2100. else
  2101. {
  2102. for( INT nBarIdx = 0; nBarIdx < nCountOfDstRowBars; nBarIdx++ )
  2103. {
  2104. CExtControlBar * pExtBar = vBarsDstRow[nBarIdx];
  2105. ASSERT_VALID( pExtBar );
  2106. if( pExtBar == pExtBarSrc )
  2107. continue;
  2108. if( pExtBar->IsFixedMode() )
  2109. continue;
  2110. pExtBar->m_sizeDockedH.cy = rcTrack.Height();
  2111. } // for( INT nBarIdx = 0; nBarIdx < nCountOfDstRowBars; nBarIdx++ )
  2112. pExtBarSrc->m_sizeDockedH.cx = rcTrack.Width();
  2113. pExtBarSrc->m_sizeDockedH.cy = rcTrack.Height();
  2114. ASSERT_KINDOF( CExtDockBar, pDstDockBar );
  2115. ((CExtDockBar *)pDstDockBar)->
  2116. _NewRowDockControlBar(
  2117. pExtBarDst,
  2118. pExtBarSrc,
  2119. false
  2120. );
  2121. if( !bInitialMode )
  2122. {
  2123. pFrame->RecalcLayout();
  2124. if( pOldFrame != pFrame
  2125. && ::IsWindow( hWndOldFrame )
  2126. )
  2127. {
  2128. ASSERT_VALID( pOldFrame );
  2129. __RECALC_FRAME_STEPS( pOldFrame );
  2130. }
  2131. }
  2132. } // else from if( _ds.IsDeepHalfSplit() )
  2133. } // if full row or deep half split
  2134. else
  2135. { // if sizing bar half split
  2136. pExtBarDst->m_sizeDockedV.cy = rcTrack.Height();
  2137. pExtBarSrc->m_sizeDockedV.cy = rcTrack.Height();
  2138. pExtBarSrc->m_sizeDockedV.cx = pExtBarDst->m_sizeDockedV.cx;
  2139. ASSERT_KINDOF( CExtDockBar, pDstDockBar );
  2140. ((CExtDockBar *)pDstDockBar)->DockControlBar( pExtBarSrc, &rcTrack );
  2141. ASSERT_VALID( pDstDockBar );
  2142. if( !bInitialMode )
  2143. {
  2144. pFrame->RecalcLayout();
  2145. if( pOldFrame != pFrame
  2146. && ::IsWindow( hWndOldFrame )
  2147. )
  2148. {
  2149. ASSERT_VALID( pOldFrame );
  2150. __RECALC_FRAME_STEPS( pOldFrame );
  2151. }
  2152. pExtBarSrc->SetWindowPos(NULL, 0, 0, 0, 0,
  2153. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  2154. |SWP_FRAMECHANGED
  2155. );
  2156. }
  2157. } // if sizing bar half split
  2158. return true;
  2159. */
  2160. pExtBarSrc->DockControlBarLTRB(
  2161. pExtBarDst,
  2162. AFX_IDW_DOCKBAR_BOTTOM
  2163. );
  2164. return true;
  2165. } // case __ECDT_INNER_BOTTOM
  2166. case __ECDT_INNER_LEFT:
  2167. {
  2168. if( pExtBarDst == NULL )
  2169. return TRUE;
  2170. ASSERT_VALID( pExtBarDst );
  2171. /*
  2172. ASSERT_VALID( pDstDockBar );
  2173. ASSERT( nDstBarIdx >= 0 );
  2174. if( (!bDstHorzDockBar) || bDstFloatBar
  2175. || _ds.IsDeepHalfSplit()
  2176. )
  2177. { // if full row or deep half split
  2178. if( _ds.IsDeepHalfSplit() )
  2179. {
  2180. pExtBarDst->_DraggingDoDeepHalfSplit(
  2181. pExtBarSrc,
  2182. AFX_IDW_DOCKBAR_LEFT
  2183. );
  2184. if( !bInitialMode )
  2185. {
  2186. pFrame->RecalcLayout();
  2187. if( pOldFrame != pFrame
  2188. && ::IsWindow( hWndOldFrame )
  2189. )
  2190. {
  2191. ASSERT_VALID( pOldFrame );
  2192. __RECALC_FRAME_STEPS( pOldFrame );
  2193. }
  2194. }
  2195. } // if( _ds.IsDeepHalfSplit() )
  2196. else
  2197. {
  2198. for( INT nBarIdx = 0; nBarIdx < nCountOfDstRowBars; nBarIdx++ )
  2199. {
  2200. CExtControlBar * pExtBar = vBarsDstRow[nBarIdx];
  2201. ASSERT_VALID( pExtBar );
  2202. if( pExtBar == pExtBarSrc )
  2203. continue;
  2204. if( pExtBar->IsFixedMode() )
  2205. continue;
  2206. pExtBar->m_sizeDockedV.cx = rcTrack.Width();
  2207. //if( pExtBar->IsKindOf(RUNTIME_CLASS(CExtDynTabControlBar)) )
  2208. // ((CExtDockDynTabBar*)((CExtDynTabControlBar*)pExtBar)->m_pWndDynDocker)->_SyncTabbedChilds( true, false );
  2209. } // for( INT nBarIdx = 0; nBarIdx < nCountOfDstRowBars; nBarIdx++ )
  2210. pExtBarSrc->m_sizeDockedV.cx = rcTrack.Width();
  2211. pExtBarSrc->m_sizeDockedV.cy = rcTrack.Height();
  2212. ASSERT_KINDOF( CExtDockBar, pDstDockBar );
  2213. ((CExtDockBar *)pDstDockBar)->
  2214. _NewRowDockControlBar(
  2215. pExtBarDst,
  2216. pExtBarSrc,
  2217. true
  2218. );
  2219. if( !bInitialMode )
  2220. {
  2221. pFrame->RecalcLayout();
  2222. if( pOldFrame != pFrame
  2223. && ::IsWindow( hWndOldFrame )
  2224. )
  2225. {
  2226. ASSERT_VALID( pOldFrame );
  2227. __RECALC_FRAME_STEPS( pOldFrame );
  2228. }
  2229. }
  2230. } // else from if( _ds.IsDeepHalfSplit() )
  2231. } // if full row or deep half split
  2232. else
  2233. { // if sizing bar half split
  2234. pExtBarDst->m_sizeDockedH.cx = rcTrack.Width();
  2235. pExtBarSrc->m_sizeDockedH.cx = rcTrack.Width();
  2236. pExtBarSrc->m_sizeDockedH.cy = pExtBarDst->m_sizeDockedH.cy;
  2237. ASSERT_KINDOF( CExtDockBar, pDstDockBar );
  2238. ((CExtDockBar *)pDstDockBar)->DockControlBar( pExtBarSrc, &rcTrack );
  2239. ASSERT_VALID( pDstDockBar );
  2240. if( !bInitialMode )
  2241. {
  2242. pFrame->RecalcLayout();
  2243. if( pOldFrame != pFrame
  2244. && ::IsWindow( hWndOldFrame )
  2245. )
  2246. {
  2247. ASSERT_VALID( pOldFrame );
  2248. __RECALC_FRAME_STEPS( pOldFrame );
  2249. }
  2250. pExtBarSrc->SetWindowPos(NULL, 0, 0, 0, 0,
  2251. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  2252. |SWP_FRAMECHANGED
  2253. );
  2254. }
  2255. } // if sizing bar half split
  2256. return true;
  2257. */
  2258. pExtBarSrc->DockControlBarLTRB(
  2259. pExtBarDst,
  2260. AFX_IDW_DOCKBAR_LEFT
  2261. );
  2262. return true;
  2263. } // case __ECDT_INNER_LEFT
  2264. case __ECDT_INNER_RIGHT:
  2265. {
  2266. if( pExtBarDst == NULL )
  2267. return TRUE;
  2268. ASSERT_VALID( pExtBarDst );
  2269. /*
  2270. ASSERT_VALID( pDstDockBar );
  2271. ASSERT( nDstBarIdx >= 0 );
  2272. if( (!bDstHorzDockBar) || bDstFloatBar
  2273. || _ds.IsDeepHalfSplit()
  2274. )
  2275. { // if full row or deep half split
  2276. if( _ds.IsDeepHalfSplit() )
  2277. {
  2278. pExtBarDst->_DraggingDoDeepHalfSplit(
  2279. pExtBarSrc,
  2280. AFX_IDW_DOCKBAR_RIGHT
  2281. );
  2282. if( !bInitialMode )
  2283. {
  2284. pFrame->RecalcLayout();
  2285. if( pOldFrame != pFrame
  2286. && ::IsWindow( hWndOldFrame )
  2287. )
  2288. {
  2289. ASSERT_VALID( pOldFrame );
  2290. __RECALC_FRAME_STEPS( pOldFrame );
  2291. }
  2292. }
  2293. } // if( _ds.IsDeepHalfSplit() )
  2294. else
  2295. {
  2296. for( INT nBarIdx = 0; nBarIdx < nCountOfDstRowBars; nBarIdx++ )
  2297. {
  2298. CExtControlBar * pExtBar = vBarsDstRow[nBarIdx];
  2299. ASSERT_VALID( pExtBar );
  2300. if( pExtBar == pExtBarSrc )
  2301. continue;
  2302. if( pExtBar->IsFixedMode() )
  2303. continue;
  2304. pExtBar->m_sizeDockedV.cx = rcTrack.Width();
  2305. } // for( INT nBarIdx = 0; nBarIdx < nCountOfDstRowBars; nBarIdx++ )
  2306. pExtBarSrc->m_sizeDockedV.cx = rcTrack.Width();
  2307. pExtBarSrc->m_sizeDockedV.cy = rcTrack.Height();
  2308. ASSERT_KINDOF( CExtDockBar, pDstDockBar );
  2309. ((CExtDockBar *)pDstDockBar)->
  2310. _NewRowDockControlBar(
  2311. pExtBarDst,
  2312. pExtBarSrc,
  2313. false
  2314. );
  2315. if( !bInitialMode )
  2316. {
  2317. pFrame->RecalcLayout();
  2318. if( pOldFrame != pFrame
  2319. && ::IsWindow( hWndOldFrame )
  2320. )
  2321. {
  2322. ASSERT_VALID( pOldFrame );
  2323. __RECALC_FRAME_STEPS( pOldFrame );
  2324. }
  2325. }
  2326. } // else from if( _ds.IsDeepHalfSplit() )
  2327. } // if full row or deep half split
  2328. else
  2329. { // if sizing bar half split
  2330. pExtBarDst->m_sizeDockedH.cx = rcTrack.Width();
  2331. pExtBarSrc->m_sizeDockedH.cx = rcTrack.Width();
  2332. pExtBarSrc->m_sizeDockedH.cy = pExtBarDst->m_sizeDockedH.cy;
  2333. ASSERT_KINDOF( CExtDockBar, pDstDockBar );
  2334. ((CExtDockBar *)pDstDockBar)->DockControlBar( pExtBarSrc, &rcTrack );
  2335. ASSERT_VALID( pDstDockBar );
  2336. if( !bInitialMode )
  2337. {
  2338. pFrame->RecalcLayout();
  2339. if( pOldFrame != pFrame
  2340. && ::IsWindow( hWndOldFrame )
  2341. )
  2342. {
  2343. ASSERT_VALID( pOldFrame );
  2344. __RECALC_FRAME_STEPS( pOldFrame );
  2345. }
  2346. pExtBarSrc->SetWindowPos(NULL, 0, 0, 0, 0,
  2347. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  2348. |SWP_FRAMECHANGED
  2349. );
  2350. }
  2351. } // if sizing bar half split
  2352. return true;
  2353. */
  2354. pExtBarSrc->DockControlBarLTRB(
  2355. pExtBarDst,
  2356. AFX_IDW_DOCKBAR_RIGHT
  2357. );
  2358. return true;
  2359. } // case __ECDT_INNER_RIGHT
  2360. case __ECDT_DOCKBAR_INNER_TOP:
  2361. case __ECDT_DOCKBAR_INNER_BOTTOM:
  2362. case __ECDT_DOCKBAR_INNER_LEFT:
  2363. case __ECDT_DOCKBAR_INNER_RIGHT:
  2364. {
  2365. ASSERT_VALID( pExtBarSrc );
  2366. // pExtBarSrc->m_sizeDockedV.cy = MAXSHORT;
  2367. if( eCDT == __ECDT_DOCKBAR_INNER_TOP
  2368. || eCDT == __ECDT_DOCKBAR_INNER_BOTTOM
  2369. )
  2370. {
  2371. pExtBarSrc->m_sizeDockedH.cy = rcTrack.Height();
  2372. pExtBarSrc->m_sizeDockedH.cy = rcTrack.Height();
  2373. }
  2374. else
  2375. {
  2376. pExtBarSrc->m_sizeDockedV.cx = rcTrack.Width();
  2377. pExtBarSrc->m_sizeDockedV.cx = rcTrack.Width();
  2378. }
  2379. UINT nDockBarID = AFX_IDW_DOCKBAR_TOP;
  2380. if( eCDT == __ECDT_DOCKBAR_INNER_BOTTOM )
  2381. nDockBarID = AFX_IDW_DOCKBAR_BOTTOM;
  2382. else if( eCDT == __ECDT_DOCKBAR_INNER_LEFT )
  2383. nDockBarID = AFX_IDW_DOCKBAR_LEFT;
  2384. else if( eCDT == __ECDT_DOCKBAR_INNER_RIGHT )
  2385. nDockBarID = AFX_IDW_DOCKBAR_RIGHT;
  2386. CExtDockBar * pDockBar = (CExtDockBar *)
  2387. pFrame->GetControlBar( nDockBarID );
  2388. ASSERT_VALID( pDockBar );
  2389. ASSERT_KINDOF( CExtDockBar, pDockBar );
  2390. ASSERT( pDockBar->_GetCircleNo() == 0 );
  2391. UINT nCircleNoRequired = _ds.GetCircleNo();
  2392. if( nCircleNoRequired > 0 )
  2393. {
  2394. pDockBar = pDockBar->_GetBarByCircleNo( nCircleNoRequired );
  2395. ASSERT_VALID( pDockBar );
  2396. ASSERT_KINDOF( CExtDockBar, pDockBar );
  2397. ASSERT( pDockBar->_GetCircleNo() == nCircleNoRequired );
  2398. ASSERT( ((UINT)pDockBar->GetDlgCtrlID()) == nDockBarID );
  2399. }
  2400. HWND hWndSrc = pExtBarSrc->GetSafeHwnd();
  2401. pDockBar->_InnerOuterDockControlBar( pExtBarSrc, true );
  2402. ASSERT_VALID( pDockBar );
  2403. if( !bInitialMode )
  2404. {
  2405. pFrame->RecalcLayout();
  2406. if( pOldFrame != pFrame
  2407. && ::IsWindow( hWndOldFrame )
  2408. )
  2409. {
  2410. ASSERT_VALID( pOldFrame );
  2411. __RECALC_FRAME_STEPS( pOldFrame );
  2412. }
  2413. }
  2414. if( ::IsWindow( hWndSrc ) )
  2415. {
  2416. ASSERT_VALID( pExtBarSrc );
  2417. ASSERT(
  2418. CWnd::FromHandlePermanent(hWndSrc)
  2419. == pExtBarSrc
  2420. );
  2421. pExtBarSrc->SetWindowPos(
  2422. NULL, 0, 0, 0, 0,
  2423. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  2424. |SWP_FRAMECHANGED
  2425. );
  2426. }
  2427. return true;
  2428. }
  2429. case __ECDT_CIRCLE1_OUTER_TOP:
  2430. case __ECDT_CIRCLE1_OUTER_BOTTOM:
  2431. case __ECDT_CIRCLE1_OUTER_LEFT:
  2432. case __ECDT_CIRCLE1_OUTER_RIGHT:
  2433. {
  2434. UINT nDockBarID = 0;
  2435. bool bInjectCircle = false;
  2436. switch( eCDT )
  2437. {
  2438. case __ECDT_CIRCLE1_OUTER_TOP:
  2439. nDockBarID = AFX_IDW_DOCKBAR_TOP;
  2440. break;
  2441. case __ECDT_CIRCLE1_OUTER_BOTTOM:
  2442. nDockBarID = AFX_IDW_DOCKBAR_BOTTOM;
  2443. break;
  2444. case __ECDT_CIRCLE1_OUTER_LEFT:
  2445. nDockBarID = AFX_IDW_DOCKBAR_LEFT;
  2446. bInjectCircle = true;
  2447. break;
  2448. case __ECDT_CIRCLE1_OUTER_RIGHT:
  2449. nDockBarID = AFX_IDW_DOCKBAR_RIGHT;
  2450. bInjectCircle = true;
  2451. break;
  2452. #ifdef _DEBUG
  2453. default:
  2454. {
  2455. ASSERT( FALSE );
  2456. }
  2457. break;
  2458. #endif // _DEBUG
  2459. } // switch( eCDT )
  2460. CExtDockBar * pDockBar = (CExtDockBar *)
  2461. pFrame->GetControlBar( nDockBarID );
  2462. ASSERT_VALID( pDockBar );
  2463. ASSERT_KINDOF( CExtDockBar, pDockBar );
  2464. ASSERT( pDockBar->_GetCircleNo() == 0 );
  2465. if( bInjectCircle )
  2466. pDockBar->_InjectInnerCircle();
  2467. pDockBar = pDockBar->_GetBarByCircleNo( 1 );
  2468. ASSERT_VALID( pDockBar );
  2469. ASSERT_KINDOF( CExtDockBar, pDockBar );
  2470. ASSERT( pDockBar->_GetCircleNo() == 1 );
  2471. HWND hWndSrc = pExtBarSrc->GetSafeHwnd();
  2472. pDockBar->_InnerOuterDockControlBar( pExtBarSrc, false );
  2473. ASSERT_VALID( pDockBar );
  2474. if( !bInitialMode )
  2475. {
  2476. pFrame->RecalcLayout();
  2477. if( pOldFrame != pFrame
  2478. && ::IsWindow( hWndOldFrame )
  2479. )
  2480. {
  2481. ASSERT_VALID( pOldFrame );
  2482. __RECALC_FRAME_STEPS( pOldFrame );
  2483. }
  2484. }
  2485. if( ::IsWindow( hWndSrc ) )
  2486. {
  2487. ASSERT_VALID( pExtBarSrc );
  2488. ASSERT(
  2489. CWnd::FromHandlePermanent(hWndSrc)
  2490. == pExtBarSrc
  2491. );
  2492. pExtBarSrc->SetWindowPos(
  2493. NULL, 0, 0, 0, 0,
  2494. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
  2495. |SWP_FRAMECHANGED
  2496. );
  2497. }
  2498. }
  2499. return true; // case __ECDT_CIRCLE1_OUTER_....
  2500. } // switch( eCDT )
  2501. ASSERT( FALSE );
  2502. return false;
  2503. }
  2504. UINT CExtControlBar::GetDockBarCircleNo() const
  2505. {
  2506. ASSERT_VALID( this );
  2507. ASSERT_VALID( m_pDockSite );
  2508. ASSERT_VALID( m_pDockBar );
  2509. ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  2510. return ((CExtDockBar *)m_pDockBar)->_GetCircleNo();
  2511. }
  2512. bool CExtControlBar::_CanDockToInnerCircles() const
  2513. {
  2514. return true;
  2515. }
  2516. bool CExtControlBar::_CanDockToTabbedContainers(
  2517. CExtControlBar * pDestBar
  2518. ) const
  2519. {
  2520. ASSERT_VALID( this );
  2521. pDestBar;
  2522. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2523. if( _IsShowContentWhenDragging() )
  2524. {
  2525. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2526. eResizablePanelDockingType_t eResizablePanelDockingType =
  2527. OnQueryDockingType();
  2528. if( INT(eResizablePanelDockingType) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005) )
  2529. return true;
  2530. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2531. return false;
  2532. } // if( _IsShowContentWhenDragging() )
  2533. return true;
  2534. #else
  2535. return false;
  2536. #endif // else from (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2537. }
  2538. bool CExtControlBar::_CanDockLTRB(
  2539. CExtControlBar * pDestBar
  2540. ) const
  2541. {
  2542. ASSERT_VALID( this );
  2543. pDestBar;
  2544. return true;
  2545. }
  2546. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2547. CExtDynTabControlBar * CExtControlBar::_GetNearestTabbedContainer()
  2548. {
  2549. ASSERT_VALID( this );
  2550. if( m_hWnd == NULL || (! ::IsWindow(m_hWnd) ) )
  2551. return NULL;
  2552. CWnd * pWndParent = GetParent();
  2553. if( ! pWndParent->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  2554. return NULL;
  2555. CExtDynTabControlBar * pTabbedContainer = STATIC_DOWNCAST( CExtDynTabControlBar, pWndParent->GetParent() );
  2556. return pTabbedContainer;
  2557. }
  2558. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2559. CExtDynControlBar * CExtControlBar::_GetNearestDynamicContainer()
  2560. {
  2561. ASSERT_VALID( this );
  2562. if( m_hWnd == NULL || (! ::IsWindow(m_hWnd) ) )
  2563. return NULL;
  2564. CWnd * pWndParent = GetParent();
  2565. if( ! pWndParent->IsKindOf(RUNTIME_CLASS(CExtDockDynBar)) )
  2566. return NULL;
  2567. CExtDynControlBar * pDynContainer = STATIC_DOWNCAST( CExtDynControlBar, pWndParent->GetParent() );
  2568. return pDynContainer;
  2569. }
  2570. // toggle docking state
  2571. void CExtControlBar::ToggleDocking()
  2572. {
  2573. ASSERT_VALID( this );
  2574. ASSERT_VALID( m_pDockSite );
  2575. ASSERT_VALID( m_pDockBar );
  2576. #ifdef _DEBUG
  2577. if( !IsFloating() )
  2578. {
  2579. ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  2580. }
  2581. #endif // _DEBUG
  2582. ASSERT( m_pDockContext != NULL );
  2583. ASSERT( m_pDockContext != NULL );
  2584. if( IsFixedDockStyle() )
  2585. {
  2586. m_pDockContext->ToggleDocking();
  2587. CFrameWnd * pFrame = _GetDockingFrameImpl();
  2588. ASSERT_VALID( pFrame );
  2589. pFrame->DelayRecalcLayout();
  2590. _RecalcNcArea();
  2591. return;
  2592. }
  2593. ASSERT( !IsFixedMode() );
  2594. // m_pDockContext->ToggleDocking();
  2595. //
  2596. //CFrameWnd * pFrame = _GetDockingFrameImpl();
  2597. // ASSERT_VALID( pFrame );
  2598. // pFrame->RecalcLayout();
  2599. UINT nDockBarID = GetSafeDockBarDlgCtrlID();
  2600. ASSERT_DOCKBAR_DLGCTRLID( nDockBarID );
  2601. if( nDockBarID == AFX_IDW_DOCKBAR_FLOAT )
  2602. {
  2603. } // if( nDockBarID == AFX_IDW_DOCKBAR_FLOAT )
  2604. else
  2605. {
  2606. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  2607. if( !GetParentFrame()->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
  2608. FloatControlBar();
  2609. } // else from if( nDockBarID == AFX_IDW_DOCKBAR_FLOAT )
  2610. }
  2611. CExtControlBar * CExtControlBar::FindTearOffBar(
  2612. CFrameWnd * pDockSite,
  2613. UINT nTearOffCmdID
  2614. )
  2615. {
  2616. if( pDockSite->GetSafeHwnd() == NULL || nTearOffCmdID == 0 )
  2617. return NULL;
  2618. ASSERT_VALID( pDockSite );
  2619. ASSERT( CExtCmdManager::IsCommand( nTearOffCmdID ) );
  2620. POSITION pos = pDockSite->m_listControlBars.GetHeadPosition();
  2621. for( ; pos != NULL; )
  2622. {
  2623. CControlBar * pControlBar = (CControlBar *)
  2624. pDockSite->m_listControlBars.GetNext( pos );
  2625. ASSERT_VALID( pControlBar );
  2626. ASSERT_KINDOF( CControlBar, pControlBar );
  2627. if( pControlBar->IsDockBar() )
  2628. continue;
  2629. CExtControlBar * pExtBar =
  2630. DYNAMIC_DOWNCAST( CExtControlBar, pControlBar );
  2631. if( pExtBar == NULL )
  2632. continue;
  2633. UINT nCmdID = pExtBar->TearOffCommandGet();
  2634. if( nCmdID == nTearOffCmdID )
  2635. return pExtBar;
  2636. } // for( ; pos != NULL; )
  2637. return NULL;
  2638. }
  2639. UINT CExtControlBar::TearOffCommandGet() const
  2640. {
  2641. ASSERT_VALID( this );
  2642. #ifdef _DEBUG
  2643. if( m_nTearOffCmdID != 0 )
  2644. {
  2645. ASSERT( CExtCmdManager::IsCommand( m_nTearOffCmdID ) );
  2646. }
  2647. #endif // _DEBUG
  2648. return m_nTearOffCmdID;
  2649. }
  2650. void CExtControlBar::TearOffCommandSet( UINT nCmdID )
  2651. {
  2652. ASSERT_VALID( this );
  2653. m_nTearOffCmdID = nCmdID;
  2654. #ifdef _DEBUG
  2655. if( m_nTearOffCmdID != 0 )
  2656. {
  2657. ASSERT( CExtCmdManager::IsCommand( m_nTearOffCmdID ) );
  2658. }
  2659. #endif // _DEBUG
  2660. }
  2661. CExtMiniDockFrameWnd * CExtControlBar::OnCreateFloatingFrame(
  2662. DWORD dwStyle
  2663. )
  2664. {
  2665. ASSERT_VALID( this );
  2666. ASSERT_VALID( m_pDockSite );
  2667. CExtMiniDockFrameWnd * pMiniFrame =
  2668. new CExtMiniDockFrameWnd;
  2669. if( ! pMiniFrame->Create(
  2670. m_pDockSite,
  2671. dwStyle
  2672. )
  2673. )
  2674. {
  2675. ASSERT( FALSE );
  2676. AfxThrowResourceException();
  2677. }
  2678. return pMiniFrame;
  2679. }
  2680. // float control bar into recent floated position
  2681. void CExtControlBar::FloatControlBar(
  2682. DWORD dwStyle // = CBRS_ALIGN_TOP
  2683. )
  2684. {
  2685. FloatControlBar( m_ptFloatHelper, dwStyle );
  2686. }
  2687. // float control bar
  2688. void CExtControlBar::FloatControlBar(
  2689. CPoint ptFloat,
  2690. DWORD dwStyle // = CBRS_ALIGN_TOP
  2691. )
  2692. {
  2693. ASSERT_VALID( this );
  2694. ASSERT_VALID( m_pDockSite );
  2695. g_pBarToggleFloatingState = this;
  2696. #ifdef _DEBUG
  2697. bool bWasFloating = IsFloating();
  2698. #endif // _DEBUG
  2699. HWND hWndTopDynBar = NULL;
  2700. CExtDynControlBar * pWndTopDynBar = NULL;
  2701. // if the bar is already floating and the dock bar only contains this
  2702. // bar and same orientation then move the window rather than recreating
  2703. // the frame
  2704. if( m_pDockBar != NULL )
  2705. {
  2706. CDockBar * pDockBar = m_pDockBar;
  2707. ASSERT_KINDOF( CDockBar, pDockBar );
  2708. CExtDynControlBar * pDynBar = DYNAMIC_DOWNCAST( CExtDynControlBar, pDockBar->GetParent() );
  2709. for( ; pDynBar != NULL; )
  2710. {
  2711. hWndTopDynBar = pDynBar->m_hWnd;
  2712. pWndTopDynBar = pDynBar;
  2713. CWnd * pWndWalk = pDynBar->GetParent();
  2714. if( pWndWalk == NULL )
  2715. break;
  2716. CDockBar * pParentDockBar = DYNAMIC_DOWNCAST( CDockBar, pWndWalk );
  2717. if( pParentDockBar == NULL )
  2718. break;
  2719. pWndWalk = pWndWalk->GetParent();
  2720. if( pWndWalk == NULL )
  2721. break;
  2722. pDynBar = DYNAMIC_DOWNCAST( CExtDynControlBar, pWndWalk );
  2723. }
  2724. if( pDockBar->m_bFloating
  2725. && pDockBar->GetDockedCount() == 1
  2726. // && (dwStyle & pDockBar->m_dwStyle & CBRS_ALIGN_ANY) != 0
  2727. )
  2728. {
  2729. ASSERT( bWasFloating );
  2730. CExtMiniDockFrameWnd * pDockFrame =
  2731. (CExtMiniDockFrameWnd*) pDockBar->GetParent();
  2732. ASSERT( pDockFrame != NULL );
  2733. ASSERT_KINDOF( CExtMiniDockFrameWnd, pDockFrame );
  2734. CRect rcWnd;
  2735. GetWindowRect( &rcWnd );
  2736. CRect rcCustomFloatPos( ptFloat, rcWnd.Size() );
  2737. pDockFrame->SendMessage(
  2738. CExtPopupMenuWnd::g_nMsgCustomFloatPos,
  2739. WPARAM(pDockFrame->m_hWnd),
  2740. LPARAM(&rcCustomFloatPos)
  2741. );
  2742. pDockFrame->SetWindowPos(
  2743. NULL,
  2744. ptFloat.x,
  2745. ptFloat.y,
  2746. 0,
  2747. 0,
  2748. SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE
  2749. );
  2750. // - 2.26
  2751. //pDockFrame->RecalcLayout( TRUE );
  2752. //pDockFrame->UpdateWindow();
  2753. m_ptFloatHelper = ptFloat;
  2754. g_pBarToggleFloatingState = NULL;
  2755. return;
  2756. }
  2757. } // if( m_pDockBar != NULL )
  2758. ASSERT(
  2759. (!bWasFloating)
  2760. || m_pDockBar == NULL // initial mode
  2761. );
  2762. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2763. CExtDockDynTabBar * pTabbedDocker =
  2764. DYNAMIC_DOWNCAST(
  2765. CExtDockDynTabBar,
  2766. GetParent()
  2767. );
  2768. if( pTabbedDocker != NULL )
  2769. {
  2770. CExtDynTabControlBar * pTabbedBar =
  2771. STATIC_DOWNCAST(
  2772. CExtDynTabControlBar,
  2773. pTabbedDocker->GetParent()
  2774. );
  2775. // LONG nSel = pTabbedBar->GetSwitcherSelection();
  2776. // if( nSel >= 0
  2777. // && pTabbedBar->GetBarAt( nSel, true ) == this
  2778. // )
  2779. // pTabbedBar->RemoveSelFromSwitcher();
  2780. // else
  2781. pTabbedBar->RemoveControlBar( this );
  2782. } // if( pTabbedDocker != NULL )
  2783. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2784. bool bShowMiniFrame =
  2785. ( (GetStyle() & WS_VISIBLE) != 0 ) ? true : false;
  2786. if( m_dwStyle & CBRS_SIZE_DYNAMIC )
  2787. {
  2788. dwStyle |= CBRS_SIZE_DYNAMIC;
  2789. if (dwStyle & CBRS_ORIENT_VERT)
  2790. {
  2791. dwStyle &= ~CBRS_ALIGN_ANY;
  2792. dwStyle |= CBRS_ALIGN_TOP;
  2793. }
  2794. }
  2795. CExtDockBar * pDockBarOut = (CExtDockBar *)m_pDockBar;
  2796. bool bOptimizeDockBarLayout = false;
  2797. if( pDockBarOut != NULL
  2798. && (! pDockBarOut->m_bFloating )
  2799. && pDockBarOut->IsKindOf(RUNTIME_CLASS(CExtDockBar))
  2800. )
  2801. bOptimizeDockBarLayout = true;
  2802. HWND hWndDockBarOuter =
  2803. (pDockBarOut != NULL)
  2804. ? pDockBarOut->GetSafeHwnd()
  2805. : NULL
  2806. ;
  2807. CFrameWnd * pOldFrame = GetParentFrame();
  2808. HWND hWndOldFrame = NULL;
  2809. if( pOldFrame != NULL )
  2810. {
  2811. ASSERT_VALID( pOldFrame );
  2812. hWndOldFrame = pOldFrame->GetSafeHwnd();
  2813. }
  2814. CExtMiniDockFrameWnd * pDockFrame = OnCreateFloatingFrame( dwStyle );
  2815. ASSERT( pDockFrame != NULL );
  2816. ASSERT_KINDOF( CExtMiniDockFrameWnd, pDockFrame );
  2817. pDockFrame->SetWindowPos(
  2818. NULL, ptFloat.x, ptFloat.y, 0, 0,
  2819. SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE
  2820. );
  2821. if( pDockFrame->m_hWndOwner == NULL )
  2822. pDockFrame->m_hWndOwner = m_pDockSite->m_hWnd;
  2823. CDockBar * pDockBar = STATIC_DOWNCAST( CDockBar, pDockFrame->GetDlgItem( AFX_IDW_DOCKBAR_FLOAT ) );
  2824. ASSERT_VALID( pDockBar );
  2825. ASSERT( ! m_bUpdatingChain );
  2826. m_bUpdatingChain = true;
  2827. //pDockBar->m_bLockedOptimize = true;
  2828. ((CExtDockBar*)pDockBar)->DockControlBar( this, NULL, false, true );
  2829. //pDockBar->m_bLockedOptimize = false;
  2830. m_bUpdatingChain = false;
  2831. pDockFrame->RecalcLayout( TRUE );
  2832. if( bShowMiniFrame )
  2833. {
  2834. pDockFrame->ShowWindow( SW_SHOWNA );
  2835. pDockFrame->UpdateWindow();
  2836. }
  2837. m_ptFloatHelper = ptFloat;
  2838. if( bOptimizeDockBarLayout
  2839. && ::IsWindow( hWndDockBarOuter )
  2840. )
  2841. {
  2842. ASSERT_VALID( pDockBarOut );
  2843. CExtMiniDockFrameWnd * pOldMiniFrame = DYNAMIC_DOWNCAST( CExtMiniDockFrameWnd, pDockBarOut->GetParentFrame() );
  2844. HWND hWndOldMiniFrame = pOldMiniFrame->GetSafeHwnd();
  2845. if( hWndOldMiniFrame != NULL )
  2846. pOldMiniFrame->SetRedraw( FALSE );
  2847. ((CExtDockBar*)pDockBarOut)->OnDynamicLayoutOptimize();
  2848. if( hWndOldMiniFrame != NULL && ::IsWindow(hWndOldMiniFrame) && LPVOID(pOldMiniFrame) == LPVOID(CWnd::FromHandlePermanent(hWndOldMiniFrame)) )
  2849. pOldMiniFrame->SetRedraw( TRUE );
  2850. }
  2851. if( pOldFrame != m_pDockSite && ::IsWindow( hWndOldFrame ) )
  2852. {
  2853. ASSERT_VALID( pOldFrame );
  2854. __RECALC_FRAME_STEPS( pOldFrame );
  2855. }
  2856. if( ! IsFixedDockStyle() )
  2857. CExtDockBar::_RemovePlaceHolder( m_pDockSite, this );
  2858. CExtDockBar::_OptimizeCircles( m_pDockSite );
  2859. m_pDockSite->RecalcLayout();
  2860. OnRepositionSingleChild();
  2861. if( hWndTopDynBar != NULL && ::IsWindow( hWndTopDynBar ) && LPVOID(pWndTopDynBar) == LPVOID(CWnd::FromHandlePermanent(hWndTopDynBar)) )
  2862. pWndTopDynBar->OnRepositionSingleChild();
  2863. CExtControlBar::stat_AdjustOccCompatibilityTree( m_pDockSite );
  2864. g_pBarToggleFloatingState = NULL;
  2865. }
  2866. // dock control bar to new circle (most inner or outer)
  2867. bool CExtControlBar::DockControlBarInnerOuter(
  2868. UINT nDockBarID,
  2869. bool bInner,
  2870. CFrameWnd * pDockSite, // = NULL // can be NULL only if bar already was at once docked
  2871. bool bRecalcLayout // = true
  2872. )
  2873. {
  2874. ASSERT_VALID( this );
  2875. ASSERT_KINDOF( CExtControlBar, this );
  2876. if( pDockSite == NULL )
  2877. pDockSite = m_pDockSite;
  2878. ASSERT_VALID( pDockSite );
  2879. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  2880. CFrameWnd * pParentFrame = GetParentFrame();
  2881. if( pParentFrame != NULL
  2882. && pParentFrame->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) )
  2883. )
  2884. pParentFrame->ShowWindow( SW_HIDE );
  2885. UINT nCircleNo = 1;
  2886. CExtDockBar::_InjectCircle( pDockSite, nCircleNo );
  2887. if( bInner )
  2888. nCircleNo = CExtDockBar::_CreateInnerCircle( pDockSite );
  2889. return
  2890. DockControlBar(
  2891. nDockBarID,
  2892. nCircleNo,
  2893. pDockSite,
  2894. bRecalcLayout
  2895. );
  2896. }
  2897. // dock control bar relatively to other control bar (extended version)
  2898. bool CExtControlBar::DockControlBarLTRB(
  2899. CExtControlBar * pBarTarget,
  2900. UINT nDockBarID, // = AFX_IDW_DOCKBAR_BOTTOM
  2901. bool bRecalcLayout // = true
  2902. )
  2903. {
  2904. return
  2905. DockControlBarLTRB(
  2906. 50,
  2907. pBarTarget,
  2908. nDockBarID,
  2909. bRecalcLayout
  2910. );
  2911. }
  2912. // dock control bar relatively to other control bar using
  2913. // space percent specification (extended version)
  2914. bool CExtControlBar::DockControlBarLTRB(
  2915. int nPercentToOccupy, // greater then zero and less then one hundred
  2916. CExtControlBar * pBarTarget,
  2917. UINT nDockBarID, // = AFX_IDW_DOCKBAR_BOTTOM
  2918. bool bRecalcLayout // = true
  2919. )
  2920. {
  2921. ASSERT_VALID( this );
  2922. ASSERT_KINDOF( CExtControlBar, this );
  2923. ASSERT_VALID( pBarTarget );
  2924. ASSERT_KINDOF( CExtControlBar, pBarTarget );
  2925. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  2926. ASSERT_VALID( pBarTarget->m_pDockBar );
  2927. ASSERT_KINDOF( CDockBar, pBarTarget->m_pDockBar );
  2928. ASSERT( ! IsFixedMode() );
  2929. ASSERT( ! pBarTarget->IsFixedMode() );
  2930. ASSERT( 0 < nPercentToOccupy && nPercentToOccupy < 100 );
  2931. #ifdef _DEBUG
  2932. if( m_pDockBar != NULL )
  2933. {
  2934. ASSERT_VALID( m_pDockBar );
  2935. ASSERT_KINDOF( CDockBar, m_pDockBar );
  2936. }
  2937. #endif // _DEBUG
  2938. CFrameWnd * pParentFrame = GetParentFrame();
  2939. CFrameWnd * pDockSite = m_pDockSite;
  2940. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2941. if( pParentFrame != NULL
  2942. && pParentFrame->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) )
  2943. && _DraggingGetBar() == this
  2944. && INT(OnQueryDockingType()) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005)
  2945. )
  2946. pParentFrame->ShowWindow( SW_HIDE );
  2947. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2948. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2949. CExtDynTabControlBar * pTargetTabBar =
  2950. pBarTarget->_GetNearestTabbedContainer();
  2951. if( pTargetTabBar != NULL )
  2952. {
  2953. ASSERT_VALID( pTargetTabBar );
  2954. pBarTarget = pTargetTabBar;
  2955. ASSERT_VALID( pBarTarget->m_pDockBar );
  2956. ASSERT_KINDOF( CDockBar, pBarTarget->m_pDockBar );
  2957. ASSERT( ! pBarTarget->IsFixedMode() );
  2958. } // if( pTargetTabBar != NULL )
  2959. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2960. bool bRecalcDockSite = true;
  2961. pParentFrame = pBarTarget->GetParentFrame();
  2962. ASSERT_VALID( pParentFrame );
  2963. if( pParentFrame != pBarTarget->m_pDockSite
  2964. && (m_pDockSite != NULL && pParentFrame != m_pDockSite )
  2965. )
  2966. bRecalcDockSite = false;
  2967. HWND hWndSrcFrame = NULL;
  2968. if( m_pDockSite != NULL )
  2969. {
  2970. hWndSrcFrame = GetParentFrame()->GetSafeHwnd();
  2971. if( hWndSrcFrame == pBarTarget->m_pDockSite->GetSafeHwnd() )
  2972. hWndSrcFrame = NULL;
  2973. } // if( m_pDockSite != NULL )
  2974. HWND hWndBarTarget = pBarTarget->GetSafeHwnd();
  2975. pBarTarget->_DraggingDoDeepHalfSplit(
  2976. this,
  2977. nDockBarID,
  2978. nPercentToOccupy
  2979. );
  2980. bRecalcLayout = bRecalcDockSite = true;
  2981. if( bRecalcLayout )
  2982. {
  2983. ASSERT_VALID( pParentFrame );
  2984. pParentFrame->RecalcLayout();
  2985. if( hWndSrcFrame != NULL && ::IsWindow(hWndSrcFrame) )
  2986. {
  2987. CWnd * pWnd = CWnd::FromHandlePermanent( hWndSrcFrame );
  2988. if( pWnd != NULL )
  2989. {
  2990. ASSERT_VALID( pWnd );
  2991. CFrameWnd * pFrame =
  2992. DYNAMIC_DOWNCAST( CFrameWnd, pWnd );
  2993. if( pFrame != NULL )
  2994. pFrame->RecalcLayout();
  2995. } // if( pWnd != NULL )
  2996. } // if( hWndSrcFrame != NULL && ::IsWindow(hWndSrcFrame) )
  2997. if( bRecalcDockSite
  2998. && ::IsWindow( hWndBarTarget )
  2999. )
  3000. pBarTarget->m_pDockSite->RecalcLayout();
  3001. } // if( bRecalcLayout )
  3002. CExtControlBar::stat_AdjustOccCompatibilityTree( pDockSite );
  3003. return true;
  3004. }
  3005. // dock control bar to new row
  3006. bool CExtControlBar::DockControlBar(
  3007. UINT nDockBarID,
  3008. UINT nCircleNo,
  3009. CFrameWnd * pDockSite, // = NULL // can be NULL only if bar already was at once docked
  3010. bool bRecalcLayout // = true
  3011. )
  3012. {
  3013. ASSERT_VALID( this );
  3014. ASSERT_KINDOF( CExtControlBar, this );
  3015. if( pDockSite == NULL )
  3016. pDockSite = m_pDockSite;
  3017. ASSERT_VALID( pDockSite );
  3018. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  3019. CExtDockBar * pDockBar = 
  3020. STATIC_DOWNCAST(
  3021. CExtDockBar,
  3022. pDockSite->GetControlBar( nDockBarID )
  3023. );
  3024. ASSERT_VALID( pDockBar );
  3025. ASSERT( pDockBar->_GetCircleNo() == 0 );
  3026. if( nCircleNo == 0 )
  3027. {
  3028. pDockBar->_InnerOuterDockControlBar(
  3029. this,
  3030. true
  3031. );
  3032. if( bRecalcLayout )
  3033. pDockSite->RecalcLayout();
  3034. CExtControlBar::stat_AdjustOccCompatibilityTree( pDockSite );
  3035. return true;
  3036. }
  3037. ASSERT( !IsFixedMode() );
  3038. pDockBar = pDockBar->_GetBarByCircleNo( nCircleNo );
  3039. ASSERT_VALID( pDockBar );
  3040. ASSERT( pDockBar->_GetCircleNo() == nCircleNo );
  3041. pDockBar->_InnerOuterDockControlBar(
  3042. this,
  3043. true
  3044. );
  3045. if( bRecalcLayout )
  3046. pDockSite->RecalcLayout();
  3047. CExtControlBar::stat_AdjustOccCompatibilityTree( pDockSite );
  3048. return true;
  3049. }
  3050. // dock control bar relatively to other control bar
  3051. bool CExtControlBar::DockControlBar(
  3052. CExtControlBar * pBar,
  3053. bool bHorzBarHalfSplit,
  3054. bool bInnerHalfSplit, // = false
  3055. CFrameWnd * pDockSite, // = NULL // can be NULL only if bar already was at once docked
  3056. bool bRecalcLayout // = true
  3057. )
  3058. {
  3059. ASSERT_VALID( this );
  3060. ASSERT_KINDOF( CExtControlBar, this );
  3061. if( pDockSite == NULL )
  3062. pDockSite = m_pDockSite;
  3063. ASSERT_VALID( pDockSite );
  3064. ASSERT_VALID( pBar );
  3065. ASSERT(
  3066. pBar->m_pDockSite == m_pDockSite
  3067. || pBar->m_pDockSite == NULL
  3068. );
  3069. ASSERT_VALID( m_pDockBar );
  3070. ASSERT_KINDOF( CDockBar, m_pDockBar );
  3071. ASSERT( !IsFixedMode() );
  3072. ASSERT( !pBar->IsFixedMode() );
  3073. #ifdef _DEBUG
  3074. if( pBar->m_pDockBar != NULL )
  3075. {
  3076. ASSERT_VALID( pBar->m_pDockBar );
  3077. ASSERT_KINDOF( CExtDockBar, pBar->m_pDockBar );
  3078. }
  3079. #endif // _DEBUG
  3080. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3081. if( m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  3082. {
  3083. CExtControlBar * pParentBar =
  3084. STATIC_DOWNCAST(
  3085. CExtControlBar,
  3086. m_pDockBar->GetParent()
  3087. );
  3088. ASSERT_VALID( pParentBar );
  3089. return
  3090. pParentBar->
  3091. DockControlBar(
  3092. pBar,
  3093. bHorzBarHalfSplit,
  3094. bInnerHalfSplit,
  3095. pDockSite,
  3096. bRecalcLayout
  3097. );
  3098. }
  3099. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3100. CRect rc;
  3101. GetWindowRect( &rc );
  3102. // rc.bottom = rc.top + rc.Height()/2;
  3103. // rc.right = rc.left + rc.Width()/2;
  3104. InternalDraggingState_t _ds;
  3105. _ds.ExtBarSrcSet( pBar );
  3106. _ds.ExtBarDstSet( this );
  3107. _ds.SetEmpty( false );
  3108. _ds.TrackRectSet( rc );
  3109. // pBar->m_sizeDockedH = m_sizeDockedH;
  3110. // pBar->m_sizeDockedV = m_sizeDockedV;
  3111. UINT nOwnDockBarID = GetSafeDockBarDlgCtrlID();
  3112. ASSERT_DOCKBAR_DLGCTRLID( nOwnDockBarID );
  3113. switch( nOwnDockBarID )
  3114. {
  3115. case AFX_IDW_DOCKBAR_FLOAT:
  3116. _ds.SetCDT(
  3117. bHorzBarHalfSplit
  3118. ? (bInnerHalfSplit ? __ECDT_INNER_TOP : __ECDT_INNER_BOTTOM)
  3119. : (bInnerHalfSplit ? __ECDT_INNER_LEFT : __ECDT_INNER_RIGHT)
  3120. );
  3121. _ds.SetDeepHalfSplit( true );
  3122. break;
  3123. case AFX_IDW_DOCKBAR_LEFT:
  3124. _ds.SetCDT(
  3125. bHorzBarHalfSplit
  3126. ? (bInnerHalfSplit ? __ECDT_INNER_TOP : __ECDT_INNER_BOTTOM)
  3127. : (bInnerHalfSplit ? __ECDT_INNER_RIGHT : __ECDT_INNER_LEFT)
  3128. );
  3129. _ds.SetDeepHalfSplit( !bHorzBarHalfSplit );
  3130. break;
  3131. case AFX_IDW_DOCKBAR_RIGHT:
  3132. _ds.SetCDT(
  3133. bHorzBarHalfSplit
  3134. ? (bInnerHalfSplit ? __ECDT_INNER_TOP : __ECDT_INNER_BOTTOM)
  3135. : (bInnerHalfSplit ? __ECDT_INNER_LEFT : __ECDT_INNER_RIGHT)
  3136. );
  3137. _ds.SetDeepHalfSplit( !bHorzBarHalfSplit );
  3138. break;
  3139. case AFX_IDW_DOCKBAR_TOP:
  3140. _ds.SetCDT(
  3141. bHorzBarHalfSplit
  3142. ? (bInnerHalfSplit ? __ECDT_INNER_LEFT : __ECDT_INNER_RIGHT)
  3143. : (bInnerHalfSplit ? __ECDT_INNER_BOTTOM : __ECDT_INNER_TOP)
  3144. );
  3145. _ds.SetDeepHalfSplit( bHorzBarHalfSplit );
  3146. break;
  3147. case AFX_IDW_DOCKBAR_BOTTOM:
  3148. _ds.SetCDT(
  3149. bHorzBarHalfSplit
  3150. ? (bInnerHalfSplit ? __ECDT_INNER_LEFT : __ECDT_INNER_RIGHT)
  3151. : (bInnerHalfSplit ? __ECDT_INNER_TOP: __ECDT_INNER_BOTTOM)
  3152. );
  3153. _ds.SetDeepHalfSplit( bHorzBarHalfSplit );
  3154. break;
  3155. #ifdef _DEBUG
  3156. default:
  3157. {
  3158. ASSERT( FALSE );
  3159. }
  3160. return false;
  3161. #endif // _DEBUG
  3162. } // switch( nOwnDockBarID )
  3163. // tmp
  3164. //_ds.SetDeepHalfSplit( true );
  3165. bool bRetVal = _DraggingApplyState( _ds, true );
  3166. if( bRecalcLayout )
  3167. pDockSite->RecalcLayout();
  3168. else
  3169. pDockSite->DelayRecalcLayout();
  3170. CExtControlBar::stat_AdjustOccCompatibilityTree( pDockSite );
  3171. return bRetVal;
  3172. }
  3173. // dock control bar into tabbed container
  3174. bool CExtControlBar::DockControlBarIntoTabbedContainer(
  3175. CExtControlBar * pBar,
  3176. INT nIndex, // = -1, // append
  3177. CFrameWnd * pDockSite, // = NULL // can be NULL only if bar already was at once docked
  3178. bool bRecalcLayout // = true
  3179. )
  3180. {
  3181. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3182. ASSERT_VALID( this );
  3183. ASSERT_KINDOF( CExtControlBar, this );
  3184. if( pDockSite == NULL )
  3185. pDockSite = m_pDockSite;
  3186. ASSERT_VALID( pDockSite );
  3187. ASSERT_VALID( pBar );
  3188. ASSERT(
  3189. pBar->m_pDockSite == m_pDockSite
  3190. || pBar->m_pDockSite == NULL
  3191. );
  3192. ASSERT( pBar != this );
  3193. ASSERT_VALID( m_pDockBar );
  3194. ASSERT_KINDOF( CDockBar, m_pDockBar );
  3195. #ifdef _DEBUG
  3196. if( pBar->m_pDockBar != NULL )
  3197. {
  3198. ASSERT( pBar->m_pDockSite == pDockSite );
  3199. ASSERT_VALID( pBar->m_pDockBar );
  3200. ASSERT_KINDOF( CDockBar, pBar->m_pDockBar );
  3201. }
  3202. #endif // _DEBUG
  3203. if( ( ! _CanDockToTabbedContainers( pBar ) )
  3204. || (! pBar->_CanDockToTabbedContainers( this ) )
  3205. || IsFixedMode()
  3206. || IsFixedDockStyle()
  3207. || pBar->IsFixedMode()
  3208. || pBar->IsFixedDockStyle()
  3209. )
  3210. return false;
  3211. if( IsKindOf(RUNTIME_CLASS(CExtDynTabControlBar)) )
  3212. {
  3213. ASSERT( !m_bUpdatingChain );
  3214. ASSERT( !pBar->m_bUpdatingChain );
  3215. CFrameWnd * pOldFrame = pBar->GetParentFrame();
  3216. HWND hWndOldFrame = pOldFrame->GetSafeHwnd();
  3217. m_bUpdatingChain = true;
  3218. pBar->m_bUpdatingChain = true;
  3219. if( pBar->m_pDockBar != NULL )
  3220. pBar->GetParentFrame()->DelayRecalcLayout();
  3221. BOOL bInsertingOtherTabs =
  3222. pBar->IsKindOf(
  3223. RUNTIME_CLASS(CExtDynTabControlBar)
  3224. );
  3225. //((CExtDynTabControlBar *)(this)) -> SetSwitcherRedraw( false );
  3226. ((CExtDynTabControlBar *)(this)) ->
  3227. InsertBar( pBar, nIndex, false );
  3228. if( nIndex < 0 )
  3229. nIndex = 
  3230. ((CExtDynTabControlBar *)(this)) ->
  3231. GetSwitcherItemCount() - 1;
  3232. ((CExtDynTabControlBar *)(this)) ->
  3233. SetSwitcherSelection( nIndex, true, false );
  3234. ((CExtDynTabControlBar *)(this)) ->
  3235. OnRepositionSingleChild( -1, -1, false );
  3236. if( bRecalcLayout )
  3237. {
  3238. GetParentFrame()->RecalcLayout();
  3239. // ASSERT_VALID( m_pDockBar );
  3240. // m_pDockBar->CalcFixedLayout( TRUE, TRUE );
  3241. }
  3242. else
  3243. GetParentFrame()->DelayRecalcLayout();
  3244. HWND hWndBar = pBar->GetSafeHwnd();
  3245. if( ! bInsertingOtherTabs )
  3246. {
  3247. ASSERT_VALID( pBar );
  3248. pBar->OnRepositionSingleChild( -1, -1, false );
  3249. } // if( ! bInsertingOtherTabs )
  3250. else
  3251. {
  3252. POSITION pos = m_pDockSite->m_listControlBars.Find( pBar );
  3253. if( pos != NULL )
  3254. m_pDockSite->m_listControlBars.RemoveAt( pos );
  3255. pBar->m_pDockBar->RemoveControlBar( pBar );
  3256. if( ::IsWindow( hWndBar ) )
  3257. pBar->DestroyWindow();
  3258. } // else from if( ! bInsertingOtherTabs )
  3259. m_bUpdatingChain = false;
  3260. if( ::IsWindow( hWndBar ) )
  3261. pBar->m_bUpdatingChain = false;
  3262. if( bRecalcLayout )
  3263. CExtDockBar::_OptimizeCircles( m_pDockSite );
  3264. if( bRecalcLayout && ::IsWindow( hWndOldFrame ) )
  3265. {
  3266. ASSERT_VALID( pOldFrame );
  3267. ASSERT(
  3268. CWnd::FromHandlePermanent( hWndOldFrame )
  3269. == pOldFrame
  3270. );
  3271. //if( pOldFrame != pBar->GetParentFrame() )
  3272. pOldFrame->RecalcLayout();
  3273. }
  3274. if( ::IsWindow( hWndBar )
  3275. && CWnd::FromHandlePermanent( hWndBar ) == pBar
  3276. )
  3277. CExtControlBar::stat_AdjustOccCompatibilityTree( pBar->m_pDockSite );
  3278. if( bRecalcLayout )
  3279. OnRepositionSingleChild( -1, -1, bRecalcLayout );
  3280. return true;
  3281. } // if( IsKindOf(RUNTIME_CLASS(CExtDynTabControlBar)) )
  3282. if( m_pDockBar != NULL )
  3283. {
  3284. ASSERT_VALID( m_pDockBar );
  3285. if( m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  3286. {
  3287. CExtDynTabControlBar * pDynTabbed =
  3288. STATIC_DOWNCAST(
  3289. CExtDynTabControlBar,
  3290. m_pDockBar->GetParent()
  3291. );
  3292. ASSERT_VALID( pDynTabbed );
  3293. return
  3294. pDynTabbed->DockControlBarIntoTabbedContainer(
  3295. pBar,
  3296. nIndex,
  3297. pDockSite,
  3298. bRecalcLayout
  3299. );
  3300. }
  3301. }
  3302. ASSERT_VALID( this );
  3303. ASSERT_KINDOF( CExtControlBar, this );
  3304. ASSERT( !IsFixedMode() );
  3305. ASSERT_VALID( m_pDockSite );
  3306. ASSERT_VALID( m_pDockBar );
  3307. ASSERT_KINDOF( CDockBar, m_pDockBar );
  3308. CDockBar * pDockBarIn = m_pDockBar;
  3309. // STATIC_DOWNCAST( CExtDockBar, m_pDockBar );
  3310. CDockBar * pDockBarOut = pBar->m_pDockBar;
  3311. // STATIC_DOWNCAST( CExtDockBar, pBar->m_pDockBar );
  3312. bool bOptimizeOuterDockBarLayout = false;
  3313. HWND hWndDockBarOuter = NULL;
  3314. if( pDockBarOut != NULL )
  3315. {
  3316. if( pDockBarOut->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  3317. bOptimizeOuterDockBarLayout = true;
  3318. hWndDockBarOuter = pDockBarOut->GetSafeHwnd(); 
  3319. }
  3320. CFrameWnd * pOldFrame = pBar->GetParentFrame();
  3321. HWND hWndOldFrame = pOldFrame->GetSafeHwnd();
  3322. CRect rcDyn;
  3323. GetWindowRect( &rcDyn );
  3324. m_pDockBar->ScreenToClient( &rcDyn );
  3325. DWORD dwDynStyle =
  3326. GetStyle()
  3327. | (GetBarStyle() & CBRS_ALIGN_ANY)
  3328. ;
  3329. dwDynStyle |= CBRS_BORDER_ANY | CBRS_GRIPPER;
  3330. dwDynStyle &= ~( CBRS_FLOATING );
  3331. dwDynStyle |= CBRS_TOOLTIPS;
  3332. UINT nNewID = GetSafeDockBarDlgCtrlID();
  3333. CExtDynTabControlBar * pDynBar = NULL;
  3334. pDockSite->SendMessage(
  3335. g_nMsgCreateTabbedBar,
  3336. WPARAM( &pDynBar )
  3337. );
  3338. #ifdef _DEBUG
  3339. if( pDynBar != NULL )
  3340. {
  3341. ASSERT_VALID( pDynBar );
  3342. ASSERT_KINDOF( CExtDynTabControlBar, pDynBar );
  3343. } // if( pDynBar != NULL )
  3344. #endif // _DEBUG
  3345. if( pDynBar == NULL )
  3346. pDynBar = new CExtDynTabControlBar;
  3347. // pDynBar->SetInitDesiredSizeHorizontal( m_sizeDockedH );
  3348. // pDynBar->SetInitDesiredSizeVertical( m_sizeDockedV );
  3349. if( ! pDynBar->Create(
  3350. NULL,
  3351. m_pDockSite,
  3352. nNewID,
  3353. dwDynStyle
  3354. )
  3355. )
  3356. {
  3357. ASSERT( FALSE );
  3358. return false;
  3359. }
  3360. ASSERT( pDynBar->m_pWndDynDocker != NULL );
  3361. ASSERT( pDynBar->m_pWndDynDocker->GetSafeHwnd() != NULL );
  3362. ASSERT( ::IsWindow(pDynBar->m_pWndDynDocker->GetSafeHwnd()) );
  3363. pDynBar->m_pDockSite = m_pDockSite;
  3364. pDynBar->m_pDockBar = m_pDockBar;
  3365. pDynBar->EnableDocking( CBRS_ALIGN_ANY );
  3366. ASSERT( pDynBar->m_pDockContext != NULL );
  3367. ASSERT( pDynBar->m_pDockContext->m_pDockSite == m_pDockSite );
  3368. //#ifdef _DEBUG
  3369. //INT nPosOut = pDockBarOut->FindBar( pBar );
  3370. // ASSERT( nPosOut > 0 && nPosOut < pDockBarOut->m_arrBars.GetSize() );
  3371. //#endif // _DEBUG
  3372. INT nPosIn = pDockBarIn->FindBar( this );
  3373. ASSERT( nPosIn > 0 && nPosIn < pDockBarIn->m_arrBars.GetSize() );
  3374. pDockBarIn->m_arrBars[ nPosIn ] = pDynBar;
  3375. pDynBar->m_pDockBar->m_bFloating = m_pDockBar->m_bFloating;
  3376. m_pDockBar = pDynBar->m_pWndDynDocker;
  3377. // pBar->m_pDockBar = pDynBar->m_pWndDynDocker;
  3378. m_pDockBar->m_bFloating = FALSE;
  3379. if( pDynBar->m_pDockBar->m_bFloating )
  3380. pDynBar->m_pDockBar->SetBarStyle(
  3381. pDynBar->m_pDockBar->GetBarStyle()|CBRS_FLOATING
  3382. );
  3383. m_pDockBar->SetBarStyle(
  3384. m_pDockBar->GetBarStyle() & (~CBRS_FLOATING)
  3385. );
  3386. SetBarStyle( GetBarStyle() & (~CBRS_FLOATING) );
  3387. ASSERT( !m_bUpdatingChain );
  3388. ASSERT( !((CExtControlBar *)pDynBar)->m_bUpdatingChain );
  3389. ASSERT( !pBar->m_bUpdatingChain );
  3390. m_bUpdatingChain = true;
  3391. ((CExtControlBar *)pDynBar)->m_bUpdatingChain = true;
  3392. pBar->m_bUpdatingChain = true;
  3393. pDynBar->SetParent( pDockBarIn );
  3394. SetParent( pDynBar->m_pWndDynDocker );
  3395. pDynBar->m_pWndDynDocker->m_arrBars.Add( this );
  3396. pDynBar->m_pWndDynDocker->m_arrBars.Add( NULL );
  3397. // SetInitDesiredSizeHorizontal( rcDyn.Size() );
  3398. // SetInitDesiredSizeVertical( rcDyn.Size() );
  3399. //// pBar->SetInitDesiredSizeHorizontal( rcDyn.Size() );
  3400. //// pBar->SetInitDesiredSizeVertical( rcDyn.Size() );
  3401. ((CExtControlBar *)pDynBar)->m_sizeDockedH = m_sizeDockedH;
  3402. ((CExtControlBar *)pDynBar)->m_sizeDockedV = m_sizeDockedV;
  3403. ((CExtControlBar *)pDynBar)->m_sizeFloated = m_sizeFloated;
  3404. CRect rcNew( rcDyn );
  3405. rcNew.OffsetRect( -rcNew.TopLeft() );
  3406. MoveWindow( &rcNew, FALSE );
  3407. // pBar->MoveWindow( &rcNew, FALSE );
  3408. // pDynBar->SetInitDesiredSizeFloating( rcDyn.Size() );
  3409. /////// pDynBar->MoveWindow( &rcDyn, FALSE );
  3410. ASSERT_VALID( pDynBar );
  3411. ASSERT_VALID( pDynBar->m_pWndDynDocker );
  3412. pDynBar->InsertControlBar( this );
  3413. pDynBar->InsertBar( pBar, -1, false );
  3414. m_bUpdatingChain = false;
  3415. ((CExtControlBar *)pDynBar)->m_bUpdatingChain = false;
  3416. pBar->m_bUpdatingChain = false;
  3417. if( bOptimizeOuterDockBarLayout
  3418. && ::IsWindow( hWndDockBarOuter )
  3419. )
  3420. {
  3421. ASSERT_VALID( pDockBarOut );
  3422. ((CExtDockBar*)pDockBarOut)->OnDynamicLayoutOptimize();
  3423. }
  3424. // temp
  3425. CExtDockBar::_RemovePlaceHolder( m_pDockSite, this );
  3426. CExtDockBar::_RemovePlaceHolder( m_pDockSite, pBar );
  3427. CExtDockBar::_OptimizeCircles( m_pDockSite );
  3428. ((CExtDockDynTabBar *)pDynBar->m_pWndDynDocker)->_RepositionTabbedChilds( true );
  3429. pDynBar->SetSwitcherSelection( 0, true, false );
  3430. CWnd * pWnd = pDynBar->GetParent();
  3431. if( pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockDynBar)) )
  3432. {
  3433. CExtDynControlBar * pParentLayoutBar = STATIC_DOWNCAST( CExtDynControlBar, pWnd->GetParent() );
  3434. pParentLayoutBar->OnRepositionSingleChild();
  3435. }
  3436. CFrameWnd * pFrame = pDynBar->GetParentFrame();
  3437. if( pFrame != NULL )
  3438. {
  3439. BOOL bMiniFrame =
  3440. pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd));
  3441. if( bMiniFrame || bRecalcLayout )
  3442. {
  3443. pDynBar->OnNcAreaButtonsReinitialize();
  3444. pDynBar->OnNcAreaButtonsReposition();
  3445. __RECALC_FRAME_STEPS( pFrame );
  3446. if( bMiniFrame )
  3447. {
  3448. __RECALC_FRAME_STEPS( m_pDockSite );
  3449. }
  3450. } // if( bMiniFrame || bRecalcLayout )
  3451. } // if( pFrame != NULL )
  3452. if( bRecalcLayout && ::IsWindow( hWndOldFrame ) )
  3453. {
  3454. ASSERT_VALID( pOldFrame );
  3455. ASSERT(
  3456. CWnd::FromHandlePermanent( hWndOldFrame )
  3457. == pOldFrame
  3458. );
  3459. if( pOldFrame != pFrame )
  3460. pOldFrame->RecalcLayout();
  3461. }
  3462. CExtControlBar::stat_AdjustOccCompatibilityTree( m_pDockSite );
  3463. return true;
  3464. #else
  3465. pBar;
  3466. nIndex;
  3467. pDockSite;
  3468. bRecalcLayout;
  3469. ASSERT( FALSE ); // no implementation
  3470. return false;
  3471. #endif // else from (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3472. }
  3473. bool CExtControlBar::_FloatStateChangingIsEnabled(
  3474. const CExtControlBar * pBarQuerySrc
  3475. ) const
  3476. {
  3477. ASSERT_VALID( this );
  3478. ASSERT_VALID( pBarQuerySrc );
  3479. pBarQuerySrc;
  3480. return (! g_bLockAllBars );
  3481. }
  3482. bool CExtControlBar::_NcMenuButtonIsEnabled(
  3483. const CExtControlBar * pBarQuerySrc
  3484. ) const
  3485. {
  3486. ASSERT_VALID( this );
  3487. ASSERT_VALID( pBarQuerySrc );
  3488. pBarQuerySrc;
  3489. return (! g_bLockAllBars );
  3490. }
  3491. bool CExtControlBar::_ClosingIsEnabled(
  3492. const CExtControlBar * pBarQuerySrc
  3493. ) const
  3494. {
  3495. ASSERT_VALID( this );
  3496. ASSERT_VALID( pBarQuerySrc );
  3497. pBarQuerySrc;
  3498. return (! g_bLockAllBars );
  3499. }
  3500. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3501. bool CExtControlBar::_AutoHidingIsEnabled(
  3502. const CExtControlBar * pBarQuerySrc
  3503. ) const
  3504. {
  3505. ASSERT_VALID( this );
  3506. ASSERT_VALID( pBarQuerySrc );
  3507. pBarQuerySrc;
  3508. return (! g_bLockAllBars );
  3509. }
  3510. INT CExtControlBar::AutoHideWidthGet() const
  3511. {
  3512. ASSERT_VALID( this );
  3513. return m_nAutoHideWidth;
  3514. }
  3515. void CExtControlBar::AutoHideWidthSet( INT nAutoHideWidth )
  3516. {
  3517. ASSERT_VALID( this );
  3518. m_nAutoHideWidth = nAutoHideWidth;
  3519. }
  3520. INT CExtControlBar::AutoHideHeightGet() const
  3521. {
  3522. ASSERT_VALID( this );
  3523. return m_nAutoHideHeight;
  3524. }
  3525. void CExtControlBar::AutoHideHeightSet( INT nAutoHideHeight )
  3526. {
  3527. ASSERT_VALID( this );
  3528. m_nAutoHideHeight = nAutoHideHeight;
  3529. }
  3530. // is bar in autohide mode
  3531. bool CExtControlBar::AutoHideModeGet() const
  3532. {
  3533. ASSERT_VALID( this );
  3534. #ifdef _DEBUG
  3535. if( m_bAutoHideMode )
  3536. {
  3537. ASSERT( !IsFixedMode() );
  3538. ASSERT( !IsFixedDockStyle() );
  3539. }
  3540. #endif // _DEBUG
  3541. return m_bAutoHideMode;
  3542. }
  3543. // switch to/restore from autohide mode
  3544. bool CExtControlBar::AutoHideModeSet(
  3545. bool bAutoHideMode,
  3546. bool bAnimate,
  3547. bool bRecalcLayout,
  3548. bool bForceNoShow
  3549. )
  3550. {
  3551. ASSERT_VALID( this );
  3552. ASSERT_VALID( m_pDockSite );
  3553. ASSERT_VALID( m_pDockBar );
  3554. ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  3555. if( bAutoHideMode || m_bAutoHideMode )
  3556. {
  3557. if( IsFixedMode() || IsFixedDockStyle() )
  3558. {
  3559. ASSERT( FALSE );
  3560. return false;
  3561. }
  3562. }
  3563. if( IsFloating() )
  3564. {
  3565. ASSERT( FALSE );
  3566. return false;
  3567. }
  3568. if( bAutoHideMode == m_bAutoHideMode )
  3569. return true;
  3570. CExtDockBar * pDockBar =
  3571. STATIC_DOWNCAST( CExtDockBar, m_pDockBar );
  3572. if( pDockBar->IsKindOf( RUNTIME_CLASS(CExtDockDynTabBar) ) )
  3573. {
  3574. CExtDynTabControlBar * pTabbedBar =
  3575. STATIC_DOWNCAST(
  3576. CExtDynTabControlBar,
  3577. m_pDockBar->GetParent()
  3578. );
  3579. ((CExtControlBar *)pTabbedBar)->m_nDelayedRowUpdateMetric = 0;
  3580. bool bRetVal =
  3581. pTabbedBar->AutoHideModeSet(
  3582. bAutoHideMode,
  3583. bAnimate,
  3584. bRecalcLayout,
  3585. bAutoHideMode ? true : bForceNoShow
  3586. );
  3587. ASSERT( bAutoHideMode == m_bAutoHideMode );
  3588. return bRetVal;
  3589. }
  3590. CExtDynAutoHideArea * pWndAutoHideArea =
  3591. pDockBar->_GetAutoHideArea();
  3592. if( pWndAutoHideArea == NULL )
  3593. {
  3594. // FrameInjectAutoHideAreas was not called
  3595. ASSERT( FALSE );
  3596. return false;
  3597. }
  3598. ASSERT_VALID( pWndAutoHideArea );
  3599. if( bAutoHideMode )
  3600. {
  3601. if( IsVisible() )
  3602. {
  3603. m_pDockSite->ShowControlBar( this, FALSE, TRUE );
  3604. ASSERT( !IsVisible() );
  3605. m_pDockSite->DelayRecalcLayout();
  3606. } // if( IsVisible() )
  3607. pWndAutoHideArea->AppendControlBar(
  3608. this,
  3609. bForceNoShow
  3610. );
  3611. CExtControlBar * pBar = NULL;
  3612. CExtDynTabControlBar * pTabbedBar =
  3613. DYNAMIC_DOWNCAST(
  3614. CExtDynTabControlBar,
  3615. m_pDockBar->GetParent()
  3616. );
  3617. if( pTabbedBar != NULL )
  3618. {
  3619. LONG nSel = pTabbedBar->GetSwitcherSelection();
  3620. if( nSel >= 0 )
  3621. pBar = pTabbedBar->GetBarAt( nSel, true );
  3622. }
  3623. else
  3624. pBar = this;
  3625. if( pBar != NULL )
  3626. {
  3627. CWnd * pWndParent = pBar->m_pDockBar;
  3628. for( ; true ; )
  3629. {
  3630. ASSERT_VALID( pWndParent );
  3631. if( pWndParent->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  3632. {
  3633. if( ! pWndParent->IsKindOf(RUNTIME_CLASS(CExtDockDynBar)) )
  3634. {
  3635. ASSERT( pWndParent->GetParent() == m_pDockSite );
  3636. break;
  3637. } // if( ! pWndParent->IsKindOf(RUNTIME_CLASS(CExtDockDynBar)) )
  3638. } // if( pWndParent->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  3639. pWndParent = pWndParent->GetParent();
  3640. } // for( ; true ; )
  3641. ASSERT_KINDOF( CExtDockBar, pWndParent );
  3642. ASSERT( ((CExtDockBar*)pWndParent)->_GetCircleNo() > 0 );
  3643. UINT nTopDockBarID = pWndParent->GetDlgCtrlID();
  3644. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nTopDockBarID );
  3645. CExtDockBar * pOuterDocker =
  3646. STATIC_DOWNCAST(
  3647. CExtDockBar,
  3648. m_pDockSite->GetControlBar( nTopDockBarID )
  3649. );
  3650. ASSERT_VALID( pOuterDocker );
  3651. ASSERT( UINT(pOuterDocker->GetDlgCtrlID()) == nTopDockBarID );
  3652. CExtDynAutoHideArea * pAutoHideArea =
  3653. pOuterDocker->_GetAutoHideArea();
  3654. ASSERT_VALID( pAutoHideArea );
  3655. ASSERT( UINT(pAutoHideArea->GetDlgCtrlID()) == nTopDockBarID );
  3656. LONG nPos = pAutoHideArea->FindControlBar( pBar );
  3657. if( nPos >= 0 )
  3658. {
  3659. CExtTabWnd::TAB_ITEM_INFO * pTII =
  3660. pAutoHideArea->ItemGet( nPos );
  3661. pTII->ModifyItemStyle( 0, __ETWI_IN_GROUP_ACTIVE );
  3662. }
  3663. }
  3664. } // if( bAutoHideMode )
  3665. else
  3666. {
  3667. ASSERT( !IsVisible() );
  3668. //m_pDockSite->ShowControlBar( this, TRUE, TRUE );
  3669. m_pDockSite->DelayRecalcLayout();
  3670. pWndAutoHideArea->RemoveControlBar(
  3671. this,
  3672. bForceNoShow
  3673. );
  3674. if( bForceNoShow )
  3675. {
  3676. HWND hWnd =
  3677. ::GetWindow(
  3678. ::GetParent(pWndAutoHideArea->m_hWnd),
  3679. GW_CHILD
  3680. );
  3681. TCHAR sClassName[ _MAX_PATH + 1 ];
  3682. for( ; hWnd != NULL; hWnd = ::GetWindow(hWnd,GW_HWNDNEXT) )
  3683. {
  3684. ::memset( sClassName, 0, sizeof(sClassName) );
  3685. ::GetClassName(
  3686. hWnd,
  3687. sClassName,
  3688. _MAX_PATH
  3689. );
  3690. if( _tcscmp( sClassName,__AUTOHIDE_SLIDER_WNDCLASS ) == 0 )
  3691. {
  3692. ::SendMessage( hWnd, WM_CANCELMODE, 0L, 0L );
  3693. break;
  3694. }
  3695. } // for( ; hWnd != NULL; hWnd = ::GetWindow(hWnd,GW_HWNDNEXT) )
  3696. CExtDynTabControlBar * pTabbedBar =
  3697. DYNAMIC_DOWNCAST( CExtDynTabControlBar, this );
  3698. if( pTabbedBar != NULL )
  3699. {
  3700. LONG nPos, nCount = pTabbedBar->GetSwitcherItemCount();
  3701. for( nPos = 0; nPos < nCount; nPos++ )
  3702. {
  3703. CExtControlBar * pBar =
  3704. pTabbedBar->GetBarAt( nPos, true );
  3705. if( pBar->IsVisible() )
  3706. m_pDockSite->ShowControlBar( pBar, FALSE, TRUE );
  3707. #if (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  3708. CExtDynamicControlBar * pDynamicBar =
  3709. DYNAMIC_DOWNCAST( CExtDynamicControlBar, pBar );
  3710. if( pDynamicBar != NULL )
  3711. pDynamicBar->BarStateSet(
  3712. CExtDynamicControlBar::__EDBS_DOCKED,
  3713. false
  3714. );
  3715. #endif // (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  3716. } // for( nPos = 0; nPos < nCount; nPos++ )
  3717. } // if( pTabbedBar != NULL )
  3718. } // if( bForceNoShow )
  3719. else
  3720. {
  3721. #if (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  3722. CExtDynTabControlBar * pTabbedBar =
  3723. DYNAMIC_DOWNCAST( CExtDynTabControlBar, this );
  3724. if( pTabbedBar != NULL )
  3725. {
  3726. LONG nPos, nCount = pTabbedBar->GetSwitcherItemCount();
  3727. for( nPos = 0; nPos < nCount; nPos++ )
  3728. {
  3729. CExtControlBar * pBar =
  3730. pTabbedBar->GetBarAt( nPos, true );
  3731. CExtDynamicControlBar * pDynamicBar =
  3732. DYNAMIC_DOWNCAST( CExtDynamicControlBar, pBar );
  3733. if( pDynamicBar != NULL )
  3734. pDynamicBar->BarStateSet(
  3735. CExtDynamicControlBar::__EDBS_DOCKED,
  3736. true
  3737. );
  3738. } // for( nPos = 0; nPos < nCount; nPos++ )
  3739. } // if( pTabbedBar != NULL )
  3740. #endif // (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  3741. } // else from if( bForceNoShow )
  3742. } // else from if( bAutoHideMode )
  3743. m_bAutoHideMode = bAutoHideMode;
  3744. CExtControlBar::stat_AdjustOccCompatibilityTree( m_pDockSite );
  3745. if( bRecalcLayout )
  3746. {
  3747. // tricky chain visibility updating
  3748. bool bSaved = m_bAutoHideMode;
  3749. m_bAutoHideMode = false;
  3750. ((InternalFriendlyFrameWnd*)m_pDockSite)->m_bInRecalcLayout = TRUE;
  3751. _UpdateVisibilityInChain();
  3752. ((InternalFriendlyFrameWnd*)m_pDockSite)->m_bInRecalcLayout = FALSE;
  3753. m_bAutoHideMode = bSaved;
  3754. m_pDockSite->RecalcLayout();
  3755. if( ! m_bAutoHideMode )
  3756. {
  3757. OnNcAreaButtonsReposition();
  3758. PostMessage( WM_NCPAINT );
  3759. PostMessage( WM_TIMER, __TIMER_ID_DRELAYED_REPAINT_FAKE );
  3760. } // if( ! m_bAutoHideMode )
  3761. CExtPaintManager::stat_PassPaintMessages();
  3762. } // if( bRecalcLayout )
  3763. return true;
  3764. }
  3765. bool CExtControlBar::OnQueryVisibilityInAutoHideTabs() const
  3766. {
  3767. ASSERT_VALID( this );
  3768. return true;
  3769. }
  3770. bool CExtControlBar::OnQueryVisibilityInContainerTabs() const
  3771. {
  3772. ASSERT_VALID( this );
  3773. return true;
  3774. }
  3775. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3776. void CExtControlBar::OnShowWindow(BOOL bShow, UINT nStatus) 
  3777. {
  3778. CControlBar::OnShowWindow(bShow, nStatus);
  3779. CExtPopupMenuTipWnd * pATTW =
  3780. OnAdvancedPopupMenuTipWndGet();
  3781. if( pATTW != NULL )
  3782. pATTW->Hide();
  3783. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3784. CExtCustomizeSite * pSite = NotifiedCustomizeSiteGet();
  3785. if( pSite != NULL )
  3786. pSite->OnBarStateChanged( this );
  3787. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3788. if( nStatus != 0 )
  3789. return;
  3790. _UpdateVisibilityInChain();
  3791. }
  3792. bool CExtControlBar::stat_FindSingleVisbleBarNested(
  3793. CDockBar * pDockBar,
  3794. CExtControlBar ** ppFoundBar
  3795. )
  3796. {
  3797. ASSERT_VALID( pDockBar );
  3798. ASSERT( pDockBar->GetSafeHwnd() != NULL );
  3799. ASSERT_KINDOF( CDockBar, pDockBar );
  3800. ASSERT( pDockBar->IsDockBar() );
  3801. ASSERT( ppFoundBar != NULL );
  3802. INT nIndex, nCount = INT( pDockBar->m_arrBars.GetSize() );
  3803. for( nIndex = 0; nIndex < nCount; nIndex++ )
  3804. {
  3805. CControlBar * pBar = (CControlBar *)pDockBar->m_arrBars.GetAt( nIndex );
  3806. if( pBar == NULL )
  3807. continue;
  3808. if( __PLACEHODLER_BAR_PTR( pBar ) )
  3809. continue;
  3810. ASSERT_VALID( pBar );
  3811. ASSERT_KINDOF( CControlBar, pBar );
  3812. ASSERT( ! pBar->IsDockBar() );
  3813. if( ! pBar->IsVisible() )
  3814. continue;
  3815. CExtControlBar * pExtBar = DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  3816. if( pExtBar == NULL )
  3817. continue;