summaryrefslogtreecommitdiff
path: root/win
diff options
context:
space:
mode:
authorleo2004-11-19 19:51:14 +0000
committerleo2004-11-19 19:51:14 +0000
commit7a4d9fd9e4c0b651c64c912b1d42c9f38fef2a2b (patch)
tree0d8fe8298577580d94d1e7f0e327fa49847ec880 /win
parent0f5654b264e729918f48fc4c95aba636d673ed3a (diff)
Added support for custom user shortcut keys.
git-svn-id: http://svn.leocad.org/trunk@363 c7d43263-9d01-0410-8a33-9dba5d9f93d6
Diffstat (limited to 'win')
-rw-r--r--win/Bmpmenu.cpp35
-rw-r--r--win/Bmpmenu.h170
-rw-r--r--win/LeoCAD.dsp17
-rw-r--r--win/LeoCAD.rc68
-rw-r--r--win/Leocad.cpp3
-rw-r--r--win/Mainfrm.cpp154
-rw-r--r--win/Mainfrm.h2
-rw-r--r--win/Prefpage.cpp318
-rw-r--r--win/Prefpage.h52
-rw-r--r--win/Prefsht.cpp3
-rw-r--r--win/System.cpp2
-rw-r--r--win/keyedit.cpp114
-rw-r--r--win/keyedit.h56
-rw-r--r--win/prefsht.h1
-rw-r--r--win/resource.h12
15 files changed, 889 insertions, 118 deletions
diff --git a/win/Bmpmenu.cpp b/win/Bmpmenu.cpp
index 44f2742..2f0864e 100644
--- a/win/Bmpmenu.cpp
+++ b/win/Bmpmenu.cpp
@@ -1375,3 +1375,38 @@ HBITMAP CBMPMenu::LoadSysColorBitmap(int nResourceId)
return NULL;
return AfxLoadSysColorBitmap(hInst, hRsrc, FALSE);
}
+
+BOOL CBMPMenu::ChangeMenuItemShortcut(const char *Shortcut, UINT nID)
+{
+ int nLoc;
+ CBMPMenuData *mdata;
+
+ // Find the old CBMPMenuData structure:
+ CBMPMenu *psubmenu = FindMenuOption(nID,nLoc);
+ if (psubmenu && nLoc >= 0)
+ mdata = psubmenu->m_MenuList[nLoc];
+ else
+ return false;
+ ASSERT(mdata);
+
+ CString OldText = mdata->GetString();
+ nLoc = OldText.Find('\t');
+
+ // Remove old shortcut text
+ if (nLoc > 0)
+ OldText = OldText.Left(nLoc);
+
+ if (Shortcut)
+ {
+ OldText += '\t';
+ OldText += Shortcut;
+ }
+#ifdef UNICODE
+ mdata->SetWideString((LPCTSTR)OldText);//SK: modified for dynamic allocation
+#else
+ mdata->SetAnsiString(OldText);
+#endif
+
+ return (CMenu::ModifyMenu(nID,mdata->nFlags,nID,(LPCTSTR)mdata));
+}
+
diff --git a/win/Bmpmenu.h b/win/Bmpmenu.h
index b32e01e..8866ea7 100644
--- a/win/Bmpmenu.h
+++ b/win/Bmpmenu.h
@@ -57,101 +57,91 @@ typedef enum {Normal,TextOnly} HIGHLIGHTSTYLE;
class CBMPMenu : public CMenu // Derived from CMenu
{
-// Construction
+ // Construction
public:
-CBMPMenu();
-// Attributes
+ CBMPMenu();
+ // Attributes
protected:
-CTypedPtrArray<CPtrArray, CBMPMenuData*> m_MenuList; // Stores list of menu items
-// When loading an owner-drawn menu using a Resource, CBMPMenu must keep track of
-// the popup menu's that it creates. Warning, this list *MUST* be destroyed
-// last item first :)
-CImageList m_List;
-
-CTypedPtrArray<CPtrArray, CBMPMenu*> m_SubMenus; // Stores list of sub-menus
-// Operations
+ CTypedPtrArray<CPtrArray, CBMPMenuData*> m_MenuList; // Stores list of menu items
+ // When loading an owner-drawn menu using a Resource, CBMPMenu must keep track of
+ // the popup menu's that it creates. Warning, this list *MUST* be destroyed
+ // last item first :)
+ CImageList m_List;
+
+ CTypedPtrArray<CPtrArray, CBMPMenu*> m_SubMenus; // Stores list of sub-menus
+ // Operations
public:
-// Overrides
-// ClassWizard generated virtual function overrides
-//{{AFX_VIRTUAL(CCustomMenu)
-//}}AFX_VIRTUAL
-// Implementation
+ // Overrides
+ // ClassWizard generated virtual function overrides
+ //{{AFX_VIRTUAL(CCustomMenu)
+ //}}AFX_VIRTUAL
+ // Implementation
public:
- static BOOL IsNewShell(void);
- void SetBitmapBackground(COLORREF color);
- void SetDisableOldStyle(void);
- void UnSetDisableOldStyle(void);
- BOOL GetDisableOldStyle(void);
- void UnSetBitmapBackground(void);
- int AddBitmapToImageList(CImageList *list,UINT nResourceID);
- BOOL LoadFromToolBar(UINT nID,UINT nToolBar,int& xoffset);
- void InsertSpaces(void);
- static LRESULT FindKeyboardShortcut(UINT nChar,UINT nFlags,CMenu *pMenu);
- static void UpdateMenu(CMenu *pmenu);
- BOOL IsMenu(CMenu *submenu);
- void DrawCheckMark(CDC *pDC,int x,int y,COLORREF color);
- void DrawRadioDot(CDC *pDC,int x,int y,COLORREF color);
- CBMPMenu *FindMenuOption(int nId,int& nLoc);
- CBMPMenuData *FindMenuOption(wchar_t *lpstrText);
- BOOL GetMenuText(UINT id,CString &string);
- CImageList *checkmaps;
- BOOL checkmapsshare;
- int m_selectcheck;
- int m_unselectcheck;
- void LoadCheckmarkBitmap(int unselect,int select);
- void DitherBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth,
- int nHeight, HBITMAP hbm, int nXSrc, int nYSrc);
- void DitherBlt2(CDC *drawdc, int nXDest, int nYDest, int nWidth,
- int nHeight, CBitmap &bmp, int nXSrc, int nYSrc);
- HBITMAP LoadSysColorBitmap(int nResourceId);
-
-virtual ~CBMPMenu(); // Virtual Destructor
-// Drawing:
-virtual void DrawItem( LPDRAWITEMSTRUCT); // Draw an item
-virtual void MeasureItem( LPMEASUREITEMSTRUCT ); // Measure an item
-
-// Customizing:
-
-void SetIconSize (int, int); // Set icon size
-
-BOOL AppendODMenuA(LPCSTR lpstrText,
-UINT nFlags = MF_OWNERDRAW,
-UINT nID = 0,
-int nIconNormal = -1); // Owner-Drawn Append
-
-BOOL AppendODMenuW(wchar_t *lpstrText,
-UINT nFlags = MF_OWNERDRAW,
-UINT nID = 0,
-int nIconNormal = -1); // Owner-Drawn Append
-
-
-BOOL ModifyODMenuA(const char *lpstrText,UINT nID=0,int nIconNormal=-1);
-BOOL ModifyODMenuA(const char *lpstrText,const char *OptionText,int nIconNormal);
-BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID=0,int nIconNormal=-1);
-BOOL ModifyODMenuW(wchar_t *lpstrText,wchar_t *OptionText,int nIconNormal);
-CBMPMenuData *NewODMenu(UINT pos,UINT nFlags,UINT nID,CString string);
-void SynchronizeMenu(void);
-void CBMPMenu::InitializeMenuList(int value);
-void CBMPMenu::DeleteMenuList(void);
-CBMPMenuData *CBMPMenu::FindMenuList(UINT nID);
-virtual BOOL LoadMenu(LPCTSTR lpszResourceName); // Load a menu
-virtual BOOL LoadMenu(int nResource); // ...
-void AddFromToolBar(CToolBar* pToolBar, int nResourceID);
-BOOL Draw3DCheckmark(CDC *dc, const CRect& rc,BOOL bSelected,
- HBITMAP hbmCheck);
-BOOL LoadToolbar(UINT nToolBar);
-BOOL LoadToolbars(const UINT *arID,int n);
-
-// Destoying:
-
-virtual BOOL DestroyMenu();
-
-// Generated message map functions
+ static BOOL IsNewShell(void);
+ void SetBitmapBackground(COLORREF color);
+ void SetDisableOldStyle(void);
+ void UnSetDisableOldStyle(void);
+ BOOL GetDisableOldStyle(void);
+ void UnSetBitmapBackground(void);
+ int AddBitmapToImageList(CImageList *list,UINT nResourceID);
+ BOOL LoadFromToolBar(UINT nID,UINT nToolBar,int& xoffset);
+ void InsertSpaces(void);
+ static LRESULT FindKeyboardShortcut(UINT nChar,UINT nFlags,CMenu *pMenu);
+ static void UpdateMenu(CMenu *pmenu);
+ BOOL IsMenu(CMenu *submenu);
+ void DrawCheckMark(CDC *pDC,int x,int y,COLORREF color);
+ void DrawRadioDot(CDC *pDC,int x,int y,COLORREF color);
+ CBMPMenu *FindMenuOption(int nId,int& nLoc);
+ CBMPMenuData *FindMenuOption(wchar_t *lpstrText);
+ BOOL GetMenuText(UINT id,CString &string);
+ CImageList *checkmaps;
+ BOOL checkmapsshare;
+ int m_selectcheck;
+ int m_unselectcheck;
+ void LoadCheckmarkBitmap(int unselect,int select);
+ void DitherBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HBITMAP hbm, int nXSrc, int nYSrc);
+ void DitherBlt2(CDC *drawdc, int nXDest, int nYDest, int nWidth, int nHeight, CBitmap &bmp, int nXSrc, int nYSrc);
+ HBITMAP LoadSysColorBitmap(int nResourceId);
+
+ virtual ~CBMPMenu(); // Virtual Destructor
+ // Drawing:
+ virtual void DrawItem( LPDRAWITEMSTRUCT); // Draw an item
+ virtual void MeasureItem( LPMEASUREITEMSTRUCT ); // Measure an item
+
+ // Customizing:
+
+ void SetIconSize (int, int); // Set icon size
+
+ BOOL AppendODMenuA(LPCSTR lpstrText, UINT nFlags = MF_OWNERDRAW, UINT nID = 0, int nIconNormal = -1); // Owner-Drawn Append
+ BOOL AppendODMenuW(wchar_t *lpstrText, UINT nFlags = MF_OWNERDRAW, UINT nID = 0, int nIconNormal = -1); // Owner-Drawn Append
+
+ BOOL ChangeMenuItemShortcut(const char *Shortcut, UINT nID);
+ BOOL ModifyODMenuA(const char *lpstrText,UINT nID=0,int nIconNormal=-1);
+ BOOL ModifyODMenuA(const char *lpstrText,const char *OptionText,int nIconNormal);
+ BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID=0,int nIconNormal=-1);
+ BOOL ModifyODMenuW(wchar_t *lpstrText,wchar_t *OptionText,int nIconNormal);
+ CBMPMenuData *NewODMenu(UINT pos,UINT nFlags,UINT nID,CString string);
+ void SynchronizeMenu(void);
+ void CBMPMenu::InitializeMenuList(int value);
+ void CBMPMenu::DeleteMenuList(void);
+ CBMPMenuData *CBMPMenu::FindMenuList(UINT nID);
+ virtual BOOL LoadMenu(LPCTSTR lpszResourceName); // Load a menu
+ virtual BOOL LoadMenu(int nResource); // ...
+ void AddFromToolBar(CToolBar* pToolBar, int nResourceID);
+ BOOL Draw3DCheckmark(CDC *dc, const CRect& rc,BOOL bSelected, HBITMAP hbmCheck);
+ BOOL LoadToolbar(UINT nToolBar);
+ BOOL LoadToolbars(const UINT *arID,int n);
+
+ // Destoying:
+
+ virtual BOOL DestroyMenu();
+
+ // Generated message map functions
protected:
-int m_iconX,m_iconY;
-COLORREF m_bitmapBackground;
-BOOL m_bitmapBackgroundFlag;
-BOOL disable_old_style;
+ int m_iconX,m_iconY;
+ COLORREF m_bitmapBackground;
+ BOOL m_bitmapBackgroundFlag;
+ BOOL disable_old_style;
};
#endif
diff --git a/win/LeoCAD.dsp b/win/LeoCAD.dsp
index 1aca60a..d9582da 100644
--- a/win/LeoCAD.dsp
+++ b/win/LeoCAD.dsp
@@ -182,6 +182,10 @@ SOURCE=.\Ipedit.cpp
# End Source File
# Begin Source File
+SOURCE=.\keyedit.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Leocad.cpp
# End Source File
# Begin Source File
@@ -432,6 +436,10 @@ SOURCE=.\Ipedit.h
# End Source File
# Begin Source File
+SOURCE=.\keyedit.h
+# End Source File
+# Begin Source File
+
SOURCE=.\LeoCAD.h
# End Source File
# Begin Source File
@@ -1020,6 +1028,10 @@ SOURCE=..\Common\image.h
# End Source File
# Begin Source File
+SOURCE=..\common\keyboard.h
+# End Source File
+# Begin Source File
+
SOURCE=..\common\libman.h
# End Source File
# Begin Source File
@@ -1171,6 +1183,11 @@ SOURCE=..\Common\image.cpp
# End Source File
# Begin Source File
+SOURCE=..\common\keyboard.cpp
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
SOURCE=..\common\libman.cpp
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
diff --git a/win/LeoCAD.rc b/win/LeoCAD.rc
index e95148e..f80bb28 100644
--- a/win/LeoCAD.rc
+++ b/win/LeoCAD.rc
@@ -232,11 +232,11 @@ IDR_MAINFRAME MENU PRELOAD DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
- MENUITEM "&New\tCtrl+N", ID_FILE_NEW
- MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN
- MENUITEM "&Merge...\tCtrl+M", ID_FILE_MERGE
+ MENUITEM "&New", ID_FILE_NEW
+ MENUITEM "&Open...", ID_FILE_OPEN
+ MENUITEM "&Merge...", ID_FILE_MERGE
MENUITEM SEPARATOR
- MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE
+ MENUITEM "&Save", ID_FILE_SAVE
MENUITEM "Save &As...", ID_FILE_SAVE_AS
MENUITEM "Save Picture...", ID_FILE_SAVEPICTURE
MENUITEM "Sen&d...", ID_FILE_SEND_MAIL
@@ -263,12 +263,12 @@ BEGIN
END
POPUP "&Edit"
BEGIN
- MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO
- MENUITEM "Redo\tCtrl+Y", ID_EDIT_REDO
+ MENUITEM "&Undo", ID_EDIT_UNDO
+ MENUITEM "Redo", ID_EDIT_REDO
MENUITEM SEPARATOR
- MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT
- MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY
- MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE
+ MENUITEM "Cu&t", ID_EDIT_CUT
+ MENUITEM "&Copy", ID_EDIT_COPY
+ MENUITEM "&Paste", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "Select All", ID_EDIT_SELECTALL
MENUITEM "Select None", ID_EDIT_SELECTNONE
@@ -284,13 +284,13 @@ BEGIN
MENUITEM "Mirror...", ID_PIECE_MIRROR
MENUITEM "Copy Keys", ID_PIECE_COPYKEYS
MENUITEM SEPARATOR
- MENUITEM "Group...\tCtrl+G", ID_PIECE_GROUP
- MENUITEM "Ungroup\tCtrl+U", ID_PIECE_UNGROUP
+ MENUITEM "Group...", ID_PIECE_GROUP
+ MENUITEM "Ungroup", ID_PIECE_UNGROUP
MENUITEM "Remove From Group", ID_PIECE_DETACH
MENUITEM "Add To Group", ID_PIECE_ATTACH
MENUITEM "Edit Groups...", ID_PIECE_EDITGROUPS
MENUITEM SEPARATOR
- MENUITEM "Hide Selected\tCtrl+H", ID_PIECE_HIDESELECTED
+ MENUITEM "Hide Selected", ID_PIECE_HIDESELECTED
MENUITEM "Hide Unselected", ID_PIECE_HIDEUNSELECTED
MENUITEM "Unhide All", ID_PIECE_UNHIDEALL
END
@@ -580,27 +580,12 @@ END
IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE PURE
BEGIN
- "C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
"F", ID_VIEW_FULLSCREEN, VIRTKEY, CONTROL, NOINVERT
- "G", ID_PIECE_GROUP, VIRTKEY, CONTROL, NOINVERT
- "H", ID_PIECE_HIDESELECTED, VIRTKEY, CONTROL, NOINVERT
- "M", ID_FILE_MERGE, VIRTKEY, CONTROL, NOINVERT
- "N", ID_FILE_NEW, VIRTKEY, CONTROL, NOINVERT
- "O", ID_FILE_OPEN, VIRTKEY, CONTROL, NOINVERT
"P", ID_FILE_PRINT, VIRTKEY, CONTROL, NOINVERT
- "S", ID_FILE_SAVE, VIRTKEY, CONTROL, NOINVERT
- "U", ID_PIECE_UNGROUP, VIRTKEY, CONTROL, NOINVERT
- "V", ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT
VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT, NOINVERT
VK_DELETE, ID_PIECE_DELETE, VIRTKEY, NOINVERT
- VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT
VK_F1, ID_HELP, VIRTKEY, NOINVERT
VK_F1, ID_CONTEXT_HELP, VIRTKEY, SHIFT, NOINVERT
- VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
- VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT
- "X", ID_EDIT_CUT, VIRTKEY, CONTROL, NOINVERT
- "Y", ID_EDIT_REDO, VIRTKEY, CONTROL, NOINVERT
- "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL, NOINVERT
END
@@ -1399,6 +1384,27 @@ BEGIN
PUSHBUTTON "Remove",ID_LIBTEX_REMOVE,169,41,50,14
END
+IDD_PREFKEYBOARD DIALOG DISCARDABLE 0, 0, 246, 132
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Keyboard"
+FONT 8, "MS Sans Serif"
+BEGIN
+ LISTBOX IDC_KEYDLG_CMDLIST,7,7,85,113,LBS_NOINTEGRALHEIGHT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "Current shortcuts:",IDC_STATIC,100,7,82,8
+ COMBOBOX IDC_KEYDLG_COMBO,100,19,90,40,CBS_DROPDOWNLIST |
+ WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Remove",IDC_KEYDLG_REMOVE,197,18,42,14,WS_DISABLED
+ LTEXT "Press new shortcut:",IDC_STATIC,100,35,59,9
+ EDITTEXT IDC_KEYDLG_KEYEDIT,100,47,90,12,ES_AUTOHSCROLL
+ PUSHBUTTON "Assign",IDC_KEYDLG_ASSIGN,197,46,42,14,WS_DISABLED
+ EDITTEXT IDC_KEYDLG_FILENAME,100,88,139,12,ES_AUTOHSCROLL
+ PUSHBUTTON "Save...",IDC_KEYDLG_SAVE,100,106,42,14
+ PUSHBUTTON "Load...",IDC_KEYDLG_LOAD,148,106,42,14
+ PUSHBUTTON "Reset",IDC_KEYDLG_RESET,197,106,42,14
+ LTEXT "Shortcuts File:",IDC_STATIC,100,76,139,8
+END
+
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
@@ -1653,6 +1659,14 @@ BEGIN
TOPMARGIN, 7
BOTTOMMARGIN, 194
END
+
+ IDD_PREFKEYBOARD, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 239
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 124
+ END
END
#endif // APSTUDIO_INVOKED
diff --git a/win/Leocad.cpp b/win/Leocad.cpp
index c5601db..1b5895c 100644
--- a/win/Leocad.cpp
+++ b/win/Leocad.cpp
@@ -15,6 +15,7 @@
#include "config.h"
#include "mainwnd.h"
#include "library.h"
+#include "keyboard.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -94,6 +95,8 @@ BOOL CCADApp::InitInstance()
SetRegistryKey(_T("BT Software"));
// LoadStdProfileSettings(); // Load standard INI file options (including MRU)
+ InitKeyboardShortcuts();
+
if (!GL_Initialize (NULL))
return FALSE;
diff --git a/win/Mainfrm.cpp b/win/Mainfrm.cpp
index 570ec78..3e4bdee 100644
--- a/win/Mainfrm.cpp
+++ b/win/Mainfrm.cpp
@@ -13,6 +13,7 @@
#include "mainwnd.h"
#include "cadview.h"
#include "console.h"
+#include "keyboard.h"
#include "Print.h"
@@ -247,6 +248,8 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
SetMenu (pMenu);
m_hMenuDefault = hMenu;
+ UpdateMenuAccelerators();
+
messenger->Listen (&mainframe_listener, this);
main_window->SetXID (this);
@@ -1094,3 +1097,154 @@ BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
return TRUE;
}
+
+BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
+{
+ // Check if the user pressed any accelerator.
+ if (pMsg->message == WM_KEYDOWN)
+ {
+ if ((HIWORD(pMsg->lParam) & KF_REPEAT) == 0)
+ {
+ bool Control = GetKeyState(VK_CONTROL) < 0;
+ bool Shift = GetKeyState(VK_SHIFT) < 0;
+
+ for (int i = 0; i < KeyboardShortcutsCount; i++)
+ {
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[i];
+
+ if (pMsg->wParam == Cmd.Key1)
+ {
+ if ((Shift == ((Cmd.Modifiers & LC_KEYMOD1_SHIFT) != 0)) &&
+ (Control == ((Cmd.Modifiers & LC_KEYMOD1_CONTROL) != 0)))
+ {
+ project->HandleCommand(Cmd.ID, 0);
+ return true;
+ }
+ }
+
+ if (pMsg->wParam == Cmd.Key2)
+ {
+ if ((Shift == ((Cmd.Modifiers & LC_KEYMOD2_SHIFT) != 0)) &&
+ (Control == ((Cmd.Modifiers & LC_KEYMOD2_CONTROL) != 0)))
+ {
+ project->HandleCommand(Cmd.ID, 0);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return CFrameWnd::PreTranslateMessage(pMsg);
+}
+
+void CMainFrame::UpdateMenuAccelerators()
+{
+ DWORD CmdToID[] =
+ {
+ ID_FILE_NEW, // LC_FILE_NEW
+ ID_FILE_OPEN, // LC_FILE_OPEN
+ ID_FILE_MERGE, // LC_FILE_MERGE
+ ID_FILE_SAVE, // LC_FILE_SAVE
+ ID_FILE_SAVE_AS, // LC_FILE_SAVEAS
+ ID_FILE_SAVEPICTURE, // LC_FILE_PICTURE
+ ID_FILE_EXPORT_3DSTUDIO, // LC_FILE_3DS
+ ID_FILE_EXPORT_HTML, // LC_FILE_HTML
+ ID_FILE_EXPORT_POVRAY, // LC_FILE_POVRAY
+ ID_FILE_EXPORT_WAVEFRONT, // LC_FILE_WAVEFRONT
+ ID_FILE_PROPERTIES, // LC_FILE_PROPERTIES
+ ID_FILE_TERRAINEDITOR, // LC_FILE_TERRAIN
+ ID_FILE_EDITPIECELIBRARY, // LC_FILE_LIBRARY
+ 0, // LC_FILE_RECENT
+ ID_EDIT_UNDO, // LC_EDIT_UNDO
+ ID_EDIT_REDO, // LC_EDIT_REDO
+ ID_EDIT_CUT, // LC_EDIT_CUT
+ ID_EDIT_COPY, // LC_EDIT_COPY
+ ID_EDIT_PASTE, // LC_EDIT_PASTE
+ ID_EDIT_SELECTALL, // LC_EDIT_SELECT_ALL
+ ID_EDIT_SELECTNONE, // LC_EDIT_SELECT_NONE
+ ID_EDIT_SELECTINVERT, // LC_EDIT_SELECT_INVERT
+ ID_EDIT_SELECTBYNAME, // LC_EDIT_SELECT_BYNAME
+ ID_PIECE_INSERT, // LC_PIECE_INSERT
+ ID_PIECE_DELETE, // LC_PIECE_DELETE
+ ID_PIECE_MINIFIGWIZARD, // LC_PIECE_MINIFIG
+ ID_PIECE_ARRAY, // LC_PIECE_ARRAY
+ ID_PIECE_COPYKEYS, // LC_PIECE_COPYKEYS
+ ID_PIECE_GROUP, // LC_PIECE_GROUP
+ ID_PIECE_UNGROUP, // LC_PIECE_UNGROUP
+ ID_PIECE_ATTACH, // LC_PIECE_GROUP_ADD
+ ID_PIECE_DETACH, // LC_PIECE_GROUP_REMOVE
+ ID_PIECE_EDITGROUPS, // LC_PIECE_GROUP_EDIT
+ ID_PIECE_HIDESELECTED, // LC_PIECE_HIDE_SELECTED
+ ID_PIECE_HIDEUNSELECTED, // LC_PIECE_HIDE_UNSELECTED
+ ID_PIECE_UNHIDEALL, // LC_PIECE_UNHIDE_ALL
+ ID_PIECE_PREVIOUS, // LC_PIECE_PREVIOUS
+ ID_PIECE_NEXT, // LC_PIECE_NEXT
+ ID_VIEW_PREFERENCES, // LC_VIEW_PREFERENCES
+ 0, // LC_VIEW_ZOOM
+ ID_VIEW_ZOOMIN, // LC_VIEW_ZOOMIN
+ ID_VIEW_ZOOMOUT, // LC_VIEW_ZOOMOUT
+ ID_ZOOM_EXTENTS, // LC_VIEW_ZOOMEXTENTS
+ 0, // LC_VIEW_VIEWPORTS
+ ID_VIEW_STEP_NEXT, // LC_VIEW_STEP_NEXT
+ ID_VIEW_STEP_PREVIOUS, // LC_VIEW_STEP_PREVIOUS
+ ID_VIEW_STEP_FIRST, // LC_VIEW_STEP_FIRST
+ ID_VIEW_STEP_LAST, // LC_VIEW_STEP_LAST
+ ID_VIEW_STEP_CHOOSE, // LC_VIEW_STEP_CHOOSE
+ 0, // LC_VIEW_STEP_SET
+ ID_VIEW_STEP_INSERT, // LC_VIEW_STEP_INSERT
+ ID_VIEW_STEP_DELETE, // LC_VIEW_STEP_DELETE
+ ID_ANIMATOR_STOP, // LC_VIEW_STOP
+ ID_ANIMATOR_PLAY, // LC_VIEW_PLAY
+ 0, // LC_VIEW_CAMERA_MENU
+ ID_VIEW_CAMERAS_RESET, // LC_VIEW_CAMERA_RESET
+ 0, // LC_VIEW_AUTOPAN
+ ID_APP_ABOUT, // LC_HELP_ABOUT
+ 0, // LC_TOOLBAR_ANIMATION
+ 0, // LC_TOOLBAR_ADDKEYS
+ 0, // LC_TOOLBAR_SNAPMENU
+ 0, // LC_TOOLBAR_LOCKMENU
+ 0, // LC_TOOLBAR_SNAPMOVEMENU
+ 0, // LC_TOOLBAR_FASTRENDER
+ 0, // LC_TOOLBAR_BACKGROUND
+ };
+
+ m_bmpMenu.Attach(m_hMenuDefault);
+
+ for (int i = 0; i < KeyboardShortcutsCount; i++)
+ {
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[i];
+ DWORD ID = CmdToID[Cmd.ID];
+ String str;
+
+ if (ID == 0)
+ continue;
+
+ if (Cmd.Key1)
+ {
+ if (Cmd.Modifiers & LC_KEYMOD1_SHIFT)
+ str += "Shift+";
+
+ if (Cmd.Modifiers & LC_KEYMOD1_CONTROL)
+ str += "Ctrl+";
+
+ str += GetKeyName(Cmd.Key1);
+
+ if (Cmd.Key2)
+ {
+ str += ",";
+ if (Cmd.Modifiers & LC_KEYMOD2_SHIFT)
+ str += "Shift+";
+
+ if (Cmd.Modifiers & LC_KEYMOD2_CONTROL)
+ str += "Ctrl+";
+
+ str += GetKeyName(Cmd.Key2);
+ }
+ }
+
+ m_bmpMenu.ChangeMenuItemShortcut(str, ID);
+ }
+
+ m_bmpMenu.Detach();
+}
diff --git a/win/Mainfrm.h b/win/Mainfrm.h
index ca6db37..1061cc9 100644
--- a/win/Mainfrm.h
+++ b/win/Mainfrm.h
@@ -34,6 +34,7 @@ public:
//{{AFX_VIRTUAL(CMainFrame)
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
+ virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
@@ -56,6 +57,7 @@ public:
CPiecesBar m_wndPiecesBar;
CSplitterWnd m_wndSplitter;
+ void UpdateMenuAccelerators();
void SetStatusBarMessage(const char* Message)
{ m_strStatusBar = Message; }
diff --git a/win/Prefpage.cpp b/win/Prefpage.cpp
index 4779030..8035db2 100644
--- a/win/Prefpage.cpp
+++ b/win/Prefpage.cpp
@@ -5,7 +5,9 @@
#include "resource.h"
#include "PrefPage.h"
#include "Tools.h"
+#include "MainFrm.h"
#include "defines.h"
+#include "keyboard.h"
#ifdef _DEBUG
#undef THIS_FILE
@@ -17,6 +19,7 @@ IMPLEMENT_DYNCREATE(CPreferencesDetail, CPropertyPage)
IMPLEMENT_DYNCREATE(CPreferencesDrawing, CPropertyPage)
IMPLEMENT_DYNCREATE(CPreferencesScene, CPropertyPage)
IMPLEMENT_DYNCREATE(CPreferencesPrint, CPropertyPage)
+IMPLEMENT_DYNCREATE(CPreferencesKeyboard, CPropertyPage)
/////////////////////////////////////////////////////////////////////////////
// CPreferencesGeneral property page
@@ -687,3 +690,318 @@ void CPreferencesPrint::GetOptions(char* strHeader, char* strFooter)
AfxGetApp()->WriteProfileInt("Default","Catalog Rows", m_nCatRows);
AfxGetApp()->WriteProfileInt("Default","Catalog Columns", m_nCatCols);
}
+
+/////////////////////////////////////////////////////////////////////////////
+// CPreferencesKeyboard property page
+
+CPreferencesKeyboard::CPreferencesKeyboard() : CPropertyPage(CPreferencesKeyboard::IDD)
+{
+ //{{AFX_DATA_INIT(CPreferencesKeyboard)
+ m_strFileName = _T("");
+ //}}AFX_DATA_INIT
+}
+
+CPreferencesKeyboard::~CPreferencesKeyboard()
+{
+}
+
+void CPreferencesKeyboard::DoDataExchange(CDataExchange* pDX)
+{
+ CPropertyPage::DoDataExchange(pDX);
+ //{{AFX_DATA_MAP(CPreferencesKeyboard)
+ DDX_Control(pDX, IDC_KEYDLG_KEYEDIT, m_Edit);
+ DDX_Control(pDX, IDC_KEYDLG_ASSIGN, m_Assign);
+ DDX_Control(pDX, IDC_KEYDLG_REMOVE, m_Remove);
+ DDX_Control(pDX, IDC_KEYDLG_CMDLIST, m_List);
+ DDX_Control(pDX, IDC_KEYDLG_COMBO, m_Combo);
+ DDX_Text(pDX, IDC_KEYDLG_FILENAME, m_strFileName);
+ //}}AFX_DATA_MAP
+}
+
+
+BEGIN_MESSAGE_MAP(CPreferencesKeyboard, CPropertyPage)
+ //{{AFX_MSG_MAP(CPreferencesKeyboard)
+ ON_BN_CLICKED(IDC_KEYDLG_REMOVE, OnKeydlgRemove)
+ ON_BN_CLICKED(IDC_KEYDLG_ASSIGN, OnKeydlgAssign)
+ ON_BN_CLICKED(IDC_KEYDLG_RESET, OnKeydlgReset)
+ ON_LBN_SELCHANGE(IDC_KEYDLG_CMDLIST, OnSelchangeKeydlgCmdlist)
+ ON_EN_CHANGE(IDC_KEYDLG_KEYEDIT, OnChangeKeydlgKeyedit)
+ ON_BN_CLICKED(IDC_KEYDLG_SAVE, OnKeydlgSave)
+ ON_BN_CLICKED(IDC_KEYDLG_LOAD, OnKeydlgLoad)
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+
+void CPreferencesKeyboard::SetOptions()
+{
+ m_strFileName = AfxGetApp()->GetProfileString("Settings", "Keyboard", "");
+}
+
+void CPreferencesKeyboard::GetOptions()
+{
+ if (SaveKeyboardShortcuts(m_strFileName))
+ {
+ AfxGetApp()->WriteProfileString("Settings", "Keyboard", m_strFileName);
+ }
+ else
+ {
+ AfxMessageBox("Error saving Keyboard Shortcuts file.", MB_OK | MB_ICONEXCLAMATION);
+ }
+
+ ((CMainFrame*)AfxGetMainWnd())->UpdateMenuAccelerators();
+}
+
+BOOL CPreferencesKeyboard::OnInitDialog()
+{
+ CPropertyPage::OnInitDialog();
+
+ // Fill the list with all commands available.
+ for (int i = 0; i < KeyboardShortcutsCount; i++)
+ {
+ int Index = m_List.AddString(KeyboardShortcuts[i].Description);
+ m_List.SetItemData(Index, i);
+ }
+
+ m_List.SetCurSel(0);
+ OnSelchangeKeydlgCmdlist();
+
+ return TRUE;
+}
+
+void CPreferencesKeyboard::OnKeydlgRemove()
+{
+ int Sel = m_List.GetCurSel();
+
+ if (Sel == LB_ERR)
+ return;
+
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[m_List.GetItemData(Sel)];
+
+ Sel = m_Combo.GetCurSel();
+
+ if (Sel == CB_ERR)
+ return;
+
+ if (Sel == 0)
+ {
+ Cmd.Modifiers >>= 4;
+ Cmd.Key1 = Cmd.Key2;
+ Cmd.Key2 = 0;
+ }
+ else
+ {
+ Cmd.Key2 = 0;
+ Cmd.Modifiers |= 0x0f;
+ }
+
+ OnSelchangeKeydlgCmdlist();
+}
+
+void CPreferencesKeyboard::OnKeydlgAssign()
+{
+ int Sel = m_List.GetCurSel();
+
+ if (Sel == LB_ERR)
+ return;
+
+ // Check if this shortcut is not already assigned to someone else.
+ for (int i = 0; i < KeyboardShortcutsCount; i++)
+ {
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[i];
+ int Match = 0;
+
+ if (Cmd.Key1 == m_Edit.m_Key)
+ {
+ if ((((Cmd.Modifiers & LC_KEYMOD1_SHIFT) != 0) == m_Edit.m_Shift) &&
+ (((Cmd.Modifiers & LC_KEYMOD1_CONTROL) != 0) == m_Edit.m_Control))
+ {
+ Match = 1;
+ }
+ }
+
+ if (Cmd.Key2 == m_Edit.m_Key)
+ {
+ if ((((Cmd.Modifiers & LC_KEYMOD2_SHIFT) != 0) == m_Edit.m_Shift) &&
+ (((Cmd.Modifiers & LC_KEYMOD2_CONTROL) != 0) == m_Edit.m_Control))
+ {
+ Match = 2;
+ }
+ }
+
+ if (Match)
+ {
+ CString Msg;
+
+ Msg.Format("This shortcut is currently assigned to \"%s\", do you want to reassign it?",
+ Cmd.Description);
+
+ if (AfxMessageBox(Msg, MB_YESNO | MB_ICONQUESTION) == IDNO)
+ {
+ return;
+ }
+ else
+ {
+ // Remove old shortcut.
+ if (Match == 1)
+ {
+ Cmd.Modifiers >>= 4;
+ Cmd.Key1 = Cmd.Key2;
+ Cmd.Key2 = 0;
+ }
+ else
+ {
+ Cmd.Key2 = 0;
+ Cmd.Modifiers |= 0x0f;
+ }
+ }
+ }
+ }
+
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[m_List.GetItemData(Sel)];
+
+ // Assign new shortcut.
+ if (Cmd.Key1 == 0)
+ {
+ Cmd.Key1 = m_Edit.m_Key;
+
+ if (m_Edit.m_Shift)
+ Cmd.Modifiers |= LC_KEYMOD1_SHIFT;
+
+ if (m_Edit.m_Control)
+ Cmd.Modifiers |= LC_KEYMOD1_CONTROL;
+ }
+ else
+ {
+ Cmd.Key2 = m_Edit.m_Key;
+
+ if (m_Edit.m_Shift)
+ Cmd.Modifiers |= LC_KEYMOD2_SHIFT;
+
+ if (m_Edit.m_Control)
+ Cmd.Modifiers |= LC_KEYMOD2_CONTROL;
+ }
+
+ m_Edit.ResetKey();
+ OnSelchangeKeydlgCmdlist();
+}
+
+void CPreferencesKeyboard::OnSelchangeKeydlgCmdlist()
+{
+ m_Combo.ResetContent();
+ m_Remove.EnableWindow(false);
+ m_Edit.SetWindowText("");
+
+ int Sel = m_List.GetCurSel();
+
+ if (Sel == LB_ERR)
+ return;
+
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[m_List.GetItemData(Sel)];
+
+ // Update the combo box with the shortcuts for the current selection.
+ if (Cmd.Key1)
+ {
+ CString str;
+
+ if (Cmd.Modifiers & LC_KEYMOD1_SHIFT)
+ str = "Shift+";
+
+ if (Cmd.Modifiers & LC_KEYMOD1_CONTROL)
+ str += "Ctrl+";
+
+ str += GetKeyName(Cmd.Key1);
+
+ m_Combo.AddString(str);
+ m_Combo.SetCurSel(0);
+ m_Remove.EnableWindow(true);
+
+ if (Cmd.Key2)
+ {
+ str = "";
+
+ if (Cmd.Modifiers & LC_KEYMOD2_SHIFT)
+ str = "Shift+";
+
+ if (Cmd.Modifiers & LC_KEYMOD2_CONTROL)
+ str += "Ctrl+";
+
+ str += GetKeyName(Cmd.Key2);
+
+ m_Combo.AddString(str);
+ }
+ }
+
+ m_Assign.EnableWindow((Cmd.Key2 == 0) && m_Edit.m_Key);
+}
+
+void CPreferencesKeyboard::OnChangeKeydlgKeyedit()
+{
+ if (m_Edit.m_Key == 0)
+ {
+ m_Assign.EnableWindow(false);
+ return;
+ }
+
+ int Sel = m_List.GetCurSel();
+
+ if (Sel == LB_ERR)
+ return;
+
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[m_List.GetItemData(Sel)];
+
+ if (Cmd.Key2 != 0)
+ {
+ m_Assign.EnableWindow(false);
+ return;
+ }
+
+ m_Assign.EnableWindow(true);
+}
+
+void CPreferencesKeyboard::OnKeydlgReset()
+{
+ if (AfxMessageBox("Are you sure you want to reset the Keyboard Shortcuts to the default settings?", MB_YESNO | MB_ICONQUESTION) == IDYES)
+ {
+ ResetKeyboardShortcuts();
+ OnSelchangeKeydlgCmdlist();
+ }
+}
+
+void CPreferencesKeyboard::OnKeydlgSave()
+{
+ UpdateData(TRUE);
+
+ CFileDialog dlg(FALSE, "*.lkb", m_strFileName, OFN_OVERWRITEPROMPT, "LeoCAD Keyboard Layout Files (*.lkb)|*.lkb||", this);
+
+ if (dlg.DoModal() == IDOK)
+ {
+ if (SaveKeyboardShortcuts(dlg.GetPathName()))
+ {
+ m_strFileName = dlg.GetPathName();
+ UpdateData(FALSE);
+ }
+ else
+ {
+ AfxMessageBox("Error saving file.", MB_OK | MB_ICONEXCLAMATION);
+ }
+ }
+}
+
+void CPreferencesKeyboard::OnKeydlgLoad()
+{
+ CFileDialog dlg(TRUE, "*.lkb", m_strFileName, 0, "LeoCAD Keyboard Layout Files (*.lkb)|*.lkb||", this);
+
+ if (dlg.DoModal() == IDOK)
+ {
+ if (LoadKeyboardShortcuts(dlg.GetPathName()))
+ {
+ UpdateData(TRUE);
+ m_strFileName = dlg.GetPathName();
+ UpdateData(FALSE);
+ }
+ else
+ {
+ AfxMessageBox("Error loading file.", MB_OK | MB_ICONEXCLAMATION);
+ }
+ }
+}
diff --git a/win/Prefpage.h b/win/Prefpage.h
index 97eaae1..a9a3657 100644
--- a/win/Prefpage.h
+++ b/win/Prefpage.h
@@ -4,6 +4,8 @@
#ifndef __PREFPAGE_H__
#define __PREFPAGE_H__
+#include "keyedit.h"
+
/////////////////////////////////////////////////////////////////////////////
// CPreferencesGeneral dialog
@@ -276,4 +278,54 @@ protected:
};
+/////////////////////////////////////////////////////////////////////////////
+// CPreferencesKeyboard dialog
+
+class CPreferencesKeyboard : public CPropertyPage
+{
+ DECLARE_DYNCREATE(CPreferencesKeyboard)
+
+// Construction
+public:
+ void SetOptions();
+ void GetOptions();
+ CPreferencesKeyboard();
+ ~CPreferencesKeyboard();
+
+// Dialog Data
+ //{{AFX_DATA(CPreferencesKeyboard)
+ enum { IDD = IDD_PREFKEYBOARD };
+ CKeyEdit m_Edit;
+ CButton m_Assign;
+ CButton m_Remove;
+ CListBox m_List;
+ CComboBox m_Combo;
+ CString m_strFileName;
+ //}}AFX_DATA
+
+
+// Overrides
+ // ClassWizard generate virtual function overrides
+ //{{AFX_VIRTUAL(CPreferencesKeyboard)
+ protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
+ //}}AFX_VIRTUAL
+
+// Implementation
+protected:
+ // Generated message map functions
+ //{{AFX_MSG(CPreferencesKeyboard)
+ virtual BOOL OnInitDialog();
+ afx_msg void OnKeydlgRemove();
+ afx_msg void OnKeydlgAssign();
+ afx_msg void OnKeydlgReset();
+ afx_msg void OnSelchangeKeydlgCmdlist();
+ afx_msg void OnChangeKeydlgKeyedit();
+ afx_msg void OnKeydlgSave();
+ afx_msg void OnKeydlgLoad();
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+
+};
+
#endif // __PREFPAGE_H__
diff --git a/win/Prefsht.cpp b/win/Prefsht.cpp
index 22e98c0..5caf8d1 100644
--- a/win/Prefsht.cpp
+++ b/win/Prefsht.cpp
@@ -26,6 +26,7 @@ CPreferencesSheet::CPreferencesSheet(CWnd* pWndParent)
AddPage(&m_PageDrawing);
AddPage(&m_PageScene);
AddPage(&m_PagePrint);
+ AddPage(&m_PageKeyboard);
SetActivePage(AfxGetApp()->GetProfileInt("Settings", "Page", 0));
}
@@ -88,6 +89,8 @@ void CPreferencesSheet::OnDefault()
m_PageScene.UpdateData();
if (m_PagePrint.m_hWnd)
m_PagePrint.UpdateData();
+ if (m_PageKeyboard.m_hWnd)
+ m_PageKeyboard.UpdateData();
char str[LC_MAXPATH], st1[256], st2[256];
int i, j;
diff --git a/win/System.cpp b/win/System.cpp
index e5e72c8..c8a36ae 100644
--- a/win/System.cpp
+++ b/win/System.cpp
@@ -1382,6 +1382,7 @@ bool SystemDoDialog(int nMode, void* param)
ps.m_PageDrawing.SetOptions(opts->nSnap, opts->nAngleSnap, opts->nGridSize);
ps.m_PageScene.SetOptions(opts->nScene, opts->fDensity, opts->strBackground, opts->fBackground, opts->fFog, opts->fAmbient, opts->fGrad1, opts->fGrad2);
ps.m_PagePrint.SetOptions(opts->strHeader, opts->strFooter);
+ ps.m_PageKeyboard.SetOptions();
if (ps.DoModal() == IDOK)
{
@@ -1390,6 +1391,7 @@ bool SystemDoDialog(int nMode, void* param)
ps.m_PageDrawing.GetOptions(&opts->nSnap, &opts->nAngleSnap, &opts->nGridSize);
ps.m_PageScene.GetOptions(&opts->nScene, &opts->fDensity, opts->strBackground, opts->fBackground, opts->fFog, opts->fAmbient, opts->fGrad1, opts->fGrad2);
ps.m_PagePrint.GetOptions(opts->strHeader, opts->strFooter);
+ ps.m_PageKeyboard.GetOptions();
AfxGetMainWnd()->PostMessage(WM_LC_UPDATE_SETTINGS);
AfxGetApp()->WriteProfileInt("Settings", "Autosave", opts->nSaveInterval);
AfxGetApp()->WriteProfileInt("Default", "Mouse", opts->nMouse);
diff --git a/win/keyedit.cpp b/win/keyedit.cpp
new file mode 100644
index 0000000..e566496
--- /dev/null
+++ b/win/keyedit.cpp
@@ -0,0 +1,114 @@
+// keyedit.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "leocad.h"
+#include "keyedit.h"
+#include "keyboard.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CKeyEdit
+
+CKeyEdit::CKeyEdit()
+{
+ m_Key = 0;
+ m_Control = false;
+ m_Shift = false;
+}
+
+CKeyEdit::~CKeyEdit()
+{
+}
+
+
+BEGIN_MESSAGE_MAP(CKeyEdit, CEdit)
+ //{{AFX_MSG_MAP(CKeyEdit)
+ ON_WM_KEYDOWN()
+ ON_WM_KEYUP()
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CKeyEdit message handlers
+
+void CKeyEdit::ResetKey()
+{
+ m_Key = 0;
+ m_Control = false;
+ m_Shift = false;
+
+ SetWindowText("");
+}
+
+void CKeyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
+{
+
+ CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
+}
+
+void CKeyEdit::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
+{
+
+ CEdit::OnKeyUp(nChar, nRepCnt, nFlags);
+}
+
+BOOL CKeyEdit::PreTranslateMessage(MSG* pMsg)
+{
+ if (pMsg->message == WM_KEYDOWN)
+ {
+ // If the keys are for the dialog box or Windows, pass them.
+ if ((pMsg->wParam == VK_TAB) || (pMsg->wParam == VK_ESCAPE))
+ {
+// DoErasingStuff (hHotKeyEdit);
+// return CEdit::PreTranslateMessage(pMsg);
+ }
+/*
+ else if (pMsg->wParam == VK_BACK && !Control && !Shift)
+ {
+ // If backspace, then erase the edit control and disable the Assign button.
+// DoErasingStuff (hHotKeyEdit);
+// EnableWindow (GetDlgItem (GetParent (hHotKeyEdit), IDD_INSTALL), FALSE);
+ SetWindowText("");
+
+ return true;
+ }
+*/
+ else
+ {
+ CString Text;
+
+ m_Control = (GetKeyState(VK_CONTROL) < 0);
+ m_Shift = (GetKeyState(VK_SHIFT) < 0);
+
+ if (m_Control)
+ Text += "Ctrl+";
+
+ if (m_Shift)
+ Text += "Shift+";
+
+ const char* KeyName = GetKeyName(pMsg->wParam);
+
+ if (KeyName)
+ {
+ Text += KeyName;
+ m_Key = pMsg->wParam;
+ }
+ else
+ {
+ m_Key = 0;
+ }
+
+ SetWindowText(Text);
+
+ return true;
+ }
+ }
+
+ return CEdit::PreTranslateMessage(pMsg);
+}
diff --git a/win/keyedit.h b/win/keyedit.h
new file mode 100644
index 0000000..86d7101
--- /dev/null
+++ b/win/keyedit.h
@@ -0,0 +1,56 @@
+#if !defined(AFX_KEYEDIT_H__E567D1C8_2DC3_4E8F_BA7D_CF628525F55C__INCLUDED_)
+#define AFX_KEYEDIT_H__E567D1C8_2DC3_4E8F_BA7D_CF628525F55C__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+// keyedit.h : header file
+//
+
+/////////////////////////////////////////////////////////////////////////////
+// CKeyEdit window
+
+class CKeyEdit : public CEdit
+{
+// Construction
+public:
+ CKeyEdit();
+
+// Attributes
+public:
+ char m_Key;
+ bool m_Control;
+ bool m_Shift;
+
+ void ResetKey();
+
+// Operations
+public:
+
+// Overrides
+ // ClassWizard generated virtual function overrides
+ //{{AFX_VIRTUAL(CKeyEdit)
+ public:
+ virtual BOOL PreTranslateMessage(MSG* pMsg);
+ //}}AFX_VIRTUAL
+
+// Implementation
+public:
+ virtual ~CKeyEdit();
+
+ // Generated message map functions
+protected:
+ //{{AFX_MSG(CKeyEdit)
+ afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
+ afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
+ //}}AFX_MSG
+
+ DECLARE_MESSAGE_MAP()
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_KEYEDIT_H__E567D1C8_2DC3_4E8F_BA7D_CF628525F55C__INCLUDED_)
diff --git a/win/prefsht.h b/win/prefsht.h
index 37dabf8..1e285cd 100644
--- a/win/prefsht.h
+++ b/win/prefsht.h
@@ -27,6 +27,7 @@ public:
CPreferencesDrawing m_PageDrawing;
CPreferencesScene m_PageScene;
CPreferencesPrint m_PagePrint;
+ CPreferencesKeyboard m_PageKeyboard;
CTabCtrlWithDisable m_tabCtrl;
diff --git a/win/resource.h b/win/resource.h
index ce30766..20e348c 100644
--- a/win/resource.h
+++ b/win/resource.h
@@ -134,6 +134,7 @@
#define IDR_PREVIEW 221
#define IDD_EDIT_GROUPS 231
#define IDD_LIBRARY_TEXTURES 234
+#define IDD_PREFKEYBOARD 235
#define IDC_SELDLG_LIST 1000
#define IDC_SELDLG_ALL 1001
#define IDC_SELDLG_NONE 1002
@@ -409,18 +410,27 @@
#define IDC_MF_LEGLANGLE 1229
#define IDC_ABTDLG_HOMEPAGE 1229
#define IDC_MF_LEGRANGLE 1230
+#define IDC_KEYDLG_CMDLIST 1230
#define IDC_MF_SHOELANGLE 1231
#define IDC_MF_SHOERANGLE 1232
#define IDC_MF_HATSPIN 1233
+#define IDC_KEYDLG_REMOVE 1233
#define IDC_MF_HEADSPIN 1234
#define IDC_MF_NECKSPIN 1235
#define IDC_MF_ARMLSPIN 1236
+#define IDC_KEYDLG_RESET 1236
#define IDC_MF_ARMRSPIN 1237
+#define IDC_KEYDLG_KEYEDIT 1237
#define IDC_MF_HANDLSPIN 1238
+#define IDC_KEYDLG_ASSIGN 1238
#define IDC_MF_HANDRSPIN 1239
+#define IDC_KEYDLG_COMBO 1239
#define IDC_MF_TOOLLSPIN 1240
+#define IDC_KEYDLG_SAVE 1240
#define IDC_MF_TOOLRSPIN 1241
+#define IDC_KEYDLG_LOAD 1241
#define IDC_MF_LEGLSPIN 1242
+#define IDC_KEYDLG_FILENAME 1242
#define IDC_MF_LEGRSPIN 1243
#define IDC_MF_SHOELSPIN 1244
#define IDC_MF_SHOERSPIN 1245
@@ -659,7 +669,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 235
#define _APS_NEXT_COMMAND_VALUE 33158
-#define _APS_NEXT_CONTROL_VALUE 1230
+#define _APS_NEXT_CONTROL_VALUE 1243
#define _APS_NEXT_SYMED_VALUE 121
#endif
#endif