Browse Source

load only clips that are in view when opening the database

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@477 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden 16 years ago
parent
commit
bab92d2e59
27 changed files with 5378 additions and 5665 deletions
  1. BIN
      Addins/DittoUtil/Release/DittoUtil.dll
  2. 43 22
      CP_Main.cpp
  3. 1 3
      CP_Main.h
  4. 1060 1256
      CP_Main.rc
  5. 2 0
      CP_Main.vcxproj
  6. 1 0
      Client.h
  7. 10 2
      Clip.cpp
  8. 79 10
      ClipIds.cpp
  9. 2 1
      ClipIds.h
  10. 10 1
      CopyThread.cpp
  11. 665 600
      DatabaseUtilities.cpp
  12. BIN
      Debug/focus.dll
  13. BIN
      Debug/focus.lib
  14. 1 3
      DittoSetup/Build Portable ZIP_10.bat
  15. 14 14
      EncryptDecrypt/sha2.cpp
  16. 4 1
      ExternalWindowTracker.cpp
  17. 30 7
      MainFrm.cpp
  18. 1 0
      MainFrm.h
  19. 0 280
      Misc.cpp
  20. 0 61
      Misc.h
  21. 23 1
      QListCtrl.cpp
  22. 4 8
      QListCtrl.h
  23. 3132 3109
      QPasteWnd.cpp
  24. 292 285
      QPasteWnd.h
  25. 4 1
      QuickPaste.cpp
  26. BIN
      focusdll/Release/focus.dll
  27. BIN
      focusdll/Release/focus.lib

BIN
Addins/DittoUtil/Release/DittoUtil.dll


+ 43 - 22
CP_Main.cpp

@@ -95,12 +95,11 @@ CCP_MainApp::CCP_MainApp()
 {
 	m_bAppRunning = false;
 	m_bAppExiting = false;
-
+	m_bStartupDisconnected = false;
 	m_MainhWnd = NULL;
 	m_pMainFrame = NULL;
 
 	m_bShowingQuickPaste = false;
-	m_bRemoveOldEntriesPending = false;
 
 	m_IC_bCopy = false;
 
@@ -147,6 +146,13 @@ BOOL CCP_MainApp::InitInstance()
 
 	DittoCommandLineInfo cmdInfo;
 	ParseCommandLine(cmdInfo);
+
+	//if starting from a u3 device we will pass in -U3Start
+	if(cmdInfo.m_bU3)
+		g_Opt.m_bU3 = cmdInfo.m_bU3 ? TRUE : FALSE;
+
+	g_Opt.LoadSettings();
+
 	if(cmdInfo.m_strFileName.IsEmpty() == FALSE)
 	{
 		try
@@ -180,19 +186,21 @@ BOOL CCP_MainApp::InitInstance()
 	}
 	else if(cmdInfo.m_bConnect || cmdInfo.m_bDisconnect)
 	{
+		int ret = 0;
 		HWND hWnd = (HWND)CGetSetOptions::GetMainHWND();
 		if(hWnd)
-			::SendMessage(hWnd, WM_SET_CONNECTED, cmdInfo.m_bConnect, cmdInfo.m_bDisconnect);
+		{
+			ret = ::SendMessage(hWnd, WM_SET_CONNECTED, cmdInfo.m_bConnect, cmdInfo.m_bDisconnect);
+		}
 
-		return FALSE;
+		if(ret == 1)
+		{
+			return FALSE;
+		}
+		
+		m_bStartupDisconnected = true;
 	}
 
-	//if starting from a u3 device we will pass in -U3Start
-	if(cmdInfo.m_bU3)
-		g_Opt.m_bU3 = cmdInfo.m_bU3 ? TRUE : FALSE;
-
-	g_Opt.LoadSettings();
-
 	CInternetUpdate update;
 
 	long lRunningVersion = update.GetRunningVersion();
@@ -362,6 +370,13 @@ void CCP_MainApp::StartCopyThread()
 
 	VERIFY( m_CopyThread.CreateThread(CREATE_SUSPENDED) );
 	m_CopyThread.ResumeThread();
+	
+	if(m_bStartupDisconnected)
+	{
+		Sleep(2000);
+		Log(_T("Starting Ditto up disconnected from the clipboard"));
+		SetConnectCV(false);
+	}
 }
 
 void CCP_MainApp::StopCopyThread()
@@ -448,6 +463,8 @@ void CCP_MainApp::ReloadTypes()
 
 long CCP_MainApp::SaveCopyClips()
 {
+	Log(_T("Start of function SaveCopyClips"));
+
 	long lID = 0;
 	int count;
 
@@ -471,6 +488,8 @@ long CCP_MainApp::SaveCopyClips()
 
 	if(m_QuickPasteMode == ADDING_QUICK_PASTE)
 	{
+		Log(_T("SaveCopyclips from Quick Paste - Start"));
+
 		//this will be added when they are done entering the quick paste text
 		m_pQuickPasteClip = pClips;
 		
@@ -478,16 +497,27 @@ long CCP_MainApp::SaveCopyClips()
 
 		//go ahead and send the clips out even though it won't be added for a bit
 		count = 1;
+
+		Log(_T("SaveCopyclips from Quick Paste - End"));
 	}
 	else
 	{
+		Log(_T("SaveCopyClips Before AddToDb")); 
+
 		count = pClips->AddToDB(true);
 
+		Log(StrF(_T("SaveCopyclips After AddToDb, Count: %d"), count));
+
 		if(count > 0)
 		{
 			lID = pClips->GetTail()->m_ID;
+
+			Log(StrF(_T("SaveCopyclips After AddToDb, Id: %d Before OnCopyCopyCompleted"), lID));
+
 			OnCopyCompleted(lID, count);
 
+			Log(StrF(_T("SaveCopyclips After AddToDb, Id: %d After OnCopyCopyCompleted"), lID));
+
 			if(m_CopyBuffer.Active())
 			{
 				m_CopyBuffer.EndCopy(lID);
@@ -499,6 +529,7 @@ long CCP_MainApp::SaveCopyClips()
 	{
 		if(g_Opt.m_lAutoSendClientCount > 0)
 		{
+			Log(_T("Starting thread to send clip to friends"));
 			AfxBeginThread(SendClientThread, pCopyOfClips);
 			bEnteredThread = true;
 		}
@@ -510,6 +541,8 @@ long CCP_MainApp::SaveCopyClips()
 	if(bDeletepClips)
 		delete pClips;
 
+	Log(_T("Start of function SaveCopyClips"));
+
 	return lID;
 }
 
@@ -537,9 +570,6 @@ void CCP_MainApp::OnCopyCompleted(long lLastID, int count)
 	if(count <= 0)
 		return;
 
-	// queue a message to RemoveOldEntries
-	Delayed_RemoveOldEntries(60000);
-
 	// update copy statistics
 	CGetSetOptions::SetTripCopyCount(-count);
 	CGetSetOptions::SetTotalCopyCount(-count);
@@ -697,15 +727,6 @@ void CCP_MainApp::ShowPersistent( bool bVal )
 	}
 }
 
-void CCP_MainApp::Delayed_RemoveOldEntries( UINT delay )
-{
-	if( !m_bRemoveOldEntriesPending )
-	{
-		m_bRemoveOldEntriesPending = true;
-		((CMainFrame*)theApp.m_pMainWnd)->SetTimer( REMOVE_OLD_ENTRIES_TIMER, delay, 0 );
-	}
-}
-
 /////////////////////////////////////////////////////////////////////////////
 // CCP_MainApp message handlers
 

+ 1 - 3
CP_Main.h

@@ -47,6 +47,7 @@ public:
 	// track stages of startup / shutdown
 	bool	m_bAppRunning;
 	bool	m_bAppExiting;
+	bool 	m_bStartupDisconnected;
 
 	bool	m_bExitServerThread;
 
@@ -149,9 +150,6 @@ public:
 
 	void ShowPersistent(bool bVal);
 
-	bool	m_bRemoveOldEntriesPending;
-	void Delayed_RemoveOldEntries(UINT delay);
-
 	bool	m_bAsynchronousRefreshView;
 
 	//Socket Info

+ 1060 - 1256
CP_Main.rc

@@ -1,1256 +1,1060 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "#include ""afxres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
-    "#define _AFX_NO_OLE_RESOURCES\r\n"
-    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
-    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
-    "\r\n"
-    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
-    "#ifdef _WIN32\r\n"
-    "LANGUAGE 9, 1\r\n"
-    "#pragma code_page(1252)\r\n"
-    "#endif //_WIN32\r\n"
-    "#include ""res\\CP_Main.rc2""  // non-Microsoft Visual C++ edited resources\r\n"
-    "#include ""afxres.rc""         // Standard components\r\n"
-    "#include ""afxprint.rc""       // printing/print preview resources\r\n"
-    "#endif\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDR_MAINFRAME           ICON                    "res\\Ditto.ico"
-IDR_CP_MAITYPE          ICON                    "res\\CP_MainDoc.ico"
-IDI_DITTO_NOCOPYCB      ICON                    "res\\Ditto_NoCopyCb.ico"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Bitmap
-//
-
-IDR_MAINFRAME           BITMAP                  "res\\Toolbar.bmp"
-IDB_CLOSED_FOLDER       BITMAP                  "res\\bitmap1.bmp"
-IDB_CLOSED_FOLDER_PRESSED BITMAP                  "res\\closed_f.bmp"
-IDB_CLOSED_FOLDER_FOCUSED BITMAP                  "res\\bmp00001.bmp"
-IDB_OPEN_FOLDER         BITMAP                  "res\\bmp00002.bmp"
-IDB_OPEN_FOLDER_FOCUSED BITMAP                  "res\\open_fol.bmp"
-IDB_OPEN_FOLDER_PRESSED BITMAP                  "res\\bmp00003.bmp"
-IDB_BACK                BITMAP                  "res\\back.bmp"
-IDB_BACK_PRESSED        BITMAP                  "res\\back1.bmp"
-IDB_BACK_FOCUSED        BITMAP                  "res\\back2.bmp"
-IDR_EDIT_WND            BITMAP                  "res\\mainfram.bmp"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Toolbar
-//
-
-IDR_MAINFRAME TOOLBAR  16, 15
-BEGIN
-    BUTTON      ID_FILE_NEW
-    BUTTON      ID_FILE_OPEN
-    BUTTON      ID_FILE_SAVE
-    SEPARATOR
-    BUTTON      ID_EDIT_CUT
-    BUTTON      ID_EDIT_COPY
-    BUTTON      ID_EDIT_PASTE
-    SEPARATOR
-    BUTTON      ID_FILE_PRINT
-    SEPARATOR
-    BUTTON      ID_APP_ABOUT
-END
-
-IDR_EDIT_WND TOOLBAR  16, 15
-BEGIN
-    BUTTON      ID_BUTTON_NEW
-    SEPARATOR
-    BUTTON      ID_BUTTON_SAVE
-    BUTTON      ID_BUTTON_SAVE_ALL
-    SEPARATOR
-    BUTTON      ID_BUTTON_SAVE_CLOSE_CLIPBOARD
-    SEPARATOR
-    BUTTON      ID_BUTTON_CLOSE
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Menu
-//
-
-IDR_MAINFRAME MENU 
-BEGIN
-    POPUP "&File"
-    BEGIN
-        MENUITEM "&New\tCtrl+N",                ID_FILE_NEW
-        MENUITEM "&Open...\tCtrl+O",            ID_FILE_OPEN
-        MENUITEM "&Save\tCtrl+S",               ID_FILE_SAVE
-        MENUITEM "Save &As...",                 ID_FILE_SAVE_AS
-        MENUITEM SEPARATOR
-        MENUITEM "&Print...\tCtrl+P",           ID_FILE_PRINT
-        MENUITEM "Print Pre&view",              ID_FILE_PRINT_PREVIEW
-        MENUITEM "P&rint Setup...",             ID_FILE_PRINT_SETUP
-        MENUITEM SEPARATOR
-        MENUITEM "Recent File",                 ID_FILE_MRU_FILE1, GRAYED
-        MENUITEM SEPARATOR
-        MENUITEM "E&xit",                       ID_APP_EXIT
-    END
-    POPUP "&Edit"
-    BEGIN
-        MENUITEM "&Undo\tCtrl+Z",               ID_EDIT_UNDO
-        MENUITEM SEPARATOR
-        MENUITEM "Cu&t\tCtrl+X",                ID_EDIT_CUT
-        MENUITEM "&Copy\tCtrl+C",               ID_EDIT_COPY
-        MENUITEM "&Paste\tCtrl+V",              ID_EDIT_PASTE
-    END
-    POPUP "&View"
-    BEGIN
-        MENUITEM "&Toolbar",                    ID_VIEW_TOOLBAR
-        MENUITEM "&Status Bar",                 ID_VIEW_STATUS_BAR
-    END
-    POPUP "&Help"
-    BEGIN
-        MENUITEM "&About CP_Main...",           ID_APP_ABOUT
-    END
-END
-
-IDR_MENU MENU 
-BEGIN
-    POPUP "First"
-    BEGIN
-        MENUITEM "Show Quick Paste",            ID_FIRST_SHOWQUICKPASTE
-        MENUITEM "Options",                     ID_FIRST_OPTION
-        MENUITEM SEPARATOR
-        MENUITEM "Import",                      ID_FIRST_IMPORT
-        MENUITEM "New Clip",                    ID_FIRST_NEWCLIP
-        MENUITEM SEPARATOR
-        MENUITEM "Help",                        ID_FIRST_HELP
-        MENUITEM SEPARATOR
-        MENUITEM "Connect To Clipboard",        ID_FIRST_TOGGLECONNECTCV
-        MENUITEM SEPARATOR
-        MENUITEM "Exit",                        ID_FIRST_EXIT
-    END
-END
-
-IDR_QUICK_PASTE MENUEX 
-BEGIN
-    POPUP "Menu",                           65535,MFT_STRING,MFS_ENABLED
-    BEGIN
-        POPUP "Groups",                         65535,MFT_STRING,MFS_ENABLED
-        BEGIN
-            MENUITEM "New Group",                   32811,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "New Group Selection",         32812,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Move to Group",               32840,MFT_STRING,
-            MFS_ENABLED
-        END
-        POPUP "Quick Options",                  65535,MFT_STRING,MFS_ENABLED
-        BEGIN
-            POPUP "Lines Per Row",                  65535,MFT_STRING,
-            MFS_ENABLED
-            BEGIN
-                MENUITEM "1",                           32807,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "2",                           32786,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "3",                           32787,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "4",                           32788,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "5",                           32789,MFT_STRING,
-                MFS_ENABLED
-            END
-            POPUP "Transparency",                   65535,MFT_STRING,
-            MFS_ENABLED
-            BEGIN
-                MENUITEM "None",                        32800,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "5 %",                         32808,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "10 %",                        32792,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "15 %",                        32794,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "20 %",                        32796,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "25 %",                        32798,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "30 %",                        32799,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "40 %",                        32790,MFT_STRING,
-                MFS_ENABLED
-            END
-            POPUP "Positioning",                    65535,MFT_STRING,
-            MFS_ENABLED
-            BEGIN
-                MENUITEM "At Caret",                    32802,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "At Cursor",                   32803,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "At Previous Position",        32804,MFT_STRING,
-                MFS_ENABLED
-            END
-            POPUP "First Ten Hot Keys",             65535,MFT_STRING,
-            MFS_ENABLED
-            BEGIN
-                MENUITEM "Use Ctrl - Num",              32777,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "Show Hot Key Text",           32778,MFT_STRING,
-                MFS_ENABLED
-            END
-            POPUP "View Caption Bar On",            65535,MFT_STRING,
-            MFS_ENABLED
-            BEGIN
-                MENUITEM "Top",                         32783,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "Right",                       32780,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "Bottom",                      32781,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "Left",                        32782,MFT_STRING,
-                MFS_ENABLED
-            END
-            POPUP "Sort",                           65535,MFT_STRING,
-            MFS_ENABLED
-            BEGIN
-                MENUITEM "Ascending (Latest on the Top)", 32795,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "Descending (Latest on the Bottom)", 32797,
-                MFT_STRING,MFS_ENABLED
-            END
-            POPUP "Double Clicking on Caption",     65535,MFT_STRING,
-            MFS_ENABLED
-            BEGIN
-                MENUITEM "Toggles Always on Top",       32814,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "Rolls-up Window",             32815,MFT_STRING,
-                MFS_ENABLED
-                MENUITEM "Toggles Always Show Description", 32816,MFT_STRING,
-                MFS_ENABLED
-            END
-            MENUITEM "Always on Top",               32784,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Auto Roll-up",                32791,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Always Show Description",     32813,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Prompt For New Group Names",  32817,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Select Font",                 32844,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Show Thumbnails",             32845,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Draw RTF Text",               32846,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Paste Clip after selection",  32847,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Find As You Type",            32848,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Ensure Entire Window Is Visible", 32849,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Show Clips That are in Groups in Main List", 32850,
-            MFT_STRING,MFS_ENABLED
-            MENUITEM "Prompt to Delete Clip",       32852,MFT_STRING,
-            MFS_ENABLED
-        END
-        POPUP "Sent To",                        65535,MFT_STRING,MFS_ENABLED
-        BEGIN
-            MENUITEM "Friend One",                  32824,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Two",                  32825,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Three",                32826,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Fore",                 32827,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Five",                 32828,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Six",                  32829,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Seven",                32830,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Eight",                32831,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Nine",                 32832,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Ten",                  32833,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Eleven",               32834,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Twelve",               32835,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Thirteen",             32836,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Foreteen",             32837,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Friend Fifteen",              32838,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Prompt for IP",               32839,MFT_STRING,
-            MFS_ENABLED
-        END
-        MENUITEM "View Full Description",       32793,MFT_STRING,MFS_ENABLED
-        MENUITEM "View Groups",                 32819,MFT_STRING,MFS_ENABLED
-        MENUITEM "Paste Plain Text Only",       32841,MFT_STRING,MFS_ENABLED
-        MENUITEM MFT_SEPARATOR
-        MENUITEM "Delete Entry",                32801,MFT_STRING,MFS_ENABLED
-        MENUITEM MFT_SEPARATOR
-        MENUITEM "Edit Clip",                   32860,MFT_STRING,MFS_ENABLED
-        MENUITEM "New Clip",                    32867,MFT_STRING,MFS_ENABLED
-        MENUITEM MFT_SEPARATOR
-        MENUITEM "Properties",                  32776,MFT_STRING,MFS_ENABLED
-        POPUP "Quick Properties",               65535,MFT_STRING,MFS_ENABLED
-        BEGIN
-            MENUITEM "Never Auto Delete",           32820,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Auto Delete",                 32821,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Remove Hot Key",              32822,MFT_STRING,
-            MFS_ENABLED
-            MENUITEM "Remove Quick Paste",          32856,
-            MFT_STRING | MFT_RIGHTJUSTIFY,MFS_ENABLED
-        END
-        MENUITEM MFT_SEPARATOR
-        MENUITEM "Import",                      32855,MFT_STRING,MFS_ENABLED
-        MENUITEM "Export",                      32853,MFT_STRING,MFS_ENABLED
-        MENUITEM MFT_SEPARATOR
-        MENUITEM "Options...",                  32805,MFT_STRING,MFS_ENABLED
-        MENUITEM MFT_SEPARATOR
-        MENUITEM "Help",                        32842,MFT_STRING,MFS_ENABLED
-        MENUITEM MFT_SEPARATOR
-        MENUITEM "Connect To Clipboard",        32775,MFT_STRING,MFS_ENABLED
-        MENUITEM MFT_SEPARATOR
-        MENUITEM "Exit Program",                32806,MFT_STRING,MFS_ENABLED
-    END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Accelerator
-//
-
-IDR_MAINFRAME ACCELERATORS 
-BEGIN
-    "N",            ID_FILE_NEW,            VIRTKEY, CONTROL
-    "O",            ID_FILE_OPEN,           VIRTKEY, CONTROL
-    "S",            ID_FILE_SAVE,           VIRTKEY, CONTROL
-    "P",            ID_FILE_PRINT,          VIRTKEY, CONTROL
-    "Z",            ID_EDIT_UNDO,           VIRTKEY, CONTROL
-    "X",            ID_EDIT_CUT,            VIRTKEY, CONTROL
-    "C",            ID_EDIT_COPY,           VIRTKEY, CONTROL
-    "V",            ID_EDIT_PASTE,          VIRTKEY, CONTROL
-    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT
-    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT
-    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL
-    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT
-    VK_F6,          ID_NEXT_PANE,           VIRTKEY 
-    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "About CP_Main"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20
-    LTEXT           "CP_Main Version 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX
-    LTEXT           "Copyright (C) 2002",IDC_STATIC,40,25,119,8
-    DEFPUSHBUTTON   "OK",IDOK,178,7,50,14,WS_GROUP
-END
-
-IDD_OPTIONS_UTILITIES DIALOGEX 0, 0, 241, 137
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Database"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    PUSHBUTTON      "Compact Database",IDC_COMPACT_DB,14,18,107,14
-    PUSHBUTTON      "Repair Database",IDC_REPAIR,14,37,107,14
-    EDITTEXT        IDC_PATH,14,67,198,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "....",IDC_GET_PATH,214,67,14,12
-    LTEXT           "Database Path:",IDC_STATIC,14,56,50,8
-END
-
-IDD_OPTIONS_TYPES DIALOGEX 0, 0, 230, 172
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Supported Types"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    LISTBOX         IDC_LIST1,7,7,129,158,LBS_SORT | LBS_NOINTEGRALHEIGHT | 
-                    LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "&Add",IDC_ADD,147,10,50,14
-    PUSHBUTTON      "&Delete",IDC_DELETE,147,30,50,14
-END
-
-IDD_OPTIONS_QUICK_PASTE DIALOGEX 0, 0, 360, 250
-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         "History Starts at the Top of the list (vs. Bottom)",
-                    IDC_HISTORY_START_TOP,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,18,8,335,10
-    CONTROL         "Use Ctrl - Num for first ten copy hot keys",
-                    IDC_CTRL_CLICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,
-                    19,335,10
-    CONTROL         "Show text for first ten copy hot keys",
-                    IDC_SHOW_TEXT_FOR_FIRST_TEN_HOT_KEYS,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,18,30,335,10
-    CONTROL         "Show leading whitespace",
-                    IDC_DESC_SHOW_LEADING_WHITESPACE,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,18,41,335,10
-    LTEXT           "Text Lines per Row",IDC_STATIC_LINES,18,54,93,8
-    EDITTEXT        IDC_LINES_ROW,114,52,19,12,ES_AUTOHSCROLL
-    CONTROL         "Enable Quick Paste Transparency",IDC_TRANSPARENCY,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,67,155,10
-    EDITTEXT        IDC_TRANS_PERC,177,66,19,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "Font",IDC_BUTTON_FONT,18,160,143,17
-    PUSHBUTTON      "Default Font",IDC_BUTTON_DEFAULT_FAULT,164,163,70,12
-    CONTROL         "At Caret",IDC_AT_CARET,"Button",BS_AUTORADIOBUTTON,22,
-                    195,93,10
-    CONTROL         "At Cursor",IDC_AT_CURSOR,"Button",BS_AUTORADIOBUTTON,22,
-                    205,97,10
-    CONTROL         "At Previous Position",IDC_AT_PREVIOUS,"Button",
-                    BS_AUTORADIOBUTTON,22,215,117,10
-    LTEXT           "%",IDC_STATIC,199,66,8,12,SS_CENTERIMAGE
-    GROUPBOX        "Popup Positioning",IDC_STATIC_POPUP,10,186,138,41
-    LTEXT           "  * = Don't Auto Delete\n  s = Shortcut exists\n G = Item is a Group\n  ! = Item is attached to a Group",
-                    IDC_STATIC_LEG,158,196,154,36
-    GROUPBOX        "List Item Prefix Legend",IDC_STATIC_LEGEND,153,186,165,
-                    50
-    CONTROL         "Show thumbnails (for CF_DIB types) (Could Increase Memory Usage and Display Speed)",
-                    IDC_SHOW_THUMBNAILS,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,18,79,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,18,89,
-                    335,10
-    CONTROL         "Find As You Type",IDC_CHECK_FIND_AS_YOU_TYPE,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,18,99,335,10
-    CONTROL         "Ensure Entire Window is Visible",
-                    IDC_CHECK_ENTIRE_WINDOW_IS_VISIBLE,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,18,109,335,10
-    CONTROL         "Show Clips That are in Groups in Main List",
-                    IDC_CHECK_SHOW_ALL_IN_MAIN_LIST,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,18,119,335,10
-    CONTROL         "Prompt when deleting clips",
-                    IDC_CHECK_PROMPT_DELETE_CLIP,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,18,128,335,10
-    LTEXT           "Theme",IDC_STATIC_THEME,18,142,36,12,SS_CENTERIMAGE
-    COMBOBOX        IDC_COMBO_THEME,59,142,130,95,CBS_DROPDOWNLIST | 
-                    CBS_SORT | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "About Theme",IDC_BUTTON_THEME,198,142,106,12
-END
-
-IDD_OPTIONS_KEYSTROKES DIALOGEX 0, 0, 350, 206
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Keyboard Shortcuts"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    CONTROL         "HotKey1",IDC_HOTKEY,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,91,13,80,14
-    CONTROL         "Win",IDC_CHECK_WIN_DITTO,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,174,13,33,14
-    CONTROL         "HotKey1",IDC_NAMED_COPY,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,91,29,80,14
-    CONTROL         "Win",IDC_CHECK_WIN_NAMED_COPY,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,174,29,33,14
-    CONTROL         "HotKey1",IDC_HOTKEY1,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,66,88,80,14
-    CONTROL         "Win",IDC_CHECK_WIN1,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,88,33,14
-    CONTROL         "HotKey1",IDC_HOTKEY2,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,66,103,80,14
-    CONTROL         "Win",IDC_CHECK_WIN2,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,103,33,14
-    CONTROL         "HotKey1",IDC_HOTKEY3,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,66,118,80,14
-    CONTROL         "Win",IDC_CHECK_WIN3,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,147,118,33,14
-    CONTROL         "HotKey1",IDC_HOTKEY4,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,66,133,80,14
-    CONTROL         "Win",IDC_CHECK_WIN4,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,133,33,14
-    CONTROL         "HotKey1",IDC_HOTKEY5,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,66,148,80,14
-    CONTROL         "Win",IDC_CHECK_WIN5,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,148,33,14
-    CONTROL         "HotKey1",IDC_HOTKEY6,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,229,88,80,14
-    CONTROL         "Win",IDC_CHECK_WIN6,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,309,88,27,14
-    CONTROL         "HotKey1",IDC_HOTKEY7,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,229,103,80,14
-    CONTROL         "Win",IDC_CHECK_WIN7,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,309,103,26,14
-    CONTROL         "HotKey1",IDC_HOTKEY8,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,229,118,80,14
-    CONTROL         "Win",IDC_CHECK_WIN8,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,310,118,26,14
-    CONTROL         "HotKey1",IDC_HOTKEY9,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,229,133,80,14
-    CONTROL         "Win",IDC_CHECK_WIN9,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,309,133,27,14
-    CONTROL         "HotKey1",IDC_HOTKEY10,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,229,148,80,14
-    CONTROL         "Win",IDC_CHECK_WIN10,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,309,148,27,14
-    GROUPBOX        "Global Hot Keys for Last Ten Items Copied",
-                    IDC_STATIC_GROUP,7,64,336,105
-    CONTROL         "Send Paste (Otherwise it will just load the item on the clipboard)",
-                    IDC_CHECK_SEND_PASTE,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,19,74,324,13
-    LTEXT           "Activate Ditto",IDC_STATIC_ACTIVATE,19,13,71,14,
-                    SS_CENTERIMAGE
-    LTEXT           "Named Copy",IDC_STATIC_NAMED_COPY,19,29,70,14,
-                    SS_CENTERIMAGE
-    RTEXT           "Position 1",IDC_STATIC_1,16,88,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 2",IDC_STATIC_2,16,103,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 3",IDC_STATIC_3,16,118,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 4",IDC_STATIC_4,16,133,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 5",IDC_STATIC_5,16,148,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 6",IDC_STATIC_6,181,88,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 7",IDC_STATIC_7,181,103,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 8",IDC_STATIC_8,181,118,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 9",IDC_STATIC_9,181,133,42,14,SS_CENTERIMAGE
-    RTEXT           "Position 10",IDC_STATIC_10,181,148,42,14,SS_CENTERIMAGE
-    LTEXT           "Check the ""Win"" Button to include the windows keyboard key in your hot key.",
-                    IDC_STATIC_WIN,7,173,336,25
-    CONTROL         "HotKey1",IDC_NAMED_PASTE,"msctls_hotkey32",WS_BORDER | 
-                    WS_TABSTOP,91,44,80,14
-    CONTROL         "Win",IDC_CHECK_WIN_NAMED_PASTE,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,174,44,33,14
-    LTEXT           "Named Paste",IDC_STATIC_NAMED_COPY2,19,44,69,14,
-                    SS_CENTERIMAGE
-    LTEXT           "Send custom strokes Per Application",
-                    IDC_STATIC_CUSTOM_KEYS,210,16,133,8
-END
-
-IDD_OPTIONS_GENERAL DIALOGEX 0, 0, 351, 259
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "General"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-    CONTROL         "Start Ditto on System Startup",IDC_START_ON_STARTUP,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,15,138,10
-    CONTROL         "Display Icon in System Tray",IDC_DISPLAY_IN_SYSTEMTRAY,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,28,321,10
-    CONTROL         "Maximum Number of Saved Copies",IDC_MAXIMUM,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,23,41,144,10
-    EDITTEXT        IDC_MAX_SAVED_COPIES,167,41,27,12,ES_AUTOHSCROLL
-    CONTROL         "Paste Entries Expire after",IDC_EXPIRE,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,23,54,140,10
-    EDITTEXT        IDC_EXPIRE_AFTER,167,53,27,12,ES_AUTOHSCROLL
-    LTEXT           "Days",IDC_STATIC_DAYS,201,53,51,12,SS_CENTERIMAGE
-    PUSHBUTTON      "Compact and Repair Database",IDC_BT_COMPACT_AND_REPAIR,
-                    170,14,105,11
-    CONTROL         "Set Database Path",IDC_SET_DB_PATH,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,23,79,320,10
-    EDITTEXT        IDC_PATH,23,89,248,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "....",IDC_GET_PATH,272,89,14,12
-    CONTROL         "Automatically check for updates online",
-                    IDC_CHECK_UPDATES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
-                    23,106,173,10
-    PUSHBUTTON      "Check Now",IDC_CHECK_FOR_UPDATES,201,106,86,11
-    CONTROL         "Allow Duplicates",IDC_ALLOW_DUPLICATES,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,23,118,320,10
-    CONTROL         "Update Clip Time On Paste",IDC_UPDATE_TIME_ON_PASTE,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,130,321,10
-    CONTROL         "Save Multi-Pastes",IDC_SAVE_MULTIPASTE,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,23,142,321,10
-    CONTROL         "Hide Ditto on Hot Key if Ditto is Visible",
-                    IDC_HIDE_DITO_ON_HOT_KEY,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,23,153,322,10
-    LTEXT           "Amount of text to save for description",
-                    IDC_STATIC_AMOUNT,23,165,177,8
-    EDITTEXT        IDC_DESC_TEXT_SIZE,206,163,35,12,ES_AUTOHSCROLL
-    LTEXT           "On copy play the sound",IDC_STATIC_SOUND,23,177,139,10
-    EDITTEXT        IDC_EDIT_PLAY_SOUND,167,177,115,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "Play",IDC_BUTTON_PLAY,285,177,35,12
-    PUSHBUTTON      "....",IDC_SELECT_SOUND,323,177,14,12
-    CONTROL         "Paste Clip in active window after selection",
-                    IDC_SEND_PASTE_MESSAGE,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,23,190,318,10
-    LTEXT           "Maximum Clip Size in Bytes",IDC_STATIC_MAX_SIZE,23,202,
-                    137,8
-    EDITTEXT        IDC_EDIT_MAX_SIZE,164,200,59,12,ES_AUTOHSCROLL
-    LTEXT           "(Leave blank for no limit)",IDC_STATIC_NO_LIMIT,232,202,
-                    112,8
-    LTEXT           "Lanuage",IDC_STATIC_LANGUAGE,23,65,36,12,SS_CENTERIMAGE
-    COMBOBOX        IDC_COMBO_LANGUAGE,65,65,130,95,CBS_DROPDOWNLIST | 
-                    CBS_SORT | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Ignore copies that occur X milliseconds from the last copy (1000 ms = 1 sec)",
-                    IDC_STATIC_SAVE_DELAY,23,215,278,11
-    EDITTEXT        IDC_EDIT_SAVE_DELAY,306,214,38,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "About Language",IDC_BUTTON_ABOUT,204,65,106,12
-    CONTROL         "Ensure Ditto is always connected to the clipboard",
-                    IDC_ENSURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,228,
-                    306,10
-    LTEXT           "Multi-Paste clip separator ([LF] = line feed)",
-                    IDC_STATIC_CLIP_SEPARATOR,23,242,161,8
-    EDITTEXT        IDC_EDIT_CLIP_SEPARATOR,187,240,106,12,ES_AUTOHSCROLL
-END
-
-IDD_SELECT_DB DIALOGEX 0, 0, 276, 46
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
-CAPTION "Select Database"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    DEFPUSHBUTTON   "OK",IDOK,101,25,50,14
-    PUSHBUTTON      "Cancel",IDCANCEL,170,25,50,14
-    EDITTEXT        IDC_PATH,7,7,244,13,ES_AUTOHSCROLL
-    PUSHBUTTON      "...",IDC_SELECT,254,7,15,12
-    PUSHBUTTON      "Use Default",IDC_USE_DEFAULT,27,25,50,14
-END
-
-IDD_OPTIONS_STATS DIALOGEX 0, 0, 346, 207
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Stats"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    EDITTEXT        IDC_EDIT_ALL_DATE,13,17,133,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_ALL_COPIES,65,31,25,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_ALL_PASTES,65,45,25,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_TRIP_DATE,174,17,123,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_TRIP_COPIES,222,31,25,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_TRIP_PASTES,222,45,25,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "Reset",IDC_RESET_COUNTS,253,31,44,12
-    EDITTEXT        IDC_SAVED_COPIES,99,72,41,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "Remove All",IDC_REMOVE_ALL,145,72,62,12
-    EDITTEXT        IDC_SAVED_COPY_DATA,99,86,41,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_LAST_STARTED,99,115,157,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_DATABASE_SIZE,99,129,41,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_CLIPS_SENT,99,143,41,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_CLIPS_RECIVED,99,157,41,12,ES_AUTOHSCROLL
-    LTEXT           "Copies",IDC_STATIC_5,174,31,45,12,SS_CENTERIMAGE
-    LTEXT           "Pastes",IDC_STATIC_6,174,45,46,12,SS_CENTERIMAGE
-    GROUPBOX        "Trip Odometer",IDC_STATIC_2,170,7,135,54
-    LTEXT           "Copies",IDC_STATIC_3,13,31,49,12,SS_CENTERIMAGE
-    LTEXT           "Pastes",IDC_STATIC_4,13,45,50,12,SS_CENTERIMAGE
-    GROUPBOX        "Odometer",IDC_STATIC_1,7,7,145,54
-    LTEXT           "Saved Copies",IDC_STATIC_7,15,72,76,12,SS_CENTERIMAGE
-    LTEXT           "Saved Copy Data",IDC_STATIC_8,15,88,80,18
-    LTEXT           "Database Size",IDC_STATIC_10,15,129,79,12,
-                    SS_CENTERIMAGE
-    LTEXT           "Clips Sent",IDC_STATIC_11,15,143,79,12,SS_CENTERIMAGE
-    LTEXT           "Clips Received",IDC_STATIC_12,15,157,79,12,
-                    SS_CENTERIMAGE
-    GROUPBOX        "",IDC_STATIC,7,63,206,47
-    LTEXT           "Last Started",IDC_STATIC_9,15,115,79,12,SS_CENTERIMAGE
-    LTEXT           "Since Last Start",IDC_STATIC_13,145,152,100,8
-END
-
-IDD_ADD_TYPE DIALOG  0, 0, 293, 231
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Add Supported Type"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    PUSHBUTTON      "Cancel",IDCANCEL,236,210,50,14
-    LISTBOX         IDC_LIST1,7,15,113,174,LBS_SORT | LBS_NOINTEGRALHEIGHT | 
-                    LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
-    EDITTEXT        IDC_EDIT1,135,15,91,14,ES_AUTOHSCROLL
-    LISTBOX         IDC_LIST2,135,43,97,146,LBS_SORT | LBS_NOINTEGRALHEIGHT | 
-                    LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "Add",IDC_ADD_1,7,191,44,11
-    PUSHBUTTON      "Add",IDC_ADD_2,231,15,44,11
-    PUSHBUTTON      "Add",IDC_ADD_3,130,191,44,11
-    LTEXT           "Custom Type",IDC_STATIC_2,135,7,81,8
-    LTEXT           "Currently on the Clipboard",IDC_STATIC_3,135,35,132,8
-    LTEXT           "Main Types",IDC_STATIC_1,7,7,80,8
-END
-
-IDD_COPY_PROPERTIES DIALOGEX 0, 0, 258, 220
-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,44,7,82,13
-    EDITTEXT        IDC_DATE,165,7,86,13,ES_AUTOHSCROLL | NOT WS_TABSTOP
-    COMBOBOX        IDC_COMBO1,77,39,174,128,CBS_DROPDOWNLIST | WS_VSCROLL | 
-                    WS_TABSTOP
-    EDITTEXT        IDC_EDIT_QUICK_PASTE,77,56,174,13,ES_AUTOHSCROLL
-    CONTROL         "",IDC_RICHEDIT1,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | 
-                    TCS_FOCUSONBUTTONDOWN | TCS_MULTISELECT | WS_BORDER | 
-                    WS_VSCROLL | WS_TABSTOP,7,79,244,62
-    DEFPUSHBUTTON   "OK",IDOK,148,199,50,14
-    PUSHBUTTON      "Cancel",IDCANCEL,201,199,50,14
-    CONTROL         "&Never Auto Delete",IDC_NEVER_AUTO_DELETE,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,8,23,149,10
-    LISTBOX         IDC_COPY_DATA,7,153,244,43,LBS_SORT | 
-                    LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | 
-                    WS_TABSTOP
-    PUSHBUTTON      "Delete",IDC_DELETE_COPY_DATA,7,201,42,12
-    LTEXT           "Item Title",IDC_STATIC_TITLE,7,68,168,8
-    RTEXT           "Date",IDC_STATIC_DATE,131,7,31,13,SS_CENTERIMAGE
-    LTEXT           "Hot Key",IDC_STATIC_HOT_KEY,7,7,35,13,SS_CENTERIMAGE
-    LTEXT           "Copy Formats",IDC_STATIC_FORMATS,7,142,226,8
-    LTEXT           "Move To Group",IDC_STATIC_MOVE_TO_GROUP,8,40,67,9
-    LTEXT           "Quick Paste Text",IDC_STATIC,7,56,62,13,SS_CENTERIMAGE
-END
-
-IDD_ABOUT DIALOGEX 0, 0, 329, 153
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "About"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-    LISTBOX         IDC_LIST,7,16,315,86,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | 
-                    WS_HSCROLL | WS_TABSTOP
-    LTEXT           "E-mail Scott Brogden",IDC_HYPER_LINK,7,108,67,8
-    LTEXT           "Ditto Home Page - ditto-cp.sf.net",IDC_STATIC_LINK,7,
-                    126,104,8
-END
-
-IDD_GROUP_NAME DIALOGEX 0, 0, 186, 49
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Ditto"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    DEFPUSHBUTTON   "OK",IDOK,75,28,50,14
-    PUSHBUTTON      "Cancel",IDCANCEL,129,28,50,14
-    LTEXT           "Name",IDC_STATIC,7,1,59,10
-    EDITTEXT        IDC_NAME,7,11,172,12,ES_AUTOHSCROLL
-END
-
-IDD_OPTIONS_FRIENDS DIALOGEX 0, 0, 353, 247
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Friends"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    CONTROL         "List1",IDC_LIST,"SysListView32",LVS_REPORT | WS_BORDER | 
-                    WS_TABSTOP,7,159,339,68
-    LTEXT           "If Send All Copies is selected then all copies from this computer will be sent to the other computer.  If that is not selected then it will just be in the right click menu to send a copy to that computer.",
-                    IDC_STATIC_6,7,126,339,28
-    EDITTEXT        IDC_EDIT_PLACE_ON_CLIPBOARD,96,39,210,13,ES_AUTOHSCROLL
-    LTEXT           "IP/Computer Names seperated by commas",IDC_STATIC_2,7,
-                    37,84,17
-    LTEXT           "When you recieve a sent copy if their ip or computer name is in this list then it will be put on the clipboard.  Otherwise it will be in the saved clips to use at a later time.",
-                    IDC_STATIC_1,7,10,339,26
-    CONTROL         "Log Send Receive Commands",IDC_CHECK_LOG_SEND_RECIEVE,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,232,339,12
-    CONTROL         "Disable Recieving Clips",IDC_CHECK_DISABLE_FRIENDS,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,95,53,146,10
-    LTEXT           "Network Password",IDC_STATIC_3,7,69,79,9
-    EDITTEXT        IDC_EDIT_PASSWORD,96,66,210,13,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_ADDITIONAL,95,110,210,12,ES_AUTOHSCROLL
-    LTEXT           "If you are receiving clips from computers where your network password does not match, enter additional network passwords separated by commas",
-                    IDC_STATIC_4,7,83,339,22
-    LTEXT           "Receive Passwords",IDC_STATIC_5,7,112,79,9
-END
-
-IDD_FRIEND_DETAILS DIALOGEX 0, 0, 203, 79
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Friend Details"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    DEFPUSHBUTTON   "OK",IDOK,89,58,50,14
-    PUSHBUTTON      "Cancel",IDCANCEL,146,58,50,14
-    CONTROL         "Send All Copies to this friend",IDC_CHECK_SEND_ALL,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,47,7,105,10
-    LTEXT           "IP/Name",IDC_STATIC_1,7,23,30,8
-    EDITTEXT        IDC_EDIT_IP,47,20,83,13,ES_AUTOHSCROLL
-    LTEXT           "Description",IDC_STATIC_2,7,41,36,8
-    EDITTEXT        IDC_EDIT_DESCRIPTION,47,39,149,13,ES_AUTOHSCROLL
-END
-
-IDD_MOVE_TO_GROUP DIALOGEX 0, 0, 254, 177
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Move to Group"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    CONTROL         "Tree1",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | 
-                    TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | 
-                    TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,240,142
-    PUSHBUTTON      "New Group",IDC_BUTTON_NEW_GROUP,7,156,55,14
-    DEFPUSHBUTTON   "OK",IDOK,143,156,50,14
-    PUSHBUTTON      "Cancel",IDCANCEL,197,156,50,14
-END
-
-IDD_DIALOG_REMOTE_FILE DIALOGEX 0, 0, 284, 110
-STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Ditto"
-FONT 8, "MS Sans Serif", 0, 0, 0x0
-BEGIN
-    PUSHBUTTON      "Cancel",IDCANCEL,227,89,50,14
-    CONTROL         "Progress1",IDC_PROGRESS_FILE,"msctls_progress32",
-                    WS_BORDER | 0x1,7,78,270,9
-    CONTROL         "Progress1",IDC_PROGRESS_ALL_FILES,"msctls_progress32",
-                    WS_BORDER | 0x1,7,45,270,9
-    LTEXT           "a",IDC_STATIC_1,7,33,270,10,SS_CENTERIMAGE
-    LTEXT           "",IDC_STATIC_2,7,59,270,16,SS_CENTERIMAGE
-    CONTROL         "Animate1",IDC_FILE_COPY,"SysAnimate32",ACS_CENTER | 
-                    ACS_TRANSPARENT | WS_TABSTOP,7,3,270,26
-END
-
-IDD_OPTIONS_COPY_BUFFERS DIALOGEX 0, 0, 287, 250
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
-    WS_SYSMENU
-CAPTION "Copy Buffers"
-FONT 8, "MS Shell Dlg", 400, 0, 0x1
-BEGIN
-    CONTROL         "",IDC_COPY_1,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,
-                    63,16,80,14
-    CONTROL         "Win",IDC_WIN_COPY_1,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,16,33,14
-    CONTROL         "",IDC_PASTE_1,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,
-                    63,32,80,14
-    CONTROL         "Win",IDC_WIN_PASTE_1,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,32,33,14
-    LTEXT           "Copy",IDC_STATIC_COPY_1,19,16,42,14,SS_CENTERIMAGE
-    LTEXT           "Paste",IDC_STATIC_PASTE_1,19,32,43,14,SS_CENTERIMAGE
-    CONTROL         "",IDC_CUT_1,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,
-                    47,80,14
-    CONTROL         "Win",IDC_WIN_CUT_1,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,47,33,14
-    LTEXT           "Cut",IDC_STATIC_CUT_1,19,47,43,14,SS_CENTERIMAGE
-    GROUPBOX        "Copy Buffer 1",IDC_BUFFER_GROUP_1,7,7,273,61
-    CONTROL         "Play Sound on Copy",IDC_PLAY_SOUND_1,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,179,16,80,14
-    CONTROL         "",IDC_COPY_2,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,
-                    63,81,80,14
-    CONTROL         "Win",IDC_WIN_COPY_2,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,81,33,14
-    CONTROL         "",IDC_PASTE_2,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,
-                    63,97,80,14
-    CONTROL         "Win",IDC_WIN_PASTE_2,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,97,33,14
-    LTEXT           "Copy",IDC_STATIC_COPY_2,19,81,42,14,SS_CENTERIMAGE
-    LTEXT           "Paste",IDC_STATIC_PASTE_2,19,97,43,14,SS_CENTERIMAGE
-    CONTROL         "",IDC_CUT_2,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,
-                    112,80,14
-    CONTROL         "Win",IDC_WIN_CUT_2,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,112,33,14
-    LTEXT           "Cut",IDC_STATIC_CUT_2,19,112,43,14,SS_CENTERIMAGE
-    GROUPBOX        "Copy Buffer 2",IDC_BUFFER_GROUP_2,7,72,273,61
-    CONTROL         "Play Sound on Copy",IDC_PLAY_SOUND_2,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,179,81,80,14
-    CONTROL         "",IDC_COPY_3,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,
-                    63,148,80,14
-    CONTROL         "Win",IDC_WIN_COPY_3,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,148,33,14
-    CONTROL         "",IDC_PASTE_3,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,
-                    63,164,80,14
-    CONTROL         "Win",IDC_WIN_PASTE_3,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,164,33,14
-    LTEXT           "Copy",IDC_STATIC_COPY_3,19,148,42,14,SS_CENTERIMAGE
-    LTEXT           "Paste",IDC_STATIC_PASTE_3,19,164,43,14,SS_CENTERIMAGE
-    CONTROL         "",IDC_CUT_3,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,
-                    179,80,14
-    CONTROL         "Win",IDC_WIN_CUT_3,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,146,179,33,14
-    LTEXT           "Cut",IDC_STATIC_CUT_3,19,179,43,14,SS_CENTERIMAGE
-    GROUPBOX        "Copy Buffer 3",IDC_BUFFER_GROUP_3,7,139,273,61
-    CONTROL         "Play Sound on Copy",IDC_PLAY_SOUND_3,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,179,148,80,14
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 3,16,7,0
- PRODUCTVERSION 3,16,7,0
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904b0"
-        BEGIN
-            VALUE "FileDescription", "Ditto"
-            VALUE "FileVersion", "3, 16, 7, 0"
-            VALUE "InternalName", "CP_Main"
-            VALUE "LegalCopyright", "Copyright (C) 2003"
-            VALUE "OriginalFilename", "Ditto"
-            VALUE "ProductName", "Ditto"
-            VALUE "ProductVersion", "3, 16, 7, 0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1200
-    END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// DESIGNINFO
-//
-
-#ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO 
-BEGIN
-    IDD_ABOUTBOX, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 228
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 48
-    END
-
-    IDD_OPTIONS_UTILITIES, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 234
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 130
-    END
-
-    IDD_OPTIONS_TYPES, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 223
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 165
-    END
-
-    IDD_OPTIONS_QUICK_PASTE, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 353
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 242
-    END
-
-    IDD_OPTIONS_KEYSTROKES, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 343
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 198
-    END
-
-    IDD_OPTIONS_GENERAL, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 344
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 254
-    END
-
-    IDD_SELECT_DB, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 269
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 39
-    END
-
-    IDD_ADD_TYPE, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 286
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 224
-    END
-
-    IDD_COPY_PROPERTIES, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 251
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 213
-    END
-
-    IDD_ABOUT, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 322
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 146
-    END
-
-    IDD_GROUP_NAME, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 179
-        TOPMARGIN, 1
-        BOTTOMMARGIN, 42
-    END
-
-    IDD_OPTIONS_FRIENDS, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 346
-        TOPMARGIN, 4
-        BOTTOMMARGIN, 244
-    END
-
-    IDD_FRIEND_DETAILS, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 196
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 72
-    END
-
-    IDD_MOVE_TO_GROUP, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 247
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 170
-    END
-
-    IDD_DIALOG_REMOTE_FILE, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 277
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 103
-    END
-
-    IDD_OPTIONS_COPY_BUFFERS, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 280
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 243
-    END
-END
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// AVI
-//
-
-IDR_FILE_COPY           AVI                     "res\\FILECOPY.AVI"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// String Table
-//
-
-STRINGTABLE 
-BEGIN
-    IDR_MAINFRAME           "CP_Main\n\nCP_Mai\n\n\nCPMain.Document\nCP_Mai Document"
-END
-
-STRINGTABLE 
-BEGIN
-    AFX_IDS_APP_TITLE       "CP_Main"
-    AFX_IDS_IDLEMESSAGE     "Ready"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_INDICATOR_EXT        "EXT"
-    ID_INDICATOR_CAPS       "CAP"
-    ID_INDICATOR_NUM        "NUM"
-    ID_INDICATOR_SCRL       "SCRL"
-    ID_INDICATOR_OVR        "OVR"
-    ID_INDICATOR_REC        "REC"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_FILE_NEW             "Create a new document\nNew"
-    ID_FILE_OPEN            "Open an existing document\nOpen"
-    ID_FILE_CLOSE           "Close the active document\nClose"
-    ID_FILE_SAVE            "Save the active document\nSave"
-    ID_FILE_SAVE_AS         "Save the active document with a new name\nSave As"
-    ID_FILE_PAGE_SETUP      "Change the printing options\nPage Setup"
-    ID_FILE_PRINT_SETUP     "Change the printer and printing options\nPrint Setup"
-    ID_FILE_PRINT           "Print the active document\nPrint"
-    ID_FILE_PRINT_PREVIEW   "Display full pages\nPrint Preview"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_APP_ABOUT            "Display program information, version number and copyright\nAbout"
-    ID_APP_EXIT             "Quit the application; prompts to save documents\nExit"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_FILE_MRU_FILE1       "Open this document"
-    ID_FILE_MRU_FILE2       "Open this document"
-    ID_FILE_MRU_FILE3       "Open this document"
-    ID_FILE_MRU_FILE4       "Open this document"
-    ID_FILE_MRU_FILE5       "Open this document"
-    ID_FILE_MRU_FILE6       "Open this document"
-    ID_FILE_MRU_FILE7       "Open this document"
-    ID_FILE_MRU_FILE8       "Open this document"
-    ID_FILE_MRU_FILE9       "Open this document"
-    ID_FILE_MRU_FILE10      "Open this document"
-    ID_FILE_MRU_FILE11      "Open this document"
-    ID_FILE_MRU_FILE12      "Open this document"
-    ID_FILE_MRU_FILE13      "Open this document"
-    ID_FILE_MRU_FILE14      "Open this document"
-    ID_FILE_MRU_FILE15      "Open this document"
-    ID_FILE_MRU_FILE16      "Open this document"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_NEXT_PANE            "Switch to the next window pane\nNext Pane"
-    ID_PREV_PANE            "Switch back to the previous window pane\nPrevious Pane"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_WINDOW_SPLIT         "Split the active window into panes\nSplit"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_EDIT_CLEAR           "Erase the selection\nErase"
-    ID_EDIT_CLEAR_ALL       "Erase everything\nErase All"
-    ID_EDIT_COPY            "Copy the selection and put it on the Clipboard\nCopy"
-    ID_EDIT_CUT             "Cut the selection and put it on the Clipboard\nCut"
-    ID_EDIT_FIND            "Find the specified text\nFind"
-    ID_EDIT_PASTE           "Insert Clipboard contents\nPaste"
-    ID_EDIT_REPEAT          "Repeat the last action\nRepeat"
-    ID_EDIT_REPLACE         "Replace specific text with different text\nReplace"
-    ID_EDIT_SELECT_ALL      "Select the entire document\nSelect All"
-    ID_EDIT_UNDO            "Undo the last action\nUndo"
-    ID_EDIT_REDO            "Redo the previously undone action\nRedo"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_VIEW_TOOLBAR         "Show or hide the toolbar\nToggle ToolBar"
-    ID_VIEW_STATUS_BAR      "Show or hide the status bar\nToggle StatusBar"
-END
-
-STRINGTABLE 
-BEGIN
-    AFX_IDS_SCSIZE          "Change the window size"
-    AFX_IDS_SCMOVE          "Change the window position"
-    AFX_IDS_SCMINIMIZE      "Reduce the window to an icon"
-    AFX_IDS_SCMAXIMIZE      "Enlarge the window to full size"
-    AFX_IDS_SCNEXTWINDOW    "Switch to the next document window"
-    AFX_IDS_SCPREVWINDOW    "Switch to the previous document window"
-    AFX_IDS_SCCLOSE         "Close the active window and prompts to save the documents"
-END
-
-STRINGTABLE 
-BEGIN
-    AFX_IDS_SCRESTORE       "Restore the window to normal size"
-    AFX_IDS_SCTASKLIST      "Activate Task List"
-END
-
-STRINGTABLE 
-BEGIN
-    AFX_IDS_PREVIEW_CLOSE   "Close print preview mode\nCancel Preview"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_BUTTON_SAVE          "Save /t Ctrl - S"
-    ID_BUTTON_SAVE_ALL      "Save All /t Ctrl-Shift-S"
-END
-
-STRINGTABLE 
-BEGIN
-    ID_BUTTON_CLOSE         "Close /t Escape"
-END
-
-#endif    // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-#define _AFX_NO_SPLITTER_RESOURCES
-#define _AFX_NO_OLE_RESOURCES
-#define _AFX_NO_TRACKER_RESOURCES
-#define _AFX_NO_PROPERTY_RESOURCES
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE 9, 1
-#pragma code_page(1252)
-#endif //_WIN32
-#include "res\CP_Main.rc2"  // non-Microsoft Visual C++ edited resources
-#include "afxres.rc"         // Standard components
-#include "afxprint.rc"       // printing/print preview resources
-#endif
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
+    "#define _AFX_NO_OLE_RESOURCES\r\n"
+    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
+    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
+    "\r\n"
+    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
+    "#ifdef _WIN32\r\n"
+    "LANGUAGE 9, 1\r\n"
+    "#pragma code_page(1252)\r\n"
+    "#endif //_WIN32\r\n"
+    "#include ""res\\CP_Main.rc2""  // non-Microsoft Visual C++ edited resources\r\n"
+    "#include ""afxres.rc""         // Standard components\r\n"
+    "#include ""afxprint.rc""       // printing/print preview resources\r\n"
+    "#endif\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDR_MAINFRAME           ICON                    "res\\Ditto.ico"
+IDR_CP_MAITYPE          ICON                    "res\\CP_MainDoc.ico"
+IDI_DITTO_NOCOPYCB      ICON                    "res\\Ditto_NoCopyCb.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDR_MAINFRAME           BITMAP                  "res\\Toolbar.bmp"
+IDB_CLOSED_FOLDER       BITMAP                  "res\\bitmap1.bmp"
+IDB_CLOSED_FOLDER_PRESSED BITMAP                  "res\\closed_f.bmp"
+IDB_CLOSED_FOLDER_FOCUSED BITMAP                  "res\\bmp00001.bmp"
+IDB_OPEN_FOLDER         BITMAP                  "res\\bmp00002.bmp"
+IDB_OPEN_FOLDER_FOCUSED BITMAP                  "res\\open_fol.bmp"
+IDB_OPEN_FOLDER_PRESSED BITMAP                  "res\\bmp00003.bmp"
+IDB_BACK                BITMAP                  "res\\back.bmp"
+IDB_BACK_PRESSED        BITMAP                  "res\\back1.bmp"
+IDB_BACK_FOCUSED        BITMAP                  "res\\back2.bmp"
+IDR_EDIT_WND            BITMAP                  "res\\mainfram.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Toolbar
+//
+
+IDR_MAINFRAME TOOLBAR 16, 15
+BEGIN
+    BUTTON      ID_FILE_NEW
+    BUTTON      ID_FILE_OPEN
+    BUTTON      ID_FILE_SAVE
+    SEPARATOR
+    BUTTON      ID_EDIT_CUT
+    BUTTON      ID_EDIT_COPY
+    BUTTON      ID_EDIT_PASTE
+    SEPARATOR
+    BUTTON      ID_FILE_PRINT
+    SEPARATOR
+    BUTTON      ID_APP_ABOUT
+END
+
+IDR_EDIT_WND TOOLBAR 16, 15
+BEGIN
+    BUTTON      ID_BUTTON_NEW
+    SEPARATOR
+    BUTTON      ID_BUTTON_SAVE
+    BUTTON      ID_BUTTON_SAVE_ALL
+    SEPARATOR
+    BUTTON      ID_BUTTON_SAVE_CLOSE_CLIPBOARD
+    SEPARATOR
+    BUTTON      ID_BUTTON_CLOSE
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_MAINFRAME MENU
+BEGIN
+    POPUP "&File"
+    BEGIN
+        MENUITEM "&New\tCtrl+N",                ID_FILE_NEW
+        MENUITEM "&Open...\tCtrl+O",            ID_FILE_OPEN
+        MENUITEM "&Save\tCtrl+S",               ID_FILE_SAVE
+        MENUITEM "Save &As...",                 ID_FILE_SAVE_AS
+        MENUITEM SEPARATOR
+        MENUITEM "&Print...\tCtrl+P",           ID_FILE_PRINT
+        MENUITEM "Print Pre&view",              ID_FILE_PRINT_PREVIEW
+        MENUITEM "P&rint Setup...",             ID_FILE_PRINT_SETUP
+        MENUITEM SEPARATOR
+        MENUITEM "Recent File",                 ID_FILE_MRU_FILE1, GRAYED
+        MENUITEM SEPARATOR
+        MENUITEM "E&xit",                       ID_APP_EXIT
+    END
+    POPUP "&Edit"
+    BEGIN
+        MENUITEM "&Undo\tCtrl+Z",               ID_EDIT_UNDO
+        MENUITEM SEPARATOR
+        MENUITEM "Cu&t\tCtrl+X",                ID_EDIT_CUT
+        MENUITEM "&Copy\tCtrl+C",               ID_EDIT_COPY
+        MENUITEM "&Paste\tCtrl+V",              ID_EDIT_PASTE
+    END
+    POPUP "&View"
+    BEGIN
+        MENUITEM "&Toolbar",                    ID_VIEW_TOOLBAR
+        MENUITEM "&Status Bar",                 ID_VIEW_STATUS_BAR
+    END
+    POPUP "&Help"
+    BEGIN
+        MENUITEM "&About CP_Main...",           ID_APP_ABOUT
+    END
+END
+
+IDR_MENU MENU
+BEGIN
+    POPUP "First"
+    BEGIN
+        MENUITEM "Show Quick Paste",            ID_FIRST_SHOWQUICKPASTE
+        MENUITEM "Options",                     ID_FIRST_OPTION
+        MENUITEM SEPARATOR
+        MENUITEM "Import",                      ID_FIRST_IMPORT
+        MENUITEM "New Clip",                    ID_FIRST_NEWCLIP
+        MENUITEM SEPARATOR
+        MENUITEM "Help",                        ID_FIRST_HELP
+        MENUITEM SEPARATOR
+        MENUITEM "Connect To Clipboard",        ID_FIRST_TOGGLECONNECTCV
+        MENUITEM SEPARATOR
+        MENUITEM "Exit",                        ID_FIRST_EXIT
+    END
+END
+
+IDR_QUICK_PASTE MENUEX
+BEGIN
+    POPUP "Menu",                           65535,MFT_STRING,MFS_ENABLED
+    BEGIN
+        POPUP "Groups",                         65535,MFT_STRING,MFS_ENABLED
+        BEGIN
+            MENUITEM "New Group",                   32811,MFT_STRING,MFS_ENABLED
+            MENUITEM "New Group Selection",         32812,MFT_STRING,MFS_ENABLED
+            MENUITEM "Move to Group",               32840,MFT_STRING,MFS_ENABLED
+        END
+        POPUP "Quick Options",                  65535,MFT_STRING,MFS_ENABLED
+        BEGIN
+            POPUP "Lines Per Row",                  65535,MFT_STRING,MFS_ENABLED
+            BEGIN
+                MENUITEM "1",                           32807,MFT_STRING,MFS_ENABLED
+                MENUITEM "2",                           32786,MFT_STRING,MFS_ENABLED
+                MENUITEM "3",                           32787,MFT_STRING,MFS_ENABLED
+                MENUITEM "4",                           32788,MFT_STRING,MFS_ENABLED
+                MENUITEM "5",                           32789,MFT_STRING,MFS_ENABLED
+            END
+            POPUP "Transparency",                   65535,MFT_STRING,MFS_ENABLED
+            BEGIN
+                MENUITEM "None",                        32800,MFT_STRING,MFS_ENABLED
+                MENUITEM "5 %",                         32808,MFT_STRING,MFS_ENABLED
+                MENUITEM "10 %",                        32792,MFT_STRING,MFS_ENABLED
+                MENUITEM "15 %",                        32794,MFT_STRING,MFS_ENABLED
+                MENUITEM "20 %",                        32796,MFT_STRING,MFS_ENABLED
+                MENUITEM "25 %",                        32798,MFT_STRING,MFS_ENABLED
+                MENUITEM "30 %",                        32799,MFT_STRING,MFS_ENABLED
+                MENUITEM "40 %",                        32790,MFT_STRING,MFS_ENABLED
+            END
+            POPUP "Positioning",                    65535,MFT_STRING,MFS_ENABLED
+            BEGIN
+                MENUITEM "At Caret",                    32802,MFT_STRING,MFS_ENABLED
+                MENUITEM "At Cursor",                   32803,MFT_STRING,MFS_ENABLED
+                MENUITEM "At Previous Position",        32804,MFT_STRING,MFS_ENABLED
+            END
+            POPUP "First Ten Hot Keys",             65535,MFT_STRING,MFS_ENABLED
+            BEGIN
+                MENUITEM "Use Ctrl - Num",              32777,MFT_STRING,MFS_ENABLED
+                MENUITEM "Show Hot Key Text",           32778,MFT_STRING,MFS_ENABLED
+            END
+            POPUP "View Caption Bar On",            65535,MFT_STRING,MFS_ENABLED
+            BEGIN
+                MENUITEM "Top",                         32783,MFT_STRING,MFS_ENABLED
+                MENUITEM "Right",                       32780,MFT_STRING,MFS_ENABLED
+                MENUITEM "Bottom",                      32781,MFT_STRING,MFS_ENABLED
+                MENUITEM "Left",                        32782,MFT_STRING,MFS_ENABLED
+            END
+            POPUP "Sort",                           65535,MFT_STRING,MFS_ENABLED
+            BEGIN
+                MENUITEM "Ascending (Latest on the Top)", 32795,MFT_STRING,MFS_ENABLED
+                MENUITEM "Descending (Latest on the Bottom)", 32797,MFT_STRING,MFS_ENABLED
+            END
+            POPUP "Double Clicking on Caption",     65535,MFT_STRING,MFS_ENABLED
+            BEGIN
+                MENUITEM "Toggles Always on Top",       32814,MFT_STRING,MFS_ENABLED
+                MENUITEM "Rolls-up Window",             32815,MFT_STRING,MFS_ENABLED
+                MENUITEM "Toggles Always Show Description", 32816,MFT_STRING,MFS_ENABLED
+            END
+            MENUITEM "Always on Top",               32784,MFT_STRING,MFS_ENABLED
+            MENUITEM "Auto Roll-up",                32791,MFT_STRING,MFS_ENABLED
+            MENUITEM "Always Show Description",     32813,MFT_STRING,MFS_ENABLED
+            MENUITEM "Prompt For New Group Names",  32817,MFT_STRING,MFS_ENABLED
+            MENUITEM "Select Font",                 32844,MFT_STRING,MFS_ENABLED
+            MENUITEM "Show Thumbnails",             32845,MFT_STRING,MFS_ENABLED
+            MENUITEM "Draw RTF Text",               32846,MFT_STRING,MFS_ENABLED
+            MENUITEM "Paste Clip after selection",  32847,MFT_STRING,MFS_ENABLED
+            MENUITEM "Find As You Type",            32848,MFT_STRING,MFS_ENABLED
+            MENUITEM "Ensure Entire Window Is Visible", 32849,MFT_STRING,MFS_ENABLED
+            MENUITEM "Show Clips That are in Groups in Main List", 32850,MFT_STRING,MFS_ENABLED
+            MENUITEM "Prompt to Delete Clip",       32852,MFT_STRING,MFS_ENABLED
+        END
+        POPUP "Sent To",                        65535,MFT_STRING,MFS_ENABLED
+        BEGIN
+            MENUITEM "Friend One",                  32824,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Two",                  32825,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Three",                32826,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Fore",                 32827,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Five",                 32828,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Six",                  32829,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Seven",                32830,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Eight",                32831,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Nine",                 32832,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Ten",                  32833,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Eleven",               32834,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Twelve",               32835,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Thirteen",             32836,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Foreteen",             32837,MFT_STRING,MFS_ENABLED
+            MENUITEM "Friend Fifteen",              32838,MFT_STRING,MFS_ENABLED
+            MENUITEM "Prompt for IP",               32839,MFT_STRING,MFS_ENABLED
+        END
+        MENUITEM "View Full Description",       32793,MFT_STRING,MFS_ENABLED
+        MENUITEM "View Groups",                 32819,MFT_STRING,MFS_ENABLED
+        MENUITEM "Paste Plain Text Only",       32841,MFT_STRING,MFS_ENABLED
+        MENUITEM MFT_SEPARATOR
+        MENUITEM "Delete Entry",                32801,MFT_STRING,MFS_ENABLED
+        MENUITEM MFT_SEPARATOR
+        MENUITEM "Edit Clip",                   32860,MFT_STRING,MFS_ENABLED
+        MENUITEM "New Clip",                    32867,MFT_STRING,MFS_ENABLED
+        MENUITEM MFT_SEPARATOR
+        MENUITEM "Properties",                  32776,MFT_STRING,MFS_ENABLED
+        POPUP "Quick Properties",               65535,MFT_STRING,MFS_ENABLED
+        BEGIN
+            MENUITEM "Never Auto Delete",           32820,MFT_STRING,MFS_ENABLED
+            MENUITEM "Auto Delete",                 32821,MFT_STRING,MFS_ENABLED
+            MENUITEM "Remove Hot Key",              32822,MFT_STRING,MFS_ENABLED
+            MENUITEM "Remove Quick Paste",          32856,MFT_STRING | MFT_RIGHTJUSTIFY,MFS_ENABLED
+        END
+        MENUITEM MFT_SEPARATOR
+        MENUITEM "Import",                      32855,MFT_STRING,MFS_ENABLED
+        MENUITEM "Export",                      32853,MFT_STRING,MFS_ENABLED
+        MENUITEM MFT_SEPARATOR
+        MENUITEM "Options...",                  32805,MFT_STRING,MFS_ENABLED
+        MENUITEM MFT_SEPARATOR
+        MENUITEM "Help",                        32842,MFT_STRING,MFS_ENABLED
+        MENUITEM MFT_SEPARATOR
+        MENUITEM "Connect To Clipboard",        32775,MFT_STRING,MFS_ENABLED
+        MENUITEM MFT_SEPARATOR
+        MENUITEM "Exit Program",                32806,MFT_STRING,MFS_ENABLED
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDR_MAINFRAME ACCELERATORS
+BEGIN
+    "N",            ID_FILE_NEW,            VIRTKEY, CONTROL
+    "O",            ID_FILE_OPEN,           VIRTKEY, CONTROL
+    "S",            ID_FILE_SAVE,           VIRTKEY, CONTROL
+    "P",            ID_FILE_PRINT,          VIRTKEY, CONTROL
+    "Z",            ID_EDIT_UNDO,           VIRTKEY, CONTROL
+    "X",            ID_EDIT_CUT,            VIRTKEY, CONTROL
+    "C",            ID_EDIT_COPY,           VIRTKEY, CONTROL
+    "V",            ID_EDIT_PASTE,          VIRTKEY, CONTROL
+    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT
+    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT
+    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL
+    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT
+    VK_F6,          ID_NEXT_PANE,           VIRTKEY 
+    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "About CP_Main"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20
+    LTEXT           "CP_Main Version 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX
+    LTEXT           "Copyright (C) 2002",IDC_STATIC,40,25,119,8
+    DEFPUSHBUTTON   "OK",IDOK,178,7,50,14,WS_GROUP
+END
+
+IDD_OPTIONS_UTILITIES DIALOGEX 0, 0, 241, 137
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Database"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    PUSHBUTTON      "Compact Database",IDC_COMPACT_DB,14,18,107,14
+    PUSHBUTTON      "Repair Database",IDC_REPAIR,14,37,107,14
+    EDITTEXT        IDC_PATH,14,67,198,12,ES_AUTOHSCROLL
+    PUSHBUTTON      "....",IDC_GET_PATH,214,67,14,12
+    LTEXT           "Database Path:",IDC_STATIC,14,56,50,8
+END
+
+IDD_OPTIONS_TYPES DIALOGEX 0, 0, 230, 172
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Supported Types"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    LISTBOX         IDC_LIST1,7,7,129,158,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "&Add",IDC_ADD,147,10,50,14
+    PUSHBUTTON      "&Delete",IDC_DELETE,147,30,50,14
+END
+
+IDD_OPTIONS_QUICK_PASTE DIALOGEX 0, 0, 360, 250
+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         "History Starts at the Top of the list (vs. Bottom)",IDC_HISTORY_START_TOP,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,8,335,10
+    CONTROL         "Use Ctrl - Num for first ten copy hot keys",IDC_CTRL_CLICK,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,19,335,10
+    CONTROL         "Show text for first ten copy hot keys",IDC_SHOW_TEXT_FOR_FIRST_TEN_HOT_KEYS,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,30,335,10
+    CONTROL         "Show leading whitespace",IDC_DESC_SHOW_LEADING_WHITESPACE,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,41,335,10
+    LTEXT           "Text Lines per Row",IDC_STATIC_LINES,18,54,93,8
+    EDITTEXT        IDC_LINES_ROW,114,52,19,12,ES_AUTOHSCROLL
+    CONTROL         "Enable Quick Paste Transparency",IDC_TRANSPARENCY,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,67,155,10
+    EDITTEXT        IDC_TRANS_PERC,177,66,19,12,ES_AUTOHSCROLL
+    PUSHBUTTON      "Font",IDC_BUTTON_FONT,18,160,143,17
+    PUSHBUTTON      "Default Font",IDC_BUTTON_DEFAULT_FAULT,164,163,70,12
+    CONTROL         "At Caret",IDC_AT_CARET,"Button",BS_AUTORADIOBUTTON,22,195,93,10
+    CONTROL         "At Cursor",IDC_AT_CURSOR,"Button",BS_AUTORADIOBUTTON,22,205,97,10
+    CONTROL         "At Previous Position",IDC_AT_PREVIOUS,"Button",BS_AUTORADIOBUTTON,22,215,117,10
+    LTEXT           "%",IDC_STATIC,199,66,8,12,SS_CENTERIMAGE
+    GROUPBOX        "Popup Positioning",IDC_STATIC_POPUP,10,186,138,41
+    LTEXT           "  * = Don't Auto Delete\n  s = Shortcut exists\n G = Item is a Group\n  ! = Item is attached to a Group",IDC_STATIC_LEG,158,196,154,36
+    GROUPBOX        "List Item Prefix Legend",IDC_STATIC_LEGEND,153,186,165,50
+    CONTROL         "Show thumbnails (for CF_DIB types) (Could Increase Memory Usage and Display Speed)",IDC_SHOW_THUMBNAILS,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,79,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,18,89,335,10
+    CONTROL         "Find As You Type",IDC_CHECK_FIND_AS_YOU_TYPE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,99,335,10
+    CONTROL         "Ensure Entire Window is Visible",IDC_CHECK_ENTIRE_WINDOW_IS_VISIBLE,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,109,335,10
+    CONTROL         "Show Clips That are in Groups in Main List",IDC_CHECK_SHOW_ALL_IN_MAIN_LIST,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,119,335,10
+    CONTROL         "Prompt when deleting clips",IDC_CHECK_PROMPT_DELETE_CLIP,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,128,335,10
+    LTEXT           "Theme",IDC_STATIC_THEME,18,142,36,12,SS_CENTERIMAGE
+    COMBOBOX        IDC_COMBO_THEME,59,142,130,95,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "About Theme",IDC_BUTTON_THEME,198,142,106,12
+END
+
+IDD_OPTIONS_KEYSTROKES DIALOGEX 0, 0, 350, 206
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Keyboard Shortcuts"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    CONTROL         "HotKey1",IDC_HOTKEY,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,91,13,80,14
+    CONTROL         "Win",IDC_CHECK_WIN_DITTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,13,33,14
+    CONTROL         "HotKey1",IDC_NAMED_COPY,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,91,29,80,14
+    CONTROL         "Win",IDC_CHECK_WIN_NAMED_COPY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,29,33,14
+    CONTROL         "HotKey1",IDC_HOTKEY1,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,66,88,80,14
+    CONTROL         "Win",IDC_CHECK_WIN1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,88,33,14
+    CONTROL         "HotKey1",IDC_HOTKEY2,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,66,103,80,14
+    CONTROL         "Win",IDC_CHECK_WIN2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,103,33,14
+    CONTROL         "HotKey1",IDC_HOTKEY3,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,66,118,80,14
+    CONTROL         "Win",IDC_CHECK_WIN3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,118,33,14
+    CONTROL         "HotKey1",IDC_HOTKEY4,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,66,133,80,14
+    CONTROL         "Win",IDC_CHECK_WIN4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,133,33,14
+    CONTROL         "HotKey1",IDC_HOTKEY5,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,66,148,80,14
+    CONTROL         "Win",IDC_CHECK_WIN5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,148,33,14
+    CONTROL         "HotKey1",IDC_HOTKEY6,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,229,88,80,14
+    CONTROL         "Win",IDC_CHECK_WIN6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,309,88,27,14
+    CONTROL         "HotKey1",IDC_HOTKEY7,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,229,103,80,14
+    CONTROL         "Win",IDC_CHECK_WIN7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,309,103,26,14
+    CONTROL         "HotKey1",IDC_HOTKEY8,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,229,118,80,14
+    CONTROL         "Win",IDC_CHECK_WIN8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,310,118,26,14
+    CONTROL         "HotKey1",IDC_HOTKEY9,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,229,133,80,14
+    CONTROL         "Win",IDC_CHECK_WIN9,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,309,133,27,14
+    CONTROL         "HotKey1",IDC_HOTKEY10,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,229,148,80,14
+    CONTROL         "Win",IDC_CHECK_WIN10,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,309,148,27,14
+    GROUPBOX        "Global Hot Keys for Last Ten Items Copied",IDC_STATIC_GROUP,7,64,336,105
+    CONTROL         "Send Paste (Otherwise it will just load the item on the clipboard)",IDC_CHECK_SEND_PASTE,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,74,324,13
+    LTEXT           "Activate Ditto",IDC_STATIC_ACTIVATE,19,13,71,14,SS_CENTERIMAGE
+    LTEXT           "Named Copy",IDC_STATIC_NAMED_COPY,19,29,70,14,SS_CENTERIMAGE
+    RTEXT           "Position 1",IDC_STATIC_1,16,88,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 2",IDC_STATIC_2,16,103,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 3",IDC_STATIC_3,16,118,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 4",IDC_STATIC_4,16,133,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 5",IDC_STATIC_5,16,148,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 6",IDC_STATIC_6,181,88,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 7",IDC_STATIC_7,181,103,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 8",IDC_STATIC_8,181,118,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 9",IDC_STATIC_9,181,133,42,14,SS_CENTERIMAGE
+    RTEXT           "Position 10",IDC_STATIC_10,181,148,42,14,SS_CENTERIMAGE
+    LTEXT           "Check the ""Win"" Button to include the windows keyboard key in your hot key.",IDC_STATIC_WIN,7,173,336,25
+    CONTROL         "HotKey1",IDC_NAMED_PASTE,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,91,44,80,14
+    CONTROL         "Win",IDC_CHECK_WIN_NAMED_PASTE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,44,33,14
+    LTEXT           "Named Paste",IDC_STATIC_NAMED_COPY2,19,44,69,14,SS_CENTERIMAGE
+    LTEXT           "Send custom strokes Per Application",IDC_STATIC_CUSTOM_KEYS,210,16,133,8
+END
+
+IDD_OPTIONS_GENERAL DIALOGEX 0, 0, 351, 259
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "General"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+    CONTROL         "Start Ditto on System Startup",IDC_START_ON_STARTUP,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,15,138,10
+    CONTROL         "Display Icon in System Tray",IDC_DISPLAY_IN_SYSTEMTRAY,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,28,321,10
+    CONTROL         "Maximum Number of Saved Copies",IDC_MAXIMUM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,41,144,10
+    EDITTEXT        IDC_MAX_SAVED_COPIES,167,41,27,12,ES_AUTOHSCROLL
+    CONTROL         "Paste Entries Expire after",IDC_EXPIRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,54,140,10
+    EDITTEXT        IDC_EXPIRE_AFTER,167,53,27,12,ES_AUTOHSCROLL
+    LTEXT           "Days",IDC_STATIC_DAYS,201,53,51,12,SS_CENTERIMAGE
+    PUSHBUTTON      "Compact and Repair Database",IDC_BT_COMPACT_AND_REPAIR,170,14,105,11
+    CONTROL         "Set Database Path",IDC_SET_DB_PATH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,79,320,10
+    EDITTEXT        IDC_PATH,23,89,248,12,ES_AUTOHSCROLL
+    PUSHBUTTON      "....",IDC_GET_PATH,272,89,14,12
+    CONTROL         "Automatically check for updates online",IDC_CHECK_UPDATES,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,106,173,10
+    PUSHBUTTON      "Check Now",IDC_CHECK_FOR_UPDATES,201,106,86,11
+    CONTROL         "Allow Duplicates",IDC_ALLOW_DUPLICATES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,118,320,10
+    CONTROL         "Update Clip Time On Paste",IDC_UPDATE_TIME_ON_PASTE,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,130,321,10
+    CONTROL         "Save Multi-Pastes",IDC_SAVE_MULTIPASTE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,142,321,10
+    CONTROL         "Hide Ditto on Hot Key if Ditto is Visible",IDC_HIDE_DITO_ON_HOT_KEY,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,153,322,10
+    LTEXT           "Amount of text to save for description",IDC_STATIC_AMOUNT,23,165,177,8
+    EDITTEXT        IDC_DESC_TEXT_SIZE,206,163,35,12,ES_AUTOHSCROLL
+    LTEXT           "On copy play the sound",IDC_STATIC_SOUND,23,177,139,10
+    EDITTEXT        IDC_EDIT_PLAY_SOUND,167,177,115,12,ES_AUTOHSCROLL
+    PUSHBUTTON      "Play",IDC_BUTTON_PLAY,285,177,35,12
+    PUSHBUTTON      "....",IDC_SELECT_SOUND,323,177,14,12
+    CONTROL         "Paste Clip in active window after selection",IDC_SEND_PASTE_MESSAGE,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,190,318,10
+    LTEXT           "Maximum Clip Size in Bytes",IDC_STATIC_MAX_SIZE,23,202,137,8
+    EDITTEXT        IDC_EDIT_MAX_SIZE,164,200,59,12,ES_AUTOHSCROLL
+    LTEXT           "(Leave blank for no limit)",IDC_STATIC_NO_LIMIT,232,202,112,8
+    LTEXT           "Lanuage",IDC_STATIC_LANGUAGE,23,65,36,12,SS_CENTERIMAGE
+    COMBOBOX        IDC_COMBO_LANGUAGE,65,65,130,95,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "Ignore copies that occur X milliseconds from the last copy (1000 ms = 1 sec)",IDC_STATIC_SAVE_DELAY,23,215,278,11
+    EDITTEXT        IDC_EDIT_SAVE_DELAY,306,214,38,12,ES_AUTOHSCROLL
+    PUSHBUTTON      "About Language",IDC_BUTTON_ABOUT,204,65,106,12
+    CONTROL         "Ensure Ditto is always connected to the clipboard",IDC_ENSURE,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,228,306,10
+    LTEXT           "Multi-Paste clip separator ([LF] = line feed)",IDC_STATIC_CLIP_SEPARATOR,23,242,161,8
+    EDITTEXT        IDC_EDIT_CLIP_SEPARATOR,187,240,106,12,ES_AUTOHSCROLL
+END
+
+IDD_SELECT_DB DIALOGEX 0, 0, 276, 46
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
+CAPTION "Select Database"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,101,25,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,170,25,50,14
+    EDITTEXT        IDC_PATH,7,7,244,13,ES_AUTOHSCROLL
+    PUSHBUTTON      "...",IDC_SELECT,254,7,15,12
+    PUSHBUTTON      "Use Default",IDC_USE_DEFAULT,27,25,50,14
+END
+
+IDD_OPTIONS_STATS DIALOGEX 0, 0, 346, 207
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Stats"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    EDITTEXT        IDC_EDIT_ALL_DATE,13,17,133,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_ALL_COPIES,65,31,25,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_ALL_PASTES,65,45,25,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_TRIP_DATE,174,17,123,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_TRIP_COPIES,222,31,25,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_TRIP_PASTES,222,45,25,12,ES_AUTOHSCROLL
+    PUSHBUTTON      "Reset",IDC_RESET_COUNTS,253,31,44,12
+    EDITTEXT        IDC_SAVED_COPIES,99,72,41,12,ES_AUTOHSCROLL
+    PUSHBUTTON      "Remove All",IDC_REMOVE_ALL,145,72,62,12
+    EDITTEXT        IDC_SAVED_COPY_DATA,99,86,41,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_LAST_STARTED,99,115,157,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_DATABASE_SIZE,99,129,41,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_CLIPS_SENT,99,143,41,12,ES_AUTOHSCROLL
+    EDITTEXT        IDC_CLIPS_RECIVED,99,157,41,12,ES_AUTOHSCROLL
+    LTEXT           "Copies",IDC_STATIC_5,174,31,45,12,SS_CENTERIMAGE
+    LTEXT           "Pastes",IDC_STATIC_6,174,45,46,12,SS_CENTERIMAGE
+    GROUPBOX        "Trip Odometer",IDC_STATIC_2,170,7,135,54
+    LTEXT           "Copies",IDC_STATIC_3,13,31,49,12,SS_CENTERIMAGE
+    LTEXT           "Pastes",IDC_STATIC_4,13,45,50,12,SS_CENTERIMAGE
+    GROUPBOX        "Odometer",IDC_STATIC_1,7,7,145,54
+    LTEXT           "Saved Copies",IDC_STATIC_7,15,72,76,12,SS_CENTERIMAGE
+    LTEXT           "Saved Copy Data",IDC_STATIC_8,15,88,80,18
+    LTEXT           "Database Size",IDC_STATIC_10,15,129,79,12,SS_CENTERIMAGE
+    LTEXT           "Clips Sent",IDC_STATIC_11,15,143,79,12,SS_CENTERIMAGE
+    LTEXT           "Clips Received",IDC_STATIC_12,15,157,79,12,SS_CENTERIMAGE
+    GROUPBOX        "",IDC_STATIC,7,63,206,47
+    LTEXT           "Last Started",IDC_STATIC_9,15,115,79,12,SS_CENTERIMAGE
+    LTEXT           "Since Last Start",IDC_STATIC_13,145,152,100,8
+END
+
+IDD_ADD_TYPE DIALOG 0, 0, 293, 231
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Add Supported Type"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    PUSHBUTTON      "Cancel",IDCANCEL,236,210,50,14
+    LISTBOX         IDC_LIST1,7,15,113,174,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
+    EDITTEXT        IDC_EDIT1,135,15,91,14,ES_AUTOHSCROLL
+    LISTBOX         IDC_LIST2,135,43,97,146,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "Add",IDC_ADD_1,7,191,44,11
+    PUSHBUTTON      "Add",IDC_ADD_2,231,15,44,11
+    PUSHBUTTON      "Add",IDC_ADD_3,130,191,44,11
+    LTEXT           "Custom Type",IDC_STATIC_2,135,7,81,8
+    LTEXT           "Currently on the Clipboard",IDC_STATIC_3,135,35,132,8
+    LTEXT           "Main Types",IDC_STATIC_1,7,7,80,8
+END
+
+IDD_COPY_PROPERTIES DIALOGEX 0, 0, 258, 220
+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,44,7,82,13
+    EDITTEXT        IDC_DATE,165,7,86,13,ES_AUTOHSCROLL | NOT WS_TABSTOP
+    COMBOBOX        IDC_COMBO1,77,39,174,128,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    EDITTEXT        IDC_EDIT_QUICK_PASTE,77,56,174,13,ES_AUTOHSCROLL
+    CONTROL         "",IDC_RICHEDIT1,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_FOCUSONBUTTONDOWN | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,79,244,62
+    DEFPUSHBUTTON   "OK",IDOK,148,199,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,201,199,50,14
+    CONTROL         "&Never Auto Delete",IDC_NEVER_AUTO_DELETE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,23,149,10
+    LISTBOX         IDC_COPY_DATA,7,153,244,43,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "Delete",IDC_DELETE_COPY_DATA,7,201,42,12
+    LTEXT           "Item Title",IDC_STATIC_TITLE,7,68,168,8
+    RTEXT           "Date",IDC_STATIC_DATE,131,7,31,13,SS_CENTERIMAGE
+    LTEXT           "Hot Key",IDC_STATIC_HOT_KEY,7,7,35,13,SS_CENTERIMAGE
+    LTEXT           "Copy Formats",IDC_STATIC_FORMATS,7,142,226,8
+    LTEXT           "Move To Group",IDC_STATIC_MOVE_TO_GROUP,8,40,67,9
+    LTEXT           "Quick Paste Text",IDC_STATIC,7,56,62,13,SS_CENTERIMAGE
+END
+
+IDD_ABOUT DIALOGEX 0, 0, 329, 153
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "About"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+    LISTBOX         IDC_LIST,7,16,315,86,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
+    LTEXT           "E-mail Scott Brogden",IDC_HYPER_LINK,7,108,67,8
+    LTEXT           "Ditto Home Page - ditto-cp.sf.net",IDC_STATIC_LINK,7,126,104,8
+END
+
+IDD_GROUP_NAME DIALOGEX 0, 0, 186, 49
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Ditto"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,75,28,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,129,28,50,14
+    LTEXT           "Name",IDC_STATIC,7,1,59,10
+    EDITTEXT        IDC_NAME,7,11,172,12,ES_AUTOHSCROLL
+END
+
+IDD_OPTIONS_FRIENDS DIALOGEX 0, 0, 353, 247
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Friends"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    CONTROL         "List1",IDC_LIST,"SysListView32",LVS_REPORT | WS_BORDER | WS_TABSTOP,7,159,339,68
+    LTEXT           "If Send All Copies is selected then all copies from this computer will be sent to the other computer.  If that is not selected then it will just be in the right click menu to send a copy to that computer.",IDC_STATIC_6,7,126,339,28
+    EDITTEXT        IDC_EDIT_PLACE_ON_CLIPBOARD,96,39,210,13,ES_AUTOHSCROLL
+    LTEXT           "IP/Computer Names seperated by commas",IDC_STATIC_2,7,37,84,17
+    LTEXT           "When you recieve a sent copy if their ip or computer name is in this list then it will be put on the clipboard.  Otherwise it will be in the saved clips to use at a later time.",IDC_STATIC_1,7,10,339,26
+    CONTROL         "Log Send Receive Commands",IDC_CHECK_LOG_SEND_RECIEVE,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,232,339,12
+    CONTROL         "Disable Recieving Clips",IDC_CHECK_DISABLE_FRIENDS,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,95,53,146,10
+    LTEXT           "Network Password",IDC_STATIC_3,7,69,79,9
+    EDITTEXT        IDC_EDIT_PASSWORD,96,66,210,13,ES_AUTOHSCROLL
+    EDITTEXT        IDC_EDIT_ADDITIONAL,95,110,210,12,ES_AUTOHSCROLL
+    LTEXT           "If you are receiving clips from computers where your network password does not match, enter additional network passwords separated by commas",IDC_STATIC_4,7,83,339,22
+    LTEXT           "Receive Passwords",IDC_STATIC_5,7,112,79,9
+END
+
+IDD_FRIEND_DETAILS DIALOGEX 0, 0, 203, 79
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Friend Details"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,89,58,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,146,58,50,14
+    CONTROL         "Send All Copies to this friend",IDC_CHECK_SEND_ALL,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,47,7,105,10
+    LTEXT           "IP/Name",IDC_STATIC_1,7,23,30,8
+    EDITTEXT        IDC_EDIT_IP,47,20,83,13,ES_AUTOHSCROLL
+    LTEXT           "Description",IDC_STATIC_2,7,41,36,8
+    EDITTEXT        IDC_EDIT_DESCRIPTION,47,39,149,13,ES_AUTOHSCROLL
+END
+
+IDD_MOVE_TO_GROUP DIALOGEX 0, 0, 254, 177
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Move to Group"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    CONTROL         "Tree1",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,240,142
+    PUSHBUTTON      "New Group",IDC_BUTTON_NEW_GROUP,7,156,55,14
+    DEFPUSHBUTTON   "OK",IDOK,143,156,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,197,156,50,14
+END
+
+IDD_DIALOG_REMOTE_FILE DIALOGEX 0, 0, 284, 110
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Ditto"
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+    PUSHBUTTON      "Cancel",IDCANCEL,227,89,50,14
+    CONTROL         "Progress1",IDC_PROGRESS_FILE,"msctls_progress32",PBS_SMOOTH | WS_BORDER,7,78,270,9
+    CONTROL         "Progress1",IDC_PROGRESS_ALL_FILES,"msctls_progress32",PBS_SMOOTH | WS_BORDER,7,45,270,9
+    LTEXT           "a",IDC_STATIC_1,7,33,270,10,SS_CENTERIMAGE
+    LTEXT           "",IDC_STATIC_2,7,59,270,16,SS_CENTERIMAGE
+    CONTROL         "Animate1",IDC_FILE_COPY,"SysAnimate32",ACS_CENTER | ACS_TRANSPARENT | WS_TABSTOP,7,3,270,26
+END
+
+IDD_OPTIONS_COPY_BUFFERS DIALOGEX 0, 0, 287, 250
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Copy Buffers"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    CONTROL         "",IDC_COPY_1,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,16,80,14
+    CONTROL         "Win",IDC_WIN_COPY_1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,16,33,14
+    CONTROL         "",IDC_PASTE_1,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,32,80,14
+    CONTROL         "Win",IDC_WIN_PASTE_1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,32,33,14
+    LTEXT           "Copy",IDC_STATIC_COPY_1,19,16,42,14,SS_CENTERIMAGE
+    LTEXT           "Paste",IDC_STATIC_PASTE_1,19,32,43,14,SS_CENTERIMAGE
+    CONTROL         "",IDC_CUT_1,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,47,80,14
+    CONTROL         "Win",IDC_WIN_CUT_1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,47,33,14
+    LTEXT           "Cut",IDC_STATIC_CUT_1,19,47,43,14,SS_CENTERIMAGE
+    GROUPBOX        "Copy Buffer 1",IDC_BUFFER_GROUP_1,7,7,273,61
+    CONTROL         "Play Sound on Copy",IDC_PLAY_SOUND_1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,179,16,80,14
+    CONTROL         "",IDC_COPY_2,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,81,80,14
+    CONTROL         "Win",IDC_WIN_COPY_2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,81,33,14
+    CONTROL         "",IDC_PASTE_2,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,97,80,14
+    CONTROL         "Win",IDC_WIN_PASTE_2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,97,33,14
+    LTEXT           "Copy",IDC_STATIC_COPY_2,19,81,42,14,SS_CENTERIMAGE
+    LTEXT           "Paste",IDC_STATIC_PASTE_2,19,97,43,14,SS_CENTERIMAGE
+    CONTROL         "",IDC_CUT_2,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,112,80,14
+    CONTROL         "Win",IDC_WIN_CUT_2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,112,33,14
+    LTEXT           "Cut",IDC_STATIC_CUT_2,19,112,43,14,SS_CENTERIMAGE
+    GROUPBOX        "Copy Buffer 2",IDC_BUFFER_GROUP_2,7,72,273,61
+    CONTROL         "Play Sound on Copy",IDC_PLAY_SOUND_2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,179,81,80,14
+    CONTROL         "",IDC_COPY_3,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,148,80,14
+    CONTROL         "Win",IDC_WIN_COPY_3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,148,33,14
+    CONTROL         "",IDC_PASTE_3,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,164,80,14
+    CONTROL         "Win",IDC_WIN_PASTE_3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,164,33,14
+    LTEXT           "Copy",IDC_STATIC_COPY_3,19,148,42,14,SS_CENTERIMAGE
+    LTEXT           "Paste",IDC_STATIC_PASTE_3,19,164,43,14,SS_CENTERIMAGE
+    CONTROL         "",IDC_CUT_3,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,63,179,80,14
+    CONTROL         "Win",IDC_WIN_CUT_3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,179,33,14
+    LTEXT           "Cut",IDC_STATIC_CUT_3,19,179,43,14,SS_CENTERIMAGE
+    GROUPBOX        "Copy Buffer 3",IDC_BUFFER_GROUP_3,7,139,273,61
+    CONTROL         "Play Sound on Copy",IDC_PLAY_SOUND_3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,179,148,80,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 3,17,0,0
+ PRODUCTVERSION 3,17,0,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "FileDescription", "Ditto"
+            VALUE "FileVersion", "3.17.0.0"
+            VALUE "InternalName", "CP_Main"
+            VALUE "LegalCopyright", "Copyright (C) 2003"
+            VALUE "OriginalFilename", "Ditto"
+            VALUE "ProductName", "Ditto"
+            VALUE "ProductVersion", "3.17.0.0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+    IDD_ABOUTBOX, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 228
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 48
+    END
+
+    IDD_OPTIONS_UTILITIES, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 234
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 130
+    END
+
+    IDD_OPTIONS_TYPES, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 223
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 165
+    END
+
+    IDD_OPTIONS_QUICK_PASTE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 353
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 242
+    END
+
+    IDD_OPTIONS_KEYSTROKES, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 343
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 198
+    END
+
+    IDD_OPTIONS_GENERAL, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 344
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 254
+    END
+
+    IDD_SELECT_DB, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 269
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 39
+    END
+
+    IDD_ADD_TYPE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 286
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 224
+    END
+
+    IDD_COPY_PROPERTIES, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 251
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 213
+    END
+
+    IDD_ABOUT, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 322
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 146
+    END
+
+    IDD_GROUP_NAME, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 179
+        TOPMARGIN, 1
+        BOTTOMMARGIN, 42
+    END
+
+    IDD_OPTIONS_FRIENDS, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 346
+        TOPMARGIN, 4
+        BOTTOMMARGIN, 244
+    END
+
+    IDD_FRIEND_DETAILS, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 196
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 72
+    END
+
+    IDD_MOVE_TO_GROUP, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 247
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 170
+    END
+
+    IDD_DIALOG_REMOTE_FILE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 277
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 103
+    END
+
+    IDD_OPTIONS_COPY_BUFFERS, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 280
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 243
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// AVI
+//
+
+IDR_FILE_COPY           AVI                     "res\\FILECOPY.AVI"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+    IDR_MAINFRAME           "CP_Main\n\nCP_Mai\n\n\nCPMain.Document\nCP_Mai Document"
+END
+
+STRINGTABLE
+BEGIN
+    AFX_IDS_APP_TITLE       "CP_Main"
+    AFX_IDS_IDLEMESSAGE     "Ready"
+END
+
+STRINGTABLE
+BEGIN
+    ID_INDICATOR_EXT        "EXT"
+    ID_INDICATOR_CAPS       "CAP"
+    ID_INDICATOR_NUM        "NUM"
+    ID_INDICATOR_SCRL       "SCRL"
+    ID_INDICATOR_OVR        "OVR"
+    ID_INDICATOR_REC        "REC"
+END
+
+STRINGTABLE
+BEGIN
+    ID_FILE_NEW             "Create a new document\nNew"
+    ID_FILE_OPEN            "Open an existing document\nOpen"
+    ID_FILE_CLOSE           "Close the active document\nClose"
+    ID_FILE_SAVE            "Save the active document\nSave"
+    ID_FILE_SAVE_AS         "Save the active document with a new name\nSave As"
+    ID_FILE_PAGE_SETUP      "Change the printing options\nPage Setup"
+    ID_FILE_PRINT_SETUP     "Change the printer and printing options\nPrint Setup"
+    ID_FILE_PRINT           "Print the active document\nPrint"
+    ID_FILE_PRINT_PREVIEW   "Display full pages\nPrint Preview"
+END
+
+STRINGTABLE
+BEGIN
+    ID_APP_ABOUT            "Display program information, version number and copyright\nAbout"
+    ID_APP_EXIT             "Quit the application; prompts to save documents\nExit"
+END
+
+STRINGTABLE
+BEGIN
+    ID_FILE_MRU_FILE1       "Open this document"
+    ID_FILE_MRU_FILE2       "Open this document"
+    ID_FILE_MRU_FILE3       "Open this document"
+    ID_FILE_MRU_FILE4       "Open this document"
+    ID_FILE_MRU_FILE5       "Open this document"
+    ID_FILE_MRU_FILE6       "Open this document"
+    ID_FILE_MRU_FILE7       "Open this document"
+    ID_FILE_MRU_FILE8       "Open this document"
+    ID_FILE_MRU_FILE9       "Open this document"
+    ID_FILE_MRU_FILE10      "Open this document"
+    ID_FILE_MRU_FILE11      "Open this document"
+    ID_FILE_MRU_FILE12      "Open this document"
+    ID_FILE_MRU_FILE13      "Open this document"
+    ID_FILE_MRU_FILE14      "Open this document"
+    ID_FILE_MRU_FILE15      "Open this document"
+    ID_FILE_MRU_FILE16      "Open this document"
+END
+
+STRINGTABLE
+BEGIN
+    ID_NEXT_PANE            "Switch to the next window pane\nNext Pane"
+    ID_PREV_PANE            "Switch back to the previous window pane\nPrevious Pane"
+END
+
+STRINGTABLE
+BEGIN
+    ID_WINDOW_SPLIT         "Split the active window into panes\nSplit"
+END
+
+STRINGTABLE
+BEGIN
+    ID_EDIT_CLEAR           "Erase the selection\nErase"
+    ID_EDIT_CLEAR_ALL       "Erase everything\nErase All"
+    ID_EDIT_COPY            "Copy the selection and put it on the Clipboard\nCopy"
+    ID_EDIT_CUT             "Cut the selection and put it on the Clipboard\nCut"
+    ID_EDIT_FIND            "Find the specified text\nFind"
+    ID_EDIT_PASTE           "Insert Clipboard contents\nPaste"
+    ID_EDIT_REPEAT          "Repeat the last action\nRepeat"
+    ID_EDIT_REPLACE         "Replace specific text with different text\nReplace"
+    ID_EDIT_SELECT_ALL      "Select the entire document\nSelect All"
+    ID_EDIT_UNDO            "Undo the last action\nUndo"
+    ID_EDIT_REDO            "Redo the previously undone action\nRedo"
+END
+
+STRINGTABLE
+BEGIN
+    ID_VIEW_TOOLBAR         "Show or hide the toolbar\nToggle ToolBar"
+    ID_VIEW_STATUS_BAR      "Show or hide the status bar\nToggle StatusBar"
+END
+
+STRINGTABLE
+BEGIN
+    AFX_IDS_SCSIZE          "Change the window size"
+    AFX_IDS_SCMOVE          "Change the window position"
+    AFX_IDS_SCMINIMIZE      "Reduce the window to an icon"
+    AFX_IDS_SCMAXIMIZE      "Enlarge the window to full size"
+    AFX_IDS_SCNEXTWINDOW    "Switch to the next document window"
+    AFX_IDS_SCPREVWINDOW    "Switch to the previous document window"
+    AFX_IDS_SCCLOSE         "Close the active window and prompts to save the documents"
+END
+
+STRINGTABLE
+BEGIN
+    AFX_IDS_SCRESTORE       "Restore the window to normal size"
+    AFX_IDS_SCTASKLIST      "Activate Task List"
+END
+
+STRINGTABLE
+BEGIN
+    AFX_IDS_PREVIEW_CLOSE   "Close print preview mode\nCancel Preview"
+END
+
+STRINGTABLE
+BEGIN
+    ID_BUTTON_SAVE          "Save /t Ctrl - S"
+    ID_BUTTON_SAVE_ALL      "Save All /t Ctrl-Shift-S"
+END
+
+STRINGTABLE
+BEGIN
+    ID_BUTTON_CLOSE         "Close /t Escape"
+END
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#define _AFX_NO_SPLITTER_RESOURCES
+#define _AFX_NO_OLE_RESOURCES
+#define _AFX_NO_TRACKER_RESOURCES
+#define _AFX_NO_PROPERTY_RESOURCES
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE 9, 1
+#pragma code_page(1252)
+#endif //_WIN32
+#include "res\CP_Main.rc2"  // non-Microsoft Visual C++ edited resources
+#include "afxres.rc"         // Standard components
+#include "afxprint.rc"       // printing/print preview resources
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

+ 2 - 0
CP_Main.vcxproj

@@ -451,6 +451,7 @@
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Unicode Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Unicode Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ClCompile>
+    <ClCompile Include="Popup.cpp" />
     <ClCompile Include="sqlite\CppSQLite3.cpp">
       <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
@@ -1292,6 +1293,7 @@
     <ClInclude Include="GroupStatic.h" />
     <ClInclude Include="memdc.h" />
     <ClInclude Include="NumberEdit.h" />
+    <ClInclude Include="Popup.h" />
     <ClInclude Include="QListCtrl.h" />
     <ClInclude Include="RichEditCtrlEx.h" />
     <ClInclude Include="SearchEditBox.h" />

+ 1 - 0
Client.h

@@ -12,6 +12,7 @@
 #include "Server.h"
 #include "Encryption.h"
 #include "SendSocket.h"
+#include "Popup.h"
 
 class CSendToFriendInfo
 {

+ 10 - 2
Clip.cpp

@@ -907,6 +907,8 @@ CClipList::~CClipList()
 // while this does empty the Format Data, it does not delete the Clips.
 int CClipList::AddToDB(bool bLatestTime, bool bShowStatus)
 {
+	Log(_T("AddToDB - Start"));
+
 	int savedCount = 0;
 	int nRemaining = 0;
 	CClip* pClip;
@@ -917,11 +919,13 @@ int CClipList::AddToDB(bool bLatestTime, bool bShowStatus)
 	pos = GetHeadPosition();
 	while(pos)
 	{
+		Log(StrF(_T("AddToDB - while(pos), Start Remaining %d"), nRemaining));
+
 		if(bShowStatus)
 		{
-			theApp.SetStatus(StrF(_T("%d"),nRemaining), true);
-			nRemaining--;
+			theApp.SetStatus(StrF(_T("%d"), nRemaining), true);
 		}
+		nRemaining--;
 		
 		pClip = GetNext(pos);
 		ASSERT(pClip);
@@ -932,10 +936,14 @@ int CClipList::AddToDB(bool bLatestTime, bool bShowStatus)
 		bResult = pClip->AddToDB();
 		if( bResult )
 			savedCount++;
+
+		Log(StrF(_T("AddToDB - while(pos), End Remaining %d, save count: %d"), nRemaining, savedCount));
 	}
 	
 	if(bShowStatus)
 		theApp.SetStatus(NULL, true);
+
+	Log(StrF(_T("AddToDB - Start, count: %d"), savedCount));
 	
 	return savedCount;
 }

+ 79 - 10
ClipIds.cpp

@@ -9,6 +9,7 @@
 #include "CF_TextAggregator.h"
 #include "richtextaggregator.h"
 #include "htmlformataggregator.h"
+#include "Popup.h"
 
 // allocate an HGLOBAL of the given Format Type representing these Clip IDs.
 HGLOBAL CClipIDs::Render(UINT cfType)
@@ -288,7 +289,7 @@ BOOL CClipIDs::CopyTo(long lParentID)
 	return TRUE;
 }
 
-BOOL CClipIDs::DeleteIDs()
+BOOL CClipIDs::DeleteIDs(bool fromClipWindow, CppSQLite3DB& db)
 {
 	CPopup status(0, 0, ::GetForegroundWindow());
 	bool bAllowShow;
@@ -296,31 +297,99 @@ BOOL CClipIDs::DeleteIDs()
 	
 	BOOL bRet = TRUE;
 	int count = GetSize();
+	int batchCount = 25;
+
+	Log(StrF(_T("Begin delete clips, Count: %d from Window: %d"), count, fromClipWindow));
 	
 	if(count <= 0)
 		return FALSE;
 
 	try
 	{
-		theApp.m_db.execDML(_T("begin transaction;"));
-		for(int i=0; i < count; i++)
+		CString sql = _T("DELETE FROM Main where lId in(");
+		CString sqlIn = _T("");
+		CString workingString = _T("Deleting clips, building query statement");
+		int startIndex = 0;
+		int index = 0;
+
+		if(bAllowShow)
 		{
-			if(bAllowShow)
-				status.Show(StrF(_T("Deleting %d out of %d..."), i+1, count));
+			status.Show(workingString);
+		}
+
+		for(index = 0; index < count; index++)
+		{
+			int clipId = ElementAt(index);
+			if(clipId <= 0)
+				continue;
+
+			Log(StrF(_T("Delete clip Id: %d"), clipId));
+
+			bool cont = false;
+			bool bGroup = false;
+			{
+				CppSQLite3Query q = db.execQueryEx(_T("SELECT bIsGroup FROM Main WHERE lId = %d"), clipId);
+				cont = !q.eof();
+				if(cont)
+				{
+					bGroup = q.getIntField(_T("bIsGroup")) > 0;
+				}
+			}
+
+			if(cont)
+			{			
+				if(bGroup)
+				{
+					db.execDMLEx(_T("UPDATE Main SET lParentID = -1 WHERE lParentID = %d;"), clipId);
+				}
+
+				if(sqlIn.GetLength() > 0)
+				{
+					sqlIn += ", ";
+				}
+				sqlIn += StrF(_T("%d"), clipId);
+			}
 
-			if(i && i % 50)
+			if(index > 0 && 
+				(index % batchCount) == 0)
 			{
-				theApp.m_db.execDML(_T("commit transaction;"));
-				theApp.m_db.execDML(_T("begin transaction;"));
+				if(bAllowShow)
+				{
+					status.Show(StrF(_T("Deleting %d - %d of %d..."), startIndex+1, index, count));
+				}
+				startIndex = index;
+
+				db.execDMLEx(sql + sqlIn + _T(")"));
+				sqlIn = "";
+				bRet = TRUE;
+
+				if(bAllowShow)
+				{
+					status.Show(workingString);
+				}
 			}
 
-			bRet = bRet && DeleteID(ElementAt(i));
+			if(fromClipWindow == false)
+			{
+				theApp.OnDeleteID(clipId);
+			}
 		}
 
-		theApp.m_db.execDML(_T("commit transaction;"));
+		if(sqlIn.GetLength() > 0)
+		{
+			if(bAllowShow)
+			{
+				status.Show(StrF(_T("Deleting %d - %d of %d..."), startIndex+1, index, count));
+			}
+
+			db.execDMLEx(sql + sqlIn + _T(")"));
+			bRet = TRUE;
+		}
 	}
 	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
 	
+	Log(StrF(_T("End delete clips, Count: %d"), count));
+
 	return bRet;
 }
 

+ 2 - 1
ClipIds.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "IClipAggregator.h"
+#include "sqlite\CppSQLite3.h"
 
 class CClipIDs : public CArrayEx<int>
 {
@@ -32,7 +33,7 @@ public:
 
 	BOOL CopyTo(long lParentID);
 
-	BOOL DeleteIDs();
+	BOOL DeleteIDs(bool fromClipWindow, CppSQLite3DB& db);
 
 	BOOL Export(CString csFilePath);
 	

+ 10 - 1
CopyThread.cpp

@@ -66,6 +66,8 @@ END_MESSAGE_MAP()
 // Called within Copy Thread:
 void CCopyThread::OnClipboardChange()
 {
+	Log(_T("OnClipboardChange - Start"));
+
 	SyncConfig(); // synchronize with the main thread's copy configuration
 	
 	// if we are told not to copy on change, then we have nothing to do.
@@ -81,6 +83,8 @@ void CCopyThread::OnClipboardChange()
 	//just like you were using Ctrl-V
 	if(theApp.m_CopyBuffer.Active())
 	{
+		Log(_T("LoadFromClipboard - Copy buffer Active Start"));
+
 		pSupportedTypes = new CClipTypes;
 		if(pSupportedTypes)
 		{
@@ -104,9 +108,13 @@ void CCopyThread::OnClipboardChange()
 		{
 			pSupportedTypes = m_LocalConfig.m_pSupportedTypes;
 		}
+
+		Log(_T("LoadFromClipboard - Copy buffer Active End"));
 	}
 
+	Log(_T("LoadFromClipboard - Before"));
 	bool bResult = pClip->LoadFromClipboard(pSupportedTypes);
+	Log(_T("LoadFromClipboard - End"));
 
 	if(bDeleteMemory)
 	{
@@ -126,7 +134,8 @@ void CCopyThread::OnClipboardChange()
 		::PostMessage(m_LocalConfig.m_hClipHandler, WM_CLIPBOARD_COPIED, (WPARAM)pClip, 0);
 	else
 		::SendMessage(m_LocalConfig.m_hClipHandler, WM_CLIPBOARD_COPIED, (WPARAM)pClip, 0);
-	
+
+	Log(_T("OnClipboardChange - End"));
 }
 
 void CCopyThread::SyncConfig()

+ 665 - 600
DatabaseUtilities.cpp

@@ -1,601 +1,666 @@
-// DatabaseUtilites.cpp: implementation of the CDatabaseUtilites class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#include "stdafx.h"
-#include "CP_Main.h"
-#include "DatabaseUtilities.h"
-#include "ProcessPaste.h"
-#include <io.h>
-#include "AccessToSqlite.h"
-#include "Path.h"
-
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-
-BOOL CreateBackup(CString csPath)
-{
-	CString csOriginal;
-	int count = 0;
-	// create a backup of the existing database
-	do
-	{
-		count++;
-		csOriginal = csPath + StrF(_T(".%03d"), count);
-		// in case of some weird infinite loop
-		if( count > 50 )
-		{
-			ASSERT(0);
-			return FALSE;
-		}
-	} while( !::CopyFile(csPath, csOriginal, TRUE));
-	
-	return TRUE;
-}
-
-CString GetDBName()
-{
-	return CGetSetOptions::GetDBPath();
-}
-
-CString GetOLDDefaultDBName()
-{
-	CString csDefaultPath;
-	LPMALLOC pMalloc;
-
-	if(SUCCEEDED(::SHGetMalloc(&pMalloc))) 
-	{ 
-		LPITEMIDLIST pidlPrograms;
-
-		SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidlPrograms);
-
-		TCHAR string[MAX_PATH];
-		SHGetPathFromIDList(pidlPrograms, string);
-
-		pMalloc->Free(pidlPrograms);
-		pMalloc->Release();
-
-		csDefaultPath = string;		
-		csDefaultPath += "\\Ditto\\";
-
-		csDefaultPath += "DittoDB.mdb";
-	}
-
-	return csDefaultPath;
-}
-
-CString GetDefaultDBName()
-{
-	CString csDefaultPath = _T("c:\\program files\\Ditto\\");
-
-	if(g_Opt.m_bU3)
-	{
-		csDefaultPath = CGetSetOptions::GetPath(PATH_DATABASE);
-	}
-	else
-	{	
-		//If portable then default to the running path
-		if(CGetSetOptions::GetIsPortableDitto())
-		{
-			csDefaultPath.Empty();
-		}
-		else
-		{
-			LPMALLOC pMalloc;
-		
-			if(SUCCEEDED(::SHGetMalloc(&pMalloc))) 
-			{ 
-				LPITEMIDLIST pidlPrograms;
-				
-				SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidlPrograms);
-				
-				TCHAR string[MAX_PATH];
-				SHGetPathFromIDList(pidlPrograms, string);
-				
-				pMalloc->Free(pidlPrograms);
-				pMalloc->Release();
-				
-				csDefaultPath = string;		
-			}
-
-			FIX_CSTRING_PATH(csDefaultPath);
-			csDefaultPath += "Ditto\\";
-		}
-	}
-
-	CString csTempName = csDefaultPath + "Ditto.db";
-	int i = 1;
-	while(FileExists(csTempName))
-	{
-		csTempName.Format(_T("%sDitto_%d.db"), csDefaultPath, i);
-		i++;
-	}
-	csDefaultPath = csTempName;
-	
-	return csDefaultPath;
-}
-
-BOOL CheckDBExists(CString csDBPath)
-{
-	//If this is the first time running this version then convert the old database to the new db
-	if(csDBPath.IsEmpty() && g_Opt.m_bU3 == false)
-	{
-		csDBPath = GetDefaultDBName();
-
-		if(FileExists(csDBPath) == FALSE && CGetSetOptions::GetIsPortableDitto() == FALSE)
-		{
-			CString csOldDB = CGetSetOptions::GetDBPathOld();
-			if(csOldDB.IsEmpty())
-			{
-				csOldDB = GetOLDDefaultDBName();
-			}
-
-			if(FileExists(csOldDB))
-			{
-				//create the new sqlite db
-				CreateDB(csDBPath);
-
-				CAccessToSqlite Convert;
-				Convert.ConvertDatabase(csDBPath, csOldDB);
-			}
-		}
-	}
-
-	BOOL bRet = FALSE;
-	if(FileExists(csDBPath) == FALSE)
-	{
-		csDBPath = GetDefaultDBName();
-
-		nsPath::CPath FullPath(csDBPath);
-		CString csPath = FullPath.GetPath().GetStr();
-		if(csPath.IsEmpty() == false && FileExists(csDBPath) == FALSE)
-		{
-			CreateDirectory(csPath, NULL);
-		}
-
-		// -- create a new one
-		bRet = CreateDB(csDBPath);
-	}
-	else
-	{
-		if(ValidDB(csDBPath) == FALSE)
-		{		
-			//Db existed but was bad
-			CString csMarkAsBad;
-			
-			csMarkAsBad = csDBPath;
-			csMarkAsBad.Replace(_T("."), _T("_BAD."));
-			
-			CString csPath = GetDefaultDBName();
-			
-			CString cs;
-			cs.Format(_T("%s \"%s\",\n")
-				_T("%s \"%s\",\n")
-				_T("%s,\n")
-				_T("\"%s\""),
-				theApp.m_Language.GetString("Database_Format", "Unrecognized Database Format"),
-				csDBPath, 
-				theApp.m_Language.GetString("File_Renamed", "the file will be renamed"),
-				csMarkAsBad, 
-				theApp.m_Language.GetString("New_Database", "and a new database will be created"),
-				csPath);
-			
-			AfxMessageBox(cs);
-			
-			CFile::Rename(csDBPath, csMarkAsBad);
-
-			csDBPath = csPath;
-			
-			bRet = CreateDB(csDBPath);
-		}
-		else
-			bRet = TRUE;
-	}
-
-	if(bRet)
-	{
-		bRet = OpenDatabase(csDBPath);
-	}
-	
-	return bRet;
-}
-
-BOOL OpenDatabase(CString csDB)
-{
-	try
-	{
-		theApp.m_db.close();
-		theApp.m_db.open(csDB);
-		CGetSetOptions::SetDBPath(csDB);
-
-		return TRUE;
-	}
-	CATCH_SQLITE_EXCEPTION
-
-	return FALSE;
-}
-
-BOOL ValidDB(CString csPath, BOOL bUpgrade)
-{
-	try
-	{
-		CppSQLite3DB db;
-		db.open(csPath);
-
-		db.execQuery(_T("SELECT lID, lDate, mText, lShortCut, lDontAutoDelete, ")
-								_T("CRC, bIsGroup, lParentID, QuickPasteText ")
-								_T("FROM Main"));
-
-		db.execQuery(_T("SELECT lID, lParentID, strClipBoardFormat, ooData FROM Data"));
-
-		db.execQuery(_T("SELECT lID, TypeText FROM Types"));
-
-		//This was added later so try to add each time and catch the exception here
- 		try
- 		{
- 			db.execDML(_T("CREATE TRIGGER delete_data_trigger BEFORE DELETE ON Main FOR EACH ROW\n")
- 						_T("BEGIN\n")
- 							_T("DELETE FROM Data WHERE lParentID = old.lID;\n")
- 						_T("END\n"));
- 		}
- 		catch(CppSQLite3Exception& e)
- 		{
- 			e.errorCode();
- 		}
-
-		//This was added later so try to add each time and catch the exception here
-		try
-		{
-			db.execQuery(_T("SELECT lID, lClipID, lCopyBuffer FROM CopyBuffers"));
-		}
-		catch(CppSQLite3Exception& e)
-		{
-			e.errorCode();
-
-			db.execDML(_T("CREATE TABLE CopyBuffers(")
-				_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
-				_T("lClipID INTEGER,")
-				_T("lCopyBuffer INTEGER)"));
-
-			db.execDML(_T("CREATE TRIGGER delete_copy_buffer_trigger BEFORE DELETE ON Main FOR EACH ROW\n")
-				_T("BEGIN\n")
-				_T("DELETE FROM CopyBuffers WHERE lClipID = old.lID;\n")
-				_T("END\n"));
-		}
-	}
-	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
-
-	return TRUE;                                                     
-}
-
-BOOL CreateDB(CString csFile)
-{
-	try
-	{
-		CppSQLite3DB db;
-		db.open(csFile);
-		
-		db.execDML(_T("PRAGMA auto_vacuum = 1"));
-
-		db.execDML(_T("CREATE TABLE Main(")
-								_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
-								_T("lDate INTEGER, ")
-								_T("mText TEXT, ")
-								_T("lShortCut INTEGER, ")
-								_T("lDontAutoDelete INTEGER, ")
-								_T("CRC INTEGER, ")
-								_T("bIsGroup INTEGER, ")
-								_T("lParentID INTEGER, ")
-								_T("QuickPasteText TEXT)"));
-
-		db.execDML(_T("CREATE TABLE Data(")
-							_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
-							_T("lParentID INTEGER, ")
-							_T("strClipBoardFormat TEXT, ")
-							_T("ooData BLOB);"));
-
-		db.execDML(_T("CREATE TABLE Types(")
-							_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
-							_T("TypeText TEXT)"));
-
-		db.execDML(_T("CREATE UNIQUE INDEX Main_ID on Main(lID ASC)"));
-		db.execDML(_T("CREATE UNIQUE INDEX Data_ID on Data(lID ASC)"));
-		db.execDML(_T("CREATE INDEX Main_Date on Main(lDate DESC)"));
-
-		db.execDML(_T("CREATE TRIGGER delete_data_trigger BEFORE DELETE ON Main FOR EACH ROW\n")
-						_T("BEGIN\n")
-							_T("DELETE FROM Data WHERE lParentID = old.lID;\n")
-						_T("END\n"));
-
-		db.execDML(_T("CREATE TABLE CopyBuffers(")
-			_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
-			_T("lClipID INTEGER, ")
-			_T("lCopyBuffer INTEGER)"));
-
-		db.execDML(_T("CREATE TRIGGER delete_copy_buffer_trigger BEFORE DELETE ON Main FOR EACH ROW\n")
-			_T("BEGIN\n")
-			_T("DELETE FROM CopyBuffers WHERE lClipID = old.lID;\n")
-			_T("END\n"));
-
-		db.close();
-	}
-	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
-
-	return TRUE;
-}
-
-BOOL CompactDatabase()
-{
-//	if(!theApp.CloseDB())
-//		return FALSE;
-//
-//	CString csDBName = GetDBName();
-//	CString csTempDBName = csDBName;
-//	csTempDBName.Replace(".mdb", "TempDBName.mdb");
-//	
-//	//Compact the database			
-//	try
-//	{
-//		CDaoWorkspace::CompactDatabase(csDBName, csTempDBName);//, dbLangGeneral, 0, "andrew");//DATABASE_PASSWORD);
-//	}
-//	catch(CDaoException* e)
-//	{
-//		AfxMessageBox(e->m_pErrorInfo->m_strDescription);
-//		DeleteFile(csTempDBName);
-//		e->Delete();
-//		return FALSE;
-//	}
-//	catch(CMemoryException* e) 
-//	{
-//		AfxMessageBox("Memory Exception");
-//		DeleteFile(csTempDBName);
-//		e->Delete();
-//		return FALSE;
-//	}
-//	
-//	//Since compacting the database creates a new db delete the old one and replace it
-//	//with the compacted db
-//	if(DeleteFile(csDBName))
-//	{
-//		try
-//		{
-//			CFile::Rename(csTempDBName, csDBName);
-//		}
-//		catch(CFileException *e)
-//		{
-//			e->ReportError();
-//			e->Delete();
-//			return FALSE;
-//		}
-//	}
-//	else
-//		AfxMessageBox("Error Compacting Database");
-	
-	return TRUE;
-}
-
-BOOL RepairDatabase()
-{
-//	if(!theApp.CloseDB())
-//		return FALSE;
-	
-//	try
-//	{
-//		CDaoWorkspace::RepairDatabase(GetDBName());
-//	}
-//	catch(CDaoException *e)
-//	{
-//		AfxMessageBox(e->m_pErrorInfo->m_strDescription);
-//		e->Delete();
-//		return FALSE;
-//	}
-	
-	return TRUE;
-}
-
-BOOL RemoveOldEntries()
-{
-	try
-	{
-		if(CGetSetOptions::GetCheckForMaxEntries())
-		{
-			long lMax = CGetSetOptions::GetMaxEntries();
-			if(lMax >= 0)
-			{
-				CClipIDs IDs;
-				
-				CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, lShortCut, lDontAutoDelete FROM Main ORDER BY lDate DESC LIMIT -1 OFFSET %d"), lMax);			
-				while(q.eof() == false)
-				{
-					//Only delete entries that have no shortcut and don't have the flag set
-					if(q.getIntField(_T("lShortCut")) == 0 && q.getIntField(_T("lDontAutoDelete")) == 0)
-						IDs.Add(q.getIntField(_T("lID")));
-
-					q.nextRow();
-				}
-
-				IDs.DeleteIDs();
-			}
-		}
-		
-		if(CGetSetOptions::GetCheckForExpiredEntries())
-		{
-			long lExpire = CGetSetOptions::GetExpiredEntries();
-			
-			if(lExpire)
-			{
-				CTime now = CTime::GetCurrentTime();
-				now -= CTimeSpan(lExpire, 0, 0, 0);
-				
-				CClipIDs IDs;
-				
-				CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID FROM Main ")
-													_T("WHERE lDate < %d AND ")
-													_T("lShortCut = 0 AND lDontAutoDelete = 0"), now.GetTime());
-
-				while(q.eof() == false)
-				{
-					IDs.Add(q.getIntField(_T("lID")));
-					q.nextRow();
-				}
-				
-				IDs.DeleteIDs();
-			}
-		}
-	}
-	CATCH_SQLITE_EXCEPTION
-	
-	return TRUE;
-}
-
-BOOL EnsureDirectory(CString csPath)
-{
-	TCHAR drive[_MAX_DRIVE];
-	TCHAR dir[_MAX_DIR];
-	TCHAR fname[_MAX_FNAME];
-	TCHAR ext[_MAX_EXT];
-	
-	SPLITPATH(csPath, drive, dir, fname, ext);
-	
-	CString csDir(drive);
-	csDir += dir;
-	
-	if(FileExists(csDir) == FALSE)
-	{
-		if(CreateDirectory(csDir, NULL))
-			return TRUE;
-	}
-	else
-		return TRUE;
-	
-	return FALSE;
-}
-
-// BOOL RunZippApp(CString csCommandLine)
-// {
-// 	CString csLocalPath = GETENV(_T("U3_HOST_EXEC_PATH"));
-// 	FIX_CSTRING_PATH(csLocalPath);
-// 
-// 	CString csZippApp = GETENV(_T("U3_DEVICE_EXEC_PATH"));
-// 	FIX_CSTRING_PATH(csZippApp);
-// 	csZippApp += "7za.exe";
-// 
-// 	csZippApp += " ";
-// 	csZippApp += csCommandLine;
-// 
-// 	Log(csZippApp);
-// 
-// 	STARTUPINFO			StartupInfo;
-// 	PROCESS_INFORMATION	ProcessInformation;
-// 
-// 	ZeroMemory(&StartupInfo, sizeof(StartupInfo));
-// 	StartupInfo.cb = sizeof(StartupInfo);
-// 	ZeroMemory(&ProcessInformation, sizeof(ProcessInformation));
-// 
-// 	StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
-// 	StartupInfo.wShowWindow = SW_HIDE;
-// 
-// 	BOOL bRet = CreateProcess(NULL, csZippApp.GetBuffer(csZippApp.GetLength()), NULL, NULL, FALSE,
-// 			CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, NULL, csLocalPath,
-// 			&StartupInfo, &ProcessInformation);
-// 
-// 	if(bRet)
-// 	{
-// 		WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
-// 
-// 		DWORD dwExitCode;
-// 		GetExitCodeProcess(ProcessInformation.hProcess, &dwExitCode);
-// 
-// 		CString cs;
-// 		cs.Format(_T("Exit code from unzip = %d"), dwExitCode);
-// 		Log(cs);
-// 
-// 		if(dwExitCode != 0)
-// 		{
-// 			bRet = FALSE;
-// 		}
-// 	}
-// 	else
-// 	{
-// 		bRet = FALSE;
-// 		Log(_T("Create Process Failed"));
-// 	}
-// 
-// 	csZippApp.ReleaseBuffer();
-// 
-// 	return bRet;
-// }
-
-// BOOL CopyDownDatabase()
-// {
-// 	BOOL bRet = FALSE;
-// 
-// 	CString csZippedPath = GETENV(_T("U3_APP_DATA_PATH"));
-// 	FIX_CSTRING_PATH(csZippedPath);
-// 	
-// 	CString csUnZippedPath = csZippedPath;
-// 	csUnZippedPath += "Ditto.db";
-// 
-// 	csZippedPath += "Ditto.7z";
-// 	
-// 	CString csLocalPath = GETENV(_T("U3_HOST_EXEC_PATH"));
-// 	FIX_CSTRING_PATH(csLocalPath);
-// 
-// 	if(FileExists(csZippedPath))
-// 	{
-// 		CString csCommandLine;
-// 
-// 		//e = extract
-// 		//surround command line arguments with quotes
-// 		//-aoa = overight files with extracted files
-// 
-// 		csCommandLine += "e ";
-// 		csCommandLine += "\"";
-// 		csCommandLine += csZippedPath;
-// 		csCommandLine += "\"";
-// 		csCommandLine += " -o";
-// 		csCommandLine += "\"";
-// 		csCommandLine += csLocalPath;
-// 		csCommandLine += "\"";
-// 		csCommandLine += " -aoa";
-// 
-// 		bRet = RunZippApp(csCommandLine);
-// 
-// 		csLocalPath += "Ditto.db";
-// 	}
-// 	else if(FileExists(csUnZippedPath))
-// 	{
-// 		csLocalPath += "Ditto.db";
-// 		bRet = CopyFile(csUnZippedPath, csLocalPath, FALSE);
-// 	}
-// 
-// 	if(FileExists(csLocalPath) == FALSE)
-// 	{
-// 		Log(_T("Failed to copy files from device zip file"));
-// 	}
-// 
-// 	g_Opt.nLastDbWriteTime = GetLastWriteTime(csLocalPath);
-// 
-// 	return bRet;
-// }
-
-//BOOL CopyUpDatabase()
-//{
-//	CStringA csZippedPath = "C:\\";//getenv("U3_APP_DATA_PATH");
-//	FIX_CSTRING_PATH(csZippedPath);
-//	csZippedPath += "Ditto.zip";
-
-//	CStringA csLocalPath = GetDBName();//getenv("U3_HOST_EXEC_PATH");
-//	//FIX_CSTRING_PATH(csLocalPath);
-//	//csLocalPath += "Ditto.db";
-//
-//	CZipper Zip;
-//
-//	if(Zip.OpenZip(csZippedPath))
-//	{
-//		Zip.AddFileToZip(csLocalPath);
-//	}
-//
-//	return TRUE;
+// DatabaseUtilites.cpp: implementation of the CDatabaseUtilites class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "CP_Main.h"
+#include "DatabaseUtilities.h"
+#include "ProcessPaste.h"
+#include <io.h>
+#include "AccessToSqlite.h"
+#include "Path.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+BOOL CreateBackup(CString csPath)
+{
+	CString csOriginal;
+	int count = 0;
+	// create a backup of the existing database
+	do
+	{
+		count++;
+		csOriginal = csPath + StrF(_T(".%03d"), count);
+		// in case of some weird infinite loop
+		if( count > 50 )
+		{
+			ASSERT(0);
+			return FALSE;
+		}
+	} while( !::CopyFile(csPath, csOriginal, TRUE));
+	
+	return TRUE;
+}
+
+CString GetDBName()
+{
+	return CGetSetOptions::GetDBPath();
+}
+
+CString GetOLDDefaultDBName()
+{
+	CString csDefaultPath;
+	LPMALLOC pMalloc;
+
+	if(SUCCEEDED(::SHGetMalloc(&pMalloc))) 
+	{ 
+		LPITEMIDLIST pidlPrograms;
+
+		SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidlPrograms);
+
+		TCHAR string[MAX_PATH];
+		SHGetPathFromIDList(pidlPrograms, string);
+
+		pMalloc->Free(pidlPrograms);
+		pMalloc->Release();
+
+		csDefaultPath = string;		
+		csDefaultPath += "\\Ditto\\";
+
+		csDefaultPath += "DittoDB.mdb";
+	}
+
+	return csDefaultPath;
+}
+
+CString GetDefaultDBName()
+{
+	CString csDefaultPath = _T("c:\\program files\\Ditto\\");
+
+	if(g_Opt.m_bU3)
+	{
+		csDefaultPath = CGetSetOptions::GetPath(PATH_DATABASE);
+	}
+	else
+	{	
+		//If portable then default to the running path
+		if(CGetSetOptions::GetIsPortableDitto())
+		{
+			csDefaultPath.Empty();
+		}
+		else
+		{
+			LPMALLOC pMalloc;
+		
+			if(SUCCEEDED(::SHGetMalloc(&pMalloc))) 
+			{ 
+				LPITEMIDLIST pidlPrograms;
+				
+				SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidlPrograms);
+				
+				TCHAR string[MAX_PATH];
+				SHGetPathFromIDList(pidlPrograms, string);
+				
+				pMalloc->Free(pidlPrograms);
+				pMalloc->Release();
+				
+				csDefaultPath = string;		
+			}
+
+			FIX_CSTRING_PATH(csDefaultPath);
+			csDefaultPath += "Ditto\\";
+		}
+	}
+
+	CString csTempName = csDefaultPath + "Ditto.db";
+	int i = 1;
+	while(FileExists(csTempName))
+	{
+		csTempName.Format(_T("%sDitto_%d.db"), csDefaultPath, i);
+		i++;
+	}
+	csDefaultPath = csTempName;
+	
+	return csDefaultPath;
+}
+
+BOOL CheckDBExists(CString csDBPath)
+{
+	//If this is the first time running this version then convert the old database to the new db
+	if(csDBPath.IsEmpty() && g_Opt.m_bU3 == false)
+	{
+		csDBPath = GetDefaultDBName();
+
+		if(FileExists(csDBPath) == FALSE && CGetSetOptions::GetIsPortableDitto() == FALSE)
+		{
+			CString csOldDB = CGetSetOptions::GetDBPathOld();
+			if(csOldDB.IsEmpty())
+			{
+				csOldDB = GetOLDDefaultDBName();
+			}
+
+			if(FileExists(csOldDB))
+			{
+				//create the new sqlite db
+				CreateDB(csDBPath);
+
+				CAccessToSqlite Convert;
+				Convert.ConvertDatabase(csDBPath, csOldDB);
+			}
+		}
+	}
+
+	BOOL bRet = FALSE;
+	if(FileExists(csDBPath) == FALSE)
+	{
+		csDBPath = GetDefaultDBName();
+
+		nsPath::CPath FullPath(csDBPath);
+		CString csPath = FullPath.GetPath().GetStr();
+		if(csPath.IsEmpty() == false && FileExists(csDBPath) == FALSE)
+		{
+			CreateDirectory(csPath, NULL);
+		}
+
+		// -- create a new one
+		bRet = CreateDB(csDBPath);
+	}
+	else
+	{
+		if(ValidDB(csDBPath) == FALSE)
+		{		
+			//Db existed but was bad
+			CString csMarkAsBad;
+			
+			csMarkAsBad = csDBPath;
+			csMarkAsBad.Replace(_T("."), _T("_BAD."));
+			
+			CString csPath = GetDefaultDBName();
+			
+			CString cs;
+			cs.Format(_T("%s \"%s\",\n")
+				_T("%s \"%s\",\n")
+				_T("%s,\n")
+				_T("\"%s\""),
+				theApp.m_Language.GetString("Database_Format", "Unrecognized Database Format"),
+				csDBPath, 
+				theApp.m_Language.GetString("File_Renamed", "the file will be renamed"),
+				csMarkAsBad, 
+				theApp.m_Language.GetString("New_Database", "and a new database will be created"),
+				csPath);
+			
+			AfxMessageBox(cs);
+			
+			CFile::Rename(csDBPath, csMarkAsBad);
+
+			csDBPath = csPath;
+			
+			bRet = CreateDB(csDBPath);
+		}
+		else
+			bRet = TRUE;
+	}
+
+	if(bRet)
+	{
+		bRet = OpenDatabase(csDBPath);
+	}
+	
+	return bRet;
+}
+
+BOOL OpenDatabase(CString csDB)
+{
+	try
+	{
+		theApp.m_db.close();
+		theApp.m_db.open(csDB);
+		CGetSetOptions::SetDBPath(csDB);
+
+		return TRUE;
+	}
+	CATCH_SQLITE_EXCEPTION
+
+	return FALSE;
+}
+
+BOOL ValidDB(CString csPath, BOOL bUpgrade)
+{
+	try
+	{
+		CppSQLite3DB db;
+		db.open(csPath);
+
+		db.execQuery(_T("SELECT lID, lDate, mText, lShortCut, lDontAutoDelete, ")
+								_T("CRC, bIsGroup, lParentID, QuickPasteText ")
+								_T("FROM Main"));
+
+		db.execQuery(_T("SELECT lID, lParentID, strClipBoardFormat, ooData FROM Data"));
+
+		db.execQuery(_T("SELECT lID, TypeText FROM Types"));
+
+		try
+		{
+			db.execDML(_T("DROP TRIGGER delete_data_trigger"));
+		}
+		catch(CppSQLite3Exception& e)
+		{
+			e.errorCode();
+		}
+
+		try
+		{
+			db.execDML(_T("DROP TRIGGER delete_copy_buffer_trigger"));
+		}
+		catch(CppSQLite3Exception& e)
+		{
+			e.errorCode();
+		}
+
+		//This was added later so try to add each time and catch the exception here
+ 		try
+ 		{
+			db.execDML(_T("CREATE TRIGGER delete_data_trigger BEFORE DELETE ON Main FOR EACH ROW\n")
+				_T("BEGIN\n")
+					_T("INSERT INTO MainDeletes VALUES(old.lID, datetime('now'));\n")
+				_T("END\n"));
+ 		}
+		catch(CppSQLite3Exception& e)
+		{
+ 			e.errorCode();
+ 		}
+
+		//This was added later so try to add each time and catch the exception here
+		try
+		{
+			db.execQuery(_T("SELECT lID, lClipID, lCopyBuffer FROM CopyBuffers"));
+		}
+		catch(CppSQLite3Exception& e)
+		{
+			e.errorCode();
+
+			db.execDML(_T("CREATE TABLE CopyBuffers(")
+				_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
+				_T("lClipID INTEGER,")
+				_T("lCopyBuffer INTEGER)"));
+		}
+
+		//This was added later so try to add each time and catch the exception here
+		try
+		{
+			db.execQuery(_T("SELECT clipId FROM MainDeletes"));
+		}
+		catch(CppSQLite3Exception& e)
+		{
+			e.errorCode();
+
+			db.execDML(_T("CREATE TABLE MainDeletes(")
+				_T("clipID INTEGER,")
+				_T("modifiedDate)"));
+
+			db.execDML(_T("CREATE TRIGGER MainDeletes_delete_data_trigger BEFORE DELETE ON MainDeletes FOR EACH ROW\n")
+				_T("BEGIN\n")
+				_T("DELETE FROM CopyBuffers WHERE lClipID = old.clipID;\n")
+				_T("DELETE FROM Data WHERE lParentID = old.clipID;\n")
+				_T("END\n"));
+		}
+	}
+	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
+
+	return TRUE;                                                     
+}
+
+BOOL CreateDB(CString csFile)
+{
+	try
+	{
+		CppSQLite3DB db;
+		db.open(csFile);
+		
+		db.execDML(_T("PRAGMA auto_vacuum = 1"));
+
+		db.execDML(_T("CREATE TABLE Main(")
+								_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
+								_T("lDate INTEGER, ")
+								_T("mText TEXT, ")
+								_T("lShortCut INTEGER, ")
+								_T("lDontAutoDelete INTEGER, ")
+								_T("CRC INTEGER, ")
+								_T("bIsGroup INTEGER, ")
+								_T("lParentID INTEGER, ")
+								_T("QuickPasteText TEXT)"));
+
+		db.execDML(_T("CREATE TABLE Data(")
+							_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
+							_T("lParentID INTEGER, ")
+							_T("strClipBoardFormat TEXT, ")
+							_T("ooData BLOB);"));
+
+		db.execDML(_T("CREATE TABLE Types(")
+							_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
+							_T("TypeText TEXT)"));
+
+		db.execDML(_T("CREATE UNIQUE INDEX Main_ID on Main(lID ASC)"));
+		db.execDML(_T("CREATE UNIQUE INDEX Data_ID on Data(lID ASC)"));
+		db.execDML(_T("CREATE INDEX Main_Date on Main(lDate DESC)"));
+
+		db.execDML(_T("CREATE TRIGGER delete_data_trigger BEFORE DELETE ON Main FOR EACH ROW\n")
+			_T("BEGIN\n")
+				_T("INSERT INTO MainDeletes VALUES(old.lID, datetime('now'));\n")
+			_T("END\n"));
+
+		db.execDML(_T("CREATE TABLE CopyBuffers(")
+			_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
+			_T("lClipID INTEGER, ")
+			_T("lCopyBuffer INTEGER)"));
+
+		db.execDML(_T("CREATE TABLE MainDeletes(")
+			_T("clipID INTEGER,")
+			_T("modifiedDate)"));
+
+		db.execDML(_T("CREATE TRIGGER MainDeletes_delete_data_trigger BEFORE DELETE ON MainDeletes FOR EACH ROW\n")
+			_T("BEGIN\n")
+				_T("DELETE FROM CopyBuffers WHERE lClipID = old.clipID;\n")
+				_T("DELETE FROM Data WHERE lParentID = old.clipID;\n")
+			_T("END\n"));
+
+		db.close();
+	}
+	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
+
+	return TRUE;
+}
+
+BOOL CompactDatabase()
+{
+//	if(!theApp.CloseDB())
+//		return FALSE;
+//
+//	CString csDBName = GetDBName();
+//	CString csTempDBName = csDBName;
+//	csTempDBName.Replace(".mdb", "TempDBName.mdb");
+//	
+//	//Compact the database			
+//	try
+//	{
+//		CDaoWorkspace::CompactDatabase(csDBName, csTempDBName);//, dbLangGeneral, 0, "andrew");//DATABASE_PASSWORD);
+//	}
+//	catch(CDaoException* e)
+//	{
+//		AfxMessageBox(e->m_pErrorInfo->m_strDescription);
+//		DeleteFile(csTempDBName);
+//		e->Delete();
+//		return FALSE;
+//	}
+//	catch(CMemoryException* e) 
+//	{
+//		AfxMessageBox("Memory Exception");
+//		DeleteFile(csTempDBName);
+//		e->Delete();
+//		return FALSE;
+//	}
+//	
+//	//Since compacting the database creates a new db delete the old one and replace it
+//	//with the compacted db
+//	if(DeleteFile(csDBName))
+//	{
+//		try
+//		{
+//			CFile::Rename(csTempDBName, csDBName);
+//		}
+//		catch(CFileException *e)
+//		{
+//			e->ReportError();
+//			e->Delete();
+//			return FALSE;
+//		}
+//	}
+//	else
+//		AfxMessageBox("Error Compacting Database");
+	
+	return TRUE;
+}
+
+BOOL RepairDatabase()
+{
+//	if(!theApp.CloseDB())
+//		return FALSE;
+	
+//	try
+//	{
+//		CDaoWorkspace::RepairDatabase(GetDBName());
+//	}
+//	catch(CDaoException *e)
+//	{
+//		AfxMessageBox(e->m_pErrorInfo->m_strDescription);
+//		e->Delete();
+//		return FALSE;
+//	}
+	
+	return TRUE;
+}
+
+BOOL RemoveOldEntries()
+{
+	Log(StrF(_T("Beginning of RemoveOldEntries MaxEntries: %d - Keep days: %d"), CGetSetOptions::GetMaxEntries(), CGetSetOptions::GetExpiredEntries()));
+
+	try
+	{
+		CppSQLite3DB db;
+		CString csDbPath = CGetSetOptions::GetDBPath();
+		db.open(csDbPath);
+
+		if(CGetSetOptions::GetCheckForMaxEntries())
+		{
+			long lMax = CGetSetOptions::GetMaxEntries();
+			if(lMax >= 0)
+			{
+				CClipIDs IDs;
+				
+				CppSQLite3Query q = db.execQueryEx(_T("SELECT lID, lShortCut, lDontAutoDelete FROM Main ORDER BY lDate DESC LIMIT -1 OFFSET %d"), lMax);			
+				while(q.eof() == false)
+				{
+					//Only delete entries that have no shortcut and don't have the flag set
+					if(q.getIntField(_T("lShortCut")) == 0 && q.getIntField(_T("lDontAutoDelete")) == 0)
+						IDs.Add(q.getIntField(_T("lID")));
+
+					Log(StrF(_T("From MaxEntries - Deleting Id: %d"), q.getIntField(_T("lID"))));
+
+					q.nextRow();
+				}
+
+				if(IDs.GetCount() > 0)
+				{
+					IDs.DeleteIDs(false, db);
+				}
+			}
+		}
+		
+		if(CGetSetOptions::GetCheckForExpiredEntries())
+		{
+			long lExpire = CGetSetOptions::GetExpiredEntries();
+			
+			if(lExpire)
+			{
+				CTime now = CTime::GetCurrentTime();
+				now -= CTimeSpan(lExpire, 0, 0, 0);
+				
+				CClipIDs IDs;
+				
+				CppSQLite3Query q = db.execQueryEx(_T("SELECT lID FROM Main ")
+													_T("WHERE lDate < %d AND ")
+													_T("lShortCut = 0 AND lDontAutoDelete = 0"), now.GetTime());
+
+				while(q.eof() == false)
+				{
+					IDs.Add(q.getIntField(_T("lID")));
+
+					Log(StrF(_T("From Clips Expire - Deleting Id: %d"), q.getIntField(_T("lID"))));
+
+					q.nextRow();
+				}
+				
+				if(IDs.GetCount() > 0)
+				{
+					IDs.DeleteIDs(false, db);
+				}
+			}
+		}
+
+		Log(_T("Before Deleting emptied out data"));
+
+		//delete any data items sitting out there that the main table data was deleted
+		//this was done to speed up deleted from the main table
+		int deleteCount = db.execDML(_T("DELETE FROM MainDeletes"));
+
+		Log(StrF(_T("After Deleting emptied out data rows, Count: %d"), deleteCount));
+	}
+	CATCH_SQLITE_EXCEPTION
+	
+	Log(_T("End of RemoveOldEntries"));
+
+	return TRUE;
+}
+
+BOOL EnsureDirectory(CString csPath)
+{
+	TCHAR drive[_MAX_DRIVE];
+	TCHAR dir[_MAX_DIR];
+	TCHAR fname[_MAX_FNAME];
+	TCHAR ext[_MAX_EXT];
+	
+	SPLITPATH(csPath, drive, dir, fname, ext);
+	
+	CString csDir(drive);
+	csDir += dir;
+	
+	if(FileExists(csDir) == FALSE)
+	{
+		if(CreateDirectory(csDir, NULL))
+			return TRUE;
+	}
+	else
+		return TRUE;
+	
+	return FALSE;
+}
+
+// BOOL RunZippApp(CString csCommandLine)
+// {
+// 	CString csLocalPath = GETENV(_T("U3_HOST_EXEC_PATH"));
+// 	FIX_CSTRING_PATH(csLocalPath);
+// 
+// 	CString csZippApp = GETENV(_T("U3_DEVICE_EXEC_PATH"));
+// 	FIX_CSTRING_PATH(csZippApp);
+// 	csZippApp += "7za.exe";
+// 
+// 	csZippApp += " ";
+// 	csZippApp += csCommandLine;
+// 
+// 	Log(csZippApp);
+// 
+// 	STARTUPINFO			StartupInfo;
+// 	PROCESS_INFORMATION	ProcessInformation;
+// 
+// 	ZeroMemory(&StartupInfo, sizeof(StartupInfo));
+// 	StartupInfo.cb = sizeof(StartupInfo);
+// 	ZeroMemory(&ProcessInformation, sizeof(ProcessInformation));
+// 
+// 	StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
+// 	StartupInfo.wShowWindow = SW_HIDE;
+// 
+// 	BOOL bRet = CreateProcess(NULL, csZippApp.GetBuffer(csZippApp.GetLength()), NULL, NULL, FALSE,
+// 			CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, NULL, csLocalPath,
+// 			&StartupInfo, &ProcessInformation);
+// 
+// 	if(bRet)
+// 	{
+// 		WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
+// 
+// 		DWORD dwExitCode;
+// 		GetExitCodeProcess(ProcessInformation.hProcess, &dwExitCode);
+// 
+// 		CString cs;
+// 		cs.Format(_T("Exit code from unzip = %d"), dwExitCode);
+// 		Log(cs);
+// 
+// 		if(dwExitCode != 0)
+// 		{
+// 			bRet = FALSE;
+// 		}
+// 	}
+// 	else
+// 	{
+// 		bRet = FALSE;
+// 		Log(_T("Create Process Failed"));
+// 	}
+// 
+// 	csZippApp.ReleaseBuffer();
+// 
+// 	return bRet;
+// }
+
+// BOOL CopyDownDatabase()
+// {
+// 	BOOL bRet = FALSE;
+// 
+// 	CString csZippedPath = GETENV(_T("U3_APP_DATA_PATH"));
+// 	FIX_CSTRING_PATH(csZippedPath);
+// 	
+// 	CString csUnZippedPath = csZippedPath;
+// 	csUnZippedPath += "Ditto.db";
+// 
+// 	csZippedPath += "Ditto.7z";
+// 	
+// 	CString csLocalPath = GETENV(_T("U3_HOST_EXEC_PATH"));
+// 	FIX_CSTRING_PATH(csLocalPath);
+// 
+// 	if(FileExists(csZippedPath))
+// 	{
+// 		CString csCommandLine;
+// 
+// 		//e = extract
+// 		//surround command line arguments with quotes
+// 		//-aoa = overight files with extracted files
+// 
+// 		csCommandLine += "e ";
+// 		csCommandLine += "\"";
+// 		csCommandLine += csZippedPath;
+// 		csCommandLine += "\"";
+// 		csCommandLine += " -o";
+// 		csCommandLine += "\"";
+// 		csCommandLine += csLocalPath;
+// 		csCommandLine += "\"";
+// 		csCommandLine += " -aoa";
+// 
+// 		bRet = RunZippApp(csCommandLine);
+// 
+// 		csLocalPath += "Ditto.db";
+// 	}
+// 	else if(FileExists(csUnZippedPath))
+// 	{
+// 		csLocalPath += "Ditto.db";
+// 		bRet = CopyFile(csUnZippedPath, csLocalPath, FALSE);
+// 	}
+// 
+// 	if(FileExists(csLocalPath) == FALSE)
+// 	{
+// 		Log(_T("Failed to copy files from device zip file"));
+// 	}
+// 
+// 	g_Opt.nLastDbWriteTime = GetLastWriteTime(csLocalPath);
+// 
+// 	return bRet;
+// }
+
+//BOOL CopyUpDatabase()
+//{
+//	CStringA csZippedPath = "C:\\";//getenv("U3_APP_DATA_PATH");
+//	FIX_CSTRING_PATH(csZippedPath);
+//	csZippedPath += "Ditto.zip";
+
+//	CStringA csLocalPath = GetDBName();//getenv("U3_HOST_EXEC_PATH");
+//	//FIX_CSTRING_PATH(csLocalPath);
+//	//csLocalPath += "Ditto.db";
+//
+//	CZipper Zip;
+//
+//	if(Zip.OpenZip(csZippedPath))
+//	{
+//		Zip.AddFileToZip(csLocalPath);
+//	}
+//
+//	return TRUE;
 //}

BIN
Debug/focus.dll


BIN
Debug/focus.lib


+ 1 - 3
DittoSetup/Build Portable ZIP_10.bat

@@ -26,9 +26,7 @@ copy Ditto.Settings Ditto\Ditto.Settings
 copy ..\Help\*.* Ditto\Help\
 copy ..\Debug\language\*.xml Ditto\language\
 copy ..\Debug\themes\*.xml Ditto\themes\
-copy ..\Debug\Addins\*.dll Ditto\Addins\
-
-copy ..\AccessToSqlite\Release\AccessToSqlite.dl Ditto\Addins\AccessToSqlite.dll
+copy ..\Release\Addins\*.dll Ditto\Addins\
 
 7za.exe a -tzip Output\%arg1%.zip "Ditto\*" -r
 

+ 14 - 14
EncryptDecrypt/sha2.cpp

@@ -248,14 +248,14 @@ extern "C"
 /* FIPS-180, different variables are 'rotated' on each round, returning     */
 /* to their starting positions every eight rounds                           */
 
-#define h2(i) p[i & 15] += \
-    g256_1(p[(i + 14) & 15]) + p[(i + 9) & 15] + g256_0(p[(i + 1) & 15])
+#define h2(index) p[index & 15] += \
+    g256_1(p[(index + 14) & 15]) + p[(index + 9) & 15] + g256_0(p[(index + 1) & 15])
 
-#define h2_cycle(i,j)  \
-    v[(7 - i) & 7] += (j ? h2(i) : p[i & 15]) + k256[i + j] \
-        + s256_1(v[(4 - i) & 7]) + ch(v[(4 - i) & 7], v[(5 - i) & 7], v[(6 - i) & 7]); \
-    v[(3 - i) & 7] += v[(7 - i) & 7]; \
-    v[(7 - i) & 7] += s256_0(v[(0 - i) & 7]) + maj(v[(0 - i) & 7], v[(1 - i) & 7], v[(2 - i) & 7])
+#define h2_cycle(index,j)  \
+    v[(7 - index) & 7] += (j ? h2(index) : p[index & 15]) + k256[index + j] \
+        + s256_1(v[(4 - index) & 7]) + ch(v[(4 - index) & 7], v[(5 - index) & 7], v[(6 - index) & 7]); \
+    v[(3 - index) & 7] += v[(7 - index) & 7]; \
+    v[(7 - index) & 7] += s256_0(v[(0 - index) & 7]) + maj(v[(0 - index) & 7], v[(1 - index) & 7], v[(2 - index) & 7])
 
 /* SHA256 mixing data   */
 
@@ -428,14 +428,14 @@ sha2_void sha256(unsigned char hval[], const unsigned char data[], unsigned long
 /* FIPS-180, different variables are 'rotated' on each round, returning     */
 /* to their starting positions every eight rounds                           */
 
-#define h5(i) ctx->wbuf[i & 15] += \
-    g512_1(ctx->wbuf[(i + 14) & 15]) + ctx->wbuf[(i + 9) & 15] + g512_0(ctx->wbuf[(i + 1) & 15])
+#define h5(index) ctx->wbuf[index & 15] += \
+    g512_1(ctx->wbuf[(index + 14) & 15]) + ctx->wbuf[(index + 9) & 15] + g512_0(ctx->wbuf[(index + 1) & 15])
 
-#define h5_cycle(i,j)  \
-    v[(7 - i) & 7] += (j ? h5(i) : ctx->wbuf[i & 15]) + k512[i + j] \
-        + s512_1(v[(4 - i) & 7]) + ch(v[(4 - i) & 7], v[(5 - i) & 7], v[(6 - i) & 7]); \
-    v[(3 - i) & 7] += v[(7 - i) & 7]; \
-    v[(7 - i) & 7] += s512_0(v[(0 - i) & 7]) + maj(v[(0 - i) & 7], v[(1 - i) & 7], v[(2 - i) & 7])
+#define h5_cycle(index,j)  \
+    v[(7 - index) & 7] += (j ? h5(index) : ctx->wbuf[index & 15]) + k512[index + j] \
+        + s512_1(v[(4 - index) & 7]) + ch(v[(4 - index) & 7], v[(5 - index) & 7], v[(6 - index) & 7]); \
+    v[(3 - index) & 7] += v[(7 - index) & 7]; \
+    v[(7 - index) & 7] += s512_0(v[(0 - index) & 7]) + maj(v[(0 - index) & 7], v[(1 - index) & 7], v[(2 - index) & 7])
 
 /* SHA384/SHA512 mixing data    */
 

+ 4 - 1
ExternalWindowTracker.cpp

@@ -18,6 +18,7 @@ ExternalWindowTracker::~ExternalWindowTracker(void)
 
 bool ExternalWindowTracker::TrackActiveWnd(HWND focus)
 {
+	BOOL fromHook = true
 	HWND newFocus = focus;
 	HWND newActive = ::GetForegroundWindow();
 	if(newFocus == NULL)
@@ -25,6 +26,8 @@ bool ExternalWindowTracker::TrackActiveWnd(HWND focus)
 		AttachThreadInput(GetWindowThreadProcessId(newActive, NULL), GetCurrentThreadId(), TRUE);
 		newFocus = GetFocus();
 		AttachThreadInput(GetWindowThreadProcessId(newActive, NULL), GetCurrentThreadId(), FALSE);
+
+		fromHook = false;
 	}
 
 	if(newFocus == 0 && newActive != 0)
@@ -76,7 +79,7 @@ bool ExternalWindowTracker::TrackActiveWnd(HWND focus)
 	if(theApp.QPasteWnd())
 		theApp.QPasteWnd()->UpdateStatus(true);
 
-	Log(StrF(_T("TargetActiveWindow Active: %d Focus: %d"), m_activeWnd, m_focusWnd));
+	Log(StrF(_T("TargetActiveWindow Active: %d, Focus: %d, FromHook %d"), m_activeWnd, m_focusWnd, fromHook));
 
 	return true;
 }

+ 30 - 7
MainFrm.cpp

@@ -26,6 +26,22 @@ static char THIS_FILE[] = __FILE__;
 
 bool CShowMainFrame::m_bShowingMainFrame = false;
 
+UINT RemoveDeletedItemsThread(LPVOID pParam)
+{
+	CMainFrame *mainWindow = (CMainFrame*)pParam;
+	if(mainWindow != NULL)
+	{
+		if(mainWindow->m_deletingEntries == false)
+		{
+			mainWindow->m_deletingEntries = true;
+			RemoveOldEntries();
+			mainWindow->m_deletingEntries = false;
+		}
+	}
+
+	return true;
+}
+
 CShowMainFrame::CShowMainFrame() : 
 	m_bHideMainFrameOnExit(false), 
 	m_hWnd(NULL)
@@ -98,12 +114,16 @@ CMainFrame::CMainFrame()
 	m_startKeyStateTime = 0;
 	m_bMovedSelectionMoveKeyState = false;
 	m_keyModifiersTimerCount = 0;
+	m_deletingEntries = false;
 }
 
 CMainFrame::~CMainFrame()
 {
 	if(g_Opt.m_bUseHookDllForFocus)
+	{
+		Log(_T("Unloading focus dll for tracking focus changes"));
 		StopMonitoringFocusChanges();
+	}
 	
 	CGetSetOptions::SetMainHWND(0);
 }
@@ -127,10 +147,12 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 
 	if(g_Opt.m_bUseHookDllForFocus)
 	{
+		Log(_T("Loading hook dll to track focus changes"));
 		MonitorFocusChanges(m_hWnd, WM_FOCUS_CHANGED);
 	}
 	else
 	{
+		Log(_T("Setting polling timer to track focus"));
 		SetTimer(ACTIVE_WINDOW_TIMER, g_Opt.FocusWndTimerTimeout(), 0);
 	}
 	
@@ -172,8 +194,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 
 	SetTimer(CLOSE_WINDOW_TIMER, ONE_MINUTE*60, 0);
 	SetTimer(REMOVE_OLD_REMOTE_COPIES, ONE_DAY, 0);
-
-	theApp.Delayed_RemoveOldEntries(ONE_MINUTE*2);
+	SetTimer(REMOVE_OLD_ENTRIES_TIMER, 2000, 0);
 
 	m_ulCopyGap = CGetSetOptions::GetCopyGap();
 
@@ -501,9 +522,10 @@ void CMainFrame::OnTimer(UINT nIDEvent)
 		}
 	case REMOVE_OLD_ENTRIES_TIMER:
 		{
-			theApp.m_bRemoveOldEntriesPending = false;
-			RemoveOldEntries();
-			KillTimer(REMOVE_OLD_ENTRIES_TIMER);
+			if(m_deletingEntries == false)
+			{
+				AfxBeginThread(RemoveDeletedItemsThread, this);
+			}
 			break;
 		}
 	case CHECK_FOR_UPDATE:
@@ -695,9 +717,12 @@ LRESULT CMainFrame::OnShutDown(WPARAM wParam, LPARAM lParam)
 
 LRESULT CMainFrame::OnClipboardCopied(WPARAM wParam, LPARAM lParam)
 {
+	Log(_T("Start of function OnClipboardCopied"));
 	// if the delay is undesirable, this could be altered to save one at a time,
 	//  allowing the processing of other messages between saving clips.
 	theApp.SaveCopyClips();
+
+	Log(_T("End of function OnClipboardCopied"));
 	return TRUE;
 }
 
@@ -836,8 +861,6 @@ LRESULT CMainFrame::OnAddToDatabaseFromSocket(WPARAM wParam, LPARAM lParam)
 
 	LogSendRecieveInfo("---------End of OnAddToDatabaseFromSocket");
 
-	theApp.Delayed_RemoveOldEntries(60000);
-	
 	return TRUE;
 }
 

+ 1 - 0
MainFrm.h

@@ -72,6 +72,7 @@ public:
 	bool m_bMovedSelectionMoveKeyState;
 	short m_keyModifiersTimerCount;
 	HWND m_tempFocusWnd;
+	bool m_deletingEntries;
 
 	void DoDittoCopyBufferPaste(int nCopyBuffer);
 	void DoFirstTenPositionsPaste(int nPos);

+ 0 - 280
Misc.cpp

@@ -1060,246 +1060,6 @@ CString	CTokenizer::Tail()
 	return csResult;
 }
 
-
-/*------------------------------------------------------------------*\
-Global ToolTip Manual Control Functions
-\*------------------------------------------------------------------*/
-
-void InitToolInfo( TOOLINFO& ti )
-{
-	// INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE
-	ti.cbSize = sizeof(TOOLINFO);
-	ti.uFlags = TTF_ABSOLUTE | TTF_TRACK;
-	ti.hwnd = NULL;
-	ti.hinst = NULL;
-	ti.uId = 0; // CPopup only uses uid 0
-	ti.lpszText = NULL;
-    // ToolTip control will cover the whole window
-	ti.rect.left = 0;
-	ti.rect.top = 0;
-	ti.rect.right = 0;
-	ti.rect.bottom = 0;
-}
-
-/*------------------------------------------------------------------*\
-CPopup - a tooltip that pops up manually (when Show is called).
-- technique learned from codeproject "ToolTipZen" by "Zarembo Maxim"
-\*------------------------------------------------------------------*/
-
-CPopup::CPopup()
-{
-	Init();
-}
-
-// HWND_TOP
-CPopup::CPopup( int x, int y, HWND hWndPosRelativeTo, HWND hWndInsertAfter )
-{
-	Init();
-	m_hWndPosRelativeTo = hWndPosRelativeTo;
-	m_hWndInsertAfter = hWndInsertAfter;
-	SetPos( CPoint(x,y) );
-}
-
-CPopup::~CPopup()
-{
-	Hide();
-	if( m_bOwnTT && ::IsWindow(m_hTTWnd) )
-		::DestroyWindow( m_hTTWnd );
-}
-
-void CPopup::Init()
-{
-	// initialize variables
-	m_bOwnTT = false;
-	m_hTTWnd = NULL;
-	m_bIsShowing = false;
-	m_bAllowShow = true; // used by AllowShow()
-	
-	m_Pos.x = m_Pos.y = 0;
-	m_bTop = true;
-	m_bLeft = true;
-	m_bCenterX = false;
-	m_bCenterY = false;
-	m_hWndPosRelativeTo = NULL;
-	
-	RECT rcScreen;
-	
-	GetMonitorRect(-1, &rcScreen);
-	
-	m_ScreenMaxX = rcScreen.right;
-	m_ScreenMaxY = rcScreen.bottom;
-	
-	m_hWndInsertAfter = HWND_TOP; //HWND_TOPMOST
-	
-	SetTTWnd();
-}
-
-void CPopup::SetTTWnd( HWND hTTWnd, TOOLINFO* pTI )
-{
-	if( pTI )
-		m_TI = *pTI;
-	else
-		InitToolInfo( m_TI );
-	
-	if( m_bOwnTT && ::IsWindow(m_hTTWnd) )
-	{
-		if( !::IsWindow(hTTWnd) )
-			return; // we would have to recreate the one that already exists
-		::DestroyWindow( m_hTTWnd );
-	}
-	
-	m_hTTWnd = hTTWnd;
-	if( ::IsWindow(m_hTTWnd) )
-	{
-		m_bOwnTT = false;
-		// if our uid tooltip already exists, get the data, else add it.
-		if( ! ::SendMessage(m_hTTWnd, TTM_GETTOOLINFO, 0, (LPARAM)(LPTOOLINFO) &m_TI) )
-			::SendMessage(m_hTTWnd, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &m_TI);
-	}
-	else
-	{
-		m_bOwnTT = true;
-		CreateToolTip();
-	}
-}
-
-void CPopup::CreateToolTip()
-{
-	if( m_hTTWnd != NULL )
-		return;
-	
-	// CREATE A TOOLTIP WINDOW
-	m_hTTWnd = CreateWindowEx(
-		WS_EX_TOPMOST,
-		TOOLTIPS_CLASS,
-		NULL,
-		TTS_NOPREFIX | TTS_ALWAYSTIP,		
-		CW_USEDEFAULT,
-		CW_USEDEFAULT,
-		CW_USEDEFAULT,
-		CW_USEDEFAULT,
-		NULL,
-		NULL,
-		NULL,
-		NULL
-		);
-	m_bOwnTT = true;
-	
-	// SEND AN ADDTOOL MESSAGE TO THE TOOLTIP CONTROL WINDOW
-	::SendMessage(m_hTTWnd, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &m_TI);
-}
-
-void CPopup::SetTimeout( int timeout )
-{
-	if( m_hTTWnd == NULL )
-		return;
-	::SendMessage(m_hTTWnd, TTM_SETDELAYTIME, TTDT_AUTOMATIC, timeout);
-}
-
-void CPopup::SetPos( CPoint& pos )
-{
-	m_Pos = pos;
-}
-
-void CPopup::SetPosInfo( bool bTop, bool bCenterY, bool bLeft, bool bCenterX )
-{
-	m_bTop = bTop;
-	m_bCenterY = bCenterY;
-	m_bLeft = bLeft;
-	m_bCenterX = bCenterX;
-}
-
-void CPopup::AdjustPos( CPoint& pos )
-{
-	CRect rel(0,0,0,0);
-	CRect rect(0,0,0,0);
-	
-	//	::SendMessage(m_hTTWnd, TTM_ADJUSTRECT, TRUE, (LPARAM)&rect);
-	::GetWindowRect(m_hTTWnd,&rect);
-	
-	if( ::IsWindow(m_hWndPosRelativeTo) )
-		::GetWindowRect(m_hWndPosRelativeTo, &rel);
-	
-	// move the rect to the relative origin
-	rect.bottom = rect.Height() + rel.top;
-	rect.top = rel.top;
-	rect.right = rect.Width() + rel.left;
-	rect.left = rel.left;
-	
-	// adjust the y position
-	rect.OffsetRect( 0, pos.y - (m_bCenterY? rect.Height()/2: (m_bTop? 0: rect.Height())) );
-	if( rect.bottom > m_ScreenMaxY )
-		rect.OffsetRect( 0, m_ScreenMaxY - rect.bottom );
-	
-	// adjust the x position
-	rect.OffsetRect( pos.x - (m_bCenterX? rect.Width()/2: (m_bLeft? 0: rect.Width())), 0 );
-	if( rect.right > m_ScreenMaxX )
-		rect.OffsetRect( m_ScreenMaxX - rect.right, 0 );
-	
-	pos.x = rect.left;
-	pos.y = rect.top;
-}
-
-void CPopup::SendToolTipText( CString text )
-{
-	m_csToolTipText = text;
-	
-	//Replace the tabs with spaces, the tooltip didn't like the \t s
-	text.Replace(_T("\t"), _T("  "));
-	m_TI.lpszText = (LPTSTR) (LPCTSTR) text;
-	
-	// this allows \n and \r to be interpreted correctly
-	::SendMessage(m_hTTWnd, TTM_SETMAXTIPWIDTH, 0, 500);
-	// set the text
-	::SendMessage(m_hTTWnd, TTM_SETTOOLINFO, 0, (LPARAM) (LPTOOLINFO) &m_TI);
-}
-
-void CPopup::Show( CString text, CPoint pos, bool bAdjustPos )
-{
-	if( m_hTTWnd == NULL )
-		return;
-
-	m_csToolTipText = text;
-	
-	if( !m_bIsShowing )
-		::SendMessage(m_hTTWnd, TTM_TRACKPOSITION, 0, (LPARAM)(DWORD) MAKELONG(-10000,-10000));
-	
-	SendToolTipText( text );
-	::SendMessage(m_hTTWnd, TTM_TRACKACTIVATE, true, (LPARAM)(LPTOOLINFO) &m_TI);
-	if( bAdjustPos )
-		AdjustPos(pos);
-	// set the position
-	::SendMessage(m_hTTWnd, TTM_TRACKPOSITION, 0, (LPARAM)(DWORD) MAKELONG(pos.x,pos.y));
-	
-	// make sure the tooltip will be on top.
-	::SetWindowPos( m_hTTWnd, m_hWndInsertAfter, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE );
-	
-	m_bIsShowing = true;
-}
-
-void CPopup::Show( CString text )
-{ 
-	m_csToolTipText = text;
-	Show( text, m_Pos ); 
-}
-
-void CPopup::AllowShow( CString text )
-{
-	m_csToolTipText = text;
-	
-	if( m_bAllowShow )
-		Show( text, m_Pos );
-}
-
-void CPopup::Hide()
-{
-	if( m_hTTWnd == NULL )
-		return;
-	// deactivate if it is currently activated
-	::SendMessage(m_hTTWnd, TTM_TRACKACTIVATE, FALSE, (LPARAM)(LPTOOLINFO) &m_TI);
-	m_bIsShowing = false;
-}
-
 /*------------------------------------------------------------------*\
 ID based Globals
 \*------------------------------------------------------------------*/
@@ -1333,46 +1093,6 @@ long NewGroupID(long lParentID, CString text)
 	return lID;
 }
 
-// deletes the given item
-BOOL DeleteID(long lID)
-{
-	BOOL bRet = FALSE;
-	
-	try
-	{
-		bool bCont = false;
-		bool bGroup = false;
-		{
-			CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT bIsGroup FROM Main WHERE lId = %d"), lID);
-			bCont = !q.eof();
-			if(bCont)
-			{
-				bGroup = q.getIntField(_T("bIsGroup")) > 0;
-			}
-		}
-
-		if(bCont)
-		{			
-			if(bGroup)
-			{
-				theApp.m_db.execDMLEx(_T("UPDATE Main SET lParentID = -1 WHERE lParentID = %d;"), lID);
-			}
-			
-			//now is deleted from a trigger
-			//theApp.m_db.execDMLEx(_T("DELETE FROM Data WHERE lParentID = %d;"), lID);
-
-			theApp.m_db.execDMLEx(_T("DELETE FROM Main WHERE lID = %d;"), lID);
-
-			bRet = TRUE;
-		}
-
-		theApp.OnDeleteID(lID);
-	}
-	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
-		
-	return bRet;
-}
-
 BOOL DeleteAllIDs()
 {
 	try

+ 0 - 61
Misc.h

@@ -258,71 +258,10 @@ public:
 };
 
 
-/*------------------------------------------------------------------*\
-	Global ToolTip Manual Control Functions
-\*------------------------------------------------------------------*/
-
-void InitToolInfo( TOOLINFO& ti ); // initializes toolinfo with uid 0
-
-/*------------------------------------------------------------------*\
-	CPopup - a tooltip that pops up manually (when Show is called).
-	- technique learned from codeproject "ToolTipZen" by "Zarembo Maxim"
-\*------------------------------------------------------------------*/
-
-class CPopup
-{
-public:
-	bool m_bOwnTT;
-
-	HWND m_hTTWnd; // handle to the ToolTip control
-	TOOLINFO m_TI; // struct specifying info about tool in ToolTip control
-
-	bool m_bIsShowing;
-
-	bool m_bTop;  // true if m_Pos.x is the top, false if the bottom
-	bool m_bLeft; // true if m_Pos.y is the left, false if the right
-	bool m_bCenterY; // true if m_Pos is the y center, false if corner
-	bool m_bCenterX; // true if m_Pos is the x center, false if corner
-	HWND m_hWndPosRelativeTo;
-	CPoint m_Pos;
-
-	int m_ScreenMaxX;
-	int m_ScreenMaxY;
-
-	HWND m_hWndInsertAfter;
-
-	bool m_bAllowShow; // used by SafeShow to determine whether to show or not
-
-	CString m_csToolTipText;
-
-	CPopup();
-	CPopup( int x, int y, HWND hWndPosRelativeTo = NULL, HWND hWndInsertAfter = HWND_TOP );
-	~CPopup();
-
-	void Init();
-	void SetTTWnd( HWND hTTWnd = NULL, TOOLINFO* pTI = NULL );
-	void CreateToolTip();
-
-	void SetTimeout( int timeout );
-
-	void AdjustPos( CPoint& pos );
-	void SetPos( CPoint& pos );
-	void SetPosInfo( bool bTop, bool bCenterY, bool bLeft, bool bCenterX );
-
-	void SendToolTipText( CString text );
-
-	void Show( CString text, CPoint pos, bool bAdjustPos = true );
-	void Show( CString text );
-	void AllowShow( CString text ); // only shows if m_bAllowShow is true
-
-	void Hide();
-};
-
 /*------------------------------------------------------------------*\
 	ID based Globals
 \*------------------------------------------------------------------*/
 long NewGroupID(long lParentID = 0, CString text = "");
-BOOL DeleteID(long lID);
 BOOL DeleteAllIDs();
 BOOL DeleteFormats(long lDataID, ARRAY& formatIDs);
 

+ 23 - 1
QListCtrl.cpp

@@ -52,6 +52,7 @@ CQListCtrl::CQListCtrl()
 	m_bStartTop = true;
 	m_pToolTip = NULL;
 	m_pFormatter = NULL;
+	m_allSelected = false;
 }
 
 CQListCtrl::~CQListCtrl()
@@ -651,6 +652,11 @@ void CQListCtrl::RefreshVisibleRows()
 	::UpdateWindow(m_hWnd);
 }
 
+void CQListCtrl::RefreshRow(int row)
+{
+	RedrawItems(row, row);
+}
+
 void CQListCtrl::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
 {
 	if(GetKeyState(VK_RETURN) & 0x800)
@@ -1219,7 +1225,7 @@ BOOL CQListCtrl::SetItemCountEx(int iCount, DWORD dwFlags /* = LVSICF_NOINVALIDA
 void CQListCtrl::OnSelectionChange(NMHDR* pNMHDR, LRESULT* pResult)
 {
 	NMLISTVIEW *pnmv = (NMLISTVIEW *) pNMHDR;
-	
+
 	if((pnmv->uNewState == 3) ||
 		(pnmv->uNewState == 1))
 	{
@@ -1231,6 +1237,22 @@ void CQListCtrl::OnSelectionChange(NMHDR* pNMHDR, LRESULT* pResult)
 		if(GetSelectedCount() > 0 )
 			theApp.SetStatus(NULL, FALSE);
 	}
+
+	if(GetSelectedCount() == this->GetItemCount())
+	{
+		if(m_allSelected == false)
+		{
+			Log(StrF(_T("List box Select All")));
+
+			GetParent()->SendMessage(NM_ALL_SELECTED, 0, 0);
+			m_allSelected = true;
+		}
+	}
+	else if(m_allSelected == true)
+	{
+		Log(StrF(_T("List box REMOVED Select All")));
+		m_allSelected = false;
+	}
 }
 
 void CQListCtrl::OnTimer(UINT nIDEvent) 

+ 4 - 8
QListCtrl.h

@@ -28,8 +28,9 @@
 #define NM_FILL_REST_OF_LIST		WM_USER+0x115
 
 #define NM_SET_LIST_COUNT			WM_USER+0x116
-#define NM_REFRESH_VISIBLE_ROWS		WM_USER+0x117
 #define NM_ITEM_DELETED				WM_USER+0x118
+#define NM_ALL_SELECTED				WM_USER+0x119
+#define NM_REFRESH_ROW				WM_USER+0x120
 
 #define COPY_BUFFER_HOT_KEY_1_ID	-100
 #define COPY_BUFFER_HOT_KEY_2_ID	-101
@@ -89,6 +90,7 @@ public:
 	void GetSelectionIndexes(ARRAY &arr);
 	void GetSelectionItemData(ARRAY &arr);
 	void RefreshVisibleRows();
+	void RefreshRow(int row);
 	void RemoveAllSelection();
 	BOOL SetSelection(int nRow, BOOL bSelect = TRUE);
 	BOOL SetText(int nRow, int nCol, CString cs);
@@ -131,20 +133,14 @@ protected:
 		
 	WCHAR *m_pwchTip;
 	TCHAR *m_pchTip;
-
 	HFONT m_SmallFont;
-
-	//Accelerator
 	CAccels	m_Accels;
-
 	CMapIDtoCF m_ThumbNails;
 	CMapIDtoCF m_RTFData;
-
 	CToolTipEx *m_pToolTip;
-
 	CFont m_Font;
-
 	IFormattedTextDraw *m_pFormatter;
+	bool m_allSelected;
 	
 	// Generated message map functions
 protected:

+ 3132 - 3109
QPasteWnd.cpp

@@ -1,3110 +1,3133 @@
-// QPasteWnd.cpp : implementation file
-//
-
-#include "stdafx.h"
-#include "CP_Main.h"
-#include "QPasteWnd.h"
-#include "ProcessPaste.h"
-#include "CopyProperties.h"
-#include "GroupName.h"
-#include ".\qpastewnd.h"
-#include "MoveToGroupDlg.h"
-#include "HyperLink.h"
-#include "FormatSQL.h"
-#include "MainTableFunctions.h"
-#include "Path.h"
-
-#ifdef _DEBUG
-#define new DEBUG_NEW
-#undef THIS_FILE
-static char THIS_FILE[] = __FILE__;
-#endif
-
-#define QPASTE_TITLE			"Ditto"
-
-#define ID_LIST_HEADER			0x201
-#define ID_EDIT_SEARCH			0x202
-#define ID_CANCEL				0x203
-#define ID_GROUP_TEXT			0x204
-#define ID_SHOW_GROUPS_BOTTOM	0x205
-#define ID_SHOW_GROUPS_TOP		0x206
-#define ID_BACK_BUTTON			0x207
-
-
-#define QPASTE_WIDTH			200
-#define	QPASTE_HEIGHT			200
-
-#define TIMER_FILL_CACHE		1
-#define TIMER_DO_SEARCH			2
-#define TIMER_PASTE_FROM_MODIFER	3
-
-#define THREAD_DO_QUERY				0
-#define THREAD_EXIT_THREAD			1
-#define THREAD_FILL_ACCELERATORS	2
-#define THREAD_DESTROY_ACCELERATORS	3
-
-
-/////////////////////////////////////////////////////////////////////////////
-// CQPasteWnd
-
-CQPasteWnd::CQPasteWnd()
-{	
-	m_Title = QPASTE_TITLE;
-	m_bHideWnd = true;
-	m_strSQLSearch = "";
-	m_bAllowRepaintImmediately = true;
-	m_bHandleSearchTextChange = true;
-	m_lItemsPerPage = 0;
-	m_bModifersMoveActive = false;
-}
-
-CQPasteWnd::~CQPasteWnd()
-{
-	CloseHandle(m_Events[0]);
-	CloseHandle(m_Events[1]);
-	CloseHandle(m_Events[2]);
-	CloseHandle(m_Events[3]);
-	CloseHandle(m_ExitEvent);
-	CloseHandle(m_SearchingEvent);	
-}
-
-
-BEGIN_MESSAGE_MAP(CQPasteWnd, CWndEx)
-//{{AFX_MSG_MAP(CQPasteWnd)
-	ON_WM_CREATE()
-	ON_WM_SIZE()
-	ON_WM_SETFOCUS()
-	ON_WM_ACTIVATE()
-	ON_COMMAND(ID_MENU_LINESPERROW_1, OnMenuLinesperrow1)
-	ON_COMMAND(ID_MENU_LINESPERROW_2, OnMenuLinesperrow2)
-	ON_COMMAND(ID_MENU_LINESPERROW_3, OnMenuLinesperrow3)
-	ON_COMMAND(ID_MENU_LINESPERROW_4, OnMenuLinesperrow4)
-	ON_COMMAND(ID_MENU_LINESPERROW_5, OnMenuLinesperrow5)
-	ON_COMMAND(ID_MENU_TRANSPARENCY_10, OnMenuTransparency10)
-	ON_COMMAND(ID_MENU_TRANSPARENCY_15, OnMenuTransparency15)
-	ON_COMMAND(ID_MENU_TRANSPARENCY_20, OnMenuTransparency20)
-	ON_COMMAND(ID_MENU_TRANSPARENCY_25, OnMenuTransparency25)
-	ON_COMMAND(ID_MENU_TRANSPARENCY_30, OnMenuTransparency30)
-	ON_COMMAND(ID_MENU_TRANSPARENCY_40, OnMenuTransparency40)
-	ON_COMMAND(ID_MENU_TRANSPARENCY_5, OnMenuTransparency5)
-	ON_COMMAND(ID_MENU_TRANSPARENCY_NONE, OnMenuTransparencyNone)
-	ON_NOTIFY(NM_RCLICK, ID_LIST_HEADER, OnRclickQuickPaste)
-	ON_COMMAND(ID_MENU_DELETE, OnMenuDelete)
-	ON_COMMAND(ID_MENU_POSITIONING_ATCARET, OnMenuPositioningAtcaret)
-	ON_COMMAND(ID_MENU_POSITIONING_ATCURSOR, OnMenuPositioningAtcursor)
-	ON_COMMAND(ID_MENU_POSITIONING_ATPREVIOUSPOSITION, OnMenuPositioningAtpreviousposition)
-	ON_COMMAND(ID_MENU_OPTIONS, OnMenuOptions)
-	ON_BN_CLICKED(ID_CANCEL, OnCancelFilter)
-	ON_COMMAND(ID_MENU_EXITPROGRAM, OnMenuExitprogram)
-	ON_COMMAND(ID_MENU_TOGGLECONNECTCV, OnMenuToggleConnectCV)
-	ON_COMMAND(ID_MENU_PROPERTIES, OnMenuProperties)
-	ON_WM_CLOSE()
-	ON_NOTIFY(LVN_BEGINDRAG, ID_LIST_HEADER, OnBegindrag)
-	ON_WM_SYSKEYDOWN()
-	ON_NOTIFY(LVN_GETDISPINFO, ID_LIST_HEADER, GetDispInfo)
-	ON_NOTIFY(LVN_ODFINDITEM, ID_LIST_HEADER, OnFindItem)
-	ON_COMMAND(ID_MENU_FIRSTTENHOTKEYS_USECTRLNUM, OnMenuFirsttenhotkeysUsectrlnum)
-	ON_COMMAND(ID_MENU_FIRSTTENHOTKEYS_SHOWHOTKEYTEXT, OnMenuFirsttenhotkeysShowhotkeytext)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_ALLWAYSSHOWDESCRIPTION, OnMenuQuickoptionsAllwaysshowdescription)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSONTOP, OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW, OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSSHOWDESCRIPTION, OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES, OnMenuQuickoptionsPromptfornewgroupnames)
-	ON_BN_CLICKED(ID_SHOW_GROUPS_BOTTOM, OnShowGroupsBottom)
-	ON_BN_CLICKED(ID_SHOW_GROUPS_TOP, OnShowGroupsTop)
-	ON_COMMAND(ID_MENU_VIEWGROUPS, OnMenuViewgroups)
-	ON_COMMAND(ID_MENU_QUICKPROPERTIES_SETTONEVERAUTODELETE, OnMenuQuickpropertiesSettoneverautodelete)
-	ON_COMMAND(ID_MENU_QUICKPROPERTIES_AUTODELETE, OnMenuQuickpropertiesAutodelete)
-	ON_COMMAND(ID_MENU_QUICKPROPERTIES_REMOVEHOTKEY, OnMenuQuickpropertiesRemovehotkey)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_EIGHT, OnMenuSenttoFriendEight)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_ELEVEN, OnMenuSenttoFriendEleven)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_FIFTEEN, OnMenuSenttoFriendFifteen)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_FIVE, OnMenuSenttoFriendFive)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_FORE, OnMenuSenttoFriendFore)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_FORETEEN, OnMenuSenttoFriendForeteen)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_NINE, OnMenuSenttoFriendNine)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_SEVEN, OnMenuSenttoFriendSeven)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_SIX, OnMenuSenttoFriendSix)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_TEN, OnMenuSenttoFriendTen)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_THIRTEEN, OnMenuSenttoFriendThirteen)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_THREE, OnMenuSenttoFriendThree)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_TWELVE, OnMenuSenttoFriendTwelve)
-	ON_COMMAND(ID_MENU_SENTTO_FRIEND_TWO, OnMenuSenttoFriendTwo)
-	ON_COMMAND(ID_MENU_SENTTO_FRIENDONE, OnMenuSenttoFriendone)
-	ON_COMMAND(ID_MENU_SENTTO_PROMPTFORIP, OnMenuSenttoPromptforip)
-	ON_COMMAND(ID_MENU_GROUPS_MOVETOGROUP, OnMenuGroupsMovetogroup)
-	ON_COMMAND(ID_MENU_PASTEPLAINTEXTONLY, OnMenuPasteplaintextonly)
-	ON_COMMAND(ID_MENU_HELP, OnMenuHelp)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_FONT, OnMenuQuickoptionsFont)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_SHOWTHUMBNAILS, OnMenuQuickoptionsShowthumbnails)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_DRAWRTFTEXT, OnMenuQuickoptionsDrawrtftext)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_PASTECLIPAFTERSELECTION, OnMenuQuickoptionsPasteclipafterselection)
-	ON_EN_CHANGE(ID_EDIT_SEARCH, OnSearchEditChange)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_FINDASYOUTYPE, OnMenuQuickoptionsFindasyoutype)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_ENSUREENTIREWINDOWISVISIBLE, OnMenuQuickoptionsEnsureentirewindowisvisible)
-	ON_COMMAND(ID_MENU_QUICKOPTIONS_SHOWCLIPSTHATAREINGROUPSINMAINLIST, OnMenuQuickoptionsShowclipsthatareingroupsinmainlist)
-	ON_UPDATE_COMMAND_UI(ID_MENU_NEWGROUP, OnUpdateMenuNewgroup)
-	ON_UPDATE_COMMAND_UI(ID_MENU_NEWGROUPSELECTION, OnUpdateMenuNewgroupselection)
-	ON_UPDATE_COMMAND_UI(ID_MENU_ALLWAYSONTOP, OnUpdateMenuAllwaysontop)
-	ON_UPDATE_COMMAND_UI(ID_MENU_VIEWFULLDESCRIPTION, OnUpdateMenuViewfulldescription)
-	ON_UPDATE_COMMAND_UI(ID_MENU_VIEWGROUPS, OnUpdateMenuViewgroups)
-	ON_UPDATE_COMMAND_UI(ID_MENU_PASTEPLAINTEXTONLY, OnUpdateMenuPasteplaintextonly)
-	ON_UPDATE_COMMAND_UI(ID_MENU_DELETE, OnUpdateMenuDelete)
-	ON_UPDATE_COMMAND_UI(ID_MENU_PROPERTIES, OnUpdateMenuProperties)
-	ON_COMMAND(ID_QUICKOPTIONS_PROMPTTODELETECLIP, OnPromptToDeleteClip)
-	ON_WM_DESTROY()
-	//}}AFX_MSG_MAP
-	ON_MESSAGE(NM_SELECT, OnListSelect)
-	ON_MESSAGE(NM_END, OnListEnd)
-	ON_MESSAGE(CB_SEARCH, OnSearch)
-	ON_MESSAGE(NM_DELETE, OnDelete)
-	ON_MESSAGE(NM_PROPERTIES, OnProperties)
-	ON_NOTIFY(NM_GETTOOLTIPTEXT, ID_LIST_HEADER, OnGetToolTipText)
-	ON_MESSAGE(NM_SELECT_DB_ID, OnListSelect_DB_ID)
-	ON_MESSAGE(NM_SELECT_INDEX, OnListSelect_Index)
-	ON_MESSAGE(WM_REFRESH_VIEW, OnRefreshView)
-	ON_WM_NCLBUTTONDBLCLK()
-	ON_WM_WINDOWPOSCHANGING()
-	ON_COMMAND(ID_VIEWCAPTIONBARON_RIGHT, OnViewcaptionbaronRight)
-	ON_COMMAND(ID_VIEWCAPTIONBARON_BOTTOM, OnViewcaptionbaronBottom)
-	ON_COMMAND(ID_VIEWCAPTIONBARON_LEFT, OnViewcaptionbaronLeft)
-	ON_COMMAND(ID_VIEWCAPTIONBARON_TOP, OnViewcaptionbaronTop)
-	ON_COMMAND(ID_MENU_AUTOHIDE, OnMenuAutohide)
-	ON_COMMAND(ID_MENU_VIEWFULLDESCRIPTION, OnMenuViewfulldescription)
-	ON_COMMAND(ID_MENU_ALLWAYSONTOP, OnMenuAllwaysontop)
-	ON_COMMAND(ID_SORT_ASCENDING, OnSortAscending)
-	ON_COMMAND(ID_SORT_DESCENDING, OnSortDescending)
-	ON_COMMAND(ID_MENU_NEWGROUP, OnMenuNewGroup)
-	ON_COMMAND(ID_MENU_NEWGROUPSELECTION, OnMenuNewGroupSelection)
-	ON_MESSAGE(NM_GROUP_TREE_MESSAGE, OnGroupTreeMessage)
-	ON_COMMAND(ID_BACK_BUTTON, OnBackButton)
-	ON_MESSAGE(CB_UPDOWN, OnUpDown)
-	ON_MESSAGE(NM_INACTIVE_TOOLTIPWND, OnToolTipWndInactive)
-	ON_MESSAGE(NM_SET_LIST_COUNT, OnSetListCount)
-	ON_MESSAGE(NM_REFRESH_VISIBLE_ROWS, OnRefeshVisibleRows)
-	ON_MESSAGE(NM_ITEM_DELETED, OnItemDeleted)
-	ON_WM_TIMER()
-	ON_COMMAND(ID_MENU_EXPORT, OnMenuExport)
-	ON_COMMAND(ID_MENU_IMPORT, OnMenuImport)
-	ON_COMMAND(ID_QUICKPROPERTIES_REMOVEQUICKPASTE, OnQuickpropertiesRemovequickpaste)
-	ON_COMMAND(ID_MENU_EDITITEM, OnMenuEdititem)
-	ON_COMMAND(ID_MENU_NEWCLIP, OnMenuNewclip)
-	ON_UPDATE_COMMAND_UI(ID_MENU_EDITITEM, OnUpdateMenuEdititem)
-	ON_UPDATE_COMMAND_UI(ID_MENU_NEWCLIP, OnUpdateMenuNewclip)
-	ON_WM_CTLCOLOR_REFLECT()
-	ON_COMMAND_RANGE(3000, 4000, OnAddinSelect)
-	END_MESSAGE_MAP()
-
-
-/////////////////////////////////////////////////////////////////////////////
-// CQPasteWnd message handlers
-
-HBRUSH CQPasteWnd::CtlColor(CDC* pDC, UINT nCtlColor) 
-{
-	pDC->SetBkMode(TRANSPARENT);
-	pDC->SetBkColor(RGB(255, 0, 0));
-
-	return (HBRUSH)GetStockObject(NULL_BRUSH);
-}
-
-BOOL CQPasteWnd::Create(const POINT& ptStart, CWnd* pParentWnd) 
-{
-	// Get the previous size of the QPaste window
-	CSize szWnd;
-	CGetSetOptions::GetQuickPasteSize(szWnd);
-	
-	return CWndEx::Create(CRect(ptStart, szWnd), pParentWnd);
-}
-
-UINT  StartThread(LPVOID pParam)
-{
-	Log(_T("Starting fill list thread"));
-
-	CQPasteWnd *pWnd = (CQPasteWnd*)pParam;
-	pWnd->RunThread();
-
-	Log(_T("Ending fill list thread"));
-
-	return TRUE;
-}
-
-int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
-{
-	if (CWndEx::OnCreate(lpCreateStruct) == -1)
-		return -1;
-
-	SetWindowText(_T(QPASTE_TITLE));
-	
-	m_Search.Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER,	CRect(0, 0, 0, 0), this, ID_EDIT_SEARCH);
-	
-	// Create the header control
-	if (!m_lstHeader.Create(WS_TABSTOP|WS_CHILD|WS_VISIBLE|LVS_NOCOLUMNHEADER|LVS_REPORT|LVS_SHOWSELALWAYS|LVS_OWNERDATA,
-		CRect(0, 0, 0, 0),	this, ID_LIST_HEADER))
-	{
-		ASSERT(FALSE);
-		return -1;
-	}
-
-	((CWnd *)&m_GroupTree)->CreateEx(NULL, _T("SysTreeView32"), NULL, WS_BORDER|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS, CRect(0, 0, 100, 100), this, 0);
-	m_GroupTree.ModifyStyle(WS_CAPTION, WS_BORDER);
-	
-	m_GroupTree.SetNotificationWndEx(m_hWnd);
-	m_GroupTree.ShowWindow(SW_HIDE);
-	
-	m_ShowGroupsFolderBottom.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_SHOW_GROUPS_BOTTOM);
-	m_ShowGroupsFolderBottom.LoadBitmaps(IDB_CLOSED_FOLDER, IDB_CLOSED_FOLDER_PRESSED, IDB_CLOSED_FOLDER_FOCUSED);
-	m_ShowGroupsFolderBottom.ShowWindow(SW_SHOW);
-	
-	m_ShowGroupsFolderTop.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_SHOW_GROUPS_TOP);
-	m_ShowGroupsFolderTop.LoadBitmaps(IDB_OPEN_FOLDER, IDB_OPEN_FOLDER_PRESSED, IDB_OPEN_FOLDER_FOCUSED);
-	m_ShowGroupsFolderTop.ShowWindow(SW_SHOW);
-
-	m_BackButton.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_BACK_BUTTON);
-	m_BackButton.LoadBitmaps(IDB_BACK, IDB_BACK_PRESSED, IDB_BACK_FOCUSED);
-	m_BackButton.ShowWindow(SW_SHOW);
-	
-	m_btCancel.Create(_T("&C"), WS_CHILD|BS_PUSHBUTTON|WS_TABSTOP/*|BS_FLAT*/, CRect(0, 0, 0, 0), this, ID_CANCEL);
-	
-	m_stGroup.Create(_T(""), WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, ID_GROUP_TEXT);
-	
-	//Set the z-order
-	m_lstHeader.SetWindowPos(this, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
-	m_Search.SetWindowPos(&m_lstHeader, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
-	m_btCancel.SetWindowPos(&m_Search, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
-	m_ShowGroupsFolderBottom.SetWindowPos(&m_Search, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
-	
-	//LVS_EX_FLATSB
-	m_lstHeader.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
-	
-	// Create the columns
-	if (m_lstHeader.InsertColumn(0, _T(""), LVCFMT_LEFT, 2500, 0) != 0)
-	{
-		ASSERT(FALSE);
-		return -1;
-	}
-	
-#ifdef AFTER_98
-	m_Alpha.SetWindowHandle(m_hWnd);	
-#endif
-	
-	m_TitleFont.CreateFont(14,0,-900,0,400,FALSE,FALSE,0,ANSI_CHARSET,
-		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
-		DEFAULT_PITCH|FF_SWISS, _T("Arial"));
-	
-	m_SearchFont.CreatePointFont(80, _T("@Arial Unicode MS"));
-	
-	GroupFont.CreateFont(-11, 0, 0, 0, 400, 0, 1, 0, DEFAULT_CHARSET, 3, 2, 1, 34, _T("MS Sans Serif"));
-	
-	m_Search.SetFont(&m_SearchFont);
-	m_btCancel.SetFont(&m_SearchFont);
-	m_stGroup.SetFont(&GroupFont);
-
-	UpdateFont();
-
-	m_Events[0] = CreateEvent(NULL, TRUE, FALSE, _T(""));
-	m_Events[1] = CreateEvent(NULL, TRUE, FALSE, _T(""));
-	m_Events[2] = CreateEvent(NULL, TRUE, FALSE, _T(""));
-	m_Events[3] = CreateEvent(NULL, TRUE, FALSE, _T(""));
-	m_ExitEvent = CreateEvent(NULL, TRUE, FALSE, _T(""));
-	m_SearchingEvent = CreateEvent(NULL, TRUE, FALSE, _T(""));
-
-	AfxBeginThread(StartThread, this);
-		
-	return 0;
-}
-
-void CQPasteWnd::OnSize(UINT nType, int cx, int cy) 
-{
-	CWndEx::OnSize(nType, cx, cy);
-	
-	if(!IsWindow(m_lstHeader.m_hWnd))
-		return;
-	
-	MoveControls();
-}
-
-void CQPasteWnd::MoveControls()
-{
-	CRect crRect;
-	GetClientRect(crRect);
-	int cx = crRect.Width();
-	int cy = crRect.Height();
-	
-	long lTopOfListBox = 0;
-	
-	if(theApp.m_GroupID > 0)
-	{
-		m_stGroup.ShowWindow(SW_SHOW);
-		m_ShowGroupsFolderTop.ShowWindow(SW_SHOW);
-		m_BackButton.ShowWindow(SW_SHOW);
-
-		m_BackButton.MoveWindow(0, 0, 18, 16);
-		m_ShowGroupsFolderTop.MoveWindow(22, 0, 18, 16);
-		m_stGroup.MoveWindow(44, 0, cx, 16);
-		
-		lTopOfListBox = 16;	
-	}
-	else
-	{
-		m_BackButton.ShowWindow(SW_HIDE);
-		m_stGroup.ShowWindow(SW_HIDE);
-		m_ShowGroupsFolderTop.ShowWindow(SW_HIDE);
-	}
-	
-	// Resize the list control
-	m_lstHeader.MoveWindow(0, lTopOfListBox, cx, cy - 23 - lTopOfListBox);
-	
-	int nWidth = cx;
-	
-	if(m_strSQLSearch.IsEmpty() == FALSE)
-	{
-		m_btCancel.ShowWindow(SW_SHOW);
-		m_btCancel.MoveWindow(cx - 17, cy - 18, 15, 15);
-		nWidth -= 19;
-	}
-	else
-		m_btCancel.ShowWindow(SW_HIDE);
-	
-	m_Search.MoveWindow(18, cy - 20, nWidth-20, 18);
-	
-	m_ShowGroupsFolderBottom.MoveWindow(0, cy - 19, 18, 16);
-	
-	// Set the column widths
-	//m_lstHeader.SetColumnWidth(0, cx);
-}
-
-void CQPasteWnd::OnSetFocus(CWnd* pOldWnd)
-{
-	CWndEx::OnSetFocus(pOldWnd);
-
-	::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
-	
-	// Set the focus to the list control
-	if(::IsWindow(m_lstHeader.m_hWnd))
-		m_lstHeader.SetFocus();
-}
-
-void CQPasteWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
-{
-	CWndEx::OnActivate(nState, pWndOther, bMinimized);
-	
-	if(m_bHideWnd == false || m_lstHeader.GetToolTipHWnd() == pWndOther->GetSafeHwnd())
-		return;
-	
-	if (nState == WA_INACTIVE)
-	{
-		m_bModifersMoveActive = false;
-
-		if(!g_Opt.m_bShowPersistent)
-		{
-			HideQPasteWindow();
-		}
-		
-		//re register the global hot keys for the last ten
-		if(theApp.m_bAppExiting == false)
-			g_HotKeys.RegisterAll();
-
-		m_lstHeader.HidePopup();
-	}
-	else if (nState == WA_ACTIVE || nState == WA_CLICKACTIVE)
-	{
-		if(!theApp.m_bShowingQuickPaste)
-		{
-			ShowQPasteWindow(m_Cache.size() == 0);
-		}
-
-		//Unregister the global hot keys for the last ten copies
-		g_HotKeys.UnregisterAll(false, true);
-	}
-}
-
-BOOL CQPasteWnd::HideQPasteWindow()
-{
-	if(!theApp.m_bShowingQuickPaste) 
-		return FALSE;
-
-	m_CritSection.Lock();
-		m_bStopQuery = true;
-	m_CritSection.Unlock();
-
-	//Reset the flagShell_TrayWnd
-	theApp.m_bShowingQuickPaste = false;
-	theApp.m_activeWnd.ReleaseFocus();
-	
-	SetEvent(m_Events[THREAD_DESTROY_ACCELERATORS]);
-//	m_lstHeader.DestroyAndCreateAccelerator(FALSE);
-	
-	KillTimer(TIMER_FILL_CACHE);
-	
-	//Save the size
-	CRect rect;
-	GetWindowRectEx(&rect);
-	CGetSetOptions::SetQuickPasteSize(rect.Size());
-	CGetSetOptions::SetQuickPastePoint(rect.TopLeft());
-
-	// Hide the window when the focus is lost
-	ShowWindow(SW_HIDE);
-	
-	//Reset the selection in the search combo
-	m_bHandleSearchTextChange = false;
-	m_Search.SetWindowText(_T(""));
-	m_bHandleSearchTextChange = true;
-
-	if(m_strSQLSearch.IsEmpty() == FALSE)
-	{
-		m_CritSection.Lock();
-		{
-			m_bStopQuery = true;
-		}
-		m_CritSection.Unlock();
-
-		//Wait for the thread to stop fill the cache so we can clear it
-		WaitForSingleObject(m_SearchingEvent, INFINITE);
-
-		m_CritSection.Lock();
-		{
-			m_Cache.clear();
-		}
-		m_CritSection.Unlock();
-	}
-	
-	return TRUE;
-}
-
-BOOL CQPasteWnd::ShowQPasteWindow(BOOL bFillList)
-{
-	//Ensure we have the latest theme file, this checks the last write time so it doesn't read the file each time
-	g_Opt.m_Theme.Load(g_Opt.GetTheme(), false, true);
-
-	//Set the flag so we can't open this up again
-	theApp.m_bShowingQuickPaste = true;
-	SetCaptionColorActive(g_Opt.m_bShowPersistent, theApp.GetConnectCV());
-	
-	// use invalidation to avoid unnecessary repainting
-	m_bAllowRepaintImmediately = false;
-	UpdateStatus();
-	
-	SetEvent(m_Events[THREAD_FILL_ACCELERATORS]);
-	
-	m_bHideWnd = true;
-	
-#ifdef AFTER_98
-	//Set the transparency
-	if(CGetSetOptions::GetEnableTransparency())
-	{
-		m_Alpha.SetTransparent(TRUE);
-		
-		float fPercent =  CGetSetOptions::GetTransparencyPercent() / (float)100.0;
-		
-		m_Alpha.SetOpacity(OPACITY_MAX - (int)(fPercent * OPACITY_MAX));
-	}
-	else
-	{
-		m_Alpha.SetTransparent(FALSE);
-	}
-#endif
-	
-	m_lstHeader.SetNumberOfLinesPerRow(CGetSetOptions::GetLinesPerRow());
-	
-	m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
-
-	m_CritSection.Lock();
-		if(m_Cache.size() == 0)
-			bFillList = TRUE;
-	m_CritSection.Unlock();
-	
-	if(bFillList)
-		FillList();	// FillList calls MoveControls
-	else
-		MoveControls();
-	
-	// from now on, for interactive use, we can repaint immediately
-	m_bAllowRepaintImmediately = true;
-	
-	// always on top... for persistent showing (g_Opt.m_bShowPersistent)
-	// SHOWWINDOW was also integrated into this function rather than calling it separately
-	::SetWindowPos( m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW );
-
-	SetKeyModiferState(true);
-	
-	return TRUE;
-}
-
-bool CQPasteWnd::Add(const CString &csHeader, const CString &csText, int nID)
-{
-	int nNewIndex;
-	
-	if(g_Opt.m_bHistoryStartTop)
-	{
-		// Insert the item in the list control
-		if ((nNewIndex = m_lstHeader.InsertItem(m_lstHeader.GetItemCount(), csHeader)) == -1)
-			return false;
-	}
-	else
-	{
-		if ((nNewIndex = m_lstHeader.InsertItem(m_lstHeader.GetItemCount(), csHeader)) == -1)
-			return false;
-	}
-	
-	m_lstHeader.SetItemData(nNewIndex, nID);
-	
-	return true;
-}
-
-BOOL CQPasteWnd::OpenID(long lID, bool bOnlyLoad_CF_TEXT, CClipFormats *pPasteFormats)
-{
-	if(pPasteFormats == NULL)
-	{
-		if(theApp.EnterGroupID(lID))
-			return TRUE;
-	}
-
-	if(GetKeyState(VK_SHIFT) & 0x8000)
-	{
-		bOnlyLoad_CF_TEXT = true;
-	}
-
-	// else, it is a clip, so paste it
-	CProcessPaste paste;
-	
-	paste.m_bSendPaste = g_Opt.m_bSendPasteMessageAfterSelection == TRUE ? true : false;
-	paste.m_bOnlyPaste_CF_TEXT = bOnlyLoad_CF_TEXT;
-
-	if(pPasteFormats != NULL)
-	{
-		paste.SetCustomPasteFormats(pPasteFormats);
-	}
-	else
-	{
-		paste.GetClipIDs().Add(lID);
-	}
-	paste.DoPaste();
-	theApp.OnPasteCompleted();
-
-	if(g_Opt.m_bSendPasteMessageAfterSelection == FALSE)
-		theApp.m_activeWnd.ActivateTarget();
-
-	if(g_Opt.m_bShowPersistent && g_Opt.GetAutoHide())
-		MinMaxWindow(FORCE_MIN);
-
-	return TRUE;
-}
-
-BOOL CQPasteWnd::OpenSelection(bool bOnlyLoad_CF_TEXT)
-{
-	ARRAY IDs;
-	m_lstHeader.GetSelectionItemData( IDs );
-    
-	int count = IDs.GetSize();
-	
-	if(count <= 0)
-		return FALSE;
-	
-	if(count == 1)
-		return OpenID(IDs[0], bOnlyLoad_CF_TEXT);
-
-	if(GetKeyState(VK_SHIFT) & 0x8000)
-	{
-		bOnlyLoad_CF_TEXT = true;
-	}
-	
-	CProcessPaste paste;
-
-	paste.m_bSendPaste = g_Opt.m_bSendPasteMessageAfterSelection == TRUE ? true : false;
-	paste.m_bOnlyPaste_CF_TEXT = bOnlyLoad_CF_TEXT;
-	
-	paste.GetClipIDs().Copy(IDs);
-	paste.DoPaste();
-	theApp.OnPasteCompleted();
-
-	if(g_Opt.m_bSendPasteMessageAfterSelection == FALSE)
-		theApp.m_activeWnd.ActivateTarget();
-
-	if(g_Opt.m_bShowPersistent && g_Opt.GetAutoHide())
-		MinMaxWindow(FORCE_MIN);
-
-	return TRUE;
-}
-
-BOOL CQPasteWnd::OpenIndex( long nItem )
-{
-	return OpenID( m_lstHeader.GetItemData(nItem) );
-}
-
-BOOL CQPasteWnd::NewGroup( bool bGroupSelection )
-{	
-	//Get the selected ids
-	CClipIDs IDs;
-	m_lstHeader.GetSelectionItemData( IDs );
-	
-	CGroupName Name;
-	CString csName("");
-	
-	if(g_Opt.m_bPrompForNewGroupName)
-	{
-		m_bHideWnd = false;
-		
-		int nRet = Name.DoModal();
-	
-		m_bHideWnd = true;
-		
-		if(nRet == IDOK)
-			csName = Name.m_csName;
-		else
-			return false;
-	}
-	
-	long lID = NewGroupID(theApp.GetValidGroupID(), csName);
-	
-	if(lID <= 0)
-		return FALSE;
-	
-	if(!bGroupSelection)
-	{
-		theApp.m_FocusID = lID; // focus on the new group
-		FillList();
-		return TRUE;
-	}
-	
-	IDs.MoveTo(lID);
-	theApp.EnterGroupID(lID);
-	return TRUE;
-}
-
-long CQPasteWnd::SetListID(long lID)
-{
-	long lRet = -1;
-
-	m_CritSection.Lock();
-	{
-		int nCount = m_Cache.size();
-		for(int i = 0; i < nCount; i++)
-		{
-			CMainTable table = m_Cache[i];
-
-			if(table.m_lID == lID)
-			{
-				m_lstHeader.SetListPos(i);
-				lRet = i;
-				break;
-			}
-		}
-	}
-	m_CritSection.Unlock();
-
-	return lRet;
-}
-
-
-LRESULT CQPasteWnd::OnListSelect_DB_ID(WPARAM wParam, LPARAM lParam)
-{
-	OpenID(wParam);
-	return TRUE;
-}
-
-LRESULT CQPasteWnd::OnListSelect_Index(WPARAM wParam, LPARAM lParam)
-{
-	if((int)wParam >= m_lstHeader.GetItemCount())
-		return FALSE;
-	
-	OpenIndex(wParam);
-	
-	return TRUE;
-}
-
-LRESULT CQPasteWnd::OnListSelect(WPARAM wParam, LPARAM lParam)
-{
-	int nCount = (int) wParam;
-	long *pItems = (long*) lParam;
-	
-	OpenSelection(false);
-	
-	return TRUE;
-}
-
-LRESULT CQPasteWnd::OnListEnd(WPARAM wParam, LPARAM lParam)
-{
-	HideQPasteWindow();
-	return 0;
-}
-
-LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
-{
-	MSG msg;
-	// remove all additional refresh view messages from the queue
-	while(::PeekMessage(&msg, m_hWnd, WM_REFRESH_VIEW, WM_REFRESH_VIEW, PM_REMOVE))
-	{
-	}
-
-	theApp.m_FocusID = -1;
-
-	if(theApp.m_bShowingQuickPaste)
-	{
-		FillList();
-	}
-	else
-	{
-		//Wait for the thread to stop fill the cache so we can clear it
-		WaitForSingleObject(m_SearchingEvent, INFINITE);
-
-		m_CritSection.Lock();
-		{
-			m_Cache.clear();
-		}
-		m_CritSection.Unlock();
-	}
-	
-	return TRUE;
-}
-
-void CQPasteWnd::RefreshNc(bool bRepaintImmediately)
-{
-	if(!theApp.m_bShowingQuickPaste)
-		return;
-	
-	if(bRepaintImmediately && m_bAllowRepaintImmediately)
-		OnNcPaint();
-	else
-		InvalidateNc();
-}
-
-void CQPasteWnd::UpdateStatus(bool bRepaintImmediately)
-{
-	CString title = m_Title;
-	CString prev;
-	
-	GetWindowText(prev);
-	
-	CString cs;
-	cs.Format(_T(" - %d/%d"), m_lstHeader.GetSelectedCount(), m_lstHeader.GetItemCount());
-	title += cs;
-		
-	if(theApp.m_Status != "")
-	{
-		title += " [ ";
-		title += theApp.m_Status;
-		title += " ] - ";
-	}
-	else
-		title += " - ";
-	
-	if(theApp.m_IC_IDs.GetSize() > 0)
-	{
-		if( theApp.m_IC_bCopy )
-			title += "Copying";
-		else
-			title += "Moving";
-		
-		title += " - ";
-	}
-	
-	if(::IsWindow(theApp.m_activeWnd.ActiveWnd()))
-		title += theApp.m_activeWnd.ActiveWndName();
-	else
-		title += theApp.m_Language.GetString("No_Target", "No target");
-	
-	if(title != prev)
-	{
-		SetWindowText(title);
-		RefreshNc(bRepaintImmediately);
-	}
-}
-
-BOOL CQPasteWnd::FillList(CString csSQLSearch/*=""*/)
-{
-	KillTimer(TIMER_DO_SEARCH);
-
-	m_CritSection.Lock();
-		m_bStopQuery = true;
-	m_CritSection.Unlock();
-
-	CString strFilter;
-	CString strParentFilter;
-	CString csSort;
-	
-	// History Group
-	if(theApp.m_GroupID < 0)
-	{
-		m_lstHeader.m_bStartTop = g_Opt.m_bHistoryStartTop;
-		if( g_Opt.m_bHistoryStartTop )
-			csSort = "bIsGroup ASC, lDate DESC";
-		else
-			csSort = "bIsGroup ASC, lDate ASC";
-		
-		if(g_Opt.m_bShowAllClipsInMainList)
-		{
-			strFilter = "((bIsGroup = 1 AND lParentID = -1) OR bIsGroup = 0)";
-		}
-		else
-		{
-			strFilter = "((bIsGroup = 1 AND lParentID = -1) OR (bIsGroup = 0 AND lParentID = -1))";
-		}
-	}
-	else // it's some other group
-	{
-		m_lstHeader.m_bStartTop = true;
-		
-		if(g_Opt.m_bHistoryStartTop)
-			csSort = "bIsGroup DESC, lDate DESC";
-		else
-			csSort = "bIsGroup ASC, lDate ASC";
-		
-		if(theApp.m_GroupID >= 0)
-		{
-			strFilter.Format(_T("lParentID = %d"), theApp.m_GroupID);
-			strParentFilter = strFilter;
-		}
-		
-		m_stGroup.SetWindowText(theApp.m_GroupText);
-	}
-	
-	CRect crRect;
-	GetClientRect(crRect);
-	
-	CString csSQL;
-	if(csSQLSearch == "")
-	{
-		m_strSQLSearch = "";
-	}
-	else
-	{
-		CFormatSQL SQLFormat;
-		SQLFormat.SetVariable("mText");
-		SQLFormat.Parse(csSQLSearch);
-
-		strFilter = SQLFormat.GetSQLString();
-
-		if(strParentFilter.IsEmpty() == FALSE)
-		{
-			strFilter += " AND ";
-			strFilter += strParentFilter;
-		}
-
-		m_strSQLSearch = strFilter;
-	}
-	
-
-	m_CritSection.Lock();
-		//Format the count and select sql queries for the thread
-		m_CountSQL.Format(_T("SELECT COUNT(lID) FROM Main where %s ORDER by lDate"), strFilter);
-
-		m_SQL.Format(_T("SELECT lID, mText, lParentID, lDontAutoDelete, ")
-						_T("lShortCut, bIsGroup, QuickPasteText FROM Main where %s order by %s"), strFilter, csSort);
-
-		m_lItemsPerPage = m_lstHeader.GetCountPerPage();
-	m_CritSection.Unlock();
-
-	SetEvent(m_Events[THREAD_DO_QUERY]);
-		
-	return TRUE;
-}
-
-
-void CQPasteWnd::OnRclickQuickPaste(NMHDR* pNMHDR, LRESULT* pResult) 
-{
-	POINT pp;
-	CMenu cmPopUp;
-	CMenu *cmSubMenu = NULL;
-	
-	GetCursorPos(&pp);
-	if(cmPopUp.LoadMenu(IDR_QUICK_PASTE) != 0)
-	{
-		cmSubMenu = cmPopUp.GetSubMenu(0);
-		if(!cmSubMenu)
-			return;
-		
-		if(pNMHDR == NULL)
-		{
-			int nItem = m_lstHeader.GetCaret();
-			CRect rc;
-			m_lstHeader.GetItemRect(nItem, rc, LVIR_BOUNDS);
-			ClientToScreen(rc);
-			pp.x = rc.left;
-			pp.y = rc.bottom;
-		}
-		
-		theApp.m_Addins.AddPrePasteAddinsToMenu(cmSubMenu);
-
-		theApp.m_Language.UpdateRightClickMenu(cmSubMenu);
-
-		SetMenuChecks(cmSubMenu);
-
-		cmSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
-			pp.x, pp.y, this, NULL);
-	}
-	
-	*pResult = 0;
-}
-
-void CQPasteWnd::SetMenuChecks(CMenu *pMenu)
-{
-	//Set the transparency Check
-	if(!CGetSetOptions::GetEnableTransparency())
-	{
-		pMenu->CheckMenuItem(ID_MENU_TRANSPARENCY_NONE, MF_CHECKED);
-	}
-	else
-	{
-		int nTrans = CGetSetOptions::GetTransparencyPercent();
-		int nCheckID = -1;
-		switch(nTrans)
-		{
-		case 5:
-			nCheckID = ID_MENU_TRANSPARENCY_5;
-			break;
-		case 10:
-			nCheckID = ID_MENU_TRANSPARENCY_10;
-			break;   
-		case 15:
-			nCheckID = ID_MENU_TRANSPARENCY_15;
-			break;
-		case 20:
-			nCheckID = ID_MENU_TRANSPARENCY_20;
-			break;
-		case 25:
-			nCheckID = ID_MENU_TRANSPARENCY_25;
-			break;
-		case 30:
-			nCheckID = ID_MENU_TRANSPARENCY_30;
-			break;
-		case 40:
-			nCheckID = ID_MENU_TRANSPARENCY_40;
-			break;
-		}
-		if(nCheckID >= 0)
-			pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
-	}
-	
-	//Set the lines per row check
-	int nLinesPerRow = CGetSetOptions::GetLinesPerRow();
-	int nCheckID = -1;
-	switch(nLinesPerRow)
-	{
-	case 1:
-		nCheckID = ID_MENU_LINESPERROW_1;
-		break;
-	case 2:
-		nCheckID = ID_MENU_LINESPERROW_2;
-		break;
-	case 3:
-		nCheckID = ID_MENU_LINESPERROW_3;
-		break;
-	case 4:
-		nCheckID = ID_MENU_LINESPERROW_4;
-		break;
-	case 5:
-		nCheckID = ID_MENU_LINESPERROW_5;
-		break;
-	}
-	if(nCheckID >= 0)
-		pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
-	
-	//Set the position check
-	int nPosition = CGetSetOptions::GetQuickPastePosition();
-	nCheckID = -1;
-	switch(nPosition)
-	{
-	case POS_AT_CARET:
-		nCheckID = ID_MENU_POSITIONING_ATCARET;
-		break;
-	case POS_AT_CURSOR:
-		nCheckID = ID_MENU_POSITIONING_ATCURSOR;
-		break;
-	case POS_AT_PREVIOUS:
-		nCheckID = ID_MENU_POSITIONING_ATPREVIOUSPOSITION;
-		break;
-	}
-	if(nCheckID >= 0)
-		pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
-
-	theApp.UpdateMenuConnectCV(pMenu, ID_MENU_TOGGLECONNECTCV);
-
-	if(CGetSetOptions::GetShowTextForFirstTenHotKeys())
-		pMenu->CheckMenuItem(ID_MENU_FIRSTTENHOTKEYS_SHOWHOTKEYTEXT, MF_CHECKED);
-	
-	if(CGetSetOptions::GetUseCtrlNumForFirstTenHotKeys())
-		pMenu->CheckMenuItem(ID_MENU_FIRSTTENHOTKEYS_USECTRLNUM, MF_CHECKED);
-	
-	if(g_Opt.m_bShowPersistent)
-		pMenu->CheckMenuItem(ID_MENU_ALLWAYSONTOP, MF_CHECKED);
-	
-	if(CGetSetOptions::GetAutoHide())
-		pMenu->CheckMenuItem(ID_MENU_AUTOHIDE, MF_CHECKED);
-	
-	if(g_Opt.m_bHistoryStartTop)
-		pMenu->CheckMenuItem(ID_SORT_ASCENDING, MF_CHECKED);
-	else
-		pMenu->CheckMenuItem(ID_SORT_DESCENDING, MF_CHECKED);
-	
-	switch(CGetSetOptions::GetCaptionPos())
-	{
-	case 1:
-		pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_RIGHT, MF_CHECKED);
-		break;
-	case 2:
-		pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_BOTTOM, MF_CHECKED);
-		break;
-	case 3:
-		pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_LEFT, MF_CHECKED);
-		break;
-	case 4:
-		pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_TOP, MF_CHECKED);
-		break;
-	}
-	
-	if(CGetSetOptions::GetAllwaysShowDescription())
-	{
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_ALLWAYSSHOWDESCRIPTION, MF_CHECKED);
-	}
-	
-	switch(CGetSetOptions::GetDoubleClickingOnCaptionDoes())
-	{
-	case TOGGLES_ALLWAYS_ON_TOP:
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSONTOP, MF_CHECKED);
-		break;
-	case TOGGLES_ALLWAYS_SHOW_DESCRIPTION:
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSSHOWDESCRIPTION, MF_CHECKED);
-		break;
-	case ROLLES_UP_WINDOW:
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW, MF_CHECKED);
-		break;
-	}
-	
-	if(CGetSetOptions::m_bPrompForNewGroupName)
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES, MF_CHECKED);
-
-	if(g_Opt.m_bDrawThumbnail)
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_SHOWTHUMBNAILS, MF_CHECKED);
-
-	if(g_Opt.m_bDrawRTF)
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DRAWRTFTEXT, MF_CHECKED);
-
-	if(g_Opt.m_bSendPasteMessageAfterSelection)
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_PASTECLIPAFTERSELECTION, MF_CHECKED);
-
-	if(g_Opt.m_bFindAsYouType)
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_FINDASYOUTYPE, MF_CHECKED);
-
-	if(g_Opt.m_bEnsureEntireWindowCanBeSeen)
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_ENSUREENTIREWINDOWISVISIBLE, MF_CHECKED);
-
-	if(g_Opt.m_bShowAllClipsInMainList)
-		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_SHOWCLIPSTHATAREINGROUPSINMAINLIST, MF_CHECKED);
-
-	if(g_Opt.GetPromptWhenDeletingClips())
-		pMenu->CheckMenuItem(ID_QUICKOPTIONS_PROMPTTODELETECLIP, MF_CHECKED);
-
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIENDONE, 0);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TWO, 1);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_THREE, 2);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FORE, 3);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FIVE, 4);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_SIX, 5);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_SEVEN,6);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_EIGHT,7);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_NINE,8);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TEN,9);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_ELEVEN,10);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TWELVE,11);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_THIRTEEN,12);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FORETEEN,13);
-	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FIFTEEN,14);
-
-	if(g_Opt.GetAllowFriends() == false)
-	{
-		CString csText("Send To");
-		int nPos = -1;
-		CMultiLanguage::GetMenuPos(pMenu, csText, nPos);
-		if(nPos >= 0)
-		{
-			pMenu->DeleteMenu(nPos, MF_BYPOSITION);
-		}
-	}
-
-	pMenu->DeleteMenu(ID_MENU_SENTTO_PROMPTFORIP, MF_BYCOMMAND);
-}
-
-void CQPasteWnd::SetSendToMenu(CMenu *pMenu, int nMenuID, int nArrayPos)
-{
-	if(g_Opt.m_SendClients[nArrayPos].csIP.GetLength() > 0)
-	{
-		CString cs;
-		cs.Format(_T("(%s) - %s"), g_Opt.m_SendClients[nArrayPos].csIP, g_Opt.m_SendClients[nArrayPos].csDescription);
-		pMenu->ModifyMenu(nMenuID, MF_BYCOMMAND, nMenuID, cs);
-	}
-	else
-	{
-		pMenu->DeleteMenu(nMenuID, MF_BYCOMMAND);
-	}
-}
-
-LRESULT CQPasteWnd::OnSearch(WPARAM wParam, LPARAM lParam)
-{
-	m_lstHeader.HidePopup();
-
-	CString csText;
-	m_Search.GetWindowText(csText);
-	
-	if(csText == "")
-		return FALSE;
-
-	m_lstHeader.EnableWindow(FALSE);
-	
-	FillList(csText);
-
-	m_lstHeader.EnableWindow(FALSE);
-	
-	m_lstHeader.SetFocus();
-	
-	MoveControls();
-	
-	m_Search.SetSel(-1, 0);
-	
-	return TRUE;
-}
-
-
-///////////////////////////////////////////////////////////////////////
-//Menu Stuff
-///////////////////////////////////////////////////////////////////////
-void CQPasteWnd::OnMenuLinesperrow1()	{ SetLinesPerRow(1);	}
-void CQPasteWnd::OnMenuLinesperrow2()	{ SetLinesPerRow(2);	}
-void CQPasteWnd::OnMenuLinesperrow3()	{ SetLinesPerRow(3);	}
-void CQPasteWnd::OnMenuLinesperrow4()	{ SetLinesPerRow(4);	}
-void CQPasteWnd::OnMenuLinesperrow5()	{ SetLinesPerRow(5);	}
-void CQPasteWnd::SetLinesPerRow(long lLines)
-{
-	CGetSetOptions::SetLinesPerRow(lLines);
-	m_lstHeader.SetNumberOfLinesPerRow(lLines);
-	
-	FillList();
-}
-void CQPasteWnd::OnMenuTransparencyNone()	{ SetTransparency(0);	}
-void CQPasteWnd::OnMenuTransparency5()		{ SetTransparency(5);	}
-void CQPasteWnd::OnMenuTransparency10()		{ SetTransparency(10);	}
-void CQPasteWnd::OnMenuTransparency15()		{ SetTransparency(15);	}
-void CQPasteWnd::OnMenuTransparency20()		{ SetTransparency(20);	}
-void CQPasteWnd::OnMenuTransparency25()		{ SetTransparency(25);	}
-void CQPasteWnd::OnMenuTransparency30()		{ SetTransparency(25);	}
-void CQPasteWnd::OnMenuTransparency40()		{ SetTransparency(40);	}
-
-void CQPasteWnd::SetTransparency(long lPercent)
-{
-#ifdef AFTER_98
-	if(lPercent)
-	{
-		CGetSetOptions::SetTransparencyPercent(lPercent);
-		CGetSetOptions::SetEnableTransparency(TRUE);
-		
-		m_Alpha.SetTransparent(TRUE);
-		
-		float fPercent =  lPercent / (float)100.0;
-		
-		m_Alpha.SetOpacity(OPACITY_MAX - (int)(fPercent * OPACITY_MAX));
-	}
-	else
-	{
-		CGetSetOptions::SetEnableTransparency(FALSE);
-		m_Alpha.SetTransparent(FALSE);
-	}
-#endif
-}
-
-void CQPasteWnd::OnMenuDelete() 
-{
-	DeleteSelectedRows();
-}
-
-void CQPasteWnd::OnMenuPositioningAtcaret() 
-{
-	CGetSetOptions::SetQuickPastePosition(POS_AT_CARET);
-}
-
-void CQPasteWnd::OnMenuPositioningAtcursor() 
-{
-	CGetSetOptions::SetQuickPastePosition(POS_AT_CURSOR);
-}
-
-void CQPasteWnd::OnMenuPositioningAtpreviousposition() 
-{
-	CGetSetOptions::SetQuickPastePosition(POS_AT_PREVIOUS);
-}
-
-void CQPasteWnd::OnMenuOptions() 
-{
-	theApp.ShowOptionsDlg();
-}
-
-void CQPasteWnd::OnMenuExitprogram() 
-{
-	::SendMessage(theApp.m_MainhWnd, WM_CLOSE, 0, 0);
-}
-
-void CQPasteWnd::OnMenuToggleConnectCV() 
-{
-	theApp.ToggleConnectCV();
-}
-
-#include "client.h"
-
-void CQPasteWnd::OnMenuProperties() 
-{	
-	m_bHideWnd = false;
-	
-	ARRAY IDs, Indexes;
-	m_lstHeader.GetSelectionItemData(IDs);
-	m_lstHeader.GetSelectionIndexes(Indexes);
-	
-	int nSize = IDs.GetSize();
-	if(nSize < 1)
-		return;
-	
-	long lID = IDs[0];
-	int nRow = Indexes[0];
-	
-	if(lID < 0)
-		return;
-	
-	m_lstHeader.RemoveAllSelection();
-	m_lstHeader.SetSelection(nRow);
-	
-	CCopyProperties props(lID, this);
-	int nDo = props.DoModal();
-
-	if(nDo == IDOK)
-	{
-		m_CritSection.Lock();
-		{
-			if(nRow >= 0 && nRow < (int)m_Cache.size())
-			{
-				CMainTable table;
-				table = m_Cache[nRow];
-
-				CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT * FROM Main WHERE lID = %d"), lID);
-				if(!q.eof())
-				{
-					FillMainTable(table, q);
-
-					m_Cache[nRow] = table;
-				}
-			}
-		}
-		m_CritSection.Unlock();
-
-		SetEvent(m_Events[THREAD_FILL_ACCELERATORS]);
-
-		m_lstHeader.RefreshVisibleRows();
-		
-		if(props.m_lGroupChangedTo >= 0)
-		{
-			OpenID(props.m_lGroupChangedTo);
-		}
-
-		m_lstHeader.SetFocus();
-		m_lstHeader.SetListPos(nRow);
-	}
-	
-	m_bHideWnd = true;
-}
-
-void CQPasteWnd::UpdateFont()
-{
-	LOGFONT lf;
-	CGetSetOptions::GetFont(lf);
-	m_lstHeader.SetLogFont(lf);
-}	
-
-void CQPasteWnd::OnMenuFirsttenhotkeysUsectrlnum() 
-{	
-	CGetSetOptions::SetUseCtrlNumForFirstTenHotKeys(!CGetSetOptions::GetUseCtrlNumForFirstTenHotKeys());
-	m_lstHeader.RefreshVisibleRows();
-}
-
-void CQPasteWnd::OnMenuFirsttenhotkeysShowhotkeytext() 
-{
-	CGetSetOptions::SetShowTextForFirstTenHotKeys(!CGetSetOptions::GetShowTextForFirstTenHotKeys());
-	
-	m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
-	
-	m_lstHeader.RefreshVisibleRows();
-}
-
-void CQPasteWnd::OnViewcaptionbaronRight()
-{
-	SetCaptionOn(CAPTION_RIGHT);
-	CGetSetOptions::SetCaptionPos(CAPTION_RIGHT);
-}
-
-void CQPasteWnd::OnViewcaptionbaronBottom()
-{
-	SetCaptionOn(CAPTION_BOTTOM);
-	CGetSetOptions::SetCaptionPos(CAPTION_BOTTOM);
-}
-
-void CQPasteWnd::OnViewcaptionbaronLeft()
-{
-	SetCaptionOn(CAPTION_LEFT);
-	CGetSetOptions::SetCaptionPos(CAPTION_LEFT);
-}
-
-void CQPasteWnd::OnViewcaptionbaronTop()
-{
-	SetCaptionOn(CAPTION_TOP);
-	CGetSetOptions::SetCaptionPos(CAPTION_TOP);
-}
-
-void CQPasteWnd::OnMenuAutohide()
-{
-	bool bAutoHide = !CGetSetOptions::GetAutoHide();
-	CGetSetOptions::SetAutoHide(bAutoHide);
-	SetAutoHide(bAutoHide);
-}
-
-void CQPasteWnd::OnMenuViewfulldescription()
-{
-	m_lstHeader.ShowFullDescription();	
-}
-
-void CQPasteWnd::OnMenuAllwaysontop()
-{
-	theApp.ShowPersistent( !g_Opt.m_bShowPersistent );
-}
-
-void CQPasteWnd::OnSortAscending()
-{
-	g_Opt.SetHistoryStartTop(TRUE);
-	FillList();
-}
-
-void CQPasteWnd::OnSortDescending()
-{
-	g_Opt.SetHistoryStartTop(FALSE);
-	FillList();
-}
-
-void CQPasteWnd::OnMenuNewGroup()
-{
-	NewGroup( false );
-}
-
-void CQPasteWnd::OnMenuNewGroupSelection()
-{
-	NewGroup( true );
-}
-
-void CQPasteWnd::OnMenuQuickoptionsAllwaysshowdescription() 
-{
-	CGetSetOptions::SetAllwaysShowDescription(!g_Opt.m_bAllwaysShowDescription);
-	
-}
-
-void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop() 
-{
-	CGetSetOptions::SetDoubleClickingOnCaptionDoes(TOGGLES_ALLWAYS_ON_TOP);
-	
-}
-
-void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow() 
-{
-	CGetSetOptions::SetDoubleClickingOnCaptionDoes(ROLLES_UP_WINDOW);
-	
-}
-
-void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription() 
-{
-	CGetSetOptions::SetDoubleClickingOnCaptionDoes(TOGGLES_ALLWAYS_SHOW_DESCRIPTION);	
-}
-
-void CQPasteWnd::OnMenuQuickoptionsPromptfornewgroupnames() 
-{
-	g_Opt.SetPrompForNewGroupName( !g_Opt.m_bPrompForNewGroupName );	
-}
-
-void CQPasteWnd::OnMenuViewgroups() 
-{
-	OnShowGroupsTop();
-}
-
-void CQPasteWnd::OnMenuQuickpropertiesSettoneverautodelete() 
-{
-	CWaitCursor wait;
-	ARRAY IDs;
-	ARRAY Indexs;
-	m_lstHeader.GetSelectionItemData(IDs);
-	m_lstHeader.GetSelectionIndexes(Indexs);
-    
-	int count = IDs.GetSize();
-
-	for(int i = 0; i < count; i++)
-	{
-		try
-		{
-			theApp.m_db.execDMLEx(_T("UPDATE Main SET lDontAutoDelete = %d where lID = %d;"), 
-									(long)CTime::GetCurrentTime().GetTime(), IDs[i]);
-		}
-		CATCH_SQLITE_EXCEPTION
-	}
-
-	m_CritSection.Lock();
-	{
-		count = Indexs.GetSize();
-		for(int i = 0; i < count; i++)
-		{
-			CMainTable table;
-			table = m_Cache[Indexs[i]];
-			table.m_bDontAutoDelete = true;
-			m_Cache[Indexs[i]] = table;
-		}
-	}
-	m_CritSection.Unlock();
-
-	m_lstHeader.RefreshVisibleRows();
-}
-
-void CQPasteWnd::OnMenuQuickpropertiesAutodelete() 
-{
-	CWaitCursor wait;
-	ARRAY IDs;
-	ARRAY Indexs;
-	m_lstHeader.GetSelectionItemData(IDs);
-	m_lstHeader.GetSelectionIndexes(Indexs);
-    
-	int count = IDs.GetSize();
-
-	for(int i = 0; i < count; i++)
-	{
-		try
-		{
-			theApp.m_db.execDMLEx(_T("UPDATE Main SET lDontAutoDelete = 0 where lID = %d;"), IDs[i]);
-		}
-		CATCH_SQLITE_EXCEPTION
-	}
-
-	m_CritSection.Lock();
-	{
-		count = Indexs.GetSize();
-		for(int i = 0; i < count; i++)
-		{
-			CMainTable table;
-			table = m_Cache[Indexs[i]];
-			table.m_bDontAutoDelete = false;
-			m_Cache[Indexs[i]] = table;
-		}
-	}
-	m_CritSection.Unlock();
-
-	m_lstHeader.RefreshVisibleRows();
-}
-
-void CQPasteWnd::OnMenuQuickpropertiesRemovehotkey() 
-{
-	CWaitCursor wait;
-	ARRAY IDs;
-	ARRAY Indexs;
-	m_lstHeader.GetSelectionItemData(IDs);
-	m_lstHeader.GetSelectionIndexes(Indexs);
-    
-	int count = IDs.GetSize();
-
-	for(int i = 0; i < count; i++)
-	{
-		try
-		{
-			theApp.m_db.execDMLEx(_T("UPDATE Main SET lShortCut = 0 where lID = %d;"), IDs[i]);
-		}
-		CATCH_SQLITE_EXCEPTION
-	}	
-
-	m_CritSection.Lock();
-	{
-		count = Indexs.GetSize();
-		for(int i = 0; i < count; i++)
-		{
-			CMainTable table;
-			table = m_Cache[Indexs[i]];
-			table.m_bHasShortCut = false;
-			m_Cache[Indexs[i]] = table;
-		}
-	}
-	m_CritSection.Unlock();
-
-	m_lstHeader.RefreshVisibleRows();
-}
-
-void CQPasteWnd::OnQuickpropertiesRemovequickpaste()
-{
-	CWaitCursor wait;
-	ARRAY IDs;
-	ARRAY Indexs;
-	m_lstHeader.GetSelectionItemData(IDs);
-	m_lstHeader.GetSelectionIndexes(Indexs);
-
-	int count = IDs.GetSize();
-
-	for(int i = 0; i < count; i++)
-	{
-		try
-		{
-			theApp.m_db.execDMLEx(_T("UPDATE Main SET QuickPasteText = '' where lID = %d;"), IDs[i]);
-		}
-		CATCH_SQLITE_EXCEPTION
-	}	
-	
-	m_CritSection.Lock();
-	{
-		count = Indexs.GetSize();
-		for(int i = 0; i < count; i++)
-		{
-			CMainTable table;
-			table = m_Cache[Indexs[i]];
-			table.m_QuickPaste.Empty();
-			m_Cache[Indexs[i]] = table;
-		}
-	}
-	m_CritSection.Unlock();
-
-	m_lstHeader.RefreshVisibleRows();
-}
-
-void CQPasteWnd::OnMenuSenttoFriendFifteen() 
-{
-	SendToFriendbyPos(14);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendForeteen() 
-{
-	SendToFriendbyPos(13);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendThirteen() 
-{
-	SendToFriendbyPos(12);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendTwelve() 
-{
-	SendToFriendbyPos(11);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendEleven() 
-{
-	SendToFriendbyPos(10);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendTen() 
-{
-	SendToFriendbyPos(9);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendNine() 
-{
-	SendToFriendbyPos(8);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendEight() 
-{
-	SendToFriendbyPos(7);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendSeven() 
-{
-	SendToFriendbyPos(6);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendSix() 
-{
-	SendToFriendbyPos(5);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendFive() 
-{
-	SendToFriendbyPos(4);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendFore() 
-{
-	SendToFriendbyPos(3);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendThree() 
-{
-	SendToFriendbyPos(2);	
-}
-
-void CQPasteWnd::OnMenuSenttoFriendTwo() 
-{
-	SendToFriendbyPos(1);
-}
-
-void CQPasteWnd::OnMenuSenttoFriendone() 
-{
-	SendToFriendbyPos(0);
-}
-
-void CQPasteWnd::OnMenuSenttoPromptforip() 
-{
-	// TODO: Add your command handler code here
-	
-}
-
-void CQPasteWnd::OnMenuGroupsMovetogroup() 
-{
-	m_bHideWnd = false;
-
-	CMoveToGroupDlg dlg;
-
-	int nRet = dlg.DoModal();
-	if(nRet == IDOK)
-	{
-		int nGroup = dlg.GetSelectedGroup();
-		if(nGroup >= 0)
-		{
-			CClipIDs IDs;
-			m_lstHeader.GetSelectionItemData( IDs );
-
-			IDs.MoveTo(nGroup);
-		}
-		FillList();
-	}
-
-	m_bHideWnd = true;
-}
-
-void CQPasteWnd::OnMenuPasteplaintextonly() 
-{
-	OpenSelection(true);	
-}
-
-void CQPasteWnd::OnPromptToDeleteClip() 
-{
-	CGetSetOptions::SetPromptWhenDeletingClips(!CGetSetOptions::GetPromptWhenDeletingClips());
-}
-
-void CQPasteWnd::OnMenuExport()
-{
-	CClipIDs IDs;
-	long lCount = m_lstHeader.GetSelectedCount();
-	if(lCount <= 0)
-		return;
-
-	m_lstHeader.GetSelectionItemData(IDs);
-	lCount = IDs.GetSize();
-	if(lCount <= 0)
-		return;
-
-	OPENFILENAME ofn;      
-	TCHAR szFile[400];      
-	TCHAR szDir[400];
-
-	memset(&szFile, 0, sizeof(szFile));
-	memset(szDir, 0, sizeof(szDir));
-	memset(&ofn, 0, sizeof(ofn));
-
-	CString csInitialDir = CGetSetOptions::GetLastImportDir();
-	STRCPY(szDir, csInitialDir);
-
-	ofn.lStructSize = sizeof(OPENFILENAME);
-	ofn.hwndOwner = m_hWnd;
-	ofn.lpstrFile = szFile;
-	ofn.nMaxFile = sizeof(szFile);
-	ofn.lpstrFilter=_T("Exported Ditto Clips (.dto)\0*.dto\0\0");
-	ofn.nFilterIndex = 1;
-	ofn.lpstrFileTitle = NULL;
-	ofn.nMaxFileTitle = 0;
-	ofn.lpstrInitialDir = szDir;
-	ofn.lpstrDefExt = _T("dto");
-	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
-
-	m_bHideWnd = false;
-
-	if(GetSaveFileName(&ofn)) 
-	{
-		using namespace nsPath;
-		CPath path(ofn.lpstrFile);
-		CString csPath = path.GetPath();
-		CGetSetOptions::SetLastExportDir(csPath);
-
-		CString csFile(ofn.lpstrFile);
-		IDs.Export(csFile);
-	}
-
-	m_bHideWnd = true;
-}
-
-void CQPasteWnd::OnMenuImport()
-{
-	m_bHideWnd = false;
-	theApp.ImportClips(m_hWnd);
-	m_bHideWnd = true;
-}
-
-void CQPasteWnd::OnMenuHelp() 
-{
-	CString csFile = CGetSetOptions::GetPath(PATH_HELP);
-	csFile += "DittoGettingStarted.htm";
-
-	CHyperLink::GotoURL(csFile, SW_SHOW);
-}
-
-void CQPasteWnd::OnMenuQuickoptionsFont() 
-{
-	m_bHideWnd = false;
-
-	CFont *pFont = m_lstHeader.GetFont();
-	LOGFONT lf;
-	pFont->GetLogFont(&lf);
-	CFontDialog dlg(&lf);
-	if(dlg.DoModal() == IDOK)
-	{	
-		CGetSetOptions::SetFont(*dlg.m_cf.lpLogFont);
-		m_lstHeader.SetLogFont(*dlg.m_cf.lpLogFont);
-	}
-	
-	m_bHideWnd = true;
-}
-
-void CQPasteWnd::OnMenuQuickoptionsShowthumbnails() 
-{
-	CGetSetOptions::SetDrawThumbnail(!g_Opt.m_bDrawThumbnail);
-	m_lstHeader.RefreshVisibleRows();
-}
-
-void CQPasteWnd::OnMenuQuickoptionsDrawrtftext() 
-{
-	CGetSetOptions::SetDrawRTF(!g_Opt.m_bDrawRTF);
-	m_lstHeader.RefreshVisibleRows();
-}
-
-void CQPasteWnd::OnMenuQuickoptionsPasteclipafterselection() 
-{
-	CGetSetOptions::SetSendPasteAfterSelection(!g_Opt.m_bSendPasteMessageAfterSelection);	
-}
-
-void CQPasteWnd::OnMenuQuickoptionsFindasyoutype() 
-{
-	CGetSetOptions::SetFindAsYouType(!g_Opt.m_bFindAsYouType);
-}
-
-void CQPasteWnd::OnMenuQuickoptionsEnsureentirewindowisvisible() 
-{
-	CGetSetOptions::SetEnsureEntireWindowCanBeSeen(!g_Opt.m_bEnsureEntireWindowCanBeSeen);
-}
-
-void CQPasteWnd::OnMenuQuickoptionsShowclipsthatareingroupsinmainlist() 
-{
-	CGetSetOptions::SetShowAllClipsInMainList(!g_Opt.m_bShowAllClipsInMainList);
-
-	CString csText;
-	m_Search.GetWindowText(csText);
-	FillList(csText);
-}
-
-void CQPasteWnd::OnMenuEdititem()
-{
-	if(m_lstHeader.GetSelectedCount() == 0)
-		return;
-
-	CClipIDs IDs;
-	m_lstHeader.GetSelectionItemData(IDs);
-	theApp.EditItems(IDs, true);
-
-	HideQPasteWindow();
-}
-
-void CQPasteWnd::OnMenuNewclip()
-{
-	CClipIDs IDs;
-	IDs.Add(-1);
-	theApp.EditItems(IDs, true);	
-
-	HideQPasteWindow();
-}
-
-
-///////////////////////////////////////////////////////////////////////
-//END END Menu Stuff
-///////////////////////////////////////////////////////////////////////
-
-
-BOOL CQPasteWnd::SendToFriendbyPos(int nPos)
-{
-	if(g_Opt.GetAllowFriends() == false)
-		return FALSE;
-
-	CWaitCursor wait;
-
-	m_bHideWnd = false;
-
-	CClipIDs IDs;
-	long lCount = m_lstHeader.GetSelectedCount();
-	if(lCount <= 0)
-		return FALSE;
-
-	m_lstHeader.GetSelectionItemData(IDs);
-	lCount = IDs.GetSize();
-	if(lCount <= 0)
-		return FALSE;
-
-	CSendToFriendInfo Info;
-	Info.m_lPos = nPos;
-
-	BOOL bRet = FALSE;
-
-	try
-	{
-		CPopup Popup(0, 0, m_hWnd);
-		Popup.Show(StrF(_T("Sending clip to %s"), g_Opt.m_SendClients[nPos].csIP));
-
-		Info.m_pPopup = &Popup;
-		
-		Info.m_pClipList =  new CClipList;
-		for(int i = 0; i < lCount; i++)
-		{
-			CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT mText FROM Main WHERE lID = %d"), IDs[i]);
-			if(q.eof() == false)
-			{
-				CClip *pClip = new CClip;
-				if(pClip)
-				{
-					pClip->LoadFormats(IDs[i]);
-					pClip->m_Desc = q.getStringField(0);
-					pClip->m_ID = IDs[i];
-					Info.m_pClipList->AddTail(pClip);
-				}
-			}
-		}
-		
-		if(SendToFriend(Info) == FALSE)
-		{
-			MessageBox(StrF(_T("Error Sending data to %s\n\n%s"), g_Opt.m_SendClients[nPos].csIP, Info.m_csErrorText), _T("Ditto"));
-		}
-		else
-		{
-			bRet = TRUE;
-		}
-	}
-	CATCH_SQLITE_EXCEPTION	
-
-	m_bHideWnd = true;
-
-	return bRet;
-}
-
-LRESULT CQPasteWnd::OnDelete(WPARAM wParam, LPARAM lParam)
-{
-	DeleteSelectedRows();
-	
-	return TRUE;
-}
-
-void CQPasteWnd::DeleteSelectedRows()
-{
-	if(g_Opt.GetPromptWhenDeletingClips())
-	{
-		bool bStartValue = m_bHideWnd;
-		m_bHideWnd = false;
-
-		int nRet = MessageBox(theApp.m_Language.GetString("Delete_Clip", "Delete Selected Clips?"), _T("Ditto"), MB_YESNO);
-	
-		m_bHideWnd = bStartValue;
-
-		if(nRet == IDNO)
-			return;
-	}
-
-	CClipIDs IDs;
-	ARRAY Indexs;
-	
-	if( m_lstHeader.GetSelectedCount() == 0 )
-		return;
-	
-	POSITION pos = m_lstHeader.GetFirstSelectedItemPosition();
-	int nFirstSel = m_lstHeader.GetNextSelectedItem(pos);
-	
-	m_lstHeader.GetSelectionItemData(IDs);
-	m_lstHeader.GetSelectionIndexes(Indexs);
-
-	IDs.DeleteIDs();
-
-	Indexs.SortDescending();
-	int nCount = Indexs.GetSize();
-
-	m_CritSection.Lock();
-	{
-		for(int i = 0; i < nCount; i++)
-		{
-			m_Cache.erase(m_Cache.begin() + Indexs[i]);
-		}
-	}
-	m_CritSection.Unlock();
-
-	m_lstHeader.SetItemCountEx(m_lstHeader.GetItemCount() - nCount);
-	
-	// if there are no items after the one we deleted, then select the last one.
-	if(nFirstSel >= m_lstHeader.GetItemCount())
-		nFirstSel = m_lstHeader.GetItemCount() - 1;
-		
-	m_lstHeader.SetListPos(nFirstSel);
-	
-	m_lstHeader.RefreshVisibleRows();
-	RedrawWindow(0, 0, RDW_INVALIDATE);
-}
-
-CString CQPasteWnd::LoadDescription(int nItem)
-{
-	if( nItem < 0 || nItem >= m_lstHeader.GetItemCount() )
-		return "";
-	
-	CString cs;
-	try
-	{
-		long lID = m_lstHeader.GetItemData(nItem);
-
-		CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT mText FROM Main WHERE lID = %d"), lID);
-		if(q.eof() == false)
-		{
-			cs = q.getStringField(0);
-		}
-	}
-	CATCH_SQLITE_EXCEPTION
-		
-	return cs;
-}
-
-void CQPasteWnd::MoveSelection(bool down)
-{
-	if(m_bModifersMoveActive)
-	{
-		ARRAY arr;
-		m_lstHeader.GetSelectionIndexes(arr);
-		if(arr.GetCount() > 0)
-		{
-			int index = arr[0];
-
-			if(down)
-			{	
-				if(index < m_lstHeader.GetItemCount()-1)
-				{
-					m_lstHeader.SetListPos(index+1);
-				}
-			}
-			else
-			{
-				if(index > 0)
-				{
-					m_lstHeader.SetListPos(index-1);
-				}
-			}
-		}
-		else
-		{
-			if(m_lstHeader.GetItemCount() > 0)
-			{
-				m_lstHeader.SetListPos(0);
-			}
-		}
-	}
-}
-
-void CQPasteWnd::OnKeyStateUp()
-{
-	if(m_bModifersMoveActive)
-	{	
-		Log(_T("OnKeyStateUp"));
-		SetTimer(TIMER_PASTE_FROM_MODIFER, g_Opt.GetKeyStatePasteDelay(), NULL);
-	}
-	else
-	{
-		Log(_T("OnKeyStateUp - Modifers not active"));
-	}
-}
-
-void CQPasteWnd::SetKeyModiferState(bool bActive)
-{
-	Log(StrF(_T("SetKeyModiferState %d"), bActive));
-	m_bModifersMoveActive = bActive;
-}
-
-BOOL CQPasteWnd::PreTranslateMessage(MSG* pMsg) 
-{
-	//DWORD dID;
-	//if(m_MainAccels.OnMsg(pMsg, dID))
-	//{
-	//	switch(dID)
-	//	{
-	//	
-	//	}
-	//}
-
-	switch(pMsg->message) 
-	{
-	case WM_KEYDOWN:
-		
-		switch( pMsg->wParam )
-		{
-		case VK_APPS:
-			{
-				long lRet;
-				OnRclickQuickPaste(NULL, &lRet);
-				return 0;
-			}
-		case VK_F7:
-			if(pMsg->hwnd == m_lstHeader.m_hWnd)
-			{
-				if(GetKeyState(VK_CONTROL) & 0x8000)
-					NewGroup( false );
-				else
-					NewGroup( true );
-				return TRUE;
-			}
-			break;
- 
-		case VK_F5:
-			//toggle outputing text to outputdebugstring
-			if(GetKeyState(VK_CONTROL) & 0x8000)
-			{
-				if(CGetSetOptions::m_bEnableDebugLogging)
-					Log(_T("turning file logging OFF"));
-
-				CGetSetOptions::m_bEnableDebugLogging = !CGetSetOptions::m_bEnableDebugLogging;
-
-				if(CGetSetOptions::m_bEnableDebugLogging)
-					Log(_T("turning file logging ON"));
-			}
-			else
-			{
-				if(CGetSetOptions::m_bEnableDebugLogging)
-					Log(_T("turning DebugString logging OFF"));
-
-				CGetSetOptions::m_bOutputDebugString = !CGetSetOptions::m_bOutputDebugString;
-
-				if(CGetSetOptions::m_bEnableDebugLogging)
-					Log(_T("turning DebugString logging ON"));
-			}
-			return TRUE;
-			
-		case VK_ESCAPE:
-			{	
-				if(m_bModifersMoveActive)
-				{
-					Log(_T("Escape key hit setting modifers to NOT active"));
-					m_bModifersMoveActive = false;
-					return TRUE;
-				}
-				else
-				{
-					if(m_lstHeader.HandleKeyDown(pMsg->wParam, pMsg->lParam) == FALSE)
-					{
-						if(m_strSQLSearch.IsEmpty() == FALSE)
-						{
-							OnCancelFilter();
-							return TRUE;
-						}
-						else
-						{	
-							if(m_GroupTree.IsWindowVisible() == FALSE)
-							{
-								HideQPasteWindow();
-								return TRUE;
-							}
-						}
-					}
-				}
-				break;
-			}
-		case VK_TAB:
-			{			
-				BOOL bPrev = FALSE;
-				
-				if(GetKeyState(VK_SHIFT) & 0x8000)
-					bPrev = TRUE;
-				
-				CWnd *pFocus = GetFocus();
-				if(pFocus)
-				{
-					CWnd *pNextWnd = GetNextDlgTabItem(pFocus, bPrev);
-					if(pNextWnd)
-						pNextWnd->SetFocus();
-				}
-				return TRUE;
-			}
-		case 'G':
-			if(GetKeyState(VK_CONTROL) & 0x8000)
-			{
-				OnShowGroupsTop();
-				return TRUE;
-			}
-			break;
-		case 'N':
-			if(GetKeyState(VK_CONTROL) & 0x8000)
-			{
-				OnMenuNewclip();
-				return TRUE;
-			}
-			break;
-		case 'E':
-			if(GetKeyState(VK_CONTROL) & 0x8000)
-			{
-				OnMenuEdititem();
-				return TRUE;
-			}
-			break;
-
-		case VK_UP:
-			if(m_bModifersMoveActive)
-			{
-				MoveSelection(false);
-				return TRUE;
-			}
-			break;
-
-		case VK_DOWN:
-			if(m_bModifersMoveActive)
-			{
-				MoveSelection(true);
-				return TRUE;
-			}
-			break;
-
-		case VK_HOME:
-			if(m_bModifersMoveActive)
-			{
-				m_lstHeader.SetListPos(0);
-				return TRUE;
-			}
-			break;
-		case VK_END:
-			if(m_bModifersMoveActive)
-			{
-				if(m_lstHeader.GetItemCount() > 0)
-				{
-					m_lstHeader.SetListPos(m_lstHeader.GetItemCount()-1);
-				}
-				return TRUE;
-			}
-			break;
-		} // end switch( pMsg->wParam )
-		
-		break; // end case WM_KEYDOWN 
-		
-		case WM_SYSKEYDOWN: // ALT key is held down
-			
-			switch( pMsg->wParam )
-			{
-			case 'C': // switch to the filter combobox
-				BYTE key[256];
-				GetKeyboardState((LPBYTE)(&key));
-				if(key[VK_MENU]&128)
-				{
-					OnCancelFilter();
-				}
-				return TRUE;
-				
-			case VK_HOME:
-				theApp.EnterGroupID(-1);  // History
-				return TRUE;				
-			} // end switch( pMsg->wParam )
-			
-			break; // end case WM_SYSKEYDOWN
-	}
-	
-	return CWndEx::PreTranslateMessage(pMsg);
-}
-
-void CQPasteWnd::OnCancelFilter()
-{
-	FillList();
-	
-	m_bHandleSearchTextChange = false;
-	m_Search.SetWindowText(_T(""));
-	m_bHandleSearchTextChange = true;
-
-	MoveControls();
-	
-	m_lstHeader.SetFocus();
-}
-
-LRESULT CQPasteWnd::OnProperties(WPARAM wParam, LPARAM lParam)
-{
-	OnMenuProperties();
-	return TRUE;
-}
-
-void CQPasteWnd::OnClose() 
-{
-	HideQPasteWindow();
-}
-
-void CQPasteWnd::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
-{
-	NM_LISTVIEW* pLV = (NM_LISTVIEW*)pNMHDR;
-	CProcessPaste paste;
-	CClipIDs& clips = paste.GetClipIDs();
-	
-	m_lstHeader.GetSelectionItemData(clips);
-	
-	if(clips.GetSize() <= 0)
-	{
-		ASSERT(0); // does this ever happen ??
-		clips.Add(m_lstHeader.GetItemData(pLV->iItem));
-	}
-
-	paste.DoDrag();
-
-	*pResult = 0;
-}
-
-void CQPasteWnd::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
-{
-	CWndEx::OnSysKeyDown(nChar, nRepCnt, nFlags);
-}
-
-void CQPasteWnd::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
-{
-	
-	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
-	LV_ITEM* pItem= &(pDispInfo)->item;
-	
-	if(pItem->mask & LVIF_TEXT) //valid text buffer?
-	{		
-		switch(pItem->iSubItem)
-		{
-		case 0:
-			try
-			{
-				m_CritSection.Lock();
-				{
-					if(pItem->iItem >= 0 && pItem->iItem < (int)m_Cache.size())
-					{
-						CMainTable table = m_Cache[pItem->iItem];
-				
-						CString cs;
-						if(table.m_bDontAutoDelete)
-							cs += "*";
-						
-						if(table.m_bHasShortCut)
-							cs += "s";
-                
-						if(table.m_bIsGroup)
-							cs += "G";
-						
-						// attached to a group
-						if(table.m_bHasParent)
-							cs += "!";
-
-						if(table.m_QuickPaste.IsEmpty() == FALSE)
-							cs += "Q";
-						
-						// pipe is the "end of symbols" marker
-						cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, table.m_Desc);
-						
-						lstrcpyn(pItem->pszText, cs, pItem->cchTextMax);
-						pItem->pszText[pItem->cchTextMax-1] = '\0';
-					}
-				}
-				m_CritSection.Unlock();
-			}
-			CATCH_SQLITE_EXCEPTION
-				
-			break;
-		}
-	}
-	
-	if(pItem->mask & LVIF_PARAM)
-	{
-		switch(pItem->iSubItem)
-		{
-		case 0:
-			try
-			{
-				m_CritSection.Lock();
-				{
-					if(pItem->iItem >= 0 && pItem->iItem < (int)m_Cache.size())
-					{
-						CMainTable table = m_Cache[pItem->iItem];
-						pItem->lParam = table.m_lID;
-					}
-				}
-				m_CritSection.Unlock();
-			}
-			CATCH_SQLITE_EXCEPTION
-				
-			break;
-		}
-	}
-}
-
-CString CQPasteWnd::GetDisplayText(long lDontAutoDelete, long lShortCut, bool bIsGroup, long lParentID, CString csText)
-{
-	CString cs;
-	if(lDontAutoDelete)
-		cs += "*";
-				
-	if(lShortCut > 0)
-		cs += "s";
-                
-	if(bIsGroup)
-		cs += "G";
-				
-	// attached to a group
-	if(lParentID > 0 )
-		cs += "!";
-				
-	// pipe is the "end of symbols" marker
-	cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, csText);
-
-	return cs;
-}
-
-void CQPasteWnd::OnGetToolTipText(NMHDR* pNMHDR, LRESULT* pResult)
-{
-	CQListToolTipText* pInfo = (CQListToolTipText*)pNMHDR;
-	if( !pInfo )
-		return;
-	
-	if( pInfo->lItem < 0 )
-	{
-		CString cs("no item selected");
-		
-		lstrcpyn(pInfo->pszText, cs, pInfo->cchTextMax);
-		if(cs.GetLength() > pInfo->cchTextMax)
-			pInfo->pszText[pInfo->cchTextMax-1] = 0;
-		
-		return;
-	}
-	
-	try
-	{
-		CString cs;
-
-		long lID = m_lstHeader.GetItemData(pInfo->lItem);
-		CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, mText, lDate, lShortCut, lDontAutoDelete, QuickPasteText FROM Main WHERE lID = %d"), lID);
-		if(q.eof() == false)
-		{
-			cs = q.getStringField(1);
-			cs += "\n\n";
-			
-#ifdef _DEBUG
-			cs += StrF(_T("(Index = %d) (DB ID = %d)\n"), pInfo->lItem, q.getIntField(_T("lID")));
-#endif
-			
-			COleDateTime time((time_t)q.getIntField(_T("lDate")));
-			cs += time.Format();
-			
-			if(q.getIntField(_T("lDontAutoDelete")) > 0)
-			{
-				cs += "\n";
-				cs += "Never Auto Delete";
-			}
-
-			CString csQuickPaste = q.getStringField(_T("QuickPasteText"));
-
-			if(csQuickPaste.IsEmpty() == FALSE)
-			{
-				cs += "\nQuick Paste = ";
-				cs += csQuickPaste;
-			}
-
-			long lShortCut = q.getIntField(_T("lShortCut"));
-			if(lShortCut > 0)
-			{
-				cs += "\n";
-				
-				if( HIBYTE(lShortCut) & HOTKEYF_CONTROL )
-					cs += "Ctrl + ";
-				if( HIBYTE(lShortCut) & HOTKEYF_SHIFT )
-					cs += "Shift + ";
-				if( HIBYTE(lShortCut) & HOTKEYF_ALT )
-					cs += "Alt + ";
-				
-				cs += (char)LOBYTE(lShortCut);
-			}
-		}
-		
-		lstrcpyn(pInfo->pszText, cs, pInfo->cchTextMax);
-		pInfo->pszText[pInfo->cchTextMax-1] = '\0';
-	}
-	CATCH_SQLITE_EXCEPTION
-}
-
-void CQPasteWnd::OnFindItem(NMHDR* pNMHDR, LRESULT* pResult) 
-{
-	NMLVFINDITEM* pFindInfo = (NMLVFINDITEM*)pNMHDR;
-	LVFINDINFO    fndItem   = pFindInfo->lvfi;
-	
-	if(fndItem.flags & LVFI_STRING)
-	{
-		m_Search.SetWindowText(fndItem.psz);
-		m_Search.SetFocus();
-		m_Search.SetSel(1, 1);
-
-		*pResult = m_lstHeader.GetCaret();
-		return;
-	}
-	
-	*pResult = -1;	// Default action.
-}
-
-void CQPasteWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
-{
-	// toggle ShowPersistent when we double click the caption
-	if( nHitTest == HTCAPTION )
-	{
-		switch(g_Opt.m_bDoubleClickingOnCaptionDoes)
-		{
-		case TOGGLES_ALLWAYS_ON_TOP:
-			theApp.ShowPersistent( !g_Opt.m_bShowPersistent );
-			break;
-		case TOGGLES_ALLWAYS_SHOW_DESCRIPTION:
-			CGetSetOptions::SetAllwaysShowDescription(!g_Opt.m_bAllwaysShowDescription);
-			break;
-		case ROLLES_UP_WINDOW:
-			MinMaxWindow();
-			break;
-		}
-	}
-	
-	CWndEx::OnNcLButtonDblClk(nHitTest, point);
-}
-
-#define WNDSNAP_ALLOWANCE 12
-
-void CQPasteWnd::OnWindowPosChanging(WINDOWPOS* lpwndpos)
-{
-	CWndEx::OnWindowPosChanging(lpwndpos);
-
-//	m_lstHeader.HidePopup();
-	
-	CRect rcScreen;
-	
-	CRect cr(lpwndpos->x, lpwndpos->y, lpwndpos->x + lpwndpos->cx, lpwndpos->y + lpwndpos->cy);
-	int nMonitor = GetMonitorFromRect(&cr);
-	GetMonitorRect(nMonitor, &rcScreen);
-	
-	// Snap X axis to left
-	if(abs(lpwndpos->x - rcScreen.left) <= WNDSNAP_ALLOWANCE)
-	{
-		lpwndpos->x = rcScreen.left;
-	}
-	
-	// Snap X axis to right
-	if (abs(lpwndpos->x + lpwndpos->cx - rcScreen.right) <= WNDSNAP_ALLOWANCE)
-	{
-		lpwndpos->x = rcScreen.right - lpwndpos->cx;
-	}
-	
-	// Snap Y axis to top
-	if (abs(lpwndpos->y - rcScreen.top) <= WNDSNAP_ALLOWANCE)
-	{
-		// Assign new cordinate
-		lpwndpos->y = rcScreen.top;
-	} 
-	
-	// Snap Y axis to bottom
-	if (abs(lpwndpos->y + lpwndpos->cy - rcScreen.bottom) <= WNDSNAP_ALLOWANCE)
-	{
-		lpwndpos->y = rcScreen.bottom - lpwndpos->cy;
-	}
-}
-
-void CQPasteWnd::OnShowGroupsTop()
-{
-	OnShowGroupsBottom();
-	return;
-	m_GroupTree.m_bHide = false;
-	m_bHideWnd = false;
-	
-	CRect crList;
-	m_lstHeader.GetWindowRect(crList);
-	
-	CRect cr(crList.left, crList.top, crList.left + crList.Width(), crList.top + 200);
-	
-	m_GroupTree.MoveWindow(cr);
-	m_GroupTree.m_lSelectedFolderID = theApp.m_GroupID;
-	m_GroupTree.FillTree();
-	m_GroupTree.ShowWindow(SW_SHOW);
-	
-	m_GroupTree.m_bHide = true;
-	m_bHideWnd = true;
-}
-
-void CQPasteWnd::OnShowGroupsBottom()
-{
-	m_GroupTree.m_bHide = false;
-	m_bHideWnd = false;
-	
-	CRect crWindow, crList;
-	m_lstHeader.GetWindowRect(crList);
-	GetWindowRect(crWindow);
-	
-	CRect cr(crWindow.left, crWindow.bottom, crWindow.left + crWindow.Width(), crWindow.bottom + 200);
-	
-	m_GroupTree.MoveWindow(cr);
-	m_GroupTree.m_lSelectedFolderID = theApp.m_GroupID;
-	m_GroupTree.FillTree();
-	m_GroupTree.ShowWindow(SW_SHOW);
-	
-	m_GroupTree.m_bHide = true;
-	m_bHideWnd = true;
-}
-
-LRESULT CQPasteWnd::OnGroupTreeMessage(WPARAM wParam, LPARAM lParam)
-{
-	m_bHideWnd = false;
-	
-	long lID = (long)wParam;
-	
-	m_GroupTree.ShowWindow(SW_HIDE);
-	
-	m_bHandleSearchTextChange = false;
-	m_Search.SetWindowText(_T(""));
-	m_bHandleSearchTextChange = true;
-
-	MoveControls();
-	
-	if(lID >= -1)
-	{	
-		//Set the app flag so it does a send message to refresh the list
-		//We need to do this because we set the list pos to 0 and with Post
-		//the list is not filled up yet
-		bool bItWas = theApp.m_bAsynchronousRefreshView;
-		theApp.m_bAsynchronousRefreshView = false;
-		
-		OpenID(lID);
-		
-		theApp.m_bAsynchronousRefreshView = bItWas;
-		
-		m_lstHeader.SetListPos(0);
-	}
-	
-	CWnd *p = GetFocus();
-	if(p == NULL)
-	{
-		HideQPasteWindow();
-	}
-	
-	m_bHideWnd = true;
-	
-	return TRUE;
-}
-
-void CQPasteWnd::OnBackButton()
-{
-	theApp.EnterGroupID(theApp.m_GroupParentID);
-}
-
-void CQPasteWnd::OnSearchEditChange()
-{
-	if(g_Opt.m_bFindAsYouType == FALSE)
-		return;
-
-	if(m_bHandleSearchTextChange == false)
-	{
-		//Log(_T("Handle text change is NOT set"));
-		return;
-	}
-
-	KillTimer(TIMER_DO_SEARCH);
-	SetTimer(TIMER_DO_SEARCH, 100, NULL);
-	
-	return;
-}
-
-LRESULT CQPasteWnd::OnUpDown(WPARAM wParam, LPARAM lParam)
-{
-	m_lstHeader.HidePopup();
-
-	if(m_lstHeader.HandleKeyDown(wParam, lParam) == FALSE)
-		m_lstHeader.SendMessage(WM_KEYDOWN, wParam, lParam);
-
-	return TRUE;
-}
-
-LRESULT CQPasteWnd::OnToolTipWndInactive(WPARAM wParam, LPARAM lParam)
-{
-	if(!g_Opt.m_bShowPersistent)
-	{
-		CWnd *p = GetFocus();
-		if(p == NULL)
-		{
-			HideQPasteWindow();
-		}
-	}
-
-	return TRUE;
-}
-
-void CQPasteWnd::OnUpdateMenuNewgroup(CCmdUI* pCmdUI) 
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-	if(cs.Find(_T("Ctrl-F7")) < 0)
-	{
-		cs += "\tCtrl-F7";
-		pCmdUI->SetText(cs);
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuNewgroupselection(CCmdUI* pCmdUI) 
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-	if(cs.Find(_T("F7")) < 0)
-	{
-		cs += "\tF7";
-		pCmdUI->SetText(cs);	
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuAllwaysontop(CCmdUI* pCmdUI) 
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-	if(cs.Find(_T("Ctrl-Space")) < 0)
-	{
-		cs += "\tCtrl-Space";
-		pCmdUI->SetText(cs);
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuViewfulldescription(CCmdUI* pCmdUI) 
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-	if(cs.Find(_T("F3")) < 0)
-	{
-		cs += "\tF3";
-		pCmdUI->SetText(cs);
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuViewgroups(CCmdUI* pCmdUI) 
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-	if(cs.Find(_T("Ctrl-G")) < 0)
-	{
-		cs += "\tCtrl-G";
-		pCmdUI->SetText(cs);	
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuPasteplaintextonly(CCmdUI* pCmdUI) 
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-	if(cs.Find(_T("Shift-Enter")) < 0)
-	{
-		cs += "\tShift-Enter";
-		pCmdUI->SetText(cs);	
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuDelete(CCmdUI* pCmdUI) 
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-
-	if(cs.Find(_T("Del")) < 0)
-	{
-		cs += "\tDel";
-		pCmdUI->SetText(cs);
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuProperties(CCmdUI* pCmdUI) 
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-
-	if(cs.Find(_T("tAlt-Enter")) < 0)
-	{
-		cs += "\tAlt-Enter";
-		pCmdUI->SetText(cs);
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuEdititem(CCmdUI *pCmdUI)
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-
-	if(cs.Find(_T("tCtrl-E")) < 0)
-	{
-		cs += "\tCtrl-E";
-		pCmdUI->SetText(cs);
-	}
-}
-
-void CQPasteWnd::OnUpdateMenuNewclip(CCmdUI *pCmdUI)
-{
-	if(!pCmdUI->m_pMenu)
-		return;
-
-	CString cs;
-	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
-
-	if(cs.Find(_T("tCtrl-N")) < 0)
-	{
-		cs += "\tCtrl-N";
-		pCmdUI->SetText(cs);
-	}
-}
-
-
-LRESULT CQPasteWnd::OnSetListCount(WPARAM wParam, LPARAM lParam)
-{
-	m_lstHeader.SetItemCountEx(wParam);
-
-	MoveControls();
-	UpdateStatus(false);
-
-	return TRUE;
-}
-
-LRESULT CQPasteWnd::OnItemDeleted(WPARAM wParam, LPARAM lParam)
-{
-	m_lstHeader.OnItemDeleted(wParam);
-	return TRUE;
-}
-
-LRESULT CQPasteWnd::OnRefeshVisibleRows(WPARAM wParam, LPARAM lParam)
-{
-	BOOL bRet = FALSE;
-
-	BOOL bLastRefresh = wParam;
-	BOOL bRefreshRows = lParam;
-
-	m_CritSection.Lock();
-		bool bFoundFocusItem = m_bFoundClipToSetFocusTo;
-	m_CritSection.Unlock();
-	
-//	Log(StrF(_T("RefreshRows RefreshRows = %d Focus ID = %d found focus = %d"), 
-//			bRefreshRows, theApp.m_FocusID, bFoundFocusItem));
-
-	if(bFoundFocusItem == false)
-	{
-		long lFocusIndex = -1;
-		if(theApp.m_FocusID >= 0 && ((lFocusIndex = SetListID(theApp.m_FocusID)) >= 0))
-		{
-			m_CritSection.Lock();
-			m_bFoundClipToSetFocusTo = true;
-			m_CritSection.Unlock();
-
-			theApp.m_FocusID = -1;
-			bRet = TRUE;
-			UpdateStatus(false);
-		}
-		else if(theApp.m_FocusID < 0 || bLastRefresh)
-		{
-			if(m_lstHeader.m_bStartTop)
-			{
-				m_lstHeader.SetListPos(0);
-			}
-			else
-			{
-				int idx = m_lstHeader.GetItemCount() - 1;
-				// if there are elements
-				if(idx >= 0)
-					m_lstHeader.SetListPos(idx);
-			}
-			
-			m_CritSection.Lock();
-				m_bFoundClipToSetFocusTo = true;
-			m_CritSection.Unlock();
-			theApp.m_FocusID = -1;
-			bRet = TRUE;
-			UpdateStatus(false);
-		}
-	}
-
-	if(bRefreshRows)
-	{
-		Invalidate();
-		m_lstHeader.RefreshVisibleRows();
-	}
-
-	return bRet;
-}
-
-void CQPasteWnd::FillMainTable(CMainTable &table, CppSQLite3Query &q)
-{
-	table.m_lID = q.getIntField(_T("lID"));
-	table.m_Desc = q.fieldValue(_T("mText"));
-	table.m_bHasParent = q.getIntField(_T("lParentID")) >= 0;
-	table.m_bDontAutoDelete = q.getIntField(_T("lDontAutoDelete")) > 0;
-	table.m_bHasShortCut = q.getIntField(_T("lShortCut")) > 0;
-	table.m_bIsGroup = q.getIntField(_T("bIsGroup")) > 0;
-	table.m_QuickPaste = q.fieldValue(_T("QuickPasteText"));
-}
-
-void CQPasteWnd::RunThread()
-{
-	try
-	{
-		CEvent UpdateTimeEvent(TRUE, TRUE, _T("Ditto_Update_Clip_Time"), NULL);
-		CppSQLite3DB db;
-
-		CString csDbPath = CGetSetOptions::GetDBPath();
-
-		DWORD dStart = GetTickCount();
-		db.open(csDbPath);
-		Log(StrF(_T("Thread RunThread is starting time to open the database - %d"), GetTickCount() - dStart));
-
-		bool bDatabaseOpen = true;
-
-		while(true)
-		{
-			DWORD dwEvent = WaitForMultipleObjects(4, m_Events, FALSE, ONE_MINUTE*10);
-
-			if(dwEvent == WAIT_FAILED)
-			{
-				LPVOID lpMsgBuf = NULL;
-				DWORD dwErr = GetLastError();
-				FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
-							  FORMAT_MESSAGE_FROM_SYSTEM |
-							  FORMAT_MESSAGE_IGNORE_INSERTS,
-							  NULL,
-							  dwErr,
-							  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
-							  (LPTSTR) &lpMsgBuf,
-							  0,
-							  NULL);
-
-				ASSERT(!lpMsgBuf);
-				LocalFree(lpMsgBuf);
-				break;
-			}
-			if(dwEvent == WAIT_TIMEOUT)
-			{
-				if(bDatabaseOpen)
-				{
-					DWORD dStart = GetTickCount();
-
-					db.close();
-					bDatabaseOpen = false;
-
-					Log(StrF(_T("Thread do query is CLOSING the database timout was hit - %d"), GetTickCount() - dStart));
-				}
-			}
-			else
-			{
-				int nIndex = dwEvent - WAIT_OBJECT_0;
-				ResetEvent(m_Events[nIndex]);
-
-				if(nIndex == THREAD_EXIT_THREAD)
-				{
-					Log(_T("Exit thread handle set, exiting search thread"));
-
-					//get out of the waitfor loop
-					break;
-				}
-				else
-				{
-					//If the db path changed close the db then reopen it
-					if(csDbPath != CGetSetOptions::GetDBPath())
-					{
-						db.close();
-						csDbPath = CGetSetOptions::GetDBPath();
-						bDatabaseOpen = false;
-						Log(_T("database name changed closing db"));
-					}
-
-					if(bDatabaseOpen == false)
-					{
-						DWORD dStart = GetTickCount();
-						db.open(csDbPath);
-						bDatabaseOpen = true;
-						Log(StrF(_T("Thread do query is opening the database back up - %d"), GetTickCount() - dStart));
-					}
-				}
-
-				switch(nIndex)
-				{
-				case THREAD_DO_QUERY:
-				{
-					ResetEvent(m_SearchingEvent);
-
-					//If we pasted then wait for the time on the pasted event to be updated before we query the db
-					DWORD dRet = WaitForSingleObject(UpdateTimeEvent, 2000);
-
-					long lTick = GetTickCount();
-					BOOL bRefreshedRows = false;
-
-					m_CritSection.Lock();
-						m_bFoundClipToSetFocusTo = false;
-						CString CountSQL(m_CountSQL);
-						CString SQL(m_SQL);
-						m_Cache.clear();
-						m_bStopQuery = false;
-						int nRefreshInterval = m_lItemsPerPage;
-						if(nRefreshInterval <= 0)
-							nRefreshInterval = 10;
-					m_CritSection.Unlock();
-
-					int nNumRows = 0;
-					bool bFoundFocusItem = false;
-					bool bStopQuerySet = false;
-					
-					try
-					{
-						long lRecordCount = db.execScalar(CountSQL);
-						::PostMessage(m_hWnd, NM_SET_LIST_COUNT, lRecordCount, 0);
-
-						CMainTable table;
-
-						CppSQLite3Query q = db.execQuery(SQL);
-						while(!q.eof())
-						{
-							FillMainTable(table, q);
-
-							m_CritSection.Lock();
-							{
-								m_Cache.push_back(table);
-
-								if(m_bStopQuery)
-								{
-									Log(StrF(_T("StopQuery called exiting filling cache count = %d"), nNumRows));
-									m_CritSection.Unlock();
-									bStopQuerySet = true;
-									break;
-								}
-
-								bFoundFocusItem = m_bFoundClipToSetFocusTo;
-							}
-							m_CritSection.Unlock();
-
-							q.nextRow();
-							
-							nNumRows++;
-
-							if(bFoundFocusItem == false && nNumRows && ((nNumRows % nRefreshInterval) == 0))
-							{
-								::PostMessage(m_hWnd, NM_REFRESH_VISIBLE_ROWS, FALSE, !bRefreshedRows);
-
-								nRefreshInterval = 100;
-								bRefreshedRows = TRUE;
-							}
-						}
-					}
-					CATCH_SQLITE_EXCEPTION	
-
-					if(bStopQuerySet == false)
-					{
-						::PostMessage(m_hWnd, NM_REFRESH_VISIBLE_ROWS, TRUE, !bRefreshedRows);
-					}
-					
-					SetEvent(m_SearchingEvent);
-					Log(StrF(_T("List filled count = %d, time = %d"), nNumRows, GetTickCount() - lTick));
-				}
-				break;
-
-				case THREAD_FILL_ACCELERATORS:
-				{
-					m_lstHeader.DestroyAndCreateAccelerator(TRUE, db);
-				}
-				break;
-
-				case THREAD_DESTROY_ACCELERATORS:
-				{
-					m_lstHeader.DestroyAndCreateAccelerator(FALSE, db);
-				}
-				break;
-				}
-			}
-		}
-	}
-	CATCH_SQLITE_EXCEPTION
-
-	ResetEvent(m_ExitEvent);
-}
-
-void CQPasteWnd::OnDestroy() 
-{
-	CWndEx::OnDestroy();
-	
-	SetEvent(m_Events[THREAD_EXIT_THREAD]);
-}
-
-void CQPasteWnd::OnTimer(UINT_PTR nIDEvent)
-{
-	if(nIDEvent == TIMER_DO_SEARCH)
-	{
-		KillTimer(TIMER_DO_SEARCH);
-
-		CString csText;
-		m_Search.GetWindowText(csText);
-		
-		int nCaretPos = m_lstHeader.GetCaret();
-		if(nCaretPos >= 0 && theApp.m_FocusID < 0)
-			theApp.m_FocusID = m_lstHeader.GetItemData(nCaretPos);
-
-		FillList(csText);
-	}
-	if(nIDEvent == TIMER_PASTE_FROM_MODIFER)
-	{
-		Log(_T("TIMER_PASTE_FROM_MODIFER timer\n"));
-		KillTimer(TIMER_PASTE_FROM_MODIFER);
-		if(m_bModifersMoveActive)
-		{
-			Log(_T("Open Selection\n"));
-			OpenSelection(false);
-		}
-		else
-		{
-			Log(_T("m_bModifersMoveActive set to false\n"));
-		}
-	}
-
-	CWndEx::OnTimer(nIDEvent);
-}
-
-void CQPasteWnd::OnAddinSelect(UINT id)
-{
-	ARRAY IDs;
-	m_lstHeader.GetSelectionItemData(IDs);
-
-	if(IDs.GetCount() > 0)
-	{
-		long lID = IDs[0];
-		CClip clip;
-		if(clip.LoadMainTable(lID))
-		{
-			if(clip.LoadFormats(lID, false))
-			{
-				bool bCont = theApp.m_Addins.CallPrePasteFunction(id, &clip);
-				if(bCont)
-				{
-					OpenID(-1, false, &clip.m_Formats);
-				}
-			}
-		}
-	}
+// QPasteWnd.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "CP_Main.h"
+#include "QPasteWnd.h"
+#include "ProcessPaste.h"
+#include "CopyProperties.h"
+#include "GroupName.h"
+#include ".\qpastewnd.h"
+#include "MoveToGroupDlg.h"
+#include "HyperLink.h"
+#include "FormatSQL.h"
+#include "MainTableFunctions.h"
+#include "Path.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+#define QPASTE_TITLE			"Ditto"
+
+#define ID_LIST_HEADER			0x201
+#define ID_EDIT_SEARCH			0x202
+#define ID_CANCEL				0x203
+#define ID_GROUP_TEXT			0x204
+#define ID_SHOW_GROUPS_BOTTOM	0x205
+#define ID_SHOW_GROUPS_TOP		0x206
+#define ID_BACK_BUTTON			0x207
+
+
+#define QPASTE_WIDTH			200
+#define	QPASTE_HEIGHT			200
+
+#define TIMER_FILL_CACHE		1
+#define TIMER_DO_SEARCH			2
+#define TIMER_PASTE_FROM_MODIFER	3
+
+#define THREAD_DO_QUERY				0
+#define THREAD_EXIT_THREAD			1
+#define THREAD_FILL_ACCELERATORS	2
+#define THREAD_DESTROY_ACCELERATORS	3
+#define THREAD_LOAD_ITEMS			4
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CQPasteWnd
+
+CQPasteWnd::CQPasteWnd()
+{	
+	m_Title = QPASTE_TITLE;
+	m_bHideWnd = true;
+	m_strSQLSearch = "";
+	m_bAllowRepaintImmediately = true;
+	m_bHandleSearchTextChange = true;
+	m_lItemsPerPage = 0;
+	m_bModifersMoveActive = false;
+}
+
+CQPasteWnd::~CQPasteWnd()
+{
+	CloseHandle(m_Events[0]);
+	CloseHandle(m_Events[1]);
+	CloseHandle(m_Events[2]);
+	CloseHandle(m_Events[3]);
+	CloseHandle(m_ExitEvent);
+	CloseHandle(m_SearchingEvent);	
+}
+
+
+BEGIN_MESSAGE_MAP(CQPasteWnd, CWndEx)
+//{{AFX_MSG_MAP(CQPasteWnd)
+	ON_WM_CREATE()
+	ON_WM_SIZE()
+	ON_WM_SETFOCUS()
+	ON_WM_ACTIVATE()
+	ON_COMMAND(ID_MENU_LINESPERROW_1, OnMenuLinesperrow1)
+	ON_COMMAND(ID_MENU_LINESPERROW_2, OnMenuLinesperrow2)
+	ON_COMMAND(ID_MENU_LINESPERROW_3, OnMenuLinesperrow3)
+	ON_COMMAND(ID_MENU_LINESPERROW_4, OnMenuLinesperrow4)
+	ON_COMMAND(ID_MENU_LINESPERROW_5, OnMenuLinesperrow5)
+	ON_COMMAND(ID_MENU_TRANSPARENCY_10, OnMenuTransparency10)
+	ON_COMMAND(ID_MENU_TRANSPARENCY_15, OnMenuTransparency15)
+	ON_COMMAND(ID_MENU_TRANSPARENCY_20, OnMenuTransparency20)
+	ON_COMMAND(ID_MENU_TRANSPARENCY_25, OnMenuTransparency25)
+	ON_COMMAND(ID_MENU_TRANSPARENCY_30, OnMenuTransparency30)
+	ON_COMMAND(ID_MENU_TRANSPARENCY_40, OnMenuTransparency40)
+	ON_COMMAND(ID_MENU_TRANSPARENCY_5, OnMenuTransparency5)
+	ON_COMMAND(ID_MENU_TRANSPARENCY_NONE, OnMenuTransparencyNone)
+	ON_NOTIFY(NM_RCLICK, ID_LIST_HEADER, OnRclickQuickPaste)
+	ON_COMMAND(ID_MENU_DELETE, OnMenuDelete)
+	ON_COMMAND(ID_MENU_POSITIONING_ATCARET, OnMenuPositioningAtcaret)
+	ON_COMMAND(ID_MENU_POSITIONING_ATCURSOR, OnMenuPositioningAtcursor)
+	ON_COMMAND(ID_MENU_POSITIONING_ATPREVIOUSPOSITION, OnMenuPositioningAtpreviousposition)
+	ON_COMMAND(ID_MENU_OPTIONS, OnMenuOptions)
+	ON_BN_CLICKED(ID_CANCEL, OnCancelFilter)
+	ON_COMMAND(ID_MENU_EXITPROGRAM, OnMenuExitprogram)
+	ON_COMMAND(ID_MENU_TOGGLECONNECTCV, OnMenuToggleConnectCV)
+	ON_COMMAND(ID_MENU_PROPERTIES, OnMenuProperties)
+	ON_WM_CLOSE()
+	ON_NOTIFY(LVN_BEGINDRAG, ID_LIST_HEADER, OnBegindrag)
+	ON_WM_SYSKEYDOWN()
+	ON_NOTIFY(LVN_GETDISPINFO, ID_LIST_HEADER, GetDispInfo)
+	ON_NOTIFY(LVN_ODFINDITEM, ID_LIST_HEADER, OnFindItem)
+	ON_COMMAND(ID_MENU_FIRSTTENHOTKEYS_USECTRLNUM, OnMenuFirsttenhotkeysUsectrlnum)
+	ON_COMMAND(ID_MENU_FIRSTTENHOTKEYS_SHOWHOTKEYTEXT, OnMenuFirsttenhotkeysShowhotkeytext)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_ALLWAYSSHOWDESCRIPTION, OnMenuQuickoptionsAllwaysshowdescription)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSONTOP, OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW, OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSSHOWDESCRIPTION, OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES, OnMenuQuickoptionsPromptfornewgroupnames)
+	ON_BN_CLICKED(ID_SHOW_GROUPS_BOTTOM, OnShowGroupsBottom)
+	ON_BN_CLICKED(ID_SHOW_GROUPS_TOP, OnShowGroupsTop)
+	ON_COMMAND(ID_MENU_VIEWGROUPS, OnMenuViewgroups)
+	ON_COMMAND(ID_MENU_QUICKPROPERTIES_SETTONEVERAUTODELETE, OnMenuQuickpropertiesSettoneverautodelete)
+	ON_COMMAND(ID_MENU_QUICKPROPERTIES_AUTODELETE, OnMenuQuickpropertiesAutodelete)
+	ON_COMMAND(ID_MENU_QUICKPROPERTIES_REMOVEHOTKEY, OnMenuQuickpropertiesRemovehotkey)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_EIGHT, OnMenuSenttoFriendEight)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_ELEVEN, OnMenuSenttoFriendEleven)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_FIFTEEN, OnMenuSenttoFriendFifteen)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_FIVE, OnMenuSenttoFriendFive)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_FORE, OnMenuSenttoFriendFore)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_FORETEEN, OnMenuSenttoFriendForeteen)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_NINE, OnMenuSenttoFriendNine)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_SEVEN, OnMenuSenttoFriendSeven)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_SIX, OnMenuSenttoFriendSix)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_TEN, OnMenuSenttoFriendTen)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_THIRTEEN, OnMenuSenttoFriendThirteen)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_THREE, OnMenuSenttoFriendThree)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_TWELVE, OnMenuSenttoFriendTwelve)
+	ON_COMMAND(ID_MENU_SENTTO_FRIEND_TWO, OnMenuSenttoFriendTwo)
+	ON_COMMAND(ID_MENU_SENTTO_FRIENDONE, OnMenuSenttoFriendone)
+	ON_COMMAND(ID_MENU_SENTTO_PROMPTFORIP, OnMenuSenttoPromptforip)
+	ON_COMMAND(ID_MENU_GROUPS_MOVETOGROUP, OnMenuGroupsMovetogroup)
+	ON_COMMAND(ID_MENU_PASTEPLAINTEXTONLY, OnMenuPasteplaintextonly)
+	ON_COMMAND(ID_MENU_HELP, OnMenuHelp)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_FONT, OnMenuQuickoptionsFont)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_SHOWTHUMBNAILS, OnMenuQuickoptionsShowthumbnails)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_DRAWRTFTEXT, OnMenuQuickoptionsDrawrtftext)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_PASTECLIPAFTERSELECTION, OnMenuQuickoptionsPasteclipafterselection)
+	ON_EN_CHANGE(ID_EDIT_SEARCH, OnSearchEditChange)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_FINDASYOUTYPE, OnMenuQuickoptionsFindasyoutype)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_ENSUREENTIREWINDOWISVISIBLE, OnMenuQuickoptionsEnsureentirewindowisvisible)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_SHOWCLIPSTHATAREINGROUPSINMAINLIST, OnMenuQuickoptionsShowclipsthatareingroupsinmainlist)
+	ON_UPDATE_COMMAND_UI(ID_MENU_NEWGROUP, OnUpdateMenuNewgroup)
+	ON_UPDATE_COMMAND_UI(ID_MENU_NEWGROUPSELECTION, OnUpdateMenuNewgroupselection)
+	ON_UPDATE_COMMAND_UI(ID_MENU_ALLWAYSONTOP, OnUpdateMenuAllwaysontop)
+	ON_UPDATE_COMMAND_UI(ID_MENU_VIEWFULLDESCRIPTION, OnUpdateMenuViewfulldescription)
+	ON_UPDATE_COMMAND_UI(ID_MENU_VIEWGROUPS, OnUpdateMenuViewgroups)
+	ON_UPDATE_COMMAND_UI(ID_MENU_PASTEPLAINTEXTONLY, OnUpdateMenuPasteplaintextonly)
+	ON_UPDATE_COMMAND_UI(ID_MENU_DELETE, OnUpdateMenuDelete)
+	ON_UPDATE_COMMAND_UI(ID_MENU_PROPERTIES, OnUpdateMenuProperties)
+	ON_COMMAND(ID_QUICKOPTIONS_PROMPTTODELETECLIP, OnPromptToDeleteClip)
+	ON_WM_DESTROY()
+	//}}AFX_MSG_MAP
+	ON_MESSAGE(NM_SELECT, OnListSelect)
+	ON_MESSAGE(NM_END, OnListEnd)
+	ON_MESSAGE(CB_SEARCH, OnSearch)
+	ON_MESSAGE(NM_DELETE, OnDelete)
+	ON_MESSAGE(NM_PROPERTIES, OnProperties)
+	ON_NOTIFY(NM_GETTOOLTIPTEXT, ID_LIST_HEADER, OnGetToolTipText)
+	ON_MESSAGE(NM_SELECT_DB_ID, OnListSelect_DB_ID)
+	ON_MESSAGE(NM_SELECT_INDEX, OnListSelect_Index)
+	ON_MESSAGE(WM_REFRESH_VIEW, OnRefreshView)
+	ON_WM_NCLBUTTONDBLCLK()
+	ON_WM_WINDOWPOSCHANGING()
+	ON_COMMAND(ID_VIEWCAPTIONBARON_RIGHT, OnViewcaptionbaronRight)
+	ON_COMMAND(ID_VIEWCAPTIONBARON_BOTTOM, OnViewcaptionbaronBottom)
+	ON_COMMAND(ID_VIEWCAPTIONBARON_LEFT, OnViewcaptionbaronLeft)
+	ON_COMMAND(ID_VIEWCAPTIONBARON_TOP, OnViewcaptionbaronTop)
+	ON_COMMAND(ID_MENU_AUTOHIDE, OnMenuAutohide)
+	ON_COMMAND(ID_MENU_VIEWFULLDESCRIPTION, OnMenuViewfulldescription)
+	ON_COMMAND(ID_MENU_ALLWAYSONTOP, OnMenuAllwaysontop)
+	ON_COMMAND(ID_SORT_ASCENDING, OnSortAscending)
+	ON_COMMAND(ID_SORT_DESCENDING, OnSortDescending)
+	ON_COMMAND(ID_MENU_NEWGROUP, OnMenuNewGroup)
+	ON_COMMAND(ID_MENU_NEWGROUPSELECTION, OnMenuNewGroupSelection)
+	ON_MESSAGE(NM_GROUP_TREE_MESSAGE, OnGroupTreeMessage)
+	ON_COMMAND(ID_BACK_BUTTON, OnBackButton)
+	ON_MESSAGE(CB_UPDOWN, OnUpDown)
+	ON_MESSAGE(NM_INACTIVE_TOOLTIPWND, OnToolTipWndInactive)
+	ON_MESSAGE(NM_SET_LIST_COUNT, OnSetListCount)
+	ON_MESSAGE(NM_REFRESH_ROW, OnRefeshRow)
+	ON_MESSAGE(NM_ITEM_DELETED, OnItemDeleted)
+	ON_WM_TIMER()
+	ON_COMMAND(ID_MENU_EXPORT, OnMenuExport)
+	ON_COMMAND(ID_MENU_IMPORT, OnMenuImport)
+	ON_COMMAND(ID_QUICKPROPERTIES_REMOVEQUICKPASTE, OnQuickpropertiesRemovequickpaste)
+	ON_COMMAND(ID_MENU_EDITITEM, OnMenuEdititem)
+	ON_COMMAND(ID_MENU_NEWCLIP, OnMenuNewclip)
+	ON_UPDATE_COMMAND_UI(ID_MENU_EDITITEM, OnUpdateMenuEdititem)
+	ON_UPDATE_COMMAND_UI(ID_MENU_NEWCLIP, OnUpdateMenuNewclip)
+	ON_WM_CTLCOLOR_REFLECT()
+	ON_COMMAND_RANGE(3000, 4000, OnAddinSelect)
+	ON_MESSAGE(NM_ALL_SELECTED, OnSelectAll)
+	END_MESSAGE_MAP()
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CQPasteWnd message handlers
+
+HBRUSH CQPasteWnd::CtlColor(CDC* pDC, UINT nCtlColor) 
+{
+	pDC->SetBkMode(TRANSPARENT);
+	pDC->SetBkColor(RGB(255, 0, 0));
+
+	return (HBRUSH)GetStockObject(NULL_BRUSH);
+}
+
+BOOL CQPasteWnd::Create(const POINT& ptStart, CWnd* pParentWnd) 
+{
+	// Get the previous size of the QPaste window
+	CSize szWnd;
+	CGetSetOptions::GetQuickPasteSize(szWnd);
+	
+	return CWndEx::Create(CRect(ptStart, szWnd), pParentWnd);
+}
+
+UINT  StartThread(LPVOID pParam)
+{
+	Log(_T("Starting fill list thread"));
+
+	CQPasteWnd *pWnd = (CQPasteWnd*)pParam;
+	pWnd->RunThread();
+
+	Log(_T("Ending fill list thread"));
+
+	return TRUE;
+}
+
+int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
+{
+	if (CWndEx::OnCreate(lpCreateStruct) == -1)
+		return -1;
+
+	SetWindowText(_T(QPASTE_TITLE));
+	
+	m_Search.Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER,	CRect(0, 0, 0, 0), this, ID_EDIT_SEARCH);
+	
+	// Create the header control
+	if (!m_lstHeader.Create(WS_TABSTOP|WS_CHILD|WS_VISIBLE|LVS_NOCOLUMNHEADER|LVS_REPORT|LVS_SHOWSELALWAYS|LVS_OWNERDATA,
+		CRect(0, 0, 0, 0),	this, ID_LIST_HEADER))
+	{
+		ASSERT(FALSE);
+		return -1;
+	}
+
+	((CWnd *)&m_GroupTree)->CreateEx(NULL, _T("SysTreeView32"), NULL, WS_BORDER|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS, CRect(0, 0, 100, 100), this, 0);
+	m_GroupTree.ModifyStyle(WS_CAPTION, WS_BORDER);
+	
+	m_GroupTree.SetNotificationWndEx(m_hWnd);
+	m_GroupTree.ShowWindow(SW_HIDE);
+	
+	m_ShowGroupsFolderBottom.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_SHOW_GROUPS_BOTTOM);
+	m_ShowGroupsFolderBottom.LoadBitmaps(IDB_CLOSED_FOLDER, IDB_CLOSED_FOLDER_PRESSED, IDB_CLOSED_FOLDER_FOCUSED);
+	m_ShowGroupsFolderBottom.ShowWindow(SW_SHOW);
+	
+	m_ShowGroupsFolderTop.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_SHOW_GROUPS_TOP);
+	m_ShowGroupsFolderTop.LoadBitmaps(IDB_OPEN_FOLDER, IDB_OPEN_FOLDER_PRESSED, IDB_OPEN_FOLDER_FOCUSED);
+	m_ShowGroupsFolderTop.ShowWindow(SW_SHOW);
+
+	m_BackButton.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_BACK_BUTTON);
+	m_BackButton.LoadBitmaps(IDB_BACK, IDB_BACK_PRESSED, IDB_BACK_FOCUSED);
+	m_BackButton.ShowWindow(SW_SHOW);
+	
+	m_btCancel.Create(_T("&C"), WS_CHILD|BS_PUSHBUTTON|WS_TABSTOP/*|BS_FLAT*/, CRect(0, 0, 0, 0), this, ID_CANCEL);
+	
+	m_stGroup.Create(_T(""), WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, ID_GROUP_TEXT);
+	
+	//Set the z-order
+	m_lstHeader.SetWindowPos(this, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
+	m_Search.SetWindowPos(&m_lstHeader, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
+	m_btCancel.SetWindowPos(&m_Search, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
+	m_ShowGroupsFolderBottom.SetWindowPos(&m_Search, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
+	
+	//LVS_EX_FLATSB
+	m_lstHeader.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
+	
+	// Create the columns
+	if (m_lstHeader.InsertColumn(0, _T(""), LVCFMT_LEFT, 2500, 0) != 0)
+	{
+		ASSERT(FALSE);
+		return -1;
+	}
+	
+#ifdef AFTER_98
+	m_Alpha.SetWindowHandle(m_hWnd);	
+#endif
+	
+	m_TitleFont.CreateFont(14,0,-900,0,400,FALSE,FALSE,0,ANSI_CHARSET,
+		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
+		DEFAULT_PITCH|FF_SWISS, _T("Arial"));
+	
+	m_SearchFont.CreatePointFont(80, _T("@Arial Unicode MS"));
+	
+	GroupFont.CreateFont(-11, 0, 0, 0, 400, 0, 1, 0, DEFAULT_CHARSET, 3, 2, 1, 34, _T("MS Sans Serif"));
+	
+	m_Search.SetFont(&m_SearchFont);
+	m_btCancel.SetFont(&m_SearchFont);
+	m_stGroup.SetFont(&GroupFont);
+
+	UpdateFont();
+
+	m_Events[0] = CreateEvent(NULL, TRUE, FALSE, _T(""));
+	m_Events[1] = CreateEvent(NULL, TRUE, FALSE, _T(""));
+	m_Events[2] = CreateEvent(NULL, TRUE, FALSE, _T(""));
+	m_Events[3] = CreateEvent(NULL, TRUE, FALSE, _T(""));
+	m_ExitEvent = CreateEvent(NULL, TRUE, FALSE, _T(""));
+	m_SearchingEvent = CreateEvent(NULL, TRUE, FALSE, _T(""));
+
+	AfxBeginThread(StartThread, this);
+		
+	return 0;
+}
+
+void CQPasteWnd::OnSize(UINT nType, int cx, int cy) 
+{
+	CWndEx::OnSize(nType, cx, cy);
+	
+	if(!IsWindow(m_lstHeader.m_hWnd))
+		return;
+	
+	MoveControls();
+}
+
+void CQPasteWnd::MoveControls()
+{
+	CRect crRect;
+	GetClientRect(crRect);
+	int cx = crRect.Width();
+	int cy = crRect.Height();
+	
+	long lTopOfListBox = 0;
+	
+	if(theApp.m_GroupID > 0)
+	{
+		m_stGroup.ShowWindow(SW_SHOW);
+		m_ShowGroupsFolderTop.ShowWindow(SW_SHOW);
+		m_BackButton.ShowWindow(SW_SHOW);
+
+		m_BackButton.MoveWindow(0, 0, 18, 16);
+		m_ShowGroupsFolderTop.MoveWindow(22, 0, 18, 16);
+		m_stGroup.MoveWindow(44, 0, cx, 16);
+		
+		lTopOfListBox = 16;	
+	}
+	else
+	{
+		m_BackButton.ShowWindow(SW_HIDE);
+		m_stGroup.ShowWindow(SW_HIDE);
+		m_ShowGroupsFolderTop.ShowWindow(SW_HIDE);
+	}
+	
+	// Resize the list control
+	m_lstHeader.MoveWindow(0, lTopOfListBox, cx, cy - 25 - lTopOfListBox);
+	
+	int nWidth = cx;
+	
+	if(m_strSQLSearch.IsEmpty() == FALSE)
+	{
+		m_btCancel.ShowWindow(SW_SHOW);
+		m_btCancel.MoveWindow(cx - 17, cy - 18, 15, 15);
+		nWidth -= 19;
+	}
+	else
+		m_btCancel.ShowWindow(SW_HIDE);
+	
+	m_Search.MoveWindow(18, cy - 20, nWidth-20, 19);
+	
+	m_ShowGroupsFolderBottom.MoveWindow(0, cy - 19, 18, 16);
+	
+	// Set the column widths
+	//m_lstHeader.SetColumnWidth(0, cx);
+}
+
+void CQPasteWnd::OnSetFocus(CWnd* pOldWnd)
+{
+	CWndEx::OnSetFocus(pOldWnd);
+
+	::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
+	
+	// Set the focus to the list control
+	if(::IsWindow(m_lstHeader.m_hWnd))
+		m_lstHeader.SetFocus();
+}
+
+void CQPasteWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
+{
+	CWndEx::OnActivate(nState, pWndOther, bMinimized);
+	
+	if(m_bHideWnd == false || m_lstHeader.GetToolTipHWnd() == pWndOther->GetSafeHwnd())
+		return;
+	
+	if (nState == WA_INACTIVE)
+	{
+		m_bModifersMoveActive = false;
+
+		if(!g_Opt.m_bShowPersistent)
+		{
+			HideQPasteWindow();
+		}
+		
+		//re register the global hot keys for the last ten
+		if(theApp.m_bAppExiting == false)
+			g_HotKeys.RegisterAll();
+
+		m_lstHeader.HidePopup();
+	}
+	else if (nState == WA_ACTIVE || nState == WA_CLICKACTIVE)
+	{
+		if(theApp.m_bShowingQuickPaste == false)
+		{
+			ShowQPasteWindow(m_mapCache.size() == 0);
+		}
+
+		//Unregister the global hot keys for the last ten copies
+		g_HotKeys.UnregisterAll(false, true);
+	}
+}
+
+BOOL CQPasteWnd::HideQPasteWindow()
+{
+	Log(_T("HideQPasteWindow"));
+
+	if(!theApp.m_bShowingQuickPaste) 
+		return FALSE;
+
+	m_CritSection.Lock();
+		m_bStopQuery = true;
+	m_CritSection.Unlock();
+
+	//Reset the flagShell_TrayWnd
+	theApp.m_bShowingQuickPaste = false;
+	theApp.m_activeWnd.ReleaseFocus();
+	
+	SetEvent(m_Events[THREAD_DESTROY_ACCELERATORS]);
+	
+	KillTimer(TIMER_FILL_CACHE);
+	
+	//Save the size
+	CRect rect;
+	GetWindowRectEx(&rect);
+	CGetSetOptions::SetQuickPasteSize(rect.Size());
+	CGetSetOptions::SetQuickPastePoint(rect.TopLeft());
+
+	// Hide the window when the focus is lost
+	ShowWindow(SW_HIDE);
+	
+	//Reset the selection in the search combo
+	m_bHandleSearchTextChange = false;
+	m_Search.SetWindowText(_T(""));
+	m_bHandleSearchTextChange = true;
+
+	if(m_strSQLSearch.IsEmpty() == FALSE)
+	{
+		m_CritSection.Lock();
+		{
+			m_bStopQuery = true;
+		}
+		m_CritSection.Unlock();
+
+		//Wait for the thread to stop fill the cache so we can clear it
+		WaitForSingleObject(m_SearchingEvent, INFINITE);
+
+		m_CritSection.Lock();
+		{
+			m_mapCache.clear();
+		}
+		m_CritSection.Unlock();
+
+	}
+	
+	return TRUE;
+}
+
+BOOL CQPasteWnd::ShowQPasteWindow(BOOL bFillList)
+{
+	theApp.m_bShowingQuickPaste = true;
+
+	Log(StrF(_T("ShowQPasteWindow - %d %d"), bFillList, theApp.m_bShowingQuickPaste));
+
+	//Ensure we have the latest theme file, this checks the last write time so it doesn't read the file each time
+	g_Opt.m_Theme.Load(g_Opt.GetTheme(), false, true);
+
+	SetCaptionColorActive(g_Opt.m_bShowPersistent, theApp.GetConnectCV());
+	
+	// use invalidation to avoid unnecessary repainting
+	m_bAllowRepaintImmediately = false;
+	UpdateStatus();
+	
+	SetEvent(m_Events[THREAD_FILL_ACCELERATORS]);
+	
+	m_bHideWnd = true;
+	
+#ifdef AFTER_98
+	//Set the transparency
+	if(CGetSetOptions::GetEnableTransparency())
+	{
+		m_Alpha.SetTransparent(TRUE);
+		
+		float fPercent =  CGetSetOptions::GetTransparencyPercent() / (float)100.0;
+		
+		m_Alpha.SetOpacity(OPACITY_MAX - (int)(fPercent * OPACITY_MAX));
+	}
+	else
+	{
+		m_Alpha.SetTransparent(FALSE);
+	}
+#endif
+	
+	m_lstHeader.SetNumberOfLinesPerRow(CGetSetOptions::GetLinesPerRow());
+	
+	m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
+
+	if(bFillList)
+		FillList();	// FillList calls MoveControls
+	else
+		MoveControls();
+	
+	// from now on, for interactive use, we can repaint immediately
+	m_bAllowRepaintImmediately = true;
+	
+	// always on top... for persistent showing (g_Opt.m_bShowPersistent)
+	// SHOWWINDOW was also integrated into this function rather than calling it separately
+	::SetWindowPos( m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW );
+
+	SetKeyModiferState(true);
+	
+	return TRUE;
+}
+
+bool CQPasteWnd::Add(const CString &csHeader, const CString &csText, int nID)
+{
+	int nNewIndex;
+	
+	if(g_Opt.m_bHistoryStartTop)
+	{
+		// Insert the item in the list control
+		if ((nNewIndex = m_lstHeader.InsertItem(m_lstHeader.GetItemCount(), csHeader)) == -1)
+			return false;
+	}
+	else
+	{
+		if ((nNewIndex = m_lstHeader.InsertItem(m_lstHeader.GetItemCount(), csHeader)) == -1)
+			return false;
+	}
+	
+	m_lstHeader.SetItemData(nNewIndex, nID);
+	
+	return true;
+}
+
+BOOL CQPasteWnd::OpenID(long lID, bool bOnlyLoad_CF_TEXT, CClipFormats *pPasteFormats)
+{
+	if(pPasteFormats == NULL)
+	{
+		if(theApp.EnterGroupID(lID))
+			return TRUE;
+	}
+
+	if(GetKeyState(VK_SHIFT) & 0x8000)
+	{
+		bOnlyLoad_CF_TEXT = true;
+	}
+
+	// else, it is a clip, so paste it
+	CProcessPaste paste;
+	
+	paste.m_bSendPaste = g_Opt.m_bSendPasteMessageAfterSelection == TRUE ? true : false;
+	paste.m_bOnlyPaste_CF_TEXT = bOnlyLoad_CF_TEXT;
+
+	if(pPasteFormats != NULL)
+	{
+		paste.SetCustomPasteFormats(pPasteFormats);
+	}
+	else
+	{
+		paste.GetClipIDs().Add(lID);
+	}
+	paste.DoPaste();
+	theApp.OnPasteCompleted();
+
+	if(g_Opt.m_bSendPasteMessageAfterSelection == FALSE)
+		theApp.m_activeWnd.ActivateTarget();
+
+	if(g_Opt.m_bShowPersistent && g_Opt.GetAutoHide())
+		MinMaxWindow(FORCE_MIN);
+
+	return TRUE;
+}
+
+BOOL CQPasteWnd::OpenSelection(bool bOnlyLoad_CF_TEXT)
+{
+	ARRAY IDs;
+	m_lstHeader.GetSelectionItemData( IDs );
+    
+	int count = IDs.GetSize();
+	
+	if(count <= 0)
+		return FALSE;
+	
+	if(count == 1)
+		return OpenID(IDs[0], bOnlyLoad_CF_TEXT);
+
+	if(GetKeyState(VK_SHIFT) & 0x8000)
+	{
+		bOnlyLoad_CF_TEXT = true;
+	}
+	
+	CProcessPaste paste;
+
+	paste.m_bSendPaste = g_Opt.m_bSendPasteMessageAfterSelection == TRUE ? true : false;
+	paste.m_bOnlyPaste_CF_TEXT = bOnlyLoad_CF_TEXT;
+	
+	paste.GetClipIDs().Copy(IDs);
+	paste.DoPaste();
+	theApp.OnPasteCompleted();
+
+	if(g_Opt.m_bSendPasteMessageAfterSelection == FALSE)
+		theApp.m_activeWnd.ActivateTarget();
+
+	if(g_Opt.m_bShowPersistent && g_Opt.GetAutoHide())
+		MinMaxWindow(FORCE_MIN);
+
+	return TRUE;
+}
+
+BOOL CQPasteWnd::OpenIndex( long nItem )
+{
+	return OpenID( m_lstHeader.GetItemData(nItem) );
+}
+
+BOOL CQPasteWnd::NewGroup( bool bGroupSelection )
+{	
+	//Get the selected ids
+	CClipIDs IDs;
+	m_lstHeader.GetSelectionItemData( IDs );
+	
+	CGroupName Name;
+	CString csName("");
+	
+	if(g_Opt.m_bPrompForNewGroupName)
+	{
+		m_bHideWnd = false;
+		
+		int nRet = Name.DoModal();
+	
+		m_bHideWnd = true;
+		
+		if(nRet == IDOK)
+			csName = Name.m_csName;
+		else
+			return false;
+	}
+	
+	long lID = NewGroupID(theApp.GetValidGroupID(), csName);
+	
+	if(lID <= 0)
+		return FALSE;
+	
+	if(!bGroupSelection)
+	{
+		theApp.m_FocusID = lID; // focus on the new group
+		FillList();
+		return TRUE;
+	}
+	
+	IDs.MoveTo(lID);
+	theApp.EnterGroupID(lID);
+	return TRUE;
+}
+
+LRESULT CQPasteWnd::OnListSelect_DB_ID(WPARAM wParam, LPARAM lParam)
+{
+	OpenID(wParam);
+	return TRUE;
+}
+
+LRESULT CQPasteWnd::OnListSelect_Index(WPARAM wParam, LPARAM lParam)
+{
+	if((int)wParam >= m_lstHeader.GetItemCount())
+		return FALSE;
+	
+	OpenIndex(wParam);
+	
+	return TRUE;
+}
+
+LRESULT CQPasteWnd::OnListSelect(WPARAM wParam, LPARAM lParam)
+{
+	int nCount = (int) wParam;
+	long *pItems = (long*) lParam;
+	
+	OpenSelection(false);
+	
+	return TRUE;
+}
+
+LRESULT CQPasteWnd::OnListEnd(WPARAM wParam, LPARAM lParam)
+{
+	HideQPasteWindow();
+	return 0;
+}
+
+LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
+{
+	MSG msg;
+	// remove all additional refresh view messages from the queue
+	while(::PeekMessage(&msg, m_hWnd, WM_REFRESH_VIEW, WM_REFRESH_VIEW, PM_REMOVE))
+	{
+	}
+
+	theApp.m_FocusID = -1;
+
+	if(theApp.m_bShowingQuickPaste)
+	{
+		FillList();
+	}
+	else
+	{
+		//Wait for the thread to stop fill the cache so we can clear it
+		WaitForSingleObject(m_SearchingEvent, INFINITE);
+
+		m_CritSection.Lock();
+		{
+			m_mapCache.clear();
+		}
+		m_CritSection.Unlock();
+	}
+	
+	return TRUE;
+}
+
+void CQPasteWnd::RefreshNc(bool bRepaintImmediately)
+{
+	if(!theApp.m_bShowingQuickPaste)
+		return;
+	
+	if(bRepaintImmediately && m_bAllowRepaintImmediately)
+		OnNcPaint();
+	else
+		InvalidateNc();
+}
+
+void CQPasteWnd::UpdateStatus(bool bRepaintImmediately)
+{
+	CString title = m_Title;
+	CString prev;
+	
+	GetWindowText(prev);
+	
+	CString cs;
+	cs.Format(_T(" - %d/%d"), m_lstHeader.GetSelectedCount(), m_lstHeader.GetItemCount());
+	title += cs;
+		
+	if(theApp.m_Status != "")
+	{
+		title += " [ ";
+		title += theApp.m_Status;
+		title += " ] - ";
+	}
+	else
+		title += " - ";
+	
+	if(theApp.m_IC_IDs.GetSize() > 0)
+	{
+		if( theApp.m_IC_bCopy )
+			title += "Copying";
+		else
+			title += "Moving";
+		
+		title += " - ";
+	}
+	
+	if(::IsWindow(theApp.m_activeWnd.ActiveWnd()))
+		title += theApp.m_activeWnd.ActiveWndName();
+	else
+		title += theApp.m_Language.GetString("No_Target", "No target");
+	
+	if(title != prev)
+	{
+		SetWindowText(title);
+		RefreshNc(bRepaintImmediately);
+	}
+}
+
+BOOL CQPasteWnd::FillList(CString csSQLSearch/*=""*/)
+{
+	KillTimer(TIMER_DO_SEARCH);
+
+	m_CritSection.Lock();
+		m_bStopQuery = true;
+	m_CritSection.Unlock();
+
+	CString strFilter;
+	CString strParentFilter;
+	CString csSort;
+	
+	// History Group
+	if(theApp.m_GroupID < 0)
+	{
+		m_lstHeader.m_bStartTop = g_Opt.m_bHistoryStartTop;
+		if( g_Opt.m_bHistoryStartTop )
+			csSort = "bIsGroup ASC, lDate DESC";
+		else
+			csSort = "bIsGroup ASC, lDate ASC";
+		
+		if(g_Opt.m_bShowAllClipsInMainList)
+		{
+			strFilter = "((bIsGroup = 1 AND lParentID = -1) OR bIsGroup = 0)";
+		}
+		else
+		{
+			strFilter = "((bIsGroup = 1 AND lParentID = -1) OR (bIsGroup = 0 AND lParentID = -1))";
+		}
+	}
+	else // it's some other group
+	{
+		m_lstHeader.m_bStartTop = true;
+		
+		if(g_Opt.m_bHistoryStartTop)
+			csSort = "bIsGroup DESC, lDate DESC";
+		else
+			csSort = "bIsGroup ASC, lDate ASC";
+		
+		if(theApp.m_GroupID >= 0)
+		{
+			strFilter.Format(_T("lParentID = %d"), theApp.m_GroupID);
+			strParentFilter = strFilter;
+		}
+		
+		m_stGroup.SetWindowText(theApp.m_GroupText);
+	}
+	
+	CRect crRect;
+	GetClientRect(crRect);
+	
+	CString csSQL;
+	if(csSQLSearch == "")
+	{
+		m_strSQLSearch = "";
+	}
+	else
+	{
+		CFormatSQL SQLFormat;
+		SQLFormat.SetVariable("mText");
+		SQLFormat.Parse(csSQLSearch);
+
+		strFilter = SQLFormat.GetSQLString();
+
+		if(strParentFilter.IsEmpty() == FALSE)
+		{
+			strFilter += " AND ";
+			strFilter += strParentFilter;
+		}
+
+		m_strSQLSearch = strFilter;
+	}
+
+	m_CritSection.Lock();
+		//Format the count and select sql queries for the thread
+		m_CountSQL.Format(_T("SELECT COUNT(lID) FROM Main where %s ORDER by lDate"), strFilter);
+
+		m_SQL.Format(_T("SELECT lID, mText, lParentID, lDontAutoDelete, ")
+						_T("lShortCut, bIsGroup, QuickPasteText FROM Main where %s order by %s"), strFilter, csSort);
+
+		m_lItemsPerPage = m_lstHeader.GetCountPerPage();
+		
+	m_CritSection.Unlock();
+
+	SetEvent(m_Events[THREAD_DO_QUERY]);
+		
+	return TRUE;
+}
+
+
+void CQPasteWnd::OnRclickQuickPaste(NMHDR* pNMHDR, LRESULT* pResult) 
+{
+	POINT pp;
+	CMenu cmPopUp;
+	CMenu *cmSubMenu = NULL;
+	
+	GetCursorPos(&pp);
+	if(cmPopUp.LoadMenu(IDR_QUICK_PASTE) != 0)
+	{
+		cmSubMenu = cmPopUp.GetSubMenu(0);
+		if(!cmSubMenu)
+			return;
+		
+		if(pNMHDR == NULL)
+		{
+			int nItem = m_lstHeader.GetCaret();
+			CRect rc;
+			m_lstHeader.GetItemRect(nItem, rc, LVIR_BOUNDS);
+			ClientToScreen(rc);
+			pp.x = rc.left;
+			pp.y = rc.bottom;
+		}
+		
+		theApp.m_Addins.AddPrePasteAddinsToMenu(cmSubMenu);
+
+		theApp.m_Language.UpdateRightClickMenu(cmSubMenu);
+
+		SetMenuChecks(cmSubMenu);
+
+		cmSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
+			pp.x, pp.y, this, NULL);
+	}
+	
+	*pResult = 0;
+}
+
+void CQPasteWnd::SetMenuChecks(CMenu *pMenu)
+{
+	//Set the transparency Check
+	if(!CGetSetOptions::GetEnableTransparency())
+	{
+		pMenu->CheckMenuItem(ID_MENU_TRANSPARENCY_NONE, MF_CHECKED);
+	}
+	else
+	{
+		int nTrans = CGetSetOptions::GetTransparencyPercent();
+		int nCheckID = -1;
+		switch(nTrans)
+		{
+		case 5:
+			nCheckID = ID_MENU_TRANSPARENCY_5;
+			break;
+		case 10:
+			nCheckID = ID_MENU_TRANSPARENCY_10;
+			break;   
+		case 15:
+			nCheckID = ID_MENU_TRANSPARENCY_15;
+			break;
+		case 20:
+			nCheckID = ID_MENU_TRANSPARENCY_20;
+			break;
+		case 25:
+			nCheckID = ID_MENU_TRANSPARENCY_25;
+			break;
+		case 30:
+			nCheckID = ID_MENU_TRANSPARENCY_30;
+			break;
+		case 40:
+			nCheckID = ID_MENU_TRANSPARENCY_40;
+			break;
+		}
+		if(nCheckID >= 0)
+			pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
+	}
+	
+	//Set the lines per row check
+	int nLinesPerRow = CGetSetOptions::GetLinesPerRow();
+	int nCheckID = -1;
+	switch(nLinesPerRow)
+	{
+	case 1:
+		nCheckID = ID_MENU_LINESPERROW_1;
+		break;
+	case 2:
+		nCheckID = ID_MENU_LINESPERROW_2;
+		break;
+	case 3:
+		nCheckID = ID_MENU_LINESPERROW_3;
+		break;
+	case 4:
+		nCheckID = ID_MENU_LINESPERROW_4;
+		break;
+	case 5:
+		nCheckID = ID_MENU_LINESPERROW_5;
+		break;
+	}
+	if(nCheckID >= 0)
+		pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
+	
+	//Set the position check
+	int nPosition = CGetSetOptions::GetQuickPastePosition();
+	nCheckID = -1;
+	switch(nPosition)
+	{
+	case POS_AT_CARET:
+		nCheckID = ID_MENU_POSITIONING_ATCARET;
+		break;
+	case POS_AT_CURSOR:
+		nCheckID = ID_MENU_POSITIONING_ATCURSOR;
+		break;
+	case POS_AT_PREVIOUS:
+		nCheckID = ID_MENU_POSITIONING_ATPREVIOUSPOSITION;
+		break;
+	}
+	if(nCheckID >= 0)
+		pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
+
+	theApp.UpdateMenuConnectCV(pMenu, ID_MENU_TOGGLECONNECTCV);
+
+	if(CGetSetOptions::GetShowTextForFirstTenHotKeys())
+		pMenu->CheckMenuItem(ID_MENU_FIRSTTENHOTKEYS_SHOWHOTKEYTEXT, MF_CHECKED);
+	
+	if(CGetSetOptions::GetUseCtrlNumForFirstTenHotKeys())
+		pMenu->CheckMenuItem(ID_MENU_FIRSTTENHOTKEYS_USECTRLNUM, MF_CHECKED);
+	
+	if(g_Opt.m_bShowPersistent)
+		pMenu->CheckMenuItem(ID_MENU_ALLWAYSONTOP, MF_CHECKED);
+	
+	if(CGetSetOptions::GetAutoHide())
+		pMenu->CheckMenuItem(ID_MENU_AUTOHIDE, MF_CHECKED);
+	
+	if(g_Opt.m_bHistoryStartTop)
+		pMenu->CheckMenuItem(ID_SORT_ASCENDING, MF_CHECKED);
+	else
+		pMenu->CheckMenuItem(ID_SORT_DESCENDING, MF_CHECKED);
+	
+	switch(CGetSetOptions::GetCaptionPos())
+	{
+	case 1:
+		pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_RIGHT, MF_CHECKED);
+		break;
+	case 2:
+		pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_BOTTOM, MF_CHECKED);
+		break;
+	case 3:
+		pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_LEFT, MF_CHECKED);
+		break;
+	case 4:
+		pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_TOP, MF_CHECKED);
+		break;
+	}
+	
+	if(CGetSetOptions::GetAllwaysShowDescription())
+	{
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_ALLWAYSSHOWDESCRIPTION, MF_CHECKED);
+	}
+	
+	switch(CGetSetOptions::GetDoubleClickingOnCaptionDoes())
+	{
+	case TOGGLES_ALLWAYS_ON_TOP:
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSONTOP, MF_CHECKED);
+		break;
+	case TOGGLES_ALLWAYS_SHOW_DESCRIPTION:
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSSHOWDESCRIPTION, MF_CHECKED);
+		break;
+	case ROLLES_UP_WINDOW:
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW, MF_CHECKED);
+		break;
+	}
+	
+	if(CGetSetOptions::m_bPrompForNewGroupName)
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES, MF_CHECKED);
+
+	if(g_Opt.m_bDrawThumbnail)
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_SHOWTHUMBNAILS, MF_CHECKED);
+
+	if(g_Opt.m_bDrawRTF)
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DRAWRTFTEXT, MF_CHECKED);
+
+	if(g_Opt.m_bSendPasteMessageAfterSelection)
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_PASTECLIPAFTERSELECTION, MF_CHECKED);
+
+	if(g_Opt.m_bFindAsYouType)
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_FINDASYOUTYPE, MF_CHECKED);
+
+	if(g_Opt.m_bEnsureEntireWindowCanBeSeen)
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_ENSUREENTIREWINDOWISVISIBLE, MF_CHECKED);
+
+	if(g_Opt.m_bShowAllClipsInMainList)
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_SHOWCLIPSTHATAREINGROUPSINMAINLIST, MF_CHECKED);
+
+	if(g_Opt.GetPromptWhenDeletingClips())
+		pMenu->CheckMenuItem(ID_QUICKOPTIONS_PROMPTTODELETECLIP, MF_CHECKED);
+
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIENDONE, 0);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TWO, 1);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_THREE, 2);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FORE, 3);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FIVE, 4);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_SIX, 5);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_SEVEN,6);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_EIGHT,7);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_NINE,8);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TEN,9);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_ELEVEN,10);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TWELVE,11);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_THIRTEEN,12);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FORETEEN,13);
+	SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FIFTEEN,14);
+
+	if(g_Opt.GetAllowFriends() == false)
+	{
+		CString csText("Send To");
+		int nPos = -1;
+		CMultiLanguage::GetMenuPos(pMenu, csText, nPos);
+		if(nPos >= 0)
+		{
+			pMenu->DeleteMenu(nPos, MF_BYPOSITION);
+		}
+	}
+
+	pMenu->DeleteMenu(ID_MENU_SENTTO_PROMPTFORIP, MF_BYCOMMAND);
+}
+
+void CQPasteWnd::SetSendToMenu(CMenu *pMenu, int nMenuID, int nArrayPos)
+{
+	if(g_Opt.m_SendClients[nArrayPos].csIP.GetLength() > 0)
+	{
+		CString cs;
+		cs.Format(_T("(%s) - %s"), g_Opt.m_SendClients[nArrayPos].csIP, g_Opt.m_SendClients[nArrayPos].csDescription);
+		pMenu->ModifyMenu(nMenuID, MF_BYCOMMAND, nMenuID, cs);
+	}
+	else
+	{
+		pMenu->DeleteMenu(nMenuID, MF_BYCOMMAND);
+	}
+}
+
+LRESULT CQPasteWnd::OnSearch(WPARAM wParam, LPARAM lParam)
+{
+	m_lstHeader.HidePopup();
+
+	CString csText;
+	m_Search.GetWindowText(csText);
+	
+	if(csText == "")
+		return FALSE;
+
+	m_lstHeader.EnableWindow(FALSE);
+	
+	FillList(csText);
+
+	m_lstHeader.EnableWindow(FALSE);
+	
+	m_lstHeader.SetFocus();
+	
+	MoveControls();
+	
+	m_Search.SetSel(-1, 0);
+	
+	return TRUE;
+}
+
+
+///////////////////////////////////////////////////////////////////////
+//Menu Stuff
+///////////////////////////////////////////////////////////////////////
+void CQPasteWnd::OnMenuLinesperrow1()	{ SetLinesPerRow(1);	}
+void CQPasteWnd::OnMenuLinesperrow2()	{ SetLinesPerRow(2);	}
+void CQPasteWnd::OnMenuLinesperrow3()	{ SetLinesPerRow(3);	}
+void CQPasteWnd::OnMenuLinesperrow4()	{ SetLinesPerRow(4);	}
+void CQPasteWnd::OnMenuLinesperrow5()	{ SetLinesPerRow(5);	}
+void CQPasteWnd::SetLinesPerRow(long lLines)
+{
+	CGetSetOptions::SetLinesPerRow(lLines);
+	m_lstHeader.SetNumberOfLinesPerRow(lLines);
+	
+	FillList();
+}
+void CQPasteWnd::OnMenuTransparencyNone()	{ SetTransparency(0);	}
+void CQPasteWnd::OnMenuTransparency5()		{ SetTransparency(5);	}
+void CQPasteWnd::OnMenuTransparency10()		{ SetTransparency(10);	}
+void CQPasteWnd::OnMenuTransparency15()		{ SetTransparency(15);	}
+void CQPasteWnd::OnMenuTransparency20()		{ SetTransparency(20);	}
+void CQPasteWnd::OnMenuTransparency25()		{ SetTransparency(25);	}
+void CQPasteWnd::OnMenuTransparency30()		{ SetTransparency(25);	}
+void CQPasteWnd::OnMenuTransparency40()		{ SetTransparency(40);	}
+
+void CQPasteWnd::SetTransparency(long lPercent)
+{
+#ifdef AFTER_98
+	if(lPercent)
+	{
+		CGetSetOptions::SetTransparencyPercent(lPercent);
+		CGetSetOptions::SetEnableTransparency(TRUE);
+		
+		m_Alpha.SetTransparent(TRUE);
+		
+		float fPercent =  lPercent / (float)100.0;
+		
+		m_Alpha.SetOpacity(OPACITY_MAX - (int)(fPercent * OPACITY_MAX));
+	}
+	else
+	{
+		CGetSetOptions::SetEnableTransparency(FALSE);
+		m_Alpha.SetTransparent(FALSE);
+	}
+#endif
+}
+
+void CQPasteWnd::OnMenuDelete() 
+{
+	DeleteSelectedRows();
+}
+
+void CQPasteWnd::OnMenuPositioningAtcaret() 
+{
+	CGetSetOptions::SetQuickPastePosition(POS_AT_CARET);
+}
+
+void CQPasteWnd::OnMenuPositioningAtcursor() 
+{
+	CGetSetOptions::SetQuickPastePosition(POS_AT_CURSOR);
+}
+
+void CQPasteWnd::OnMenuPositioningAtpreviousposition() 
+{
+	CGetSetOptions::SetQuickPastePosition(POS_AT_PREVIOUS);
+}
+
+void CQPasteWnd::OnMenuOptions() 
+{
+	theApp.ShowOptionsDlg();
+}
+
+void CQPasteWnd::OnMenuExitprogram() 
+{
+	::SendMessage(theApp.m_MainhWnd, WM_CLOSE, 0, 0);
+}
+
+void CQPasteWnd::OnMenuToggleConnectCV() 
+{
+	theApp.ToggleConnectCV();
+}
+
+#include "client.h"
+
+void CQPasteWnd::OnMenuProperties() 
+{	
+	m_bHideWnd = false;
+	
+	ARRAY IDs, Indexes;
+	m_lstHeader.GetSelectionItemData(IDs);
+	m_lstHeader.GetSelectionIndexes(Indexes);
+	
+	int nSize = IDs.GetSize();
+	if(nSize < 1)
+		return;
+	
+	long lID = IDs[0];
+	int nRow = Indexes[0];
+	
+	if(lID < 0)
+		return;
+	
+	m_lstHeader.RemoveAllSelection();
+	m_lstHeader.SetSelection(nRow);
+	
+	CCopyProperties props(lID, this);
+	int nDo = props.DoModal();
+
+	if(nDo == IDOK)
+	{
+		m_CritSection.Lock();
+		{
+			MainTypeMap::iterator iter = m_mapCache.find(nRow);
+			if(iter != m_mapCache.end())
+			{
+				CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT * FROM Main WHERE lID = %d"), lID);
+				if(!q.eof())
+				{
+					FillMainTable(iter->second, q);
+				}
+			}
+		}
+		m_CritSection.Unlock();
+
+		SetEvent(m_Events[THREAD_FILL_ACCELERATORS]);
+
+		m_lstHeader.RefreshVisibleRows();
+		
+		if(props.m_lGroupChangedTo >= 0)
+		{
+			OpenID(props.m_lGroupChangedTo);
+		}
+
+		m_lstHeader.SetFocus();
+		m_lstHeader.SetListPos(nRow);
+	}
+	
+	m_bHideWnd = true;
+}
+
+void CQPasteWnd::UpdateFont()
+{
+	LOGFONT lf;
+	CGetSetOptions::GetFont(lf);
+	m_lstHeader.SetLogFont(lf);
+}	
+
+void CQPasteWnd::OnMenuFirsttenhotkeysUsectrlnum() 
+{	
+	CGetSetOptions::SetUseCtrlNumForFirstTenHotKeys(!CGetSetOptions::GetUseCtrlNumForFirstTenHotKeys());
+	m_lstHeader.RefreshVisibleRows();
+}
+
+void CQPasteWnd::OnMenuFirsttenhotkeysShowhotkeytext() 
+{
+	CGetSetOptions::SetShowTextForFirstTenHotKeys(!CGetSetOptions::GetShowTextForFirstTenHotKeys());
+	
+	m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
+	
+	m_lstHeader.RefreshVisibleRows();
+}
+
+void CQPasteWnd::OnViewcaptionbaronRight()
+{
+	SetCaptionOn(CAPTION_RIGHT);
+	CGetSetOptions::SetCaptionPos(CAPTION_RIGHT);
+}
+
+void CQPasteWnd::OnViewcaptionbaronBottom()
+{
+	SetCaptionOn(CAPTION_BOTTOM);
+	CGetSetOptions::SetCaptionPos(CAPTION_BOTTOM);
+}
+
+void CQPasteWnd::OnViewcaptionbaronLeft()
+{
+	SetCaptionOn(CAPTION_LEFT);
+	CGetSetOptions::SetCaptionPos(CAPTION_LEFT);
+}
+
+void CQPasteWnd::OnViewcaptionbaronTop()
+{
+	SetCaptionOn(CAPTION_TOP);
+	CGetSetOptions::SetCaptionPos(CAPTION_TOP);
+}
+
+void CQPasteWnd::OnMenuAutohide()
+{
+	bool bAutoHide = !CGetSetOptions::GetAutoHide();
+	CGetSetOptions::SetAutoHide(bAutoHide);
+	SetAutoHide(bAutoHide);
+}
+
+void CQPasteWnd::OnMenuViewfulldescription()
+{
+	m_lstHeader.ShowFullDescription();	
+}
+
+void CQPasteWnd::OnMenuAllwaysontop()
+{
+	theApp.ShowPersistent( !g_Opt.m_bShowPersistent );
+}
+
+void CQPasteWnd::OnSortAscending()
+{
+	g_Opt.SetHistoryStartTop(TRUE);
+	FillList();
+}
+
+void CQPasteWnd::OnSortDescending()
+{
+	g_Opt.SetHistoryStartTop(FALSE);
+	FillList();
+}
+
+void CQPasteWnd::OnMenuNewGroup()
+{
+	NewGroup( false );
+}
+
+void CQPasteWnd::OnMenuNewGroupSelection()
+{
+	NewGroup( true );
+}
+
+void CQPasteWnd::OnMenuQuickoptionsAllwaysshowdescription() 
+{
+	CGetSetOptions::SetAllwaysShowDescription(!g_Opt.m_bAllwaysShowDescription);
+	
+}
+
+void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop() 
+{
+	CGetSetOptions::SetDoubleClickingOnCaptionDoes(TOGGLES_ALLWAYS_ON_TOP);
+	
+}
+
+void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow() 
+{
+	CGetSetOptions::SetDoubleClickingOnCaptionDoes(ROLLES_UP_WINDOW);
+	
+}
+
+void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription() 
+{
+	CGetSetOptions::SetDoubleClickingOnCaptionDoes(TOGGLES_ALLWAYS_SHOW_DESCRIPTION);	
+}
+
+void CQPasteWnd::OnMenuQuickoptionsPromptfornewgroupnames() 
+{
+	g_Opt.SetPrompForNewGroupName( !g_Opt.m_bPrompForNewGroupName );	
+}
+
+void CQPasteWnd::OnMenuViewgroups() 
+{
+	OnShowGroupsTop();
+}
+
+void CQPasteWnd::OnMenuQuickpropertiesSettoneverautodelete() 
+{
+	CWaitCursor wait;
+	ARRAY IDs;
+	ARRAY Indexs;
+	m_lstHeader.GetSelectionItemData(IDs);
+	m_lstHeader.GetSelectionIndexes(Indexs);
+    
+	int count = IDs.GetSize();
+
+	for(int i = 0; i < count; i++)
+	{
+		try
+		{
+			theApp.m_db.execDMLEx(_T("UPDATE Main SET lDontAutoDelete = %d where lID = %d;"), 
+									(long)CTime::GetCurrentTime().GetTime(), IDs[i]);
+		}
+		CATCH_SQLITE_EXCEPTION
+	}
+
+	m_CritSection.Lock();
+	{
+		count = Indexs.GetSize();
+		for(int row = 0; row < count; row++)
+		{
+			MainTypeMap::iterator iter = m_mapCache.find(row);
+			if(iter != m_mapCache.end())
+			{
+				iter->second.m_bDontAutoDelete = true;
+			}
+		}
+	}
+	m_CritSection.Unlock();
+
+	m_lstHeader.RefreshVisibleRows();
+}
+
+void CQPasteWnd::OnMenuQuickpropertiesAutodelete() 
+{
+	CWaitCursor wait;
+	ARRAY IDs;
+	ARRAY Indexs;
+	m_lstHeader.GetSelectionItemData(IDs);
+	m_lstHeader.GetSelectionIndexes(Indexs);
+    
+	int count = IDs.GetSize();
+
+	for(int i = 0; i < count; i++)
+	{
+		try
+		{
+			theApp.m_db.execDMLEx(_T("UPDATE Main SET lDontAutoDelete = 0 where lID = %d;"), IDs[i]);
+		}
+		CATCH_SQLITE_EXCEPTION
+	}
+
+	m_CritSection.Lock();
+	{
+		count = Indexs.GetSize();
+		for(int row = 0; row < count; row++)
+		{
+			MainTypeMap::iterator iter = m_mapCache.find(row);
+			if(iter != m_mapCache.end())
+			{
+				iter->second.m_bDontAutoDelete = false;
+			}
+		}
+	}
+	m_CritSection.Unlock();
+
+	m_lstHeader.RefreshVisibleRows();
+}
+
+void CQPasteWnd::OnMenuQuickpropertiesRemovehotkey() 
+{
+	CWaitCursor wait;
+	ARRAY IDs;
+	ARRAY Indexs;
+	m_lstHeader.GetSelectionItemData(IDs);
+	m_lstHeader.GetSelectionIndexes(Indexs);
+    
+	int count = IDs.GetSize();
+
+	for(int i = 0; i < count; i++)
+	{
+		try
+		{
+			theApp.m_db.execDMLEx(_T("UPDATE Main SET lShortCut = 0 where lID = %d;"), IDs[i]);
+		}
+		CATCH_SQLITE_EXCEPTION
+	}	
+
+	m_CritSection.Lock();
+	{
+		count = Indexs.GetSize();
+		for(int row = 0; row < count; row++)
+		{
+			MainTypeMap::iterator iter = m_mapCache.find(row);
+			if(iter != m_mapCache.end())
+			{
+				iter->second.m_bHasShortCut = false;
+			}
+		}
+	}
+	m_CritSection.Unlock();
+
+	m_lstHeader.RefreshVisibleRows();
+}
+
+void CQPasteWnd::OnQuickpropertiesRemovequickpaste()
+{
+	CWaitCursor wait;
+	ARRAY IDs;
+	ARRAY Indexs;
+	m_lstHeader.GetSelectionItemData(IDs);
+	m_lstHeader.GetSelectionIndexes(Indexs);
+
+	int count = IDs.GetSize();
+
+	for(int i = 0; i < count; i++)
+	{
+		try
+		{
+			theApp.m_db.execDMLEx(_T("UPDATE Main SET QuickPasteText = '' where lID = %d;"), IDs[i]);
+		}
+		CATCH_SQLITE_EXCEPTION
+	}	
+	
+	m_CritSection.Lock();
+	{
+		count = Indexs.GetSize();
+		for(int row = 0; row < count; row++)
+		{
+			MainTypeMap::iterator iter = m_mapCache.find(row);
+			if(iter != m_mapCache.end())
+			{
+				iter->second.m_QuickPaste.Empty();
+			}
+		}
+	}
+	m_CritSection.Unlock();
+
+	m_lstHeader.RefreshVisibleRows();
+}
+
+void CQPasteWnd::OnMenuSenttoFriendFifteen() 
+{
+	SendToFriendbyPos(14);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendForeteen() 
+{
+	SendToFriendbyPos(13);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendThirteen() 
+{
+	SendToFriendbyPos(12);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendTwelve() 
+{
+	SendToFriendbyPos(11);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendEleven() 
+{
+	SendToFriendbyPos(10);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendTen() 
+{
+	SendToFriendbyPos(9);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendNine() 
+{
+	SendToFriendbyPos(8);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendEight() 
+{
+	SendToFriendbyPos(7);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendSeven() 
+{
+	SendToFriendbyPos(6);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendSix() 
+{
+	SendToFriendbyPos(5);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendFive() 
+{
+	SendToFriendbyPos(4);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendFore() 
+{
+	SendToFriendbyPos(3);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendThree() 
+{
+	SendToFriendbyPos(2);	
+}
+
+void CQPasteWnd::OnMenuSenttoFriendTwo() 
+{
+	SendToFriendbyPos(1);
+}
+
+void CQPasteWnd::OnMenuSenttoFriendone() 
+{
+	SendToFriendbyPos(0);
+}
+
+void CQPasteWnd::OnMenuSenttoPromptforip() 
+{
+	// TODO: Add your command handler code here
+	
+}
+
+void CQPasteWnd::OnMenuGroupsMovetogroup() 
+{
+	m_bHideWnd = false;
+
+	CMoveToGroupDlg dlg;
+
+	int nRet = dlg.DoModal();
+	if(nRet == IDOK)
+	{
+		int nGroup = dlg.GetSelectedGroup();
+		if(nGroup >= 0)
+		{
+			CClipIDs IDs;
+			m_lstHeader.GetSelectionItemData( IDs );
+
+			IDs.MoveTo(nGroup);
+		}
+		FillList();
+	}
+
+	m_bHideWnd = true;
+}
+
+void CQPasteWnd::OnMenuPasteplaintextonly() 
+{
+	OpenSelection(true);	
+}
+
+void CQPasteWnd::OnPromptToDeleteClip() 
+{
+	CGetSetOptions::SetPromptWhenDeletingClips(!CGetSetOptions::GetPromptWhenDeletingClips());
+}
+
+void CQPasteWnd::OnMenuExport()
+{
+	CClipIDs IDs;
+	long lCount = m_lstHeader.GetSelectedCount();
+	if(lCount <= 0)
+		return;
+
+	m_lstHeader.GetSelectionItemData(IDs);
+	lCount = IDs.GetSize();
+	if(lCount <= 0)
+		return;
+
+	OPENFILENAME ofn;      
+	TCHAR szFile[400];      
+	TCHAR szDir[400];
+
+	memset(&szFile, 0, sizeof(szFile));
+	memset(szDir, 0, sizeof(szDir));
+	memset(&ofn, 0, sizeof(ofn));
+
+	CString csInitialDir = CGetSetOptions::GetLastImportDir();
+	STRCPY(szDir, csInitialDir);
+
+	ofn.lStructSize = sizeof(OPENFILENAME);
+	ofn.hwndOwner = m_hWnd;
+	ofn.lpstrFile = szFile;
+	ofn.nMaxFile = sizeof(szFile);
+	ofn.lpstrFilter=_T("Exported Ditto Clips (.dto)\0*.dto\0\0");
+	ofn.nFilterIndex = 1;
+	ofn.lpstrFileTitle = NULL;
+	ofn.nMaxFileTitle = 0;
+	ofn.lpstrInitialDir = szDir;
+	ofn.lpstrDefExt = _T("dto");
+	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
+
+	m_bHideWnd = false;
+
+	if(GetSaveFileName(&ofn)) 
+	{
+		using namespace nsPath;
+		CPath path(ofn.lpstrFile);
+		CString csPath = path.GetPath();
+		CGetSetOptions::SetLastExportDir(csPath);
+
+		CString csFile(ofn.lpstrFile);
+		IDs.Export(csFile);
+	}
+
+	m_bHideWnd = true;
+}
+
+void CQPasteWnd::OnMenuImport()
+{
+	m_bHideWnd = false;
+	theApp.ImportClips(m_hWnd);
+	m_bHideWnd = true;
+}
+
+void CQPasteWnd::OnMenuHelp() 
+{
+	CString csFile = CGetSetOptions::GetPath(PATH_HELP);
+	csFile += "DittoGettingStarted.htm";
+
+	CHyperLink::GotoURL(csFile, SW_SHOW);
+}
+
+void CQPasteWnd::OnMenuQuickoptionsFont() 
+{
+	m_bHideWnd = false;
+
+	CFont *pFont = m_lstHeader.GetFont();
+	LOGFONT lf;
+	pFont->GetLogFont(&lf);
+	CFontDialog dlg(&lf);
+	if(dlg.DoModal() == IDOK)
+	{	
+		CGetSetOptions::SetFont(*dlg.m_cf.lpLogFont);
+		m_lstHeader.SetLogFont(*dlg.m_cf.lpLogFont);
+	}
+	
+	m_bHideWnd = true;
+}
+
+void CQPasteWnd::OnMenuQuickoptionsShowthumbnails() 
+{
+	CGetSetOptions::SetDrawThumbnail(!g_Opt.m_bDrawThumbnail);
+	m_lstHeader.RefreshVisibleRows();
+}
+
+void CQPasteWnd::OnMenuQuickoptionsDrawrtftext() 
+{
+	CGetSetOptions::SetDrawRTF(!g_Opt.m_bDrawRTF);
+	m_lstHeader.RefreshVisibleRows();
+}
+
+void CQPasteWnd::OnMenuQuickoptionsPasteclipafterselection() 
+{
+	CGetSetOptions::SetSendPasteAfterSelection(!g_Opt.m_bSendPasteMessageAfterSelection);	
+}
+
+void CQPasteWnd::OnMenuQuickoptionsFindasyoutype() 
+{
+	CGetSetOptions::SetFindAsYouType(!g_Opt.m_bFindAsYouType);
+}
+
+void CQPasteWnd::OnMenuQuickoptionsEnsureentirewindowisvisible() 
+{
+	CGetSetOptions::SetEnsureEntireWindowCanBeSeen(!g_Opt.m_bEnsureEntireWindowCanBeSeen);
+}
+
+void CQPasteWnd::OnMenuQuickoptionsShowclipsthatareingroupsinmainlist() 
+{
+	CGetSetOptions::SetShowAllClipsInMainList(!g_Opt.m_bShowAllClipsInMainList);
+
+	CString csText;
+	m_Search.GetWindowText(csText);
+	FillList(csText);
+}
+
+void CQPasteWnd::OnMenuEdititem()
+{
+	if(m_lstHeader.GetSelectedCount() == 0)
+		return;
+
+	CClipIDs IDs;
+	m_lstHeader.GetSelectionItemData(IDs);
+	theApp.EditItems(IDs, true);
+
+	HideQPasteWindow();
+}
+
+void CQPasteWnd::OnMenuNewclip()
+{
+	CClipIDs IDs;
+	IDs.Add(-1);
+	theApp.EditItems(IDs, true);	
+
+	HideQPasteWindow();
+}
+
+
+///////////////////////////////////////////////////////////////////////
+//END END Menu Stuff
+///////////////////////////////////////////////////////////////////////
+
+
+BOOL CQPasteWnd::SendToFriendbyPos(int nPos)
+{
+	if(g_Opt.GetAllowFriends() == false)
+		return FALSE;
+
+	CWaitCursor wait;
+
+	m_bHideWnd = false;
+
+	CClipIDs IDs;
+	long lCount = m_lstHeader.GetSelectedCount();
+	if(lCount <= 0)
+		return FALSE;
+
+	m_lstHeader.GetSelectionItemData(IDs);
+	lCount = IDs.GetSize();
+	if(lCount <= 0)
+		return FALSE;
+
+	CSendToFriendInfo Info;
+	Info.m_lPos = nPos;
+
+	BOOL bRet = FALSE;
+
+	try
+	{
+		CPopup Popup(0, 0, m_hWnd);
+		Popup.Show(StrF(_T("Sending clip to %s"), g_Opt.m_SendClients[nPos].csIP));
+
+		Info.m_pPopup = &Popup;
+		
+		Info.m_pClipList =  new CClipList;
+		for(int i = 0; i < lCount; i++)
+		{
+			CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT mText FROM Main WHERE lID = %d"), IDs[i]);
+			if(q.eof() == false)
+			{
+				CClip *pClip = new CClip;
+				if(pClip)
+				{
+					pClip->LoadFormats(IDs[i]);
+					pClip->m_Desc = q.getStringField(0);
+					pClip->m_ID = IDs[i];
+					Info.m_pClipList->AddTail(pClip);
+				}
+			}
+		}
+		
+		if(SendToFriend(Info) == FALSE)
+		{
+			MessageBox(StrF(_T("Error Sending data to %s\n\n%s"), g_Opt.m_SendClients[nPos].csIP, Info.m_csErrorText), _T("Ditto"));
+		}
+		else
+		{
+			bRet = TRUE;
+		}
+	}
+	CATCH_SQLITE_EXCEPTION	
+
+	m_bHideWnd = true;
+
+	return bRet;
+}
+
+LRESULT CQPasteWnd::OnDelete(WPARAM wParam, LPARAM lParam)
+{
+	DeleteSelectedRows();
+	
+	return TRUE;
+}
+
+void CQPasteWnd::DeleteSelectedRows()
+{
+	if(g_Opt.GetPromptWhenDeletingClips())
+	{
+		bool bStartValue = m_bHideWnd;
+		m_bHideWnd = false;
+
+		int nRet = MessageBox(theApp.m_Language.GetString("Delete_Clip", "Delete Selected Clips?"), _T("Ditto"), MB_YESNO);
+	
+		m_bHideWnd = bStartValue;
+
+		if(nRet == IDNO)
+			return;
+	}
+
+	CClipIDs IDs;
+	ARRAY Indexs;
+	
+	if( m_lstHeader.GetSelectedCount() == 0 )
+		return;
+	
+	POSITION pos = m_lstHeader.GetFirstSelectedItemPosition();
+	int nFirstSel = m_lstHeader.GetNextSelectedItem(pos);
+	
+	m_lstHeader.GetSelectionItemData(IDs);
+	m_lstHeader.GetSelectionIndexes(Indexs);
+
+	IDs.DeleteIDs(true, theApp.m_db);
+
+	Indexs.SortDescending();
+	int nCount = Indexs.GetSize();
+
+	int erasedCount = 0;
+
+	m_CritSection.Lock();
+	{
+		for(int i = 0; i < nCount; i++)
+		{
+			MainTypeMap::iterator iter = m_mapCache.find(Indexs[i]);
+			if(iter != m_mapCache.end() &&
+				iter->second.m_lID > 0)
+			{
+				m_mapCache.erase(iter);
+				erasedCount++;
+			}
+		}
+	}
+	m_CritSection.Unlock();
+
+	m_lstHeader.SetItemCountEx(m_lstHeader.GetItemCount() - erasedCount);
+	
+	// if there are no items after the one we deleted, then select the last one.
+	if(nFirstSel >= m_lstHeader.GetItemCount())
+		nFirstSel = m_lstHeader.GetItemCount() - 1;
+		
+	m_lstHeader.SetListPos(nFirstSel);
+	
+	m_lstHeader.RefreshVisibleRows();
+	RedrawWindow(0, 0, RDW_INVALIDATE);
+}
+
+CString CQPasteWnd::LoadDescription(int nItem)
+{
+	if( nItem < 0 || nItem >= m_lstHeader.GetItemCount() )
+		return "";
+	
+	CString cs;
+	try
+	{
+		long lID = m_lstHeader.GetItemData(nItem);
+
+		CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT mText FROM Main WHERE lID = %d"), lID);
+		if(q.eof() == false)
+		{
+			cs = q.getStringField(0);
+		}
+	}
+	CATCH_SQLITE_EXCEPTION
+		
+	return cs;
+}
+
+void CQPasteWnd::MoveSelection(bool down)
+{
+	if(m_bModifersMoveActive)
+	{
+		ARRAY arr;
+		m_lstHeader.GetSelectionIndexes(arr);
+		if(arr.GetCount() > 0)
+		{
+			int index = arr[0];
+
+			if(down)
+			{	
+				if(index < m_lstHeader.GetItemCount()-1)
+				{
+					m_lstHeader.SetListPos(index+1);
+				}
+			}
+			else
+			{
+				if(index > 0)
+				{
+					m_lstHeader.SetListPos(index-1);
+				}
+			}
+		}
+		else
+		{
+			if(m_lstHeader.GetItemCount() > 0)
+			{
+				m_lstHeader.SetListPos(0);
+			}
+		}
+	}
+}
+
+void CQPasteWnd::OnKeyStateUp()
+{
+	if(m_bModifersMoveActive)
+	{	
+		Log(_T("OnKeyStateUp"));
+		SetTimer(TIMER_PASTE_FROM_MODIFER, g_Opt.GetKeyStatePasteDelay(), NULL);
+	}
+	else
+	{
+		Log(_T("OnKeyStateUp - Modifers not active"));
+	}
+}
+
+void CQPasteWnd::SetKeyModiferState(bool bActive)
+{
+	Log(StrF(_T("SetKeyModiferState %d"), bActive));
+	m_bModifersMoveActive = bActive;
+}
+
+BOOL CQPasteWnd::PreTranslateMessage(MSG* pMsg) 
+{
+	switch(pMsg->message) 
+	{
+	case WM_KEYDOWN:
+		
+		switch( pMsg->wParam )
+		{
+		case VK_APPS:
+			{
+				long lRet;
+				OnRclickQuickPaste(NULL, &lRet);
+				return 0;
+			}
+		case VK_F7:
+			if(pMsg->hwnd == m_lstHeader.m_hWnd)
+			{
+				if(GetKeyState(VK_CONTROL) & 0x8000)
+					NewGroup( false );
+				else
+					NewGroup( true );
+				return TRUE;
+			}
+			break;
+ 
+		case VK_F5:
+			//toggle outputing text to outputdebugstring
+			if(GetKeyState(VK_CONTROL) & 0x8000)
+			{
+				if(CGetSetOptions::m_bEnableDebugLogging)
+					Log(_T("turning file logging OFF"));
+
+				CGetSetOptions::m_bEnableDebugLogging = !CGetSetOptions::m_bEnableDebugLogging;
+
+				if(CGetSetOptions::m_bEnableDebugLogging)
+					Log(_T("turning file logging ON"));
+			}
+			else
+			{
+				if(CGetSetOptions::m_bEnableDebugLogging)
+					Log(_T("turning DebugString logging OFF"));
+
+				CGetSetOptions::m_bOutputDebugString = !CGetSetOptions::m_bOutputDebugString;
+
+				if(CGetSetOptions::m_bEnableDebugLogging)
+					Log(_T("turning DebugString logging ON"));
+			}
+			return TRUE;
+			
+		case VK_ESCAPE:
+			{	
+				if(m_bModifersMoveActive)
+				{
+					Log(_T("Escape key hit setting modifers to NOT active"));
+					m_bModifersMoveActive = false;
+					return TRUE;
+				}
+				else
+				{
+					if(m_lstHeader.HandleKeyDown(pMsg->wParam, pMsg->lParam) == FALSE)
+					{
+						if(m_strSQLSearch.IsEmpty() == FALSE)
+						{
+							OnCancelFilter();
+							return TRUE;
+						}
+						else
+						{	
+							if(m_GroupTree.IsWindowVisible() == FALSE)
+							{
+								HideQPasteWindow();
+								return TRUE;
+							}
+						}
+					}
+				}
+				break;
+			}
+		case VK_TAB:
+			{			
+				BOOL bPrev = FALSE;
+				
+				if(GetKeyState(VK_SHIFT) & 0x8000)
+					bPrev = TRUE;
+				
+				CWnd *pFocus = GetFocus();
+				if(pFocus)
+				{
+					CWnd *pNextWnd = GetNextDlgTabItem(pFocus, bPrev);
+					if(pNextWnd)
+						pNextWnd->SetFocus();
+				}
+				return TRUE;
+			}
+		case 'G':
+			if(GetKeyState(VK_CONTROL) & 0x8000)
+			{
+				OnShowGroupsTop();
+				return TRUE;
+			}
+			break;
+		case 'N':
+			if(GetKeyState(VK_CONTROL) & 0x8000)
+			{
+				OnMenuNewclip();
+				return TRUE;
+			}
+			break;
+		case 'E':
+			if(GetKeyState(VK_CONTROL) & 0x8000)
+			{
+				OnMenuEdititem();
+				return TRUE;
+			}
+			break;
+
+		case VK_UP:
+			if(m_bModifersMoveActive)
+			{
+				MoveSelection(false);
+				return TRUE;
+			}
+			break;
+
+		case VK_DOWN:
+			if(m_bModifersMoveActive)
+			{
+				MoveSelection(true);
+				return TRUE;
+			}
+			break;
+
+		case VK_HOME:
+			if(m_bModifersMoveActive)
+			{
+				m_lstHeader.SetListPos(0);
+				return TRUE;
+			}
+			break;
+		case VK_END:
+			if(m_bModifersMoveActive)
+			{
+				if(m_lstHeader.GetItemCount() > 0)
+				{
+					m_lstHeader.SetListPos(m_lstHeader.GetItemCount()-1);
+				}
+				return TRUE;
+			}
+			break;
+		} // end switch( pMsg->wParam )
+		
+		break; // end case WM_KEYDOWN 
+		
+		case WM_SYSKEYDOWN: // ALT key is held down
+			
+			switch( pMsg->wParam )
+			{
+			case 'C': // switch to the filter combobox
+				BYTE key[256];
+				GetKeyboardState((LPBYTE)(&key));
+				if(key[VK_MENU]&128)
+				{
+					OnCancelFilter();
+				}
+				return TRUE;
+				
+			case VK_HOME:
+				theApp.EnterGroupID(-1);  // History
+				return TRUE;				
+			} // end switch( pMsg->wParam )
+			
+			break; // end case WM_SYSKEYDOWN
+	}
+	
+	return CWndEx::PreTranslateMessage(pMsg);
+}
+
+void CQPasteWnd::OnCancelFilter()
+{
+	FillList();
+	
+	m_bHandleSearchTextChange = false;
+	m_Search.SetWindowText(_T(""));
+	m_bHandleSearchTextChange = true;
+
+	MoveControls();
+	
+	m_lstHeader.SetFocus();
+}
+
+LRESULT CQPasteWnd::OnProperties(WPARAM wParam, LPARAM lParam)
+{
+	OnMenuProperties();
+	return TRUE;
+}
+
+void CQPasteWnd::OnClose() 
+{
+	HideQPasteWindow();
+}
+
+void CQPasteWnd::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
+{
+	NM_LISTVIEW* pLV = (NM_LISTVIEW*)pNMHDR;
+	CProcessPaste paste;
+	CClipIDs& clips = paste.GetClipIDs();
+	
+	m_lstHeader.GetSelectionItemData(clips);
+	
+	if(clips.GetSize() <= 0)
+	{
+		ASSERT(0); // does this ever happen ??
+		clips.Add(m_lstHeader.GetItemData(pLV->iItem));
+	}
+
+	paste.DoDrag();
+
+	*pResult = 0;
+}
+
+void CQPasteWnd::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
+{
+	CWndEx::OnSysKeyDown(nChar, nRepCnt, nFlags);
+}
+
+void CQPasteWnd::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
+{	
+	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
+	LV_ITEM* pItem= &(pDispInfo)->item;
+	
+	if(pItem->mask & LVIF_TEXT) //valid text buffer?
+	{		
+		switch(pItem->iSubItem)
+		{
+		case 0:
+			try
+			{
+				m_CritSection.Lock();
+				{
+					MainTypeMap::iterator iter = m_mapCache.find(pItem->iItem);
+					if(iter != m_mapCache.end())
+					{				
+						CString cs;
+						if(iter->second.m_bDontAutoDelete)
+							cs += "*";
+						
+						if(iter->second.m_bHasShortCut)
+							cs += "s";
+                
+						if(iter->second.m_bIsGroup)
+							cs += "G";
+						
+						// attached to a group
+						if(iter->second.m_bHasParent)
+							cs += "!";
+
+						if(iter->second.m_QuickPaste.IsEmpty() == FALSE)
+							cs += "Q";
+						
+						// pipe is the "end of symbols" marker
+						cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, iter->second.m_Desc);
+						
+						lstrcpyn(pItem->pszText, cs, pItem->cchTextMax);
+						pItem->pszText[pItem->cchTextMax-1] = '\0';
+					}
+					else
+					{
+						lstrcpyn(pItem->pszText, _T("Loading..."), pItem->cchTextMax);
+						pItem->pszText[pItem->cchTextMax-1] = '\0';
+
+						bool addToLoadItems = true;
+
+						for(UINT y = 0; y < m_loadItems.size(); y++)
+						{
+							if(pItem->iItem >= m_loadItems[y].x && pItem->iItem <= m_loadItems[y].y)
+							{
+								addToLoadItems = false;
+								break;
+							}
+						}
+
+						if(addToLoadItems)
+						{
+							CPoint loadItem(pItem->iItem, (m_lstHeader.GetTopIndex() + m_lstHeader.GetCountPerPage() + 2));
+							m_loadItems.push_back(loadItem);
+						}
+						
+						SetEvent(m_Events[THREAD_LOAD_ITEMS]);
+					}
+				}
+				m_CritSection.Unlock();
+			}
+			CATCH_SQLITE_EXCEPTION
+				
+			break;
+		}
+	}
+	
+	if(pItem->mask & LVIF_PARAM)
+	{
+		switch(pItem->iSubItem)
+		{
+		case 0:
+			try
+			{
+				m_CritSection.Lock();
+				{
+					MainTypeMap::iterator iter = m_mapCache.find(pItem->iItem);
+					if(iter != m_mapCache.end())
+					{
+						pItem->lParam = iter->second.m_lID;
+					}
+				}
+				m_CritSection.Unlock();
+			}
+			CATCH_SQLITE_EXCEPTION
+				
+			break;
+		}
+	}
+}
+
+CString CQPasteWnd::GetDisplayText(long lDontAutoDelete, long lShortCut, bool bIsGroup, long lParentID, CString csText)
+{
+	CString cs;
+	if(lDontAutoDelete)
+		cs += "*";
+				
+	if(lShortCut > 0)
+		cs += "s";
+                
+	if(bIsGroup)
+		cs += "G";
+				
+	// attached to a group
+	if(lParentID > 0 )
+		cs += "!";
+				
+	// pipe is the "end of symbols" marker
+	cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, csText);
+
+	return cs;
+}
+
+void CQPasteWnd::OnGetToolTipText(NMHDR* pNMHDR, LRESULT* pResult)
+{
+	CQListToolTipText* pInfo = (CQListToolTipText*)pNMHDR;
+	if( !pInfo )
+		return;
+	
+	if( pInfo->lItem < 0 )
+	{
+		CString cs("no item selected");
+		
+		lstrcpyn(pInfo->pszText, cs, pInfo->cchTextMax);
+		if(cs.GetLength() > pInfo->cchTextMax)
+			pInfo->pszText[pInfo->cchTextMax-1] = 0;
+		
+		return;
+	}
+	
+	try
+	{
+		CString cs;
+
+		long lID = m_lstHeader.GetItemData(pInfo->lItem);
+		CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, mText, lDate, lShortCut, lDontAutoDelete, QuickPasteText FROM Main WHERE lID = %d"), lID);
+		if(q.eof() == false)
+		{
+			cs = q.getStringField(1);
+			cs += "\n\n";
+			
+#ifdef _DEBUG
+			cs += StrF(_T("(Index = %d) (DB ID = %d)\n"), pInfo->lItem, q.getIntField(_T("lID")));
+#endif
+			
+			COleDateTime time((time_t)q.getIntField(_T("lDate")));
+			cs += time.Format();
+			
+			if(q.getIntField(_T("lDontAutoDelete")) > 0)
+			{
+				cs += "\n";
+				cs += "Never Auto Delete";
+			}
+
+			CString csQuickPaste = q.getStringField(_T("QuickPasteText"));
+
+			if(csQuickPaste.IsEmpty() == FALSE)
+			{
+				cs += "\nQuick Paste = ";
+				cs += csQuickPaste;
+			}
+
+			long lShortCut = q.getIntField(_T("lShortCut"));
+			if(lShortCut > 0)
+			{
+				cs += "\n";
+				
+				if( HIBYTE(lShortCut) & HOTKEYF_CONTROL )
+					cs += "Ctrl + ";
+				if( HIBYTE(lShortCut) & HOTKEYF_SHIFT )
+					cs += "Shift + ";
+				if( HIBYTE(lShortCut) & HOTKEYF_ALT )
+					cs += "Alt + ";
+				
+				cs += (char)LOBYTE(lShortCut);
+			}
+		}
+		
+		lstrcpyn(pInfo->pszText, cs, pInfo->cchTextMax);
+		pInfo->pszText[pInfo->cchTextMax-1] = '\0';
+	}
+	CATCH_SQLITE_EXCEPTION
+}
+
+void CQPasteWnd::OnFindItem(NMHDR* pNMHDR, LRESULT* pResult) 
+{
+	NMLVFINDITEM* pFindInfo = (NMLVFINDITEM*)pNMHDR;
+	LVFINDINFO    fndItem   = pFindInfo->lvfi;
+	
+	if(fndItem.flags & LVFI_STRING)
+	{
+		m_Search.SetWindowText(fndItem.psz);
+		m_Search.SetFocus();
+		m_Search.SetSel(1, 1);
+
+		*pResult = m_lstHeader.GetCaret();
+		return;
+	}
+	
+	*pResult = -1;	// Default action.
+}
+
+void CQPasteWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
+{
+	// toggle ShowPersistent when we double click the caption
+	if( nHitTest == HTCAPTION )
+	{
+		switch(g_Opt.m_bDoubleClickingOnCaptionDoes)
+		{
+		case TOGGLES_ALLWAYS_ON_TOP:
+			theApp.ShowPersistent( !g_Opt.m_bShowPersistent );
+			break;
+		case TOGGLES_ALLWAYS_SHOW_DESCRIPTION:
+			CGetSetOptions::SetAllwaysShowDescription(!g_Opt.m_bAllwaysShowDescription);
+			break;
+		case ROLLES_UP_WINDOW:
+			MinMaxWindow();
+			break;
+		}
+	}
+	
+	CWndEx::OnNcLButtonDblClk(nHitTest, point);
+}
+
+#define WNDSNAP_ALLOWANCE 12
+
+void CQPasteWnd::OnWindowPosChanging(WINDOWPOS* lpwndpos)
+{
+	CWndEx::OnWindowPosChanging(lpwndpos);
+
+//	m_lstHeader.HidePopup();
+	
+	CRect rcScreen;
+	
+	CRect cr(lpwndpos->x, lpwndpos->y, lpwndpos->x + lpwndpos->cx, lpwndpos->y + lpwndpos->cy);
+	int nMonitor = GetMonitorFromRect(&cr);
+	GetMonitorRect(nMonitor, &rcScreen);
+	
+	// Snap X axis to left
+	if(abs(lpwndpos->x - rcScreen.left) <= WNDSNAP_ALLOWANCE)
+	{
+		lpwndpos->x = rcScreen.left;
+	}
+	
+	// Snap X axis to right
+	if (abs(lpwndpos->x + lpwndpos->cx - rcScreen.right) <= WNDSNAP_ALLOWANCE)
+	{
+		lpwndpos->x = rcScreen.right - lpwndpos->cx;
+	}
+	
+	// Snap Y axis to top
+	if (abs(lpwndpos->y - rcScreen.top) <= WNDSNAP_ALLOWANCE)
+	{
+		// Assign new cordinate
+		lpwndpos->y = rcScreen.top;
+	} 
+	
+	// Snap Y axis to bottom
+	if (abs(lpwndpos->y + lpwndpos->cy - rcScreen.bottom) <= WNDSNAP_ALLOWANCE)
+	{
+		lpwndpos->y = rcScreen.bottom - lpwndpos->cy;
+	}
+}
+
+void CQPasteWnd::OnShowGroupsTop()
+{
+	OnShowGroupsBottom();
+	return;
+	m_GroupTree.m_bHide = false;
+	m_bHideWnd = false;
+	
+	CRect crList;
+	m_lstHeader.GetWindowRect(crList);
+	
+	CRect cr(crList.left, crList.top, crList.left + crList.Width(), crList.top + 200);
+	
+	m_GroupTree.MoveWindow(cr);
+	m_GroupTree.m_lSelectedFolderID = theApp.m_GroupID;
+	m_GroupTree.FillTree();
+	m_GroupTree.ShowWindow(SW_SHOW);
+	
+	m_GroupTree.m_bHide = true;
+	m_bHideWnd = true;
+}
+
+void CQPasteWnd::OnShowGroupsBottom()
+{
+	m_GroupTree.m_bHide = false;
+	m_bHideWnd = false;
+	
+	CRect crWindow, crList;
+	m_lstHeader.GetWindowRect(crList);
+	GetWindowRect(crWindow);
+	
+	CRect cr(crWindow.left, crWindow.bottom, crWindow.left + crWindow.Width(), crWindow.bottom + 200);
+	
+	m_GroupTree.MoveWindow(cr);
+	m_GroupTree.m_lSelectedFolderID = theApp.m_GroupID;
+	m_GroupTree.FillTree();
+	m_GroupTree.ShowWindow(SW_SHOW);
+	
+	m_GroupTree.m_bHide = true;
+	m_bHideWnd = true;
+}
+
+LRESULT CQPasteWnd::OnGroupTreeMessage(WPARAM wParam, LPARAM lParam)
+{
+	m_bHideWnd = false;
+	
+	long lID = (long)wParam;
+	
+	m_GroupTree.ShowWindow(SW_HIDE);
+	
+	m_bHandleSearchTextChange = false;
+	m_Search.SetWindowText(_T(""));
+	m_bHandleSearchTextChange = true;
+
+	MoveControls();
+	
+	if(lID >= -1)
+	{	
+		//Set the app flag so it does a send message to refresh the list
+		//We need to do this because we set the list pos to 0 and with Post
+		//the list is not filled up yet
+		bool bItWas = theApp.m_bAsynchronousRefreshView;
+		theApp.m_bAsynchronousRefreshView = false;
+		
+		OpenID(lID);
+		
+		theApp.m_bAsynchronousRefreshView = bItWas;
+		
+		m_lstHeader.SetListPos(0);
+	}
+	
+	CWnd *p = GetFocus();
+	if(p == NULL)
+	{
+		HideQPasteWindow();
+	}
+	
+	m_bHideWnd = true;
+	
+	return TRUE;
+}
+
+void CQPasteWnd::OnBackButton()
+{
+	theApp.EnterGroupID(theApp.m_GroupParentID);
+}
+
+void CQPasteWnd::OnSearchEditChange()
+{
+	if(g_Opt.m_bFindAsYouType == FALSE)
+		return;
+
+	if(m_bHandleSearchTextChange == false)
+	{
+		//Log(_T("Handle text change is NOT set"));
+		return;
+	}
+
+	KillTimer(TIMER_DO_SEARCH);
+	SetTimer(TIMER_DO_SEARCH, 100, NULL);
+	
+	return;
+}
+
+LRESULT CQPasteWnd::OnUpDown(WPARAM wParam, LPARAM lParam)
+{
+	m_lstHeader.HidePopup();
+
+	if(m_lstHeader.HandleKeyDown(wParam, lParam) == FALSE)
+		m_lstHeader.SendMessage(WM_KEYDOWN, wParam, lParam);
+
+	return TRUE;
+}
+
+LRESULT CQPasteWnd::OnToolTipWndInactive(WPARAM wParam, LPARAM lParam)
+{
+	if(!g_Opt.m_bShowPersistent)
+	{
+		CWnd *p = GetFocus();
+		if(p == NULL)
+		{
+			HideQPasteWindow();
+		}
+	}
+
+	return TRUE;
+}
+
+void CQPasteWnd::OnUpdateMenuNewgroup(CCmdUI* pCmdUI) 
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+	if(cs.Find(_T("Ctrl-F7")) < 0)
+	{
+		cs += "\tCtrl-F7";
+		pCmdUI->SetText(cs);
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuNewgroupselection(CCmdUI* pCmdUI) 
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+	if(cs.Find(_T("F7")) < 0)
+	{
+		cs += "\tF7";
+		pCmdUI->SetText(cs);	
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuAllwaysontop(CCmdUI* pCmdUI) 
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+	if(cs.Find(_T("Ctrl-Space")) < 0)
+	{
+		cs += "\tCtrl-Space";
+		pCmdUI->SetText(cs);
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuViewfulldescription(CCmdUI* pCmdUI) 
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+	if(cs.Find(_T("F3")) < 0)
+	{
+		cs += "\tF3";
+		pCmdUI->SetText(cs);
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuViewgroups(CCmdUI* pCmdUI) 
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+	if(cs.Find(_T("Ctrl-G")) < 0)
+	{
+		cs += "\tCtrl-G";
+		pCmdUI->SetText(cs);	
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuPasteplaintextonly(CCmdUI* pCmdUI) 
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+	if(cs.Find(_T("Shift-Enter")) < 0)
+	{
+		cs += "\tShift-Enter";
+		pCmdUI->SetText(cs);	
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuDelete(CCmdUI* pCmdUI) 
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+
+	if(cs.Find(_T("Del")) < 0)
+	{
+		cs += "\tDel";
+		pCmdUI->SetText(cs);
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuProperties(CCmdUI* pCmdUI) 
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+
+	if(cs.Find(_T("tAlt-Enter")) < 0)
+	{
+		cs += "\tAlt-Enter";
+		pCmdUI->SetText(cs);
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuEdititem(CCmdUI *pCmdUI)
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+
+	if(cs.Find(_T("tCtrl-E")) < 0)
+	{
+		cs += "\tCtrl-E";
+		pCmdUI->SetText(cs);
+	}
+}
+
+void CQPasteWnd::OnUpdateMenuNewclip(CCmdUI *pCmdUI)
+{
+	if(!pCmdUI->m_pMenu)
+		return;
+
+	CString cs;
+	pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, cs, MF_BYCOMMAND);
+
+	if(cs.Find(_T("tCtrl-N")) < 0)
+	{
+		cs += "\tCtrl-N";
+		pCmdUI->SetText(cs);
+	}
+}
+
+LRESULT CQPasteWnd::OnSetListCount(WPARAM wParam, LPARAM lParam)
+{
+	m_lstHeader.SetItemCountEx(wParam);
+	m_lstHeader.RefreshVisibleRows();
+
+	MoveControls();
+	UpdateStatus(false);
+	RedrawWindow();
+
+	return TRUE;
+}
+
+LRESULT CQPasteWnd::OnItemDeleted(WPARAM wParam, LPARAM lParam)
+{
+	m_lstHeader.OnItemDeleted(wParam);
+	return TRUE;
+}
+
+LRESULT CQPasteWnd::OnRefeshRow(WPARAM wParam, LPARAM lParam)
+{
+	int clipId = wParam;
+	int listPos = lParam;
+	
+	if(m_bFoundClipToSetFocusTo == false)
+	{
+		long lFocusIndex = -1;
+		if(theApp.m_FocusID == clipId ||
+			clipId == -1)
+		{
+			m_bFoundClipToSetFocusTo = true;
+			theApp.m_FocusID = -1;
+			m_lstHeader.SetListPos(listPos);
+			UpdateStatus(false);
+		}
+	}
+
+	int topIndex = m_lstHeader.GetTopIndex();
+	int lastIndex = topIndex + m_lstHeader.GetCountPerPage();
+
+	if(listPos >= topIndex && listPos <= lastIndex)
+	{
+		m_lstHeader.RefreshRow(listPos);
+	}
+	
+	return true;
+}
+
+void CQPasteWnd::FillMainTable(CMainTable &table, CppSQLite3Query &q)
+{
+	table.m_lID = q.getIntField(_T("lID"));
+	table.m_Desc = q.fieldValue(_T("mText"));
+	table.m_bHasParent = q.getIntField(_T("lParentID")) >= 0;
+	table.m_bDontAutoDelete = q.getIntField(_T("lDontAutoDelete")) > 0;
+	table.m_bHasShortCut = q.getIntField(_T("lShortCut")) > 0;
+	table.m_bIsGroup = q.getIntField(_T("bIsGroup")) > 0;
+	table.m_QuickPaste = q.fieldValue(_T("QuickPasteText"));
+}
+
+void CQPasteWnd::RunThread()
+{
+	try
+	{
+		CEvent UpdateTimeEvent(TRUE, TRUE, _T("Ditto_Update_Clip_Time"), NULL);
+		CppSQLite3DB db;
+
+		CString csDbPath = CGetSetOptions::GetDBPath();
+
+		DWORD dStart = GetTickCount();
+		db.open(csDbPath);
+		Log(StrF(_T("Thread RunThread is starting time to open the database - %d"), GetTickCount() - dStart));
+
+		bool bDatabaseOpen = true;
+
+		while(true)
+		{
+			DWORD dwEvent = WaitForMultipleObjects(5, m_Events, FALSE, ONE_MINUTE*10);
+
+			if(dwEvent == WAIT_FAILED)
+			{
+				LPVOID lpMsgBuf = NULL;
+				DWORD dwErr = GetLastError();
+				FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+							  FORMAT_MESSAGE_FROM_SYSTEM |
+							  FORMAT_MESSAGE_IGNORE_INSERTS,
+							  NULL,
+							  dwErr,
+							  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+							  (LPTSTR) &lpMsgBuf,
+							  0,
+							  NULL);
+
+				ASSERT(!lpMsgBuf);
+				LocalFree(lpMsgBuf);
+				break;
+			}
+			if(dwEvent == WAIT_TIMEOUT)
+			{
+				if(bDatabaseOpen)
+				{
+					DWORD dStart = GetTickCount();
+
+					db.close();
+					bDatabaseOpen = false;
+
+					Log(StrF(_T("Thread do query is CLOSING the database timout was hit - %d"), GetTickCount() - dStart));
+				}
+			}
+			else
+			{
+				int nIndex = dwEvent - WAIT_OBJECT_0;
+				ResetEvent(m_Events[nIndex]);
+
+				if(nIndex == THREAD_EXIT_THREAD)
+				{
+					Log(_T("Exit thread handle set, exiting search thread"));
+
+					//get out of the waitfor loop
+					break;
+				}
+				else
+				{
+					//If the db path changed close the db then reopen it
+					if(csDbPath != CGetSetOptions::GetDBPath())
+					{
+						db.close();
+						csDbPath = CGetSetOptions::GetDBPath();
+						bDatabaseOpen = false;
+						Log(_T("database name changed closing db"));
+					}
+
+					if(bDatabaseOpen == false)
+					{
+						DWORD dStart = GetTickCount();
+						db.open(csDbPath);
+						bDatabaseOpen = true;
+						Log(StrF(_T("Thread do query is opening the database back up - %d"), GetTickCount() - dStart));
+					}
+				}
+
+				switch(nIndex)
+				{
+				case THREAD_DO_QUERY:
+				{
+					ResetEvent(m_SearchingEvent);
+
+					//If we pasted then wait for the time on the pasted event to be updated before we query the db
+					DWORD dRet = WaitForSingleObject(UpdateTimeEvent, 2000);
+
+					long lTick = GetTickCount();
+
+					m_CritSection.Lock();
+						m_bFoundClipToSetFocusTo = false;
+						CString CountSQL(m_CountSQL);
+						m_mapCache.clear();
+						m_loadItems.clear();
+						m_bStopQuery = false;
+					m_CritSection.Unlock();
+
+					long lRecordCount = 0;
+
+					try
+					{
+						lRecordCount = db.execScalar(CountSQL);
+						::PostMessage(m_hWnd, NM_SET_LIST_COUNT, lRecordCount, 0);
+					}
+					CATCH_SQLITE_EXCEPTION	
+					
+					SetEvent(m_SearchingEvent);
+					Log(StrF(_T("Set list count = %d, time = %d"), lRecordCount, GetTickCount() - lTick));
+				}
+				break;
+
+				case THREAD_LOAD_ITEMS:
+				{
+					ResetEvent(m_SearchingEvent);
+
+					long startTick = GetTickCount();
+					int loadItemsIndex = 0;
+					int loadItemsCount = 0;
+					int loadCount = 0;
+					CString localSql;
+					bool clearFirstLoadItem = false;
+
+					m_CritSection.Lock();
+						if(m_loadItems.size() > 0)
+						{
+							loadItemsIndex = m_loadItems[0].x;
+							loadItemsCount = m_loadItems[0].y - m_loadItems[0].x;
+							localSql = m_SQL;
+							m_bStopQuery = false;
+							clearFirstLoadItem = true;
+						}
+					m_CritSection.Unlock();
+
+					if(clearFirstLoadItem)
+					{
+						Log(StrF(_T("Load Items start = %d, count = %d"), loadItemsIndex, loadItemsCount));
+
+						CString limit;
+						limit.Format(_T(" LIMIT %d OFFSET %d"), loadItemsCount, loadItemsIndex);
+						localSql += limit;
+
+						CMainTable table;
+
+						CppSQLite3Query q = db.execQuery(localSql);
+						while(!q.eof())
+						{
+							FillMainTable(table, q);
+							table.m_listIndex = loadItemsIndex;
+
+							m_CritSection.Lock();
+							{
+								m_mapCache[loadItemsIndex] = table;
+							}
+							m_CritSection.Unlock();
+
+							if(m_bStopQuery)
+							{
+								Log(StrF(_T("StopQuery called exiting filling cache count = %d"), loadItemsIndex));
+								break;
+							}
+
+							q.nextRow();
+
+							loadItemsIndex++;
+							loadCount++;
+
+							::PostMessage(m_hWnd, NM_REFRESH_ROW, table.m_lID, table.m_listIndex);
+						}
+
+						::PostMessage(m_hWnd, NM_REFRESH_ROW, -1, 0);
+
+						if(clearFirstLoadItem)
+						{
+							m_CritSection.Lock();
+								m_loadItems.erase(m_loadItems.begin());
+							m_CritSection.Unlock();
+						}
+
+						Log(StrF(_T("Load items End count = %d, time = %d"), loadCount, GetTickCount() - startTick));
+					}
+					else
+					{
+						Log(_T("No load items in array not loading any clips"));
+					}
+
+					SetEvent(m_SearchingEvent);
+				}
+				break;
+
+				case THREAD_FILL_ACCELERATORS:
+				{
+					m_lstHeader.DestroyAndCreateAccelerator(TRUE, db);
+				}
+				break;
+
+				case THREAD_DESTROY_ACCELERATORS:
+				{
+					m_lstHeader.DestroyAndCreateAccelerator(FALSE, db);
+				}
+				break;
+				}
+			}
+		}
+	}
+	CATCH_SQLITE_EXCEPTION
+
+	ResetEvent(m_ExitEvent);
+}
+
+void CQPasteWnd::OnDestroy() 
+{
+	CWndEx::OnDestroy();
+	
+	SetEvent(m_Events[THREAD_EXIT_THREAD]);
+}
+
+void CQPasteWnd::OnTimer(UINT_PTR nIDEvent)
+{
+	if(nIDEvent == TIMER_DO_SEARCH)
+	{
+		KillTimer(TIMER_DO_SEARCH);
+
+		CString csText;
+		m_Search.GetWindowText(csText);
+		
+		int nCaretPos = m_lstHeader.GetCaret();
+		if(nCaretPos >= 0 && theApp.m_FocusID < 0)
+			theApp.m_FocusID = m_lstHeader.GetItemData(nCaretPos);
+
+		FillList(csText);
+	}
+	if(nIDEvent == TIMER_PASTE_FROM_MODIFER)
+	{
+		Log(_T("TIMER_PASTE_FROM_MODIFER timer\n"));
+		KillTimer(TIMER_PASTE_FROM_MODIFER);
+		if(m_bModifersMoveActive)
+		{
+			Log(_T("Open Selection\n"));
+			OpenSelection(false);
+		}
+		else
+		{
+			Log(_T("m_bModifersMoveActive set to false\n"));
+		}
+	}
+
+	CWndEx::OnTimer(nIDEvent);
+}
+
+void CQPasteWnd::OnAddinSelect(UINT id)
+{
+	ARRAY IDs;
+	m_lstHeader.GetSelectionItemData(IDs);
+
+	if(IDs.GetCount() > 0)
+	{
+		long lID = IDs[0];
+		CClip clip;
+		if(clip.LoadMainTable(lID))
+		{
+			if(clip.LoadFormats(lID, false))
+			{
+				bool bCont = theApp.m_Addins.CallPrePasteFunction(id, &clip);
+				if(bCont)
+				{
+					OpenID(-1, false, &clip.m_Formats);
+				}
+			}
+		}
+	}
+}
+
+LRESULT CQPasteWnd::OnSelectAll(WPARAM wParam, LPARAM lParam)
+{
+	BOOL ret = FALSE;
+	m_CritSection.Lock();
+
+	if(m_mapCache.size() < m_lstHeader.GetItemCount())
+	{
+		Log(_T("All items selected loading all items from the db"));
+
+		CPoint loadItem(0, m_lstHeader.GetItemCount());
+		m_loadItems.push_back(loadItem);
+
+		SetEvent(m_Events[THREAD_LOAD_ITEMS]);
+
+		ret = TRUE;
+
+		UpdateStatus(false);
+	}
+
+	m_CritSection.Unlock();
+
+	return ret;
 }

+ 292 - 285
QPasteWnd.h

@@ -1,285 +1,292 @@
-#if !defined(AFX_QPASTEWND_H__65261F0F_FEFD_48CF_A0CD_01D8BFEB353B__INCLUDED_)
-#define AFX_QPASTEWND_H__65261F0F_FEFD_48CF_A0CD_01D8BFEB353B__INCLUDED_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-// QPasteWnd.h : header file
-//
-
-#include "QListCtrl.h"
-#include "SearchEditBox.h"
-#include "WndEx.h"
-#include "GroupStatic.h"
-#include "GroupTree.h"
-#include "AlphaBlend.h"
-#include "Sqlite\CppSQLite3.h"
-#include <vector>
-#include <afxmt.h>
-
-class CMainTable
-{
-public:
-	CMainTable():
-		m_lID(-1),
-		m_bDontAutoDelete(false),
-		m_bIsGroup(false),
-		m_bHasShortCut(false),
-		m_bHasParent(false)
-	{
-	}
-	long	m_lID;
-	CString m_Desc;
-	bool	m_bDontAutoDelete;
-	bool	m_bIsGroup;
-	bool	m_bHasShortCut;	
-	bool	m_bHasParent;
-	CString m_QuickPaste;
-};
-
-
-/////////////////////////////////////////////////////////////////////////////
-// CQPasteWnd window
-
-class CQPasteWnd : public CWndEx
-{
-// Construction
-public:
-	CQPasteWnd();
-
-// Attributes
-public:
-
-// Operations
-public:
-
-// Overrides
-	// ClassWizard generated virtual function overrides
-	//{{AFX_VIRTUAL(CQPasteWnd)
-	public:
-	virtual BOOL Create(const POINT& ptStart, CWnd* pParentWnd);
-	virtual BOOL PreTranslateMessage(MSG* pMsg);
-	//}}AFX_VIRTUAL
-
-// Implementation
-public:
-	bool Add(const CString &csHeader, const CString &csText, int nID);
-	virtual ~CQPasteWnd();
-
-	void UpdateFont();
-
-//protected:
-	CQListCtrl		m_lstHeader;
-
-	CAlphaBlend		m_Alpha;
-	CFont			m_TitleFont;
-	CSearchEditBox	m_Search;
-	CFont			m_SearchFont;
-	CButton			m_btCancel;
-	bool			m_bHideWnd;
-	CString			m_strSQLSearch;
-	CGroupStatic	m_stGroup;
-	CFont			GroupFont;
-	CString			m_Title;
-	CGroupTree		m_GroupTree;
-	CBitmapButton	m_ShowGroupsFolderBottom;
-	CBitmapButton	m_ShowGroupsFolderTop;
-	CBitmapButton	m_BackButton;
-	bool			m_bAllowRepaintImmediately;
-
-	CString			m_SQL;
-	CString			m_CountSQL;
-	long			m_lRecordCount;
-	bool			m_bStopQuery;
-	bool			m_bHandleSearchTextChange;
-	bool			m_bFoundClipToSetFocusTo;
-	long			m_lItemsPerPage;
-	bool			m_bModifersMoveActive;
-
-	std::vector<CMainTable> m_Cache;
-
-	HANDLE m_Events[4];
-	HANDLE m_ExitEvent;
-	HANDLE m_SearchingEvent;
-
-	CCriticalSection m_CritSection;
-
-	CAccels m_MainAccels;
-	
-	void RefreshNc( bool bRepaintImmediately = false );
-	void UpdateStatus( bool bRepaintImmediately = false );  // regenerates the status (caption) text
-	BOOL FillList(CString csSQLSearch = "");
-	BOOL HideQPasteWindow();
-	BOOL ShowQPasteWindow(BOOL bFillList = TRUE);
-	void MoveControls();
-
-	void DeleteSelectedRows();
-
-	BOOL OpenID(long lID, bool bOnlyLoad_CF_TEXT = false, CClipFormats *pPasteFormats = NULL);
-	BOOL OpenSelection(bool bOnlyLoad_CF_TEXT = false);
-	BOOL OpenIndex( long nItem );
-	BOOL NewGroup( bool bGroupSelection = true );
-	// moves the caret to the given ID, selects it, and ensures it is visible.
-	long SetListID( long lID );
-
-	CString LoadDescription( int nItem );
-	bool SaveDescription( int nItem, CString text );
-
-	//Menu Items
-	void SetLinesPerRow(long lLines);
-	void SetTransparency(long lPercent);
-	void OnUpdateLinesPerRow(CCmdUI* pCmdUI, int nValue);
-	void OnUpdateTransparency(CCmdUI* pCmdUI, int nValue);
-	void SetMenuChecks(CMenu *pMenu);
-	void SetSendToMenu(CMenu *pMenu, int nMenuID, int nArrayPos);
-
-	BOOL SendToFriendbyPos(int nPos);
-
-	bool InsertNextNRecords(int nEnd);
-	
-	CString GetDisplayText(long lDontAutoDelete, long lShortCut, bool bIsGroup, long lParentID, CString csText);
-
-	void FillMainTable(CMainTable &table, CppSQLite3Query &q);
-	void RunThread();
-	void MoveSelection(bool down);
-	void OnKeyStateUp();
-	void SetKeyModiferState(bool bActive);
-
-	// Generated message map functions
-protected:
-	//{{AFX_MSG(CQPasteWnd)
-	DECLARE_MESSAGE_MAP()
-	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
-	afx_msg void OnSize(UINT nType, int cx, int cy);
-	afx_msg void OnSetFocus(CWnd* pOldWnd);
-	afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
-	afx_msg void OnMenuLinesperrow1();
-	afx_msg void OnMenuLinesperrow2();
-	afx_msg void OnMenuLinesperrow3();
-	afx_msg void OnMenuLinesperrow4();
-	afx_msg void OnMenuLinesperrow5();
-	afx_msg void OnMenuTransparency10();
-	afx_msg void OnMenuTransparency15();
-	afx_msg void OnMenuTransparency20();
-	afx_msg void OnMenuTransparency25();
-	afx_msg void OnMenuTransparency30();
-	afx_msg void OnMenuTransparency40();
-	afx_msg void OnMenuTransparency5();
-	afx_msg void OnMenuTransparencyNone();
-	afx_msg void OnRclickQuickPaste(NMHDR* pNMHDR, LRESULT* pResult);
-	afx_msg void OnMenuDelete();
-	afx_msg void OnMenuPositioningAtcaret();
-	afx_msg void OnMenuPositioningAtcursor();
-	afx_msg void OnMenuPositioningAtpreviousposition();
-	afx_msg void OnMenuOptions();
-	afx_msg void OnCancelFilter();
-	afx_msg void OnMenuExitprogram();
-	afx_msg void OnMenuToggleConnectCV();
-	afx_msg void OnMenuProperties();
-	afx_msg void OnClose();
-	afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);
-	afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
-	afx_msg void GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult);
-	afx_msg void OnFindItem(NMHDR* pNMHDR, LRESULT* pResult);
-	afx_msg void OnMenuFirsttenhotkeysUsectrlnum();
-	afx_msg void OnMenuFirsttenhotkeysShowhotkeytext();
-	afx_msg void OnMenuQuickoptionsAllwaysshowdescription();
-	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop();
-	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow();
-	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription();
-	afx_msg void OnMenuQuickoptionsPromptfornewgroupnames();
-	afx_msg void OnShowGroupsBottom();
-	afx_msg void OnShowGroupsTop();
-	afx_msg void OnMenuViewgroups();
-	afx_msg void OnMenuQuickpropertiesSettoneverautodelete();
-	afx_msg void OnMenuQuickpropertiesAutodelete();
-	afx_msg void OnMenuQuickpropertiesRemovehotkey();
-	afx_msg void OnMenuSenttoFriendEight();
-	afx_msg void OnMenuSenttoFriendEleven();
-	afx_msg void OnMenuSenttoFriendFifteen();
-	afx_msg void OnMenuSenttoFriendFive();
-	afx_msg void OnMenuSenttoFriendFore();
-	afx_msg void OnMenuSenttoFriendForeteen();
-	afx_msg void OnMenuSenttoFriendNine();
-	afx_msg void OnMenuSenttoFriendSeven();
-	afx_msg void OnMenuSenttoFriendSix();
-	afx_msg void OnMenuSenttoFriendTen();
-	afx_msg void OnMenuSenttoFriendThirteen();
-	afx_msg void OnMenuSenttoFriendThree();
-	afx_msg void OnMenuSenttoFriendTwelve();
-	afx_msg void OnMenuSenttoFriendTwo();
-	afx_msg void OnMenuSenttoFriendone();
-	afx_msg void OnMenuSenttoPromptforip();
-	afx_msg void OnMenuGroupsMovetogroup();
-	afx_msg void OnMenuPasteplaintextonly();
-	afx_msg void OnMenuHelp();
-	afx_msg void OnMenuQuickoptionsFont();
-	afx_msg void OnMenuQuickoptionsShowthumbnails();
-	afx_msg void OnMenuQuickoptionsDrawrtftext();
-	afx_msg void OnMenuQuickoptionsPasteclipafterselection();
-	afx_msg void OnSearchEditChange();
-	afx_msg void OnMenuQuickoptionsFindasyoutype();
-	afx_msg void OnMenuQuickoptionsEnsureentirewindowisvisible();
-	afx_msg void OnMenuQuickoptionsShowclipsthatareingroupsinmainlist();
-	afx_msg void OnMenuPastehtmlasplaintext();
-	afx_msg void OnPromptToDeleteClip();
-	afx_msg void OnUpdateMenuNewgroup(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateMenuNewgroupselection(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateMenuAllwaysontop(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateMenuViewfulldescription(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateMenuViewgroups(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateMenuPasteplaintextonly(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateMenuDelete(CCmdUI* pCmdUI);
-	afx_msg void OnUpdateMenuProperties(CCmdUI* pCmdUI);	
-	afx_msg void OnDestroy();
-	afx_msg LRESULT OnListSelect(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnListEnd(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnSearch(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnDelete(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnProperties(WPARAM wParam, LPARAM lParam);
-	afx_msg void OnGetToolTipText(NMHDR* pNMHDR, LRESULT* pResult);
-	afx_msg LRESULT OnListSelect_DB_ID(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnListSelect_Index(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnRefreshView(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnGroupTreeMessage(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnFillRestOfList(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnRefeshVisibleRows(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnSetListCount(WPARAM wParam, LPARAM lParam);
-	afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor) ;
-	afx_msg void OnNcLButtonDblClk(UINT nHitTest, CPoint point);
-	afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos);
-	afx_msg void OnViewcaptionbaronRight();
-	afx_msg void OnViewcaptionbaronBottom();
-	afx_msg void OnViewcaptionbaronLeft();
-	afx_msg void OnViewcaptionbaronTop();
-	afx_msg void OnMenuAutohide();
-	afx_msg void OnMenuViewfulldescription();
-	afx_msg void OnMenuAllwaysontop();
-	afx_msg void OnSortAscending();
-	afx_msg void OnSortDescending();
-	afx_msg void OnMenuNewGroup();
-	afx_msg void OnMenuNewGroupSelection();
-	afx_msg void OnBackButton();
-	afx_msg LRESULT OnUpDown(WPARAM wParam, LPARAM lParam);
-	afx_msg LRESULT OnItemDeleted(WPARAM wParam, LPARAM lParam);
-	LRESULT OnToolTipWndInactive(WPARAM wParam, LPARAM lParam);
-	afx_msg void OnTimer(UINT_PTR nIDEvent);
-	afx_msg void OnMenuExport();
-	afx_msg void OnMenuImport();
-	afx_msg void OnQuickpropertiesRemovequickpaste();
-	afx_msg void OnMenuEdititem();
-	afx_msg void OnMenuNewclip();
-	afx_msg void OnUpdateMenuEdititem(CCmdUI *pCmdUI);
-	afx_msg void OnUpdateMenuNewclip(CCmdUI *pCmdUI);
-	afx_msg void CQPasteWnd::OnAddinSelect(UINT id);
-//}}AFX_MSG
-};
-
-
-
-/////////////////////////////////////////////////////////////////////////////
-
-//{{AFX_INSERT_LOCATION}}
-// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
-
-#endif // !defined(AFX_QPASTEWND_H__65261F0F_FEFD_48CF_A0CD_01D8BFEB353B__INCLUDED_)
+#if !defined(AFX_QPASTEWND_H__65261F0F_FEFD_48CF_A0CD_01D8BFEB353B__INCLUDED_)
+#define AFX_QPASTEWND_H__65261F0F_FEFD_48CF_A0CD_01D8BFEB353B__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+// QPasteWnd.h : header file
+//
+
+#include "QListCtrl.h"
+#include "SearchEditBox.h"
+#include "WndEx.h"
+#include "GroupStatic.h"
+#include "GroupTree.h"
+#include "AlphaBlend.h"
+#include "Sqlite\CppSQLite3.h"
+#include <vector>
+#include <map>
+#include <afxmt.h>
+
+class CMainTable
+{
+public:
+	CMainTable():
+		m_lID(-1),
+		m_bDontAutoDelete(false),
+		m_bIsGroup(false),
+		m_bHasShortCut(false),
+		m_bHasParent(false),
+		m_listIndex(-1)
+	{
+	}
+	long m_lID;
+	CString m_Desc;
+	bool m_bDontAutoDelete;
+	bool m_bIsGroup;
+	bool m_bHasShortCut;	
+	bool m_bHasParent;
+	CString m_QuickPaste;
+	int m_listIndex;
+};
+
+
+typedef std::map<int, CMainTable> MainTypeMap;
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CQPasteWnd window
+
+class CQPasteWnd : public CWndEx
+{
+// Construction
+public:
+	CQPasteWnd();
+
+// Attributes
+public:
+
+// Operations
+public:
+
+// Overrides
+	// ClassWizard generated virtual function overrides
+	//{{AFX_VIRTUAL(CQPasteWnd)
+	public:
+	virtual BOOL Create(const POINT& ptStart, CWnd* pParentWnd);
+	virtual BOOL PreTranslateMessage(MSG* pMsg);
+	//}}AFX_VIRTUAL
+
+// Implementation
+public:
+	bool Add(const CString &csHeader, const CString &csText, int nID);
+	virtual ~CQPasteWnd();
+
+	void UpdateFont();
+
+//protected:
+	CQListCtrl		m_lstHeader;
+
+	CAlphaBlend		m_Alpha;
+	CFont			m_TitleFont;
+	CSearchEditBox	m_Search;
+	CFont			m_SearchFont;
+	CButton			m_btCancel;
+	bool			m_bHideWnd;
+	CString			m_strSQLSearch;
+	CGroupStatic	m_stGroup;
+	CFont			GroupFont;
+	CString			m_Title;
+	CGroupTree		m_GroupTree;
+	CBitmapButton	m_ShowGroupsFolderBottom;
+	CBitmapButton	m_ShowGroupsFolderTop;
+	CBitmapButton	m_BackButton;
+	bool			m_bAllowRepaintImmediately;
+
+	CString			m_SQL;
+	CString			m_CountSQL;
+	long			m_lRecordCount;
+	bool			m_bStopQuery;
+	bool			m_bHandleSearchTextChange;
+	bool			m_bFoundClipToSetFocusTo;
+	long			m_lItemsPerPage;
+	bool			m_bModifersMoveActive;
+
+	MainTypeMap m_mapCache;
+	std::vector<CPoint> m_loadItems;
+
+	HANDLE m_Events[4];
+	HANDLE m_ExitEvent;
+	HANDLE m_SearchingEvent;
+
+	CCriticalSection m_CritSection;
+
+	CAccels m_MainAccels;
+	
+	void RefreshNc( bool bRepaintImmediately = false );
+	void UpdateStatus( bool bRepaintImmediately = false );  // regenerates the status (caption) text
+	BOOL FillList(CString csSQLSearch = "");
+	BOOL HideQPasteWindow();
+	BOOL ShowQPasteWindow(BOOL bFillList = TRUE);
+	void MoveControls();
+
+	void DeleteSelectedRows();
+
+	BOOL OpenID(long lID, bool bOnlyLoad_CF_TEXT = false, CClipFormats *pPasteFormats = NULL);
+	BOOL OpenSelection(bool bOnlyLoad_CF_TEXT = false);
+	BOOL OpenIndex( long nItem );
+	BOOL NewGroup( bool bGroupSelection = true );
+
+	CString LoadDescription( int nItem );
+	bool SaveDescription( int nItem, CString text );
+
+	//Menu Items
+	void SetLinesPerRow(long lLines);
+	void SetTransparency(long lPercent);
+	void OnUpdateLinesPerRow(CCmdUI* pCmdUI, int nValue);
+	void OnUpdateTransparency(CCmdUI* pCmdUI, int nValue);
+	void SetMenuChecks(CMenu *pMenu);
+	void SetSendToMenu(CMenu *pMenu, int nMenuID, int nArrayPos);
+
+	BOOL SendToFriendbyPos(int nPos);
+
+	bool InsertNextNRecords(int nEnd);
+	
+	CString GetDisplayText(long lDontAutoDelete, long lShortCut, bool bIsGroup, long lParentID, CString csText);
+
+	void FillMainTable(CMainTable &table, CppSQLite3Query &q);
+	void RunThread();
+	void MoveSelection(bool down);
+	void OnKeyStateUp();
+	void SetKeyModiferState(bool bActive);
+
+	// Generated message map functions
+protected:
+	//{{AFX_MSG(CQPasteWnd)
+	DECLARE_MESSAGE_MAP()
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+	afx_msg void OnSetFocus(CWnd* pOldWnd);
+	afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
+	afx_msg void OnMenuLinesperrow1();
+	afx_msg void OnMenuLinesperrow2();
+	afx_msg void OnMenuLinesperrow3();
+	afx_msg void OnMenuLinesperrow4();
+	afx_msg void OnMenuLinesperrow5();
+	afx_msg void OnMenuTransparency10();
+	afx_msg void OnMenuTransparency15();
+	afx_msg void OnMenuTransparency20();
+	afx_msg void OnMenuTransparency25();
+	afx_msg void OnMenuTransparency30();
+	afx_msg void OnMenuTransparency40();
+	afx_msg void OnMenuTransparency5();
+	afx_msg void OnMenuTransparencyNone();
+	afx_msg void OnRclickQuickPaste(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg void OnMenuDelete();
+	afx_msg void OnMenuPositioningAtcaret();
+	afx_msg void OnMenuPositioningAtcursor();
+	afx_msg void OnMenuPositioningAtpreviousposition();
+	afx_msg void OnMenuOptions();
+	afx_msg void OnCancelFilter();
+	afx_msg void OnMenuExitprogram();
+	afx_msg void OnMenuToggleConnectCV();
+	afx_msg void OnMenuProperties();
+	afx_msg void OnClose();
+	afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
+	afx_msg void GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg void OnFindItem(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg void OnMenuFirsttenhotkeysUsectrlnum();
+	afx_msg void OnMenuFirsttenhotkeysShowhotkeytext();
+	afx_msg void OnMenuQuickoptionsAllwaysshowdescription();
+	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop();
+	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow();
+	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription();
+	afx_msg void OnMenuQuickoptionsPromptfornewgroupnames();
+	afx_msg void OnShowGroupsBottom();
+	afx_msg void OnShowGroupsTop();
+	afx_msg void OnMenuViewgroups();
+	afx_msg void OnMenuQuickpropertiesSettoneverautodelete();
+	afx_msg void OnMenuQuickpropertiesAutodelete();
+	afx_msg void OnMenuQuickpropertiesRemovehotkey();
+	afx_msg void OnMenuSenttoFriendEight();
+	afx_msg void OnMenuSenttoFriendEleven();
+	afx_msg void OnMenuSenttoFriendFifteen();
+	afx_msg void OnMenuSenttoFriendFive();
+	afx_msg void OnMenuSenttoFriendFore();
+	afx_msg void OnMenuSenttoFriendForeteen();
+	afx_msg void OnMenuSenttoFriendNine();
+	afx_msg void OnMenuSenttoFriendSeven();
+	afx_msg void OnMenuSenttoFriendSix();
+	afx_msg void OnMenuSenttoFriendTen();
+	afx_msg void OnMenuSenttoFriendThirteen();
+	afx_msg void OnMenuSenttoFriendThree();
+	afx_msg void OnMenuSenttoFriendTwelve();
+	afx_msg void OnMenuSenttoFriendTwo();
+	afx_msg void OnMenuSenttoFriendone();
+	afx_msg void OnMenuSenttoPromptforip();
+	afx_msg void OnMenuGroupsMovetogroup();
+	afx_msg void OnMenuPasteplaintextonly();
+	afx_msg void OnMenuHelp();
+	afx_msg void OnMenuQuickoptionsFont();
+	afx_msg void OnMenuQuickoptionsShowthumbnails();
+	afx_msg void OnMenuQuickoptionsDrawrtftext();
+	afx_msg void OnMenuQuickoptionsPasteclipafterselection();
+	afx_msg void OnSearchEditChange();
+	afx_msg void OnMenuQuickoptionsFindasyoutype();
+	afx_msg void OnMenuQuickoptionsEnsureentirewindowisvisible();
+	afx_msg void OnMenuQuickoptionsShowclipsthatareingroupsinmainlist();
+	afx_msg void OnMenuPastehtmlasplaintext();
+	afx_msg void OnPromptToDeleteClip();
+	afx_msg void OnUpdateMenuNewgroup(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateMenuNewgroupselection(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateMenuAllwaysontop(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateMenuViewfulldescription(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateMenuViewgroups(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateMenuPasteplaintextonly(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateMenuDelete(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateMenuProperties(CCmdUI* pCmdUI);	
+	afx_msg void OnDestroy();
+	afx_msg LRESULT OnListSelect(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnListEnd(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnSearch(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnDelete(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnProperties(WPARAM wParam, LPARAM lParam);
+	afx_msg void OnGetToolTipText(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg LRESULT OnListSelect_DB_ID(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnListSelect_Index(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnRefreshView(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);
+	afx_msg LRESULT OnSetListCount(WPARAM wParam, LPARAM lParam);
+	afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor) ;
+	afx_msg void OnNcLButtonDblClk(UINT nHitTest, CPoint point);
+	afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos);
+	afx_msg void OnViewcaptionbaronRight();
+	afx_msg void OnViewcaptionbaronBottom();
+	afx_msg void OnViewcaptionbaronLeft();
+	afx_msg void OnViewcaptionbaronTop();
+	afx_msg void OnMenuAutohide();
+	afx_msg void OnMenuViewfulldescription();
+	afx_msg void OnMenuAllwaysontop();
+	afx_msg void OnSortAscending();
+	afx_msg void OnSortDescending();
+	afx_msg void OnMenuNewGroup();
+	afx_msg void OnMenuNewGroupSelection();
+	afx_msg void OnBackButton();
+	afx_msg LRESULT OnUpDown(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnItemDeleted(WPARAM wParam, LPARAM lParam);
+	LRESULT OnToolTipWndInactive(WPARAM wParam, LPARAM lParam);
+	afx_msg void OnTimer(UINT_PTR nIDEvent);
+	afx_msg void OnMenuExport();
+	afx_msg void OnMenuImport();
+	afx_msg void OnQuickpropertiesRemovequickpaste();
+	afx_msg void OnMenuEdititem();
+	afx_msg void OnMenuNewclip();
+	afx_msg void OnUpdateMenuEdititem(CCmdUI *pCmdUI);
+	afx_msg void OnUpdateMenuNewclip(CCmdUI *pCmdUI);
+	afx_msg void CQPasteWnd::OnAddinSelect(UINT id);
+	afx_msg LRESULT OnSelectAll(WPARAM wParam, LPARAM lParam);
+//}}AFX_MSG
+};
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_QPASTEWND_H__65261F0F_FEFD_48CF_A0CD_01D8BFEB353B__INCLUDED_)

+ 4 - 1
QuickPaste.cpp

@@ -173,7 +173,10 @@ void CQuickPaste::ShowQPasteWnd(CWnd *pParent, bool bAtPrevPos, bool bFromKeyboa
 	
 	// Show the window
 	m_pwndPaste->ShowWindow(SW_SHOW);
-	m_pwndPaste->ShowQPasteWindow(bReFillList);
+	if(bReFillList)
+	{
+		m_pwndPaste->ShowQPasteWindow(bReFillList);
+	}
 	m_pwndPaste->SetForegroundWindow();
 }
 

BIN
focusdll/Release/focus.dll


BIN
focusdll/Release/focus.lib