Browse Source

First pass at custom keystrokes

ScottBrogden 9 years ago
parent
commit
08f4ca0bf3
15 changed files with 408 additions and 38 deletions
  1. 54 8
      Accels.cpp
  2. 7 1
      Accels.h
  3. 193 1
      ActionEnums.cpp
  4. 9 1
      ActionEnums.h
  5. 31 0
      CP_Main.rc
  6. 2 0
      CP_Main.vcxproj
  7. 2 0
      CP_Main.vcxproj.filters
  8. 32 5
      Options.cpp
  9. 5 2
      Options.h
  10. 5 2
      OptionsSheet.cpp
  11. 1 0
      OptionsSheet.h
  12. 48 16
      QPasteWnd.cpp
  13. 2 0
      QPasteWnd.h
  14. 16 2
      Resource.h
  15. 1 0
      StdAfx.h

+ 54 - 8
Accels.cpp

@@ -5,6 +5,7 @@
 CAccels::CAccels()
 {
 	m_handleRepeatKeys = false;
+	m_firstMapTick = 0;
 }
 
 void CAccels::AddAccel(CAccel a)
@@ -12,17 +13,23 @@ void CAccels::AddAccel(CAccel a)
     m_Map.SetAt(a.Key, a);
 }
 
-void CAccels::AddAccel(DWORD cmd, DWORD key)
+void CAccels::AddAccel(DWORD cmd, DWORD key, DWORD key2)
 {
-	CAccel a;
-	a.Cmd = cmd;
-	a.Key = key;
+	CAccel a(key, cmd);
+	
+	if(key2 > 0)
+	{
+		a.SecondKey = true;
+		m_Map2.SetAt(key2, a);
+	}
+
 	m_Map.SetAt(key, a);
 }
 
 void CAccels::RemoveAll()
 {
 	m_Map.RemoveAll();
+	m_Map2.RemoveAll();
 }
 
 CString CAccels::GetCmdKeyText(DWORD cmd)
@@ -37,7 +44,26 @@ CString CAccels::GetCmdKeyText(DWORD cmd)
 
 		if(a.Cmd == cmd)
 		{
+			CString cmdShortcutText2;
+			CAccel a2;
+			DWORD mapShortcut2;
+			POSITION pos2 = m_Map2.GetStartPosition();
+			while (pos2 != NULL)
+			{
+				m_Map2.GetNextAssoc(pos2, mapShortcut2, a2);
+				if(a2.Cmd == cmd)
+				{
+					cmdShortcutText2 = CHotKey::GetHotKeyDisplayStatic(mapShortcut2);
+				}
+			}
+
 			cmdShortcutText = CHotKey::GetHotKeyDisplayStatic(mapShortcut);
+
+			if(cmdShortcutText2.GetLength() > 0)
+			{
+				cmdShortcutText += _T(" - ");
+				cmdShortcutText += cmdShortcutText2;
+			}
 			break;
 		}
 	}
@@ -74,10 +100,30 @@ bool CAccels::OnMsg(MSG *pMsg, CAccel &a)
     cs.Format(_T("Key: %d, Mod: %d, vkey: %d"), key, mod, vkey);
     OutputDebugString(cs);
 
-    if(m_Map.Lookup(key, a))
-    {
-        return true;
-    }
+	if (m_firstMapTick != 0 &&
+		(GetTickCount() - m_firstMapTick) < 500)
+	{
+		if (m_Map2.Lookup(key, a))
+		{
+			m_firstMapTick = 0;
+			return true;
+		}
+	}
+	else
+	{
+		if (m_Map.Lookup(key, a))
+		{
+			if (a.SecondKey == false)
+			{
+				m_firstMapTick = 0;
+				return true;
+			}
+			else
+			{
+				m_firstMapTick = GetTickCount();
+			}
+		}
+	}
 
     return false;
 }

+ 7 - 1
Accels.h

@@ -10,11 +10,14 @@ public:
     DWORD Key;
     DWORD Cmd;
 	int RefId;
+	bool SecondKey;
+
     CAccel(DWORD key = 0, DWORD cmd = 0)
     {
         Key = key;
         Cmd = cmd;
 		RefId = 0;
+		SecondKey = false;
     }
 };
 
@@ -28,7 +31,7 @@ public:
 
     void AddAccel(CAccel a);
 
-	void AddAccel(DWORD cmd, DWORD key);
+	void AddAccel(DWORD cmd, DWORD key, DWORD key2 = 0);
 
 	void RemoveAll();
 
@@ -45,4 +48,7 @@ public:
 
 protected:
 	CMap < DWORD, DWORD, CAccel, CAccel > m_Map;
+	CMap < DWORD, DWORD, CAccel, CAccel > m_Map2;
+
+	DWORD m_firstMapTick;
 };

+ 193 - 1
ActionEnums.cpp

@@ -1,6 +1,6 @@
 #include "stdafx.h"
 #include "ActionEnums.h"
-
+#include "Accels.h"
 
 ActionEnums::ActionEnums()
 {
@@ -10,3 +10,195 @@ ActionEnums::ActionEnums()
 ActionEnums::~ActionEnums()
 {
 }
+
+
+CString ActionEnums::EnumDescription(ActionEnumValues value)
+{
+	switch (value)
+	{
+	case SHOWDESCRIPTION:
+		return "SHOWDESCRIPTION";
+	case NEXTDESCRIPTION:
+		return "NEXTDESCRIPTION";
+	case PREVDESCRIPTION:
+		return "PREVDESCRIPTION";
+	case SHOWMENU:
+		return "SHOWMENU";
+	case NEWGROUP:
+		return "NEWGROUP";
+	case NEWGROUPSELECTION:
+		return "NEWGROUPSELECTION";
+	case TOGGLEFILELOGGING:
+		return "TOGGLEFILELOGGING";
+	case TOGGLEOUTPUTDEBUGSTRING:
+		return "TOGGLEOUTPUTDEBUGSTRING";
+	case CLOSEWINDOW:
+		return "CLOSEWINDOW";
+	case NEXTTABCONTROL:
+		return "NEXTTABCONTROL";
+	case PREVTABCONTROL:
+		return "PREVTABCONTROL";
+	case SHOWGROUPS:
+		return "SHOWGROUPS";
+	case NEWCLIP:
+		return "NEWCLIP";
+	case EDITCLIP:
+		return "EDITCLIP";
+	case SELECTIONUP:
+		return "SELECTIONUP";
+	case SELECTIONDOWN:
+		return "SELECTIONDOWN";
+	case MOVEFIRST:
+		return "MOVEFIRST";
+	case MOVELAST:
+		return "MOVELAST";
+	case CANCELFILTER:
+		return "CANCELFILTER";
+	case HOMELIST:
+		return "HOMELIST";
+	case BACKGRROUP:
+		return "BACKGRROUP";
+	case TOGGLESHOWPERSISTANT:
+		return "TOGGLESHOWPERSISTANT";
+	case PASTE_SELECTED:
+		return "PASTE_SELECTED";
+	case DELETE_SELECTED:
+		return "DELETE_SELECTED";
+	case CLIP_PROPERTIES:
+		return "CLIP_PROPERTIES";
+	case PASTE_SELECTED_PLAIN_TEXT:
+		return "PASTE_SELECTED_PLAIN_TEXT";
+	case MOVE_CLIP_TO_GROUP:
+		return "MOVE_CLIP_TO_GROUP";
+	case ELEVATE_PRIVlEGES:
+		return "ELEVATE_PRIVlEGES";
+	case SHOW_IN_TASKBAR:
+		return "SHOW_IN_TASKBAR";
+	case COMPARE_SELECTED_CLIPS:
+		return "COMPARE_SELECTED_CLIPS";
+	case SELECT_LEFT_SIDE_COMPARE:
+		return "SELECT_LEFT_SIDE_COMPARE";
+	case SELECT_RIGHT_SITE_AND_DO_COMPARE:
+		return "SELECT_RIGHT_SITE_AND_DO_COMPARE";
+	case EXPORT_TO_TEXT_FILE:
+		return "EXPORT_TO_TEXT_FILE";
+	case EXPORT_TO_QR_CODE:
+		return "EXPORT_TO_QR_CODE";
+	case EXPORT_TO_GOOGLE_TRANSLATE:
+		return "EXPORT_TO_GOOGLE_TRANSLATE";
+	case EXPORT_TO_BITMAP_FILE:
+		return "EXPORT_TO_BITMAP_FILE";
+	case SAVE_CURRENT_CLIPBOARD:
+		return "SAVE_CURRENT_CLIPBOARD";
+	case MOVE_CLIP_UP:
+		return "MOVE_CLIP_UP";
+	case MOVE_CLIP_DOWN:
+		return "MOVE_CLIP_DOWN";
+	case MOVE_CLIP_TOP:
+		return "MOVE_CLIP_TOP";
+	case FILTER_ON_SELECTED_CLIP:
+		return "FILTER_ON_SELECTED_CLIP";
+	case PASTE_UPPER_CASE:
+		return "PASTE_UPPER_CASE";
+	case PASTE_LOWER_CASE:
+		return "PASTE_LOWER_CASE";
+	case PASTE_CAPITALiZE:
+		return "PASTE_CAPITALiZE";
+	case PASTE_SENTENCE_CASE:
+		return "PASTE_SENTENCE_CASE";
+	case PASTE_REMOVE_LINE_FEEDS:
+		return "PASTE_REMOVE_LINE_FEEDS";
+	case PASTE_ADD_ONE_LINE_FEED:
+		return "PASTE_ADD_ONE_LINE_FEED";
+	case PASTE_ADD_TWO_LINE_FEEDS:
+		return "PASTE_ADD_TWO_LINE_FEEDS";
+	case PASTE_TYPOGLYCEMIA:
+		return "PASTE_TYPOGLYCEMIA";
+	}
+}
+
+int ActionEnums::GetDefaultShortCutKeyA(ActionEnumValues value, int pos)
+{
+	switch(pos)
+	{
+	case 0:
+		switch (value)
+		{
+		case ActionEnums::SHOWDESCRIPTION:
+			return VK_F3;
+		case ActionEnums::NEXTDESCRIPTION:
+			return 'N';
+		case ActionEnums::PREVDESCRIPTION:
+			return 'P';		
+		case ActionEnums::NEWGROUP:
+			return ACCEL_MAKEKEY(VK_F7, HOTKEYF_CONTROL);
+		case ActionEnums::NEWGROUPSELECTION:
+			return VK_F7;
+		case ActionEnums::SHOWGROUPS:
+			return ACCEL_MAKEKEY('G', HOTKEYF_CONTROL);
+		case ActionEnums::NEWCLIP:
+			return ACCEL_MAKEKEY('N', HOTKEYF_CONTROL);
+		case ActionEnums::EDITCLIP:
+			return ACCEL_MAKEKEY('E', HOTKEYF_CONTROL);
+		case ActionEnums::CANCELFILTER:
+			return ACCEL_MAKEKEY('C', HOTKEYF_ALT);
+		case ActionEnums::TOGGLESHOWPERSISTANT:
+			return ACCEL_MAKEKEY(VK_SPACE, HOTKEYF_CONTROL);
+		case ActionEnums::CLIP_PROPERTIES:
+			return ACCEL_MAKEKEY(VK_RETURN, HOTKEYF_ALT);
+		case ActionEnums::PASTE_SELECTED_PLAIN_TEXT:
+			return ACCEL_MAKEKEY(VK_RETURN, HOTKEYF_SHIFT);
+		case ActionEnums::COMPARE_SELECTED_CLIPS:
+			return ACCEL_MAKEKEY(VK_F2, HOTKEYF_CONTROL);
+		}
+		break;
+	case 1:
+		switch (value)
+		{
+		case ActionEnums::PREVDESCRIPTION:
+			return VK_UP;
+		case ActionEnums::NEXTDESCRIPTION:
+			return VK_DOWN;
+		}
+		break;
+	}
+
+	return -1;
+}
+
+int ActionEnums::GetDefaultShortCutKeyB(ActionEnumValues value, int pos)
+{
+	switch (pos)
+	{
+	case 0:
+		switch (value)
+		{
+		}
+	}
+
+	return -1;
+}
+
+bool ActionEnums::UserConfigurable(ActionEnumValues value)
+{
+	switch (value)
+	{
+	case ActionEnums::NEXTTABCONTROL:
+	case ActionEnums::PREVTABCONTROL:
+	case ActionEnums::SELECTIONUP:
+	case ActionEnums::SELECTIONDOWN:
+	case ActionEnums::MOVEFIRST:
+	case ActionEnums::MOVELAST:
+	case ActionEnums::BACKGRROUP:
+	case ActionEnums::PASTE_SELECTED:
+	case ActionEnums::DELETE_SELECTED:
+	case ActionEnums::TOGGLEFILELOGGING:
+	case ActionEnums::TOGGLEOUTPUTDEBUGSTRING:
+	case ActionEnums::HOMELIST:
+	case ActionEnums::CLOSEWINDOW:
+	case ActionEnums::SHOWMENU:
+		return false;
+	}
+
+	return true;
+}

+ 9 - 1
ActionEnums.h

@@ -7,6 +7,7 @@ public:
 
 	enum ActionEnumValues
 	{ 
+		FIRST_ACTION,
 		SHOWDESCRIPTION,
 		NEXTDESCRIPTION,
 		PREVDESCRIPTION,
@@ -55,8 +56,15 @@ public:
 		PASTE_REMOVE_LINE_FEEDS,
 		PASTE_ADD_ONE_LINE_FEED,
 		PASTE_ADD_TWO_LINE_FEEDS,
-		PASTE_TYPOGLYCEMIA
+		PASTE_TYPOGLYCEMIA,
 
+		LAST_ACTION
 	};
+
+	static CString EnumDescription(ActionEnumValues value);
+
+	static int GetDefaultShortCutKeyA(ActionEnumValues value, int pos);
+	static int GetDefaultShortCutKeyB(ActionEnumValues value, int pos);
+	static bool UserConfigurable(ActionEnumValues value);
 };
 

+ 31 - 0
CP_Main.rc

@@ -870,6 +870,29 @@ BEGIN
     LTEXT           "Count",IDC_STATIC_SELECTED_COUNT,259,300,39,8
 END
 
+IDD_OPTIONS_QUICK_PASTE_KEYBOARD DIALOGEX 0, 0, 375, 265
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Dialog"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    CONTROL         "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,361,115
+    CONTROL         "",IDC_HOTKEY1,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,35,183,80,14
+    PUSHBUTTON      "Assign",IDC_ASSIGN,318,244,50,14
+    CONTROL         "",IDC_HOTKEY2,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,202,185,80,14
+    CONTROL         "Keyboard Shortcut",IDC_RADIO_KEYBOARD,"Button",BS_AUTORADIOBUTTON,18,170,76,10
+    CONTROL         "Enter Key",IDC_RADIO_ENTER,"Button",BS_AUTORADIOBUTTON,18,205,47,10
+    CONTROL         "Mouse Click",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,18,236,53,10
+    COMBOBOX        IDC_COMBO_ALL_ASSIGNED,8,139,253,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "Remove",IDC_BUTTON_REMOVE,265,138,50,14
+    PUSHBUTTON      "Add",IDC_BUTTON_ADD,318,138,50,14
+    LTEXT           "Shortcuts for selected command:",IDC_STATIC,8,128,106,8
+    GROUPBOX        "First Keypress",IDC_STATIC,7,157,137,93
+    CONTROL         "Keyboard Shortcut",IDC_RADIO_KEYBOARD2,"Button",BS_AUTORADIOBUTTON,183,171,76,10
+    CONTROL         "Enter Key",IDC_RADIO_ENTER2,"Button",BS_AUTORADIOBUTTON,183,206,47,10
+    CONTROL         "Mouse Click",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,183,238,53,10
+    GROUPBOX        "Second Keypress",IDC_STATIC,172,158,126,93
+END
+
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -1064,6 +1087,14 @@ BEGIN
         TOPMARGIN, 7
         BOTTOMMARGIN, 308
     END
+
+    IDD_OPTIONS_QUICK_PASTE_KEYBOARD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 368
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 258
+    END
 END
 #endif    // APSTUDIO_INVOKED
 

+ 2 - 0
CP_Main.vcxproj

@@ -639,6 +639,7 @@
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
     </ClCompile>
+    <ClCompile Include="QuickPasteKeyboard.cpp" />
     <ClCompile Include="Shared\TextConvert.cpp" />
     <ClCompile Include="Shared\Tokenizer.cpp" />
     <ClCompile Include="ShowTaskBarIcon.cpp" />
@@ -1868,6 +1869,7 @@
     <ClInclude Include="QRCode\qrspec.h" />
     <ClInclude Include="QRCode\rsecc.h" />
     <ClInclude Include="QRCode\split.h" />
+    <ClInclude Include="QuickPasteKeyboard.h" />
     <ClInclude Include="RichEditCtrlEx.h" />
     <ClInclude Include="SearchEditBox.h" />
     <ClInclude Include="Shared\TextConvert.h" />

+ 2 - 0
CP_Main.vcxproj.filters

@@ -398,6 +398,7 @@
       <Filter>source</Filter>
     </ClCompile>
     <ClCompile Include="PowerManager.cpp" />
+    <ClCompile Include="QuickPasteKeyboard.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="sqlite\CppSQLite3.h">
@@ -848,6 +849,7 @@
       <Filter>header</Filter>
     </ClInclude>
     <ClInclude Include="PowerManager.h" />
+    <ClInclude Include="QuickPasteKeyboard.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="CP_Main.rc">

+ 32 - 5
Options.cpp

@@ -6,6 +6,7 @@
 #include "sqlite\CppSQLite3.h"
 #include "Path.h"
 #include "CP_Main.h"
+#include "ActionEnums.h"
 
 using namespace nsPath;
 
@@ -2302,17 +2303,43 @@ void CGetSetOptions::SetShowMsgWndOnCopyToGroup(BOOL val)
 	SetProfileLong(_T("ShowMsgWndOnCopyToGroup"), val);
 }
 
-DWORD CGetSetOptions::GetActionShortCutA(DWORD action)
+int CGetSetOptions::GetActionShortCutA(DWORD action, int pos)
 {
 	CString actionText;
-	actionText.Format(_T("%d_A"), action);
-	return GetProfileLong(actionText, 0);
+	actionText.Format(_T("%d_%d_A"), action, pos);
+	int ret = GetProfileLong(actionText, -1);
+	if (ret == -1)
+	{
+		ret = ActionEnums::GetDefaultShortCutKeyA((ActionEnums::ActionEnumValues)action, pos);
+	}
+
+	return ret;
+}
+
+void CGetSetOptions::SetActionShortCutA(int action, DWORD shortcut, int pos)
+{
+	CString actionText;
+	actionText.Format(_T("%d_%d_A"), action, pos);
+	SetProfileLong(actionText, shortcut);
+}
+
+int CGetSetOptions::GetActionShortCutB(DWORD action, int pos)
+{
+	CString actionText;
+	actionText.Format(_T("%d_%d_B"), action, pos);
+	int ret = GetProfileLong(actionText, -1);
+	if (ret == -1)
+	{
+		ret = ActionEnums::GetDefaultShortCutKeyB((ActionEnums::ActionEnumValues)action, pos);
+	}
+
+	return ret;
 }
 
-void CGetSetOptions::SetActionShortCutA(int action, DWORD shortcut)
+void CGetSetOptions::SetActionShortCutB(int action, DWORD shortcut, int pos)
 {
 	CString actionText;
-	actionText.Format(_T("%d_A"), action);
+	actionText.Format(_T("%d_%d_B"), action, pos);
 	SetProfileLong(actionText, shortcut);
 }
 

+ 5 - 2
Options.h

@@ -500,8 +500,11 @@ public:
 	static BOOL GetShowMsgWndOnCopyToGroup();
 	static void SetShowMsgWndOnCopyToGroup(BOOL val);
 
-	static DWORD GetActionShortCutA(DWORD action);
-	static void SetActionShortCutA(int action, DWORD shortcut);
+	static int GetActionShortCutA(DWORD action, int pos);
+	static void SetActionShortCutA(int action, DWORD shortcut, int pos);
+
+	static int GetActionShortCutB(DWORD action, int pos);
+	static void SetActionShortCutB(int action, DWORD shortcut, int pos);
 
 	static BOOL	m_bShowAlwaysOnTopWarning;
 	static BOOL GetShowAlwaysOnTopWarning();

+ 5 - 2
OptionsSheet.cpp

@@ -13,6 +13,7 @@
 #include "OptionFriends.h"
 #include "OptionsCopyBuffers.h"
 #include "Misc.h"
+#include "QuickPasteKeyboard.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -38,6 +39,7 @@ COptionsSheet::COptionsSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectP
 	m_pAbout = NULL;
 	m_pFriends = NULL;
 	m_pCopyBuffers = NULL;
+	m_pQuickPasteShortCuts = NULL;
 	
 	m_pUtilites = NULL;
 	m_hWndParent = NULL;
@@ -47,6 +49,7 @@ COptionsSheet::COptionsSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectP
 	m_pGeneralOptions = new COptionsGeneral;
 	m_pKeyBoardOptions = new COptionsKeyBoard;
 	m_pQuickPasteOptions = new COptionsQuickPaste;
+	m_pQuickPasteShortCuts = new CQuickPasteKeyboard;
 
 	m_pCopyBuffers = new COptionsCopyBuffers;
 	m_pStats = new COptionsStats;
@@ -58,6 +61,7 @@ COptionsSheet::COptionsSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectP
 	AddPage(m_pKeyBoardOptions);
 	AddPage(m_pCopyBuffers);
 	AddPage(m_pQuickPasteOptions);
+	AddPage(m_pQuickPasteShortCuts);
 	if(g_Opt.GetAllowFriends())
 	{
 		m_pFriends = new COptionFriends;
@@ -77,9 +81,8 @@ COptionsSheet::~COptionsSheet()
 	delete m_pTypes;
 	delete m_pAbout;	
 	delete m_pFriends;
-
 	delete m_pUtilites;
-	
+	delete m_pQuickPasteShortCuts;	
 }
 
 BEGIN_MESSAGE_MAP(COptionsSheet, CPropertySheet)

+ 1 - 0
OptionsSheet.h

@@ -52,6 +52,7 @@ protected:
 	CPropertyPage *m_pAbout;
 	CPropertyPage *m_pFriends;
 	CPropertyPage *m_pCopyBuffers;
+	CPropertyPage *m_pQuickPasteShortCuts;
 
 	//CShowTaskBarIcon m_taskBar;
 

+ 48 - 16
QPasteWnd.cpp

@@ -377,29 +377,21 @@ int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	
     m_thread.Start(this);
 
-	m_actions.AddAccel(ActionEnums::NEXTTABCONTROL, VK_TAB);
-	m_actions.AddAccel(ActionEnums::SELECTIONUP, VK_UP);
-	m_actions.AddAccel(ActionEnums::SELECTIONDOWN, VK_DOWN);
-	m_actions.AddAccel(ActionEnums::MOVEFIRST, VK_HOME);
-	m_actions.AddAccel(ActionEnums::MOVELAST, VK_END);
-	m_actions.AddAccel(ActionEnums::BACKGRROUP, VK_BACK);
-	m_actions.AddAccel(ActionEnums::PASTE_SELECTED, VK_RETURN);
-	m_actions.AddAccel(ActionEnums::DELETE_SELECTED, VK_DELETE);
-	m_actions.AddAccel(ActionEnums::TOGGLEFILELOGGING, ACCEL_MAKEKEY(VK_F5, HOTKEYF_CONTROL));
-	m_actions.AddAccel(ActionEnums::TOGGLEOUTPUTDEBUGSTRING, VK_F5);
-	m_actions.AddAccel(ActionEnums::HOMELIST, VK_HOME);
+	
 
-	m_actions.AddAccel(ActionEnums::SHOWDESCRIPTION, VK_F3);
+	/*m_actions.AddAccel(ActionEnums::SHOWDESCRIPTION, VK_F3);
 	m_actions.AddAccel(ActionEnums::NEXTDESCRIPTION, 'N');
 	m_actions.AddAccel(ActionEnums::PREVDESCRIPTION, 'P');
 	m_actions.AddAccel(ActionEnums::PREVDESCRIPTION, VK_UP);
 	m_actions.AddAccel(ActionEnums::NEXTDESCRIPTION, VK_DOWN);
+	m_actions.AddAccel(ActionEnums::CLOSEWINDOW, VK_ESCAPE);
+	m_actions.AddAccel(ActionEnums::PREVTABCONTROL, ACCEL_MAKEKEY(VK_TAB, HOTKEYF_CONTROL));
 
-	m_actions.AddAccel(ActionEnums::SHOWMENU, VK_APPS);
+	m_actions.AddAccel(ActionEnums::SHOWMENU, VK_APPS));
 	m_actions.AddAccel(ActionEnums::NEWGROUP, ACCEL_MAKEKEY(VK_F7, HOTKEYF_CONTROL));
 	m_actions.AddAccel(ActionEnums::NEWGROUPSELECTION, VK_F7);	
-	m_actions.AddAccel(ActionEnums::CLOSEWINDOW, VK_ESCAPE);	
-	m_actions.AddAccel(ActionEnums::PREVTABCONTROL, ACCEL_MAKEKEY(VK_TAB, HOTKEYF_CONTROL));
+	
+	
 	m_actions.AddAccel(ActionEnums::SHOWGROUPS, ACCEL_MAKEKEY('G', HOTKEYF_CONTROL));
 	m_actions.AddAccel(ActionEnums::NEWCLIP, ACCEL_MAKEKEY('N', HOTKEYF_CONTROL));
 	m_actions.AddAccel(ActionEnums::EDITCLIP, ACCEL_MAKEKEY('E', HOTKEYF_CONTROL));	
@@ -407,7 +399,7 @@ int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	m_actions.AddAccel(ActionEnums::TOGGLESHOWPERSISTANT, ACCEL_MAKEKEY(VK_SPACE, HOTKEYF_CONTROL));	
 	m_actions.AddAccel(ActionEnums::CLIP_PROPERTIES, ACCEL_MAKEKEY(VK_RETURN, HOTKEYF_ALT));
 	m_actions.AddAccel(ActionEnums::PASTE_SELECTED_PLAIN_TEXT, ACCEL_MAKEKEY(VK_RETURN, HOTKEYF_SHIFT));
-	m_actions.AddAccel(ActionEnums::COMPARE_SELECTED_CLIPS, ACCEL_MAKEKEY(VK_F2, HOTKEYF_CONTROL));
+	m_actions.AddAccel(ActionEnums::COMPARE_SELECTED_CLIPS, ACCEL_MAKEKEY(VK_F2, HOTKEYF_CONTROL));*/
 
 	CString onTopMsg = theApp.m_Language.GetString(_T("TurnOfAlwaysOntop"), _T("Always on Top Enabled"));
 	CString shortcutText = m_actions.GetCmdKeyText(ActionEnums::TOGGLESHOWPERSISTANT);
@@ -424,10 +416,49 @@ int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	m_alwaysOnToWarningStatic.SetTextColor(COLORREF(RGB(0, 0, 255)));
 	m_alwaysOnToWarningStatic.SetToggleCursor(true);
 	m_alwaysOnToWarningStatic.SetFont(&m_groupFont);
+
+	LoadShortcuts();
 	
     return 0;
 }
 
+void CQPasteWnd::LoadShortcuts()
+{
+	m_actions.RemoveAll();
+	m_actions.AddAccel(ActionEnums::NEXTTABCONTROL, VK_TAB);
+	m_actions.AddAccel(ActionEnums::PREVTABCONTROL, ACCEL_MAKEKEY(VK_TAB, HOTKEYF_CONTROL));
+	m_actions.AddAccel(ActionEnums::SELECTIONUP, VK_UP);
+	m_actions.AddAccel(ActionEnums::SELECTIONDOWN, VK_DOWN);
+	m_actions.AddAccel(ActionEnums::MOVEFIRST, VK_HOME);
+	m_actions.AddAccel(ActionEnums::MOVELAST, VK_END);
+	m_actions.AddAccel(ActionEnums::BACKGRROUP, VK_BACK);
+	m_actions.AddAccel(ActionEnums::PASTE_SELECTED, VK_RETURN);
+	m_actions.AddAccel(ActionEnums::DELETE_SELECTED, VK_DELETE);
+	m_actions.AddAccel(ActionEnums::TOGGLEFILELOGGING, ACCEL_MAKEKEY(VK_F5, HOTKEYF_CONTROL));
+	m_actions.AddAccel(ActionEnums::TOGGLEOUTPUTDEBUGSTRING, VK_F5);
+	m_actions.AddAccel(ActionEnums::HOMELIST, VK_HOME);
+	m_actions.AddAccel(ActionEnums::CLOSEWINDOW, VK_ESCAPE);
+	m_actions.AddAccel(ActionEnums::SHOWMENU, VK_APPS);
+
+	for (DWORD i = ActionEnums::FIRST_ACTION + 1; i < ActionEnums::LAST_ACTION; i++)
+	{
+		ActionEnums::ActionEnumValues action = (ActionEnums::ActionEnumValues) i;
+
+		if (ActionEnums::UserConfigurable(action))
+		{
+			for (int i = 0; i < 10; i++)
+			{
+				DWORD a = g_Opt.GetActionShortCutA(action, i);
+				if (a > 0)
+				{
+					DWORD b = g_Opt.GetActionShortCutB(action, i);
+					m_actions.AddAccel(action, a, b);
+				}
+			}
+		}
+	}
+}
+
 void CQPasteWnd::SetSearchImages()
 {
 	int iSourceImageDPIToUse = 96; // We will assume 96 by default.
@@ -4019,6 +4050,7 @@ LRESULT CQPasteWnd::OnCancelFilter(WPARAM wParam, LPARAM lParam)
 LRESULT CQPasteWnd::OnPostOptions(WPARAM wParam, LPARAM lParam)
 {
 	UpdateFont();
+	LoadShortcuts();
 
 	return 1;
 }

+ 2 - 0
QPasteWnd.h

@@ -261,6 +261,8 @@ public:
 	bool SyncClipDataToArrayData(CClip &clip);
 	bool SelectIds(ARRAY &ids);
 
+	void LoadShortcuts();
+
     // Generated message map functions
 protected:
     //{{AFX_MSG(CQPasteWnd)

+ 16 - 2
Resource.h

@@ -113,6 +113,7 @@
 #define IDB_SYSTEM_MENU_24_24           246
 #define IDB_SYSTEM_MENU_32_32           247
 #define IDR_QUICK_PASTE_SYSTEM_MENU     248
+#define IDD_OPTIONS_QUICK_PASTE_KEYBOARD 249
 #define IDC_PATH                        1000
 #define IDC_GET_PATH                    1001
 #define IDC_SELECT_SOUND                1002
@@ -175,6 +176,7 @@
 #define IDC_BUTTON_NEW_GROUP            1040
 #define IDC_BUTTON_REFRESH              1040
 #define IDC_BUTTON_SEARCH               1040
+#define IDC_ASSIGN                      1040
 #define IDC_PARSE_EDIT                  1041
 #define IDC_SEND_PASTE_MESSAGE          1041
 #define IDC_BUTTON_PROPERTIES           1041
@@ -385,12 +387,24 @@
 #define IDC_EDIT_DIFF_PATH              2123
 #define IDC_BUTTON2                     2124
 #define IDC_BUTTON_DIFF_BROWSE          2124
+#define IDC_BUTTON_REMOVE               2124
 #define IDC_STATIC_QUICK_PASTE          2125
 #define IDC_STATIC_DESC                 2126
 #define IDC_RADIO_USE_IP                2127
+#define IDC_RADIO_KEYBOARD              2127
 #define IDC_STATIC_REMOTE_FILES         2128
+#define IDC_RADIO2                      2128
+#define IDC_RADIO_ENTER                 2128
 #define IDC_RADIO_USE_HOST_NAME         2129
+#define IDC_COMBO_ENTER_MODIFYER        2129
 #define IDC_STATIC_REMOTE_FILE_REQUEST  2130
+#define IDC_RADIO3                      2130
+#define IDC_COMBO_ALL_ASSIGNED          2131
+#define IDC_BUTTON_ADD                  2132
+#define IDC_RADIO_KEYBOARD2             2133
+#define IDC_RADIO_ENTER2                2134
+#define IDC_COMBO_ENTER_MODIFYER2       2135
+#define IDC_RADIO4                      2136
 #define ID_FIRST_OPTION                 32771
 #define ID_FIRST_EXIT                   32772
 #define ID_FIRST_SHOWQUICKPASTE         32773
@@ -540,9 +554,9 @@
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
-#define _APS_NEXT_RESOURCE_VALUE        249
+#define _APS_NEXT_RESOURCE_VALUE        250
 #define _APS_NEXT_COMMAND_VALUE         32923
-#define _APS_NEXT_CONTROL_VALUE         2127
+#define _APS_NEXT_CONTROL_VALUE         2133
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

+ 1 - 0
StdAfx.h

@@ -40,6 +40,7 @@
 #import "riched20.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude("UINT_PTR"), exclude("LONG_PTR") 
 
 #include <gdiplus.h>
+#include <afxdlgs.h>
 #pragma comment(lib, "gdiplus.lib")
 using namespace Gdiplus;