Browse Source

Added hot key to groups to save clip to that group

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@784 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden 10 years ago
parent
commit
2db297de84
12 changed files with 200 additions and 44 deletions
  1. 33 11
      CP_Main.cpp
  2. 23 18
      CP_Main.rc
  3. 20 5
      Clip.cpp
  4. 2 0
      Clip.h
  5. 65 2
      CopyProperties.cpp
  6. 3 0
      CopyProperties.h
  7. 16 0
      DatabaseUtilities.cpp
  8. 6 3
      HotKeys.cpp
  9. 9 2
      HotKeys.h
  10. 15 2
      MainFrm.cpp
  11. 3 1
      QPasteWnd.cpp
  12. 5 0
      Resource.h

+ 33 - 11
CP_Main.cpp

@@ -396,22 +396,44 @@ void CCP_MainApp::LoadGlobalClips()
 {
 	try
 	{
-		CppSQLite3Query q = m_db.execQuery(_T("SELECT lID, lShortCut, mText FROM Main WHERE lShortCut > 0 AND globalShortCut = 1"));
-
-		while(q.eof() == false)
 		{
-			int id = q.getIntField(_T("lID"));
-			int shortcut = q.getIntField(_T("lShortCut"));
-			CString desc = q.getStringField(_T("mText"));
+			CppSQLite3Query q = m_db.execQuery(_T("SELECT lID, lShortCut, mText FROM Main WHERE lShortCut > 0 AND globalShortCut = 1"));
 
-			//Constructor will add to a global list and free
-			CHotKey* globalHotKey = new CHotKey(desc, shortcut, true);
-			if(globalHotKey != NULL)
+			while(q.eof() == false)
 			{
-				globalHotKey->m_clipId = id;
+				int id = q.getIntField(_T("lID"));
+				int shortcut = q.getIntField(_T("lShortCut"));
+				CString desc = q.getStringField(_T("mText"));
+
+				//Constructor will add to a global list and free
+				CHotKey* globalHotKey = new CHotKey(desc, shortcut, true, CHotKey::PASTE_OPEN_CLIP);
+				if(globalHotKey != NULL)
+				{
+					globalHotKey->m_clipId = id;
+				}
+
+				q.nextRow();
 			}
+		}
 
-			q.nextRow();
+		{
+			CppSQLite3Query q2 = m_db.execQuery(_T("SELECT lID, MoveToGroupShortCut, mText FROM Main WHERE MoveToGroupShortCut > 0 AND GlobalMoveToGroupShortCut = 1"));
+
+			while(q2.eof() == false)
+			{
+				int id = q2.getIntField(_T("lID"));
+				int shortcut = q2.getIntField(_T("MoveToGroupShortCut"));
+				CString desc = q2.getStringField(_T("mText"));
+
+				//Constructor will add to a global list and free
+				CHotKey* globalHotKey = new CHotKey(desc, shortcut, true, CHotKey::MOVE_TO_GROUP);
+				if(globalHotKey != NULL)
+				{
+					globalHotKey->m_clipId = id;
+				}
+
+				q2.nextRow();
+			}
 		}
 	}
 	CATCH_SQLITE_EXCEPTION

+ 23 - 18
CP_Main.rc

@@ -642,31 +642,36 @@ BEGIN
     LTEXT           "Main Types",IDC_STATIC_1,7,7,80,8
 END
 
-IDD_COPY_PROPERTIES DIALOGEX 0, 0, 277, 257
+IDD_COPY_PROPERTIES DIALOGEX 0, 0, 277, 291
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
 CAPTION "Copy Properties"
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
     CONTROL         "HotKey1",IDC_HOTKEY,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,51,7,82,13
-    EDITTEXT        IDC_DATE,51,23,82,13,ES_AUTOHSCROLL | WS_DISABLED | NOT WS_TABSTOP
-    CONTROL         "&Never Auto Delete",IDC_NEVER_AUTO_DELETE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,25,105,10
-    COMBOBOX        IDC_COMBO1,73,74,197,128,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LISTBOX         IDC_COPY_DATA,7,188,263,43,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "Delete",IDC_DELETE_COPY_DATA,6,231,42,12
-    DEFPUSHBUTTON   "OK",IDOK,163,236,50,14
-    PUSHBUTTON      "Cancel",IDCANCEL,220,236,50,14
-    LTEXT           "Item Title",IDC_STATIC_TITLE,7,91,168,8
-    LTEXT           "Date Added",IDC_STATIC_DATE,8,23,43,13,SS_CENTERIMAGE
+    EDITTEXT        IDC_DATE,51,38,82,13,ES_AUTOHSCROLL | WS_DISABLED | NOT WS_TABSTOP
+    CONTROL         "&Never Auto Delete",IDC_NEVER_AUTO_DELETE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,40,105,10
+    COMBOBOX        IDC_COMBO1,73,91,197,128,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LISTBOX         IDC_COPY_DATA,7,205,263,43,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "Delete",IDC_DELETE_COPY_DATA,6,248,42,12
+    DEFPUSHBUTTON   "OK",IDOK,163,270,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,220,270,50,14
+    LTEXT           "Item Title",IDC_STATIC_TITLE,7,108,168,8
+    LTEXT           "Date Added",IDC_STATIC_DATE,8,38,43,13,SS_CENTERIMAGE
     LTEXT           "Hot Key",IDC_STATIC_HOT_KEY,7,7,35,13,SS_CENTERIMAGE
-    LTEXT           "Copy Formats",IDC_STATIC_FORMATS,7,177,226,8
-    LTEXT           "Move To Group",IDC_STATIC_MOVE_TO_GROUP,8,75,62,9
-    EDITTEXT        IDC_EDIT_QUICK_PASTE,73,55,197,13,ES_AUTOHSCROLL
-    LTEXT           "Quick Paste Text",IDC_STATIC_QUICK_PASTE,7,55,62,13,SS_CENTERIMAGE
+    LTEXT           "Copy Formats",IDC_STATIC_FORMATS,7,194,226,8
+    LTEXT           "Move To Group",IDC_STATIC_MOVE_TO_GROUP,8,92,62,9
+    EDITTEXT        IDC_EDIT_QUICK_PASTE,73,72,197,13,ES_AUTOHSCROLL
+    LTEXT           "Quick Paste Text",IDC_STATIC_QUICK_PASTE,7,72,62,13,SS_CENTERIMAGE
     CONTROL         "Hotkey available globally",IDC_HOT_KEY_GLOBAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,7,100,14
     CONTROL         "Win",IDC_CHECK_WIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,7,33,14
-    EDITTEXT        IDC_DATE_LAST_USED,51,38,82,13,ES_AUTOHSCROLL | WS_DISABLED | NOT WS_TABSTOP
-    LTEXT           "Last Used",IDC_STATIC_DATE2,8,38,43,13,SS_CENTERIMAGE
-    EDITTEXT        IDC_EDIT_PROPERTIES,7,102,263,74,ES_MULTILINE | ES_AUTOHSCROLL
+    EDITTEXT        IDC_DATE_LAST_USED,51,54,82,13,ES_AUTOHSCROLL | WS_DISABLED | NOT WS_TABSTOP
+    LTEXT           "Last Used",IDC_STATIC_DATE2,8,54,43,13,SS_CENTERIMAGE
+    EDITTEXT        IDC_EDIT_PROPERTIES,7,119,263,74,ES_MULTILINE | ES_AUTOHSCROLL
+    CONTROL         "",IDC_HOTKEY_MOVE_TO_GROUP,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,64,23,69,13
+    LTEXT           "Move To Group",IDC_STATIC_HOT_KEY_MOVE_TO_GROUP,7,23,51,13,SS_CENTERIMAGE
+    CONTROL         "Hotkey available globally",IDC_HOT_KEY_GLOBAL_MOVE_TO_GROUP,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,23,100,14
+    CONTROL         "Win",IDC_CHECK_WIN_MOVE_TO_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,23,33,14
 END
 
 IDD_ABOUT DIALOGEX 0, 0, 337, 206
@@ -957,7 +962,7 @@ BEGIN
         LEFTMARGIN, 7
         RIGHTMARGIN, 270
         TOPMARGIN, 7
-        BOTTOMMARGIN, 250
+        BOTTOMMARGIN, 284
     END
 
     IDD_ABOUT, DIALOG

+ 20 - 5
Clip.cpp

@@ -172,7 +172,9 @@ CClip::CClip() :
 	m_stickyClipOrder(INVALID_STICKY),
 	m_stickyClipGroupOrder(INVALID_STICKY),
 	m_clipGroupOrder(0),
-	m_globalShortCut(FALSE)
+	m_globalShortCut(FALSE),
+	m_moveToGroupShortCut(0),
+	m_globalMoveToGroupShortCut(FALSE)
 {
 }
 
@@ -193,6 +195,9 @@ void CClip::Clear()
 	m_bIsGroup = FALSE;
 	m_csQuickPaste = "";
 	m_param1 = 0;
+	m_globalShortCut = FALSE;
+	m_moveToGroupShortCut = 0;
+	m_globalMoveToGroupShortCut = 0;
 	
 	EmptyFormats();
 }
@@ -210,6 +215,8 @@ const CClip& CClip::operator=(const CClip &clip)
 	m_shortCut = clip.m_shortCut;
 	m_bIsGroup = clip.m_bIsGroup;
 	m_csQuickPaste = clip.m_csQuickPaste;
+	m_moveToGroupShortCut = clip.m_moveToGroupShortCut;
+	m_globalMoveToGroupShortCut = clip.m_globalMoveToGroupShortCut;
 
 	INT_PTR nCount = clip.m_Formats.GetSize();
 	
@@ -660,8 +667,8 @@ bool CClip::AddToMainTable()
 		m_csQuickPaste.Replace(_T("'"), _T("''"));
 
 		CString cs;
-		cs.Format(_T("INSERT into Main (lDate, mText, lShortCut, lDontAutoDelete, CRC, bIsGroup, lParentID, QuickPasteText, clipOrder, clipGroupOrder, globalShortCut, lastPasteDate, stickyClipOrder, stickyClipGroupOrder) ")
-						_T("values(%d, '%s', %d, %d, %d, %d, %d, '%s', %f, %f, %d, %d, %f, %f);"),
+		cs.Format(_T("INSERT into Main (lDate, mText, lShortCut, lDontAutoDelete, CRC, bIsGroup, lParentID, QuickPasteText, clipOrder, clipGroupOrder, globalShortCut, lastPasteDate, stickyClipOrder, stickyClipGroupOrder, MoveToGroupShortCut, GlobalMoveToGroupShortCut) ")
+						_T("values(%d, '%s', %d, %d, %d, %d, %d, '%s', %f, %f, %d, %d, %f, %f, %d, %d);"),
 							(int)m_Time.GetTime(),
 							m_Desc,
 							m_shortCut,
@@ -675,7 +682,9 @@ bool CClip::AddToMainTable()
 							m_globalShortCut,
 							(int)CTime::GetCurrentTime().GetTime(),
 							m_stickyClipOrder,
-							m_stickyClipGroupOrder);
+							m_stickyClipGroupOrder,
+							m_moveToGroupShortCut,
+							m_globalMoveToGroupShortCut);
 
 		theApp.m_db.execDML(cs);
 
@@ -708,7 +717,9 @@ bool CClip::ModifyMainTable()
 			_T("clipGroupOrder = %f, ")
 			_T("globalShortCut = %d, ")
 			_T("stickyClipOrder = %f, ")
-			_T("stickyClipGroupOrder = %f ")
+			_T("stickyClipGroupOrder = %f, ")
+			_T("MoveToGroupShortCut = %d, ")
+			_T("GlobalMoveToGroupShortCut = %d ")
 			_T("WHERE lID = %d;"), 
 			m_shortCut, 
 			m_Desc, 
@@ -720,6 +731,8 @@ bool CClip::ModifyMainTable()
 			m_globalShortCut,
 			m_stickyClipOrder,
 			m_stickyClipGroupOrder,
+			m_moveToGroupShortCut,
+			m_globalMoveToGroupShortCut,
 			m_id);
 
 		bRet = true;
@@ -1000,6 +1013,8 @@ BOOL CClip::LoadMainTable(int id)
 			m_lastPasteDate = q.getIntField(_T("lastPasteDate"));
 			m_stickyClipOrder = q.getFloatField(_T("stickyClipOrder"));
 			m_stickyClipGroupOrder = q.getFloatField(_T("stickyClipGroupOrder"));
+			m_moveToGroupShortCut = q.getIntField(_T("MoveToGroupShortCut"));
+			m_globalMoveToGroupShortCut = q.getIntField(_T("GlobalMoveToGroupShortCut"));
 
 			m_id = id;
 

+ 2 - 0
Clip.h

@@ -105,6 +105,8 @@ public:
 	double m_stickyClipGroupOrder;
 	BOOL m_globalShortCut;
 	CTime m_lastPasteDate;
+	int m_moveToGroupShortCut;
+	BOOL m_globalMoveToGroupShortCut;
 
 	virtual CString Description() { return m_Desc; }
 	virtual void Description(CString csValue) { m_Desc = csValue; }

+ 65 - 2
CopyProperties.cpp

@@ -49,6 +49,8 @@ void CCopyProperties::DoDataExchange(CDataExchange* pDX)
 	DDX_Text(pDX, IDC_DATE_LAST_USED, m_lastPasteDate);
 	DDX_Check(pDX, IDC_NEVER_AUTO_DELETE, m_bNeverAutoDelete);
 	DDX_Check(pDX, IDC_HOT_KEY_GLOBAL, m_hotKeyGlobal);
+	DDX_Control(pDX, IDC_HOTKEY_MOVE_TO_GROUP, m_MoveToGrouHotKey);
+	DDX_Check(pDX, IDC_HOT_KEY_GLOBAL_MOVE_TO_GROUP, m_moveToGroupHotKeyGlobal);
 	//}}AFX_DATA_MAP
 }
 
@@ -101,7 +103,7 @@ BOOL CCopyProperties::OnInitDialog()
 	{
 		m_description.SetFocus();
 	}
-
+	
 	m_Resize.SetParent(m_hWnd);
 	m_Resize.AddControl(IDC_EDIT_PROPERTIES, DR_SizeHeight | DR_SizeWidth);
 	m_Resize.AddControl(IDC_STATIC_FORMATS, DR_MoveTop);
@@ -147,6 +149,15 @@ void CCopyProperties::LoadDataFromCClip(CClip &Clip)
 		::CheckDlgButton(m_hWnd, IDC_CHECK_WIN, BST_CHECKED);
 	}
 
+	m_moveToGroupHotKeyGlobal = Clip.m_globalMoveToGroupShortCut;
+
+	m_MoveToGrouHotKey.SetHotKey(LOBYTE(Clip.m_moveToGroupShortCut), (HIBYTE(Clip.m_moveToGroupShortCut) & ~HOTKEYF_EXT));
+	m_MoveToGrouHotKey.SetRules(HKCOMB_A, 0);
+	if(HIBYTE(Clip.m_moveToGroupShortCut) & HOTKEYF_EXT)
+	{
+		::CheckDlgButton(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP, BST_CHECKED);
+	}
+
 	m_QuickPasteText.SetWindowText(Clip.m_csQuickPaste);
 
 	CString cs;
@@ -175,6 +186,14 @@ void CCopyProperties::LoadDataFromCClip(CClip &Clip)
 		m_lCopyData.SetCaretIndex(selectedRow);
 		m_lCopyData.SetAnchorIndex(selectedRow);
 	}
+
+	if(Clip.m_bIsGroup == FALSE)
+	{
+		::ShowWindow(::GetDlgItem(m_hWnd, IDC_STATIC_HOT_KEY_MOVE_TO_GROUP), SW_HIDE);
+		::ShowWindow(::GetDlgItem(m_hWnd, IDC_HOTKEY_MOVE_TO_GROUP), SW_HIDE);
+		::ShowWindow(::GetDlgItem(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP), SW_HIDE);
+		::ShowWindow(::GetDlgItem(m_hWnd, IDC_HOT_KEY_GLOBAL_MOVE_TO_GROUP), SW_HIDE);
+	}
 }
 
 void CCopyProperties::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
@@ -231,6 +250,14 @@ void CCopyProperties::OnOK()
 					}
 				}
 
+				if(CheckMoveToGroupGlobalHotKey(clip) == FALSE)
+				{
+					if(MessageBox(_T("Error registering global move to group hot key\n\nContinue?"), _T(""), MB_YESNO|MB_ICONWARNING) == IDNO)
+					{
+						return;
+					}
+				}
+
 				if(clip.ModifyMainTable())
 				{
 					if(m_bDeletedData)
@@ -258,7 +285,24 @@ BOOL CCopyProperties::CheckGlobalHotKey(CClip &clip)
 	}
 	else
 	{
-		g_HotKeys.Remove(clip.m_id);
+		g_HotKeys.Remove(clip.m_id, CHotKey::PASTE_OPEN_CLIP);
+		ret = TRUE;
+	}
+
+	return ret;
+}
+
+BOOL CCopyProperties::CheckMoveToGroupGlobalHotKey(CClip &clip)
+{
+	BOOL ret = FALSE;
+
+	if(clip.m_globalMoveToGroupShortCut)
+	{
+		ret = g_HotKeys.ValidateClip(clip.m_id, clip.m_moveToGroupShortCut, clip.m_Desc);
+	}
+	else
+	{
+		g_HotKeys.Remove(clip.m_id, CHotKey::MOVE_TO_GROUP);
 		ret = TRUE;
 	}
 
@@ -279,12 +323,29 @@ void CCopyProperties::LoadDataIntoCClip(CClip &Clip)
 
 	Clip.m_shortCut = MAKEWORD(sKeyKode, sModifers); 
 
+	long moveToGroupHotKey = m_MoveToGrouHotKey.GetHotKey();
+
+	short moveToGroupKeyKode = LOBYTE(m_MoveToGrouHotKey.GetHotKey());
+	short moveToGroupModifers = HIBYTE(m_MoveToGrouHotKey.GetHotKey());
+
+	if(moveToGroupKeyKode && ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP))
+	{
+		moveToGroupModifers |= HOTKEYF_EXT;
+	}
+
+	Clip.m_moveToGroupShortCut = MAKEWORD(moveToGroupKeyKode, moveToGroupModifers); 
+
 	//remove any others that have the same hot key
 	if(Clip.m_shortCut > 0)
 	{
 		theApp.m_db.execDMLEx(_T("UPDATE Main SET lShortCut = 0 where lShortCut = %d AND lID <> %d;"), Clip.m_shortCut, m_lCopyID);
 	}
 
+	if(Clip.m_moveToGroupShortCut > 0)
+	{
+		theApp.m_db.execDMLEx(_T("UPDATE Main SET MoveToGroupShortCut = 0 where MoveToGroupShortCut = %d AND lID <> %d;"), Clip.m_shortCut, m_lCopyID);
+	}
+
 	m_description.GetWindowText(Clip.m_Desc);
 	Clip.m_Desc.Replace(_T("'"), _T("''"));
 
@@ -312,6 +373,8 @@ void CCopyProperties::LoadDataIntoCClip(CClip &Clip)
 	}
 
 	Clip.m_globalShortCut = m_hotKeyGlobal;
+
+	Clip.m_globalMoveToGroupShortCut = m_moveToGroupHotKeyGlobal;
 }
 
 void CCopyProperties::OnDeleteCopyData() 

+ 3 - 0
CopyProperties.h

@@ -28,11 +28,13 @@ public:
 	CEdit m_description;
 	CGroupCombo	m_GroupCombo;
 	CHotKeyCtrl	m_HotKey;
+	CHotKeyCtrl	m_MoveToGrouHotKey;
 	CListBox	m_lCopyData;
 	CString	m_eDate;
 	CString m_lastPasteDate;
 	BOOL	m_bNeverAutoDelete;
 	BOOL m_hotKeyGlobal;
+	BOOL m_moveToGroupHotKeyGlobal;
 	//}}AFX_DATA
 
 
@@ -66,6 +68,7 @@ protected:
 	void LoadDataIntoCClip(CClip &Clip);
 	void LoadDataFromCClip(CClip &Clip);
 	BOOL CheckGlobalHotKey(CClip &clip);
+	BOOL CheckMoveToGroupGlobalHotKey(CClip &clip);
 
 	// Generated message map functions
 	//{{AFX_MSG(CCopyProperties)

+ 16 - 0
DatabaseUtilities.cpp

@@ -427,6 +427,22 @@ BOOL ValidDB(CString csPath, BOOL bUpgrade)
 
 			e.errorCode();
 		}
+
+		try
+		{
+			db.execQuery(_T("SELECT MoveToGroupShortCut FROM Main"));
+			db.execQuery(_T("SELECT GlobalMoveToGroupShortCut FROM Main"));			
+		}
+		catch(CppSQLite3Exception& e)
+		{
+			if(didBackup == FALSE)
+				didBackup = BackupDB(csPath, backupFilePrefix, &popUpMsg);
+
+			db.execDML(_T("ALTER TABLE Main ADD MoveToGroupShortCut INTEGER"));
+			db.execDML(_T("ALTER TABLE Main ADD GlobalMoveToGroupShortCut INTEGER"));			
+
+			e.errorCode();
+		}
 	}
 	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
 

+ 6 - 3
HotKeys.cpp

@@ -8,7 +8,7 @@ CHotKeys g_HotKeys;
 
 int CHotKey::m_nextId = 0;
 
-CHotKey::CHotKey(CString name, DWORD defKey, bool bUnregOnShowDitto) 
+CHotKey::CHotKey(CString name, DWORD defKey, bool bUnregOnShowDitto, HotKeyType hkType) 
 	: m_Name(name), 
 	m_bIsRegistered(false), 
 	m_bUnRegisterOnShowDitto(bUnregOnShowDitto),
@@ -19,6 +19,7 @@ CHotKey::CHotKey(CString name, DWORD defKey, bool bUnregOnShowDitto)
 	m_Key = (DWORD)g_Opt.GetProfileLong(m_Name, (long) defKey);
 	m_globalId = m_nextId;
 	m_nextId++;
+	m_hkType = hkType;
 	g_HotKeys.Add(this);
 }
 
@@ -285,12 +286,14 @@ bool CHotKeys::Remove(CHotKey* pHotKey)
 	return false;
 }
 
-bool CHotKeys::Remove(int clipId)
+bool CHotKeys::Remove(int clipId, CHotKey::HotKeyType hkType)
 {
 	INT_PTR count = GetSize();
 	for(int i=0; i < count; i++)
 	{
-		if(ElementAt(i) != NULL && ElementAt(i)->m_clipId == clipId)
+		if(ElementAt(i) != NULL && 
+			ElementAt(i)->m_clipId == clipId &&
+			ElementAt(i)->m_hkType == hkType)
 		{
 			CHotKey *pKey = ElementAt(i);
 

+ 9 - 2
HotKeys.h

@@ -5,6 +5,12 @@
 class CHotKey
 {
 public:
+	enum HotKeyType
+	{ 
+		PASTE_OPEN_CLIP,
+		MOVE_TO_GROUP
+	};
+
 	CString	m_Name;
 	ATOM	m_Atom;
 	DWORD	m_Key; //704 is ctrl-tilda
@@ -12,9 +18,10 @@ public:
 	bool	m_bUnRegisterOnShowDitto;
 	int		m_clipId;
 	int		m_globalId;
+	HotKeyType m_hkType;
 	static int m_nextId;
 	
-	CHotKey( CString name, DWORD defKey = 0, bool bUnregOnShowDitto = false );
+	CHotKey( CString name, DWORD defKey = 0, bool bUnregOnShowDitto = false, HotKeyType hkType = PASTE_OPEN_CLIP );
 	~CHotKey();
 
 	bool	IsRegistered() { return m_bIsRegistered; }
@@ -59,7 +66,7 @@ public:
 	INT_PTR Find( CHotKey* pHotKey );
 	bool Remove( CHotKey* pHotKey ); // pHotKey is NOT deleted.
 
-	bool Remove(int clipId);
+	bool Remove(int clipId, CHotKey::HotKeyType hkType);
 
 	BOOL ValidateClip(int clipId, DWORD key, CString desc);
 

+ 15 - 2
MainFrm.cpp

@@ -370,9 +370,22 @@ LRESULT CMainFrame::OnHotKey(WPARAM wParam, LPARAM lParam)
 				g_HotKeys[i]->m_Atom == wParam && 
 				g_HotKeys[i]->m_clipId > 0)
 			{
+				if(g_HotKeys[i]->m_hkType == CHotKey::PASTE_OPEN_CLIP)
+				{
+					Log(StrF(_T("Pasting clip from global shortcut, clipId: %d"), g_HotKeys[i]->m_clipId));
+					PasteOrShowGroup(g_HotKeys[i]->m_clipId, -1, FALSE, TRUE);
+				}
+				else if(g_HotKeys[i]->m_hkType == CHotKey::MOVE_TO_GROUP)
+				{
+					Log(StrF(_T("Global hot key to save clip to group Id: %d, Sending copy to save selection to this group"), g_HotKeys[i]->m_clipId));
 
-				Log(StrF(_T("Pasting clip from global shortcut, clipId: %d"), g_HotKeys[i]->m_clipId));
-				PasteOrShowGroup(g_HotKeys[i]->m_clipId, -1, FALSE, TRUE);
+					KillTimer(GROUP_DOUBLE_CLICK);
+					m_doubleClickGroupId = -1;
+					m_doubleClickGroupStartTime = 0;
+
+					theApp.SetActiveGroupId(g_HotKeys[i]->m_clipId);
+					theApp.m_activeWnd.SendCopy();
+				}
 
 				break;
 			}

+ 3 - 1
QPasteWnd.cpp

@@ -1842,7 +1842,9 @@ void CQPasteWnd::OnMenuQuickpropertiesRemovehotkey()
         try
         {
             theApp.m_db.execDMLEx(_T("UPDATE Main SET lShortCut = 0, globalShortCut = 0 where lID = %d;"), IDs[i]);
-			g_HotKeys.Remove(IDs[i]);
+			g_HotKeys.Remove(IDs[i], CHotKey::PASTE_OPEN_CLIP);
+			theApp.m_db.execDMLEx(_T("UPDATE Main SET MoveToGroupShortCut = 0, GlobalMoveToGroupShortCut = 0 where lID = %d;"), IDs[i]);
+			g_HotKeys.Remove(IDs[i], CHotKey::MOVE_TO_GROUP);
         }
         CATCH_SQLITE_EXCEPTION
     }

+ 5 - 0
Resource.h

@@ -148,6 +148,7 @@
 #define IDC_HOT_KEY_GLOBAL              1026
 #define IDC_COMPACT_REPAIR              1027
 #define IDC_NAMED_PASTE                 1027
+#define IDC_HOT_KEY_GLOBAL_MOVE_TO_GROUP 1027
 #define IDC_BT_COMPACT_AND_REPAIR       1028
 #define IDC_CHECK_UPDATES               1029
 #define IDC_CHECK_FOR_UPDATES           1030
@@ -189,6 +190,7 @@
 #define IDC_DISPLAY_IN_SYSTEMTRAY       2003
 #define IDD_OPTIONS_GENERAL             2003
 #define IDC_HOTKEY_TEXT_ONLY            2003
+#define IDC_HOTKEY_MOVE_TO_GROUP        2003
 #define IDD_OPTIONS_TYPES               2004
 #define IDC_START_ON_STARTUP            2004
 #define IDC_HOTKEY_SAVE_CLIPBOARD       2004
@@ -265,6 +267,8 @@
 #define IDC_STATIC_DATE2                2043
 #define IDC_CHECK_WIN3                  2044
 #define IDC_STATIC_AMOUNT               2044
+#define IDC_STATIC_HOT_KEY2             2044
+#define IDC_STATIC_HOT_KEY_MOVE_TO_GROUP 2044
 #define IDC_CHECK_WIN4                  2045
 #define IDC_STATIC_SOUND                2045
 #define IDC_CHECK_WIN5                  2046
@@ -341,6 +345,7 @@
 #define IDC_WIN_COPY_3                  2100
 #define IDC_EDIT_PROPERTIES             2100
 #define IDC_PASTE_3                     2101
+#define IDC_CHECK_WIN_MOVE_TO_GROUP     2101
 #define IDC_WIN_PASTE_3                 2102
 #define IDC_TIME_CREATE_START           2102
 #define IDC_STATIC_COPY_3               2103