Ver Fonte

- on paste update clipOrder or groupGroup independently
- added column lastPasteDate, used for expiring clips, updated on paste
- added lastPasteDate to the properties screen

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@586 595ec19a-5cb4-439b-94a8-42fb3063c22c

sabrogden há 14 anos atrás
pai
commit
adb77d964b
18 ficheiros alterados com 267 adições e 140 exclusões
  1. 22 20
      CP_Main.rc
  2. 14 9
      Clip.cpp
  3. 3 2
      Clip.h
  4. 2 2
      ClipIds.cpp
  5. 1 1
      Clip_ImportExport.cpp
  6. 1 1
      ClipboardViewer.cpp
  7. 6 0
      CopyProperties.cpp
  8. 1 0
      CopyProperties.h
  9. 16 2
      DatabaseUtilities.cpp
  10. 1 1
      DittoRulerRichEditCtrl.cpp
  11. 43 1
      GlobalClips.cpp
  12. 1 0
      GlobalClips.h
  13. 57 53
      HotKeys.cpp
  14. 5 7
      HotKeys.h
  15. 52 19
      ProcessPaste.cpp
  16. 8 1
      ProcessPaste.h
  17. 29 21
      QPasteWnd.cpp
  18. 5 0
      QPasteWnd.h

+ 22 - 20
CP_Main.rc

@@ -571,29 +571,31 @@ BEGIN
     LTEXT           "Main Types",IDC_STATIC_1,7,7,80,8
 END
 
-IDD_COPY_PROPERTIES DIALOGEX 0, 0, 275, 242
+IDD_COPY_PROPERTIES DIALOGEX 0, 0, 277, 257
 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         "",IDC_RICHEDIT1,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_FOCUSONBUTTONDOWN | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,87,261,75
-    CONTROL         "HotKey1",IDC_HOTKEY,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,44,7,82,13
-    EDITTEXT        IDC_DATE,44,23,82,13,ES_AUTOHSCROLL | WS_DISABLED | NOT WS_TABSTOP
-    CONTROL         "&Never Auto Delete",IDC_NEVER_AUTO_DELETE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,129,25,105,10
-    COMBOBOX        IDC_COMBO1,71,60,197,128,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LISTBOX         IDC_COPY_DATA,7,174,261,43,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "Delete",IDC_DELETE_COPY_DATA,6,217,42,12
-    DEFPUSHBUTTON   "OK",IDOK,148,221,50,14
-    PUSHBUTTON      "Cancel",IDCANCEL,218,221,50,14
-    LTEXT           "Item Title",IDC_STATIC_TITLE,7,77,168,8
-    LTEXT           "Date",IDC_STATIC_DATE,8,23,31,13,SS_CENTERIMAGE
+    CONTROL         "",IDC_RICHEDIT1,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_FOCUSONBUTTONDOWN | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,101,263,75
+    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
     LTEXT           "Hot Key",IDC_STATIC_HOT_KEY,7,7,35,13,SS_CENTERIMAGE
-    LTEXT           "Copy Formats",IDC_STATIC_FORMATS,7,163,226,8
-    LTEXT           "Move To Group",IDC_STATIC_MOVE_TO_GROUP,8,61,62,9
-    EDITTEXT        IDC_EDIT_QUICK_PASTE,71,41,197,13,ES_AUTOHSCROLL
-    LTEXT           "Quick Paste Text",IDC_STATIC,7,41,62,13,SS_CENTERIMAGE
-    CONTROL         "Hotkey available globally",IDC_HOT_KEY_GLOBAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,166,7,100,14
-    CONTROL         "Win",IDC_CHECK_WIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,129,7,33,14
+    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,7,55,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
 END
 
 IDD_ABOUT DIALOGEX 0, 0, 329, 153
@@ -846,9 +848,9 @@ BEGIN
     IDD_COPY_PROPERTIES, DIALOG
     BEGIN
         LEFTMARGIN, 7
-        RIGHTMARGIN, 268
+        RIGHTMARGIN, 270
         TOPMARGIN, 7
-        BOTTOMMARGIN, 235
+        BOTTOMMARGIN, 250
     END
 
     IDD_ABOUT, DIALOG

+ 14 - 9
Clip.cpp

@@ -199,6 +199,7 @@ const CClip& CClip::operator=(const CClip &clip)
 
 	m_id = clip.m_id;
 	m_Time = clip.m_Time;
+	m_lastPasteDate = clip.m_lastPasteDate;
 	m_CRC = clip.m_CRC;
 	m_parentId = clip.m_parentId;
 	m_dontAutoDelete = clip.m_dontAutoDelete;
@@ -512,9 +513,9 @@ bool CClip::AddToDB(bool bCheckForDuplicates)
 			int nID = FindDuplicate();
 			if(nID >= 0)
 			{
-				MakeLatestTime();
-				theApp.m_db.execDMLEx(_T("UPDATE Main SET clipOrder = %f where lID = %d;"), 
-										m_clipOrder, nID);
+				MakeLatestOrder();
+				theApp.m_db.execDMLEx(_T("UPDATE Main SET clipOrder = %f, lastPasteDate = %d where lID = %d;"), 
+										m_clipOrder, CTime::GetCurrentTime().GetTime(), nID);
 
 				m_id = nID;
 
@@ -609,7 +610,7 @@ bool CClip::AddToMainTable()
 		m_csQuickPaste.Replace(_T("'"), _T("''"));
 
 		CString cs;
-		cs.Format(_T("INSERT into Main values(NULL, %d, '%s', %d, %d, %d, %d, %d, '%s', %f, %f, %d);"),
+		cs.Format(_T("INSERT into Main values(NULL, %d, '%s', %d, %d, %d, %d, %d, '%s', %f, %f, %d, %d);"),
 							(long)m_Time.GetTime(),
 							m_Desc,
 							m_shortCut,
@@ -620,7 +621,8 @@ bool CClip::AddToMainTable()
 							m_csQuickPaste,
 							m_clipOrder,
 							m_clipGroupOrder,
-							m_globalShortCut);
+							m_globalShortCut,
+							CTime::GetCurrentTime().GetTime());
 
 		theApp.m_db.execDML(cs);
 
@@ -705,7 +707,7 @@ bool CClip::AddToDataTable()
 // changes m_Time to be later than the latest clip entry in the db
 // ensures that pClip's time is not older than the last clip added
 // old times can happen on fast copies (<1 sec).
-void CClip::MakeLatestTime()
+void CClip::MakeLatestOrder()
 {
 	m_clipOrder = GetNewOrder(-1);
 }
@@ -759,6 +761,7 @@ BOOL CClip::LoadMainTable(int id)
 			m_clipOrder = q.getFloatField(_T("clipOrder"));
 			m_clipGroupOrder = q.getFloatField(_T("clipGroupOrder"));
 			m_globalShortCut = q.getIntField(_T("globalShortCut"));
+			m_lastPasteDate = q.getIntField(_T("lastPasteDate"));
 
 			m_id = id;
 
@@ -931,7 +934,7 @@ CClipList::~CClipList()
 
 // returns the number of clips actually saved
 // while this does empty the Format Data, it does not delete the Clips.
-int CClipList::AddToDB(bool bLatestTime)
+int CClipList::AddToDB(bool bLatestOrder)
 {
 	Log(_T("AddToDB - Start"));
 
@@ -950,11 +953,13 @@ int CClipList::AddToDB(bool bLatestTime)
 		pClip = GetNext(pos);
 		ASSERT(pClip);
 		
-		if(bLatestTime)
+		if(bLatestOrder)
 		{
-			pClip->MakeLatestTime();
+			pClip->MakeLatestOrder();
 		}
 
+		pClip->m_Time = CTime::GetCurrentTime().GetTime();
+
 		bResult = pClip->AddToDB();
 		if(bResult)
 		{

+ 3 - 2
Clip.h

@@ -101,6 +101,7 @@ public:
 	double m_clipOrder;
 	double m_clipGroupOrder;
 	BOOL m_globalShortCut;
+	CTime m_lastPasteDate;
 
 	virtual CString Description() { return m_Desc; }
 	virtual void Description(CString csValue) { m_Desc = csValue; }
@@ -124,7 +125,7 @@ public:
 	bool AddToDB(bool bCheckForDuplicates = true);
 	bool ModifyMainTable();
 	bool SaveFromEditWnd(BOOL bUpdateDesc);
-	void MakeLatestTime();
+	void MakeLatestOrder();
 	BOOL LoadMainTable(int id);
 	DWORD GenerateCRC();
 
@@ -154,7 +155,7 @@ public:
 	~CClipList();
 	// returns the number of clips actually saved
 	// while this does empty the Format Data, it does not delete the Clips.
-	int AddToDB( bool bLatestTime = false);
+	int AddToDB( bool bLatestOrder = false);
 
 	const CClipList& operator=(const CClipList &cliplist);
 };

+ 2 - 2
ClipIds.cpp

@@ -182,7 +182,7 @@ BOOL CClipIDs::MoveTo(long lParentID, double dFirst, double dIncrement)
 {
 	try
 	{
-		INT_PTR count = GetSize();
+		int count = (int)GetSize();
 		for(int i = count-1; i >= 0; i--)
 		{
 			CString sql;
@@ -259,7 +259,7 @@ BOOL CClipIDs::CopyTo(int parentId)
 			{
 				if(clip.LoadFormats(nID))
 				{
-					clip.MakeLatestTime();
+					clip.MakeLatestOrder();
 
 					clip.m_shortCut = 0;
 					clip.m_parentId = parentId;

+ 1 - 1
Clip_ImportExport.cpp

@@ -94,7 +94,7 @@ bool CClip_ImportExport::ImportFromSqliteDB(CppSQLite3DB &db, bool bAddToDB, boo
 				{
 					if(bAddToDB)
 					{
-						MakeLatestTime();
+						MakeLatestOrder();
 						AddToDB(true);
 						bRet = true;
 					}

+ 1 - 1
ClipboardViewer.cpp

@@ -206,7 +206,7 @@ void CClipboardViewer::OnDrawClipboard()
 			if(!::IsClipboardFormatAvailable(theApp.m_cfIgnoreClipboard))
 			{
 				if(ValidActiveWnd())
-				{
+				{          
 					Log(StrF(_T("OnDrawClipboard:: *** SetTimer *** %d"), GetTickCount()));
 
 					KillTimer(TIMER_DRAW_CLIPBOARD);

+ 6 - 0
CopyProperties.cpp

@@ -30,6 +30,7 @@ CCopyProperties::CCopyProperties(long lCopyID, CWnd* pParent, CClip *pMemoryClip
 
 	//{{AFX_DATA_INIT(CCopyProperties)
 	m_eDate = _T("");
+	m_lastPasteDate = _T("");
 	m_bNeverAutoDelete = FALSE;
 	//}}AFX_DATA_INIT
 }
@@ -45,6 +46,7 @@ void CCopyProperties::DoDataExchange(CDataExchange* pDX)
 	DDX_Control(pDX, IDC_HOTKEY, m_HotKey);
 	DDX_Control(pDX, IDC_COPY_DATA, m_lCopyData);
 	DDX_Text(pDX, IDC_DATE, m_eDate);
+	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);
 	//}}AFX_DATA_MAP
@@ -119,6 +121,10 @@ void CCopyProperties::LoadDataFromCClip(CClip &Clip)
 {
 	COleDateTime dtTime(Clip.m_Time.GetTime());
 	m_eDate = dtTime.Format();
+	
+	COleDateTime lastPasteDate(Clip.m_lastPasteDate.GetTime());
+	m_lastPasteDate = lastPasteDate.Format();
+
 	m_RichEdit.SetText(Clip.m_Desc);
 
 	if(Clip.m_dontAutoDelete)

+ 1 - 0
CopyProperties.h

@@ -30,6 +30,7 @@ public:
 	CHotKeyCtrl	m_HotKey;
 	CListBox	m_lCopyData;
 	CString	m_eDate;
+	CString m_lastPasteDate;
 	BOOL	m_bNeverAutoDelete;
 	BOOL m_hotKeyGlobal;
 	//}}AFX_DATA

+ 16 - 2
DatabaseUtilities.cpp

@@ -339,6 +339,19 @@ BOOL ValidDB(CString csPath, BOOL bUpgrade)
 
 			e.errorCode();
 		}
+
+		try
+		{
+			db.execQuery(_T("SELECT lastPasteDate FROM Main"));
+		}
+		catch(CppSQLite3Exception& e)
+		{
+			db.execDML(_T("ALTER TABLE Main ADD lastPasteDate INTEGER"));
+			db.execDML(_T("Update Main set lastPasteDate = lDate"));
+			db.execDMLEx(_T("Update Main set lastPasteDate = %d where lastPasteDate <= 0"), CTime::GetCurrentTime().GetTime());
+
+			e.errorCode();
+		}
 	}
 	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
 
@@ -366,7 +379,8 @@ BOOL CreateDB(CString csFile)
 								_T("QuickPasteText TEXT, ")
 								_T("clipOrder REAL, ")
 								_T("clipGroupOrder REAL, ")
-								_T("globalShortCut INTEGER);"));
+								_T("globalShortCut INTEGER), ")
+								_T("lastPasteDate INTEGER;"));
 
 		db.execDML(_T("CREATE TABLE Data(")
 							_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
@@ -539,7 +553,7 @@ BOOL RemoveOldEntries()
 				CClipIDs IDs;
 				
 				CppSQLite3Query q = db.execQueryEx(_T("SELECT lID FROM Main ")
-													_T("WHERE lDate < %d AND ")
+													_T("WHERE lastPasteDate < %d AND ")
 													_T("bIsGroup = 0 AND lShortCut = 0 AND lParentID <= 0 AND lDontAutoDelete = 0"), now.GetTime());
 
 				while(q.eof() == false)

+ 1 - 1
DittoRulerRichEditCtrl.cpp

@@ -174,7 +174,7 @@ int CDittoRulerRichEditCtrl::SaveToDB(BOOL bUpdateDesc)
 		else
 		{
 			bSetModifyToFalse = false;
-			Clip.MakeLatestTime();
+			Clip.MakeLatestOrder();
 			CCopyProperties Prop(-1, this, &Clip);
 			Prop.SetHandleKillFocus(true);
 			Prop.SetToTopMost(false);

+ 43 - 1
GlobalClips.cpp

@@ -5,6 +5,7 @@
 #include "CP_Main.h"
 #include "GlobalClips.h"
 #include "afxdialogex.h"
+#include "CopyProperties.h"
 
 
 // GlobalClips dialog
@@ -32,6 +33,7 @@ BEGIN_MESSAGE_MAP(GlobalClips, CDialogEx)
 	ON_WM_CLOSE()
 	ON_WM_SIZE()
 	ON_BN_CLICKED(IDC_BUTTON_REFRESH, &GlobalClips::OnBnClickedButtonRefresh)
+	ON_NOTIFY(NM_DBLCLK, IDC_LIST2, &GlobalClips::OnNMDblclkList2)
 END_MESSAGE_MAP()
 
 BOOL GlobalClips::OnInitDialog()
@@ -56,7 +58,7 @@ void GlobalClips::LoadItems()
 	// Use the LV_ITEM structure to insert the items
 	LVITEM lvi;
 	CString strItem;
-	int count = g_HotKeys.GetCount();
+	int count = (int)g_HotKeys.GetCount();
 
 	int row = 0;
 	for (int i = 0; i < count; i++)
@@ -94,6 +96,8 @@ void GlobalClips::LoadItems()
 
 		m_List.SetItemText(row, 2, strItem);
 
+		m_List.SetItemData(row, pHotKey->m_globalId);
+
 		row++;
 	}
 }
@@ -136,3 +140,41 @@ void GlobalClips::OnBnClickedButtonRefresh()
 {
 	LoadItems();
 }
+
+
+void GlobalClips::OnNMDblclkList2(NMHDR *pNMHDR, LRESULT *pResult)
+{
+	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
+	// TODO: Add your control notification handler code here
+
+	int id = (int)m_List.GetItemData(pNMItemActivate->iItem);
+
+	int count = (int)g_HotKeys.GetCount();
+
+	int row = 0;
+	for (int i = 0; i < count; i++)
+	{
+		CHotKey *pHotKey = g_HotKeys[i];
+
+		if(pHotKey->m_globalId == id)
+		{
+			if(pHotKey->m_clipId > 0)
+			{
+				CCopyProperties props(pHotKey->m_clipId, this);
+				props.SetToTopMost(false);
+				INT_PTR doModalRet = props.DoModal();
+
+				if(doModalRet == IDOK)
+				{
+				}
+			}
+			else
+			{
+
+			}
+			break;
+		}
+	}
+	
+	*pResult = 0;
+}

+ 1 - 0
GlobalClips.h

@@ -33,4 +33,5 @@ public:
 	afx_msg void OnClose();
 	afx_msg void OnSize(UINT nType, int cx, int cy);
 	afx_msg void OnBnClickedButtonRefresh();
+	afx_msg void OnNMDblclkList2(NMHDR *pNMHDR, LRESULT *pResult);
 };

+ 57 - 53
HotKeys.cpp

@@ -27,6 +27,40 @@ CHotKey::~CHotKey()
 	Unregister();
 }
 
+CString CHotKey::GetHotKeyDisplay()
+{
+	return GetHotKeyDisplayStatic(m_Key);
+}
+
+CString CHotKey::GetHotKeyDisplayStatic(DWORD dwHotKey)
+{
+	CString keyDisplay;
+	UINT modifiers = GetModifier(HIBYTE(dwHotKey));
+	if(modifiers & MOD_SHIFT)
+	{
+		keyDisplay += _T("Shift + ");
+	}
+
+	if(modifiers & MOD_CONTROL)
+	{
+		keyDisplay += _T("Ctrl + ");
+	}
+
+	if(modifiers & MOD_ALT)
+	{
+		keyDisplay += _T("Alt + ");
+	}
+
+	if(modifiers & MOD_WIN)
+	{
+		keyDisplay += _T("Win + ");
+	}
+
+	keyDisplay += GetVirKeyName(LOBYTE(dwHotKey));
+
+	return keyDisplay;
+}
+
 //http://www.ffuts.org/blog/mapvirtualkey-getkeynametext-and-a-story-of-how-to/
 CString CHotKey::GetVirKeyName(unsigned int virtualKey)
 {
@@ -35,18 +69,18 @@ CString CHotKey::GetVirKeyName(unsigned int virtualKey)
 	// because MapVirtualKey strips the extended bit for some keys
 	switch (virtualKey)
 	{
-		case VK_LEFT: 
-		case VK_UP: 
-		case VK_RIGHT: 
-		case VK_DOWN: // arrow keys
-		case VK_PRIOR: 
-		case VK_NEXT: // page up and page down
-		case VK_END: 
-		case VK_HOME:
-		case VK_INSERT: 
-		case VK_DELETE:
-		case VK_DIVIDE: // numpad slash
-		case VK_NUMLOCK:
+	case VK_LEFT: 
+	case VK_UP: 
+	case VK_RIGHT: 
+	case VK_DOWN: // arrow keys
+	case VK_PRIOR: 
+	case VK_NEXT: // page up and page down
+	case VK_END: 
+	case VK_HOME:
+	case VK_INSERT: 
+	case VK_DELETE:
+	case VK_DIVIDE: // numpad slash
+	case VK_NUMLOCK:
 		{
 			scanCode |= 0x100; // set extended bit
 			break;
@@ -64,34 +98,20 @@ CString CHotKey::GetVirKeyName(unsigned int virtualKey)
 	}
 }
 
-CString CHotKey::GetHotKeyDisplay()
+UINT CHotKey::GetModifier(DWORD dwHotKey)
 {
-	CString keyDisplay;
-	UINT modifiers = GetModifier();
-	if(modifiers & MOD_SHIFT)
-	{
-		keyDisplay += _T("Shift + ");
-	}
-
-	if(modifiers & MOD_CONTROL)
-	{
-		keyDisplay += _T("Ctrl + ");
-	}
-
-	if(modifiers & MOD_ALT)
-	{
-		keyDisplay += _T("Alt + ");
-	}
+	UINT uMod = 0;
 
-	if(modifiers & MOD_WIN)
-	{
-		keyDisplay += _T("Win + ");
-	}
-	
-	int key = LOBYTE(m_Key);
-	keyDisplay += GetVirKeyName(key);
+	if(dwHotKey & HOTKEYF_SHIFT)   
+		uMod |= MOD_SHIFT;
+	if(dwHotKey & HOTKEYF_CONTROL) 
+		uMod |= MOD_CONTROL;
+	if(dwHotKey & HOTKEYF_ALT)     
+		uMod |= MOD_ALT;
+	if(dwHotKey & HOTKEYF_EXT)     
+		uMod |= MOD_WIN;
 
-	return keyDisplay;
+	return uMod;
 }
 
 void CHotKey::SetKey( DWORD key, bool bSave )
@@ -166,22 +186,6 @@ void CHotKey::CopyToCtrl(CHotKeyCtrl& ctrl, HWND hParent, int nWindowsCBID)
 	}
 }
 
-UINT CHotKey::GetModifier(DWORD dwHotKey)
-{
-	UINT uMod = 0;
-
-	if(dwHotKey & HOTKEYF_SHIFT)   
-		uMod |= MOD_SHIFT;
-	if(dwHotKey & HOTKEYF_CONTROL) 
-		uMod |= MOD_CONTROL;
-	if(dwHotKey & HOTKEYF_ALT)     
-		uMod |= MOD_ALT;
-	if(dwHotKey & HOTKEYF_EXT)     
-		uMod |= MOD_WIN;
-
-	return uMod;
-}
-
 bool CHotKey::Register()
 {
 	if(m_Key)

+ 5 - 7
HotKeys.h

@@ -21,7 +21,7 @@ public:
 	CString GetName()      { return m_Name; }
 	DWORD   GetKey()       { return m_Key; }
 	CString GetHotKeyDisplay();
-
+	
 	void SetKey( DWORD key, bool bSave = false );
 	// profile
 	void LoadKey();
@@ -30,17 +30,15 @@ public:
 	void CopyFromCtrl(CHotKeyCtrl& ctrl, HWND hParent, int nWindowsCBID);
 	void CopyToCtrl(CHotKeyCtrl& ctrl, HWND hParent, int nWindowsCBID);
 
-//	CString GetKeyAsText();
-//	void SetKeyFromText( CString text );
-
-	static BOOL ValidateHotKey(DWORD dwHotKey);
-	static UINT GetModifier(DWORD dwHotKey);
 	UINT GetModifier() { return GetModifier(HIBYTE(m_Key)); }
 
 	bool Register();
 	bool Unregister(bool bOnShowingDitto = false);
 
-	CString GetVirKeyName(unsigned int virtualKey);
+	static BOOL ValidateHotKey(DWORD dwHotKey);
+	static UINT GetModifier(DWORD dwHotKey);
+	static CString GetHotKeyDisplayStatic(DWORD dwHotKey);
+	static CString GetVirKeyName(unsigned int virtualKey);
 };
 
 

+ 52 - 19
ProcessPaste.cpp

@@ -15,6 +15,7 @@ CProcessPaste::CProcessPaste()
 	m_bSendPaste = true;
 	m_bActivateTarget = true;
 	m_bOnlyPaste_CF_TEXT = false;
+	m_pastedFromGroup = false;
 }
 
 CProcessPaste::~CProcessPaste()
@@ -92,12 +93,12 @@ void CProcessPaste::MarkAsPasted()
 		CGetSetOptions::SetTripPasteCount(-1);
 		CGetSetOptions::SetTotalPasteCount(-1);
 
-		if(!g_Opt.m_bUpdateTimeOnPaste)
-			return;
+		MarkAsPastedData* pData = new MarkAsPastedData();
+		pData->clipId = clips.ElementAt(0);
+		pData->pastedFromGroup = m_pastedFromGroup;
 
-		int id = clips.ElementAt(0);
 		//Moved to a thread because when running from from U3 devices the write is time consuming
-		AfxBeginThread(CProcessPaste::MarkAsPastedThread, (LPVOID)id, THREAD_PRIORITY_LOWEST);
+		AfxBeginThread(CProcessPaste::MarkAsPastedThread, (LPVOID)pData, THREAD_PRIORITY_LOWEST);
 	}
 
 	Log(_T("End of MarkAsPasted"));
@@ -117,30 +118,62 @@ UINT CProcessPaste::MarkAsPastedThread(LPVOID pParam)
 		Sleep(350);
 	}
 
-	int id = (int)pParam;
 	BOOL bRet = FALSE;
 
 	try
 	{
-		try
+		MarkAsPastedData* pData = (MarkAsPastedData*)pParam;
+		if(pData)
 		{
-			CppSQLite3Query q = theApp.m_db.execQuery(_T("SELECT clipOrder FROM Main ORDER BY clipOrder DESC LIMIT 1"));
-
-			if(q.eof() == false)
+			if(g_Opt.m_bUpdateTimeOnPaste)
 			{
-				double latestDate = q.getFloatField(_T("clipOrder"));
-				latestDate += 1;
-
-				Log(StrF(_T("Setting clipId: %d, order: %f"), id, latestDate));
-
-				theApp.m_db.execDMLEx(_T("UPDATE Main SET clipOrder = %f where lID = %d;"), latestDate, id);
+				try
+				{
+					if(pData->pastedFromGroup)
+					{
+						CppSQLite3Query q = theApp.m_db.execQuery(_T("SELECT clipGroupOrder FROM Main ORDER BY clipGroupOrder DESC LIMIT 1"));
+
+						if(q.eof() == false)
+						{
+							double latestDate = q.getFloatField(_T("clipGroupOrder"));
+							latestDate += 1;
+
+							Log(StrF(_T("Setting clipId: %d, GroupOrder: %f"), pData->clipId, latestDate));
+
+							theApp.m_db.execDMLEx(_T("UPDATE Main SET clipGroupOrder = %f where lID = %d;"), latestDate, pData->clipId);
+
+							theApp.RefreshClipOrder(pData->clipId);
+						}
+					}
+					else
+					{
+						CppSQLite3Query q = theApp.m_db.execQuery(_T("SELECT clipOrder FROM Main ORDER BY clipOrder DESC LIMIT 1"));
+
+						if(q.eof() == false)
+						{
+							double latestDate = q.getFloatField(_T("clipOrder"));
+							latestDate += 1;
+
+							Log(StrF(_T("Setting clipId: %d, order: %f"), pData->clipId, latestDate));
+
+							theApp.m_db.execDMLEx(_T("UPDATE Main SET clipOrder = %f where lID = %d;"), latestDate, pData->clipId);
+
+							theApp.RefreshClipOrder(pData->clipId);
+						}
+					}
+				}
+				CATCH_SQLITE_EXCEPTION
+			}
 
-				theApp.RefreshClipOrder(id);
+			try
+			{
+				theApp.m_db.execDMLEx(_T("UPDATE Main SET lastPasteDate = %d where lID = %d;"), CTime::GetCurrentTime().GetTime(), pData);
 			}
-		}
-		CATCH_SQLITE_EXCEPTION
+			CATCH_SQLITE_EXCEPTION
 
-		bRet = TRUE;
+			delete pData;
+			bRet = TRUE;
+		}
 	}
 	CATCH_SQLITE_EXCEPTION
 

+ 8 - 1
ProcessPaste.h

@@ -25,7 +25,14 @@ public:
 	bool m_bSendPaste;
 	bool m_bActivateTarget;
 	bool m_bOnlyPaste_CF_TEXT;
-
+	bool m_pastedFromGroup;
+
+	struct MarkAsPastedData 
+	{
+		int clipId;
+		bool pastedFromGroup;
+	};
+	
 	CProcessPaste();
 	~CProcessPaste();
 

+ 29 - 21
QPasteWnd.cpp

@@ -577,6 +577,7 @@ BOOL CQPasteWnd::OpenID(int id, bool bOnlyLoad_CF_TEXT, CClipFormats *pPasteForm
 
     paste.m_bSendPaste = g_Opt.m_bSendPasteMessageAfterSelection == TRUE ? true : false;
     paste.m_bOnlyPaste_CF_TEXT = bOnlyLoad_CF_TEXT;
+	paste.m_pastedFromGroup = (theApp.m_GroupID > 0);
 
     if(pPasteFormats != NULL)
     {
@@ -631,6 +632,7 @@ BOOL CQPasteWnd::OpenSelection(bool bOnlyLoad_CF_TEXT)
 
     paste.m_bSendPaste = g_Opt.m_bSendPasteMessageAfterSelection == TRUE ? true : false;
     paste.m_bOnlyPaste_CF_TEXT = bOnlyLoad_CF_TEXT;
+	paste.m_pastedFromGroup = (theApp.m_GroupID > 0);
 
     paste.GetClipIDs().Copy(IDs);
     paste.DoPaste();
@@ -736,10 +738,11 @@ LRESULT CQPasteWnd::OnReloadClipOrder(WPARAM wParam, LPARAM lParam)
 	BOOL foundClip = FALSE;
 	int clipId = (int)wParam;
 
-	CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT clipOrder FROM Main WHERE lID = %d"), clipId);			
+	CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT clipOrder, clipGroupOrder FROM Main WHERE lID = %d"), clipId);			
 	if(q.eof() == false)
 	{
 		double order = q.getFloatField(_T("clipOrder"));
+		double orderGroup = q.getFloatField(_T("clipGroupOrder"));
 
 		std::vector<CMainTable>::iterator iter = m_listItems.begin();
 		while(iter != m_listItems.end())
@@ -747,9 +750,19 @@ LRESULT CQPasteWnd::OnReloadClipOrder(WPARAM wParam, LPARAM lParam)
 			if(iter->m_lID == clipId)
 			{
 				iter->m_clipOrder = order;
+				iter->m_clipGroupOrder = orderGroup;
 
 				theApp.m_FocusID = clipId;
-				std::sort(m_listItems.begin(), m_listItems.end(), CMainTable::SortDesc);
+
+				if(theApp.m_GroupID > 0)
+				{
+					std::sort(m_listItems.begin(), m_listItems.end(), CMainTable::GroupSortDesc);
+				}
+				else
+				{
+					std::sort(m_listItems.begin(), m_listItems.end(), CMainTable::SortDesc);
+				}
+				
 				foundClip = TRUE;
 				
 				SelectFocusID();
@@ -2520,6 +2533,7 @@ void CQPasteWnd::OnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
 {
     NM_LISTVIEW *pLV = (NM_LISTVIEW*)pNMHDR;
     CProcessPaste paste;
+	paste.m_pastedFromGroup = (theApp.m_GroupID > 0);
     CClipIDs &clips = paste.GetClipIDs();
 
     m_lstHeader.GetSelectionItemData(clips);
@@ -2780,7 +2794,7 @@ void CQPasteWnd::OnGetToolTipText(NMHDR *pNMHDR, LRESULT *pResult)
         CString cs;
 
         int id = m_lstHeader.GetItemData(pInfo->lItem);
-        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, mText, lDate, lShortCut, lDontAutoDelete, QuickPasteText FROM Main WHERE lID = %d"), id);
+        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, mText, lDate, lShortCut, lDontAutoDelete, QuickPasteText, lastPasteDate, globalShortCut FROM Main WHERE lID = %d"), id);
         if(q.eof() == false)
         {
             cs = q.getStringField(1);
@@ -2791,12 +2805,14 @@ void CQPasteWnd::OnGetToolTipText(NMHDR *pNMHDR, LRESULT *pResult)
             #endif 
 
             COleDateTime time((time_t)q.getIntField(_T("lDate")));
-            cs += time.Format();
+            cs += "\nAdded: " + time.Format();
+
+			COleDateTime modified((time_t)q.getIntField(_T("lastPasteDate")));
+			cs += "\nLast Used: " + modified.Format();
 
             if(q.getIntField(_T("lDontAutoDelete")) > 0)
             {
-                cs += "\n";
-                cs += "Never Auto Delete";
+                cs += "\nNever Auto Delete";
             }
 
             CString csQuickPaste = q.getStringField(_T("QuickPasteText"));
@@ -2810,22 +2826,14 @@ void CQPasteWnd::OnGetToolTipText(NMHDR *pNMHDR, LRESULT *pResult)
             int shortCut = q.getIntField(_T("lShortCut"));
             if(shortCut > 0)
             {
-                cs += "\n";
-
-                if(HIBYTE(shortCut) &HOTKEYF_CONTROL)
-                {
-                    cs += "Ctrl + ";
-                }
-                if(HIBYTE(shortCut) &HOTKEYF_SHIFT)
-                {
-                    cs += "Shift + ";
-                }
-                if(HIBYTE(shortCut) &HOTKEYF_ALT)
-                {
-                    cs += "Alt + ";
-                }
+                cs += "\n\n";
+                cs += CHotKey::GetHotKeyDisplayStatic(shortCut);
 
-                cs += (char)LOBYTE(shortCut);
+				BOOL globalShortCut = q.getIntField(_T("globalShortCut"));
+				if(globalShortCut)
+				{
+					cs += " - Global Shortcut Key";
+				}
             }
         }
 

+ 5 - 0
QPasteWnd.h

@@ -46,6 +46,11 @@ public:
 	{
 		return d1.m_clipOrder > d2.m_clipOrder;
 	}
+
+	static bool GroupSortDesc(const CMainTable& d1, const CMainTable& d2)
+	{
+		return d1.m_clipGroupOrder > d2.m_clipGroupOrder;
+	}
 };