786 lines
20 KiB
C++
786 lines
20 KiB
C++
// ==========================================================================
|
|
// Class Implementation: COXCustomizeManager
|
|
// ==========================================================================
|
|
|
|
// Version: 9.3
|
|
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "OXCustomizeManager.h"
|
|
|
|
#include "UTBStrOp.h"
|
|
#include "UTB64Bit.h"
|
|
|
|
const int OXCUTOMIZEMANAGER_MIN_WIDTH=520;
|
|
const int OXCUTOMIZEMANAGER_MIN_HEIGHT=450;
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
COXCustomizeManager::COXCustomizeManager(CWnd* pParent/*=NULL*/) :
|
|
CDialog(COXCustomizeManager::IDD, pParent),
|
|
m_pActivePage(NULL),
|
|
m_rectPage(0,0,0,0),
|
|
m_bInitialized(FALSE)
|
|
{
|
|
// create image lists for shortcut bar
|
|
VERIFY(m_ilShortcutBar.Create(32,32,ILC_COLOR24|ILC_MASK,0,0));
|
|
|
|
#ifdef OX_CUSTOMIZE_SHORTKEYS
|
|
m_mapObjects.SetAt(GetShortkeysPage(),SHORTKEYS);
|
|
#endif // OX_CUSTOMIZE_SHORTKEYS
|
|
|
|
#ifdef OX_CUSTOMIZE_SPLASHWINDOW
|
|
m_mapObjects.SetAt(GetSplashWindowPage(),SPLASHWINDOW);
|
|
#endif // OX_CUSTOMIZE_SPLASHWINDOW
|
|
|
|
#ifdef OX_CUSTOMIZE_INSTANCE_MANAGER
|
|
m_mapObjects.SetAt(GetInstanceManagerPage(),INSTANCE_MANAGER);
|
|
#endif // OX_CUSTOMIZE_INSTANCE_MANAGER
|
|
|
|
#ifdef OX_CUSTOMIZE_TRAYICON
|
|
m_mapObjects.SetAt(GetTrayIconPage(),TRAYICON);
|
|
#endif // OX_CUSTOMIZE_TRAYICON
|
|
|
|
#ifdef OX_CUSTOMIZE_COOLCONTROLS
|
|
m_mapObjects.SetAt(GetCoolControlsPage(),COOLCONTROLS);
|
|
#endif // OX_CUSTOMIZE_COOLCONTROLS
|
|
|
|
#ifdef OX_CUSTOMIZE_INTELLIMOUSE
|
|
m_mapObjects.SetAt(GetIntelliMousePage(),INTELLIMOUSE);
|
|
#endif // OX_CUSTOMIZE_INTELLIMOUSE
|
|
|
|
#ifdef OX_CUSTOMIZE_CAPTION
|
|
OSVERSIONINFO osvi;
|
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
::GetVersionEx(&osvi);
|
|
if (!(osvi.dwMajorVersion >= 5 && osvi.dwMinorVersion >= 1))
|
|
m_mapObjects.SetAt(GetCaptionPage(),CAPTION_PAINTER); // only if version of Windows is lower than XP
|
|
#endif // OX_CUSTOMIZE_CAPTION
|
|
|
|
#ifdef OX_CUSTOMIZE_TABBEDMDI
|
|
m_mapObjects.SetAt(GetTabbedMDIPage(),TABBEDMDI);
|
|
#endif // OX_CUSTOMIZE_TABBEDMDI
|
|
|
|
#ifdef OX_CUSTOMIZE_WORKSPACE_STATE
|
|
m_mapObjects.SetAt(GetWorkspaceStatePage(),WORKSPACE_STATE);
|
|
#endif // OX_CUSTOMIZE_WORKSPACE_STATE
|
|
|
|
#ifdef OX_CUSTOMIZE_BACKGROUND
|
|
m_mapObjects.SetAt(GetBackgroundPage(),BACKGROUND_PAINTER);
|
|
#endif // OX_CUSTOMIZE_BACKGROUND
|
|
|
|
#ifdef OX_CUSTOMIZE_TOOLBARS
|
|
m_mapObjects.SetAt(GetToolbarsPage(),TOOLBARS);
|
|
#endif // OX_CUSTOMIZE_CAPTION
|
|
|
|
#ifdef OX_CUSTOMIZE_COMMANDS
|
|
m_mapObjects.SetAt(GetCommandsPage(),COMMANDS);
|
|
#endif // OX_CUSTOMIZE_COMMANDS
|
|
}
|
|
|
|
COXCustomizeManager::~COXCustomizeManager()
|
|
{
|
|
// means that object has been created but the dialog never been displayed
|
|
m_mapObjects.RemoveAll();
|
|
}
|
|
|
|
void COXCustomizeManager::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(COXCustomizeManager)
|
|
DDX_Control(pDX, IDC_OX_SEPARATOR_TITLE, m_sepTitle);
|
|
DDX_Control(pDX, IDC_OX_SEPARATOR_BOTTOM, m_sepBottom);
|
|
DDX_Control(pDX, IDC_OX_SHB_PAGES, m_shb);
|
|
DDX_Control(pDX, IDC_OX_STATIC_TITLE, m_title);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(COXCustomizeManager, CDialog)
|
|
//{{AFX_MSG_MAP(COXCustomizeManager)
|
|
ON_WM_SIZE()
|
|
ON_WM_GETMINMAXINFO()
|
|
ON_BN_CLICKED(IDC_OX_BUTTON_APPLY, OnButtonApply)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
ON_NOTIFY(SHBN_ACTIVATEITEM,IDC_OX_SHB_PAGES,OnActivateItem)
|
|
ON_NOTIFY(SHBN_GETITEMINFOTIP,IDC_OX_SHB_PAGES,OnGetItemInfoTip)
|
|
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
|
|
END_MESSAGE_MAP()
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL COXCustomizeManager::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// TODO: Add extra initialization here
|
|
|
|
// setup shortcut bar
|
|
m_shb.SetBarStyle(SHBS_INFOTIP|SHBS_UNDERLINEHOTITEM|SHBS_SHOWACTIVEALWAYS|
|
|
SHBS_BOLDEXPANDEDGROUP|SHBS_DISABLEDRAGDROPITEM|SHBS_DRAWHEADERDRAGIMAGE);
|
|
|
|
// setup title
|
|
m_title.SetTextColor(::GetSysColor(COLOR_CAPTIONTEXT));
|
|
m_title.SetBkColor(::GetSysColor(COLOR_BTNFACE));
|
|
m_title.SetBackgroundFillType(GRADIENT_LEFT);
|
|
CFont fontTitle;
|
|
VERIFY(fontTitle.CreatePointFont(120,_T("MS Sans Serif")));
|
|
m_title.SetTextFont(&fontTitle);
|
|
|
|
// layout manager
|
|
//
|
|
if(m_LayoutManager.IsAttached())
|
|
m_LayoutManager.Detach();
|
|
m_LayoutManager.Attach(this);
|
|
|
|
// shortcut bar control
|
|
m_LayoutManager.TieChild(IDC_OX_SHB_PAGES,OX_LMS_TOP|OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
|
|
// title
|
|
m_LayoutManager.TieChild(IDC_OX_STATIC_TITLE,OX_LMS_RIGHT|OX_LMS_LEFT,OX_LMT_SAME);
|
|
|
|
// title separator
|
|
m_LayoutManager.TieChild(IDC_OX_SEPARATOR_TITLE,
|
|
OX_LMS_RIGHT|OX_LMS_LEFT,OX_LMT_SAME);
|
|
|
|
// bottom separator
|
|
m_LayoutManager.TieChild(IDC_OX_SEPARATOR_BOTTOM,
|
|
OX_LMS_RIGHT|OX_LMS_LEFT|OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
|
|
// OK, Cancel, Apply buttons
|
|
m_LayoutManager.TieChild(IDOK,OX_LMS_BOTTOM|OX_LMS_RIGHT,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDCANCEL,OX_LMS_BOTTOM|OX_LMS_RIGHT,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_OX_BUTTON_APPLY,OX_LMS_BOTTOM|OX_LMS_RIGHT,OX_LMT_SAME);
|
|
|
|
//////////////////////////////////////
|
|
|
|
// populate the manager with standard and user defined pages
|
|
PopulatePages();
|
|
|
|
for(int nIndex=0; nIndex<m_shb.GetGroupCount(); nIndex++)
|
|
{
|
|
HSHBGROUP hGroup=m_shb.FindGroupByOrder(nIndex);
|
|
ASSERT(hGroup!=NULL);
|
|
m_shb.SortLCItems(hGroup);
|
|
}
|
|
|
|
#ifdef OX_CUSTOMIZE_WORKSPACE_STATE
|
|
ASSERT(GetWorkspaceStatePage()!=NULL);
|
|
// go through all pages and check if it should be displayed
|
|
POSITION pos=m_mapPages.GetStartPosition();
|
|
while(pos!=NULL)
|
|
{
|
|
DWORD dwID=NULL;
|
|
COXCustomizePage* pCustomizePage=NULL;
|
|
m_mapPages.GetNextAssoc(pos,pCustomizePage,dwID);
|
|
ASSERT(pCustomizePage!=NULL && dwID!=NULL);
|
|
if(!GetWorkspaceStatePage()->IsViewablePage(pCustomizePage))
|
|
VERIFY(DeletePage(pCustomizePage));
|
|
}
|
|
#endif // OX_CUSTOMIZE_WORKSPACE_STATE
|
|
|
|
// activate first page
|
|
HSHBGROUP hGroup=m_shb.FindGroupByOrder(0);
|
|
ASSERT(hGroup!=NULL);
|
|
COXCustomizePage* pCustomizePage=GetPageByLocation(hGroup,0);
|
|
ASSERT(pCustomizePage!=NULL);
|
|
VERIFY(ActivatePage(pCustomizePage));
|
|
|
|
// calculate the position of the active page window
|
|
RecalcPageRect();
|
|
// adjust the position of the current active page
|
|
if(m_pActivePage!=NULL)
|
|
m_pActivePage->MoveWindow(GetPageRect());
|
|
|
|
// mark the dialog as initialized
|
|
m_bInitialized=TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::InsertPage(COXCustomizePage* pCustomizePage,
|
|
int nPageIndex)
|
|
{
|
|
ASSERT(pCustomizePage!=NULL);
|
|
|
|
CString sTitle=pCustomizePage->GetTitle();
|
|
LPCTSTR lpszImageResource=pCustomizePage->GetImageResource();
|
|
COLORREF clrMask=pCustomizePage->GetImageMask();
|
|
CString sTooltip=pCustomizePage->GetTooltip();
|
|
CString sGroup=pCustomizePage->GetGroup();
|
|
|
|
#ifdef _DEBUG
|
|
ASSERT(nPageIndex>=0 && nPageIndex<=GetPageCount(sGroup));
|
|
|
|
HSHBGROUP hGroupTest=NULL;
|
|
int nIndexTest=-1;
|
|
ASSERT(!FindPage(pCustomizePage,hGroupTest,nIndexTest));
|
|
ASSERT(!FindPage(sTitle,sGroup,hGroupTest,nIndexTest));
|
|
#endif
|
|
|
|
// find/create the corresponding shortcut bar group
|
|
HSHBGROUP hGroup=m_shb.FindGroupByTitle(sGroup);
|
|
BOOL bNewGroup=FALSE;
|
|
if(hGroup==NULL)
|
|
{
|
|
hGroup=m_shb.InsertGroup(sGroup);
|
|
bNewGroup=TRUE;
|
|
}
|
|
if(hGroup==NULL)
|
|
{
|
|
TRACE(_T("COXCustomizeManager::InsertPage: failed to create group for the specified page\n"));
|
|
if(bNewGroup)
|
|
m_shb.DeleteGroup(hGroup);
|
|
return FALSE;
|
|
}
|
|
|
|
// associate image list with the created group
|
|
m_shb.SetLCImageList(hGroup,&m_ilShortcutBar,LVSIL_NORMAL);
|
|
|
|
// get image index for new page
|
|
int nImageIndex=-1;
|
|
if(lpszImageResource!=NULL)
|
|
{
|
|
CImageList imageList;
|
|
if(!imageList.Create(lpszImageResource,32,0,clrMask))
|
|
{
|
|
TRACE(_T("COXCustomizeManager::InsertPage: failed to extract image for new page\n"));
|
|
if(bNewGroup)
|
|
{
|
|
m_shb.DeleteGroup(hGroup);
|
|
}
|
|
return FALSE;
|
|
}
|
|
HICON hIcon=imageList.ExtractIcon(0);
|
|
ASSERT(hIcon!=NULL);
|
|
nImageIndex=m_ilShortcutBar.Add(hIcon);
|
|
ASSERT(nImageIndex!=-1);
|
|
VERIFY(::DestroyIcon(hIcon));
|
|
}
|
|
|
|
int nItem=m_shb.InsertLCItem(hGroup,nPageIndex,sTitle,nImageIndex,
|
|
(LPARAM)pCustomizePage);
|
|
if(nItem==-1)
|
|
{
|
|
TRACE(_T("COXCustomizeManager::InsertPage: failed to insert new item into the shortcut bar\n"));
|
|
if(bNewGroup)
|
|
{
|
|
m_shb.DeleteGroup(hGroup);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
m_mapPages.SetAt(pCustomizePage,((PtrToLong(hGroup))<<16)+nItem);
|
|
m_mapTooltips.SetAt(pCustomizePage,sTooltip);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::DeletePage(COXCustomizePage* pCustomizePage)
|
|
{
|
|
HSHBGROUP hGroup=NULL;
|
|
int nIndex=-1;
|
|
if(!FindPage(pCustomizePage,hGroup,nIndex))
|
|
{
|
|
return FALSE;
|
|
}
|
|
ASSERT(hGroup!=NULL && nIndex!=-1);
|
|
if(!m_shb.DeleteLCItem(hGroup,nIndex))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
m_mapTooltips.RemoveKey(pCustomizePage);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void COXCustomizeManager::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CDialog::OnSize(nType, cx, cy);
|
|
|
|
// TODO: Add your message handler code here
|
|
if(m_bInitialized)
|
|
{
|
|
RecalcPageRect();
|
|
|
|
if(m_pActivePage!=NULL)
|
|
{
|
|
m_pActivePage->MoveWindow(GetPageRect());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void COXCustomizeManager::RecalcPageRect()
|
|
{
|
|
CRect rectSepTitle;
|
|
m_sepTitle.GetWindowRect(rectSepTitle);
|
|
ScreenToClient(rectSepTitle);
|
|
|
|
CRect rectSepBottom;
|
|
m_sepBottom.GetWindowRect(rectSepBottom);
|
|
ScreenToClient(rectSepBottom);
|
|
|
|
CRect rectPage(rectSepTitle.left,rectSepTitle.bottom,
|
|
rectSepTitle.right,rectSepBottom.top);
|
|
|
|
m_rectPage=rectPage;
|
|
}
|
|
|
|
|
|
void COXCustomizeManager::PopulatePages()
|
|
{
|
|
POSITION pos=m_mapObjects.GetStartPosition();
|
|
while(pos!=NULL)
|
|
{
|
|
DWORD dwType=0;
|
|
COXCustomizePage* pCustomizePage=NULL;
|
|
m_mapObjects.GetNextAssoc(pos,pCustomizePage,dwType);
|
|
ASSERT(pCustomizePage!=NULL);
|
|
if(IsIncludingStandardPage((CustomizeManagerPage)dwType))
|
|
VERIFY(AddPage(pCustomizePage));
|
|
}
|
|
}
|
|
|
|
|
|
int COXCustomizeManager::GetAllPageCount() const
|
|
{
|
|
int nPageCount=0;
|
|
int nGroupCount= PtrToInt(m_shb.GetGroupCount());
|
|
for(int nIndex=0; nIndex<nGroupCount; nIndex++)
|
|
{
|
|
HSHBGROUP hGroup=m_shb.FindGroupByOrder(nIndex);
|
|
ASSERT(hGroup!=NULL);
|
|
nPageCount+=GetPageCount(hGroup);
|
|
}
|
|
return nPageCount;
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::FindPage(CustomizeManagerPage pageType,
|
|
HSHBGROUP& hGroupTest, int& nIndexTest) const
|
|
{
|
|
POSITION pos=m_mapObjects.GetStartPosition();
|
|
while(pos!=NULL)
|
|
{
|
|
DWORD dwType=0;
|
|
COXCustomizePage* pCustomizePage=NULL;
|
|
m_mapObjects.GetNextAssoc(pos,pCustomizePage,dwType);
|
|
ASSERT(pCustomizePage!=NULL);
|
|
if((CustomizeManagerPage)dwType==pageType)
|
|
return FindPage(pCustomizePage,hGroupTest,nIndexTest);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL COXCustomizeManager::FindPage(COXCustomizePage* pCustomizePage,
|
|
HSHBGROUP& hGroupTest, int& nIndexTest) const
|
|
{
|
|
if(pCustomizePage==NULL)
|
|
return FALSE;
|
|
|
|
BOOL bFound=FALSE;
|
|
int nGroupCount= PtrToInt(m_shb.GetGroupCount());
|
|
for(int nIndex=0; nIndex<nGroupCount; nIndex++)
|
|
{
|
|
HSHBGROUP hGroup=m_shb.FindGroupByOrder(nIndex);
|
|
ASSERT(hGroup!=NULL);
|
|
COXSHBListCtrl* pListCtrl=m_shb.GetGroupListCtrl(hGroup);
|
|
if(pListCtrl!=NULL)
|
|
{
|
|
LV_FINDINFO findInfo;
|
|
findInfo.flags=LVFI_PARAM;
|
|
findInfo.lParam=(LPARAM)pCustomizePage;
|
|
nIndexTest=pListCtrl->FindItem(&findInfo);
|
|
if(nIndexTest!=-1)
|
|
{
|
|
hGroupTest=hGroup;
|
|
bFound=TRUE;
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
return bFound;
|
|
}
|
|
|
|
BOOL COXCustomizeManager::FindPage(LPCTSTR lpszTitle, LPCTSTR lpszGroup,
|
|
HSHBGROUP& hGroupTest, int& nIndexTest) const
|
|
{
|
|
hGroupTest=m_shb.FindGroupByTitle(lpszGroup);
|
|
if(hGroupTest==NULL)
|
|
return FALSE;
|
|
COXSHBListCtrl* pListCtrl=m_shb.GetGroupListCtrl(hGroupTest);
|
|
if(pListCtrl==NULL)
|
|
return FALSE;
|
|
|
|
LV_FINDINFO findInfo;
|
|
findInfo.flags=LVFI_STRING;
|
|
findInfo.psz=lpszTitle;
|
|
nIndexTest=pListCtrl->FindItem(&findInfo);
|
|
if(nIndexTest==-1)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
COXCustomizePage* COXCustomizeManager::GetPageByLocation(HSHBGROUP hGroup,
|
|
int nIndex) const
|
|
{
|
|
ASSERT(hGroup!=NULL && nIndex!=-1);
|
|
COXSHBListCtrl* pListCtrl=m_shb.GetGroupListCtrl(hGroup);
|
|
if(pListCtrl==NULL)
|
|
{
|
|
TRACE(_T("COXCustomizeManager::GetPageByLocation: failed to retrieve group's list control\n"));
|
|
return NULL;
|
|
}
|
|
return (COXCustomizePage*)pListCtrl->GetItemData(nIndex);
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::ActivatePage(COXCustomizePage* pCustomizePage)
|
|
{
|
|
HSHBGROUP hGroup=NULL;
|
|
int nIndex=-1;
|
|
if(!FindPage(pCustomizePage,hGroup,nIndex))
|
|
return FALSE;
|
|
ASSERT(hGroup!=NULL && nIndex!=-1);
|
|
return ActivatePage(hGroup,nIndex);
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::ActivatePage(LPCTSTR lpszTitle, LPCTSTR lpszGroup)
|
|
{
|
|
HSHBGROUP hGroup=NULL;
|
|
int nIndex=-1;
|
|
if(!FindPage(lpszTitle,lpszGroup,hGroup,nIndex))
|
|
return FALSE;
|
|
ASSERT(hGroup!=NULL && nIndex!=-1);
|
|
return ActivatePage(hGroup,nIndex);
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::ActivatePage(CustomizeManagerPage pageType)
|
|
{
|
|
POSITION pos=m_mapObjects.GetStartPosition();
|
|
while(pos!=NULL)
|
|
{
|
|
DWORD dwType=0;
|
|
COXCustomizePage* pCustomizePage=NULL;
|
|
m_mapObjects.GetNextAssoc(pos,pCustomizePage,dwType);
|
|
ASSERT(pCustomizePage!=NULL);
|
|
if((CustomizeManagerPage)dwType==pageType)
|
|
return ActivatePage(pCustomizePage);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::ActivatePage(HSHBGROUP hGroup, int nIndex)
|
|
{
|
|
ASSERT(hGroup!=NULL && nIndex!=-1);
|
|
|
|
COXCustomizePage* pCustomizePage=GetPageByLocation(hGroup,nIndex);
|
|
if(pCustomizePage==NULL)
|
|
{
|
|
TRACE(_T("COXCustomizeManager::ActivatePage: failed to retrieve page object\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
COXCustomizePage* pActivePage=GetActivePage();
|
|
if(pCustomizePage==pActivePage)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if(pActivePage!=NULL)
|
|
{
|
|
HSHBGROUP hGroupTest=NULL;
|
|
int nIndexTest=-1;
|
|
VERIFY(FindPage(pActivePage,hGroupTest,nIndexTest));
|
|
ASSERT(hGroupTest!=NULL && nIndexTest!=-1);
|
|
if(hGroupTest!=hGroup)
|
|
{
|
|
COXSHBListCtrl* pListCtrl=m_shb.GetGroupListCtrl(hGroupTest);
|
|
ASSERT(pListCtrl!=NULL);
|
|
pListCtrl->ActivateItem(-1);
|
|
}
|
|
|
|
pActivePage->Unload();
|
|
m_pActivePage=NULL;
|
|
}
|
|
|
|
if(!pCustomizePage->Load(this))
|
|
{
|
|
TRACE(_T("COXCustomizeManager::ActivatePage: failed to load the page\n"));
|
|
return FALSE;
|
|
}
|
|
pCustomizePage->MoveWindow(GetPageRect());
|
|
pCustomizePage->SetFocus();
|
|
m_pActivePage=pCustomizePage;
|
|
|
|
// expand corresponding group
|
|
m_shb.ExpandGroup(hGroup);
|
|
// activate corresponding item in the shortcut bar control
|
|
COXSHBListCtrl* pListCtrl=m_shb.GetGroupListCtrl(hGroup);
|
|
ASSERT(pListCtrl!=NULL);
|
|
pListCtrl->ActivateItem(nIndex);
|
|
pListCtrl->EnsureVisible(nIndex,FALSE);
|
|
|
|
// change the title text
|
|
m_title.SetWindowText(pListCtrl->GetItemText(nIndex,0));
|
|
|
|
// update the state of the "Apply Changes" button
|
|
GetDlgItem(IDC_OX_BUTTON_APPLY)->
|
|
EnableWindow(pCustomizePage->IsSupportingApplyChanges());
|
|
|
|
// send initial update to all controls in the activated page
|
|
SendMessageToDescendants(WM_INITIALUPDATE,0,0,TRUE,TRUE);
|
|
|
|
return (pListCtrl->GetActiveItem()==nIndex);
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::SetPageTooltip(COXCustomizePage* pCustomizePage,
|
|
LPCTSTR lpszTooltip)
|
|
{
|
|
HSHBGROUP hGroup=NULL;
|
|
int nIndex=-1;
|
|
if(!FindPage(pCustomizePage,hGroup,nIndex))
|
|
return FALSE;
|
|
ASSERT(hGroup!=NULL && nIndex!=-1);
|
|
m_mapTooltips.SetAt(pCustomizePage,lpszTooltip);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void COXCustomizeManager::OnActivateItem(NMHDR* pNotifyStruct, LRESULT* result)
|
|
{
|
|
LPNMSHORTCUTBAR pNMSHB=(LPNMSHORTCUTBAR)pNotifyStruct;
|
|
ASSERT(pNMSHB!=NULL);
|
|
|
|
if(pNMSHB->nItem>=0)
|
|
{
|
|
if(!ActivatePage(pNMSHB->hGroup,pNMSHB->nItem))
|
|
{
|
|
TRACE(_T("COXCustomizeManager::OnActivateItem: failed to activate page\n"));
|
|
}
|
|
}
|
|
*result=0;
|
|
}
|
|
|
|
|
|
void COXCustomizeManager::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
CDialog::OnGetMinMaxInfo(lpMMI);
|
|
|
|
lpMMI->ptMinTrackSize.x=OXCUTOMIZEMANAGER_MIN_WIDTH;
|
|
lpMMI->ptMinTrackSize.y=OXCUTOMIZEMANAGER_MIN_HEIGHT;
|
|
}
|
|
|
|
|
|
void COXCustomizeManager::OnGetItemInfoTip(NMHDR* pNotifyStruct, LRESULT* result)
|
|
{
|
|
LPNMSHORTCUTBAR pNMSHB=(LPNMSHORTCUTBAR)pNotifyStruct;
|
|
ASSERT(pNMSHB!=NULL);
|
|
|
|
COXCustomizePage* pCustomizePage=GetPageByLocation(pNMSHB->hGroup,pNMSHB->nItem);
|
|
ASSERT(pCustomizePage!=NULL);
|
|
|
|
CString sTooltip;
|
|
VERIFY(m_mapTooltips.Lookup(pCustomizePage,sTooltip));
|
|
LPSHBINFOTIP pSHBIT=(LPSHBINFOTIP)pNMSHB->lParam;
|
|
UTBStr::tcsncpy(pSHBIT->szText, 80, sTooltip.GetBuffer(sTooltip.GetLength()),
|
|
sizeof(pSHBIT->szText)/sizeof(pSHBIT->szText[0]));
|
|
sTooltip.ReleaseBuffer();
|
|
|
|
*result=1;
|
|
}
|
|
|
|
|
|
void COXCustomizeManager::OnButtonApply()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
COXCustomizePage* pCustomizePage=GetActivePage();
|
|
if(pCustomizePage!=NULL)
|
|
{
|
|
ASSERT(pCustomizePage->IsSupportingApplyChanges());
|
|
pCustomizePage->ApplyChanges();
|
|
}
|
|
}
|
|
|
|
void COXCustomizeManager::OnCancel()
|
|
{
|
|
// TODO: Add extra cleanup here
|
|
if(!CloseManager(FALSE))
|
|
return;
|
|
|
|
// CDialog::OnCancel();
|
|
DestroyWindow();
|
|
}
|
|
|
|
void COXCustomizeManager::OnOK()
|
|
{
|
|
// TODO: Add extra validation here
|
|
if(!CloseManager(TRUE))
|
|
return;
|
|
|
|
// CDialog::OnOK();
|
|
DestroyWindow();
|
|
}
|
|
|
|
|
|
void COXCustomizeManager::OnDestroy()
|
|
{
|
|
CDialog::OnDestroy();
|
|
|
|
// TODO: Add your message handler code here
|
|
if(m_bInitialized)
|
|
{
|
|
CloseManager(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
LRESULT COXCustomizeManager::OnKickIdle(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
COXCustomizePage* pActivePage=GetActivePage();
|
|
if(pActivePage!=NULL)
|
|
{
|
|
return pActivePage->SendMessage(WM_KICKIDLE,wParam,lParam);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::CloseManager(BOOL bIsOk)
|
|
{
|
|
ASSERT(m_bInitialized);
|
|
|
|
// loop through pages and call OnCloseManager
|
|
POSITION pos=m_mapPages.GetStartPosition();
|
|
while(pos!=NULL)
|
|
{
|
|
COXCustomizePage* pCustomizePage=NULL;
|
|
DWORD dwID=NULL;
|
|
m_mapPages.GetNextAssoc(pos,pCustomizePage,dwID);
|
|
ASSERT(pCustomizePage!=NULL);
|
|
if(::IsWindow(pCustomizePage->GetSafeHwnd()))
|
|
{
|
|
if(!pCustomizePage->OnCloseManager(bIsOk))
|
|
{
|
|
ActivatePage(pCustomizePage);
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
COXCustomizePage* pActivePage=GetActivePage();
|
|
if(pActivePage!=NULL)
|
|
{
|
|
pActivePage->Unload();
|
|
m_pActivePage=NULL;
|
|
}
|
|
|
|
m_shb.DeleteAllGroups();
|
|
|
|
// loop through pages and destroy them
|
|
pos=m_mapPages.GetStartPosition();
|
|
while(pos!=NULL)
|
|
{
|
|
COXCustomizePage* pCustomizePage=NULL;
|
|
DWORD dwID=NULL;
|
|
m_mapPages.GetNextAssoc(pos,pCustomizePage,dwID);
|
|
ASSERT(pCustomizePage!=NULL);
|
|
if(::IsWindow(pCustomizePage->GetSafeHwnd()))
|
|
{
|
|
if(!pCustomizePage->DestroyWindow())
|
|
{
|
|
TRACE(_T("COXCustomizeManager::CloseManager: failed to destroy customize page %s"),pCustomizePage->GetTitle());
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
m_mapPages.RemoveAll();
|
|
m_mapTooltips.RemoveAll();
|
|
|
|
m_bInitialized=FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL COXCustomizeManager::SaveWorkspaceState()
|
|
{
|
|
|
|
#ifdef OX_CUSTOMIZE_WORKSPACE_STATE
|
|
ASSERT(GetWorkspaceStatePage()!=NULL);
|
|
#ifndef OX_CUSTOMIZE_NOTSUPPORTING_DOCKING_FRAMEWORK
|
|
CWnd* pWnd=AfxGetMainWnd();
|
|
ASSERT(pWnd!=NULL);
|
|
if(IsDockingFramework() && GetWorkspaceStatePage()->m_bIncludeBars)
|
|
{
|
|
((COXFrameWndSizeDock*)pWnd)->SaveSizeBarState(_T("SizeBarState"));
|
|
}
|
|
#endif // OX_CUSTOMIZE_NOTSUPPORTING_DOCKING_FRAMEWORK
|
|
#endif // OX_CUSTOMIZE_WORKSPACE_STATE
|
|
|
|
POSITION pos=m_mapObjects.GetStartPosition();
|
|
while(pos!=NULL)
|
|
{
|
|
DWORD dwType=0;
|
|
COXCustomizePage* pCustomizePage=NULL;
|
|
m_mapObjects.GetNextAssoc(pos,pCustomizePage,dwType);
|
|
ASSERT(pCustomizePage!=NULL);
|
|
VERIFY(pCustomizePage->SaveWorkspaceState());
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#ifdef OX_CUSTOMIZE_WORKSPACE_STATE
|
|
BOOL COXCustomizeManager::LoadWorkspaceState(BOOL bIncludeMainWnd/*=TRUE*/,
|
|
BOOL bIncludeBars/*=TRUE*/,
|
|
BOOL bIncludeChildFrames/*=TRUE*/,
|
|
BOOL bIncludeSplitterPanes/*=TRUE*/,
|
|
LPCTSTR lpszProfileName/*=_T("CustomizeWorkspaceState")*/)
|
|
{
|
|
ASSERT(GetWorkspaceStatePage()!=NULL);
|
|
if(!GetWorkspaceStatePage()->LoadWorkspaceState(bIncludeMainWnd,
|
|
bIncludeBars,bIncludeChildFrames,bIncludeSplitterPanes,lpszProfileName))
|
|
{
|
|
return FALSE;
|
|
}
|
|
#ifndef OX_CUSTOMIZE_NOTSUPPORTING_DOCKING_FRAMEWORK
|
|
CWnd* pWnd=AfxGetMainWnd();
|
|
ASSERT(pWnd!=NULL);
|
|
if(IsDockingFramework() && GetWorkspaceStatePage()->m_bIncludeBars)
|
|
{
|
|
((COXFrameWndSizeDock*)pWnd)->LoadSizeBarState(_T("SizeBarState"));
|
|
}
|
|
#endif // OX_CUSTOMIZE_NOTSUPPORTING_DOCKING_FRAMEWORK
|
|
return TRUE;
|
|
}
|
|
#endif // OX_CUSTOMIZE_WORKSPACE_STATE
|