// This is part of the Professional User Interface Suite library.
// Copyright (C) 2001-2004 FOSS Software, Inc.
// All rights reserved.
//
// http://www.prof-uis.com
// http://www.fossware.com
// mailto:foss@fossware.com
//
// This source code can be used, modified and redistributed
// under the terms of the license agreement that is included
// in the Professional User Interface Suite package.
//
// Warranties and Disclaimers:
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
// INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
// IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
// INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
// INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
#include "stdafx.h"
#if _MFC_VER < 0x700
#include <../src/AfxImpl.h>
#else
#include <../src/mfc/AfxImpl.h>
#endif
#if (!defined __EXT_MENUCONTROLBAR_H)
#include <ExtMenuControlBar.h>
#endif
#if (!defined __EXT_POPUP_MENU_WND_H)
#include <ExtPopupMenuWnd.h>
#endif
#if (!defined __EXT_PAINT_MANAGER_H)
#include <ExtPaintManager.h>
#endif
#if (!defined __EXTDOCKBAR_H)
#include "ExtDockBar.h"
#endif
#if( !defined __EXTMINIDOCKFRAMEWND_H)
#include "ExtMiniDockFrameWnd.h"
#endif
#if (!defined __ExtCmdManager_H)
#include <ExtCmdManager.h>
#endif
#if (!defined __EXT_MEMORY_DC_H)
#include <../Src/ExtMemoryDC.h>
#endif
#if (!defined __EXT_LOCALIZATION_H)
#include <../Src/ExtLocalization.h>
#endif
#include <../profuisdll/resource.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define __MENUBAR_RIGHT_ADJUST_GAP 1
bool CExtMenuControlBar::g_bHideMenuBarExpandContentButton = false;
bool CExtMenuControlBar::g_bCancelNearestAltUp = false;
const CSize CExtMenuControlBar::g_sizeDefTBB( 23, 20 );
/////////////////////////////////////////////////////////////////////////////
// CExtMenuControlBar hook sink
bool CExtMenuControlBar::OnHookWndMsg(
LRESULT & lResult,
HWND hWndHooked,
UINT nMessage,
WPARAM & wParam,
LPARAM & lParam
)
{
if( GetSafeHwnd() == NULL
|| (! ::IsWindow(GetSafeHwnd()) )
|| CWnd::FromHandlePermanent(GetSafeHwnd()) == NULL
|| _DraggingGetBar() != NULL
)
return
CExtHookSink::OnHookWndMsg(
lResult,
hWndHooked,
nMessage,
wParam,
lParam
);
if( ( (!m_bPresubclassDialogMode) && hWndHooked == _GetHwndMainFrame() )
|| ( m_bPresubclassDialogMode && hWndHooked == _GetHwndPlacement() )
)
{ // if window is a main frame or parent dialog-like
if( nMessage == WM_PARENTNOTIFY
&&
CExtPopupMenuWnd::IsMenuTracking()
)
{
lResult = 0;
return true;
}
if( nMessage == WM_SIZE
|| nMessage == WM_ACTIVATEAPP
|| ( nMessage == WM_COMMAND && (((HIWORD(wParam))==0)||((HIWORD(wParam))==1)) )
|| nMessage == WM_SYSCOMMAND
)
{
HWND hWndCapture = CExtMouseCaptureSink::GetCapture();
if( hWndCapture == GetSafeHwnd() )
CExtMouseCaptureSink::ReleaseCapture();
else if( hWndCapture != NULL )
{
CWnd * pWnd = FromHandlePermanent(hWndCapture);
if( pWnd != NULL
&& pWnd->GetSafeHwnd() != NULL
&& ::IsWindow( pWnd->GetSafeHwnd() )
&& pWnd->IsKindOf(RUNTIME_CLASS(CExtControlBar))
)
CExtMouseCaptureSink::ReleaseCapture();
}
if( m_bFlatTracking )
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
if( CExtMenuControlBar::g_bMenuTracking )
CExtMenuControlBar::_CloseTrackingMenus();
//if( CExtPopupMenuWnd::IsMenuTracking() )
// CExtPopupMenuWnd::CancelMenuTracking();
return
CExtHookSink::OnHookWndMsg(
lResult,
hWndHooked,
nMessage,
wParam,
lParam
);
}
if( !m_bPresubclassDialogMode )
{
if( (nMessage == WM_NCLBUTTONUP && wParam == HTSYSMENU)
|| (nMessage == WM_NCRBUTTONUP && (wParam == HTCAPTION || wParam == HTSYSMENU))
)
{
CExtToolControlBar::g_bMenuTrackingExpanded = false;
CPoint * pPoint = NULL, ptCursor;
if( nMessage == WM_NCRBUTTONUP )
{
if( ! ::GetCursorPos(&ptCursor) )
{
lResult = 0;
return true;
}
pPoint = &ptCursor;
}
if( !_IsDockSiteCustomizeMode() )
{
TrackMainFrameSystemMenu(
pPoint,
FALSE
);
} // if( !_IsDockSiteCustomizeMode() )
lResult = 0;
return true;
}
if( (nMessage == WM_NCLBUTTONDOWN || nMessage == WM_NCRBUTTONDOWN)
&& wParam == HTSYSMENU
)
{
lResult = 0;
return true;
}
if( nMessage == WM_NCRBUTTONDOWN && wParam == HTCAPTION )
{
if( !_IsDockSiteCustomizeMode() )
{
CExtToolControlBar::g_bMenuTrackingExpanded = false;
CPoint ptCursor;
if( ::GetCursorPos(&ptCursor) )
TrackMainFrameSystemMenu(
&ptCursor,
FALSE
);
} // if( !_IsDockSiteCustomizeMode() )
lResult = 0;
return true;
}
if( nMessage == CExtPopupMenuWnd::g_nMsgNotifyMenuClosed )
{
m_bSysMenuTracking = false;
return true;
}
} // if( !m_bPresubclassDialogMode )
bool bPrintPreviewMode = false;
if( (!m_bPresubclassDialogMode)
&& m_pDockSite->GetSafeHwnd() != NULL
&& FindPrintPreviewMode(m_pDockSite)
)
bPrintPreviewMode = true;
if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
|| nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev
)
{ // if menu next/prev popup activation messages
BOOL bDummyMax = FALSE;
HWND hWndMdiChild = _GetActiveMdiChildWnd(bDummyMax);
int iTrackingIndex =
GetMenuTrackingButton();
if( (!bPrintPreviewMode) && iTrackingIndex < 0 ) // menu tracked on other bar
{
if( m_bSysMenuTracking )
{
if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
&& m_bMdiApp
&& hWndMdiChild != NULL
&& IsDisplayMdiDocumentButtons()
)
{
ASSERT( !m_bPresubclassDialogMode );
VERIFY(
TrackChildFrameSystemMenu(
NULL,
TRUE
)
);
} // if( m_bMdiApp && hWndMdiChild != NULL )
else
{
int iNewTrackIndex =
GetVisibleButton(
iTrackingIndex,
(nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
TRUE : FALSE
);
if( iNewTrackIndex == iTrackingIndex )
{
lResult = 0; // same as tracking now
return true;
}
TrackButtonMenu(iNewTrackIndex);
} // else from if( m_bMdiApp && hWndMdiChild != NULL )
} // if( m_bSysMenuTracking )
lResult = 0;
return true;
}
if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
&& ( !m_bPresubclassDialogMode )
&& iTrackingIndex == GetVisibleButton(-1,FALSE)
)
{
if( !_IsDockSiteCustomizeMode() )
TrackMainFrameSystemMenu(
NULL,
TRUE
);
lResult = 0;
return true;
}
if( nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev
&& ( !m_bPresubclassDialogMode )
&& iTrackingIndex == 0
&& IsDisplayMdiDocumentButtons()
)
{
if( !_IsDockSiteCustomizeMode() )
{
if( (! (m_bMdiApp && hWndMdiChild != NULL ) )
|| bPrintPreviewMode
|| (! TrackChildFrameSystemMenu(
NULL,
TRUE
)
)
)
TrackMainFrameSystemMenu(
NULL,
TRUE
);
} // if( !_IsDockSiteCustomizeMode() )
lResult = 0;
return true;
}
if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
&& (!m_bPresubclassDialogMode)
&& m_bMdiApp
&& m_bSysMenuTracking
&& iTrackingIndex < 0
&& hWndMdiChild != NULL
&& IsDisplayMdiDocumentButtons()
&& (!bPrintPreviewMode)
)
{
if( !_IsDockSiteCustomizeMode() )
TrackChildFrameSystemMenu(
NULL,
TRUE
);
lResult = 0;
return true;
}
int iNewTrackIndex =
GetVisibleButton(
iTrackingIndex,
(nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
TRUE : FALSE
);
if( (!IsDisplayMdiDocumentButtons())
&& nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev
&& iTrackingIndex == 0
&& iNewTrackIndex > 0
)
{
if( !_IsDockSiteCustomizeMode() )
TrackMainFrameSystemMenu(
NULL,
TRUE
);
lResult = 0;
return true;
}
if( bPrintPreviewMode
|| iNewTrackIndex == iTrackingIndex
)
{
lResult = 0; // same as tracking now
return true;
}
TrackButtonMenu(iNewTrackIndex);
lResult = 0;
return true;
} // if menu next/prev popup activation messages
if( nMessage == CExtPopupMenuWnd::g_nMsgNotifyMenuExpanded )
{ // if menu rarely used items was expanded
CExtToolControlBar::g_bMenuTrackingExpanded = true;
lResult = 0;
return true;
} // if menu rarely used items was expanded
if( !m_bPresubclassDialogMode )
_KillFrameMenu();
} // if window is a main frame or parent dialog-like
else if( hWndHooked == _GetHwndChildFrame() )
{
if( nMessage == WM_PARENTNOTIFY
&& CExtPopupMenuWnd::IsMenuTracking()
)
{
lResult = 0;
return true;
}
if( nMessage == WM_SIZE
|| nMessage == WM_WINDOWPOSCHANGED
|| nMessage == WM_ACTIVATEAPP
|| ( nMessage == WM_COMMAND && (((HIWORD(wParam))==0)||((HIWORD(wParam))==1)) )
|| nMessage == WM_SYSCOMMAND
)
{
bool bSizePos = false;
if( nMessage == WM_SIZE )
bSizePos = true;
else if( nMessage == WM_WINDOWPOSCHANGED )
{
LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam;
ASSERT( lpWP != NULL );
if( (lpWP->flags & SWP_FRAMECHANGED) == 0 )
bSizePos = true;
} // else if( nMessage == WM_WINDOWPOSCHANGED )
HWND hWndCapture = CExtMouseCaptureSink::GetCapture();
if( hWndCapture == GetSafeHwnd() )
CExtMouseCaptureSink::ReleaseCapture();
else if( hWndCapture != NULL )
{
CWnd * pWnd = FromHandlePermanent(hWndCapture);
if( pWnd != NULL
&& pWnd->GetSafeHwnd() != NULL
&& ::IsWindow( pWnd->GetSafeHwnd() )
&& pWnd->IsKindOf(RUNTIME_CLASS(CExtControlBar))
)
CExtMouseCaptureSink::ReleaseCapture();
}
if( m_bFlatTracking )
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
if( CExtMenuControlBar::g_bMenuTracking )
CExtMenuControlBar::_CloseTrackingMenus();
if( CExtPopupMenuWnd::IsMenuTracking() )
CExtPopupMenuWnd::CancelMenuTracking();
if( !bSizePos )
{
_KillFrameMenu();
if( ( nMessage == WM_SIZE
|| nMessage == WM_WINDOWPOSCHANGED
)
&& (! _IsDockSiteCustomizeMode() )
)
{
WINDOWPLACEMENT _wp;
::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
::GetWindowPlacement( _GetHwndChildFrame(), &_wp );
if( _wp.showCmd != SW_SHOWMAXIMIZED
|| ( _GetButtonsCountImpl() > 0
&& (! _GetButtonPtr(0)->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
&& ( IsDisplayMdiDocumentButtons() )
) // MDI doc buttons not installed, but should be displayed
)
_DelayUpdateMenuBar();
}
} // if( !bSizePos )
return
CExtHookSink::OnHookWndMsg(
lResult,
hWndHooked,
nMessage,
wParam,
lParam
);
}
bool bPrintPreviewMode = false;
if( (!m_bPresubclassDialogMode)
&& m_pDockSite->GetSafeHwnd() != NULL
&& FindPrintPreviewMode(m_pDockSite)
)
bPrintPreviewMode = true;
if( bPrintPreviewMode )
{
lResult = 0;
return true;
}
bool bMinFrameNcLbDown = false;
bool bMinFrameNcLbUp = false;
if( nMessage == WM_NCLBUTTONDOWN
|| nMessage == WM_NCLBUTTONUP
)
{
WINDOWPLACEMENT wp;
::memset( &wp, 0, sizeof(WINDOWPLACEMENT) );
::GetWindowPlacement( hWndHooked, &wp );
if( wp.showCmd == SW_SHOWMINIMIZED )
{
if( nMessage == WM_NCLBUTTONDOWN )
bMinFrameNcLbDown = true;
else if( nMessage == WM_NCLBUTTONUP )
bMinFrameNcLbUp = true;
}
}
if( bMinFrameNcLbUp && wParam == HTCAPTION )
return true;
if( ( bMinFrameNcLbDown && wParam == HTCAPTION )
|| (nMessage == WM_NCLBUTTONUP && wParam == HTSYSMENU)
|| (nMessage == WM_NCRBUTTONUP && (wParam == HTCAPTION || wParam == HTSYSMENU))
)
{
CExtToolControlBar::g_bMenuTrackingExpanded = false;
CPoint * pPoint = NULL, ptCursor;
if( nMessage == WM_NCRBUTTONUP )
{
if( ! ::GetCursorPos(&ptCursor) )
{
lResult = 0;
return true;
}
pPoint = &ptCursor;
}
if( !_IsDockSiteCustomizeMode() )
TrackChildFrameSystemMenu(
pPoint,
FALSE
);
lResult = 0;
return true;
}
if( (nMessage == WM_NCLBUTTONDOWN || nMessage == WM_NCRBUTTONDOWN)
&& wParam == HTSYSMENU
)
{
lResult = 0;
return true;
}
if( nMessage == WM_NCRBUTTONDOWN && wParam == HTCAPTION )
{
if( !_IsDockSiteCustomizeMode() )
{
CExtToolControlBar::g_bMenuTrackingExpanded = false;
CPoint ptCursor;
if( ::GetCursorPos(&ptCursor) )
TrackChildFrameSystemMenu(
&ptCursor,
FALSE
);
} // if( !_IsDockSiteCustomizeMode() )
lResult = 0;
return true;
}
if( nMessage == CExtPopupMenuWnd::g_nMsgNotifyMenuClosed )
{
m_bSysMenuTracking = false;
return true;
}
if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
|| nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev
)
{ // if menu next/prev popup activation messages
if( nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev )
{
if( !_IsDockSiteCustomizeMode() )
TrackMainFrameSystemMenu(
NULL,
TRUE
);
lResult = 0;
return true;
}
int iTrackingIndex =
GetMenuTrackingButton();
if( iTrackingIndex < 0 ) // menu tracked on other bar
{
if( m_bSysMenuTracking )
{
int iNewTrackIndex =
GetVisibleButton(
iTrackingIndex,
(nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
TRUE : FALSE
);
if( iNewTrackIndex == iTrackingIndex )
{
lResult = 0; // same as tracking now
return true;
}
TrackButtonMenu(iNewTrackIndex);
} // if( m_bSysMenuTracking )
lResult = 0;
return true;
}
int iNewTrackIndex =
GetVisibleButton(
iTrackingIndex,
(nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
TRUE : FALSE
);
if( iNewTrackIndex == iTrackingIndex )
{
lResult = 0; // same as tracking now
return true;
}
TrackButtonMenu(iNewTrackIndex);
lResult = 0;
return true;
} // if menu next/prev popup activation messages
} // else if( hWndHooked == _GetHwndChildFrame() )
else if( hWndHooked == _GetHwndMdiArea() )
{
if( nMessage == WM_PARENTNOTIFY
&&
CExtPopupMenuWnd::IsMenuTracking()
)
{
lResult = 0;
return true;
}
if( nMessage == WM_MDISETMENU )
{
CFrameWnd * pFrame = _GetDockingFrameImpl();
ASSERT_VALID( pFrame );
HWND hWndFrame = pFrame->GetSafeHwnd();
ASSERT( hWndFrame != NULL );
ASSERT( ::IsWindow(hWndFrame) );
bool bOle = IsOleIpObjActive();
HMENU hOldMdiMenu = m_menuDoc.Detach();
HMENU hNewMdiMenu = (HMENU)wParam;
m_menuDoc.Attach( hNewMdiMenu );
if( bOle )
{
::SetMenu( hWndFrame, hNewMdiMenu );
} // if( bOle )
else
{
HMENU hFrameRealMenu = ::GetMenu( hWndFrame );
if( hFrameRealMenu != NULL )
::SetMenu( hWndFrame, NULL );
_DelayUpdateMenuBar();
} // else from if( bOle )
CExtHookSink::OnHookWndMsgNextProcCurrent( 0L, 0L );
lResult = (LRESULT)hOldMdiMenu;
//_DelaySyncActiveMdiChild(); // (- v.2.23)
_SyncActiveMdiChild(); // (+ v.2.23)
m_bDelayedSyncActiveMdiChild = false; // (+ v.2.23)
return true;
}
if( nMessage == WM_MDIREFRESHMENU )
{
CExtHookSink::OnHookWndMsgNextProcCurrent( 0L, 0L );
//_DelaySyncActiveMdiChild(); // (- v.2.23)
_SyncActiveMdiChild(); // (+ v.2.23)
m_bDelayedSyncActiveMdiChild = false; // (+ v.2.23)
lResult = 0;
return true;
}
if( nMessage == WM_CONTEXTMENU )
{
#if (!defined __EXT_MFC_NO_CUSTOMIZE)
CExtCustomizeSite * pSite =
CExtCustomizeSite::GetCustomizeSite( m_hWnd );
if( pSite != NULL
&& pSite->IsCustomizeMode()
)
{
lResult = 0;
return true;
}
#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
if( !CExtControlBar::FindHelpMode(this) )
{
CFrameWnd * pFrame = _GetDockingFrameImpl();
ASSERT_VALID( pFrame );
CPoint ptCursor;
if( ! ::GetCursorPos(&ptCursor) )
{
lResult = 0;
return true;
}
HWND hWndTrack = GetOwner()->GetSafeHwnd();
ASSERT( hWndTrack != NULL && ::IsWindow(hWndTrack) );
CExtPopupMenuWnd * pPopup = new CExtPopupMenuWnd;
VERIFY( pPopup->CreatePopupMenu(hWndTrack) );
if( ! CExtDockBar::_ConstructDockSiteControlBarPopupMenu(
pFrame,
pPopup,
CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_MDICLIAREA_CTX,
this,
WM_CONTEXTMENU,
NULL
)
)
{
delete pPopup;
}
else
{
if( pPopup->ItemGetCount() == 0 )
{
delete pPopup;
}
else
{
::SetFocus( hWndTrack );
if( ! pPopup->TrackPopupMenu(
TPMX_OWNERDRAW_FIXED,
ptCursor.x,
ptCursor.y
)
)
{
delete pPopup;
}
}
}
} // if( !CExtControlBar::FindHelpMode(this) )
lResult = 0;
return true;
} // if( nMessage == WM_CONTEXTMENU )
if( nMessage == WM_MDIACTIVATE
|| nMessage == WM_MDIDESTROY
|| nMessage == WM_MDINEXT
)
_DelaySyncActiveMdiChild();
} // else if( hWndHooked == _GetHwndMdiArea() )
else
{
ASSERT( FALSE );
}
MSG msg;
::memset( &msg, 0, sizeof(MSG) );
msg.hwnd = hWndHooked;
msg.message = nMessage;
msg.wParam = wParam;
msg.lParam = lParam;
if( TranslateMainFrameMessage(&msg) )
return true;
return
CExtHookSink::OnHookWndMsg(
lResult,
hWndHooked,
nMessage,
wParam,
lParam
);
}
/////////////////////////////////////////////////////////////////////////////
// CExtMenuControlBar
IMPLEMENT_DYNCREATE(CExtMenuControlBar, CExtToolControlBar)
CExtMenuControlBar::CExtMenuControlBar()
{
m_bFlatTracking = false;
m_bSysMenuTracking = false;
m_nFlatTrackingIndex = m_nOldTrackingIndex = -1;
m_bMdiApp = false;
m_bMultiRowLayout = true;
m_sMdiWindowPopupName = _T("");
m_nMdiDocButtonCmdID = 0;
m_hWndHelper = NULL;
m_bDelayedSyncActiveMdiChild = false;
m_bDelayedUpdateMenuBar = false;
#if (!defined __EXT_MFC_NO_CUSTOMIZE)
m_pMenuInfo = NULL;
#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
}
CExtMenuControlBar::~CExtMenuControlBar()
{
_RemoveAllButtonsImpl();
CSingleLock _slCsCB( &g_csCB );
_slCsCB.Lock();
int nCountOfBars = g_AllBars.GetSize();
for( int i=0; i<nCountOfBars; i++ )
{
CExtControlBar * pBar = g_AllBars[i];
ASSERT( pBar != NULL );
if( pBar == this )
{
g_AllBars.RemoveAt( i );
break;
}
}
_slCsCB.Unlock();
}
BEGIN_MESSAGE_MAP(CExtMenuControlBar, CExtToolControlBar)
//{{AFX_MSG_MAP(CExtMenuControlBar)
ON_WM_DESTROY()
ON_WM_TIMER()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_REGISTERED_MESSAGE(CExtToolControlBar::g_nMsgTrackButtonMenu, OnTrackButtonMenu)
END_MESSAGE_MAP()
// LoadMenuBar() required only for CFrameWnd
// based windows principally without menu
BOOL CExtMenuControlBar::LoadMenuBar(
UINT nResourceID
)
{
if( m_menuDoc.GetSafeHmenu() != NULL )
{
VERIFY( m_menuDoc.DestroyMenu() );
}
if( m_menuFrame.GetSafeHmenu() != NULL )
{
VERIFY( m_menuFrame.DestroyMenu() );
}
if( m_pDockSite != NULL )
{
if( GetSafeHwnd() == NULL
|| !::IsWindow( GetSafeHwnd() )
|| m_menuFrame.GetSafeHmenu() != NULL
|| !IsHookedWindow( _GetHwndMainFrame() )
)
{
ASSERT( FALSE );
return FALSE;
}
}
if( !m_menuFrame.LoadMenu( nResourceID ) )
{
ASSERT( FALSE );
return FALSE;
}
ASSERT( ::IsMenu(m_menuFrame.GetSafeHmenu()) );
if( !g_CmdManager->UpdateFromMenu(
g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
m_menuFrame.GetSafeHmenu()
)
)
{
ASSERT( FALSE );
return FALSE;
}
return _UpdateMenuBar();
}
CMenu * CExtMenuControlBar::_GetMenu()
{
if( m_menuDoc.GetSafeHmenu() != NULL )
{
ASSERT( ::IsMenu(m_menuDoc.GetSafeHmenu()) );
return &m_menuDoc;
}
if( m_menuFrame.GetSafeHmenu() != NULL )
{
ASSERT( ::IsMenu(m_menuFrame.GetSafeHmenu()) );
return &m_menuFrame;
}
return NULL;
}
CMenu * CExtMenuControlBar::GetMenu()
{
return _GetMenu();
}
BOOL CExtMenuControlBar::UpdateMenuBar( // update after menu changed
BOOL bDoRecalcLayout // = TRUE
)
{
return _UpdateMenuBar( bDoRecalcLayout );
}
BOOL CExtMenuControlBar::_UpdateMenuBar(
BOOL bDoRecalcLayout // = TRUE
)
{
SetButtons(); // remove all buttons
VERIFY(
g_CmdManager->CmdRemoveByMask(
g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
(DWORD)CExtCmdItem::STATE_MENUBAR_TMP
)
);
#if (!defined __EXT_MFC_NO_CUSTOMIZE)
MenuInfoUpdate();
CExtCustomizeSite::CCmdMenuInfo * pMenuInfo = MenuInfoGet();
if( pMenuInfo != NULL )
{
ASSERT_VALID( pMenuInfo->GetNode() );
SetButtons( pMenuInfo->GetNode() );
} // if( pMenuInfo != NULL )
else
#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
{
CMenu * pMenu = GetMenu();
if( pMenu != NULL && pMenu->GetSafeHmenu() != NULL )
{
ASSERT( ::IsMenu(pMenu->GetSafeHmenu()) );
UINT nMenuItemCount = pMenu->GetMenuItemCount();
for( UINT iMenu=0; iMenu<nMenuItemCount; iMenu++ )
{
MENUITEMINFO mii;
::memset(&mii,0,sizeof(MENUITEMINFO));
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask =
MIIM_CHECKMARKS
|MIIM_DATA
|MIIM_ID
|MIIM_STATE
|MIIM_SUBMENU
|MIIM_TYPE
;
mii.cch = __MAX_UI_ITEM_TEXT;
CExtSafeString sText;
mii.dwTypeData =
sText.GetBuffer(__MAX_UI_ITEM_TEXT);
ASSERT( mii.dwTypeData != NULL );
if( mii.dwTypeData == NULL )
{
ASSERT( FALSE );
return FALSE;
}
if( !pMenu->GetMenuItemInfo(
iMenu,
&mii,
TRUE
)
)
{
sText.ReleaseBuffer();
ASSERT( FALSE );
return false;
}
sText.ReleaseBuffer();
BOOL bAppendMdiWindowsMenu = FALSE;
UINT nCmdID = 0;
CExtCmdItem * pCmdItem = NULL;
if( mii.hSubMenu == NULL )
{
nCmdID = mii.wID;
if( nCmdID == ID_SEPARATOR )
{
if( !InsertButton(
iMenu,
nCmdID,
FALSE
)
)
{
ASSERT( FALSE );
return FALSE;
}
continue;
}
ASSERT( CExtCmdManager::IsCommand(nCmdID) );
pCmdItem =
g_CmdManager->CmdGetPtr(
g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
nCmdID
);
ASSERT( pCmdItem != NULL );
} // if( mii.hSubMenu == NULL )
else
{
pCmdItem =
g_CmdManager->CmdAllocPtr(
g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() )
);
if( pCmdItem == NULL )
{
ASSERT( FALSE );
return FALSE;
}
nCmdID = pCmdItem->m_nCmdID;
ASSERT( CExtCmdManager::IsCommand(nCmdID) );
pCmdItem->StateSetMenubarTemp();
pCmdItem->StateSetBasic();
if( m_bMdiApp && !m_sMdiWindowPopupName.IsEmpty() )
{
CExtSafeString _sText(sText);
_sText.TrimLeft();
_sText.TrimRight();
while( _sText.Replace(_T("&"),_T("")) > 0 )
{
_sText.TrimLeft();
_sText.TrimRight();
}
if( _sText == m_sMdiWindowPopupName )
bAppendMdiWindowsMenu = TRUE;
} // if( m_bMdiApp && !m_sMdiWindowPopupName.IsEmpty() )
} // else from if( mii.hSubMenu == NULL )
ASSERT( pCmdItem != NULL );
if( pCmdItem->m_sToolbarText.IsEmpty() )
pCmdItem->m_sToolbarText = sText;
if( pCmdItem->m_sMenuText.IsEmpty() )
pCmdItem->m_sMenuText = sText;
if( !InsertButton(
iMenu,
nCmdID,
FALSE
)
)
{
ASSERT( FALSE );
return FALSE;
}
if( mii.hSubMenu != NULL )
{
ASSERT( ::IsMenu(mii.hSubMenu) );
SetButtonMenu(
iMenu,
mii.hSubMenu,
FALSE,
FALSE,
FALSE
);
}
if( bAppendMdiWindowsMenu )
{
VERIFY(
MarkButtonAsMdiWindowsMenu(
iMenu,
TRUE
)
);
}
} // for( UINT iMenu=0; iMenu<nMenuItemCount; iMenu++ )
ASSERT( m_pRightBtn == NULL );
m_pRightBtn = OnCreateBarRightBtn();
if( m_pRightBtn != NULL )
{
ASSERT_VALID( m_pRightBtn );
ASSERT_KINDOF( CExtBarContentExpandButton, m_pRightBtn );
m_buttons.Add( m_pRightBtn );
} // if( m_pRightBtn != NULL )
} // if( pMenu != NULL && pMenu->GetSafeHmenu() != NULL )
} // else from if( pMenuInfo != NULL )
if( m_bMdiApp )
{
if( !IsOleIpObjActive() )
if( _InstallMdiDocButtons( FALSE ) )
bDoRecalcLayout = TRUE;
VERIFY( _SyncActiveMdiChild() );
}
if( bDoRecalcLayout )
_RecalcLayoutImpl();
return TRUE;
}
HWND CExtMenuControlBar::_GetActiveMdiChildWnd(
BOOL & bMaximized
)
{
bMaximized = FALSE;
if( !m_bMdiApp )
return NULL;
CMDIFrameWnd * pFrame =
DYNAMIC_DOWNCAST(
CMDIFrameWnd,
_GetDockingFrameImpl()
);
ASSERT_VALID( pFrame );
HWND hWndMdiArea = pFrame->m_hWndMDIClient;
ASSERT( hWndMdiArea != NULL );
ASSERT( ::IsWindow(hWndMdiArea) );
BOOL bMax = FALSE;
HWND hWnd = (HWND)
::SendMessage(
hWndMdiArea,
WM_MDIGETACTIVE,
0,
(LPARAM)&bMax
);
ASSERT(
hWnd == NULL
|| ::IsWindow( hWnd )
);
bMaximized = bMax;
return hWnd;
}
void CExtMenuControlBar::OnUpdateCmdUI(
CFrameWnd * pTarget,
BOOL bDisableIfNoHndler
)
{
CExtToolControlBar::OnUpdateCmdUI(
pTarget,
bDisableIfNoHndler
);
}
BOOL CExtMenuControlBar::_SyncActiveMdiChild()
{
if( m_bPresubclassDialogMode )
return TRUE;
if( _DraggingGetBar() != NULL )
return TRUE;
if( (GetStyle() & WS_VISIBLE) == 0 )
return TRUE;
BOOL bMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bMax );
if( m_hWndHelper == hWndActiveChild )
return TRUE;
if( m_hWndHelper != NULL )
SetupHookWndSink( m_hWndHelper, true );
m_hWndHelper = hWndActiveChild;
if( m_hWndHelper != NULL )
SetupHookWndSink( m_hWndHelper );
_RecalcLayoutImpl();
return TRUE;
}
LRESULT CExtMenuControlBar::DoHelpHitTest( CPoint ptHelpHitTest )
{
ASSERT_VALID( this );
return CExtToolControlBar::DoHelpHitTest( ptHelpHitTest );
}
bool CExtMenuControlBar::IsDisplayMdiDocumentButtons() const
{
return true;
}
BOOL CExtMenuControlBar::_InstallMdiDocButtons(
BOOL bDoRecalcLayout // = TRUE
)
{
ASSERT( m_bMdiApp );
if( !IsDisplayMdiDocumentButtons() )
{
if( bDoRecalcLayout )
_RecalcLayoutImpl();
return TRUE;
}
if( _DraggingGetBar() != NULL )
return FALSE;
BOOL bMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bMax );
int nCountOfButtons = GetButtonsCount();
if( nCountOfButtons == 0
&& hWndActiveChild == NULL
)
return FALSE;
CExtBarMdiDocButton * pDocTBB = NULL;
if( nCountOfButtons > 0 )
pDocTBB =
DYNAMIC_DOWNCAST(
CExtBarMdiDocButton,
_GetButtonPtr(0)
);
int nRightIndex = nCountOfButtons - 1;
CExtBarMdiRightButton * pRightTBB = NULL;
if( nCountOfButtons > 0 )
pRightTBB =
DYNAMIC_DOWNCAST(
CExtBarMdiRightButton,
_GetButtonPtr(nRightIndex)
);
if( pRightTBB == NULL
&& nCountOfButtons > 1
)
{
if( !m_bMultiRowLayout )
nRightIndex--;
pRightTBB =
DYNAMIC_DOWNCAST(
CExtBarMdiRightButton,
_GetButtonPtr(nRightIndex)
);
}
BOOL bRetVal = FALSE;
if( hWndActiveChild == NULL || (!bMax) )
{ // if no active MDI doc or not maximized
if( pRightTBB != NULL )
{
ASSERT_VALID( pRightTBB );
VERIFY( RemoveButton(nRightIndex,FALSE) );
bRetVal = TRUE;
pRightTBB = NULL;
}
if( pDocTBB != NULL )
{
ASSERT_VALID( pDocTBB );
VERIFY( RemoveButton(0,FALSE) );
bRetVal = TRUE;
pDocTBB = NULL;
}
} // if no active MDI doc or not maximized
else
{ // if acdive MDI doc is maximized
ASSERT( hWndActiveChild != NULL );
ASSERT( ::IsWindow(hWndActiveChild) );
if( m_nMdiDocButtonCmdID == 0 )
{
CExtCmdItem * pCmdItem =
g_CmdManager->CmdAllocPtr(
g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() )
);
ASSERT( pCmdItem != NULL );
if( pCmdItem == NULL )
return FALSE;
m_nMdiDocButtonCmdID = pCmdItem->m_nCmdID;
ASSERT(
CExtCmdManager::IsCommand(
m_nMdiDocButtonCmdID
)
);
//pCmdItem->StateSetMenubarTemp();
pCmdItem->StateSetBasic();
} // if( m_nMdiDocButtonCmdID == 0 )
if( pRightTBB == NULL )
{
pRightTBB =
new CExtBarMdiRightButton(
this,
m_nMdiDocButtonCmdID
);
ASSERT_VALID( pRightTBB );
m_buttons.InsertAt( nRightIndex + 1, pRightTBB );
bRetVal = TRUE;
} // if( pRightTBB == NULL )
if( pDocTBB == NULL )
{
HMENU hDocMenu =
::GetSystemMenu(hWndActiveChild,FALSE);
if( hDocMenu != NULL
&& ::IsMenu(hDocMenu)
)
{
pDocTBB =
new CExtBarMdiDocButton(
this,
m_nMdiDocButtonCmdID
);
ASSERT_VALID( pDocTBB );
pDocTBB->SetMenu( hDocMenu, FALSE, FALSE );
m_buttons.InsertAt( 0, pDocTBB );
bRetVal = TRUE;
}
} // if( pDocTBB == NULL )
} // if acdive MDI doc is maximized
if( bDoRecalcLayout )
{
_RecalcLayoutImpl();
bRetVal = FALSE;
}
return bRetVal;
}
void CExtMenuControlBar::OnDestroy()
{
if( m_nMdiDocButtonCmdID != 0 )
{
VERIFY(
g_CmdManager->CmdRemove(
g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
m_nMdiDocButtonCmdID
)
);
m_nMdiDocButtonCmdID = 0;
}
RemoveAllWndHooks();
CExtToolControlBar::OnDestroy();
}
BOOL CExtMenuControlBar::TranslateMainFrameMessage(MSG* pMsg)
{
if( GetSafeHwnd() == NULL
|| (!::IsWindow(GetSafeHwnd()))
)
return FALSE;
ASSERT_VALID(this);
ASSERT(pMsg);
if( pMsg->message == WM_ACTIVATE
|| pMsg->message == WM_ACTIVATEAPP
|| pMsg->message == WM_SETFOCUS
|| pMsg->message == WM_KILLFOCUS
)
{
g_bCancelNearestAltUp = true;
return FALSE;
} // if( pMsg->message == WM_ACTIVATE ...
#if (!defined __EXT_MFC_NO_CUSTOMIZE)
CExtCustomizeSite * pSite = GetCustomizeSite();
if( pSite != NULL
&& pSite->GetCustomizeDropSource() != NULL
)
return FALSE;
#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
bool bDockSiteCustomizeMode =
_IsDockSiteCustomizeMode();
if( m_bMdiApp )
{
if( ( pMsg->message == WM_COMMAND
&& ( (LOWORD(pMsg->wParam)) == ID_NEXT_PANE
|| (LOWORD(pMsg->wParam)) == ID_PREV_PANE
|| (LOWORD(pMsg->wParam)) == ID_WINDOW_NEW
|| (LOWORD(pMsg->wParam)) == ID_WINDOW_ARRANGE
|| (LOWORD(pMsg->wParam)) == ID_WINDOW_CASCADE
|| (LOWORD(pMsg->wParam)) == ID_WINDOW_TILE_HORZ
|| (LOWORD(pMsg->wParam)) == ID_WINDOW_TILE_VERT
|| (LOWORD(pMsg->wParam)) == ID_WINDOW_SPLIT
)
)
|| pMsg->message == WM_MDIACTIVATE
|| pMsg->message == WM_MDINEXT
|| pMsg->message == WM_MDIRESTORE
|| pMsg->message == WM_MDIMAXIMIZE
|| pMsg->message == WM_MDITILE
|| pMsg->message == WM_MDICASCADE
|| pMsg->message == WM_MDIICONARRANGE
)
{
if( bDockSiteCustomizeMode )
return TRUE;
if( IsOleIpObjActive() )
return TRUE;
}
} // if( m_bMdiApp )
bool bPrintPreviewMode = false;
if( (!m_bPresubclassDialogMode)
&& (!bDockSiteCustomizeMode)
&& m_pDockSite->GetSafeHwnd() != NULL
&& FindPrintPreviewMode(m_pDockSite)
)
bPrintPreviewMode = true;
bool bComboDropDownTracking = false;
CWnd * pWndCurrFocus = CWnd::GetFocus();
if( pWndCurrFocus != NULL )
{
if( pWndCurrFocus->IsKindOf(RUNTIME_CLASS(CComboBox)) )
{
if( (pWndCurrFocus->GetStyle() & (CBS_DROPDOWN|CBS_DROPDOWNLIST)) != 0
&& ((CComboBox *)pWndCurrFocus)->GetDroppedState()
)
bComboDropDownTracking = true;
}
else
{
pWndCurrFocus = pWndCurrFocus->GetParent();
if( pWndCurrFocus != NULL )
{
if( pWndCurrFocus->IsKindOf(RUNTIME_CLASS(CComboBox)) )
{
if( (pWndCurrFocus->GetStyle() & (CBS_DROPDOWN|CBS_DROPDOWNLIST)) != 0
&& ((CComboBox *)pWndCurrFocus)->GetDroppedState()
)
bComboDropDownTracking = true;
}
}
}
}
UINT nMsg = pMsg->message;
if( nMsg == WM_COMMAND
&& HIWORD( pMsg->wParam ) == 0
) // (+ v.2.23)
{
bool bAlt = ( (::GetAsyncKeyState(VK_MENU)&0x8000) != 0 ) ? true : false;
g_bCancelNearestAltUp = bAlt;
}
if( nMsg == WM_SYSKEYDOWN
|| nMsg == WM_SYSKEYUP
|| nMsg == WM_KEYDOWN
|| nMsg == WM_KEYUP
)
{
BOOL bKeyUp =
( nMsg == WM_KEYUP ||
nMsg == WM_SYSKEYUP) ?
TRUE : FALSE;
BOOL bCtrl = GetKeyState(VK_CONTROL) & 0x80000000;
BOOL bShift = GetKeyState(VK_SHIFT) & 0x80000000;
BOOL bAlt = HIWORD(pMsg->lParam) & KF_ALTDOWN;
TCHAR vkTCHAR = (TCHAR)pMsg->wParam;
if( vkTCHAR == VK_MENU && (!bCtrl) && (!bShift) )
{ // only VK_MENU pressed
if( bDockSiteCustomizeMode )
return TRUE;
if( bPrintPreviewMode
|| bComboDropDownTracking
)
return FALSE;
if( m_bFlatTracking ) // (+ v.2.23)
{
if( !bKeyUp )
return TRUE;
m_bFlatTracking = false;
_UpdateFlatTracking();
return TRUE;
} // if( m_bFlatTracking )
if( !bKeyUp )
{
g_bCancelNearestAltUp = false;
return FALSE; // (+ v.2.23)
}
if( g_bCancelNearestAltUp
|| g_bMenuTracking
|| GetButtonsCount() == 0
)
{
if( g_bCancelNearestAltUp ) // (+ v.2.23)
return FALSE;
return TRUE;
}
CExtToolControlBar::g_bMenuTrackingExpanded = false;
TrackButtonMenu( 0 );
return TRUE;
} // only VK_MENU pressed
if( (! m_bPresubclassDialogMode )
&& bAlt
&& ( vkTCHAR == VK_SPACE
|| ( m_bMdiApp // (+ v.2.23)
&& ( vkTCHAR == VK_SUBTRACT
// disable warning C4310: cast truncates constant value
#pragma warning( push )
#pragma warning( disable : 4310 )
|| vkTCHAR == ((TCHAR)0xbd) // '-' near '0'
// rollback warning C4310: cast truncates constant value
#pragma warning( pop )
)
)
)
)
{
if( bDockSiteCustomizeMode )
return TRUE;
if( bKeyUp )
return TRUE;
// allow child popup track it's system menu
CWnd * pWnd = CWnd::GetActiveWindow();
if( pWnd == NULL
|| (!(::IsWindow(pWnd->GetSafeHwnd())))
)
return TRUE;
if( pWnd->GetSafeHwnd() != _GetDockingFrameImpl()->GetSafeHwnd()
&& (pWnd->GetStyle() & WS_POPUP) != 0
)
return TRUE;
// track frame system menu
CExtToolControlBar::g_bMenuTrackingExpanded = false;
if( !_IsDockSiteCustomizeMode() )
{
if( m_bFlatTracking ) // (+ v.2.23)
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
if( vkTCHAR == VK_SPACE )
{
TrackMainFrameSystemMenu( NULL, TRUE );
} // if( vkTCHAR == VK_SPACE )
else
{
ASSERT( m_bMdiApp ); // (+ v.2.23)
if( nMsg == WM_KEYDOWN
|| nMsg == WM_KEYUP
)
return TRUE;
BOOL bMax = FALSE;
HWND hWndActiveChild = _GetActiveMdiChildWnd( bMax );
if( hWndActiveChild == NULL )
{
if( !bKeyUp )
g_bCancelNearestAltUp = true;
return TRUE;
}
bool bExplicitTrackChildFrameSystemMenu = true;
if( GetButtonsCount() > 0 )
{
CExtBarButton * pTBB = _GetButtonPtr( 0 );
ASSERT_VALID( pTBB );
if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
{
VERIFY( CExtToolControlBar::TrackButtonMenu( 0 ) );
bExplicitTrackChildFrameSystemMenu = false;
} // if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
} // if( GetButtonsCount() > 0 )
if( bExplicitTrackChildFrameSystemMenu )
TrackChildFrameSystemMenu( NULL, TRUE );
} // else from if( vkTCHAR == VK_SPACE )
}
return TRUE;
} // if( ( !m_bPresubclassDialogMode ) && bAlt && vkTCHAR == VK_SPACE )
if( ( bPrintPreviewMode || bComboDropDownTracking )
&& (! bDockSiteCustomizeMode )
)
return FALSE;
if( bAlt && (!bDockSiteCustomizeMode) )
{ // if VK_ALT + VK_... pressed
// if( g_bCancelNearestAltUp ) // (+ v.2.23)
// return FALSE;
if( bKeyUp )
{
return TRUE;
}
if( m_bFlatTracking )
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
BYTE lpKeyState[256];
::GetKeyboardState( lpKeyState );
UINT wScanCode = ::MapVirtualKey( vkTCHAR, 0 );
HKL hKeyboardLayout =
::GetKeyboardLayout(
( ::AfxGetThread() ) -> m_nThreadID
);
#if (defined _UNICODE)
TCHAR szChar[2] = { _T('\0'), _T('\0') };
::ToUnicodeEx(
vkTCHAR,
wScanCode,
lpKeyState,
szChar, 1,
1,
hKeyboardLayout
);
#else
WORD nMapped = 0;
::ToAsciiEx(
vkTCHAR,
wScanCode,
lpKeyState,
&nMapped,
1,
hKeyboardLayout
);
TCHAR szChar[2] = { (TCHAR)nMapped, _T('\0') };
#endif
::CharUpper( szChar );
int nBtnIdx = -1;
if( szChar[0] != 0 )
{
nBtnIdx = GetButtonByAccessKey( szChar[0] );
if( nBtnIdx < 0 )
{
CPtrList _listVisibleToolBars;
CFrameWnd * pDockSite = m_pDockSite;
if( pDockSite == NULL )
pDockSite =
DYNAMIC_DOWNCAST( CFrameWnd, GetParent() );
if( pDockSite != NULL )
{
ExtControlBarVector_t vBars;
CExtControlBar::_GetFrameControlBars(
vBars,
__GFECB_FIXED|__GFECB_NONFIXED|__GFECB_DOCKED|__GFECB_FLOATED|__GFECB_VIS_ALL
);
for( int i = 0; i < vBars.GetSize(); i++ )
{
CExtToolControlBar * pToolBar =
DYNAMIC_DOWNCAST( CExtToolControlBar, vBars[i] );
if( pToolBar->GetSafeHwnd() == NULL
|| pToolBar == this
)
continue;
ASSERT_VALID( pToolBar );
ASSERT( pToolBar->IsVisible() );
_listVisibleToolBars.AddTail( pToolBar );
}
} // if( pDockSite != NULL )
else
{
for( CWnd * pWnd = GetParent()->GetWindow( GW_CHILD );
pWnd != NULL;
pWnd = pWnd->GetWindow( GW_HWNDNEXT )
)
{
CExtToolControlBar * pToolBar =
DYNAMIC_DOWNCAST( CExtToolControlBar, pWnd );
if( pToolBar->GetSafeHwnd() == NULL
|| pToolBar == this
)
continue;
ASSERT_VALID( pToolBar );
if( ! pToolBar->IsVisible() )
continue;
_listVisibleToolBars.AddTail( pToolBar );
}
} // else from if( pDockSite != NULL )
for( POSITION pos = _listVisibleToolBars.GetHeadPosition();
pos != NULL;
)
{
CExtToolControlBar * pToolBar = (CExtToolControlBar *)
_listVisibleToolBars.GetNext( pos );
int nBtnIdx = pToolBar->GetButtonByAccessKey( szChar[0] );
if( nBtnIdx < 0 )
continue;
CExtBarButton * pTBB = pToolBar->GetButton( nBtnIdx );
ASSERT_VALID( pTBB );
ASSERT( !pTBB->IsSeparator() );
if( pTBB->IsAbleToTrackMenu() )
{
CExtToolControlBar::g_bMenuTrackingExpanded = false;
pToolBar->TrackButtonMenu( nBtnIdx, true );
} // if( pTBB->IsAbleToTrackMenu() )
else
{
g_bCancelNearestAltUp =
CExtPopupMenuWnd::IsKeyPressed( VK_MENU )
? true : false;
pTBB->OnDeliverCmd();
} // else from if( pTBB->IsAbleToTrackMenu() )
return TRUE;
}
g_bCancelNearestAltUp = true; // (+ v.2.23)
return FALSE;
} // if( nBtnIdx < 0 )
else
{
CExtBarButton * pTBB = CExtToolControlBar::GetButton( nBtnIdx );
ASSERT_VALID( pTBB );
ASSERT( !pTBB->IsSeparator() );
if( pTBB->IsAbleToTrackMenu() )
{
CExtToolControlBar::g_bMenuTrackingExpanded = false;
CExtToolControlBar::TrackButtonMenu( nBtnIdx, true );
} // if( pTBB->IsAbleToTrackMenu() )
else
{
g_bCancelNearestAltUp =
CExtPopupMenuWnd::IsKeyPressed( VK_MENU )
? true : false;
pTBB->OnDeliverCmd();
} // else from if( pTBB->IsAbleToTrackMenu() )
return TRUE;
} // else from if( nBtnIdx < 0 )
} // if( szChar[0] != 0 )
g_bCancelNearestAltUp = true; // (+ v.2.23)
return FALSE;
} // if( bAlt && (!bDockSiteCustomizeMode) )
if( m_bFlatTracking && (!bDockSiteCustomizeMode) )
{
if( bKeyUp )
return TRUE;
bool bUpdateIndex = false;
switch( vkTCHAR )
{
case VK_LEFT:
bUpdateIndex = true;
//m_nFlatTrackingIndex--;
m_nFlatTrackingIndex =
GetVisibleButton(
m_nFlatTrackingIndex,
FALSE
);
break;
case VK_RIGHT:
bUpdateIndex = true;
//m_nFlatTrackingIndex++;
m_nFlatTrackingIndex =
GetVisibleButton(
m_nFlatTrackingIndex,
TRUE
);
break;
case VK_RETURN:
case VK_UP:
case VK_DOWN:
{
if( CExtPopupMenuWnd::IsMenuTracking()
|| m_nFlatTrackingIndex < 0
)
return TRUE;
ASSERT( m_nFlatTrackingIndex < GetButtonsCount() );
CExtBarButton * pTBB =
_GetButtonPtr(m_nFlatTrackingIndex);
ASSERT_VALID( pTBB );
if( pTBB->IsAbleToTrackMenu() )
{
int nIndex = m_nFlatTrackingIndex;
m_bFlatTracking = false;
_UpdateFlatTracking( FALSE );
CExtToolControlBar::TrackButtonMenu(
nIndex,
true
);
}
else
{
if( vkTCHAR == VK_RETURN
&& CExtCmdManager::IsCommand(
pTBB->GetCmdID(true)
)
)
{
pTBB->OnClick(
CPoint(0,0),
false
);
}
}
return TRUE;
}
break;
case VK_ESCAPE:
// if( g_bMenuTracking
// //&& !m_bFlatTracking
// )
// //if( CExtPopupMenuWnd::IsMenuTracking() )
// {
// m_nFlatTrackingIndex = GetMenuTrackingButton();
// _CloseTrackingMenus();
// if( m_nFlatTrackingIndex >= 0 )
// m_bFlatTracking = true;
// else
// m_bFlatTracking = false;
// }
// else
m_bFlatTracking = false;
_UpdateFlatTracking();
return TRUE;
} // switch( vkTCHAR )
if( bUpdateIndex )
{
int nCountOfButtons = GetButtonsCount();
ASSERT( nCountOfButtons > 0 );
if( m_nFlatTrackingIndex < 0 )
m_nFlatTrackingIndex = nCountOfButtons - 1;
else if(m_nFlatTrackingIndex >= nCountOfButtons)
m_nFlatTrackingIndex = 0;
}
_UpdateFlatTracking();
return TRUE;
} // if( m_bFlatTracking && (!bDockSiteCustomizeMode) )
}
if( nMsg == WM_CONTEXTMENU )
{
if( g_bMenuTracking || m_bFlatTracking || bDockSiteCustomizeMode )
return TRUE;
}
if( m_bFlatTracking && (!bDockSiteCustomizeMode) )
{
if( (nMsg >= WM_MOUSEFIRST && nMsg <= WM_MOUSELAST)
&& nMsg != WM_MOUSEMOVE
)
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
} // if( m_bFlatTracking && (!bDockSiteCustomizeMode) )
return FALSE;
}
CRect CExtMenuControlBar::_GetChildFrameSysIconRect()
{
CRect rc;
rc.SetRectEmpty();
BOOL bMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bMax );
if( hWndActiveChild == NULL )
return rc;
ASSERT( ::IsWindow(hWndActiveChild) );
if( bMax )
return rc;
CWnd * pWnd = CWnd::FromHandlePermanent(hWndActiveChild);
if( pWnd == NULL )
{
ASSERT( FALSE );
return rc;
}
ASSERT_VALID( pWnd );
ASSERT( pWnd->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) );
CFrameWnd * pFrame =
DYNAMIC_DOWNCAST(
CFrameWnd,
pWnd
);
ASSERT( pFrame != NULL );
if( pFrame == NULL )
{
ASSERT( FALSE );
return rc;
}
ASSERT_VALID( pFrame );
CRect rcWnd,rcClient,rcHelper;
pFrame->GetWindowRect( &rcWnd );
pFrame->GetClientRect( &rcClient );
rcHelper = rcWnd;
pFrame->ScreenToClient( &rcHelper );
ASSERT( rcHelper.top <= rcClient.top );
int yDiff = rcClient.top - rcHelper.top;
rc.SetRect(
rcWnd.left + GetSystemMetrics(SM_CYFRAME),
rcWnd.top + GetSystemMetrics(SM_CXFRAME),
rcWnd.left + yDiff,
rcWnd.top + yDiff
);
return rc;
}
CRect CExtMenuControlBar::_GetMainFrameSysIconRect()
{
CRect rc;
CRect rcWnd,rcClient,rcHelper;
CFrameWnd * pFrame =
_GetDockingFrameImpl();
ASSERT_VALID( pFrame );
pFrame->GetWindowRect( &rcWnd );
pFrame->GetClientRect( &rcClient );
rcHelper = rcWnd;
pFrame->ScreenToClient( &rcHelper );
ASSERT( rcHelper.top <= rcClient.top );
int yDiff = rcClient.top - rcHelper.top;
rc.SetRect(
rcWnd.left + GetSystemMetrics(SM_CYFRAME),
rcWnd.top + GetSystemMetrics(SM_CXFRAME),
rcWnd.left + yDiff,
rcWnd.top + yDiff
);
return rc;
}
BOOL CExtMenuControlBar::_TrackFrameSystemMenu(
CFrameWnd * pFrame,
CPoint * pPoint, // = NULL, // NULL means calc meny track area automatically
BOOL bSelectAny, // = FALSE
LPCRECT rcExcludeArea, // = NULL
UINT nTrackFlags, // = (UINT)(-1)
BOOL bCombinedMode // = FALSE
)
{
if( m_bFlatTracking )
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
if( nTrackFlags == (UINT)(-1) )
nTrackFlags = TPMX_BOTTOMALIGN;
ASSERT_VALID( pFrame );
bool bPrevTBMT = CExtToolControlBar::g_bMenuTracking;
int nTrackingIdxOld = m_nBtnIdxMenuTracking;
// if( g_bMenuTracking )
CExtToolControlBar::_CloseTrackingMenus();
// if( CExtPopupMenuWnd::IsMenuTracking() )
// CExtPopupMenuWnd::CancelMenuTracking();
CMenu * pSysMenu = pFrame->GetSystemMenu( FALSE );
if( pSysMenu == NULL )
return FALSE;
ASSERT( ::IsMenu(pSysMenu->GetSafeHmenu()) );
CExtPopupMenuWnd * pPopup = new CExtPopupMenuWnd;
if( !pPopup->CreatePopupMenu( pFrame->GetSafeHwnd() ) )
{
ASSERT( FALSE );
return FALSE;
}
if( !pPopup->UpdateFromMenu(
pFrame->GetSafeHwnd(),
pSysMenu,
false
)
)
{
ASSERT( FALSE );
return FALSE;
}
CPoint point;
if( pPoint != NULL)
{
point = *pPoint;
}
else
{
CRect rcWnd,rcClient,rcHelper;
pFrame->GetWindowRect( &rcWnd );
pFrame->GetClientRect( &rcClient );
rcHelper = rcWnd;
pFrame->ScreenToClient( &rcHelper );
ASSERT( rcHelper.top <= rcClient.top );
int yDiff = rcClient.top - rcHelper.top;
point = rcWnd.TopLeft();
point.x += GetSystemMetrics(SM_CXFRAME);
point.y += yDiff;
}
if( bSelectAny )
nTrackFlags |= TPMX_SELECT_ANY;
if( bPrevTBMT )
nTrackFlags |= TPMX_NO_HIDE_RARELY;
pFrame->SetFocus();
CExtToolControlBar::g_bMenuTracking =
bSelectAny ? bPrevTBMT : false; // (+ v.2.23)
if( nTrackingIdxOld >= 0 )
_SwitchMenuTrackingIndex( nTrackingIdxOld );
if( !pPopup->TrackPopupMenu(
nTrackFlags|TPMX_COMBINE_DEFAULT|TPMX_OWNERDRAW_FIXED,
point.x,point.y,
rcExcludeArea,
bCombinedMode ?
this : NULL,
bCombinedMode ?
CExtToolControlBar::_CbPaintCombinedContent : NULL,
NULL,
bCombinedMode ? true : false
)
)
{
delete pPopup;
CExtToolControlBar::_CloseTrackingMenus();
return FALSE;
}
g_bMenuTracking = true;
return TRUE;
}
BOOL CExtMenuControlBar::TrackChildFrameSystemMenu(
CPoint * pPoint, // = NULL, // NULL means calc meny track area automatically
BOOL bSelectAny // = FALSE
)
{
if( !m_bMdiApp )
{
ASSERT( FALSE );
return FALSE;
}
if( GetButtonsCount() > 0 )
{
CExtBarButton * pTBB = _GetButtonPtr( 0 );
ASSERT_VALID( pTBB );
if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
{
if( !TrackButtonMenu( 0 ) )
{
ASSERT( FALSE );
return FALSE;
} // if( !TrackButtonMenu( 0 ) )
return TRUE;
} // if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
} // if( GetButtonsCount() > 0 )
BOOL bMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bMax );
if( hWndActiveChild == NULL )
{
ASSERT( FALSE );
return FALSE;
}
ASSERT( ::IsWindow(hWndActiveChild) );
CWnd * pWnd = CWnd::FromHandlePermanent(hWndActiveChild);
if( pWnd == NULL )
{
ASSERT( FALSE );
return FALSE;
}
ASSERT_VALID( pWnd );
ASSERT( pWnd->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) );
CFrameWnd * pFrame =
DYNAMIC_DOWNCAST(
CFrameWnd,
pWnd
);
ASSERT( pFrame != NULL );
if( pFrame == NULL )
{
ASSERT( FALSE );
return FALSE;
}
ASSERT_VALID( pFrame );
g_bMenuTracking = true;
_SwitchMenuTrackingIndex();
m_bSysMenuTracking =
_TrackFrameSystemMenu(
pFrame,
pPoint,
bSelectAny
) ? true : false;
return m_bSysMenuTracking ? TRUE : FALSE;
}
BOOL CExtMenuControlBar::TrackMainFrameSystemMenu(
CPoint * pPoint, // = NULL // NULL means calc meny track area automatically
BOOL bSelectAny // = FALSE
)
{
CFrameWnd * pFrame =
_GetDockingFrameImpl();
ASSERT_VALID( pFrame );
g_bMenuTracking = true;
_SwitchMenuTrackingIndex();
m_bSysMenuTracking =
_TrackFrameSystemMenu(
pFrame,
pPoint,
bSelectAny
) ? true : false;
return m_bSysMenuTracking ? TRUE : FALSE;
}
BOOL CExtMenuControlBar::TrackButtonMenu(
int nIndex,
BOOL bSelectAny, // = FALSE
BOOL bDelayedTracking // = FALSE
)
{
bSelectAny;
bDelayedTracking;
if( g_bMenuTracking
&& m_nBtnIdxMenuTracking == nIndex
)
return TRUE;
if( !SafeDisplayBar() )
return FALSE;
if( m_bFlatTracking )
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
VERIFY(
PostMessage(
g_nMsgTrackButtonMenu,
(WPARAM)nIndex
)
);
return TRUE;
}
LRESULT CExtMenuControlBar::OnTrackButtonMenu(WPARAM wParam,LPARAM lParam)
{
lParam;
if( !( ::IsWindowEnabled(
m_bPresubclassDialogMode
? GetOwner()->GetSafeHwnd()
: _GetDockingFrameImpl()->GetSafeHwnd()
)
)
)
return 0;
int nCountOfButtons = GetButtonsCount();
ASSERT( nCountOfButtons >= 0 );
if( nCountOfButtons == 0 )
return 0;
int nIndex = int(wParam);
if( nIndex < 0 || nIndex>=nCountOfButtons )
{
if( m_bFlatTracking )
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
_CloseTrackingMenus();
return 0;
}
CExtBarButton * pTBB = _GetButtonPtr(nIndex);
ASSERT_VALID( pTBB );
BOOL bDroppedMode =
CExtPopupMenuWnd::IsMenuTracking();
if( !pTBB->IsAbleToTrackMenu() )
bDroppedMode = FALSE;
if( bDroppedMode )
{
CExtToolControlBar::TrackButtonMenu( nIndex, true );
return 0;
}
_CloseTrackingMenus();
if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() )
CExtMouseCaptureSink::ReleaseCapture();
m_nFlatTrackingIndex = nIndex;
m_bFlatTracking = true;
_UpdateFlatTracking();
return 0;
}
void CExtMenuControlBar::_UpdateFlatTracking(
BOOL bRepaint // = TRUE
)
{
if( m_nFlatTrackingIndex < 0
&& m_nOldTrackingIndex < 0
)
{
m_bFlatTracking = false;
return;
}
HWND hWndCurrentFocus = ::GetFocus();
if( hWndCurrentFocus != NULL )
{
CWnd * pWndTest = CWnd::FromHandlePermanent( hWndCurrentFocus );
if( pWndTest == NULL )
{
HWND hWnd = ::GetParent( hWndCurrentFocus );
if( hWnd != NULL )
pWndTest = CWnd::FromHandlePermanent( hWnd );
} // if( pWndTest == NULL )
if( pWndTest != NULL )
{
CComboBox * pComboTest =
DYNAMIC_DOWNCAST( CComboBox, pWndTest );
if( pComboTest == NULL )
{
pWndTest = pWndTest->GetParent();
if( pWndTest != NULL )
{
pComboTest =
DYNAMIC_DOWNCAST( CComboBox, pWndTest );
}
} // if( pComboTest == NULL )
if( pComboTest != NULL
&& (pComboTest->GetStyle() & (CBS_DROPDOWN|CBS_DROPDOWNLIST)) != 0
&& pComboTest->GetDroppedState()
)
pComboTest->ShowDropDown( FALSE );
} // if( pWndTest != NULL )
} // if( hWndCurrentFocus != NULL )
int nCountOfButtons = GetButtonsCount();
if( !m_bFlatTracking )
{
if( m_nFlatTrackingIndex >= 0 )
{
ASSERT( m_nFlatTrackingIndex < nCountOfButtons );
CExtBarButton * pTBB =
_GetButtonPtr(m_nFlatTrackingIndex);
ASSERT_VALID( pTBB );
pTBB->ModifyStyle(0,TBBS_PRESSED);
if( bRepaint )
{
_InvalidateButton(m_nFlatTrackingIndex);
UpdateWindow();
}
m_nFlatTrackingIndex = m_nOldTrackingIndex = -1;
}
// if( g_bMenuTracking )
// _CloseTrackingMenus();
return;
} // if( !m_bFlatTracking )
if( m_nFlatTrackingIndex != m_nOldTrackingIndex )
{
if( m_nOldTrackingIndex >= 0 )
{
ASSERT( m_nOldTrackingIndex < nCountOfButtons );
CExtBarButton * pTBB =
_GetButtonPtr(m_nOldTrackingIndex);
ASSERT_VALID( pTBB );
pTBB->ModifyStyle(0,TBBS_PRESSED|TBBS_CHECKED);
if( bRepaint )
_InvalidateButton(m_nOldTrackingIndex);
}
if( m_nFlatTrackingIndex >= 0 )
{
ASSERT( m_nFlatTrackingIndex < nCountOfButtons );
CExtBarButton * pTBB =
_GetButtonPtr(m_nFlatTrackingIndex);
ASSERT_VALID( pTBB );
pTBB->ModifyStyle(TBBS_PRESSED);
if( bRepaint )
_InvalidateButton(m_nFlatTrackingIndex);
}
m_nOldTrackingIndex = m_nFlatTrackingIndex;
UpdateWindow();
} // if( m_nFlatTrackingIndex != m_nOldTrackingIndex )
}
void CExtMenuControlBar::_DelaySyncActiveMdiChild()
{
ASSERT_VALID( this );
if( m_bDelayedSyncActiveMdiChild
|| m_bDelayedUpdateMenuBar
|| m_hWnd == NULL
|| (! ::IsWindow(m_hWnd) )
)
return;
m_bDelayedSyncActiveMdiChild = true;
PostMessage( WM_TIMER, 13, 0 );
}
void CExtMenuControlBar::_DelayUpdateMenuBar()
{
ASSERT_VALID( this );
if( m_bDelayedUpdateMenuBar
|| m_hWnd == NULL
|| (! ::IsWindow(m_hWnd) )
)
return;
m_bDelayedSyncActiveMdiChild = false;
m_bDelayedUpdateMenuBar = true;
PostMessage( WM_TIMER, 14, 0 );
}
void CExtMenuControlBar::OnTimer(UINT nIDEvent)
{
if( nIDEvent == 13 )
{
if( m_bDelayedSyncActiveMdiChild )
_SyncActiveMdiChild();
m_bDelayedSyncActiveMdiChild = false;
return;
}
if( nIDEvent == 14 )
{
if( m_bDelayedUpdateMenuBar )
VERIFY( UpdateMenuBar( TRUE ) );
m_bDelayedUpdateMenuBar = false;
return;
}
CExtToolControlBar::OnTimer(nIDEvent);
}
bool CExtMenuControlBar::_OnMouseMoveMsg(UINT nFlags, CPoint point)
{
if( !m_bFlatTracking )
return CExtToolControlBar::_OnMouseMoveMsg(nFlags, point);
int nIndex = HitTest(point);
if( nIndex == m_nFlatTrackingIndex
|| nIndex < 0
)
return true;
//m_nFlatTrackingIndex = nIndex;
//_UpdateFlatTracking();
TrackButtonMenu( nIndex );
return true;
}
void CExtMenuControlBar::OnLButtonDown(UINT nFlags, CPoint point)
{
if( !m_bFlatTracking )
{
int nIndex = HitTest(point);
if( nIndex >= 0 )
{
int nMenuIndex = GetMenuTrackingButton();
if( nIndex == nMenuIndex )
return;
}
}
CExtToolControlBar::OnLButtonDown(nFlags, point);
}
void CExtMenuControlBar::OnLButtonUp(UINT nFlags, CPoint point)
{
BOOL bRepaint = FALSE;
if( m_bFlatTracking )
{
m_bFlatTracking = false;
_UpdateFlatTracking( FALSE );
bRepaint = TRUE;
}
CExtToolControlBar::OnLButtonUp(nFlags, point);
if( bRepaint )
Invalidate();
}
void CExtMenuControlBar::_RecalcLayoutImpl()
{
CExtToolControlBar::_RecalcLayoutImpl();
if( m_pDockSite != NULL
&& (! IsFloating() )
&& ( ! ((InternalFriendlyFrameWnd*)m_pDockSite)->IsInRecalcLayout() )
)
m_pDockSite->RecalcLayout();
}
void CExtMenuControlBar::_RecalcPositionsImpl()
{
CExtToolControlBar::_RecalcPositionsImpl();
if( g_bHideMenuBarExpandContentButton
&& m_pRightBtn != NULL
)
{
ASSERT_VALID( m_pRightBtn );
if( m_pRightBtn->GetButtons().GetSize() == 0 )
m_pRightBtn->Show( FALSE );
}
CWnd * pWndParent = GetParent();
ASSERT_VALID( pWndParent );
BOOL bInDockBar = pWndParent->IsKindOf(RUNTIME_CLASS(CDockBar));
if( IsFloating() && bInDockBar )
return;
int nCountOfButtons = GetButtonsCount();
if( nCountOfButtons <= 1 )
return;
int nRightIndex = nCountOfButtons - 1;
CExtBarMdiRightButton * pRightTBB =
DYNAMIC_DOWNCAST(
CExtBarMdiRightButton,
_GetButtonPtr(nRightIndex)
);
if( pRightTBB == NULL && nCountOfButtons > 1 )
{
nRightIndex--;
pRightTBB =
DYNAMIC_DOWNCAST(
CExtBarMdiRightButton,
_GetButtonPtr(nRightIndex)
);
} // if( pRightTBB == NULL && nCountOfButtons > 1 )
if( pRightTBB == NULL )
return;
if( !pRightTBB->IsVisible() )
return;
ASSERT( nRightIndex >= 1 );
#ifdef _DEBUG
CExtBarButton * pPrevTBB =
_GetButtonPtr( nRightIndex - 1 );
ASSERT_VALID( pPrevTBB );
/// ASSERT( pPrevTBB->IsVisible() );
#endif // _DEBUG
CExtBarButton * pExpandTBB = NULL;
CRect rcBtnExpand(0,0,0,0);
int nAlignMargin = 0;
BOOL bHorz =
bInDockBar
? IsDockedHorizontally()
: ( (m_dwStyle & (CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM))
? true
: false
)
;
CRect rcClient;
GetClientRect( &rcClient );
if( nRightIndex < (nCountOfButtons-1) )
{
pExpandTBB = _GetButtonPtr( nRightIndex + 1 );
ASSERT_VALID( pExpandTBB );
if( !pExpandTBB->IsKindOf( RUNTIME_CLASS(CExtBarContentExpandButton)) )
pExpandTBB = NULL;
} // if( nRightIndex < (nCountOfButtons-1) )
if( pExpandTBB != NULL )
{ // if content-expand button exists
if( pExpandTBB->IsVisible() )
{
rcBtnExpand = pExpandTBB->Rect();
nAlignMargin =
bHorz ? rcBtnExpand.left : rcBtnExpand.top;
} // if( pExpandTBB->IsVisible() )
else
{
pExpandTBB = NULL;
nAlignMargin =
bHorz ? rcClient.right : rcClient.bottom;
} // else from if( pExpandTBB->IsVisible() )
nAlignMargin -= __MENUBAR_RIGHT_ADJUST_GAP;
} // if content-expand button exists
else
{ // if content-expand button DOES NOT exists
nAlignMargin =
bHorz ? rcClient.right : rcClient.bottom;
nAlignMargin -= __MENUBAR_RIGHT_ADJUST_GAP;
} // if content-expand button DOES NOT exists
CRect rcBtnRight = pRightTBB->Rect();
if( bHorz && rcBtnRight.right >= nAlignMargin )
return;
if( (!bHorz) && rcBtnRight.bottom >= nAlignMargin )
return;
if( bHorz )
{
rcBtnRight.OffsetRect(
nAlignMargin - rcBtnRight.right,
0
);
} // if( bHorz )
else
{
rcBtnRight.OffsetRect(
0,
nAlignMargin - rcBtnRight.bottom
);
} // else from if( bHorz )
if( pExpandTBB == NULL )
{
pRightTBB->SetRect(rcBtnRight);
return;
}
ASSERT( !rcBtnExpand.IsRectEmpty() );
CRect rcBtnExpand2(
bHorz ? rcBtnRight.left : rcBtnExpand.left,
bHorz ? rcBtnExpand.top : rcBtnRight.top,
bHorz ?
rcBtnRight.left + rcBtnExpand.Width()
:
rcBtnExpand.left + rcBtnExpand.Width()
,
bHorz ?
rcBtnExpand.top + rcBtnExpand.Height()
:
rcBtnRight.top + rcBtnExpand.Height()
);
rcBtnRight.OffsetRect(
bHorz ? rcBtnExpand.right - rcBtnRight.right : 0,
bHorz ? 0 : rcBtnExpand.bottom - rcBtnRight.bottom
);
pRightTBB->SetRect(rcBtnRight);
pExpandTBB->SetRect(rcBtnExpand2);
if( g_bHideMenuBarExpandContentButton )
pExpandTBB->Show( FALSE );
}
bool CExtMenuControlBar::_GetFullRowMode() const
{
ASSERT_VALID( this );
return true;
}
bool CExtMenuControlBar::OnQueryMultiRowLayout() const
{
ASSERT_VALID( this );
if( m_bPresubclassDialogMode
// || m_pDockSite == NULL
)
return false;
if( m_pDockBar != NULL )
{
if( IsFloating() )
return false;
if( _IsDockSiteCustomizeMode() )
return true;
} // if( m_pDockBar != NULL )
return m_bMultiRowLayout;
}
CExtBarContentExpandButton * CExtMenuControlBar::OnCreateBarRightBtn()
{
ASSERT_VALID( this );
if( m_bMultiRowLayout )
return NULL;
return CExtToolControlBar::OnCreateBarRightBtn();
}
void CExtMenuControlBar::_Dragging_OnStart()
{
if( m_bFlatTracking )
{
m_bFlatTracking = false;
_UpdateFlatTracking();
}
if( g_bMenuTracking )
_CloseTrackingMenus();
CExtToolControlBar::_Dragging_OnStart();
}
void CExtMenuControlBar::_Dragging_OnStop(
CExtControlBar::InternalDraggingState_t & _dsOld,
CExtControlBar::InternalDraggingState_t & _dsNew,
bool bCancel
)
{
CExtToolControlBar::_Dragging_OnStop(
_dsOld,
_dsNew,
bCancel
);
if( m_bMdiApp )
{
_InstallMdiDocButtons();
_RecalcPositionsImpl();
}
}
HWND CExtMenuControlBar::_GetHwndMainFrame()
{
if( m_bPresubclassDialogMode )
return NULL;
CFrameWnd * pFrame = _GetDockingFrameImpl();
ASSERT_VALID( pFrame );
ASSERT( ::IsWindow(pFrame->GetSafeHwnd()) );
return pFrame->GetSafeHwnd();
}
HWND CExtMenuControlBar::_GetHwndPlacement()
{
if( !m_bPresubclassDialogMode )
return NULL;
return m_hWndHelper;
}
HWND CExtMenuControlBar::_GetHwndChildFrame()
{
if( m_bPresubclassDialogMode )
return NULL;
return m_hWndHelper;
}
HWND CExtMenuControlBar::_GetHwndMdiArea()
{
if( m_bPresubclassDialogMode )
return NULL;
ASSERT( m_bMdiApp );
CFrameWnd * pFrame = _GetDockingFrameImpl();
ASSERT_VALID( pFrame );
ASSERT( ::IsWindow(pFrame->GetSafeHwnd()) );
ASSERT_KINDOF( CMDIFrameWnd, pFrame );
HWND hWndMdiArea = ((CMDIFrameWnd*)pFrame)->m_hWndMDIClient;
ASSERT( hWndMdiArea != NULL );
ASSERT( ::IsWindow(hWndMdiArea) );
return hWndMdiArea;
}
int CExtMenuControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CExtToolControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
CFrameWnd * pFrame = _GetDockingFrameImpl();
if( pFrame == NULL )
{
m_bPresubclassDialogMode = true;
if( m_hWndHelper == NULL )
{
m_hWndHelper = ::GetParent( m_hWnd );
ASSERT( m_hWndHelper != NULL );
ASSERT( ::IsWindow( m_hWndHelper ) );
if( !IsHookedWindow( m_hWndHelper ) )
SetupHookWndSink( m_hWndHelper );
} // if( m_hWndHelper == NULL )
return 0;
}
ASSERT_VALID( pFrame );
ASSERT( ::IsWindow(pFrame->GetSafeHwnd()) );
ASSERT( m_menuFrame.GetSafeHmenu() == NULL );
ASSERT( m_menuDoc.GetSafeHmenu() == NULL );
HMENU hFrameMenu = pFrame->GetMenu()->GetSafeHmenu();
if( hFrameMenu != NULL )
{
m_menuFrame.Attach( hFrameMenu );
_UpdateMenuBar( FALSE );
pFrame->SetMenu( NULL );
}
if( !SetupHookWndSink( _GetHwndMainFrame() ) )
{
ASSERT( FALSE );
return FALSE;
}
if( pFrame->IsKindOf(RUNTIME_CLASS(CMDIFrameWnd)) )
{
m_bMdiApp = true;
if( !SetupHookWndSink( _GetHwndMdiArea() ) )
{
ASSERT( FALSE );
return FALSE;
}
::SetWindowPos(
_GetHwndMdiArea(),
NULL,
0,0,0,0,
SWP_FRAMECHANGED
|SWP_NOOWNERZORDER|SWP_NOCOPYBITS
|SWP_NOREPOSITION
|SWP_NOZORDER|SWP_NOACTIVATE
|SWP_NOMOVE|SWP_NOSIZE
);
VERIFY( _SyncActiveMdiChild() );
} // if( pFrame->IsKindOf(RUNTIME_CLASS(CMDIFrameWnd)) )
// pass message loop for smooth MDI client area update reasons
CExtPopupMenuWnd::PassMsgLoop( CExtControlBar::g_bEnableOnIdleCalls );
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CExtBarMdiDocButton
IMPLEMENT_DYNCREATE(CExtBarMdiDocButton,CExtBarButton)
CSize CExtBarMdiDocButton::CalculateLayout(
CDC & dc,
CSize sizePreCalc,
BOOL bHorz
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
ASSERT_VALID( (&dc) );
ASSERT( m_pCtrl == NULL );
ASSERT( !IsSeparator() );
// CExtBarButton::CalculateLayout( dc, sizePreCalc, bHorz );
//const int nExtraMargin =
// __EXT_TB_BUTTON_OUTER_MARGIN * 2
// + __EXT_TB_BUTTON_INNER_MARGIN * 2
// + __EXT_TB_BUTTON_TEXT_MARGIN * 2
// ;
// if( m_ActiveSize.cx > nExtraMargin )
// m_ActiveSize.cx -= nExtraMargin;
// if( m_ActiveSize.cy > nExtraMargin )
// m_ActiveSize.cy -= nExtraMargin;
// return m_ActiveSize;
return CExtBarButton::CalculateLayout( dc, sizePreCalc, bHorz );
}
bool CExtBarMdiDocButton::CanStartCommandDrag()
{
ASSERT_VALID( this );
return false;
}
#if (!defined __EXT_MFC_NO_CUSTOMIZE)
CExtCustomizeCmdTreeNode * CExtBarMdiDocButton::GetCmdNode(
bool bInitial // = false
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
bInitial;
ASSERT( m_pCmdNodeI == NULL );
ASSERT( m_pCmdNodeC == NULL );
return NULL;
}
void CExtBarMdiDocButton::SetBasicCmdNode(
CExtCustomizeCmdTreeNode * pNode
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
ASSERT( m_pCmdNodeI == NULL );
ASSERT( m_pCmdNodeC == NULL );
ASSERT( FALSE ); // should be never called
pNode;
}
void CExtBarMdiDocButton::SetCustomizedCmdNode(
CExtCustomizeCmdTreeNode * pNode
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
ASSERT( m_pCmdNodeI == NULL );
ASSERT( m_pCmdNodeC == NULL );
ASSERT( FALSE ); // should be never called
pNode;
}
CExtCustomizeCmdTreeNode * CExtBarMdiDocButton::OnCustomizeNodeInit(
CExtCustomizeSite * pSite,
CExtCustomizeCmdTreeNode * pParentNode // toolbar node
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
ASSERT( pSite != NULL );
ASSERT_VALID( pParentNode );
pSite;
pParentNode;
return NULL; // no customization support
}
#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
BOOL CExtBarMdiDocButton::PutToPopupMenu(
CExtPopupMenuWnd * pPopup
)
{
ASSERT( pPopup != NULL );
ASSERT( pPopup->GetSafeHwnd() == NULL );
ASSERT_VALID( GetBar() );
ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
ASSERT( m_pCtrl == NULL );
ASSERT( !IsSeparator() );
BOOL bDummyMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bDummyMax );
// if( hWndActiveChild == NULL )
// return;
ASSERT( ::IsWindow( hWndActiveChild ) );
CFrameWnd * pFrame =
DYNAMIC_DOWNCAST(
CFrameWnd,
CWnd::FromHandle(hWndActiveChild)
);
CMenu * pSysMenu =
pFrame->GetSystemMenu( FALSE );
if( pSysMenu == NULL )
{
ASSERT( FALSE );
return FALSE;
}
ASSERT( ::IsMenu(pSysMenu->GetSafeHmenu()) );
CExtCmdIcon * pIcon = GetIconPtr();
#if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__)
CExtLocalResourceHelper _LRH;
#endif // #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__)
CExtSafeString sActiveDocument;
if( !sActiveDocument.LoadString(IDS_ACTIVE_DOCUMENT) )
{
#if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__)
ASSERT( FALSE );
#endif // #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__)
sActiveDocument = _T("Active document");
}
if( !pPopup->ItemInsert(
(UINT)CExtPopupMenuWnd::TYPE_POPUP,
-1,
sActiveDocument,
(pIcon == NULL) ? NULL : pIcon->GetIcon()
)
)
{
ASSERT( FALSE );
return FALSE;
}
CExtPopupMenuWnd * pChildPopup =
pPopup->ItemGetPopup(
pPopup->ItemGetCount() - 1
);
ASSERT( pChildPopup != NULL );
if( !pChildPopup->UpdateFromMenu(
GetBar()->GetSafeHwnd(),
pSysMenu,
false,
false
)
)
{
ASSERT( FALSE );
return FALSE;
}
pChildPopup->
SetCmdTargetToAllItems(
hWndActiveChild
);
VERIFY(
pPopup->ItemInsert(
CExtPopupMenuWnd::TYPE_SEPARATOR,
-1
)
);
return TRUE;
}
HWND CExtBarMdiDocButton::_GetActiveMdiChildWnd(
BOOL & bMaximized
)
{
bMaximized = FALSE;
CMDIFrameWnd * pFrame =
DYNAMIC_DOWNCAST(
CMDIFrameWnd,
GetBar()->_GetDockingFrameImpl()
);
if( pFrame == NULL )
return NULL;
HWND hWndMdiArea = pFrame->m_hWndMDIClient;
ASSERT( hWndMdiArea != NULL );
ASSERT( ::IsWindow(hWndMdiArea) );
//BOOL bMax = FALSE;
HWND hWndActiveChild = (HWND)
::SendMessage(
hWndMdiArea,
WM_MDIGETACTIVE,
0,
(LPARAM)&bMaximized
);
return hWndActiveChild;
}
CExtCmdIcon * CExtBarMdiDocButton::GetIconPtr()
{
ASSERT_VALID( GetBar() );
BOOL bMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bMax );
if( hWndActiveChild == NULL )
return NULL;
ASSERT( ::IsWindow(hWndActiveChild) );
HICON hIcon = (HICON)
hIcon = (HICON)
::SendMessage(
hWndActiveChild,
CExtControlBar::g_nMsgQueryIcon,
0,
0
);
if( hIcon == NULL )
hIcon = (HICON)
::SendMessage(
hWndActiveChild,
WM_GETICON,
ICON_SMALL,
0
);
if( hIcon == NULL )
hIcon = (HICON)
::SendMessage(
hWndActiveChild,
WM_GETICON,
ICON_BIG,
0
);
if(hIcon == NULL)
hIcon = (HICON)
::GetClassLong(
hWndActiveChild,
GCL_HICONSM
);
if(hIcon == NULL)
return NULL;
m_iconCache.AssignFromHICON( hIcon, true );
return &m_iconCache;
}
CWnd * CExtBarMdiDocButton::GetCmdTargetWnd()
{
ASSERT_VALID( GetBar() );
BOOL bMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bMax );
if( hWndActiveChild == NULL )
{
return NULL;
};
ASSERT( ::IsWindow(hWndActiveChild) );
CWnd * pWnd = CWnd::FromHandlePermanent(hWndActiveChild);
if( pWnd == NULL )
{
ASSERT( FALSE );
return NULL;
}
ASSERT_VALID( pWnd );
ASSERT( pWnd->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) );
return pWnd;
}
UINT CExtBarMdiDocButton::OnTrackPopup(
CPoint point,
bool bSelectAny
)
{
ASSERT_VALID( GetBar() );
bool bDockSiteCustomizeMode =
GetBar()->_IsDockSiteCustomizeMode();
if( bDockSiteCustomizeMode )
return UINT(-1L);
CExtMenuControlBar * pBar =
DYNAMIC_DOWNCAST(
CExtMenuControlBar,
GetBar()
);
CWnd * pWnd = CExtBarMdiDocButton::GetCmdTargetWnd();
CFrameWnd * pFrame =
DYNAMIC_DOWNCAST(
CFrameWnd,
pWnd
);
ASSERT( pFrame != NULL );
if( pBar == NULL || pFrame == NULL )
{
CExtBarButton::OnTrackPopup( point, bSelectAny );
return UINT(-1L);
}
bool bPrevTBMT = CExtToolControlBar::g_bMenuTracking;
if( CExtToolControlBar::g_bMenuTracking
//&& CExtPopupMenuWnd::IsMenuTracking()
&& pBar->_GetIndexOf(this) ==
pBar->m_nBtnIdxMenuTracking
)
return UINT(-1L);
CExtToolControlBar::_CloseTrackingMenus();
if( pBar->IsFloating() )
{
pBar->ActivateTopParent();
CFrameWnd * pFrame =
pBar->GetDockingFrame();
ASSERT_VALID( pFrame );
pFrame->BringWindowToTop();
}
UINT nTrackFlags = TPMX_TOPALIGN;
CRect rcBtn = Rect();
// point.x = rcBtn.left;
// point.y = rcBtn.bottom;
switch( GetBar()->GetSafeDockBarDlgCtrlID() )
{
case AFX_IDW_DOCKBAR_BOTTOM:
nTrackFlags = TPMX_BOTTOMALIGN;
// point.x = rcBtn.left;
// point.y = rcBtn.bottom;
break;
case AFX_IDW_DOCKBAR_LEFT:
nTrackFlags = TPMX_LEFTALIGN;
// point.x = rcBtn.right;
// point.y = rcBtn.top;
break;
case AFX_IDW_DOCKBAR_RIGHT:
nTrackFlags = TPMX_RIGHTALIGN;
// point.x = rcBtn.left;
// point.y = rcBtn.top;
break;
} // switch( GetBar()->GetSafeDockBarDlgCtrlID() )
pBar->ClientToScreen( &rcBtn );
// pBar->ClientToScreen( &point );
point = rcBtn.CenterPoint();
CExtToolControlBar::g_bMenuTracking = bPrevTBMT;
GetBar()->_SwitchMenuTrackingIndex(
GetBar()->_GetIndexOf( this )
);
pBar->m_bSysMenuTracking =
pBar->
_TrackFrameSystemMenu(
pFrame,
&point, // NULL,
TRUE,
&rcBtn,
nTrackFlags,
TRUE
) ? true : false;
CExtToolControlBar::g_bMenuTracking = true;
return UINT(-1L);
}
/////////////////////////////////////////////////////////////////////////////
// CExtBarMdiRightButton
IMPLEMENT_DYNCREATE(CExtBarMdiRightButton,CExtBarMdiDocButton)
BOOL CExtBarMdiRightButton::PutToPopupMenu(
CExtPopupMenuWnd * pPopup
)
{
ASSERT( pPopup != NULL );
ASSERT( pPopup->GetSafeHwnd() == NULL );
ASSERT_VALID( GetBar() );
ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
ASSERT( m_pCtrl == NULL );
ASSERT( !IsSeparator() );
CExtMenuControlBar * pBar =
DYNAMIC_DOWNCAST(
CExtMenuControlBar,
GetBar()
);
ASSERT_VALID( pBar );
BOOL bHorz = !pBar->IsDockedVertically();
MdiMenuBarRightButtonsInfo_t _info;
pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
if( !_info.m_bInitialized )
return FALSE;
BOOL bDummyMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bDummyMax );
// if( hWndActiveChild == NULL )
// return;
ASSERT( ::IsWindow( hWndActiveChild ) );
int nCount = pPopup->ItemGetCount();
if( nCount > 0 )
{
if( pPopup->ItemGetCmdID(nCount-1) !=
CExtPopupMenuWnd::TYPE_SEPARATOR
)
{
VERIFY(
pPopup->ItemInsert(
CExtPopupMenuWnd::TYPE_SEPARATOR,
-1
)
);
}
}
if( _info.m_bBtnHelp )
{
VERIFY(
pPopup->ItemInsert(
SC_CONTEXTHELP,
-1,NULL,NULL,hWndActiveChild
)
);
}
if( _info.m_bBtnMinimize )
{
VERIFY(
pPopup->ItemInsert(
SC_MINIMIZE,
-1,NULL,NULL,hWndActiveChild
)
);
VERIFY(
pPopup->ItemInsert(
SC_RESTORE,
-1,NULL,NULL,hWndActiveChild
)
);
}
// if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize )
// {
// VERIFY(
// pPopup->ItemInsert(
// SC_MAXIMIZE,
// -1,NULL,NULL,hWndActiveChild
// )
// );
// }
if( _info.m_bBtnMaximize )
{
VERIFY(
pPopup->ItemInsert(
_info.m_bBtnMinimize ? SC_MAXIMIZE : SC_RESTORE,
-1,NULL,NULL,hWndActiveChild
)
);
}
if( _info.m_bBtnClose )
{
VERIFY(
pPopup->ItemInsert(
SC_CLOSE,
-1,NULL,NULL,hWndActiveChild
)
);
}
return TRUE;
}
CExtCmdIcon * CExtBarMdiRightButton::GetIconPtr()
{
return NULL;
}
void CExtMenuControlBar::_GetMdiMenuBarRightButtonsInfo(
CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t & _info,
CExtBarMdiRightButton * pTBB,
BOOL bHorz
)
{
ASSERT_VALID( this );
ASSERT_VALID( pTBB );
_info.m_pWndMdiChildFrame =
pTBB->GetCmdTargetWnd();
if( _info.m_pWndMdiChildFrame == NULL )
return;
ASSERT( _info.m_pWndMdiChildFrame->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) );
ASSERT_VALID( _info.m_pWndMdiChildFrame );
_info.m_pBar = this;
DWORD dwFrameStyle = _info.m_pWndMdiChildFrame->GetStyle();
_info.m_bBtnClose = false;
CMenu * pSysMenu = _info.m_pWndMdiChildFrame->GetSystemMenu( FALSE );
if( pSysMenu != NULL )
{
INT nCount = pSysMenu->GetMenuItemCount();
for( INT nItem = 0; nItem < nCount; nItem++ )
{
UINT nID = pSysMenu->GetMenuItemID( nItem );
if( nID != SC_CLOSE )
continue;
MENUITEMINFO mii;
::memset(&mii,0,sizeof(MENUITEMINFO));
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE;
if( !pSysMenu->GetMenuItemInfo(
nItem,
&mii,
TRUE
)
)
break;
if( ( mii.fState & (MFS_DISABLED|MFS_GRAYED) ) == 0 )
_info.m_bBtnClose = true;
break;
} // for( INT nItem = 0; nItem < nCount; nItem++ )
} // if( pSysMenu != NULL )
_info.m_bBtnMaximize =
(dwFrameStyle & WS_MAXIMIZEBOX) ?
true : false;
_info.m_bBtnMinimize =
(dwFrameStyle & WS_MINIMIZEBOX) ?
true : false;
_info.m_bBtnHelp =
(_info.m_bBtnMaximize && (_info.m_pWndMdiChildFrame->GetExStyle()&WS_EX_CONTEXTHELP)) ?
true : false;
if( bHorz )
{
_info.m_calcSize.cx = __GAP_BETWEEN_WND_RIGHT_BUTTONS;
_info.m_calcSize.cy = _info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
if( _info.m_bBtnMinimize )
_info.m_calcSize.cx +=
(_info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS)*2;
if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize )
_info.m_calcSize.cx +=
_info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
if( _info.m_bBtnHelp )
_info.m_calcSize.cx +=
_info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
if( _info.m_bBtnClose )
_info.m_calcSize.cx +=
_info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
} // if( bHorz )
else
{
_info.m_calcSize.cx = _info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
_info.m_calcSize.cy = __GAP_BETWEEN_WND_RIGHT_BUTTONS;
if( _info.m_bBtnMinimize )
_info.m_calcSize.cy +=
(_info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS)*2;
if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize )
_info.m_calcSize.cy +=
_info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
if( _info.m_bBtnHelp )
_info.m_calcSize.cy +=
_info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
if( _info.m_bBtnClose )
_info.m_calcSize.cy +=
_info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
} // else from if( bHorz )
_info.m_bInitialized = true;
}
CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t::
MdiMenuBarRightButtonsInfo_t()
{
m_bInitialized
= m_bBtnClose
= m_bBtnMaximize
= m_bBtnMinimize
= m_bBtnHelp
= false;
m_pBar = NULL;
m_pWndMdiChildFrame = NULL;
if( g_PaintManager.m_bIsWinXPorLater )
{
CSize _sizeTmp( // (+ v.2.22)
::GetSystemMetrics(SM_CXSMSIZE),
::GetSystemMetrics(SM_CYSMSIZE)
);
int nMetric =
max( _sizeTmp.cx, _sizeTmp.cy ) + 1;
m_cxIcon = max( nMetric, 18 ); // 16->18 (+ v.2.23)
m_cyIcon = max( nMetric, 18 ); // 16->18 (+ v.2.23)
} // if( g_PaintManager.m_bIsWinXPorLater )
else
{
m_cxIcon = ::GetSystemMetrics(SM_CXSIZE);
m_cyIcon = ::GetSystemMetrics(SM_CYSIZE);
} // else from if( g_PaintManager.m_bIsWinXPorLater )
ASSERT(
m_cxIcon > __GAP_BETWEEN_WND_RIGHT_BUTTONS
&&
m_cyIcon > __GAP_BETWEEN_WND_RIGHT_BUTTONS
);
m_cxIcon -= __GAP_BETWEEN_WND_RIGHT_BUTTONS;
m_cyIcon -= __GAP_BETWEEN_WND_RIGHT_BUTTONS;
m_calcSize.cx = m_calcSize.cy = 0;
EmptyLocations();
}
void CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t::
EmptyLocations()
{
m_rcBtnClose.SetRectEmpty();
m_rcBtnMaximize.SetRectEmpty();
m_rcBtnRestore.SetRectEmpty();
m_rcBtnMinimize.SetRectEmpty();
m_rcBtnHelp.SetRectEmpty();
}
void CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t::
InitLocations(
const CRect & rcBtn,
BOOL bHorz
)
{
ASSERT( m_bInitialized );
EmptyLocations();
if( rcBtn.IsRectEmpty() )
return;
CRect rcStart(0,0,0,0);
CSize sizeOffset(0,0);
if( bHorz )
{
int nOffset = (rcBtn.Height() - m_cyIcon) / 2;
rcStart.SetRect(
rcBtn.left + __GAP_BETWEEN_WND_RIGHT_BUTTONS,
rcBtn.top + nOffset,
rcBtn.left + __GAP_BETWEEN_WND_RIGHT_BUTTONS
+ m_cxIcon,
rcBtn.top + nOffset + m_cyIcon
);
sizeOffset.cx = m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
} // if( bHorz )
else
{
int nOffset = (rcBtn.Width() - m_cxIcon) / 2;
rcStart.SetRect(
rcBtn.left + nOffset,
rcBtn.top + __GAP_BETWEEN_WND_RIGHT_BUTTONS,
rcBtn.left + nOffset + m_cxIcon,
rcBtn.top + __GAP_BETWEEN_WND_RIGHT_BUTTONS
+ m_cxIcon
);
sizeOffset.cy = m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
} // else from if( bHorz )
if( m_bBtnHelp )
{
m_rcBtnHelp = rcStart;
rcStart.OffsetRect(sizeOffset);
}
if( m_bBtnMinimize )
{
m_rcBtnMinimize = rcStart;
rcStart.OffsetRect(sizeOffset);
m_rcBtnRestore = rcStart;
rcStart.OffsetRect(sizeOffset);
}
if( m_bBtnMaximize && !m_bBtnMinimize )
{
m_rcBtnMaximize = rcStart;
rcStart.OffsetRect(sizeOffset);
}
if( m_bBtnClose )
m_rcBtnClose = rcStart;
}
CSize CExtBarMdiRightButton::CalculateLayout(
CDC & dc,
CSize sizePreCalc,
BOOL bHorz
)
{
ASSERT_VALID( this );
dc;
ASSERT_VALID( GetBar() );
ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
ASSERT_VALID( (&dc) );
ASSERT( m_pCtrl == NULL );
ASSERT( !IsSeparator() );
CExtMenuControlBar * pBar =
STATIC_DOWNCAST(
CExtMenuControlBar,
GetBar()
);
ASSERT_VALID( pBar );
MdiMenuBarRightButtonsInfo_t _info;
pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
//ASSERT( _info.m_bInitialized );
if( !_info.m_bInitialized )
return CSize( 1, 1 );
CSize _size( _info.m_calcSize );
if( bHorz )
{
if( _size.cy < sizePreCalc.cy )
_size.cy = sizePreCalc.cy;
}
else
{
if( _size.cx < sizePreCalc.cx )
_size.cx = sizePreCalc.cx;
}
m_ActiveSize = _size;
return _size;
}
void CExtBarMdiRightButton::Paint(
CDC & dc,
bool bHorz
)
{
ASSERT_VALID( GetBar() );
ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
ASSERT_VALID( (&dc) );
ASSERT( m_pCtrl == NULL );
ASSERT( !IsSeparator() );
CExtMenuControlBar * pBar =
DYNAMIC_DOWNCAST(
CExtMenuControlBar,
GetBar()
);
ASSERT_VALID( pBar );
MdiMenuBarRightButtonsInfo_t _info;
pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
if( !_info.m_bInitialized )
return;
_info.InitLocations( Rect(), bHorz );
CPoint ptCursor( 0, 0 );
::GetCursorPos(&ptCursor);
pBar->ScreenToClient( &ptCursor );
bool bFlat = true;
bool bDrawBorder = true;
int eAlign =
CExtPaintManager::__ALIGN_HORIZ_CENTER
| CExtPaintManager::__ALIGN_VERT;
bool bEnabled = IsEnabled() ? true : false;
if( _info.m_bBtnHelp )
{
bool bHover =
(IsHover() && _info.m_rcBtnHelp.PtInRect(ptCursor))
? true : false;
bool bPushed =
(IsPressed() && _info.m_rcBtnHelp.PtInRect(ptCursor))
? true : false;
CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdCtxHelp(
this,
bHorz ? true : false,
_info.m_rcBtnHelp,_T(""),NULL,bFlat,
bHover, bPushed, false, bEnabled,
bDrawBorder,false,false,eAlign,
NULL,false,SC_CONTEXTHELP,
(!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
);
g_PaintManager->PaintPushButton( dc, _ppbdCtxHelp );
}
if( _info.m_bBtnMinimize )
{
bool bHover =
(IsHover() && _info.m_rcBtnRestore.PtInRect(ptCursor))
? true : false;
bool bPushed =
(IsPressed() && _info.m_rcBtnRestore.PtInRect(ptCursor))
? true : false;
CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdRestore(
this,
bHorz ? true : false,
_info.m_rcBtnRestore,_T(""),NULL,bFlat,
bHover, bPushed, false, bEnabled,
bDrawBorder,false,false,eAlign,
NULL,false,SC_RESTORE,
(!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
);
g_PaintManager->PaintPushButton( dc, _ppbdRestore );
bHover =
(IsHover() && _info.m_rcBtnMinimize.PtInRect(ptCursor))
? true : false;
bPushed =
(IsPressed() && _info.m_rcBtnMinimize.PtInRect(ptCursor))
? true : false;
CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdMinimize(
this,
bHorz ? true : false,
_info.m_rcBtnMinimize,_T(""),NULL,bFlat,
bHover, bPushed, false, bEnabled,
bDrawBorder,false,false,eAlign,
NULL,false,SC_MINIMIZE,
(!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
);
g_PaintManager->PaintPushButton( dc, _ppbdMinimize );
}
if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize )
{
bool bHover =
(IsHover() && _info.m_rcBtnMaximize.PtInRect(ptCursor))
? true : false;
bool bPushed =
(IsPressed() && _info.m_rcBtnMaximize.PtInRect(ptCursor))
? true : false;
CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdMaximize(
this,
bHorz ? true : false,
_info.m_rcBtnMaximize,_T(""),NULL,bFlat,
bHover, bPushed, false, bEnabled,
bDrawBorder,false,false,eAlign,
NULL,false,SC_MAXIMIZE,
(!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
);
g_PaintManager->PaintPushButton( dc, _ppbdMaximize );
}
if( _info.m_bBtnClose )
{
bool bHover =
(IsHover() && _info.m_rcBtnClose.PtInRect(ptCursor))
? true : false;
bool bPushed =
(IsPressed() && _info.m_rcBtnClose.PtInRect(ptCursor))
? true : false;
CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdClose(
this,
bHorz ? true : false,
_info.m_rcBtnClose,_T(""),NULL,bFlat,
bHover, bPushed, false, bEnabled,
bDrawBorder,false,false,eAlign,
NULL,false,SC_CLOSE,
(!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
);
g_PaintManager->PaintPushButton( dc, _ppbdClose );
}
}
UINT CExtBarMdiRightButton::OnTrackPopup(
CPoint point,
bool bSelectAny
)
{
point;
bSelectAny;
return UINT( -1L );
}
void CExtBarMdiRightButton::OnClick(
CPoint point,
bool bDown
)
{
bool bDockSiteCustomizeMode =
GetBar()->_IsDockSiteCustomizeMode();
if( bDockSiteCustomizeMode )
return;
if( bDown )
return;
// CExtMouseCaptureSink::ReleaseCapture();
ASSERT_VALID( GetBar() );
ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
ASSERT( m_pCtrl == NULL );
ASSERT( !IsSeparator() );
CExtMenuControlBar * pBar =
DYNAMIC_DOWNCAST(
CExtMenuControlBar,
GetBar()
);
ASSERT_VALID( pBar );
BOOL bHorz = !pBar->IsDockedVertically();
MdiMenuBarRightButtonsInfo_t _info;
pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
if( !_info.m_bInitialized )
return;
_info.InitLocations( Rect(), bHorz );
bool bInstallHideFlag = false;
UINT nHelperSysCmdID = 0;
if( _info.m_bBtnHelp
&& _info.m_rcBtnHelp.PtInRect(point)
)
nHelperSysCmdID = SC_CONTEXTHELP;
else if( _info.m_bBtnMinimize
&& _info.m_rcBtnRestore.PtInRect(point)
)
{
nHelperSysCmdID = SC_RESTORE;
bInstallHideFlag = true;
}
else if( _info.m_bBtnMinimize
&& _info.m_rcBtnMinimize.PtInRect(point)
)
{
nHelperSysCmdID = SC_MINIMIZE;
bInstallHideFlag = true;
}
else if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize
&& _info.m_rcBtnMaximize.PtInRect(point)
)
nHelperSysCmdID = SC_MAXIMIZE;
else if( _info.m_bBtnClose
&& _info.m_rcBtnClose.PtInRect(point)
)
nHelperSysCmdID = SC_CLOSE;
if( nHelperSysCmdID == 0 )
return;
BOOL bDummyMax = FALSE;
HWND hWndActiveChild =
_GetActiveMdiChildWnd( bDummyMax );
if( hWndActiveChild == NULL )
return;
ASSERT( ::IsWindow( hWndActiveChild ) );
if( nHelperSysCmdID == SC_MAXIMIZE )
{
HWND hWndMdiClientArea =
::GetParent( hWndActiveChild );
ASSERT( hWndMdiClientArea != NULL );
ASSERT( ::IsWindow( hWndMdiClientArea ) );
::PostMessage(
hWndMdiClientArea,
WM_MDIRESTORE,
(WPARAM)hWndActiveChild,
0
);
} // if( nHelperSysCmdID == SC_MAXIMIZE )
else
{
pBar->ClientToScreen( &point );
::PostMessage(
hWndActiveChild,
WM_SYSCOMMAND,
nHelperSysCmdID,
MAKELONG( point.x, point.y )
);
} // else
if( bInstallHideFlag )
{
Show( FALSE );
ASSERT( GetBar()->GetButtonsCount() > 0 );
CExtBarButton * pTBB = GetBar()->GetButton( 0 );
ASSERT_VALID( pTBB );
if( pTBB->IsVisible()
&& pTBB->IsKindOf( RUNTIME_CLASS(CExtBarMdiDocButton) )
)
{
pTBB->Show( FALSE );
}
// GetBar()->Invalidate();
// GetBar()->UpdateWindow();
// GetBar()->GetParentFrame()->DelayRecalcLayout();
}
}
int CExtBarMdiRightButton::OnToolHitTest(
CPoint point,
TOOLINFO * pTI
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
ASSERT( m_pCtrl == NULL );
ASSERT( !IsSeparator() );
CExtMenuControlBar * pBar =
DYNAMIC_DOWNCAST(
CExtMenuControlBar,
GetBar()
);
ASSERT_VALID( pBar );
BOOL bHorz = !pBar->IsDockedVertically();
MdiMenuBarRightButtonsInfo_t _info;
pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
if( !_info.m_bInitialized )
return -1;
_info.InitLocations( Rect(), bHorz );
if( _info.m_bBtnHelp
&& _info.m_rcBtnHelp.PtInRect(point)
)
{
if( pTI != NULL )
{
::CopyRect(
&(pTI->rect),
&_info.m_rcBtnHelp
);
CExtSafeString str;
if( str.LoadString( ID_CONTEXT_HELP ) )
pTI->lpszText = (LPTSTR)
::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
if( pTI->lpszText != NULL )
_tcscpy( pTI->lpszText, str );
else
pTI->lpszText = LPSTR_TEXTCALLBACK;
}
return ((int)ID_CONTEXT_HELP);
}
if( _info.m_bBtnMinimize
&& _info.m_rcBtnRestore.PtInRect(point)
)
{
if( pTI != NULL )
{
::CopyRect(
&(pTI->rect),
&_info.m_rcBtnRestore
);
CExtSafeString str;
if( str.LoadString( AFX_IDS_SCRESTORE ) )
pTI->lpszText = (LPTSTR)
::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
if( pTI->lpszText != NULL )
_tcscpy( pTI->lpszText, str );
else
pTI->lpszText = LPSTR_TEXTCALLBACK;
}
return ((int)AFX_IDS_SCRESTORE);
}
if( _info.m_bBtnMinimize
&& _info.m_rcBtnMinimize.PtInRect(point)
)
{
if( pTI != NULL )
{
::CopyRect(
&(pTI->rect),
&_info.m_rcBtnMinimize
);
CExtSafeString str;
if( str.LoadString( AFX_IDS_SCMINIMIZE ) )
pTI->lpszText = (LPTSTR)
::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
if( pTI->lpszText != NULL )
_tcscpy( pTI->lpszText, str );
else
pTI->lpszText = LPSTR_TEXTCALLBACK;
}
return ((int)AFX_IDS_SCMINIMIZE);
}
if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize
&& _info.m_rcBtnMaximize.PtInRect(point)
)
{
if( pTI != NULL )
{
::CopyRect(
&(pTI->rect),
&_info.m_rcBtnMaximize
);
CExtSafeString str;
if( str.LoadString( AFX_IDS_SCMAXIMIZE ) )
pTI->lpszText = (LPTSTR)
::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
if( pTI->lpszText != NULL )
_tcscpy( pTI->lpszText, str );
else
pTI->lpszText = LPSTR_TEXTCALLBACK;
}
return ((int)AFX_IDS_SCMAXIMIZE);
}
if( _info.m_bBtnClose
&& _info.m_rcBtnClose.PtInRect(point)
)
{
if( pTI != NULL )
{
::CopyRect(
&(pTI->rect),
&_info.m_rcBtnMaximize
);
CExtSafeString str;
if( str.LoadString( AFX_IDS_SCCLOSE ) )
pTI->lpszText = (LPTSTR)
::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
if( pTI->lpszText != NULL )
_tcscpy( pTI->lpszText, str );
else
pTI->lpszText = LPSTR_TEXTCALLBACK;
}
return ((int)AFX_IDS_SCCLOSE);
}
return -1;
}
bool CExtBarMdiRightButton::CanStartCommandDrag()
{
ASSERT_VALID( this );
return false;
}
#if (!defined __EXT_MFC_NO_CUSTOMIZE)
CExtCustomizeCmdTreeNode * CExtBarMdiRightButton::GetCmdNode(
bool bInitial // = false
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
bInitial;
ASSERT( m_pCmdNodeI == NULL );
ASSERT( m_pCmdNodeC == NULL );
return NULL;
}
void CExtBarMdiRightButton::SetBasicCmdNode(
CExtCustomizeCmdTreeNode * pNode
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
ASSERT( m_pCmdNodeI == NULL );
ASSERT( m_pCmdNodeC == NULL );
ASSERT( FALSE ); // should be never called
pNode;
}
void CExtBarMdiRightButton::SetCustomizedCmdNode(
CExtCustomizeCmdTreeNode * pNode
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
ASSERT( m_pCmdNodeI == NULL );
ASSERT( m_pCmdNodeC == NULL );
ASSERT( FALSE ); // should be never called
pNode;
}
CExtCustomizeCmdTreeNode * CExtBarMdiRightButton::OnCustomizeNodeInit(
CExtCustomizeSite * pSite,
CExtCustomizeCmdTreeNode * pParentNode // toolbar node
)
{
ASSERT_VALID( this );
ASSERT_VALID( GetBar() );
ASSERT( pSite != NULL );
ASSERT_VALID( pParentNode );
pSite;
pParentNode;
return NULL; // no customization support
}
#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
LRESULT CExtBarMdiRightButton::OnHelpHitTest(
CPoint point
)
{
ASSERT_VALID( this );
return (LRESULT)OnToolHitTest(point,NULL);
}
void CExtMenuControlBar::_KillFrameMenu()
{
if( m_bPresubclassDialogMode )
return;
if( IsOleIpObjActive() )
return;
CFrameWnd * pFrame = _GetDockingFrameImpl();
ASSERT_VALID( pFrame );
HWND hWndFrame = pFrame->GetSafeHwnd();
ASSERT( hWndFrame != NULL );
ASSERT( ::IsWindow(hWndFrame) );
HMENU hFrameRealMenu = ::GetMenu( hWndFrame );
if( hFrameRealMenu == NULL )
return;
::SetMenu( hWndFrame, NULL );
_DelayUpdateMenuBar();
}
void CExtMenuControlBar::PreSubclassWindow()
{
CExtToolControlBar::PreSubclassWindow();
if( m_bPresubclassDialogMode && m_hWndHelper == NULL )
{
m_hWndHelper = ::GetParent( m_hWnd );
ASSERT( m_hWndHelper != NULL );
ASSERT( ::IsWindow( m_hWndHelper ) );
if( !IsHookedWindow( m_hWndHelper ) )
SetupHookWndSink( m_hWndHelper );
} // if( m_bPresubclassDialogMode && m_hWndHelper == NULL )
}
BOOL CExtMenuControlBar::PreTranslateMessage(MSG* pMsg)
{
if( m_bPresubclassDialogMode )
{
if( TranslateMainFrameMessage(pMsg) )
return TRUE;
}
return CExtToolControlBar::PreTranslateMessage(pMsg);
}
#if (!defined __EXT_MFC_NO_CUSTOMIZE)
CExtCustomizeSite::CCmdMenuInfo * CExtMenuControlBar::MenuInfoGet()
{
ASSERT_VALID( this );
return m_pMenuInfo;
}
CExtCustomizeSite::CCmdMenuInfo * CExtMenuControlBar::MenuInfoDetach()
{
ASSERT_VALID( this );
CExtCustomizeSite::CCmdMenuInfo * pMenuInfo = m_pMenuInfo;
m_pMenuInfo = NULL;
return pMenuInfo;
}
CExtCustomizeSite::CCmdMenuInfo * CExtMenuControlBar::MenuInfoAttach(
CExtCustomizeSite::CCmdMenuInfo * pMenuInfo
)
{
ASSERT_VALID( this );
CExtCustomizeSite::CCmdMenuInfo * pMenuInfoOld = m_pMenuInfo;
m_pMenuInfo = pMenuInfo;
return pMenuInfoOld;
}
void CExtMenuControlBar::MenuInfoUpdate()
{
ASSERT_VALID( this );
CExtCustomizeSite * pSite =
GetCustomizeSite();
if( pSite == NULL )
return;
CExtCustomizeSite::CCmdMenuInfo * pMenuInfo =
pSite->MenuInfoFindForMenuBar();
if( ((LPVOID)pMenuInfo) != ((LPVOID)MenuInfoGet()) )
MenuInfoAttach( pMenuInfo );
}
#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
void CExtMenuControlBar::SetMdiWindowPopupName(
__EXT_MFC_SAFE_LPCTSTR sMdiWindowPopupName // = NULL
)
{
ASSERT_VALID( this );
m_sMdiWindowPopupName =
( sMdiWindowPopupName != NULL )
? sMdiWindowPopupName
: _T("")
;
m_sMdiWindowPopupName.TrimLeft();
m_sMdiWindowPopupName.TrimRight();
while( m_sMdiWindowPopupName.Replace( _T("&"), _T("") ) > 0 )
{
m_sMdiWindowPopupName.TrimLeft();
m_sMdiWindowPopupName.TrimRight();
}
}