2024-12-21 10:04:04 +08:00
// OXCoolToolBar.cpp : implementation file
//
// Version: 9.3
# include "stdafx.h"
# include <stdlib.h>
# include "OXCoolToolBar.h"
# include "UTBStrOp.h"
# ifdef OX_CUSTOMIZE_COMMANDS
# include "OXDragDropCommands.h"
# endif // OX_CUSTOMIZE_COMMANDS
# if _MFC_VER>0x0421
# include <afxdtctl.h>
# endif
# ifdef _DEBUG
# define new DEBUG_NEW
# undef THIS_FILE
static char THIS_FILE [ ] = __FILE__ ;
# endif
const int ID_OXGRIPPER_WIDTH = 0 ;
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// COXCoolToolBar idle update through COXCoolToolBarCmdUI class.
void COXCoolToolBarCmdUI : : Enable ( BOOL bOn )
{
m_bEnableChanged = TRUE ;
COXCoolToolBar * pCoolToolBar = ( COXCoolToolBar * ) m_pOther ;
CToolBarCtrl * pToolBarCtrl = & pCoolToolBar - > GetToolBarCtrl ( ) ;
ASSERT ( pToolBarCtrl ! = NULL ) ;
ASSERT ( m_nIndex < m_nIndexMax ) ;
// Get toolbar button state
TBBUTTON TB ;
pToolBarCtrl - > GetButton ( m_nIndex , & TB ) ;
BYTE nNewState = ( BYTE ) ( TB . fsState & ~ TBSTATE_ENABLED ) ;
if ( bOn )
nNewState | = TBSTATE_ENABLED ;
if ( nNewState ! = TB . fsState )
{
# ifdef TBIF_BYINDEX
TBBUTTONINFO bi ;
ZeroMemory ( & bi , sizeof ( bi ) ) ;
bi . cbSize = sizeof ( bi ) ;
bi . dwMask = TBIF_BYINDEX | TBIF_STATE ;
bi . fsState = nNewState ;
pToolBarCtrl - > SetButtonInfo ( m_nIndex , & bi ) ;
# else
pToolBarCtrl - > SetState ( m_nID , nNewState ) ;
# endif
}
}
void COXCoolToolBarCmdUI : : SetCheck ( int nCheck )
{
ASSERT ( nCheck > = 0 & & nCheck < = 2 ) ; // 0=>off, 1=>on, 2=>indeterminate
COXCoolToolBar * pCoolToolBar = ( COXCoolToolBar * ) m_pOther ;
CToolBarCtrl * pToolBarCtrl = & pCoolToolBar - > GetToolBarCtrl ( ) ;
ASSERT ( pToolBarCtrl ! = NULL ) ;
ASSERT ( m_nIndex < m_nIndexMax ) ;
// Get toolbar button state
TBBUTTON TB ;
pToolBarCtrl - > GetButton ( m_nIndex , & TB ) ;
BYTE nNewState = ( BYTE ) ( TB . fsState & ~ ( TBSTATE_CHECKED | TBSTATE_INDETERMINATE ) ) ;
if ( nCheck = = 1 )
nNewState | = TBSTATE_CHECKED ;
else
if ( nCheck = = 2 )
nNewState | = TBSTATE_INDETERMINATE ;
if ( nNewState ! = TB . fsState )
{
# ifdef TBIF_BYINDEX
TBBUTTONINFO bi ;
ZeroMemory ( & bi , sizeof ( bi ) ) ;
bi . cbSize = sizeof ( bi ) ;
bi . dwMask = TBIF_BYINDEX | TBIF_STATE ;
bi . fsState = nNewState ;
pToolBarCtrl - > SetButtonInfo ( m_nIndex , & bi ) ;
# else
pToolBarCtrl - > SetState ( m_nID , nNewState ) ;
# endif
}
// should we set the button style too ?
// pToolBarCtrl->_SetButtonStyle(m_nIndex, nNewStyle | TBBS_CHECKBOX);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// COXCoolToolBar
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
# include "OXSkins.h"
DWORD COXCoolToolBar : : m_dwComCtlVersion = 0 ;
CMap < int , int , OXCUSTOMBUTTONDESCRIPTOR , OXCUSTOMBUTTONDESCRIPTOR & >
COXCoolToolBar : : m_mapAllCustomButtons ;
CArray < int , int > COXCoolToolBar : : m_arrAllCustomButtonIDs ;
BOOL COXCoolToolBar : : m_bCustomButtonsStateSaved = FALSE ;
BOOL COXCoolToolBar : : m_bCustomButtonsStateLoaded = FALSE ;
IMPLEMENT_DYNAMIC ( COXCoolToolBar , CToolBar )
COXCoolToolBar : : COXCoolToolBar ( ) :
# if _MFC_VER>=0x0420
m_bCool ( FALSE ) ,
// by default - flat mode
m_bSeparator ( TRUE ) ,
m_nIndent ( 0 ) ,
// means not set
m_sizeMinMaxWidth ( - 1 , - 1 ) ,
m_crDefaultTextColor ( CLR_DEFAULT ) ,
m_crHotTextColor ( CLR_DEFAULT ) ,
m_crSelectedTextColor ( CLR_DEFAULT ) ,
m_crCheckedTextColor ( CLR_DEFAULT ) ,
m_crDefaultBkColor ( CLR_DEFAULT ) ,
m_crHotBkColor ( CLR_DEFAULT ) ,
m_crSelectedBkColor ( CLR_DEFAULT ) ,
m_crCheckedBkColor ( CLR_DEFAULT ) ,
m_crDefaultBorderColor ( CLR_DEFAULT ) ,
m_crHotBorderColor ( CLR_DEFAULT ) ,
m_crSelectedBorderColor ( CLR_DEFAULT ) ,
m_crCheckedBorderColor ( CLR_DEFAULT ) ,
m_bDropDownArrow ( FALSE ) ,
# endif
m_ttID ( TTID_NOTSET ) ,
m_pBitmapIds ( NULL ) ,
m_nBitmapButtons ( 0 ) ,
m_hIcon ( NULL ) ,
m_bPrevFloating ( 3 ) , // neither TRUE not FALSE;
m_dwPrevDockSide ( ( DWORD ) - 1 ) , // none of side
m_nCustomizedButtonIndex ( - 1 ) ,
m_bAdvancedCutomizable ( FALSE ) ,
m_bInAdvancedCustomizationMode ( FALSE ) ,
m_bDragDropOwner ( FALSE ) ,
m_bDragDropOperation ( FALSE ) ,
m_hWndCustomizeOrganizer ( NULL ) ,
m_nDraggedButtonIndex ( - 1 ) ,
m_bNoInternalRedraw ( FALSE ) ,
m_bNoBkgndRedraw ( FALSE ) ,
m_nIdleFlags ( 0 ) ,
m_pToolbarSkin ( NULL ) ,
m_iDropDownIndex ( - 1 ) ,
m_iLastDropDownIndex ( - 1 ) ,
m_bFloatingEnabled ( TRUE ) ,
m_bSnapWhileDragging ( FALSE ) ,
m_bDragging ( FALSE ) ,
m_ptLButtonDown ( 0 , 0 )
{
m_bWindowsNTRunning = IsWindowsNTRunning ( ) ;
if ( m_dwComCtlVersion = = 0 )
{
DWORD dwMajor , dwMinor ;
if ( SUCCEEDED ( GetComCtlVersion ( & dwMajor , & dwMinor ) ) )
{
m_dwComCtlVersion = MAKELONG ( ( WORD ) dwMinor , ( WORD ) dwMajor ) ;
}
else
{
// assume that neither IE 3.0 nor IE 4.0 installed
m_dwComCtlVersion = 0x00040000 ;
}
}
m_nDropDownArrowWidth = GetDropDownArrowWidth ( ) ;
m_iconRect . SetRectEmpty ( ) ;
}
COXCoolToolBar : : ~ COXCoolToolBar ( )
{
LPTSTR lpszResourceName ;
// delete all bitmaps that we associated with CoolToolBar
HBITMAP hBitmap ;
POSITION pos = m_allBitmaps . GetStartPosition ( ) ;
while ( pos ! = NULL )
{
m_allBitmaps . GetNextAssoc ( pos , lpszResourceName , hBitmap ) ;
: : DeleteObject ( hBitmap ) ;
}
m_allBitmaps . RemoveAll ( ) ;
// delete all image lists that we associated with CoolToolBar
HANDLE hImageList ;
pos = m_allImageLists . GetStartPosition ( ) ;
while ( pos ! = NULL )
{
m_allImageLists . GetNextAssoc ( pos , lpszResourceName , hImageList ) ;
ImageList_Destroy ( ( HIMAGELIST ) hImageList ) ;
}
m_allImageLists . RemoveAll ( ) ;
// delete the classic skin
if ( m_pToolbarSkin ! = NULL )
delete m_pToolbarSkin ;
}
BEGIN_MESSAGE_MAP ( COXCoolToolBar , CToolBar )
//{{AFX_MSG_MAP(COXCoolToolBar)
ON_WM_NCCREATE ( )
ON_WM_NCPAINT ( )
ON_WM_PAINT ( )
ON_WM_ERASEBKGND ( )
ON_WM_NCCALCSIZE ( )
ON_WM_WINDOWPOSCHANGING ( )
ON_WM_WINDOWPOSCHANGED ( )
ON_WM_SETTINGCHANGE ( )
ON_WM_LBUTTONDOWN ( )
ON_WM_LBUTTONUP ( )
ON_WM_MBUTTONDOWN ( )
ON_WM_RBUTTONDOWN ( )
ON_WM_RBUTTONUP ( )
ON_WM_MOUSEMOVE ( )
ON_WM_LBUTTONDBLCLK ( )
//}}AFX_MSG_MAP
ON_MESSAGE ( TB_INSERTBUTTON , OnInsertButton )
ON_MESSAGE ( TB_DELETEBUTTON , OnDeleteButton )
# if _MFC_VER>=0x0420
ON_MESSAGE ( TB_MOVEBUTTON , OnMoveButton )
# endif
ON_MESSAGE ( WM_IDLEUPDATECMDUI , OnIdleUpdateCmdUI )
// reflect messages to make customization work
ON_NOTIFY_REFLECT_EX ( TBN_BEGINDRAG , OnTBNBeginDrag )
ON_NOTIFY_REFLECT_EX ( TBN_ENDDRAG , OnTBNEndDrag )
ON_NOTIFY_REFLECT_EX ( TBN_QUERYINSERT , OnTBNQueryInsert )
ON_NOTIFY_REFLECT_EX ( TBN_QUERYDELETE , OnTBNQueryDelete )
ON_NOTIFY_REFLECT_EX ( TBN_TOOLBARCHANGE , OnTBNToolBarChange )
ON_NOTIFY_REFLECT_EX ( TBN_GETBUTTONINFO , OnTBNGetButtonInfo )
// handle drag'n'drop messages
ON_MESSAGE ( SHBDTM_DRAGENTER , OnDragEnter )
ON_MESSAGE ( SHBDTM_DRAGLEAVE , OnDragLeave )
ON_MESSAGE ( SHBDTM_DRAGOVER , OnDragOver )
ON_MESSAGE ( SHBDTM_DROP , OnDrop )
// handle advanced customization commands
ON_COMMAND ( ID_OXCUSTTB_DELETE , OnCustTBDelete )
ON_COMMAND ( ID_OXCUSTTB_APPEARANCE , OnCustTBAppearance )
ON_COMMAND ( ID_OXCUSTTB_IMAGEONLY , OnCustTBImageOnly )
ON_COMMAND ( ID_OXCUSTTB_IMAGETEXT , OnCustTBImageText )
ON_COMMAND ( ID_OXCUSTTB_SEPARATOR_BEFORE , OnCustTBSeparatorBefore )
ON_COMMAND ( ID_OXCUSTTB_SEPARATOR_AFTER , OnCustTBSeparatorAfter )
# if _MFC_VER>=0x0420
// reflect message to provide custom draw functionality
ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW , OnCustomDraw )
# endif
ON_NOTIFY_REFLECT_EX ( TBN_DROPDOWN , OnDropDownButton )
END_MESSAGE_MAP ( )
/////////////////////////////////////////////////////////////////////////////
// COXCoolToolBar message handlers
BOOL COXCoolToolBar : : Create ( CWnd * pParentWnd , DWORD dwStyle , UINT nID )
{
//#if _WIN32_IE>=0x0400
if ( m_dwComCtlVersion > = _IE40_COMCTL_VERSION )
{
ASSERT_VALID ( pParentWnd ) ; // must have a parent
ASSERT ( ! ( ( dwStyle & CBRS_SIZE_FIXED ) & & ( dwStyle & CBRS_SIZE_DYNAMIC ) ) ) ;
dwStyle | = WS_CLIPCHILDREN ;
# if _MFC_VER<=0x0421
// save the style
m_dwStyle = dwStyle ;
if ( nID = = AFX_IDW_TOOLBAR )
m_dwStyle | = CBRS_HIDE_INPLACE ;
dwStyle & = ~ CBRS_ALL ;
dwStyle | = CCS_NOPARENTALIGN | CCS_NODIVIDER | CCS_NORESIZE ;
// by default set flat style
dwStyle | = TBSTYLE_FLAT ;
// Initialize bar common controls
static BOOL bInitCoolToolBar = FALSE ;
if ( ! bInitCoolToolBar )
{
INITCOMMONCONTROLSEX sex ;
sex . dwSize = sizeof ( INITCOMMONCONTROLSEX ) ;
sex . dwICC = ICC_BAR_CLASSES ;
InitCommonControlsEx ( & sex ) ;
bInitCoolToolBar = TRUE ;
}
// Create the CoolToolBar using style and parent.
CRect rc ;
rc . SetRectEmpty ( ) ;
if ( CWnd : : CreateEx ( WS_EX_TOOLWINDOW , TOOLBARCLASSNAME , NULL ,
dwStyle , rc . left , rc . top , rc . Width ( ) , rc . Height ( ) ,
pParentWnd - > m_hWnd , ( HMENU ) nID ) )
# else
if ( CToolBar : : Create ( pParentWnd , dwStyle , nID ) )
# endif
{
# if _MFC_VER>0x0421
// by default set flat style
ModifyStyle ( 0 , TBSTYLE_FLAT | TBSTYLE_TRANSPARENT ) ;
SetBorders ( 0 , 0 , 0 , 0 ) ;
SetDropDownArrow ( TRUE ) ;
# else
SendMessage ( TB_BUTTONSTRUCTSIZE , sizeof ( TBBUTTON ) ) ;
# endif
if ( pParentWnd - > IsKindOf ( RUNTIME_CLASS ( CMDIChildWnd ) ) )
VERIFY ( ModifyStyle ( TBSTYLE_TRANSPARENT , 0 ) ) ;
}
else
return FALSE ;
}
//#else
else
{
if ( ! CToolBar : : Create ( pParentWnd , dwStyle , nID ) )
return FALSE ;
# if _MFC_VER>=0x0420
// by default set flat style
SetFlat ( ) ;
# endif //_MFC_VER>=0x0420
}
//#endif //_WIN32_IE>=0x0400
// register OLE Drag'n'Drop
COleDropTarget * pOleDropTarget = GetDropTarget ( ) ;
ASSERT ( pOleDropTarget ! = NULL ) ;
if ( ! pOleDropTarget - > Register ( this ) )
{
TRACE ( _T ( " COXCoolToolBar::Create: failed to register the control with COleDropTarget. You've probably forgotten to initialize OLE libraries using AfxOleInit function \n " ) ) ;
}
// Add empty string
VERIFY ( GetToolBarCtrl ( ) . AddStrings ( _T ( " \0 " ) ) = = 0 ) ;
return TRUE ;
}
BOOL COXCoolToolBar : : OnNcCreate ( LPCREATESTRUCT lpCreateStruct )
{
# if _MFC_VER>=0x0420
if ( IsCool ( ) )
{
// bypass CToolBar/CControlBar
return ( BOOL ) Default ( ) ;
}
else
{
return CToolBar : : OnNcCreate ( lpCreateStruct ) ;
}
# else
return CToolBar : : OnNcCreate ( lpCreateStruct ) ;
# endif
}
void COXCoolToolBar : : OnNcPaint ( )
{
CWindowDC dc ( this ) ;
// Exclude the client rectangle, but not the gripper
CRect rectWindow , rectClient ;
GetWindowRect ( rectWindow ) ;
GetClientRect ( rectClient ) ;
ClientToScreen ( rectClient ) ;
rectClient . OffsetRect ( - rectWindow . left , - rectWindow . top ) ;
dc . ExcludeClipRect ( rectClient ) ;
CRect rect ( 0 , 0 , 0 , 0 ) ;
GetWindowRect ( rect ) ;
rect . OffsetRect ( - rect . left , - rect . top ) ;
GetToolbarSkin ( ) - > DrawNonClientArea ( & dc , rect , this ) ;
# if _MFC_VER>=0x0420
if ( IsCool ( ) )
{
// bypass CToolBar/CControlBar
Default ( ) ;
}
else
{
if ( IsFlat ( ) & & IsGripper ( ) )
DrawGripper ( dc , rect ) ;
}
# endif
if ( m_hIcon ! = NULL )
DrawIcon ( dc , rect ) ;
DrawInBookedSpace ( dc , rect ) ;
}
void COXCoolToolBar : : OnPaint ( )
{
if ( m_dwComCtlVersion > = _IE40_COMCTL_VERSION )
{
CToolBar : : OnPaint ( ) ;
}
else
{
// CToolBar has some problems with painting when CToolBar is dockable
// (due to a bug in comctl32.dll version 4.70 which is supplied with IE 3.0)
CRect rectUpdate ( 0 , 0 , 0 , 0 ) ;
GetUpdateRect ( & rectUpdate , TRUE ) ;
# if _MFC_VER>=0x0420
if ( IsCool ( ) )
{
// bypass CToolBar/CControlBar
Default ( ) ;
}
else
{
if ( IsFloating ( ) )
{
CToolBar : : OnPaint ( ) ;
}
else
{
Default ( ) ;
if ( ! IsFlat ( ) )
{
InvalidateRect ( & rectUpdate ) ;
CToolBar : : OnPaint ( ) ;
}
}
}
# else
if ( IsFloating ( ) )
{
CToolBar : : OnPaint ( ) ;
}
else
{
Default ( ) ;
InvalidateRect ( & rectUpdate ) ;
CToolBar : : OnPaint ( ) ;
}
# endif
}
}
BOOL COXCoolToolBar : : OnEraseBkgnd ( CDC * pDC )
{
if ( GetToolbarSkin ( ) - > CallOnEraseBkgnd ( ) = = TRUE )
return CToolBar : : OnEraseBkgnd ( pDC ) ;
else
return FALSE ;
}
void COXCoolToolBar : : OnNcCalcSize ( BOOL bCalcValidRects , NCCALCSIZE_PARAMS * lpncsp )
{
# if _MFC_VER>=0x0420
if ( IsCool ( ) )
{
// bypass CToolBar/CControlBar
Default ( ) ;
// Change the non-client area of CoolToolBar
// to make it look pretty in CoolBar
int nAddIntension = IsFlat ( ) ? 2 : 0 ;
if ( m_dwStyle & CBRS_ORIENT_HORZ )
{
lpncsp - > rgrc [ 0 ] . top + = nAddIntension ;
lpncsp - > rgrc [ 0 ] . bottom + = nAddIntension ;
}
else
{
lpncsp - > rgrc [ 0 ] . left + = nAddIntension ;
lpncsp - > rgrc [ 0 ] . right + = nAddIntension ;
}
}
else
{
CToolBar : : OnNcCalcSize ( bCalcValidRects , lpncsp ) ;
if ( IsFlat ( ) )
{
// adjust non-client area
# if _MFC_VER<=0x0421
lpncsp - > rgrc [ 0 ] . top + = 2 ;
lpncsp - > rgrc [ 0 ] . bottom + = 2 ;
# endif
// adjust non-client area for gripper at left or top
if ( m_dwStyle & CBRS_ORIENT_HORZ )
{
if ( IsGripper ( ) & & ! ( m_dwStyle & CBRS_FLOATING ) )
{
lpncsp - > rgrc [ 0 ] . left + = ID_OXGRIPPER_WIDTH ;
}
}
else
{
if ( IsGripper ( ) & & ! ( m_dwStyle & CBRS_FLOATING ) )
{
lpncsp - > rgrc [ 0 ] . top + = ID_OXGRIPPER_WIDTH ;
}
}
}
}
# else
CToolBar : : OnNcCalcSize ( bCalcValidRects , lpncsp ) ;
# endif
if ( m_hIcon ! = NULL )
{
// adjust non-client area for icon at left or top
if ( m_dwStyle & CBRS_ORIENT_HORZ )
{
int nIconWidth = : : GetSystemMetrics ( SM_CXSMICON ) ;
lpncsp - > rgrc [ 0 ] . left + = nIconWidth + 2 ;
}
else
{
int nIconHeight = : : GetSystemMetrics ( SM_CYSMICON ) ;
lpncsp - > rgrc [ 0 ] . top + = nIconHeight + 2 ;
}
}
CRect rectBookedSpace ( 0 , 0 , 0 , 0 ) ;
BookSpace ( rectBookedSpace , ( m_dwStyle & CBRS_ORIENT_HORZ ) ? LM_HORZ : 0 ) ;
lpncsp - > rgrc [ 0 ] . left + = rectBookedSpace . left ;
lpncsp - > rgrc [ 0 ] . right - = rectBookedSpace . right ;
lpncsp - > rgrc [ 0 ] . top + = rectBookedSpace . top ;
lpncsp - > rgrc [ 0 ] . bottom - = rectBookedSpace . bottom ;
}
void COXCoolToolBar : : OnWindowPosChanging ( WINDOWPOS FAR * lpwndpos )
{
# if _MFC_VER>=0x0420
if ( IsCool ( ) )
{
// bypass CToolBar/CControlBar
Default ( ) ;
}
else
{
CToolBar : : OnWindowPosChanging ( lpwndpos ) ;
}
# if _MFC_VER<=0x0421
// TODO: Add your message handler code here
if ( IsFlat ( ) & & ! ( lpwndpos - > flags & SWP_NOMOVE ) )
{ // if moved:
CRect rc ; // Fill rectangle with..
GetWindowRect ( & rc ) ; // ..my (toolbar) rectangle.
CWnd * pParent = GetParent ( ) ; // get parent (dock bar/frame) win..
pParent - > ScreenToClient ( & rc ) ; // .. and convert to parent coords
// Ask parent window to paint the area beneath my old location.
// Typically, this is just solid grey.
//
pParent - > InvalidateRect ( & rc ) ; // paint old rectangle
// Now paint my non-client area at the new location.
// This is the extra bit of border space surrounding the buttons.
// Without this, you will still have a partial display bug
//
if ( m_bWindowsNTRunning )
{
// we need this code on NT systems
// because we've got problem with redrawing
CRect rect ;
GetWindowRect ( & rect ) ;
// redraw
SetWindowPos ( NULL , 0 , 0 , rect . Width ( ) , rect . Height ( ) ,
SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME |
SWP_FRAMECHANGED | SWP_NOREDRAW ) ;
}
else
{
PostMessage ( WM_NCPAINT ) ;
}
}
# endif // _MFC_VER<=0x0421
# else
CToolBar : : OnWindowPosChanging ( lpwndpos ) ;
# endif // _MFC_VER>=0x0420
}
void COXCoolToolBar : : OnWindowPosChanged ( WINDOWPOS FAR * lpwndpos )
{
// TODO: Add your message handler code here
if ( m_pDockContext ! = NULL )
{
m_pDockContext - > m_bDragging = FALSE ;
}
CToolBar : : OnWindowPosChanged ( lpwndpos ) ;
BOOL bFloating = IsFloating ( ) ;
if ( bFloating ! = m_bPrevFloating )
{
m_bPrevFloating = bFloating ;
OnFloatingDocking ( bFloating ) ;
}
else
{
DWORD dwDockSide = GetBarStyle ( ) & CBRS_ALIGN_ANY ;
if ( m_dwPrevDockSide ! = dwDockSide )
{
m_dwPrevDockSide = dwDockSide ;
OnChangeDockSide ( m_dwPrevDockSide ) ;
}
}
DelayUpdateCustomButtons ( ) ;
SendMessage ( WM_NCPAINT , 0 , 0 ) ;
}
LRESULT COXCoolToolBar : : OnIdleUpdateCmdUI ( WPARAM wParam , LPARAM lParam )
{
if ( IsWindowVisible ( ) )
{
// redraw the toolbar if necessary
if ( m_nIdleFlags & oxidleRedrawToolbar )
{
RedrawToolBar ( TRUE , TRUE ) ;
}
if ( m_nIdleFlags & oxidleUpdateCustomButtons )
{
UpdateCustomButtons ( ) ;
}
m_nIdleFlags = 0 ;
}
return CToolBar : : OnIdleUpdateCmdUI ( wParam , lParam ) ;
}
void COXCoolToolBar : : OnUpdateCmdUI ( CFrameWnd * pTarget , BOOL bDisableIfNoHndler )
{
COXCoolToolBarCmdUI state ;
state . m_pOther = this ;
state . m_nIndexMax = GetToolBarCtrl ( ) . GetButtonCount ( ) ;
for ( state . m_nIndex = 0 ; state . m_nIndex < state . m_nIndexMax ; state . m_nIndex + + )
{
// get buttons state
TBBUTTON TB ;
GetToolBarCtrl ( ) . GetButton ( state . m_nIndex , & TB ) ;
state . m_nID = TB . idCommand ;
// ignore separators
if ( ! ( TB . fsStyle & TBSTYLE_SEP ) | | IsCustomButton ( state . m_nIndex ) )
{
// allow the toolbar itself to have update handlers
if ( CWnd : : OnCmdMsg ( state . m_nID , CN_UPDATE_COMMAND_UI , & state , NULL ) )
continue ;
// allow the owner to process the update
state . DoUpdate ( pTarget , bDisableIfNoHndler ) ;
}
}
// update any dialog controls added to the toolbar
UpdateDialogControls ( pTarget , bDisableIfNoHndler ) ;
}
void COXCoolToolBar : : OnSettingChange ( UINT uFlags , LPCTSTR lpszSection )
{
UNREFERENCED_PARAMETER ( uFlags ) ;
UNREFERENCED_PARAMETER ( lpszSection ) ;
m_nDropDownArrowWidth = GetDropDownArrowWidth ( ) ;
RedrawToolBar ( ) ;
CToolBar : : OnSettingChange ( uFlags , lpszSection ) ;
}
// v9.3 - update 03 - 64-bit - return value was declared as LONG - changed to LRESULT
LRESULT COXCoolToolBar : : OnDragEnter ( WPARAM wParam , LPARAM lParam )
{
// toolbar must be in advanced customizable state
if ( ! IsCustomizable ( TRUE ) )
return ( LONG ) FALSE ;
// set flag that specifies that drag'n'drop operation is active
m_bDragDropOperation = TRUE ;
// lParam is the pointer to SHBDROPTARGETACTION structure
LPSHBDROPTARGETACTION pSHBDTAction = ( LPSHBDROPTARGETACTION ) lParam ;
ASSERT ( pSHBDTAction ! = NULL ) ;
ASSERT ( pSHBDTAction - > pWnd ) ;
ASSERT ( pSHBDTAction - > pWnd - > GetSafeHwnd ( ) = = GetSafeHwnd ( ) ) ;
return OnDragOver ( wParam , lParam ) ;
}
// v9.3 - update 03 - 64-bit - return value was declared as LONG - changed to LRESULT
LRESULT COXCoolToolBar : : OnDragOver ( WPARAM wParam , LPARAM lParam )
{
UNREFERENCED_PARAMETER ( wParam ) ;
// toolbar must be in advanced customizable state
if ( ! IsCustomizable ( TRUE ) )
return ( LONG ) FALSE ;
// lParam is the pointer to SHBDROPTARGETACTION structure
LPSHBDROPTARGETACTION pSHBDTAction = ( LPSHBDROPTARGETACTION ) lParam ;
ASSERT ( pSHBDTAction ! = NULL ) ;
ASSERT ( pSHBDTAction - > pWnd ) ;
ASSERT ( pSHBDTAction - > pWnd - > GetSafeHwnd ( ) = = GetSafeHwnd ( ) ) ;
pSHBDTAction - > result = ( LRESULT ) DROPEFFECT_NONE ;
# ifdef OX_CUSTOMIZE_COMMANDS
// Can we use this object?
if ( pSHBDTAction - > pDataObject - >
IsDataAvailable ( COXDragDropCommands : : m_cfCommandButton ) )
{
BOOL bQualified = ! ( m_bDragDropOwner & &
( pSHBDTAction - > dwKeyState & MK_CONTROL ) = = MK_CONTROL ) ;
if ( bQualified )
{
if ( ! ( m_bDragDropOwner & &
( pSHBDTAction - > dwKeyState & MK_CONTROL ) ! = MK_CONTROL ) )
{
// Get the drag item info
//
HGLOBAL hgData = pSHBDTAction - > pDataObject - >
GetGlobalData ( COXDragDropCommands : : m_cfCommandButton ) ;
ASSERT ( hgData ! = NULL ) ;
// lock it
BYTE * lpItemData = ( BYTE * ) : : GlobalLock ( hgData ) ;
// get button command ID
int nCommandID = * ( int * ) lpItemData ;
lpItemData + = sizeof ( int ) ;
// unlock it
: : GlobalUnlock ( hgData ) ;
// free it
: : GlobalFree ( hgData ) ;
if ( nCommandID < 0 | | ( nCommandID > 0 & & CommandToIndex ( nCommandID ) ! = - 1 ) )
bQualified = FALSE ;
}
if ( bQualified )
{
// analize the current cursor position
//
CPoint point = pSHBDTAction - > point ;
int nButtonIndex = HitTest ( & point ) ;
BOOL bIsOut = ( nButtonIndex < 0 ) ;
nButtonIndex = ( bIsOut ? - nButtonIndex : nButtonIndex ) ;
if ( nButtonIndex > GetToolBarCtrl ( ) . GetButtonCount ( ) & &
GetToolBarCtrl ( ) . GetButtonCount ( ) > 0 )
{
nButtonIndex = - 1 ;
bQualified = FALSE ;
}
else
{
// check if we are really over custom button,
// which is interpreted as separator and never being
// reterned as legitimate value from HitTest() function
CRect rectItem ;
GetItemRect ( nButtonIndex , rectItem ) ;
if ( ! rectItem . PtInRect ( point ) )
{
// check if previous button is custom one
if ( nButtonIndex > 0 & & IsCustomButton ( nButtonIndex - 1 ) )
{
nButtonIndex - - ;
}
}
CWnd * pParentWnd = GetParent ( ) ;
ASSERT ( pParentWnd ! = NULL ) ;
NMTOOLBAR nmtb ;
nmtb . hdr . hwndFrom = GetSafeHwnd ( ) ;
nmtb . hdr . idFrom = GetDlgCtrlID ( ) ;
nmtb . hdr . code = TBN_QUERYINSERT ;
nmtb . iItem = nButtonIndex ;
if ( ! pParentWnd - >
SendMessage ( WM_NOTIFY , nmtb . hdr . idFrom , ( LPARAM ) & nmtb ) )
{
bQualified = FALSE ;
}
else
{
TBINSERTMARK tbim ;
if ( nButtonIndex = = GetToolBarCtrl ( ) . GetButtonCount ( ) & &
nButtonIndex > 0 )
{
tbim . iButton = nButtonIndex - 1 ;
tbim . dwFlags = TBIMHT_AFTER ;
}
else
{
tbim . iButton = nButtonIndex ;
tbim . dwFlags = 0 ;
CRect rectItem ;
GetItemRect ( tbim . iButton , rectItem ) ;
if ( point . x > = rectItem . left + rectItem . Width ( ) / 2 | | point . x < 0 )
{
tbim . dwFlags = TBIMHT_AFTER ;
}
}
SetInsertMark ( & tbim ) ;
// Check if the control key was pressed
if ( ( pSHBDTAction - > dwKeyState & MK_CONTROL ) = = MK_CONTROL )
pSHBDTAction - > result = ( LRESULT ) DROPEFFECT_COPY ;
else
pSHBDTAction - > result = ( LRESULT ) DROPEFFECT_MOVE ;
}
}
}
}
if ( ! bQualified )
SetInsertMark ( - 1 ) ;
}
# endif // OX_CUSTOMIZE_COMMANDS
return ( LONG ) TRUE ;
}
// v9.3 - update 03 - 64-bit - return value was declared as LONG - changed to LRESULT
LRESULT COXCoolToolBar : : OnDragLeave ( WPARAM wParam , LPARAM lParam )
{
UNREFERENCED_PARAMETER ( wParam ) ;
if ( ! IsCustomizable ( TRUE ) )
return ( LONG ) FALSE ;
// lParam is the pointer to SHBDROPTARGETACTION structure
LPSHBDROPTARGETACTION pSHBDTAction = ( LPSHBDROPTARGETACTION ) lParam ;
ASSERT ( pSHBDTAction ! = NULL ) ;
ASSERT ( pSHBDTAction - > pWnd ) ;
ASSERT ( pSHBDTAction - > pWnd - > GetSafeHwnd ( ) = = GetSafeHwnd ( ) ) ;
SetInsertMark ( - 1 ) ;
if ( ! m_bDragDropOwner )
{
// reset flag that specifies that drag'n'drop operation is active
m_bDragDropOperation = FALSE ;
}
return ( LONG ) TRUE ;
}
// v9.3 - update 03 - 64-bit - return value was declared as LONG - changed to LRESULT
LRESULT COXCoolToolBar : : OnDrop ( WPARAM wParam , LPARAM lParam )
{
UNREFERENCED_PARAMETER ( wParam ) ;
if ( ! IsCustomizable ( TRUE ) )
return ( LONG ) FALSE ;
// lParam is the pointer to SHBDROPTARGETACTION structure
LPSHBDROPTARGETACTION pSHBDTAction = ( LPSHBDROPTARGETACTION ) lParam ;
ASSERT ( pSHBDTAction ! = NULL ) ;
ASSERT ( pSHBDTAction - > pWnd ) ;
ASSERT ( pSHBDTAction - > pWnd - > GetSafeHwnd ( ) = = GetSafeHwnd ( ) ) ;
pSHBDTAction - > result = ( LRESULT ) FALSE ;
# ifdef OX_CUSTOMIZE_COMMANDS
// if dragged item is to be copied or moved
if ( ( pSHBDTAction - > dropEffect & DROPEFFECT_COPY ) ! = 0 | |
( pSHBDTAction - > dropEffect & DROPEFFECT_MOVE ) ! = 0 )
{
// data must be in the specific format
ASSERT ( pSHBDTAction - > pDataObject - >
IsDataAvailable ( COXDragDropCommands : : m_cfCommandButton ) ) ;
TBINSERTMARK tbim ;
GetInsertMark ( & tbim ) ;
int nButtonIndex = tbim . iButton ;
if ( nButtonIndex ! = - 1 | | GetToolBarCtrl ( ) . GetButtonCount ( ) = = 0 )
{
BOOL bButtonRemainsTheSame = FALSE ;
if ( m_bDragDropOwner & & ( pSHBDTAction - > dropEffect & DROPEFFECT_COPY ) = = 0 )
{
ASSERT ( GetToolBarCtrl ( ) . GetButtonCount ( ) > 0 ) ;
int nDraggedButtonIndex = GetDraggedButton ( ) ;
ASSERT ( nDraggedButtonIndex ! = - 1 ) ;
if ( nDraggedButtonIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) - 1 & &
( ( tbim . dwFlags = = 0 & & nButtonIndex = = nDraggedButtonIndex ) | |
( tbim . dwFlags = = TBIMHT_AFTER & &
( nButtonIndex + 1 ) = = nDraggedButtonIndex ) ) )
{
if ( ( GetButtonStyle ( nDraggedButtonIndex + 1 ) & TBSTYLE_SEP ) = = 0 | |
IsCustomButton ( nDraggedButtonIndex + 1 ) )
{
TBBUTTON button = { 0 } ;
button . fsStyle = TBSTYLE_SEP ;
button . iString = - 1 ;
button . iBitmap = - 1 ;
VERIFY ( GetToolBarCtrl ( ) .
InsertButton ( nDraggedButtonIndex + 1 , & button ) ) ;
}
bButtonRemainsTheSame = TRUE ;
}
else if ( nDraggedButtonIndex > 0 & & ( ( tbim . dwFlags = = TBIMHT_AFTER & &
nButtonIndex = = nDraggedButtonIndex ) | |
( tbim . dwFlags = = 0 & & ( nButtonIndex - 1 ) = = nDraggedButtonIndex ) ) )
{
if ( ( GetButtonStyle ( nDraggedButtonIndex - 1 ) & TBSTYLE_SEP ) = = 0 | |
IsCustomButton ( nDraggedButtonIndex - 1 ) )
{
TBBUTTON button = { 0 } ;
button . fsStyle = TBSTYLE_SEP ;
button . iString = - 1 ;
button . iBitmap = - 1 ;
VERIFY ( GetToolBarCtrl ( ) .
InsertButton ( nDraggedButtonIndex , & button ) ) ;
}
bButtonRemainsTheSame = TRUE ;
}
else if ( ( nButtonIndex = = nDraggedButtonIndex + 2 & & tbim . dwFlags = = 0 ) | |
( nButtonIndex = = nDraggedButtonIndex + 1 & &
tbim . dwFlags = = TBIMHT_AFTER ) )
{
if ( ( GetButtonStyle ( nDraggedButtonIndex + 1 ) & TBSTYLE_SEP ) ! = 0 & &
! IsCustomButton ( nDraggedButtonIndex + 1 ) )
{
VERIFY ( GetToolBarCtrl ( ) . DeleteButton ( nDraggedButtonIndex + 1 ) ) ;
nButtonIndex - - ;
bButtonRemainsTheSame = TRUE ;
}
}
else if ( ( nButtonIndex = = nDraggedButtonIndex - 2 & &
tbim . dwFlags = = TBIMHT_AFTER ) | |
( nButtonIndex = = nDraggedButtonIndex - 1 & & tbim . dwFlags = = 0 ) )
{
if ( ( GetButtonStyle ( nDraggedButtonIndex - 1 ) & TBSTYLE_SEP ) ! = 0 & &
! IsCustomButton ( nDraggedButtonIndex - 1 ) )
{
VERIFY ( GetToolBarCtrl ( ) . DeleteButton ( nDraggedButtonIndex - 1 ) ) ;
bButtonRemainsTheSame = TRUE ;
}
}
}
// remove insert mark
SetInsertMark ( - 1 ) ;
if ( bButtonRemainsTheSame )
{
m_bDragDropOperation = FALSE ;
pSHBDTAction - > result = ( LRESULT ) TRUE ;
return ( LONG ) TRUE ;
}
nButtonIndex = ( tbim . dwFlags = = 0 ? nButtonIndex : nButtonIndex + 1 ) ;
int nButtonCount = GetToolBarCtrl ( ) . GetButtonCount ( ) ;
if ( nButtonIndex = = - 1 )
{
ASSERT ( nButtonCount = = 0 & & ! m_bDragDropOwner ) ;
nButtonIndex = 0 ;
}
else if ( nButtonIndex > nButtonCount )
{
nButtonIndex = nButtonCount ;
}
if ( m_bDragDropOwner )
{
# if _MFC_VER<0x0420
if ( ! IsCustomButton ( GetDraggedButton ( ) ) )
# endif
{
int nOldButtonPos = GetDraggedButton ( ) ;
int nNewButtonPos = ( nButtonIndex > GetDraggedButton ( ) ?
nButtonIndex - 1 : nButtonIndex ) ;
if ( nOldButtonPos ! = nNewButtonPos )
{
// just move button
VERIFY ( MoveButton ( nOldButtonPos , nNewButtonPos ) ) ;
SetCustomizedButton ( nNewButtonPos ) ;
}
m_bDragDropOperation = FALSE ;
pSHBDTAction - > result = ( LRESULT ) TRUE ;
return ( LONG ) TRUE ;
}
}
// Get the drag item info
//
HGLOBAL hgData = pSHBDTAction - > pDataObject - >
GetGlobalData ( COXDragDropCommands : : m_cfCommandButton ) ;
ASSERT ( hgData ! = NULL ) ;
// lock it
BYTE * lpItemData = ( BYTE * ) : : GlobalLock ( hgData ) ;
// get button command ID
int nCommandID = * ( int * ) lpItemData ;
lpItemData + = sizeof ( int ) ;
// get button text
CString sText ( ( LPTSTR ) lpItemData ) ;
lpItemData + = sText . GetLength ( ) * sizeof ( TCHAR ) + sizeof ( TCHAR ) ;
int nPosition = sText . Find ( _T ( ' \t ' ) ) ;
if ( nPosition ! = - 1 )
sText = sText . Left ( nPosition ) ;
// get button image index
int nImageIndex = * ( int * ) lpItemData ;
lpItemData + = sizeof ( int ) ;
// get button style
BYTE fsStyle = * ( BYTE * ) lpItemData ;
lpItemData + = sizeof ( BYTE ) ;
if ( nCommandID > 0 | | ( nCommandID = = 0 & & nButtonCount > 0 ) )
{
// determine if dragged button is a custom one
BOOL bCustomButton = ( GetCustomButtonIndex ( nCommandID ) ! = - 1 ) ;
if ( ! bCustomButton )
{
// insert new button
//
TBBUTTON button = { 0 } ;
button . iBitmap = nImageIndex ;
button . idCommand = nCommandID ;
if ( ( fsStyle & TBSTYLE_SEP ) = = TBSTYLE_SEP )
fsStyle & = ~ TBSTYLE_AUTOSIZE ;
else
fsStyle | = TBSTYLE_AUTOSIZE ;
button . fsStyle = fsStyle ;
button . iString = - 1 ;
// don't redraw the toolbar contents, we will do it later
m_bNoInternalRedraw = TRUE ;
VERIFY ( GetToolBarCtrl ( ) . InsertButton ( nButtonIndex , & button ) ) ;
m_bNoInternalRedraw = FALSE ;
if ( ! sText . IsEmpty ( ) )
{
VERIFY ( SetButtonText ( nButtonIndex , sText ) ) ;
}
RedrawToolBar ( TRUE , TRUE ) ;
//////////////////////////////
}
else
{
int nCustomButtonIndex = GetCustomButtonIndex ( nCommandID ) ;
ASSERT ( nCustomButtonIndex ! = - 1 ) ;
// insert new custom button
VERIFY ( InsertCustomButton ( nButtonIndex , nCustomButtonIndex ) ) ;
if ( IsInAdvancedCustomizationMode ( ) )
{
// set it into customization mode
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
VERIFY ( GetCustomButton ( nButtonIndex , descriptor ) ) ;
descriptor . m_pCBTemplate - > CBSetCustomizationMode ( TRUE ) ;
}
}
}
// unlock it
: : GlobalUnlock ( hgData ) ;
// free it
: : GlobalFree ( hgData ) ;
// drag'n'drop operation completed successfully
pSHBDTAction - > result = ( LRESULT ) TRUE ;
}
else
{
pSHBDTAction - > result = ( LRESULT ) FALSE ;
}
}
# endif // OX_CUSTOMIZE_COMMANDS
m_bDragDropOperation = FALSE ;
// we handled the message
return ( LONG ) TRUE ;
}
LRESULT COXCoolToolBar : : OnInsertButton ( WPARAM wParam , LPARAM lParam )
{
UNREFERENCED_PARAMETER ( lParam ) ;
LRESULT lResult = Default ( ) ;
if ( ( BOOL ) lResult )
{
CRect rect ;
GetClientRect ( rect ) ;
ValidateRect ( rect ) ;
if ( ( int ) wParam < = m_nCustomizedButtonIndex )
{
SetCustomizedButton ( m_nCustomizedButtonIndex + 1 ) ;
}
if ( ( int ) wParam < = m_nDraggedButtonIndex )
{
SetDraggedButton ( m_nDraggedButtonIndex + 1 ) ;
}
// update custom buttons positions
for ( int nButtonIndex = GetToolBarCtrl ( ) . GetButtonCount ( ) - 2 ;
nButtonIndex > = ( int ) wParam ; nButtonIndex - - )
{
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( m_mapCustomButtons . Lookup ( nButtonIndex , descriptor ) )
{
m_mapCustomButtons . SetAt ( nButtonIndex + 1 , descriptor ) ;
m_mapCustomButtons . RemoveKey ( nButtonIndex ) ;
}
}
}
RedrawToolBar ( TRUE , TRUE ) ;
return lResult ;
}
LRESULT COXCoolToolBar : : OnDeleteButton ( WPARAM wParam , LPARAM lParam )
{
UNREFERENCED_PARAMETER ( lParam ) ;
LRESULT lResult = Default ( ) ;
if ( ( BOOL ) lResult )
{
CRect rect ;
GetClientRect ( rect ) ;
ValidateRect ( rect ) ;
int nButtonIndex = ( int ) wParam ;
// delete custom button if any found
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( GetCustomButton ( nButtonIndex , descriptor ) )
{
descriptor . m_pCBTemplate - > CBDelete ( ) ;
m_mapCustomButtons . RemoveKey ( nButtonIndex ) ;
}
// update custom buttons positions
for ( int nIndex = nButtonIndex + 1 ;
nIndex < = GetToolBarCtrl ( ) . GetButtonCount ( ) ; nIndex + + )
{
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( m_mapCustomButtons . Lookup ( nIndex , descriptor ) )
{
m_mapCustomButtons . SetAt ( nIndex - 1 , descriptor ) ;
m_mapCustomButtons . RemoveKey ( nIndex ) ;
}
}
if ( nButtonIndex < m_nCustomizedButtonIndex )
SetCustomizedButton ( m_nCustomizedButtonIndex - 1 ) ;
else if ( nButtonIndex = = m_nCustomizedButtonIndex )
SetCustomizedButton ( - 1 ) ;
if ( nButtonIndex < m_nDraggedButtonIndex )
SetDraggedButton ( m_nDraggedButtonIndex - 1 ) ;
else if ( nButtonIndex = = m_nDraggedButtonIndex )
SetDraggedButton ( - 1 ) ;
int nButtonCount = GetToolBarCtrl ( ) . GetButtonCount ( ) ;
if ( nButtonIndex = = nButtonCount & & nButtonCount > 0 & &
GetButtonStyle ( nButtonCount - 1 ) & TBBS_SEPARATOR & &
! IsCustomButton ( nButtonCount - 1 ) )
{
m_bNoInternalRedraw = TRUE ;
VERIFY ( GetToolBarCtrl ( ) . DeleteButton ( nButtonCount - 1 ) ) ;
m_bNoInternalRedraw = FALSE ;
}
nButtonCount = GetToolBarCtrl ( ) . GetButtonCount ( ) ;
if ( nButtonIndex = = 0 & & nButtonCount > 0 & &
GetButtonStyle ( 0 ) & TBBS_SEPARATOR & & ! IsCustomButton ( 0 ) )
{
m_bNoInternalRedraw = TRUE ;
VERIFY ( GetToolBarCtrl ( ) . DeleteButton ( 0 ) ) ;
m_bNoInternalRedraw = FALSE ;
}
}
RedrawToolBar ( TRUE , TRUE ) ;
return lResult ;
}
# if _MFC_VER>=0x0420
LRESULT COXCoolToolBar : : OnMoveButton ( WPARAM wParam , LPARAM lParam )
{
UNREFERENCED_PARAMETER ( lParam ) ;
LRESULT lResult = Default ( ) ;
if ( ( BOOL ) lResult & & ( int ) wParam ! = ( int ) lParam )
{
OXCUSTOMBUTTONDESCRIPTOR descriptorMoved ;
BOOL bCustomButton = GetCustomButton ( ( int ) wParam , descriptorMoved ) ;
BOOL bDeleteMovedDescriptor = FALSE ;
int nMinButtonIndex = __min ( ( int ) wParam , ( int ) lParam ) ;
int nMaxButtonIndex = __max ( ( int ) wParam , ( int ) lParam ) ;
// update custom buttons positions
if ( ( int ) wParam < ( int ) lParam )
{
bDeleteMovedDescriptor =
bCustomButton & & ! IsCustomButton ( nMinButtonIndex + 1 ) ;
for ( int nIndex = nMinButtonIndex + 1 ;
nIndex < = nMaxButtonIndex ; nIndex + + )
{
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( m_mapCustomButtons . Lookup ( nIndex , descriptor ) )
{
m_mapCustomButtons . SetAt ( nIndex - 1 , descriptor ) ;
m_mapCustomButtons . RemoveKey ( nIndex ) ;
}
}
if ( bCustomButton )
{
m_mapCustomButtons . SetAt ( nMaxButtonIndex , descriptorMoved ) ;
if ( bDeleteMovedDescriptor )
{
m_mapCustomButtons . RemoveKey ( nMinButtonIndex ) ;
}
}
}
else
{
bDeleteMovedDescriptor =
bCustomButton & & ! IsCustomButton ( nMaxButtonIndex - 1 ) ;
for ( int nIndex = nMaxButtonIndex - 1 ;
nIndex > = nMinButtonIndex ; nIndex - - )
{
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( m_mapCustomButtons . Lookup ( nIndex , descriptor ) )
{
m_mapCustomButtons . SetAt ( nIndex + 1 , descriptor ) ;
m_mapCustomButtons . RemoveKey ( nIndex ) ;
}
}
if ( bCustomButton )
{
m_mapCustomButtons . SetAt ( nMinButtonIndex , descriptorMoved ) ;
if ( bDeleteMovedDescriptor )
{
m_mapCustomButtons . RemoveKey ( nMaxButtonIndex ) ;
}
}
}
UpdateCustomButtons ( nMinButtonIndex , nMaxButtonIndex ) ;
}
return lResult ;
}
# endif
void COXCoolToolBar : : OnLButtonDown ( UINT nFlags , CPoint point )
{
if ( IsInAdvancedCustomizationMode ( ) & & IsCustomizable ( TRUE ) )
{
int nButtonIndex = HitTest ( & point ) ;
if ( nButtonIndex > = 0 & & nButtonIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) )
{
SetCustomizedButton ( nButtonIndex ) ;
}
else
{
if ( IsCustomButton ( - nButtonIndex - 1 ) )
{
SetCustomizedButton ( - nButtonIndex - 1 ) ;
}
else
{
SetCustomizedButton ( - 1 ) ;
}
}
CWnd : : OnLButtonDown ( nFlags , point ) ;
if ( nButtonIndex > = 0 & & nButtonIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) )
{
int nState = GetToolBarCtrl ( ) . GetState ( GetItemID ( nButtonIndex ) ) ;
if ( ( nState & TBSTATE_PRESSED ) ! = 0 )
{
GetToolBarCtrl ( ) . SetState ( GetItemID ( nButtonIndex ) ,
nState & ~ TBSTATE_PRESSED ) ;
}
}
return ;
}
if ( IsFloatingEnabled ( ) | | ( ! IsFloatingEnabled ( ) & & HitTest ( & point ) > = 0 ) )
{
if ( AfxGetMainWnd ( ) - > SendMessage ( WM_QUERYSNAPPING ) )
{
// only start dragging if clicked in "void" space
if ( m_pDockBar ! = NULL & & OnToolHitTest ( point , NULL ) = = - 1 )
{
// Start dragging
SaveMouseOffset ( point ) ;
m_bDragging = TRUE ;
SetCapture ( ) ;
: : SetCursor ( AfxGetApp ( ) - > LoadStandardCursor ( IDC_SIZEALL ) ) ;
}
else
{
CWnd : : OnLButtonDown ( nFlags , point ) ;
}
}
else
CToolBar : : OnLButtonDown ( nFlags , point ) ;
}
}
void COXCoolToolBar : : OnLButtonUp ( UINT nFlags , CPoint point )
{
if ( m_bDragging )
{
ReleaseCapture ( ) ;
m_bDragging = FALSE ;
return ;
}
if ( IsInAdvancedCustomizationMode ( ) & & IsCustomizable ( TRUE ) )
{
return ;
}
CToolBar : : OnLButtonUp ( nFlags , point ) ;
// update the state of the clicked button right away
if ( : : IsWindow ( GetSafeHwnd ( ) ) )
{
SendMessage ( WM_IDLEUPDATECMDUI ) ;
}
}
void COXCoolToolBar : : OnMButtonDown ( UINT nFlags , CPoint point )
{
if ( IsInAdvancedCustomizationMode ( ) & & IsCustomizable ( TRUE ) )
{
int nButtonIndex = HitTest ( & point ) ;
if ( nButtonIndex > = 0 & & nButtonIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) )
{
SetCustomizedButton ( nButtonIndex ) ;
}
else
{
if ( IsCustomButton ( - nButtonIndex - 1 ) )
{
SetCustomizedButton ( - nButtonIndex - 1 ) ;
}
else
{
SetCustomizedButton ( - 1 ) ;
}
}
return ;
}
CToolBar : : OnMButtonDown ( nFlags , point ) ;
}
void COXCoolToolBar : : OnRButtonDown ( UINT nFlags , CPoint point )
{
if ( IsInAdvancedCustomizationMode ( ) & & IsCustomizable ( TRUE ) )
{
int nButtonIndex = HitTest ( & point ) ;
if ( nButtonIndex > = 0 & & nButtonIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) )
{
SetCustomizedButton ( nButtonIndex ) ;
}
else
{
if ( IsCustomButton ( - nButtonIndex - 1 ) )
{
SetCustomizedButton ( - nButtonIndex - 1 ) ;
}
else
{
SetCustomizedButton ( - 1 ) ;
}
}
return ;
}
CToolBar : : OnRButtonDown ( nFlags , point ) ;
}
void COXCoolToolBar : : OnRButtonUp ( UINT nFlags , CPoint point )
{
if ( IsInAdvancedCustomizationMode ( ) & & IsCustomizable ( TRUE ) )
{
int nCustomizedButtonIndex = GetCustomizedButton ( ) ;
if ( nCustomizedButtonIndex ! = - 1 )
{
ClientToScreen ( & point ) ;
VERIFY ( DisplayCustomizeButtonContextMenu ( nCustomizedButtonIndex , point ) ) ;
return ;
}
}
CToolBar : : OnRButtonUp ( nFlags , point ) ;
}
void COXCoolToolBar : : OnMouseMove ( UINT nFlags , CPoint point )
{
if ( IsInAdvancedCustomizationMode ( ) & & IsCustomizable ( TRUE ) )
{
return ;
}
if ( m_bDragging )
{
// Make sure the mouse button is still down
if ( : : GetKeyState ( VK_LBUTTON ) > = 0 )
{
// No longer down
ReleaseCapture ( ) ;
m_bDragging = FALSE ;
return ;
}
CPoint ptScreen = point ;
ClientToScreen ( & point ) ;
CRect rectWindow ;
GetWindowRect ( rectWindow ) ;
CRect rectDock ( point . x , point . y , point . x + rectWindow . Width ( ) , point . y + rectWindow . Height ( ) ) ;
// Get the appropriate dock bar. If one is not found then float.
CFrameWnd * pFrameWnd = DYNAMIC_DOWNCAST ( CFrameWnd , : : AfxGetMainWnd ( ) ) ;
if ( pFrameWnd = = NULL )
{
ReleaseCapture ( ) ;
m_bDragging = FALSE ;
return ;
}
// Handle pending WM_PAINT messages
MSG msg ;
while ( : : PeekMessage ( & msg , NULL , WM_PAINT , WM_PAINT , PM_NOREMOVE ) )
{
if ( ! GetMessage ( & msg , NULL , WM_PAINT , WM_PAINT ) )
{
ReleaseCapture ( ) ;
m_bDragging = FALSE ;
return ;
}
DispatchMessage ( & msg ) ;
}
if ( m_pDockContext = = NULL )
pFrameWnd - > FloatControlBar ( this , point ) ;
else
{
COXSizeDockBar * pDockBar = COXSizeDockBar : : GetAppropriateDockBar ( point , this ) ;
if ( pDockBar = = NULL | | nFlags & MK_CONTROL )
pFrameWnd - > FloatControlBar ( this , point - m_ptOffset ) ;
else
pDockBar - > DockControlBar ( this , rectDock ) ;
}
}
else
CToolBar : : OnMouseMove ( nFlags , point ) ;
}
void COXCoolToolBar : : OnLButtonDblClk ( UINT nFlags , CPoint point )
{
if ( IsInAdvancedCustomizationMode ( ) & & IsCustomizable ( TRUE ) )
{
return ;
}
if ( ! IsFloatingEnabled ( ) )
{
if ( HitTest ( & point ) > = 0 )
CToolBar : : OnLButtonDblClk ( nFlags , point ) ;
}
else
CToolBar : : OnLButtonDblClk ( nFlags , point ) ;
}
int COXCoolToolBar : : SetCustomizedButton ( int nIndex )
{
int nOldCustomizedButtonIndex = m_nCustomizedButtonIndex ;
m_nCustomizedButtonIndex = nIndex ;
if ( nOldCustomizedButtonIndex ! = nIndex )
{
RedrawButton ( nOldCustomizedButtonIndex ) ;
}
if ( nIndex ! = - 1 )
{
int nState = GetToolBarCtrl ( ) . GetState ( GetItemID ( nIndex ) ) ;
if ( ( nState & TBSTATE_PRESSED ) ! = 0 )
{
GetToolBarCtrl ( ) . SetState ( GetItemID ( nIndex ) , nState & ~ TBSTATE_PRESSED ) ;
}
else
{
RedrawButton ( nIndex ) ;
}
}
SendCustomizeNotification ( ID_OXCUSTTB_SET_CUSTOMIZE_BUTTON ) ;
return nOldCustomizedButtonIndex ;
}
BOOL COXCoolToolBar : : DisplayCustomizeButtonContextMenu ( int nButtonIndex , CPoint point )
{
ASSERT ( : : IsWindow ( GetSafeHwnd ( ) ) ) ;
ASSERT ( nButtonIndex > = 0 & & nButtonIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) ) ;
CString sText = GetButtonText ( nButtonIndex ) ;
TBBUTTON button ;
VERIFY ( GetToolBarCtrl ( ) . GetButton ( nButtonIndex , & button ) ) ;
ASSERT ( ( button . fsStyle & TBSTYLE_SEP ) = = 0 | | IsCustomButton ( nButtonIndex ) ) ;
ASSERT ( ! ( sText . IsEmpty ( ) & & button . iBitmap = = - 1 ) ) ;
CMenu menu ;
if ( ! menu . CreatePopupMenu ( ) )
return FALSE ;
// populate menu
CString sItem ;
sItem . LoadString ( IDS_OX_CUSTTB_DELETE ) ;
VERIFY ( menu . AppendMenu ( MF_STRING , ID_OXCUSTTB_DELETE , sItem ) ) ;
VERIFY ( menu . AppendMenu ( MF_SEPARATOR ) ) ;
sItem . LoadString ( IDS_OX_CUSTTB_APPEARANCE ) ;
VERIFY ( menu . AppendMenu ( MF_STRING , ID_OXCUSTTB_APPEARANCE , sItem ) ) ;
if ( ( button . fsStyle & TBSTYLE_SEP ) = = 0 & & ! IsCustomButton ( nButtonIndex ) )
{
sItem . LoadString ( IDS_OX_CUSTTB_IMAGEONLY ) ;
VERIFY ( menu . AppendMenu ( MF_STRING | ( sText . IsEmpty ( ) ? MF_CHECKED : MF_UNCHECKED ) ,
ID_OXCUSTTB_IMAGEONLY , sItem ) ) ;
sItem . LoadString ( IDS_OX_CUSTTB_IMAGETEXT ) ;
VERIFY ( menu . AppendMenu ( MF_STRING | ( ! sText . IsEmpty ( ) & & button . iBitmap ! = - 1 ?
MF_CHECKED : MF_UNCHECKED ) , ID_OXCUSTTB_IMAGETEXT , sItem ) ) ;
}
VERIFY ( menu . AppendMenu ( MF_SEPARATOR ) ) ;
sItem . LoadString ( IDS_OX_CUSTTB_SEPARATOR_BEFORE ) ;
VERIFY ( menu . AppendMenu ( MF_STRING |
( ( nButtonIndex > 0 & & ( ( GetButtonStyle ( nButtonIndex - 1 ) & TBBS_SEPARATOR ) = = 0 | |
IsCustomButton ( nButtonIndex - 1 ) ) ) ? 0 : MF_GRAYED ) ,
ID_OXCUSTTB_SEPARATOR_BEFORE , sItem ) ) ;
sItem . LoadString ( IDS_OX_CUSTTB_SEPARATOR_AFTER ) ;
VERIFY ( menu . AppendMenu ( MF_STRING |
( ( nButtonIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) - 1 & &
( ( GetButtonStyle ( nButtonIndex + 1 ) & TBBS_SEPARATOR ) = = 0 | |
IsCustomButton ( nButtonIndex + 1 ) ) ) ? 0 : MF_GRAYED ) ,
ID_OXCUSTTB_SEPARATOR_AFTER , sItem ) ) ;
menu . TrackPopupMenu ( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON ,
point . x , point . y , this ) ;
return TRUE ;
}
void COXCoolToolBar : : OnCustTBDelete ( )
{
ASSERT ( IsInAdvancedCustomizationMode ( ) ) ;
int nCustomizedButtonIndex = GetCustomizedButton ( ) ;
ASSERT ( nCustomizedButtonIndex ! = - 1 ) ;
if ( SendCustomizeNotification ( ID_OXCUSTTB_DELETE ) )
return ;
VERIFY ( GetToolBarCtrl ( ) . DeleteButton ( nCustomizedButtonIndex ) ) ;
}
void COXCoolToolBar : : OnCustTBAppearance ( )
{
ASSERT ( IsInAdvancedCustomizationMode ( ) ) ;
int nCustomizedButtonIndex = GetCustomizedButton ( ) ;
ASSERT ( nCustomizedButtonIndex ! = - 1 ) ;
UNUSED ( nCustomizedButtonIndex ) ;
SendCustomizeNotification ( ID_OXCUSTTB_APPEARANCE ) ;
}
void COXCoolToolBar : : OnCustTBImageOnly ( )
{
ASSERT ( IsInAdvancedCustomizationMode ( ) ) ;
int nCustomizedButtonIndex = GetCustomizedButton ( ) ;
ASSERT ( nCustomizedButtonIndex ! = - 1 ) ;
if ( SendCustomizeNotification ( ID_OXCUSTTB_IMAGEONLY ) )
return ;
UINT nCommandID = GetItemID ( nCustomizedButtonIndex ) ;
# ifdef _DEBUG
TBBUTTON button ;
VERIFY ( GetToolBarCtrl ( ) . GetButton ( nCustomizedButtonIndex , & button ) ) ;
ASSERT ( button . iBitmap ! = - 1 ) ;
# endif
CString sText = GetButtonText ( nCustomizedButtonIndex ) ;
if ( ! sText . IsEmpty ( ) )
{
m_mapButtonText . SetAt ( nCommandID , sText ) ;
SetButtonText ( nCustomizedButtonIndex , _T ( " " ) ) ;
RedrawToolBar ( TRUE , TRUE ) ;
}
}
void COXCoolToolBar : : OnCustTBImageText ( )
{
ASSERT ( IsInAdvancedCustomizationMode ( ) ) ;
int nCustomizedButtonIndex = GetCustomizedButton ( ) ;
ASSERT ( nCustomizedButtonIndex ! = - 1 ) ;
if ( SendCustomizeNotification ( ID_OXCUSTTB_IMAGETEXT ) )
return ;
UINT nCommandID = GetItemID ( nCustomizedButtonIndex ) ;
# ifdef _DEBUG
TBBUTTON button ;
VERIFY ( GetToolBarCtrl ( ) . GetButton ( nCustomizedButtonIndex , & button ) ) ;
ASSERT ( button . iBitmap ! = - 1 ) ;
# endif
CString sText = GetButtonText ( nCustomizedButtonIndex ) ;
if ( sText . IsEmpty ( ) )
{
if ( ! m_mapButtonText . Lookup ( nCommandID , sText ) )
{
HINSTANCE hInstance =
AfxFindResourceHandle ( MAKEINTRESOURCE ( nCommandID ) , RT_STRING ) ;
ASSERT ( hInstance ! = NULL ) ;
sText . LoadString ( nCommandID ) ;
int nPosition = sText . Find ( _T ( ' \n ' ) ) ;
if ( nPosition ! = - 1 )
sText = sText . Mid ( nPosition + 1 ) ;
}
if ( ! sText . IsEmpty ( ) )
{
SetButtonText ( nCustomizedButtonIndex , sText ) ;
RedrawToolBar ( TRUE , TRUE ) ;
}
}
}
void COXCoolToolBar : : OnCustTBSeparatorBefore ( )
{
ASSERT ( IsInAdvancedCustomizationMode ( ) ) ;
int nCustomizedButtonIndex = GetCustomizedButton ( ) ;
ASSERT ( nCustomizedButtonIndex ! = - 1 ) ;
if ( SendCustomizeNotification ( ID_OXCUSTTB_SEPARATOR_BEFORE ) )
return ;
TBBUTTON button = { 0 } ;
button . fsStyle = TBSTYLE_SEP ;
button . iString = - 1 ;
button . iBitmap = - 1 ;
VERIFY ( GetToolBarCtrl ( ) .
InsertButton ( nCustomizedButtonIndex , & button ) ) ;
}
void COXCoolToolBar : : OnCustTBSeparatorAfter ( )
{
ASSERT ( IsInAdvancedCustomizationMode ( ) ) ;
int nCustomizedButtonIndex = GetCustomizedButton ( ) ;
ASSERT ( nCustomizedButtonIndex ! = - 1 ) ;
if ( SendCustomizeNotification ( ID_OXCUSTTB_SEPARATOR_AFTER ) )
return ;
TBBUTTON button = { 0 } ;
button . fsStyle = TBSTYLE_SEP ;
button . iString = - 1 ;
button . iBitmap = - 1 ;
VERIFY ( GetToolBarCtrl ( ) .
InsertButton ( nCustomizedButtonIndex + 1 , & button ) ) ;
}
LRESULT COXCoolToolBar : : SendCustomizeNotification ( UINT nCustomizeCmdID ,
LPARAM lParam /*=NULL*/ )
{
HWND hWnd = m_hWndCustomizeOrganizer ;
if ( hWnd = = NULL )
{
hWnd = : : GetParent ( GetSafeHwnd ( ) ) ;
}
if ( hWnd = = NULL )
return ( LRESULT ) 0 ;
NMCTBCUSTOMIZE nmctbCustomize ;
nmctbCustomize . nmhdr . code = OXCTBN_CUSTOMIZECMD ;
nmctbCustomize . nmhdr . hwndFrom = GetSafeHwnd ( ) ;
nmctbCustomize . nmhdr . idFrom = GetDlgCtrlID ( ) ;
nmctbCustomize . nCustomizeEventID = nCustomizeCmdID ;
nmctbCustomize . lParam = lParam ;
return : : SendMessage ( hWnd , WM_NOTIFY , ( WPARAM ) nmctbCustomize . nmhdr . idFrom ,
( LPARAM ) & nmctbCustomize ) ;
}
CString COXCoolToolBar : : GetRecentButtonText ( UINT nCommandID )
{
CString sText ( _T ( " " ) ) ;
m_mapButtonText . Lookup ( nCommandID , sText ) ;
return sText ;
}
# if _MFC_VER>=0x0420
////////////////////
void COXCoolToolBar : : EraseNonClient ( )
{
// get window DC that is clipped to the non-client area
CWindowDC dc ( this ) ;
CRect rectClient ;
GetClientRect ( rectClient ) ;
CRect rectWindow ;
GetWindowRect ( rectWindow ) ;
ScreenToClient ( rectWindow ) ;
rectClient . OffsetRect ( - rectWindow . left , - rectWindow . top ) ;
rectWindow . OffsetRect ( - rectWindow . left , - rectWindow . top ) ;
// draw borders in non-client area
if ( ! IsCool ( ) )
{
// only if CoolToolBar is not used in CoolBar
DrawBorders ( & dc , rectWindow ) ;
// fixing for spurious edges
if ( ( m_dwStyle & CBRS_BORDER_3D ) = = 0 )
{
rectWindow . InflateRect ( 1 , 1 ) ;
}
}
// erase parts not drawn
dc . IntersectClipRect ( rectWindow ) ;
dc . ExcludeClipRect ( rectClient ) ;
SendMessage ( WM_ERASEBKGND , ( WPARAM ) dc . m_hDC ) ;
}
void COXCoolToolBar : : DrawGripper ( CDC & dc , CRect & rect )
{
GetToolbarSkin ( ) - > DrawGripper ( & dc , rect , this ) ;
}
void COXCoolToolBar : : DrawSeparator ( CDC & dc , CRect & rc )
{
GetToolbarSkin ( ) - > DrawSeparator ( & dc , rc , this ) ;
}
void COXCoolToolBar : : DrawIcon ( CDC & dc , CRect & rect )
{
if ( m_hIcon = = NULL )
return ;
m_iconRect = rect ;
if ( m_dwStyle & CBRS_ORIENT_HORZ )
{
if ( m_iconRect . left = = 0 & & ! IsFloating ( ) )
{
m_iconRect . left + = 10 ;
m_iconRect . top = ( rect . Height ( ) - : : GetSystemMetrics ( SM_CYSMICON ) ) / 2 ;
}
else
{
m_iconRect . left + = 3 ;
m_iconRect . top = 3 ;
}
m_iconRect . right = m_iconRect . left + : : GetSystemMetrics ( SM_CXSMICON ) ;
m_iconRect . bottom = m_iconRect . top + : : GetSystemMetrics ( SM_CYSMICON ) ;
rect . left = m_iconRect . right + 1 ;
}
else
{
if ( m_iconRect . top = = 0 & & ! IsFloating ( ) )
m_iconRect . top + = 10 ;
else
m_iconRect . top + = 3 ;
m_iconRect . bottom = m_iconRect . top + : : GetSystemMetrics ( SM_CYSMICON ) ;
m_iconRect . left = ( rect . Width ( ) - : : GetSystemMetrics ( SM_CXSMICON ) ) / 2 ;
m_iconRect . right = m_iconRect . left + : : GetSystemMetrics ( SM_CXSMICON ) ;
rect . top = m_iconRect . bottom + 1 ;
}
: : DrawIconEx ( dc , m_iconRect . left , m_iconRect . top , m_hIcon ,
m_iconRect . Width ( ) , m_iconRect . Height ( ) , 0 , NULL , DI_NORMAL ) ;
}
void COXCoolToolBar : : DrawCustomizedButton ( CDC & dc , CRect & rect )
{
GetToolbarSkin ( ) - > DrawCustomizedButton ( & dc , rect , this ) ;
}
void COXCoolToolBar : : SetDropDownArrow ( BOOL bDropDownArrow )
{
if ( m_dwComCtlVersion > = _IE40_COMCTL_VERSION )
{
DWORD dwStyleEx = GetStyleEx ( ) ;
dwStyleEx = bDropDownArrow ? dwStyleEx | TBSTYLE_EX_DRAWDDARROWS :
dwStyleEx & ~ TBSTYLE_EX_DRAWDDARROWS ;
SetStyleEx ( dwStyleEx ) ;
}
m_bDropDownArrow = bDropDownArrow ;
}
BOOL COXCoolToolBar : : IsDropDownArrow ( ) const
{
if ( m_dwComCtlVersion > = _IE40_COMCTL_VERSION )
{
return GetStyleEx ( ) & TBSTYLE_EX_DRAWDDARROWS ? TRUE : FALSE ;
}
return m_bDropDownArrow ;
}
////////////////////
# endif
void COXCoolToolBar : : SetCustomizable ( BOOL bCustomizable /*=TRUE*/ ,
BOOL bAdvanced /*=TRUE*/ )
{
// set CoolToolBar customizable only if array of bitmap IDs was previously set
// by function SetBitmapIds()
if ( m_pBitmapIds = = NULL )
{
bCustomizable = FALSE ;
}
if ( bCustomizable & & ! bAdvanced )
ModifyStyle ( 0 , CCS_ADJUSTABLE ) ;
else
ModifyStyle ( CCS_ADJUSTABLE , 0 ) ;
m_bAdvancedCutomizable = bCustomizable & bAdvanced ;
}
void COXCoolToolBar : : SetBitmapIds ( UINT * pIds , int nButtons )
{
m_pBitmapIds = pIds ;
m_nBitmapButtons = nButtons ;
// if we call this function then we probably want our CoolToolBar
// to be customizable
SetCustomizable ( ) ;
}
int COXCoolToolBar : : FindBitmapIndex ( UINT nID ) const
{
// helper function to find the number of element in array of bitmap IDs
// by its ID
ASSERT ( m_pBitmapIds ! = NULL ) ;
for ( int i = 0 ; i < m_nBitmapButtons ; i + + )
{
if ( m_pBitmapIds [ i ] = = ( int ) nID )
return i ;
}
return - 1 ;
}
void COXCoolToolBar : : SetAdvancedCustomizationMode ( BOOL bInAdvancedCustomizationMode ,
HWND hWndCustomizeOrganizer /*=NULL*/ )
{
if ( bInAdvancedCustomizationMode & & ! IsCustomizable ( TRUE ) )
{
SetCustomizable ( TRUE , TRUE ) ;
}
if ( ! bInAdvancedCustomizationMode )
{
SetCustomizedButton ( - 1 ) ;
}
m_hWndCustomizeOrganizer = hWndCustomizeOrganizer ;
m_bInAdvancedCustomizationMode = bInAdvancedCustomizationMode ;
// reset the customization mode for custom button windows
POSITION pos = m_mapCustomButtons . GetStartPosition ( ) ;
while ( pos ! = NULL )
{
int nIndex = - 1 ;
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
m_mapCustomButtons . GetNextAssoc ( pos , nIndex , descriptor ) ;
ASSERT ( nIndex > = 0 & & nIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) ) ;
descriptor . m_pCBTemplate - > CBSetCustomizationMode ( bInAdvancedCustomizationMode ) ;
}
}
// Return information for bitmap indexes in the toolbar
BOOL COXCoolToolBar : : OnTBNGetButtonInfo ( NMHDR * pNMHDR , LRESULT * pResult )
{
TBNOTIFY * pTBN = ( TBNOTIFY * ) pNMHDR ;
int nIndex = pTBN - > iItem ;
if ( nIndex < m_nBitmapButtons )
{
* pResult = TRUE ;
// find button's ID by its image index
UINT nButtonId = m_pBitmapIds [ nIndex ] ;
pTBN - > tbButton . iBitmap = nIndex ;
pTBN - > tbButton . idCommand = nButtonId ;
pTBN - > tbButton . fsState = TBSTATE_ENABLED ;
pTBN - > tbButton . fsStyle = TBSTYLE_BUTTON ;
pTBN - > tbButton . iString = - 1 ;
// use as tooltip as text associated with button shown in Customize dialog
if ( pTBN - > pszText ! = NULL )
{
CString strText ;
if ( strText . LoadString ( nButtonId ) )
{
// tool tip is after "\n" in the string
LPCTSTR pTipText = _tcschr ( strText , _T ( ' \n ' ) ) ;
if ( pTipText ! = NULL )
{
const int len = ( int ) _tcslen ( pTipText + 1 ) ;
UTBStr : : tcsncpy ( pTBN - > pszText , len + 1 , pTipText + 1 , len ) ;
return TRUE ;
}
}
TRACE ( _T ( " COXCoolToolBar:No Tooltip prompt for ID=%d \n " ) , nButtonId ) ;
UTBStr : : tcsncpy ( pTBN - > pszText , 4 , _T ( " ??? " ) , 3 ) ;
}
}
else
{
* pResult = FALSE ;
}
return TRUE ;
}
BOOL COXCoolToolBar : : OnTBNBeginDrag ( NMHDR * pNMHDR , LRESULT * pResult )
{
NMTOOLBAR * pNMToolBar = ( NMTOOLBAR * ) pNMHDR ;
BOOL bCustomButton = IsCustomButtonWnd ( pNMToolBar - > iItem ) ;
int nIndex = ( ! bCustomButton ? CommandToIndex ( pNMToolBar - > iItem ) :
GetCustomButtonPosition ( pNMToolBar - > iItem ) ) ;
ASSERT ( ( nIndex > = 0 & & nIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) ) ) ;
# ifdef OX_CUSTOMIZE_COMMANDS
if ( IsInAdvancedCustomizationMode ( ) | | ( IsCustomizable ( TRUE ) & &
( ( GetStyle ( ) & TBSTYLE_ALTDRAG & & : : GetKeyState ( VK_MENU ) < 0 ) | |
( ! ( GetStyle ( ) & TBSTYLE_ALTDRAG ) & & : : GetKeyState ( VK_SHIFT ) < 0 ) ) ) )
{
if ( ! bCustomButton )
{
int nState = GetToolBarCtrl ( ) . GetState ( GetItemID ( nIndex ) ) ;
if ( ( nState & TBSTATE_PRESSED ) ! = 0 )
{
GetToolBarCtrl ( ) . SetState ( GetItemID ( nIndex ) , nState & ~ TBSTATE_PRESSED ) ;
}
}
CWnd * pParentWnd = GetParent ( ) ;
ASSERT ( pParentWnd ! = NULL ) ;
pNMToolBar - > hdr . code = TBN_QUERYDELETE ;
if ( pParentWnd - >
SendMessage ( WM_NOTIFY , pNMToolBar - > hdr . idFrom , ( LPARAM ) pNMToolBar ) )
{
BOOL bWasInAdvancedCustomizationMode = IsInAdvancedCustomizationMode ( ) ;
if ( GetCustomizedButton ( ) ! = nIndex )
{
SetCustomizedButton ( nIndex ) ;
}
SetDraggedButton ( nIndex ) ;
// mark the control as the one that launched drag'n'drop operation
m_bDragDropOwner = TRUE ;
TBBUTTON button ;
VERIFY ( GetToolBarCtrl ( ) . GetButton ( nIndex , & button ) ) ;
COleDataSource * pDataSource =
COXDragDropCommands : : PrepareDragDropData ( GetButtonText ( nIndex ) ,
button . iBitmap , button . idCommand , button . fsStyle ) ;
ASSERT ( pDataSource ! = NULL ) ;
// analyze current mouse position
CPoint ptMouse ;
: : GetCursorPos ( & ptMouse ) ;
CRect rectWindow ;
GetWindowRect ( rectWindow ) ;
if ( ! rectWindow . PtInRect ( ptMouse ) )
{
m_bDragDropOperation = TRUE ;
}
DROPEFFECT dropEffect =
COXDragDropCommands : : DoDragDrop ( pDataSource , GetDropSource ( ) ) ;
if ( ( DROPEFFECT_MOVE = = dropEffect & & m_bDragDropOperation ) | |
( DROPEFFECT_NONE = = dropEffect & & : : GetKeyState ( VK_LBUTTON ) > = 0 & &
m_bDragDropOperation ) )
{
int nDraggedButtonIndex = GetDraggedButton ( ) ;
OnRemoveDraggedButton ( nDraggedButtonIndex ) ;
}
SetDraggedButton ( - 1 ) ;
m_bDragDropOperation = FALSE ;
//delete drag source (we are responsible to do that)
delete pDataSource ;
// unmark as the control which launched drag'n'drop operation
m_bDragDropOwner = FALSE ;
if ( ! bWasInAdvancedCustomizationMode )
{
SetCustomizedButton ( - 1 ) ;
}
}
}
# else
UNREFERENCED_PARAMETER ( nIndex ) ;
# endif // OX_CUSTOMIZE_COMMANDS
* pResult = 0 ;
return FALSE ;
}
BOOL COXCoolToolBar : : OnTBNEndDrag ( NMHDR * pNMHDR , LRESULT * pResult )
{
NMTOOLBAR * pNMToolBar = ( NMTOOLBAR * ) pNMHDR ;
UNREFERENCED_PARAMETER ( pNMToolBar ) ;
* pResult = 0 ;
return FALSE ;
}
BOOL COXCoolToolBar : : OnTBNQueryInsert ( NMHDR * pNMHDR , LRESULT * pResult )
{
NMTOOLBAR * pNMToolBar = ( NMTOOLBAR * ) pNMHDR ;
UNREFERENCED_PARAMETER ( pNMToolBar ) ;
* pResult = TRUE ; // always allow buttons to be inserted
return TRUE ;
}
BOOL COXCoolToolBar : : OnTBNQueryDelete ( NMHDR * /*pNMHDR*/ , LRESULT * pResult )
{
* pResult = TRUE ; // always allow buttons to be deleted
return TRUE ;
}
BOOL COXCoolToolBar : : OnTBNToolBarChange ( NMHDR * /*pNMHDR*/ , LRESULT * /*pResult*/ )
{
SetButtonTextFromID ( m_ttID ) ;
return FALSE ;
}
# if _MFC_VER>=0x0420
//////////////////////
// custom draw of a toolbar is available since MFC 4.2
// in you derived class you can provide your own custom draw routines
void COXCoolToolBar : : OnCustomDraw ( NMHDR * pNotify , LRESULT * pResult )
{
GetToolbarSkin ( ) - > OnCustomDraw ( pNotify , pResult , this ) ;
}
//////////////////////
# endif
void COXCoolToolBar : : OnRemoveDraggedButton ( int nButtonIndex )
{
// delete button if it was moved
VERIFY ( GetToolBarCtrl ( ) . DeleteButton ( nButtonIndex ) ) ;
}
// helper function to keep array of all used bitmaps
HBITMAP COXCoolToolBar : : AddBitmap ( LPTSTR lpszResourceName )
{
HBITMAP hBitmap = NULL ;
if ( ! m_allBitmaps . Lookup ( lpszResourceName , hBitmap ) )
{
if ( ( hBitmap = : : LoadBitmap ( AfxGetResourceHandle ( ) ,
lpszResourceName ) ) = = NULL )
{
TRACE ( _T ( " COXCoolToolBar::AddBitmap: unable to load bitmap \n " ) ) ;
return NULL ;
}
m_allBitmaps . SetAt ( lpszResourceName , hBitmap ) ;
}
return hBitmap ;
}
// helper function to keep array of all used image lists
HIMAGELIST COXCoolToolBar : : AddImageList ( LPTSTR lpszResourceName , int cx , int cGrow ,
COLORREF crMask , UINT uType , UINT uFlags )
{
HANDLE hImageList = NULL ;
if ( ! m_allImageLists . Lookup ( lpszResourceName , hImageList ) )
{
if ( ( hImageList = ( HANDLE ) : : ImageList_LoadImage ( AfxGetResourceHandle ( ) ,
lpszResourceName , cx , cGrow , crMask , uType , uFlags ) ) = = NULL )
{
TRACE ( _T ( " COXCoolToolBar::AddImageList: unable to load image list \n " ) ) ;
return NULL ;
}
m_allImageLists . SetAt ( lpszResourceName , hImageList ) ;
}
return ( HIMAGELIST ) hImageList ;
}
// helper function to keep array of all used image lists
HIMAGELIST COXCoolToolBar : : AddImageList ( LPTSTR lpszResourceName , int cx ,
COLORREF crMask , UINT uFlags ,
int cInitial , int cGrow )
{
HANDLE hImageList = NULL ;
if ( ! m_allImageLists . Lookup ( lpszResourceName , hImageList ) )
{
CBitmap bitmap ;
if ( ! bitmap . LoadBitmap ( lpszResourceName ) )
{
TRACE ( _T ( " COXCoolToolBar::AddImageList: unable to load image \n " ) ) ;
return NULL ;
}
BITMAP bitmapInfo ;
VERIFY ( bitmap . GetBitmap ( & bitmapInfo ) ! = 0 ) ;
if ( ( hImageList = ( HANDLE ) : : ImageList_Create ( cx , bitmapInfo . bmHeight ,
uFlags , cInitial , cGrow ) ) = = NULL )
{
TRACE ( _T ( " COXCoolToolBar::AddImageList: unable to create image list \n " ) ) ;
return NULL ;
}
if ( ImageList_AddMasked ( ( HIMAGELIST ) hImageList , bitmap , crMask ) = = - 1 )
{
TRACE ( _T ( " COXCoolToolBar::AddImageList: unable to populate image list \n " ) ) ;
ImageList_Destroy ( ( HIMAGELIST ) hImageList ) ;
return NULL ;
}
m_allImageLists . SetAt ( lpszResourceName , hImageList ) ;
}
return ( HIMAGELIST ) hImageList ;
}
// helper function to automatically set text to buttons
// TTID_PLAIN - lookup string resource for var equals button's ID
// if found, set text in button to string text
// (not includded tool tip text)
// TTID_TOOLTIP - lookup string resource for var equals button's ID
// if found, set text in button to tooltip text
// TTID_MENU - lookup menu resource for var equals button's ID
// if found, set text in button to text of corresponding Item in menu
// TTID_NONE - remove all text associated with buttons
// TTID_NOTSET - default value (there is no any text associated with toolbar)
void COXCoolToolBar : : SetButtonTextFromID ( UINT nFirstButtonID ,
UINT nLastButtonID , TextTypeFromID ttID )
{
m_ttID = ttID ;
if ( ttID = = TTID_NOTSET )
{
return ;
}
ASSERT ( nFirstButtonID < = nLastButtonID ) ;
CToolBarCtrl * pToolBarCtrl = & GetToolBarCtrl ( ) ;
ASSERT ( pToolBarCtrl ! = NULL ) ;
BOOL bMenuLoaded = FALSE ;
CMenu * pMenu = NULL ;
if ( ttID = = TTID_MENU )
{
// try to get a menu associated with framework
if ( AfxGetApp ( ) - > m_pMainWnd ! = NULL )
{
if ( AfxGetApp ( ) - > m_pMainWnd - > GetMenu ( ) ! = NULL )
{
pMenu = AfxGetApp ( ) - > m_pMainWnd - > GetMenu ( ) ;
bMenuLoaded = TRUE ;
}
else
{
TRACE ( _T ( " COXCoolToolBar::SetButtonTextFromID: cannot get framework menu!/n " ) ) ;
}
}
else
{
TRACE ( _T ( " COXCoolToolBar::SetButtonTextFromID: m_pMainWnd of app is not defined yet menu!/n " ) ) ;
}
}
UINT nID ;
CString strText ;
for ( int i = 0 ; i < pToolBarCtrl - > GetButtonCount ( ) ; i + + )
{
nID = GetItemID ( i ) ;
if ( nID > = nFirstButtonID & & nID < = nLastButtonID )
{
switch ( ttID )
{
// text in string resourse (not included tooltip)
case TTID_PLAIN :
{
if ( strText . LoadString ( nID ) )
{
int nPlacement = strText . Find ( _T ( ' \n ' ) ) ; // tool tip is after "\n" in the string
if ( nPlacement ! = - 1 )
{
strText = strText . Left ( nPlacement ) ;
}
}
break ;
}
// text in string resourse (only tooltip)
case TTID_TOOLTIP :
{
if ( strText . LoadString ( nID ) )
{
int nPlacement = strText . Find ( _T ( ' \n ' ) ) ; // tool tip is after "\n" in the string
if ( nPlacement ! = - 1 )
{
strText = strText . Mid ( nPlacement + 1 ) ;
}
else
{
strText = _T ( " " ) ;
}
}
break ;
}
// text in menu item resourse
case TTID_MENU :
{
if ( bMenuLoaded )
{
ASSERT ( pMenu ! = NULL ) ;
pMenu - > GetMenuString ( nID , strText , MF_BYCOMMAND ) ;
if ( ! strText . IsEmpty ( ) )
{
int nPlacement = strText . Find ( _T ( ' \t ' ) ) ; // accelerator keys are placed after "\t"
if ( nPlacement ! = - 1 )
{
strText = strText . Left ( nPlacement ) ;
}
}
}
break ;
}
// remove any text
case TTID_NONE :
{
strText = _T ( " " ) ;
break ;
}
default :
{
m_ttID = TTID_NONE ;
strText = _T ( " " ) ;
break ;
}
}
SetButtonText ( i , strText ) ;
}
}
}
// Save to registry state of buttons in CoolToolBar
BOOL COXCoolToolBar : : SaveBarState ( LPCTSTR lpszSubKey , LPCTSTR lpszValueName ,
BOOL bProperties )
{
# ifndef _MAC
CWinApp * pApp = AfxGetApp ( ) ;
CString sProfileName ;
sProfileName . Format ( _T ( " %s_%s " ) , lpszSubKey , lpszValueName ) ;
// make sure you called SetButtonsIds()
// makes no sense to load/store buttons state info for uncustomizable CoolToolBar
if ( IsCustomizable ( TRUE ) | | IsCustomizable ( FALSE ) )
{
ASSERT ( m_pBitmapIds ! = NULL ) ;
// make sure you called CWinApp::SetRegistryKey() functions before
if ( pApp - > m_pszRegistryKey = = NULL | | pApp - > m_pszProfileName = = NULL )
{
TRACE ( _T ( " COXCoolToolBar::SaveBarState: haven't called SetRegistryKey() \n " ) ) ;
return FALSE ;
}
// we use default registry key assigned to your application by MFC
HKEY hSecKey = pApp - > GetSectionKey ( _T ( " " ) ) ;
if ( hSecKey = = NULL )
{
TRACE ( _T ( " COXCoolToolBar::SaveBarState: unable to get section key \n " ) ) ;
return FALSE ;
}
// save buttons settings
//
CString sValueName ;
sValueName . Format ( _T ( " %s_ButtonsSettings " ) , lpszValueName ) ;
CMemFile memFile ;
CArchive ar ( & memFile , CArchive : : store ) ;
int nButtonCount = GetToolBarCtrl ( ) . GetButtonCount ( ) ;
ar < < ( DWORD ) nButtonCount ;
for ( int nIndex = 0 ; nIndex < nButtonCount ; nIndex + + )
{
TBBUTTON button ;
VERIFY ( GetToolBarCtrl ( ) . GetButton ( nIndex , & button ) ) ;
ar < < ( DWORD ) button . idCommand ;
ar < < ( DWORD ) button . iBitmap ;
ar < < button . fsStyle ;
CString sText = GetButtonText ( nIndex ) ;
ar < < ( sText . IsEmpty ( ) ? FALSE : TRUE ) ;
if ( sText . IsEmpty ( ) )
sText = GetRecentButtonText ( button . idCommand ) ;
ar < < sText ;
}
ar . Close ( ) ;
int nBufferLength = ( int ) memFile . GetLength ( ) ;
ASSERT ( nBufferLength > 0 ) ;
BYTE * pBuffer = memFile . Detach ( ) ;
pApp - > WriteProfileBinary ( lpszSubKey , sValueName , pBuffer , nBufferLength ) ;
: : free ( ( void * ) pBuffer ) ;
sValueName + = _T ( " _Size " ) ;
pApp - > WriteProfileInt ( lpszSubKey , sValueName , nBufferLength ) ;
// save custom buttons positions
//
sValueName . Format ( _T ( " %s_CustomButtonsPositions " ) , lpszValueName ) ;
CMemFile memFileCustom ;
CArchive arCustom ( & memFileCustom , CArchive : : store ) ;
int nCustomButtonCount = PtrToInt ( m_mapCustomButtons . GetCount ( ) ) ;
arCustom < < ( DWORD ) nCustomButtonCount ;
for ( int nCustomButtonIndex = 0 ;
nCustomButtonIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) ;
nCustomButtonIndex + + )
{
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( GetCustomButton ( nCustomButtonIndex , descriptor ) )
{
arCustom < < ( DWORD ) nCustomButtonIndex ;
arCustom < <
( DWORD ) descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ;
}
}
arCustom . Close ( ) ;
nBufferLength = ( int ) memFileCustom . GetLength ( ) ;
ASSERT ( nBufferLength > 0 ) ;
pBuffer = memFileCustom . Detach ( ) ;
pApp - > WriteProfileBinary ( lpszSubKey , sValueName , pBuffer , nBufferLength ) ;
: : free ( ( void * ) pBuffer ) ;
sValueName + = _T ( " _Size " ) ;
pApp - > WriteProfileInt ( lpszSubKey , sValueName , nBufferLength ) ;
// save buttons state
GetToolBarCtrl ( ) . SaveState ( hSecKey , lpszSubKey , lpszValueName ) ;
: : RegCloseKey ( hSecKey ) ;
}
// save custom buttons settings
//
if ( ! m_bCustomButtonsStateSaved )
{
CString sValueName = _T ( " Toolbars_CustomButtonsSettings " ) ;
CMemFile memFile ;
CArchive ar ( & memFile , CArchive : : store ) ;
int nButtonCount = PtrToInt ( m_mapAllCustomButtons . GetCount ( ) ) ;
ar < < ( DWORD ) nButtonCount ;
POSITION pos = m_mapAllCustomButtons . GetStartPosition ( ) ;
while ( pos ! = NULL )
{
int nCtrlID = - 1 ;
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
m_mapAllCustomButtons . GetNextAssoc ( pos , nCtrlID , descriptor ) ;
ASSERT ( nCtrlID > 0 ) ;
ar < < ( DWORD ) nCtrlID ;
descriptor . SaveState ( ar ) ;
descriptor . m_pCBTemplate - > CBSaveState ( ar ) ;
}
ar . Close ( ) ;
int nBufferLength = ( int ) memFile . GetLength ( ) ;
ASSERT ( nBufferLength > 0 ) ;
BYTE * pBuffer = memFile . Detach ( ) ;
pApp - > WriteProfileBinary ( lpszSubKey , sValueName , pBuffer , nBufferLength ) ;
: : free ( ( void * ) pBuffer ) ;
sValueName + = _T ( " _Size " ) ;
pApp - > WriteProfileInt ( lpszSubKey , sValueName , nBufferLength ) ;
m_bCustomButtonsStateSaved = TRUE ;
}
// save CoolToolBar properties
if ( bProperties )
{
# if _MFC_VER>=0x0420
pApp - > WriteProfileInt ( sProfileName , szCool , IsCool ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szGripper , IsGripper ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szSeparator , IsSeparator ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szFlat , IsFlat ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szList , IsList ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szDropDownArrow , IsDropDownArrow ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szIndent , GetIndent ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szDefaultTextColor , GetDefaultTextColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szHotTextColor , GetHotTextColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szSelectedTextColor , GetSelectedTextColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szCheckedTextColor , GetCheckedTextColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szDefaultBkColor , GetDefaultBkColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szHotBkColor , GetHotBkColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szSelectedBkColor , GetSelectedBkColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szCheckedBkColor , GetCheckedBkColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szDefaultBorderColor , GetDefaultBorderColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szHotBorderColor , GetHotBorderColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szSelectedBorderColor , GetSelectedBorderColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szCheckedBorderColor , GetCheckedBorderColor ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szTextType , GetTextType ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szTextRows , GetTextRows ( ) ) ;
pApp - > WriteProfileInt ( sProfileName , szMinButtonsWidth , GetButtonsMinMaxWidth ( ) . cx ) ;
pApp - > WriteProfileInt ( sProfileName , szMaxButtonsWidth , GetButtonsMinMaxWidth ( ) . cy ) ;
# endif
pApp - > WriteProfileInt ( sProfileName , szCustomizable , IsCustomizable ( ) ) ;
}
return TRUE ;
# else
return FALSE ;
# endif
}
// Load from registry state of buttons in CoolToolBar
BOOL COXCoolToolBar : : LoadBarState ( LPCTSTR lpszSubKey , LPCTSTR lpszValueName ,
BOOL bProperties )
{
# ifndef _MAC
CWinApp * pApp = AfxGetApp ( ) ;
CString sProfileName ;
sProfileName . Format ( _T ( " %s_%s " ) , lpszSubKey , lpszValueName ) ;
int nResult ;
if ( bProperties )
{
nResult = pApp - > GetProfileInt ( sProfileName , szCustomizable , - 1 ) ;
if ( nResult ! = - 1 )
{
SetCustomizable ( nResult ) ;
}
}
BOOL bUpdate = FALSE ;
// load and apply CoolToolBar properties
if ( bProperties )
{
# if _MFC_VER>=0x0420
nResult = pApp - > GetProfileInt ( sProfileName , szCool , - 1 ) ;
if ( nResult ! = - 1 )
{
SetCool ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szGripper , - 1 ) ;
if ( nResult ! = - 1 )
{
SetGripper ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szSeparator , - 1 ) ;
if ( nResult ! = - 1 )
{
SetSeparator ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szFlat , - 1 ) ;
if ( nResult ! = - 1 )
{
SetFlat ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szList , - 1 ) ;
if ( nResult ! = - 1 )
{
SetList ( nResult ) ;
bUpdate = TRUE ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szDropDownArrow , - 1 ) ;
if ( nResult ! = - 1 )
{
SetDropDownArrow ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szIndent , - 1 ) ;
if ( nResult ! = - 1 )
{
SetIndent ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szDefaultTextColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetDefaultTextColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szHotTextColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetHotTextColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szSelectedTextColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetSelectedTextColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szCheckedTextColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetCheckedTextColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szDefaultBkColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetDefaultBkColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szHotBkColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetHotBkColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szSelectedBkColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetSelectedBkColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szCheckedBkColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetCheckedBkColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szDefaultBorderColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetDefaultBorderColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szHotBorderColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetHotBorderColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szSelectedBorderColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetSelectedBorderColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szCheckedBorderColor , - 1 ) ;
if ( nResult ! = - 1 )
{
SetCheckedBorderColor ( nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szTextType , - 1 ) ;
if ( nResult ! = - 1 & & nResult ! = GetTextType ( ) )
{
if ( nResult = = TTID_NOTSET )
{
SetButtonTextFromID ( TTID_NONE ) ;
}
bUpdate = TRUE ;
SetButtonTextFromID ( ( TextTypeFromID ) nResult ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szTextRows , - 1 ) ;
if ( nResult ! = - 1 & & nResult ! = GetTextRows ( ) )
{
SetMaxTextRows ( nResult ) ;
bUpdate = TRUE ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szMinButtonsWidth , - 1 ) ;
if ( nResult ! = - 1 & & nResult ! = m_sizeMinMaxWidth . cx )
{
m_sizeMinMaxWidth . cx = nResult ;
SetButtonsMinMaxWidth ( m_sizeMinMaxWidth . cx , m_sizeMinMaxWidth . cy ) ;
}
nResult = pApp - > GetProfileInt ( sProfileName , szMaxButtonsWidth , - 1 ) ;
if ( nResult ! = - 1 & & nResult ! = m_sizeMinMaxWidth . cy )
{
m_sizeMinMaxWidth . cy = nResult ;
SetButtonsMinMaxWidth ( m_sizeMinMaxWidth . cx , m_sizeMinMaxWidth . cy ) ;
bUpdate = TRUE ;
}
# endif
}
// load custom button settings
//
if ( ! m_bCustomButtonsStateLoaded )
{
CString sValueName = _T ( " Toolbars_CustomButtonsSettings_Size " ) ;
int nSavedBufferLength = pApp - > GetProfileInt ( lpszSubKey , sValueName , - 1 ) ;
if ( nSavedBufferLength ! = - 1 )
{
ASSERT ( nSavedBufferLength > 0 ) ;
UINT nBufferLength = 0 ;
BYTE * pBuffer = NULL ;
sValueName = _T ( " Toolbars_CustomButtonsSettings " ) ;
if ( pApp - > GetProfileBinary ( lpszSubKey , sValueName , & pBuffer , & nBufferLength ) )
{
ASSERT ( nBufferLength > 0 ) ;
ASSERT ( pBuffer ! = NULL ) ;
CMemFile memFile ( pBuffer , nBufferLength ) ;
CArchive ar ( & memFile , CArchive : : load ) ;
DWORD dwButtonCount = 0 ;
ar > > dwButtonCount ;
for ( int nIndex = 0 ; nIndex < ( int ) dwButtonCount ; nIndex + + )
{
DWORD dwCtrlID ;
ar > > dwCtrlID ;
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
VERIFY ( m_mapAllCustomButtons . Lookup ( ( int ) dwCtrlID , descriptor ) ) ;
descriptor . LoadState ( ar ) ;
descriptor . m_pCBTemplate - > CBLoadState ( ar ) ;
m_mapAllCustomButtons . SetAt ( ( int ) dwCtrlID , descriptor ) ;
}
ar . Close ( ) ;
memFile . Detach ( ) ;
delete [ ] pBuffer ;
}
}
m_bCustomButtonsStateLoaded = TRUE ;
}
// make sure you called SetButtonsIds()
// makes no sense to load/store buttons state info for uncustomizable CoolToolBar
//
// load and apply button settings
if ( IsCustomizable ( FALSE ) | | IsCustomizable ( TRUE ) )
{
ASSERT ( m_pBitmapIds ! = NULL ) ;
// make sure you called CWinApp::SetRegistryKey() functions before
if ( pApp - > m_pszRegistryKey = = NULL | | pApp - > m_pszProfileName = = NULL )
{
TRACE ( _T ( " COXCoolToolBar::LoadBarState: haven't called SetRegistryKey() \n " ) ) ;
return FALSE ;
}
// we use default registry key assigned to your application by MFC
HKEY hSecKey = pApp - > GetSectionKey ( _T ( " " ) ) ;
if ( hSecKey = = NULL )
{
TRACE ( _T ( " COXCoolToolBar::LoadBarState: unable to get section key \n " ) ) ;
return FALSE ;
}
// before restoring state of buttons we should remove all custom buttons
// and store them temporary in mapDeletedCustomButtons map
CMap < int , int , OXCUSTOMBUTTONDESCRIPTOR , OXCUSTOMBUTTONDESCRIPTOR & >
mapDeletedCustomButtons ;
// check if any custom buttons info has been saved
CString sValueName ;
sValueName . Format ( _T ( " %s_CustomButtonsPositions_Size " ) , lpszValueName ) ;
int nSavedBufferLength = pApp - > GetProfileInt ( lpszSubKey , sValueName , - 1 ) ;
if ( nSavedBufferLength > 0 )
{
for ( int nIndex = GetToolBarCtrl ( ) . GetButtonCount ( ) - 1 ; nIndex > = 0 ; nIndex - - )
{
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( GetCustomButton ( nIndex , descriptor ) )
{
ASSERT ( : : IsWindow (
descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetSafeHwnd ( ) ) ) ;
int nButtonCtrlID =
descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ;
if ( descriptor . m_pCBTemplate - > CBIsDynamicallyCreated ( ) )
{
// this button will be deleted later
descriptor . m_pCBTemplate = NULL ;
}
mapDeletedCustomButtons . SetAt ( nButtonCtrlID , descriptor ) ;
GetToolBarCtrl ( ) . DeleteButton ( nIndex ) ;
}
}
}
m_bNoInternalRedraw = TRUE ;
// restore the toolbar contents
GetToolBarCtrl ( ) . RestoreState ( hSecKey , lpszSubKey , lpszValueName ) ;
: : RegCloseKey ( hSecKey ) ;
// apply saved button settings
//
sValueName . Format ( _T ( " %s_ButtonsSettings_Size " ) , lpszValueName ) ;
nSavedBufferLength = pApp - > GetProfileInt ( lpszSubKey , sValueName , - 1 ) ;
if ( nSavedBufferLength ! = - 1 )
{
ASSERT ( nSavedBufferLength > 0 ) ;
UINT nBufferLength = 0 ;
BYTE * pBuffer = NULL ;
sValueName . Format ( _T ( " %s_ButtonsSettings " ) , lpszValueName ) ;
if ( pApp - > GetProfileBinary ( lpszSubKey , sValueName , & pBuffer , & nBufferLength ) )
{
ASSERT ( nBufferLength > 0 ) ;
ASSERT ( pBuffer ! = NULL ) ;
CMemFile memFile ( pBuffer , nBufferLength ) ;
CArchive ar ( & memFile , CArchive : : load ) ;
DWORD dwButtonCount = 0 ;
ar > > dwButtonCount ;
for ( int nIndex = 0 ; nIndex < ( int ) dwButtonCount ; nIndex + + )
{
DWORD dwCommandID ;
ar > > dwCommandID ;
DWORD dwImageIndex ;
ar > > dwImageIndex ;
BYTE fsStyle ;
ar > > fsStyle ;
BOOL bSetText ;
ar > > bSetText ;
CString sText ;
ar > > sText ;
if ( fsStyle & TBSTYLE_SEP )
continue ;
int nButtonIndex = CommandToIndex ( ( UINT ) dwCommandID ) ;
if ( nButtonIndex ! = - 1 )
{
SetButtonInfo ( nButtonIndex , ( UINT ) dwCommandID ,
fsStyle , ( int ) dwImageIndex ) ;
if ( bSetText )
{
SetButtonText ( nButtonIndex , sText ) ;
}
else
{
if ( ! sText . IsEmpty ( ) )
m_mapButtonText . SetAt ( ( UINT ) dwCommandID , sText ) ;
}
}
}
ar . Close ( ) ;
memFile . Detach ( ) ;
delete [ ] pBuffer ;
}
}
// apply saved custom button positions
//
sValueName . Format ( _T ( " %s_CustomButtonsPositions_Size " ) , lpszValueName ) ;
nSavedBufferLength = pApp - > GetProfileInt ( lpszSubKey , sValueName , - 1 ) ;
if ( nSavedBufferLength ! = - 1 )
{
ASSERT ( nSavedBufferLength > 0 ) ;
UINT nBufferLength = 0 ;
BYTE * pBuffer = NULL ;
sValueName . Format ( _T ( " %s_CustomButtonsPositions " ) , lpszValueName ) ;
if ( pApp - > GetProfileBinary ( lpszSubKey , sValueName , & pBuffer , & nBufferLength ) )
{
ASSERT ( nBufferLength > 0 ) ;
ASSERT ( pBuffer ! = NULL ) ;
CMemFile memFile ( pBuffer , nBufferLength ) ;
CArchive ar ( & memFile , CArchive : : load ) ;
DWORD dwButtonCount = 0 ;
ar > > dwButtonCount ;
for ( int nIndex = 0 ; nIndex < ( int ) dwButtonCount ; nIndex + + )
{
DWORD dwIndex ;
ar > > dwIndex ;
DWORD dwCtrlID ;
ar > > dwCtrlID ;
ASSERT ( ( int ) dwIndex > = 0 & &
( int ) dwIndex < = GetToolBarCtrl ( ) . GetButtonCount ( ) ) ;
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( mapDeletedCustomButtons . Lookup ( ( int ) dwCtrlID , descriptor ) & &
descriptor . m_pCBTemplate ! = NULL & & : : IsWindow (
descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetSafeHwnd ( ) ) )
{
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons .
Lookup ( ( int ) dwCtrlID , descriptorOrig ) ) ;
// add placeholder
TBBUTTON button = { 0 } ;
button . iBitmap = - 1 ;
button . idCommand = 0 ;
button . fsStyle = TBSTYLE_SEP ;
button . iString = - 1 ;
VERIFY ( GetToolBarCtrl ( ) . InsertButton ( ( int ) dwIndex , & button ) ) ;
// add new custom button
m_mapCustomButtons . SetAt ( ( int ) dwIndex , descriptorOrig ) ;
}
else
{
int nCustomButtonIndex = GetCustomButtonIndex ( ( int ) dwCtrlID ) ;
ASSERT ( nCustomButtonIndex ! = - 1 ) ;
VERIFY ( InsertCustomButton ( ( int ) dwIndex , nCustomButtonIndex ) ) ;
}
}
ar . Close ( ) ;
memFile . Detach ( ) ;
delete [ ] pBuffer ;
}
}
SetButtonTextFromID ( m_ttID ) ;
}
m_bNoInternalRedraw = FALSE ;
// change the size of CoolToolBar
if ( bUpdate )
{
if ( GetTextRows ( ) = = 0 )
{
IniSizes ( m_sizeImage ) ;
}
else
{
UpdateSizes ( ) ;
}
RedrawToolBar ( ) ;
}
else
{
UpdateCustomButtons ( ) ;
}
return TRUE ;
# else
return FALSE ;
# endif
}
void COXCoolToolBar : : DockControlBarLeftOf ( CToolBar * leftOf )
{
ASSERT_VALID ( this ) ;
// make sure CControlBar::EnableDocking has been called
ASSERT ( m_pDockContext ! = NULL ) ;
if ( leftOf ! = NULL )
{
ASSERT_VALID ( leftOf ) ;
}
CFrameWnd * pFrameWnd = GetDockingFrame ( ) ;
ASSERT_VALID ( pFrameWnd ) ;
// get MFC to adjust the dimensions of all docked ToolBars
// so that GetWindowRect will be accurate
pFrameWnd - > RecalcLayout ( ) ;
UINT nDockBarID = 0 ;
CRect rect ( 0 , 0 , 0 , 0 ) ;
if ( leftOf ! = NULL )
{
leftOf - > GetWindowRect ( & rect ) ;
rect . OffsetRect ( 1 , 0 ) ;
DWORD dwStyle = leftOf - > GetBarStyle ( ) ;
nDockBarID = ( dwStyle & CBRS_ALIGN_TOP ) ? AFX_IDW_DOCKBAR_TOP :
( dwStyle & CBRS_ALIGN_BOTTOM ) ? AFX_IDW_DOCKBAR_BOTTOM :
( dwStyle & CBRS_ALIGN_LEFT ) ? AFX_IDW_DOCKBAR_LEFT :
( dwStyle & CBRS_ALIGN_RIGHT ) ? AFX_IDW_DOCKBAR_RIGHT : 0 ;
}
// When we take the default parameters on rect, DockControlBar will dock
// each Toolbar on a seperate line. Calculating a rectangle, we in effect
// are simulating a Toolbar being dragged to that location and docked.
pFrameWnd - > DockControlBar ( this , nDockBarID , & rect ) ;
}
# if _MFC_VER<=0x0421
# define OXCY_BORDER 1
void COXCoolToolBar : : SetHeight ( int cyHeight )
{
ASSERT_VALID ( this ) ;
int nHeight = cyHeight ;
if ( m_dwStyle & CBRS_BORDER_TOP )
cyHeight - = OXCY_BORDER ;
if ( m_dwStyle & CBRS_BORDER_BOTTOM )
cyHeight - = OXCY_BORDER ;
m_cyBottomBorder = ( cyHeight - m_sizeButton . cy ) / 2 ;
// if there is an extra pixel, m_cyTopBorder will get it
m_cyTopBorder = cyHeight - m_sizeButton . cy - m_cyBottomBorder ;
if ( m_cyTopBorder < 0 )
{
TRACE ( _T ( " Warning: COXCoolToolBar::SetHeight(%d) is smaller than button. \n " ) ,
nHeight ) ;
m_cyBottomBorder + = m_cyTopBorder ;
m_cyTopBorder = 0 ; // will clip at bottom
}
// recalculate the non-client region
SetWindowPos ( NULL , 0 , 0 , 0 , 0 ,
SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER ) ;
Invalidate ( ) ; // just to be nice if called when toolbar is visible
}
# endif
BOOL COXCoolToolBar : : IsWindowsNTRunning ( )
{
BOOL bResult = FALSE ;
OSVERSIONINFO verInfo ;
verInfo . dwOSVersionInfoSize = sizeof ( OSVERSIONINFO ) ;
if ( : : GetVersionEx ( & verInfo ) )
{
if ( verInfo . dwPlatformId = = VER_PLATFORM_WIN32_NT & &
verInfo . dwMajorVersion > = 4 )
{
bResult = TRUE ;
}
}
return bResult ;
}
int COXCoolToolBar : : GetDropDownArrowWidth ( ) const
{
# if _MFC_VER>=0x0420
HDC hDC = : : GetDC ( NULL ) ;
ASSERT ( hDC ! = NULL ) ;
HFONT hFont ;
HFONT oldFont = NULL ;
int nDropDownArrowWidth = 0 ;
if ( ( hFont = CreateFont ( GetSystemMetrics ( SM_CYMENUCHECK ) , 0 , 0 , 0 ,
FW_NORMAL , 0 , 0 , 0 , SYMBOL_CHARSET , 0 , 0 , 0 , 0 , _T ( " Marlett " ) ) ) ! = NULL )
{
oldFont = ( HFONT ) SelectObject ( hDC , hFont ) ;
}
VERIFY ( GetCharWidth ( hDC , ' 6 ' , ' 6 ' , & nDropDownArrowWidth ) ) ;
if ( oldFont ! = NULL )
{
SelectObject ( hDC , oldFont ) ;
}
if ( hFont ! = NULL )
{
DeleteObject ( hFont ) ;
}
: : ReleaseDC ( NULL , hDC ) ;
return nDropDownArrowWidth ;
# else
return 0 ;
# endif
}
# if _MFC_VER>=0x0420
////////////////////////////////
void COXCoolToolBar : : _GetButton ( int nIndex , TBBUTTON * pButton ) const
{
COXCoolToolBar * pBar = ( COXCoolToolBar * ) this ;
VERIFY ( pBar - > DefWindowProc ( TB_GETBUTTON , nIndex , ( LPARAM ) pButton ) ) ;
// TBSTATE_ENABLED == TBBS_DISABLED so invert it
pButton - > fsState ^ = TBSTATE_ENABLED ;
}
void COXCoolToolBar : : _SetButton ( int nIndex , TBBUTTON * pButton )
{
// get original button state
TBBUTTON button ;
VERIFY ( DefWindowProc ( TB_GETBUTTON , nIndex , ( LPARAM ) & button ) ) ;
// prepare for old/new button comparsion
button . bReserved [ 0 ] = 0 ;
button . bReserved [ 1 ] = 0 ;
// TBSTATE_ENABLED == TBBS_DISABLED so invert it
pButton - > fsState ^ = TBSTATE_ENABLED ;
pButton - > bReserved [ 0 ] = 0 ;
pButton - > bReserved [ 1 ] = 0 ;
// nothing to do if they are the same
if ( memcmp ( pButton , & button , sizeof ( TBBUTTON ) ) ! = 0 )
{
// don't redraw anything while setting the button
BOOL bWasVisible = ( GetStyle ( ) & WS_VISIBLE ) ;
if ( bWasVisible )
ModifyStyle ( WS_VISIBLE , 0 ) ;
VERIFY ( DefWindowProc ( TB_DELETEBUTTON , nIndex , 0 ) ) ;
VERIFY ( DefWindowProc ( TB_INSERTBUTTON , nIndex , ( LPARAM ) pButton ) ) ;
if ( bWasVisible )
{
ModifyStyle ( 0 , WS_VISIBLE ) ;
}
// invalidate appropriate parts
if ( ( ( pButton - > fsStyle ^ button . fsStyle ) & TBSTYLE_SEP ) | |
( ( pButton - > fsStyle & TBSTYLE_SEP ) & & pButton - > iBitmap ! = button . iBitmap ) )
{
// changing a separator
Invalidate ( FALSE ) ;
}
else
{
// invalidate just the button
CRect rect ;
if ( DefWindowProc ( TB_GETITEMRECT , nIndex , ( LPARAM ) & rect ) )
InvalidateRect ( rect , FALSE ) ; // don't erase background
}
}
}
# ifdef _MAC
# define CX_OVERLAP 1
# else
# define CX_OVERLAP 0
# endif
int COXCoolToolBar : : WrapToolBar ( TBBUTTON * pData , int nCount , int nWidth )
{
ASSERT ( pData ! = NULL & & nCount > 0 ) ;
int nResult = 0 ;
int x = 0 ;
for ( int i = 0 ; i < nCount ; i + + )
{
pData [ i ] . fsState & = ~ TBSTATE_WRAP ;
if ( pData [ i ] . fsState & TBSTATE_HIDDEN )
continue ;
int dx , dxNext ;
// take into account custom button style
if ( pData [ i ] . fsStyle & TBSTYLE_SEP )
{
dx = pData [ i ] . iBitmap ;
dxNext = dx ;
}
else
{
dx = m_sizeButton . cx ;
if ( pData [ i ] . fsStyle & TBSTYLE_AUTOSIZE )
{
CRect rect ;
GetToolBarCtrl ( ) . GetItemRect ( i , & rect ) ;
dx = rect . Width ( ) ;
}
// check for dropdown style, but only if the buttons are being drawn
if ( ( pData [ i ] . fsStyle & TBSTYLE_DROPDOWN ) & & IsDropDownArrow ( ) & &
( pData [ i ] . fsStyle & TBSTYLE_AUTOSIZE ) = = 0 )
{
if ( ! IsFlat ( ) | | m_dwComCtlVersion > = _IE40_COMCTL_VERSION )
{
// add size of drop down
if ( m_dwComCtlVersion < _IE40_COMCTL_VERSION )
{
m_nDropDownArrowWidth = GetDropDownArrowWidth ( ) ;
}
dx + = m_nDropDownArrowWidth ;
}
}
dxNext = dx - CX_OVERLAP ;
}
if ( x + dx > nWidth )
{
BOOL bFound = FALSE ;
for ( int j = i ; j > = 0 & & ! ( pData [ j ] . fsState & TBSTATE_WRAP ) ; j - - )
{
// Find last separator that isn't hidden
// a separator that has a command ID is not
// a separator, but a custom control.
if ( ( pData [ j ] . fsStyle & TBSTYLE_SEP ) & &
( pData [ j ] . idCommand = = 0 ) & &
! ( pData [ j ] . fsState & TBSTATE_HIDDEN ) )
{
bFound = TRUE ; i = j ; x = 0 ;
pData [ j ] . fsState | = TBSTATE_WRAP ;
nResult + + ;
break ;
}
}
if ( ! bFound )
{
for ( int j = i - 1 ; j > = 0 & &
! ( pData [ j ] . fsState & TBSTATE_WRAP ) ; j - - )
{
// Never wrap anything that is hidden,
// or any custom controls
if ( ( pData [ j ] . fsState & TBSTATE_HIDDEN ) | |
( ( pData [ j ] . fsStyle & TBSTYLE_SEP ) & &
( pData [ j ] . idCommand ! = 0 ) ) )
{
continue ;
}
bFound = TRUE ; i = j ; x = 0 ;
pData [ j ] . fsState | = TBSTATE_WRAP ;
nResult + + ;
break ;
}
if ( ! bFound )
{
x + = dxNext ;
}
}
}
else
{
x + = dxNext ;
}
}
return nResult + 1 ;
}
void COXCoolToolBar : : SizeToolBar ( TBBUTTON * pData , int nCount ,
int nLength , BOOL bVert /*=FALSE*/ )
{
ASSERT ( pData ! = NULL & & nCount > 0 ) ;
if ( ! bVert )
{
int nMin , nMax , nTarget , nCurrent , nMid ;
// Wrap ToolBar as specified
nMax = nLength ;
nTarget = WrapToolBar ( pData , nCount , nMax ) ;
// Wrap ToolBar vertically
nMin = 0 ;
nCurrent = WrapToolBar ( pData , nCount , nMin ) ;
if ( nCurrent ! = nTarget )
{
while ( nMin < nMax )
{
nMid = ( nMin + nMax ) / 2 ;
nCurrent = WrapToolBar ( pData , nCount , nMid ) ;
if ( nCurrent = = nTarget )
nMax = nMid ;
else
{
if ( nMin = = nMid )
{
WrapToolBar ( pData , nCount , nMax ) ;
break ;
}
nMin = nMid ;
}
}
}
CSize size = CalcSize ( pData , nCount ) ;
WrapToolBar ( pData , nCount , size . cx ) ;
}
else
{
CSize sizeMax , sizeMin , sizeMid ;
// Wrap ToolBar vertically
WrapToolBar ( pData , nCount , 0 ) ;
sizeMin = CalcSize ( pData , nCount ) ;
// Wrap ToolBar horizontally
WrapToolBar ( pData , nCount , 32767 ) ;
sizeMax = CalcSize ( pData , nCount ) ;
while ( sizeMin . cx < sizeMax . cx )
{
sizeMid . cx = ( sizeMin . cx + sizeMax . cx ) / 2 ;
WrapToolBar ( pData , nCount , sizeMid . cx ) ;
sizeMid = CalcSize ( pData , nCount ) ;
if ( nLength < sizeMid . cy )
{
if ( sizeMin = = sizeMid )
{
WrapToolBar ( pData , nCount , sizeMax . cx ) ;
return ;
}
sizeMin = sizeMid ;
}
else if ( nLength > sizeMid . cy )
sizeMax = sizeMid ;
else
return ;
}
}
}
CSize COXCoolToolBar : : CalcSize ( TBBUTTON * pData , int nCount )
{
ASSERT ( pData ! = NULL & & nCount > 0 ) ;
CPoint cur ( 0 , 0 ) ;
CSize sizeResult ( 0 , 0 ) ;
for ( int i = 0 ; i < nCount ; i + + )
{
int cySep = pData [ i ] . iBitmap ;
if ( ! IsFlat ( ) | | m_dwComCtlVersion < _IE40_COMCTL_VERSION )
{
cySep = cySep * 2 / 3 ;
}
if ( pData [ i ] . fsState & TBSTATE_HIDDEN )
continue ;
int cx = m_sizeButton . cx ;
if ( pData [ i ] . fsStyle & TBSTYLE_AUTOSIZE )
{
CRect rect ;
GetToolBarCtrl ( ) . GetItemRect ( i , & rect ) ;
cx = rect . Width ( ) ;
}
if ( pData [ i ] . fsStyle & TBSTYLE_SEP )
{
// a separator represents either a height or width
if ( pData [ i ] . fsState & TBSTATE_WRAP )
{
sizeResult . cy = __max ( cur . y + m_sizeButton . cy + cySep ,
sizeResult . cy ) ;
}
else
{
sizeResult . cx = __max ( cur . x + pData [ i ] . iBitmap , sizeResult . cx ) ;
sizeResult . cy = __max ( cur . y + m_sizeButton . cy , sizeResult . cy ) ;
}
}
else
{
// check for dropdown style, but only if the buttons are being drawn
if ( ( pData [ i ] . fsStyle & TBSTYLE_DROPDOWN ) & & IsDropDownArrow ( ) & &
( pData [ i ] . fsStyle & TBSTYLE_AUTOSIZE ) = = 0 )
{
if ( ! IsFlat ( ) | | m_dwComCtlVersion > = _IE40_COMCTL_VERSION )
{
// add size of drop down
if ( m_dwComCtlVersion < _IE40_COMCTL_VERSION )
{
m_nDropDownArrowWidth = GetDropDownArrowWidth ( ) ;
}
cx + = m_nDropDownArrowWidth ;
}
}
sizeResult . cx = __max ( cur . x + cx , sizeResult . cx ) ;
sizeResult . cy = __max ( cur . y + m_sizeButton . cy , sizeResult . cy ) ;
}
if ( pData [ i ] . fsStyle & TBSTYLE_SEP )
{
cur . x + = pData [ i ] . iBitmap ;
}
else
{
cur . x + = cx - CX_OVERLAP ;
}
if ( pData [ i ] . fsState & TBSTATE_WRAP )
{
cur . x = 0 ;
cur . y + = m_sizeButton . cy ;
if ( pData [ i ] . fsStyle & TBSTYLE_SEP )
cur . y + = cySep ;
}
}
// add indention
sizeResult . cx + = m_nIndent ;
return sizeResult ;
}
struct _AFX_CONTROLPOS
{
int nIndex , nID ;
CRect rectOldPos ;
} ;
CSize COXCoolToolBar : : CalcLayout ( DWORD dwMode , int nLength )
{
ASSERT_VALID ( this ) ;
ASSERT ( : : IsWindow ( m_hWnd ) ) ;
if ( dwMode & LM_HORZDOCK )
{
ASSERT ( dwMode & LM_HORZ ) ;
}
int nCount ;
TBBUTTON * pData = NULL ;
CMap < int , int , TBBUTTON * , TBBUTTON * > mapIndexToIgnore ;
CSize sizeResult ( 0 , 0 ) ;
// Load Buttons
{
nCount = PtrToInt ( DefWindowProc ( TB_BUTTONCOUNT , 0 , 0 ) ) ;
if ( nCount ! = 0 )
{
int nFlags = ( ( ( dwMode & LM_HORZDOCK ) = = 0 & & ( dwMode & LM_VERTDOCK ) = = 0 ) ?
OXCBD_SHOWFLOAT : ( ( dwMode & LM_HORZDOCK ) ! = 0 ?
OXCBD_SHOWHORZ : OXCBD_SHOWVERT ) ) ;
int i ;
pData = new TBBUTTON [ nCount ] ;
for ( i = 0 ; i < nCount ; i + + )
{
_GetButton ( i , & pData [ i ] ) ;
// take into account custom button style
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( GetCustomButton ( i , descriptor ) )
{
if ( ( ( descriptor . m_nFlags & OXCBD_SHOWFLOAT ) = = 0 & &
nFlags = = OXCBD_SHOWFLOAT ) | |
( ( descriptor . m_nFlags & OXCBD_SHOWHORZ ) = = 0 & &
nFlags = = OXCBD_SHOWHORZ ) | |
( ( descriptor . m_nFlags & OXCBD_SHOWVERT ) = = 0 & &
nFlags = = OXCBD_SHOWVERT ) )
{
TBBUTTON * pButton = new TBBUTTON ;
* pButton = pData [ i ] ;
pData [ i ] . fsStyle & = ~ TBSTYLE_SEP ;
pData [ i ] . fsStyle | = TBSTYLE_BUTTON ;
pData [ i ] . iBitmap = descriptor . m_nImageIndex ;
mapIndexToIgnore . SetAt ( i , pButton ) ;
}
}
}
}
}
if ( nCount > 0 )
{
if ( ! ( m_dwStyle & CBRS_SIZE_FIXED ) )
{
BOOL bDynamic = m_dwStyle & CBRS_SIZE_DYNAMIC ;
ASSERT ( pData ! = NULL ) ;
if ( bDynamic & & ( dwMode & LM_MRUWIDTH ) )
SizeToolBar ( pData , nCount , m_nMRUWidth ) ;
else if ( bDynamic & & ( dwMode & LM_HORZDOCK ) )
SizeToolBar ( pData , nCount , 32767 ) ;
else if ( bDynamic & & ( dwMode & LM_VERTDOCK ) )
SizeToolBar ( pData , nCount , 0 ) ;
else if ( bDynamic & & ( nLength ! = - 1 ) )
{
CRect rect ; rect . SetRectEmpty ( ) ;
CalcInsideRect ( rect , ( dwMode & LM_HORZ ) ) ;
BOOL bVert = ( dwMode & LM_LENGTHY ) ;
int nLen = nLength + ( bVert ? rect . Height ( ) : rect . Width ( ) ) ;
SizeToolBar ( pData , nCount , nLen , bVert ) ;
}
else if ( bDynamic & & ( m_dwStyle & CBRS_FLOATING ) )
SizeToolBar ( pData , nCount , m_nMRUWidth ) ;
else
SizeToolBar ( pData , nCount , ( dwMode & LM_HORZ ) ? 32767 : 0 ) ;
}
sizeResult = CalcSize ( pData , nCount ) ;
if ( dwMode & LM_COMMIT )
{
_AFX_CONTROLPOS * pControl = NULL ;
int nControlCount = 0 ;
BOOL bIsDelayed = m_bDelayedButtonLayout ;
m_bDelayedButtonLayout = FALSE ;
int i = 0 ;
for ( i = 0 ; i < nCount ; i + + )
{
if ( ( pData [ i ] . fsStyle & TBSTYLE_SEP ) & & ( pData [ i ] . idCommand ! = 0 ) )
{
nControlCount + + ;
}
}
if ( nControlCount > 0 )
{
pControl = new _AFX_CONTROLPOS [ nControlCount ] ;
nControlCount = 0 ;
for ( int i = 0 ; i < nCount ; i + + )
{
if ( ( pData [ i ] . fsStyle & TBSTYLE_SEP ) & & ( pData [ i ] . idCommand ! = 0 ) )
{
pControl [ nControlCount ] . nIndex = i ;
pControl [ nControlCount ] . nID = pData [ i ] . idCommand ;
CRect rect ;
GetItemRect ( i , & rect ) ;
ClientToScreen ( & rect ) ;
pControl [ nControlCount ] . rectOldPos = rect ;
nControlCount + + ;
}
}
}
if ( ( m_dwStyle & CBRS_FLOATING ) & & ( m_dwStyle & CBRS_SIZE_DYNAMIC ) )
{
m_nMRUWidth = sizeResult . cx ;
}
for ( i = 0 ; i < nCount ; i + + )
{
TBBUTTON * pButton = NULL ;
if ( mapIndexToIgnore . Lookup ( i , pButton ) )
{
ASSERT ( pButton ! = NULL ) ;
if ( pData [ i ] . fsState & TBSTATE_WRAP )
{
pButton - > fsState | = TBSTATE_WRAP ;
}
else
{
pButton - > fsState & = ~ TBSTATE_WRAP ;
}
_SetButton ( i , pButton ) ;
}
else
{
_SetButton ( i , & pData [ i ] ) ;
}
}
if ( nControlCount > 0 )
{
for ( int i = 0 ; i < nControlCount ; i + + )
{
CWnd * pWnd = GetDlgItem ( pControl [ i ] . nID ) ;
if ( pWnd ! = NULL )
{
CRect rect ;
pWnd - > GetWindowRect ( & rect ) ;
CPoint pt = rect . TopLeft ( ) - pControl [ i ] . rectOldPos . TopLeft ( ) ;
GetItemRect ( pControl [ i ] . nIndex , & rect ) ;
pt = rect . TopLeft ( ) + pt ;
pWnd - > SetWindowPos ( NULL , pt . x , pt . y , 0 , 0 ,
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER ) ;
}
}
delete [ ] pControl ;
}
m_bDelayedButtonLayout = bIsDelayed ;
}
delete [ ] pData ;
}
else
{
CSize sizeButtons = GetButtonsSize ( ) ;
if ( dwMode & LM_HORZ )
{
if ( IsFloating ( ) )
{
sizeResult . cx = sizeButtons . cx ;
}
else
{
sizeResult . cx = sizeButtons . cx / 2 ;
}
sizeResult . cy = sizeButtons . cy ;
}
else
{
sizeResult . cx = sizeButtons . cx ;
if ( IsFloating ( ) )
{
sizeResult . cy = sizeButtons . cy ;
}
else
{
sizeResult . cy = sizeButtons . cy / 2 ;
}
}
}
POSITION pos = mapIndexToIgnore . GetStartPosition ( ) ;
while ( pos ! = NULL )
{
int nIndex = 0 ;
TBBUTTON * pButton = NULL ;
mapIndexToIgnore . GetNextAssoc ( pos , nIndex , pButton ) ;
ASSERT ( pButton ! = NULL ) ;
delete pButton ;
}
mapIndexToIgnore . RemoveAll ( ) ;
//BLOCK: Adjust Margins
{
CRect rect ; rect . SetRectEmpty ( ) ;
CalcInsideRect ( rect , ( dwMode & LM_HORZ ) ) ;
sizeResult . cy - = rect . Height ( ) ;
sizeResult . cx - = rect . Width ( ) ;
CSize size = CControlBar : : CalcFixedLayout ( ( dwMode & LM_STRETCH ) ,
( dwMode & LM_HORZ ) ) ;
sizeResult . cx = __max ( sizeResult . cx , size . cx ) ;
sizeResult . cy = __max ( sizeResult . cy , size . cy ) ;
}
return sizeResult ;
}
CSize COXCoolToolBar : : CalcFixedLayout ( BOOL bStretch , BOOL bHorz )
{
DWORD dwMode = bStretch ? LM_STRETCH : 0 ;
dwMode | = bHorz ? LM_HORZ : 0 ;
return CalcLayout ( dwMode ) ;
}
CSize COXCoolToolBar : : CalcDynamicLayout ( int nLength , DWORD dwMode )
{
if ( ( nLength = = - 1 ) & & ! ( dwMode & LM_MRUWIDTH ) & & ! ( dwMode & LM_COMMIT ) & &
( ( dwMode & LM_HORZDOCK ) | | ( dwMode & LM_VERTDOCK ) ) )
{
return CalcFixedLayout ( dwMode & LM_STRETCH , dwMode & LM_HORZDOCK ) ;
}
return CalcLayout ( dwMode , nLength ) ;
}
void COXCoolToolBar : : CalcInsideRect ( CRect & rect , BOOL bHorz )
{
CToolBar : : CalcInsideRect ( rect , bHorz ) ;
if ( m_hIcon )
{
// Icon size
CSize szIcon ( : : GetSystemMetrics ( SM_CXSMICON ) ,
: : GetSystemMetrics ( SM_CYSMICON ) ) ;
if ( bHorz )
rect . left + = szIcon . cx + 2 ;
else
rect . top + = szIcon . cy + 2 ;
}
CRect rectBookedSpace ( 0 , 0 , 0 , 0 ) ;
BookSpace ( rectBookedSpace , ( bHorz ? LM_HORZ : 0 ) ) ;
rect . left + = rectBookedSpace . left ;
rect . top + = rectBookedSpace . top ;
rect . right - = rectBookedSpace . right ;
rect . bottom - = rectBookedSpace . bottom ;
if ( IsFlat ( ) & & IsGripper ( ) & & ! ( m_dwStyle & CBRS_FLOATING ) )
{
if ( bHorz )
{
rect . left + = ID_OXGRIPPER_WIDTH ;
}
else
{
rect . top + = ID_OXGRIPPER_WIDTH ;
}
}
}
void COXCoolToolBar : : RedrawToolBar ( BOOL bRecalcLayout /*=TRUE*/ ,
BOOL bOnlyFrame /*=FALSE*/ )
{
ASSERT ( : : IsWindow ( GetSafeHwnd ( ) ) ) ;
if ( m_bNoInternalRedraw )
{
return ;
}
// update custom buttons state
UpdateCustomButtons ( ) ;
if ( ! IsWindowVisible ( ) )
{
return ;
}
if ( bRecalcLayout )
{
CFrameWnd * pFrameWnd = GetDockingFrame ( ) ;
if ( pFrameWnd ! = NULL )
{
m_bNoBkgndRedraw = TRUE ;
pFrameWnd - > RecalcLayout ( ) ;
m_bNoBkgndRedraw = FALSE ;
for ( int nIndex = 0 ; nIndex < GetToolBarCtrl ( ) . GetButtonCount ( ) ; nIndex + + )
{
RedrawButton ( nIndex ) ;
CRect rect ;
GetItemRect ( nIndex , rect ) ;
ValidateRect ( rect ) ;
}
}
}
else
{
if ( ! bOnlyFrame )
{
RedrawWindow ( NULL , NULL ,
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN ) ;
}
}
if ( bOnlyFrame )
{
SetWindowPos ( NULL , 0 , 0 , 0 , 0 ,
SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME ) ;
}
}
void COXCoolToolBar : : RedrawButton ( int nIndex )
{
ASSERT ( : : IsWindow ( GetSafeHwnd ( ) ) ) ;
if ( nIndex < 0 | | nIndex > GetToolBarCtrl ( ) . GetButtonCount ( ) )
{
return ;
}
CRect rect ;
GetItemRect ( nIndex , rect ) ;
RedrawWindow ( rect ) ;
if ( IsCustomButton ( nIndex ) )
{
GetCustomButtonWnd ( nIndex ) - > RedrawWindow ( rect ) ;
}
}
CString COXCoolToolBar : : GetButtonTooltip ( int nButtonIndex ) const
{
ASSERT ( : : IsWindow ( m_hWnd ) ) ;
CString sTooltip ( _T ( " " ) ) ;
UINT nID = GetItemID ( nButtonIndex ) ;
if ( nID ! = 0 ) // will be zero on a separator
{
TCHAR szFullText [ 256 ] ;
// don't handle the message if no string resource found
if ( AfxLoadString ( nID , szFullText ) )
{
AfxExtractSubString ( sTooltip , szFullText , 1 , ' \n ' ) ;
}
}
return sTooltip ;
}
BOOL COXCoolToolBar : : MoveButton ( UINT nOldPos , UINT nNewPos )
{
# if _MFC_VER>=0x0420
ASSERT ( : : IsWindow ( m_hWnd ) ) ;
if ( ( BOOL ) : : SendMessage ( m_hWnd , TB_MOVEBUTTON , nOldPos , nNewPos ) )
{
if ( IsCustomButton ( nNewPos ) )
{
RedrawToolBar ( FALSE , TRUE ) ;
}
return TRUE ;
}
else
{
return FALSE ;
}
# else
if ( nOldPos = = nNewPos )
return TRUE ;
TBBUTTON button ;
if ( ! GetToolBarCtrl ( ) . GetButton ( nOldPos , & button ) )
return FALSE ;
if ( ! GetToolBarCtrl ( ) . DeleteButton ( nOldPos ) )
return FALSE ;
if ( nNewPos > nOldPos )
nNewPos - - ;
return ( GetToolBarCtrl ( ) . InsertButton ( nNewPos , & button ) )
# endif
}
int COXCoolToolBar : : AddCustomButton ( COXCustomTBButtonTemplate * pCBTemplate , int nID ,
int nWidth , int nHeight /*=-1*/ ,
int nFlags /*=OXCBD_SHOWANY*/ ,
int nImageIndex /*=-1*/ )
{
OXCUSTOMBUTTONDESCRIPTOR
descriptor ( pCBTemplate , nID , nWidth , nHeight , nFlags , nImageIndex ) ;
return AddCustomButton ( descriptor ) ;
}
int COXCoolToolBar : : AddCustomButton ( OXCUSTOMBUTTONDESCRIPTOR & descriptor )
{
ASSERT ( descriptor . m_pCBTemplate ! = NULL ) ;
ASSERT ( ! : : IsWindow ( descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetSafeHwnd ( ) ) ) ;
OXCUSTOMBUTTONDESCRIPTOR descriptorTest ;
if ( ! m_mapAllCustomButtons . Lookup ( descriptor . m_nID , descriptorTest ) )
{
// add new custom button
m_mapAllCustomButtons . SetAt ( descriptor . m_nID , descriptor ) ;
return PtrToInt ( m_arrAllCustomButtonIDs . Add ( descriptor . m_nID ) ) ;
}
else
{
// custom button has already been inserted
int nCustomButtonIndex = GetCustomButtonIndex ( descriptor . m_nID ) ;
ASSERT ( nCustomButtonIndex ! = - 1 ) ;
if ( ! SetCustomButton ( nCustomButtonIndex , descriptor ) )
{
TRACE ( _T ( " COXCoolToolBar::AddCustomButton: failed to update the descriptor of existing custom button \n " ) ) ;
return - 1 ;
}
else
{
return nCustomButtonIndex ;
}
}
}
BOOL COXCoolToolBar : : SetCustomButton ( int nCustomButtonIndex ,
OXCUSTOMBUTTONDESCRIPTOR & descriptor )
{
if ( nCustomButtonIndex < 0 | | nCustomButtonIndex > = m_arrAllCustomButtonIDs . GetSize ( ) )
{
TRACE ( _T ( " COXCoolToolBar::SetCustomButton: specified custom button index is out of range \n " ) ) ;
return FALSE ;
}
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
ASSERT ( nID = = descriptor . m_nID ) ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
// copy properties to original button descriptor
VERIFY ( descriptorOrig . CopyProperties ( descriptor ) ) ;
m_mapAllCustomButtons . SetAt ( nID , descriptorOrig ) ;
// apply the same properties for all copies of specified button
// Iterate all the control bars and use only the toolbars
CFrameWnd * pFrameWnd = DYNAMIC_DOWNCAST ( CFrameWnd , AfxGetMainWnd ( ) ) ;
if ( pFrameWnd ! = NULL )
{
POSITION pos = pFrameWnd - > m_listControlBars . GetHeadPosition ( ) ;
while ( pos ! = NULL )
{
COXCoolToolBar * pCoolToolbar = DYNAMIC_DOWNCAST ( COXCoolToolBar ,
( CControlBar * ) pFrameWnd - > m_listControlBars . GetNext ( pos ) ) ;
//If it is a COXCoolToolBar
if ( pCoolToolbar ! = NULL )
{
POSITION pos = pCoolToolbar - > m_mapCustomButtons . GetStartPosition ( ) ;
while ( pos ! = NULL )
{
int nIndex = - 1 ;
OXCUSTOMBUTTONDESCRIPTOR descriptorExisting ;
pCoolToolbar - >
m_mapCustomButtons . GetNextAssoc ( pos , nIndex , descriptorExisting ) ;
ASSERT ( nIndex ! = - 1 ) ;
if ( descriptorExisting . m_nID = = descriptor . m_nID )
{
VERIFY ( descriptorExisting . CopyProperties ( descriptor ) ) ;
pCoolToolbar - >
m_mapCustomButtons . SetAt ( nIndex , descriptorExisting ) ;
pCoolToolbar - > RedrawToolBar ( TRUE , TRUE ) ;
break ;
}
}
}
}
}
return TRUE ;
}
BOOL COXCoolToolBar : : CreateCustomButton ( int nCustomButtonIndex ,
OXCUSTOMBUTTONDESCRIPTOR & descriptor ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE*/ ,
DWORD dwStyleEx /*=0*/ ,
LPCTSTR lpszClassName /*=AfxRegisterWndClass(CS_DBLCLKS)*/ ,
LPCTSTR lpszWindowName /*=_T("")*/ )
{
if ( nCustomButtonIndex < 0 | | nCustomButtonIndex > = m_arrAllCustomButtonIDs . GetSize ( ) )
{
TRACE ( _T ( " COXCoolToolBar::CreateCustomButton: specified custom button index is out of range \n " ) ) ;
return FALSE ;
}
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
// check if any instance of this button has already been created
if ( ! : : IsWindow ( descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) - > GetSafeHwnd ( ) ) )
{
if ( ! descriptorOrig . m_pCBTemplate - > CBCreate ( descriptorOrig . m_nID , this , dwStyle ,
dwStyleEx , lpszClassName , lpszWindowName ) )
{
TRACE ( _T ( " COXCoolToolBar::CreateCustomButton: failed to create custom button \n " ) ) ;
return FALSE ;
}
m_mapAllCustomButtons . SetAt ( descriptorOrig . m_nID , descriptorOrig ) ;
descriptor = descriptorOrig ;
}
else
{
descriptor = descriptorOrig ;
// create a copy of the existing button
descriptor . m_pCBTemplate =
( COXCustomTBButtonWnd < CWnd > * ) descriptorOrig . m_pCBTemplate - >
CBCreateCopy ( this ) ;
if ( descriptor . m_pCBTemplate = = NULL )
{
TRACE ( _T ( " COXCoolToolBar::CreateCustomButton: failed to create custom button \n " ) ) ;
return FALSE ;
}
}
return TRUE ;
}
BOOL COXCoolToolBar : : InsertCustomButton ( int nIndex , int nCustomButtonIndex ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE*/ ,
DWORD dwStyleEx /*=0*/ ,
LPCTSTR lpszClassName /*=AfxRegisterWndClass(CS_DBLCLKS)*/ ,
LPCTSTR lpszWindowName /*=_T("")*/ )
{
if ( nIndex < 0 | | nIndex > GetToolBarCtrl ( ) . GetButtonCount ( ) )
{
TRACE ( _T ( " COXCoolToolBar::InsertCustomButton: specified index is out of range \n " ) ) ;
return FALSE ;
}
if ( nCustomButtonIndex < 0 | | nCustomButtonIndex > = m_arrAllCustomButtonIDs . GetSize ( ) )
{
TRACE ( _T ( " COXCoolToolBar::InsertCustomButton: specified custom button index is out of range \n " ) ) ;
return FALSE ;
}
// add placeholder
TBBUTTON button = { 0 } ;
button . iBitmap = - 1 ;
button . idCommand = 0 ;
button . fsStyle = TBSTYLE_SEP ;
button . iString = - 1 ;
// don't redraw the toolbar contents, we will do it later
m_bNoInternalRedraw = TRUE ;
if ( ! GetToolBarCtrl ( ) . InsertButton ( nIndex , & button ) )
{
m_bNoInternalRedraw = FALSE ;
TRACE ( _T ( " COXCoolToolBar::InsertCustomButton: failed to insert new button \n " ) ) ;
return FALSE ;
}
m_bNoInternalRedraw = FALSE ;
// create new custom button
OXCUSTOMBUTTONDESCRIPTOR descriptorCreated ;
if ( ! CreateCustomButton ( nCustomButtonIndex , descriptorCreated , dwStyle ,
dwStyleEx , lpszClassName , lpszWindowName ) )
{
TRACE ( _T ( " COXCoolToolBar::InsertCustomButton: failed to create custom button \n " ) ) ;
// don't redraw the toolbar contents, we just rollback to the original state
m_bNoInternalRedraw = TRUE ;
GetToolBarCtrl ( ) . DeleteButton ( nIndex ) ;
m_bNoInternalRedraw = FALSE ;
return FALSE ;
}
// add new custom button
m_mapCustomButtons . SetAt ( nIndex , descriptorCreated ) ;
RedrawToolBar ( TRUE , TRUE ) ;
return TRUE ;
}
int COXCoolToolBar : : GetCustomButtonPosition ( int nCtrlID ) const
{
POSITION pos = m_mapCustomButtons . GetStartPosition ( ) ;
while ( pos ! = NULL )
{
int nIndex = - 1 ;
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
m_mapCustomButtons . GetNextAssoc ( pos , nIndex , descriptor ) ;
ASSERT ( nIndex ! = - 1 ) ;
ASSERT ( : : IsWindow ( descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetSafeHwnd ( ) ) ) ;
if ( descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) = = nCtrlID )
{
return nIndex ;
}
}
return - 1 ;
}
BOOL COXCoolToolBar : : IsCustomButtonWnd ( int nCtrlID ) const
{
POSITION pos = m_mapCustomButtons . GetStartPosition ( ) ;
while ( pos ! = NULL )
{
int nIndex = - 1 ;
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
m_mapCustomButtons . GetNextAssoc ( pos , nIndex , descriptor ) ;
ASSERT ( nIndex ! = - 1 ) ;
ASSERT ( : : IsWindow ( descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetSafeHwnd ( ) ) ) ;
if ( descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) = = nCtrlID )
{
return TRUE ;
}
}
return FALSE ;
}
BOOL COXCoolToolBar : : InsertComboBox ( int nIndex , int nCustomButtonIndex ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE|CBS_DROPDOWN|WS_VSCROLL*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CComboBox , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " ComboBox " ) ) ;
}
BOOL COXCoolToolBar : : InsertEditBox ( int nIndex , int nCustomButtonIndex ,
LPCTSTR lpszWindowName /*=_T("")*/ ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL*/ ,
DWORD dwStyleEx /*=WS_EX_CLIENTEDGE*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CEdit , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " Edit " ) , lpszWindowName ) ;
}
BOOL COXCoolToolBar : : InsertRichEditBox ( int nIndex , int nCustomButtonIndex ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL*/ ,
DWORD dwStyleEx /*=WS_EX_CLIENTEDGE*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CRichEditCtrl , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " RICHEDIT " ) ) ;
}
BOOL COXCoolToolBar : : InsertStaticCtrl ( int nIndex , int nCustomButtonIndex ,
LPCTSTR lpszWindowName ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE|SS_LEFT|SS_SIMPLE*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CStatic , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " Static " ) , lpszWindowName ) ;
}
BOOL COXCoolToolBar : : InsertHotKeyCtrl ( int nIndex , int nCustomButtonIndex ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CHotKeyCtrl , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " msctls_hotkey32 " ) ) ;
}
BOOL COXCoolToolBar : : InsertButtonCtrl ( int nIndex , int nCustomButtonIndex ,
LPCTSTR lpszWindowName ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CButton , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " Button " ) , lpszWindowName ) ;
}
BOOL COXCoolToolBar : : InsertCheckBox ( int nIndex , int nCustomButtonIndex ,
LPCTSTR lpszWindowName ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE|BS_CHECKBOX*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CButton , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " Button " ) , lpszWindowName ) ;
}
BOOL COXCoolToolBar : : InsertProgressBar ( int nIndex , int nCustomButtonIndex ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CProgressCtrl , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " msctls_progress32 " ) ) ;
}
BOOL COXCoolToolBar : : InsertSlider ( int nIndex , int nCustomButtonIndex ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE|TBS_HORZ*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CSliderCtrl , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " msctls_trackbar32 " ) ) ;
}
# if _MFC_VER>0x0421
/////////////////////////////////////////////////////////////////////////////////
BOOL COXCoolToolBar : : InsertDateTimePicker ( int nIndex , int nCustomButtonIndex ,
COleDateTime date ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE*/ ,
DWORD dwStyleEx /*=0*/ )
{
// register date-time and mont calendar window classes
INITCOMMONCONTROLSEX icex ;
icex . dwSize = sizeof ( INITCOMMONCONTROLSEX ) ;
icex . dwICC = ICC_DATE_CLASSES ;
: : InitCommonControlsEx ( & icex ) ;
if ( ! InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " SysDateTimePick32 " ) ) )
{
return FALSE ;
}
else
{
CWnd * pWnd = GetCustomButtonWnd ( nIndex ) ;
ASSERT ( pWnd ! = NULL ) ;
CDateTimeCtrl * pDateTimeCtrl = ( CDateTimeCtrl * ) ( pWnd ) ;
pDateTimeCtrl - > SetTime ( date ) ;
return TRUE ;
}
}
BOOL COXCoolToolBar : : InsertIPAddressCtrl ( int nIndex , int nCustomButtonIndex ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CIPAddressCtrl , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
// register date-time and mont calendar window classes
INITCOMMONCONTROLSEX icex ;
icex . dwSize = sizeof ( INITCOMMONCONTROLSEX ) ;
icex . dwICC = ICC_INTERNET_CLASSES ;
: : InitCommonControlsEx ( & icex ) ;
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , _T ( " SysIPAddress32 " ) ) ;
}
BOOL COXCoolToolBar : : InsertComboBoxEx ( int nIndex , int nCustomButtonIndex ,
DWORD dwStyle /*=WS_CHILD|WS_VISIBLE|CBS_DROPDOWN*/ ,
DWORD dwStyleEx /*=0*/ )
{
# ifdef _DEBUG
int nID = m_arrAllCustomButtonIDs [ nCustomButtonIndex ] ;
OXCUSTOMBUTTONDESCRIPTOR descriptorOrig ;
VERIFY ( m_mapAllCustomButtons . Lookup ( nID , descriptorOrig ) ) ;
ASSERT_KINDOF ( CComboBoxEx , descriptorOrig . m_pCBTemplate - > CBGetWindow ( ) ) ;
# endif // _DEBUG
return InsertCustomButton (
nIndex , nCustomButtonIndex , dwStyle , dwStyleEx , WC_COMBOBOXEX ) ;
}
/////////////////////////////////////////////////////////////////////////////////
# endif // _MFC_VER>0x0421
BOOL COXCoolToolBar : : ShowCustomButton ( int nIndex )
{
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( ! GetCustomButton ( nIndex , descriptor ) )
{
TRACE ( _T ( " COXCoolToolBar::ShowCustomButton: there is no custom button at specified index \n " ) ) ;
return FALSE ;
}
BOOL bIsVisible = IsWindowVisible ( ) ;
BOOL bShowCustomButton = ( ( descriptor . m_nFlags & ( OXCBD_SHOWANY ) ) = = ( OXCBD_SHOWANY ) ) ;
if ( ! bShowCustomButton )
{
if ( IsFloating ( ) )
{
bShowCustomButton = ( descriptor . m_nFlags & OXCBD_SHOWFLOAT ) ;
}
else
{
if ( m_dwStyle & CBRS_ORIENT_HORZ )
{
bShowCustomButton = ( descriptor . m_nFlags & OXCBD_SHOWHORZ ) ;
}
else
{
bShowCustomButton = ( descriptor . m_nFlags & OXCBD_SHOWVERT ) ;
}
}
}
if ( bShowCustomButton )
{
UINT nIDTest ;
UINT nStyleTest ;
int nWidthTest ;
GetButtonInfo ( nIndex , nIDTest , nStyleTest , nWidthTest ) ;
if ( ( nStyleTest & TBBS_SEPARATOR ) ! = TBBS_SEPARATOR | |
nWidthTest ! = descriptor . m_nWidth )
{
SetButtonInfo (
nIndex , descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ,
TBBS_SEPARATOR , descriptor . m_nWidth ) ;
}
CRect rect ;
GetItemRect ( nIndex , & rect ) ;
rect . DeflateRect ( 2 , 0 ) ;
if ( descriptor . m_nHeight > 0 )
{
if ( descriptor . m_nHeight < rect . Height ( ) )
{
rect . top + = ( rect . Height ( ) - descriptor . m_nHeight ) / 2 ;
}
rect . bottom = rect . top + descriptor . m_nHeight ;
}
CWnd * pWnd = descriptor . m_pCBTemplate - > CBGetWindow ( ) ;
if ( DYNAMIC_DOWNCAST ( CComboBox , pWnd ) )
{
// Center the combo box
RECT rectButton ;
GetItemRect ( 0 , & rectButton ) ;
rect . OffsetRect ( 0 , ( rectButton . bottom - 22 ) / 2 + 1 ) ;
}
pWnd - > MoveWindow ( rect , bIsVisible ) ;
pWnd - > ShowWindow ( SW_SHOWNA ) ;
}
else
{
UINT nIDTest ;
UINT nStyleTest ;
int nWidthTest ;
GetButtonInfo ( nIndex , nIDTest , nStyleTest , nWidthTest ) ;
if ( ( nStyleTest & TBBS_SEPARATOR ) = = TBBS_SEPARATOR | |
( int ) nIDTest ! = descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) )
{
# if _MFC_VER > 0x0421
SetButtonInfo (
nIndex , descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ,
TBBS_BUTTON , descriptor . m_nImageIndex ) ;
TBBUTTONINFO buttonInfo = { sizeof ( TBBUTTONINFO ) } ;
buttonInfo . dwMask = TBIF_STYLE ;
if ( GetToolBarCtrl ( ) .
GetButtonInfo ( descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ,
& buttonInfo ) )
{
buttonInfo . fsStyle | = TBSTYLE_AUTOSIZE ;
}
else
{
buttonInfo . fsStyle = TBSTYLE_AUTOSIZE ;
}
VERIFY ( GetToolBarCtrl ( ) .
SetButtonInfo ( descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ,
& buttonInfo ) ) ;
# else
SetButtonInfo (
nIndex , descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ,
TBBS_BUTTON , descriptor . m_nImageIndex ) ;
TBBUTTONINFO buttonInfo = { sizeof ( TBBUTTONINFO ) } ;
buttonInfo . dwMask = TBIF_STYLE ;
if ( GetToolBarCtrl ( ) . SendMessage ( TB_GETBUTTONINFO ,
( WPARAM ) descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ,
( LPARAM ) ( LPTBBUTTONINFO ) & buttonInfo ) )
{
buttonInfo . fsStyle | = TBSTYLE_AUTOSIZE ;
}
else
{
buttonInfo . fsStyle = TBSTYLE_AUTOSIZE ;
}
VERIFY ( GetToolBarCtrl ( ) . SendMessage ( TB_GETBUTTONINFO ,
( WPARAM ) descriptor . m_pCBTemplate - > CBGetWindow ( ) - > GetDlgCtrlID ( ) ,
( LPARAM ) ( LPTBBUTTONINFO ) & buttonInfo ) ) ;
# endif
}
descriptor . m_pCBTemplate - > CBGetWindow ( ) - > ShowWindow ( SW_HIDE ) ;
}
if ( bIsVisible ! = IsWindowVisible ( ) )
{
if ( bIsVisible )
{
ModifyStyle ( 0 , WS_VISIBLE , SWP_NOREDRAW ) ;
}
else
{
ModifyStyle ( WS_VISIBLE , 0 , SWP_NOREDRAW ) ;
}
}
return TRUE ;
}
int COXCoolToolBar : : GetCustomButtonIndex ( int nCtrlID )
{
for ( int nIndex = 0 ; nIndex < m_arrAllCustomButtonIDs . GetSize ( ) ; nIndex + + )
{
if ( m_arrAllCustomButtonIDs [ nIndex ] = = nCtrlID )
{
return nIndex ;
}
}
return - 1 ;
}
int COXCoolToolBar : : GetCustomButtonIndex ( CWnd * pWnd )
{
ASSERT ( : : IsWindow ( pWnd - > GetSafeHwnd ( ) ) ) ;
return GetCustomButtonIndex ( pWnd - > GetDlgCtrlID ( ) ) ;
}
void COXCoolToolBar : : UpdateCustomButtons ( int nFirstButtonIndex /*=0*/ ,
int nLastButtonIndex /*=-1*/ )
{
if ( nLastButtonIndex = = - 1 )
{
nLastButtonIndex = GetToolBarCtrl ( ) . GetButtonCount ( ) - 1 ;
}
for ( int nIndex = nFirstButtonIndex ; nIndex < = nLastButtonIndex ; nIndex + + )
{
OXCUSTOMBUTTONDESCRIPTOR descriptor ;
if ( m_mapCustomButtons . Lookup ( nIndex , descriptor ) )
{
ShowCustomButton ( nIndex ) ;
}
}
}
HRESULT COXCoolToolBar : : GetComCtlVersion ( LPDWORD pdwMajor , LPDWORD pdwMinor ) const
{
if ( IsBadWritePtr ( pdwMajor , sizeof ( DWORD ) ) | |
IsBadWritePtr ( pdwMinor , sizeof ( DWORD ) ) )
{
return E_INVALIDARG ;
}
// get handle of the common control DLL
BOOL bAlreadyLoaded = TRUE ;
HINSTANCE hComCtl = : : GetModuleHandle ( _T ( " comctl32.dll " ) ) ;
if ( hComCtl = = NULL )
{
// load the DLL
hComCtl = : : LoadLibrary ( _T ( " comctl32.dll " ) ) ;
bAlreadyLoaded = FALSE ;
}
if ( hComCtl )
{
HRESULT hr = S_OK ;
DLLGETVERSIONPROC pDllGetVersion ;
/*
You must get this function explicitly because earlier versions of the DLL
don ' t implement this function . That makes the lack of implementation of the
function a version marker in itself .
*/
pDllGetVersion = ( DLLGETVERSIONPROC ) GetProcAddress ( hComCtl , " DllGetVersion " ) ;
if ( pDllGetVersion )
{
DLLVERSIONINFO dvi ;
ZeroMemory ( & dvi , sizeof ( dvi ) ) ;
dvi . cbSize = sizeof ( dvi ) ;
hr = ( * pDllGetVersion ) ( & dvi ) ;
if ( SUCCEEDED ( hr ) )
{
* pdwMajor = dvi . dwMajorVersion ;
* pdwMinor = dvi . dwMinorVersion ;
}
else
{
hr = E_FAIL ;
}
}
else
{
// If GetProcAddress failed, then the DLL is a version previous
// to the one shipped with IE 3.x.
* pdwMajor = 4 ;
* pdwMinor = 0 ;
}
if ( ! bAlreadyLoaded )
: : FreeLibrary ( hComCtl ) ;
return hr ;
}
return E_FAIL ;
}
# if _MFC_VER >= 0x0700
void COXCoolToolBar : : DrawBorders ( CDC * pDC , CRect & rect )
{
ASSERT_VALID ( this ) ;
ASSERT_VALID ( pDC ) ;
DWORD dwStyle = m_dwStyle ;
if ( ! ( dwStyle & CBRS_BORDER_ANY ) )
return ;
// prepare for dark lines
ASSERT ( rect . top = = 0 & & rect . left = = 0 ) ;
CRect rect1 , rect2 ;
rect1 = rect ;
rect2 = rect ;
COLORREF clr = afxData . clrBtnShadow ;
// draw dark line one pixel back/up
if ( dwStyle & CBRS_BORDER_3D )
{
rect1 . right - = CX_BORDER ;
rect1 . bottom - = CY_BORDER ;
}
if ( dwStyle & CBRS_BORDER_TOP )
rect2 . top + = afxData . cyBorder2 ;
if ( dwStyle & CBRS_BORDER_BOTTOM )
rect2 . bottom - = afxData . cyBorder2 ;
// draw left and top
if ( dwStyle & CBRS_BORDER_LEFT )
pDC - > FillSolidRect ( 0 , rect2 . top , CX_BORDER , rect2 . Height ( ) , clr ) ;
if ( dwStyle & CBRS_BORDER_TOP )
pDC - > FillSolidRect ( 0 , 0 , rect . right , CY_BORDER , clr ) ;
// draw right and bottom
if ( dwStyle & CBRS_BORDER_RIGHT )
pDC - > FillSolidRect ( rect1 . right , rect2 . top , - CX_BORDER , rect2 . Height ( ) , clr ) ;
if ( dwStyle & CBRS_BORDER_BOTTOM )
pDC - > FillSolidRect ( 0 , rect1 . bottom , rect . right , - CY_BORDER , clr ) ;
if ( dwStyle & CBRS_BORDER_3D )
{
// prepare for hilite lines
clr = afxData . clrBtnHilite ;
// draw left and top
if ( dwStyle & CBRS_BORDER_LEFT )
pDC - > FillSolidRect ( 1 , rect2 . top , CX_BORDER , rect2 . Height ( ) , clr ) ;
if ( dwStyle & CBRS_BORDER_TOP )
pDC - > FillSolidRect ( 0 , 1 , rect . right , CY_BORDER , clr ) ;
// draw right and bottom
if ( dwStyle & CBRS_BORDER_RIGHT )
pDC - > FillSolidRect ( rect . right , rect2 . top , - CX_BORDER , rect2 . Height ( ) , clr ) ;
if ( dwStyle & CBRS_BORDER_BOTTOM )
pDC - > FillSolidRect ( 0 , rect . bottom , rect . right , - CY_BORDER , clr ) ;
}
if ( dwStyle & CBRS_BORDER_LEFT )
rect . left + = afxData . cxBorder2 ;
if ( dwStyle & CBRS_BORDER_TOP )
rect . top + = afxData . cyBorder2 ;
if ( dwStyle & CBRS_BORDER_RIGHT )
rect . right - = afxData . cxBorder2 ;
if ( dwStyle & CBRS_BORDER_BOTTOM )
rect . bottom - = afxData . cyBorder2 ;
}
# endif // _MFC_VER >= 0x0700
////////////////////////////////
# endif //_MFC_VER>=0x0420
COXToolbarSkin * COXCoolToolBar : : GetToolbarSkin ( )
{
// Check if the app is derived from COXSkinnedApp
COXSkinnedApp * pSkinnedApp = DYNAMIC_DOWNCAST ( COXSkinnedApp , AfxGetApp ( ) ) ;
if ( pSkinnedApp ! = NULL & & pSkinnedApp - > GetCurrentSkin ( ) ! = NULL )
return pSkinnedApp - > GetCurrentSkin ( ) - > GetToolbarSkin ( ) ;
else
{
// Create a classic skin for this class if not created already
if ( m_pToolbarSkin = = NULL )
m_pToolbarSkin = new COXToolbarSkinClassic ( ) ;
return m_pToolbarSkin ;
}
}
BOOL COXCoolToolBar : : OnDropDownButton ( NMHDR * pNMHDR , LRESULT * result )
{
// Save the index of the last drop down button
LPNMTOOLBAR pNMToolBar = ( LPNMTOOLBAR ) pNMHDR ;
m_iDropDownIndex = pNMToolBar - > iItem ;
m_iLastDropDownIndex = pNMToolBar - > iItem ;
result = 0 ;
return FALSE ;
}
BOOL COXCoolToolBar : : IsFloatingEnabled ( )
{
return m_bFloatingEnabled ;
}
void COXCoolToolBar : : EnableFloating ( BOOL bEnable )
{
m_bFloatingEnabled = bEnable ;
}
void COXCoolToolBar : : EnableDocking ( DWORD dwDockStyle , BOOL bSnapWhileDragging )
{
// must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
ASSERT ( ( dwDockStyle & ~ ( CBRS_ALIGN_ANY | CBRS_FLOAT_MULTI ) ) = = 0 ) ;
// CBRS_SIZE_DYNAMIC toolbar cannot have the CBRS_FLOAT_MULTI style
ASSERT ( ( ( dwDockStyle & CBRS_FLOAT_MULTI ) = = 0 ) | | ( ( m_dwStyle & CBRS_SIZE_DYNAMIC ) = = 0 ) ) ;
m_dwDockStyle = dwDockStyle ;
if ( m_pDockContext = = NULL )
m_pDockContext = new CDockContext ( this ) ;
// permanently wire the bar's owner to its current parent
if ( m_hWndOwner = = NULL )
m_hWndOwner = : : GetParent ( m_hWnd ) ;
m_bSnapWhileDragging = bSnapWhileDragging ;
}
void COXCoolToolBar : : SaveMouseOffset ( CPoint point )
{
// Calculate and save the offset
CRect rectWindow ;
GetWindowRect ( rectWindow ) ;
ScreenToClient ( & rectWindow ) ;
m_ptOffset = point - rectWindow . TopLeft ( ) ;
}