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

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "stdafx.h"
  22. #if _MFC_VER < 0x700
  23. #include <../src/AfxImpl.h>
  24. #else
  25. #include <../src/mfc/AfxImpl.h>
  26. #endif
  27. #if (!defined __AFXPRIV_H__)
  28. #include <AfxPriv.h>
  29. #endif 
  30. #if (!defined __EXT_TOOLCONTROLBAR_H)
  31. #include <ExtToolControlBar.h>
  32. #endif
  33. #if (!defined __EXT_MENUCONTROLBAR_H)
  34. #include <ExtMenuControlBar.h>
  35. #endif
  36. #if (!defined __EXTDOCKBAR_H)
  37. #include "ExtDockBar.h"
  38. #endif
  39. #if( !defined __EXTMINIDOCKFRAMEWND_H)
  40. #include "ExtMiniDockFrameWnd.h"
  41. #endif
  42. #if (!defined __EXT_PAINT_MANAGER_H)
  43. #include <ExtPaintManager.h>
  44. #endif
  45. #if (!defined __EXT_MEMORY_DC_H)
  46. #include <../Src/ExtMemoryDC.h>
  47. #endif
  48. #if (!defined __EXT_POPUP_MENU_WND_H)
  49. #include <ExtPopupMenuWnd.h>
  50. #endif
  51. #if (!defined __ExtCmdManager_H)
  52. #include <ExtCmdManager.h>
  53. #endif
  54. #if (!defined __EXT_LOCALIZATION_H)
  55. #include <../Src/ExtLocalization.h>
  56. #endif
  57. #if (!defined __EXT_MFC_NO_CUSTOMIZE) || (!defined __EXT_MFC_NO_DATE_PICKER_POPUP) || (!defined __EXT_MFC_NO_UNDO_REDO_POPUP) || (!defined __EXT_MFC_NO_GRIDBASEWND)
  58. #if (!defined __EXT_POPUP_CTRL_MENU_H)
  59. #include <ExtPopupCtrlMenu.h>
  60. #endif
  61. #endif
  62. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  63. #if (!defined __EXT_RIBBON_BAR_H)
  64. #include <ExtRibbonBar.h>
  65. #endif // (!defined __EXT_RIBBON_BAR_H)
  66. #endif
  67. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  68. #if (!defined __EXTCUSTOMIZE_H)
  69. #include <ExtCustomize.h>
  70. #endif
  71. #endif
  72. #ifndef __EXT_MFC_NO_GRIDWND
  73. #if (!defined __EXT_GRIDWND_H)
  74. #include <ExtGridWnd.h>
  75. #endif 
  76. #endif // __EXT_MFC_NO_GRIDWND
  77. #include <Resources/Resource.h>
  78. #include <math.h>
  79. #ifdef _DEBUG
  80. #define new DEBUG_NEW
  81. #undef THIS_FILE
  82. static char THIS_FILE[] = __FILE__;
  83. #endif
  84. #define __EXT_MFC_ID_TOOLBAR_HOVER_PROTECTION_TIMER 9950
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CExtToolControlBar::CExtToolControlBarCmdUI
  87. class CExtToolControlBar::CExtToolControlBarCmdUI : public CCmdUI
  88. {
  89. void _SetCheckImpl( int nCheck, bool bUpdateInCmdManager );
  90. public:
  91. virtual void Enable( BOOL bOn );
  92. virtual void SetRadio( BOOL bOn )
  93. {
  94. _SetCheckImpl( bOn ? 1 : 0, false );
  95. // CExtToolControlBar * pToolBar = (CExtToolControlBar*)m_pOther;
  96. // ASSERT( pToolBar != NULL );
  97. // ASSERT_KINDOF( CExtToolControlBar, pToolBar );
  98. // ASSERT( m_nIndex < m_nIndexMax );
  99. // if( pToolBar->IsRightExpandButton(m_nIndex) )
  100. // return;
  101. // CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr(
  102. // g_CmdManager->ProfileNameFromWnd( pToolBar->GetSafeHwnd() ),
  103. // pToolBar->GetButtonID(m_nIndex)
  104. // );
  105. // if( pCmdItem != NULL )
  106. // pCmdItem->StateSetRadio( bOn ? true : false );
  107. }
  108. virtual void SetCheck( int nCheck )
  109. {
  110. _SetCheckImpl( nCheck, true );
  111. }
  112. virtual void SetText( LPCTSTR lpszText )
  113. {
  114. lpszText;
  115. // ignore it
  116. //#if (!defined __EXT_MFC_NO_CUSTOMIZE)
  117. // CExtToolControlBar* pToolBar = (CExtToolControlBar*)m_pOther;
  118. // ASSERT(pToolBar != NULL);
  119. // ASSERT_KINDOF(CExtToolControlBar, pToolBar);
  120. // ASSERT(m_nIndex < m_nIndexMax);
  121. // if( pToolBar->IsRightExpandButton(m_nIndex) )
  122. // return;
  123. // CExtBarButton * pTBB = pToolBar->GetButton( m_nIndex );
  124. // ASSERT_VALID( pTBB );
  125. // CExtCustomizeCmdTreeNode * pNode = pTBB->GetCmdNode( false );
  126. // if( pNode == NULL )
  127. // return;
  128. // ASSERT_VALID( pNode );
  129. // if( lpszText == NULL )
  130. // lpszText = _T("");
  131. // LPCTSTR _strCurText = pNode->GetTextInToolbar( NULL, true );
  132. // if( _strCurText == NULL )
  133. // _strCurText = _T("");
  134. // if( _tcscmp( _strCurText, lpszText ) != 0 )
  135. // {
  136. // pNode->SetTextInToolbar( lpszText );
  137. // if( pToolBar->IsVisible() )
  138. // {
  139. // DWORD dwDisplayStyle = pNode->GetFlags()&__ECTN_DISPLAY_MASK;
  140. // if( dwDisplayStyle == __ECTN_DISPLAY_TEXTONLY_ALWAYS
  141. // || dwDisplayStyle == __ECTN_DISPLAY_TEXT_AND_IMAGE
  142. // )
  143. // {
  144. // CFrameWnd * pFrame = pToolBar->GetParentFrame();
  145. // if( pFrame != NULL )
  146. // pFrame->DelayRecalcLayout();
  147. // }
  148. // }
  149. // }
  150. //#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  151. };
  152. }; // class CExtToolControlBar::CExtToolControlBarCmdUI
  153. void CExtToolControlBar::CExtToolControlBarCmdUI::_SetCheckImpl(
  154. int nCheck,
  155. bool bUpdateInCmdManager
  156. )
  157. {
  158. bUpdateInCmdManager;
  159. ASSERT( nCheck >= 0 && nCheck <= 2 );
  160. CExtToolControlBar * pToolBar = (CExtToolControlBar*)m_pOther;
  161. ASSERT( pToolBar != NULL );
  162. ASSERT_KINDOF( CExtToolControlBar, pToolBar );
  163. ASSERT( m_nIndex < m_nIndexMax ); 
  164. if( pToolBar->IsRightExpandButton( m_nIndex ) )
  165. return;
  166. UINT nByttonStyle = pToolBar->GetButtonStyle( m_nIndex );
  167. UINT nNewStyle = nByttonStyle & (~(TBBS_CHECKED | TBBS_INDETERMINATE));
  168. if( nCheck == 1 )
  169. nNewStyle |= TBBS_CHECKED;
  170. else if( nCheck == 2 )
  171. nNewStyle |= TBBS_INDETERMINATE;
  172. ASSERT( ( nNewStyle & TBBS_SEPARATOR ) == 0 );
  173. pToolBar->SetButtonStyle(m_nIndex, nNewStyle | TBBS_CHECKBOX);
  174. // if( bUpdateInCmdManager )
  175. // {
  176. // CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr(
  177. // g_CmdManager->ProfileNameFromWnd( pToolBar->GetSafeHwnd() ),
  178. // pToolBar->GetButtonID(m_nIndex)
  179. // );
  180. // if( pCmdItem != NULL )
  181. // {
  182. // pCmdItem->StateSetCheck(
  183. // (nNewStyle &
  184. // (TBBS_CHECKED|TBBS_INDETERMINATE)
  185. // ) ? true : false
  186. // );
  187. // }
  188. // }
  189. }
  190. void CExtToolControlBar::CExtToolControlBarCmdUI::Enable( BOOL bOn )
  191. {
  192. CCmdUI::m_bEnableChanged = TRUE;
  193. CExtToolControlBar * pToolBar = (CExtToolControlBar*)m_pOther;
  194. ASSERT( pToolBar != NULL );
  195. ASSERT_KINDOF( CExtToolControlBar, pToolBar );
  196. ASSERT( m_nIndex < m_nIndexMax );
  197. if( pToolBar->IsRightExpandButton( m_nIndex ) )
  198. return;
  199. UINT nByttonStyle = pToolBar->GetButtonStyle( m_nIndex );
  200. UINT nNewStyle = nByttonStyle & (~(TBBS_DISABLED));
  201. if( ! bOn )
  202. nNewStyle |= TBBS_DISABLED;
  203. ASSERT( ( nNewStyle & TBBS_SEPARATOR ) == 0 );
  204. pToolBar->SetButtonStyle( m_nIndex, nNewStyle );
  205. //CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr(
  206. // g_CmdManager->ProfileNameFromWnd( pToolBar->GetSafeHwnd() ),
  207. // pToolBar->GetButtonID(m_nIndex)
  208. // );
  209. // if( pCmdItem != NULL )
  210. // pCmdItem->StateEnable( bOn ? true : false );
  211. }
  212. /////////////////////////////////////////////////////////////////////////////
  213. // CExtBarButton
  214. IMPLEMENT_DYNCREATE(CExtBarButton, CObject)
  215. CExtBarButton::CExtBarButton(
  216. CExtToolControlBar * pBar, // = NULL
  217. UINT nCmdID, // = ID_SEPARATOR
  218. UINT nStyle // = 0
  219. )
  220. : CExtAnimationClient( pBar )
  221. , m_nStyle( nStyle )
  222. , m_pBar( pBar )
  223. , m_pParentButton(NULL )
  224. , m_nButtonCmdID( ID_SEPARATOR )
  225. , m_nEffectiveCmdID( ID_SEPARATOR )
  226. , m_pCtrl( NULL )
  227. , m_bCtrlVisibleVert( false )
  228. , m_bCtrlAutoDestroyed( false )
  229. , m_ActiveSize( 0, 0 )
  230. , m_ActiveRect( 0, 0, 0, 0 )
  231. , m_bWrapH( false )
  232. , m_bWrapV( false )
  233. , m_bWrapF( false )
  234. , m_bHover( false )
  235. , m_bVisible(true )
  236. , m_bVertDocked( false )
  237. , m_hMenu( NULL )
  238. , m_bPopupMenu( false )
  239. , m_bAutoDestroyMenu( false )
  240. , m_bAppendMdiWindowsMenu( false )
  241. , m_bSeparatedDropDown( false )
  242. , m_bAutoChangeID( false )
  243. , m_bDropDownHT( false )
  244. , m_bNoRotateVerticalLayout( false )
  245. , m_bPressedTracking( false )
  246. , m_bDrawBorder( true )
  247. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  248. , m_pWndKeyTip( NULL )
  249. , m_pCmdNodeI( NULL )
  250. , m_pCmdNodeC( NULL )
  251. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  252. , m_nMaxButtonWidth( -1 )
  253. , m_nIconAlignment( -1 )
  254. , m_nTextAlignment( -1 )
  255. , m_rcIconMargins( -1, -1, -1, -1 )
  256. , m_rcTextMargins( -1, -1, -1, -1 )
  257. {
  258. SetCmdID( nCmdID );
  259. }
  260. CExtBarButton::~CExtBarButton()
  261. {
  262. CExtAnimationSite * pAcAS = AnimationClient_SiteGet();
  263. if( pAcAS != NULL )
  264. pAcAS->AnimationSite_ClientRemove( this );
  265. _DestroyMenu();
  266. m_arrChildren.RemoveAll();
  267. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  268. HDWP hPassiveModeDWP = NULL;
  269. OnKeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  270. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  271. CtrlSet( NULL, true ); // destroy attached window
  272. }
  273. void CExtBarButton::Show(
  274. bool bShow // = true
  275. )
  276. {
  277. ASSERT_VALID( this );
  278. m_bVisible = bShow;
  279. _UpdateCtrl();
  280. INT nIndex, nCount = ChildButtonGetCount();
  281. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  282. {
  283. CExtBarButton * pChildTBB = ChildButtonGetAt( nIndex );
  284. ASSERT_VALID( pChildTBB );
  285. pChildTBB->Show( bShow );
  286. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  287. }
  288. bool CExtBarButton::IsVisible() const
  289. {
  290. ASSERT_VALID( this );
  291. return m_bVisible; // && ( (m_nStyle & TBBS_HIDDEN) == 0 );
  292. }
  293. bool CExtBarButton::IsChildButton(
  294. const CExtBarButton * pTestChildTBB,
  295. bool bTestOneLevelOnly // = false
  296. ) const
  297. {
  298. ASSERT_VALID( this );
  299. ASSERT_VALID( pTestChildTBB );
  300. const CExtBarButton * pTBB = pTestChildTBB->ParentButtonGet();
  301. if( pTBB == NULL )
  302. return false;
  303. if( LPVOID(pTBB) == LPVOID(this) )
  304. return true;
  305. if( bTestOneLevelOnly )
  306. return false;
  307. bool bRetVal = IsChildButton( pTBB );
  308. return bRetVal;
  309. }
  310. CExtBarButton * CExtBarButton::ParentButtonGet()
  311. {
  312. ASSERT_VALID( this );
  313. #ifdef _DEBUG
  314. if( m_pParentButton != NULL )
  315. {
  316. ASSERT_VALID( m_pParentButton );
  317. }
  318. #endif // _DEBUG
  319. return m_pParentButton;
  320. }
  321. const CExtBarButton * CExtBarButton::ParentButtonGet() const
  322. {
  323. ASSERT_VALID( this );
  324. return
  325. ( const_cast < CExtBarButton * > ( this ) )
  326. -> ParentButtonGet();
  327. }
  328. void CExtBarButton::ParentButtonSet(
  329. CExtBarButton * pParentButton // = NULL
  330. )
  331. {
  332. ASSERT_VALID( this );
  333. m_pParentButton = pParentButton;
  334. #ifdef _DEBUG
  335. if( m_pParentButton != NULL )
  336. {
  337. ASSERT_VALID( m_pParentButton );
  338. }
  339. #endif // _DEBUG
  340. }
  341. INT CExtBarButton::ChildButtonGetCount() const
  342. {
  343. ASSERT_VALID( this );
  344. INT nCount = INT( m_arrChildren.GetSize() );
  345. return nCount;
  346. }
  347. CExtBarButton * CExtBarButton::ChildButtonGetAt( INT nPos )
  348. {
  349. ASSERT_VALID( this );
  350. if( nPos < 0 )
  351. return NULL;
  352. INT nCount = ChildButtonGetCount();
  353. if( nPos >= nCount )
  354. return NULL;
  355. CExtBarButton * pTBB = m_arrChildren.GetAt( nPos );
  356. #ifdef _DEBUG
  357. if( pTBB != NULL )
  358. {
  359. ASSERT_VALID( pTBB );
  360. CExtBarButton * pParentTBB = pTBB->ParentButtonGet();
  361. ASSERT( pParentTBB == NULL || pParentTBB == this );
  362. }
  363. #endif // _DEBUG
  364. return pTBB;
  365. }
  366. const CExtBarButton * CExtBarButton::ChildButtonGetAt( INT nPos ) const
  367. {
  368. ASSERT_VALID( this );
  369. return
  370. ( const_cast < CExtBarButton * > ( this ) )
  371. -> ChildButtonGetAt( nPos );
  372. }
  373. bool CExtBarButton::ChildButtonSetAt(
  374. INT nPos,
  375. CExtBarButton * pTBB
  376. )
  377. {
  378. ASSERT_VALID( this );
  379. ASSERT_VALID( pTBB );
  380. pTBB->ParentButtonSet( NULL );
  381. if( nPos < 0 )
  382. return false;
  383. INT nCount = ChildButtonGetCount();
  384. if( nPos >= nCount )
  385. return false;
  386. m_arrChildren.SetAt( nPos, pTBB );
  387. pTBB->ParentButtonSet( this );
  388. return true;
  389. }
  390. void CExtBarButton::ChildButtonInsertAt(
  391. INT nPos,
  392. CExtBarButton * pTBB
  393. )
  394. {
  395. ASSERT_VALID( this );
  396. ASSERT_VALID( pTBB );
  397. pTBB->ParentButtonSet( NULL );
  398. INT nCount = ChildButtonGetCount();
  399. if( nPos < 0 || nPos > nCount )
  400. nPos = nCount;
  401. m_arrChildren.InsertAt( nPos, pTBB );
  402. pTBB->ParentButtonSet( this );
  403. }
  404. void CExtBarButton::ChildButtonAdd(
  405. CExtBarButton * pTBB
  406. )
  407. {
  408. ASSERT_VALID( this );
  409. ChildButtonInsertAt( -1, pTBB );
  410. }
  411. bool CExtBarButton::ChildButtonRemove(
  412. CExtBarButton * pTBB,
  413. bool bDestroy // = false
  414. )
  415. {
  416. ASSERT_VALID( this );
  417. INT nPos = ChildButtonGetIndexOf( pTBB );
  418. if( nPos < 0 )
  419. return false;
  420. ChildButtonRemoveAt( nPos, 1, bDestroy );
  421. return true;
  422. }
  423. void CExtBarButton::ChildButtonRemoveAll(
  424. bool bDestroy // = false
  425. )
  426. {
  427. ASSERT_VALID( this );
  428. ChildButtonRemoveAt( 0, -1, bDestroy );
  429. }
  430. INT CExtBarButton::ChildButtonRemoveAt(
  431. INT nPos,
  432. INT nCountToRemove, // = 1 // -1 remove up to end
  433. bool bDestroy // = false
  434. )
  435. {
  436. ASSERT_VALID( this );
  437. CExtToolControlBar * pBar = GetBar();
  438. ASSERT_VALID( pBar );
  439. if( nCountToRemove == 0 )
  440. return 0;
  441. if( nPos < 0 )
  442. return 0;
  443. INT nCount = ChildButtonGetCount();
  444. if( nPos >= nCount )
  445. return 0;
  446. if( nCountToRemove < 0 )
  447. nCountToRemove = nCount;
  448. if( ( nPos + nCountToRemove ) > nCount )
  449. nCountToRemove = nCount - nPos;
  450. if( nCountToRemove == 0 )
  451. return 0;
  452. if( bDestroy )
  453. {
  454. INT nIndex;
  455. for( nIndex = 0; nIndex < nCountToRemove; nIndex ++ )
  456. {
  457. CExtBarButton * pTBB = m_arrChildren[ nPos + nIndex ];
  458. ASSERT_VALID( pTBB );
  459. pBar->AnimationSite_ClientRemove( pTBB );
  460. delete pTBB;
  461. } // for( nIndex = 0; nIndex < nCountToRemove; nIndex ++ )
  462. } // if( bDestroy )
  463. m_arrChildren.RemoveAt( nPos, nCountToRemove );
  464. return nCountToRemove;
  465. }
  466. INT CExtBarButton::ChildButtonGetIndexOf(
  467. const CExtBarButton * pTBB
  468. ) const
  469. {
  470. ASSERT_VALID( this );
  471. if( pTBB == NULL )
  472. return -1;
  473. ASSERT_VALID( pTBB );
  474. INT nIndex, nCount = ChildButtonGetCount();
  475. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  476. {
  477. const CExtBarButton * pChildTBB = ChildButtonGetAt( nIndex );
  478. ASSERT_VALID( pChildTBB );
  479. if( pChildTBB == pTBB )
  480. return nIndex;
  481. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  482. return -1;
  483. }
  484. CExtToolControlBar * CExtBarButton::GetSafeBar()
  485. {
  486. if( this == NULL )
  487. return NULL;
  488. ASSERT_VALID( this );
  489. CExtToolControlBar * pBar = GetBar();
  490. ASSERT( pBar != NULL );
  491. return pBar;
  492. }
  493. const CExtToolControlBar * CExtBarButton::GetSafeBar() const
  494. {
  495. return 
  496. ( const_cast < CExtBarButton * > ( this ) ) -> GetSafeBar();
  497. }
  498. CExtToolControlBar * CExtBarButton::GetBar()
  499. {
  500. ASSERT_VALID( this );
  501. return m_pBar;
  502. }
  503. const CExtToolControlBar * CExtBarButton::GetBar() const
  504. {
  505. ASSERT_VALID( this );
  506. return 
  507. ( const_cast < CExtBarButton * > ( this ) ) -> GetBar();
  508. }
  509. void CExtBarButton::SetBar( CExtToolControlBar * pBar )
  510. {
  511. ASSERT_VALID( this );
  512. m_pBar = pBar;
  513. INT nChildIndex, nChildCount = ChildButtonGetCount();
  514. for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  515. {
  516. CExtBarButton * pTBB = ChildButtonGetAt( nChildIndex );
  517. ASSERT_VALID( pTBB );
  518. pTBB->SetBar( pBar );
  519. } // for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  520. }
  521. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  522. bool CExtBarButton::IsRibbonPaintingMode() const
  523. {
  524. ASSERT_VALID( this );
  525. const CExtToolControlBar * pBar = GetBar();
  526. if( pBar == NULL )
  527. return false;
  528. if( ! pBar->IsKindOf( RUNTIME_CLASS( CExtRibbonPage ) ) )
  529. return false;
  530. return true;
  531. }
  532. bool CExtBarButton::IsNoRibbonLayout() const
  533. {
  534. ASSERT_VALID( this );
  535. return false;
  536. }
  537. CExtRibbonNode * CExtBarButton::Ribbon_GetNode(
  538. bool bInitial // = false
  539. )
  540. {
  541. ASSERT_VALID( this );
  542. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( bInitial );
  543. if( pNode == NULL )
  544. return NULL;
  545. ASSERT_VALID( pNode );
  546. CExtRibbonNode * pRibbonNode = DYNAMIC_DOWNCAST( CExtRibbonNode, pNode );
  547. return pRibbonNode;
  548. }
  549. const CExtRibbonNode * CExtBarButton::Ribbon_GetNode(
  550. bool bInitial // = false
  551. ) const
  552. {
  553. ASSERT_VALID( this );
  554. return
  555. ( const_cast < CExtBarButton * > ( this ) )
  556. -> Ribbon_GetNode( bInitial );
  557. }
  558. CSize CExtBarButton::RibbonILV_CalcSize(
  559. CDC & dc,
  560. INT nILV // = -1 // -1 use current visual level
  561. ) const
  562. {
  563. ASSERT_VALID( this );
  564. ASSERT( dc.GetSafeHdc() != NULL );
  565. dc;
  566. if( ! IsVisible() )
  567. return CSize( 0, 0 );
  568. if( (GetStyle()&TBBS_HIDDEN) != 0 )
  569. return CSize( 0, 0 );
  570. CSize _size =
  571. GetBar() ->
  572. PmBridge_GetPM() ->
  573. Ribbon_CalcButtonSize( dc, nILV, this );
  574. return _size;
  575. }
  576. bool CExtBarButton::RibbonWrapFromILE( INT nILE ) const
  577. {
  578. ASSERT_VALID( this );
  579. ASSERT(
  580. __EXT_RIBBON_ILE_MIN <= nILE
  581. && nILE <= __EXT_RIBBON_ILE_MAX
  582. );
  583. const CExtRibbonNode * pRibbonNode = Ribbon_GetNode();
  584. if( pRibbonNode == NULL )
  585. return false;
  586. bool bRibbonWrap = pRibbonNode->RibbonWrapFromILE( nILE );
  587. return bRibbonWrap;
  588. }
  589. INT CExtBarButton::RibbonILV_fromILE(
  590. INT nILE,
  591. bool * p_bIsWrap // = NULL
  592. ) const
  593. {
  594. ASSERT_VALID( this );
  595. ASSERT(
  596. __EXT_RIBBON_ILE_MIN <= nILE
  597. && nILE <= __EXT_RIBBON_ILE_MAX
  598. );
  599. const CExtRibbonNode * pRibbonNode = Ribbon_GetNode();
  600. if( pRibbonNode == NULL )
  601. return __EXT_RIBBON_ILV_SIMPLE_MAX;
  602. INT nILV = pRibbonNode->RibbonILV_fromILE( nILE, p_bIsWrap );
  603. return nILV;
  604. }
  605. INT CExtBarButton::RibbonILV_Get(
  606. INT nType // = 0 // -1 min, 0 current, 1 - max
  607. ) const
  608. {
  609. ASSERT_VALID( this );
  610. const CExtRibbonNode * pRibbonNode = Ribbon_GetNode();
  611. if( pRibbonNode == NULL )
  612. return __EXT_RIBBON_ILV_SIMPLE_MAX;
  613. const CExtCustomizeCmdTreeNode * pParentNode = pRibbonNode->GetParentNode();
  614. if( pParentNode != NULL
  615. && ( pParentNode->IsKindOf( RUNTIME_CLASS( CExtRibbonNodeRightButtonsCollection ) )
  616. || pParentNode->IsKindOf( RUNTIME_CLASS( CExtRibbonNodeQuickAccessButtonsCollection ) )
  617. )
  618. )
  619. return __EXT_RIBBON_ILV_SIMPLE_MIN;
  620. INT nILV = pRibbonNode->RibbonILV_Get( nType );
  621. return nILV;
  622. }
  623. void CExtBarButton::RibbonILV_Set(
  624. INT nILV,
  625. INT nType // = 0, // -1 min, 0 current, 1 - max
  626. )
  627. {
  628. ASSERT_VALID( this );
  629. CExtRibbonNode * pRibbonNode = Ribbon_GetNode();
  630. if( pRibbonNode == NULL )
  631. return;
  632. pRibbonNode->RibbonILV_Set( nILV, nType );
  633. }
  634. INT CExtBarButton::RibbonILE_Get() const
  635. {
  636. ASSERT_VALID( this );
  637. const CExtRibbonNode * pRibbonNode = Ribbon_GetNode();
  638. if( pRibbonNode == NULL )
  639. return __EXT_RIBBON_ILE_MAX;
  640. INT nILE = pRibbonNode->RibbonILE_Get();
  641. return nILE;
  642. }
  643. bool CExtBarButton::RibbonILE_Set( INT nILE ) // returns flag indicating whether ILV changed
  644. {
  645. ASSERT_VALID( this );
  646. CExtRibbonNode * pRibbonNode = Ribbon_GetNode();
  647. if( pRibbonNode == NULL )
  648. return false;
  649. bool bRetVal = pRibbonNode->RibbonILE_Set( nILE );
  650. return bRetVal;
  651. }
  652. INT CExtBarButton::RibbonILE_GetCollapsed() const
  653. {
  654. ASSERT_VALID( this );
  655. const CExtRibbonNode * pRibbonNode = Ribbon_GetNode();
  656. if( pRibbonNode == NULL )
  657. return __EXT_RIBBON_ILE_MAX;
  658. INT nILE = pRibbonNode->RibbonILE_GetCollapsed();
  659. return nILE;
  660. }
  661. bool CExtBarButton::RibbonILE_SetCollapsed( INT nILE ) // returns flag indicating whether collapsed state changed
  662. {
  663. ASSERT_VALID( this );
  664. CExtRibbonNode * pRibbonNode = Ribbon_GetNode();
  665. if( pRibbonNode == NULL )
  666. return false;
  667. pRibbonNode->RibbonILE_SetCollapsed( nILE );
  668. return false;
  669. }
  670. CRect CExtBarButton::OnRibbonGetContentPadding() const
  671. {
  672. ASSERT_VALID( this );
  673. // return CRect( 0, 0, 0, 0 );
  674. CRect rcContentPadding = GetBar()->PmBridge_GetPM()->Ribbon_GetContentPadding( this );
  675. return rcContentPadding;
  676. }
  677. void CExtBarButton::OnRibbonAlignContent( CDC & dc )
  678. {
  679. ASSERT_VALID( this );
  680. INT nChildIndex, nChildCount = ChildButtonGetCount();
  681. for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  682. {
  683. CExtBarButton * pTBB = ChildButtonGetAt( nChildIndex );
  684. ASSERT_VALID( pTBB );
  685. if( ! pTBB->IsVisible() )
  686. continue;
  687. if( ( pTBB->GetStyle() & TBBS_HIDDEN ) != 0 )
  688. continue;
  689. pTBB->OnRibbonAlignContent( dc );
  690. } // for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  691. }
  692. INT CExtBarButton::OnRibbonGetSeparatorExtent( bool bHorz )
  693. {
  694. ASSERT_VALID( this );
  695. bHorz;
  696. return 2;
  697. }
  698. void CExtBarButton::OnRibbonCalcMinMaxILE( INT & nMinILE, INT & nMaxILE )
  699. {
  700. ASSERT_VALID( this );
  701. bool bWrap = false;
  702. INT nILV = 32761;
  703. INT nILE = __EXT_RIBBON_ILE_MAX;
  704. for( ; true; nILE-- )
  705. {
  706. bool bLastWrap = false;
  707. INT nNextILV =
  708. RibbonILV_fromILE(
  709. nILE,
  710. &bLastWrap
  711. );
  712. if( nNextILV != nILV
  713. || ( bWrap && ( ! bLastWrap ) )
  714. || ( ( ! bWrap ) && bLastWrap )
  715. )
  716. {
  717. nILV = nNextILV;
  718. bWrap = bLastWrap;
  719. if( nMinILE > nILE )
  720. nMinILE = nILE;
  721. if( nMaxILE < nILE )
  722. nMaxILE = nILE;
  723. }
  724. if( nILE == __EXT_RIBBON_ILE_MIN )
  725. break;
  726. } // for( ; true; nILE-- )
  727. INT nIndex, nCount = ChildButtonGetCount();
  728. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  729. {
  730. CExtBarButton * pChildTBB = ChildButtonGetAt( nIndex );
  731. ASSERT_VALID( pChildTBB );
  732. pChildTBB->OnRibbonCalcMinMaxILE( nMinILE, nMaxILE );
  733. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  734. }
  735. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  736. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  737. CExtCustomizeCmdKeyTip * CExtBarButton::OnKeyTipGetInfo()
  738. {
  739. ASSERT_VALID( this );
  740. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  741. if( pNode != NULL )
  742. {
  743. ASSERT_VALID( pNode );
  744. CExtCustomizeCmdKeyTip * pCmdKeyTip = pNode->CmdKeyTipGet();
  745. return pCmdKeyTip;
  746. }
  747. return NULL;
  748. }
  749. CExtSafeString CExtBarButton::OnKeyTipGetText(
  750. INT nIndent
  751. )
  752. {
  753. ASSERT_VALID( this );
  754. CExtSafeString strKeyTipText( _T("") );
  755. CExtCustomizeCmdKeyTip * pCmdKeyTip = OnKeyTipGetInfo();
  756. if( pCmdKeyTip != NULL )
  757. strKeyTipText = pCmdKeyTip->GetTipText( nIndent );
  758. return strKeyTipText;
  759. }
  760. CWnd * CExtBarButton::OnKeyTipGetParentWnd()
  761. {
  762. ASSERT_VALID( this );
  763. CExtToolControlBar * pToolBar = GetBar();
  764. ASSERT_VALID( pToolBar );
  765. ASSERT( pToolBar->GetSafeHwnd() != NULL );
  766. if( pToolBar->m_pDockSite != NULL )
  767. return pToolBar->GetParentFrame();
  768. CWnd * pWnd = pToolBar->GetParent();
  769. for( ; pWnd != NULL; pWnd = pWnd->GetParent() )
  770. {
  771. if( ( pWnd->GetStyle() & WS_CHILD ) == 0 )
  772. return pWnd;
  773. }
  774. return NULL;
  775. }
  776. CPoint CExtBarButton::OnKeyTipGetGuideLines()
  777. {
  778. ASSERT_VALID( this );
  779. CExtToolControlBar * pToolBar = GetBar();
  780. ASSERT_VALID( pToolBar );
  781. ASSERT( pToolBar->GetSafeHwnd() != NULL );
  782. CRect rcTBB = *this;
  783. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  784. CExtRibbonPage * pRibbonPage = DYNAMIC_DOWNCAST( CExtRibbonPage, pToolBar );
  785. if( pRibbonPage != NULL )
  786. {
  787. INT nILV = RibbonILV_Get();
  788. if( nILV < __EXT_RIBBON_ILV_SIMPLE_LARGE )
  789. {
  790. INT nTabLineHeight = pRibbonPage->RibbonLayout_GetTabLineHeight();
  791. INT nFrameCaptionHeight = pRibbonPage->RibbonLayout_GetFrameCaptionHeight();
  792. INT nHeightAtTheTop = nTabLineHeight + nFrameCaptionHeight;
  793. INT nBottomLineHeight = pRibbonPage->RibbonLayout_GetBottomLineHeight();
  794. CRect rcClient;
  795. pRibbonPage->GetClientRect( &rcClient );
  796. CExtPaintManager * pPM = pRibbonPage->PmBridge_GetPM();
  797. ASSERT_VALID( pPM );
  798. INT nCaptionHeight = pPM->Ribbon_GroupCaptionGetHeight( NULL );
  799. bool bCaptionAtTop = pRibbonPage->RibbonLayout_GroupCaptionIsTopAligned( NULL );
  800. if( bCaptionAtTop )
  801. rcClient.top += nCaptionHeight;
  802. else
  803. rcClient.bottom -= nCaptionHeight;
  804. CRect rcPageBk = rcClient;
  805. rcPageBk.top += nHeightAtTheTop;
  806. rcPageBk.bottom -= nBottomLineHeight;
  807. CPoint ptCenter = rcTBB.CenterPoint();
  808. if( rcPageBk.PtInRect( ptCenter ) )
  809. {
  810. pToolBar->ClientToScreen( &rcTBB );
  811. INT nHeight3 = rcPageBk.Height() / 3;
  812. if( rcPageBk.top <= ptCenter.y
  813. && ptCenter.y < ( rcPageBk.top + nHeight3 )
  814. )
  815. {
  816. CPoint ptGuideLines(
  817. ( nILV == __EXT_RIBBON_ILV_SIMPLE_NORMAL )
  818. ? ( rcTBB.left + pPM->UiScalingDo( 18, CExtPaintManager::__EUIST_X ) )
  819. : ( rcTBB.left + rcTBB.Width() / 2 )
  820. ,
  821. rcTBB.top
  822. );
  823. return ptGuideLines;
  824. }
  825. if( ( rcPageBk.top + nHeight3 ) <= ptCenter.y
  826. && ptCenter.y < ( rcPageBk.bottom - nHeight3 )
  827. )
  828. {
  829. CPoint ptGuideLines(
  830. ( nILV == __EXT_RIBBON_ILV_SIMPLE_NORMAL )
  831. ? ( rcTBB.left + pPM->UiScalingDo( 18, CExtPaintManager::__EUIST_X ) )
  832. : ( rcTBB.left + rcTBB.Width() / 2 )
  833. ,
  834. rcTBB.top + rcTBB.Height() / 2
  835. );
  836. return ptGuideLines;
  837. }
  838. CPoint ptGuideLines(
  839. ( nILV == __EXT_RIBBON_ILV_SIMPLE_NORMAL )
  840. ? ( rcTBB.left + pPM->UiScalingDo( 18, CExtPaintManager::__EUIST_X ) )
  841. : ( rcTBB.left + rcTBB.Width() / 2 )
  842. ,
  843. rcTBB.bottom 
  844. );
  845. return ptGuideLines;
  846. } // if( rcPageBk.PtInRect( ptCenter ) )
  847. } // if( nILV < __EXT_RIBBON_ILV_SIMPLE_LARGE )
  848. } // if( pRibbonPage != NULL )
  849. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  850. pToolBar->ClientToScreen( &rcTBB );
  851. CPoint ptGuideLines(
  852. rcTBB.left + rcTBB.Width() / 2,
  853. rcTBB.bottom 
  854. );
  855. return ptGuideLines;
  856. }
  857. CExtPopupKeyTipWnd * CExtBarButton::OnKeyTipGetWnd()
  858. {
  859. ASSERT_VALID( this );
  860. #ifdef _DEBUG
  861. if( m_pWndKeyTip != NULL )
  862. {
  863. ASSERT_VALID( m_pWndKeyTip );
  864. }
  865. #endif // _DEBUG
  866. return m_pWndKeyTip;
  867. }
  868. void CExtBarButton::OnKeyTipTrackingQuery(
  869. bool bShow,
  870. CExtCustomizeCmdKeyTip * pKeyTipChain,
  871. HDWP & hPassiveModeDWP
  872. )
  873. {
  874. ASSERT_VALID( this );
  875. CExtToolControlBar * pToolBar = GetBar();
  876. ASSERT_VALID( pToolBar );
  877. if( bShow )
  878. {
  879. ASSERT_VALID( pKeyTipChain );
  880. if( ( ! IsVisible() )
  881. || ( GetStyle() & TBBS_HIDDEN ) != 0
  882. || pToolBar->GetSafeHwnd() == NULL
  883. || ( ! pToolBar->IsVisible() )
  884. )
  885. {
  886. OnKeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  887. return;
  888. }
  889. INT nIndent = pKeyTipChain->KeyCodeGetCount();
  890. CExtSafeString strKeyTipText = OnKeyTipGetText( nIndent );
  891. if( strKeyTipText.IsEmpty() )
  892. {
  893. OnKeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  894. return;
  895. }
  896. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  897. CExtBarButton * pCheckTBB = ParentButtonGet();
  898. for( ; pCheckTBB != NULL; )
  899. {
  900. ASSERT_VALID( pCheckTBB );
  901. CExtBarButton * pParentTBB = pCheckTBB->ParentButtonGet();
  902. if( pParentTBB == NULL
  903. && pCheckTBB->IsKindOf( RUNTIME_CLASS(CExtRibbonButtonGroup) )
  904. && ((CExtRibbonButtonGroup*)pCheckTBB)->TopCollapsedStateGet()
  905. )
  906. {
  907. OnKeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  908. return;
  909. }
  910. pCheckTBB = pParentTBB;
  911. }
  912. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  913. if( m_pWndKeyTip == NULL )
  914. {
  915. try
  916. {
  917. m_pWndKeyTip = new CExtPopupKeyTipWnd;
  918. }
  919. catch( CException * pException )
  920. {
  921. pException->Delete();
  922. return;
  923. }
  924. } // if( m_pWndKeyTip == NULL )
  925. #ifdef _DEBUG
  926. else
  927. {
  928. ASSERT_VALID( m_pWndKeyTip );
  929. } // else from if( m_pWndKeyTip == NULL )
  930. #endif // _DEBUG
  931. CWnd * pWndKeyTipParent = OnKeyTipGetParentWnd();
  932. ASSERT_VALID( pWndKeyTipParent );
  933. ASSERT( pWndKeyTipParent->GetSafeHwnd() != NULL );
  934. CPoint ptGuideLines = OnKeyTipGetGuideLines();
  935. if( ! m_pWndKeyTip->Create(
  936. pWndKeyTipParent,
  937. ptGuideLines,
  938. strKeyTipText,
  939. IsEnabled(),
  940. hPassiveModeDWP
  941. )
  942. )
  943. {
  944. OnKeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  945. return;
  946. }
  947. if( hPassiveModeDWP == NULL )
  948. m_pWndKeyTip->ShowWindow( SW_SHOWNOACTIVATE );
  949. } // if( bShow )
  950. else
  951. {
  952. if( m_pWndKeyTip != NULL )
  953. {
  954. ASSERT_VALID( m_pWndKeyTip );
  955. m_pWndKeyTip->Hide();
  956. delete m_pWndKeyTip;
  957. m_pWndKeyTip = NULL;
  958. } // if( m_pWndKeyTip != NULL )
  959. } // else from if( bShow )
  960. }
  961. void CExtBarButton::OnKeyTipTrackingQueryNested(
  962. bool bShow,
  963. CExtCustomizeCmdKeyTip * pKeyTipChain,
  964. bool bApplyToThisItem,
  965. HDWP & hPassiveModeDWP
  966. )
  967. {
  968. ASSERT_VALID( this );
  969. if( bApplyToThisItem )
  970. OnKeyTipTrackingQuery( bShow, pKeyTipChain, hPassiveModeDWP );
  971. INT nChildIndex, nChildCount = ChildButtonGetCount();
  972. for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  973. {
  974. CExtBarButton * pTBB = ChildButtonGetAt( nChildIndex );
  975. ASSERT_VALID( pTBB );
  976. pTBB->OnKeyTipTrackingQueryNested( bShow, pKeyTipChain, true, hPassiveModeDWP );
  977. } // for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  978. }
  979. bool CExtBarButton::OnKeyTipTranslate(
  980. DWORD dwKeyCode,
  981. CExtCustomizeCmdKeyTip * pKeyTipChain,
  982. bool bAutoInvokeAction,
  983. bool & bActionInvoked,
  984. bool & bContinueKeyTipMode
  985. )
  986. {
  987. ASSERT_VALID( this );
  988. bActionInvoked = false;
  989. CExtToolControlBar * pToolBar = GetBar();
  990. if( pToolBar->GetSafeHwnd() == NULL )
  991. return false;
  992. ASSERT_VALID( pToolBar );
  993. if( ! IsVisible() )
  994. return false;
  995. if( ( GetStyle() & TBBS_HIDDEN ) != 0 )
  996. return false;
  997. if( IsDisabled() )
  998. return false;
  999. CExtCustomizeCmdKeyTip * pCmdKeyTip = OnKeyTipGetInfo();
  1000. if( pCmdKeyTip == NULL )
  1001. return false;
  1002. CExtPopupKeyTipWnd * pWndKeyTip = OnKeyTipGetWnd();
  1003. if( pWndKeyTip->GetSafeHwnd() == NULL
  1004. || ( pWndKeyTip->GetStyle() & WS_VISIBLE ) == 0
  1005. )
  1006. return false;
  1007. if( ! pCmdKeyTip->CompareWidthChain( *pKeyTipChain ) )
  1008. return false;
  1009. INT nKeyCodeCountOwn = pCmdKeyTip->KeyCodeGetCount();
  1010. INT nKeyCodeCountChain = pKeyTipChain->KeyCodeGetCount();
  1011. ASSERT( nKeyCodeCountOwn > nKeyCodeCountChain );
  1012. DWORD dwKeyCodeOwn = pCmdKeyTip->KeyCodeGetAt( nKeyCodeCountChain );
  1013. if( dwKeyCodeOwn != dwKeyCode )
  1014. return false;
  1015. pKeyTipChain->KeyCodeAdd( dwKeyCode );
  1016. nKeyCodeCountChain++;
  1017. if( nKeyCodeCountOwn > nKeyCodeCountChain )
  1018. return true;
  1019. if( bAutoInvokeAction )
  1020. bActionInvoked = OnKeyTipInvokeAction( bContinueKeyTipMode );
  1021. return true;
  1022. }
  1023. void CExtBarButton::OnKeyTipDisplay(
  1024. CExtCustomizeCmdKeyTip & keyTipChain
  1025. )
  1026. {
  1027. ASSERT_VALID( this );
  1028. CExtToolControlBar * pToolBar = GetBar();
  1029. if( pToolBar->GetSafeHwnd() == NULL )
  1030. return;
  1031. ASSERT_VALID( pToolBar );
  1032. if( ! IsVisible() )
  1033. return;
  1034. if( ( GetStyle() & TBBS_HIDDEN ) != 0 )
  1035. return;
  1036. // if( IsDisabled() )
  1037. // return;
  1038. CExtCustomizeCmdKeyTip * pCmdKeyTip = OnKeyTipGetInfo();
  1039. if( pCmdKeyTip == NULL )
  1040. return;
  1041. CExtPopupKeyTipWnd * pWndKeyTip = OnKeyTipGetWnd();
  1042. if( pWndKeyTip->GetSafeHwnd() == NULL
  1043. || ( pWndKeyTip->GetStyle() & WS_VISIBLE ) == 0
  1044. )
  1045. return;
  1046. if( pCmdKeyTip->CompareWidthChain( keyTipChain ) )
  1047. return;
  1048. pWndKeyTip->ShowWindow( SW_HIDE );
  1049. }
  1050. bool CExtBarButton::OnKeyTipInvokeAction(
  1051. bool & bContinueKeyTipMode
  1052. )
  1053. {
  1054. ASSERT_VALID( this );
  1055. if( IsAbleToTrackMenu() )
  1056. {
  1057. bContinueKeyTipMode = true;
  1058. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  1059. CRect rcTBB = *this;
  1060. CPoint pt( rcTBB.right - 1, rcTBB.bottom - 1 );
  1061. //CList < HWND, HWND > _listHwndTipsDelayedHide;
  1062. CExtToolControlBar * pToolBar = GetBar();
  1063. ASSERT( pToolBar->GetSafeHwnd() != NULL );
  1064. ASSERT_VALID( pToolBar );
  1065. /*
  1066. int nBtnIdx, nCountOfButtons = pToolBar->GetButtonsCount();
  1067. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  1068. {
  1069. CExtBarButton * pTBB = pToolBar->GetButton( nBtnIdx );
  1070. ASSERT_VALID( pTBB );
  1071. CExtPopupKeyTipWnd * pWndKeyTip = pTBB->OnKeyTipGetWnd();
  1072. if( pWndKeyTip->GetSafeHwnd() == NULL
  1073. // || ( pWndKeyTip->GetStyle() & WS_VISIBLE ) == 0
  1074. )
  1075. continue;
  1076. //_listHwndTipsDelayedHide.AddTail( pWndKeyTip->m_hWnd );
  1077. //pWndKeyTip->ShowWindow( SW_HIDE );
  1078. pTBB->OnKeyTipTrackingQuery( false );
  1079. }
  1080. */
  1081. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  1082. if( IsKindOf( RUNTIME_CLASS(CExtRibbonButtonGroup) )
  1083. && ((CExtRibbonButtonGroup*)this)->TopCollapsedStateGet()
  1084. )
  1085. {
  1086. int nBtnIdx, nCountOfButtons = pToolBar->GetButtonsCount();
  1087. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  1088. {
  1089. CExtBarButton * pTBB = pToolBar->GetButton( nBtnIdx );
  1090. ASSERT_VALID( pTBB );
  1091. CExtPopupKeyTipWnd * pWndKeyTip = pTBB->OnKeyTipGetWnd();
  1092. if( pWndKeyTip->GetSafeHwnd() == NULL )
  1093. continue;
  1094. HDWP hPassiveModeDWP = NULL;
  1095. pTBB->OnKeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  1096. }
  1097. }
  1098. else
  1099. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  1100. {
  1101. CExtMenuControlBar * pMenuBar = DYNAMIC_DOWNCAST( CExtMenuControlBar, pToolBar );
  1102. if( pMenuBar != NULL )
  1103. pMenuBar->_CancelFlatTracking( FALSE );
  1104. else
  1105. pToolBar->OnFlatTrackingStop();
  1106. }
  1107. pToolBar->Invalidate();
  1108. //pToolBar->UpdateWindow();
  1109. CExtPaintManager::stat_PassPaintMessages();
  1110. pToolBar->KeyTipsDisplayedSet( true );
  1111. OnTrackPopup( pt, true, true );
  1112. pToolBar->KeyTipsDisplayedSet( false );
  1113. return true;
  1114. }
  1115. bContinueKeyTipMode = false;
  1116. CWnd * pCtrl = CtrlGet();
  1117. if( pCtrl != NULL
  1118. && ( pCtrl->GetStyle() & WS_VISIBLE ) != 0
  1119. )
  1120. {
  1121. ASSERT_VALID( pCtrl );
  1122. CExtToolControlBar * pBar = GetSafeBar();
  1123. ASSERT_VALID( pBar );
  1124. if( CWnd::GetCapture() == pBar )
  1125. pBar->SendMessage( WM_CANCELMODE );
  1126. pCtrl->SetFocus();
  1127. return true;
  1128. }
  1129. OnDeliverCmd();
  1130. return true;
  1131. }
  1132. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  1133. void CExtBarButton::OnFlatTrackingStart(
  1134. HDWP & hPassiveModeDWP
  1135. )
  1136. {
  1137. ASSERT_VALID( this );
  1138. hPassiveModeDWP;
  1139. CExtToolControlBar * pBar = GetSafeBar();
  1140. if( pBar == NULL )
  1141. return;
  1142. ASSERT_VALID( pBar );
  1143. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1144. OnKeyTipTrackingQuery( true, &(pBar->KeyTipChainGet()), hPassiveModeDWP );
  1145. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  1146. }
  1147. void CExtBarButton::OnFlatTrackingStop()
  1148. {
  1149. ASSERT_VALID( this );
  1150. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1151. HDWP hPassiveModeDWP = NULL;
  1152. OnKeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  1153. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  1154. }
  1155. bool CExtBarButton::OnQueryFlatTrackingEnabled() const
  1156. {
  1157. ASSERT_VALID( this );
  1158. if( ! IsVisible() )
  1159. return false;
  1160. if( ( GetStyle() & TBBS_HIDDEN ) != 0 )
  1161. return false;
  1162. if( IsSeparator() )
  1163. return false;
  1164. if( ChildButtonGetCount() > 0 )
  1165. return false;
  1166. return true;
  1167. }
  1168. CRect CExtBarButton::OnQueryFlatWalkingCalcRect() const
  1169. {
  1170. ASSERT_VALID( this );
  1171. CRect rcOwn = *this;
  1172. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  1173. if( OnQueryFlatTrackingEnabled() )
  1174. {
  1175. const CExtBarButton * pParentTBB = ParentButtonGet();
  1176. if( pParentTBB != NULL
  1177. && pParentTBB->ParentButtonGet() == NULL
  1178. && pParentTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonGroup ) )
  1179. && (! pParentTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonToolGroup ) ) )
  1180. )
  1181. {
  1182. ASSERT_VALID( pParentTBB );
  1183. INT nSiblingIndex, nSavedSiblingIndex = pParentTBB->ChildButtonGetIndexOf( this );
  1184. INT nSiblingCount = pParentTBB->ChildButtonGetCount();
  1185. ASSERT( 0 <= nSavedSiblingIndex && nSavedSiblingIndex < nSiblingCount );
  1186. for( nSiblingIndex = nSavedSiblingIndex; nSiblingIndex < nSiblingCount; nSiblingIndex ++ )
  1187. {
  1188. const CExtBarButton * pTBB = pParentTBB->ChildButtonGetAt( nSiblingIndex );
  1189. ASSERT_VALID( pTBB );
  1190. if( ! pTBB->OnQueryFlatTrackingEnabled() )
  1191. continue;
  1192. if( pTBB->IsWrap( __EVT_FLOAT ) )
  1193. break;
  1194. CRect rcTBB = *pTBB;
  1195. rcOwn.left = min( rcOwn.left, rcTBB.left );
  1196. rcOwn.right = max( rcOwn.right, rcTBB.right );
  1197. } // for( nSiblingIndex = nSavedSiblingIndex; nSiblingIndex < nSiblingCount; nSiblingIndex ++ )
  1198. for( nSiblingIndex = nSavedSiblingIndex; nSiblingIndex > 0; nSiblingIndex -- )
  1199. {
  1200. const CExtBarButton * pTBB = pParentTBB->ChildButtonGetAt( nSiblingIndex - 1 );
  1201. ASSERT_VALID( pTBB );
  1202. if( ! pTBB->OnQueryFlatTrackingEnabled() )
  1203. continue;
  1204. if( pTBB->IsWrap( __EVT_FLOAT ) )
  1205. break;
  1206. CRect rcTBB = *pTBB;
  1207. rcOwn.left = min( rcOwn.left, rcTBB.left );
  1208. rcOwn.right = max( rcOwn.right, rcTBB.right );
  1209. } // for( nSiblingIndex = nSavedSiblingIndex; nSiblingIndex > 0; nSiblingIndex -- )
  1210. } // if( pParentTBB != NULL ...
  1211. } // if( OnQueryFlatTrackingEnabled() )
  1212. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  1213. return rcOwn;
  1214. }
  1215. void CExtBarButton::_DestroyMenu()
  1216. {
  1217. if( m_hMenu == NULL )
  1218. return;
  1219. if( m_bAutoDestroyMenu )
  1220. {
  1221. ASSERT( ::IsMenu(m_hMenu) );
  1222. VERIFY( ::DestroyMenu(m_hMenu) );
  1223. }
  1224. m_hMenu = NULL;
  1225. }
  1226. bool CExtBarButton::IsSeparator() const
  1227. {
  1228. ASSERT_VALID( this );
  1229. bool bSeparator =
  1230. (GetStyle() & TBBS_SEPARATOR) ?
  1231. true : false;
  1232. return bSeparator;
  1233. }
  1234. bool CExtBarButton::IsDisabled() const
  1235. {
  1236. ASSERT_VALID( this );
  1237. bool bDisabled =
  1238. (GetStyle() & TBBS_DISABLED) ?
  1239. true : false;
  1240. return bDisabled;
  1241. }
  1242. bool CExtBarButton::IsShowTipWhenDisabled() const
  1243. {
  1244. ASSERT_VALID( this );
  1245. const CExtToolControlBar * pBar = GetBar();
  1246. if( pBar != NULL
  1247. && ( ! pBar->IsShowTipWhenDisabled( this ) )
  1248. )
  1249. return false;
  1250. return true;
  1251. }
  1252. bool CExtBarButton::IsEnabled() const
  1253. {
  1254. ASSERT_VALID( this );
  1255. return !( IsDisabled() );
  1256. }
  1257. bool CExtBarButton::IsIndeterminate() const
  1258. {
  1259. ASSERT_VALID( this );
  1260. bool bIndeterminate =
  1261. (GetStyle() & TBBS_INDETERMINATE) ?
  1262. true : false;
  1263. return bIndeterminate;
  1264. }
  1265. bool CExtBarButton::IsPressed() const
  1266. {
  1267. ASSERT_VALID( this );
  1268. bool bPressed =
  1269. (GetStyle() & (TBBS_PRESSED|TBBS_CHECKED)) ?
  1270. true : false;
  1271. return bPressed;
  1272. }
  1273. bool CExtBarButton::IsHover() const
  1274. {
  1275. ASSERT_VALID( this );
  1276. return m_bHover;
  1277. }
  1278. void CExtBarButton::SetHover(
  1279. bool bHover // = true
  1280. )
  1281. {
  1282. // TRACE2( ">>>>>>>>>>>>SetHover - %p, %sn", this, bHover ? "on" : "--------OFF" );
  1283. ASSERT_VALID( this );
  1284. bool bAnimate = false;
  1285. bool bAnimationLocked = AnimationClient_CacheGeneratorIsLocked();
  1286. if( ! bAnimationLocked )
  1287. {
  1288. if( m_bHover != bHover )
  1289. {
  1290. bAnimate = true;
  1291. AnimationClient_CacheGeneratorLock();
  1292.   AnimationClient_StateGet( true ).Empty();
  1293.   AnimationClient_StateGet( false ).Empty();
  1294. // if( AnimationClient_StateGet(true).IsEmpty() )
  1295.   AnimationClient_CacheNextStateMinInfo(
  1296. false,
  1297. bHover
  1298. ? __EAPT_BY_HOVERED_STATE_TURNED_ON
  1299. : __EAPT_BY_HOVERED_STATE_TURNED_OFF
  1300. );
  1301. //AnimationClient_CacheGeneratorUnlock();
  1302. }
  1303. } // if( ! bAnimationLocked )
  1304. m_bHover = bHover;
  1305. OnUpdateParentStyle();
  1306. if( bAnimate )
  1307. {
  1308. //AnimationClient_CacheGeneratorLock();
  1309. AnimationClient_CacheNextStateMinInfo(
  1310. true,
  1311. bHover
  1312. ? __EAPT_BY_HOVERED_STATE_TURNED_ON
  1313. : __EAPT_BY_HOVERED_STATE_TURNED_OFF
  1314. );
  1315. AnimationClient_CacheGeneratorUnlock();
  1316. } // if( bAnimate )
  1317. _UpdateCtrl();
  1318. }
  1319. CWnd * CExtBarButton::CtrlGet()
  1320. {
  1321. ASSERT_VALID( this );
  1322. return m_pCtrl;
  1323. }
  1324. const CWnd * CExtBarButton::CtrlGet() const
  1325. {
  1326. ASSERT_VALID( this );
  1327. return
  1328. ( const_cast < CExtBarButton * > ( this ) ) ->
  1329. CtrlGet();
  1330. }
  1331. void CExtBarButton::CtrlSet(
  1332. CWnd * pCtrl,
  1333. bool bCtrlAutoDestroyed
  1334. )
  1335. {
  1336. ASSERT_VALID( this );
  1337. if( m_pCtrl != NULL )
  1338. {
  1339. CWnd * pOldCtrl = m_pCtrl;
  1340. m_pCtrl = NULL;
  1341. if( pOldCtrl->GetSafeHwnd() != NULL )
  1342. pOldCtrl->DestroyWindow();
  1343. if( ! m_bCtrlAutoDestroyed )
  1344. delete pOldCtrl;
  1345. }
  1346. m_pCtrl = pCtrl;
  1347. m_bCtrlAutoDestroyed = bCtrlAutoDestroyed;
  1348. #ifdef _DEBUG
  1349. if( m_pCtrl != NULL )
  1350. {
  1351. ASSERT_VALID( m_pCtrl );
  1352. }
  1353. #endif // _DEBUG
  1354. }
  1355. CWnd * CExtBarButton::CtrlDetach()
  1356. {
  1357. ASSERT_VALID( this );
  1358. CWnd * pCtrl = m_pCtrl;
  1359. m_pCtrl = NULL;
  1360. return pCtrl;
  1361. }
  1362. UINT CExtBarButton::GetStyle() const
  1363. {
  1364. ASSERT_VALID( this );
  1365. return m_nStyle;
  1366. }
  1367. void CExtBarButton::SetStyle( UINT nStyle )
  1368. {
  1369. ASSERT_VALID( this );
  1370. DWORD nOldStyle = m_nStyle;
  1371. DWORD nNewStyle = nStyle;
  1372. bool bOldPressed = ( (nOldStyle&TBBS_PRESSED) != 0 || IsPressed() ) ? true : false;
  1373. m_nStyle = nNewStyle;
  1374. bool bNewPressed = ( (nNewStyle&TBBS_PRESSED) != 0 || IsPressed() ) ? true : false;
  1375. m_nStyle = nOldStyle;
  1376. // if( (nOldStyle&TBBS_PRESSED) != (nNewStyle&TBBS_PRESSED) /*&& (nNewStyle&TBBS_PRESSED) == 0*/ )
  1377. if( bOldPressed != bNewPressed )
  1378. {
  1379. AnimationClient_CacheGeneratorLock();
  1380. if( AnimationClient_StateGet(true).IsEmpty() )
  1381.   AnimationClient_CacheNextStateMinInfo(
  1382. false,
  1383. bNewPressed
  1384. ? __EAPT_BY_PRESSED_STATE_TURNED_ON
  1385. : __EAPT_BY_PRESSED_STATE_TURNED_OFF
  1386. );
  1387. // AnimationClient_CacheGeneratorUnlock();
  1388. }
  1389. m_nStyle = nNewStyle;
  1390. if( (m_nStyle & TBBS_PRESSED) == 0 && (! IsHover() ) )
  1391. m_bDropDownHT = false;
  1392. OnUpdateParentStyle();
  1393. _UpdateCmdIdFromStyle();
  1394. _UpdateCtrl();
  1395. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1396. _UpdateCmdNodeFromStyle();
  1397. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1398. // if( (nOldStyle&TBBS_PRESSED) != (nNewStyle&TBBS_PRESSED) /*&& (nNewStyle&TBBS_PRESSED) == 0*/ )
  1399. if( bOldPressed != bNewPressed )
  1400. {
  1401. // AnimationClient_CacheGeneratorLock();
  1402. AnimationClient_CacheNextStateMinInfo(
  1403. true,
  1404. bNewPressed
  1405. ? __EAPT_BY_PRESSED_STATE_TURNED_ON
  1406. : __EAPT_BY_PRESSED_STATE_TURNED_OFF
  1407. );
  1408. AnimationClient_CacheGeneratorUnlock();
  1409. //  CWindowDC dc( NULL );
  1410. //  AnimationClient_StateGet( false ).Draw(
  1411. //  dc.m_hDC,
  1412. //  100,
  1413. //  0,
  1414. //  AnimationClient_StateGet( false ).GetSize().cx,
  1415. //  AnimationClient_StateGet( false ).GetSize().cy
  1416. //  );
  1417. //  AnimationClient_StateGet( true ).Draw(
  1418. //  dc.m_hDC,
  1419. //  0,
  1420. //  0,
  1421. //  AnimationClient_StateGet( true ).GetSize().cx,
  1422. //  AnimationClient_StateGet( true ).GetSize().cy
  1423. //  );
  1424. }
  1425. }
  1426. void CExtBarButton::ModifyStyle(
  1427. UINT nAdd,
  1428. UINT nRemove // = 0
  1429. )
  1430. {
  1431. ASSERT_VALID( this );
  1432. DWORD nOldStyle = m_nStyle;
  1433. DWORD nNewStyle = m_nStyle;
  1434. nNewStyle |= nAdd;
  1435. nNewStyle &= ~nRemove;
  1436. bool bOldPressed = ( (nOldStyle&TBBS_PRESSED) != 0 || IsPressed() ) ? true : false;
  1437. m_nStyle = nNewStyle;
  1438. bool bNewPressed = ( (nNewStyle&TBBS_PRESSED) != 0 || IsPressed() ) ? true : false;
  1439. m_nStyle = nOldStyle;
  1440. // if( (nOldStyle&TBBS_PRESSED) != (nNewStyle&TBBS_PRESSED) /*&& (nNewStyle&TBBS_PRESSED) == 0*/ )
  1441. if( bOldPressed != bNewPressed )
  1442. {
  1443. AnimationClient_CacheGeneratorLock();
  1444. if( AnimationClient_StateGet(true).IsEmpty() )
  1445.   AnimationClient_CacheNextStateMinInfo(
  1446. false,
  1447. bNewPressed
  1448. ? __EAPT_BY_PRESSED_STATE_TURNED_ON
  1449. : __EAPT_BY_PRESSED_STATE_TURNED_OFF
  1450. );
  1451. // AnimationClient_CacheGeneratorUnlock();
  1452. }
  1453. m_nStyle = nNewStyle;
  1454. if( (m_nStyle & TBBS_PRESSED) == 0 && (! IsHover() ) )
  1455. m_bDropDownHT = false;
  1456. OnUpdateParentStyle();
  1457. _UpdateCmdIdFromStyle();
  1458. _UpdateCtrl();
  1459. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1460. _UpdateCmdNodeFromStyle();
  1461. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1462. // if( (nOldStyle&TBBS_PRESSED) != (nNewStyle&TBBS_PRESSED) /*&& (nNewStyle&TBBS_PRESSED) == 0*/ )
  1463. if( bOldPressed != bNewPressed )
  1464. {
  1465. // AnimationClient_CacheGeneratorLock();
  1466. AnimationClient_CacheNextStateMinInfo(
  1467. true,
  1468. bNewPressed
  1469. ? __EAPT_BY_PRESSED_STATE_TURNED_ON
  1470. : __EAPT_BY_PRESSED_STATE_TURNED_OFF
  1471. );
  1472. AnimationClient_CacheGeneratorUnlock();
  1473. //  CWindowDC dc( NULL );
  1474. //  AnimationClient_StateGet( false ).Draw(
  1475. //  dc.m_hDC,
  1476. //  100,
  1477. //  0,
  1478. //  AnimationClient_StateGet( false ).GetSize().cx,
  1479. //  AnimationClient_StateGet( false ).GetSize().cy
  1480. //  );
  1481. //  AnimationClient_StateGet( true ).Draw(
  1482. //  dc.m_hDC,
  1483. //  0,
  1484. //  0,
  1485. //  AnimationClient_StateGet( true ).GetSize().cx,
  1486. //  AnimationClient_StateGet( true ).GetSize().cy
  1487. //  );
  1488. }
  1489. }
  1490. void CExtBarButton::OnUpdateParentStyle()
  1491. {
  1492. ASSERT_VALID( this );
  1493. /*
  1494. if( AnimationClient_CacheGeneratorIsLocked() )
  1495. return;
  1496. CExtBarButton * pParentTBB = ParentButtonGet();
  1497. if( pParentTBB == NULL )
  1498. return;
  1499. ASSERT_VALID( pParentTBB );
  1500. bool bOwnHover = ( IsEnabled() && ( IsHover() || IsPressed() ) ) ? true : false;
  1501. bool bParentHover = ( pParentTBB->IsHover() ) ? true : false;
  1502. // bool bOwnHover = m_bHover;
  1503. // bool bParentHover = pParentTBB->m_bHover;
  1504. if( bParentHover != bOwnHover )
  1505. {
  1506. bool bResetParentState = true;
  1507. if( ! bOwnHover )
  1508. {
  1509. CExtToolControlBar * pBar = GetBar();
  1510. if( pBar )
  1511. {
  1512. ASSERT_VALID( pBar );
  1513. INT nBtnIdxHover = pBar->_GetHoverButtonIndex();
  1514. if( nBtnIdxHover >= 0 )
  1515. {
  1516. CExtBarButton * pHoverTBB = pBar->GetButton( nBtnIdxHover );
  1517. ASSERT_VALID( pHoverTBB );
  1518. if( pParentTBB->IsChildButton( pHoverTBB ) )
  1519. bResetParentState = false;
  1520. } // if( nBtnIdxHover >= 0 )
  1521. } // if( pBar )
  1522. } // if( ! bOwnHover )
  1523. if( bResetParentState )
  1524. pParentTBB->SetHover( bOwnHover );
  1525. pParentTBB->RedrawButton( false );
  1526. } // if( bParentHover != bOwnHover )
  1527. */
  1528. }
  1529. bool CExtBarButton::OnInvalidateButton()
  1530. {
  1531. ASSERT_VALID( this );
  1532. return false;
  1533. }
  1534. void CExtBarButton::OnPressedTrackingStart()
  1535. {
  1536. ASSERT_VALID( this );
  1537. m_bPressedTracking = true;
  1538. }
  1539. void CExtBarButton::OnPressedTrackingStop()
  1540. {
  1541. ASSERT_VALID( this );
  1542. m_bPressedTracking = false;
  1543. }
  1544. bool CExtBarButton::IsPressedTracking() const
  1545. {
  1546. ASSERT_VALID( this );
  1547. return m_bPressedTracking;
  1548. }
  1549. void CExtBarButton::SetVertDocked( 
  1550. bool bVertDocked 
  1551. )
  1552. {
  1553. ASSERT_VALID( this );
  1554. m_bVertDocked = bVertDocked;
  1555. }
  1556. bool CExtBarButton::IsWrap(
  1557. CExtBarButton::e_wrap_t _evt
  1558. ) const
  1559. {
  1560. ASSERT_VALID( this );
  1561. ASSERT( __EVT_MIN_VALUE <= _evt && _evt <= __EVT_MAX_VALUE );
  1562. switch( _evt )
  1563. {
  1564. case __EVT_HORZ:
  1565. return m_bWrapH;
  1566. case __EVT_VERT:
  1567. return m_bWrapV;
  1568. default:
  1569. ASSERT( _evt == __EVT_FLOAT );
  1570. return m_bWrapF;
  1571. } // switch( _evt )
  1572. }
  1573. void CExtBarButton::SetWrap(
  1574. CExtBarButton::e_wrap_t _evt,
  1575. bool bWrap // = true
  1576. )
  1577. {
  1578. ASSERT_VALID( this );
  1579. ASSERT( __EVT_MIN_VALUE <= _evt && _evt <= __EVT_MAX_VALUE );
  1580. switch( _evt )
  1581. {
  1582. case __EVT_HORZ:
  1583. m_bWrapH = bWrap;
  1584. break;
  1585. case __EVT_VERT:
  1586. m_bWrapV = bWrap;
  1587. break;
  1588. default:
  1589. ASSERT( _evt == __EVT_FLOAT );
  1590. m_bWrapF = bWrap;
  1591. break;
  1592. } // switch( _evt )
  1593. }
  1594. bool CExtBarButton::IsLargeIcon() const
  1595. {
  1596. ASSERT_VALID( this );
  1597. if( GetBar() == NULL )
  1598. return false;
  1599. if( IsSeparator() )
  1600. return false;
  1601. const CExtToolControlBar * pBar = GetBar();
  1602. return pBar->IsLargeIcons();
  1603. }
  1604. bool CExtBarButton::IsDisplayScreenTip() const
  1605. {
  1606. ASSERT_VALID( this );
  1607. if( GetBar() == NULL )
  1608. return false;
  1609. if( IsSeparator() )
  1610. return false;
  1611. const CExtToolControlBar * pBar = GetBar();
  1612. return pBar->IsDisplayScreenTips();
  1613. }
  1614. bool CExtBarButton::IsDisplayShortcutKeysOnScreenTip() const
  1615. {
  1616. ASSERT_VALID( this );
  1617. if( GetBar() == NULL )
  1618. return false;
  1619. if( IsSeparator() )
  1620. return false;
  1621. const CExtToolControlBar * pBar = GetBar();
  1622. return pBar->IsDisplayShortcutKeysOnScreenTips();
  1623. }
  1624. UINT CExtBarButton::GetCmdID(
  1625. bool bEffective // = true
  1626. ) const
  1627. {
  1628. ASSERT_VALID( this );
  1629. return bEffective ? m_nEffectiveCmdID : m_nButtonCmdID;
  1630. }
  1631. void CExtBarButton::SetCmdID(
  1632. UINT nCmdID,
  1633. bool bEffectiveOnly, // = false
  1634. bool bEffectiveRecalcLayout // = false
  1635. )
  1636. {
  1637. ASSERT_VALID( this );
  1638. bool bRecalcLayout = false;
  1639. if( bEffectiveRecalcLayout
  1640. && m_nEffectiveCmdID != nCmdID
  1641. )
  1642. bRecalcLayout = true; 
  1643. m_nEffectiveCmdID = nCmdID;
  1644. if( ! bEffectiveOnly )
  1645. {
  1646. m_nButtonCmdID = nCmdID;
  1647. if( m_nButtonCmdID == ID_SEPARATOR )
  1648. {
  1649. m_nStyle |= TBBS_SEPARATOR;
  1650. m_nStyle &= ~(TBBS_BUTTON);
  1651. }
  1652. else
  1653. {
  1654. m_nStyle |= TBBS_BUTTON;
  1655. m_nStyle &= ~(TBBS_SEPARATOR);
  1656. }
  1657. } // if( !bEffectiveOnly )
  1658. if( bRecalcLayout )
  1659. {
  1660. CExtToolControlBar * pBar = GetBar();
  1661. if( pBar->GetSafeHwnd() != NULL )
  1662. {
  1663. pBar->Invalidate();
  1664. CFrameWnd * pFrame = pBar->GetParentFrame();
  1665. if( pFrame != NULL )
  1666. pFrame->RecalcLayout();
  1667. else
  1668. pBar->_RecalcLayoutImpl();
  1669. } // if( pBar->GetSafeHwnd() != NULL )
  1670. } // if( bRecalcLayout )
  1671. }
  1672. bool CExtBarButton::CanBePressedInDisabledState()
  1673. {
  1674. return IsAbleToTrackMenu();
  1675. }
  1676. bool CExtBarButton::IsPaintDropDown(
  1677. bool bCustomizeMode // = false
  1678. ) const
  1679. {
  1680. ASSERT_VALID( this );
  1681. const CExtToolControlBar * pBar = GetSafeBar();
  1682. if( pBar == NULL )
  1683. return false;
  1684. bool bPaintAsDropDown = 
  1685. ( IsAbleToTrackMenu( bCustomizeMode )
  1686. //&&(! pBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) )
  1687. && (! pBar->_IsSimplifiedDropDownButtons() )
  1688. ) ? true : false;
  1689. return bPaintAsDropDown;
  1690. }
  1691. bool CExtBarButton::IsAbleToTrackMenu(
  1692. bool bCustomizeMode // = false
  1693. ) const
  1694. {
  1695. ASSERT_VALID( this );
  1696. bCustomizeMode;
  1697. if( ( const_cast < CExtBarButton * > ( this ) ) -> GetMenu() != NULL
  1698. || IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton))
  1699. )
  1700. return true;
  1701. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1702. const CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  1703. if( pNode != NULL
  1704. && ( (pNode->GetFlags() & __ECTN_AUTO_POPUP) != 0
  1705. || pNode->GetNodeCount() > 0
  1706. )
  1707. )
  1708. return true;
  1709. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1710. return false;
  1711. }
  1712. bool CExtBarButton::IsContainerOfPopupLikeMenu()
  1713. {
  1714. ASSERT_VALID( this );
  1715. ASSERT(
  1716. ( m_hMenu == NULL )
  1717. || ( m_hMenu != NULL && ::IsMenu(m_hMenu) )
  1718. );
  1719. return m_bPopupMenu;
  1720. }
  1721. CExtSafeString CExtBarButton::GetText() const
  1722. {
  1723. ASSERT_VALID( this );
  1724. CExtSafeString sText( _T("") );
  1725. if( IsSeparator() )
  1726. return sText;
  1727. const CExtToolControlBar * pBar = GetBar();
  1728. HWND hWndBar = pBar->GetSafeHwnd();
  1729. CExtCmdItem * pCmdItem = NULL;
  1730. if( hWndBar != NULL )
  1731. pCmdItem =
  1732. g_CmdManager->CmdGetPtr(
  1733. g_CmdManager->ProfileNameFromWnd( hWndBar ),
  1734. GetCmdID( true )
  1735. );
  1736. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1737. CExtCustomizeCmdTreeNode * pNode =
  1738. ((CExtBarButton*)this)->GetCmdNode();
  1739. if( pNode != NULL )
  1740. {
  1741. ASSERT_VALID( pNode );
  1742. return CExtSafeString( pNode->GetTextInToolbar( pCmdItem ) );
  1743. }
  1744. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1745. if( pCmdItem == NULL )
  1746. return sText;
  1747. if( ! pCmdItem->m_sToolbarText.IsEmpty() )
  1748. sText = pCmdItem->m_sToolbarText;
  1749. int nTabChrPos = sText.Find( _T('t') );
  1750. if( nTabChrPos < 0 )
  1751. return sText;
  1752. return sText.Left( nTabChrPos );
  1753. }
  1754. bool CExtBarButton::GetSeparatedDropDown() const
  1755. {
  1756. ASSERT_VALID( this );
  1757. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1758. CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode( false );
  1759. if( pNode != NULL )
  1760. {
  1761. ASSERT_VALID( pNode );
  1762. if( ( pNode->GetFlags() & __ECTN_TBB_SEPARATED_DROPDOWN ) != 0 )
  1763. return true;
  1764. }
  1765. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1766. return m_bSeparatedDropDown;
  1767. }
  1768. void CExtBarButton::SetSeparatedDropDown(
  1769. bool bSeparatedDropDown // = true
  1770. )
  1771. {
  1772. ASSERT_VALID( this );
  1773. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1774. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  1775. if( pNode != NULL )
  1776. {
  1777. ASSERT_VALID( pNode );
  1778. pNode->ModifyFlags(
  1779. bSeparatedDropDown ? __ECTN_TBB_SEPARATED_DROPDOWN : 0,
  1780. bSeparatedDropDown ? 0 : __ECTN_TBB_SEPARATED_DROPDOWN
  1781. );
  1782. }
  1783. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1784. if( m_bSeparatedDropDown == bSeparatedDropDown )
  1785. return;
  1786. m_bSeparatedDropDown = bSeparatedDropDown;
  1787. _UpdateCtrl();
  1788. }
  1789. bool CExtBarButton::GetAutoChangeID() const
  1790. {
  1791. ASSERT_VALID( this );
  1792. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1793. CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode( false );
  1794. if( pNode != NULL )
  1795. {
  1796. ASSERT_VALID( pNode );
  1797. return (pNode->GetFlags()&__ECTN_TBB_AUTOCHANGE_ID) ? true : false;
  1798. }
  1799. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1800. return m_bAutoChangeID;
  1801. }
  1802. void CExtBarButton::SetAutoChangeID(
  1803. bool bAutoChangeID // = true
  1804. )
  1805. {
  1806. ASSERT_VALID( this );
  1807. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1808. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  1809. if( pNode != NULL )
  1810. {
  1811. ASSERT_VALID( pNode );
  1812. pNode->ModifyFlags(
  1813. bAutoChangeID ? __ECTN_TBB_AUTOCHANGE_ID : 0,
  1814. bAutoChangeID ? 0 : __ECTN_TBB_AUTOCHANGE_ID
  1815. );
  1816. }
  1817. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1818. if( m_bAutoChangeID == bAutoChangeID )
  1819. return;
  1820. m_bAutoChangeID = bAutoChangeID;
  1821. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1822. // reset text
  1823. if( m_bAutoChangeID )
  1824. SetCmdID( GetCmdID(true), true );
  1825. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1826. _UpdateCtrl();
  1827. }
  1828. bool CExtBarButton::GetNoRotateVerticalLayout() const
  1829. {
  1830. ASSERT_VALID( this );
  1831. const CExtToolControlBar * pToolBar = GetBar();
  1832. if( pToolBar != NULL )
  1833. {
  1834. ASSERT_VALID( pToolBar );
  1835. if( pToolBar->m_bPaletteMode )
  1836. return true;
  1837. }
  1838. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1839. CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode( false );
  1840. if( pNode != NULL )
  1841. {
  1842. ASSERT_VALID( pNode );
  1843. return (pNode->GetFlags()&__ECTN_TBB_NO_ROTATE_VL) ? true : false;
  1844. }
  1845. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1846. return m_bNoRotateVerticalLayout;
  1847. }
  1848. void CExtBarButton::SetNoRotateVerticalLayout(
  1849. bool bNoRotateVerticalLayout // = true
  1850. )
  1851. {
  1852. ASSERT_VALID( this );
  1853. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1854. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  1855. if( pNode != NULL )
  1856. {
  1857. ASSERT_VALID( pNode );
  1858. pNode->ModifyFlags(
  1859. bNoRotateVerticalLayout ? __ECTN_TBB_NO_ROTATE_VL : 0,
  1860. bNoRotateVerticalLayout ? 0 : __ECTN_TBB_NO_ROTATE_VL
  1861. );
  1862. }
  1863. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1864. if( m_bNoRotateVerticalLayout == bNoRotateVerticalLayout )
  1865. return;
  1866. m_bNoRotateVerticalLayout = bNoRotateVerticalLayout;
  1867. _UpdateCtrl();
  1868. }
  1869. bool CExtBarButton::GetCtrlVisibleVertically() const
  1870. {
  1871. ASSERT_VALID( this );
  1872. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1873. CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode( false );
  1874. if( pNode != NULL )
  1875. {
  1876. ASSERT_VALID( pNode );
  1877. return (pNode->GetFlags()&__ECTN_TBB_CTRL_VIS_VL) ? true : false;
  1878. }
  1879. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1880. return m_bCtrlVisibleVert;
  1881. }
  1882. void CExtBarButton::SetCtrlVisibleVertically( bool bVisible )
  1883. {
  1884. ASSERT_VALID( this );
  1885. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1886. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  1887. if( pNode != NULL )
  1888. {
  1889. ASSERT_VALID( pNode );
  1890. pNode->ModifyFlags(
  1891. bVisible ? __ECTN_TBB_CTRL_VIS_VL : 0,
  1892. bVisible ? 0 : __ECTN_TBB_CTRL_VIS_VL
  1893. );
  1894. }
  1895. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1896. m_bCtrlVisibleVert = bVisible;
  1897. _UpdateCtrl();
  1898. }
  1899. BOOL CExtBarButton::PutToPopupMenu(
  1900. CExtPopupMenuWnd * pPopup
  1901. )
  1902. {
  1903. ASSERT_VALID( this );
  1904. ASSERT( pPopup != NULL );
  1905. ASSERT( pPopup->GetSafeHwnd() == NULL );
  1906. CWnd * pCtrl = CtrlGet();
  1907. if( pCtrl != NULL )
  1908. {
  1909. if( pCtrl->SendMessage(
  1910. CExtToolControlBar::g_nMsgPutToPopupMenu,
  1911. reinterpret_cast <WPARAM> ( pPopup ),
  1912. 0
  1913. )
  1914. )
  1915. return TRUE;
  1916. }
  1917. CExtToolControlBar * pBar = GetBar();
  1918. if( IsAbleToTrackMenu() )
  1919. {
  1920. CExtCmdItem * pCmdItem =
  1921. g_CmdManager->CmdGetPtr(
  1922. g_CmdManager->ProfileNameFromWnd( pBar->GetSafeHwnd() ),
  1923. GetCmdID( false )
  1924. );
  1925. ASSERT( pCmdItem != NULL );
  1926. // CExtSafeString sText = pCmdItem->m_sMenuText;
  1927. // if( sText.IsEmpty() )
  1928. // sText = pCmdItem->m_sToolbarText;
  1929. CExtSafeString sText = pCmdItem->m_sToolbarText;
  1930. if( sText.IsEmpty() )
  1931. sText = pCmdItem->m_sMenuText;
  1932. const CExtCmdIcon & _icon = GetIcon();
  1933. VERIFY( pPopup->ItemInsert( (UINT)CExtPopupMenuWnd::TYPE_POPUP, -1, LPCTSTR(sText), _icon ) );
  1934. CExtPopupMenuWnd * pChildPopup = pPopup->ItemGetPopup( pPopup->ItemGetCount() - 1 );
  1935. ASSERT( pChildPopup != NULL );
  1936. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1937. CExtCustomizeCmdTreeNode * pNode = GetCmdNode();
  1938. if( pNode != NULL )
  1939. {
  1940. ASSERT_VALID( pNode );
  1941. VERIFY(
  1942. pChildPopup->UpdateFromCmdTree(
  1943. GetCmdTargetWnd()->GetSafeHwnd(),
  1944. pNode,
  1945. false
  1946. )
  1947. );
  1948. CExtPopupMenuWnd::MENUITEMDATA & _mii = pPopup->ItemGetInfo( pPopup->ItemGetCount() - 1 );
  1949. _mii.SetCmdNode( pNode );
  1950. sText = pNode->GetTextInToolbar( pCmdItem, true );
  1951. if( ! sText.IsEmpty() )
  1952. _mii.SetText( LPCTSTR(sText) );
  1953. } // if( pNode != NULL )
  1954. else
  1955. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1956. {
  1957. HMENU hMenu = GetMenu();
  1958. ASSERT( hMenu != NULL );
  1959. ASSERT( ::IsMenu(hMenu) );
  1960. CMenu _menu;
  1961. _menu.Attach( hMenu );
  1962. pChildPopup->UpdateFromMenu(
  1963. GetCmdTargetWnd()->GetSafeHwnd(),
  1964. &_menu,
  1965. IsContainerOfPopupLikeMenu(),
  1966. false
  1967. );
  1968. _menu.Detach();
  1969. } // else from if( pNode != NULL )
  1970. if( (pPopup->TrackFlagsGet()&TPMX_PALETTE) != 0 )
  1971. pPopup->ItemGetInfo(
  1972. pPopup->ItemGetCount()-1
  1973. ).SetChildCombine();
  1974. } // if( IsAbleToTrackMenu() )
  1975. else
  1976. {
  1977. if( (pPopup->TrackFlagsGet()&TPMX_PALETTE) != 0 && (! IsSeparator() ) )
  1978. {
  1979. int nCheck = 0;
  1980. if( (GetStyle()&TBBS_CHECKED) != 0 )
  1981. nCheck = 1;
  1982. const CExtCmdIcon & _icon = GetIcon();
  1983. CExtSafeString strButtonText = GetText();
  1984. HWND hWndCmdReceiver = pBar->GetOwner()->GetSafeHwnd();
  1985. if( ! pPopup->ItemInsertCommand(
  1986. GetCmdID(true),
  1987. -1,
  1988. strButtonText.IsEmpty() ? NULL : LPCTSTR(strButtonText),
  1989. NULL,
  1990. _icon,
  1991. nCheck,
  1992. hWndCmdReceiver
  1993. )
  1994. )
  1995. {
  1996. ASSERT( FALSE );
  1997. return FALSE;
  1998. }
  1999. CExtCmdItem * pCmdItem =
  2000. g_CmdManager->CmdGetPtr(
  2001. g_CmdManager->ProfileNameFromWnd( pBar->GetSafeHwnd() ),
  2002. GetCmdID( false )
  2003. );
  2004. CExtPopupMenuWnd::MENUITEMDATA & mi = 
  2005. pPopup->ItemGetInfo( pPopup->ItemGetCount() - 1 );
  2006. mi.Enable( IsEnabled() );
  2007. mi.SetNoCmdUI( true );
  2008. if( pCmdItem != NULL
  2009. && (! pCmdItem->m_sTipTool.IsEmpty() )
  2010. )
  2011. mi.SetCustomTip( LPCTSTR(pCmdItem->m_sTipTool) );
  2012. } // if( (pPopu p->TrackFlagsGet()&TPMX_PALETTE) != 0 && (! IsSeparator() ) )
  2013. else
  2014. {
  2015. if( ! pPopup->ItemInsert( GetCmdID(true) ) )
  2016. {
  2017. ASSERT( FALSE );
  2018. return FALSE;
  2019. }
  2020. } // else from if( (pPopup->TrackFlagsGet()&TPMX_PALETTE) != 0 && (! IsSeparator() ) )
  2021. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2022. CExtCustomizeCmdTreeNode * pNode = GetCmdNode();
  2023. if( pNode != NULL )
  2024. {
  2025. ASSERT_VALID( pNode );
  2026. pPopup->ItemGetInfo(
  2027. pPopup->ItemGetCount() - 1
  2028. ).SetCmdNode( pNode );
  2029. } // if( pNode != NULL )
  2030. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2031. } // else from if( IsAbleToTrackMenu() )
  2032. return TRUE;
  2033. }
  2034. CRect CExtBarButton::RectDropDown() const
  2035. {
  2036. ASSERT_VALID( this );
  2037. CRect rcBtnDropDownArea = Rect();
  2038. BOOL bHorz = TRUE;
  2039. const CExtToolControlBar * pToolBar = GetBar();
  2040. ASSERT_VALID( pToolBar );
  2041. if( (!GetNoRotateVerticalLayout()) && pToolBar->IsDockedVertically() )
  2042. bHorz = FALSE;
  2043. bool bBarIsRTL = false;
  2044. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  2045. if( ! pToolBar->IsKindOf( RUNTIME_CLASS( CExtRibbonPage ) ) )
  2046. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  2047. {
  2048. bBarIsRTL = 
  2049. ( (pToolBar->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  2050. ? true : false;
  2051. if( (! bBarIsRTL)
  2052. && pToolBar->m_pDockBar == NULL
  2053. )
  2054. bBarIsRTL =
  2055. ( (pToolBar->GetParent()->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  2056. ? true : false;
  2057. }
  2058. if( bHorz )
  2059. {
  2060. if( bBarIsRTL )
  2061. rcBtnDropDownArea.right =
  2062. rcBtnDropDownArea.left
  2063. + __DROPDOWN_ARROW_GAP*2
  2064. + CExtPaintManager::g_glyph_btn_expand_bottom.Size().cx
  2065. ;
  2066. else
  2067. rcBtnDropDownArea.left =
  2068. rcBtnDropDownArea.right
  2069. - __DROPDOWN_ARROW_GAP*2
  2070. - CExtPaintManager::g_glyph_btn_expand_bottom.Size().cx
  2071. ;
  2072. } // if( bHorz )
  2073. else
  2074. {
  2075. rcBtnDropDownArea.top =
  2076. rcBtnDropDownArea.bottom
  2077. - __DROPDOWN_ARROW_GAP*2
  2078. - CExtPaintManager::g_glyph_btn_expand_right.Size().cy
  2079. ;
  2080. } // else from if( bHorz )
  2081. return rcBtnDropDownArea;
  2082. }
  2083. CRect CExtBarButton::RectWithoutDropDown() const
  2084. {
  2085. ASSERT_VALID( this );
  2086. CRect rc = Rect();
  2087. if( GetSeparatedDropDown() )
  2088. {
  2089. CRect rcDD = RectDropDown();
  2090. rc.right = rcDD.left;
  2091. }
  2092. return rc;
  2093. }
  2094. bool CExtBarButton::_UpdateCtrlIsEnabled()
  2095. {
  2096. ASSERT_VALID( this );
  2097. CExtToolControlBar * pBar = GetBar();
  2098. if( pBar->GetSafeHwnd() == NULL )
  2099. return false;
  2100. if( ! pBar->_UpdateCtrlIsEnabled( this ) )
  2101. return false;
  2102. return true;
  2103. }
  2104. void CExtBarButton::_UpdateCtrl()
  2105. {
  2106. ASSERT_VALID( this );
  2107. if( ! _UpdateCtrlIsEnabled() )
  2108. return;
  2109. CExtToolControlBar * pBar = GetBar();
  2110. if( pBar->GetSafeHwnd() == NULL )
  2111. return;
  2112. CWnd * pCtrl = CtrlGet();
  2113. if( pCtrl == NULL )
  2114. return;
  2115. bool bShow = 
  2116. ( IsVisible()
  2117. && ( (! m_bVertDocked) || GetCtrlVisibleVertically() )
  2118. && ( m_nStyle & TBBS_HIDDEN ) == 0
  2119. )
  2120. ? true : false;
  2121. if( bShow )
  2122. {
  2123. ASSERT_VALID( pCtrl );
  2124. CRect rcCtrl;
  2125. pCtrl->GetWindowRect( &rcCtrl );
  2126. pBar->ScreenToClient( &rcCtrl );
  2127. CRect rcMove(
  2128. m_ActiveRect.TopLeft(),
  2129. rcCtrl.Size()
  2130. );
  2131. if( m_bVertDocked )
  2132. {
  2133. int nOffset = (m_ActiveRect.Width() - rcCtrl.Width()) / 2;
  2134. rcMove.OffsetRect( nOffset, 0 );
  2135. } // if( m_bVertDocked )
  2136. else
  2137. {
  2138. int nOffset = (m_ActiveRect.Height() - rcCtrl.Height()) / 2;
  2139. rcMove.OffsetRect( 0, nOffset );
  2140. } // else from if( m_bVertDocked )
  2141. if( rcCtrl != rcMove )
  2142. pCtrl->MoveWindow( &rcMove, FALSE );
  2143. } // if( bShow )
  2144. pCtrl->ShowWindow( bShow ? SW_SHOW : SW_HIDE );
  2145. pCtrl->EnableWindow( IsEnabled() );
  2146. if( pCtrl->IsKindOf( RUNTIME_CLASS( CButton ) ) )
  2147. {
  2148. int nCheck = 0;
  2149. if( IsPressed() )
  2150. nCheck = 1;
  2151. else if( IsIndeterminate() )
  2152. nCheck = 2;
  2153. ((CButton *)(pCtrl))->SetCheck( nCheck );
  2154. }
  2155. // if( IsVisible() && m_bHover )
  2156. // pCtrl->SetFocus();
  2157. }
  2158. void CExtBarButton::SetLayoutRect( CDC &dc, const RECT & rectButton )
  2159. {
  2160. ASSERT_VALID( this );
  2161. ASSERT_VALID( (&dc) );
  2162. ASSERT( dc.GetSafeHdc() != NULL );
  2163. dc;
  2164. SetRect( rectButton );
  2165. }
  2166. void CExtBarButton::SetRect( const RECT & rectButton )
  2167. {
  2168. ASSERT_VALID( this );
  2169. ASSERT_VALID( GetBar() );
  2170. GetBar()->AnimationSite_ClientProgressStop(
  2171. this
  2172. );
  2173. AnimationClient_StateGet( false ).Empty();
  2174. AnimationClient_StateGet( true ).Empty();
  2175. AnimationClient_TargetRectSet( rectButton );
  2176. m_ActiveRect = rectButton;
  2177. CWnd * pCtrl = CtrlGet();
  2178. if( pCtrl != NULL )
  2179. _UpdateCtrl();
  2180. }
  2181. CRect CExtBarButton::Rect() const
  2182. {
  2183. ASSERT_VALID( this );
  2184. const CExtToolControlBar * pBar = GetBar();
  2185. ASSERT_VALID( pBar );
  2186. CRect rcBtn = m_ActiveRect;
  2187. if( GetBar() != NULL
  2188. && pBar->PmBridge_GetPM()->GetCb2DbTransparentMode( (CObject *)(this) )
  2189. && pBar->PmBridge_GetPM()->IsMenuMustCombineExcludeArea( this )
  2190. && pBar->m_pDockSite != NULL
  2191. && (! pBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) )
  2192. )
  2193. {
  2194. const CSize _sizeRoundedAreaMerics =
  2195. pBar->PmBridge_GetPM()->FixedBar_GetRoundedAreaMerics();
  2196. CRect rcClient;
  2197. pBar->GetClientRect( &rcClient );
  2198. CRect rcBtn2(rcBtn);
  2199. if( pBar->IsDockedVertically() )
  2200. {
  2201. rcBtn2.OffsetRect(
  2202. rcBtn.left - rcClient.left,
  2203. rcClient.bottom - rcBtn.bottom
  2204. );
  2205. rcBtn2.top = rcBtn.top - _sizeRoundedAreaMerics.cy*2-1;
  2206. rcBtn2.right = rcClient.right;
  2207. } // if( pBar->IsDockedVertically() )
  2208. else if( pBar->IsDockedHorizontally() )
  2209. {
  2210. rcBtn2.OffsetRect(
  2211. rcClient.right - rcBtn.right,
  2212. rcBtn.top - rcClient.top
  2213. );
  2214. rcBtn2.left = rcBtn.left - _sizeRoundedAreaMerics.cx*2-1;
  2215. rcBtn2.bottom = rcClient.bottom;
  2216. } // else if( pBar->IsDockedHorizontally() )
  2217. }
  2218. return rcBtn;
  2219. }
  2220. CSize CExtBarButton::CalculateLayout(
  2221. CDC & dc,
  2222. CSize sizePreCalc,
  2223. BOOL bHorz
  2224. )
  2225. {
  2226. ASSERT_VALID( this );
  2227. ASSERT_VALID( GetBar() );
  2228. ASSERT_VALID( (&dc) );
  2229. if( GetNoRotateVerticalLayout() )
  2230. bHorz = TRUE;
  2231. CWnd * pCtrl = CtrlGet();
  2232. if( ( pCtrl != NULL ) 
  2233. && ( (! m_bVertDocked ) || GetCtrlVisibleVertically() ) 
  2234. )
  2235. {
  2236. ASSERT_VALID( pCtrl );
  2237. CRect rcCtrl;
  2238. pCtrl->GetWindowRect( &rcCtrl );
  2239. m_ActiveSize.cx = rcCtrl.Width();
  2240. m_ActiveSize.cy = rcCtrl.Height();
  2241. if( m_ActiveSize.cy < sizePreCalc.cy )
  2242. m_ActiveSize.cy = sizePreCalc.cy;
  2243. return m_ActiveSize;
  2244. }
  2245. m_ActiveSize = sizePreCalc;
  2246. CExtToolControlBar * pBar = GetBar();
  2247. if( IsSeparator() )
  2248. {
  2249. if( bHorz )
  2250. m_ActiveSize.cx = __EXT_TB_BUTTON_SEPARATOR_WIDTH;
  2251. else
  2252. m_ActiveSize.cy = __EXT_TB_BUTTON_SEPARATOR_HEIGHT;
  2253. }
  2254. else
  2255. {
  2256. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2257. if( GetCmdNode() == NULL )
  2258. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2259. {
  2260. CExtCmdItem * pCmdItem =
  2261. g_CmdManager->CmdGetPtr(
  2262. g_CmdManager->ProfileNameFromWnd( pBar->GetSafeHwnd() ),
  2263. GetCmdID( true )
  2264. );
  2265. if( pCmdItem == NULL )
  2266. return m_ActiveSize; // shutdown mode
  2267. }
  2268. // TODO
  2269. bool bBold = false;
  2270. CSize szButton( 0, 0 );
  2271. INT nMaxButtonWidth = OnQueryMaxButtonWidth( bHorz ? TRUE : FALSE );
  2272. CRect rcBorderSizes = OnQueryBorderSizes( bHorz ? TRUE : FALSE );
  2273. INT nIconAlignment = OnQueryAlignmentIcon( bHorz ? TRUE : FALSE );
  2274. CRect rcIconMargins = OnQueryMarginsIcon( bHorz ? TRUE : FALSE );
  2275. CRect rcTextMargins = OnQueryMarginsText( bHorz ? TRUE : FALSE );
  2276. CExtCmdIcon * pIcon = GetIconPtr();
  2277. CSize szIcon( 0, 0 );
  2278. if( pIcon != NULL && (! pIcon->IsEmpty() ) )
  2279. {
  2280. szIcon = pIcon->GetSize();
  2281. if( IsLargeIcon() )
  2282. {
  2283. szIcon.cx *= 2;
  2284. szIcon.cy *= 2;
  2285. }
  2286. szIcon.cx += bHorz 
  2287. ? ( rcIconMargins.left + rcIconMargins.right )
  2288. : ( rcIconMargins.top + rcIconMargins.bottom );
  2289. szIcon.cy += bHorz 
  2290. ? ( rcIconMargins.top + rcIconMargins.bottom )
  2291. : ( rcIconMargins.left + rcIconMargins.right );
  2292. }
  2293. CExtSafeString sTitle = GetText();
  2294. if( ! sTitle.IsEmpty() )
  2295. {
  2296. CFont * pFont = pBar->OnGetToolbarFont( ! bHorz, true );
  2297. if( pFont->GetSafeHandle() == NULL )
  2298. {
  2299. if( bHorz )
  2300. {
  2301. pFont = bBold 
  2302. ? &pBar->PmBridge_GetPM()->m_FontBold
  2303. : &pBar->PmBridge_GetPM()->m_FontNormal;
  2304. }
  2305. else
  2306. {
  2307. pFont = bBold 
  2308. ? &pBar->PmBridge_GetPM()->m_FontBoldVert
  2309. : &pBar->PmBridge_GetPM()->m_FontNormalVert;
  2310. }
  2311. }
  2312. ASSERT( pFont != NULL );
  2313. CFont * pOldFont = dc.SelectObject( pFont );
  2314. CRect rcText( 0, 0, 0, 0 );
  2315. UINT nDtMeasureFlags =
  2316. DT_LEFT | DT_TOP | DT_CALCRECT;
  2317. if( nMaxButtonWidth >= 0 )
  2318. {
  2319. rcText.right = nMaxButtonWidth;
  2320. nDtMeasureFlags |= DT_WORDBREAK;
  2321. }
  2322. else
  2323. nDtMeasureFlags |= DT_SINGLELINE;
  2324. dc.DrawText(
  2325. sTitle, 
  2326. -1,
  2327. rcText,
  2328. nDtMeasureFlags
  2329. );
  2330. if( bHorz )
  2331. {
  2332. rcText.InflateRect( rcTextMargins );
  2333. if( ( nIconAlignment & CExtPaintManager::__ALIGN_HORIZ_MASK ) == CExtPaintManager::__ALIGN_HORIZ_CENTER )
  2334. {
  2335. if( ( nIconAlignment & CExtPaintManager::__ALIGN_VERT_MASK ) == CExtPaintManager::__ALIGN_VERT_CENTER )
  2336. {
  2337. szButton.cx = 0;
  2338. szButton.cy = 0;
  2339. }
  2340. else
  2341. {
  2342. szButton.cx = max( rcText.Width(), szIcon.cx );
  2343. szButton.cy = rcText.Height() + szIcon.cy;
  2344. }
  2345. }
  2346. else
  2347. {
  2348. szButton.cx = rcText.Width() + szIcon.cx;
  2349. szButton.cy = max( rcText.Height(), szIcon.cy );
  2350. }
  2351. if( pBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) )
  2352. szButton.cx += 10;
  2353. }
  2354. else
  2355. {
  2356. rcText.InflateRect( 
  2357. rcTextMargins.top,
  2358. rcTextMargins.right,
  2359. rcTextMargins.bottom,
  2360. rcTextMargins.left
  2361. );
  2362. if( ( nIconAlignment & CExtPaintManager::__ALIGN_HORIZ_MASK ) == CExtPaintManager::__ALIGN_HORIZ_CENTER )
  2363. {
  2364. if( ( nIconAlignment & CExtPaintManager::__ALIGN_VERT_MASK ) == CExtPaintManager::__ALIGN_VERT_CENTER )
  2365. {
  2366. szButton.cx = 0;
  2367. szButton.cy = 0;
  2368. }
  2369. else
  2370. {
  2371. szButton.cx = rcText.Height() + szIcon.cx;
  2372. szButton.cy = max( rcText.Width(), szIcon.cy );
  2373. }
  2374. }
  2375. else
  2376. {
  2377.   szButton.cx = max( rcText.Height(), szIcon.cx );
  2378.   szButton.cy = rcText.Width() + szIcon.cy;
  2379. }
  2380. if( pBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) )
  2381. szButton.cy += 10;
  2382. }
  2383. dc.SelectObject( pOldFont );
  2384. } // if( ! sTitle.IsEmpty() )
  2385. else
  2386. szButton = szIcon;
  2387. szButton.cx += bHorz 
  2388. ? ( rcBorderSizes.left + rcBorderSizes.right )
  2389. : ( rcBorderSizes.top + rcBorderSizes.bottom );
  2390. szButton.cy += bHorz 
  2391. ? ( rcBorderSizes.top + rcBorderSizes.bottom )
  2392. : ( rcBorderSizes.left + rcBorderSizes.right );
  2393. if( m_ActiveSize.cx < szButton.cx )
  2394. m_ActiveSize.cx = szButton.cx;
  2395. if( m_ActiveSize.cy < szButton.cy )
  2396. m_ActiveSize.cy = szButton.cy;
  2397. pBar->PmBridge_GetPM()->Toolbar_AdjustButtonSize( this, m_ActiveSize );
  2398. } // else from if( IsSeparator() )
  2399. if( IsAbleToTrackMenu()
  2400. && ( ! pBar->_IsSimplifiedDropDownButtons() )
  2401. )
  2402. {
  2403. if( bHorz )
  2404. m_ActiveSize.cx +=
  2405. __DROPDOWN_ARROW_GAP * 2
  2406. + CExtPaintManager::g_glyph_btn_expand_bottom.Size().cx;
  2407. else
  2408. m_ActiveSize.cy +=
  2409. __DROPDOWN_ARROW_GAP * 2
  2410. + CExtPaintManager::g_glyph_btn_expand_right.Size().cy;
  2411. }
  2412. CSize _size = pBar->PmBridge_GetPM()->Toolbar_GetMinButtonSize( this );
  2413. if( bHorz )
  2414. {
  2415. m_ActiveSize.cx += _size.cx;
  2416. if( m_ActiveSize.cy < _size.cy )
  2417. m_ActiveSize.cy = _size.cy;
  2418. }
  2419. else
  2420. {
  2421. if( m_ActiveSize.cx < _size.cx )
  2422. m_ActiveSize.cx = _size.cx;
  2423. m_ActiveSize.cy += _size.cy;
  2424. }
  2425. return m_ActiveSize;
  2426. }
  2427. CExtCmdIcon * CExtBarButton::GetIconPtr()
  2428. {
  2429. ASSERT_VALID( this );
  2430. ASSERT_VALID( GetBar() );
  2431. CExtToolControlBar * pBar = GetBar();
  2432. if( pBar->GetSafeHwnd() == NULL )
  2433. return NULL;
  2434. __EXT_MFC_SAFE_LPCTSTR strProfile = g_CmdManager->ProfileNameFromWnd( pBar->GetSafeHwnd() );
  2435. if( strProfile == NULL )
  2436. return NULL;
  2437. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2438. CExtCustomizeCmdTreeNode * pOwnNode = GetCmdNode();
  2439. if( pOwnNode != NULL )
  2440. {
  2441. ASSERT_VALID( pOwnNode );
  2442. if( !CExtCmdManager::IsCommand( GetCmdID( true ) ) )
  2443. return NULL;
  2444. CExtCmdIcon * pIcon =
  2445. pOwnNode->GetIconPtrInToolbar(
  2446. g_CmdManager->CmdGetPtr(
  2447. strProfile,
  2448. GetCmdID( true )
  2449. )
  2450. );
  2451. if( pIcon == NULL )
  2452. return NULL;
  2453. if( (pOwnNode->GetFlags()&__ECTN_TBB_AUTOCHANGE_ID) == 0 )
  2454. return pIcon;
  2455. } // if( pOwnNode != NULL )
  2456. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2457. UINT nCmdID = GetCmdID( true );
  2458. if( ! CExtCmdManager::IsCommand( nCmdID ) )
  2459. return NULL;
  2460. return
  2461. g_CmdManager->CmdGetIconPtr(
  2462. strProfile,
  2463. nCmdID
  2464. );
  2465. }
  2466. const CExtCmdIcon * CExtBarButton::GetIconPtr() const
  2467. {
  2468. ASSERT_VALID( this );
  2469. return
  2470. ( const_cast < CExtBarButton * > ( this ) )
  2471. -> GetIconPtr();
  2472. }
  2473. CExtCmdIcon & CExtBarButton::GetIcon()
  2474. {
  2475. ASSERT_VALID( this );
  2476. CExtCmdIcon * pIcon = GetIconPtr();
  2477. if( pIcon != NULL )
  2478. return (*pIcon);
  2479. static CExtCmdIcon g_EmptyIcon;
  2480. return g_EmptyIcon;
  2481. }
  2482. const CExtCmdIcon & CExtBarButton::GetIcon() const
  2483. {
  2484. ASSERT_VALID( this );
  2485. return
  2486. ( const_cast < CExtBarButton * > ( this ) )
  2487. -> GetIcon();
  2488. }
  2489. const CExtAnimationParameters *
  2490. CExtBarButton::AnimationClient_OnQueryAnimationParameters(
  2491. INT eAPT // __EAPT_*** animation type
  2492. ) const
  2493. {
  2494. ASSERT_VALID( this );
  2495. const CExtAnimationParameters * pAnimationParameters =
  2496. g_PaintManager->Animation_GetParameters(
  2497. eAPT,
  2498. (CObject*)this,
  2499. this
  2500. );
  2501. return pAnimationParameters;
  2502. }
  2503. bool CExtBarButton::AnimationClient_CacheNextState(
  2504. CDC & dc,
  2505. const RECT & rcAcAnimationTarget,
  2506. bool bAnimate,
  2507. INT eAPT // __EAPT_*** animation type
  2508. )
  2509. {
  2510. ASSERT_VALID( this );
  2511. ASSERT_VALID( (&dc) );
  2512. ASSERT( dc.GetSafeHdc() != NULL );
  2513. ASSERT( AnimationClient_CacheGeneratorIsLocked() );
  2514. CExtToolControlBar * pBar = GetBar();
  2515. ASSERT_VALID( pBar );
  2516. if( AnimationClient_NonClientModeGet() )
  2517. pBar->DoPaintNC( &dc );
  2518. else
  2519. pBar->DoEraseBk( &dc );
  2520. PaintCompound( dc, true, false, false );
  2521. return
  2522. CExtAnimationClient::AnimationClient_CacheNextState(
  2523. dc,
  2524. rcAcAnimationTarget,
  2525. bAnimate,
  2526. eAPT
  2527. );
  2528. }
  2529. bool CExtBarButton::AnimationClient_StatePaint(
  2530. CDC & dc
  2531. )
  2532. {
  2533. ASSERT_VALID( this );
  2534. ASSERT_VALID( (&dc) );
  2535. ASSERT( dc.GetSafeHdc() != NULL );
  2536. ASSERT_VALID( GetBar() );
  2537. if( AnimationClient_SiteGet() == NULL )
  2538. AnimationClient_SiteSet( GetBar() );
  2539. bool bRetVal = CExtAnimationClient::AnimationClient_StatePaint( dc );
  2540. PaintChildren( dc, true );
  2541. return bRetVal;
  2542. }
  2543. void CExtBarButton::AnimationClient_StateDoStep()
  2544. {
  2545. ASSERT_VALID( this );
  2546. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  2547. CExtToolControlBar * pBar = GetBar();
  2548. ASSERT_VALID( pBar );
  2549. if( pBar->m_pDockBar == NULL )
  2550. {
  2551. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pBar );
  2552. if( pRibbonBar != NULL
  2553. && pRibbonBar->m_pExtNcFrameImpl != NULL
  2554. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  2555. )
  2556. {
  2557. CWnd * pWndParent = pBar->GetParent();
  2558. if( pWndParent != NULL )
  2559. {
  2560. CRect _rectTest = *this;
  2561. pBar->ClientToScreen( &_rectTest );
  2562. pWndParent->ScreenToClient( &_rectTest );
  2563. if( _rectTest.bottom <= 0
  2564. || ( _rectTest.top <= 0
  2565. && IsKindOf( RUNTIME_CLASS(CExtRibbonButtonFile) )
  2566. )
  2567. )
  2568. {
  2569. pBar->_InvalidateButton( pBar->_GetIndexOf( this ) );
  2570. return;
  2571. }
  2572. } // if( pWndParent != NULL )
  2573. } // if( m_pDockBar == NULL ...
  2574. } // if( pBar->m_pDockBar == NULL )
  2575. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  2576. CExtAnimationClient::AnimationClient_StateDoStep();
  2577. }
  2578. bool CExtBarButton::IsHorzBarOrientation() const
  2579. {
  2580. ASSERT_VALID( this );
  2581. const CExtToolControlBar * pBar = GetBar();
  2582. if( pBar == NULL )
  2583. return true;
  2584. ASSERT_VALID( pBar );
  2585. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  2586. if( pBar->IsKindOf( RUNTIME_CLASS(CExtRibbonPage) ) )
  2587. return true;
  2588. #endif
  2589. DWORD dwBarStyle =
  2590. ( const_cast < CExtToolControlBar * > ( pBar ) )
  2591. -> GetBarStyle();
  2592. if( ( dwBarStyle & CBRS_ORIENT_HORZ ) != 0 )
  2593. return true;
  2594. if( pBar->m_bPaletteMode )
  2595. return true;
  2596. if( GetNoRotateVerticalLayout() )
  2597. return true;
  2598. return false;
  2599. }
  2600. bool CExtBarButton::IsPaintAble( CDC & dc ) const
  2601. {
  2602. ASSERT_VALID( this );
  2603. ASSERT_VALID( (&dc) );
  2604. ASSERT( dc.GetSafeHdc() != NULL );
  2605. if( ! IsVisible() )
  2606. return false;
  2607. if( ( GetStyle() & TBBS_HIDDEN ) != 0 )
  2608. return false;
  2609. CRect rcTBB = *this;
  2610. if( ! dc.RectVisible( &rcTBB ) )
  2611. return false;
  2612. return true;
  2613. }
  2614. void CExtBarButton::PaintParentChain(
  2615. CDC & dc
  2616. )
  2617. {
  2618. ASSERT_VALID( this );
  2619. ASSERT_VALID( (&dc) );
  2620. ASSERT( dc.GetSafeHdc() != NULL );
  2621. CExtBarButton * pTBB = ParentButtonGet();
  2622. if( pTBB == NULL )
  2623. return;
  2624. CTypedPtrList < CPtrList, CExtBarButton * > _list;
  2625. for( ; pTBB != NULL; pTBB = pTBB->ParentButtonGet() )
  2626. {
  2627. ASSERT_VALID( pTBB );
  2628. _list.AddHead( pTBB );
  2629. }
  2630. POSITION pos = _list.GetHeadPosition();
  2631. for( ; pos != NULL; )
  2632. {
  2633. pTBB = _list.GetNext( pos );
  2634. ASSERT_VALID( pTBB );
  2635. pTBB->PaintCompound( dc, false, false, false );
  2636. }
  2637. }
  2638. void CExtBarButton::PaintChildren(
  2639. CDC & dc,
  2640. bool bPaintOneNearestChildrenLevelOnly
  2641. )
  2642. {
  2643. ASSERT_VALID( this );
  2644. ASSERT_VALID( (&dc) );
  2645. ASSERT( dc.GetSafeHdc() != NULL );
  2646. INT nChildIndex, nChildCount = ChildButtonGetCount();
  2647. for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  2648. {
  2649. CExtBarButton * pTBB = ChildButtonGetAt( nChildIndex );
  2650. ASSERT_VALID( pTBB );
  2651. if( ! pTBB->IsVisible() )
  2652. continue;
  2653. if( ( pTBB->GetStyle() & TBBS_HIDDEN ) != 0 )
  2654. continue;
  2655. pTBB->PaintCompound( dc, false, ! bPaintOneNearestChildrenLevelOnly, false );
  2656. } // for( nChildIndex = 0; nChildIndex < nChildCount; nChildIndex ++ )
  2657. }
  2658. void CExtBarButton::Paint( // old version version (left for compatibility)
  2659. CDC & dc,
  2660. bool bHorz // unused, same as IsHorzBarOrientation()
  2661. )
  2662. {
  2663. ASSERT_VALID( this );
  2664. ASSERT_VALID( (&dc) );
  2665. ASSERT( dc.GetSafeHdc() != NULL );
  2666. bHorz;
  2667. Paint( dc );
  2668. }
  2669. void CExtBarButton::Paint( // new simplified version (for simple toolbars)
  2670. CDC & dc
  2671. )
  2672. {
  2673. ASSERT_VALID( this );
  2674. ASSERT_VALID( (&dc) );
  2675. ASSERT( dc.GetSafeHdc() != NULL );
  2676. PaintCompound( dc, false, false, false );
  2677. }
  2678. void CExtBarButton::PaintCompound( // new fully featured version (for compound toolbars and rendering animation parts)
  2679. CDC & dc,
  2680. bool bPaintParentChain,
  2681. bool bPaintChildren,
  2682. bool bPaintOneNearestChildrenLevelOnly
  2683. )
  2684. {
  2685. ASSERT_VALID( this );
  2686. ASSERT_VALID( (&dc) );
  2687. ASSERT( dc.GetSafeHdc() != NULL );
  2688. CExtToolControlBar * pBar = GetBar();
  2689. ASSERT_VALID( pBar );
  2690. if( ! IsPaintAble( dc ) )
  2691. return;
  2692. if( AnimationClient_StatePaint( dc ) )
  2693. return;
  2694. if( bPaintParentChain )
  2695. PaintParentChain( dc );
  2696. CWnd * pCtrl = CtrlGet();
  2697. if( ( pCtrl != NULL )
  2698. && ( ( ! m_bVertDocked )
  2699. || GetCtrlVisibleVertically()
  2700. )
  2701. )
  2702. return;
  2703. // ASSERT( !IsSeparator() );
  2704. CRect rcArea( m_ActiveRect );
  2705. if( rcArea.right <= rcArea.left
  2706. || rcArea.bottom <= rcArea.top
  2707. )
  2708. return;
  2709. if( (! IsVisible() )
  2710. || (GetStyle() & TBBS_HIDDEN) != 0
  2711. || (! dc.RectVisible(&m_ActiveRect) )
  2712. )
  2713. return;
  2714. bool bDockSiteCustomizeMode =
  2715. pBar->_IsDockSiteCustomizeMode();
  2716. bool bPushed =
  2717. ( IsPressed() && (!bDockSiteCustomizeMode) )
  2718. ? true : false;
  2719. bool bEnabled =
  2720. ( IsDisabled() && (!bDockSiteCustomizeMode) )
  2721. ? false : true;
  2722. bool bHover =
  2723. ( IsHover() && (!bDockSiteCustomizeMode) )
  2724. ? true : false;
  2725. if( (! bDockSiteCustomizeMode )
  2726. && (! GetBar()->IsForceHoverWhenMenuTracking() )
  2727. )
  2728. {
  2729. if( CExtToolControlBar::g_bMenuTracking
  2730. || CExtPopupMenuWnd::IsMenuTracking()
  2731. )
  2732. bHover = false;
  2733. else if( !bHover )
  2734. bHover = IsPressedTracking();
  2735. //if( bPushed && bHover && IsPressedTracking() )
  2736. //bHover = false;
  2737. } // if( ! bDockSiteCustomizeMode ...
  2738. bool bIndeterminate =
  2739. ( IsIndeterminate() && (!bDockSiteCustomizeMode) )
  2740. ? true : false;
  2741. CExtSafeString sText = GetText();
  2742. CExtCmdIcon * pIcon = GetIconPtr();
  2743. CExtCmdIcon * pIconLarge = NULL;
  2744. if( pIcon != NULL
  2745. && (! pIcon->IsEmpty() )
  2746. && IsLargeIcon()
  2747. )
  2748. {
  2749. CSize _sizeIcon = pIcon->GetSize();
  2750. _sizeIcon.cx *= 2;
  2751. _sizeIcon.cy *= 2;
  2752. pIconLarge = new CExtCmdIcon;
  2753. if( pIconLarge->CreateScaledCopy(
  2754. *pIcon,
  2755. _sizeIcon
  2756. )
  2757. )
  2758. pIcon = pIconLarge;
  2759. #ifdef _DEBUG
  2760. else
  2761. {
  2762. ASSERT( FALSE );
  2763. }
  2764. #endif // _DEBUG
  2765. }
  2766. bool bPaintAsDropDown = IsPaintDropDown();
  2767. bool bHorz = IsHorzBarOrientation();
  2768. HFONT hFont =
  2769. (HFONT) pBar
  2770. -> OnGetToolbarFont( ! bHorz, false )
  2771. -> GetSafeHandle();
  2772. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  2773. this,
  2774. bHorz,
  2775. rcArea,
  2776. sText,
  2777. pIcon,
  2778. true,
  2779. bHover,
  2780. bPushed,
  2781. bIndeterminate,
  2782. bEnabled,
  2783. m_bDrawBorder,
  2784. false,
  2785. false,
  2786. 0,
  2787. hFont,
  2788. bPaintAsDropDown,
  2789. 0,
  2790. (!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
  2791. );
  2792. _ppbd.m_rcBorderSizes = OnQueryBorderSizes( bHorz );
  2793. _ppbd.m_nIconAlignment = OnQueryAlignmentIcon( bHorz );
  2794. _ppbd.m_nTextAlignment = OnQueryAlignmentText( bHorz );
  2795. _ppbd.m_rcIconMargins = OnQueryMarginsIcon( bHorz );
  2796. _ppbd.m_rcTextMargins = OnQueryMarginsText( bHorz );
  2797. if( OnQueryMaxButtonWidth( bHorz ) >= 0 )
  2798. _ppbd.m_bWordBreak = true;
  2799. if( GetSeparatedDropDown() )
  2800. {
  2801. _ppbd.m_bSeparatedDropDown = true;
  2802. _ppbd.m_bHoverDropDown = m_bDropDownHT;
  2803. if( ( m_bDropDownHT /*|| CExtToolControlBar::g_bMenuTracking*/ )
  2804. && bPushed
  2805. && ( ! bDockSiteCustomizeMode )
  2806. )
  2807. {
  2808. //_ppbd.m_bPushed = false;
  2809. _ppbd.m_bPushedDropDown = true;
  2810. }
  2811. }
  2812. _ppbd.m_clrCustomAccentEffectForIcon =
  2813. OnQueryCustomAccentEffectForIcon( dc );
  2814. bool bChecked =
  2815. ( (GetStyle()&TBBS_CHECKED) != 0 ) 
  2816. ? true 
  2817. : false;
  2818. _ppbd.m_bChecked = bChecked;
  2819. if( CExtToolControlBar::g_bMenuTracking
  2820. && pBar->_GetIndexOf(this) == pBar->m_nBtnIdxMenuTracking
  2821. )
  2822. {
  2823. CExtPopupMenuWnd * pPopup = CExtPopupMenuWnd::GetTrackingMenu();
  2824. if( pPopup->GetSafeHwnd() != NULL
  2825. && pPopup->m_eCombineAlign != CExtPopupMenuWnd::__CMBA_NONE
  2826. && ( pPopup->GetStyle() & WS_VISIBLE ) != 0
  2827. )
  2828. {
  2829. _ppbd.m_bHover = _ppbd.m_bPushed
  2830. = _ppbd.m_bHoverDropDown = _ppbd.m_bPushedDropDown
  2831. = _ppbd.m_bChecked
  2832. = _ppbd.m_bDrawBorder
  2833. = false;
  2834. _ppbd.m_bTransparentBackground = true;
  2835. }
  2836. }
  2837. pBar->PmBridge_GetPM()->PaintPushButton( dc, _ppbd );
  2838. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2839. CExtCustomizeSite * pSite = pBar->GetCustomizeSite();
  2840. if( pSite != NULL
  2841. && pSite->IsCustomizeMode()
  2842. && pSite->CustomizedNodeGet() != NULL
  2843. && pSite->CustomizedNodeGet() == GetCmdNode( false )
  2844. )
  2845. {
  2846. pBar->PmBridge_GetPM()->PaintDragSourceRect(
  2847. dc,
  2848. rcArea
  2849. );
  2850. }
  2851. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2852. if( pIconLarge != NULL )
  2853. delete pIconLarge;
  2854. if( bPaintChildren )
  2855. PaintChildren( dc, bPaintOneNearestChildrenLevelOnly );
  2856. }
  2857. CRect CExtBarButton::OnQueryBorderSizes(
  2858. bool bHorz // = true
  2859. ) const
  2860. {
  2861. ASSERT_VALID( this );
  2862. bHorz;
  2863. return CRect( 1, 1, 1, 1 );
  2864. }
  2865. INT CExtBarButton::OnQueryAlignmentText(
  2866. bool bHorz // = true
  2867. ) const
  2868. {
  2869. ASSERT_VALID( this );
  2870. bHorz;
  2871. return 
  2872. m_nTextAlignment >= 0 
  2873. ? m_nTextAlignment
  2874. : CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT_CENTER;
  2875. }
  2876. INT CExtBarButton::OnQueryAlignmentIcon(
  2877. bool bHorz // = true
  2878. ) const
  2879. {
  2880. ASSERT_VALID( this );
  2881. bHorz;
  2882. CExtSafeString sText = GetText();
  2883. return 
  2884. m_nIconAlignment >= 0 
  2885. ? m_nIconAlignment
  2886. : sText.IsEmpty() 
  2887. ? CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT_CENTER
  2888. : CExtPaintManager::__ALIGN_HORIZ_LEFT | CExtPaintManager::__ALIGN_VERT_CENTER;
  2889. }
  2890. CRect CExtBarButton::OnQueryMarginsText(
  2891. bool bHorz // = true
  2892. ) const
  2893. {
  2894. ASSERT_VALID( this );
  2895. bHorz;
  2896. if( m_rcTextMargins.left >= 0
  2897. && m_rcTextMargins.top >= 0
  2898. && m_rcTextMargins.right >= 0
  2899. && m_rcTextMargins.bottom >= 0
  2900. )
  2901. return m_rcTextMargins;
  2902. return CRect( 2, 2, 2, 2 );
  2903. }
  2904. CRect CExtBarButton::OnQueryMarginsIcon(
  2905. bool bHorz // = true
  2906. ) const
  2907. {
  2908. ASSERT_VALID( this );
  2909. bHorz;
  2910. if( m_rcIconMargins.left >= 0
  2911. && m_rcIconMargins.top >= 0
  2912. && m_rcIconMargins.right >= 0
  2913. && m_rcIconMargins.bottom >= 0
  2914. )
  2915. return m_rcIconMargins;
  2916. return CRect( 2, 2, 2, 2 );
  2917. }
  2918. INT CExtBarButton::OnQueryMaxButtonWidth(
  2919. bool bHorz // = true
  2920. ) const
  2921. {
  2922. ASSERT_VALID( this );
  2923. bHorz;
  2924. return m_nMaxButtonWidth;
  2925. }
  2926. void CExtBarButton::SetMaxButtonWidth( 
  2927. INT nWidth 
  2928. )
  2929. {
  2930. ASSERT_VALID( this );
  2931. m_nMaxButtonWidth = nWidth;
  2932. }
  2933. INT CExtBarButton::GetMaxButtonWidth() const
  2934. {
  2935. ASSERT_VALID( this );
  2936. return m_nMaxButtonWidth;
  2937. }
  2938. void CExtBarButton::SetTextAlignment( 
  2939. INT nAlignment 
  2940. )
  2941. {
  2942. ASSERT_VALID( this );
  2943. m_nTextAlignment = nAlignment;
  2944. }
  2945. INT CExtBarButton::GetTextAlignment() const
  2946. {
  2947. ASSERT_VALID( this );
  2948. return m_nTextAlignment;
  2949. }
  2950. void CExtBarButton::SetIconAlignment( 
  2951. INT nAlignment 
  2952. )
  2953. {
  2954. ASSERT_VALID( this );
  2955. m_nIconAlignment = nAlignment;
  2956. }
  2957. INT CExtBarButton::GetIconAlignment() const
  2958. {
  2959. ASSERT_VALID( this );
  2960. return OnQueryAlignmentIcon();
  2961. }
  2962. void CExtBarButton::SetTextMargins(
  2963. INT nLeft,
  2964. INT nTop,
  2965. INT nRight,
  2966. INT nBottom
  2967. )
  2968. {
  2969. ASSERT_VALID( this );
  2970. m_rcTextMargins.SetRect(
  2971. nLeft,
  2972. nTop,
  2973. nRight,
  2974. nBottom
  2975. );
  2976. }
  2977. void CExtBarButton::SetTextMargins(
  2978. const RECT & rcMargins
  2979. )
  2980. {
  2981. ASSERT_VALID( this );
  2982. SetTextMargins(
  2983. rcMargins.left,
  2984. rcMargins.top,
  2985. rcMargins.right,
  2986. rcMargins.bottom
  2987. );
  2988. }
  2989. void CExtBarButton::SetTextMargins(
  2990. LPCRECT lprcMargins
  2991. )
  2992. {
  2993. ASSERT_VALID( this );
  2994. if( lprcMargins == NULL )
  2995. {
  2996. ASSERT( FALSE );
  2997. return;
  2998. }
  2999. SetTextMargins(
  3000. lprcMargins->left,
  3001. lprcMargins->top,
  3002. lprcMargins->right,
  3003. lprcMargins->bottom
  3004. );
  3005. }
  3006. void CExtBarButton::SetIconMargins(
  3007. INT nLeft,
  3008. INT nTop,
  3009. INT nRight,
  3010. INT nBottom
  3011. )
  3012. {
  3013. ASSERT_VALID( this );
  3014. m_rcIconMargins.SetRect(
  3015. nLeft,
  3016. nTop,
  3017. nRight,
  3018. nBottom
  3019. );
  3020. ASSERT_VALID( this );
  3021. }
  3022. void CExtBarButton::SetIconMargins(
  3023. const RECT & rcMargins
  3024. )
  3025. {
  3026. ASSERT_VALID( this );
  3027. SetIconMargins(
  3028. rcMargins.left,
  3029. rcMargins.top,
  3030. rcMargins.right,
  3031. rcMargins.bottom
  3032. );
  3033. }
  3034. void CExtBarButton::SetIconMargins(
  3035. LPCRECT lprcMargins
  3036. )
  3037. {
  3038. ASSERT_VALID( this );
  3039. if( lprcMargins == NULL )
  3040. {
  3041. ASSERT( FALSE );
  3042. return;
  3043. }
  3044. SetIconMargins(
  3045. lprcMargins->left,
  3046. lprcMargins->top,
  3047. lprcMargins->right,
  3048. lprcMargins->bottom
  3049. );
  3050. }
  3051. void CExtBarButton::GetTextMargins(
  3052. INT & nLeft,
  3053. INT & nTop,
  3054. INT & nRight,
  3055. INT & nBottom
  3056. ) const
  3057. {
  3058. ASSERT_VALID( this );
  3059. CRect rcTextMargins = GetTextMargins();
  3060. nLeft = rcTextMargins.left;
  3061. nTop = rcTextMargins.top;
  3062. nRight = rcTextMargins.right;
  3063. nBottom = rcTextMargins.bottom;
  3064. }
  3065. CRect CExtBarButton::GetTextMargins() const
  3066. {
  3067. ASSERT_VALID( this );
  3068. return m_rcTextMargins;
  3069. }
  3070. void CExtBarButton::GetIconMargins(
  3071. INT & nLeft,
  3072. INT & nTop,
  3073. INT & nRight,
  3074. INT & nBottom
  3075. ) const
  3076. {
  3077. ASSERT_VALID( this );
  3078. CRect rcIconMargins = GetTextMargins();
  3079. nLeft = rcIconMargins.left;
  3080. nTop = rcIconMargins.top;
  3081. nRight = rcIconMargins.right;
  3082. nBottom = rcIconMargins.bottom;
  3083. }
  3084. CRect CExtBarButton::GetIconMargins() const
  3085. {
  3086. ASSERT_VALID( this );
  3087. return m_rcIconMargins;
  3088. }
  3089. bool CExtBarButton::GetDrawBorder() const
  3090. {
  3091. ASSERT_VALID( this );
  3092. return m_bDrawBorder;
  3093. }
  3094. void CExtBarButton::SetDrawBorder( 
  3095. bool bEnable // = true 
  3096. )
  3097. {
  3098. ASSERT_VALID( this );
  3099. m_bDrawBorder = bEnable;
  3100. }
  3101. COLORREF CExtBarButton::OnQueryCustomAccentEffectForIcon(
  3102. CDC & dc
  3103. )
  3104. {
  3105. ASSERT_VALID( this );
  3106. ASSERT_VALID( GetBar() );
  3107. ASSERT( dc.GetSafeHdc() != NULL );
  3108. CExtToolControlBar * pBar = GetBar();
  3109. return pBar->OnQueryCustomAccentEffectForIcon( dc, this );
  3110. }
  3111. void CExtBarButton::OnUpdateCmdUI(
  3112. CWnd * pTarget,
  3113. BOOL bDisableIfNoHndler,
  3114. int nIndex
  3115. )
  3116. {
  3117. ASSERT_VALID( this );
  3118. CExtToolControlBar * pBar = GetBar();
  3119. ASSERT_VALID( pBar );
  3120. if( pTarget == NULL )
  3121. pTarget = pBar->GetOwner();
  3122. ASSERT_VALID( pTarget );
  3123. if( IsSeparator() // ignore separators
  3124. || ( IsAbleToTrackMenu() // ignore menu drop buttons
  3125. //&&(pBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)))
  3126. && ( pBar->_IsSimplifiedDropDownButtons() )
  3127. )
  3128. )
  3129. return;
  3130. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3131. CExtCustomizeSite * pSite = pBar->GetCustomizeSite();
  3132. if( pSite != NULL )
  3133. {
  3134. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  3135. if( pNode != NULL
  3136. //&& (pNode->GetFlags() & __ECTN_AUTO_POPUP) != 0
  3137. && (pNode->GetFlags() & __ECTN_DYNAMIC_POPUP) != 0
  3138. )
  3139. return;
  3140. if( pSite->IsUserBarCommand( GetCmdID( false ) ) )
  3141. return;
  3142. }
  3143. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3144. // send the update notification
  3145. CExtToolControlBar::CExtToolControlBarCmdUI state;
  3146. state.m_pOther = GetBar();
  3147. state.m_nIndex = nIndex;
  3148. state.m_nIndexMax = pBar->GetButtonsCount();
  3149. state.m_nID = GetCmdID( true );
  3150. state.DoUpdate( pTarget, bDisableIfNoHndler );
  3151. }
  3152. bool CExtBarButton::CanStartCommandDrag()
  3153. {
  3154. ASSERT_VALID( this );
  3155. ASSERT_VALID( GetBar() );
  3156. if( IsSeparator() )
  3157. return false;
  3158. CWnd * pCtrl = CtrlGet();
  3159. if( pCtrl->GetSafeHwnd() != NULL )
  3160. return false;
  3161. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3162. if( GetCmdNode() == NULL )
  3163. return false;
  3164. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3165. return true;
  3166. }
  3167. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3168. void CExtBarButton::_UpdateCmdNodeFromStyle()
  3169. {
  3170. ASSERT_VALID( this );
  3171. if( GetBar() == NULL )
  3172. return;
  3173. ASSERT_VALID( GetBar() );
  3174. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  3175. if( pNode == NULL )
  3176. return;
  3177. ASSERT_VALID( pNode );
  3178. if( GetStyle() & TBBS_HIDDEN )
  3179. pNode->ModifyFlags( __ECTN_TBB_HIDDEN, 0 );
  3180. else
  3181. pNode->ModifyFlags( 0, __ECTN_TBB_HIDDEN );
  3182. }
  3183. bool CExtBarButton::IsCustomizeActiveItem()
  3184. {
  3185. ASSERT_VALID( this );
  3186. ASSERT_VALID( GetBar() );
  3187. CExtToolControlBar * pBar = GetBar();
  3188. CExtCustomizeSite * pSite =
  3189. pBar->GetCustomizeSite();
  3190. if( pSite == NULL )
  3191. return false;
  3192. return pSite->IsActiveItem( this );
  3193. }
  3194. void CExtBarButton::SetCustomizeActiveItem()
  3195. {
  3196. ASSERT_VALID( this );
  3197. ASSERT_VALID( GetBar() );
  3198. if( IsSeparator() )
  3199. return;
  3200. CExtToolControlBar * pBar = GetBar();
  3201. CExtCustomizeSite * pSite =
  3202. pBar->GetCustomizeSite();
  3203. if( pSite == NULL )
  3204. return;
  3205. pSite->ActiveItemSet( this, pBar->GetSafeHwnd() );
  3206. pBar->_GetIndexOf( this );
  3207. RedrawButton();
  3208. }
  3209. int CExtBarButton::CalculateDropOverEffect(
  3210. CPoint point,
  3211. CExtCustomizeSite::CCmdDragInfo & _dragInfo,
  3212. bool bAllowTrackNodePopup // = true
  3213. )
  3214. {
  3215. ASSERT_VALID( this );
  3216. ASSERT_VALID( GetBar() );
  3217. ASSERT( !_dragInfo.IsEmpty() );
  3218. _dragInfo;
  3219. if( IsSeparator() )
  3220. return 0;
  3221. if( !CanStartCommandDrag() )
  3222. return 0;
  3223. if( GetCmdNode() == NULL )
  3224. return false;
  3225. //CPoint ptMid = Rect().CenterPoint();
  3226. CPoint ptMidL = Rect().TopLeft();
  3227. ptMidL.x += Rect().Size().cx / 4;
  3228. ptMidL.y += Rect().Size().cy / 4;
  3229. CPoint ptMidR( ptMidL );
  3230. ptMidR.x += Rect().Size().cx / 2;
  3231. ptMidR.y += Rect().Size().cy / 2;
  3232. int nRetVal = 0;
  3233. CExtToolControlBar * pBar = GetBar();
  3234. if( (pBar->m_dwStyle & CBRS_ORIENT_HORZ) != 0 )
  3235. {
  3236. if( point.x <= ptMidL.x  )
  3237. nRetVal = -1;
  3238. else if( point.x >= ptMidR.x  )
  3239. nRetVal = 1;
  3240. else
  3241. nRetVal = -2;
  3242. } // if( (pBar->m_dwStyle & CBRS_ORIENT_HORZ) != 0 )
  3243. else
  3244. {
  3245. if( point.y <= ptMidL.y  )
  3246. nRetVal = -1;
  3247. else if( point.y >= ptMidR.y  )
  3248. nRetVal = 1;
  3249. else
  3250. nRetVal = -2;
  3251. } // else from if( (pBar->m_dwStyle & CBRS_ORIENT_HORZ) != 0 )
  3252. if( bAllowTrackNodePopup )
  3253. {
  3254. CExtCustomizeSite * pSite = pBar->GetCustomizeSite();
  3255. ASSERT( pSite != NULL );
  3256. if( IsAbleToTrackMenu( true ) )
  3257. {
  3258. CExtCustomizeCmdTreeNode * pOwnNode = GetCmdNode();
  3259. ASSERT_VALID( pOwnNode );
  3260. CRect rcBtn = Rect();
  3261. pBar->ClientToScreen( &rcBtn );
  3262. pBar->ClientToScreen( &point );
  3263. DWORD dwTrackFlags = OnGetTrackPopupFlags();
  3264. pSite->DropTargetPopupTrack(
  3265. pOwnNode,
  3266. rcBtn,
  3267. point,
  3268. dwTrackFlags
  3269. );
  3270. } // if( IsAbleToTrackMenu() )
  3271. else
  3272. pSite->DropTargetPopupCancel();
  3273. } // if( bAllowTrackNodePopup )
  3274. else
  3275. {
  3276. CExtCustomizeSite * pSite = pBar->GetCustomizeSite();
  3277. if( pSite != NULL )
  3278. pSite->DropTargetPopupCancel();
  3279. } // else from if( bAllowTrackNodePopup )
  3280. return nRetVal;
  3281. }
  3282. CExtCustomizeCmdTreeNode * CExtBarButton::GetCmdNode(
  3283. bool bInitial // = false
  3284. )
  3285. {
  3286. ASSERT_VALID( this );
  3287. // ASSERT_VALID( GetBar() );
  3288. // if( IsSeparator() )
  3289. // {
  3290. // ASSERT( m_pCmdNodeI == NULL );
  3291. // ASSERT( m_pCmdNodeC == NULL );
  3292. // return NULL;
  3293. // }
  3294. CExtCustomizeCmdTreeNode * pNode =
  3295. bInitial ? m_pCmdNodeI : m_pCmdNodeC;
  3296. #ifdef _DEBUG
  3297. if( pNode != NULL )
  3298. {
  3299. ASSERT_VALID( pNode );
  3300. }
  3301. #endif // _DEBUG
  3302. return pNode;
  3303. }
  3304. const CExtCustomizeCmdTreeNode * CExtBarButton::GetCmdNode(
  3305. bool bInitial // = false
  3306. ) const
  3307. {
  3308. ASSERT_VALID( this );
  3309. return
  3310. ( const_cast < CExtBarButton * > ( this ) )
  3311. -> GetCmdNode( bInitial );
  3312. }
  3313. void CExtBarButton::OnCustomizeUpdateProps(
  3314. CExtCustomizeCmdTreeNode * pNode // = NULL // update from basic node
  3315. )
  3316. {
  3317. ASSERT_VALID( this );
  3318. ASSERT_VALID( GetBar() );
  3319. if( pNode == NULL )
  3320. pNode = m_pCmdNodeI;
  3321. ASSERT_VALID( pNode );
  3322. #ifdef _DEBUG
  3323. if( m_pCmdNodeI != NULL )
  3324. {
  3325. ASSERT_VALID( m_pCmdNodeI );
  3326. }
  3327. #endif // _DEBUG
  3328. // ASSERT( !IsSeparator() );
  3329. SetCmdID( pNode->GetCmdID(false), false ); // reset all IDs
  3330. SetCmdID( pNode->GetCmdID(true), true ); // reset effective ID
  3331. DWORD dwNodeFlags = pNode->GetFlags();
  3332. if( dwNodeFlags&__ECTN_TBB_APPEND_MDI_MENU )
  3333. SetAppendMdiWindowsMenu( true );
  3334. if( dwNodeFlags&__ECTN_TBB_SEPARATED_DROPDOWN )
  3335. SetSeparatedDropDown( true );
  3336. if( dwNodeFlags&__ECTN_TBB_AUTOCHANGE_ID )
  3337. SetAutoChangeID( true );
  3338. if( dwNodeFlags&__ECTN_TBB_NO_ROTATE_VL )
  3339. SetNoRotateVerticalLayout( true );
  3340. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3341. if( GetAutoChangeID() && m_pCmdNodeC != NULL )
  3342. {
  3343. ASSERT_VALID( m_pCmdNodeC );
  3344. CExtToolControlBar * pBar = GetBar();
  3345. CExtCmdItem * pCmdItem =
  3346. g_CmdManager->CmdGetPtr(
  3347. g_CmdManager->ProfileNameFromWnd(
  3348. pBar->GetSafeHwnd()
  3349. ),
  3350. GetCmdID( true )
  3351. );
  3352. LPCTSTR strText =
  3353. ( pCmdItem != NULL )
  3354. ? ( pCmdItem->m_sToolbarText.IsEmpty()
  3355. ? ( pCmdItem->m_sMenuText.IsEmpty()
  3356. ? _T("")
  3357. : pCmdItem->m_sMenuText
  3358. )
  3359. : pCmdItem->m_sToolbarText
  3360. )
  3361. : _T("")
  3362. ;
  3363. m_pCmdNodeC->SetTextInToolbar( strText );
  3364. m_pCmdNodeC->SetTextInMenu( strText );
  3365. } // if( GetAutoChangeID() && m_pCmdNodeC != NULL )
  3366. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3367. }
  3368. void CExtBarButton::SetBasicCmdNode(
  3369. CExtCustomizeCmdTreeNode * pNode
  3370. )
  3371. {
  3372. ASSERT_VALID( this );
  3373. ASSERT_VALID( GetBar() );
  3374. ASSERT_VALID( pNode );
  3375. // ASSERT( !IsSeparator() );
  3376. m_pCmdNodeI = pNode;
  3377. // ASSERT( m_pCmdNodeI->GetCmdID(false) == GetCmdID(false) );
  3378. }
  3379. void CExtBarButton::SetCustomizedCmdNode(
  3380. CExtCustomizeCmdTreeNode * pNode
  3381. )
  3382. {
  3383. ASSERT_VALID( this );
  3384. ASSERT_VALID( GetBar() );
  3385. ASSERT_VALID( pNode );
  3386. #ifdef _DEBUG
  3387. if( m_pCmdNodeI != NULL )
  3388. {
  3389. ASSERT_VALID( m_pCmdNodeI );
  3390. }
  3391. #endif // _DEBUG
  3392. // ASSERT( !IsSeparator() );
  3393. m_pCmdNodeC = pNode;
  3394. ASSERT( m_pCmdNodeC->GetCmdID(false) == GetCmdID(false) );
  3395. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3396. if( GetAutoChangeID() )
  3397. {
  3398. CExtToolControlBar * pBar = GetBar();
  3399. HWND hWnd = pBar->GetSafeHwnd();
  3400. if( hWnd != NULL )
  3401. {
  3402. CExtCmdItem * pCmdItem =
  3403. g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( hWnd ), GetCmdID( true ) );
  3404. LPCTSTR strText =
  3405. ( pCmdItem != NULL )
  3406. ? ( pCmdItem->m_sToolbarText.IsEmpty()
  3407. ? ( pCmdItem->m_sMenuText.IsEmpty()
  3408. ? _T("")
  3409. : pCmdItem->m_sMenuText
  3410. )
  3411. : pCmdItem->m_sToolbarText
  3412. )
  3413. : _T("")
  3414. ;
  3415. m_pCmdNodeC->SetTextInToolbar( strText );
  3416. m_pCmdNodeC->SetTextInMenu( strText );
  3417. } // if( hWnd != NULL )
  3418. } // if( GetAutoChangeID() )
  3419. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3420. }
  3421. CExtCustomizeCmdTreeNode * CExtBarButton::OnCustomizeNodeInit(
  3422. CExtCustomizeSite * pSite,
  3423. CExtCustomizeCmdTreeNode * pParentNode // toolbar node
  3424. )
  3425. {
  3426. ASSERT_VALID( this );
  3427. ASSERT_VALID( GetBar() );
  3428. ASSERT( pSite != NULL );
  3429. ASSERT_VALID( pParentNode );
  3430. if( IsSeparator() )
  3431. {
  3432. ASSERT( m_pCmdNodeI == NULL );
  3433. ASSERT( m_pCmdNodeC == NULL );
  3434. return NULL;
  3435. }
  3436. m_pCmdNodeI = m_pCmdNodeC = NULL;
  3437. m_pCmdNodeI =
  3438. pSite->OnCmdNodeCreate(
  3439. GetCmdID( false ),
  3440. GetCmdID( true )
  3441. );
  3442. pParentNode->InsertNode( pSite, m_pCmdNodeI );
  3443. CExtToolControlBar * pBar = GetBar();
  3444. INT nOwnIdx = pBar->_GetIndexOf( this );
  3445. ASSERT( 0 <= nOwnIdx && nOwnIdx < pBar->GetButtonsCount() );
  3446. if( nOwnIdx > 0 )
  3447. {
  3448. CExtBarButton * pPrevTBB =
  3449. pBar->GetButton( nOwnIdx - 1 );
  3450. if( pPrevTBB->IsSeparator() )
  3451. m_pCmdNodeI->ModifyFlags( __ECTN_GROUP_START );
  3452. } // __ECTN_GROUP_START
  3453. CExtCmdItem * pCmdItem =
  3454. g_CmdManager->CmdGetPtr(
  3455. g_CmdManager->ProfileNameFromWnd( pBar->m_hWnd ),
  3456. GetCmdID()
  3457. );
  3458. ASSERT( pCmdItem != NULL );
  3459. m_pCmdNodeI->SetTextInToolbar( pCmdItem->m_sToolbarText );
  3460. m_pCmdNodeI->SetTextInMenu( pCmdItem->m_sMenuText );
  3461. DWORD dwAddFlags = 0;
  3462. if( IsAppendMdiWindowsMenu() )
  3463. dwAddFlags |= __ECTN_TBB_APPEND_MDI_MENU;
  3464. if( GetSeparatedDropDown() || pCmdItem->StateIsSeparatedDD() )
  3465. dwAddFlags |= __ECTN_TBB_SEPARATED_DROPDOWN;
  3466. if( GetAutoChangeID() || pCmdItem->StateIsAutochangeID() )
  3467. dwAddFlags |= __ECTN_TBB_AUTOCHANGE_ID;
  3468. if( GetNoRotateVerticalLayout() || pCmdItem->StateIsNoRotateVL() )
  3469. dwAddFlags |= __ECTN_TBB_NO_ROTATE_VL;
  3470. if( GetCtrlVisibleVertically() || pCmdItem->StateIsCtrlVisibleVertically() )
  3471. dwAddFlags |= __ECTN_TBB_CTRL_VIS_VL;
  3472. if( pCmdItem->StateIsCannotHide() )
  3473. dwAddFlags |= __ECTN_TBB_CANNOT_HIDE;
  3474. if( dwAddFlags != 0 )
  3475. m_pCmdNodeI->ModifyFlags( dwAddFlags );
  3476. m_pCmdNodeI->SetLParam( pCmdItem->m_nLParamUserData );
  3477. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  3478. m_pCmdNodeI->TextFieldWidthSet( pCmdItem->m_nTextFieldWidth );
  3479. m_pCmdNodeI->DropDownWidthSet( pCmdItem->m_nDropDownWidth );
  3480. m_pCmdNodeI->DropDownHeightMaxSet( pCmdItem->m_nDropDownHeightMax );
  3481. if( pCmdItem->StateIsCombo() )
  3482. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_COMBO|__ECTN_TBB_TEXT_FIELD, __ECTN_TBB_DATE );
  3483. else if( pCmdItem->StateIsDate() )
  3484. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_DATE|__ECTN_TBB_TEXT_FIELD, __ECTN_TBB_COMBO );
  3485. else if( pCmdItem->StateIsTextField() )
  3486. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_TEXT_FIELD, __ECTN_TBB_COMBO|__ECTN_TBB_DATE );
  3487. else
  3488. m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_TEXT_FIELD|__ECTN_TBB_COMBO|__ECTN_TBB_DATE|__ECTN_TBB_RESIZABLE );
  3489. if( pCmdItem->StateIsTextFieldNotEditable() )
  3490. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_TF_NE, 0 );
  3491. else
  3492. m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_TF_NE );
  3493. if( ( (m_pCmdNodeI->GetFlags() & (__ECTN_TBB_COMBO|__ECTN_TBB_DATE|__ECTN_TBB_TEXT_FIELD)) != 0 )
  3494. && pCmdItem->StateIsResizable()
  3495. )
  3496. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_RESIZABLE, 0 );
  3497. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  3498. if( pCmdItem->StateIsCheckBox() )
  3499. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_CHECK_BOX, 0 );
  3500. else
  3501. m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_CHECK_BOX );
  3502. if( pCmdItem->StateIsRadioBox() )
  3503. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_RADIO_BOX, 0 );
  3504. else
  3505. m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_RADIO_BOX );
  3506. if( pCmdItem->StateIsUndoRedo() )
  3507. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_UNDO_REDO, 0 );
  3508. else
  3509. m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_UNDO_REDO );
  3510. if( pCmdItem->StateIsColor() )
  3511. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_COLOR, 0 );
  3512. else
  3513. m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_COLOR );
  3514. if( pCmdItem->StateIsColorBtnDefault() )
  3515. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_MCB_DEFAULT, 0 );
  3516. else
  3517. m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_MCB_DEFAULT );
  3518. if( pCmdItem->StateIsColorBtnCustom() )
  3519. m_pCmdNodeI->ModifyFlags( __ECTN_TBB_MCB_CUSTOM, 0 );
  3520. else
  3521. m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_MCB_CUSTOM );
  3522. if( GetMenu() != NULL )
  3523. {
  3524. CMenu * pMenu = CMenu::FromHandle( GetMenu() );
  3525. ASSERT( pMenu != NULL );
  3526. VERIFY(
  3527. m_pCmdNodeI->LoadMenuTree(
  3528. GetBar(),
  3529. pBar->GetCustomizeSite(),
  3530. pMenu,
  3531. IsContainerOfPopupLikeMenu()
  3532. )
  3533. );
  3534. SetMenu( NULL, true, true ); // no longer needed
  3535. } // if( GetMenu() != NULL )
  3536. return m_pCmdNodeI;
  3537. }
  3538. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  3539. int CExtBarButton::GetInitialResizingStateH( // -1 - left side resizing, 1 - right side resizing, 0 - no resizing at specified point (in bar's client coord)
  3540. CPoint point,
  3541. int * p_nWidthMin, // = NULL
  3542. int * p_nWidthMax // = NULL
  3543. )
  3544. {
  3545. ASSERT_VALID( this );
  3546. ASSERT_VALID( GetBar() );
  3547. point;
  3548. p_nWidthMin;
  3549. p_nWidthMax;
  3550. return 0;
  3551. }
  3552. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  3553. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3554. void CExtBarButton::RedrawButton(
  3555. bool bUpdateNow // = false
  3556. )
  3557. {
  3558. ASSERT_VALID( this );
  3559. ASSERT_VALID( GetBar() );
  3560. CExtToolControlBar * pBar = GetBar();
  3561. if( IsVisible()
  3562. && (GetStyle() & TBBS_HIDDEN) == 0
  3563. )
  3564. pBar->_InvalidateButton( pBar->_GetIndexOf(this) );
  3565. if( bUpdateNow )
  3566. pBar->UpdateWindow();
  3567. }
  3568. void CExtBarButton::SetMenu(
  3569. HMENU hMenu,
  3570. bool bPopupMenu,
  3571. bool bAutoDestroyMenu
  3572. )
  3573. {
  3574. ASSERT_VALID( this );
  3575. _DestroyMenu();
  3576. m_hMenu = hMenu;
  3577. if( m_hMenu != NULL )
  3578. {
  3579. ASSERT( ::IsMenu(hMenu) );
  3580. CExtToolControlBar * pBar = GetBar();
  3581. VERIFY(
  3582. g_CmdManager->UpdateFromMenu(
  3583. g_CmdManager->ProfileNameFromWnd( pBar->GetSafeHwnd() ),
  3584. hMenu
  3585. )
  3586. );
  3587. m_bPopupMenu = bPopupMenu ? true : false;
  3588. ModifyStyle(0,TBBS_DISABLED);
  3589. m_bAutoDestroyMenu = bAutoDestroyMenu;
  3590. }
  3591. }
  3592. UINT CExtBarButton::OnGetTrackPopupFlags()
  3593. {
  3594. ASSERT_VALID( this );
  3595. ASSERT_VALID( GetBar() );
  3596. DWORD dwTrackFlags = 0;
  3597. CExtToolControlBar * pBar = GetBar();
  3598. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3599. if( pBar->KeyTipsDisplayedGet() )
  3600. dwTrackFlags |= TPMX_RIBBON_KEYTIPS;
  3601. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3602. if( pBar->m_bPresubclassDialogMode )
  3603. {
  3604. if( pBar->IsDockedAtRight() )
  3605. dwTrackFlags |= TPMX_RIGHTALIGN;
  3606. else if( pBar->IsDockedAtLeft() )
  3607. dwTrackFlags |= TPMX_LEFTALIGN;
  3608. else if( pBar->IsDockedAtBottom() )
  3609. dwTrackFlags |= TPMX_BOTTOMALIGN;
  3610. else
  3611. dwTrackFlags |= TPMX_TOPALIGN;
  3612. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  3613. CExtCustomizeCmdTreeNode * pNode = GetCmdNode();
  3614. if( pNode != NULL )
  3615. {
  3616. ASSERT_VALID( pNode );
  3617. CExtRibbonNode * pRibbonNode =
  3618. DYNAMIC_DOWNCAST( CExtRibbonNode, pNode );
  3619. if( pRibbonNode != NULL )
  3620. dwTrackFlags |= pRibbonNode->m_nTpmxAdditionalFlags;
  3621. } // if( pNode != NULL )
  3622. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3623. return dwTrackFlags;
  3624. } // if( pBar->m_bPresubclassDialogMode )
  3625. switch( pBar->GetSafeDockBarDlgCtrlID() )
  3626. {
  3627. case AFX_IDW_DOCKBAR_TOP:
  3628. dwTrackFlags |= TPMX_TOPALIGN;
  3629. break;
  3630. case AFX_IDW_DOCKBAR_BOTTOM:
  3631. dwTrackFlags |= TPMX_BOTTOMALIGN;
  3632. break;
  3633. case AFX_IDW_DOCKBAR_LEFT:
  3634. dwTrackFlags |= TPMX_LEFTALIGN;
  3635. break;
  3636. case AFX_IDW_DOCKBAR_RIGHT:
  3637. dwTrackFlags |= TPMX_RIGHTALIGN;
  3638. break;
  3639. default: // floating
  3640. dwTrackFlags |= TPMX_TOPALIGN;
  3641. break;
  3642. } // switch( pBar->GetSafeDockBarDlgCtrlID() )
  3643. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  3644. CExtCustomizeCmdTreeNode * pNode = GetCmdNode();
  3645. if( pNode != NULL )
  3646. {
  3647. ASSERT_VALID( pNode );
  3648. CExtRibbonNode * pRibbonNode =
  3649. DYNAMIC_DOWNCAST( CExtRibbonNode, pNode );
  3650. if( pRibbonNode != NULL )
  3651. dwTrackFlags |= pRibbonNode->m_nTpmxAdditionalFlags;
  3652. } // if( pNode != NULL )
  3653. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3654. return dwTrackFlags;
  3655. }
  3656. bool CExtBarButton::OnSetCursor( CPoint point )
  3657. {
  3658. ASSERT_VALID( this );
  3659. ASSERT_VALID( GetBar() );
  3660. point;
  3661. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3662. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  3663. CExtToolControlBar * pBar = GetBar();
  3664. CExtCustomizeSite * pSite = pBar->GetCustomizeSite();
  3665. if( pSite == NULL )
  3666. return false;
  3667. if( pSite->ActiveItemGet() != ((LPVOID)this) )
  3668. return false;
  3669. CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false );
  3670. if( pNode == NULL )
  3671. return false;
  3672. ASSERT_VALID( pNode );
  3673. if( (pNode->GetFlags() & __ECTN_TBB_RESIZABLE) == 0 )
  3674. return false;
  3675. int nInitialResizingStateH =
  3676. GetInitialResizingStateH( point );
  3677. if( nInitialResizingStateH != 0 )
  3678. {
  3679. CExtLocalResourceHelper _LRH;
  3680. CWinApp * pApp = ::AfxGetApp();
  3681. ASSERT_VALID( pApp );
  3682. HCURSOR hCursor = pApp->LoadCursor( MAKEINTRESOURCE( IDC_EXT_RESIZE_H1 ) );
  3683. if( hCursor == NULL )
  3684. {
  3685. ASSERT( FALSE );
  3686. hCursor = ::LoadCursor( NULL, IDC_SIZEWE );
  3687. }
  3688. ASSERT( hCursor != NULL );
  3689. ::SetCursor( hCursor );
  3690. return true;
  3691. } // if( nInitialResizingStateH != 0 )
  3692. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  3693. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3694. return false;
  3695. }
  3696. CWnd * CExtBarButton::GetCmdTargetWnd()
  3697. {
  3698. ASSERT_VALID( this );
  3699. ASSERT_VALID( GetBar() );
  3700. CExtToolControlBar * pBar = GetBar();
  3701. CWnd * pWnd = pBar->GetOwner();
  3702. ASSERT_VALID( pWnd );
  3703. return pWnd;
  3704. }
  3705. bool CExtBarButton::OnQueryHoverBasedMenuTracking() const
  3706. {
  3707. ASSERT_VALID( this );
  3708. const CExtToolControlBar * pBar = GetBar();
  3709. ASSERT_VALID( pBar );
  3710. bool bEnabled = pBar->OnQueryHoverBasedMenuTracking( this );
  3711. return bEnabled;
  3712. }
  3713. CExtPopupMenuWnd * CExtBarButton::OnCreatePopupMenuWnd()
  3714. {
  3715. ASSERT_VALID( this );
  3716. const CExtToolControlBar * pBar = GetBar();
  3717. ASSERT_VALID( pBar );
  3718. CExtPopupMenuWnd * pPopup =
  3719. CExtPopupMenuWnd::InstantiatePopupMenu(
  3720. pBar->GetSafeHwnd(),
  3721. RUNTIME_CLASS(CExtPopupMenuWnd),
  3722. this
  3723. );
  3724. ASSERT_VALID( pPopup );
  3725. return pPopup;
  3726. }
  3727. UINT CExtBarButton::OnTrackPopup(
  3728. CPoint point,
  3729. bool bSelectAny,
  3730. bool bForceNoAnimation
  3731. )
  3732. {
  3733. ASSERT_VALID( this );
  3734. CExtToolControlBar * pBar = GetBar();
  3735. ASSERT_VALID( pBar );
  3736. bool bDockSiteCustomizeMode = pBar->_IsDockSiteCustomizeMode();
  3737. if( bDockSiteCustomizeMode )
  3738. return UINT(-1L);
  3739. if( IsDisabled() && (! CanBePressedInDisabledState() ) )
  3740. return UINT(-1L);
  3741. CWnd * pWnd = CtrlGet();
  3742. if( pWnd != NULL )
  3743. {
  3744. LRESULT lResult = pWnd->SendMessage( CExtToolControlBar::g_nMsgContinueTrackMenu, WPARAM( this ), bSelectAny ? 1L : 0L );
  3745. lResult;
  3746. return UINT(-1L);
  3747. } // if( pWnd != NULL )
  3748. if( ! IsAbleToTrackMenu() )
  3749. return UINT(-1L);
  3750. bool bPrevTBMT = CExtToolControlBar::g_bMenuTracking;
  3751. if( CExtToolControlBar::g_bMenuTracking && pBar->_GetIndexOf(this) == pBar->m_nBtnIdxMenuTracking )
  3752. return UINT(-1L);
  3753. if( GetSeparatedDropDown() )
  3754. m_bDropDownHT = true;
  3755. CExtToolControlBar::_CloseTrackingMenus();
  3756. if( pBar->IsFloating() )
  3757. {
  3758. pBar->ActivateTopParent();
  3759. CFrameWnd * pFrame = pBar->GetDockingFrame();
  3760. ASSERT_VALID( pFrame );
  3761. pFrame->BringWindowToTop();
  3762. }
  3763. CWnd * pWndCmdTarget = GetCmdTargetWnd();
  3764. ASSERT_VALID( pWndCmdTarget );
  3765. CExtPopupMenuWnd * pPopup = OnCreatePopupMenuWnd();
  3766. ASSERT_VALID( pPopup );
  3767. DWORD dwTrackFlags = OnGetTrackPopupFlags() | TPMX_OWNERDRAW_FIXED;
  3768. #if (!defined __EXT_MFC_NO_RIBBON_BAR)