소스 검색

Added option to show what clips have been pasted

Scott Brogden 9 년 전
부모
커밋
2e8479cecf
18개의 변경된 파일799개의 추가작업 그리고 634개의 파일을 삭제
  1. 4 0
      ActionEnums.cpp
  2. 2 0
      ActionEnums.h
  3. 3 3
      CP_Main.cpp
  4. 1 1
      CP_Main.h
  5. 27 20
      CP_Main.rc
  6. 74 74
      DatabaseUtilities.cpp
  7. 1 1
      Misc.h
  8. 10 0
      Options.cpp
  9. 3 0
      Options.h
  10. 317 311
      OptionsQuickPaste.cpp
  11. 186 188
      ProcessPaste.cpp
  12. 44 18
      QListCtrl.cpp
  13. 3 0
      QListCtrl.h
  14. 100 14
      QPasteWnd.cpp
  15. 12 2
      QPasteWnd.h
  16. 6 2
      Resource.h
  17. 2 0
      Theme.cpp
  18. 4 0
      Theme.h

+ 4 - 0
ActionEnums.cpp

@@ -165,6 +165,10 @@ CString ActionEnums::EnumDescription(ActionEnumValues value)
 		return "Paste Position 9";
 	case PASTE_POSITION_10:
 		return "Paste Position 10";
+	case CONFIG_SHOW_FIRST_TEN_TEXT:
+		return "Option - Show text for first ten copy hot keys";
+	case CONFIG_SHOW_CLIP_WAS_PASTED:
+		return "Option - Show indicator a clip has been pasted";
 	}
 
 	return "";

+ 2 - 0
ActionEnums.h

@@ -82,6 +82,8 @@ public:
 		PASTE_POSITION_8,
 		PASTE_POSITION_9,
 		PASTE_POSITION_10,
+		CONFIG_SHOW_FIRST_TEN_TEXT,
+		CONFIG_SHOW_CLIP_WAS_PASTED,
 
 		LAST_ACTION
 	};

+ 3 - 3
CP_Main.cpp

@@ -596,18 +596,18 @@ void CCP_MainApp::RefreshView()
 	}
 }
 
-void CCP_MainApp::RefreshClipOrder(int clipId)
+void CCP_MainApp::RefreshClipAfterPaste(int clipId)
 {
 	CQPasteWnd *pWnd = QPasteWnd();
 	if(pWnd)
 	{
 		if(m_bAsynchronousRefreshView)
 		{
-			pWnd->PostMessage(WM_RELOAD_CLIP_ORDER, clipId, 0);
+			pWnd->PostMessage(WM_RELOAD_CLIP_AFTER_PASTE, clipId, 0);
 		}
 		else
 		{
-			pWnd->SendMessage(WM_RELOAD_CLIP_ORDER, clipId, 0);
+			pWnd->SendMessage(WM_RELOAD_CLIP_AFTER_PASTE, clipId, 0);
 		}
 	}
 }

+ 1 - 1
CP_Main.h

@@ -101,7 +101,7 @@ public:
 	CClipTypes* LoadTypesFromDB(); // returns a "new" allocated object
 	void ReloadTypes();
 	void RefreshView(); // refreshes the view if it is visible
-	void RefreshClipOrder(int clipId);
+	void RefreshClipAfterPaste(int clipId);
 	void OnCopyCompleted( long lLastID, int count = 1 );
 	void OnPasteCompleted();
 

+ 27 - 20
CP_Main.rc

@@ -404,6 +404,8 @@ BEGIN
             MENUITEM "Prompt to Delete Clip",       32852
             MENUITEM "Elevated privileges to paste into elevated apps", ID_QUICKOPTIONS_ELEVATEPREVILEGESTOPASTEINTOELEVATEDAPPS
             MENUITEM "Show In Taskbar",             ID_QUICKOPTIONS_SHOWINTASKBAR
+            MENUITEM "Show text for first ten copy hot keys", ID_QUICKOPTIONS_SHOWTEXTFORFIRSTTENCOPYHOTKEYS
+            MENUITEM "Show indicator a clip has been pasted", ID_QUICKOPTIONS_SHOWINDICATORACLIPHASBEENPASTED
         END
         MENUITEM SEPARATOR
         MENUITEM "Save Current Clipboard",      ID_MENU_SAVECURRENTCLIPBOARD
@@ -477,33 +479,31 @@ BEGIN
     PUSHBUTTON      "&Delete",IDC_DELETE,147,30,50,14
 END
 
-IDD_OPTIONS_QUICK_PASTE DIALOGEX 0, 0, 367, 276
+IDD_OPTIONS_QUICK_PASTE DIALOGEX 0, 0, 367, 280
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Quick Paste"
 FONT 8, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
-    CONTROL         "Use Ctrl - Num for first ten copy hot keys",IDC_CTRL_CLICK,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,8,335,10
     CONTROL         "Show text for first ten copy hot keys",IDC_SHOW_TEXT_FOR_FIRST_TEN_HOT_KEYS,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,19,335,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,9,335,10
     CONTROL         "Show leading whitespace",IDC_DESC_SHOW_LEADING_WHITESPACE,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,30,335,10
-    LTEXT           "Text Lines per Clip",IDC_STATIC_LINES,25,43,93,8
-    EDITTEXT        IDC_LINES_ROW,114,41,19,12,ES_AUTOHSCROLL
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,20,335,10
+    LTEXT           "Text Lines per Clip",IDC_STATIC_LINES,25,33,93,8
+    EDITTEXT        IDC_LINES_ROW,114,31,19,12,ES_AUTOHSCROLL
     CONTROL         "Enable Quick Paste Transparency",IDC_TRANSPARENCY,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,56,155,10
-    EDITTEXT        IDC_TRANS_PERC,177,55,19,12,ES_AUTOHSCROLL
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,46,155,10
+    EDITTEXT        IDC_TRANS_PERC,177,45,19,12,ES_AUTOHSCROLL
     CONTROL         "Show thumbnails (for CF_DIB types) (Could Increase Memory Usage and Display Speed)",IDC_SHOW_THUMBNAILS,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,68,335,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,58,335,10
     CONTROL         "Draw RTF Text in List (for RTF types) (Could Increase Memory Usage an Display Speed)",IDC_DRAW_RTF,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,78,335,10
-    CONTROL         "Find As You Type",IDC_CHECK_FIND_AS_YOU_TYPE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,88,335,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,68,335,10
+    CONTROL         "Find As You Type",IDC_CHECK_FIND_AS_YOU_TYPE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,78,335,10
     CONTROL         "Ensure Entire Window is Visible",IDC_CHECK_ENTIRE_WINDOW_IS_VISIBLE,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,98,335,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,88,335,10
     CONTROL         "Show Clips That are in Groups in Main List",IDC_CHECK_SHOW_ALL_IN_MAIN_LIST,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,108,335,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,98,335,10
     CONTROL         "Prompt when deleting clips",IDC_CHECK_PROMPT_DELETE_CLIP,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,118,335,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,108,335,10
     COMBOBOX        IDC_COMBO_THEME,59,180,130,95,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "About Theme",IDC_BUTTON_THEME,198,180,106,12
     PUSHBUTTON      "Font",IDC_BUTTON_FONT,18,198,143,17
@@ -511,17 +511,19 @@ BEGIN
     CONTROL         "At Caret",IDC_AT_CARET,"Button",BS_AUTORADIOBUTTON,22,233,93,10
     CONTROL         "At Cursor",IDC_AT_CURSOR,"Button",BS_AUTORADIOBUTTON,22,243,97,10
     CONTROL         "At Previous Position",IDC_AT_PREVIOUS,"Button",BS_AUTORADIOBUTTON,22,253,117,10
-    LTEXT           "%",IDC_STATIC,199,55,8,12,SS_CENTERIMAGE
+    LTEXT           "%",IDC_STATIC,199,45,8,12,SS_CENTERIMAGE
     GROUPBOX        "Popup Positioning",IDC_STATIC_POPUP,10,224,138,41
     LTEXT           "Theme",IDC_STATIC_THEME,18,180,36,12,SS_CENTERIMAGE
     CONTROL         "Always Show Scroll Bar",IDC_CHECK_SHOW_SCROLL_BAR,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,128,335,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,118,335,10
     CONTROL         "Elevated privileges to paste into elevated apps",IDC_CHECK_ELEVATE_PRIVILEGES,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,139,335,10
-    CONTROL         "Show In Taskbar",IDC_CHECK_SHOW_IN_TASKBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,150,335,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,129,335,10
+    CONTROL         "Show In Taskbar",IDC_CHECK_SHOW_IN_TASKBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,140,335,10
     EDITTEXT        IDC_EDIT_DIFF_PATH,109,162,218,14,ES_AUTOHSCROLL
     LTEXT           "Diff Application Path",IDC_STATIC_DIFF,25,164,80,8
     PUSHBUTTON      "...",IDC_BUTTON_DIFF_BROWSE,332,162,17,14
+    CONTROL         "Show indicator a clip has been pasted",IDC_CHECK_SHOW_CLIP_WAS_PASTED,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,151,335,10
 END
 
 IDD_OPTIONS_KEYSTROKES DIALOGEX 0, 0, 350, 219
@@ -1000,7 +1002,7 @@ BEGIN
         LEFTMARGIN, 7
         RIGHTMARGIN, 360
         TOPMARGIN, 7
-        BOTTOMMARGIN, 268
+        BOTTOMMARGIN, 272
     END
 
     IDD_OPTIONS_KEYSTROKES, DIALOG
@@ -1268,6 +1270,11 @@ BEGIN
     0
 END
 
+IDD_OPTIONS_QUICK_PASTE AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
 
 /////////////////////////////////////////////////////////////////////////////
 //

+ 74 - 74
DatabaseUtilities.cpp

@@ -221,64 +221,64 @@ BOOL OpenDatabase(CString csDB)
 	return FALSE;
 }
 
-void ReOrderStickyClips(int parentID, CppSQLite3DB &db)
-{
-	try
-	{
-		Log(StrF(_T("Start of ReOrderStickyClips, ParentId %d"), parentID));
-
-		//groups where created with 0 in these fields, fix them up if they are 0
-		if(parentID == -1)
-		{
-			db.execDMLEx(_T("Update Main Set stickyClipOrder = -(2147483647) where bIsGroup = 1 AND stickyClipOrder = 0"));
-			db.execDMLEx(_T("Update Main Set stickyClipGroupOrder = -(2147483647) where bIsGroup = 1 AND stickyClipGroupOrder = 0"));			
-		}
-
-		CppSQLite3Query qGroup = db.execQueryEx(_T("SELECT lID, mText FROM Main WHERE bIsGroup = 1 AND lParentID = %d"), parentID);
-
-		if (qGroup.eof() == false)
-		{
-			while (!qGroup.eof())
-			{
-				//Get all sticky clips at the top level or group
-				CString sql = StrF(_T("SELECT lID FROM Main WHERE stickyClipOrder <> -(2147483647) AND lParentID = %d ORDER BY stickyClipOrder DESC"), parentID);
-				if (parentID > -1)
-				{
-					sql = StrF(_T("SELECT lID FROM Main WHERE stickyClipGroupOrder <> -(2147483647) AND lParentID = %d ORDER BY stickyClipGroupOrder DESC"), parentID);
-				}
-
-				CppSQLite3Query qSticky = db.execQueryEx(sql);
-
-				int order = 1;
-
-				if (qSticky.eof() == false)
-				{
-					while (!qSticky.eof())
-					{
-						//set the new order
-						if (parentID > -1)
-						{
-							db.execDMLEx(_T("Update Main Set stickyClipGroupOrder = %d where lID = %d"), order, qSticky.getIntField(_T("lID")));
-						}
-						else
-						{
-							db.execDMLEx(_T("Update Main Set stickyClipOrder = %d where lID = %d"), order, qSticky.getIntField(_T("lID")));
-						}
-
-						qSticky.nextRow();
-						order--;
-					}
-				}				
-
-				ReOrderStickyClips(qGroup.getIntField(_T("lID")), db);
-
-				qGroup.nextRow();
-			}
-		}
-
-		Log(StrF(_T("End of ReOrderStickyClips, ParentId %d"), parentID));
-	}
-	CATCH_SQLITE_EXCEPTION
+void ReOrderStickyClips(int parentID, CppSQLite3DB &db)
+{
+	try
+	{
+		Log(StrF(_T("Start of ReOrderStickyClips, ParentId %d"), parentID));
+
+		//groups where created with 0 in these fields, fix them up if they are 0
+		if(parentID == -1)
+		{
+			db.execDMLEx(_T("Update Main Set stickyClipOrder = -(2147483647) where bIsGroup = 1 AND stickyClipOrder = 0"));
+			db.execDMLEx(_T("Update Main Set stickyClipGroupOrder = -(2147483647) where bIsGroup = 1 AND stickyClipGroupOrder = 0"));			
+		}
+
+		CppSQLite3Query qGroup = db.execQueryEx(_T("SELECT lID, mText FROM Main WHERE bIsGroup = 1 AND lParentID = %d"), parentID);
+
+		if (qGroup.eof() == false)
+		{
+			while (!qGroup.eof())
+			{
+				//Get all sticky clips at the top level or group
+				CString sql = StrF(_T("SELECT lID FROM Main WHERE stickyClipOrder <> -(2147483647) AND lParentID = %d ORDER BY stickyClipOrder DESC"), parentID);
+				if (parentID > -1)
+				{
+					sql = StrF(_T("SELECT lID FROM Main WHERE stickyClipGroupOrder <> -(2147483647) AND lParentID = %d ORDER BY stickyClipGroupOrder DESC"), parentID);
+				}
+
+				CppSQLite3Query qSticky = db.execQueryEx(sql);
+
+				int order = 1;
+
+				if (qSticky.eof() == false)
+				{
+					while (!qSticky.eof())
+					{
+						//set the new order
+						if (parentID > -1)
+						{
+							db.execDMLEx(_T("Update Main Set stickyClipGroupOrder = %d where lID = %d"), order, qSticky.getIntField(_T("lID")));
+						}
+						else
+						{
+							db.execDMLEx(_T("Update Main Set stickyClipOrder = %d where lID = %d"), order, qSticky.getIntField(_T("lID")));
+						}
+
+						qSticky.nextRow();
+						order--;
+					}
+				}				
+
+				ReOrderStickyClips(qGroup.getIntField(_T("lID")), db);
+
+				qGroup.nextRow();
+			}
+		}
+
+		Log(StrF(_T("End of ReOrderStickyClips, ParentId %d"), parentID));
+	}
+	CATCH_SQLITE_EXCEPTION
 }
 
 BOOL ValidDB(CString csPath, BOOL bUpgrade)
@@ -562,8 +562,8 @@ BOOL BackupDB(CString dbPath, CString prefix, CDittoPopupWindow **popUpMsg)
 	try
 	{
 		CFile file;
-		CFileException ex;
-		if(file.Open(dbPath, CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone, &ex))
+		CFileException ex;
+		if(file.Open(dbPath, CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone, &ex))
 		{
 			ULONGLONG fileSize = file.GetLength();
 			ULONGLONG totalReadSize = 0;
@@ -573,21 +573,21 @@ BOOL BackupDB(CString dbPath, CString prefix, CDittoPopupWindow **popUpMsg)
 			if(pBuffer != NULL)
 			{
 				CFile writeFile;
-				if(writeFile.Open(backup, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone, &ex))
+				if(writeFile.Open(backup, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone, &ex))
 				{
-					do
-					{
-						readBytes = file.Read(pBuffer, 65536);
-						writeFile.Write(pBuffer, readBytes);
-						totalReadSize+= readBytes;
-
-						int percent = ((totalReadSize * 100) / fileSize);
-						if(percent != percentageComplete)
-						{
-							percentageComplete = percent;
-							(*popUpMsg)->SetProgressBarPercent(percentageComplete);
-						}
-
+					do
+					{
+						readBytes = file.Read(pBuffer, 65536);
+						writeFile.Write(pBuffer, readBytes);
+						totalReadSize+= readBytes;
+
+						int percent = ((totalReadSize * 100) / fileSize);
+						if(percent != percentageComplete)
+						{
+							percentageComplete = percent;
+							(*popUpMsg)->SetProgressBarPercent(percentageComplete);
+						}
+
 					}while(readBytes >= 65536);
 
 					writeFile.Close();

+ 1 - 1
Misc.h

@@ -138,7 +138,7 @@ CString GetProcessName(HWND hWnd);
 #define WM_LOAD_ClIP_ON_CLIPBOARD		WM_USER	+ 214
 //defined in tray icon #define WM_CUSTOMIZE_TRAY_MENU	WM_USER + 215
 //defined in tray icon #define WM_TRAY_MENU_MOUSE_MOVE	WM_USER + 216
-#define WM_RELOAD_CLIP_ORDER	WM_USER	+ 217
+#define WM_RELOAD_CLIP_AFTER_PASTE	WM_USER	+ 217
 #define WM_GLOBAL_CLIPS_CLOSED	WM_USER	+ 218
 #define WM_OPTIONS_CLOSED	WM_USER	+ 219
 #define WM_SHOW_OPTIONS	WM_USER	+ 220

+ 10 - 0
Options.cpp

@@ -2372,4 +2372,14 @@ int CGetSetOptions::GetDragId()
 void CGetSetOptions::SetDragId(int id)
 {
 	SetProfileLong(_T("DragId"), id);
+}
+
+BOOL CGetSetOptions::GetShowIfClipWasPasted()
+{
+	return GetProfileLong(_T("ShowIfClipWasPasted"), TRUE);
+}
+
+void CGetSetOptions::SetShowIfClipWasPasted(BOOL val)
+{
+	SetProfileLong(_T("ShowIfClipWasPasted"), val);
 }

+ 3 - 0
Options.h

@@ -515,6 +515,9 @@ public:
 
 	static int GetDragId();
 	static void SetDragId(int id);
+
+	static BOOL GetShowIfClipWasPasted();
+	static void SetShowIfClipWasPasted(BOOL val);
 };
 
 // global for easy access and for initialization of fast access variables

+ 317 - 311
OptionsQuickPaste.cpp

@@ -1,323 +1,329 @@
-// OptionsQuickPaste.cpp : implementation file
-//
-
-#include "stdafx.h"
-#include "CP_Main.h"
-#include "OptionsQuickPaste.h"
-#include ".\optionsquickpaste.h"
-
-#ifdef _DEBUG
-#define new DEBUG_NEW
-#undef THIS_FILE
-static char THIS_FILE[] = __FILE__;
-#endif
-
-#define DEFAULT_THEME _T("(Default)")
-
-/////////////////////////////////////////////////////////////////////////////
-// COptionsQuickPaste property page
-
-IMPLEMENT_DYNCREATE(COptionsQuickPaste, CPropertyPage)
-
-COptionsQuickPaste::COptionsQuickPaste() : CPropertyPage(COptionsQuickPaste::IDD)
-{
-	m_csTitle = theApp.m_Language.GetString("QuickPasteTitle", "Quick Paste");
-	m_psp.pszTitle = m_csTitle;
-	m_psp.dwFlags |= PSP_USETITLE; 
-
-	//{{AFX_DATA_INIT(COptionsQuickPaste)
-		// NOTE: the ClassWizard will add member initialization here
-	//}}AFX_DATA_INIT
-
-	memset(&m_LogFont, 0, sizeof(LOGFONT));
-}
-
-COptionsQuickPaste::~COptionsQuickPaste()
-{
-	m_Font.DeleteObject();
-}
-
-void COptionsQuickPaste::DoDataExchange(CDataExchange* pDX)
-{
-	CPropertyPage::DoDataExchange(pDX);
-	//{{AFX_DATA_MAP(COptionsQuickPaste)
-	DDX_Control(pDX, IDC_CHECK_ENTIRE_WINDOW_IS_VISIBLE, m_EnsureEntireWindowVisible);
-	DDX_Control(pDX, IDC_CHECK_SHOW_ALL_IN_MAIN_LIST, m_ShowAllInMainList);
-	DDX_Control(pDX, IDC_CHECK_FIND_AS_YOU_TYPE, m_FindAsYouType);
-	DDX_Control(pDX, IDC_DRAW_RTF, m_btDrawRTF);
-	DDX_Control(pDX, IDC_SHOW_THUMBNAILS, m_btShowThumbnails);
-	DDX_Control(pDX, IDC_BUTTON_DEFAULT_FAULT, m_btDefaultButton);
-	DDX_Control(pDX, IDC_BUTTON_FONT, m_btFont);
-	DDX_Control(pDX, IDC_SHOW_TEXT_FOR_FIRST_TEN_HOT_KEYS, m_btShowText);
-	DDX_Control(pDX, IDC_LINES_ROW, m_eLinesPerRow);
-	DDX_Control(pDX, IDC_TRANS_PERC, m_eTransparencyPercent);
-	DDX_Control(pDX, IDC_TRANSPARENCY, m_btEnableTransparency);
-	DDX_Control(pDX, IDC_CTRL_CLICK, m_btUseCtrlNum);
-	DDX_Control(pDX, IDC_DESC_SHOW_LEADING_WHITESPACE, m_btDescShowLeadingWhiteSpace);
-	//}}AFX_DATA_MAP
-	DDX_Control(pDX, IDC_CHECK_PROMPT_DELETE_CLIP, m_PromptForDelete);
-	DDX_Control(pDX, IDC_COMBO_THEME, m_cbTheme);
+// OptionsQuickPaste.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "CP_Main.h"
+#include "OptionsQuickPaste.h"
+#include ".\optionsquickpaste.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+#define DEFAULT_THEME _T("(Default)")
+
+/////////////////////////////////////////////////////////////////////////////
+// COptionsQuickPaste property page
+
+IMPLEMENT_DYNCREATE(COptionsQuickPaste, CPropertyPage)
+
+COptionsQuickPaste::COptionsQuickPaste() : CPropertyPage(COptionsQuickPaste::IDD)
+{
+	m_csTitle = theApp.m_Language.GetString("QuickPasteTitle", "Quick Paste");
+	m_psp.pszTitle = m_csTitle;
+	m_psp.dwFlags |= PSP_USETITLE; 
+
+	//{{AFX_DATA_INIT(COptionsQuickPaste)
+		// NOTE: the ClassWizard will add member initialization here
+	//}}AFX_DATA_INIT
+
+	memset(&m_LogFont, 0, sizeof(LOGFONT));
+}
+
+COptionsQuickPaste::~COptionsQuickPaste()
+{
+	m_Font.DeleteObject();
+}
+
+void COptionsQuickPaste::DoDataExchange(CDataExchange* pDX)
+{
+	CPropertyPage::DoDataExchange(pDX);
+	//{{AFX_DATA_MAP(COptionsQuickPaste)
+	DDX_Control(pDX, IDC_CHECK_ENTIRE_WINDOW_IS_VISIBLE, m_EnsureEntireWindowVisible);
+	DDX_Control(pDX, IDC_CHECK_SHOW_ALL_IN_MAIN_LIST, m_ShowAllInMainList);
+	DDX_Control(pDX, IDC_CHECK_FIND_AS_YOU_TYPE, m_FindAsYouType);
+	DDX_Control(pDX, IDC_DRAW_RTF, m_btDrawRTF);
+	DDX_Control(pDX, IDC_SHOW_THUMBNAILS, m_btShowThumbnails);
+	DDX_Control(pDX, IDC_BUTTON_DEFAULT_FAULT, m_btDefaultButton);
+	DDX_Control(pDX, IDC_BUTTON_FONT, m_btFont);
+	DDX_Control(pDX, IDC_SHOW_TEXT_FOR_FIRST_TEN_HOT_KEYS, m_btShowText);
+	DDX_Control(pDX, IDC_LINES_ROW, m_eLinesPerRow);
+	DDX_Control(pDX, IDC_TRANS_PERC, m_eTransparencyPercent);
+	DDX_Control(pDX, IDC_TRANSPARENCY, m_btEnableTransparency);
+	DDX_Control(pDX, IDC_CTRL_CLICK, m_btUseCtrlNum);
+	DDX_Control(pDX, IDC_DESC_SHOW_LEADING_WHITESPACE, m_btDescShowLeadingWhiteSpace);
+	//}}AFX_DATA_MAP
+	DDX_Control(pDX, IDC_CHECK_PROMPT_DELETE_CLIP, m_PromptForDelete);
+	DDX_Control(pDX, IDC_COMBO_THEME, m_cbTheme);
 	DDX_Control(pDX, IDC_CHECK_SHOW_SCROLL_BAR, m_alwaysShowScrollBar);
 	DDX_Control(pDX, IDC_CHECK_ELEVATE_PRIVILEGES, m_elevatedPrivileges);
 	DDX_Control(pDX, IDC_CHECK_SHOW_IN_TASKBAR, m_showInTaskBar);
 	DDX_Control(pDX, IDC_EDIT_DIFF_PATH, m_diffPathEditBox);
-}
-
-
-BEGIN_MESSAGE_MAP(COptionsQuickPaste, CPropertyPage)
-	//{{AFX_MSG_MAP(COptionsQuickPaste)
-	ON_BN_CLICKED(IDC_BUTTON_FONT, OnButtonFont)
-	ON_BN_CLICKED(IDC_BUTTON_DEFAULT_FAULT, OnButtonDefaultFault)
-	//}}AFX_MSG_MAP
-	ON_BN_CLICKED(IDC_BUTTON_THEME, OnBnClickedButtonTheme)
+}
+
+
+BEGIN_MESSAGE_MAP(COptionsQuickPaste, CPropertyPage)
+	//{{AFX_MSG_MAP(COptionsQuickPaste)
+	ON_BN_CLICKED(IDC_BUTTON_FONT, OnButtonFont)
+	ON_BN_CLICKED(IDC_BUTTON_DEFAULT_FAULT, OnButtonDefaultFault)
+	//}}AFX_MSG_MAP
+	ON_BN_CLICKED(IDC_BUTTON_THEME, OnBnClickedButtonTheme)
 	ON_BN_CLICKED(IDC_BUTTON_DIFF_BROWSE, &COptionsQuickPaste::OnBnClickedButtonDiffBrowse)
-END_MESSAGE_MAP()
-
-/////////////////////////////////////////////////////////////////////////////
-// COptionsQuickPaste message handlers
-
-BOOL COptionsQuickPaste::OnInitDialog() 
-{
-	CPropertyPage::OnInitDialog();
-
-	m_pParent = (COptionsSheet *)GetParent();
-	
-	m_btEnableTransparency.SetCheck(CGetSetOptions::GetEnableTransparency());
-	m_eTransparencyPercent.SetNumber(CGetSetOptions::GetTransparencyPercent());
-	m_eLinesPerRow.SetNumber(CGetSetOptions::GetLinesPerRow());
-	m_alwaysShowScrollBar.SetCheck(CGetSetOptions::GetShowScrollBar());
-	m_btShowThumbnails.SetCheck(g_Opt.m_bDrawThumbnail);
-	m_btDrawRTF.SetCheck(g_Opt.m_bDrawRTF);
-
-	m_EnsureEntireWindowVisible.SetCheck(g_Opt.m_bEnsureEntireWindowCanBeSeen);
-	m_ShowAllInMainList.SetCheck(g_Opt.m_bShowAllClipsInMainList);
-	m_FindAsYouType.SetCheck(g_Opt.m_bFindAsYouType);
-
-	if(CGetSetOptions::GetQuickPastePosition() == POS_AT_CARET)
-		CheckDlgButton(IDC_AT_CARET, BST_CHECKED);
-	else if(CGetSetOptions::GetQuickPastePosition() == POS_AT_CURSOR)
-		CheckDlgButton(IDC_AT_CURSOR, BST_CHECKED);
-	else if(CGetSetOptions::GetQuickPastePosition() == POS_AT_PREVIOUS)
-		CheckDlgButton(IDC_AT_PREVIOUS, BST_CHECKED);
-
-	m_btDescShowLeadingWhiteSpace.SetCheck(g_Opt.m_bDescShowLeadingWhiteSpace);
-	m_btUseCtrlNum.SetCheck(CGetSetOptions::GetUseCtrlNumForFirstTenHotKeys());
-
-	m_btShowText.SetCheck(CGetSetOptions::GetShowTextForFirstTenHotKeys());
-	m_PromptForDelete.SetCheck(CGetSetOptions::GetPromptWhenDeletingClips());
-	m_elevatedPrivileges.SetCheck(CGetSetOptions::GetPasteAsAdmin());
-	m_showInTaskBar.SetCheck(CGetSetOptions::GetShowInTaskBar());
-
-	if(CGetSetOptions::GetFont(m_LogFont))
-	{		
-		m_Font.CreateFontIndirect(&m_LogFont);
-		m_btFont.SetFont(&m_Font);
-	}
-	else
-	{
-		CFont *ft =	m_btFont.GetFont();
-		ft->GetLogFont(&m_LogFont);
-	}
-
-	m_diffPathEditBox.SetWindowText(CGetSetOptions::GetDiffApp());
-
-	CString cs;
-	cs.Format(_T("Font - %s"), m_LogFont.lfFaceName);
-	m_btFont.SetWindowText(cs);
-
-	
-
-	FillThemes();
-
-	theApp.m_Language.UpdateOptionQuickPaste(this);
-		
-	return FALSE;
-}
-
-BOOL COptionsQuickPaste::OnApply() 
-{
-	CGetSetOptions::SetEnableTransparency(m_btEnableTransparency.GetCheck());
-	CGetSetOptions::SetTransparencyPercent(m_eTransparencyPercent.GetNumber());
-	CGetSetOptions::SetLinesPerRow(m_eLinesPerRow.GetNumber());
-	CGetSetOptions::SetShowScrollBar(m_alwaysShowScrollBar.GetCheck());
-	
-	if(IsDlgButtonChecked(IDC_AT_CARET))
-		CGetSetOptions::SetQuickPastePosition(POS_AT_CARET);
-	else if(IsDlgButtonChecked(IDC_AT_CURSOR))
-		CGetSetOptions::SetQuickPastePosition(POS_AT_CURSOR);
-	else if(IsDlgButtonChecked(IDC_AT_PREVIOUS))
-		CGetSetOptions::SetQuickPastePosition(POS_AT_PREVIOUS);
-
-	g_Opt.SetDescShowLeadingWhiteSpace(m_btDescShowLeadingWhiteSpace.GetCheck());
-	CGetSetOptions::SetUseCtrlNumForFirstTenHotKeys(m_btUseCtrlNum.GetCheck());
-	CGetSetOptions::SetShowTextForFirstTenHotKeys(m_btShowText.GetCheck());
-	CGetSetOptions::SetDrawThumbnail(m_btShowThumbnails.GetCheck());
-	CGetSetOptions::SetDrawRTF(m_btDrawRTF.GetCheck());
-	CGetSetOptions::SetEnsureEntireWindowCanBeSeen(m_EnsureEntireWindowVisible.GetCheck());
-	CGetSetOptions::SetShowAllClipsInMainList(m_ShowAllInMainList.GetCheck());
-	CGetSetOptions::SetFindAsYouType(m_FindAsYouType.GetCheck());
-	CGetSetOptions::SetPromptWhenDeletingClips(m_PromptForDelete.GetCheck());
-	CGetSetOptions::SetPasteAsAdmin(m_elevatedPrivileges.GetCheck());
-
-	BOOL prevValue = CGetSetOptions::GetShowInTaskBar();
-	CGetSetOptions::SetShowInTaskBar(m_showInTaskBar.GetCheck());
-	if(CGetSetOptions::GetShowInTaskBar() != prevValue)
-	{
-		theApp.RefreshShowInTaskBar();
-	}
-	
-	if(m_LogFont.lfWeight != 0)
-	{
-		CGetSetOptions::SetFont(m_LogFont);
-	}
-
-	CString csTheme;
-	if(m_cbTheme.GetCurSel() >= 0)
-	{
-		m_cbTheme.GetLBText(m_cbTheme.GetCurSel(), csTheme);
-		if(csTheme == DEFAULT_THEME)
-			g_Opt.SetTheme("");
-		else
-			g_Opt.SetTheme(csTheme);
-	}
-	else
-	{
-		g_Opt.SetTheme("");
-	}
-
-	CString diffPath;
-	m_diffPathEditBox.GetWindowText(diffPath);
-	g_Opt.SetDiffApp(diffPath);
-	
-	return CPropertyPage::OnApply();
-}
-
-void COptionsQuickPaste::OnButtonFont() 
-{
-	CFontDialog dlg(&m_LogFont, (CF_TTONLY | CF_SCREENFONTS));
-	if(dlg.DoModal() == IDOK)
-	{	
-		m_Font.DeleteObject();
-
-		memcpy(&m_LogFont, dlg.m_cf.lpLogFont, sizeof(LOGFONT));		
-
-		m_Font.CreateFontIndirect(&m_LogFont);
-
-		m_btFont.SetFont(&m_Font);
-
-		CString cs;
-		cs.Format(_T("Font - %s"), m_LogFont.lfFaceName);
-		m_btFont.SetWindowText(cs);
-	}
-}
-
-void COptionsQuickPaste::OnButtonDefaultFault() 
-{
-	CFont *ft =	m_btDefaultButton.GetFont();
-	ft->GetLogFont(&m_LogFont);
-
-	memset(&m_LogFont, 0, sizeof(m_LogFont));
-
-	m_LogFont.lfHeight = -11;
-	m_LogFont.lfWeight = 400;
-	m_LogFont.lfCharSet = 1;
-	STRCPY(m_LogFont.lfFaceName, _T("Arial Unicode MS"));
-
-	m_Font.DeleteObject();
-	m_Font.CreateFontIndirect(&m_LogFont);
-
-	m_btFont.SetFont(&m_Font);
-
-	CString cs;
-	cs.Format(_T("Font - %s"), m_LogFont.lfFaceName);
-	m_btFont.SetWindowText(cs);
-}	
-
-void COptionsQuickPaste::FillThemes()
-{
-	CString csFile = CGetSetOptions::GetPath(PATH_THEMES);
-	csFile += "*.xml";
-
-	CString csTheme = CGetSetOptions::GetTheme();
-
-	CFileFind find;
-	BOOL bCont = find.FindFile(csFile);
-	bool bSetCurSel = false;
-
-	while(bCont)
-	{
-		bCont = find.FindNextFile();
-		int nIndex = m_cbTheme.AddString(find.GetFileTitle());
-
-		if(find.GetFileTitle() == csTheme)
-		{
-			m_cbTheme.SetCurSel(nIndex);
-			bSetCurSel = true;
-		}
-	}
-
-	int nIndex = m_cbTheme.AddString(DEFAULT_THEME);
-	if(bSetCurSel == false)
-	{
-		m_cbTheme.SetCurSel(nIndex);
-	}
-
-}
-void COptionsQuickPaste::OnBnClickedButtonTheme()
-{
-	CTheme theme;
-
-	CString csTheme;
-	m_cbTheme.GetLBText(m_cbTheme.GetCurSel(), csTheme);
-
-	if(csTheme == DEFAULT_THEME)
-		return;
-	
-	if(theme.Load(csTheme, true, false))
-	{
-		CString csMessage;
-
-		csMessage.Format(_T("Theme -  %s\n")
-			_T("Version -   %d\n")
-			_T("Author -   %s\n")
-			_T("Notes -   %s"), csTheme, 
-			theme.FileVersion(), 
-			theme.Author(), 
-			theme.Notes());
-
-		MessageBox(csMessage, _T("Ditto"), MB_OK);
-	}
-	else
-	{
-		CString csError;
-		csError.Format(_T("Error loading theme file - %s - reason = "), csTheme, theme.LastError());
-
-		MessageBox(csError, _T("Ditto"), MB_OK);
-	}
-}
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// COptionsQuickPaste message handlers
+
+BOOL COptionsQuickPaste::OnInitDialog() 
+{
+	CPropertyPage::OnInitDialog();
+
+	m_pParent = (COptionsSheet *)GetParent();
+	
+	m_btEnableTransparency.SetCheck(CGetSetOptions::GetEnableTransparency());
+	m_eTransparencyPercent.SetNumber(CGetSetOptions::GetTransparencyPercent());
+	m_eLinesPerRow.SetNumber(CGetSetOptions::GetLinesPerRow());
+	m_alwaysShowScrollBar.SetCheck(CGetSetOptions::GetShowScrollBar());
+	m_btShowThumbnails.SetCheck(g_Opt.m_bDrawThumbnail);
+	m_btDrawRTF.SetCheck(g_Opt.m_bDrawRTF);
+
+	m_EnsureEntireWindowVisible.SetCheck(g_Opt.m_bEnsureEntireWindowCanBeSeen);
+	m_ShowAllInMainList.SetCheck(g_Opt.m_bShowAllClipsInMainList);
+	m_FindAsYouType.SetCheck(g_Opt.m_bFindAsYouType);
+
+	if(CGetSetOptions::GetQuickPastePosition() == POS_AT_CARET)
+		CheckDlgButton(IDC_AT_CARET, BST_CHECKED);
+	else if(CGetSetOptions::GetQuickPastePosition() == POS_AT_CURSOR)
+		CheckDlgButton(IDC_AT_CURSOR, BST_CHECKED);
+	else if(CGetSetOptions::GetQuickPastePosition() == POS_AT_PREVIOUS)
+		CheckDlgButton(IDC_AT_PREVIOUS, BST_CHECKED);
+
+	m_btDescShowLeadingWhiteSpace.SetCheck(g_Opt.m_bDescShowLeadingWhiteSpace);
+	m_btUseCtrlNum.SetCheck(CGetSetOptions::GetUseCtrlNumForFirstTenHotKeys());
+
+	m_btShowText.SetCheck(CGetSetOptions::GetShowTextForFirstTenHotKeys());
+	m_PromptForDelete.SetCheck(CGetSetOptions::GetPromptWhenDeletingClips());
+	m_elevatedPrivileges.SetCheck(CGetSetOptions::GetPasteAsAdmin());
+	m_showInTaskBar.SetCheck(CGetSetOptions::GetShowInTaskBar());
+
+	if(CGetSetOptions::GetFont(m_LogFont))
+	{		
+		m_Font.CreateFontIndirect(&m_LogFont);
+		m_btFont.SetFont(&m_Font);
+	}
+	else
+	{
+		CFont *ft =	m_btFont.GetFont();
+		ft->GetLogFont(&m_LogFont);
+	}
+
+	m_diffPathEditBox.SetWindowText(CGetSetOptions::GetDiffApp());
+
+	CString cs;
+	cs.Format(_T("Font - %s"), m_LogFont.lfFaceName);
+	m_btFont.SetWindowText(cs);
+
+	if (CGetSetOptions::GetShowIfClipWasPasted())
+		CheckDlgButton(IDC_CHECK_SHOW_CLIP_WAS_PASTED, BST_CHECKED);
+
+	FillThemes();
+
+	theApp.m_Language.UpdateOptionQuickPaste(this);
+		
+	return FALSE;
+}
+
+BOOL COptionsQuickPaste::OnApply() 
+{
+	CGetSetOptions::SetEnableTransparency(m_btEnableTransparency.GetCheck());
+	CGetSetOptions::SetTransparencyPercent(m_eTransparencyPercent.GetNumber());
+	CGetSetOptions::SetLinesPerRow(m_eLinesPerRow.GetNumber());
+	CGetSetOptions::SetShowScrollBar(m_alwaysShowScrollBar.GetCheck());
+	
+	if(IsDlgButtonChecked(IDC_AT_CARET))
+		CGetSetOptions::SetQuickPastePosition(POS_AT_CARET);
+	else if(IsDlgButtonChecked(IDC_AT_CURSOR))
+		CGetSetOptions::SetQuickPastePosition(POS_AT_CURSOR);
+	else if(IsDlgButtonChecked(IDC_AT_PREVIOUS))
+		CGetSetOptions::SetQuickPastePosition(POS_AT_PREVIOUS);
+
+	g_Opt.SetDescShowLeadingWhiteSpace(m_btDescShowLeadingWhiteSpace.GetCheck());
+	CGetSetOptions::SetUseCtrlNumForFirstTenHotKeys(m_btUseCtrlNum.GetCheck());
+	CGetSetOptions::SetShowTextForFirstTenHotKeys(m_btShowText.GetCheck());
+	CGetSetOptions::SetDrawThumbnail(m_btShowThumbnails.GetCheck());
+	CGetSetOptions::SetDrawRTF(m_btDrawRTF.GetCheck());
+	CGetSetOptions::SetEnsureEntireWindowCanBeSeen(m_EnsureEntireWindowVisible.GetCheck());
+	CGetSetOptions::SetShowAllClipsInMainList(m_ShowAllInMainList.GetCheck());
+	CGetSetOptions::SetFindAsYouType(m_FindAsYouType.GetCheck());
+	CGetSetOptions::SetPromptWhenDeletingClips(m_PromptForDelete.GetCheck());
+	CGetSetOptions::SetPasteAsAdmin(m_elevatedPrivileges.GetCheck());
+
+	BOOL prevValue = CGetSetOptions::GetShowInTaskBar();
+	CGetSetOptions::SetShowInTaskBar(m_showInTaskBar.GetCheck());
+	if(CGetSetOptions::GetShowInTaskBar() != prevValue)
+	{
+		theApp.RefreshShowInTaskBar();
+	}
+	
+	if(m_LogFont.lfWeight != 0)
+	{
+		CGetSetOptions::SetFont(m_LogFont);
+	}
+
+	CString csTheme;
+	if(m_cbTheme.GetCurSel() >= 0)
+	{
+		m_cbTheme.GetLBText(m_cbTheme.GetCurSel(), csTheme);
+		if(csTheme == DEFAULT_THEME)
+			g_Opt.SetTheme("");
+		else
+			g_Opt.SetTheme(csTheme);
+	}
+	else
+	{
+		g_Opt.SetTheme("");
+	}
+
+	CString diffPath;
+	m_diffPathEditBox.GetWindowText(diffPath);
+	g_Opt.SetDiffApp(diffPath);
+
+	if (IsDlgButtonChecked(IDC_CHECK_SHOW_CLIP_WAS_PASTED))
+		CGetSetOptions::SetShowIfClipWasPasted(TRUE);
+	else
+		CGetSetOptions::SetShowIfClipWasPasted(FALSE);
+	
+	return CPropertyPage::OnApply();
+}
+
+void COptionsQuickPaste::OnButtonFont() 
+{
+	CFontDialog dlg(&m_LogFont, (CF_TTONLY | CF_SCREENFONTS));
+	if(dlg.DoModal() == IDOK)
+	{	
+		m_Font.DeleteObject();
+
+		memcpy(&m_LogFont, dlg.m_cf.lpLogFont, sizeof(LOGFONT));		
+
+		m_Font.CreateFontIndirect(&m_LogFont);
+
+		m_btFont.SetFont(&m_Font);
+
+		CString cs;
+		cs.Format(_T("Font - %s"), m_LogFont.lfFaceName);
+		m_btFont.SetWindowText(cs);
+	}
+}
+
+void COptionsQuickPaste::OnButtonDefaultFault() 
+{
+	CFont *ft =	m_btDefaultButton.GetFont();
+	ft->GetLogFont(&m_LogFont);
+
+	memset(&m_LogFont, 0, sizeof(m_LogFont));
+
+	m_LogFont.lfHeight = -11;
+	m_LogFont.lfWeight = 400;
+	m_LogFont.lfCharSet = 1;
+	STRCPY(m_LogFont.lfFaceName, _T("Arial Unicode MS"));
+
+	m_Font.DeleteObject();
+	m_Font.CreateFontIndirect(&m_LogFont);
+
+	m_btFont.SetFont(&m_Font);
+
+	CString cs;
+	cs.Format(_T("Font - %s"), m_LogFont.lfFaceName);
+	m_btFont.SetWindowText(cs);
+}	
+
+void COptionsQuickPaste::FillThemes()
+{
+	CString csFile = CGetSetOptions::GetPath(PATH_THEMES);
+	csFile += "*.xml";
+
+	CString csTheme = CGetSetOptions::GetTheme();
+
+	CFileFind find;
+	BOOL bCont = find.FindFile(csFile);
+	bool bSetCurSel = false;
+
+	while(bCont)
+	{
+		bCont = find.FindNextFile();
+		int nIndex = m_cbTheme.AddString(find.GetFileTitle());
+
+		if(find.GetFileTitle() == csTheme)
+		{
+			m_cbTheme.SetCurSel(nIndex);
+			bSetCurSel = true;
+		}
+	}
+
+	int nIndex = m_cbTheme.AddString(DEFAULT_THEME);
+	if(bSetCurSel == false)
+	{
+		m_cbTheme.SetCurSel(nIndex);
+	}
+
+}
+void COptionsQuickPaste::OnBnClickedButtonTheme()
+{
+	CTheme theme;
+
+	CString csTheme;
+	m_cbTheme.GetLBText(m_cbTheme.GetCurSel(), csTheme);
+
+	if(csTheme == DEFAULT_THEME)
+		return;
+	
+	if(theme.Load(csTheme, true, false))
+	{
+		CString csMessage;
+
+		csMessage.Format(_T("Theme -  %s\n")
+			_T("Version -   %d\n")
+			_T("Author -   %s\n")
+			_T("Notes -   %s"), csTheme, 
+			theme.FileVersion(), 
+			theme.Author(), 
+			theme.Notes());
+
+		MessageBox(csMessage, _T("Ditto"), MB_OK);
+	}
+	else
+	{
+		CString csError;
+		csError.Format(_T("Error loading theme file - %s - reason = "), csTheme, theme.LastError());
+
+		MessageBox(csError, _T("Ditto"), MB_OK);
+	}
+}
 
 
 void COptionsQuickPaste::OnBnClickedButtonDiffBrowse()
 {
-	OPENFILENAME	FileName;
-	TCHAR			szFileName[400];
-	TCHAR			szDir[400];
-
-	memset(&FileName, 0, sizeof(FileName));
-	memset(szFileName, 0, sizeof(szFileName));
-	memset(&szDir, 0, sizeof(szDir));
-	FileName.lStructSize = sizeof(FileName);
-	FileName.lpstrTitle = _T("Diff Application");
-	FileName.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR;
-	FileName.nMaxFile = 400;
-	FileName.lpstrFile = szFileName;
-	FileName.lpstrInitialDir = szDir;
-	FileName.lpstrFilter = _T("*.exe");
-	FileName.lpstrDefExt = _T("");
-
-	if(GetOpenFileName(&FileName) == 0)
-		return;
-
+	OPENFILENAME	FileName;
+	TCHAR			szFileName[400];
+	TCHAR			szDir[400];
+
+	memset(&FileName, 0, sizeof(FileName));
+	memset(szFileName, 0, sizeof(szFileName));
+	memset(&szDir, 0, sizeof(szDir));
+	FileName.lStructSize = sizeof(FileName);
+	FileName.lpstrTitle = _T("Diff Application");
+	FileName.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR;
+	FileName.nMaxFile = 400;
+	FileName.lpstrFile = szFileName;
+	FileName.lpstrInitialDir = szDir;
+	FileName.lpstrFilter = _T("*.exe");
+	FileName.lpstrDefExt = _T("");
+
+	if(GetOpenFileName(&FileName) == 0)
+		return;
+
 	CString csPath(FileName.lpstrFile);
 
 	m_diffPathEditBox.SetWindowText(csPath);

+ 186 - 188
ProcessPaste.cpp

@@ -1,191 +1,189 @@
-#include "stdafx.h"
-#include "CP_Main.h"
-#include "ProcessPaste.h"
-#include "ClipIds.h"
-
-#ifdef _DEBUG
-#undef THIS_FILE
-static char THIS_FILE[]=__FILE__;
-#define new DEBUG_NEW
-#endif
-
-CProcessPaste::CProcessPaste()
-{
-	m_pOle = new COleClipSource;
-	m_bSendPaste = true;
-	m_bActivateTarget = true;
-	m_pastedFromGroup = false;
-}
-
-CProcessPaste::~CProcessPaste()
-{	
-	delete m_pOle;
-}
-
-BOOL CProcessPaste::DoPaste()
-{
-	m_pOle->m_pasteOptions = m_pasteOptions;
-
-	if(m_pOle->DoImmediateRender())
-	{
-		// MarkAsPasted() must be done first since it makes use of
-		//  m_pOle->m_ClipIDs and m_pOle is inaccessible after
-		//  SetClipboard is called.
-		MarkAsPasted();
-		
-		// Ignore the clipboard change that we will cause IF:
-		// 1) we are pasting a single element, since the element is already
-		//    in the db and its lDate was updated by MarkAsPas???ted().
-		// OR
-		// 2) we are pasting multiple, but g_Opt.m_bSaveMultiPaste is false
-		if(GetClipIDs().GetSize() == 1 || !g_Opt.m_bSaveMultiPaste)
-		{
-			m_pOle->CacheGlobalData(theApp.m_cfIgnoreClipboard, NewGlobalP("Ignore", sizeof("Ignore")));
-		}
-		else
-		{
-			m_pOle->CacheGlobalData(theApp.m_cfDelaySavingData, NewGlobalP("Delay", sizeof("Delay")));
-		}
-		
-		m_pOle->SetClipboard(); // m_pOle is now managed by the OLE clipboard
-
-		// The Clipboard now owns the allocated memory
-		// and will delete this data object
-		// when new data is put on the Clipboard
-		m_pOle = NULL; // m_pOle should not be accessed past this point
-
-		if(m_bSendPaste)
-		{
-			Log(_T("Sending Paste to active window"));
-			theApp.m_activeWnd.SendPaste(m_bActivateTarget);
-		}
-		else if(m_bActivateTarget)
-		{
-			Log(_T("Activating active window"));
-			theApp.m_activeWnd.ActivateTarget();
-		}
-		
-		return TRUE;
-	}
-	return FALSE;
-}
-
-BOOL CProcessPaste::DoDrag()
-{
-	m_pOle->DoDelayRender();
-	DROPEFFECT de = m_pOle->DoDragDrop(DROPEFFECT_COPY);
-	if(de != DROPEFFECT_NONE)
-	{
-		MarkAsPasted();
-		return TRUE;
-	}
-	return FALSE;
-}
-
-void CProcessPaste::MarkAsPasted()
-{
-	Log(_T("start of MarkAsPasted"));
-
-	CClipIDs& clips = GetClipIDs();
-	if(clips.GetSize() == 1)
-	{
-		CGetSetOptions::SetTripPasteCount(-1);
-		CGetSetOptions::SetTotalPasteCount(-1);
-
-		MarkAsPastedData* pData = new MarkAsPastedData();
-		pData->clipId = clips.ElementAt(0);
-		pData->pastedFromGroup = m_pastedFromGroup;
-
-		//Moved to a thread because when running from from U3 devices the write is time consuming
-		AfxBeginThread(CProcessPaste::MarkAsPastedThread, (LPVOID)pData, THREAD_PRIORITY_LOWEST);
-	}
-
-	Log(_T("End of MarkAsPasted"));
-}
-
-UINT CProcessPaste::MarkAsPastedThread(LPVOID pParam)
-{
-	DWORD startTick = GetTickCount();
-
-	static CEvent UpdateTimeEvent(TRUE, TRUE, _T("Ditto_Update_Clip_Time"), NULL);
-	UpdateTimeEvent.ResetEvent();
-
-	Log(_T("Start of MarkAsPastedThread"));
-
-	//If running from a U3 device then wait a little before updating the db
-	//updating the db can take a second or two and it delays the act of pasting
-	if(g_Opt.m_bU3)
-	{
-		Sleep(350);
-	}
-
-	BOOL bRet = FALSE;
-	int clipId = 0;
-
-	try
-	{
-		MarkAsPastedData* pData = (MarkAsPastedData*)pParam;
-		if(pData)
-		{
-			clipId = pData->clipId;
-			if(g_Opt.m_bUpdateTimeOnPaste)
-			{
-				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
-			}
-
-			try
-			{
-				theApp.m_db.execDMLEx(_T("UPDATE Main SET lastPasteDate = %d where lID = %d;"), (int)CTime::GetCurrentTime().GetTime(), pData->clipId);
-			}
-			CATCH_SQLITE_EXCEPTION
-
-			delete pData;
-			bRet = TRUE;
-		}
-	}
-	CATCH_SQLITE_EXCEPTION
-
-	Log(_T("End of MarkAsPastedThread"));
-
+#include "stdafx.h"
+#include "CP_Main.h"
+#include "ProcessPaste.h"
+#include "ClipIds.h"
+
+#ifdef _DEBUG
+#undef THIS_FILE
+static char THIS_FILE[]=__FILE__;
+#define new DEBUG_NEW
+#endif
+
+CProcessPaste::CProcessPaste()
+{
+	m_pOle = new COleClipSource;
+	m_bSendPaste = true;
+	m_bActivateTarget = true;
+	m_pastedFromGroup = false;
+}
+
+CProcessPaste::~CProcessPaste()
+{	
+	delete m_pOle;
+}
+
+BOOL CProcessPaste::DoPaste()
+{
+	m_pOle->m_pasteOptions = m_pasteOptions;
+
+	if(m_pOle->DoImmediateRender())
+	{
+		// MarkAsPasted() must be done first since it makes use of
+		//  m_pOle->m_ClipIDs and m_pOle is inaccessible after
+		//  SetClipboard is called.
+		MarkAsPasted();
+		
+		// Ignore the clipboard change that we will cause IF:
+		// 1) we are pasting a single element, since the element is already
+		//    in the db and its lDate was updated by MarkAsPas???ted().
+		// OR
+		// 2) we are pasting multiple, but g_Opt.m_bSaveMultiPaste is false
+		if(GetClipIDs().GetSize() == 1 || !g_Opt.m_bSaveMultiPaste)
+		{
+			m_pOle->CacheGlobalData(theApp.m_cfIgnoreClipboard, NewGlobalP("Ignore", sizeof("Ignore")));
+		}
+		else
+		{
+			m_pOle->CacheGlobalData(theApp.m_cfDelaySavingData, NewGlobalP("Delay", sizeof("Delay")));
+		}
+		
+		m_pOle->SetClipboard(); // m_pOle is now managed by the OLE clipboard
+
+		// The Clipboard now owns the allocated memory
+		// and will delete this data object
+		// when new data is put on the Clipboard
+		m_pOle = NULL; // m_pOle should not be accessed past this point
+
+		if(m_bSendPaste)
+		{
+			Log(_T("Sending Paste to active window"));
+			theApp.m_activeWnd.SendPaste(m_bActivateTarget);
+		}
+		else if(m_bActivateTarget)
+		{
+			Log(_T("Activating active window"));
+			theApp.m_activeWnd.ActivateTarget();
+		}
+		
+		return TRUE;
+	}
+	return FALSE;
+}
+
+BOOL CProcessPaste::DoDrag()
+{
+	m_pOle->DoDelayRender();
+	DROPEFFECT de = m_pOle->DoDragDrop(DROPEFFECT_COPY);
+	if(de != DROPEFFECT_NONE)
+	{
+		MarkAsPasted();
+		return TRUE;
+	}
+	return FALSE;
+}
+
+void CProcessPaste::MarkAsPasted()
+{
+	Log(_T("start of MarkAsPasted"));
+
+	CClipIDs& clips = GetClipIDs();
+	if(clips.GetSize() == 1)
+	{
+		CGetSetOptions::SetTripPasteCount(-1);
+		CGetSetOptions::SetTotalPasteCount(-1);
+
+		MarkAsPastedData* pData = new MarkAsPastedData();
+		pData->clipId = clips.ElementAt(0);
+		pData->pastedFromGroup = m_pastedFromGroup;
+
+		//Moved to a thread because when running from from U3 devices the write is time consuming
+		AfxBeginThread(CProcessPaste::MarkAsPastedThread, (LPVOID)pData, THREAD_PRIORITY_LOWEST);
+	}
+
+	Log(_T("End of MarkAsPasted"));
+}
+
+UINT CProcessPaste::MarkAsPastedThread(LPVOID pParam)
+{
+	DWORD startTick = GetTickCount();
+
+	static CEvent UpdateTimeEvent(TRUE, TRUE, _T("Ditto_Update_Clip_Time"), NULL);
+	UpdateTimeEvent.ResetEvent();
+
+	Log(_T("Start of MarkAsPastedThread"));
+
+	//If running from a U3 device then wait a little before updating the db
+	//updating the db can take a second or two and it delays the act of pasting
+	if(g_Opt.m_bU3)
+	{
+		Sleep(350);
+	}
+
+	BOOL bRet = FALSE;
+	int clipId = 0;
+
+	try
+	{
+		MarkAsPastedData* pData = (MarkAsPastedData*)pParam;
+		if(pData)
+		{
+			clipId = pData->clipId;
+			if(g_Opt.m_bUpdateTimeOnPaste)
+			{
+				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);
+						}
+					}
+					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);
+						}
+					}
+				}
+				CATCH_SQLITE_EXCEPTION
+			}
+
+			try
+			{
+				theApp.m_db.execDMLEx(_T("UPDATE Main SET lastPasteDate = %d where lID = %d;"), (int)CTime::GetCurrentTime().GetTime(), pData->clipId);
+			}
+			CATCH_SQLITE_EXCEPTION
+
+			theApp.RefreshClipAfterPaste(pData->clipId);
+
+			delete pData;
+			bRet = TRUE;
+		}
+	}
+	CATCH_SQLITE_EXCEPTION
+
+	Log(_T("End of MarkAsPastedThread"));
+
 	DWORD endTick = GetTickCount();
 	if((endTick-startTick) > 350)
-		Log(StrF(_T("Paste Timing MarkAsPastedThread: %d, ClipId: %d"), endTick-startTick, clipId));
-
-	UpdateTimeEvent.SetEvent();
-	return bRet;
+		Log(StrF(_T("Paste Timing MarkAsPastedThread: %d, ClipId: %d"), endTick-startTick, clipId));
+
+	UpdateTimeEvent.SetEvent();
+	return bRet;
 }

+ 44 - 18
QListCtrl.cpp

@@ -56,8 +56,7 @@ CQListCtrl::CQListCtrl()
 	lstrcpy(lf.lfFaceName, _T("Small Font"));
 	
 	m_SmallFont = ::CreateFontIndirect(&lf);
-	
-	m_bShowTextForFirstTenHotKeys = true;
+		
 	m_bStartTop = true;
 	m_pToolTip = NULL;
 	m_pFormatter = NULL;
@@ -71,6 +70,9 @@ CQListCtrl::CQListCtrl()
 	m_inFolderImage.LoadStdImageDPI(IDB_IN_FOLDER_16_16, IDB_IN_FOLDER_20_20, IDB_IN_FOLDER_24_24, IDB_IN_FOLDER_32_32, _T("PNG"));
 	m_shortCutImage.LoadStdImageDPI(IDB_KEY_16_16, IDB_KEY_20_20, IDB_KEY_24_24, IDB_KEY_32_32, _T("PNG"));
 	m_stickyImage.LoadStdImageDPI(IDB_STICKY_16_16, IDB_STICKY_20_20, IDB_STICKY_24_24, IDB_STICKY_32_32, _T("PNG"));
+
+	m_showIfClipWasPasted = TRUE;
+	m_bShowTextForFirstTenHotKeys = true;
 }
 
 CQListCtrl::~CQListCtrl()
@@ -86,6 +88,8 @@ CQListCtrl::~CQListCtrl()
 	
 	m_Font.DeleteObject();
 
+	m_boldFont.DeleteObject();
+
 	if(m_pFormatter)
 	{
 		delete m_pFormatter;
@@ -387,6 +391,19 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
         CRect rcText = rcItem;
         rcText.left += ROW_LEFT_BORDER;
 		rcText.top++;
+		
+		if (m_showIfClipWasPasted &&
+			strSymbols.GetLength() > 0 &&
+			strSymbols.Find(_T("<pasted>")) >= 0) //clip was pasted from ditto 
+		{
+			CRect pastedRect(rcItem);
+			pastedRect.left++;
+			pastedRect.right = rcItem.left + theApp.m_metrics.ScaleX(3);
+				
+			pDC->FillSolidRect(pastedRect, g_Opt.m_Theme.ClipPastedColor());
+
+			rcText.left += theApp.m_metrics.ScaleX(4);
+		}
 		        		
 		// set firstTenNum to the first ten number (1-10) corresponding to
 		//  the current nItem.
@@ -398,45 +415,47 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
 			rcText.left += theApp.m_metrics.ScaleX(12);
 		}
 		
+		bool drawInGroupIcon = true;
 		// if we are inside a group, don't display the "in group" flag
 		if( theApp.m_GroupID > 0 )
 		{
-			int nFlag = strSymbols.Find(_T("!"));
-			if( nFlag >= 0 )
-				strSymbols.Delete(nFlag);
+			int nFlag = strSymbols.Find(_T("<ingroup>"));
+			if (nFlag >= 0)
+				drawInGroupIcon = false;
 		}
 		
-		DrawBitMap(nItem, rcText, pDC, csText);
+		DrawBitMap(nItem, rcText, pDC, csText);			
 
 		// draw the symbol box
 		if( strSymbols.GetLength() > 0 )
 		{
-			if(strSymbols.Find('G') >= 0) //group 
+			if(strSymbols.Find(_T("<group>")) >= 0) //group 
 			{
 				m_groupFolder.Draw(pDC, this, rcText.left, rcText.top, false, false);
 				rcText.left += m_groupFolder.ImageWidth() + theApp.m_metrics.ScaleX(2);
 			}
-			if (strSymbols.Find('*') >= 0 &&
-				strSymbols.Find('G') < 0 &&
-				strSymbols.Find(_T("sticky")) < 0) //don't auto delete
+			if (strSymbols.Find(_T("<noautodelete>")) >= 0 &&
+				strSymbols.Find(_T("<group>")) < 0 &&
+				strSymbols.Find(_T("<sticky>")) < 0) //don't auto delete
 			{
 				m_dontDeleteImage.Draw(pDC, this, rcText.left, rcText.top, false, false);
 				rcText.left += m_dontDeleteImage.ImageWidth() + theApp.m_metrics.ScaleX(2);
 			}
-			if (strSymbols.Find('s') >= 0) // has shortcut
+			if (strSymbols.Find(_T("<shortcut>")) >= 0) // has shortcut
 			{
 				m_shortCutImage.Draw(pDC, this, rcText.left, rcText.top, false, false);
 				rcText.left += m_shortCutImage.ImageWidth() + theApp.m_metrics.ScaleX(2);
 			}
-			if (strSymbols.Find('!') >= 0) // in group
+			if (drawInGroupIcon &&
+				strSymbols.Find(_T("<ingroup>")) >= 0) // in group
 			{
 				m_inFolderImage.Draw(pDC, this, rcText.left, rcText.top, false, false);
 				rcText.left += m_inFolderImage.ImageWidth() + theApp.m_metrics.ScaleX(2);
 			}
-			if (strSymbols.Find('Q') >= 0) // has quick paste text
+			if (strSymbols.Find(_T("<qpastetext>")) >= 0) // has quick paste text
 			{
 			}
-			if (strSymbols.Find(_T("Sticky")) >= 0) //sticky clip
+			if (strSymbols.Find(_T("<sticky>")) >= 0) //sticky clip
 			{
 				m_stickyImage.Draw(pDC, this, rcText.left, rcText.top, false, false);
 				rcText.left += m_stickyImage.ImageWidth() + theApp.m_metrics.ScaleX(2);
@@ -474,17 +493,21 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
 			ScreenToClient(crClient);
 			
 			CRect crHotKey = rcItem;
+
+			int extraFromClipWasPaste = 0;
+			if (m_showIfClipWasPasted)
+				extraFromClipWasPaste = 3;
 			
 			crHotKey.right = crHotKey.left + theApp.m_metrics.ScaleX(11);
-			crHotKey.left += theApp.m_metrics.ScaleX(2);
-			crHotKey.top += theApp.m_metrics.ScaleX(2);
+			crHotKey.left += theApp.m_metrics.ScaleX(1 + extraFromClipWasPaste);
+			crHotKey.top += theApp.m_metrics.ScaleX(1 + extraFromClipWasPaste);
 			
 			HFONT hOldFont = (HFONT)pDC->SelectObject(m_SmallFont);
 			
 			pDC->DrawText(cs, crHotKey, DT_BOTTOM);
 			
-			pDC->MoveTo(CPoint(rcItem.left + theApp.m_metrics.ScaleX(11), rcItem.top));
-			pDC->LineTo(CPoint(rcItem.left + theApp.m_metrics.ScaleX(11), rcItem.bottom));
+			pDC->MoveTo(CPoint(rcItem.left + theApp.m_metrics.ScaleX(8 + extraFromClipWasPaste), rcItem.top));
+			pDC->LineTo(CPoint(rcItem.left + theApp.m_metrics.ScaleX(8 + extraFromClipWasPaste), rcItem.bottom));
 			
 			pDC->SelectObject(hOldFont);
 		}
@@ -1314,8 +1337,11 @@ void CQListCtrl::OnTimer(UINT_PTR nIDEvent)
 void CQListCtrl::SetLogFont(LOGFONT &font)
 {
 	m_Font.DeleteObject();
+	m_boldFont.DeleteObject();
 
 	m_Font.CreateFontIndirect(&font);
+	font.lfWeight = 600;
+	m_boldFont.CreateFontIndirect(&font);
 
 	SetFont(&m_Font);
 }

+ 3 - 0
QListCtrl.h

@@ -126,6 +126,7 @@ public:
 	void GetToolTipText(int nItem, CString &csText);
 
 	void SetShowTextForFirstTenHotKeys(BOOL bVal)	{ m_bShowTextForFirstTenHotKeys = bVal;	}
+	void SetShowIfClipWasPasted(BOOL val) { m_showIfClipWasPasted = val; }
 
 	void DestroyAndCreateAccelerator(BOOL bCreate, CppSQLite3DB &db);
 
@@ -165,6 +166,7 @@ protected:
 	CToolTipEx *m_pToolTip;
 	HWND m_toolTipHwnd;
 	CFont m_Font;
+	CFont m_boldFont;
 	IFormattedTextDraw *m_pFormatter;
 	bool m_allSelected;
 	int m_linesPerRow;
@@ -177,6 +179,7 @@ protected:
 	CGdiImageDrawer m_stickyImage;
 	int m_rowHeight;
 	CString m_searchText;
+	BOOL m_showIfClipWasPasted;
 
 
 	// Generated message map functions

+ 100 - 14
QPasteWnd.cpp

@@ -170,7 +170,7 @@ ON_MESSAGE(NM_DELETE, OnDelete)
 ON_NOTIFY(NM_GETTOOLTIPTEXT, ID_LIST_HEADER, OnGetToolTipText)
 ON_MESSAGE(NM_SELECT_DB_ID, OnListSelect_DB_ID)
 ON_MESSAGE(WM_REFRESH_VIEW, OnRefreshView)
-ON_MESSAGE(WM_RELOAD_CLIP_ORDER, OnReloadClipOrder)
+ON_MESSAGE(WM_RELOAD_CLIP_AFTER_PASTE, OnReloadClipAfterPaste)
 ON_WM_NCLBUTTONDBLCLK()
 ON_WM_WINDOWPOSCHANGING()
 ON_COMMAND(ID_VIEWCAPTIONBARON_RIGHT, OnViewcaptionbaronRight)
@@ -264,6 +264,10 @@ ON_NOTIFY(NM_CLICK, ID_LIST_HEADER, &CQPasteWnd::OnNMClickList1)
 ON_NOTIFY(NM_DBLCLK, ID_LIST_HEADER, &CQPasteWnd::OnNMDblclkList1)
 ON_NOTIFY(NM_RCLICK, ID_LIST_HEADER, &CQPasteWnd::OnNMRClickList1)
 ON_NOTIFY(NM_RDBLCLK, ID_LIST_HEADER, &CQPasteWnd::OnNMRDblclkList1)
+ON_COMMAND(ID_QUICKOPTIONS_SHOWTEXTFORFIRSTTENCOPYHOTKEYS, &CQPasteWnd::OnQuickoptionsShowtextforfirsttencopyhotkeys)
+ON_UPDATE_COMMAND_UI(ID_QUICKOPTIONS_SHOWTEXTFORFIRSTTENCOPYHOTKEYS, &CQPasteWnd::OnUpdateQuickoptionsShowtextforfirsttencopyhotkeys)
+ON_COMMAND(ID_QUICKOPTIONS_SHOWINDICATORACLIPHASBEENPASTED, &CQPasteWnd::OnQuickoptionsShowindicatoracliphasbeenpasted)
+ON_UPDATE_COMMAND_UI(ID_QUICKOPTIONS_SHOWINDICATORACLIPHASBEENPASTED, &CQPasteWnd::OnUpdateQuickoptionsShowindicatoracliphasbeenpasted)
 END_MESSAGE_MAP()
 
 
@@ -753,6 +757,7 @@ BOOL CQPasteWnd::ShowQPasteWindow(BOOL bFillList)
 
     m_lstHeader.SetNumberOfLinesPerRow(CGetSetOptions::GetLinesPerRow());
     m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
+	m_lstHeader.SetShowIfClipWasPasted(CGetSetOptions::GetShowIfClipWasPasted());
 
     if(bFillList)
     {
@@ -965,18 +970,19 @@ LRESULT CQPasteWnd::OnListEnd(WPARAM wParam, LPARAM lParam)
     return 0;
 }
 
-LRESULT CQPasteWnd::OnReloadClipOrder(WPARAM wParam, LPARAM lParam)
+LRESULT CQPasteWnd::OnReloadClipAfterPaste(WPARAM wParam, LPARAM lParam)
 {
 	DWORD startTick = GetTickCount();
 
 	BOOL foundClip = FALSE;
 	int clipId = (int)wParam;
 
-	CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT clipOrder, clipGroupOrder FROM Main WHERE lID = %d"), clipId);			
+	CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT clipOrder, clipGroupOrder, lastPasteDate FROM Main WHERE lID = %d"), clipId);			
 	if(q.eof() == false)
 	{
 		double order = q.getFloatField(_T("clipOrder"));
 		double orderGroup = q.getFloatField(_T("clipGroupOrder"));
+		int lastPasted = q.getIntField(_T("lastPasteDate"));
 
 		std::vector<CMainTable>::iterator iter = m_listItems.begin();
 		while(iter != m_listItems.end())
@@ -985,6 +991,7 @@ LRESULT CQPasteWnd::OnReloadClipOrder(WPARAM wParam, LPARAM lParam)
 			{
 				iter->m_clipOrder = order;
 				iter->m_clipGroupOrder = orderGroup;
+				iter->m_datePasted = lastPasted;
 
 				theApp.m_FocusID = clipId;
 
@@ -1013,7 +1020,7 @@ LRESULT CQPasteWnd::OnReloadClipOrder(WPARAM wParam, LPARAM lParam)
 
 	DWORD endTick = GetTickCount();
 	if((endTick-startTick) > 150)
-		Log(StrF(_T("Paste Timing OnReloadClipOrder: %d, ClipId: %d"), endTick-startTick, clipId));
+		Log(StrF(_T("Paste Timing OnReloadClipAfterPaste: %d, ClipId: %d"), endTick-startTick, clipId));
 
 	return foundClip;
 }
@@ -1297,7 +1304,8 @@ BOOL CQPasteWnd::FillList(CString csSQLSearch /*=""*/)
 	    m_CountSQL.Format(_T("SELECT COUNT(Main.lID) FROM Main %s where %s"), dataJoin, strFilter);
 
 	    m_SQL.Format(_T("SELECT Main.lID, Main.mText, Main.lParentID, Main.lDontAutoDelete, ")
-			_T("Main.lShortCut, Main.bIsGroup, Main.QuickPasteText, Main.clipOrder, Main.clipGroupOrder, Main.stickyClipOrder, Main.stickyClipGroupOrder FROM Main %s ")
+			_T("Main.lShortCut, Main.bIsGroup, Main.QuickPasteText, Main.clipOrder, Main.clipGroupOrder, ")
+				_T("Main.stickyClipOrder, Main.stickyClipGroupOrder, Main.lDate, Main.lastPasteDate FROM Main %s ")
 			_T("where %s order by %s"), dataJoin, strFilter, csSort);
 	}
 
@@ -1601,6 +1609,16 @@ void CQPasteWnd::SetMenuChecks(CMenu *pMenu)
 	{
 		pMenu->CheckMenuItem(ID_QUICKOPTIONS_SHOWINTASKBAR, MF_CHECKED);
 	}
+
+	if (CGetSetOptions::GetShowTextForFirstTenHotKeys())
+	{
+		pMenu->CheckMenuItem(ID_QUICKOPTIONS_SHOWTEXTFORFIRSTTENCOPYHOTKEYS, MF_CHECKED);
+	}
+
+	if (CGetSetOptions::GetShowIfClipWasPasted())
+	{
+		pMenu->CheckMenuItem(ID_QUICKOPTIONS_SHOWINDICATORACLIPHASBEENPASTED, MF_CHECKED);
+	}
 }
 
 void CQPasteWnd::SetSendToMenu(CMenu *pMenu, int nMenuID, int nArrayPos)
@@ -1790,7 +1808,6 @@ void CQPasteWnd::OnMenuFirsttenhotkeysUsectrlnum()
 void CQPasteWnd::OnMenuFirsttenhotkeysShowhotkeytext()
 {
     CGetSetOptions::SetShowTextForFirstTenHotKeys(!CGetSetOptions::GetShowTextForFirstTenHotKeys());
-
     m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
 
     m_lstHeader.RefreshVisibleRows();
@@ -2902,6 +2919,12 @@ bool CQPasteWnd::DoAction(DWORD actionId)
 	case ActionEnums::PASTE_POSITION_10:
 		ret = OpenIndex(9);
 		break;
+	case ActionEnums::CONFIG_SHOW_FIRST_TEN_TEXT:
+		ret = OnShowFirstTenText();
+		break;
+	case ActionEnums::CONFIG_SHOW_CLIP_WAS_PASTED:
+		ret = OnShowClipWasPasted();
+		break;
 	}
 
 	return ret;
@@ -4017,6 +4040,26 @@ bool CQPasteWnd::DoPasteTypoglycemia()
 	return false;
 }
 
+bool CQPasteWnd::OnShowFirstTenText()
+{
+	CGetSetOptions::SetShowTextForFirstTenHotKeys(!CGetSetOptions::GetShowTextForFirstTenHotKeys());
+	m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
+
+	m_lstHeader.RefreshVisibleRows();
+	m_lstHeader.RedrawWindow();
+	return true;
+}
+
+bool CQPasteWnd::OnShowClipWasPasted()
+{
+	CGetSetOptions::SetShowIfClipWasPasted(!CGetSetOptions::GetShowIfClipWasPasted());
+	m_lstHeader.SetShowIfClipWasPasted(CGetSetOptions::GetShowIfClipWasPasted());
+
+	m_lstHeader.RefreshVisibleRows();
+	m_lstHeader.RedrawWindow();
+	return true;
+}
+
 bool CQPasteWnd::DoExportToBitMapFile()
 {
 	bool ret = false;
@@ -4134,6 +4177,10 @@ LRESULT CQPasteWnd::OnPostOptions(WPARAM wParam, LPARAM lParam)
 	UpdateFont();
 	LoadShortcuts();
 
+	m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
+	m_lstHeader.SetShowIfClipWasPasted(CGetSetOptions::GetShowIfClipWasPasted());
+	m_lstHeader.SetNumberOfLinesPerRow(CGetSetOptions::GetLinesPerRow());
+
 	return 1;
 }
 
@@ -4210,45 +4257,50 @@ void CQPasteWnd::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
                         CString cs;
                         if(m_listItems[pItem->iItem].m_bDontAutoDelete)
                         {
-                            cs += "*";
+							cs += _T("<noautodelete>");
                         }
 
                         if(m_listItems[pItem->iItem].m_bHasShortCut)
                         {
-                            cs += "s";
+							cs += _T("<shortcut>");
                         }
 
                         if(m_listItems[pItem->iItem].m_bIsGroup)
                         {
-                            cs += "G";
+							cs += _T("<group>");
                         }
 
 						if (theApp.m_GroupID > 0)
 						{
 							if (m_listItems[pItem->iItem].m_stickyClipGroupOrder != INVALID_STICKY)
 							{
-								cs += "Sticky";
+								cs += _T("<sticky>");
 							}
 						}
 						else
 						{
 							if (m_listItems[pItem->iItem].m_stickyClipOrder != INVALID_STICKY)
 							{
-								cs += "Sticky";
+								cs += _T("<sticky>");
 							}
 						}
 
                         // attached to a group
                         if(m_listItems[pItem->iItem].m_bHasParent)
                         {
-                            cs += "!";
+							cs += _T("<ingroup>");
                         }
 
                         if(m_listItems[pItem->iItem].m_QuickPaste.IsEmpty() == FALSE)
                         {
-                            cs += "Q";
+							cs += _T("<qpastetext>");
                         }
 
+						if (m_listItems[pItem->iItem].m_dateCopied != m_listItems[pItem->iItem].m_datePasted)
+						{
+							cs += "<pasted>";
+						}
+
                         // pipe is the "end of symbols" marker
                         cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, m_listItems[pItem->iItem].m_Desc);
 
@@ -4987,6 +5039,8 @@ void CQPasteWnd::FillMainTable(CMainTable &table, CppSQLite3Query &q)
 	table.m_clipGroupOrder = q.getFloatField(_T("clipGroupOrder"));
 	table.m_stickyClipOrder = q.getFloatField(_T("stickyClipOrder"));
 	table.m_stickyClipGroupOrder = q.getFloatField(_T("stickyClipGroupOrder"));
+	table.m_dateCopied = q.getIntField(_T("lDate"));
+	table.m_datePasted = q.getIntField(_T("lastPasteDate"));
 }
 
 void CQPasteWnd::OnDestroy()
@@ -5673,4 +5727,36 @@ void CQPasteWnd::OnNMRDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
 	{
 	}*/
 	*pResult = 0;
-}
+}
+
+void CQPasteWnd::OnQuickoptionsShowtextforfirsttencopyhotkeys()
+{
+	DoAction(ActionEnums::CONFIG_SHOW_FIRST_TEN_TEXT);
+}
+
+
+void CQPasteWnd::OnUpdateQuickoptionsShowtextforfirsttencopyhotkeys(CCmdUI *pCmdUI)
+{
+	if (!pCmdUI->m_pMenu)
+	{
+		return;
+	}
+
+	UpdateMenuShortCut(pCmdUI, ActionEnums::CONFIG_SHOW_FIRST_TEN_TEXT);
+}
+
+
+void CQPasteWnd::OnQuickoptionsShowindicatoracliphasbeenpasted()
+{
+	DoAction(ActionEnums::CONFIG_SHOW_CLIP_WAS_PASTED);
+}
+
+void CQPasteWnd::OnUpdateQuickoptionsShowindicatoracliphasbeenpasted(CCmdUI *pCmdUI)
+{
+	if (!pCmdUI->m_pMenu)
+	{
+		return;
+	}
+
+	UpdateMenuShortCut(pCmdUI, ActionEnums::CONFIG_SHOW_CLIP_WAS_PASTED);
+}

+ 12 - 2
QPasteWnd.h

@@ -26,7 +26,9 @@ public:
 		m_bDontAutoDelete(false), 
 		m_bIsGroup(false), 
 		m_bHasShortCut(false), 
-		m_bHasParent(false)
+		m_bHasParent(false),
+		m_dateCopied(0),
+		m_datePasted(0)
 	{
 
 	}
@@ -47,6 +49,8 @@ public:
 	double m_clipGroupOrder;
 	double m_stickyClipOrder;
 	double m_stickyClipGroupOrder;
+	int m_dateCopied;
+	int m_datePasted;
 
 	static bool SortDesc(const CMainTable& d1, const CMainTable& d2)
 	{
@@ -253,6 +257,8 @@ public:
 	bool DoPastePlusAddLineFeed();
 	bool DoPasteAddTwoLineFeeds();
 	bool DoPasteTypoglycemia();
+	bool OnShowFirstTenText();
+	bool OnShowClipWasPasted();
 
 	void UpdateMenuShortCut(CCmdUI *pCmdUI, DWORD action);
 
@@ -359,7 +365,7 @@ protected:
     afx_msg LRESULT OnListSelect_DB_ID(WPARAM wParam, LPARAM lParam);
 	afx_msg LRESULT OnListMoveSelectionToGroup(WPARAM wParam, LPARAM lParam);
     afx_msg LRESULT OnRefreshView(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnReloadClipOrder(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnReloadClipAfterPaste(WPARAM wParam, LPARAM lParam);
     afx_msg LRESULT OnGroupTreeMessage(WPARAM wParam, LPARAM lParam);
     afx_msg LRESULT OnFillRestOfList(WPARAM wParam, LPARAM lParam);
     afx_msg LRESULT OnRefeshRow(WPARAM wParam, LPARAM lParam);
@@ -452,4 +458,8 @@ public:
 	afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);
 	afx_msg void OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult);
 	afx_msg void OnNMRDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);
+	afx_msg void OnQuickoptionsShowtextforfirsttencopyhotkeys();
+	afx_msg void OnUpdateQuickoptionsShowtextforfirsttencopyhotkeys(CCmdUI *pCmdUI);
+	afx_msg void OnQuickoptionsShowindicatoracliphasbeenpasted();
+	afx_msg void OnUpdateQuickoptionsShowindicatoracliphasbeenpasted(CCmdUI *pCmdUI);
 };

+ 6 - 2
Resource.h

@@ -275,6 +275,8 @@
 #define IDC_CHECK_WIN2                  2043
 #define IDC_STATIC_DAYS                 2043
 #define IDC_STATIC_DATE2                2043
+#define IDC_CHECK_SHOW_IN_TASKBAR2      2043
+#define IDC_CHECK_SHOW_CLIP_WAS_PASTED  2043
 #define IDC_CHECK_WIN3                  2044
 #define IDC_STATIC_AMOUNT               2044
 #define IDC_STATIC_HOT_KEY2             2044
@@ -566,14 +568,16 @@
 #define ID_Menu                         32920
 #define ID_Menu32921                    32921
 #define ID_SPECIALPASTE_TYPOGLYCEMIA    32922
+#define ID_QUICKOPTIONS_SHOWTEXTFORFIRSTTENCOPYHOTKEYS 32923
+#define ID_QUICKOPTIONS_SHOWINDICATORACLIPHASBEENPASTED 32924
 
 // Next default values for new objects
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
-#define _APS_NEXT_RESOURCE_VALUE        251
-#define _APS_NEXT_COMMAND_VALUE         32923
+#define _APS_NEXT_RESOURCE_VALUE        257
+#define _APS_NEXT_COMMAND_VALUE         32925
 #define _APS_NEXT_CONTROL_VALUE         2145
 #define _APS_NEXT_SYMED_VALUE           101
 #endif

+ 2 - 0
Theme.cpp

@@ -26,6 +26,7 @@ CTheme::CTheme(void)
 	m_ListBoxSelectedNoFocusBG = RGB(236, 233, 216);
 	m_ListBoxSelectedText = RGB(255, 255, 255);
 	m_ListBoxSelectedNoFocusText = RGB(0, 0, 0);
+	m_clipPastedColor = RGB(0, 255, 0);
 }
 
 CTheme::~CTheme(void)
@@ -101,6 +102,7 @@ bool CTheme::Load(CString csTheme, bool bHeaderOnly, bool bCheckLastWriteTime)
 	LoadElement(ItemHeader, "ListBoxSelectedNoFocusBG", m_ListBoxSelectedNoFocusBG);
 	LoadElement(ItemHeader, "ListBoxSelectedText", m_ListBoxSelectedText);
 	LoadElement(ItemHeader, "ListBoxSelectedNoFocusText", m_ListBoxSelectedNoFocusText);
+	LoadElement(ItemHeader, "ClipPastedColor", m_clipPastedColor);
 
 	return true;
 }

+ 4 - 0
Theme.h

@@ -27,6 +27,8 @@ public:
 	COLORREF ListBoxSelectedNoFocusBG() const { return m_ListBoxSelectedNoFocusBG; }
 	COLORREF ListBoxSelectedText() const { return m_ListBoxSelectedText; }
 	COLORREF ListBoxSelectedNoFocusText() const { return m_ListBoxSelectedNoFocusText; }
+	COLORREF ClipPastedColor() const { return m_clipPastedColor; }
+
 
 	CString Notes() const { return m_csNotes; }
 	CString Author() const { return m_csAuthor; }
@@ -54,6 +56,8 @@ protected:
 	COLORREF m_ListBoxSelectedNoFocusBG;
 	COLORREF m_ListBoxSelectedText;
 	COLORREF m_ListBoxSelectedNoFocusText;	
+	COLORREF m_clipPastedColor;
+
 
 	CString m_csLastError;
 	long m_lFileVersion;