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

界面编程

开发平台:

Visual C++

  1. if( ! ( ::IsWindow( m_hWndMarkerTarget ) ) )
  2. {
  3. ShowMarkers( g_arrDockMarkerWndsInner, false, true );
  4. CExtControlBar * pDraggedBar =
  5. CExtControlBar::_DraggingGetBar();
  6. if( pDraggedBar == NULL )
  7. return;
  8. ASSERT_VALID( pDraggedBar );
  9. CPoint ptCursor( 0, 0 );
  10. ::GetCursorPos( &ptCursor );
  11. pDraggedBar->ScreenToClient( &ptCursor );
  12. pDraggedBar->PostMessage(
  13. WM_MOUSEMOVE,
  14. CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) ? (VK_CONTROL) : 0L,
  15. MAKELPARAM( ptCursor.x, ptCursor.y )
  16. );
  17. return;
  18. } // if( ! ( ::IsWindow( m_hWndMarkerTarget ) ) )
  19. } // if( m_hWndMarkerTarget != NULL )
  20. eMouseTrackState_t eMTS = __EMTS_OUT;
  21. CPoint ptCursor;
  22. if( ::GetCursorPos( &ptCursor ) )
  23. {
  24. HWND hWnd = ::WindowFromPoint( ptCursor );
  25. if( m_hWnd == hWnd )
  26. eMTS = __EMTS_HOVER;
  27. } // if( ::GetCursorPos( &ptCursor ) )
  28. if( m_eMTS == eMTS )
  29. return;
  30. m_eMTS = eMTS;
  31. if( eMTS != __EMTS_HOVER )
  32. HighlightMarkerTarget( false );
  33. //m_hWndLastHoverDepenentMarker = NULL;
  34. if( (! m_bSparsedMode )
  35. && m_eMarkerType != int(CExtPaintManager::__EDMT_2005_CENTER)
  36. )
  37. {
  38. CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  39. stat_FindMarker(
  40. m_hWndMarkerTarget,
  41. int(CExtPaintManager::__EDMT_2005_CENTER),
  42. m_bSparsedMode
  43. );
  44. if( pDynDockMarkerWnd->GetSafeHwnd() != NULL )
  45. {
  46. if( eMTS == __EMTS_HOVER )
  47. {
  48. pDynDockMarkerWnd->m_hWndLastHoverDepenentMarker = m_hWnd;
  49. pDynDockMarkerWnd->Invalidate();
  50. pDynDockMarkerWnd->UpdateWindow();
  51. }
  52. else if( pDynDockMarkerWnd->m_hWndLastHoverDepenentMarker == m_hWnd )
  53. {
  54. pDynDockMarkerWnd->m_hWndLastHoverDepenentMarker = NULL;
  55. pDynDockMarkerWnd->Invalidate();
  56. pDynDockMarkerWnd->UpdateWindow();
  57. }
  58. }
  59. } // if( ! m_bSparsedMode ...
  60. //if( ! IsStateApplyable() )
  61. // UnHighlightAllMarkers();
  62. Invalidate();
  63. UpdateWindow();
  64. return;
  65. } // if( nIDEvent == __DYNDOCKMARKER_TIMER_ID_TEMP  )
  66. CWnd::OnTimer(nIDEvent);
  67. }
  68. BOOL CExtDynDockMarkerWnd::DestroyWindow() 
  69. {
  70. HighlightMarkerTarget( false );
  71. return CWnd::DestroyWindow();
  72. }
  73. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  74. void CExtControlBar::MsgDrawTrackedAreaData_t::NotifyOrDrawDefault()
  75. {
  76. if( ! Notify() )
  77. DrawDefault();
  78. }
  79. bool CExtControlBar::MsgDrawTrackedAreaData_t::Notify()
  80. {
  81. ASSERT_VALID( (&m_wndBar) );
  82. ASSERT(
  83. m_wndBar.GetSafeHwnd() != NULL
  84. && ::IsWindow( m_wndBar.GetSafeHwnd() )
  85. );
  86. ASSERT( m_dcDraw.GetSafeHdc() != NULL );
  87. CFrameWnd * pFrame = m_wndBar.GetParentFrame();
  88. if( pFrame == NULL )
  89. return false;
  90. if( pFrame->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) ) )
  91. {
  92. pFrame = pFrame->GetParentFrame();
  93. if( pFrame == NULL )
  94. return false;
  95. } // if( pFrame->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) ) )
  96. pFrame->SendMessage(
  97. CExtControlBar::g_nMsgDrawTrackedArea,
  98. WPARAM( this )
  99. );
  100. return m_bMessageHandled;
  101. }
  102. void CExtControlBar::MsgDrawTrackedAreaData_t::DrawDefault()
  103. {
  104. ASSERT_VALID( (&m_wndBar) );
  105. ASSERT(
  106. m_wndBar.GetSafeHwnd() != NULL
  107. && ::IsWindow( m_wndBar.GetSafeHwnd() )
  108. );
  109. ASSERT( m_dcDraw.GetSafeHdc() != NULL );
  110. HBRUSH hBrush = (HBRUSH) CDC::GetHalftoneBrush()->GetSafeHandle();
  111. ASSERT( hBrush != NULL );
  112. Draw( hBrush, PATINVERT );
  113. }
  114. void CExtControlBar::MsgDrawTrackedAreaData_t::Draw(
  115. HBRUSH hBrush,
  116. DWORD dwPatBltROP // raster operation code for invoking PatBlt()
  117. )
  118. {
  119. ASSERT_VALID( (&m_wndBar) );
  120. ASSERT(
  121. m_wndBar.GetSafeHwnd() != NULL
  122. && ::IsWindow( m_wndBar.GetSafeHwnd() )
  123. );
  124. ASSERT( m_dcDraw.GetSafeHdc() != NULL );
  125. ASSERT( hBrush != NULL );
  126. HGDIOBJ hBrushOld = m_dcDraw.SelectObject( hBrush );
  127. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  128. bool bTabShape = false;
  129. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  130. switch( m_eDTAT )
  131. {
  132. case __EDTAT_RESIZING_ENTIRE_ROW:
  133. case __EDTAT_RESIZING_PART_OF_ROW:
  134. m_dcDraw.PatBlt(
  135. m_rcDrawArea.left,
  136. m_rcDrawArea.top,
  137. m_rcDrawArea.Width(),
  138. m_rcDrawArea.Height(),
  139. dwPatBltROP
  140. );
  141. break;
  142. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  143. case __EDTAT_TAB_FRAME:
  144. bTabShape = true;
  145. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  146. case __EDTAT_RECTANGULAR_FRAME:
  147. {
  148. INT nTrackerBorderH = ::GetSystemMetrics( SM_CXSIZEFRAME );
  149. INT nTrackerBorderV = ::GetSystemMetrics( SM_CYSIZEFRAME );
  150. CRect rcTrackerInner( m_rcDrawArea );
  151. rcTrackerInner.DeflateRect(
  152. nTrackerBorderH,
  153. nTrackerBorderV
  154. );
  155. bool bRgnCreated = false;
  156. CRgn
  157. rgnPaint,
  158. rgnInner, rgnOuter,
  159. rgnTabMainArea,
  160. rgnTabBottomLeftArea,
  161. rgnTabBottomMiddleArea,
  162. rgnTabBottomRightArea;
  163. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  164. if( bTabShape )
  165. {
  166. int nTabHeight = CExtControlBar::g_nTabShapeMaxHeight;
  167. int nTrackerHeight = m_rcDrawArea.Height();
  168. if( nTrackerHeight < (CExtControlBar::g_nTabShapeMaxHeight * 2) )
  169. nTabHeight = nTrackerHeight / 2;
  170. //if( nTabHeight >= (nTrackerBorderV * 3 + 3) )
  171. //{
  172. CRect rcTabMainArea( rcTrackerInner );
  173. if( CExtControlBar::g_bTabsAtTop )
  174. rcTabMainArea.top += nTabHeight;
  175. else
  176. rcTabMainArea.bottom -= nTabHeight;
  177. ASSERT( rcTabMainArea.bottom > rcTabMainArea.top );
  178. CRect rcTabBottomLeftArea( m_rcDrawArea );
  179. rcTabBottomLeftArea.right =
  180. rcTabBottomLeftArea.left
  181. + CExtControlBar::g_nTabShapeBottomLeftAreaWidth
  182. ;
  183. if( CExtControlBar::g_bTabsAtTop )
  184. rcTabBottomLeftArea.bottom =
  185. rcTabBottomLeftArea.top + nTabHeight;
  186. else
  187. rcTabBottomLeftArea.top =
  188. rcTabBottomLeftArea.bottom - nTabHeight;
  189. CRect rcTabBottomMiddleArea( rcTabBottomLeftArea );
  190. rcTabBottomMiddleArea.OffsetRect(
  191. nTrackerBorderH + rcTabBottomLeftArea.Width(),
  192. CExtControlBar::g_bTabsAtTop ? nTrackerBorderV : (-nTrackerBorderV)
  193. );
  194. rcTabBottomMiddleArea.right =
  195. rcTabBottomMiddleArea.left
  196. + CExtControlBar::g_nTabShapeBottomMiddleAreaWidth
  197. ;
  198. if( rcTabBottomMiddleArea.right > rcTrackerInner.right )
  199. rcTabBottomMiddleArea.right = 
  200. rcTabBottomMiddleArea.left
  201. + (rcTrackerInner.right - rcTabBottomMiddleArea.left) / 2
  202. ;
  203. CRect rcTabBottomRightArea( rcTabBottomLeftArea );
  204. rcTabBottomRightArea.right = m_rcDrawArea.right;
  205. rcTabBottomRightArea.left =
  206. rcTabBottomMiddleArea.right
  207. + nTrackerBorderH;
  208. if( m_wndBar.m_pDockSite != NULL )
  209. {
  210. ASSERT_VALID( m_wndBar.m_pDockSite );
  211. ASSERT( m_wndBar.m_pDockSite->GetSafeHwnd() != NULL );
  212. if( (m_wndBar.m_pDockSite->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  213. {
  214. rcTabBottomRightArea.left =
  215. rcTabBottomRightArea.right
  216. - rcTabBottomLeftArea.Width()
  217. - nTrackerBorderH
  218. ;
  219. rcTabBottomMiddleArea.OffsetRect(
  220. rcTabBottomRightArea.left
  221. - rcTabBottomMiddleArea.right
  222. - nTrackerBorderH
  223. ,
  224. 0
  225. );
  226. rcTabBottomLeftArea.right =
  227. rcTabBottomMiddleArea.left
  228. - nTrackerBorderH
  229. ;
  230. } // if( (m_wndBar.m_pDockSite->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  231. } // if( m_wndBar.m_pDockSite != NULL )
  232. if( rgnOuter.CreateRectRgnIndirect(
  233. &m_rcDrawArea
  234. )
  235. && rgnTabMainArea.CreateRectRgnIndirect(
  236. &rcTabMainArea
  237. )
  238. && rgnTabBottomLeftArea.CreateRectRgnIndirect(
  239. &rcTabBottomLeftArea
  240. )
  241. && rgnTabBottomMiddleArea.CreateRectRgnIndirect(
  242. &rcTabBottomMiddleArea
  243. )
  244. && rgnTabBottomRightArea.CreateRectRgnIndirect(
  245. &rcTabBottomRightArea
  246. )
  247. && rgnPaint.CreateRectRgnIndirect(
  248. &m_rcDrawArea
  249. )
  250. )
  251. { // if regions created successfully
  252. int nRgnPaintCombineResult = 
  253. rgnTabMainArea.CombineRgn(
  254. &rgnTabMainArea,
  255. &rgnTabBottomLeftArea,
  256. RGN_OR
  257. );
  258. if( nRgnPaintCombineResult != ERROR
  259. && nRgnPaintCombineResult != NULLREGION
  260. )
  261. {
  262. nRgnPaintCombineResult = 
  263. rgnTabMainArea.CombineRgn(
  264. &rgnTabMainArea,
  265. &rgnTabBottomMiddleArea,
  266. RGN_OR
  267. );
  268. if( nRgnPaintCombineResult != ERROR
  269. && nRgnPaintCombineResult != NULLREGION
  270. )
  271. {
  272. nRgnPaintCombineResult = 
  273. rgnTabMainArea.CombineRgn(
  274. &rgnTabMainArea,
  275. &rgnTabBottomRightArea,
  276. RGN_OR
  277. );
  278. if( nRgnPaintCombineResult != ERROR
  279. && nRgnPaintCombineResult != NULLREGION
  280. )
  281. {
  282. nRgnPaintCombineResult = 
  283. rgnPaint.CombineRgn(
  284. &rgnPaint,
  285. &rgnTabMainArea,
  286. RGN_DIFF
  287. );
  288. if( nRgnPaintCombineResult != ERROR
  289. && nRgnPaintCombineResult != NULLREGION
  290. )
  291. { // if paint region created successfully & non-empty
  292. bRgnCreated = true;
  293. } // if paint region created successfully & non-empty
  294. }
  295. }
  296. }
  297. } // if regions created successfully
  298. //} // if( nTabHeight >= (nTrackerBorderV * 3  + 3) )
  299. } // if( bTabShape )
  300. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  301. if( ! bRgnCreated )
  302. { // create non-tabbed shape
  303. if( rgnOuter.CreateRectRgnIndirect(
  304. &m_rcDrawArea
  305. )
  306. && rgnInner.CreateRectRgnIndirect(
  307. &rcTrackerInner
  308. )
  309. && rgnPaint.CreateRectRgn(0,0,0,0)
  310. )
  311. { // if regions created successfully
  312. int nRgnPaintCombineResult =
  313. rgnPaint.CombineRgn(
  314. &rgnOuter,
  315. &rgnInner,
  316. RGN_DIFF
  317. );
  318. if( nRgnPaintCombineResult != ERROR
  319. && nRgnPaintCombineResult != NULLREGION
  320. )
  321. { // if paint region created successfully & non-empty
  322. bRgnCreated = true;
  323. } // if paint region created successfully & non-empty
  324. } // if regions created successfully
  325. } // create non-tabbed shape
  326. if( bRgnCreated )
  327. { // if we have sense to paint pattern
  328. m_dcDraw.SelectClipRgn( &rgnPaint );
  329. m_dcDraw.PatBlt(
  330. m_rcDrawArea.left,
  331. m_rcDrawArea.top,
  332. m_rcDrawArea.Width(),
  333. m_rcDrawArea.Height(),
  334. dwPatBltROP
  335. );
  336. m_dcDraw.SelectClipRgn( NULL );
  337. } // if we have sense to paint pattern
  338. }
  339. break;
  340. #ifdef _DEBUG
  341. default:
  342. {
  343. ASSERT( FALSE );
  344. }
  345. break;
  346. #endif // _DEBUG
  347. } // switch( m_eDTAT )
  348. m_dcDraw.SelectObject( hBrushOld );
  349. }
  350. #if (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  351. /////////////////////////////////////////////////////////////////////////////
  352. // CExtDynamicBarNcAreaButtonMenu
  353. IMPLEMENT_DYNCREATE( CExtDynamicBarNcAreaButtonMenu, CExtBarNcAreaButtonMenu );
  354. CExtDynamicBarNcAreaButtonMenu::CExtDynamicBarNcAreaButtonMenu(
  355. CExtControlBar * pBar // = NULL
  356. )
  357. : CExtBarNcAreaButtonMenu( pBar )
  358. {
  359. }
  360. bool CExtDynamicBarNcAreaButtonMenu::OnQueryVisibility() const
  361. {
  362. ASSERT_VALID( this );
  363. bool bButtonIsVisible = true;
  364. CExtControlBar * pBar = const_cast < CExtControlBar * > ( GetBar() );
  365. ASSERT_VALID( pBar );
  366. if( pBar->NcButtons_HandleQueryVisibility(
  367. bButtonIsVisible,
  368. const_cast < CExtDynamicBarNcAreaButtonMenu * > ( this ),
  369. pBar,
  370. NULL
  371. )
  372. )
  373. return bButtonIsVisible;
  374. if( ! pBar->IsKindOf( RUNTIME_CLASS(CExtDynamicControlBar) ) )
  375. {
  376. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  377. CExtDynamicTabbedControlBar * pDTB =
  378. DYNAMIC_DOWNCAST( CExtDynamicTabbedControlBar, pBar );
  379. if( pDTB == NULL )
  380. return false;
  381. LONG nSel = pDTB->GetSwitcherSelection();
  382. if( nSel < 0 )
  383. return false;
  384. CExtControlBar * pSelBar = pDTB->GetBarAt( nSel, true );
  385. if( pSelBar == NULL )
  386. return false;
  387. if( ! pSelBar->IsKindOf( RUNTIME_CLASS(CExtDynamicControlBar) ) )
  388. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  389. return false;
  390. }
  391. if( ! pBar->_NcMenuButtonIsEnabled( pBar ) )
  392. return false;
  393. if( IsBarFixedMode() )
  394. return false;
  395. return true;
  396. }
  397. bool CExtDynamicBarNcAreaButtonMenu::OnQueryDeactivateAutohideSlider() const
  398. {
  399. ASSERT_VALID( this );
  400. return false;
  401. }
  402. bool CExtDynamicBarNcAreaButtonMenu::OnNcAreaClicked( CPoint point )
  403. {
  404. ASSERT_VALID( this );
  405. m_bHover = m_bPushed = false;
  406. CExtControlBar * pExtBar = GetBar();
  407. ASSERT_VALID( pExtBar );
  408. HWND hWndBar = pExtBar->GetSafeHwnd();
  409. if( pExtBar->NcButtons_HandleClick( this, point, pExtBar, NULL ) )
  410. return true;
  411. ASSERT_VALID( pExtBar );
  412. CExtDynamicControlBar * pBar =
  413. DYNAMIC_DOWNCAST(
  414. CExtDynamicControlBar,
  415. pExtBar
  416. );
  417. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  418. if( pBar == NULL )
  419. {
  420. CExtDynamicTabbedControlBar * pTabbedBar =
  421. STATIC_DOWNCAST(
  422. CExtDynamicTabbedControlBar,
  423. pExtBar
  424. );
  425. LONG nSel = pTabbedBar->GetSwitcherSelection();
  426. if( nSel < 0 )
  427. {
  428. if( pTabbedBar->GetSwitcherItemCount() == 0 )
  429. return true;
  430. nSel = 0;
  431. }
  432. pBar =
  433. DYNAMIC_DOWNCAST(
  434. CExtDynamicControlBar,
  435. pTabbedBar->GetBarAt(
  436. nSel,
  437. true
  438. )
  439. );
  440. if( pBar == NULL )
  441. return true;
  442. } // if( pBar == NULL )
  443. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  444. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  445. CExtCustomizeSite * pSite = pBar->NotifiedCustomizeSiteGet();
  446. if( pSite != NULL
  447. && pSite->IsCustomizeMode()
  448. )
  449. {
  450. if( hWndBar != NULL
  451. && ::IsWindow( hWndBar )
  452. )
  453. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  454. return true;
  455. }
  456. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  457. if( CExtControlBar::FindHelpMode( pBar ) )
  458. {
  459. return true;
  460. }
  461. if( ! m_rc.PtInRect( point ) )
  462. {
  463. if( hWndBar != NULL
  464. && ::IsWindow( hWndBar )
  465. )
  466. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  467. return false; // continue asking nc-buttons
  468. }
  469. //CFrameWnd * pFrame = GetDockingFrame();
  470. // ASSERT_VALID( pFrame );
  471. //HWND hWndTrack = pFrame->GetSafeHwnd();
  472. HWND hWndTrack = pBar->GetSafeHwnd();
  473. ASSERT(
  474. hWndTrack != NULL
  475. && ::IsWindow( hWndTrack )
  476. );
  477. CExtPopupMenuWnd * pPopup =
  478. CExtPopupMenuWnd::InstantiatePopupMenu(
  479. pExtBar->GetSafeHwnd(),
  480. RUNTIME_CLASS(CExtPopupMenuWnd),
  481. this
  482. );
  483. if( ! pPopup->CreatePopupMenu( hWndTrack ) )
  484. {
  485. ASSERT( FALSE );
  486. delete pPopup;
  487. if( hWndBar != NULL
  488. && ::IsWindow( hWndBar )
  489. )
  490. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  491. return false;
  492. }
  493. CExtControlBar::POPUP_MENU_EVENT_DATA _pmed(
  494. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CONTROLBAR_NCBTNMENU_DYNSTATE,
  495. pPopup,
  496. m_pBar,
  497. CPoint( -1, -1 ),
  498. WM_NCLBUTTONDOWN,
  499. this
  500. );
  501. if( ! _pmed.NotifyTarget( false ) )
  502. {
  503. if( ! pBar->OnInitDbsMenu(
  504. pPopup,
  505. hWndTrack,
  506. this
  507. )
  508. )
  509. {
  510. ASSERT( FALSE );
  511. delete pPopup;
  512. if( hWndBar != NULL
  513. && ::IsWindow( hWndBar )
  514. )
  515. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  516. return false;
  517. }
  518. } // if( ! _pmed.NotifyTarget( false ) )
  519. _pmed.NotifyTarget( true );
  520. if( pPopup->ItemGetCount() == 0 )
  521. {
  522. delete pPopup;
  523. if( hWndBar != NULL
  524. && ::IsWindow( hWndBar )
  525. )
  526. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  527. return false;
  528. }
  529. CRect rcBarWnd;
  530. VERIFY( GetBarNcAreaInfo( NULL, &rcBarWnd ) );
  531. CRect rcBtnScreen( m_rc );
  532. m_bHover = m_bPushed = true;
  533. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  534. if( pBar->AutoHideModeGet() )
  535. {
  536. CExtDynAutoHideArea * pTabs =
  537. CExtDynAutoHideArea::stat_FindAreaOfBar( pBar );
  538. if( pTabs == NULL )
  539. return true;
  540. CExtDynAutoHideSlider * pSlider =
  541. pTabs->GetAutoHideSlider();
  542. ASSERT_VALID( pSlider );
  543. if( CExtControlBar::stat_QueryFocusChangingEnabled( pBar, pSlider->m_hWnd ) )
  544. pSlider->SetFocus();
  545. pSlider->PostMessage( WM_NCPAINT );
  546. } // if( pBar->AutoHideModeGet() )
  547. else
  548. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  549. {
  550. if( CExtControlBar::stat_QueryFocusChangingEnabled( pBar, pBar->m_hWnd ) )
  551. pBar->SetFocus();
  552. ((CExtDynamicControlBar *)pBar)->m_bWindowActive = true;
  553. pBar->PostMessage( WM_NCPAINT );
  554. HWND hWndBar = pBar->m_hWnd;
  555. CExtPopupMenuWnd::PassMsgLoop( true );
  556. if( ! ::IsWindow(hWndBar) )
  557. return true;
  558. }
  559. CExtPaintManager::stat_PassPaintMessages();
  560. rcBtnScreen.InflateRect( 1, 1 );
  561. rcBtnScreen.OffsetRect( rcBarWnd.TopLeft() );
  562. CPoint ptCursor = rcBtnScreen.CenterPoint();
  563. if( ! pPopup->TrackPopupMenu(
  564. TPMX_TOPALIGN|TPMX_COMBINE_NONE|TPMX_OWNERDRAW_FIXED,
  565. ptCursor.x,  ptCursor.y,
  566. &rcBtnScreen,
  567. this,
  568. _CbPaintCombinedContent,
  569. NULL,
  570. true
  571. )
  572. )
  573. {
  574. //delete pPopup;
  575. if( hWndBar != NULL
  576. && ::IsWindow( hWndBar )
  577. )
  578. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  579. return false;
  580. }
  581. if( hWndBar != NULL
  582. && ::IsWindow( hWndBar )
  583. )
  584. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  585. return true;
  586. }
  587. /////////////////////////////////////////////////////////////////////////////
  588. // CExtDynamicBarNcAreaButtonAutoHide
  589. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  590. IMPLEMENT_DYNCREATE( CExtDynamicBarNcAreaButtonAutoHide, CExtBarNcAreaButtonAutoHide );
  591. CExtDynamicBarNcAreaButtonAutoHide::CExtDynamicBarNcAreaButtonAutoHide(
  592. CExtControlBar * pBar // = NULL
  593. )
  594. : CExtBarNcAreaButtonAutoHide( pBar )
  595. {
  596. }
  597. bool CExtDynamicBarNcAreaButtonAutoHide::OnNcAreaClicked( CPoint point )
  598. {
  599. ASSERT_VALID( this );
  600. CExtControlBar * pExtBar = GetBar();
  601. ASSERT_VALID( pExtBar );
  602. HWND hWndBar = pExtBar->GetSafeHwnd();
  603. if( pExtBar->NcButtons_HandleClick( this, point, pExtBar, NULL ) )
  604. return true;
  605. ASSERT_VALID( pExtBar );
  606. bool bRetVal = CExtBarNcAreaButtonAutoHide::OnNcAreaClicked( point );
  607. if( bRetVal )
  608. {
  609. m_bHover = m_bPushed = false;
  610. CExtDynTabControlBar * pTabbedBar =
  611. DYNAMIC_DOWNCAST(
  612. CExtDynTabControlBar,
  613. pExtBar
  614. );
  615. if( pTabbedBar == NULL )
  616. {
  617. CExtDockDynTabBar * pDynDockBar =
  618. DYNAMIC_DOWNCAST(
  619. CExtDockDynTabBar,
  620. pExtBar->GetParent()
  621. );
  622. if( pDynDockBar != NULL )
  623. {
  624. pTabbedBar =
  625. STATIC_DOWNCAST(
  626. CExtDynTabControlBar,
  627. pDynDockBar->GetParent()
  628. );
  629. } // if( pDynDockBar != NULL )
  630. } // if( pTabbedBar == NULL )
  631. if( pTabbedBar != NULL )
  632. {
  633. LONG nPos, nCount = pTabbedBar->GetSwitcherItemCount();
  634. for( nPos = 0; nPos < nCount; nPos++ )
  635. {
  636. CExtControlBar * pContainedBar =
  637. pTabbedBar->GetBarAt( nPos, true );
  638. CExtDynamicControlBar * pDynamicBar =
  639. DYNAMIC_DOWNCAST( CExtDynamicControlBar, pContainedBar );
  640. if( pDynamicBar != NULL )
  641. {
  642. if( pDynamicBar->m_eDBS != CExtDynamicControlBar::__EDBS_DOCUMENT )
  643. pDynamicBar->m_eDBS =
  644. pDynamicBar->AutoHideModeGet()
  645. ? CExtDynamicControlBar::__EDBS_AUTO_HIDDEN
  646. : CExtDynamicControlBar::__EDBS_DOCKED
  647. ;
  648. } // if( pDynamicBar != NULL )
  649. } // for( nPos = 0; nPos < nCount; nPos++ )
  650. } // if( pTabbedBar != NULL )
  651. else
  652. {
  653. CExtDynamicControlBar * pDynamicBar =
  654. DYNAMIC_DOWNCAST( CExtDynamicControlBar, pExtBar );
  655. if( pDynamicBar != NULL )
  656. pDynamicBar->m_eDBS =
  657. pDynamicBar->AutoHideModeGet()
  658. ? CExtDynamicControlBar::__EDBS_AUTO_HIDDEN
  659. : CExtDynamicControlBar::__EDBS_DOCKED
  660. ;
  661. } // else if( pTabbedBar != NULL )
  662. // ASSERT_VALID( pExtBar->m_pDockBar );
  663. // CExtDockBar * pExtDockBar =
  664. // STATIC_DOWNCAST(
  665. // CExtDockBar,
  666. // pExtBar->m_pDockBar
  667. // );
  668. // CExtDynAutoHideArea * pAutoHideArea =
  669. // pExtDockBar->_GetAutoHideArea();
  670. // ASSERT_VALID( pAutoHideArea );
  671. // CExtDynAutoHideSlider * pAutoHideSlider =
  672. // pAutoHideArea->GetAutoHideSlider();
  673. // ASSERT_VALID( pAutoHideSlider );
  674. // CExtPopupMenuWnd::PassMsgLoop( false );
  675. // pAutoHideSlider->PostMessage( WM_NCPAINT );
  676. }
  677. if( hWndBar != NULL
  678. && ::IsWindow( hWndBar )
  679. )
  680. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  681. return bRetVal;
  682. }
  683. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  684. /////////////////////////////////////////////////////////////////////////////
  685. // CExtDynamicBarNcAreaButtonClose
  686. IMPLEMENT_DYNCREATE( CExtDynamicBarNcAreaButtonClose, CExtBarNcAreaButtonClose );
  687. CExtDynamicBarNcAreaButtonClose::CExtDynamicBarNcAreaButtonClose(
  688. CExtControlBar * pBar // = NULL
  689. )
  690. : CExtBarNcAreaButtonClose( pBar )
  691. {
  692. }
  693. bool CExtDynamicBarNcAreaButtonClose::OnNcAreaClicked( CPoint point )
  694. {
  695. ASSERT_VALID( this );
  696. if( ! m_rc.PtInRect( point ) )
  697. return false; // continue asking nc-buttons
  698. m_bHover = m_bPushed = false;
  699. CExtControlBar * pExtBar = GetBar();
  700. ASSERT_VALID( pExtBar );
  701. HWND hWndBar = pExtBar->GetSafeHwnd();
  702. CExtBarNcAreaButtonClose::OnNcAreaClicked( point );
  703. if( hWndBar == NULL
  704. || (! ::IsWindow( hWndBar ) )
  705. )
  706. return true;
  707.   if( pExtBar->NcButtons_HandleClick( this, point, pExtBar, NULL ) )
  708.   return true;
  709. if( hWndBar == NULL
  710. || (! ::IsWindow( hWndBar ) )
  711. )
  712. return true;
  713. ASSERT_VALID( pExtBar );
  714. CExtDynamicControlBar * pBar =
  715. DYNAMIC_DOWNCAST(
  716. CExtDynamicControlBar,
  717. pExtBar
  718. );
  719. if( pBar != NULL )
  720. pBar->BarStateSet( pBar->BarStateGet(), false );
  721. if( hWndBar != NULL
  722. && ::IsWindow( hWndBar )
  723. )
  724. pExtBar->NcButtons_PostClick( this, point, pExtBar, NULL );
  725.   return true;
  726. }
  727. /////////////////////////////////////////////////////////////////////////////
  728. // CExtDynamicControlBar
  729. IMPLEMENT_SERIAL( CExtDynamicControlBar, CExtControlBar, VERSIONABLE_SCHEMA|1 );
  730. bool CExtDynamicControlBar::g_bInsertToHeadOfTPC = true;
  731. CExtDynamicControlBar::CExtDynamicControlBar()
  732. : m_bPersistentBar( false )
  733. , m_pDBS( NULL )
  734. , m_eDBS( CExtDynamicControlBar::__EDBS_DOCKED )
  735. , m_hWndChildCached( NULL )
  736. , m_nMdiMenuResourceID( 0 )
  737. , m_nMdiAccelTableResourceID( 0 )
  738. , m_dwAdditionalStateFlags( CExtDynamicControlBar::__EASF_INIT_VALUE )
  739. , m_eHelperSwitchingDBS( CExtDynamicControlBar::__EDBS_DOCKED )
  740. , m_bHelperSwitchingIntoVisibleState( false )
  741. , m_bInsertToHeadOfTPC( g_bInsertToHeadOfTPC )
  742. {
  743. }
  744. CExtDynamicControlBar::~CExtDynamicControlBar()
  745. {
  746. if( m_pDockContext != NULL )
  747. {
  748. m_pDockContext->m_pDockSite = NULL;
  749. delete m_pDockContext;
  750. m_pDockContext = NULL;
  751. } // if( m_pDockContext != NULL )
  752. }
  753. bool CExtDynamicControlBar::IsPersistentBar() const
  754. {
  755. ASSERT_VALID( this );
  756. return m_bPersistentBar;
  757. }
  758. void CExtDynamicControlBar::OnGetBarCaptionText(
  759. CExtControlBar::e_bar_caption_text_t eBCT,
  760. CExtSafeString & strCaptionText
  761. ) const
  762. {
  763. ASSERT_VALID( this );
  764. if( ! m_strCaptionText.IsEmpty() )
  765. {
  766. strCaptionText = m_strCaptionText;
  767. return;
  768. } // if( ! m_strCaptionText.IsEmpty() )
  769. CExtControlBar::OnGetBarCaptionText(
  770. eBCT,
  771. strCaptionText
  772. );
  773. }
  774. bool CExtDynamicControlBar::NcButtons_HandleClick(
  775. CExtBarNcAreaButton * pNcAreaButton,
  776. CPoint point,
  777. CExtControlBar * pBarEventSource,
  778. CExtControlBar * pBarActiveInContainer
  779. )
  780. {
  781. ASSERT_VALID( this );
  782. #ifdef _DEBUG
  783. if( pBarEventSource != NULL )
  784. {
  785. ASSERT_VALID( pNcAreaButton );
  786. }
  787. if( pBarEventSource != NULL )
  788. {
  789. ASSERT_VALID( pBarEventSource );
  790. }
  791. #endif // _DEBUG
  792. return
  793. CExtControlBar::NcButtons_HandleClick(
  794. pNcAreaButton,
  795. point,
  796. pBarEventSource,
  797. pBarActiveInContainer
  798. );
  799. }
  800. void CExtDynamicControlBar::NcButtons_PostClick(
  801. CExtBarNcAreaButton * pNcAreaButton,
  802. CPoint point,
  803. CExtControlBar * pBarEventSource,
  804. CExtControlBar * pBarActiveInContainer
  805. )
  806. {
  807. ASSERT_VALID( this );
  808. #ifdef _DEBUG
  809. if( pBarEventSource != NULL )
  810. {
  811. ASSERT_VALID( pNcAreaButton );
  812. }
  813. if( pBarEventSource != NULL )
  814. {
  815. ASSERT_VALID( pBarEventSource );
  816. }
  817. #endif // _DEBUG
  818. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  819. if( (! IsCloseOnlyOneBarInTabGroup() )
  820. && pNcAreaButton->IsKindOf( RUNTIME_CLASS(CExtBarNcAreaButtonClose) )
  821. )
  822. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  823. {
  824. bool bIsVisible = false;
  825. CExtDynamicControlBar::eDynamicBarState_t eDBS =
  826. BarStateGet( &bIsVisible );
  827. if( bIsVisible
  828. && ( eDBS == CExtDynamicControlBar::__EDBS_DOCKED
  829. || eDBS == CExtDynamicControlBar::__EDBS_FLOATING
  830. )
  831. )
  832. BarStateSet( eDBS, false );
  833. }// if( pNcAreaButton->IsKindOf( RUNTIME_CLASS(CExtBarNcAreaButtonClose) ) )
  834. CExtControlBar::NcButtons_PostClick(
  835. pNcAreaButton,
  836. point,
  837. pBarEventSource,
  838. pBarActiveInContainer
  839. );
  840. }
  841. CExtDynamicBarSite * CExtDynamicControlBar::GetBarSite()
  842. {
  843. ASSERT_VALID( this );
  844. if( m_pDBS == NULL )
  845. m_pDBS = CExtDynamicBarSite::FindBarSite( this );
  846. return m_pDBS;
  847. }
  848. void CExtDynamicControlBar::PostNcDestroy()
  849. {
  850. ASSERT_VALID( this );
  851. delete this;
  852. }
  853. void CExtDynamicControlBar::OnNcAreaButtonsReinitialize()
  854. {
  855. ASSERT_VALID( this );
  856. INT nCountOfNcButtons = NcButtons_GetCount();
  857. if( nCountOfNcButtons > 0 )
  858. return;
  859. NcButtons_Add( new CExtDynamicBarNcAreaButtonClose(this) );
  860. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  861. NcButtons_Add( new CExtDynamicBarNcAreaButtonAutoHide(this) );
  862. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  863. NcButtons_Add( new CExtDynamicBarNcAreaButtonMenu(this) );
  864. }
  865. LRESULT CExtDynamicControlBar::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  866. {
  867. switch( message )
  868. {
  869. case WM_DESTROY:
  870. {
  871. CExtDynamicBarSite * pDBS = GetBarSite();
  872. if( pDBS != NULL ) // shutdown mode issue
  873. pDBS->_BarFreeImpl( this, true, false );
  874. return 0;
  875. }
  876. break; // case WM_DESTROY
  877. case WM_COMMAND:
  878. {
  879. UINT nCmdID = (UINT)wParam;
  880. switch( nCmdID )
  881. {
  882. case ID_EXT_DYN_BAR_FLOATING:
  883. BarStateSet( __EDBS_FLOATING, true );
  884. break;
  885. case ID_EXT_DYN_BAR_DOCKABLE:
  886. BarStateSet( __EDBS_DOCKED, true );
  887. break;
  888. case ID_EXT_DYN_BAR_TABBED_DOCUMENT:
  889. case ID_EXT_DYN_BAR_MDI_DOCUMENT:
  890. BarStateSet( __EDBS_DOCUMENT, true );
  891. break;
  892. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  893. case ID_EXT_DYN_BAR_AUTO_HIDE:
  894. BarStateSet( __EDBS_AUTO_HIDDEN, true );
  895. break;
  896. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  897. case ID_EXT_DYN_BAR_HIDE:
  898. BarStateSet( BarStateGet(), false );
  899. break;
  900. default:
  901. return CExtControlBar::WindowProc( message, wParam, lParam );                                
  902. } // switch( nCmdID )
  903. return 0;
  904. }
  905. break; // case WM_COMMAND
  906. case WM_SHOWWINDOW:
  907. case WM_SIZE:
  908. case WM_WINDOWPOSCHANGED:
  909. {
  910. if( m_pDockSite == NULL
  911. || (! ProfileBarStateIsSerializing( m_pDockSite ) )
  912. )
  913. {
  914. if( IsVisible() )
  915. {
  916. m_dwAdditionalStateFlags &= ~__EASF_INVISIBLE;
  917. }
  918. else
  919. {
  920. eDynamicBarState_t eDBS = BarStateGet();
  921. if( eDBS == __EDBS_FLOATING || eDBS == __EDBS_DOCKED )
  922. m_dwAdditionalStateFlags |= __EASF_INVISIBLE;
  923. }
  924. }
  925. }
  926. break;
  927. } // switch( message )
  928. return CExtControlBar::WindowProc( message, wParam, lParam );
  929. }
  930. bool CExtDynamicControlBar::_CanDockLTRB(
  931. CExtControlBar * pDestBar
  932. ) const
  933. {
  934. ASSERT_VALID( this );
  935. ASSERT_VALID( pDestBar );
  936. eDynamicBarState_t eDBS = BarStateGet();
  937. if( eDBS != __EDBS_DOCKED )
  938. return false;
  939. CExtDynamicControlBar * pSameKindOfBar =
  940. DYNAMIC_DOWNCAST(
  941. CExtDynamicControlBar,
  942. pDestBar
  943. );
  944. if( pSameKindOfBar != NULL )
  945. {
  946. CExtDynamicControlBar::eDynamicBarState_t eDBS =
  947. pSameKindOfBar->BarStateGet();
  948. if( eDBS != CExtDynamicControlBar::__EDBS_DOCKED )
  949. return false;
  950. } // if( pSameKindOfBar != NULL )
  951. return CExtControlBar::_CanDockLTRB( pDestBar );
  952. }
  953. bool CExtDynamicControlBar::_CanDockToTabbedContainers(
  954. CExtControlBar * pDestBar
  955. ) const
  956. {
  957. ASSERT_VALID( this );
  958. ASSERT_VALID( pDestBar );
  959. return _CanDockLTRB( pDestBar );
  960. }
  961. void CExtDynamicControlBar::_DraggingUpdateState(
  962. const CPoint & point,
  963. bool bForceFloatMode
  964. )
  965. {
  966. ASSERT_VALID( this );
  967. CExtControlBar::_DraggingUpdateState(
  968. point,
  969. ( BarStateGet() == __EDBS_FLOATING )
  970. ? true
  971. : bForceFloatMode
  972. );
  973. }
  974. bool CExtDynamicControlBar::OnQueryUseCheckMarkCommand()
  975. {
  976. ASSERT_VALID( this );
  977. return false;
  978. }
  979. bool CExtDynamicControlBar::OnInitDbsMenu(
  980. CExtPopupMenuWnd * pPopup,
  981. HWND hWndTrack,
  982. CObject * pHelperSrc,
  983. LPARAM lParamHelper // = 0
  984. )
  985. {
  986. ASSERT_VALID( this );
  987. ASSERT_VALID( pPopup );
  988. ASSERT( hWndTrack != NULL && ::IsWindow( hWndTrack ) );
  989. ASSERT_VALID( pHelperSrc );
  990. pHelperSrc;
  991. lParamHelper;
  992. CExtDynamicBarSite * pDBS = GetBarSite();
  993. if( pDBS == NULL )
  994. {
  995. ASSERT( FALSE );
  996. return false;
  997. }
  998. CExtDynamicBarSite::eDetectedUiType_t eDUIT =
  999. pDBS->GetDetectedUiType();
  1000. if( eDUIT == CExtDynamicBarSite::__EDUIT_UNSUPPORTED_ENVIRONMENT )
  1001. {
  1002. ASSERT( FALSE );
  1003. return false;
  1004. }
  1005. INT nCountInitial = pPopup->ItemGetCount();
  1006. if( nCountInitial == 0 )
  1007. {
  1008. if( ! pPopup->LoadMenu(
  1009. hWndTrack,
  1010. IDR_NC_MENU_DYN_BAR,
  1011. true,
  1012. true
  1013. )
  1014. )
  1015. {
  1016. ASSERT( FALSE );
  1017. return false;
  1018. }
  1019. } // if( nCountInitial == 0 )
  1020. else
  1021. {
  1022. if( ! pPopup->ItemGetInfo( nCountInitial - 1 ).IsSeparator() )
  1023. {
  1024. VERIFY( pPopup->ItemInsert() );
  1025. nCountInitial++;
  1026. } // if( ! pPopup->ItemGetInfo( nCountInitial - 1 ).IsSeparator() )
  1027. CMenu _menu;
  1028. if( ! g_ResourceManager->LoadMenu(
  1029. _menu,
  1030. IDR_NC_MENU_DYN_BAR
  1031. )
  1032. )
  1033. {
  1034. ASSERT( FALSE );
  1035. return false;
  1036. }
  1037. ASSERT( _menu.GetSafeHmenu() != NULL );
  1038. CMenu * pSubMenu = _menu.GetSubMenu( 0 );
  1039. if( pSubMenu == NULL )
  1040. {
  1041. ASSERT( FALSE );
  1042. return false;
  1043. }
  1044. INT nPos;
  1045. INT nCount = (INT)pSubMenu->GetMenuItemCount();
  1046. for( nPos = 0; nPos < nCount; nPos++ )
  1047. {
  1048. CExtSafeString sMenuText;
  1049. MENUITEMINFO _mii;
  1050. ::memset( &_mii, 0, sizeof(MENUITEMINFO) );
  1051. _mii.cbSize = sizeof(MENUITEMINFO);
  1052. _mii.fMask =
  1053. MIIM_CHECKMARKS
  1054. |MIIM_DATA
  1055. |MIIM_ID
  1056. |MIIM_STATE
  1057. |MIIM_SUBMENU
  1058. |MIIM_TYPE
  1059. ;
  1060. _mii.cch = __MAX_UI_ITEM_TEXT;
  1061. _mii.dwTypeData = sMenuText.GetBuffer( 1024 );
  1062. ASSERT( _mii.dwTypeData != NULL );
  1063. if( _mii.dwTypeData == NULL )
  1064. {
  1065. ASSERT( FALSE );
  1066. continue;
  1067. }
  1068. if( ! ::GetMenuItemInfo(
  1069. pSubMenu->GetSafeHmenu(),
  1070. (UINT)nPos,
  1071. TRUE,
  1072. &_mii
  1073. )
  1074. )
  1075. {
  1076. sMenuText.ReleaseBuffer();
  1077. ASSERT( FALSE );
  1078. continue;
  1079. }
  1080. sMenuText.ReleaseBuffer();
  1081. if( (_mii.fType & MFT_SEPARATOR) != 0
  1082. || _mii.hSubMenu != NULL
  1083. )
  1084. continue;
  1085. if( ! CExtCmdManager::IsCommand( _mii.wID ) )
  1086. continue;
  1087. sMenuText.Replace( _T("n"), _T("") );
  1088. sMenuText.Replace( _T("r"), _T("") );
  1089. sMenuText.TrimLeft();
  1090. sMenuText.TrimRight();
  1091. if( sMenuText.IsEmpty() )
  1092. continue;
  1093. int nSep =
  1094. sMenuText.ReverseFind( _T('t') );
  1095. if( nSep >= 0 )
  1096. {
  1097. CExtSafeString sTmp;
  1098. sTmp = sMenuText.Left( nSep );
  1099. sTmp.TrimLeft();
  1100. sTmp.TrimRight();
  1101. sMenuText = sTmp;
  1102. } // if( nSep >= 0 )
  1103. VERIFY(
  1104. pPopup->ItemInsertCommand(
  1105. _mii.wID,
  1106. -1,
  1107. LPCTSTR(sMenuText),
  1108. NULL,
  1109. NULL,
  1110. false,
  1111. 0,
  1112. hWndTrack
  1113. )
  1114. );
  1115. } // for( nPos = 0; nPos < nCount; nPos++ )
  1116. } // else from if( nCountInitial == 0 )
  1117. CExtDynamicControlBar::eDynamicBarState_t eDBS =
  1118. BarStateGet();
  1119. INT nPos;
  1120. INT nCount = pPopup->ItemGetCount();
  1121. for( nPos = 0; nPos < nCount; nPos ++ )
  1122. {
  1123. CExtPopupMenuWnd::MENUITEMDATA & _mii = pPopup->ItemGetInfo( nPos );
  1124. if( _mii.IsPopup() || _mii.IsSeparator() )
  1125. continue;
  1126. UINT nCmdID = _mii.GetCmdID();
  1127. if( CExtCmdManager::IsSystemCommand( nCmdID ) )
  1128. {
  1129. _mii.SetNoCmdUI( true );
  1130. }
  1131. }
  1132. for( nPos = nCountInitial; nPos < nCount; )
  1133. {
  1134. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  1135. pPopup->ItemGetInfo( nPos );
  1136. if( _mii.IsPopup() || _mii.IsSeparator() )
  1137. {
  1138. nPos++; // fix by Dave Kymlicka
  1139. continue;
  1140. }
  1141. UINT nCmdID = _mii.GetCmdID();
  1142. switch( nCmdID )
  1143. {
  1144. case ID_EXT_DYN_BAR_FLOATING:
  1145. _mii.Check(
  1146. ( eDBS == CExtDynamicControlBar::__EDBS_FLOATING )
  1147. ? true : false
  1148. );
  1149. _mii.Enable(
  1150. ( ( eDBS == CExtDynamicControlBar::__EDBS_FLOATING
  1151. || eDBS == CExtDynamicControlBar::__EDBS_DOCKED
  1152. || eDBS == CExtDynamicControlBar::__EDBS_DOCUMENT
  1153. )
  1154. && _FloatStateChangingIsEnabled( this )
  1155. ) ? true : false
  1156. );
  1157. break;
  1158. case ID_EXT_DYN_BAR_DOCKABLE:
  1159. _mii.Check(
  1160. ( eDBS == CExtDynamicControlBar::__EDBS_DOCKED )
  1161. ? true : false
  1162. );
  1163. _mii.Enable(
  1164. ( ( eDBS == CExtDynamicControlBar::__EDBS_FLOATING
  1165. || eDBS == CExtDynamicControlBar::__EDBS_DOCKED
  1166. || eDBS == CExtDynamicControlBar::__EDBS_DOCUMENT
  1167. )
  1168. && _FloatStateChangingIsEnabled( this )
  1169. ) ? true : false
  1170. );
  1171. break;
  1172. case ID_EXT_DYN_BAR_TABBED_DOCUMENT:
  1173. case ID_EXT_DYN_BAR_MDI_DOCUMENT:
  1174. if( eDUIT == CExtDynamicBarSite::__EDUIT_MDI_ORDINARY )
  1175. {
  1176. if( nCmdID == ID_EXT_DYN_BAR_TABBED_DOCUMENT )
  1177. {
  1178. VERIFY( pPopup->ItemRemove( nPos ) );
  1179. nCount--;
  1180. continue;
  1181. }
  1182. }
  1183. else if(
  1184. eDUIT == CExtDynamicBarSite::__EDUIT_MDI_WITH_TABS
  1185. || eDUIT == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER
  1186. )
  1187. {
  1188. if( nCmdID == ID_EXT_DYN_BAR_MDI_DOCUMENT )
  1189. {
  1190. VERIFY( pPopup->ItemRemove( nPos ) );
  1191. nCount--;
  1192. continue;
  1193. }
  1194. }
  1195. _mii.Check(
  1196. ( eDBS == CExtDynamicControlBar::__EDBS_DOCUMENT )
  1197. ? true : false
  1198. );
  1199. _mii.Enable(
  1200. ( ( eDBS == CExtDynamicControlBar::__EDBS_FLOATING
  1201. || eDBS == CExtDynamicControlBar::__EDBS_DOCKED
  1202. || eDBS == CExtDynamicControlBar::__EDBS_DOCUMENT
  1203. )
  1204. && _FloatStateChangingIsEnabled( this )
  1205. ) ? true : false
  1206. );
  1207. break;
  1208. case ID_EXT_DYN_BAR_AUTO_HIDE:
  1209. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1210. _mii.Check(
  1211. ( eDBS == CExtDynamicControlBar::__EDBS_AUTO_HIDDEN )
  1212. ? true : false
  1213. );
  1214. _mii.Enable(
  1215. ( ( eDBS == CExtDynamicControlBar::__EDBS_AUTO_HIDDEN
  1216. || ( eDBS == CExtDynamicControlBar::__EDBS_DOCKED
  1217. && GetParentFrame() == m_pDockSite
  1218. )
  1219. )
  1220. && _AutoHidingIsEnabled( this )
  1221. ) ? true : false
  1222. );
  1223. #else
  1224. VERIFY( pPopup->ItemRemove( nPos ) );
  1225. nCount--;
  1226. continue;
  1227. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1228. break;
  1229. case ID_EXT_DYN_BAR_HIDE:
  1230. _mii.Check( false );
  1231. _mii.Enable( _ClosingIsEnabled( this ) );
  1232. break;
  1233. default:
  1234. _mii.Check( false );
  1235. _mii.Enable( false );
  1236. break;
  1237. } // switch( nCmdID )
  1238. nPos++;
  1239. } // for( nPos = nCountInitial; nPos < nCount; )
  1240. if( ! _ClosingIsEnabled( this ) )
  1241. {
  1242. INT nPosToRemove = pPopup->ItemFindPosForCmdID( SC_CLOSE );
  1243. for( ; nPosToRemove >= 0; nPosToRemove = pPopup->ItemFindPosForCmdID( SC_CLOSE ) )
  1244. {
  1245. pPopup->ItemRemove( nPosToRemove );
  1246. if( nPosToRemove > 0
  1247. && pPopup->ItemGetInfo( nPosToRemove -1 ).IsSeparator()
  1248. )
  1249. pPopup->ItemRemove( nPosToRemove - 1 );
  1250. } // for( ; nPosToRemove >= 0; nPosToRemove = pPopup->ItemFindPosForCmdID( SC_CLOSE ) )
  1251. } // if( ! _ClosingIsEnabled( this ) )
  1252. return true;
  1253. }
  1254. void CExtDynamicControlBar::PmBridge_OnPaintManagerChanged(
  1255. CExtPaintManager * pGlobalPM
  1256. )
  1257. {
  1258. m_icon.OnEmptyGeneratedBitmaps();
  1259. CExtControlBar::PmBridge_OnPaintManagerChanged( pGlobalPM );
  1260. }
  1261. HWND CExtDynamicControlBar::OnQueryChildHWND()
  1262. {
  1263. ASSERT_VALID( this );
  1264. ASSERT( GetSafeHwnd() != NULL );
  1265. HWND hWnd = ::GetWindow( m_hWnd, GW_CHILD );
  1266. if( m_hWndChildCached == NULL && hWnd != NULL )
  1267. m_hWndChildCached = hWnd;
  1268. return m_hWndChildCached;
  1269. }
  1270. void CExtDynamicControlBar::OnMoveChildToDocument()
  1271. {
  1272. ASSERT_VALID( this );
  1273. ASSERT( GetSafeHwnd() != NULL );
  1274. HWND hWndChild = OnQueryChildHWND();
  1275. if( hWndChild == NULL )
  1276. return;
  1277. CExtDynamicBarSite * pDBS = GetBarSite();
  1278. if( pDBS == NULL )
  1279. return;
  1280. CExtDynamicBarSite::eDetectedUiType_t eDUIT =
  1281. pDBS->GetDetectedUiType();
  1282. HWND hWndContainer = ::GetParent( hWndChild );
  1283. ASSERT( hWndContainer != NULL );
  1284. if( hWndContainer != m_hWnd )
  1285. {
  1286. CWnd * pWndPermanent = CWnd::FromHandlePermanent( hWndContainer );
  1287. if( pWndPermanent != NULL )
  1288. {
  1289. CExtDynamicMDIChildWnd * pWndMdiChild =
  1290. DYNAMIC_DOWNCAST(
  1291. CExtDynamicMDIChildWnd,
  1292. pWndPermanent
  1293. );
  1294. if( pWndMdiChild != NULL )
  1295. {
  1296. CMDIFrameWnd * pMDIFrame =
  1297. STATIC_DOWNCAST(
  1298. CMDIFrameWnd,
  1299. pWndMdiChild->GetParentFrame()
  1300. );
  1301. ASSERT_VALID( pMDIFrame );
  1302. CMDIChildWnd * pActive = pMDIFrame->MDIGetActive();
  1303. if( pWndMdiChild != pActive )
  1304. pWndMdiChild->MDIActivate();
  1305. } // if( pWndMdiChild != NULL )
  1306. else
  1307. {
  1308. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  1309. if( eDUIT == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER )
  1310. {
  1311. CExtTabPageContainerWnd * pWndTabPageContainer =
  1312. DYNAMIC_DOWNCAST(
  1313. CExtTabPageContainerWnd,
  1314. pWndPermanent
  1315. );
  1316. if( pWndTabPageContainer != NULL )
  1317. {
  1318. CExtTabWnd * pWndTabs = pWndTabPageContainer->GetSafeTabWindow();
  1319. ASSERT_VALID( pWndTabs );
  1320. int nPageIdx = pWndTabs->ItemFindByLParam( LPARAM(OnQueryChildHWND()) );
  1321. if( nPageIdx >= 0 )
  1322. {
  1323. CExtTabWnd::TAB_ITEM_INFO * pTII = pWndTabs->ItemGet( nPageIdx );
  1324. ASSERT_VALID( pTII );
  1325. pTII->EventProviderSet( this );
  1326. if( pDBS->m_listBarsInDocMode.Find( this ) == NULL )
  1327. pDBS->m_listBarsInDocMode.AddHead( this );
  1328. return;
  1329. } // if( nPageIdx >= 0 )
  1330. } // if( pWndTabPageContainer != NULL )
  1331. } // if( eDUIT == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER )
  1332. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  1333. } // else from if( pWndMdiChild != NULL )
  1334. } // if( pWndPermanent != NULL )
  1335. return;
  1336. } // if( hWndContainer != m_hWnd )
  1337. if( eDUIT == CExtDynamicBarSite::__EDUIT_UNSUPPORTED_ENVIRONMENT )
  1338. return;
  1339. CExtSafeString sDocumentCaptionText;
  1340. OnGetBarCaptionText(
  1341. __EBCT_DOCUMENT_CONTAINER_CAPTION,
  1342. sDocumentCaptionText
  1343. );
  1344. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  1345. if( eDUIT == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER )
  1346. {
  1347. CExtTabPageContainerWnd * pWndTabPageContainer =
  1348. pDBS->GetTabPageContainer();
  1349. ASSERT_VALID( pWndTabPageContainer );
  1350. ASSERT( pWndTabPageContainer->GetDlgCtrlID() == AFX_IDW_PANE_FIRST );
  1351. ::ShowWindow( hWndChild, SW_HIDE );
  1352. ::SetParent( hWndChild, pWndTabPageContainer->m_hWnd );
  1353. CRect rcClient;
  1354. pWndTabPageContainer->GetClientRect( &rcClient );
  1355. CWnd::RepositionBars(
  1356. 0,
  1357. 0x0FFFF,
  1358. 0x101,
  1359. CWnd::reposQuery,
  1360. &rcClient,
  1361. &rcClient,
  1362. TRUE
  1363. );
  1364. ::SetWindowPos(
  1365. hWndChild,
  1366. HWND_BOTTOM,
  1367. rcClient.left,
  1368. rcClient.top,
  1369. rcClient.Width(),
  1370. rcClient.Height(),
  1371. SWP_NOACTIVATE|SWP_NOCOPYBITS
  1372. );
  1373. int nPageIdx = m_bInsertToHeadOfTPC ? 0 : pWndTabPageContainer->PageGetCount();
  1374. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_ONENOTE_CTRL)
  1375. CExtTabPageContainerOneNoteWnd * pOneNoteTPC =
  1376. DYNAMIC_DOWNCAST(
  1377. CExtTabPageContainerOneNoteWnd,
  1378. pWndTabPageContainer
  1379. );
  1380. if( pOneNoteTPC != NULL )
  1381. {
  1382. VERIFY(
  1383. pOneNoteTPC->PageInsert(
  1384. CWnd::FromHandle( hWndChild ),
  1385. m_icon,
  1386. sDocumentCaptionText.IsEmpty() ? _T("") : LPCTSTR(sDocumentCaptionText),
  1387. nPageIdx,
  1388. true
  1389. )
  1390. );
  1391. } // if( pOneNoteTPC != NULL )
  1392. else
  1393. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_ONENOTE_CTRL)
  1394. {
  1395. VERIFY(
  1396. pWndTabPageContainer->PageInsert(
  1397. CWnd::FromHandle( hWndChild ),
  1398. m_icon,
  1399. sDocumentCaptionText.IsEmpty() ? _T("") : LPCTSTR(sDocumentCaptionText),
  1400. nPageIdx,
  1401. true
  1402. )
  1403. );
  1404. } // else from if( pOneNoteTPC != NULL )
  1405. if( pWndTabPageContainer->ShowBtnCloseGet() )
  1406. pWndTabPageContainer->EnabledBtnCloseSet( true );
  1407. CExtTabWnd * pWndTabs = pWndTabPageContainer->GetSafeTabWindow();
  1408. ASSERT_VALID( pWndTabs );
  1409. CExtTabWnd::TAB_ITEM_INFO * pTII = pWndTabs->ItemGet( nPageIdx );
  1410. ASSERT_VALID( pTII );
  1411. ASSERT( ((HWND)pTII->LParamGet()) != NULL );
  1412. ASSERT( ((HWND)pTII->LParamGet()) == OnQueryChildHWND() );
  1413. pTII->EventProviderSet( this );
  1414. pDBS->m_listBarsInDocMode.AddHead( this );
  1415. return;
  1416. } // if( eDUIT == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER )
  1417. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  1418. CMDIFrameWnd * pMdiFrame =
  1419. STATIC_DOWNCAST(
  1420. CMDIFrameWnd,
  1421. m_pDockSite
  1422. );
  1423. ASSERT_VALID( pMdiFrame );
  1424. bool bMaximized = false;
  1425. HWND hWndActiveMdiChildFrame =
  1426. pDBS->GetActiveMdiChildFrameHWND( &bMaximized );
  1427. if( hWndActiveMdiChildFrame == NULL )
  1428. bMaximized = true;
  1429. DWORD dwMdiChildFrameWindowStyles =
  1430. ( (WS_OVERLAPPEDWINDOW) & (~WS_POPUP) )
  1431. |WS_CHILD
  1432. |WS_VISIBLE
  1433. |FWS_ADDTOTITLE
  1434. ;
  1435. if( bMaximized )
  1436. dwMdiChildFrameWindowStyles |= WS_MAXIMIZE;
  1437. CExtDynamicMDIChildWnd * pWndMdiChild =
  1438. OnCreateDynamicMDIChildWndInstance();
  1439. if( pWndMdiChild == NULL )
  1440. {
  1441. ASSERT( FALSE );
  1442. return;
  1443. }
  1444. ASSERT_VALID( pWndMdiChild );
  1445. if( ! m_icon.IsEmpty() )
  1446. pWndMdiChild->m_icon = m_icon;
  1447. if( ! pWndMdiChild->Create(
  1448. ::AfxRegisterWndClass(
  1449. CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS
  1450. ),
  1451. sDocumentCaptionText.IsEmpty()
  1452. ? _T("")
  1453. : LPCTSTR(sDocumentCaptionText),
  1454. dwMdiChildFrameWindowStyles,
  1455. CFrameWnd::rectDefault,
  1456. STATIC_DOWNCAST( CMDIFrameWnd, m_pDockSite )
  1457. )
  1458. )
  1459. {
  1460. ASSERT( FALSE );
  1461. return;
  1462. }
  1463. pWndMdiChild->SetTitle(
  1464. sDocumentCaptionText.IsEmpty() ? _T("") : LPCTSTR(sDocumentCaptionText)
  1465. );
  1466. pWndMdiChild->DelayUpdateFrameTitle();
  1467. HMENU hMenuDefault = NULL;
  1468. if( m_nMdiMenuResourceID != 0 )
  1469. {
  1470. CMenu _menu;
  1471. if( g_ResourceManager->LoadMenu( _menu, m_nMdiMenuResourceID ) )
  1472. {
  1473. ASSERT( _menu.GetSafeHmenu() != NULL );
  1474. hMenuDefault = _menu.Detach();
  1475. } // if( g_ResourceManager->LoadMenu( _menu, m_nMdiMenuResourceID ) )
  1476. } // if( m_nMdiMenuResourceID != 0 )
  1477. if( hMenuDefault == NULL )
  1478. hMenuDefault = pMdiFrame->m_hMenuDefault;
  1479. HACCEL hAccelTable = pMdiFrame->m_hAccelTable;
  1480. if( m_nMdiAccelTableResourceID != 0 )
  1481. hAccelTable =
  1482. g_ResourceManager->LoadAccelerators(
  1483. m_nMdiMenuResourceID
  1484. );
  1485. if( hAccelTable == NULL )
  1486. hAccelTable = pMdiFrame->m_hAccelTable;
  1487. pWndMdiChild->SetHandles(
  1488. hMenuDefault,
  1489. hAccelTable
  1490. );
  1491. pWndMdiChild->MDIActivate();
  1492. if( hMenuDefault != NULL )
  1493. pMdiFrame->OnUpdateFrameMenu( hMenuDefault );
  1494. pDBS->m_listBarsInDocMode.AddHead( this );
  1495. }
  1496. CExtDynamicMDIChildWnd * CExtDynamicControlBar::OnCreateDynamicMDIChildWndInstance()
  1497. {
  1498. ASSERT_VALID( this );
  1499. CExtDynamicBarSite * pDBS = GetBarSite();
  1500. if( pDBS == NULL )
  1501. {
  1502. ASSERT( FALSE );
  1503. return NULL;
  1504. }
  1505. CExtDynamicMDIChildWnd * pWndMdiChild =
  1506. pDBS->OnDbsCreateDynamicMDIChildWndInstance( this );
  1507. return pWndMdiChild;
  1508. }
  1509. void CExtDynamicControlBar::OnMoveChildToBar()
  1510. {
  1511. ASSERT_VALID( this );
  1512. ASSERT( GetSafeHwnd() != NULL );
  1513. HWND hWndChild = OnQueryChildHWND();
  1514. if( hWndChild == NULL )
  1515. return;
  1516. HWND hWndContainer = ::GetParent( hWndChild );
  1517. ASSERT( hWndContainer != NULL );
  1518. if( hWndContainer == m_hWnd )
  1519. return;
  1520. CExtDynamicBarSite * pDBS = GetBarSite();
  1521. if( pDBS == NULL )
  1522. return;
  1523. CExtDynamicBarSite::eDetectedUiType_t eDUIT =
  1524. pDBS->GetDetectedUiType();
  1525. if( eDUIT == CExtDynamicBarSite::__EDUIT_UNSUPPORTED_ENVIRONMENT )
  1526. return;
  1527. POSITION posInList = pDBS->m_listBarsInDocMode.Find( this );
  1528. if( posInList != NULL )
  1529. pDBS->m_listBarsInDocMode.RemoveAt( posInList );
  1530. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  1531. if( eDUIT == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER )
  1532. {
  1533. CExtTabPageContainerWnd * pWndTabPageContainer =
  1534. pDBS->GetTabPageContainer();
  1535. ASSERT_VALID( pWndTabPageContainer );
  1536. ASSERT( pWndTabPageContainer->GetDlgCtrlID() == AFX_IDW_PANE_FIRST );
  1537. int nSelPageIdx = pWndTabPageContainer->PageSelectionGet();
  1538. if( nSelPageIdx < 0 )
  1539. return;
  1540. HWND hWndChild = OnQueryChildHWND();
  1541. if( hWndChild != NULL && ::IsWindow( hWndChild ) )
  1542. {
  1543. HWND hWndChildInTPC = pWndTabPageContainer->PageHwndGetSafe( nSelPageIdx );
  1544. ASSERT( hWndChildInTPC != NULL && ::IsWindow( hWndChildInTPC ) );
  1545. if(  hWndChild == hWndChildInTPC )
  1546. {
  1547. ::ShowWindow( hWndChild, SW_HIDE );
  1548. ::SetParent( hWndChild, m_hWnd );
  1549. pWndTabPageContainer->PageRemove( nSelPageIdx, 1, false );
  1550. CRect rcClient;
  1551. GetClientRect( &rcClient );
  1552. ::MoveWindow(
  1553. hWndChild,
  1554. rcClient.left,
  1555. rcClient.top,
  1556. rcClient.Width(),
  1557. rcClient.Height(),
  1558. TRUE
  1559. );
  1560. GetParentFrame()->DelayRecalcLayout();
  1561. ::ShowWindow( hWndChild, SW_SHOW );
  1562. } // if(  hWndChild == hWndChildInTPC )
  1563. if( pWndTabPageContainer->ShowBtnCloseGet() )
  1564. pWndTabPageContainer->EnabledBtnCloseSet(
  1565. ( pWndTabPageContainer->PageGetCount() > 0 )
  1566. ? true : false
  1567. );
  1568. pWndTabPageContainer->Invalidate();
  1569. } // if( hWndChild != NULL && ::IsWindow( hWndChild ) )
  1570. return;
  1571. } // if( eDUIT == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER )
  1572. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  1573. CWnd * pWndPermanent =
  1574. CWnd::FromHandlePermanent(hWndContainer);
  1575. if( pWndPermanent != NULL )
  1576. {
  1577. CExtDynamicMDIChildWnd * pWndMdiChild =
  1578. DYNAMIC_DOWNCAST(
  1579. CExtDynamicMDIChildWnd,
  1580. pWndPermanent
  1581. );
  1582. if( pWndMdiChild != NULL )
  1583. {
  1584. ASSERT_VALID( pWndMdiChild );
  1585. pWndMdiChild->DestroyWindow();
  1586. } // if( pWndMdiChild != NULL )
  1587. } // if( pWndPermanent != NULL )
  1588. }
  1589. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1590. bool CExtDynamicControlBar::AutoHideModeSet(
  1591. bool bAutoHideMode,
  1592. bool bAnimate,
  1593. bool bRecalcLayout,
  1594. bool bForceNoShow
  1595. )
  1596. {
  1597. ASSERT_VALID( this );
  1598. bool bRetVal =
  1599. CExtControlBar::AutoHideModeSet(
  1600. bAutoHideMode,
  1601. bAnimate,
  1602. bRecalcLayout,
  1603. bForceNoShow
  1604. );
  1605. // if( m_eDBS == __EDBS_AUTO_HIDDEN
  1606. // && ( ! bAutoHideMode )
  1607. // )
  1608. // m_eDBS = __EDBS_DOCKED;
  1609. return bRetVal;
  1610. }
  1611. bool CExtDynamicControlBar::OnQueryVisibilityInAutoHideTabs() const
  1612. {
  1613. return OnQueryVisibilityInContainerTabs();
  1614. }
  1615. bool CExtDynamicControlBar::OnQueryVisibilityInContainerTabs() const
  1616. {
  1617. ASSERT_VALID( this );
  1618. if( BarStateGet() == __EDBS_DOCUMENT )
  1619. return false;
  1620. return CExtControlBar::OnQueryVisibilityInAutoHideTabs();
  1621. }
  1622. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1623. void CExtDynamicControlBar::OnSerializeDynamicProps( CArchive & ar )
  1624. {
  1625. ASSERT_VALID( this );
  1626. DWORD dwTmp = 0;
  1627. if( ar.IsStoring() )
  1628. {
  1629. dwTmp = (DWORD)m_eDBS;
  1630. ar << dwTmp;
  1631. ar << m_dwAdditionalStateFlags;
  1632. ar << DWORD(m_nMdiMenuResourceID);
  1633. ar << DWORD(m_nMdiAccelTableResourceID);
  1634. } // if( ar.IsStoring() )
  1635. else
  1636. {
  1637. ar >> dwTmp;
  1638. m_eDBS = (eDynamicBarState_t)dwTmp;
  1639. ar >> m_dwAdditionalStateFlags;
  1640. ar >> dwTmp;
  1641. m_nMdiMenuResourceID = UINT(dwTmp);
  1642. ar >> dwTmp;
  1643. m_nMdiAccelTableResourceID = UINT(dwTmp);
  1644. m_bAppearInDockSiteControlBarPopupMenu =
  1645. ( m_eDBS == __EDBS_DOCUMENT ) ? false : true;
  1646. if( ( m_dwAdditionalStateFlags & __EASF_INVISIBLE ) != 0 )
  1647. DelayShow( FALSE );
  1648. if( m_eDBS == __EDBS_DOCUMENT )
  1649. OnMoveChildToDocument();
  1650. else
  1651. OnMoveChildToBar();
  1652. } // else from if( ar.IsStoring() )
  1653. }
  1654. void CExtDynamicControlBar::OnExtBarStateSerializationComplete(
  1655. bool bStore
  1656. )
  1657. {
  1658. ASSERT_VALID( this );
  1659. CExtControlBar::OnExtBarStateSerializationComplete(
  1660. bStore
  1661. );
  1662. if( bStore )
  1663. return;
  1664. OnQueryChildHWND();
  1665. bool bIsVisibleState;
  1666. if( BarStateGet( &bIsVisibleState ) == __EDBS_DOCUMENT )
  1667. {
  1668. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1669. ASSERT( ! AutoHideModeGet() );
  1670. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1671. if( bIsVisibleState )
  1672. OnMoveChildToDocument();
  1673. } // if( BarStateGet( &bIsVisibleState ) == __EDBS_DOCUMENT )
  1674. }
  1675. bool CExtDynamicControlBar::OnInsertDynamicBarCommandIntoPopupMenu(
  1676. CExtPopupMenuWnd * pPopup,
  1677. INT nInsertPos
  1678. )
  1679. {
  1680. ASSERT_VALID( this );
  1681. ASSERT_VALID( pPopup );
  1682. ASSERT( 0 <= nInsertPos && nInsertPos <= pPopup->ItemGetCount() );
  1683. UINT nCmdID = UINT( GetDlgCtrlID() );
  1684. ASSERT(
  1685. g_CmdManager->CmdGetPtr(
  1686. g_CmdManager->ProfileNameFromWnd( m_hWnd ),
  1687. nCmdID
  1688. ) != 0
  1689. );
  1690. if( ! pPopup->ItemInsert(
  1691. nCmdID,
  1692. nInsertPos
  1693. )
  1694. )
  1695. {
  1696. ASSERT( FALSE );
  1697. return false;
  1698. }
  1699. return true;
  1700. }
  1701. CExtDynamicControlBar::eDynamicBarState_t
  1702. CExtDynamicControlBar::BarStateGet(
  1703. bool * p_bIsVisibleState // = NULL
  1704. ) const
  1705. {
  1706. ASSERT_VALID( this );
  1707. if( p_bIsVisibleState != NULL )
  1708. {
  1709. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1710. if( m_eDBS == __EDBS_AUTO_HIDDEN )
  1711. {
  1712. (*p_bIsVisibleState) = false;
  1713. if( m_hWnd != NULL
  1714. && ::IsWindow( m_hWnd )
  1715. && ::GetWindow( m_hWnd, GW_CHILD ) == NULL
  1716. && AutoHideModeGet()
  1717. )
  1718. {
  1719. ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  1720. CExtDynAutoHideArea * pWndAutoHideArea =
  1721. ((CExtDockBar*)m_pDockBar)->_GetAutoHideArea();
  1722. ASSERT_VALID( pWndAutoHideArea );
  1723. CExtDynAutoHideSlider * pWndSlider =
  1724. pWndAutoHideArea->GetAutoHideSlider();
  1725. if( LPCVOID(pWndSlider->GetBar()) == LPCVOID(this)
  1726. && (pWndSlider->GetStyle()&WS_VISIBLE) != 0
  1727. )
  1728. (*p_bIsVisibleState) = true;
  1729. }
  1730. } // if( m_eDBS == __EDBS_AUTO_HIDDEN )
  1731. else
  1732. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1733. (*p_bIsVisibleState) =
  1734. ( ( m_dwAdditionalStateFlags & __EASF_INVISIBLE ) != 0 )
  1735. ? false : true;
  1736. }
  1737. return m_eDBS;
  1738. }
  1739. bool CExtDynamicControlBar::BarStateSet(
  1740. CExtDynamicControlBar::eDynamicBarState_t eDBS,
  1741. bool bShow
  1742. )
  1743. {
  1744. ASSERT_VALID( this );
  1745. ASSERT_VALID( m_pDockSite );
  1746. // if( m_eDBS == eDBS )
  1747. // return true;
  1748. m_eHelperSwitchingDBS = eDBS;
  1749. m_bHelperSwitchingIntoVisibleState = bShow;
  1750. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1751. if( eDBS == __EDBS_AUTO_HIDDEN && (!bShow) )
  1752. eDBS = __EDBS_DOCKED;
  1753. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1754. switch( eDBS )
  1755. {
  1756. case __EDBS_FLOATING:
  1757. m_bAppearInDockSiteControlBarPopupMenu = true;
  1758. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1759. if( AutoHideModeGet() )
  1760. AutoHideModeSet( false, false, false, true );
  1761. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1762. OnMoveChildToBar();
  1763. if( ! IsFloating() )
  1764. FloatControlBar();
  1765. //   if( ! bShow )
  1766. //   m_pDockSite->ShowControlBar( this, FALSE, FALSE );
  1767. //   else
  1768. //   m_pDockSite->ShowControlBar( this, TRUE, FALSE );
  1769. if( (! bShow ) && IsVisible()
  1770. || bShow && (! IsVisible() )
  1771. )
  1772. {
  1773. OnFrameBarCheckCmd( true ); // show/hide me
  1774. GetParentFrame()->RecalcLayout();
  1775. }
  1776. break;
  1777. case __EDBS_DOCKED:
  1778. m_bAppearInDockSiteControlBarPopupMenu = true;
  1779. OnMoveChildToBar();
  1780. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1781. if( AutoHideModeGet() )
  1782. {
  1783. AutoHideModeSet( false, false, true, true );
  1784. if( bShow )
  1785. OnFrameBarCheckCmd( false ); // show me
  1786. } // if( AutoHideModeGet() )
  1787. else
  1788. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1789. {
  1790. if( bShow )
  1791. m_eDBS = eDBS; // for making OnQueryVisibilityInContainerTabs() returning true
  1792. if( (! bShow ) && IsVisible()
  1793. || bShow && (! IsVisible() )
  1794. )
  1795. {
  1796. OnFrameBarCheckCmd( true ); // show/hide me
  1797. GetParentFrame()->RecalcLayout();
  1798. }
  1799. } // else from if( AutoHideModeGet() )
  1800. break;
  1801. case __EDBS_DOCUMENT:
  1802. if( OnQueryChildHWND() == NULL )
  1803. {
  1804. ASSERT( FALSE );
  1805. return false;
  1806. } // if( OnQueryChildHWND() == NULL )
  1807. m_bAppearInDockSiteControlBarPopupMenu = false;
  1808. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1809. if( AutoHideModeGet() )
  1810. AutoHideModeSet( false, false, false, true );
  1811. else
  1812. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1813. if( IsVisible() )
  1814. {
  1815. OnFrameBarCheckCmd( true ); // hide me
  1816. GetParentFrame()->RecalcLayout();
  1817. }
  1818. if( bShow )
  1819. OnMoveChildToDocument();
  1820. else
  1821. OnMoveChildToBar();
  1822. break;
  1823. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1824. case __EDBS_AUTO_HIDDEN:
  1825. m_bAppearInDockSiteControlBarPopupMenu = true;
  1826. ASSERT( bShow );
  1827. if( ! AutoHideModeGet() )
  1828. {
  1829. OnMoveChildToBar();
  1830. if( IsFloating()
  1831. || GetParentFrame() != m_pDockSite
  1832. )
  1833. {
  1834. VERIFY(
  1835. DockControlBarInnerOuter(
  1836. AFX_IDW_DOCKBAR_LEFT,
  1837. false,
  1838. m_pDockSite,
  1839. false
  1840. )
  1841. );
  1842. }
  1843. VERIFY(
  1844. AutoHideModeSet(
  1845. true,
  1846. false,
  1847. true,
  1848. false
  1849. )
  1850. );
  1851. } // if( ! AutoHideModeGet() )
  1852. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1853. break;
  1854. #ifdef _DEBUG
  1855. default:
  1856. {
  1857. ASSERT( FALSE );
  1858. }
  1859. break;
  1860. #endif // _DEBUG
  1861. } //switch( eDBS )
  1862. m_eDBS = eDBS;
  1863. if( bShow )
  1864. m_dwAdditionalStateFlags &= ~__EASF_INVISIBLE;
  1865. else
  1866. m_dwAdditionalStateFlags |= __EASF_INVISIBLE;
  1867. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1868. // if( eDBS != __EDBS_DOCUMENT && eDBS != __EDBS_FLOATING )
  1869. if( eDBS == __EDBS_AUTO_HIDDEN )
  1870. {
  1871. CExtDockDynTabBar * pDynDockBar =
  1872. DYNAMIC_DOWNCAST(
  1873. CExtDockDynTabBar,
  1874. GetParent()
  1875. );
  1876. if( pDynDockBar != NULL )
  1877. {
  1878. CExtDynTabControlBar * pTabbedBar =
  1879. DYNAMIC_DOWNCAST(
  1880. CExtDynTabControlBar,
  1881. pDynDockBar->GetParent()
  1882. );
  1883. LONG nPos, nCount = pTabbedBar->GetSwitcherItemCount();
  1884. for( nPos = 0; nPos < nCount; nPos++ )
  1885. {
  1886. CExtControlBar * pContainedBar =
  1887. pTabbedBar->GetBarAt( nPos, true );
  1888. CExtDynamicControlBar * pDynamicBar =
  1889. DYNAMIC_DOWNCAST( CExtDynamicControlBar, pContainedBar );
  1890. if( pDynamicBar != NULL )
  1891. pDynamicBar->m_eDBS = eDBS;
  1892. } // for( nPos = 0; nPos < nCount; nPos++ )
  1893. } // if( pDynDockBar != NULL )
  1894. }
  1895. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1896. return true;
  1897. }
  1898. /////////////////////////////////////////////////////////////////////////////
  1899. // CExtDynamicMDIChildWnd
  1900. IMPLEMENT_DYNAMIC( CExtDynamicMDIChildWnd, CMDIChildWnd );
  1901. CExtDynamicMDIChildWnd::CExtDynamicMDIChildWnd(
  1902. CExtDynamicControlBar * pBar
  1903. )
  1904. : m_pDBS( NULL )
  1905. , m_pBar( NULL )
  1906. , m_hWndHelperBar( NULL )
  1907. {
  1908. if( pBar != NULL )
  1909. AttachBar( pBar );
  1910. }
  1911. CExtDynamicMDIChildWnd::~CExtDynamicMDIChildWnd()
  1912. {
  1913. }
  1914. void CExtDynamicMDIChildWnd::AttachBar( CExtDynamicControlBar * pBar )
  1915. {
  1916. ASSERT_VALID( this );
  1917. m_pBar = pBar;
  1918. ASSERT_VALID( m_pBar );
  1919. m_hWndHelperBar = m_pBar->GetSafeHwnd();
  1920. ASSERT( m_hWndHelperBar != NULL );
  1921. ASSERT( ::GetWindow( m_hWndHelperBar, GW_CHILD ) != NULL );
  1922. }
  1923. void CExtDynamicMDIChildWnd::PostNcDestroy()
  1924. {
  1925. delete this;
  1926. }
  1927. CExtDynamicControlBar * CExtDynamicMDIChildWnd::GetBar()
  1928. {
  1929. ASSERT_VALID( this );
  1930. ASSERT( GetSafeHwnd() != NULL );
  1931. ASSERT_VALID( m_pBar );
  1932. ASSERT( m_pBar->GetSafeHwnd() == m_hWndHelperBar );
  1933. return m_pBar;
  1934. }
  1935. CExtDynamicBarSite * CExtDynamicMDIChildWnd::GetBarSite()
  1936. {
  1937. ASSERT_VALID( this );
  1938. ASSERT( GetSafeHwnd() != NULL );
  1939. ASSERT_VALID( m_pBar );
  1940. ASSERT( m_pBar->GetSafeHwnd() == m_hWndHelperBar );
  1941. if( m_pDBS == NULL )
  1942. m_pDBS = m_pBar->GetBarSite();
  1943. return m_pDBS;
  1944. }
  1945. //BOOL CExtDynamicMDIChildWnd::PreTranslateMessage(MSG* pMsg)
  1946. //{
  1947. // ASSERT_VALID( this );
  1948. // if( m_pBar != NULL )
  1949. // {
  1950. // ASSERT_VALID( m_pBar );
  1951. // if( m_pBar->PreTranslateMessage( pMSG ) )
  1952. // return TRUE;
  1953. // } // if( m_pBar != NULL )
  1954. // return CMDIChildWnd::PreTranslateMessage( pMSG );
  1955. //}
  1956. BOOL CExtDynamicMDIChildWnd::OnCmdMsg(
  1957. UINT nID,
  1958. int nCode,
  1959. void * pExtra,
  1960. AFX_CMDHANDLERINFO * pHandlerInfo
  1961. )
  1962. {
  1963. ASSERT_VALID( this );
  1964. if( m_pBar != NULL )
  1965. {
  1966. ASSERT_VALID( m_pBar );
  1967. if( m_pBar->OnCmdMsg(
  1968. nID,
  1969. nCode,
  1970. pExtra,
  1971. pHandlerInfo
  1972. )
  1973. )
  1974. return TRUE;
  1975. } // if( m_pBar != NULL )
  1976. return
  1977. CMDIChildWnd::OnCmdMsg(
  1978. nID,
  1979. nCode,
  1980. pExtra,
  1981. pHandlerInfo
  1982. );
  1983. }
  1984. BOOL CExtDynamicMDIChildWnd::PreCreateWindow(CREATESTRUCT& cs)
  1985. {
  1986. ASSERT_VALID( this );
  1987. if( ! CMDIChildWnd::PreCreateWindow(cs) )
  1988. {
  1989. ASSERT( FALSE );
  1990. return FALSE;
  1991. }
  1992. cs.dwExStyle &= ~(WS_EX_CLIENTEDGE);
  1993. return TRUE;
  1994. }
  1995. LRESULT CExtDynamicMDIChildWnd::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  1996. {
  1997. if( message == WM_SETFOCUS )
  1998. {
  1999. ASSERT( m_hWndHelperBar != NULL );
  2000. if( ::IsWindow(m_hWndHelperBar) )
  2001. {
  2002. ASSERT_VALID( m_pBar );
  2003. ASSERT( m_pBar->GetSafeHwnd() == m_hWndHelperBar );
  2004. HWND hWndChild = m_pBar->OnQueryChildHWND();
  2005. if( hWndChild != NULL
  2006. && ::GetParent(hWndChild) == m_hWnd
  2007. )
  2008. {
  2009. if( CExtControlBar::stat_QueryFocusChangingEnabled( m_pBar, hWndChild ) )
  2010. ::SetFocus( hWndChild );
  2011. }
  2012. } // if( ::IsWindow(m_hWndHelperBar) )
  2013. return 0;
  2014. } // else if( message == WM_SETFOCUS )
  2015. if( (message == WM_SYSCOMMAND && wParam == SC_CLOSE)
  2016. || message == WM_CLOSE
  2017. )
  2018. { // closing messages
  2019. ASSERT( m_hWndHelperBar != NULL );
  2020. if( ::IsWindow(m_hWndHelperBar) )
  2021. {
  2022. ASSERT_VALID( m_pBar );
  2023. ASSERT( m_pBar->GetSafeHwnd() == m_hWndHelperBar );
  2024. m_pBar->BarStateSet(
  2025. CExtDynamicControlBar::__EDBS_DOCUMENT,
  2026. false
  2027. );
  2028. } // if( ::IsWindow(m_hWndHelperBar) )
  2029. return 0;
  2030. } // closing messages
  2031. //  if( message == WM_NCPAINT )
  2032. //  {
  2033. //  // WM_NCPAINT and WM_WINDOWPOSCHANGED messages are
  2034. //  // handled to fix WinXP MDI interface flicker bug
  2035. //  CMDIFrameWnd * pMdiFrame =
  2036. //  STATIC_DOWNCAST( CMDIFrameWnd, GetParentFrame() );
  2037. //  ASSERT_VALID( pMdiFrame );
  2038. //  BOOL bMax = FALSE;
  2039. //  CMDIChildWnd * pActive = pMdiFrame->MDIGetActive( &bMax );
  2040. //  pActive;
  2041. //  if( bMax )
  2042. //  return 0 ;
  2043. //  } // if( message == WM_NCPAINT )
  2044. //  else if( message == WM_WINDOWPOSCHANGED )
  2045. //  {
  2046. //  // WM_NCPAINT and WM_WINDOWPOSCHANGED messages are
  2047. //  // handled to fix WinXP MDI interface flicker bug
  2048. //  CMDIFrameWnd * pMdiFrame =
  2049. //  STATIC_DOWNCAST( CMDIFrameWnd, GetParentFrame() );
  2050. //  ASSERT_VALID( pMdiFrame );
  2051. //  BOOL bMax = FALSE;
  2052. //  CMDIChildWnd * pActive = pMdiFrame->MDIGetActive( &bMax );
  2053. //  pActive;
  2054. //  if( ! bMax )
  2055. //  {
  2056. //  LRESULT lResult = CMDIChildWnd::WindowProc( message, wParam, lParam );
  2057. //  return lResult;
  2058. //  } // if( ! bMax )
  2059. //  SetRedraw( FALSE );
  2060. //  LRESULT lResult = CMDIChildWnd::WindowProc( message, wParam, lParam );
  2061. //  SetRedraw( TRUE );
  2062. //  RedrawWindow(
  2063. //  NULL, NULL,
  2064. //  RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN|RDW_FRAME
  2065. //  );
  2066. //  return lResult;
  2067. //  } // else if( message == WM_WINDOWPOSCHANGED )
  2068. LRESULT lResult = CMDIChildWnd::WindowProc( message, wParam, lParam );
  2069. if( message == WM_CREATE )
  2070. {
  2071. ASSERT_VALID( m_pBar );
  2072. ASSERT( m_pBar->GetSafeHwnd() == m_hWndHelperBar );
  2073. HWND hWndChild = ::GetWindow( m_pBar->GetSafeHwnd(), GW_CHILD );
  2074. ASSERT( hWndChild != NULL );
  2075. ::__EXT_MFC_SetWindowLong( hWndChild, GWL_ID, AFX_IDW_PANE_FIRST );
  2076. ::SetParent( hWndChild, m_hWnd );
  2077. if( ! m_icon.IsEmpty() )
  2078. {
  2079. SetIcon( m_icon.ExtractHICON(), FALSE ); // NEW EXCTACT ICON 2.53
  2080. SetIcon( m_icon.ExtractHICON(), TRUE );  // NEW EXCTACT ICON 2.53
  2081. } // if( ! m_icon.IsEmpty() )
  2082. CMenu * pSysMenu = GetSystemMenu( FALSE );
  2083.         if( pSysMenu != NULL )
  2084.         {
  2085.             ASSERT_KINDOF(CMenu, pSysMenu);
  2086.             pSysMenu->EnableMenuItem(
  2087. SC_CLOSE,
  2088. MF_BYCOMMAND
  2089. | ( m_pBar->_ClosingIsEnabled( m_pBar ) ? MF_ENABLED : MF_DISABLED )
  2090. );
  2091.         } // if( pSysMenu != NULL )
  2092. } // if( message == WM_CREATE )
  2093. return lResult;
  2094. }
  2095. BOOL CExtDynamicMDIChildWnd::DestroyWindow()
  2096. {
  2097. ASSERT_VALID( this );
  2098. HWND hWndChild = ::GetWindow( m_hWnd, GW_CHILD );
  2099. ASSERT( hWndChild != NULL );
  2100. ASSERT_VALID( m_pBar );
  2101. ASSERT( m_pBar->GetSafeHwnd() != NULL );
  2102. if( ! m_pBar->_ClosingIsEnabled( m_pBar ) )
  2103. return FALSE;
  2104. ::SetParent( hWndChild, m_pBar->m_hWnd );
  2105. CExtMiniDockFrameWnd * pMiniFrame =
  2106. DYNAMIC_DOWNCAST( CExtMiniDockFrameWnd, m_pBar->GetParentFrame() );
  2107. if( pMiniFrame != NULL )
  2108. {
  2109. bool bFloatingVisible = false;
  2110. if( ( m_pBar->m_eHelperSwitchingDBS == CExtDynamicControlBar::__EDBS_FLOATING
  2111. || m_pBar->m_eHelperSwitchingDBS == CExtDynamicControlBar::__EDBS_DOCKED
  2112. )
  2113. && m_pBar->m_bHelperSwitchingIntoVisibleState
  2114. )
  2115. bFloatingVisible = true;
  2116. pMiniFrame->ModifyStyle( FWS_SNAPTOBARS, 0 );
  2117. CSize _sizeF = m_pBar->GetSizeFloating();
  2118. CRect rcWndBar( 0, 0, _sizeF.cx, _sizeF.cy );
  2119. CRect rcClientFrame, rcWndFrame, rcFrameNC(0,0,0,0);
  2120. pMiniFrame->GetWindowRect( &rcWndFrame );
  2121. if( ! pMiniFrame->PmBridge_GetPM()->Bar_MiniDockFrameNcCalcSize(
  2122. rcFrameNC,
  2123. pMiniFrame,
  2124. m_pBar
  2125. )
  2126. )
  2127. {
  2128. rcFrameNC.left = rcFrameNC.right = ::GetSystemMetrics( SM_CXSIZEFRAME );
  2129. rcFrameNC.top = rcFrameNC.bottom = ::GetSystemMetrics( SM_CYSIZEFRAME );
  2130. rcFrameNC.top += ::GetSystemMetrics( SM_CYSMCAPTION );
  2131. }
  2132. rcWndFrame.right = rcWndFrame.left + rcWndBar.Width(); // + rcFrameNC.left + rcFrameNC.right;
  2133. rcWndFrame.bottom = rcWndFrame.top + rcWndBar.Height(); // + rcFrameNC.top + rcFrameNC.bottom;
  2134. rcWndBar.right -= rcFrameNC.left + rcFrameNC.right;
  2135. rcWndBar.bottom -= rcFrameNC.top + rcFrameNC.bottom;
  2136. rcClientFrame = rcWndFrame;
  2137. //  rcClientFrame.DeflateRect(
  2138. //  rcFrameNC.left,
  2139. //  rcFrameNC.top,
  2140. //  rcFrameNC.right,
  2141. //  rcFrameNC.bottom
  2142. //  );
  2143. rcClientFrame.DeflateRect(
  2144. 0,
  2145. 0,
  2146. 4,
  2147. 4
  2148. );
  2149. rcClientFrame.OffsetRect( -rcClientFrame.TopLeft() );
  2150. // pMiniFrame->MoveWindow( &rcWndFrame );
  2151. CRect rcMove = rcWndFrame;
  2152. rcMove.right += rcFrameNC.left + rcFrameNC.right - 4;
  2153. rcMove.bottom += rcFrameNC.top + rcFrameNC.bottom - 4;
  2154. pMiniFrame->MoveWindow( &rcMove );
  2155. m_pBar->MoveWindow( rcWndBar );
  2156. pMiniFrame->DelayRecalcLayout();
  2157. if( bFloatingVisible )
  2158. m_pBar->DelayShow( TRUE );
  2159. CSize _size = rcWndFrame.Size();
  2160. m_pBar->SetInitDesiredSizeFloating( _size );
  2161. m_pBar->m_pDockContext->m_sizeLast = _size;
  2162. if( bFloatingVisible )
  2163. {
  2164. pMiniFrame->ShowWindow( SW_SHOWNOACTIVATE );
  2165. pMiniFrame->RecalcLayout();
  2166. }
  2167. CRect rcClientFrameN, rcWndFrameN;
  2168. pMiniFrame->GetClientRect( &rcClientFrameN );
  2169. pMiniFrame->GetWindowRect( &rcWndFrameN );
  2170. CRect rcClientBarN, rcWndBarN;
  2171. m_pBar->GetClientRect( &rcClientBarN );
  2172. m_pBar->GetWindowRect( &rcWndBarN );
  2173. CSize _sizeBarN =
  2174. rcWndBarN.Size()
  2175. + rcClientFrameN.Size()
  2176. - rcWndFrameN.Size()
  2177. - rcClientBarN.Size()
  2178. + rcWndBarN.Size()
  2179. ;
  2180. m_pBar->OnRepositionSingleChild(
  2181. _sizeBarN.cx,
  2182. _sizeBarN.cy,
  2183. true
  2184. );
  2185. m_pBar->OnNcAreaButtonsReposition();
  2186. } // if( pMiniFrame != NULL )
  2187. else
  2188. {
  2189. CRect rcClient;
  2190. m_pBar->GetClientRect( &rcClient );
  2191. ::MoveWindow(
  2192. hWndChild,
  2193. rcClient.left,
  2194. rcClient.top,
  2195. rcClient.Width(),
  2196. rcClient.Height(),
  2197. TRUE
  2198. );
  2199. } // else from if( pMiniFrame != NULL )
  2200. return CMDIChildWnd::DestroyWindow();
  2201. }
  2202. /////////////////////////////////////////////////////////////////////////////
  2203. // CExtDynamicBarHookSink
  2204. CExtDynamicBarHookSink::CExtDynamicBarHookSink()
  2205. : m_pDBS( NULL )
  2206. {
  2207. }
  2208. CExtDynamicBarHookSink::~CExtDynamicBarHookSink()
  2209. {
  2210. }
  2211. CFrameWnd * CExtDynamicBarHookSink::DockSiteGet()
  2212. {
  2213. ASSERT( this != NULL );
  2214. CExtDynamicBarSite * pDBS = GetBarSite();
  2215. if( pDBS == NULL )
  2216. return NULL;
  2217. return pDBS->DockSiteGet();
  2218. }
  2219. CExtDynamicBarSite * CExtDynamicBarHookSink::GetBarSite()
  2220. {
  2221. ASSERT( this != NULL );
  2222. return m_pDBS;
  2223. }
  2224. bool CExtDynamicBarHookSink::OnHookWndMsg(
  2225. LRESULT & lResult,
  2226. HWND hWndHooked,
  2227. UINT nMessage,
  2228. WPARAM & wParam,
  2229. LPARAM & lParam
  2230. )
  2231. {
  2232. ASSERT( this != NULL );
  2233. CExtDynamicBarSite * pDBS = GetBarSite();
  2234. CFrameWnd * pDockSite = DockSiteGet();
  2235. if( pDockSite->GetSafeHwnd() != NULL
  2236. && hWndHooked == pDockSite->GetSafeHwnd()
  2237. )
  2238. {
  2239. switch( nMessage )
  2240. {
  2241. case WM_DESTROY:
  2242. {
  2243. //pDBS->_BarFreeAllImpl( true );
  2244. if( pDockSite->IsKindOf( RUNTIME_CLASS(CMDIChildWnd) ) )
  2245. pDBS->BarFreeAll();
  2246. }
  2247. break; // case WM_DESTROY
  2248. default:
  2249. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2250. if( nMessage == CExtControlBar::g_nMsgCreateTabbedBar )
  2251. {
  2252. lResult = 0L;
  2253. CExtDynTabControlBar ** ppTabbedBar =
  2254. (CExtDynTabControlBar **)wParam;
  2255. ASSERT( ppTabbedBar != NULL );
  2256. (*ppTabbedBar) = pDBS->OnDbsCreateTabbedBarInstance();
  2257. ASSERT( (*ppTabbedBar) != NULL );
  2258. return true;
  2259. } // if( nMessage == CExtControlBar::g_nMsgCreateTabbedBar )
  2260. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2261. if( nMessage == CExtDynamicBarSite::g_nMsgFindDynamicBarSite )
  2262. {
  2263. CExtDynamicBarSite ** ppDBS =
  2264. (CExtDynamicBarSite **)wParam;
  2265. ASSERT( ppDBS != NULL );
  2266. (*ppDBS) = pDBS;
  2267. lResult = 0L;
  2268. return true;
  2269. } // if( nMessage == CExtDynamicBarSite::g_nMsgFindDynamicBarSite )
  2270. if( nMessage == CExtPopupMenuWnd::g_nMsgPrepareMenu )
  2271. {
  2272. CExtPopupMenuWnd::MsgPrepareMenuData_t * pData =
  2273. reinterpret_cast
  2274. < CExtPopupMenuWnd::MsgPrepareMenuData_t * >
  2275. ( wParam );
  2276. ASSERT( pData != NULL );
  2277. CExtPopupMenuWnd * pPopup = pData->m_pPopup;
  2278. ASSERT( pPopup != NULL );
  2279. pData->m_bMenuChanged = OnPreparePopupMenu( pPopup );
  2280. return false;
  2281. } // if( nMessage == CExtPopupMenuWnd::g_nMsgPrepareMenu )
  2282. if( nMessage == CExtMenuControlBar::g_nMsgPrepareSystemMenu )
  2283. {
  2284. CExtPopupMenuWnd * pPopup = (CExtPopupMenuWnd *)wParam;
  2285. ASSERT_VALID( pPopup );
  2286. ASSERT_KINDOF( CExtPopupMenuWnd, pPopup );
  2287. CFrameWnd * pFrame = (CFrameWnd*)lParam;
  2288. ASSERT_VALID( pFrame );
  2289. ASSERT_KINDOF( CFrameWnd, pFrame );
  2290. CExtDynamicMDIChildWnd * pDynamicMDIChildWnd =
  2291. DYNAMIC_DOWNCAST(
  2292. CExtDynamicMDIChildWnd,
  2293. pFrame
  2294. );
  2295. if( pDynamicMDIChildWnd == NULL )
  2296. return false;
  2297. CExtDynamicControlBar * pBar =
  2298. pDynamicMDIChildWnd->GetBar();
  2299. ASSERT_VALID( pBar );
  2300. pBar->OnInitDbsMenu(
  2301. pPopup,
  2302. pBar->m_hWnd,
  2303. pDynamicMDIChildWnd
  2304. );
  2305. return false;
  2306. } // if( nMessage == CExtMenuControlBar::g_nMsgPrepareSystemMenu )
  2307. if( nMessage == CExtControlBar::g_nMsgConstructPopupMenu )
  2308. {
  2309. CExtControlBar::POPUP_MENU_EVENT_DATA * p_pmed =
  2310. CExtControlBar::POPUP_MENU_EVENT_DATA::FromWParam( wParam );
  2311. ASSERT( p_pmed != NULL );
  2312. ASSERT_VALID( p_pmed->m_pPopupMenuWnd );
  2313. ASSERT_VALID( p_pmed->m_pWndEventSrc );
  2314. ASSERT( p_pmed->m_pWndEventSrc->GetSafeHwnd() != NULL );
  2315. ASSERT( ::IsWindow(p_pmed->m_pWndEventSrc->GetSafeHwnd()) );
  2316. if( p_pmed->m_bPostNotification )
  2317. return false;
  2318. #if ( (!defined __EXT_MFC_NO_TABMDI_CTRL) || (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL) )
  2319. if(
  2320. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2321. p_pmed->m_nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_MDITABS_CTX
  2322. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2323. #if ( (!defined __EXT_MFC_NO_TABMDI_CTRL) && (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL) )
  2324. ||
  2325. #endif // ( (!defined __EXT_MFC_NO_TABMDI_CTRL) && (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL) )
  2326. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2327. p_pmed->m_nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_TAB_PAGE_CONTAINER_TABS_CTX
  2328. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2329. )
  2330. {
  2331. CExtTabWnd * pWndTab =
  2332. STATIC_DOWNCAST(
  2333. CExtTabWnd,
  2334. p_pmed->m_pWndEventSrc
  2335. );
  2336. CPoint point = p_pmed->m_ptScreen;
  2337. pWndTab->ScreenToClient( &point );
  2338. LONG nItemIdx =
  2339. pWndTab->ItemHitTest( point );
  2340. if( nItemIdx < 0 )
  2341. return false;
  2342. HWND hWnd = (HWND)
  2343. pWndTab->ItemGet( nItemIdx )->LParamGet();
  2344. if( hWnd == NULL || (! ::IsWindow(hWnd) ) )
  2345. return false;
  2346. CExtDynamicControlBar * pBar = NULL;
  2347. CObject * pObjHelperSrc = NULL;
  2348. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2349. if( p_pmed->m_nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_MDITABS_CTX )
  2350. {
  2351. CWnd * pWnd =
  2352. CWnd::FromHandlePermanent( hWnd );
  2353. if( pWnd == NULL )
  2354. return false;
  2355. CExtDynamicMDIChildWnd * pDynamicMDIChildWnd =
  2356. DYNAMIC_DOWNCAST(
  2357. CExtDynamicMDIChildWnd,
  2358. pWnd
  2359. );
  2360. if( pDynamicMDIChildWnd == NULL )
  2361. return false;
  2362. pObjHelperSrc = pDynamicMDIChildWnd;
  2363. pBar =
  2364. pDynamicMDIChildWnd->GetBar();
  2365. ASSERT_VALID( pBar );
  2366. } // if( p_pmed->m_nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_MDITABS_CTX )
  2367. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2368. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2369. if( p_pmed->m_nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_TAB_PAGE_CONTAINER_TABS_CTX )
  2370. {
  2371. CWnd * pWnd = CWnd::FromHandle( hWnd );
  2372. pObjHelperSrc = pWnd;
  2373. pBar =
  2374. pDBS->BarFindByChildHWND( hWnd );
  2375. if( pBar == NULL )
  2376. return false;
  2377. ASSERT_VALID( pBar );
  2378. } // if( p_pmed->m_nHelperNotificationType == CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_TAB_PAGE_CONTAINER_TABS_CTX );
  2379. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2380. pBar->OnInitDbsMenu(
  2381. p_pmed->m_pPopupMenuWnd,
  2382. pBar->m_hWnd,
  2383. pObjHelperSrc
  2384. );
  2385. CExtPaintManager::stat_PassPaintMessages();
  2386. lResult = 1L;
  2387. return true;
  2388. } // if( ...
  2389. #endif // ( (!defined __EXT_MFC_NO_TABMDI_CTRL) || (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL) )
  2390. if( p_pmed->m_nHelperNotificationType ==
  2391. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CONTROLBAR_NC_CTX
  2392. || p_pmed->m_nHelperNotificationType ==
  2393. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CONTROLBAR_CTX
  2394. || p_pmed->m_nHelperNotificationType ==
  2395. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_MINIFRAME_NC_CTX
  2396. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2397. || p_pmed->m_nHelperNotificationType ==
  2398. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_AUTOHIDESLIDER_CTX
  2399. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2400. )
  2401. {
  2402. CExtDynamicControlBar * pBar =
  2403. DYNAMIC_DOWNCAST(
  2404. CExtDynamicControlBar,
  2405. p_pmed->m_pWndEventSrc
  2406. );
  2407. if( pBar == NULL )
  2408. {
  2409. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2410. CExtDynamicTabbedControlBar * pTabbedBar =
  2411. DYNAMIC_DOWNCAST(
  2412. CExtDynamicTabbedControlBar,
  2413. p_pmed->m_pWndEventSrc
  2414. );
  2415. if( pTabbedBar == NULL )
  2416. return false;
  2417. LONG nSel = pTabbedBar->GetSwitcherSelection();
  2418. if( nSel < 0 )
  2419. return false;
  2420. CExtControlBar * pExtBar =
  2421. pTabbedBar->GetBarAt( nSel, true );
  2422. if( pExtBar == NULL )
  2423. return false;
  2424. pBar =
  2425. DYNAMIC_DOWNCAST(
  2426. CExtDynamicControlBar,
  2427. pExtBar
  2428. );
  2429. if( pBar == NULL )
  2430. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2431. return false;
  2432. } // if( pBar == NULL )
  2433. ASSERT_VALID( pBar );
  2434. p_pmed->m_pPopupMenuWnd->ItemRemove();
  2435. pBar->OnInitDbsMenu(
  2436. p_pmed->m_pPopupMenuWnd,
  2437. pBar->m_hWnd,
  2438. pBar
  2439. );
  2440. lResult = 1L;
  2441. return true;
  2442. } // if( ...
  2443. return false;
  2444. } // if( nMessage == CExtControlBar::g_nMsgConstructPopupMenu )
  2445.   break; // default
  2446.   } // switch( nMessage )
  2447. }
  2448. return 
  2449. CExtHookSink::OnHookWndMsg(
  2450. lResult,
  2451. hWndHooked,
  2452. nMessage,
  2453. wParam,
  2454. lParam
  2455. );
  2456. }
  2457. bool CExtDynamicBarHookSink::OnPreparePopupMenu( CExtPopupMenuWnd * pPopup )
  2458. {
  2459. ASSERT( this != NULL );
  2460. ASSERT_VALID( pPopup );
  2461. CExtDynamicBarSite * pDBS = GetBarSite();
  2462. if( pDBS == NULL )
  2463. return false;
  2464. CFrameWnd * pDockSite = pDBS->DockSiteGet();
  2465. if( pDockSite->GetSafeHwnd() == NULL )
  2466. return false;
  2467. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2468. CExtCustomizeSite * pSite =
  2469. CExtCustomizeSite::GetCustomizeSite( pDockSite->GetSafeHwnd() );
  2470. if( pSite != NULL
  2471. && pSite->IsCustomizeMode()
  2472. )
  2473. return false;
  2474. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2475. if( CExtControlBar::FindHelpMode( pDockSite ) )
  2476. return false;
  2477. return pDBS->OnPreparePopupMenu( pPopup );
  2478. }
  2479. /////////////////////////////////////////////////////////////////////////////
  2480. // CExtDynamicBarSite
  2481. const UINT CExtDynamicBarSite::g_nMsgFindDynamicBarSite =
  2482. ::RegisterWindowMessage(
  2483. _T("CExtDynamicBarSite::g_nMsgFindDynamicBarSite")
  2484. );
  2485. CExtDynamicBarSite::CExtDynamicBarSite()
  2486. : m_pDockSite( NULL )
  2487. , m_eDUIT( CExtDynamicBarSite::__EDUIT_NOT_DETECTED_YET )
  2488. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2489. , m_pWndTabPageContainer( NULL )
  2490. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2491. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2492. , m_pWndMdiTabs( NULL )
  2493. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2494. , m_hWndMdiClient( NULL )
  2495. , m_nBarListInMenusCmdID( 0 )
  2496. {
  2497. m_DbsHookSink.m_pDBS = this;
  2498. }
  2499. CExtDynamicBarSite::~CExtDynamicBarSite()
  2500. {
  2501. }
  2502. CExtDynamicBarSite::eDetectedUiType_t CExtDynamicBarSite::GetDetectedUiType() const
  2503. {
  2504. ASSERT( this != NULL );
  2505. if( m_eDUIT != __EDUIT_NOT_DETECTED_YET )
  2506. {
  2507. ASSERT(
  2508. __EDUIT_VALID_VALUE_MIN <= m_eDUIT
  2509. && m_eDUIT <= __EDUIT_VALID_VALUE_MAX
  2510. );
  2511. return m_eDUIT;
  2512. }
  2513. const CFrameWnd * pDockSite = DockSiteGet();
  2514. if( pDockSite->GetSafeHwnd() == NULL )
  2515. return __EDUIT_UNSUPPORTED_ENVIRONMENT;
  2516. ASSERT_VALID( pDockSite );
  2517. m_hWndMdiClient =
  2518. CExtControlBar::stat_FindMdiClientHWND(
  2519. pDockSite->m_hWnd
  2520. );
  2521. if( pDockSite->IsKindOf( RUNTIME_CLASS(CMDIFrameWnd) )
  2522. || m_hWndMdiClient != NULL
  2523. )
  2524. {
  2525. m_eDUIT = __EDUIT_MDI_ORDINARY;
  2526. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2527. HWND hWnd = ::GetWindow( pDockSite->m_hWnd, GW_CHILD );
  2528. for( ; hWnd != NULL; hWnd = ::GetWindow( hWnd, GW_HWNDNEXT ) )
  2529. {
  2530. if( hWnd == m_hWndMdiClient )
  2531. continue;
  2532. CWnd * pWnd =
  2533. CWnd::FromHandlePermanent( hWnd );
  2534. if( pWnd == NULL )
  2535. continue;
  2536. CExtTabWnd * pWndTab =
  2537. DYNAMIC_DOWNCAST(
  2538. CExtTabWnd,
  2539. pWnd
  2540. );
  2541. if( pWndTab == NULL
  2542. || (! pWndTab->_IsMdiTabCtrl() )
  2543. )
  2544. continue;
  2545. m_pWndMdiTabs = pWndTab;
  2546. m_eDUIT = __EDUIT_MDI_WITH_TABS;
  2547. break;
  2548. } // for( ; hWnd != NULL; hWnd = ::GetWindow( hWnd, GW_HWNDNEXT ) )
  2549. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2550. } // if( pDockSite->IsKindOf( RUNTIME_CLASS(CMDIFrameWnd) ) ...
  2551. else
  2552. {
  2553. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2554. HWND hWndCenter =
  2555. ::GetDlgItem(
  2556. pDockSite->m_hWnd,
  2557. AFX_IDW_PANE_FIRST
  2558. );
  2559. if( hWndCenter == NULL )
  2560. return __EDUIT_UNSUPPORTED_ENVIRONMENT;
  2561. CWnd * pWndCenter =
  2562. CWnd::FromHandlePermanent( hWndCenter );
  2563. if( pWndCenter == NULL )
  2564. return __EDUIT_UNSUPPORTED_ENVIRONMENT;
  2565. m_pWndTabPageContainer =
  2566. DYNAMIC_DOWNCAST(
  2567. CExtTabPageContainerWnd,
  2568. pWndCenter
  2569. );
  2570. if( m_pWndTabPageContainer == NULL )
  2571. return __EDUIT_UNSUPPORTED_ENVIRONMENT;
  2572. m_eDUIT = __EDUIT_SDI_TAB_PAGE_CONTAINER;
  2573. #else
  2574. m_eDUIT = __EDUIT_UNSUPPORTED_ENVIRONMENT;
  2575. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2576. } // else from if( pDockSite->IsKindOf( RUNTIME_CLASS(CMDIFrameWnd) ) ...
  2577. return m_eDUIT;
  2578. }
  2579. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2580. CExtTabPageContainerWnd * CExtDynamicBarSite::GetTabPageContainer()
  2581. {
  2582. ASSERT( this != NULL );
  2583. if( m_eDUIT == __EDUIT_NOT_DETECTED_YET )
  2584. GetDetectedUiType();
  2585. return m_pWndTabPageContainer;
  2586. }
  2587. const CExtTabPageContainerWnd * CExtDynamicBarSite::GetTabPageContainer() const
  2588. {
  2589. ASSERT( this != NULL );
  2590. if( m_eDUIT == __EDUIT_NOT_DETECTED_YET )
  2591. GetDetectedUiType();
  2592. return m_pWndTabPageContainer;
  2593. }
  2594. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2595. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2596. CExtTabWnd * CExtDynamicBarSite::GetMdiTabs()
  2597. {
  2598. ASSERT( this != NULL );
  2599. if( m_eDUIT == __EDUIT_NOT_DETECTED_YET )
  2600. GetDetectedUiType();
  2601. return m_pWndMdiTabs;
  2602. }
  2603. const CExtTabWnd * CExtDynamicBarSite::GetMdiTabs() const
  2604. {
  2605. ASSERT( this != NULL );
  2606. if( m_eDUIT == __EDUIT_NOT_DETECTED_YET )
  2607. GetDetectedUiType();
  2608. return m_pWndMdiTabs;
  2609. }
  2610. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2611. HWND CExtDynamicBarSite::GetMdiClient() const
  2612. {
  2613. ASSERT( this != NULL );
  2614. if( m_eDUIT == __EDUIT_NOT_DETECTED_YET )
  2615. GetDetectedUiType();
  2616. return m_hWndMdiClient;
  2617. }
  2618. CExtDynamicBarSite * CExtDynamicBarSite::FindBarSite(
  2619. HWND hWnd
  2620. )
  2621. {
  2622. if( hWnd == NULL || (! ::IsWindow(hWnd) ) )
  2623. return NULL;
  2624. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  2625. if( pWnd != NULL )
  2626. {
  2627. CFrameWnd * pFrame = NULL;
  2628. pFrame = DYNAMIC_DOWNCAST( CFrameWnd, pWnd );
  2629. if( pFrame == NULL )
  2630. {
  2631. CExtDynamicControlBar * pBar =
  2632. DYNAMIC_DOWNCAST( CExtDynamicControlBar, pWnd );
  2633. if( pBar != NULL )
  2634. pFrame = pBar->m_pDockSite;
  2635. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2636. else
  2637. {
  2638. CExtDynamicTabbedControlBar * pTabbedBar =
  2639. DYNAMIC_DOWNCAST( CExtDynamicTabbedControlBar, pWnd );
  2640. if( pTabbedBar != NULL )
  2641. pFrame = pTabbedBar->m_pDockSite;
  2642. }
  2643. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2644. } // if( pFrame == NULL )
  2645. if( pFrame == NULL )
  2646. pFrame = pWnd->GetParentFrame();
  2647. if( pFrame != NULL )
  2648. {
  2649. if( pFrame->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) ) )
  2650. pFrame = pFrame->GetParentFrame();
  2651. if( pFrame != NULL )
  2652. {
  2653. CExtDynamicBarSite * pDBS = NULL;
  2654. pFrame->SendMessage( g_nMsgFindDynamicBarSite, WPARAM(&pDBS) );
  2655. if( pDBS != NULL )
  2656. return pDBS;
  2657. } // if( pFrame != NULL )
  2658. } // if( pFrame != NULL )
  2659. }
  2660. for( ; hWnd != NULL; hWnd = ::GetParent( hWnd ) )
  2661. {
  2662. CExtDynamicBarSite * pDBS = NULL;
  2663. ::SendMessage( hWnd, g_nMsgFindDynamicBarSite, WPARAM(&pDBS), 0L );
  2664. if( pDBS != NULL )
  2665. return pDBS;
  2666. } // for( ; hWnd != NULL; hWnd = ::GetParent( hWnd ) )
  2667. return NULL;
  2668. }
  2669. CExtDynamicBarSite * CExtDynamicBarSite::FindBarSite(
  2670. CWnd * pWnd
  2671. )
  2672. {
  2673. HWND hWnd = pWnd->GetSafeHwnd();
  2674. if( hWnd == NULL )
  2675. return NULL;
  2676. return FindBarSite( hWnd );
  2677. }
  2678. CFrameWnd * CExtDynamicBarSite::DockSiteGet()
  2679. {
  2680. ASSERT( this != NULL );
  2681. return m_pDockSite;
  2682. }
  2683. HWND CExtDynamicBarSite::GetActiveMdiChildFrameHWND(
  2684. bool * p_bMaximized, // = NULL
  2685. CMDIChildWnd ** ppMDIChildWnd // = NULL
  2686. )
  2687. {
  2688. ASSERT( this != NULL );
  2689. if( p_bMaximized != NULL)
  2690. (*p_bMaximized) = false;
  2691. if( ppMDIChildWnd != NULL)
  2692. (*ppMDIChildWnd) = NULL;
  2693. HWND hWndMDIClient = GetMdiClient();
  2694. if( hWndMDIClient == NULL )
  2695. return NULL;
  2696. BOOL bMaximized = FALSE;
  2697. HWND hWndActiveMdiChildFrame = (HWND)
  2698. ::SendMessage(
  2699. hWndMDIClient,
  2700. WM_MDIGETACTIVE,
  2701. 0,
  2702. (LPARAM)&bMaximized
  2703. );
  2704. if( p_bMaximized != NULL)
  2705. (*p_bMaximized) = bMaximized ? true : false;
  2706. if( hWndActiveMdiChildFrame == NULL )
  2707. return NULL;
  2708. CWnd * pWndPermanent =
  2709. CWnd::FromHandlePermanent( hWndActiveMdiChildFrame );
  2710. if( pWndPermanent == NULL )
  2711. return hWndActiveMdiChildFrame;
  2712. CMDIChildWnd * pMDIChildWnd =
  2713. DYNAMIC_DOWNCAST(
  2714. CMDIChildWnd,
  2715. pWndPermanent
  2716. );
  2717. if( pMDIChildWnd == NULL )
  2718. return hWndActiveMdiChildFrame;
  2719. if( pMDIChildWnd->m_bPseudoInactive
  2720. && (pMDIChildWnd->GetStyle() & WS_VISIBLE) == 0
  2721. )
  2722. {
  2723. if( p_bMaximized != NULL)
  2724. (*p_bMaximized) = false;
  2725. }
  2726. else if( ppMDIChildWnd != NULL )
  2727. (*ppMDIChildWnd) = pMDIChildWnd;
  2728. return hWndActiveMdiChildFrame;
  2729. }
  2730. const CFrameWnd * CExtDynamicBarSite::DockSiteGet() const
  2731. {
  2732. ASSERT( this != NULL );
  2733. return m_pDockSite;
  2734. }
  2735. void CExtDynamicBarSite::Install( CFrameWnd * pDockSite )
  2736. {
  2737. ASSERT( this != NULL );
  2738. ASSERT( m_pDockSite == NULL );
  2739. m_pDockSite = pDockSite;
  2740. ASSERT_VALID( m_pDockSite );
  2741. ASSERT(
  2742. m_pDockSite->GetSafeHwnd() != NULL
  2743. && ::IsWindow( m_pDockSite->GetSafeHwnd() )
  2744. );
  2745. m_DbsHookSink.SetupHookWndSink( m_pDockSite->GetSafeHwnd() );
  2746. }
  2747. BOOL CExtDynamicBarSite::OnCmdMsg(
  2748. UINT nID,
  2749. int nCode,
  2750. void * pExtra,
  2751. AFX_CMDHANDLERINFO * pHandlerInfo
  2752. )
  2753. {
  2754. ASSERT( this != NULL );
  2755. pHandlerInfo;
  2756. if( nCode == CN_COMMAND || nCode == CN_UPDATE_COMMAND_UI )
  2757. {
  2758. POSITION pos = BarEnumGetStartPosition();
  2759. for( ; pos != NULL; )
  2760. {
  2761. CExtDynamicControlBar * pBar =
  2762. BarEnumGetNext( pos );
  2763. ASSERT_VALID( pBar );
  2764. if( UINT(pBar->GetDlgCtrlID()) == nID )
  2765. return
  2766. OnCmdMsgOneBar(
  2767. pBar,
  2768. nCode,
  2769. pExtra,
  2770. pHandlerInfo
  2771. );
  2772. } // for( ; pos != NULL; )
  2773. } // if( nCode == CN_COMMAND || nCode == CN_UPDATE_COMMAND_UI )
  2774. return FALSE;
  2775. }
  2776. BOOL CExtDynamicBarSite::OnCmdMsgOneBar(
  2777. CExtDynamicControlBar * pBar,
  2778. int nCode,
  2779. void * pExtra,
  2780. AFX_CMDHANDLERINFO * pHandlerInfo
  2781. )
  2782. {
  2783. ASSERT_VALID( pBar );
  2784. pHandlerInfo;
  2785. CFrameWnd * pDockSite = DockSiteGet();
  2786. if( pDockSite->GetSafeHwnd() == NULL )
  2787. return FALSE;
  2788. ASSERT_VALID( pDockSite );
  2789. ASSERT(
  2790. pDockSite->GetSafeHwnd() != NULL
  2791. && ::IsWindow( pDockSite->GetSafeHwnd() )
  2792. );
  2793. if( nCode == CN_COMMAND )
  2794. {
  2795. CExtDynamicControlBar::eDynamicBarState_t eDBS =
  2796. pBar->BarStateGet();
  2797. if( eDBS == CExtDynamicControlBar::__EDBS_DOCUMENT )
  2798. {
  2799. pBar->BarStateSet( eDBS, true );
  2800. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2801. if( GetDetectedUiType() == __EDUIT_SDI_TAB_PAGE_CONTAINER )
  2802. {
  2803. HWND hWndChild = pBar->OnQueryChildHWND();
  2804. CExtTabPageContainerWnd * pWndTabPageContainer =
  2805. GetTabPageContainer();
  2806. if( pWndTabPageContainer != NULL
  2807. && hWndChild != NULL
  2808. && ::IsWindow( hWndChild )
  2809. )
  2810. {
  2811. int nPageCount =
  2812. pWndTabPageContainer->PageGetCount();
  2813. for( int nPageIdx = 0; nPageIdx < nPageCount; nPageIdx++ )
  2814. {
  2815. HWND hWnd =
  2816. pWndTabPageContainer->PageHwndGetSafe(
  2817. nPageIdx
  2818. );
  2819. if( hWnd == hWndChild )
  2820. {
  2821. int nSelIdx =
  2822. pWndTabPageContainer->PageSelectionGet();
  2823. if( nSelIdx != nPageIdx )
  2824. pWndTabPageContainer->PageSelectionSet( nPageIdx );
  2825. break;
  2826. } // if( hWnd == hWndChild )
  2827. } // for( int nPageIdx = 0; nPageIdx < nPageCount; nPageIdx++ )
  2828. }
  2829. } // if( GetDetectedUiType() == __EDUIT_SDI_TAB_PAGE_CONTAINER )
  2830. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2831. } // if( eDBS == CExtDynamicControlBar::__EDBS_DOCUMENT )
  2832. else
  2833. CExtControlBar::DoFrameBarCheckCmd(
  2834. pDockSite,
  2835. UINT( pBar->GetDlgCtrlID() ),
  2836. OnDbsQueryUseCheckMarkCommand( pBar )
  2837. );
  2838. } // if( nCode == CN_COMMAND )
  2839. else
  2840. CExtControlBar::DoFrameBarCheckUpdate(
  2841. pDockSite,
  2842. (CCmdUI*)pExtra,
  2843. OnDbsQueryUseCheckMarkCommand( pBar )
  2844. );
  2845. return TRUE;
  2846. }
  2847. CExtDynamicMDIChildWnd * CExtDynamicBarSite::OnDbsCreateDynamicMDIChildWndInstance(
  2848. CExtDynamicControlBar * pBar
  2849. )
  2850. {
  2851. ASSERT_VALID( pBar );
  2852. CExtDynamicMDIChildWnd * pWndMdiChild = new CExtNCW < CExtDynamicMDIChildWnd >;
  2853. pWndMdiChild->AttachBar( pBar );
  2854. return pWndMdiChild;
  2855. }
  2856. bool CExtDynamicBarSite::OnDbsQueryUseCheckMarkCommand(
  2857. CExtDynamicControlBar * pBar
  2858. )
  2859. {
  2860. ASSERT_VALID( pBar );
  2861. return pBar->OnQueryUseCheckMarkCommand();
  2862. }
  2863. bool CExtDynamicBarSite::StateSerialize(
  2864. CArchive & ar,
  2865. bool bEnableThrowExceptions // = false
  2866. )
  2867. {
  2868. ASSERT( this != NULL );
  2869. DWORD dwGeneralFlags = 0;
  2870. DWORD dwReserved = 0L;
  2871. try
  2872. {
  2873. if( ar.IsStoring() )
  2874. {
  2875. ar << dwGeneralFlags;
  2876. ar << dwReserved;
  2877. ar << dwReserved;
  2878. ar << dwReserved;
  2879. ar << dwReserved;
  2880. DWORD dwCount = (DWORD)BarEnumGetCount();
  2881. ar << dwCount;
  2882. POSITION pos = BarEnumGetStartPosition();
  2883. for( ; pos != NULL; )
  2884. {
  2885. CExtDynamicControlBar * pBar =
  2886. BarEnumGetNext( pos );
  2887. ASSERT_VALID( pBar );
  2888. bool bVisibleState = false;
  2889. if( pBar->BarStateGet( &bVisibleState ) == CExtDynamicControlBar::__EDBS_DOCUMENT )
  2890. {
  2891. if( bVisibleState )
  2892. {
  2893. ASSERT( m_listBarsInDocMode.Find( pBar ) != NULL );
  2894. continue;
  2895. }
  2896. }
  2897. ASSERT( m_listBarsInDocMode.Find( pBar ) == NULL );
  2898. UINT nCmdID = (UINT)pBar->GetDlgCtrlID();
  2899. ar << DWORD(nCmdID);
  2900. bool bPersistentBar = pBar->IsPersistentBar(); 
  2901. DWORD dwSerializeFlags = 0;
  2902. if( bPersistentBar )
  2903. dwSerializeFlags |= 0x01;
  2904. ar << dwSerializeFlags;
  2905. if( ! bPersistentBar )
  2906. {
  2907. CRuntimeClass * pRTC = pBar->GetRuntimeClass();
  2908. ASSERT( pRTC != NULL );
  2909. ar.WriteClass( pRTC );
  2910. } // if( ! bPersistentBar )
  2911. ar << pBar->m_strCaptionText;
  2912. pBar->m_icon.Serialize( ar );
  2913. pBar->OnSerializeDynamicProps( ar );
  2914. } // for( ; pos != NULL; )
  2915. CTypedPtrList < CPtrList, CExtDynamicControlBar * > _listSerialize;
  2916. bool bUseDefaultOrder = true;
  2917. CExtDynamicBarSite::eDetectedUiType_t eDUIT = GetDetectedUiType();
  2918. eDUIT;
  2919. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2920. if( eDUIT == __EDUIT_MDI_WITH_TABS )
  2921. { // detect MDI order using tabs
  2922. CExtTabWnd * pTabs = GetMdiTabs();
  2923. if( pTabs != NULL )
  2924. {
  2925. LONG nIndex, nCount = pTabs->ItemGetCount();
  2926. for( nIndex = 0L; nIndex < nCount; nIndex ++ )
  2927. {
  2928. HWND hWnd = (HWND)pTabs->ItemGet( nIndex )->LParamGet();
  2929. CWnd * pWndPremanent = CWnd::FromHandlePermanent( hWnd );
  2930. if( pWndPremanent == NULL )
  2931. continue;
  2932. CExtDynamicMDIChildWnd * pWndMdiChild = DYNAMIC_DOWNCAST( CExtDynamicMDIChildWnd, pWndPremanent );
  2933. if( pWndMdiChild == NULL )
  2934. continue;
  2935. if( pWndMdiChild->GetBarSite() != this )
  2936. continue;
  2937. CExtDynamicControlBar * pBar = pWndMdiChild->GetBar();
  2938. if( pBar == NULL )
  2939. continue;
  2940. if( m_listBarsInDocMode.Find( pBar ) == NULL )
  2941. continue;
  2942. _listSerialize.AddTail( pBar );
  2943. } // for( nIndex = 0L; nIndex < nCount; nIndex ++ )
  2944. if( _listSerialize.GetCount() == m_listBarsInDocMode.GetCount() )
  2945. bUseDefaultOrder = false;
  2946. else
  2947. _listSerialize.RemoveAll();
  2948. } // if( pTabs != NULL )
  2949. } // detect MDI order using tabs
  2950. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2951. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2952. if( eDUIT == __EDUIT_SDI_TAB_PAGE_CONTAINER )
  2953. { // detect document mode order using SDI tab page container
  2954. CExtTabPageContainerWnd * pWndTabPageContainer = GetTabPageContainer();
  2955. if( pWndTabPageContainer->GetSafeHwnd() != NULL )
  2956. {
  2957. ASSERT_VALID( pWndTabPageContainer );
  2958. CTypedPtrList < CPtrList, CExtDynamicControlBar * >  _listFound;
  2959. INT nIndex = 0, nCount = pWndTabPageContainer->PageGetCount();
  2960. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  2961. {
  2962. HWND hWndPage = pWndTabPageContainer->PageHwndGetSafe( nIndex );
  2963. if( hWndPage == NULL )
  2964. continue;
  2965. CExtDynamicControlBar * pBar = BarFindByChildHWND( hWndPage );
  2966. if( pBar == NULL )
  2967. continue;
  2968. ASSERT_VALID( pBar );
  2969. #ifdef _DEBUG
  2970. bool bVisibleState = false;
  2971. ASSERT( pBar->BarStateGet( &bVisibleState ) == CExtDynamicControlBar::__EDBS_DOCUMENT );
  2972. ASSERT( bVisibleState );
  2973. #endif // _DEBUG
  2974. if( m_listBarsInDocMode.Find( pBar ) == NULL )
  2975. continue;
  2976. _listSerialize.AddTail( pBar );
  2977. }
  2978. if( _listSerialize.GetCount() == m_listBarsInDocMode.GetCount() )
  2979. bUseDefaultOrder = false;
  2980. else
  2981. _listSerialize.RemoveAll();
  2982. }
  2983. } // detect document mode order using SDI tab page container
  2984. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  2985. if( bUseDefaultOrder )
  2986. _listSerialize.AddTail( &m_listBarsInDocMode );
  2987. //pos = m_listBarsInDocMode.GetTailPosition();
  2988. pos = _listSerialize.GetTailPosition();
  2989. for( ; pos != NULL; )
  2990. {
  2991. //CExtDynamicControlBar * pBar = m_listBarsInDocMode.GetPrev( pos );
  2992. CExtDynamicControlBar * pBar = _listSerialize.GetPrev( pos );
  2993. ASSERT_VALID( pBar );
  2994. ASSERT( pBar->BarStateGet() == CExtDynamicControlBar::__EDBS_DOCUMENT );
  2995. UINT nCmdID = (UINT)pBar->GetDlgCtrlID();
  2996. ar << DWORD(nCmdID);
  2997. bool bPersistentBar = pBar->IsPersistentBar(); 
  2998. DWORD dwSerializeFlags = 0;
  2999. if( bPersistentBar )
  3000. dwSerializeFlags |= 0x01;
  3001. ar << dwSerializeFlags;
  3002. if( ! bPersistentBar )
  3003. {
  3004. CRuntimeClass * pRTC = pBar->GetRuntimeClass();
  3005. ASSERT( pRTC != NULL );
  3006. ar.WriteClass( pRTC );
  3007. } // if( ! bPersistentBar )
  3008. ar << pBar->m_strCaptionText;
  3009. pBar->m_icon.Serialize( ar );
  3010. pBar->OnSerializeDynamicProps( ar );
  3011. } // for( ; pos != NULL; )
  3012. } // if( ar.IsStoring() )
  3013. else
  3014. {
  3015. ar >> dwGeneralFlags;
  3016. ar >> dwReserved;
  3017. ar >> dwReserved;
  3018. ar >> dwReserved;
  3019. ar >> dwReserved;
  3020. BarFreeAll( false, true );
  3021. m_listBarsInDocMode.RemoveAll();
  3022. ASSERT( BarEnumGetCount( false, true ) == 0 );
  3023. DWORD dwCount;
  3024. ar >> dwCount;
  3025. for( DWORD dwIndex = 0; dwIndex < dwCount; dwIndex++ )
  3026. {
  3027. UINT nCmdID;
  3028. DWORD dwTmp;
  3029. ar >> dwTmp;
  3030. nCmdID = UINT(dwTmp);
  3031. DWORD dwSerializeFlags;
  3032. ar >> dwSerializeFlags;
  3033. CExtDynamicControlBar * pBar = NULL;
  3034. if( (dwSerializeFlags & 0x01) != 0 )
  3035. { // if serializing persistent bar
  3036. pBar = BarGetByCmdID( nCmdID );
  3037. if( pBar == NULL )
  3038. {
  3039. ASSERT( FALSE );
  3040. BarFreeAll( false, true );
  3041. #if _MFC_VER >= 0x0800
  3042. ::AfxThrowArchiveException( CArchiveException::genericException );
  3043. #else
  3044. ::AfxThrowArchiveException( CArchiveException::generic );
  3045. #endif
  3046. } // if( pBar == NULL )
  3047. ASSERT_VALID( pBar );
  3048. ar >> pBar->m_strCaptionText;
  3049. pBar->m_icon.Serialize( ar );
  3050. } // if serializing persistent bar
  3051. else
  3052. { // if serializing dynamic bar
  3053. CRuntimeClass * pRTC = ar.ReadClass();
  3054. ASSERT( pRTC != NULL );
  3055. CExtSafeString strCaptionText;
  3056. ar >> strCaptionText;
  3057. CExtCmdIcon icon;
  3058. icon.Serialize( ar );
  3059. pBar =
  3060. BarAlloc(
  3061. strCaptionText,
  3062. icon,
  3063. nCmdID,
  3064. pRTC
  3065. );
  3066. if( pBar == NULL )
  3067. {
  3068. ASSERT( FALSE );
  3069. BarFreeAll( false, true );
  3070. #if _MFC_VER >= 0x0800
  3071. ::AfxThrowArchiveException( CArchiveException::genericException );
  3072. #else
  3073. ::AfxThrowArchiveException( CArchiveException::generic );
  3074. #endif
  3075. } // if( pBar == NULL )
  3076. } // if serializing dynamic bar
  3077. ASSERT_VALID( pBar );
  3078. pBar->OnSerializeDynamicProps( ar );
  3079. } // for( DWORD dwIndex = 0; dwIndex < dwCount; dwIndex++ )
  3080. ASSERT( ((DWORD)BarEnumGetCount()) == dwCount );
  3081. } // else from if( ar.IsStoring() )
  3082. return true;
  3083. } // try
  3084. catch( CException * pException )
  3085. {
  3086. if( bEnableThrowExceptions )
  3087. throw;
  3088. pException->Delete();
  3089. } // catch( CException * pException )
  3090. catch( ... )
  3091. {
  3092. if( bEnableThrowExceptions )
  3093. throw;
  3094. } // catch( ... )
  3095. dwGeneralFlags;
  3096. dwReserved;
  3097. return false;
  3098. }
  3099. bool CExtDynamicBarSite::StateLoad(
  3100. __EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USERSoftware
  3101. __EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USERSoftware%sSectionNameCompany%
  3102. __EXT_MFC_SAFE_LPCTSTR sSectionNameProfile, // under HKEY_CURRENT_USERSoftware%sSectionNameCompany%%sSectionNameProfile%
  3103. HKEY hKeyRoot, // = HKEY_CURRENT_USER
  3104. bool bEnableThrowExceptions // = false
  3105. )
  3106. {
  3107. ASSERT( this != NULL );
  3108. ASSERT( sSectionNameCompany != NULL );
  3109. ASSERT( sSectionNameProduct != NULL );
  3110. ASSERT( sSectionNameProfile != NULL );
  3111. const CFrameWnd * pDockSite = DockSiteGet();
  3112. if( pDockSite->GetSafeHwnd() == NULL )
  3113. {
  3114. if( bEnableThrowExceptions )
  3115. ::AfxThrowUserException();
  3116. return false;
  3117. }
  3118. ASSERT_VALID( pDockSite );
  3119. ASSERT(
  3120. pDockSite->GetSafeHwnd() != NULL
  3121. && ::IsWindow( pDockSite->GetSafeHwnd() )
  3122. );
  3123. CExtSafeString sRegKeyPath =
  3124. CExtCmdManager::GetSubSystemRegKeyPath(
  3125. __PROF_UIS_REG_DBS,
  3126. sSectionNameProfile,
  3127. sSectionNameCompany,
  3128. sSectionNameProduct
  3129. );
  3130. try
  3131. {
  3132. CMemFile _file;
  3133. if( ! CExtCmdManager::FileObjFromRegistry(
  3134. _file,
  3135. sRegKeyPath,
  3136. hKeyRoot,
  3137. bEnableThrowExceptions
  3138. )
  3139. )
  3140. return false;
  3141. CArchive ar(
  3142. &_file,
  3143. CArchive::load
  3144. );
  3145. if( ! StateSerialize( ar ) )
  3146. return false;
  3147. return true;
  3148. } // try
  3149. catch( CException * pXept )
  3150. {
  3151. if( bEnableThrowExceptions )
  3152. throw;
  3153. pXept->Delete();
  3154. //ASSERT( FALSE );
  3155. } // catch( CException * pXept )
  3156. catch( ... )
  3157. {
  3158. if( bEnableThrowExceptions )
  3159. throw;
  3160. //ASSERT( FALSE );
  3161. } // catch( ... )
  3162. return false;
  3163. }
  3164. bool CExtDynamicBarSite::StateSave(
  3165. __EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USERSoftware
  3166. __EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USERSoftware%sSectionNameCompany%
  3167. __EXT_MFC_SAFE_LPCTSTR sSectionNameProfile, // under HKEY_CURRENT_USERSoftware%sSectionNameCompany%%sSectionNameProfile%
  3168. HKEY hKeyRoot, // = HKEY_CURRENT_USER
  3169. bool bEnableThrowExceptions // = false
  3170. )
  3171. {
  3172. ASSERT( this != NULL );
  3173. ASSERT( sSectionNameCompany != NULL );
  3174. ASSERT( sSectionNameProduct != NULL );
  3175. ASSERT( sSectionNameProfile != NULL );
  3176. const CFrameWnd * pDockSite = DockSiteGet();
  3177. if( pDockSite->GetSafeHwnd() == NULL )
  3178. {
  3179. if( bEnableThrowExceptions )
  3180. ::AfxThrowUserException();
  3181. return false;
  3182. }
  3183. ASSERT_VALID( pDockSite );
  3184. ASSERT(
  3185. pDockSite->GetSafeHwnd() != NULL
  3186. && ::IsWindow( pDockSite->GetSafeHwnd() )
  3187. );
  3188. CExtSafeString sRegKeyPath =
  3189. CExtCmdManager::GetSubSystemRegKeyPath(
  3190. __PROF_UIS_REG_DBS,
  3191. sSectionNameProfile,
  3192. sSectionNameCompany,
  3193. sSectionNameProduct
  3194. );
  3195. try
  3196. {
  3197. CMemFile _file;
  3198. CArchive ar(
  3199. &_file,
  3200. CArchive::store
  3201. );
  3202. if( ! StateSerialize( ar ) )
  3203. return false;
  3204. ar.Flush();
  3205. ar.Close();
  3206. if( ! CExtCmdManager::FileObjToRegistry(
  3207. _file,
  3208. sRegKeyPath,
  3209. hKeyRoot,
  3210. bEnableThrowExceptions
  3211. )
  3212. )
  3213. return false;
  3214. return true;
  3215. } // try
  3216. catch( CException * pXept )
  3217. {
  3218. if( bEnableThrowExceptions )
  3219. throw;
  3220. pXept->Delete();
  3221. //ASSERT( FALSE );
  3222. } // catch( CException * pXept )
  3223. catch( ... )
  3224. {
  3225. if( bEnableThrowExceptions )
  3226. throw;
  3227. //ASSERT( FALSE );
  3228. } // catch( ... )
  3229. return false;
  3230. }
  3231. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  3232. bool CExtDynamicBarSite::OnTabPageContainerClickedButton(
  3233. LONG nHitTest,
  3234. bool bButtonPressed,
  3235. INT nMouseButton, // MK_... values
  3236. UINT nMouseEventFlags
  3237. )
  3238. {
  3239. ASSERT( this != NULL );
  3240. ASSERT( GetDetectedUiType() == __EDUIT_SDI_TAB_PAGE_CONTAINER );
  3241. CExtTabPageContainerWnd * pWndTabPageContainer = GetTabPageContainer();
  3242. ASSERT_VALID( pWndTabPageContainer );
  3243. nMouseButton;
  3244. nMouseEventFlags;
  3245. nHitTest;
  3246. if( bButtonPressed
  3247. || nMouseButton != MK_LBUTTON
  3248. || nHitTest != __ETWH_BUTTON_CLOSE
  3249. || pWndTabPageContainer->PageGetCount() == 0
  3250. )
  3251. return true;
  3252. int nSel = pWndTabPageContainer->PageSelectionGet();
  3253. if( nSel < 0 )
  3254. return true;
  3255. HWND hWndChild =
  3256. pWndTabPageContainer->PageHwndGetSafe( nSel );
  3257. if( hWndChild == NULL )
  3258. return true;
  3259. ASSERT( ::IsWindow( hWndChild ) );
  3260. CExtDynamicControlBar * pBar =
  3261. BarFindByChildHWND( hWndChild );
  3262. if( pBar == NULL )
  3263. return true;
  3264. if( ! pBar->_ClosingIsEnabled( pBar ) )
  3265. return true;
  3266. pBar->BarStateSet(
  3267. CExtDynamicControlBar::__EDBS_DOCUMENT,
  3268. false
  3269. );
  3270. return true;
  3271. }
  3272. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  3273. bool CExtDynamicBarSite::OnPreparePopupMenu( CExtPopupMenuWnd * pPopup )
  3274. {
  3275. ASSERT( this != NULL );
  3276. ASSERT_VALID( pPopup );
  3277. if( m_nBarListInMenusCmdID == 0 )
  3278. return false;
  3279. bool bRetVal = false;
  3280. INT nItemCount = pPopup->ItemGetCount();
  3281. for( INT nItemIndex = 0; nItemIndex < nItemCount; )
  3282. {
  3283. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  3284. pPopup->ItemGetInfo( nItemIndex );
  3285. if( _mii.IsSeparator() )
  3286. {
  3287. nItemIndex ++;
  3288. continue;
  3289. }
  3290. if( _mii.IsPopup() )
  3291. {
  3292. CExtPopupMenuWnd * pSubPopup =
  3293. _mii.GetPopup();
  3294. ASSERT_VALID( pSubPopup );
  3295. if( OnPreparePopupMenu( pSubPopup ) )
  3296. bRetVal = true;
  3297. nItemIndex ++;
  3298. continue;
  3299. }
  3300. UINT nCmdID = _mii.GetCmdID();
  3301. if( nCmdID != m_nBarListInMenusCmdID )
  3302. {
  3303. nItemIndex ++;
  3304. continue;
  3305. }
  3306. pPopup->ItemRemove( nItemIndex );
  3307. nItemCount--;
  3308. if( nItemIndex > 0
  3309. && pPopup->ItemGetInfo(nItemIndex-1).IsSeparator()
  3310. )
  3311. {
  3312. nItemIndex--;
  3313. nItemCount--;
  3314. pPopup->ItemRemove( nItemIndex );
  3315. }
  3316. INT nInsertedCount =
  3317. OnPrepareBarsListInMenu(
  3318. pPopup,
  3319. nItemIndex
  3320. );
  3321. if( nInsertedCount == 0 )
  3322. continue;
  3323. bRetVal = true;
  3324. if( nItemIndex > 0
  3325. && (! pPopup->ItemGetInfo(nItemIndex-1).IsSeparator() )
  3326. )
  3327. {
  3328. pPopup->ItemInsert( ID_SEPARATOR, nItemIndex );
  3329. nItemIndex++;
  3330. nItemCount++;
  3331. }
  3332. nItemIndex += nInsertedCount;
  3333. nItemCount += nInsertedCount;
  3334. } // for( INT nItemIndex = 0; nItemIndex < nItemCount; )
  3335. return bRetVal;
  3336. }
  3337. INT CExtDynamicBarSite::OnPrepareBarsListInMenu(
  3338. CExtPopupMenuWnd * pPopup,
  3339. INT nInsertPos
  3340. )
  3341. {
  3342. ASSERT( this != NULL );
  3343. ASSERT_VALID( pPopup );
  3344. ASSERT( 0 <= nInsertPos && nInsertPos <= pPopup->ItemGetCount() );
  3345. POSITION pos = BarEnumGetStartPosition();
  3346. INT nInsertedCount = 0;
  3347. for( ; pos != NULL; )
  3348. {
  3349. CExtDynamicControlBar * pBar =
  3350. BarEnumGetNext( pos );
  3351. ASSERT_VALID( pBar );
  3352. ASSERT( pBar->GetSafeHwnd() != NULL );
  3353. ASSERT_VALID( pBar->m_pDockBar );
  3354. ASSERT( pBar->m_pDockSite == DockSiteGet() );
  3355. if( pBar->OnInsertDynamicBarCommandIntoPopupMenu(
  3356. pPopup,
  3357. nInsertPos + nInsertedCount
  3358. )
  3359. )
  3360. nInsertedCount++;
  3361. } // for( ; pos != NULL; )
  3362. return nInsertedCount;
  3363. }
  3364. UINT CExtDynamicBarSite::OnDbsAllocNewBarCommandID(
  3365. __EXT_MFC_SAFE_LPCTSTR strCaptionText,
  3366. const CExtCmdIcon & icon,
  3367. UINT nDesiredCmdID // = 0
  3368. ) const
  3369. {
  3370. ASSERT( this != NULL );
  3371. const CFrameWnd * pDockSite = DockSiteGet();
  3372. if( pDockSite->GetSafeHwnd() == NULL )
  3373. return 0;
  3374. ASSERT_VALID( pDockSite );
  3375. ASSERT(
  3376. pDockSite->GetSafeHwnd() != NULL
  3377. && ::IsWindow( pDockSite->GetSafeHwnd() )
  3378. );
  3379. LPCTSTR strProfileName =
  3380. g_CmdManager->ProfileNameFromWnd(
  3381. pDockSite->GetSafeHwnd()
  3382. );
  3383. if( strProfileName == NULL )
  3384. return 0;
  3385. CExtCmdItem * pCmdItem =
  3386. g_CmdManager->CmdAllocPtr(
  3387. strProfileName,
  3388. nDesiredCmdID
  3389. );
  3390. if( pCmdItem == NULL )
  3391. return 0;
  3392. if( strCaptionText != NULL )
  3393. {
  3394. pCmdItem->m_sMenuText = strCaptionText;
  3395. pCmdItem->m_sToolbarText = strCaptionText;
  3396. } // if( strCaptionText != NULL )
  3397. if( ! icon.IsEmpty() )
  3398. g_CmdManager->CmdSetIcon(
  3399. strProfileName,
  3400. pCmdItem->m_nCmdID,
  3401. icon
  3402. );
  3403. return pCmdItem->m_nCmdID;
  3404. }
  3405. void CExtDynamicBarSite::OnDbsFreeBarCommandID( UINT nCmdID ) const
  3406. {
  3407. ASSERT( this != NULL );
  3408. const CFrameWnd * pDockSite = DockSiteGet();
  3409. if( pDockSite->GetSafeHwnd() == NULL )
  3410. return;
  3411. ASSERT_VALID( pDockSite );
  3412. ASSERT(
  3413. pDockSite->GetSafeHwnd() != NULL
  3414. && ::IsWindow( pDockSite->GetSafeHwnd() )
  3415. );
  3416. LPCTSTR strProfileName =
  3417. g_CmdManager->ProfileNameFromWnd(
  3418. pDockSite->GetSafeHwnd()
  3419. );
  3420. if( strProfileName == NULL )
  3421. return;
  3422. g_CmdManager->CmdSetIcon( strProfileName, nCmdID, (HICON)NULL );
  3423. g_CmdManager->CmdRemove( strProfileName, nCmdID );
  3424. }
  3425. void CExtDynamicBarSite::OnDbsResetPageSequence()
  3426. {
  3427. ASSERT( this != NULL );
  3428. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  3429. if( GetDetectedUiType() == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER )
  3430. {
  3431. CExtTabPageContainerWnd * pWndTabPageContainer = GetTabPageContainer();
  3432. if( pWndTabPageContainer->GetSafeHwnd() == NULL )
  3433. return;
  3434. ASSERT_VALID( pWndTabPageContainer );
  3435. CTypedPtrList < CPtrList, CExtDynamicControlBar * >  _listFound;
  3436. INT nIndex = 0, nCount = pWndTabPageContainer->PageGetCount();
  3437. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  3438. {
  3439. HWND hWndPage = pWndTabPageContainer->PageHwndGetSafe( nIndex );
  3440. if( hWndPage == NULL )
  3441. continue;
  3442. CExtDynamicControlBar * pBar = BarFindByChildHWND( hWndPage );
  3443. if( pBar == NULL )
  3444. continue;
  3445. ASSERT_VALID( pBar );
  3446. #ifdef _DEBUG
  3447. bool bVisibleState = false;
  3448. ASSERT( pBar->BarStateGet( &bVisibleState ) == CExtDynamicControlBar::__EDBS_DOCUMENT );
  3449. ASSERT( bVisibleState );
  3450. #endif // _DEBUG
  3451. ASSERT( m_listBarsInDocMode.Find( pBar ) != NULL );
  3452. _listFound.AddTail( pBar );
  3453. }
  3454. if( _listFound.GetCount() == m_listBarsInDocMode.GetCount() )
  3455. {
  3456. m_listBarsInDocMode.RemoveAll();
  3457. m_listBarsInDocMode.AddTail( &_listFound );
  3458. ASSERT( _listFound.GetCount() == m_listBarsInDocMode.GetCount() );
  3459. }
  3460. return;
  3461. } // if( GetDetectedUiType() == CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER )
  3462. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  3463. }
  3464. CExtDynamicControlBar * CExtDynamicBarSite::OnDbsCreateNewBarInstance() const
  3465. {
  3466. ASSERT( this != NULL );
  3467. return new CExtDynamicControlBar;
  3468. }
  3469. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3470. CExtDynamicTabbedControlBar * CExtDynamicBarSite::OnDbsCreateTabbedBarInstance() const
  3471. {
  3472. ASSERT( this != NULL );
  3473. CExtDynamicTabbedControlBar * pBar = new CExtDynamicTabbedControlBar;
  3474. return pBar;
  3475. }
  3476. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3477. //CExtDynamicControlBar * CExtDynamicBarSite::BarFindAnyVisible()
  3478. //{
  3479. // ASSERT( this != NULL );
  3480. //CFrameWnd * pDockSite = DockSiteGet();
  3481. // if( pDockSite->GetSafeHwnd() == NULL )
  3482. // return NULL;
  3483. // ASSERT_VALID( pDockSite );
  3484. // ASSERT(
  3485. // pDockSite->GetSafeHwnd() != NULL
  3486. // && ::IsWindow( pDockSite->GetSafeHwnd() )
  3487. // );
  3488. //POSITION pos = BarEnumGetStartPosition();
  3489. // for( ; pos != NULL; )
  3490. // {
  3491. // ASSERT( pos != NULL );
  3492. // CExtDynamicControlBar * pBar =
  3493. // BarEnumGetNext( pos );
  3494. // ASSERT_VALID( pBar );
  3495. // ASSERT( pBar->GetSafeHwnd() != NULL );
  3496. // ASSERT_VALID( pBar->m_pDockBar );
  3497. // ASSERT( pBar->m_pDockSite == pDockSite );
  3498. // if( pBar->AutoHideModeGet() )
  3499. // continue;
  3500. // if( ! pBar->IsVisible() )
  3501. // continue;
  3502. // return pBar;
  3503. // } // for( ; pos != NULL; )
  3504. // return NULL;
  3505. //}
  3506. CExtDynamicControlBar * CExtDynamicBarSite::BarFindByChildHWND( HWND hWndChildToFind )
  3507. {
  3508. ASSERT( this != NULL );
  3509. ASSERT( hWndChildToFind != NULL && ::IsWindow( hWndChildToFind ) );
  3510. POSITION pos = BarEnumGetStartPosition();
  3511. for( ; pos != NULL; )
  3512. {
  3513. ASSERT( pos != NULL );
  3514. CExtDynamicControlBar * pBar =
  3515. BarEnumGetNext( pos );
  3516. ASSERT_VALID( pBar );
  3517. ASSERT( pBar->GetSafeHwnd() != NULL );
  3518. ASSERT_VALID( pBar->m_pDockBar );
  3519. HWND hWnd = pBar->OnQueryChildHWND();
  3520. if( hWnd == NULL )
  3521. continue;
  3522. if( hWndChildToFind == hWnd )
  3523. return pBar;
  3524. } // for( ; pos != NULL; )
  3525. return NULL;
  3526. }
  3527. CExtDynamicControlBar * CExtDynamicBarSite::BarAlloc(
  3528. __EXT_MFC_SAFE_LPCTSTR strCaptionText,
  3529. const CExtCmdIcon & icon,
  3530. UINT nDesiredCmdID, // = 0
  3531. CRuntimeClass * pDesiredRTC, // = NULL
  3532. bool bPersistentBar // = false
  3533. )
  3534. {
  3535. ASSERT( this != NULL );
  3536. CFrameWnd * pDockSite = DockSiteGet();
  3537. if( pDockSite->GetSafeHwnd() == NULL )
  3538. return NULL;
  3539. ASSERT_VALID( pDockSite );
  3540. ASSERT(
  3541. pDockSite->GetSafeHwnd() != NULL
  3542. && ::IsWindow( pDockSite->GetSafeHwnd() )
  3543. );
  3544. UINT nCmdID =
  3545. OnDbsAllocNewBarCommandID(
  3546. strCaptionText,
  3547. icon,
  3548. nDesiredCmdID
  3549. );
  3550. if( nCmdID == 0 )
  3551. return NULL;
  3552. CExtDynamicControlBar * pBar =
  3553. ( pDesiredRTC != NULL )
  3554. ? ( (CExtDynamicControlBar *) pDesiredRTC->CreateObject() )
  3555. : OnDbsCreateNewBarInstance()
  3556. ;
  3557. if( pBar == NULL )
  3558. {
  3559. OnDbsFreeBarCommandID( nCmdID );
  3560. return NULL;
  3561. }
  3562. ASSERT_VALID( pBar );
  3563. ASSERT_KINDOF( CExtDynamicControlBar, pBar );
  3564. pBar->m_bPersistentBar = bPersistentBar;
  3565. if( ! pBar->Create(
  3566. ( strCaptionText == NULL )
  3567. ? _T("") : strCaptionText,
  3568. pDockSite,
  3569. nCmdID,
  3570. WS_CHILD //|WS_VISIBLE
  3571. |WS_CLIPCHILDREN|WS_CLIPSIBLINGS
  3572. |CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS
  3573. |CBRS_FLYBY|CBRS_SIZE_DYNAMIC
  3574. |CBRS_HIDE_INPLACE
  3575. )
  3576. )
  3577. {
  3578. OnDbsFreeBarCommandID( nCmdID );
  3579. delete pBar;
  3580. return NULL;
  3581. }
  3582. pBar->m_strCaptionText =
  3583. ( strCaptionText == NULL )
  3584. ? _T("") : strCaptionText;
  3585. pBar->m_icon = icon;
  3586. //CExtDynamicControlBar * pOtherBar = BarFindAnyVisible();
  3587. m_mapBars.SetAt( pBar, NULL );
  3588. m_listBars.AddTail( pBar );
  3589. pBar->EnableDocking( CBRS_ALIGN_ANY );
  3590. // if( pOtherBar != NULL )
  3591. // {
  3592. // ASSERT_VALID( pOtherBar );
  3593. // VERIFY(
  3594. // pOtherBar->DockControlBarIntoTabbedContainer(
  3595. // pBar,
  3596. // -1,
  3597. // pDockSite,
  3598. // false
  3599. // )
  3600. // );
  3601. // } // if( pOtherBar != NULL )
  3602. // else
  3603. {
  3604. VERIFY(
  3605. pBar->DockControlBarInnerOuter(
  3606. AFX_IDW_DOCKBAR_LEFT,
  3607. true,
  3608. pDockSite,
  3609. false
  3610. )
  3611. );
  3612. pDockSite->ShowControlBar( pBar, FALSE, TRUE );
  3613. } // else from if( pOtherBar != NULL )
  3614. return pBar;
  3615. }
  3616. void CExtDynamicBarSite::BarFree( CExtDynamicControlBar * pBar )
  3617. {
  3618. ASSERT( this != NULL );
  3619. _BarFreeImpl(
  3620. pBar,
  3621. false,
  3622. false
  3623. );
  3624. }
  3625. void CExtDynamicBarSite::_BarFreeImpl(
  3626. CExtDynamicControlBar * pBar,
  3627. bool bForceFloatMode,
  3628. bool bForceNoOptimizeMode
  3629. )
  3630. {
  3631. ASSERT( this != NULL );
  3632. ASSERT_VALID( pBar );
  3633. UINT nCmdID = (UINT)pBar->GetDlgCtrlID();
  3634. bool bPersistentBar = pBar->IsPersistentBar();
  3635. if( pBar->m_pDockSite != NULL && pBar->m_pDockBar != NULL )
  3636. {
  3637. ASSERT_VALID( pBar->m_pDockSite );
  3638. ASSERT_VALID( pBar->m_pDockBar );
  3639. HWND hWndChild = pBar->OnQueryChildHWND();
  3640. if( hWndChild != NULL && ::IsWindow( hWndChild ) )
  3641. {
  3642. //pBar->BarStateSet( CExtDynamicControlBar::__EDBS_DOCKED, false );
  3643. HWND hWndContainer = ::GetParent( hWndChild );
  3644. if( hWndContainer != pBar->m_hWnd )
  3645. {
  3646. CWnd * pWndPermanent =
  3647. CWnd::FromHandlePermanent( hWndContainer );
  3648. if( pWndPermanent != NULL )
  3649. {
  3650. CExtDynamicBarSite::eDetectedUiType_t eDUIT =
  3651. GetDetectedUiType();
  3652. if( eDUIT == __EDUIT_MDI_ORDINARY
  3653. || eDUIT == __EDUIT_MDI_WITH_TABS
  3654. )
  3655. { // if MDI environment
  3656. CExtDynamicMDIChildWnd * pWndMdiChild =
  3657. DYNAMIC_DOWNCAST(
  3658. CExtDynamicMDIChildWnd,
  3659. pWndPermanent
  3660. );
  3661. if( pWndMdiChild != NULL )
  3662. {
  3663. pWndMdiChild->DestroyWindow();
  3664. } // if( pWndMdiChild != NULL )
  3665. } // if MDI environment
  3666. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  3667. else if( eDUIT == __EDUIT_SDI_TAB_PAGE_CONTAINER )
  3668. { // if SDI tab page container environment
  3669. CExtTabPageContainerWnd * pWndTabPageContainer =
  3670. DYNAMIC_DOWNCAST(
  3671. CExtTabPageContainerWnd,
  3672. pWndPermanent
  3673. );
  3674. if( pWndTabPageContainer != NULL )
  3675. {
  3676. int nPageCount =
  3677. pWndTabPageContainer->PageGetCount();
  3678. for( int nPageIdx = 0; nPageIdx < nPageCount; nPageIdx++ )
  3679. {
  3680. HWND hWnd =
  3681. pWndTabPageContainer->PageHwndGetSafe(
  3682. nPageIdx
  3683. );
  3684. if( hWnd == hWndChild )
  3685. {
  3686. pWndTabPageContainer->
  3687. PageRemove( nPageIdx, 1, true );
  3688. break;
  3689. } // if( hWnd == hWndChild )
  3690. } // for( int nPageIdx = 0; nPageIdx < nPageCount; nPageIdx++ )
  3691. } // if( pWndTabPageContainer != NULL )
  3692. } // if SDI tab page container environment
  3693. #endif // (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL)
  3694. } // if( pWndPermanent != NULL )
  3695. } // if( hWndContainer != pBar->m_hWnd )
  3696. } // if( hWndChild != NULL && ::IsWindow( hWndChild ) )
  3697. } // if( pBar->m_pDockSite != NULL && pBar->m_pDockBar != NULL )
  3698. if( pBar->m_pDockBar == NULL
  3699. || bForceFloatMode
  3700. )
  3701. {
  3702. CWnd * pWnd = NULL;
  3703. if( ! m_mapBars.Lookup( pBar, pWnd ) )
  3704. return;
  3705. m_mapBars.RemoveKey( pBar );
  3706. POSITION posInList = m_listBars.Find( pBar );
  3707. if( posInList != NULL )
  3708. m_listBars.RemoveAt( posInList );
  3709. posInList = m_listBarsInDocMode.Find( pBar );
  3710. if( posInList != NULL )
  3711. m_listBarsInDocMode.RemoveAt( posInList );
  3712. if( pBar->m_pDockBar != NULL )
  3713. {
  3714. CMiniDockFrameWnd * pMiniFrame = NULL;
  3715. CWnd * pWnd = pBar->GetParentFrame();
  3716. if( pWnd != NULL )
  3717. {
  3718. pMiniFrame = 
  3719. DYNAMIC_DOWNCAST(
  3720. CMiniDockFrameWnd,
  3721. pBar->GetDockingFrame()
  3722. );
  3723. }
  3724. int nPos = pBar->m_pDockBar->FindBar( pBar );
  3725. if( nPos > 0 )
  3726. {
  3727. // VERIFY( pBar->m_pDockBar->RemoveControlBar(pBar) );
  3728. pBar->m_pDockBar->m_arrBars.RemoveAt( nPos );
  3729. }
  3730. CFrameWnd * pDockSite = DockSiteGet();
  3731. if( pDockSite->GetSafeHwnd() != NULL )
  3732. pDockSite->RemoveControlBar( pBar );
  3733. pBar->m_pDockSite = NULL;
  3734. pBar->m_pDockBar = NULL;
  3735. if( pMiniFrame != NULL )
  3736. pMiniFrame->DestroyWindow();
  3737. else
  3738. pBar->DestroyWindow();
  3739. } // if( pBar->m_pDockBar != NULL )
  3740. return;
  3741. }
  3742. ASSERT_VALID( pBar->m_pDockBar );
  3743. CFrameWnd * pDockSite = DockSiteGet();
  3744. if( pDockSite->GetSafeHwnd() == NULL )
  3745. return;
  3746. ASSERT_VALID( pDockSite );
  3747. ASSERT( pBar->m_pDockSite == pDockSite );
  3748. ASSERT(
  3749. pDockSite->GetSafeHwnd() != NULL
  3750. && ::IsWindow( pDockSite->GetSafeHwnd() )
  3751. );
  3752. CWnd * pWnd = NULL;
  3753. if( ! m_mapBars.Lookup( pBar, pWnd ) )
  3754. return;
  3755. CMiniDockFrameWnd * pMiniFrame = NULL;
  3756. if( pBar->IsFloating() )
  3757. {
  3758. pMiniFrame = 
  3759. DYNAMIC_DOWNCAST(
  3760. CMiniDockFrameWnd,
  3761. pBar->GetDockingFrame()
  3762. );
  3763. ASSERT_VALID( pMiniFrame );
  3764. } // if( pBar->IsFloating() )
  3765. else
  3766. {
  3767. ASSERT( ! pBar->m_pDockBar->m_bFloating );
  3768. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3769. if( pBar->AutoHideModeGet() )
  3770. {
  3771. ASSERT_KINDOF( CExtDockBar, pBar->m_pDockBar );
  3772. CExtDynAutoHideArea * pWndAutoHideArea =
  3773. ((CExtDockBar*)pBar->m_pDockBar)->_GetAutoHideArea();
  3774. ASSERT_VALID( pWndAutoHideArea );
  3775. CExtDynAutoHideSlider * pWndSlider =
  3776. pWndAutoHideArea->GetAutoHideSlider();
  3777. ASSERT_VALID( pWndSlider );
  3778. if( (pWndSlider->GetStyle()&WS_VISIBLE) != 0 )
  3779. pWndSlider->SendMessage( WM_CANCELMODE );
  3780. pWndAutoHideArea->RemoveControlBar( pBar, true );
  3781. } // if( pBar->AutoHideModeGet() )
  3782. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3783. if( pBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  3784. {
  3785. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3786. if( pBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  3787. {
  3788. CExtDynTabControlBar * pTabbedBar =
  3789. STATIC_DOWNCAST(
  3790. CExtDynTabControlBar,
  3791. pBar->m_pDockBar->GetParent()
  3792. );
  3793. LONG nIdx = pTabbedBar->FindControlBar( pBar );
  3794. if( nIdx >= 0 )
  3795. {
  3796. LONG nSel = pTabbedBar->GetSwitcherSelection();
  3797. if( nIdx != nSel )
  3798. pTabbedBar->SetSwitcherSelection( nIdx );
  3799. pTabbedBar->RemoveSelFromSwitcher();
  3800. } // if( nIdx >= 0 )
  3801. } // if( pBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  3802. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3803. VERIFY(
  3804. ((CExtDockBar *)pBar->m_pDockBar)->
  3805. RemoveControlBar( pBar, -1, 0, false )
  3806. );
  3807. }
  3808. else
  3809. {
  3810. VERIFY( pBar->m_pDockBar->RemoveControlBar(pBar) );
  3811. }
  3812. } // else from if( pBar->IsFloating() )
  3813. pDockSite->RemoveControlBar( pBar );
  3814. pBar->m_pDockSite = NULL;
  3815. INT nPosInDockBar = pBar->m_pDockBar->FindBar( pBar );
  3816. if( nPosInDockBar >= 0 )
  3817. {
  3818. pBar->m_pDockBar->m_arrBars.RemoveAt( nPosInDockBar );
  3819. if( nPosInDockBar > 1
  3820. && pBar->m_pDockBar->m_arrBars[ nPosInDockBar - 1 ] == m_pDockSite
  3821. )
  3822. pBar->m_pDockBar->m_arrBars.RemoveAt( nPosInDockBar - 1 );
  3823. }
  3824. pBar->m_pDockBar = NULL;
  3825. m_mapBars.RemoveKey( pBar );
  3826. POSITION posInList = m_listBars.Find( pBar );
  3827. if( posInList != NULL )
  3828. m_listBars.RemoveAt( posInList );
  3829. posInList = m_listBarsInDocMode.Find( pBar );
  3830. if( posInList != NULL )
  3831. m_listBarsInDocMode.RemoveAt( posInList );
  3832. if( ! bPersistentBar )
  3833. OnDbsFreeBarCommandID( nCmdID );
  3834. if( pMiniFrame != NULL )
  3835. pMiniFrame->DestroyWindow();
  3836. else
  3837. pBar->DestroyWindow();
  3838. if( ! bForceNoOptimizeMode )
  3839. CExtDockBar::_OptimizeCircles( pDockSite );
  3840. }
  3841. void CExtDynamicBarSite::BarFreeAll(
  3842. bool bFreePersistentBars, // = true
  3843. bool bFreeDynamicBars // = true
  3844. )
  3845. {
  3846. ASSERT( this != NULL );
  3847. _BarFreeAllImpl(
  3848. false,
  3849. bFreePersistentBars,
  3850. bFreeDynamicBars
  3851. );
  3852. }
  3853. void CExtDynamicBarSite::_BarFreeAllImpl(
  3854. bool bForceNoOptimizeMode,
  3855. bool bFreePersistentBars, // = true
  3856. bool bFreeDynamicBars // = true
  3857. )
  3858. {
  3859. ASSERT( this != NULL );
  3860. CFrameWnd * pDockSite = DockSiteGet();
  3861. if( pDockSite->GetSafeHwnd() == NULL )
  3862. {
  3863. ASSERT( BarEnumGetCount() == 0 );
  3864. return;
  3865. }
  3866. ASSERT(
  3867. pDockSite->GetSafeHwnd() != NULL
  3868. && ::IsWindow( pDockSite->GetSafeHwnd() )
  3869. );
  3870. for( ; BarEnumGetCount(bFreePersistentBars,bFreeDynamicBars) > 0; )
  3871. {
  3872. POSITION pos = BarEnumGetStartPosition();
  3873. ASSERT( pos != NULL );
  3874. CExtDynamicControlBar * pBar =
  3875. BarEnumGetNext( pos, bFreePersistentBars, bFreeDynamicBars );
  3876. ASSERT_VALID( pBar );
  3877. _BarFreeImpl( pBar, false, bForceNoOptimizeMode );
  3878. } // for( ; BarEnumGetCount(bFreePersistentBars,bFreeDynamicBars) > 0; )
  3879. }
  3880. CExtDynamicControlBar * CExtDynamicBarSite::BarGetByCmdID( UINT nLookupCmdID )
  3881. {
  3882. ASSERT( this != NULL );
  3883. POSITION pos = BarEnumGetStartPosition();
  3884. for( ; pos != NULL; )
  3885. {
  3886. CExtDynamicControlBar * pBar =
  3887. BarEnumGetNext( pos );
  3888. ASSERT_VALID( pBar );
  3889. UINT nCmdID = (UINT)pBar->GetDlgCtrlID();
  3890. if( nCmdID == nLookupCmdID )
  3891. return pBar;
  3892. } // for( ; pos != NULL; )
  3893. return NULL;
  3894. }
  3895. void CExtDynamicBarSite::BarEnumGetArray(
  3896. CTypedPtrArray < CPtrArray, CExtDynamicControlBar * > & arrAllDynamicBars,
  3897. bool bIncludePersistentBars, // = true
  3898. bool bIncludeDynamicBars // = true
  3899. )
  3900. {
  3901. ASSERT( this != NULL );
  3902. arrAllDynamicBars.RemoveAll();
  3903. if( (!bIncludePersistentBars) && (!bIncludeDynamicBars) )
  3904. return;
  3905. POSITION pos = BarEnumGetStartPosition();
  3906. for( ; pos != NULL; )
  3907. {
  3908. CExtDynamicControlBar * pBar =
  3909. BarEnumGetNext( pos );
  3910. ASSERT_VALID( pBar );
  3911. bool bPersistentBar = pBar->IsPersistentBar();
  3912. if( ( bIncludePersistentBars && bPersistentBar )
  3913. || ( bIncludeDynamicBars && (!bPersistentBar) )
  3914. )
  3915. arrAllDynamicBars.Add( pBar );
  3916. } // for( ; pos != NULL; )
  3917. }
  3918. INT CExtDynamicBarSite::BarEnumGetCount(
  3919. bool bIncludePersistentBars, // = true
  3920. bool bIncludeDynamicBars // = true
  3921. ) const
  3922. {
  3923. ASSERT( this != NULL );
  3924. ASSERT( INT( m_mapBars.GetCount() ) == INT( m_listBars.GetCount() ) );
  3925. if( bIncludePersistentBars && bIncludeDynamicBars )
  3926. return INT( m_listBars.GetCount() );
  3927. POSITION pos = BarEnumGetStartPosition();
  3928. INT nCount = 0;
  3929. for( ; pos != NULL; )
  3930. {
  3931. const CExtDynamicControlBar * pBar =
  3932. BarEnumGetNext( pos );
  3933. ASSERT_VALID( pBar );
  3934. bool bPersistentBar = pBar->IsPersistentBar();
  3935. if( bIncludePersistentBars && bPersistentBar )
  3936. nCount ++;
  3937. if( bIncludeDynamicBars && (!bPersistentBar) )
  3938. nCount ++;
  3939. } // for( ; pos != NULL; )
  3940. return nCount;
  3941. }
  3942. POSITION CExtDynamicBarSite::BarEnumGetStartPosition() const
  3943. {
  3944. ASSERT( this != NULL );
  3945. return m_listBars.GetHeadPosition();
  3946. }
  3947. CExtDynamicControlBar * CExtDynamicBarSite::BarEnumGetNext(
  3948. POSITION & pos,
  3949. bool bIncludePersistentBars, // = true
  3950. bool bIncludeDynamicBars // = true
  3951. )
  3952. {
  3953. ASSERT( this != NULL );
  3954. for( ; pos != NULL; )
  3955. {
  3956. CExtDynamicControlBar * pBar = m_listBars.GetNext( pos );
  3957. ASSERT_VALID( pBar );
  3958. bool bPersistentBar = pBar->IsPersistentBar();
  3959. if( bIncludePersistentBars && bPersistentBar )
  3960. return pBar;
  3961. if( bIncludeDynamicBars && (!bPersistentBar) )
  3962. return pBar;
  3963. } // for( ; pos != NULL; )
  3964. return NULL;
  3965. }
  3966. const CExtDynamicControlBar * CExtDynamicBarSite::BarEnumGetNext(
  3967. POSITION & pos,
  3968. bool bIncludePersistentBars, // = true
  3969. bool bIncludeDynamicBars // = true
  3970. ) const
  3971. {
  3972. ASSERT( this != NULL );
  3973. return
  3974. ( const_cast < CExtDynamicBarSite * > ( this ) ) ->
  3975. BarEnumGetNext(
  3976. pos,
  3977. bIncludePersistentBars,
  3978. bIncludeDynamicBars
  3979. );
  3980. }
  3981. #endif // (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)