Просмотр исходного кода

- new order column, use this instead of the date
- 64 bit changes

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

sabrogden 14 лет назад
Родитель
Сommit
34e87b76b4

+ 6 - 6
Addins/DittoUtil/DittoUtil.vcxproj

@@ -62,15 +62,15 @@
   <PropertyGroup>
     <_ProjectFileVersion>10.0.21006.1</_ProjectFileVersion>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Debug\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Debug64\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Debug\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Debug64\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Release\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Release64\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Release\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Release64\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
     <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
@@ -148,7 +148,7 @@
       <MkTypLibCompatible>false</MkTypLibCompatible>
     </Midl>
     <PostBuildEvent>
-      <Command>copy $(TargetDir)*.dll ..\..\Debug\Addins</Command>
+      <Command>copy $(TargetDir)*.dll ..\..\Debug64\Addins</Command>
     </PostBuildEvent>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -217,7 +217,7 @@
       <MkTypLibCompatible>false</MkTypLibCompatible>
     </Midl>
     <PostBuildEvent>
-      <Command>copy $(TargetDir)*.dll ..\..\Release\Addins</Command>
+      <Command>copy $(TargetDir)*.dll ..\..\Release64\Addins</Command>
     </PostBuildEvent>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+ 16 - 0
CP_Main.cpp

@@ -477,6 +477,22 @@ void CCP_MainApp::RefreshView()
 	}
 }
 
+void CCP_MainApp::RefreshClipOrder(int clipId)
+{
+	CQPasteWnd *pWnd = QPasteWnd();
+	if(pWnd)
+	{
+		if(m_bAsynchronousRefreshView)
+		{
+			pWnd->PostMessage(WM_RELOAD_CLIP_ORDER, clipId, 0);
+		}
+		else
+		{
+			pWnd->SendMessage(WM_RELOAD_CLIP_ORDER, clipId, 0);
+		}
+	}
+}
+
 void CCP_MainApp::OnPasteCompleted()
 {
 }

+ 1 - 0
CP_Main.h

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

+ 14 - 13
CP_Main.vcxproj

@@ -202,7 +202,7 @@
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>EncryptDecrypt\;TinyXml\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_MBCS;AFTER_98;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -224,9 +224,9 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>.\CP_Main___Win32_Unicode_Release\DittoU.pdb</ProgramDatabaseFile>
+      <ProgramDatabaseFile>.\Release\DittoU.pdb</ProgramDatabaseFile>
       <GenerateMapFile>true</GenerateMapFile>
-      <MapFileName>.\CP_Main___Win32_Unicode_Release\DittoU.map</MapFileName>
+      <MapFileName>.\Release\DittoU.map</MapFileName>
       <SubSystem>Windows</SubSystem>
       <EntryPointSymbol>wWinMainCRTStartup</EntryPointSymbol>
       <TargetMachine>MachineX86</TargetMachine>
@@ -254,7 +254,7 @@
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>EncryptDecrypt\;TinyXml\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_MBCS;AFTER_98;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -276,9 +276,9 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>.\CP_Main___Win32_Unicode_Release\DittoU.pdb</ProgramDatabaseFile>
+      <ProgramDatabaseFile>.\Release64\Ditto.pdb</ProgramDatabaseFile>
       <GenerateMapFile>true</GenerateMapFile>
-      <MapFileName>.\CP_Main___Win32_Unicode_Release\DittoU.map</MapFileName>
+      <MapFileName>.\Release64\Ditto.map</MapFileName>
       <SubSystem>Windows</SubSystem>
       <EntryPointSymbol>wWinMainCRTStartup</EntryPointSymbol>
       <MapExports>true</MapExports>
@@ -303,7 +303,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>EncryptDecrypt\;TinyXml\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_MBCS;AFTER_98;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -319,16 +319,16 @@
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;Winmm.lib;Version.Lib;Pdh.lib;riched20.lib;EncryptDecryptD64.lib;zlib\zlib.lib;TinyXml\tinyxml.lib;focus.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;Winmm.lib;Version.Lib;Pdh.lib;riched20.lib;EncryptDecryptD.lib;zlib\zlib.lib;TinyXml\tinyxml.lib;focus.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>debug\Ditto.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>.\CP_Main___Win32_Unicode_Debug/DittoU.pdb</ProgramDatabaseFile>
+      <ProgramDatabaseFile>.\Debug/Ditto.pdb</ProgramDatabaseFile>
       <SubSystem>Windows</SubSystem>
       <EntryPointSymbol>wWinMainCRTStartup</EntryPointSymbol>
       <TargetMachine>MachineX86</TargetMachine>
       <GenerateMapFile>true</GenerateMapFile>
-      <MapFileName>.\CP_Main___Win32_Unicode_Debug/DittoU.map</MapFileName>
+      <MapFileName>.\Debug/Ditto.map</MapFileName>
       <MapExports>true</MapExports>
     </Link>
     <Midl>
@@ -352,7 +352,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>EncryptDecrypt\;TinyXml\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_MBCS;AFTER_98;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -372,11 +372,11 @@
       <OutputFile>debug64\Ditto.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>.\CP_Main___Win32_Unicode_Debug/DittoU.pdb</ProgramDatabaseFile>
+      <ProgramDatabaseFile>.\Debug64/DittoU.pdb</ProgramDatabaseFile>
       <SubSystem>Windows</SubSystem>
       <EntryPointSymbol>wWinMainCRTStartup</EntryPointSymbol>
       <GenerateMapFile>true</GenerateMapFile>
-      <MapFileName>.\CP_Main___Win32_Unicode_Debug/DittoU.map</MapFileName>
+      <MapFileName>.\Debug64/DittoU.map</MapFileName>
       <MapExports>true</MapExports>
     </Link>
     <Midl>
@@ -1956,6 +1956,7 @@
     <None Include="res\CP_Main.rc2" />
     <None Include="res\CP_MainDoc.ico" />
     <None Include="res\Ditto.ico" />
+    <None Include="res\DittoNew.ico" />
     <None Include="res\Ditto_NoCopyCb.ico" />
     <None Include="res\mainfram.bmp" />
     <None Include="res\open_fol.bmp" />

+ 1 - 0
CP_Main_10.sln

@@ -3,6 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 11.00
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CP_Main", "CP_Main.vcxproj", "{D90F6EAF-861C-0A85-1208-EF129A0A92E9}"
 	ProjectSection(ProjectDependencies) = postProject
 		{F08A8736-1116-4166-AF88-CF533E41E958} = {F08A8736-1116-4166-AF88-CF533E41E958}
+		{CF8F6379-5340-4494-8E59-2807ADF37B95} = {CF8F6379-5340-4494-8E59-2807ADF37B95}
 		{E4AB8C80-F35F-451E-853B-07CEDD49E500} = {E4AB8C80-F35F-451E-853B-07CEDD49E500}
 	EndProjectSection
 EndProject

+ 1 - 1
Client.h

@@ -10,7 +10,7 @@
 #endif // _MSC_VER > 1000
 
 #include "Server.h"
-#include "Encryption.h"
+#include "EncryptDecrypt\Encryption.h"
 #include "SendSocket.h"
 #include "Popup.h"
 

+ 16 - 10
Clip.cpp

@@ -509,8 +509,9 @@ bool CClip::AddToDB(bool bCheckForDuplicates)
 			int nID = FindDuplicate();
 			if(nID >= 0)
 			{
-				theApp.m_db.execDMLEx(_T("UPDATE Main SET lDate = %d where lID = %d;"), 
-										(long)m_Time.GetTime(), nID);
+				MakeLatestTime();
+				theApp.m_db.execDMLEx(_T("UPDATE Main SET clipOrder = %f where lID = %d;"), 
+										m_clipOrder, nID);
 
 				m_id = nID;
 
@@ -605,7 +606,7 @@ bool CClip::AddToMainTable()
 		m_csQuickPaste.Replace(_T("'"), _T("''"));
 
 		CString cs;
-		cs.Format(_T("INSERT into Main values(NULL, %d, '%s', %d, %d, %d, %d, %d, '%s');"),
+		cs.Format(_T("INSERT into Main values(NULL, %d, '%s', %d, %d, %d, %d, %d, '%s', %f, %f);"),
 							(long)m_Time.GetTime(),
 							m_Desc,
 							m_shortCut,
@@ -613,7 +614,9 @@ bool CClip::AddToMainTable()
 							m_CRC,
 							m_bIsGroup,
 							m_parentId,
-							m_csQuickPaste);
+							m_csQuickPaste,
+							m_clipOrder,
+							m_clipGroupOrder);
 
 		theApp.m_db.execDML(cs);
 
@@ -640,12 +643,16 @@ bool CClip::ModifyMainTable()
 			_T("lParentID = %d, ")
 			_T("lDontAutoDelete = %d, ")
 			_T("QuickPasteText = '%s' ")
+			_T("clipOrder = %f, ")
+			_T("clipGroupOrder = %f, ")
 			_T("WHERE lID = %d;"), 
 			m_shortCut, 
 			m_Desc, 
 			m_parentId, 
 			m_dontAutoDelete, 
 			m_csQuickPaste,
+			m_clipOrder,
+			m_clipGroupOrder,
 			m_id);
 
 		bRet = true;
@@ -696,14 +703,11 @@ void CClip::MakeLatestTime()
 {
 	try
 	{
-		CppSQLite3Query q = theApp.m_db.execQuery(_T("SELECT lDate FROM Main ORDER BY lDate DESC LIMIT 1"));			
+		CppSQLite3Query q = theApp.m_db.execQuery(_T("SELECT clipOrder FROM Main ORDER BY clipOrder DESC LIMIT 1"));			
 		if(q.eof() == false)
 		{
-			long lLatestDate = q.getIntField(_T("lDate"));
-			if(m_Time.GetTime() <= lLatestDate)
-			{
-				m_Time = lLatestDate + 1;
-			}
+			double order = q.getFloatField(_T("clipOrder"));
+			m_clipOrder = order + 1;
 		}
 	}
 	CATCH_SQLITE_EXCEPTION
@@ -726,6 +730,8 @@ BOOL CClip::LoadMainTable(int id)
 			m_shortCut = q.getIntField(_T("lShortCut"));
 			m_bIsGroup = q.getIntField(_T("bIsGroup"));
 			m_csQuickPaste = q.getStringField(_T("QuickPasteText"));
+			m_clipOrder = q.getFloatField(_T("clipOrder"));
+			m_clipGroupOrder = q.getFloatField(_T("clipGroupOrder"));
 
 			m_id = id;
 

+ 3 - 1
Clip.h

@@ -10,7 +10,7 @@
 #endif // _MSC_VER > 1000
 #include <afxole.h>
 #include <afxtempl.h>
-#include "tinyxml.h"
+#include "tinyxml\tinyxml.h"
 #include "Shared\IClip.h"
 
 class CClip;
@@ -98,6 +98,8 @@ public:
 	DWORD m_CRC;
 	CString m_csQuickPaste;
 	int m_param1;
+	double m_clipOrder;
+	double m_clipGroupOrder;
 
 	virtual CString Description() { return m_Desc; }
 	virtual void Description(CString csValue) { m_Desc = csValue; }

+ 1 - 1
ClipIds.cpp

@@ -1,7 +1,7 @@
 #include "stdafx.h"
 #include "CP_Main.h"
 #include "ClipIds.h"
-#include "tinyxml.h"
+#include "tinyxml\tinyxml.h"
 #include "shared/TextConvert.h"
 #include "Clip_ImportExport.h"
 #include "CF_HDropAggregator.h"

+ 25 - 3
DatabaseUtilities.cpp

@@ -309,6 +309,25 @@ BOOL ValidDB(CString csPath, BOOL bUpgrade)
 		{
 			e.errorCode();
 		}
+
+		try
+		{
+			db.execQuery(_T("SELECT clipOrder, clipGroupOrder FROM Main"));
+		}
+		catch(CppSQLite3Exception& e)
+		{
+			db.execDML(_T("ALTER TABLE Main ADD clipOrder REAL"));
+			db.execDML(_T("ALTER TABLE Main ADD clipGroupOrder REAL"));
+
+			db.execDML(_T("Update Main set clipOrder = lDate, clipGroupOrder = lDate"));
+
+			db.execDML(_T("CREATE INDEX Main_ClipOrder on Main(clipOrder DESC)"));
+			db.execDML(_T("CREATE INDEX Main_ClipGroupOrder on Main(clipGroupOrder DESC)"));
+
+			db.execDML(_T("DROP INDEX Main_Date"));
+
+			e.errorCode();
+		}
 	}
 	CATCH_SQLITE_EXCEPTION_AND_RETURN(FALSE)
 
@@ -333,7 +352,9 @@ BOOL CreateDB(CString csFile)
 								_T("CRC INTEGER, ")
 								_T("bIsGroup INTEGER, ")
 								_T("lParentID INTEGER, ")
-								_T("QuickPasteText TEXT);"));
+								_T("QuickPasteText TEXT, ")
+								_T("clipOrder REAL, ")
+								_T("clipGroupOrder REAL);"));
 
 		db.execDML(_T("CREATE TABLE Data(")
 							_T("lID INTEGER PRIMARY KEY AUTOINCREMENT, ")
@@ -347,7 +368,8 @@ BOOL CreateDB(CString csFile)
 
 		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 INDEX Main_ClipOrder on Main(clipOrder DESC)"));
+		db.execDML(_T("CREATE INDEX Main_ClipGroupOrder on Main(clipGroupOrder DESC)"));
 		db.execDML(_T("CREATE INDEX Main_ParentId on Main(lParentID DESC)"));
 		db.execDML(_T("CREATE INDEX Main_IsGroup on Main(bIsGroup DESC)"));
         db.execDML(_T("CREATE INDEX Main_ShortCut on Main(lShortCut DESC)"));
@@ -466,7 +488,7 @@ BOOL RemoveOldEntries()
 				CClipIDs IDs;
 				int clipId;
 				
-				CppSQLite3Query q = db.execQueryEx(_T("SELECT lID, lShortCut, lParentID, lDontAutoDelete FROM Main WHERE bIsGroup = 0 ORDER BY lDate DESC LIMIT -1 OFFSET %d"), lMax);
+				CppSQLite3Query q = db.execQueryEx(_T("SELECT lID, lShortCut, lParentID, lDontAutoDelete FROM Main WHERE bIsGroup = 0 ORDER BY clipOrder DESC LIMIT -1 OFFSET %d"), lMax);
 				while(q.eof() == false)
 				{
 					int shortcut = q.getIntField(_T("lShortCut"));

+ 0 - 36
DittoSetup/Build Portable ZIP.bat

@@ -1,36 +0,0 @@
-set arg1=%1
-
-IF (%1) == () set arg1="DittoPortable"
-
-
-Rmdir Ditto /s /q
-
-MkDir Ditto
-MkDir Ditto\Help
-MkDir Ditto\Language
-MkDir Ditto\Themes
-MkDir Ditto\Addins
-
-copy ..\Release\DittoU.exe Ditto\Ditto.exe
-copy ..\Release\sqlite3.dll Ditto\sqlite3.dll
-copy ..\Release\AccessToSqlite.dll Ditto\AccessToSqlite.dll
-copy ..\Release\focus.dll Ditto\focus.dll
-copy ..\zlib\zlib1.dll Ditto\zlib1.dll
-
-copy Changes.txt Ditto\Changes.txt
-
-copy mfc-crt\* Ditto\
-
-copy Ditto.Settings Ditto\Ditto.Settings
-
-copy ..\Help\*.* Ditto\Help\
-copy ..\Debug\language\*.xml Ditto\language\
-copy ..\Debug\themes\*.xml Ditto\themes\
-
-copy ..\AccessToSqlite\Release\AccessToSqlite.dl Ditto\Addins\AccessToSqlite.dll
-
-7za.exe a -tzip Output\%arg1%.zip "Ditto\*" -r
-
-Rmdir Ditto /s /q
-
-

+ 18 - 7
DittoSetup/Build Portable ZIP_10.bat

@@ -11,22 +11,33 @@ MkDir Ditto\Language
 MkDir Ditto\Themes
 MkDir Ditto\Addins
 
-copy ..\Release\DittoU.exe Ditto\Ditto.exe
-copy ..\Release\sqlite3.dll Ditto\sqlite3.dll
-copy ..\Release\AccessToSqlite.dll Ditto\AccessToSqlite.dll
+if "%2" == "bit64" goto bit64
+
+copy ..\Release\Ditto.exe Ditto\Ditto.exe
 copy ..\Release\focus.dll Ditto\focus.dll
-copy ..\zlib\zlib1.dll Ditto\zlib1.dll
+copy ..\Release\Addins\*.dll Ditto\Addins\
+copy mfc-crt\* Ditto\
 
-copy Changes.txt Ditto\Changes.txt
+if "%2"=="" GOTO skipBit64
+if "%2"=="bit32" GOTO skipBit64	
+:bit64
+
+copy ..\Release64\Ditto.exe Ditto\Ditto.exe
+copy ..\Release64\focus64.dll Ditto\focus.dll
+copy ..\Release64\Addins\*.dll Ditto\Addins\
+copy mfc-crt64\* Ditto\
 
-copy mfc-crt_10\* Ditto\
+:skipBit64
+
+copy Changes.txt Ditto\Changes.txt
 
 copy Ditto.Settings Ditto\Ditto.Settings
 
 copy ..\Help\*.* Ditto\Help\
 copy ..\Debug\language\*.xml Ditto\language\
 copy ..\Debug\themes\*.xml Ditto\themes\
-copy ..\Release\Addins\*.dll Ditto\Addins\
+
+pause
 
 7za.exe a -tzip Output\%arg1%.zip "Ditto\*" -r
 

+ 0 - 128
DittoSetup/DittoSetup.iss

@@ -1,128 +0,0 @@
-#define MyAppName "Ditto"
-#define MyAppVersion GetFileVersion("..\Release\Ditto.exe")
-#define MyAppVerName MyAppName + " " + MyAppVersion
-
-[Setup]
-AppName={#MyAppName}
-AppVerName={#MyAppVerName}
-OutputBaseFilename=DittoSetup_{#MyAppVersion}
-AppPublisher=Scott Brogden
-AppPublisherURL=ditto-cp.sourceforge.net
-AppSupportURL=ditto-cp.sourceforge.net
-AppUpdatesURL=ditto-cp.sourceforge.net
-DefaultDirName={pf}\{#MyAppName}
-DefaultGroupName={#MyAppName}
-AppMutex=Ditto Is Now Running
-;UsePreviousTasks=no
-;DisableDirPage=yes
-DisableProgramGroupPage=yes
-DisableReadyPage=yes
-DirExistsWarning=no
-UninstallLogMode=overwrite
-ChangesAssociations=yes
-
-[Languages]
-Name: English; MessagesFile: compiler:Default.isl
-Name: German; MessagesFile: German.isl
-Name: Italiano; MessagesFile: Italian.isl
-Name: French; MessagesFile: French.isl
-Name: Portuguese; MessagesFile: Portuguese.isl
-Name: Spanish; MessagesFile: Spanish.isl
-Name: Polski; MessagesFile: Polish.isl
-Name: Dutch; MessagesFile: Dutch.isl
-Name: Swedish; MessagesFile: Swedish.isl
-Name: Croatian; MessagesFile: Croatian.isl
-Name: Turkish; MessagesFile: Turkish.isl
-Name: Japanese; MessagesFile: Japanese.isl
-Name: Chinese; MessagesFile: ChineseSimp.isl
-Name: Romanian; MessagesFile: Romanian.isl
-Name: Korean; MessagesFile: Korean.isl
-
-
-[Tasks]
-Name: RunAtStartup; Description: Run Ditto on Windows Startup
-;Name: UseFocusDll; Description: Use System Hook to track currently focused window
-
-[Files]
-;Unicode for 2000 and later
-Source: ..\Release\DittoU.exe; DestDir: {app}; DestName: Ditto.exe; Flags: ignoreversion; MinVersion: 0, 4.0
-
-;Non unicode for pre 2000
-Source: ..\Release\Ditto.exe; DestDir: {app}; DestName: Ditto.exe; Flags: ignoreversion; MinVersion: 4.0, 0
-
-Source: ..\Release\focus.dll; DestDir: {app}; BeforeInstall: BeforeFocusInstall(); Flags: ignoreversion restartreplace
-Source: ..\Release\sqlite3.dll; DestDir: {app}; Flags: ignoreversion
-Source: ..\Release\AccessToSqlite.dll; DestDir: {app}; Flags: ignoreversion
-Source: ..\zlib\zlib1.dll; DestDir: {app}; Flags: ignoreversion
-
-Source: Changes.txt; DestDir: {app}
-
-Source: ..\Debug\Language\*; DestDir: {app}\Language; BeforeInstall: BeforeLanguageInstall()
-Source: ..\Debug\Themes\*; DestDir: {app}\Themes
-
-Source: mfc-crt\*; DestDir: {app}
-
-;Add help files
-Source: ..\Help\*.htm; DestDir: {app}\Help; Flags: ignoreversion
-
-;Addins and the mfc dlls to the addins folder
-Source: ..\Addins\DittoUtil\Release\DittoUtil.dll; DestDir: {app}\Addins; Flags: ignoreversion
-Source: {app}\MFC71.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-Source: {app}\mfc71u.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-Source: {app}\msvcp71.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-Source: {app}\msvcr71.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-
-[Icons]
-Name: {group}\Ditto; Filename: {app}\Ditto.exe
-Name: {group}\Ditto Help; Filename: {app}\Help\DittoGettingStarted.htm
-Name: {group}\Uninstall; Filename: {uninstallexe}
-
-[Run]
-Filename: {app}\Ditto.exe; Description: Launch Ditto; Flags: nowait postinstall skipifsilent
-Filename: {app}\Help\DittoGettingStarted.htm; Description: View Help; Flags: nowait postinstall skipifsilent shellexec
-Filename: {app}\Changes.txt; Description: View Change History; Flags: nowait postinstall skipifsilent shellexec unchecked
-
-[Registry]
-Root: HKCU; Subkey: Software\Ditto; Flags: uninsdeletekey
-Root: HKCU; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: Ditto; flags: uninsdeletevalue; ValueData: {app}\Ditto.exe; Tasks: RunAtStartup
-Root: HKCU; Subkey: Software\Ditto; ValueType: string; ValueName: LanguageFile; ValueData: {language}
-
-Root: HKCU; Subkey: Software\Ditto\PasteStrings; ValueType: string; ValueName: gvim.exe; ValueData: """{{PLUS}gP"
-Root: HKCU; Subkey: Software\Ditto\CopyStrings; ValueType: string; ValueName: gvim.exe; ValueData: """{{PLUS}y"
-Root: HKCU; Subkey: Software\Ditto\CutStrings; ValueType: string; ValueName: gvim.exe; ValueData: """{{PLUS}x"
-
-Root: HKCU; Subkey: Software\Ditto\PasteStrings; ValueType: string; ValueName: cmd.exe; ValueData: % {{Delay100}ep
-Root: HKCU; Subkey: Software\Ditto\CopyStrings; ValueType: string; ValueName: cmd.exe; ValueData: % {{Delay100}ey
-
-;associate .dto with Ditto
-Root: HKCR; Subkey: .dto; ValueType: string; ValueName: ; ValueData: Ditto; Flags: uninsdeletevalue
-Root: HKCR; Subkey: Ditto; ValueType: string; ValueName: ; ValueData: Ditto; Flags: uninsdeletekey
-Root: HKCR; Subkey: Ditto\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Ditto.exe,0
-Root: HKCR; Subkey: Ditto\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\Ditto.exe"" ""%1"""
-
-
-[Code]
-procedure BeforeFocusInstall();
-var
-  sDir: String;
-begin
-    sDir := ExpandConstant('{app}');
-
-    DeleteFile(sDir+'\focus.dll')
-    DeleteFile(sDir+'\focus.dll.old')
-    DeleteFile(sDir+'\focus.dll.old.old')
-    DeleteFile(sDir+'\focus.dll.old.old.old')
-
-    RenameFile(sDir+'\focus.dll', sDir+'\focus.dll.old')
-    RenameFile(sDir+'\focus.dll', sDir+'\focus.dll.old.old')
-    RenameFile(sDir+'\focus.dll', sDir+'\focus.dll.old.old.old')
-end;
-
-procedure BeforeLanguageInstall();
-var
-  sDir: String;
-begin
-    sDir := ExpandConstant('{app}');
-
-    RenameFile(sDir+'\Language\Italian.xml', sDir+'\Language\Italian.xml.old')
-end;

+ 18 - 20
DittoSetup/DittoSetup_10.iss

@@ -2,6 +2,9 @@
 #define MyAppVersion GetFileVersion("..\Release\DittoU.exe")
 #define MyAppVerName MyAppName + " " + MyAppVersion
 
+#define bit64
+  
+
 [Setup]
 AppName={#MyAppName}
 AppVerName={#MyAppVerName}
@@ -10,6 +13,10 @@ AppPublisher=Scott Brogden
 AppPublisherURL=ditto-cp.sourceforge.net
 AppSupportURL=ditto-cp.sourceforge.net
 AppUpdatesURL=ditto-cp.sourceforge.net
+#ifdef bit64
+  ArchitecturesInstallIn64BitMode=x64
+  ArchitecturesAllowed=x64
+#endif
 DefaultDirName={pf}\{#MyAppName}
 DefaultGroupName={#MyAppName}
 AppMutex=Ditto Is Now Running
@@ -46,34 +53,25 @@ Name: Danish; MessagesFile: Danish.isl
 
 [Tasks]
 Name: RunAtStartup; Description: Run Ditto on Windows Startup
-;Name: UseFocusDll; Description: Use System Hook to track currently focused window
 
 [Files]
-Source: ..\Release\DittoU.exe; DestDir: {app}; DestName: Ditto.exe; Flags: ignoreversion;
-
-Source: ..\Release\focus.dll; DestDir: {app}; BeforeInstall: BeforeFocusInstall(); Flags: ignoreversion restartreplace
-Source: ..\Release\sqlite3.dll; DestDir: {app}; Flags: ignoreversion
-Source: ..\Release\AccessToSqlite.dll; DestDir: {app}; Flags: ignoreversion
-Source: ..\zlib\zlib1.dll; DestDir: {app}; Flags: ignoreversion
+#ifdef bit64
+	Source: ..\Release64\Ditto.exe; DestDir: {app}; DestName: Ditto.exe; Flags: ignoreversion;
+	Source: ..\Release64\focus64.dll; DestDir: {app}; BeforeInstall: BeforeFocusInstall(); Flags: ignoreversion restartreplace
+	Source: ..\Release64\Addins\DittoUtil.dll; DestDir: {app}\Addins; Flags: ignoreversion
+	Source: mfc-crt64\*; DestDir: {app}
+#elif
+	Source: ..\Release\Ditto.exe; DestDir: {app}; DestName: Ditto.exe; Flags: ignoreversion;
+	Source: ..\Release\focus.dll; DestDir: {app}; BeforeInstall: BeforeFocusInstall(); Flags: ignoreversion restartreplace
+	Source: ..\Addins\DittoUtil\Release64\DittoUtil.dll; DestDir: {app}\Addins; Flags: ignoreversion
+	Source: mfc-crt\*; DestDir: {app}
+#endif
 
 Source: Changes.txt; DestDir: {app}
-
 Source: ..\Debug\Language\*; DestDir: {app}\Language; BeforeInstall: BeforeLanguageInstall()
 Source: ..\Debug\Themes\*; DestDir: {app}\Themes
-
-Source: mfc-crt_10\*; DestDir: {app}
-
-;Add help files
 Source: ..\Help\*.htm; DestDir: {app}\Help; Flags: ignoreversion
 
-;Addins and the mfc dlls to the addins folder
-Source: ..\Addins\DittoUtil\Release\DittoUtil.dll; DestDir: {app}\Addins; Flags: ignoreversion
-Source: {app}\MFC100.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-Source: {app}\mfc100u.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-Source: {app}\mfcm100u.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-Source: {app}\msvcp100.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-Source: {app}\msvcr100.dll; DestDir: {app}\Addins; Flags: ignoreversion external
-
 [Icons]
 Name: {group}\Ditto; Filename: {app}\Ditto.exe
 Name: {group}\Ditto Help; Filename: {app}\Help\DittoGettingStarted.htm

BIN
DittoSetup/mfc-crt_10/mfc100.dll


BIN
DittoSetup/mfc-crt_10/mfcm100.dll


+ 18 - 17
EncryptDecrypt/EncryptDecrypt.vcxproj

@@ -64,14 +64,14 @@
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup>
     <_ProjectFileVersion>10.0.21006.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\EncryptDecrypt___Win32_Unicode_Debug\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\EncryptDecrypt___Win64_Debug\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\EncryptDecrypt___Win32_Unicode_Debug\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\EncryptDecrypt___Win64__Debug\</IntDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\Debug64\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\Debug64\</IntDir>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\EncryptDecrypt___Win32_Unicode_Release\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\EncryptDecrypt___Win64_Release\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\Release64\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\EncryptDecrypt___Win32_Unicode_Release\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\EncryptDecrypt___Win64_Release\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\Release64\</IntDir>
     <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
     <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
     <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
@@ -98,10 +98,10 @@
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <PrecompiledHeaderOutputFile>.\EncryptDecrypt___Win32_Unicode_Debug/EncryptDecrypt.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\EncryptDecrypt___Win32_Unicode_Debug/</AssemblerListingLocation>
-      <ObjectFileName>.\EncryptDecrypt___Win32_Unicode_Debug/</ObjectFileName>
-      <ProgramDataBaseFileName>.\EncryptDecrypt___Win32_Unicode_Debug/</ProgramDataBaseFileName>
+      <PrecompiledHeaderOutputFile>.\Debug/EncryptDecryptD.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>
+      <ObjectFileName>.\Debug/</ObjectFileName>
+      <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
@@ -111,7 +111,7 @@
       <Culture>0x0409</Culture>
     </ResourceCompile>
     <Lib>
-      <OutputFile>EncryptDecrypt___Win32_Unicode_Debug\EncryptDecryptD64.lib</OutputFile>
+      <OutputFile>Debug\EncryptDecryptD.lib</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <TargetMachine>MachineX86</TargetMachine>
     </Lib>
@@ -163,7 +163,7 @@
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>EncrypDecrypt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_MBCS;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -171,10 +171,10 @@
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <PrecompiledHeaderOutputFile>.\EncryptDecrypt___Win64_Release/EncryptDecrypt.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\EncryptDecrypt___Win64_Release/</AssemblerListingLocation>
-      <ObjectFileName>.\EncryptDecrypt___Win64_Release/</ObjectFileName>
-      <ProgramDataBaseFileName>.\EncryptDecrypt___Win64__Release/</ProgramDataBaseFileName>
+      <PrecompiledHeaderOutputFile>.\Release64/EncryptDecrypt.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\Release64/</AssemblerListingLocation>
+      <ObjectFileName>.\Release64/</ObjectFileName>
+      <ProgramDataBaseFileName>.\Release64/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
     </ClCompile>
@@ -183,7 +183,7 @@
       <Culture>0x0409</Culture>
     </ResourceCompile>
     <Lib>
-      <OutputFile>EncryptDecrypt___Win32_Unicode_Release\EncryptDecrypt64.lib</OutputFile>
+      <OutputFile>Release64\EncryptDecrypt64.lib</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <TargetMachine>MachineX64</TargetMachine>
     </Lib>
@@ -204,6 +204,7 @@
     </PostBuildEvent>
     <Lib>
       <TargetMachine>MachineX64</TargetMachine>
+      <OutputFile>Debug64\EncryptDecryptD64.lib</OutputFile>
     </Lib>
   </ItemDefinitionGroup>
   <ItemGroup>

+ 0 - 1
EncryptDecrypt/NewRandom.cpp

@@ -57,7 +57,6 @@ void CNewRandom::Reset()
 void CNewRandom::Initialize()
 {
 	DWORD inx;
-
 	WORD ww;
 	DWORD dw;
 	LARGE_INTEGER li;

+ 1 - 1
EncryptDecrypt/NewRandom.h

@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include "sha2.h"
 
-#define INTRAND_SIZE 264
+#define INTRAND_SIZE 350
 
 class CNewRandom
 {

+ 2 - 2
MainFrm.cpp

@@ -11,7 +11,7 @@
 #include ".\mainfrm.h"
 #include "focusdll\focusdll.h"
 #include "HyperLink.h"
-#include "tinyxml.h"
+#include "tinyxml\tinyxml.h"
 #include "Path.h"
 #include "DittoCopyBuffer.h"
 
@@ -408,7 +408,7 @@ void CMainFrame::DoFirstTenPositionsPaste(int nPos)
 {
     try
     {
-        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, bIsGroup, lDate FROM Main ")_T("WHERE ((bIsGroup = 1 AND lParentID = -1) OR bIsGroup = 0) ")_T("ORDER BY bIsGroup ASC, lDate DESC ")_T("LIMIT 1 OFFSET %d"), nPos);
+        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID FROM Main ")_T("WHERE ((bIsGroup = 1 AND lParentID = -1) OR bIsGroup = 0) ")_T("ORDER BY bIsGroup ASC, clipOrder DESC ")_T("LIMIT 1 OFFSET %d"), nPos);
 
         if(q.eof() == false)
         {

+ 1 - 0
Misc.h

@@ -112,6 +112,7 @@ CString GetProcessName(HWND hWnd);
 #define WM_LOAD_ClIP_ON_CLIPBOARD		WM_USER	+ 214
 //defined in tray icon #define WM_CUSTOMIZE_TRAY_MENU	WM_USER + 215
 //defined in tray icon #define WM_TRAY_MENU_MOUSE_MOVE	WM_USER + 216
+#define WM_RELOAD_CLIP_ORDER	WM_USER	+ 217
 
 #if !defined(_BITSET_)
 #	include <bitset>

+ 2 - 2
MultiLanguage.h

@@ -5,8 +5,8 @@
 #if !defined(AFX_MULTILANGUAGE_H__DA57BA64_C421_4368_9498_1EFCE49A5C52__INCLUDED_)
 #define AFX_MULTILANGUAGE_H__DA57BA64_C421_4368_9498_1EFCE49A5C52__INCLUDED_
 
-#include "Tinyxml.h"
-#include "tinystr.h"
+#include "tinyxml\Tinyxml.h"
+#include "tinyxml\tinystr.h"
 
 #if _MSC_VER > 1000
 #pragma once

+ 12 - 19
ProcessPaste.cpp

@@ -95,9 +95,9 @@ void CProcessPaste::MarkAsPasted()
 		if(!g_Opt.m_bUpdateTimeOnPaste)
 			return;
 
-		long lID = (long)clips.ElementAt(0);
+		int id = clips.ElementAt(0);
 		//Moved to a thread because when running from from U3 devices the write is time consuming
-		AfxBeginThread(CProcessPaste::MarkAsPastedThread, (LPVOID)lID, THREAD_PRIORITY_LOWEST);
+		AfxBeginThread(CProcessPaste::MarkAsPastedThread, (LPVOID)id, THREAD_PRIORITY_LOWEST);
 	}
 
 	Log(_T("End of MarkAsPasted"));
@@ -117,36 +117,29 @@ UINT CProcessPaste::MarkAsPastedThread(LPVOID pParam)
 		Sleep(350);
 	}
 
-	long lID = (long)pParam;
+	int id = (int)pParam;
 	BOOL bRet = FALSE;
 
 	try
 	{
-		//Update the time it was copied so that it appears at the top of the
-		//paste list. Items are sorted by this time.
-		CTime now = CTime::GetCurrentTime();
 		try
 		{
-			CppSQLite3Query q = theApp.m_db.execQuery(_T("SELECT lDate FROM Main ORDER BY lDate DESC LIMIT 1"));
+			CppSQLite3Query q = theApp.m_db.execQuery(_T("SELECT clipOrder FROM Main ORDER BY clipOrder DESC LIMIT 1"));
 
 			if(q.eof() == false)
 			{
-				long lLatestDate = q.getIntField(_T("lDate"));
-				if(now.GetTime() <= lLatestDate)
-				{
-					now = lLatestDate + 1;
-				}
+				double latestDate = q.getFloatField(_T("clipOrder"));
+				latestDate += 1;
+
+				Log(StrF(_T("Setting clipId: %d, order: %f"), id, latestDate));
+
+				theApp.m_db.execDMLEx(_T("UPDATE Main SET clipOrder = %f where lID = %d;"), latestDate, id);
+
+				theApp.RefreshClipOrder(id);
 			}
 		}
 		CATCH_SQLITE_EXCEPTION
 
-		Log(StrF(_T("Setting clipId: %d, time: %d"), lID, now.GetTime()));
-
-		theApp.m_db.execDMLEx(_T("UPDATE Main SET lDate = %d where lID = %d;"), (long)now.GetTime(), lID);
-		if(g_Opt.m_bShowPersistent)
-		{
-			theApp.RefreshView();
-		}
 		bRet = TRUE;
 	}
 	CATCH_SQLITE_EXCEPTION

+ 170 - 132
QPasteWnd.cpp

@@ -13,6 +13,7 @@
 #include "FormatSQL.h"
 #include "MainTableFunctions.h"
 #include "Path.h"
+#include <algorithm>
 
 #ifdef _DEBUG
     #define new DEBUG_NEW
@@ -155,6 +156,7 @@ 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_MESSAGE(WM_RELOAD_CLIP_ORDER, OnReloadClipOrder)
 ON_WM_NCLBUTTONDBLCLK()
 ON_WM_WINDOWPOSCHANGING()
 ON_COMMAND(ID_VIEWCAPTIONBARON_RIGHT, OnViewcaptionbaronRight)
@@ -306,7 +308,7 @@ void CQPasteWnd::MoveControls()
     int cx = crRect.Width();
     int cy = crRect.Height();
 
-    long lTopOfListBox = 0;
+    int topOfListBox = 0;
 
     if(theApp.m_GroupID > 0)
     {
@@ -318,7 +320,7 @@ void CQPasteWnd::MoveControls()
 		m_ShowGroupsFolderTop.MoveWindow(22, 0, 18, 16);
 		m_stGroup.MoveWindow(44, 0, cx, 16);
 
-		lTopOfListBox = 16;
+		topOfListBox = 16;
 	}
 	else
 	{
@@ -341,7 +343,7 @@ void CQPasteWnd::MoveControls()
 		m_btCancel.ShowWindow(SW_HIDE);
     }
 
-	m_lstHeader.MoveWindow(0, lTopOfListBox, cx, cy - listBoxBottomOffset-lTopOfListBox);
+	m_lstHeader.MoveWindow(0, topOfListBox, cx, cy - listBoxBottomOffset-topOfListBox);
     m_Search.MoveWindow(18, cy - 20, nWidth - 20, 19);
 
     m_ShowGroupsFolderBottom.MoveWindow(0, cy - 19, 18, 16);
@@ -396,7 +398,7 @@ void CQPasteWnd::OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized)
     {
         if(theApp.m_bShowingQuickPaste == false)
         {
-            ShowQPasteWindow(m_mapCache.size() == 0);
+            ShowQPasteWindow(m_listItems.size() == 0);
         }
 
         //Unregister the global hot keys for the last ten copies
@@ -450,13 +452,13 @@ BOOL CQPasteWnd::HideQPasteWindow()
         {
 			ATL::CCritSecLock csLock(m_CritSection.m_sect);
             
-			m_mapCache.clear();
+			m_listItems.clear();
             m_lstHeader.SetItemCountEx(0);
         }
     }
 
 
-    Log(StrF(_T("End of HideQPasteWindow, ItemCount: %d"), m_mapCache.size()));
+    Log(StrF(_T("End of HideQPasteWindow, ItemCount: %d"), m_listItems.size()));
 
     return TRUE;
 }
@@ -473,7 +475,7 @@ BOOL CQPasteWnd::ShowQPasteWindow(BOOL bFillList)
 {
     theApp.m_bShowingQuickPaste = true;
 
-    Log(StrF(_T("Start - ShowQPasteWindow - Fill List: %d, array count: %d"), bFillList, m_mapCache.size()));
+    Log(StrF(_T("Start - ShowQPasteWindow - Fill List: %d, array count: %d"), bFillList, m_listItems.size()));
 
     //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);
@@ -522,7 +524,7 @@ BOOL CQPasteWnd::ShowQPasteWindow(BOOL bFillList)
 
     SetKeyModiferState(true);
 
-	Log(StrF(_T("END - ShowQPasteWindow - Fill List: %d, array count: %d"), bFillList, m_mapCache.size()));
+	Log(StrF(_T("END - ShowQPasteWindow - Fill List: %d, array count: %d"), bFillList, m_listItems.size()));
 
     return TRUE;
 }
@@ -552,13 +554,13 @@ bool CQPasteWnd::Add(const CString &csHeader, const CString &csText, int nID)
     return true;
 }
 
-BOOL CQPasteWnd::OpenID(long lID, bool bOnlyLoad_CF_TEXT, CClipFormats *pPasteFormats)
+BOOL CQPasteWnd::OpenID(int id, bool bOnlyLoad_CF_TEXT, CClipFormats *pPasteFormats)
 {
-    Log(StrF(_T("Start OpenId, Id: %d, Only CF_TEXT: %d"), lID, bOnlyLoad_CF_TEXT));
+    Log(StrF(_T("Start OpenId, Id: %d, Only CF_TEXT: %d"), id, bOnlyLoad_CF_TEXT));
 
     if(pPasteFormats == NULL)
     {
-        if(theApp.EnterGroupID(lID))
+        if(theApp.EnterGroupID(id))
         {
             Log(_T("Entered group"));
             return TRUE;
@@ -583,7 +585,7 @@ BOOL CQPasteWnd::OpenID(long lID, bool bOnlyLoad_CF_TEXT, CClipFormats *pPasteFo
     }
     else
     {
-        paste.GetClipIDs().Add(lID);
+        paste.GetClipIDs().Add(id);
     }
     paste.DoPaste();
     theApp.OnPasteCompleted();
@@ -598,7 +600,7 @@ BOOL CQPasteWnd::OpenID(long lID, bool bOnlyLoad_CF_TEXT, CClipFormats *pPasteFo
         MinMaxWindow(FORCE_MIN);
     }
 
-    Log(StrF(_T("End OpenId, Id: %d, Only CF_TEXT: %d"), lID, bOnlyLoad_CF_TEXT));
+    Log(StrF(_T("End OpenId, Id: %d, Only CF_TEXT: %d"), id, bOnlyLoad_CF_TEXT));
 
     return TRUE;
 }
@@ -649,9 +651,9 @@ BOOL CQPasteWnd::OpenSelection(bool bOnlyLoad_CF_TEXT)
     return TRUE;
 }
 
-BOOL CQPasteWnd::OpenIndex(long nItem)
+BOOL CQPasteWnd::OpenIndex(int item)
 {
-    return OpenID(m_lstHeader.GetItemData(nItem));
+    return OpenID(m_lstHeader.GetItemData(item));
 }
 
 BOOL CQPasteWnd::NewGroup(bool bGroupSelection)
@@ -681,28 +683,28 @@ BOOL CQPasteWnd::NewGroup(bool bGroupSelection)
         }
     }
 
-    long lID = NewGroupID(theApp.GetValidGroupID(), csName);
+    int id = NewGroupID(theApp.GetValidGroupID(), csName);
 
-    if(lID <= 0)
+    if(id <= 0)
     {
         return FALSE;
     }
 
     if(!bGroupSelection)
     {
-        theApp.m_FocusID = lID; // focus on the new group
+        theApp.m_FocusID = id; // focus on the new group
         FillList();
         return TRUE;
     }
 
-    IDs.MoveTo(lID);
-    theApp.EnterGroupID(lID);
+    IDs.MoveTo(id);
+    theApp.EnterGroupID(id);
     return TRUE;
 }
 
 LRESULT CQPasteWnd::OnListSelect_DB_ID(WPARAM wParam, LPARAM lParam)
 {
-    OpenID((long)wParam);
+    OpenID((int)wParam);
     return TRUE;
 }
 
@@ -713,16 +715,13 @@ LRESULT CQPasteWnd::OnListSelect_Index(WPARAM wParam, LPARAM lParam)
         return FALSE;
     }
 
-    OpenIndex((long)wParam);
+    OpenIndex((int)wParam);
 
     return TRUE;
 }
 
 LRESULT CQPasteWnd::OnListSelect(WPARAM wParam, LPARAM lParam)
 {
-    int nCount = (int)wParam;
-    long *pItems = (long*)lParam;
-
     OpenSelection(false);
 
     return TRUE;
@@ -730,10 +729,45 @@ LRESULT CQPasteWnd::OnListSelect(WPARAM wParam, LPARAM lParam)
 
 LRESULT CQPasteWnd::OnListEnd(WPARAM wParam, LPARAM lParam)
 {
-    //HideQPasteWindow();
     return 0;
 }
 
+LRESULT CQPasteWnd::OnReloadClipOrder(WPARAM wParam, LPARAM lParam)
+{
+	BOOL foundClip = FALSE;
+	int clipId = (int)wParam;
+
+	CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT clipOrder FROM Main WHERE lID = %d"), clipId);			
+	if(q.eof() == false)
+	{
+		double order = q.getFloatField(_T("clipOrder"));
+
+		std::vector<CMainTable>::iterator iter = m_listItems.begin();
+		while(iter != m_listItems.end())
+		{
+			if(iter->m_lID == clipId)
+			{
+				iter->m_clipOrder = order;
+
+				theApp.m_FocusID = clipId;
+				std::sort(m_listItems.begin(), m_listItems.end(), CMainTable::SortDesc);
+				foundClip = TRUE;
+				
+				SelectFocusID();
+
+				m_lstHeader.RefreshVisibleRows();
+				m_lstHeader.RedrawWindow();
+
+				break;
+			}
+
+			iter++;
+		}
+	}
+
+	return foundClip;
+}
+
 LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
 {
     MSG msg;
@@ -757,7 +791,7 @@ LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
 
 		{
 			ATL::CCritSecLock csLock(m_CritSection.m_sect);
-			m_mapCache.clear();
+			m_listItems.clear();
 		}
 
 		m_lstHeader.SetItemCountEx(0);
@@ -766,7 +800,7 @@ LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
 		action = _T("Cleared Items");
     }
 
-    Log(StrF(_T("OnRefreshView - End - Count: %d, Action: %s"), m_mapCache.size(), action));
+    Log(StrF(_T("OnRefreshView - End - Count: %d, Action: %s"), m_listItems.size(), action));
 
     return TRUE;
 }
@@ -854,11 +888,11 @@ BOOL CQPasteWnd::FillList(CString csSQLSearch /*=""*/)
         m_lstHeader.m_bStartTop = g_Opt.m_bHistoryStartTop;
         if(g_Opt.m_bHistoryStartTop)
         {
-            csSort = "Main.bIsGroup ASC, Main.lDate DESC";
+            csSort = "Main.bIsGroup ASC, Main.clipOrder DESC";
         }
         else
         {
-            csSort = "Main.bIsGroup ASC, Main.lDate ASC";
+            csSort = "Main.bIsGroup ASC, Main.clipOrder ASC";
         }
 
         if(g_Opt.m_bShowAllClipsInMainList)
@@ -877,11 +911,11 @@ BOOL CQPasteWnd::FillList(CString csSQLSearch /*=""*/)
 
         if(g_Opt.m_bHistoryStartTop)
         {
-            csSort = "Main.bIsGroup DESC, Main.lDate DESC";
+            csSort = "Main.bIsGroup DESC, Main.clipGroupOrder DESC";
         }
         else
         {
-            csSort = "Main.bIsGroup ASC, Main.lDate ASC";
+            csSort = "Main.bIsGroup ASC, Main.clipGroupOrder ASC";
         }
 
         if(theApp.m_GroupID >= 0)
@@ -965,13 +999,13 @@ BOOL CQPasteWnd::FillList(CString csSQLSearch /*=""*/)
 	    m_CountSQL.Format(_T("SELECT COUNT(Main.lID) FROM Main %s where %s"), dataJoin, strFilter);
 
 	    m_SQL.Format(_T("SELECT Main.lID, Main.mText, Main.lParentID, Main.lDontAutoDelete, ")
-			_T("Main.lShortCut, Main.bIsGroup, Main.QuickPasteText FROM Main %s ")
+			_T("Main.lShortCut, Main.bIsGroup, Main.QuickPasteText, Main.clipOrder, Main.clipGroupOrder FROM Main %s ")
 			_T("where %s order by %s"), dataJoin, strFilter, csSort);
 	}
 
 	{
 		ATL::CCritSecLock csLock(m_CritSection.m_sect);
-		m_mapCache.clear();
+		m_listItems.clear();
 	}
 
 	if(m_lstHeader.GetItemCount() <= 0)
@@ -1323,10 +1357,10 @@ void CQPasteWnd::OnMenuLinesperrow5()
     SetLinesPerRow(5);
 }
 
-void CQPasteWnd::SetLinesPerRow(long lLines)
+void CQPasteWnd::SetLinesPerRow(int lines)
 {
-    CGetSetOptions::SetLinesPerRow(lLines);
-    m_lstHeader.SetNumberOfLinesPerRow(lLines);
+    CGetSetOptions::SetLinesPerRow(lines);
+    m_lstHeader.SetNumberOfLinesPerRow(lines);
 
     FillList();
 }
@@ -1371,17 +1405,17 @@ void CQPasteWnd::OnMenuTransparency40()
     SetTransparency(40);
 }
 
-void CQPasteWnd::SetTransparency(long lPercent)
+void CQPasteWnd::SetTransparency(int percent)
 {
     #ifdef AFTER_98
-        if(lPercent)
+        if(percent)
         {
-            CGetSetOptions::SetTransparencyPercent(lPercent);
+            CGetSetOptions::SetTransparencyPercent(percent);
             CGetSetOptions::SetEnableTransparency(TRUE);
 
             m_Alpha.SetTransparent(TRUE);
 
-            float fPercent = lPercent / (float)100.0;
+            float fPercent = percent / (float)100.0;
 
             m_Alpha.SetOpacity(OPACITY_MAX - (int)(fPercent *OPACITY_MAX));
         }
@@ -1438,48 +1472,47 @@ void CQPasteWnd::OnMenuProperties()
     m_lstHeader.GetSelectionItemData(IDs);
     m_lstHeader.GetSelectionIndexes(Indexes);
 
-    INT_PTR nSize = IDs.GetSize();
-    if(nSize < 1)
+    INT_PTR size = IDs.GetSize();
+    if(size < 1)
     {
         return ;
     }
 
-    long lID = IDs[0];
-    int nRow = Indexes[0];
+    int id = IDs[0];
+    int row = Indexes[0];
 
-    if(lID < 0)
+    if(id < 0)
     {
         return ;
     }
 
     m_lstHeader.RemoveAllSelection();
-    m_lstHeader.SetSelection(nRow);
+    m_lstHeader.SetSelection(row);
 
-    CCopyProperties props(lID, this);
-    INT_PTR nDo = props.DoModal();
+    CCopyProperties props(id, this);
+    INT_PTR doModalRet = props.DoModal();
 
-    if(nDo == IDOK)
+    if(doModalRet == IDOK)
     {
         {
 			ATL::CCritSecLock csLock(m_CritSection.m_sect);
-
-            MainTypeMap::iterator iter = m_mapCache.find(nRow);
-            if(iter != m_mapCache.end())
+            
+            if(row < m_listItems.size())
             {
-                CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT * FROM Main WHERE lID = %d"), lID);
+                CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT * FROM Main WHERE lID = %d"), id);
                 if(!q.eof())
                 {
-                    FillMainTable(iter->second, q);
+                    FillMainTable(m_listItems[row], q);
                 }
             }
 
-			CF_DibTypeMap::iterator iterDib = m_cf_dibCache.find(lID);
+			CF_DibTypeMap::iterator iterDib = m_cf_dibCache.find(id);
 			if(iterDib != m_cf_dibCache.end())
 			{
 				m_cf_dibCache.erase(iterDib);
 			}
 
-			CF_DibTypeMap::iterator iterRtf = m_cf_rtfCache.find(lID);
+			CF_DibTypeMap::iterator iterRtf = m_cf_rtfCache.find(id);
 			if(iterRtf != m_cf_rtfCache.end())
 			{
 				m_cf_rtfCache.erase(iterRtf);
@@ -1496,7 +1529,7 @@ void CQPasteWnd::OnMenuProperties()
         }
 
         m_lstHeader.SetFocus();
-        m_lstHeader.SetListPos(nRow);
+        m_lstHeader.SetListPos(row);
     }
 
     m_bHideWnd = true;
@@ -1634,7 +1667,7 @@ void CQPasteWnd::OnMenuQuickpropertiesSettoneverautodelete()
     {
         try
         {
-            theApp.m_db.execDMLEx(_T("UPDATE Main SET lDontAutoDelete = %d where lID = %d;"), (long)CTime::GetCurrentTime().GetTime(), IDs[i]);
+            theApp.m_db.execDMLEx(_T("UPDATE Main SET lDontAutoDelete = %d where lID = %d;"), (int)CTime::GetCurrentTime().GetTime(), IDs[i]);
         }
         CATCH_SQLITE_EXCEPTION
     }
@@ -1645,11 +1678,10 @@ void CQPasteWnd::OnMenuQuickpropertiesSettoneverautodelete()
         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;
-            }
+			if(Indexs[row] < m_listItems.size())
+			{
+				m_listItems[Indexs[row]].m_bDontAutoDelete = true;
+			}
         }
     }
 
@@ -1680,11 +1712,10 @@ void CQPasteWnd::OnMenuQuickpropertiesAutodelete()
         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;
-            }
+			if(Indexs[row] < m_listItems.size())
+			{
+				m_listItems[Indexs[row]].m_bDontAutoDelete = false;
+			}
         }
     }
 
@@ -1716,11 +1747,10 @@ void CQPasteWnd::OnMenuQuickpropertiesRemovehotkey()
         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;
-            }
+			if(Indexs[row] < m_listItems.size())
+			{
+				m_listItems[Indexs[row]].m_bHasShortCut = false;
+			}
         }
     }
 
@@ -1752,11 +1782,10 @@ void CQPasteWnd::OnQuickpropertiesRemovequickpaste()
         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();
-            }
+			if(Indexs[row] < m_listItems.size())
+			{
+				m_listItems[Indexs[row]].m_QuickPaste.Empty();
+			}
         }
     }
 
@@ -2151,11 +2180,22 @@ void CQPasteWnd::DeleteSelectedRows()
 
         for(int i = 0; i < count; i++)
         {
-            MainTypeMap::iterator iter = m_mapCache.find(Indexs[i]);
-            if(iter != m_mapCache.end() && iter->second.m_lID > 0)
-            {
-                m_mapCache.erase(iter);
+			if(Indexs[i] < m_listItems.size())
+			{
+				m_listItems.erase(m_listItems.begin( ) + Indexs[i]);
                 erasedCount++;
+
+				CF_DibTypeMap::iterator iterDib = m_cf_dibCache.find(m_lstHeader.GetItemData(Indexs[i]));
+				if(iterDib != m_cf_dibCache.end())
+				{
+					m_cf_dibCache.erase(iterDib);
+				}
+
+				CF_DibTypeMap::iterator iterRtf = m_cf_rtfCache.find(m_lstHeader.GetItemData(Indexs[i]));
+				if(iterRtf != m_cf_rtfCache.end())
+				{
+					m_cf_rtfCache.erase(iterRtf);
+				}
             }
         }
     }
@@ -2182,9 +2222,9 @@ CString CQPasteWnd::LoadDescription(int nItem)
     CString cs;
     try
     {
-        long lID = m_lstHeader.GetItemData(nItem);
+        int id = m_lstHeader.GetItemData(nItem);
 
-        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT mText FROM Main WHERE lID = %d"), lID);
+        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT mText FROM Main WHERE lID = %d"), id);
         if(q.eof() == false)
         {
             cs = q.getStringField(0);
@@ -2516,38 +2556,37 @@ void CQPasteWnd::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
 					ATL::CCritSecLock csLock(m_CritSection.m_sect);
 
                     int c = m_lstHeader.GetItemCount();
-                    MainTypeMap::iterator iter = m_mapCache.find(pItem->iItem);
-                    if(iter != m_mapCache.end())
+					if(m_listItems.size() > pItem->iItem)
                     {
                         CString cs;
-                        if(iter->second.m_bDontAutoDelete)
+                        if(m_listItems[pItem->iItem].m_bDontAutoDelete)
                         {
                             cs += "*";
                         }
 
-                        if(iter->second.m_bHasShortCut)
+                        if(m_listItems[pItem->iItem].m_bHasShortCut)
                         {
                             cs += "s";
                         }
 
-                        if(iter->second.m_bIsGroup)
+                        if(m_listItems[pItem->iItem].m_bIsGroup)
                         {
                             cs += "G";
                         }
 
                         // attached to a group
-                        if(iter->second.m_bHasParent)
+                        if(m_listItems[pItem->iItem].m_bHasParent)
                         {
                             cs += "!";
                         }
 
-                        if(iter->second.m_QuickPaste.IsEmpty() == FALSE)
+                        if(m_listItems[pItem->iItem].m_QuickPaste.IsEmpty() == FALSE)
                         {
                             cs += "Q";
                         }
 
                         // pipe is the "end of symbols" marker
-                        cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, iter->second.m_Desc);
+                        cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, m_listItems[pItem->iItem].m_Desc);
 
                         lstrcpyn(pItem->pszText, cs, pItem->cchTextMax);
                         pItem->pszText[pItem->cchTextMax - 1] = '\0';
@@ -2593,10 +2632,9 @@ void CQPasteWnd::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
                 {
 					ATL::CCritSecLock csLock(m_CritSection.m_sect);
 
-                    MainTypeMap::iterator iter = m_mapCache.find(pItem->iItem);
-                    if(iter != m_mapCache.end())
+                    if(m_listItems.size() > pItem->iItem)
                     {
-                        pItem->lParam = iter->second.m_lID;
+                        pItem->lParam = m_listItems[pItem->iItem].m_lID;
                     }
                 }
 
@@ -2608,16 +2646,15 @@ void CQPasteWnd::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
     {
 		ATL::CCritSecLock csLock(m_CritSection.m_sect);
      
-		MainTypeMap::iterator iter = m_mapCache.find(pItem->iItem);
-        if(iter != m_mapCache.end())
+		if(m_listItems.size() > pItem->iItem)
         {
-            CF_DibTypeMap::iterator iterDib = m_cf_dibCache.find(iter->second.m_lID);
+            CF_DibTypeMap::iterator iterDib = m_cf_dibCache.find(m_listItems[pItem->iItem].m_lID);
             if(iterDib == m_cf_dibCache.end())
             {
                 bool exists = false;
 				for (std::list<CClipFormatQListCtrl>::iterator it = m_ExtraDataLoadItems.begin(); it != m_ExtraDataLoadItems.end(); it++)
 				{
-					if(it->m_cfType == CF_DIB && it->m_dbId == iter->second.m_lID)
+					if(it->m_cfType == CF_DIB && it->m_dbId == m_listItems[pItem->iItem].m_lID)
 					{
 						exists = true;
 						break;
@@ -2628,7 +2665,7 @@ void CQPasteWnd::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
                 {
                     CClipFormatQListCtrl format;
                     format.m_cfType = CF_DIB;
-                    format.m_dbId = iter->second.m_lID;
+                    format.m_dbId = m_listItems[pItem->iItem].m_lID;
                     format.m_clipRow = pItem->iItem;
                     format.m_autoDeleteData = false;
                     m_ExtraDataLoadItems.push_back(format);
@@ -2650,16 +2687,15 @@ void CQPasteWnd::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
     {
 		ATL::CCritSecLock csLock(m_CritSection.m_sect);
 
-        MainTypeMap::iterator iter = m_mapCache.find(pItem->iItem);
-        if(iter != m_mapCache.end())
+        if(m_listItems.size() > pItem->iItem)
         {
-            CF_DibTypeMap::iterator iterRTF = m_cf_rtfCache.find(iter->second.m_lID);
+            CF_DibTypeMap::iterator iterRTF = m_cf_rtfCache.find(m_listItems[pItem->iItem].m_lID);
             if(iterRTF == m_cf_rtfCache.end())
             {
                 bool exists = false;
 				for (std::list<CClipFormatQListCtrl>::iterator it = m_ExtraDataLoadItems.begin(); it != m_ExtraDataLoadItems.end(); it++)
 				{
-					if(it->m_cfType == theApp.m_RTFFormat && it->m_dbId == iter->second.m_lID)
+					if(it->m_cfType == theApp.m_RTFFormat && it->m_dbId == m_listItems[pItem->iItem].m_lID)
 					{
 						exists = true;
 						break;
@@ -2670,7 +2706,7 @@ void CQPasteWnd::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
                 {
                     CClipFormatQListCtrl format;
                     format.m_cfType = theApp.m_RTFFormat;
-                    format.m_dbId = iter->second.m_lID;
+                    format.m_dbId = m_listItems[pItem->iItem].m_lID;
                     format.m_clipRow = pItem->iItem;
                     format.m_autoDeleteData = false;
                     m_ExtraDataLoadItems.push_back(format);
@@ -2689,32 +2725,32 @@ void CQPasteWnd::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
     }
 }
 
-CString CQPasteWnd::GetDisplayText(long lDontAutoDelete, long lShortCut, bool bIsGroup, long lParentID, CString csText)
+CString CQPasteWnd::GetDisplayText(int dontAutoDelete, int shortCut, bool isGroup, int parentID, CString text)
 {
     CString cs;
-    if(lDontAutoDelete)
+    if(dontAutoDelete)
     {
         cs += "*";
     }
 
-    if(lShortCut > 0)
+    if(shortCut > 0)
     {
         cs += "s";
     }
 
-    if(bIsGroup)
+    if(isGroup)
     {
         cs += "G";
     }
 
     // attached to a group
-    if(lParentID > 0)
+    if(parentID > 0)
     {
         cs += "!";
     }
 
     // pipe is the "end of symbols" marker
-    cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, csText);
+    cs += "|" + CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, text);
 
     return cs;
 }
@@ -2744,8 +2780,8 @@ void CQPasteWnd::OnGetToolTipText(NMHDR *pNMHDR, LRESULT *pResult)
     {
         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);
+        int id = m_lstHeader.GetItemData(pInfo->lItem);
+        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, mText, lDate, lShortCut, lDontAutoDelete, QuickPasteText FROM Main WHERE lID = %d"), id);
         if(q.eof() == false)
         {
             cs = q.getStringField(1);
@@ -2772,25 +2808,25 @@ void CQPasteWnd::OnGetToolTipText(NMHDR *pNMHDR, LRESULT *pResult)
                 cs += csQuickPaste;
             }
 
-            long lShortCut = q.getIntField(_T("lShortCut"));
-            if(lShortCut > 0)
+            int shortCut = q.getIntField(_T("lShortCut"));
+            if(shortCut > 0)
             {
                 cs += "\n";
 
-                if(HIBYTE(lShortCut) &HOTKEYF_CONTROL)
+                if(HIBYTE(shortCut) &HOTKEYF_CONTROL)
                 {
                     cs += "Ctrl + ";
                 }
-                if(HIBYTE(lShortCut) &HOTKEYF_SHIFT)
+                if(HIBYTE(shortCut) &HOTKEYF_SHIFT)
                 {
                     cs += "Shift + ";
                 }
-                if(HIBYTE(lShortCut) &HOTKEYF_ALT)
+                if(HIBYTE(shortCut) &HOTKEYF_ALT)
                 {
                     cs += "Alt + ";
                 }
 
-                cs += (char)LOBYTE(lShortCut);
+                cs += (char)LOBYTE(shortCut);
             }
         }
 
@@ -2926,7 +2962,7 @@ LRESULT CQPasteWnd::OnGroupTreeMessage(WPARAM wParam, LPARAM lParam)
 {
     m_bHideWnd = false;
 
-    long lID = (long)wParam;
+    int id = (int)wParam;
 
     m_GroupTree.ShowWindow(SW_HIDE);
 
@@ -2936,7 +2972,7 @@ LRESULT CQPasteWnd::OnGroupTreeMessage(WPARAM wParam, LPARAM lParam)
 
     MoveControls();
 
-    if(lID >= -1)
+    if(id >= -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
@@ -2944,7 +2980,7 @@ LRESULT CQPasteWnd::OnGroupTreeMessage(WPARAM wParam, LPARAM lParam)
         bool bItWas = theApp.m_bAsynchronousRefreshView;
         theApp.m_bAsynchronousRefreshView = false;
 
-        OpenID(lID);
+        OpenID(id);
 
         theApp.m_bAsynchronousRefreshView = bItWas;
 
@@ -3223,10 +3259,10 @@ void CQPasteWnd::SelectFocusID()
 
 	bool selectedItem = false;
 	int index = 0;
-	MainTypeMap::iterator iter = m_mapCache.begin();
-	while(iter != m_mapCache.end())
+	std::vector<CMainTable>::iterator iter = m_listItems.begin();
+	while(iter != m_listItems.end())
 	{
-		if(iter->second.m_lID == theApp.m_FocusID)
+		if(iter->m_lID == theApp.m_FocusID)
 		{
 			m_lstHeader.SetListPos(index);
 			selectedItem = true;
@@ -3251,6 +3287,8 @@ void CQPasteWnd::FillMainTable(CMainTable &table, CppSQLite3Query &q)
     table.m_bHasShortCut = q.getIntField(_T("lShortCut")) > 0;
     table.m_bIsGroup = q.getIntField(_T("bIsGroup")) > 0;
     table.m_QuickPaste = q.fieldValue(_T("QuickPasteText"));
+	table.m_clipOrder = q.getFloatField(_T("clipOrder"));
+	table.m_clipGroupOrder = q.getFloatField(_T("clipGroupOrder"));
 }
 
 void CQPasteWnd::OnDestroy()
@@ -3294,20 +3332,20 @@ void CQPasteWnd::OnTimer(UINT_PTR nIDEvent)
     CWndEx::OnTimer(nIDEvent);
 }
 
-void CQPasteWnd::OnAddinSelect(UINT id)
+void CQPasteWnd::OnAddinSelect(UINT idIn)
 {
     ARRAY IDs;
     m_lstHeader.GetSelectionItemData(IDs);
 
     if(IDs.GetCount() > 0)
     {
-        long lID = IDs[0];
+        int id = IDs[0];
         CClip clip;
-        if(clip.LoadMainTable(lID))
+        if(clip.LoadMainTable(id))
         {
-            if(clip.LoadFormats(lID, false))
+            if(clip.LoadFormats(id, false))
             {
-                bool bCont = theApp.m_Addins.CallPrePasteFunction(id, &clip);
+                bool bCont = theApp.m_Addins.CallPrePasteFunction(idIn, &clip);
                 if(bCont)
                 {
                     OpenID(-1, false, &clip.m_Formats);
@@ -3322,7 +3360,7 @@ LRESULT CQPasteWnd::OnSelectAll(WPARAM wParam, LPARAM lParam)
     BOOL ret = FALSE;
     ATL::CCritSecLock csLock(m_CritSection.m_sect);
 
-    if((int)m_mapCache.size() < m_lstHeader.GetItemCount())
+    if((int)m_listItems.size() < m_lstHeader.GetItemCount())
     {
         Log(_T("All items selected loading all items from the db"));
 

+ 23 - 8
QPasteWnd.h

@@ -17,7 +17,15 @@
 class CMainTable
 {
 public:
-    CMainTable(): m_lID( - 1), m_bDontAutoDelete(false), m_bIsGroup(false), m_bHasShortCut(false), m_bHasParent(false), m_listIndex( - 1){}
+    CMainTable(): 
+		m_lID( - 1), 
+		m_bDontAutoDelete(false), 
+		m_bIsGroup(false), 
+		m_bHasShortCut(false), 
+		m_bHasParent(false)
+	{
+
+	}
 
     ~CMainTable()
 	{
@@ -31,7 +39,13 @@ public:
     bool m_bHasShortCut;
     bool m_bHasParent;
     CString m_QuickPaste;
-    int m_listIndex;
+	double m_clipOrder;
+	double m_clipGroupOrder;
+
+	static bool SortDesc(const CMainTable& d1, const CMainTable& d2)
+	{
+		return d1.m_clipOrder > d2.m_clipOrder;
+	}
 };
 
 
@@ -96,7 +110,7 @@ public:
     bool m_bModifersMoveActive;
 
     CQPasteWndThread m_thread;
-    MainTypeMap m_mapCache;
+	std::vector<CMainTable> m_listItems;
 
 	std::list<CPoint> m_loadItems;
     std::list<CClipFormatQListCtrl> m_ExtraDataLoadItems;
@@ -115,17 +129,17 @@ public:
 
     void DeleteSelectedRows();
 
-    BOOL OpenID(long lID, bool bOnlyLoad_CF_TEXT = false, CClipFormats *pPasteFormats = NULL);
+    BOOL OpenID(int id, bool bOnlyLoad_CF_TEXT = false, CClipFormats *pPasteFormats = NULL);
     BOOL OpenSelection(bool bOnlyLoad_CF_TEXT = false);
-    BOOL OpenIndex(long nItem);
+    BOOL OpenIndex(int item);
     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 SetLinesPerRow(int lines);
+    void SetTransparency(int percent);
     void OnUpdateLinesPerRow(CCmdUI *pCmdUI, int nValue);
     void OnUpdateTransparency(CCmdUI *pCmdUI, int nValue);
     void SetMenuChecks(CMenu *pMenu);
@@ -135,7 +149,7 @@ public:
 
     bool InsertNextNRecords(int nEnd);
 
-    CString GetDisplayText(long lDontAutoDelete, long lShortCut, bool bIsGroup, long lParentID, CString csText);
+    CString GetDisplayText(int lDontAutoDelete, int lShortCut, bool bIsGroup, int lParentID, CString csText);
 
     void FillMainTable(CMainTable &table, CppSQLite3Query &q);
     void RunThread();
@@ -240,6 +254,7 @@ protected:
     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 OnReloadClipOrder(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);

+ 14 - 14
QPasteWndThread.cpp

@@ -131,12 +131,11 @@ void CQPasteWndThread::OnLoadItems(void *param)
 				while(!q.eof())
 				{
 					pasteWnd->FillMainTable(table, q);
-					table.m_listIndex = loadItemsIndex;
 
 					{
 						ATL::CCritSecLock csLock(pasteWnd->m_CritSection.m_sect);
 
-						pasteWnd->m_mapCache[loadItemsIndex] = table;
+						pasteWnd->m_listItems.push_back(table);
 					}
 
 					if(pasteWnd->m_bStopQuery)
@@ -147,18 +146,26 @@ void CQPasteWndThread::OnLoadItems(void *param)
 
 					q.nextRow();
 
-					loadItemsIndex++;
-					loadCount++;
-
 					if(firstLoad == false)
 					{
-	            		::PostMessage(pasteWnd->m_hWnd, NM_REFRESH_ROW, table.m_lID, table.m_listIndex);
+	            		::PostMessage(pasteWnd->m_hWnd, NM_REFRESH_ROW, table.m_lID, loadItemsIndex);
 					}
+
+					loadItemsIndex++;
+					loadCount++;
+				}
+
+				if(clearFirstLoadItem)
+				{
+					ATL::CCritSecLock csLock(pasteWnd->m_CritSection.m_sect);
+
+					pasteWnd->m_loadItems.erase(pasteWnd->m_loadItems.begin());
 				}
 
 				if(firstLoad)
 				{
-	        		::PostMessage(pasteWnd->m_hWnd, NM_REFRESH_ROW, -2, 0);
+					::PostMessage(pasteWnd->m_hWnd, NM_REFRESH_ROW, -2, 0);
+					//allow the next thread message to process, this should be the message to set the list count
 					break;
 				}
 				else
@@ -166,13 +173,6 @@ void CQPasteWndThread::OnLoadItems(void *param)
 					::PostMessage(pasteWnd->m_hWnd, NM_REFRESH_ROW, -1, 0);
 				}
 
-				if(clearFirstLoadItem)
-				{
-					ATL::CCritSecLock csLock(pasteWnd->m_CritSection.m_sect);
-
-					pasteWnd->m_loadItems.erase(pasteWnd->m_loadItems.begin());
-				}
-
 				Log(StrF(_T("Load items End count = %d, time = %d"), loadCount, GetTickCount() - startTick));
 			}
 			catch (CppSQLite3Exception& e)	\

+ 1 - 1
RecieveSocket.h

@@ -1,7 +1,7 @@
 #pragma once
 
 #include "Winsock2.h"
-#include "Encryption.h"
+#include "EncryptDecrypt\Encryption.h"
 #include "ServerDefines.h"
 
 class CRecieveSocket

+ 1 - 1
SendSocket.h

@@ -9,7 +9,7 @@
 #pragma once
 #endif // _MSC_VER > 1000
 
-#include "Encryption.h"
+#include "EncryptDecrypt\Encryption.h"
 #include "ServerDefines.h"
 
 class CSendSocket  

+ 1 - 1
Server.h

@@ -1,7 +1,7 @@
 #pragma once
 
 #include "Winsock2.h"
-#include "Encryption.h"
+#include "EncryptDecrypt\Encryption.h"
 #include "shared/TextConvert.h"
 #include "RecieveSocket.h"
 #include "FileSend.h"

+ 2 - 2
Theme.h

@@ -1,7 +1,7 @@
 #pragma once
 
-#include "Tinyxml.h"
-#include "tinystr.h"
+#include "tinyxml\Tinyxml.h"
+#include "tinyxml\tinystr.h"
 
 class CTheme
 {