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

界面编程

开发平台:

Visual C++

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