419 lines
13 KiB
C++
419 lines
13 KiB
C++
// ==========================================================================
|
|
// Class Specification: COXCustomizeShortkeysPage
|
|
// ==========================================================================
|
|
|
|
// Header file : OXCustomizeShortkeysPage.h
|
|
|
|
// 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.
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
/*
|
|
Overview
|
|
|
|
COXCustomizeShortkeysPage is COXCustomizePage-derived class. It implements one of the
|
|
predefined (standard) customize pages that is responsible for customizing of the
|
|
contents of the application accelerator tables. Your application usually have at least
|
|
one default accelerator table and in the document/view architecture every document
|
|
template usually has its own accelerator table. Using this customize page you can
|
|
associate new accelerators with any commands or delete existing ones. The changed
|
|
accelerator tables can be saved in the registry when application is closed and when it
|
|
is opened next time the last used accelerator tables will be retrieved from the
|
|
registry and applied.
|
|
|
|
This standard page will be automatically inserted in the customize manager if you
|
|
add the following define to your stdafx.h file:
|
|
|
|
#define OX_CUSTOMIZE_SHORTKEYS
|
|
|
|
In order to initialize the page you must call the following function:
|
|
|
|
virtual BOOL InitializeShortkeys(CFrameWnd* pFrameWnd,
|
|
LPCTSTR lpszProfileName=_T("CustomizeShortkeys"));
|
|
|
|
This class implements the set of virtual functions defined in the COXCustomizePage
|
|
class that must be implemented by any page.
|
|
|
|
This class internally uses COXShortkeysOrganizer object for managing accelerators.
|
|
You can use this function in order to retrieve a pointer to this object:
|
|
|
|
virtual COXShortkeysOrganizer* GetShortkeysOrganizer();
|
|
|
|
|
|
!!! NOTE !!!
|
|
Call InitializeShortkeys() function only after the main frame window was successfully
|
|
loaded and associated objects were created (like document and view).
|
|
CMainFrame::OnCreate() function doesn't satisfy this requirement. But you can
|
|
call it after CFrameWnd::LoadFrame() has been called (for MDI application) or after
|
|
CWinApp::ProcessShellCommand() has been called (for SDI application) in
|
|
InitInstance() of your application CWinApp-derived class
|
|
|
|
|
|
The best way of learning about Customize manager capabilities is to take look at the
|
|
VisualStudioLikeDemo sample that can be found in the
|
|
.\Samples\Advanced\VisualStudioLikeDemo subdirectory of your Ultimate Toolbox
|
|
directory. In the sample menu choose "View"-"Customize" in order to display the
|
|
Customize manager window.
|
|
|
|
|
|
|
|
Dependency:
|
|
#include "OXCustomizeShortkeysPage.h"
|
|
|
|
|
|
Source code files:
|
|
"OXCustomizeShortkeysPage.cpp"
|
|
"OXCustomizePage.cpp"
|
|
"OXLayoutManager.cpp"
|
|
"OXSeparator.cpp"
|
|
"OXListBoxEx.cpp"
|
|
"OXShortkeysOrganizer.cpp"
|
|
"OXStatic.cpp"
|
|
"OXBitmapMenu.cpp"
|
|
"OXBitmapMenuOrganizer.cpp"
|
|
|
|
|
|
Resource files:
|
|
"OXCustomizeManager.rc"
|
|
|
|
|
|
*/
|
|
|
|
#if !defined(_OXCUSTOMIZESHORTKEYSPAGE_H__)
|
|
#define _OXCUSTOMIZESHORTKEYSPAGE_H__
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include "OXDllExt.h"
|
|
|
|
#ifndef __AFXTEMPL_H__
|
|
#include <afxtempl.h>
|
|
#define __AFXTEMPL_H__
|
|
#endif
|
|
|
|
#include "OXCustomizePage.h"
|
|
#include "OXListBoxEx.h"
|
|
#include "OXSeparator.h"
|
|
#include "OXStatic.h"
|
|
#include "OXShortkeysOrganizer.h"
|
|
#include "OXMainRes.h"
|
|
|
|
#ifndef NM_KEYDOWN
|
|
#define NM_KEYDOWN (NM_FIRST-15) // uses NMKEY struct
|
|
#endif
|
|
|
|
#if _MFC_VER <= 0x0421
|
|
typedef struct tagNMKEY
|
|
{
|
|
NMHDR hdr;
|
|
UINT nVKey;
|
|
UINT uFlags;
|
|
} NMKEY, FAR *LPNMKEY;
|
|
#endif
|
|
|
|
|
|
// Helper hot key control object. Notifies parent window about some events
|
|
//
|
|
class OX_CLASS_DECL COXInteractiveHotKeyCtrl : public CHotKeyCtrl
|
|
{
|
|
public:
|
|
COXInteractiveHotKeyCtrl() {};
|
|
virtual ~COXInteractiveHotKeyCtrl() {};
|
|
|
|
protected:
|
|
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
#if defined (_WINDLL)
|
|
#if defined (_AFXDLL)
|
|
AFX_MANAGE_STATE(AfxGetAppModuleState());
|
|
#else
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
#endif
|
|
#endif
|
|
|
|
LRESULT lResult=CHotKeyCtrl::WindowProc(message,wParam,lParam);
|
|
|
|
if(!::IsWindow(GetSafeHwnd()))
|
|
return lResult;
|
|
|
|
CWnd* pParentWnd=GetParent();
|
|
if(pParentWnd!=NULL)
|
|
{
|
|
switch(message)
|
|
{
|
|
case WM_KEYDOWN:
|
|
{
|
|
NMKEY nmKey;
|
|
nmKey.hdr.code=NM_KEYDOWN;
|
|
nmKey.hdr.hwndFrom=GetSafeHwnd();
|
|
nmKey.hdr.idFrom=GetDlgCtrlID();
|
|
nmKey.nVKey=(UINT)wParam;
|
|
nmKey.uFlags=HIWORD(lParam);
|
|
pParentWnd->SendMessage(WM_NOTIFY,(WPARAM)GetDlgCtrlID(),
|
|
(LPARAM)&nmKey);
|
|
break;
|
|
}
|
|
case WM_SETFOCUS:
|
|
{
|
|
NMHDR nmHdr;
|
|
nmHdr.code=NM_SETFOCUS;
|
|
nmHdr.hwndFrom=GetSafeHwnd();
|
|
nmHdr.idFrom=GetDlgCtrlID();
|
|
pParentWnd->SendMessage(WM_NOTIFY,(WPARAM)GetDlgCtrlID(),
|
|
(LPARAM)&nmHdr);
|
|
break;
|
|
}
|
|
case WM_KILLFOCUS:
|
|
{
|
|
NMHDR nmHdr;
|
|
nmHdr.code=NM_KILLFOCUS;
|
|
nmHdr.hwndFrom=GetSafeHwnd();
|
|
nmHdr.idFrom=GetDlgCtrlID();
|
|
pParentWnd->SendMessage(WM_NOTIFY,(WPARAM)GetDlgCtrlID(),
|
|
(LPARAM)&nmHdr);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return lResult;
|
|
}
|
|
};
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXCustomizeShortkeysPage dialog
|
|
|
|
class OX_CLASS_DECL COXCustomizeShortkeysPage : public COXCustomizePage
|
|
{
|
|
DECLARE_DYNCREATE(COXCustomizeShortkeysPage)
|
|
// Construction
|
|
public:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Constructs the object
|
|
COXCustomizeShortkeysPage();
|
|
|
|
// Dialog Data
|
|
//{{AFX_DATA(COXCustomizeShortkeysPage)
|
|
enum { IDD = IDD_OX_PAGE_SHORTKEYS };
|
|
COXStatic m_textDescription;
|
|
COXInteractiveHotKeyCtrl m_hotKey;
|
|
CComboBox m_comboTable;
|
|
CTreeCtrl m_treeCommands;
|
|
COXSeparator m_sepShortkeys;
|
|
COXSeparator m_sepDescription;
|
|
COXSeparator m_sepConflict;
|
|
COXSeparator m_sepCommands;
|
|
COXListBoxEx m_listShortkeys;
|
|
CString m_sAssignedTo;
|
|
CString m_sCommandDescription;
|
|
int m_nAccelTableIndex;
|
|
int m_nShortkeyIndex;
|
|
//}}AFX_DATA
|
|
|
|
|
|
|
|
protected:
|
|
// map of command IDs and corresponding image indexes. If there is no
|
|
// image associated with a command then image index equals -1
|
|
CMap<UINT,UINT,int,int> m_mapCommands;
|
|
|
|
// image list of all images for all commands
|
|
CImageList m_ilImages;
|
|
|
|
// organizer responsible for editing accellerator tables
|
|
COXShortkeysOrganizer m_shortkeysOrganizer;
|
|
|
|
// flag that specifies that shortkeys tables are not editable
|
|
BOOL m_bReadOnly;
|
|
|
|
public:
|
|
// --- In : pCustomizeManager - a pointer to COXCustomizeManager object
|
|
// that contains this page and is about to
|
|
// load it
|
|
// --- Out :
|
|
// --- Returns: TRUE if page was successfully loaded; FALSE otherwise
|
|
// --- Effect : Called by customize manager while activating the page.
|
|
// This function might be called multiple times. Before
|
|
// activating another page customize manager will call
|
|
// Unload() function
|
|
virtual BOOL Load(const COXCustomizeManager* pCustomizeManager);
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called by customize manager when currently active page is about
|
|
// to be deactivated. Matches Load() function call
|
|
virtual void Unload();
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: TRUE if changes can be applied immediately; FALSE otherwise
|
|
// --- Effect : Retrieves the flag that specifies that changes in toolbar
|
|
// appearance settingd can be applied immediately.
|
|
// Called internally by customize manager in order to enable/disable
|
|
// the "Apply" button.
|
|
virtual BOOL IsSupportingApplyChanges() { return TRUE; }
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: TRUE if changes were applied successfully; FALSE otherwise
|
|
// --- Effect : Applies the changes. Called internally by customize manager when
|
|
// "Apply" button is pressed.
|
|
virtual BOOL ApplyChanges();
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: The title of the page as it appears in customize manager's
|
|
// shortcut bar
|
|
// --- Effect : Retrieves the title of the page. This string will appear on the
|
|
// corresponding item in the customize manager's shortcut bar
|
|
virtual CString GetTitle() const {
|
|
CString sRet;
|
|
VERIFY(sRet.LoadString(IDS_OX_CSTMZESHORTKEYSTITLE));
|
|
return sRet;
|
|
//_T("Shortkeys");
|
|
}
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: The resource string of the image of the page as it appears in
|
|
// customize manager's shortcut bar
|
|
// --- Effect : Retrieves the resource string of the image of the page.
|
|
// This image will appear on the corresponding item in the customize
|
|
// manager's shortcut bar
|
|
virtual LPCTSTR GetImageResource() const
|
|
{
|
|
return MAKEINTRESOURCE(IDB_OX_CUSTOMIZE_SHORTKEYS);
|
|
}
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: The tooltip for the page item as it appears in customize manager's
|
|
// shortcut bar
|
|
// --- Effect : Retrieves the tooltip for the page item.
|
|
virtual CString GetTooltip() const {
|
|
CString sRet;
|
|
VERIFY(sRet.LoadString(IDS_OX_CSTMZESHORTKEYSTOOLTIP));
|
|
return sRet;
|
|
// _T("Customize accelerator tables");
|
|
}
|
|
|
|
|
|
// --- In : bIsOk - TRUE if the customize manager window is being closed
|
|
// as a result of pressing "OK" button; FALSE otherwise
|
|
// --- Out :
|
|
// --- Returns: TRUE if the page was successfully closed; FALSE otherwise
|
|
// --- Effect : Called by customize manager to close the page. Advanced
|
|
// overridable, use your own implementation in the case you
|
|
// need to handle the close event.
|
|
virtual BOOL OnCloseManager(BOOL bIsOk);
|
|
|
|
|
|
// --- In : pFrameWnd - pointer to main frame window of the
|
|
// application
|
|
// lpszProfileName - the name of the hive in the registry
|
|
// where updated accelerator tables contents
|
|
// is saved. If non-NULL value is set then
|
|
// the contents is retrieved from the registry
|
|
// and applied right away.
|
|
// --- Out :
|
|
// --- Returns: TRUE if information on the application's accelerator tables was
|
|
// initialized successfully; FALSE otherwise
|
|
// --- Effect : Initializes the information on the application's accelerator
|
|
// tables and retrieves their saved in the registry contents and
|
|
// applies it
|
|
virtual BOOL InitializeShortkeys(CFrameWnd* pFrameWnd,
|
|
LPCTSTR lpszProfileName=_T("CustomizeShortkeys"));
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: A pointer to COXShortkeysOrganizer object that is responsible for
|
|
// saving/loading accelerator table contents and applying it to the
|
|
// application
|
|
// --- Effect : Retrieves a pointer to Customize Shortkeys page. This page can
|
|
// be used to customize the contents of application's accelerator
|
|
// table. New shortkeys can be assigned to existing commands
|
|
// or removed from accelerator table.
|
|
virtual COXShortkeysOrganizer* GetShortkeysOrganizer()
|
|
{
|
|
return &m_shortkeysOrganizer;
|
|
}
|
|
|
|
|
|
protected:
|
|
// retrieves internal variables
|
|
void GetVars();
|
|
// updates page controls state
|
|
void ShowVars();
|
|
// retrieves the set of command from a menu (recursive function)
|
|
void RetrieveCommandsFromMenu(HMENU hMenu);
|
|
// adds the contents of the specified menu to tree (recursive function)
|
|
void AddCommandsFromMenuToTree(HMENU hMenu, HTREEITEM hParentItem);
|
|
// searches for specified item in the tree
|
|
HTREEITEM FindMenuItemInTree(CString sText, HTREEITEM hParentItem) const;
|
|
|
|
// retrieves the info about all accelerators defined in application
|
|
void GetShortkeys();
|
|
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(COXCustomizeShortkeysPage)
|
|
public:
|
|
virtual BOOL PreTranslateMessage(MSG* pMsg);
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
public:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Destructs the object
|
|
virtual ~COXCustomizeShortkeysPage();
|
|
|
|
protected:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called internally just after the page window was created.
|
|
// Override this function in order to initialize the controls
|
|
// on the page. Don't forget to call the default implementation
|
|
// unless you duplicate it in your code
|
|
virtual void OnInitDialog();
|
|
|
|
// Generated message map functions
|
|
//{{AFX_MSG(COXCustomizeShortkeysPage)
|
|
afx_msg void OnButtonAssign();
|
|
afx_msg void OnButtonRemove();
|
|
afx_msg void OnButtonRemoveAll();
|
|
afx_msg void OnButtonResetAll();
|
|
afx_msg void OnSelchangeComboTable();
|
|
afx_msg void OnSelchangeListShortkeys();
|
|
afx_msg void OnSelchangedTreeCommands(NMHDR* pNMHDR, LRESULT* pResult);
|
|
afx_msg void OnKeydownHotkey(NMHDR* pNMHDR, LRESULT* pResult);
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
//{{AFX_INSERT_LOCATION}}
|
|
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
|
|
|
#endif // !defined(_OXCUSTOMIZESHORTKEYSPAGE_H__)
|