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

界面编程

开发平台:

Visual C++

  1. Invalidate();
  2. UpdateWindow();
  3. }
  4. void CExtToolControlBar::_SetCursor(
  5. const CPoint & point
  6. )
  7. {
  8. ASSERT_VALID( this );
  9. int nBtnIdx = _HitTestImpl(point);
  10. if( nBtnIdx >= 0 )
  11. {
  12. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  13. ASSERT_VALID( pTBB );
  14. if( pTBB->OnSetCursor(point) )
  15. return;
  16. } // if( nBtnIdx >= 0 )
  17. CExtControlBar::_SetCursor( point );
  18. }
  19. bool CExtToolControlBar::g_bMenuTracking = false;
  20. bool CExtToolControlBar::g_bMenuTrackingExpanded = false;
  21. bool CExtToolControlBar::g_bToolbarLargeIcons = false;
  22. bool CExtToolControlBar::g_bToolbarScreenTips = true;
  23. bool CExtToolControlBar::g_bToolbarShortcutKeysOnScreenTips = false;
  24. bool CExtToolControlBar::g_bEnableDblClickToggleDocking = false;
  25. CExtToolControlBar::CExtToolControlBar()
  26. {
  27. m_bGripperStaticallyAtTop = false;
  28. m_bForceBalloonGradientInDialogs = false;
  29. m_bForceNoBalloonWhenRedockable = false;
  30. m_pRightBtn = NULL;
  31. m_bRightButtonDisplayBarsList = true;
  32. m_bPaletteMode = false;
  33. m_bHelperTempFullRowMode = false;
  34. m_bInsideCalcLayout = false;
  35. m_bFixedMode = true;
  36. m_bReposSingleChildMode = false;
  37. m_nBtnIdxCapture = -1;
  38. m_nBtnIdxHover = -1;
  39. m_nBtnIdxMenuTracking = -1;
  40. m_nUpdateCtrlLockCount = 0;
  41. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  42. m_bCustomizationAllowed = true;
  43. m_pCustomizeSite = NULL;
  44. m_bAutoShowOnCustomizationStart = false;
  45. m_bAutoHideOnCustomizationEnd = false;
  46. m_bVisibleInCustomizeListBox = true;
  47. m_pDragSourceTBB = NULL;
  48. m_pDragTargetTBB = NULL;
  49. m_nDragTargetShift = 0;
  50. m_bHelperSeparatorAction = false;
  51. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  52. m_cxLeftBorder = 1;
  53. m_cxRightBorder = 1;
  54. m_cyTopBorder = 0;
  55. m_cyBottomBorder = 0;
  56. m_nGripWidthAtLeft = 8;
  57. m_nGripHeightAtTop = 10;
  58. m_bHelperFlatTrackingCalcEnabledLeftRight = false;
  59. m_bHelperFlatTrackingCalcEnabledUpDown = false;
  60. m_bHelperFlatTrackingCalcEnabledTab = false;
  61. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  62. m_bKeyTipsDisplayed = false;
  63. m_bHelperKeyTipsSupported = false;
  64. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  65. m_bLastDropDownHT = false;
  66. m_ptLastClientHover.x = m_ptLastClientHover.y = -32767;
  67. m_bEnableDblClickToggleDocking = g_bEnableDblClickToggleDocking;
  68. }
  69. bool CExtToolControlBar::_AdjustBGInfo()
  70. {
  71. ASSERT_VALID( this );
  72. if( GetSafeHwnd() != NULL )
  73. {
  74. CRect rcBorders( 0, 0, 0, 0 );
  75. if( PmBridge_GetPM()->Toolbar_GetBGInfo(
  76. rcBorders,
  77. m_nGripWidthAtLeft,
  78. m_nGripHeightAtTop,
  79. this
  80. )
  81. )
  82. {
  83. DWORD dwBarStyle = GetBarStyle();
  84. if( (dwBarStyle&CBRS_GRIPPER) == 0 )
  85. {
  86. m_nGripWidthAtLeft = 0;
  87. m_nGripHeightAtTop = 0;
  88. } // if( (GetBarStyle()&CBRS_GRIPPER) != 0 )
  89. m_cxLeftBorder = rcBorders.left;
  90. m_cxRightBorder = rcBorders.right;
  91. m_cyTopBorder = rcBorders.top;
  92. m_cyBottomBorder = rcBorders.bottom;
  93. CRect rcGrip( 0, 0, 0, 0 );
  94. if( (dwBarStyle&CBRS_FLOATING) == 0 )
  95. {
  96. GetWindowRect( &rcGrip );
  97. rcGrip.OffsetRect( -rcGrip.TopLeft() );
  98. rcGrip.DeflateRect(
  99. rcBorders.left,
  100. rcBorders.top,
  101. rcBorders.right,
  102. rcBorders.bottom
  103. );
  104. if( (dwBarStyle&CBRS_ORIENT_HORZ) != 0 )
  105. {
  106. rcGrip.right = rcGrip.left;
  107. rcGrip.left -= m_nGripWidthAtLeft;
  108. }
  109. else
  110. {
  111. rcGrip.bottom = rcGrip.top;
  112. rcGrip.top -= m_nGripHeightAtTop;
  113. }
  114. } // if( (dwBarStyle&CBRS_FLOATING) == 0 )
  115. _RectGripSet( rcGrip );
  116. return true;
  117. }
  118. } // if( GetSafeHwnd() != NULL )
  119. m_cxLeftBorder = 1;
  120. m_cxRightBorder = 1;
  121. m_cyTopBorder = 0;
  122. m_cyBottomBorder = 0;
  123. m_nGripWidthAtLeft = 8;
  124. m_nGripHeightAtTop = 10;
  125. return false;
  126. }
  127. CExtToolControlBar::~CExtToolControlBar()
  128. {
  129. _RemoveAllButtonsImpl();
  130. //CSingleLock _slCsCB( &g_csCB );
  131. // _slCsCB.Lock();
  132. __EXT_MFC_INT_PTR nCountOfBars = g_AllBars.GetSize();
  133. for( __EXT_MFC_INT_PTR i = 0; i<nCountOfBars; i++ )
  134. {
  135. CExtControlBar * pBar = g_AllBars[i];
  136. ASSERT( pBar != NULL );
  137. if( pBar == this )
  138. {
  139. g_AllBars.RemoveAt( i );
  140. break;
  141. }
  142. }
  143. // _slCsCB.Unlock();
  144. }
  145. BOOL CExtToolControlBar::LoadToolBar(
  146. __EXT_MFC_SAFE_LPCTSTR  lpszResourceName,
  147. COLORREF clrTransparent // = RGB(192,192,192)
  148. )
  149. {
  150. LPUINT pCmdArray = NULL;
  151. INT nCmdCount = 0;
  152. if( !g_CmdManager->UpdateFromToolBar(
  153. g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
  154. lpszResourceName,
  155. &pCmdArray,
  156. &nCmdCount,
  157. false,
  158. true,
  159. clrTransparent
  160. )
  161. )
  162. {
  163. ASSERT( FALSE );
  164. return FALSE;
  165. }
  166. ASSERT( pCmdArray != NULL && nCmdCount > 0 );
  167. BOOL bRetVal =  SetButtons( pCmdArray, nCmdCount );
  168. ASSERT( bRetVal );
  169. delete [] pCmdArray;
  170. return bRetVal;
  171. }
  172. bool CExtToolControlBar::_IsShowContentWhenDragging() const
  173. {
  174. //BOOL bDragShowContent = FALSE;
  175. //    ::SystemParametersInfo(
  176. // SPI_GETDRAGFULLWINDOWS,
  177. // 0,
  178. //        &bDragShowContent,
  179. // 0
  180. // );
  181. // return bDragShowContent ? true : false;
  182. // if( IsKindOf(RUNTIME_CLASS(CExtToolControlBar)) )
  183. // return true;
  184. // return false;
  185. // if( CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) )
  186. // return false;
  187. return true;
  188. }
  189. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  190. bool CExtToolControlBar::KeyTipsDisplayedGet() const
  191. {
  192. ASSERT_VALID( this );
  193. return m_bKeyTipsDisplayed;
  194. }
  195. void CExtToolControlBar::KeyTipsDisplayedSet(
  196. bool bKeyTipsDisplayed // = true
  197. )
  198. {
  199. ASSERT_VALID( this );
  200. if( ! m_bHelperKeyTipsSupported )
  201. m_bKeyTipsDisplayed = false;
  202. else
  203. m_bKeyTipsDisplayed = bKeyTipsDisplayed;
  204. }
  205. CExtCustomizeCmdKeyTip & CExtToolControlBar::KeyTipChainGet()
  206. {
  207. ASSERT_VALID( this );
  208. return m_keyTipChain;
  209. }
  210. const CExtCustomizeCmdKeyTip & CExtToolControlBar::KeyTipChainGet() const
  211. {
  212. ASSERT_VALID( this );
  213. return
  214. ( const_cast < CExtToolControlBar * > ( this ) )
  215. -> KeyTipChainGet();
  216. }
  217. void CExtToolControlBar::KeyTipChainSet(
  218. const CExtCustomizeCmdKeyTip & keyTipChain
  219. )
  220. {
  221. ASSERT_VALID( this );
  222. m_keyTipChain = keyTipChain;
  223. }
  224. void CExtToolControlBar::KeyTipChainEmpty()
  225. {
  226. ASSERT_VALID( this );
  227. KeyTipChainGet().KeyCodeRemoveAll();
  228. }
  229. INT CExtToolControlBar::KeyTipTranslate(
  230. DWORD dwKeyCode,
  231. CExtCustomizeCmdKeyTip * pKeyTipChain,
  232. bool bAutoInvokeAction,
  233. bool & bActionInvoked,
  234. bool & bContinueKeyTipMode
  235. )
  236. {
  237. ASSERT_VALID( this );
  238. bActionInvoked = false;
  239. int nBtnIdx, nCountOfButtons = _GetButtonsCountImpl();
  240. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  241. {
  242. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  243. ASSERT_VALID( pTBB );
  244. if( pTBB->OnKeyTipTranslate(
  245. dwKeyCode,
  246. pKeyTipChain,
  247. bAutoInvokeAction,
  248. bActionInvoked,
  249. bContinueKeyTipMode
  250. )
  251. )
  252. return nBtnIdx;
  253. }
  254. return -1;
  255. }
  256. void CExtToolControlBar::KeyTipDisplay(
  257. CExtCustomizeCmdKeyTip & keyTipChain
  258. )
  259. {
  260. int nBtnIdx, nCountOfButtons = _GetButtonsCountImpl();
  261. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  262. {
  263. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  264. ASSERT_VALID( pTBB );
  265. pTBB->OnKeyTipDisplay( keyTipChain );
  266. }
  267. }
  268. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  269. void CExtToolControlBar::OnFlatTrackingStart(
  270. HDWP & hPassiveModeDWP
  271. )
  272. {
  273. ASSERT_VALID( this );
  274. hPassiveModeDWP;
  275. MSG _msg;
  276. if( ::PeekMessage( &_msg, NULL, WM_ACTIVATEAPP, WM_ACTIVATEAPP, PM_NOREMOVE )
  277. && _msg.wParam == 0
  278. )
  279. return;
  280. if( ! CExtPopupMenuWnd::TestHoverEnabledFromActiveHWND( m_hWnd ) )
  281. return;
  282. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  283. KeyTipsDisplayedSet( true );
  284. KeyTipChainEmpty();
  285. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  286. bool bHaveDWP = false;
  287. if( hPassiveModeDWP == NULL
  288. // && g_PaintManager.m_bIsWinVistaOrLater
  289. // && g_PaintManager.m_DWM.IsCompositionEnabled()
  290. )
  291. {
  292. bHaveDWP = true;
  293. hPassiveModeDWP = ::BeginDeferWindowPos( 64 );
  294. }
  295. int nBtnIdx, nCountOfButtons = _GetButtonsCountImpl();
  296. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  297. {
  298. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  299. ASSERT_VALID( pTBB );
  300. pTBB->OnFlatTrackingStart( hPassiveModeDWP );
  301. }
  302. if( bHaveDWP && hPassiveModeDWP != NULL )
  303. {
  304. ::EndDeferWindowPos( hPassiveModeDWP );
  305. hPassiveModeDWP = NULL;
  306. CExtPaintManager::stat_PassPaintMessages();
  307. CExtPopupMenuTipWnd::UpdateDelayedLayeredBehaviorAll();
  308. }
  309. CExtPopupMenuTipWnd::UpdateDelayedLayeredBehaviorAll();
  310. }
  311. void CExtToolControlBar::OnFlatTrackingStop()
  312. {
  313. ASSERT_VALID( this );
  314. int nBtnIdx, nCountOfButtons = _GetButtonsCountImpl();
  315. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  316. {
  317. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  318. ASSERT_VALID( pTBB );
  319. pTBB->OnFlatTrackingStop();
  320. }
  321. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  322. KeyTipsDisplayedSet( false );
  323. KeyTipChainEmpty();
  324. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  325. }
  326. BOOL CExtToolControlBar::RemoveButton(
  327. int nPos,
  328. BOOL bDoRecalcLayout // = TRUE
  329. )
  330. {
  331. if( nPos < 0 )
  332. {
  333. ASSERT( FALSE );
  334. return FALSE;
  335. }
  336. int nCountOfButtons = _GetButtonsCountImpl();
  337. if( nPos >= nCountOfButtons )
  338. {
  339. ASSERT( FALSE );
  340. return FALSE;
  341. }
  342. CExtBarButton * pTBB =
  343. _GetButtonPtr( nPos );
  344. ASSERT_VALID( pTBB );
  345. if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) )
  346. {
  347. ASSERT( FALSE );
  348. return FALSE;
  349. }
  350. m_buttons.RemoveAt( nPos );
  351. INT nChildIndex, nChildCount = pTBB->ChildButtonGetCount();
  352. for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  353. RemoveButton( _GetIndexOf( pTBB->ChildButtonGetAt( nChildIndex ) ), FALSE );
  354. AnimationSite_ClientRemove( pTBB );
  355. delete pTBB;
  356. m_nBtnIdxCapture = -1;      // nothing captured
  357. m_nBtnIdxHover = -1;
  358. m_nBtnIdxMenuTracking = -1;
  359. if( bDoRecalcLayout )
  360. _RecalcLayoutImpl();
  361. return TRUE;
  362. }
  363. bool CExtToolControlBar::IsShowTipWhenDisabled( const CExtBarButton * pTBB ) const
  364. {
  365. ASSERT_VALID( this );
  366. ASSERT_VALID( pTBB );
  367. pTBB;
  368. return true;
  369. }
  370. BOOL CExtToolControlBar::InsertSpecButton(
  371. int nPos, // -1 - append
  372. CExtBarButton * pButton,
  373. BOOL bDoRecalcLayout // = TRUE
  374. )
  375. {
  376. int nCountOfButtons = _GetButtonsCountImpl();
  377. if( nPos < 0 )
  378. nPos = nCountOfButtons;
  379. if( nPos > nCountOfButtons )
  380. {
  381. ASSERT( FALSE );
  382. return FALSE;
  383. }
  384. if( nCountOfButtons > 0
  385. && nPos == nCountOfButtons
  386. )
  387. {
  388. CExtBarButton * pTBB =
  389. _GetButtonPtr( nCountOfButtons - 1 );
  390. ASSERT_VALID( pTBB );
  391. if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) )
  392. nPos--;
  393. }
  394. ASSERT_VALID( pButton );
  395. ASSERT( pButton->GetSafeBar() != NULL );
  396. ASSERT( pButton->GetSafeBar() == this );
  397. if( _GetIndexOf(pButton) >= 0 )
  398. {
  399. ASSERT( FALSE ); // already inserted
  400. return FALSE;
  401. }
  402. m_buttons.InsertAt( nPos, pButton );
  403. ASSERT( _GetIndexOf(pButton) >= 0 );
  404. if( bDoRecalcLayout )
  405. _RecalcLayoutImpl();
  406. return TRUE;
  407. }
  408. BOOL CExtToolControlBar::InsertButton(
  409. int nPos, // = -1, // append
  410. UINT nCmdID, // = ID_SEPARATOR
  411. BOOL bDoRecalcLayout // = TRUE
  412. )
  413. {
  414. int nCountOfButtons = _GetButtonsCountImpl();
  415. if( nPos < 0 )
  416. nPos = nCountOfButtons;
  417. if( nPos > nCountOfButtons )
  418. {
  419. ASSERT( FALSE );
  420. return FALSE;
  421. }
  422. if( nCountOfButtons > 0
  423. && nPos == nCountOfButtons
  424. )
  425. {
  426. CExtBarButton * pTBB =
  427. _GetButtonPtr( nCountOfButtons - 1 );
  428. ASSERT_VALID( pTBB );
  429. if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) )
  430. nPos--;
  431. }
  432. try
  433. {
  434. CExtBarButton * pTBB = OnCreateBarCommandBtn( nCmdID );
  435. ASSERT_VALID( pTBB );
  436. m_buttons.InsertAt( nPos, pTBB );
  437. if( bDoRecalcLayout )
  438. _RecalcLayoutImpl();
  439. } // try
  440. // catch( std::exception * pXept )
  441. // {
  442. // delete pXept;
  443. // ASSERT( FALSE );
  444. // return FALSE;
  445. // } // catch( std::exception * pXept )
  446. catch( CException * pXept )
  447. {
  448. pXept->Delete();
  449. ASSERT( FALSE );
  450. return FALSE;
  451. } // catch( CException * pXept )
  452. catch( ... )
  453. {
  454. ASSERT( FALSE );
  455. return FALSE;
  456. } // catch( ... )
  457. return TRUE;
  458. }
  459. CExtBarButton * CExtToolControlBar::OnCreateBarCommandBtn(
  460. UINT nCmdID,
  461. UINT nStyle // = 0
  462. )
  463. {
  464. ASSERT_VALID( this );
  465. CExtBarButton * pTBB = new CExtBarButton( this, nCmdID, nStyle );
  466. ASSERT_VALID( pTBB );
  467. return pTBB;
  468. }
  469. CExtBarContentExpandButton * CExtToolControlBar::OnCreateBarRightBtn()
  470. {
  471. ASSERT_VALID( this );
  472. if( m_bPaletteMode )
  473. return NULL;
  474. CExtBarContentExpandButton * pRightBtn =
  475. new CExtBarContentExpandButton( this );
  476. ASSERT_VALID( pRightBtn );
  477. return pRightBtn;
  478. }
  479. COLORREF CExtToolControlBar::OnQueryCustomAccentEffectForIcon(
  480. CDC & dc,
  481. CExtBarButton * pTBB
  482. )
  483. {
  484. ASSERT_VALID( this );
  485. ASSERT_VALID( pTBB );
  486. dc;
  487. pTBB;
  488. return COLORREF(-1L);
  489. }
  490. BOOL CExtToolControlBar::SetButtons(
  491. const UINT * lpIDArray, // = NULL
  492. int nIDCount // = 0
  493. )
  494. {
  495. ASSERT_VALID( this );
  496. ASSERT(
  497. lpIDArray == NULL
  498. || nIDCount == 0
  499. || AfxIsValidAddress(
  500. lpIDArray,
  501. sizeof(UINT) * nIDCount,
  502. FALSE
  503. )
  504. );
  505. _RemoveAllButtonsImpl();
  506. if( lpIDArray == NULL
  507. || nIDCount == 0
  508. )
  509. return TRUE;
  510. try
  511. {
  512. bool bRevertRTL = OnQueryRevertRTL();
  513. for( int i = 0; i < nIDCount; i++ )
  514. {
  515. CExtBarButton * pTBB = OnCreateBarCommandBtn( *lpIDArray++, 0 );
  516. ASSERT_VALID( pTBB );
  517. if( bRevertRTL )
  518. m_buttons.InsertAt( 0, pTBB );
  519. else
  520. m_buttons.Add( pTBB );
  521. } // for( int i = 0; i < nIDCount; i++ )
  522. ASSERT( m_pRightBtn == NULL );
  523. m_pRightBtn = OnCreateBarRightBtn();
  524. if( m_pRightBtn != NULL )
  525. {
  526. ASSERT_VALID( m_pRightBtn );
  527. ASSERT_KINDOF( CExtBarContentExpandButton, m_pRightBtn );
  528. m_buttons.Add( m_pRightBtn );
  529. } // if( m_pRightBtn != NULL )
  530. } // try
  531. catch( CException * pXept )
  532. {
  533. pXept->Delete();
  534. ASSERT( FALSE );
  535. return FALSE;
  536. } // catch( CException * pXept )
  537. catch( ... )
  538. {
  539. ASSERT( FALSE );
  540. return FALSE;
  541. } // catch( ... )
  542. return TRUE;
  543. }
  544. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  545. BOOL CExtToolControlBar::SetButtons(
  546. CExtCustomizeCmdTreeNode * pNode
  547. )
  548. {
  549. ASSERT_VALID( this );
  550. SetButtons();
  551. if( pNode == NULL )
  552. return TRUE;
  553. ASSERT_VALID( pNode );
  554. CExtCustomizeSite * pSite = GetCustomizeSite();
  555. if( pSite == NULL )
  556. {
  557. ASSERT( FALSE );
  558. return FALSE;
  559. }
  560. bool bRevertRTL = OnQueryRevertRTL();
  561. int nCount = pNode->GetNodeCount();
  562. for( int i = 0; i < nCount; i++ )
  563. {
  564. CExtCustomizeCmdTreeNode * pNodeBtn =
  565. pNode->ElementAt( i );
  566. ASSERT_VALID( pNodeBtn );
  567. if( pNodeBtn->GetFlags() & __ECTN_GROUP_START )
  568. {
  569. if( i == 0 )
  570. {
  571. ASSERT( FALSE );
  572. continue;
  573. }
  574. // separator
  575. VERIFY(
  576. InsertButton(
  577. bRevertRTL ? 0 : -1,
  578. ID_SEPARATOR,
  579. FALSE
  580. )
  581. );
  582. }
  583. ASSERT( CExtCmdManager::IsCommand(pNodeBtn->GetCmdID(false)) || pNodeBtn->GetCmdID(false) == UINT(-1) );
  584. ASSERT( CExtCmdManager::IsCommand(pNodeBtn->GetCmdID(true)) || pNodeBtn->GetCmdID(true) == UINT(-1) );
  585. CExtBarButton * pTBB =
  586. pSite->OnCreateToolbarButton(
  587. this,
  588. NULL,
  589. pNodeBtn
  590. );
  591. if( pTBB == NULL )
  592. {
  593. ASSERT( FALSE );
  594. return FALSE;
  595. }
  596. ASSERT_VALID( pTBB );
  597. if( bRevertRTL )
  598. m_buttons.InsertAt( 0, pTBB );
  599. else
  600. m_buttons.Add( pTBB );
  601. } // for( int i = 0; i < nCount; i++ )
  602. ASSERT( m_pRightBtn == NULL );
  603. m_pRightBtn = OnCreateBarRightBtn();
  604. if( m_pRightBtn != NULL )
  605. {
  606. ASSERT_VALID( m_pRightBtn );
  607. ASSERT_KINDOF( CExtBarContentExpandButton, m_pRightBtn );
  608. m_buttons.Add( m_pRightBtn );
  609. } // if( m_pRightBtn != NULL )
  610. return TRUE;
  611. }
  612. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  613. bool CExtToolControlBar::IsLargeIcons() const
  614. {
  615. ASSERT_VALID( this );
  616. return g_bToolbarLargeIcons;
  617. }
  618. bool CExtToolControlBar::IsDisplayScreenTips() const
  619. {
  620. ASSERT_VALID( this );
  621. return g_bToolbarScreenTips;
  622. }
  623. bool CExtToolControlBar::IsDisplayShortcutKeysOnScreenTips() const
  624. {
  625. ASSERT_VALID( this );
  626. return g_bToolbarShortcutKeysOnScreenTips;
  627. }
  628. LRESULT CExtToolControlBar::DoHelpHitTest( CPoint ptHelpHitTest )
  629. {
  630. ASSERT_VALID( this );
  631. LRESULT nHelpHit =
  632. ((CExtToolControlBar*)this)->
  633. HitTest(ptHelpHitTest);
  634. if( nHelpHit >= 0 )
  635. {
  636. CExtBarButton * pTBB =
  637. _GetButtonPtr( (int)nHelpHit );
  638. ASSERT_VALID( pTBB );
  639. if( pTBB != NULL )
  640. {
  641. nHelpHit = pTBB->OnHelpHitTest( ptHelpHitTest );
  642. if( nHelpHit == -1 || nHelpHit == -2 )
  643. return -2;
  644. return nHelpHit;
  645. }
  646. } // if( nHelpHit >= 0 )
  647. return CExtControlBar::DoHelpHitTest( ptHelpHitTest );
  648. }
  649. /////////////////////////////////////////////////////////////////////////////
  650. // CExtToolControlBar attribute access
  651. int CExtToolControlBar::CommandToIndex(UINT nIDFind) const
  652. {
  653. ASSERT_VALID(this);
  654. int nBtnIdx, nCountOfButtons = _GetButtonsCountImpl();
  655. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  656. {
  657. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  658. ASSERT_VALID( pTBB );
  659. if( pTBB->GetCmdID(false) == nIDFind )
  660. return nBtnIdx;
  661. }
  662. return -1;
  663. }
  664. UINT CExtToolControlBar::GetButtonID(int nIndex) const
  665. {
  666. // ASSERT_VALID(this);
  667. CExtBarButton * pTBB =
  668. _GetButtonPtr(nIndex);
  669. if( pTBB == NULL )
  670. return ID_SEPARATOR;
  671. ASSERT_VALID( pTBB );
  672. return pTBB->GetCmdID(false);
  673. }
  674. void CExtToolControlBar::GetButtonRect(int nIndex, LPRECT lpRect) const
  675. {
  676. // ASSERT_VALID(this);
  677. ASSERT(AfxIsValidAddress(lpRect, sizeof(RECT)));
  678. CExtBarButton * pTBB =
  679. _GetButtonPtr(nIndex);
  680. if( pTBB == NULL )
  681. {
  682. ::memset( lpRect, 0, sizeof(RECT) );
  683. return;
  684. }
  685. ASSERT_VALID( pTBB );
  686. *lpRect = *pTBB;
  687. }
  688. UINT CExtToolControlBar::GetButtonStyle(int nIndex) const
  689. {
  690. CExtBarButton * pTBB =
  691. _GetButtonPtr(nIndex);
  692. if( pTBB == NULL )
  693. return 0;
  694. ASSERT_VALID( pTBB );
  695. return pTBB->GetStyle();
  696. }
  697. void CExtToolControlBar::SetButtonStyle(int nIndex, UINT nStyle)
  698. {
  699. CExtBarButton * pTBB = _GetButtonPtr(nIndex);
  700. if( pTBB == NULL )
  701. return;
  702. ASSERT_VALID( pTBB );
  703. UINT nOldStyle = pTBB->GetStyle();
  704. if( nOldStyle != nStyle )
  705. {
  706. pTBB->SetStyle( nStyle );
  707. _InvalidateButton( nIndex );
  708. // UpdateWindow();
  709. }
  710. }
  711. CWnd * CExtToolControlBar::GetButtonCtrl(
  712. int nIndex
  713. )
  714. {
  715. CExtBarButton * pTBB =
  716. _GetButtonPtr(nIndex);
  717. ASSERT( pTBB != NULL );
  718. if( pTBB == NULL )
  719. return NULL;
  720. ASSERT_VALID( pTBB );
  721. CWnd * pCtrl = pTBB->CtrlGet();
  722. return pCtrl;
  723. }
  724. void CExtToolControlBar::SetButtonCtrlVisibleVertically(
  725. int nIndex,
  726. bool bVisible // = true
  727. )
  728. {
  729. CExtBarButton * pTBB =
  730. _GetButtonPtr(nIndex);
  731. ASSERT( pTBB != NULL );
  732. if( pTBB == NULL )
  733. return;
  734. pTBB->SetCtrlVisibleVertically( bVisible );
  735. }
  736. bool CExtToolControlBar::GetButtonCtrlVisibleVertically(
  737. int nIndex
  738. ) const
  739. {
  740. CExtBarButton * pTBB =
  741. _GetButtonPtr(nIndex);
  742. ASSERT( pTBB != NULL );
  743. if( pTBB == NULL )
  744. return false;
  745. return pTBB->GetCtrlVisibleVertically();
  746. }
  747. bool CExtToolControlBar::SetButtonCtrl(
  748. int nIndex,
  749. CWnd * pCtrl, // = NULL
  750. bool bCtrlAutoDestroyed // = TRUE
  751. )
  752. {
  753. CExtBarButton * pTBB = _GetButtonPtr(nIndex);
  754. ASSERT( pTBB != NULL );
  755. if( pTBB == NULL )
  756. return FALSE;
  757. ASSERT_VALID( pTBB );
  758. if( pCtrl != NULL )
  759. {
  760. ASSERT_VALID( pCtrl );
  761. DWORD dwCtrlStyle = pCtrl->GetStyle();
  762. ASSERT( (dwCtrlStyle&WS_CHILD) != 0 );
  763. if( (dwCtrlStyle&WS_CHILD) == 0 )
  764. return FALSE;
  765. ASSERT( IsChild( pCtrl ) );
  766. if( !IsChild( pCtrl ) )
  767. return FALSE;
  768. UINT nDlgCtrlID = (UINT)pCtrl->GetDlgCtrlID();
  769. ASSERT( nDlgCtrlID == pTBB->GetCmdID(false) );
  770. if( nDlgCtrlID != pTBB->GetCmdID(false) )
  771. return FALSE;
  772. }
  773. pTBB->CtrlSet( pCtrl, bCtrlAutoDestroyed );
  774. _RecalcLayoutImpl();
  775. return TRUE;
  776. }
  777. int CExtToolControlBar::GetButtonByAccessKey(__EXT_MFC_SAFE_TCHAR vkTCHAR)
  778. {
  779. int nCountOfButtons = _GetButtonsCountImpl();
  780. ASSERT( nCountOfButtons >= 0 );
  781. if( nCountOfButtons == 0 )
  782. return -1;
  783. for( int nBtnIdx=0; nBtnIdx<nCountOfButtons; nBtnIdx++ )
  784. {
  785. CExtBarButton * pTBB = _GetButtonPtr(nBtnIdx);
  786. ASSERT_VALID( pTBB );
  787. if( pTBB->IsSeparator()
  788. || (! pTBB->IsVisible() )
  789. || ( pTBB->GetStyle() & TBBS_HIDDEN )
  790. || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton))
  791. || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton))
  792. || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton))
  793. )
  794. continue;
  795. // ASSERT( CExtCmdManager::IsCommand(pTBB->GetCmdID(false)) );
  796. // ASSERT( CExtCmdManager::IsCommand(pTBB->GetCmdID(true)) );
  797. if( ! CExtCmdManager::IsCommand(pTBB->GetCmdID(false)) )
  798. continue;
  799. if( ! CExtCmdManager::IsCommand(pTBB->GetCmdID(true)) )
  800. continue;
  801. CExtSafeString strButtonText( pTBB->GetText() );
  802. if( strButtonText.IsEmpty() )
  803. continue;
  804. int nTextLen = strButtonText.GetLength();
  805. ASSERT( nTextLen > 0 );
  806. int nAmdIndex = strButtonText.Find(_T('&'));
  807. if( nAmdIndex < 0 )
  808. continue;
  809. if( nAmdIndex == nTextLen - 1 ) // !?!?!
  810. continue;
  811. TCHAR vk = strButtonText[nAmdIndex+1];
  812. TCHAR szChar[2] = { vk, _T('') };
  813. ::CharUpper( szChar );
  814. vk = szChar[0];
  815. if( vkTCHAR == ((TCHAR)vk) )
  816. {
  817. if( ( !pTBB->IsVisible() )
  818. || (pTBB->GetStyle() & TBBS_HIDDEN) != 0
  819. )
  820. {
  821. if( m_pRightBtn != NULL )
  822. return _GetIndexOf( m_pRightBtn );
  823. continue;
  824. }
  825. return nBtnIdx;
  826. } // if( vkTCHAR == ((TCHAR)vk) )
  827. } // for( int nBtnIdx=0; nBtnIdx<nCountOfButtons; nBtnIdx++ )
  828. return -1;
  829. }
  830. HMENU CExtToolControlBar::GetButtonMenu(
  831. int nIndex
  832. )
  833. {
  834. CExtBarButton * pTBB = _GetButtonPtr(nIndex);
  835. ASSERT( pTBB != NULL );
  836. if( pTBB == NULL )
  837. return NULL;
  838. ASSERT_VALID( pTBB );
  839. return ((HMENU)(*pTBB));
  840. }
  841. bool CExtToolControlBar::MarkButtonAsMdiWindowsMenu(
  842. int nIndex,
  843. bool bAppendMdiWindowsMenu // = TRUE
  844. )
  845. {
  846. CExtBarButton * pTBB =
  847. _GetButtonPtr(nIndex);
  848. ASSERT( pTBB != NULL );
  849. if( pTBB == NULL )
  850. return false;
  851. ASSERT_VALID( pTBB );
  852. pTBB->SetAppendMdiWindowsMenu(
  853. bAppendMdiWindowsMenu
  854. );
  855. return true;
  856. }
  857. bool CExtToolControlBar::SetButtonMenu(
  858. int nIndex,
  859. HMENU hMenu, // = NULL
  860. bool bPopupMenu, // = TRUE
  861. bool bAutoDestroyMenu, // = TRUE
  862. bool bDoRecalcLayout // = TRUE
  863. )
  864. {
  865. CExtBarButton * pTBB =
  866. _GetButtonPtr(nIndex);
  867. ASSERT( pTBB != NULL );
  868. if( pTBB == NULL )
  869. return false;
  870. ASSERT_VALID( pTBB );
  871. pTBB->SetMenu(
  872. hMenu,
  873. bPopupMenu,
  874. bAutoDestroyMenu
  875. );
  876. if( bDoRecalcLayout )
  877. _RecalcLayoutImpl();
  878. return true;
  879. }
  880. int CExtToolControlBar::GetVisibleButton(
  881. int nBtnIdx,
  882. BOOL bNext,
  883. BOOL bPassDisabled // = TRUE
  884. )
  885. {
  886. int nCountOfButtons = _GetButtonsCountImpl();
  887. ASSERT( nCountOfButtons >= 0 );
  888. if( nCountOfButtons == 0 )
  889. return -1;
  890. if( nCountOfButtons == 1 )
  891. return 0;
  892. if( bNext )
  893. {
  894. int iNewButton = nBtnIdx + 1;
  895. if( iNewButton >= nCountOfButtons )
  896. iNewButton = 0;
  897. while( iNewButton != nBtnIdx )
  898. {
  899. CExtBarButton * pTBB =
  900. _GetButtonPtr(iNewButton);
  901. ASSERT_VALID( pTBB );
  902. if( pTBB->OnQueryFlatTrackingEnabled()
  903. && ( (!bPassDisabled)
  904. || (bPassDisabled && (!pTBB->IsDisabled()))
  905. )
  906. )
  907. {
  908. return iNewButton;
  909. }
  910. iNewButton++;
  911. if( iNewButton >= nCountOfButtons )
  912. iNewButton = 0;
  913. }
  914. return iNewButton;
  915. } // if( bNext )
  916. else
  917. {
  918. int iNewButton =
  919. nBtnIdx - 1;
  920. if( iNewButton < 0 )
  921. iNewButton = nCountOfButtons - 1;
  922. while( iNewButton != nBtnIdx )
  923. {
  924. CExtBarButton * pTBB =
  925. _GetButtonPtr(iNewButton);
  926. ASSERT_VALID( pTBB );
  927. if( pTBB->OnQueryFlatTrackingEnabled()
  928. && ( (!bPassDisabled)
  929. || (bPassDisabled && (!pTBB->IsDisabled()))
  930. )
  931. )
  932. return iNewButton;
  933. iNewButton--;
  934. if( iNewButton < 0 )
  935. iNewButton = nCountOfButtons - 1;
  936. }
  937. return iNewButton;
  938. } // else from if( bNext )
  939. }
  940. INT CExtToolControlBar::OnCalcFlatTrackingIndex(
  941. /*__EXT_MFC_SAFE_TCHAR*/ INT vkTCHAR,
  942. INT nStartSearchIndex
  943. )
  944. {
  945. ASSERT_VALID( this );
  946. if( (! m_bHelperFlatTrackingCalcEnabledLeftRight )
  947. && (! m_bHelperFlatTrackingCalcEnabledUpDown )
  948. )
  949. return -1;
  950. if( vkTCHAR != VK_LEFT
  951. && vkTCHAR != VK_RIGHT
  952. && vkTCHAR != VK_UP
  953. && vkTCHAR != VK_DOWN
  954. && vkTCHAR != VK_TAB
  955. )
  956. return -1;
  957. bool bShift = false;
  958. CTypedPtrArray < CPtrArray, CExtBarButton * > arrTabOrder;
  959. if( vkTCHAR == VK_TAB )
  960. {
  961. bShift = CExtPopupMenuWnd::IsKeyPressed( VK_SHIFT ) ? true : false;
  962. if( ! OnCalcFlatTrackingTabOrder( arrTabOrder ) )
  963. {
  964. if( bShift )
  965. vkTCHAR = VK_LEFT;
  966. else
  967. vkTCHAR = VK_RIGHT;
  968. } // if( ! OnCalcFlatTrackingTabOrder( arrTabOrder ) )
  969. } // if( _vkTCHAR == VK_TAB )
  970. INT nButtonIndex, nCountOfButtons = GetButtonsCount();
  971. if( nCountOfButtons == 0 )
  972. return -1;
  973. CExtBarButton * pStartTBB = NULL;
  974. if( 0 <= nStartSearchIndex && nStartSearchIndex < nCountOfButtons )
  975. {
  976. pStartTBB = GetButton( nStartSearchIndex );
  977. ASSERT_VALID( pStartTBB );
  978. if( ! pStartTBB->OnQueryFlatTrackingEnabled() )
  979. {
  980. pStartTBB = NULL;
  981. nStartSearchIndex = -1;
  982. }
  983. } // if( 0 <= nStartSearchIndex && nStartSearchIndex < nCountOfButtons )
  984. if( nStartSearchIndex < 0 || pStartTBB == NULL )
  985. {
  986. CPoint ptMinLT( 32767, 32767 );
  987. for( nButtonIndex = 0; nButtonIndex < nCountOfButtons; nButtonIndex++ )
  988. {
  989. CExtBarButton * pTBB = GetButton( nButtonIndex );
  990. ASSERT_VALID( pTBB );
  991. if( ! pTBB->OnQueryFlatTrackingEnabled() )
  992. continue;
  993. CRect rcTBB = *pTBB;
  994. if( rcTBB.left < ptMinLT.x
  995. || ( rcTBB.left == ptMinLT.x && rcTBB.top < ptMinLT.y )
  996. )
  997. {
  998. nStartSearchIndex = nButtonIndex;
  999. ptMinLT.x = min( ptMinLT.x, rcTBB.left );
  1000. ptMinLT.y = min( ptMinLT.y, rcTBB.top );
  1001. }
  1002. } // for( nButtonIndex = 0; nButtonIndex < nCountOfButtons; nButtonIndex++ )
  1003. return nStartSearchIndex;
  1004. } // if( nStartSearchIndex < 0 || pStartTBB == NULL )
  1005. if( vkTCHAR == VK_TAB )
  1006. {
  1007. INT nIndex, nFound = -1, nCount = INT( arrTabOrder.GetSize() );
  1008. if( nCount == 0 )
  1009. return nStartSearchIndex;
  1010. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  1011. {
  1012. CExtBarButton * pTBB = arrTabOrder[ nIndex ];
  1013. ASSERT_VALID( pTBB );
  1014. if( pTBB == pStartTBB )
  1015. {
  1016. nFound = nIndex;
  1017. break;
  1018. }
  1019. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  1020. if( nFound < 0 )
  1021. return nStartSearchIndex;
  1022. if( bShift )
  1023. {
  1024. if( nFound == 0 )
  1025. nFound = nCount - 1;
  1026. else
  1027. nFound --;
  1028. } // if( bShift )
  1029. else
  1030. {
  1031. if( nFound == ( nCount - 1 ) )
  1032. nFound = 0;
  1033. else
  1034. nFound ++;
  1035. } // else from if( bShift )
  1036. CExtBarButton * pTBB = arrTabOrder[ nFound ];
  1037. ASSERT_VALID( pTBB );
  1038. nStartSearchIndex = _GetIndexOf( pTBB );
  1039. return nStartSearchIndex;
  1040. } // if( vkTCHAR == VK_TAB )
  1041. CRect rcNextTBB( 0, 0, 0, 0 );
  1042. switch( TCHAR(vkTCHAR) )
  1043. {
  1044. case VK_LEFT:
  1045. if( ! m_bHelperFlatTrackingCalcEnabledLeftRight )
  1046. return nStartSearchIndex;
  1047. rcNextTBB.SetRect( -32767, -32767, -32767,  32767 );
  1048. break;
  1049. case VK_RIGHT:
  1050. if( ! m_bHelperFlatTrackingCalcEnabledLeftRight )
  1051. return nStartSearchIndex;
  1052. rcNextTBB.SetRect(  32767, -32767,  32767,  32767 );
  1053. break;
  1054. case VK_UP:
  1055. if( ! m_bHelperFlatTrackingCalcEnabledUpDown )
  1056. return nStartSearchIndex;
  1057. rcNextTBB.SetRect( -32767, -32767, -32767, -32767 );
  1058. break;
  1059. case VK_DOWN:
  1060. if( ! m_bHelperFlatTrackingCalcEnabledUpDown )
  1061. return nStartSearchIndex;
  1062. rcNextTBB.SetRect( -32767,  32767, -32767,  32767 );
  1063. break;
  1064. #ifdef _DEBUG
  1065. default:
  1066. ASSERT( FALSE );
  1067. return nStartSearchIndex;
  1068. #endif // _DEBUG
  1069. } // switch( TCHAR(vkTCHAR) )
  1070. CRuntimeClass * pStartRTC = pStartTBB->GetRuntimeClass();
  1071. CExtBarButton * pNextsParentTBB = pStartTBB->ParentButtonGet();
  1072. //CRect rcStartTBB = *pStartTBB;
  1073. CRect rcStartTBB = pStartTBB->OnQueryFlatWalkingCalcRect();
  1074. CPoint ptStartCP = rcStartTBB.CenterPoint(), ptNextCP( 32767, 32767 );
  1075. INT nNextDist = 32767, nPassIndex;
  1076. INT nSavedStartSearchIndex = nStartSearchIndex;
  1077. for( nPassIndex = 0; nPassIndex < 3; nPassIndex ++ )
  1078. {
  1079. for( nButtonIndex = 0; nButtonIndex < nCountOfButtons; nButtonIndex++ )
  1080. {
  1081. CExtBarButton * pTBB = GetButton( nButtonIndex );
  1082. ASSERT_VALID( pTBB );
  1083. if( (! pTBB->OnQueryFlatTrackingEnabled() )
  1084. || pTBB == pStartTBB
  1085. || nButtonIndex == nStartSearchIndex
  1086. )
  1087. continue;
  1088. CExtBarButton * pParentTBB = pTBB->ParentButtonGet();
  1089. //CRect rcTBB = *pTBB;
  1090. CRect rcTBB = pTBB->OnQueryFlatWalkingCalcRect();
  1091. CPoint ptCP = rcTBB.CenterPoint();
  1092. INT nX2 = ptCP.x - ptStartCP.x;
  1093. INT nY2 = ptCP.y - ptStartCP.y;
  1094. INT nCurrDist = nX2*nX2 + nY2*nY2;
  1095. bool bHorzIntersection = false, bVertIntersection = false, bRtcIntersection = false;
  1096. // if( ( rcTBB.top >= rcStartTBB.top && rcTBB.bottom >= rcStartTBB.bottom )
  1097. // || ( rcTBB.top <= rcStartTBB.top && rcTBB.bottom <= rcStartTBB.bottom )
  1098. // )
  1099. // bHorzIntersection = true;
  1100. // if( ( rcTBB.left >= rcStartTBB.left && rcTBB.right >= rcStartTBB.right )
  1101. // || ( rcTBB.left <= rcStartTBB.left && rcTBB.right <= rcStartTBB.right )
  1102. // )
  1103. // bVertIntersection = true;
  1104. // if( rcTBB.top == rcStartTBB.top && rcTBB.bottom == rcStartTBB.bottom )
  1105. // bHorzIntersection = true;
  1106. // if( rcTBB.left == rcStartTBB.left && rcTBB.right == rcStartTBB.right )
  1107. // bVertIntersection = true;
  1108. if( OnCalcFlatTrackingIndexCheckIntersectionEnabled( pTBB, vkTCHAR ) )
  1109. {
  1110. if( ( rcTBB.top < ptStartCP.y && ptStartCP.y < rcTBB.bottom )
  1111. && ( rcStartTBB.top < ptCP.y && ptCP.y < rcStartTBB.bottom )
  1112. )
  1113. bHorzIntersection = true;
  1114. }
  1115. if( OnCalcFlatTrackingIndexCheckIntersectionEnabled( pTBB, vkTCHAR ) )
  1116. {
  1117. if( ( rcTBB.left < ptStartCP.y && ptStartCP.y < rcTBB.right )
  1118. && ( rcStartTBB.left < ptCP.y && ptCP.y < rcStartTBB.right )
  1119. )
  1120. bVertIntersection = true;
  1121. }
  1122. CRuntimeClass * pCurrRTC = pTBB->GetRuntimeClass();
  1123. if( pStartRTC->IsDerivedFrom( pCurrRTC )
  1124. && pCurrRTC->IsDerivedFrom( pStartRTC )
  1125. )
  1126. bRtcIntersection = true;
  1127. if( nPassIndex == 0 )
  1128. {
  1129. if( ! bRtcIntersection )
  1130. continue;
  1131. }
  1132. switch( TCHAR(vkTCHAR) )
  1133. {
  1134. case VK_LEFT:
  1135. if( nPassIndex <= 1 )
  1136. {
  1137. if( ! bHorzIntersection )
  1138. continue;
  1139. }
  1140. if( rcTBB.right > rcStartTBB.left )
  1141. continue;
  1142. if( rcTBB.right < rcNextTBB.right )
  1143. {
  1144. if( pNextsParentTBB != pParentTBB )
  1145. continue;
  1146. if( nCurrDist >= nNextDist )
  1147. continue;
  1148. }
  1149. if( rcTBB.right == rcNextTBB.right )
  1150. {
  1151. INT nDistCurr = INT( abs( ( ptStartCP.y - ptCP.y ) ) );
  1152. INT nDistPrev = INT( abs( ( ptStartCP.y - rcNextTBB.CenterPoint().y ) ) );
  1153. if( nDistCurr > nDistPrev )
  1154. continue;
  1155. }
  1156. if( nCurrDist >= nNextDist )
  1157. continue;
  1158. pNextsParentTBB = pParentTBB;
  1159. ptNextCP = ptCP;
  1160. nNextDist = nCurrDist;
  1161. rcNextTBB = rcTBB;
  1162. nStartSearchIndex = nButtonIndex;
  1163. break;
  1164. case VK_RIGHT:
  1165. if( nPassIndex <= 1 )
  1166. {
  1167. if( ! bHorzIntersection )
  1168. continue;
  1169. }
  1170. if( rcTBB.left < rcStartTBB.right )
  1171. continue;
  1172. if( rcTBB.left > rcNextTBB.left )
  1173. {
  1174. if( pNextsParentTBB != pParentTBB )
  1175. continue;
  1176. if( nCurrDist >= nNextDist )
  1177. continue;
  1178. }
  1179. else if( rcTBB.left == rcNextTBB.left )
  1180. {
  1181. INT nDistCurr = INT( abs( ( ptStartCP.y - ptCP.y ) ) );
  1182. INT nDistPrev = INT( abs( ( ptStartCP.y - rcNextTBB.CenterPoint().y ) ) );
  1183. if( nDistCurr > nDistPrev )
  1184. continue;
  1185. }
  1186. if( nCurrDist >= nNextDist )
  1187. continue;
  1188. pNextsParentTBB = pParentTBB;
  1189. ptNextCP = ptCP;
  1190. nNextDist = nCurrDist;
  1191. rcNextTBB = rcTBB;
  1192. nStartSearchIndex = nButtonIndex;
  1193. break;
  1194. case VK_UP:
  1195. if( nPassIndex <= 1 )
  1196. {
  1197. if( ! bVertIntersection )
  1198. continue;
  1199. }
  1200. if( rcTBB.bottom > rcStartTBB.top )
  1201. continue;
  1202. if( rcTBB.bottom < rcNextTBB.bottom )
  1203. {
  1204. if( pNextsParentTBB != pParentTBB )
  1205. continue;
  1206. if( nCurrDist >= nNextDist )
  1207. continue;
  1208. }
  1209. if( rcTBB.bottom == rcNextTBB.bottom )
  1210. {
  1211. INT nDistCurr = INT( abs( ( ptStartCP.y - ptCP.y ) ) );
  1212. INT nDistPrev = INT( abs( ( ptStartCP.y - rcNextTBB.CenterPoint().y ) ) );
  1213. if( nDistCurr > nDistPrev )
  1214. continue;
  1215. }
  1216. if( nCurrDist >= nNextDist )
  1217. continue;
  1218. pNextsParentTBB = pParentTBB;
  1219. ptNextCP = ptCP;
  1220. nNextDist = nCurrDist;
  1221. rcNextTBB = rcTBB;
  1222. nStartSearchIndex = nButtonIndex;
  1223. break;
  1224. case VK_DOWN:
  1225. if( nPassIndex <= 1 )
  1226. {
  1227. if( ! bVertIntersection )
  1228. continue;
  1229. }
  1230. if( rcTBB.top < rcStartTBB.bottom )
  1231. continue;
  1232. if( rcTBB.top > rcNextTBB.top )
  1233. {
  1234. if( pNextsParentTBB != pParentTBB )
  1235. continue;
  1236. if( nCurrDist >= nNextDist )
  1237. continue;
  1238. }
  1239. else if( rcTBB.top == rcNextTBB.top )
  1240. {
  1241. INT nDistCurr = INT( abs( ( ptStartCP.y - ptCP.y ) ) );
  1242. INT nDistPrev = INT( abs( ( ptStartCP.y - rcNextTBB.CenterPoint().y ) ) );
  1243. if( nDistCurr > nDistPrev )
  1244. continue;
  1245. }
  1246. if( nCurrDist >= nNextDist )
  1247. continue;
  1248. pNextsParentTBB = pParentTBB;
  1249. ptNextCP = ptCP;
  1250. nNextDist = nCurrDist;
  1251. rcNextTBB = rcTBB;
  1252. nStartSearchIndex = nButtonIndex;
  1253. break;
  1254. #ifdef _DEBUG
  1255. default:
  1256. ASSERT( FALSE );
  1257. return nStartSearchIndex;
  1258. #endif // _DEBUG
  1259. } // switch( TCHAR(vkTCHAR) )
  1260. } // for( nButtonIndex = 0; nButtonIndex < nCountOfButtons; nButtonIndex++ )
  1261. if( nSavedStartSearchIndex != nStartSearchIndex )
  1262. {
  1263. if( nStartSearchIndex >= 0 )
  1264. {
  1265. if( ! OnCalcFlatTrackingIndexCheckPass(
  1266. vkTCHAR,
  1267. nPassIndex,
  1268. pStartTBB,
  1269. GetButton( nStartSearchIndex )
  1270. )
  1271. )
  1272. {
  1273. nStartSearchIndex = -1;
  1274. continue;
  1275. }
  1276. } // if( nStartSearchIndex >= 0 )
  1277. // break;
  1278. } // if( nSavedStartSearchIndex != nStartSearchIndex )
  1279. } // for( nPassIndex = 0; nPassIndex < 3; nPassIndex ++ )
  1280. // if( nStartSearchIndex < 0 )
  1281. // return nSavedStartSearchIndex;
  1282. return nStartSearchIndex;
  1283. }
  1284. bool CExtToolControlBar::OnCalcFlatTrackingIndexCheckPass(
  1285. /*__EXT_MFC_SAFE_TCHAR*/ INT vkTCHAR,
  1286. INT nPassIndex,
  1287. const CExtBarButton * pPrevTBB,
  1288. const CExtBarButton * pNextTBB
  1289. ) const
  1290. {
  1291. ASSERT_VALID( this );
  1292. vkTCHAR;
  1293. nPassIndex;
  1294. pPrevTBB;
  1295. pNextTBB;
  1296. return true;
  1297. }
  1298. bool CExtToolControlBar::OnCalcFlatTrackingTabOrder(
  1299. CTypedPtrArray < CPtrArray, CExtBarButton * > & arrTabOrder
  1300. )
  1301. {
  1302. ASSERT_VALID( this );
  1303. arrTabOrder.RemoveAll();
  1304. INT nIndex, nCount = GetButtonsCount();
  1305. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  1306. {
  1307. CExtBarButton * pTBB = GetButton( nIndex );
  1308. ASSERT_VALID( pTBB );
  1309. if( ! pTBB->OnQueryFlatTrackingEnabled() )
  1310. continue;
  1311. arrTabOrder.Add( pTBB );
  1312. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  1313. return true;
  1314. }
  1315. bool CExtToolControlBar::OnCalcFlatTrackingIndexCheckIntersectionEnabled(
  1316. CExtBarButton * pTBB,
  1317. /*__EXT_MFC_SAFE_TCHAR*/ INT vkTCHAR
  1318. )
  1319. {
  1320. ASSERT_VALID( this );
  1321. ASSERT_VALID( pTBB );
  1322. pTBB;
  1323. vkTCHAR;
  1324. return false;
  1325. }
  1326. BOOL CExtToolControlBar::TrackButtonMenu(
  1327. int nIndex,
  1328. BOOL bSelectAny, // = FALSE
  1329. BOOL bDelayedTracking, // = FALSE
  1330. BOOL bNoAnimation // = FALSE
  1331. )
  1332. {
  1333. bool bDockSiteCustomizeMode =
  1334. _IsDockSiteCustomizeMode();
  1335. if( bDockSiteCustomizeMode )
  1336. return FALSE;
  1337. if( g_bMenuTracking
  1338. && m_nBtnIdxMenuTracking == nIndex
  1339. )
  1340. return TRUE;
  1341. if( !SafeDisplayBar() )
  1342. return FALSE;
  1343. CExtBarButton * pTBB =
  1344. _GetButtonPtr(nIndex);
  1345. ASSERT( pTBB != NULL );
  1346. if( pTBB == NULL )
  1347. return FALSE;
  1348. ASSERT_VALID( pTBB );
  1349. if( pTBB->GetStyle() & (TBBS_HIDDEN|TBBS_DISABLED) )
  1350. return FALSE;
  1351. if( ! pTBB->IsAbleToTrackMenu() )
  1352. return FALSE;
  1353. CPoint point( -32767, -32767 );
  1354. if( (! IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  1355. || (! ((CExtMenuControlBar*)this)->m_bUseFastKeyboardMenuTracking )
  1356. )
  1357. {
  1358. if( ! ::GetCursorPos(&point) )
  1359. return FALSE;
  1360. ScreenToClient( &point );
  1361. }
  1362. if( bDelayedTracking )
  1363. PostMessage(
  1364. g_nMsgTrackButtonMenu,
  1365. (WPARAM)nIndex,
  1366. (LPARAM)bNoAnimation
  1367. );
  1368. else
  1369. pTBB->OnTrackPopup(
  1370. point,
  1371. bSelectAny ? true : false,
  1372. bNoAnimation ? true : false
  1373. );
  1374. return TRUE;
  1375. }
  1376. CSize CExtToolControlBar::CalcDynamicLayout(int nLength, DWORD dwMode)
  1377. {
  1378. if( (nLength == -1)
  1379. && !(dwMode & (LM_MRUWIDTH|LM_COMMIT))
  1380. &&  (dwMode & (LM_HORZDOCK|LM_VERTDOCK))
  1381. )
  1382. return
  1383. CalcFixedLayout(
  1384. dwMode & LM_STRETCH,
  1385. dwMode & LM_HORZDOCK
  1386. );
  1387. ASSERT(
  1388. (dwMode&(LM_HORZ|LM_HORZDOCK))
  1389. ||
  1390. (!(dwMode&LM_HORZDOCK))
  1391. );
  1392. return _CalcLayout( dwMode, nLength );
  1393. }
  1394. CSize CExtToolControlBar::CalcFixedLayout(
  1395. BOOL bStretch,
  1396. BOOL bHorz
  1397. )
  1398. {
  1399. DWORD dwMode = bStretch ? LM_STRETCH : 0;
  1400. dwMode |= bHorz ? LM_HORZ : 0;
  1401. ASSERT(
  1402. (dwMode&(LM_HORZ|LM_HORZDOCK))
  1403. ||
  1404. (!(dwMode&LM_HORZDOCK))
  1405. );
  1406. return _CalcLayout( dwMode );
  1407. }
  1408. CSize CExtToolControlBar::_CalcLayout(
  1409. DWORD dwMode,
  1410. int nLength
  1411. )
  1412. {
  1413. ASSERT_VALID(this);
  1414. if( ! m_bInsideCalcLayout )
  1415. m_bHelperTempFullRowMode = false;
  1416. // if( m_pDockSite->GetSafeHwnd() != NULL
  1417. // && (! IsFloating() )
  1418. // && OnQueryMultiRowLayout()
  1419. // )
  1420. // {
  1421. // WINDOWPLACEMENT _wp;
  1422. // ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  1423. // _wp.length = sizeof(WINDOWPLACEMENT);
  1424. // if( m_pDockSite->GetWindowPlacement( &_wp )
  1425. // && _wp.showCmd == SW_SHOWMINIMIZED
  1426. // )
  1427. // {
  1428. // CRect rcWnd;
  1429. // GetWindowRect( &rcWnd );
  1430. // return rcWnd.Size();
  1431. // }
  1432. // }
  1433. CSize sizeDefButton = _GetDefButtonSize();
  1434. CSize sizeCalcLayout = sizeDefButton;
  1435. if( _GetButtonsCountImpl() > 0 )
  1436. {
  1437. if( m_pRightBtn != NULL )
  1438. m_pRightBtn->ClearContent( false );
  1439. BOOL bDynamic = m_dwStyle & CBRS_SIZE_DYNAMIC;
  1440. INT nLengthToSizeTB =
  1441. (dwMode & LM_HORZ) ? 32767 : 0;
  1442. BOOL bVertSizeTB = FALSE;
  1443. if( bDynamic )
  1444. {
  1445. if( dwMode & LM_MRUWIDTH )
  1446. nLengthToSizeTB = m_nMRUWidth;
  1447. else if( dwMode & LM_HORZDOCK )
  1448. nLengthToSizeTB = 32767;
  1449. else if( dwMode & LM_VERTDOCK )
  1450. nLengthToSizeTB = 0;
  1451. else if( nLength != -1 )
  1452. {
  1453. CRect rcInside( 0, 0, 0, 0 );
  1454. _CalcInsideRect(
  1455. rcInside,
  1456. (dwMode & LM_HORZ)
  1457. );
  1458. bVertSizeTB = (dwMode & LM_LENGTHY);
  1459. nLengthToSizeTB =
  1460. nLength +
  1461. ( bVertSizeTB ?
  1462. rcInside.Height() : rcInside.Width()
  1463. );
  1464. }
  1465. else if( (m_dwStyle & CBRS_FLOATING) != 0 )
  1466. nLengthToSizeTB = m_nMRUWidth;
  1467. } // if( bDynamic )
  1468. bool bMultiRowLayout =
  1469. OnQueryMultiRowLayout();
  1470. if( bMultiRowLayout
  1471. && ((dwMode & LM_HORZ) == 0)
  1472. && (!m_bPaletteMode)
  1473. )
  1474. {
  1475. CRect rcDockBarClient;
  1476. if( m_pDockBar != NULL )
  1477. {
  1478. ASSERT_VALID( m_pDockBar );
  1479. ASSERT_VALID( m_pDockSite );
  1480. //m_pDockSite->GetClientRect( &rcDockBarClient );
  1481. rcDockBarClient = ((CExtDockBar*)m_pDockBar)->m_rectLayout;
  1482. }
  1483. else
  1484. GetParent()->GetClientRect( &rcDockBarClient );
  1485. nLength = nLengthToSizeTB = rcDockBarClient.Height();
  1486. bVertSizeTB = TRUE;
  1487. }
  1488. _SizeToolBar( nLengthToSizeTB, bVertSizeTB );
  1489. sizeCalcLayout =
  1490. _CalcSize(
  1491. ( (dwMode & LM_HORZ) == 0 ) ? TRUE : FALSE
  1492. );
  1493. if( bDynamic
  1494. && bMultiRowLayout
  1495. && (!m_bPaletteMode)
  1496. )
  1497. {
  1498. CSize sizeDiff(
  1499. __EXT_TB_BUTTON_OUTER_MARGIN*2,
  1500. __EXT_TB_BUTTON_OUTER_MARGIN*2
  1501. );
  1502. if( m_pRightBtn != NULL
  1503. && m_pRightBtn->IsVisible()
  1504. )
  1505. {
  1506. CSize sizeRb = m_pRightBtn->Size();
  1507. sizeDiff +=
  1508. CSize(
  1509. ((dwMode&LM_HORZ) == 0) ? 0 : sizeRb.cx,
  1510. ((dwMode&LM_HORZ) == 0) ? sizeRb.cy : 0
  1511. );
  1512. }
  1513. CRect rcDockBarClient;
  1514. if( m_pDockBar != NULL )
  1515. {
  1516. ASSERT_VALID( m_pDockBar );
  1517. ASSERT_VALID( m_pDockSite );
  1518. //m_pDockSite->GetClientRect( &rcDockBarClient );
  1519. rcDockBarClient = ((CExtDockBar*)m_pDockBar)->m_rectLayout;
  1520. }
  1521. else
  1522. GetParent()->GetClientRect( &rcDockBarClient );
  1523. CSize _sizeDockBarClient = rcDockBarClient.Size();
  1524. INT nNewLengthToSizeTB = nLengthToSizeTB;
  1525. if( (dwMode & LM_HORZ) == 0 )
  1526. {
  1527. if( (sizeCalcLayout.cy+sizeDiff.cy) > _sizeDockBarClient.cy )
  1528. nNewLengthToSizeTB = _sizeDockBarClient.cy-sizeDiff.cy;
  1529. } // if( (dwMode & LM_HORZ) == 0 )
  1530. else
  1531. {
  1532. if( (sizeCalcLayout.cx+sizeDiff.cx) > _sizeDockBarClient.cx )
  1533. nNewLengthToSizeTB = _sizeDockBarClient.cx-sizeDiff.cx;
  1534. } // else from if( (dwMode & LM_HORZ) == 0 )
  1535. if( nNewLengthToSizeTB < 1 )
  1536. nNewLengthToSizeTB = 1;
  1537. if( nNewLengthToSizeTB != nLengthToSizeTB )
  1538. {
  1539. if( ! m_bInsideCalcLayout )
  1540. {
  1541. m_bHelperTempFullRowMode = true;
  1542. m_bInsideCalcLayout = true;
  1543. sizeCalcLayout = _CalcLayout( dwMode, nNewLengthToSizeTB );
  1544. if( nLengthToSizeTB != 32767 )
  1545. _RecalcPositionsImpl();
  1546. m_bInsideCalcLayout = false;
  1547. return sizeCalcLayout;
  1548. }
  1549. }
  1550. if( nLengthToSizeTB != 32767 )
  1551. _RecalcPositionsImpl();
  1552. }
  1553. if( m_pRightBtn != NULL
  1554. && m_pRightBtn->GetButtons().GetSize() == 0
  1555. )
  1556. {
  1557. m_pRightBtn->ClearContent();
  1558. sizeCalcLayout = _CalcSize( (dwMode & LM_HORZ) == 0 );
  1559. }
  1560. if( dwMode & LM_COMMIT )
  1561. if( (m_dwStyle & (CBRS_FLOATING|CBRS_SIZE_DYNAMIC)) != 0 )
  1562. if( dwMode & LM_HORZ )
  1563. m_nMRUWidth = sizeCalcLayout.cx;
  1564. CRect rcInside( 0, 0, 0, 0 );
  1565. _CalcInsideRect(
  1566. rcInside,
  1567. (dwMode & LM_HORZ)
  1568. );
  1569. sizeCalcLayout.cy -= rcInside.Height();
  1570. sizeCalcLayout.cx -= rcInside.Width();
  1571. CSize sizeCalcFixedLayout =
  1572. CControlBar::CalcFixedLayout(
  1573. dwMode & LM_STRETCH,
  1574. (dwMode & LM_HORZ)
  1575. );
  1576. sizeCalcLayout.cx =
  1577. max( sizeCalcLayout.cx, sizeCalcFixedLayout.cx );
  1578. sizeCalcLayout.cy =
  1579. max( sizeCalcLayout.cy, sizeCalcFixedLayout.cy );
  1580. if( IsFloating() && IsBarWithGripper() )
  1581. {
  1582. CRect rcGrip = _RectGripGet();
  1583. int nCyGripper = min( rcGrip.Width(), rcGrip.Height() );
  1584. sizeCalcLayout.cy += nCyGripper;
  1585. }
  1586. } // if( _GetButtonsCountImpl() > 0 )
  1587. if( IsDockedHorizontally() )
  1588. {
  1589. m_sizeDockedH = sizeCalcLayout;
  1590. m_nMinHW = sizeCalcLayout.cy;
  1591. }
  1592. else if( IsDockedVertically() )
  1593. {
  1594. m_sizeDockedV = sizeCalcLayout;
  1595. m_nMinVH = sizeCalcLayout.cx;
  1596. }
  1597. else if( IsFloating() )
  1598. {
  1599. if( sizeCalcLayout.cx < sizeDefButton.cx * 2 ) // (+ 2.23 )
  1600. sizeCalcLayout.cx = sizeDefButton.cx * 2;
  1601. m_sizeFloated = sizeCalcLayout;
  1602. }
  1603. if( m_pDockSite == NULL )
  1604. { // specific for dialog mode
  1605. if( IsDockedHorizontally() )
  1606. sizeCalcLayout.cy += 4;
  1607. else
  1608. sizeCalcLayout.cx += 4;
  1609. } // specific for dialog mode
  1610. return sizeCalcLayout;
  1611. }
  1612. CSize CExtToolControlBar::_CalcSize( BOOL bVerticallyDocked )
  1613. {
  1614. int nCountOfButtons = _GetButtonsCountImpl();
  1615. if( nCountOfButtons == 0 )
  1616. return _GetDefButtonSize();
  1617. CFont * pFont =
  1618. OnGetToolbarFont(
  1619. ( bVerticallyDocked && (!m_bPaletteMode) )
  1620. ? true : false,
  1621. true
  1622. );
  1623. if( pFont->GetSafeHandle() == NULL )
  1624. pFont = ( bVerticallyDocked && (!m_bPaletteMode) )
  1625. ? (&( PmBridge_GetPM()->m_FontNormalVert ))
  1626. : (&( PmBridge_GetPM()->m_FontNormal ))
  1627. ;
  1628. CClientDC dc( this );
  1629. CFont * pOldFont = dc.SelectObject( pFont );
  1630. ASSERT( pOldFont != NULL );
  1631. bool bMultiRowLayout = OnQueryMultiRowLayout();
  1632. CExtBarButton::e_wrap_t _evt = GetBtnWrapCode();
  1633. CSize sizeDefButton = _GetDefButtonSize();
  1634. CSize sizeCalc(0,0); // ( sizeDefButton );
  1635. CPoint ptCurrent( 0, 0 );
  1636. int nRowExtent = 0;
  1637. if( bMultiRowLayout && bVerticallyDocked && (!m_bPaletteMode) )
  1638. nRowExtent = sizeDefButton.cx;
  1639. else
  1640. nRowExtent = sizeDefButton.cy;
  1641. INT nRowDistance = PmBridge_GetPM()->FixedBar_GetRowDistance( this ); // (+ v.2.22)
  1642. INT nWrapCount = 0;
  1643. for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  1644. {
  1645. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  1646. ASSERT_VALID( pTBB );
  1647. if( pTBB->GetStyle() & TBBS_HIDDEN )
  1648. continue;
  1649. if( pTBB->IsSeparator()
  1650. && nBtnIdx < (nCountOfButtons-1)
  1651. )
  1652. {
  1653. CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 );
  1654. ASSERT_VALID( pNextTBB );
  1655. if( pNextTBB->GetStyle() & TBBS_HIDDEN )
  1656. continue;
  1657. }
  1658. CSize sizeTBB(
  1659. pTBB->CalculateLayout(
  1660. dc,
  1661. sizeDefButton,
  1662. (!bVerticallyDocked) || m_bPaletteMode
  1663. )
  1664. );
  1665. if( nBtnIdx == (nCountOfButtons-1)
  1666. && m_pRightBtn != NULL
  1667. && (IsFloating() || bMultiRowLayout)
  1668. )
  1669. {
  1670. ASSERT_VALID( m_pRightBtn );
  1671. ASSERT( m_pRightBtn == pTBB );
  1672. if( bMultiRowLayout )
  1673. {
  1674. if( bVerticallyDocked )
  1675. sizeCalc.cy += sizeTBB.cy;
  1676. else
  1677. sizeCalc.cx += sizeTBB.cx;
  1678. if( nWrapCount > 0 && (! m_bPaletteMode) )
  1679. m_bHelperTempFullRowMode = true;
  1680. }
  1681. break;
  1682. }
  1683. if( bMultiRowLayout && bVerticallyDocked && (!m_bPaletteMode) )
  1684. {
  1685. if( ( ptCurrent.y == 0 || pTBB->IsWrap(_evt) )
  1686. && pTBB->IsSeparator()
  1687. )
  1688. sizeTBB = CSize( 0, 0 );
  1689. nRowExtent = max( nRowExtent, sizeTBB.cx );
  1690. sizeCalc.cx =
  1691. max(
  1692. ptCurrent.x + sizeTBB.cx,
  1693. sizeCalc.cx
  1694. );
  1695. sizeCalc.cy =
  1696. max(
  1697. ptCurrent.y + sizeTBB.cy,
  1698. sizeCalc.cy
  1699. );
  1700. ptCurrent.y += sizeTBB.cy;
  1701. if( pTBB->IsWrap(_evt) )
  1702. {
  1703. ptCurrent.y = 0;
  1704. ptCurrent.x += nRowExtent + nRowDistance;
  1705. nRowExtent = sizeDefButton.cx;
  1706. nWrapCount++;
  1707. }
  1708. } // if( bMultiRowLayout && bVerticallyDocked && (!m_bPaletteMode) )
  1709. else
  1710. {
  1711. if( ( (!bVerticallyDocked) || m_bPaletteMode )
  1712. && ( ptCurrent.x == 0 || pTBB->IsWrap(_evt) )
  1713. && pTBB->IsSeparator()
  1714. )
  1715. sizeTBB = CSize( 0, 0 );
  1716. nRowExtent = max( nRowExtent, sizeTBB.cy );
  1717. sizeCalc.cx =
  1718. max(
  1719. ptCurrent.x + sizeTBB.cx,
  1720. sizeCalc.cx
  1721. );
  1722. sizeCalc.cy =
  1723. max(
  1724. ptCurrent.y + sizeTBB.cy,
  1725. sizeCalc.cy
  1726. );
  1727. if( bVerticallyDocked
  1728. && (!m_bPaletteMode)
  1729. )
  1730. {
  1731. ptCurrent.x = 0;
  1732. ptCurrent.y += sizeTBB.cy;
  1733. } // if( bVerticallyDocked && (!m_bPaletteMode) ...
  1734. else
  1735. {
  1736. ptCurrent.x += sizeTBB.cx;
  1737. if( pTBB->IsWrap(_evt) )
  1738. {
  1739. ptCurrent.x = 0;
  1740. ptCurrent.y += nRowExtent + nRowDistance;
  1741. nRowExtent = sizeDefButton.cy;
  1742. nWrapCount++;
  1743. }
  1744. } // else from if( bVerticallyDocked && (!m_bPaletteMode) ...
  1745. } // else from if( bMultiRowLayout && bVerticallyDocked && (!m_bPaletteMode) )
  1746. } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  1747. dc.SelectObject( pOldFont );
  1748. if( sizeCalc.cx < sizeDefButton.cx )
  1749. sizeCalc.cx = sizeDefButton.cx;
  1750. if( sizeCalc.cy < sizeDefButton.cy )
  1751. sizeCalc.cy = sizeDefButton.cy;
  1752. bool bFloating = IsFloating();
  1753. if( ! bVerticallyDocked )
  1754. {
  1755. // sizeCalc.cx += m_cxLeftBorder + m_cxRightBorder;
  1756. sizeCalc.cx += nRowDistance/2; // (+ v.2.22)
  1757. // if( (! bFloating )
  1758. // && (GetBarStyle()&CBRS_GRIPPER) != 0
  1759. // )
  1760. // {
  1761. // INT nGripWidth = _GripperWidthAtLeftGet();
  1762. // if( nGripWidth >= 0 )
  1763. // sizeCalc.cx += nGripWidth;
  1764. // }
  1765. }
  1766. else
  1767. {
  1768. // sizeCalc.cx += 1;
  1769. // sizeCalc.cy += m_cyTopBorder + m_cyBottomBorder;
  1770. sizeCalc.cy += nRowDistance; // (+ v.2.22)
  1771. // if( (! bFloating )
  1772. // && (GetBarStyle()&CBRS_GRIPPER) != 0
  1773. // )
  1774. // {
  1775. // INT nGripHeight = _GripperHeightAtTopGet();
  1776. // if( nGripHeight >= 0 )
  1777. // sizeCalc.cy += nGripHeight;
  1778. // }
  1779. }
  1780. if( bFloating ) // (+ v.2.22)
  1781. {
  1782. sizeCalc.cx += 1;
  1783. sizeCalc.cy += 1;
  1784. }
  1785. // if( m_bPaletteMode && m_bPresubclassDialogMode )
  1786. // {
  1787. // CRect rcTest( 0, 0, 1, 1 );
  1788. // CSize _sizeInitial = rcTest.Size();
  1789. // CalcWindowRect( &rcTest );
  1790. // CSize _sizeUpdated = rcTest.Size();
  1791. // ASSERT(
  1792. // _sizeUpdated.cx >= _sizeInitial.cx
  1793. // && _sizeUpdated.cy >= _sizeInitial.cy
  1794. // );
  1795. // sizeCalc += _sizeUpdated - _sizeInitial;
  1796. // sizeCalc.cx += m_cxLeftBorder + m_cxRightBorder;
  1797. // sizeCalc.cy += m_cyTopBorder + m_cyBottomBorder;
  1798. // }
  1799. return sizeCalc;
  1800. }
  1801. void CExtToolControlBar::_SizeToolBar(int nLength, BOOL bVert)
  1802. {
  1803. if( m_bPaletteMode )
  1804. return;
  1805. int nCountOfButtons = _GetButtonsCountImpl();
  1806. if( nCountOfButtons == 0 )
  1807. return;
  1808. bool bMultiRowLayout = OnQueryMultiRowLayout();
  1809. if( !( IsFloating()
  1810. || bMultiRowLayout
  1811. )
  1812. )
  1813. {
  1814. _WrapToolBarH(
  1815. bVert ? 32767 : nLength,
  1816. bVert ? nLength : 32767
  1817. );
  1818. return;
  1819. }
  1820. CSize sizeDefButton = _GetDefButtonSize();
  1821. if( bMultiRowLayout )
  1822. {
  1823. if( bVert )
  1824. {
  1825. int nLengthCurr = nLength - sizeDefButton.cy;
  1826. if( nLengthCurr < sizeDefButton.cy )
  1827. nLengthCurr = sizeDefButton.cy;
  1828. for( ; true;  )
  1829. {
  1830. _WrapToolBarV( nLengthCurr );
  1831. CSize _size = _CalcSize( TRUE );
  1832. if( _size.cy <= nLength )
  1833. break;
  1834. nLengthCurr -= sizeDefButton.cy / 2;
  1835. if( nLengthCurr <= 0 )
  1836. break;
  1837. }
  1838. } // if( bVert )
  1839. else
  1840. _WrapToolBarH( nLength );
  1841. return;
  1842. } // if( bMultiRowLayout )
  1843. INT nMinExtent = sizeDefButton.cx / 2;
  1844. ASSERT( nMinExtent > 0 );
  1845. if( bVert )
  1846. {
  1847. CExtPaintManager::monitor_parms_t _mp;
  1848. CExtPaintManager::stat_GetMonitorParms( _mp, this );
  1849. INT nCalcExtentMax = _mp.m_rcWorkArea.Width() + nMinExtent;
  1850. // NOTES:
  1851. // 1) bug was found by Eugene Pl.
  1852. // 2) there is no reason to make toolbar wider
  1853. //    then nCalcExtentMax value
  1854. // 3) loop is locked when toolbar button icons are higher
  1855. //    then 16px and user drags top/bottom border of a
  1856. //    floating toolbar with 1-row layout (and attempting
  1857. //    to decrease toolbar height)
  1858. CSize _size( 32767, 32767 );
  1859. for( INT nCalcExtent = nMinExtent;
  1860. nLength < _size.cy;
  1861. nCalcExtent += nMinExtent
  1862. )
  1863. {
  1864. _WrapToolBarH( nCalcExtent );
  1865. _size = _CalcSize( FALSE );
  1866. if( nCalcExtent > nCalcExtentMax )
  1867. return;
  1868. }
  1869. _WrapToolBarH( _size.cx );
  1870. return;
  1871. }
  1872. INT nCountOfRowsDesired = _WrapToolBarH( nLength );
  1873. INT nCountOfRowsCurrent = _WrapToolBarH( nMinExtent );
  1874. if( nCountOfRowsCurrent == nCountOfRowsDesired
  1875. || nMinExtent >= nLength
  1876. )
  1877. {
  1878. _WrapToolBarH( _CalcSize(FALSE).cx );
  1879. return;
  1880. }
  1881. while( nMinExtent < nLength )
  1882. {
  1883. INT nCurrentExtent = (nMinExtent + nLength) / 2;
  1884. nCountOfRowsCurrent = _WrapToolBarH( nCurrentExtent );
  1885. if( nCountOfRowsCurrent == nCountOfRowsDesired )
  1886. {
  1887. nLength = nCurrentExtent;
  1888. continue;
  1889. }
  1890. if( nMinExtent == nCurrentExtent )
  1891. {
  1892. _WrapToolBarH( nLength );
  1893. break;
  1894. }
  1895. nMinExtent = nCurrentExtent;
  1896. }
  1897. _WrapToolBarH( _CalcSize(FALSE).cx );
  1898. }
  1899. void CExtToolControlBar::_DraggingUpdateState(
  1900. const CPoint & point,
  1901. bool bForceFloatMode
  1902. )
  1903. {
  1904. CExtControlBar::_DraggingUpdateState( point, bForceFloatMode );
  1905. // if( IsFloating() )
  1906. // return;
  1907. // if( _IsDockSiteCustomizeMode()
  1908. // && (! IsSingleOnRow() )
  1909. // )
  1910. // MakeSingleOnRow();
  1911. }
  1912. int CExtToolControlBar::_WrapToolBarV(
  1913. int nHeight
  1914. )
  1915. {
  1916. ASSERT( !m_bPaletteMode );
  1917. // ASSERT( !IsFloating() );
  1918. CFont * pFont = OnGetToolbarFont( true, true );
  1919. if( pFont->GetSafeHandle() == NULL )
  1920. (&( PmBridge_GetPM()->m_FontNormalVert ));
  1921. CClientDC dc( this );
  1922. CFont * pOldFont = dc.SelectObject( pFont );
  1923. ASSERT( pOldFont != NULL );
  1924. CSize sizeDefButton = _GetDefButtonSize();
  1925. CRect rcClient;
  1926. GetClientRect( &rcClient );
  1927. CPoint ptCurrent( rcClient.right, rcClient.top );
  1928. if( m_pRightBtn != NULL )
  1929. nHeight -=
  1930. m_pRightBtn->CalculateLayout(
  1931. dc, sizeDefButton, FALSE ).cy;
  1932. CExtBarButton::e_wrap_t _evt = GetBtnWrapCode();
  1933. int nCountOfColumns = 1;
  1934. int nCountOfButtons = _GetButtonsCountImpl();
  1935. CExtBarButton * pPrevButton = NULL;
  1936. INT nRowDistance = PmBridge_GetPM()->FixedBar_GetRowDistance( this );
  1937. for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  1938. {
  1939. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  1940. ASSERT_VALID( pTBB );
  1941. pTBB->SetWrap( _evt, false );
  1942. if( nBtnIdx == (nCountOfButtons-1)
  1943. && m_pRightBtn != NULL
  1944. )
  1945. {
  1946. ASSERT_VALID( m_pRightBtn );
  1947. ASSERT( m_pRightBtn == pTBB );
  1948. break;
  1949. }
  1950. if( pTBB->GetStyle() & TBBS_HIDDEN )
  1951. continue;
  1952. if( pTBB->IsSeparator()
  1953. && nBtnIdx < (nCountOfButtons-1)
  1954. )
  1955. {
  1956. CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 );
  1957. ASSERT_VALID( pNextTBB );
  1958. if( pNextTBB->GetStyle() & TBBS_HIDDEN )
  1959. continue;
  1960. }
  1961. CSize sizeTBB =
  1962. pTBB->CalculateLayout(
  1963. dc,
  1964. sizeDefButton,
  1965. FALSE
  1966. );
  1967. if( ptCurrent.y == 0 && pTBB->IsSeparator() )
  1968. sizeTBB = CSize(0, 0);
  1969. if( pPrevButton != NULL
  1970. && ( (ptCurrent.y + sizeTBB.cy) > nHeight )
  1971. && (! pTBB->IsSeparator() )
  1972. )
  1973. {
  1974. ASSERT_VALID( pPrevButton );
  1975. pPrevButton->SetWrap( _evt );
  1976. ptCurrent.x -=
  1977. sizeTBB.cx
  1978. + nRowDistance;
  1979. ptCurrent.y = 0;
  1980. nCountOfColumns++;
  1981. }
  1982. ptCurrent.y += sizeTBB.cy;
  1983. pPrevButton = pTBB;
  1984. } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  1985. dc.SelectObject( pOldFont );
  1986. return nCountOfColumns;
  1987. }
  1988. int CExtToolControlBar::_WrapToolBarH(int nWidth, int nHeight /*= 32767*/)
  1989. {
  1990. bool bVerticallyDocked =
  1991. ((m_dwStyle & CBRS_ORIENT_HORZ) == 0)
  1992. ? true : false;
  1993. bool bFloatLikeMode =
  1994. ( IsFloating()
  1995. || nHeight == 32767 // (+ v.2.22)
  1996. || OnQueryMultiRowLayout()
  1997. ) ? true : false;
  1998. CFont * pFont =
  1999. OnGetToolbarFont(
  2000. ( bVerticallyDocked && (!m_bPaletteMode) )
  2001. ? true : false,
  2002. true
  2003. );
  2004. if( pFont->GetSafeHandle() == NULL )
  2005. pFont = ( bVerticallyDocked && (!m_bPaletteMode) )
  2006. ? (&( PmBridge_GetPM()->m_FontNormalVert ))
  2007. : (&( PmBridge_GetPM()->m_FontNormal ))
  2008. ;
  2009. CClientDC dc( this );
  2010. CFont * pOldFont = dc.SelectObject( pFont );
  2011. ASSERT( pOldFont != NULL );
  2012. CSize sizeDefButton = _GetDefButtonSize();
  2013. CRect rcClient;
  2014. GetClientRect( &rcClient );
  2015. CPoint ptCurrent( 0, rcClient.top );
  2016. if( (!bFloatLikeMode)
  2017. && (!bVerticallyDocked)
  2018. && m_pRightBtn != NULL
  2019. && (!m_bPaletteMode)
  2020. )
  2021. nWidth -=
  2022. m_pRightBtn->CalculateLayout(
  2023. dc, sizeDefButton, TRUE ).cx;
  2024. CExtBarButton::e_wrap_t _evt = GetBtnWrapCode();
  2025. int nCountOfRows = 1;
  2026. int nCountOfButtons = _GetButtonsCountImpl();
  2027. CExtBarButton * pPrevButton = NULL;
  2028. INT nRowDistance = PmBridge_GetPM()->FixedBar_GetRowDistance( this );
  2029. for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2030. {
  2031. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  2032. ASSERT_VALID( pTBB );
  2033. if( ! m_bPaletteMode )
  2034. {
  2035. pTBB->SetWrap( _evt, false );
  2036. }
  2037. if( nBtnIdx == (nCountOfButtons-1)
  2038. && m_pRightBtn != NULL
  2039. )
  2040. {
  2041. ASSERT_VALID( m_pRightBtn );
  2042. ASSERT( m_pRightBtn == pTBB );
  2043. break;
  2044. }
  2045. if( pTBB->GetStyle() & TBBS_HIDDEN )
  2046. continue;
  2047. if( pTBB->IsSeparator()
  2048. && nBtnIdx < (nCountOfButtons-1)
  2049. )
  2050. {
  2051. CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 );
  2052. ASSERT_VALID( pNextTBB );
  2053. if( pNextTBB->GetStyle() & TBBS_HIDDEN )
  2054. continue;
  2055. }
  2056. CSize sizeTBB =
  2057. pTBB->CalculateLayout(
  2058. dc,
  2059. sizeDefButton,
  2060. (!bVerticallyDocked)
  2061. || m_bPaletteMode
  2062. );
  2063. if( ptCurrent.x == 0 && pTBB->IsSeparator() )
  2064. sizeTBB = CSize(0, 0);
  2065. if( ( m_bPaletteMode
  2066. && pPrevButton != NULL
  2067. && pPrevButton->IsWrap( _evt )
  2068. )
  2069. || ( (! m_bPaletteMode)
  2070. && bFloatLikeMode
  2071. && pPrevButton != NULL
  2072. && (bFloatLikeMode || ptCurrent.y + sizeTBB.cy < nHeight)
  2073. && ptCurrent.x + sizeTBB.cx > nWidth
  2074. && (! pTBB->IsSeparator())
  2075. )
  2076. )
  2077. {
  2078. ASSERT_VALID( pPrevButton );
  2079. if( ! m_bPaletteMode )
  2080. pPrevButton->SetWrap( _evt );
  2081. ptCurrent.x = 0;
  2082. ptCurrent.y +=
  2083. sizeTBB.cy
  2084. + nRowDistance;
  2085. nCountOfRows++;
  2086. }
  2087. ptCurrent.x += sizeTBB.cx;
  2088. pPrevButton = pTBB;
  2089. } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2090. dc.SelectObject( pOldFont );
  2091. return nCountOfRows;
  2092. }
  2093. CSize CExtToolControlBar::_CalcDesiredMinOuterSize( BOOL bHorz ) const
  2094. {
  2095. ASSERT_VALID( this );
  2096. if( m_bPaletteMode )
  2097. return
  2098. ( const_cast < CExtToolControlBar * > ( this ) )
  2099. -> CalcFixedLayout( FALSE, bHorz );
  2100. CSize sizeDefButton = _GetDefButtonSize();
  2101. CSize _size( 0, 0 );
  2102. if( m_pRightBtn != NULL ) 
  2103. {
  2104. CFont * pFont =
  2105. ( const_cast < CExtToolControlBar * > ( this ) )
  2106. -> OnGetToolbarFont(
  2107. ( (!bHorz) && (!m_bPaletteMode) )
  2108. ? true : false,
  2109. true
  2110. );
  2111. if( pFont->GetSafeHandle() == NULL )
  2112. pFont = ( (!bHorz) && (!m_bPaletteMode) )
  2113. ? (&( PmBridge_GetPM()->m_FontNormalVert ))
  2114. : (&( PmBridge_GetPM()->m_FontNormal ))
  2115. ;
  2116. CClientDC dc( ( const_cast < CExtToolControlBar * > ( this ) ) );
  2117. CFont * pOldFont = dc.SelectObject( pFont );
  2118. CSize sizeTBBRight =
  2119. m_pRightBtn->CalculateLayout(
  2120. dc,
  2121. sizeDefButton,
  2122. bHorz //|| m_bPaletteMode
  2123. );
  2124. _size += sizeTBBRight;
  2125. dc.SelectObject( pOldFont );
  2126. }
  2127. // if( IsFloating() )
  2128. // return _size;
  2129. int nCountOfButtons = GetButtonsCount();
  2130. if( nCountOfButtons > 0 )
  2131. {
  2132. CSize _sizeAdjust( 0, 0 );
  2133. CClientDC dc( ( const_cast < CExtToolControlBar * > ( this ) ) );
  2134. CFont * pFont =
  2135. ( const_cast < CExtToolControlBar * > ( this ) )
  2136. -> OnGetToolbarFont(
  2137. ( (!bHorz) && (!m_bPaletteMode) )
  2138. ? true : false,
  2139. true
  2140. );
  2141. if( pFont->GetSafeHandle() == NULL )
  2142. pFont = ( (!bHorz) && (!m_bPaletteMode) )
  2143. ? (&( PmBridge_GetPM()->m_FontNormalVert ))
  2144. : (&( PmBridge_GetPM()->m_FontNormal ))
  2145. ;
  2146. CFont * pOldFont = dc.SelectObject( pFont );
  2147. for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2148. {
  2149. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  2150. ASSERT_VALID( pTBB );
  2151. if( pTBB->IsSeparator() )
  2152. continue;
  2153. if( pTBB->GetStyle() & TBBS_HIDDEN )
  2154. continue;
  2155. if( nBtnIdx == (nCountOfButtons-1)
  2156. && m_pRightBtn != NULL
  2157. )
  2158. {
  2159. ASSERT_VALID( m_pRightBtn );
  2160. ASSERT( m_pRightBtn == pTBB );
  2161. break;
  2162. }
  2163. CSize sizeTBB(
  2164. pTBB->CalculateLayout(
  2165. dc,
  2166. sizeDefButton,
  2167. bHorz
  2168. )
  2169. );
  2170. if( bHorz )
  2171. {
  2172. if( _sizeAdjust.cx > 0 )
  2173. _sizeAdjust.cx = min( _sizeAdjust.cx, sizeTBB.cx );
  2174. else
  2175. _sizeAdjust = sizeTBB;
  2176. }
  2177. else
  2178. {
  2179. if( _sizeAdjust.cy > 0 )
  2180. _sizeAdjust.cy = min( _sizeAdjust.cy, sizeTBB.cy );
  2181. else
  2182. _sizeAdjust = sizeTBB;
  2183. }
  2184. } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2185. if( bHorz )
  2186. {
  2187. if( _sizeAdjust.cx > 0 )
  2188. _size.cx += _sizeAdjust.cx;
  2189. }
  2190. else
  2191. {
  2192. if( _sizeAdjust.cy > 0 )
  2193. _size.cy += _sizeAdjust.cy;
  2194. }
  2195. dc.SelectObject( pOldFont );
  2196. } // if( nCountOfButtons > 0 )
  2197. CRect rcClient, rcWindow;
  2198. GetClientRect( &rcClient );
  2199. GetWindowRect( &rcWindow );
  2200. if( bHorz )
  2201. _size.cx += rcWindow.Width() - rcClient.Width();
  2202. else
  2203. _size.cy += rcWindow.Height() - rcClient.Height();
  2204. return _size;
  2205. }
  2206. bool CExtToolControlBar::_GetFullRowMode() const
  2207. {
  2208. if( m_bHelperTempFullRowMode )
  2209. return true;
  2210. return CExtControlBar::_GetFullRowMode();
  2211. }
  2212. bool CExtToolControlBar::OnQueryMultiRowLayout() const
  2213. {
  2214. ASSERT_VALID( this );
  2215. if( m_bPresubclassDialogMode
  2216. || m_pDockSite == NULL
  2217. || m_bPaletteMode
  2218. )
  2219. return false;
  2220. if( IsFloating() )
  2221. return false;
  2222. if( ! _IsDockSiteCustomizeMode() )
  2223. return false;
  2224. return true;
  2225. }
  2226. CExtControlBar::InternalAffixmentData *
  2227. CExtToolControlBar::_AffixmentGetOuter()
  2228. {
  2229. ASSERT_VALID( this );
  2230. return &m_AffixmentData;
  2231. }
  2232. void CExtToolControlBar::_AffixmentSetOuter(
  2233. CExtControlBar::InternalAffixmentData * pAffixmentData
  2234. )
  2235. {
  2236. ASSERT_VALID( this );
  2237. ASSERT( pAffixmentData != NULL );
  2238. m_AffixmentData = *pAffixmentData;
  2239. }
  2240. bool CExtToolControlBar::_AffixmentIsAlignedHW() const
  2241. {
  2242. ASSERT_VALID( this );
  2243. if( m_bPaletteMode )
  2244. return false;
  2245. return true;
  2246. }
  2247. LRESULT CExtToolControlBar::_ContinueHelpHitTestMode(
  2248. CExtToolControlBar * pBar
  2249. )
  2250. {
  2251. ASSERT_VALID( pBar );
  2252. ASSERT( pBar->GetSafeHwnd() != NULL && ::IsWindow(pBar->GetSafeHwnd()) );
  2253. CFrameWnd * pDockSiteOrOther = pBar->m_pDockSite;
  2254. if( pDockSiteOrOther == NULL
  2255. || (! pDockSiteOrOther->m_bHelpMode )
  2256. )
  2257. {
  2258. pDockSiteOrOther = pBar->GetParentFrame();
  2259. if( pDockSiteOrOther != NULL
  2260. && pDockSiteOrOther->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) )
  2261. )
  2262. pDockSiteOrOther = pDockSiteOrOther->GetParentFrame();
  2263. if( pDockSiteOrOther == NULL
  2264. || (! pDockSiteOrOther->m_bHelpMode )
  2265. )
  2266. return -3L;
  2267. }
  2268. static bool g_bContinuedMode = false;
  2269. if( g_bContinuedMode )
  2270. return -3L;
  2271. HWND hWndDockSite = pDockSiteOrOther->m_hWnd;
  2272. HWND hWndBar = pBar->m_hWnd;
  2273. MSG msg;
  2274. g_bContinuedMode = true;
  2275. LRESULT lResult = -3L;
  2276. for( ; true; )
  2277. {
  2278. if( !PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  2279. {
  2280. if(!( ::IsWindow( hWndDockSite )
  2281. && ::IsWindow( hWndBar )
  2282. && pDockSiteOrOther->m_bHelpMode
  2283. ))
  2284. break;
  2285. ::WaitMessage();
  2286. continue;
  2287. } // if( !PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  2288. if( msg.hwnd != NULL )
  2289. {
  2290. if( msg.message == WM_LBUTTONDOWN )
  2291. {
  2292. CWnd * pWndPerm = CWnd::FromHandlePermanent(msg.hwnd);
  2293. if( pWndPerm != NULL )
  2294. {
  2295. CExtControlBar * pTestBar =
  2296. DYNAMIC_DOWNCAST( CExtControlBar, pWndPerm );
  2297. if( pTestBar != NULL )
  2298. {
  2299. lResult = pTestBar->DoHelpHitTest( CPoint(msg.lParam) );
  2300. if( lResult > 0 )
  2301. {
  2302. PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
  2303. break;
  2304. }
  2305. lResult = -3L;
  2306. } // if( pTestBar != NULL )
  2307. } // if( pWndPerm != NULL )
  2308. } // if( msg.message == WM_LBUTTONDOWN )
  2309. else if( msg.message == WM_MOUSEMOVE )
  2310. {
  2311. CWnd * pWndPerm = CWnd::FromHandlePermanent(msg.hwnd);
  2312. if( pWndPerm != NULL )
  2313. {
  2314. CExtControlBar * pTestBar =
  2315. DYNAMIC_DOWNCAST( CExtControlBar, pWndPerm );
  2316. if( pTestBar != NULL )
  2317. {
  2318. CPoint pt( (DWORD)msg.lParam );
  2319. if( pTestBar->_OnMouseMoveMsg((UINT)msg.wParam,pt) )
  2320. {
  2321. PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
  2322. continue;
  2323. } // if( pTestBar->_OnMouseMoveMsg((UINT)msg.wParam,pt) )
  2324. } // if( pTestBar != NULL )
  2325. } // if( pWndPerm != NULL )
  2326. } // else if( msg.message == WM_MOUSEMOVE )
  2327. else if( msg.message == WM_COMMAND )
  2328. {
  2329. if( ((HIWORD(msg.wParam))==0) || ((HIWORD(msg.wParam))==1) )
  2330. {
  2331. lResult = (LRESULT)( LOWORD(msg.wParam) );
  2332. PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
  2333. break;
  2334. } // if( ((HIWORD(msg.wParam))==0) || ((HIWORD(msg.wParam))==1) )
  2335. } // else if( msg.message == WM_COMMAND )
  2336. else if( msg.message == WM_SYSCOMMAND )
  2337. {
  2338. switch( msg.wParam )
  2339. {
  2340. case SC_SIZE:
  2341. case SC_MOVE:
  2342. case SC_MINIMIZE:
  2343. case SC_MAXIMIZE:
  2344. case SC_NEXTWINDOW:
  2345. case SC_PREVWINDOW:
  2346. case SC_CLOSE:
  2347. case SC_RESTORE:
  2348. case SC_TASKLIST:
  2349. lResult =
  2350. HID_BASE_COMMAND +
  2351. ID_COMMAND_FROM_SC( msg.wParam );
  2352. PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
  2353. break;
  2354. default:
  2355. lResult = (LRESULT)( msg.wParam );
  2356. PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
  2357. break;
  2358. }
  2359. break;
  2360. } // else if( msg.message == WM_SYSCOMMAND )
  2361. } // if( msg.hwnd != NULL )
  2362. if( !AfxGetThread()->PumpMessage() )
  2363. break;
  2364. } // for( LRESULT lResult = -3L; true; )
  2365. g_bContinuedMode = false;
  2366. return lResult;
  2367. }
  2368. void CExtToolControlBar::GetButtonInfo(int nIndex, UINT& nID, UINT& nStyle) const
  2369. {
  2370. ASSERT_VALID(this);
  2371. CExtBarButton * pTBB =
  2372. _GetButtonPtr(nIndex);
  2373. if( pTBB == NULL )
  2374. {
  2375. ASSERT( FALSE );
  2376. nID = 0;
  2377. nStyle = 0;
  2378. return;
  2379. }
  2380. ASSERT_VALID( pTBB );
  2381. nID = pTBB->GetCmdID(false);
  2382. nStyle = pTBB->GetStyle();
  2383. }
  2384. void CExtToolControlBar::SetButtonInfo(int nIndex, UINT nID, UINT nStyle)
  2385. {
  2386. ASSERT_VALID(this);
  2387. CExtBarButton * pTBB =
  2388. _GetButtonPtr(nIndex);
  2389. if( pTBB == NULL )
  2390. {
  2391. ASSERT( FALSE );
  2392. return;
  2393. }
  2394. ASSERT_VALID( pTBB );
  2395. pTBB->SetCmdID( nID );
  2396. pTBB->SetStyle( nStyle );
  2397. _InvalidateButton( nIndex );
  2398. //UpdateWindow();
  2399. }
  2400. CFont * CExtToolControlBar::OnGetToolbarFont(
  2401. bool bVert,
  2402. bool bMeasureFont
  2403. )
  2404. {
  2405. ASSERT_VALID(this);
  2406. if( ! bMeasureFont )
  2407. return NULL;
  2408. HFONT hFont = PmBridge_GetPM()->Toolbar_GetFont( ! bVert, this );
  2409. if( hFont != NULL )
  2410. return CFont::FromHandle( hFont );
  2411. ASSERT( PmBridge_GetPM()->m_FontNormal.GetSafeHandle() != NULL );
  2412. ASSERT( PmBridge_GetPM()->m_FontNormalVert.GetSafeHandle() != NULL );
  2413. return ( bVert )
  2414. ? ( & PmBridge_GetPM()->m_FontNormalVert )
  2415. : ( & PmBridge_GetPM()->m_FontNormal )
  2416. ;
  2417. }
  2418. bool CExtToolControlBar::_DoFtLayoutQuery(
  2419. FtLayoutQuery * pFtLayoutQuery,
  2420. CDC * pToolBarOutputDC
  2421. ) const
  2422. {
  2423. ASSERT_VALID( this );
  2424. ASSERT( pFtLayoutQuery != NULL || pToolBarOutputDC != NULL );
  2425. bool bPaintRowBkMode = PmBridge_GetPM()->FixedBar_IsPaintRowBkMode( this );
  2426. if( ! bPaintRowBkMode )
  2427. return false;
  2428. #ifdef _DEBUG
  2429. if( pFtLayoutQuery != NULL )
  2430. {
  2431. ASSERT( pFtLayoutQuery->m_pToolBar == this );
  2432. ASSERT_VALID( pFtLayoutQuery->m_pMiniFrame );
  2433. ASSERT( pFtLayoutQuery->m_arrRowBtnIndices.GetSize() == 0 );
  2434. ASSERT( pFtLayoutQuery->m_arrRowRects.GetSize() == 0 );
  2435. } // if( pFtLayoutQuery != NULL )
  2436. if( pToolBarOutputDC != NULL )
  2437. {
  2438. ASSERT_VALID( pToolBarOutputDC );
  2439. ASSERT( pToolBarOutputDC->GetSafeHdc() != NULL );
  2440. } // if( pToolBarOutputDC != NULL )
  2441. #endif // _DEBUG
  2442. CExtBarButton::e_wrap_t _evt = GetBtnWrapCode();
  2443. int nCountOfButtons = _GetButtonsCountImpl();
  2444. CRect rcClient;
  2445. GetClientRect( &rcClient );
  2446. CRect rcRowBk( rcClient );
  2447. rcRowBk.bottom = rcRowBk.top;
  2448. int nBtnIdx = 0;
  2449. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2450. {
  2451. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  2452. ASSERT_VALID( pTBB );
  2453. if( (! pTBB->IsVisible() )
  2454. || (pTBB->GetStyle() & TBBS_HIDDEN) != 0
  2455. )
  2456. continue;
  2457. if( pTBB->IsSeparator()
  2458. && nBtnIdx < (nCountOfButtons-1)
  2459. )
  2460. {
  2461. CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 );
  2462. ASSERT_VALID( pNextTBB );
  2463. if( pNextTBB->GetStyle() & TBBS_HIDDEN )
  2464. continue;
  2465. }
  2466. if( !pTBB->IsSeparator() )
  2467. {
  2468. CRect rcTBB = *pTBB;
  2469. rcRowBk.top = min( rcRowBk.top, rcTBB.top );
  2470. rcRowBk.bottom = max( rcRowBk.bottom, rcTBB.bottom );
  2471. }
  2472. if( pTBB->IsWrap(_evt) && ( m_dwStyle & CBRS_ORIENT_HORZ ) )
  2473. {
  2474. if( ! rcRowBk.IsRectEmpty() )
  2475. {
  2476. if( pFtLayoutQuery != NULL )
  2477. {
  2478. pFtLayoutQuery->m_arrRowBtnIndices.Add( nBtnIdx );
  2479. pFtLayoutQuery->m_arrRowRects.Add( rcRowBk );
  2480. } // pFtLayoutQuery
  2481. if( pToolBarOutputDC != NULL )
  2482. {
  2483. PmBridge_GetPM()->PaintFloatToolbarRowBk(
  2484. *pToolBarOutputDC,
  2485. this,
  2486. nBtnIdx,
  2487. rcRowBk
  2488. );
  2489. } // if( pToolBarOutputDC != NULL )
  2490. } // if( ! rcRowBk.IsRectEmpty() )
  2491. rcRowBk.top = rcRowBk.bottom + 1;
  2492. }
  2493. } // for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2494. if( ! rcRowBk.IsRectEmpty() )
  2495. {
  2496. if( pFtLayoutQuery != NULL )
  2497. {
  2498. pFtLayoutQuery->m_arrRowBtnIndices.Add( nBtnIdx );
  2499. pFtLayoutQuery->m_arrRowRects.Add( rcRowBk );
  2500. } // pFtLayoutQuery
  2501. if( pToolBarOutputDC != NULL )
  2502. {
  2503. PmBridge_GetPM()->PaintFloatToolbarRowBk(
  2504. *pToolBarOutputDC,
  2505. this,
  2506. nBtnIdx,
  2507. rcRowBk
  2508. );
  2509. } // if( pToolBarOutputDC != NULL )
  2510. } // if( ! rcRowBk.IsRectEmpty() )
  2511. return true;
  2512. }
  2513. void CExtToolControlBar::DoPaint( CDC * pDC )
  2514. {
  2515. __PROF_UIS_MANAGE_STATE;
  2516. ASSERT_VALID(this);
  2517. ASSERT_VALID(pDC);
  2518. CExtPaintManager::stat_ExcludeChildAreas(
  2519. *pDC,
  2520. *this
  2521. );
  2522. CRect rcClient;
  2523. GetClientRect( &rcClient );
  2524. CExtMemoryDC dc( pDC, &rcClient );
  2525. //CExtMemoryDC dc( pDC );
  2526. ASSERT( dc.GetSafeHdc() != NULL );
  2527. if( dc.GetSafeHdc() != NULL )
  2528. pDC = &dc;
  2529. DoEraseBk( pDC );
  2530. pDC->SetTextColor(
  2531. PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_TEXT_OUT, this )
  2532. );
  2533. pDC->SetBkMode( TRANSPARENT );
  2534. CFont * pFont =
  2535. OnGetToolbarFont(
  2536. ( ( ( m_dwStyle & CBRS_ORIENT_HORZ ) == 0 ) && (!m_bPaletteMode) )
  2537. ? true : false,
  2538. false
  2539. );
  2540. if( pFont->GetSafeHandle() == NULL )
  2541. pFont = ( ( ( m_dwStyle & CBRS_ORIENT_HORZ ) == 0 ) && (!m_bPaletteMode) )
  2542. ? (&( PmBridge_GetPM()->m_FontNormalVert ))
  2543. : (&( PmBridge_GetPM()->m_FontNormal ))
  2544. ;
  2545. CFont * pOldFont =
  2546. pDC->SelectObject( pFont );
  2547. //ASSERT( pOldFont != NULL );
  2548. int nCountOfButtons = _GetButtonsCountImpl();
  2549. bool bMultiRowLayout = OnQueryMultiRowLayout();
  2550. CExtBarButton::e_wrap_t _evt = GetBtnWrapCode();
  2551. INT nRowDistance = PmBridge_GetPM()->FixedBar_GetRowDistance( this );
  2552.  // pre-fill row backgrounds
  2553. _DoFtLayoutQuery( NULL, pDC );
  2554. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2555. CExtBarButton * pCustomizeActiveTBB = NULL;
  2556. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2557. for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2558. {
  2559. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  2560. ASSERT_VALID( pTBB );
  2561. if( (! pTBB->IsVisible() )
  2562. || (pTBB->GetStyle() & TBBS_HIDDEN) != 0
  2563. )
  2564. continue;
  2565. if( pTBB->IsSeparator()
  2566. && nBtnIdx < (nCountOfButtons-1)
  2567. )
  2568. {
  2569. CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 );
  2570. ASSERT_VALID( pNextTBB );
  2571. if( pNextTBB->GetStyle() & TBBS_HIDDEN )
  2572. continue;
  2573. }
  2574. CRect rcTBB = *pTBB;
  2575. if( !pDC->RectVisible( &rcTBB ) )
  2576. continue;
  2577. if( !pTBB->IsSeparator() )
  2578. {
  2579. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2580. if( GetCustomizeSite() != NULL
  2581. && pTBB->IsCustomizeActiveItem()
  2582. )
  2583. {
  2584. ASSERT( pCustomizeActiveTBB == NULL );
  2585. pCustomizeActiveTBB = pTBB;
  2586. } // if( GetCustomizeSite() != NULL ...
  2587. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2588. pTBB->Paint( *pDC );
  2589. continue;
  2590. } // if( !pTBB->IsSeparator() )
  2591. bool bSeparatorHorz =
  2592. ( ( m_dwStyle & CBRS_ORIENT_HORZ ) != 0
  2593. || m_bPaletteMode
  2594. )
  2595. ? true : false;
  2596. bool bSeparatorRotate = false;
  2597. CRect rectSeparator( rcTBB );
  2598. if( (!bSeparatorHorz) && (!bMultiRowLayout) )
  2599. {
  2600. bSeparatorHorz = true;
  2601. rcTBB.OffsetRect( 0, -rcTBB.Height() );
  2602. }
  2603. if( pTBB->IsWrap(_evt) )
  2604. {
  2605. if( bSeparatorHorz )
  2606. {
  2607. rectSeparator.left = rcClient.left;
  2608. rectSeparator.right = rcClient.right;
  2609. rectSeparator.top = rcTBB.bottom;
  2610. rectSeparator.bottom =
  2611. rectSeparator.top
  2612. + nRowDistance;
  2613. bSeparatorRotate = true;
  2614. } // if( bSeparatorHorz )
  2615. else
  2616. {
  2617. rectSeparator.top = rcClient.top;
  2618. rectSeparator.bottom = rcClient.bottom;
  2619. rectSeparator.left =
  2620. rcTBB.left
  2621. - nRowDistance;
  2622. rectSeparator.right =
  2623. rectSeparator.left
  2624. + nRowDistance;
  2625. bSeparatorRotate = true;
  2626. } // else from if( bSeparatorHorz )
  2627. } // if( pTBB->IsWrap(_evt) )
  2628. if( nRowDistance == 0 && bSeparatorRotate )
  2629. continue;
  2630. if( bSeparatorRotate )
  2631. bSeparatorHorz = !bSeparatorHorz;
  2632. rectSeparator.DeflateRect(
  2633. bSeparatorHorz ? 0 : 2,
  2634. bSeparatorHorz ? 2 : 0
  2635. );
  2636. if( bMultiRowLayout
  2637. && m_pRightBtn != NULL
  2638. && m_pRightBtn->IsVisible()
  2639. && bSeparatorRotate
  2640. )
  2641. {
  2642. CRect rcRightBtn = *m_pRightBtn;
  2643. if( bSeparatorHorz )
  2644. {
  2645. if( ( m_dwStyle & CBRS_ORIENT_HORZ ) == 0 )
  2646. {
  2647. if( rectSeparator.bottom > (rcRightBtn.top-__EXT_TB_BUTTON_OUTER_MARGIN) )
  2648. rectSeparator.bottom = (rcRightBtn.top-__EXT_TB_BUTTON_OUTER_MARGIN);
  2649. }
  2650. } // if( bSeparatorHorz )
  2651. else
  2652. {
  2653. if( ( m_dwStyle & CBRS_ORIENT_HORZ ) != 0 )
  2654. {
  2655. if( rectSeparator.right > (rcRightBtn.left-__EXT_TB_BUTTON_OUTER_MARGIN) )
  2656. rectSeparator.right = (rcRightBtn.left-__EXT_TB_BUTTON_OUTER_MARGIN);
  2657. }
  2658. } // else from if( bSeparatorHorz )
  2659. }
  2660. PmBridge_GetPM()->PaintSeparator(
  2661. *pDC,
  2662. rectSeparator,
  2663. bSeparatorHorz,
  2664. true,
  2665. this
  2666. );
  2667. // DEBUG SEPARATOR AREA PAINTING:
  2668. // pDC->FillSolidRect( &rectSeparator, RGB(0,255,0) );
  2669. } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2670. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2671. if( m_pDragTargetTBB != NULL && (abs(m_nDragTargetShift)) == 1 )
  2672. {
  2673. ASSERT_VALID( m_pDragTargetTBB );
  2674. CRect rcItem = *m_pDragTargetTBB;
  2675. PmBridge_GetPM()->PaintDropDivider(
  2676. *pDC,
  2677. rcItem,
  2678. (m_nDragTargetShift < 0) ? true : false,
  2679. ( ( m_dwStyle & CBRS_ORIENT_HORZ ) != 0 ) ? true : false
  2680. );
  2681. } // if( m_pDragTargetTBB != NULL && (abs(m_nDragTargetShift)) == 1 )
  2682. if( m_pDragSourceTBB != NULL
  2683. || pCustomizeActiveTBB != NULL
  2684. )
  2685. {
  2686. CRect rcItem =
  2687. (pCustomizeActiveTBB != NULL)
  2688. ? (*pCustomizeActiveTBB)
  2689. : (*m_pDragSourceTBB)
  2690. ;
  2691. PmBridge_GetPM()->PaintDragSourceRect(
  2692. *pDC,
  2693. rcItem
  2694. );
  2695. } // if( m_pDragSourceTBB != NULL ...
  2696. CExtCustomizeSite * pSite = GetCustomizeSite();
  2697. if( pSite != NULL )
  2698. {
  2699. CExtCustomizeCmdTreeNode * pPopupDropTargetNode =
  2700. pSite->GetPopupDropTargetNode();
  2701. if( pPopupDropTargetNode != NULL )
  2702. {
  2703. ASSERT_VALID( pPopupDropTargetNode );
  2704. for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2705. {
  2706. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  2707. ASSERT_VALID( pTBB );
  2708. if( (! pTBB->IsVisible() )
  2709. || (pTBB->GetStyle() & TBBS_HIDDEN) != 0
  2710. )
  2711. continue;
  2712. if( pTBB->IsSeparator() )
  2713. continue;
  2714. CRect rcTBB = *pTBB;
  2715. if( !pDC->RectVisible( &rcTBB ) )
  2716. continue;
  2717. CExtCustomizeCmdTreeNode * pNode =
  2718. pTBB->GetCmdNode();
  2719. if( ((LPVOID)pNode) != ((LPVOID)pPopupDropTargetNode) )
  2720. continue;
  2721. PmBridge_GetPM()->PaintDragSourceRect(
  2722. *pDC,
  2723. rcTBB
  2724. );
  2725. break;
  2726. } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2727. } // if( pPopupDropTargetNode != NULL )
  2728. } // if( pSite != NULL )
  2729. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2730. pDC->SelectObject( pOldFont );
  2731. PmBridge_GetPM()->OnPaintSessionComplete( this );
  2732. }
  2733. void CExtToolControlBar::_InvalidateButton( int nIndex )
  2734. {
  2735. CExtBarButton * pTBB = _GetButtonPtr( nIndex );
  2736. if( pTBB == NULL )
  2737. return;
  2738. ASSERT_VALID( pTBB );
  2739. CRect rect = pTBB->Rect();
  2740. if( rect.IsRectEmpty() )
  2741. return;
  2742. if( pTBB->OnInvalidateButton() )
  2743. return;
  2744. if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton))
  2745. && PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  2746. )
  2747. {
  2748. const CSize _sizeRoundedAreaMerics = PmBridge_GetPM()->FixedBar_GetRoundedAreaMerics();
  2749. rect.InflateRect( _sizeRoundedAreaMerics.cx + 1, _sizeRoundedAreaMerics.cy + 1 );
  2750. }
  2751. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2752. if( pTBB == m_pDragSourceTBB
  2753. || pTBB == m_pDragTargetTBB
  2754. )
  2755. {
  2756. CSize _sizeDDM = PmBridge_GetPM()->GetDropDividerMerics();
  2757. rect.InflateRect( _sizeDDM );
  2758. rect.InflateRect( 1, 1 );
  2759. } // if( pTBB == m_pDragSourceTBB )
  2760. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2761. rect.InflateRect( 1, 1 );
  2762. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  2763. if( m_pDockBar == NULL
  2764. && IsKindOf( RUNTIME_CLASS(CExtRibbonBar) )
  2765. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl != NULL
  2766. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  2767. )
  2768. {
  2769. CWnd * pWndParent = GetParent();
  2770. if( pWndParent != NULL )
  2771. {
  2772. CRect _rectTest = rect;
  2773. ClientToScreen( &_rectTest );
  2774. pWndParent->ScreenToClient( &_rectTest );
  2775. if( _rectTest.bottom <= 0
  2776. || ( _rectTest.top <= 0
  2777. && pTBB->IsKindOf( RUNTIME_CLASS(CExtRibbonButtonFile) )
  2778. )
  2779. )
  2780. pWndParent->SendMessage( WM_NCPAINT );
  2781. } // if( pWndParent != NULL )
  2782. } // if( m_pDockBar == NULL ...
  2783. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  2784. InvalidateRect( &rect );
  2785. }
  2786. bool CExtToolControlBar::OnDeliverCmd( CExtBarButton * pTBB )
  2787. {
  2788. ASSERT_VALID( this );
  2789. ASSERT_VALID( pTBB );
  2790. pTBB;
  2791. return false;
  2792. }
  2793. void CExtToolControlBar::AnimationSite_OnProgressShutdownTimer( UINT nTimerID )
  2794. {
  2795. ASSERT_VALID( this);
  2796. HWND hWndOwn = GetSafeHwnd();
  2797. CExtControlBar::AnimationSite_OnProgressShutdownTimer( nTimerID );
  2798. if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
  2799. _UpdateHoverButton( CPoint(-1,-1), false );
  2800. }
  2801. __EXT_MFC_INT_PTR CExtToolControlBar::OnToolHitTest(
  2802. CPoint point,
  2803. TOOLINFO * pTI
  2804. ) const
  2805. {
  2806. ASSERT_VALID( this );
  2807. if( (! IsDisplayScreenTips() )
  2808. || CExtToolControlBar::g_bMenuTracking
  2809. || CExtPopupMenuWnd::IsMenuTracking()
  2810. || OnAdvancedPopupMenuTipWndGet() != NULL
  2811. || m_bSuspendTips
  2812. )
  2813. return -1;
  2814. __EXT_MFC_INT_PTR nToolTipHit = (__EXT_MFC_INT_PTR)
  2815. ((CExtToolControlBar*)this)->
  2816. HitTest(point);
  2817. if( nToolTipHit >= 0 )
  2818. {
  2819. CExtBarButton * pTBB =
  2820. _GetButtonPtr( (int)nToolTipHit );
  2821. ASSERT_VALID( pTBB );
  2822. if( pTBB != NULL )
  2823. {
  2824. nToolTipHit = pTBB->OnToolHitTest( point, pTI );
  2825. if( nToolTipHit != -1 )
  2826. return nToolTipHit;
  2827. }
  2828. } // if( nToolTipHit >= 0 )
  2829. nToolTipHit =
  2830. CExtControlBar::OnToolHitTest(
  2831. point,
  2832. pTI
  2833. );
  2834. return nToolTipHit;
  2835. }
  2836. bool CExtToolControlBar::OnQueryHoverBasedMenuTracking(
  2837. const CExtBarButton * pTBB
  2838. ) const
  2839. {
  2840. ASSERT_VALID( this );
  2841. ASSERT_VALID( pTBB );
  2842. pTBB;
  2843. return true;
  2844. }
  2845. int CExtToolControlBar::_HitTestImpl(
  2846. CPoint point,
  2847. UINT nButtonStyleInclude, // = 0, // button must have style
  2848. UINT nButtonStyleExclude, // = 0  // button must have not style
  2849. bool bAllowFindNearest // = false // if did not hit - find nearest
  2850. ) const
  2851. {
  2852. ASSERT_VALID( this );
  2853. if( m_hWnd == NULL || (! ::IsWindow(m_hWnd) )  )
  2854. return -1; // nowhere
  2855. if( (!bAllowFindNearest) && ::GetCapture() == m_hWnd )
  2856. {
  2857. CPoint ptScreen( point );
  2858. ClientToScreen( &ptScreen );
  2859. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  2860. if( hWndFromPoint != m_hWnd )
  2861. {
  2862. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  2863. if( m_pDockBar == NULL
  2864. && IsKindOf( RUNTIME_CLASS(CExtRibbonBar) )
  2865. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl != NULL
  2866. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  2867. && hWndFromPoint == ::GetParent( m_hWnd )
  2868. )
  2869. {
  2870. }
  2871. else
  2872. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  2873. return -1; // nowhere
  2874. }
  2875. }
  2876. int nCountOfButtons = _GetButtonsCountImpl();
  2877. int nNearestIdx = -1;
  2878. int nNearestDistance = 32767;
  2879. bool bNearestRowMatch = false;
  2880. for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2881. {
  2882. CExtBarButton * pTBB =
  2883. _GetButtonPtr(nBtnIdx);
  2884. ASSERT_VALID( pTBB );
  2885. if( (! pTBB->IsVisible() )
  2886. || (pTBB->GetStyle() & TBBS_HIDDEN) != 0
  2887. )
  2888. continue;
  2889. if( pTBB->IsSeparator()
  2890. && nBtnIdx < (nCountOfButtons-1)
  2891. )
  2892. {
  2893. CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 );
  2894. ASSERT_VALID( pNextTBB );
  2895. if( pNextTBB->GetStyle() & TBBS_HIDDEN )
  2896. continue;
  2897. }
  2898. if( (pTBB->GetStyle() & nButtonStyleInclude)
  2899. != nButtonStyleInclude
  2900. )
  2901. continue;
  2902. if( (pTBB->GetStyle() & nButtonStyleExclude)
  2903. != 0
  2904. )
  2905. continue;
  2906. CRect rect = *pTBB;
  2907. if( rect.PtInRect(point) )
  2908. return nBtnIdx;
  2909. if( !bAllowFindNearest )
  2910. continue;
  2911. CPoint ptCenter = rect.CenterPoint();
  2912. double lfDX = double( point.x - ptCenter.x );
  2913. double lfDY = double( point.y - ptCenter.y );
  2914. int nDistance = (int)
  2915. ::sqrt( lfDX*lfDX + lfDY*lfDY );
  2916. bool bRowMatch = false;
  2917. if( (m_dwStyle & CBRS_ORIENT_HORZ) != 0 )
  2918. {
  2919. bRowMatch =
  2920. (rect.top <= point.y && point.y <= rect.bottom)
  2921. ? true : false;
  2922. } // if( (m_dwStyle & CBRS_ORIENT_HORZ) != 0 )
  2923. else
  2924. {
  2925. bRowMatch =
  2926. (rect.left <= point.x && point.x <= rect.right)
  2927. ? true : false;
  2928. } // if( (m_dwStyle & CBRS_ORIENT_HORZ) != 0 )
  2929. if( (!bNearestRowMatch) && bRowMatch )
  2930. {
  2931. nNearestIdx = nBtnIdx;
  2932. nNearestDistance = nDistance;
  2933. bNearestRowMatch = true;
  2934. } // if( (!bNearestRowMatch) && bRowMatch )
  2935. else if(
  2936. bNearestRowMatch == bRowMatch
  2937. && nNearestDistance > nDistance
  2938. )
  2939. {
  2940. nNearestIdx = nBtnIdx;
  2941. nNearestDistance = nDistance;
  2942. }
  2943. } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2944. if( bAllowFindNearest && nNearestIdx >= 0 )
  2945. return nNearestIdx;
  2946. return -1; // nowhere
  2947. }
  2948. int CExtToolControlBar::HitTest(
  2949. CPoint point // in window relative coords
  2950. ) const
  2951. {
  2952. return
  2953. _HitTestImpl(
  2954. point,
  2955. 0,
  2956. TBBS_SEPARATOR
  2957. );
  2958. }
  2959. /////////////////////////////////////////////////////////////////////////////
  2960. // CExtToolControlBar message handlers
  2961. BEGIN_MESSAGE_MAP(CExtToolControlBar, CExtControlBar)
  2962. //{{AFX_MSG_MAP(CExtToolControlBar)
  2963. ON_WM_LBUTTONDOWN()
  2964. ON_WM_LBUTTONUP()
  2965. ON_WM_LBUTTONDBLCLK()
  2966. ON_WM_RBUTTONUP()
  2967. ON_WM_CANCELMODE()
  2968. ON_WM_NCCALCSIZE()
  2969. ON_WM_SIZE()
  2970. ON_WM_TIMER()
  2971. ON_WM_CAPTURECHANGED()
  2972. //}}AFX_MSG_MAP
  2973. __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE()
  2974. ON_REGISTERED_MESSAGE( CExtToolControlBar::g_nMsgTrackButtonMenu, OnTrackButtonMenu )
  2975. ON_REGISTERED_MESSAGE( CExtPopupMenuWnd::g_nMsgNotifyMenuClosed, OnMenuClosed )
  2976. ON_WM_ACTIVATEAPP()
  2977. END_MESSAGE_MAP()
  2978. LRESULT CExtToolControlBar::OnMenuClosed( WPARAM wParam, LPARAM lParam )
  2979. {
  2980. wParam;
  2981. lParam;
  2982. _UpdateHoverButton( CPoint(-1,-1), false );
  2983. return 0;
  2984. }
  2985. LRESULT CExtToolControlBar::OnTrackButtonMenu(WPARAM wParam,LPARAM lParam)
  2986. {
  2987. if( !( ::IsWindowEnabled(
  2988. m_bPresubclassDialogMode
  2989. ? GetOwner()->GetSafeHwnd()
  2990. : _GetDockingFrameImpl()->GetSafeHwnd()
  2991. )
  2992. )
  2993. return 0;
  2994. int nCountOfButtons = GetButtonsCount();
  2995. ASSERT( nCountOfButtons >= 0 );
  2996. if( nCountOfButtons == 0 )
  2997. return 0;
  2998. int nIndex = int(wParam);
  2999. if( nIndex < 0 || nIndex>=nCountOfButtons )
  3000. {
  3001. _CloseTrackingMenus();
  3002. return 0;
  3003. }
  3004. CExtBarButton * pTBB = _GetButtonPtr(nIndex);
  3005. ASSERT_VALID( pTBB );
  3006. BOOL bDroppedMode =
  3007. CExtPopupMenuWnd::IsMenuTracking();
  3008. if( ! pTBB->IsAbleToTrackMenu() )
  3009. bDroppedMode = FALSE;
  3010. if( bDroppedMode )
  3011. {
  3012. CExtToolControlBar::TrackButtonMenu(
  3013. nIndex,
  3014. true,
  3015. false,
  3016. (lParam != 0) ? true : false
  3017. );
  3018. return 0;
  3019. }
  3020. _CloseTrackingMenus();
  3021. if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() )
  3022. CExtMouseCaptureSink::ReleaseCapture();
  3023. return 0;
  3024. }
  3025. void CExtToolControlBar::OnLButtonDown(UINT nFlags, CPoint point)
  3026. {
  3027. if( m_bRowResizing || m_bRowRecalcing || m_bDragging )
  3028. {
  3029. CExtControlBar::OnLButtonDown(nFlags, point);
  3030. return;
  3031. }
  3032. _ActivateOnClick();
  3033. m_nBtnIdxCapture = HitTest( point );
  3034. if( m_nBtnIdxCapture < 0 ) // nothing hit
  3035. {
  3036. CPoint ptScreen = point;
  3037. ClientToScreen( &ptScreen );
  3038. bool bOwnMessage = true;
  3039. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  3040. if( hWndFromPoint != m_hWnd )
  3041. {
  3042. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  3043. if( m_pDockBar == NULL
  3044. && IsKindOf( RUNTIME_CLASS(CExtRibbonBar) )
  3045. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl != NULL
  3046. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  3047. && hWndFromPoint == ::GetParent( m_hWnd )
  3048. )
  3049. {
  3050. }
  3051. else
  3052. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3053. bOwnMessage = false; // nowhere
  3054. }
  3055. if( bOwnMessage )
  3056. CExtControlBar::OnLButtonDown(nFlags, point);
  3057. else
  3058. SendMessage( WM_CANCELMODE );
  3059. return;
  3060. }
  3061. CExtBarButton * pTBB =
  3062. _GetButtonPtr(m_nBtnIdxCapture);
  3063. ASSERT_VALID( pTBB );
  3064. ASSERT( !(pTBB->IsSeparator()) );
  3065. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3066. if( m_bCustomizationAllowed )
  3067. {
  3068. CExtCustomizeSite * pSite = GetCustomizeSite();
  3069. if( pSite != NULL )
  3070. {
  3071. CExtCustomizeCmdTreeNode * pNodeC =
  3072. pTBB->GetCmdNode( false );
  3073. if( pNodeC != NULL )
  3074. {
  3075. ASSERT_VALID( pNodeC );
  3076. bool bCustomizeMode = pSite->IsCustomizeMode();
  3077. bool bAlt =
  3078. ( (::GetAsyncKeyState(VK_MENU)&0x8000) != 0 )
  3079. ? true : false;
  3080. if( bAlt || bCustomizeMode )
  3081. {
  3082. int nBtnDragSrc = m_nBtnIdxCapture;
  3083. m_nBtnIdxCapture = -1;
  3084. if( !pTBB->CanStartCommandDrag() )
  3085. return;
  3086. if( bCustomizeMode )
  3087. {
  3088. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  3089. int nWidthMin = 0, nWidthMax = 0;
  3090. int nInitialResizingStateH =
  3091. pTBB->GetInitialResizingStateH(
  3092. point,
  3093. &nWidthMin,
  3094. &nWidthMax
  3095. );
  3096. if( pTBB->IsCustomizeActiveItem()
  3097. && nInitialResizingStateH != 0
  3098. )
  3099. { // if can resize button horizontally
  3100. bool bCtrl =
  3101. ( (::GetAsyncKeyState(VK_CONTROL)&0x8000) != 0 )
  3102. ? true : false;
  3103. bool bShift =
  3104. ( (::GetAsyncKeyState(VK_SHIFT)&0x8000) != 0 )
  3105. ? true : false;
  3106. if( !( bAlt || bCtrl || bShift ) )
  3107. {
  3108. CRect rcItem = pTBB->Rect();
  3109. if( !pSite->OnCmdNodeResizeH(
  3110. nInitialResizingStateH,
  3111. m_hWnd,
  3112. pTBB,
  3113. pNodeC,
  3114. nWidthMin,
  3115. nWidthMax,
  3116. rcItem
  3117. )
  3118. )
  3119. return; // resizing is canceled
  3120. CFrameWnd * pFrame = GetParentFrame();
  3121. if( pFrame != NULL )
  3122. {
  3123. pFrame->RecalcLayout();
  3124. pSite->ActiveItemSet( pTBB, GetSafeHwnd() );
  3125. }
  3126. return;
  3127. } // if( !( bAlt || bCtrl || bShift ) )
  3128. } // if can resize button horizontally
  3129. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  3130. pTBB->SetCustomizeActiveItem();
  3131. } // if( bCustomizeMode )
  3132. // CExtCmdItem * pCmdItem =
  3133. // g_CmdManager->CmdGetPtr(
  3134. // g_CmdManager->ProfileNameFromWnd( m_hWnd ),
  3135. // pTBB->GetCmdID()
  3136. // );
  3137. // if( pCmdItem == NULL )
  3138. // {
  3139. // ASSERT( FALSE );
  3140. // return;
  3141. // }
  3142. CExtCustomizeCmdTreeNode * pNodeI =
  3143. pTBB->GetCmdNode( true );
  3144. SendMessage( WM_CANCELMODE );
  3145. CRect rcItem( 0, 0, 1, 1 );
  3146. CExtCustomizeCmdTreeNode * pPopupDropTargetNode =
  3147. pSite->GetPopupDropTargetNode();
  3148. if( bCustomizeMode
  3149. && pTBB->IsAbleToTrackMenu( true )
  3150. && pPopupDropTargetNode != pNodeC
  3151. )
  3152. {
  3153. // pSite->DropTargetPopupCancel();
  3154. // pSite->DropTargetPopupCancel();
  3155. pSite->DropTargetPopupCancelEx( -2 );
  3156. CRect rcBtn = *pTBB;
  3157. ClientToScreen( &rcBtn );
  3158. CPoint ptTrack( point );
  3159. ClientToScreen( &ptTrack );
  3160. DWORD dwTrackFlags = pTBB->OnGetTrackPopupFlags();
  3161. pSite->DropTargetPopupTrack(
  3162. pNodeC,
  3163. rcBtn,
  3164. ptTrack,
  3165. dwTrackFlags
  3166. );
  3167. } // if( bCustomizeMode && pTBB->IsAbleToTrackMenu() ...
  3168. else
  3169. pSite->DropTargetPopupCancel();
  3170. m_pDragSourceTBB = pTBB;
  3171. m_pDragTargetTBB = NULL;
  3172. m_nDragTargetShift = 0;
  3173. m_bHelperSeparatorAction = false;
  3174. _InvalidateButton( nBtnDragSrc );
  3175. //UpdateWindow();
  3176. if( CExtControlBar::stat_DoDragDetect( m_hWnd, point ) )
  3177. pSite->DoDragCmdNode( this, pNodeI, pNodeC, rcItem );
  3178. m_pDragSourceTBB = NULL;
  3179. m_pDragTargetTBB = NULL;
  3180. m_nDragTargetShift = 0;
  3181. m_bHelperSeparatorAction = false;
  3182. return;
  3183. } // if( bAlt || bCustomizeMode )
  3184. } // if( pNodeC != NULL )
  3185. } // if( pSite != NULL )
  3186. } // if( m_bCustomizationAllowed )
  3187. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3188. // update the button before checking for disabled status
  3189. _UpdateButton(m_nBtnIdxCapture);
  3190. if( m_nBtnIdxMenuTracking == m_nBtnIdxCapture
  3191. || ( pTBB->IsDisabled()
  3192. && ( ! pTBB->CanBePressedInDisabledState() )
  3193. )
  3194. )
  3195. {
  3196. m_nBtnIdxCapture = -1;
  3197. return;     // don't press it
  3198. } // if( m_nBtnIdxMenuTracking == m_nBtnIdxCapture ...
  3199. pTBB->ModifyStyle( TBBS_PRESSED );
  3200. pTBB->OnPressedTrackingStart();
  3201. _InvalidateButton( m_nBtnIdxCapture );
  3202. // UpdateWindow(); // immediate feedback
  3203. HWND hWndCtrlTBB = pTBB->CtrlGet()->GetSafeHwnd();
  3204. HWND hWndOwn = m_hWnd;
  3205. pTBB->OnClick( point, true );
  3206. if( ! ::IsWindow(hWndOwn) )
  3207. return;
  3208. if( _GetIndexOf( pTBB ) < 0 )
  3209. pTBB = NULL;
  3210. #ifdef _DEBUG
  3211. else
  3212. {
  3213. ASSERT_VALID( pTBB );
  3214. }
  3215. #endif // _DEBUG
  3216. if( ! g_bMenuTracking )
  3217. {
  3218. if( hWndCtrlTBB == NULL
  3219. || ( ::IsWindow(hWndCtrlTBB)
  3220. && ( (::__EXT_MFC_GetWindowLong(hWndCtrlTBB,GWL_STYLE)) & WS_VISIBLE ) == 0
  3221. )
  3222. )
  3223. CExtMouseCaptureSink::SetCapture( GetSafeHwnd() );
  3224. else
  3225. m_nBtnIdxCapture = -1;
  3226. } // if( ! g_bMenuTracking )
  3227. else
  3228. m_nBtnIdxCapture = -1;
  3229. }
  3230. bool CExtToolControlBar::_IsSimplifiedDropDownButtons() const
  3231. {
  3232. ASSERT_VALID( this );
  3233. return false;
  3234. }
  3235. bool CExtToolControlBar::_OnMouseMoveMsg(UINT nFlags, CPoint point)
  3236. {
  3237. __PROF_UIS_MANAGE_STATE;
  3238. if( CExtPopupMenuWnd::IsMenuTracking()
  3239. && (! CExtToolControlBar::g_bMenuTracking )
  3240. )
  3241. return true;
  3242. if( IsFloating()
  3243. && CExtMiniDockFrameWnd::g_bAutoMakeTopmostOnMouseEvent
  3244. )
  3245. {
  3246. CFrameWnd * pParentFrame = GetParentFrame();
  3247. if( pParentFrame != NULL )
  3248. pParentFrame->BringWindowToTop();
  3249. }
  3250. if( m_bRowResizing || m_bRowRecalcing || m_bDragging )
  3251. return CExtControlBar::_OnMouseMoveMsg(nFlags, point);;
  3252. if( m_nBtnIdxCapture >= 0 )
  3253. {
  3254. CExtBarButton * pTBB =
  3255. _GetButtonPtr( m_nBtnIdxCapture );
  3256. ASSERT_VALID( pTBB );
  3257. ASSERT( ! pTBB->IsSeparator() );
  3258. // UINT nNewStyle = ( pTBB->GetStyle() & (~TBBS_PRESSED) );
  3259. UINT nNewStyle = pTBB->GetStyle();
  3260. int nBtnIdxCapture = m_nBtnIdxCapture;
  3261. if( CExtMouseCaptureSink::GetCapture() != m_hWnd )
  3262. {
  3263. if( HitTest(point) != m_nBtnIdxCapture )
  3264. nNewStyle &= (~TBBS_PRESSED);
  3265. m_nBtnIdxCapture = -1; // lost capture
  3266. }
  3267. else
  3268. {
  3269. // should be pressed if still hitting the captured button
  3270. if( HitTest(point) == m_nBtnIdxCapture )
  3271. nNewStyle |= TBBS_PRESSED;
  3272. }
  3273. // if( (nNewStyle & TBBS_PRESSED) == 0 )
  3274. // pTBB->OnPressedTrackingStop();
  3275. // else
  3276. // pTBB->OnPressedTrackingStart();
  3277. SetButtonStyle( nBtnIdxCapture, nNewStyle );
  3278. UpdateWindow(); // immediate feedback
  3279. return true;
  3280. } // if( m_nBtnIdxCapture >= 0 )
  3281. bool bHoverChanged = _UpdateHoverButton();
  3282. if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd()
  3283. && m_nBtnIdxHover < 0
  3284. && m_nBtnIdxMenuTracking < 0
  3285. && m_nBtnIdxCapture < 0
  3286. )
  3287. {
  3288. CPoint ptScreen;
  3289. if( ! ::GetCursorPos(&ptScreen) )
  3290. return false;
  3291. bool bOwnMessage = true;
  3292. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  3293. if( hWndFromPoint != m_hWnd )
  3294. {
  3295. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  3296. if( m_pDockBar == NULL
  3297. && IsKindOf( RUNTIME_CLASS(CExtRibbonBar) )
  3298. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl != NULL
  3299. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  3300. && hWndFromPoint == ::GetParent( m_hWnd )
  3301. )
  3302. {
  3303. }
  3304. else
  3305. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3306. bOwnMessage = false; // nowhere
  3307. }
  3308. if( bOwnMessage )
  3309. CExtMouseCaptureSink::ReleaseCapture();
  3310. }
  3311. if( (! CExtPopupMenuWnd::IsMenuTracking() ) && m_nBtnIdxHover >= 0 )
  3312. {
  3313. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3314. CExtCustomizeSite * pSite =
  3315. GetCustomizeSite();
  3316. if( pSite == NULL
  3317. || (! pSite->IsCustomizeMode() )
  3318. )
  3319. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3320. {
  3321. CExtBarButton * pTBB =
  3322. _GetButtonPtr( m_nBtnIdxHover );
  3323. ASSERT_VALID( pTBB );
  3324. CExtPopupMenuTipWnd * pATTW =
  3325. OnAdvancedPopupMenuTipWndGet( pTBB );
  3326. if( pATTW != NULL )
  3327. {
  3328. ASSERT( ! pTBB->IsSeparator() );
  3329. ASSERT_VALID( pTBB );
  3330. TOOLINFO _ti;
  3331. ::memset( &_ti, 0, sizeof(AFX_OLDTOOLINFO) );
  3332. _ti.cbSize = sizeof( TOOLINFO );
  3333. _ti.hinst = ::AfxGetInstanceHandle();
  3334. if( pTBB->OnToolHitTest( point, &_ti ) > 0 )
  3335. {
  3336. if( _ti.lpszText != NULL
  3337. && _ti.lpszText != LPSTR_TEXTCALLBACK
  3338. && _tcslen( _ti.lpszText ) > 0
  3339. )
  3340. {
  3341. CRect rcArea = _ti.rect;
  3342. ClientToScreen( &rcArea );
  3343. if( pATTW->GetSafeHwnd() != NULL )
  3344. {
  3345. CRect rcTest = pATTW->GetExcludeArea();
  3346. if( rcTest != rcArea )
  3347. bHoverChanged = true;
  3348. }
  3349. OnAdvancedPopupMenuTipWndDisplay(
  3350. *pATTW,
  3351. rcArea,
  3352. _ti.lpszText,
  3353. pTBB
  3354. );
  3355. }
  3356. }
  3357. if( _ti.lpszText != NULL
  3358. && _ti.lpszText != LPSTR_TEXTCALLBACK
  3359. )
  3360. ::free( _ti.lpszText );
  3361. } // if( pATTW != NULL )
  3362. }
  3363. } // if( (! CExtPopupMenuWnd::IsMenuTracking() ) && m_nBtnIdxHover >= 0 )
  3364. if( bHoverChanged )
  3365. return true;
  3366. return CExtControlBar::_OnMouseMoveMsg(nFlags,point);
  3367. }
  3368. bool CExtToolControlBar::IsForceHoverWhenMenuTracking() const
  3369. {
  3370. ASSERT_VALID( this );
  3371. return false;
  3372. }
  3373. void CExtToolControlBar::_CheckHitTestablePoint(
  3374. CPoint & point
  3375. )
  3376. {
  3377. ASSERT_VALID( this );
  3378. CPoint ptScreen = point;
  3379. if( point.x < 0 || point.y < 0 )
  3380. {
  3381. if( ! ::GetCursorPos( &ptScreen ) )
  3382. {
  3383. point.x = point.y = 32767;
  3384. return;
  3385. }
  3386. point = ptScreen;
  3387. ScreenToClient( &point );
  3388. }
  3389. else
  3390. ClientToScreen( &ptScreen );
  3391. }
  3392. bool CExtToolControlBar::_UpdateHoverButton(
  3393. CPoint point, // = CPoint(-1,-1) // default is use ::GetCursorPos()
  3394. bool bEnableUpdateWindow // = true
  3395. )
  3396. {
  3397. ASSERT_VALID( this );
  3398. _CheckHitTestablePoint( point );
  3399. bool bHoverChanged = false;
  3400. INT nBtnIdxHoverNew = -1;
  3401. INT nIndex, nCount = GetButtonsCount();
  3402. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  3403. {
  3404. CExtBarButton * pTBB = GetButton( nIndex );
  3405. ASSERT_VALID( pTBB );
  3406. if( ( ! pTBB->IsVisible() )
  3407. || ( pTBB->GetStyle() & TBBS_HIDDEN ) != 0
  3408. )
  3409. continue;
  3410. bool bHover = pTBB->IsHover();
  3411. CRect rcTBB = *pTBB;
  3412. if( ( pTBB->IsDisabled()
  3413. && (! pTBB->IsShowTipWhenDisabled() )
  3414. )
  3415. || pTBB->IsSeparator()
  3416. || ( ! rcTBB.PtInRect( point ) )
  3417. )
  3418. {
  3419. if( bHover )
  3420. {
  3421. bHoverChanged = true;
  3422. pTBB->SetHover( false );
  3423. _InvalidateButton( nIndex );
  3424. }
  3425. continue;
  3426. }
  3427. if( pTBB->ChildButtonGetCount() > 0
  3428. && nBtnIdxHoverNew >= 0
  3429. )
  3430. continue;
  3431. nBtnIdxHoverNew = nIndex;
  3432. if( bHover )
  3433. continue;
  3434. bHoverChanged = true;
  3435. pTBB->SetHover( true );
  3436. _InvalidateButton( nIndex );
  3437. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  3438. bool bDropDownHT = false;
  3439. if( m_nBtnIdxHover >= 0 )
  3440. {
  3441. CExtBarButton * pTBB =
  3442. _GetButtonPtr( m_nBtnIdxHover );
  3443. ASSERT_VALID( pTBB );
  3444. if( pTBB->GetSeparatedDropDown() )
  3445. {
  3446. CRect rcBtnDropDownArea = pTBB->RectDropDown();
  3447. if( rcBtnDropDownArea.PtInRect( point ) )
  3448. bDropDownHT = true;
  3449. } // if( pTBB->GetSeparatedDropDown() )
  3450. } // if( m_nBtnIdxHover >= 0 )
  3451. if( m_nBtnIdxHover != nBtnIdxHoverNew
  3452. || m_bLastDropDownHT != bDropDownHT
  3453. )
  3454. {
  3455. m_bLastDropDownHT = bDropDownHT;
  3456. if( m_nBtnIdxHover >= 0
  3457. && m_nBtnIdxHover != nBtnIdxHoverNew
  3458. )
  3459. {
  3460. CExtBarButton * pTBB =
  3461. _GetButtonPtr( m_nBtnIdxHover );
  3462. ASSERT_VALID( pTBB );
  3463. pTBB->OnHover(
  3464. point,
  3465. false,
  3466. m_bSuspendTips
  3467. );
  3468. } // if( m_nBtnIdxHover >= 0 ...
  3469. bHoverChanged = true;
  3470. // if( CExtControlBar::FindHelpMode( this )
  3471. // && nBtnIdxHoverNew >= 0
  3472. // )
  3473. // {
  3474. // CExtBarButton * pTBB = _GetButtonPtr(nBtnIdxHoverNew);
  3475. // if( pTBB->IsAbleToTrackMenu()
  3476. // && pTBB->OnHelpHitTest(point) == -3
  3477. // )
  3478. // m_nBtnIdxHover = nBtnIdxHoverNew;
  3479. // }
  3480. // else
  3481. // m_nBtnIdxHover = nBtnIdxHoverNew;
  3482. m_nBtnIdxHover = nBtnIdxHoverNew;
  3483. if( m_nBtnIdxHover >= 0 )
  3484. {
  3485. if( m_ptLastClientHover == point )
  3486. {
  3487. m_nBtnIdxHover = -1;
  3488. }
  3489. }
  3490. if( m_nBtnIdxHover >= 0 )
  3491. {
  3492. CExtBarButton * pTBB =
  3493. _GetButtonPtr( m_nBtnIdxHover );
  3494. ASSERT_VALID( pTBB );
  3495. bool bEnableHoverOnNewBtn = true;
  3496. if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton))
  3497. || pTBB->IsDisabled()
  3498. )
  3499. {
  3500. if( g_bMenuTracking )
  3501. bEnableHoverOnNewBtn = false;
  3502. }
  3503. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3504. if( bEnableHoverOnNewBtn )
  3505. {
  3506. CExtCustomizeSite * pSite =
  3507. GetCustomizeSite();
  3508. if( pSite != NULL
  3509. && ( pSite->IsCustomizeMode()
  3510. || pSite->GetPopupDropTargetNode() != NULL
  3511. || pSite->DraggedNodeGet() != NULL
  3512. )
  3513. )
  3514. bEnableHoverOnNewBtn = false;
  3515. } // if( bEnableHoverOnNewBtn )
  3516. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3517. if( bEnableHoverOnNewBtn )
  3518. {
  3519. m_ptLastClientHover = point;
  3520. pTBB->OnHover(
  3521. point,
  3522. true,
  3523. m_bSuspendTips
  3524. );
  3525. pTBB->RedrawButton( false );
  3526. }
  3527. } // if( m_nBtnIdxHover >= 0 )
  3528. } // if( m_nBtnIdxHover != nBtnIdxHoverNew )
  3529. else if( m_nBtnIdxHover >= 0 )
  3530. {
  3531. CExtBarButton * pTBB = _GetButtonPtr( m_nBtnIdxHover );
  3532. ASSERT_VALID( pTBB );
  3533. if( pTBB->IsKindOf( RUNTIME_CLASS( CExtBarMdiRightButton ) ) )
  3534. {
  3535. m_ptLastClientHover = point;
  3536. pTBB->OnHover(
  3537. point,
  3538. true,
  3539. m_bSuspendTips
  3540. );
  3541. pTBB->RedrawButton( false );
  3542. } // if( pTBB->IsKindOf( RUNTIME_CLASS( CExtBarMdiRightButton ) ) )
  3543. } // else if( m_nBtnIdxHover >= 0 )
  3544. if( m_nBtnIdxHover >= 0 )
  3545. {
  3546. m_ptLastClientHover = point;
  3547. CExtBarButton * pTBB = _GetButtonPtr( m_nBtnIdxHover );
  3548. ASSERT_VALID( pTBB );
  3549. pTBB->OnHovering(
  3550. point,
  3551. m_bSuspendTips
  3552. );
  3553. }
  3554. if( bHoverChanged && bEnableUpdateWindow )
  3555. UpdateWindow();
  3556. CPoint ptScreen = point;
  3557. ClientToScreen( &ptScreen );
  3558. bool bOwnMessage = true;
  3559. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  3560. if( hWndFromPoint != m_hWnd )
  3561. {
  3562. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  3563. if( m_pDockBar == NULL
  3564. && IsKindOf( RUNTIME_CLASS(CExtRibbonBar) )
  3565. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl != NULL
  3566. && ((CExtRibbonBar*)this)->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  3567. && hWndFromPoint == ::GetParent( m_hWnd )
  3568. )
  3569. {
  3570. }
  3571. else
  3572. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3573. bOwnMessage = false; // nowhere
  3574. }
  3575. if( ( ! bOwnMessage )
  3576. && ::GetCapture() == m_hWnd
  3577. )
  3578. ::ReleaseCapture();
  3579. m_nBtnIdxHover = nBtnIdxHoverNew;
  3580. SetTimer( __EXT_MFC_ID_TOOLBAR_HOVER_PROTECTION_TIMER, 100, NULL );
  3581. //  if( m_nBtnIdxHover >= 0 )
  3582. //  {
  3583. //  SetTimer( __EXT_MFC_ID_TOOLBAR_HOVER_PROTECTION_TIMER, 100, NULL );
  3584. //  SendMessage( WM_TIMER, __EXT_MFC_ID_TOOLBAR_HOVER_PROTECTION_TIMER );
  3585. //  }
  3586. // else
  3587. // KillTimer( __EXT_MFC_ID_TOOLBAR_HOVER_PROTECTION_TIMER );
  3588. return bHoverChanged;
  3589. }
  3590. void CExtToolControlBar::OnLButtonUp(UINT nFlags, CPoint point)
  3591. {
  3592. if( ( m_nBtnIdxCapture < 0 && m_nBtnIdxHover < 0 )
  3593. || m_bRowResizing
  3594. || m_bRowRecalcing
  3595. || m_bDragging
  3596. )
  3597. {
  3598. CExtControlBar::OnLButtonUp(nFlags, point);
  3599. return;     // not captured
  3600. }
  3601. _CheckHitTestablePoint( point );
  3602. int nBtnIdxCapture = m_nBtnIdxCapture;
  3603. HWND hWndOwn = m_hWnd;
  3604. if( nBtnIdxCapture >= 0 )
  3605. {
  3606. CExtBarButton * pTempTBB = _GetButtonPtr( nBtnIdxCapture );
  3607. ASSERT_VALID( pTempTBB );
  3608. ASSERT( !(pTempTBB->IsSeparator()) );
  3609. if( pTempTBB->IsPressedTracking() )
  3610. {
  3611. pTempTBB->OnPressedTrackingStop();
  3612. _InvalidateButton( m_nBtnIdxCapture );
  3613. }
  3614. m_nBtnIdxCapture = -1;
  3615. CExtBarButton * pCaptureTBB = NULL;
  3616. UINT nNewStyle = 0;
  3617. if( nBtnIdxCapture == HitTest(point) )
  3618. {
  3619. pCaptureTBB = pTempTBB;
  3620. nNewStyle = ( pCaptureTBB->GetStyle() & ~TBBS_PRESSED );
  3621. // give button a chance to update
  3622. _UpdateButton( nBtnIdxCapture );
  3623. // then check for disabled state
  3624. if( !(pCaptureTBB->IsDisabled()) )
  3625. {
  3626. if( pCaptureTBB->GetStyle() & TBBS_CHECKBOX )
  3627. {
  3628. // auto check: three state => down
  3629. if( nNewStyle & TBBS_INDETERMINATE )
  3630. nNewStyle &= ~TBBS_INDETERMINATE;
  3631. nNewStyle ^= TBBS_CHECKED;
  3632. }
  3633. } // if( !(pCaptureTBB->IsDisabled()) )
  3634. } // if( nBtnIdxCapture == HitTest(point) )
  3635. CExtMouseCaptureSink::ReleaseCapture();
  3636. if( pCaptureTBB != NULL )
  3637. {
  3638. if( _GetIndexOf( pCaptureTBB ) != nBtnIdxCapture )
  3639. nBtnIdxCapture = -1;
  3640. else
  3641. {
  3642. pCaptureTBB->OnClick( point, false );
  3643. if( ! ::IsWindow( hWndOwn ) )
  3644. return;
  3645. if( _GetIndexOf( pCaptureTBB ) != nBtnIdxCapture )
  3646. return;
  3647. } // else from if( _GetIndexOf(pCaptureTBB) != nBtnIdxCapture )
  3648. }
  3649. if( nBtnIdxCapture >= 0 )
  3650. {
  3651. _InvalidateButton( nBtnIdxCapture );
  3652. if( (!g_bMenuTracking)  )
  3653. {
  3654. SetButtonStyle( nBtnIdxCapture, nNewStyle );
  3655. _UpdateButton( nBtnIdxCapture );
  3656. } // if( (!g_bMenuTracking) && nBtnIdxCapture >= 0 )
  3657. }
  3658. } // if( nBtnIdxCapture >= 0 )
  3659. // INT nCountOfButtons = _GetButtonsCountImpl();
  3660. //  for( INT nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  3661. //  {
  3662. //  CExtBarButton * pTBB =
  3663. //  _GetButtonPtr( nBtnIdx );
  3664. //  ASSERT_VALID( pTBB );
  3665. //  pTBB->m_bHover = false;
  3666. //  } // for( INT nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  3667. _UpdateHoverButton( CPoint(-1,-1), false );
  3668. }
  3669. void CExtToolControlBar::OnRButtonUp(UINT nFlags, CPoint point)
  3670. {
  3671. ASSERT_VALID( this );
  3672. INT nButton = HitTest( point );
  3673. if( nButton < 0 )
  3674. {
  3675. CExtControlBar::OnRButtonUp( nFlags,  point );
  3676. return;
  3677. }
  3678. CExtBarButton * pTBB = _GetButtonPtr( nButton );
  3679. ASSERT_VALID( pTBB );
  3680. if( pTBB->IsSeparator()
  3681. || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton))
  3682. || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton))
  3683. || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton))
  3684. )
  3685. {
  3686. CExtControlBar::OnRButtonUp( nFlags,  point );
  3687. return;
  3688. }
  3689. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3690. if( _IsDockSiteCustomizeMode() )
  3691. {
  3692. CExtCustomizeSite * pSite = GetCustomizeSite();
  3693. if( pSite != NULL )
  3694. {
  3695. ASSERT( pSite->IsCustomizeMode() );
  3696. CExtCustomizeCmdTreeNode * pNodeC = pTBB->GetCmdNode( false );
  3697. if( pNodeC == NULL )
  3698. return;
  3699. ASSERT_VALID( pNodeC );
  3700. CExtCustomizeCmdTreeNode * pNodeI = pTBB->GetCmdNode( true );
  3701. #ifdef _DEBUG
  3702. if( pNodeI != NULL )
  3703. {
  3704. ASSERT_VALID( pNodeI );
  3705. }
  3706. #endif // _DEBUG
  3707. pSite->DropTargetPopupCancel();
  3708. pTBB->SetCustomizeActiveItem();
  3709. CExtCmdItem * pCmdItem =
  3710. g_CmdManager->CmdGetPtr(
  3711. g_CmdManager->ProfileNameFromWnd(m_hWnd),
  3712. pTBB->GetCmdID( false )
  3713. );
  3714. ASSERT( pCmdItem != NULL );
  3715. if( !pSite->CustomizedNodeSet( pNodeC ) )
  3716. return;
  3717. Invalidate();
  3718. //UpdateWindow();
  3719. bool bCanAddRemoveSeparator = false;
  3720. if( OnQueryRevertRTL() )
  3721. {
  3722. int nButtonsCount = GetButtonsCount();
  3723. if( nButton < (nButtonsCount-1)
  3724. && ( ! _GetButtonPtr( nButton + 1 ) ->
  3725. IsKindOf(
  3726. RUNTIME_CLASS(CExtBarMdiDocButton)
  3727. )
  3728. )
  3729. )
  3730. bCanAddRemoveSeparator = true;
  3731. } // if( OnQueryRevertRTL() )
  3732. else
  3733. {
  3734. if( nButton > 0
  3735. && ( ! _GetButtonPtr( nButton - 1 ) ->
  3736. IsKindOf(
  3737. RUNTIME_CLASS(CExtBarMdiDocButton)
  3738. )
  3739. )
  3740. )
  3741. bCanAddRemoveSeparator = true;
  3742. } // else from if( OnQueryRevertRTL() )
  3743. bool bDelete = false;
  3744. if( ! pSite->OnCustomizeTreeNode(
  3745. pNodeI,
  3746. pNodeC,
  3747. pCmdItem,
  3748. bDelete,
  3749. bCanAddRemoveSeparator,
  3750. this
  3751. )
  3752. )
  3753. {
  3754. VERIFY( pSite->CustomizedNodeSet( NULL ) );
  3755. Invalidate();
  3756. //UpdateWindow();
  3757. return;
  3758. }
  3759. VERIFY( pSite->CustomizedNodeSet( NULL ) );
  3760. if( bDelete )
  3761. {
  3762. pNodeC->RemoveSelf( pCmdItem );
  3763. RemoveButton( nButton );
  3764. if( nButton > 0
  3765. && _GetButtonPtr(nButton-1)->IsSeparator()
  3766. )
  3767. RemoveButton( nButton-1 );
  3768. if( nButton < (GetButtonsCount()-1)
  3769. && _GetButtonPtr(nButton)->IsSeparator()
  3770. )
  3771. {
  3772. RemoveButton( nButton );
  3773. CExtBarButton * pTBB = _GetButtonPtr(nButton);
  3774. ASSERT_VALID( pTBB );
  3775. CExtCustomizeCmdTreeNode * pNodeNext = pTBB->GetCmdNode( false );
  3776. ASSERT_VALID( pNodeNext );
  3777. pNodeNext->ModifyFlags( 0, __ECTN_GROUP_START );
  3778. }
  3779. } // if( bDelete )
  3780. else
  3781. {
  3782. if( pNodeC->GetFlags() & __ECTN_GROUP_START )
  3783. {
  3784. if( nButton > 0
  3785. && (! _GetButtonPtr(nButton-1)->IsSeparator() )
  3786. )
  3787. InsertButton( nButton, ID_SEPARATOR, FALSE );
  3788. } // if( pNodeC->GetFlags() & __ECTN_GROUP_START )
  3789. else
  3790. {
  3791. if( nButton > 0
  3792. && _GetButtonPtr(nButton-1)->IsSeparator()
  3793. )
  3794. RemoveButton( nButton-1, FALSE );
  3795. } // else from if( pNodeC->GetFlags() & __ECTN_GROUP_START )
  3796. } // else from if( bDelete )
  3797. if( IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) )
  3798. ((CExtMenuControlBar*)this)->UpdateMenuBar();
  3799. if( m_pDockSite == NULL )
  3800. {
  3801. _RecalcPositionsImpl();
  3802. Invalidate();
  3803. //UpdateWindow();
  3804. return;
  3805. } // if( m_pDockSite == NULL )
  3806. ASSERT_VALID( m_pDockSite );
  3807. if( IsFloating() )
  3808. {
  3809. _RecalcLayoutImpl();
  3810. Invalidate();
  3811. //UpdateWindow();
  3812. }
  3813. else
  3814. m_pDockSite->RecalcLayout();
  3815. return;
  3816. } // if( pSite != NULL )
  3817. } // if( _IsDockSiteCustomizeMode() )
  3818. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3819. if( m_nBtnIdxHover >= 0 )
  3820. _UpdateHoverButton( CPoint(LONG_MAX,LONG_MAX), true ); // cancel hover
  3821. if( pTBB->OnRClick( point, false ) )
  3822. return;
  3823. CExtControlBar::OnRButtonUp( nFlags, point );
  3824. }
  3825. void CExtToolControlBar::OnLButtonDblClk(UINT nFlags, CPoint point)
  3826. {
  3827. if( m_bRowResizing || m_bRowRecalcing || m_bDragging )
  3828. {
  3829. CExtControlBar::OnLButtonDblClk(nFlags, point);
  3830. return;
  3831. }
  3832. int nBtnIdx = _HitTestImpl(point);
  3833. if( nBtnIdx >= 0 )
  3834. {
  3835. CExtBarButton* pTBB = _GetButtonPtr( nBtnIdx );
  3836. ASSERT_VALID( pTBB );
  3837. if( pTBB->OnDblClick( point ) )
  3838. return;
  3839. if( ! IsFloating() )
  3840. {
  3841. if( pTBB->IsSeparator() )
  3842. {
  3843. if( ! _FloatStateChangingIsEnabled( this ) )
  3844. return;
  3845. ToggleDocking();
  3846. return;
  3847. }
  3848. }
  3849. WPARAM wParam = WPARAM(nFlags);
  3850. LPARAM lParam = MAKELPARAM( point.x, point.y );
  3851. SendMessage( WM_LBUTTONUP, wParam, lParam );
  3852. SendMessage( WM_LBUTTONDOWN, wParam, lParam );
  3853. return;
  3854. } // if( nBtnIdx >= 0 )
  3855. if( m_bEnableDblClickToggleDocking || IsFloating() )
  3856. CExtControlBar::OnLButtonDblClk(nFlags,point);
  3857. }
  3858. void CExtToolControlBar::OnCancelMode()
  3859. {
  3860. CExtControlBar::OnCancelMode();