Explorar o código

Don't refresh the list when a copy is made from the description window

scott brogden %!s(int64=5) %!d(string=hai) anos
pai
achega
b646266d8a
Modificáronse 8 ficheiros con 317 adicións e 295 borrados
  1. 6 7
      CP_Main.cpp
  2. 43 44
      CP_Main.h
  3. 238 235
      MainFrmThread.cpp
  4. 2 1
      Misc.h
  5. 7 4
      QListCtrl.cpp
  6. 19 4
      QPasteWnd.cpp
  7. 1 0
      QPasteWnd.h
  8. 1 0
      ToolTipEx.cpp

+ 6 - 7
CP_Main.cpp

@@ -118,7 +118,6 @@ CCP_MainApp::CCP_MainApp()
 	ClearOldGroupState();
 
 	m_bAsynchronousRefreshView = true;
-
 	m_lClipsSent = 0;
 	m_lClipsRecieved = 0;
 	m_oldtStartUp = COleDateTime::GetCurrentTime();
@@ -597,18 +596,18 @@ void CCP_MainApp::ReloadTypes()
 	}
 }
 
-void CCP_MainApp::RefreshView()
+void CCP_MainApp::RefreshView(CopyReasonEnum::CopyReason copyReason)
 {
 	CQPasteWnd *pWnd = QPasteWnd();
 	if(pWnd)
 	{
 		if(m_bAsynchronousRefreshView)
 		{
-			pWnd->PostMessage(WM_REFRESH_VIEW);
+			pWnd->PostMessage(WM_REFRESH_VIEW, copyReason, 0);
 		}
 		else
 		{
-			pWnd->SendMessage(WM_REFRESH_VIEW);
+			pWnd->SendMessage(WM_REFRESH_VIEW, copyReason, 0);
 		}
 	}
 }
@@ -620,7 +619,7 @@ void CCP_MainApp::RefreshClipAfterPaste(int clipId, int updateFlags)
 	{
 		if(m_bAsynchronousRefreshView)
 		{
-			pWnd->PostMessage(WM_RELOAD_CLIP_AFTER_PASTE, clipId, updateFlags);
+			pWnd->PostMessage(WM_RELOAD_CLIP_AFTER_PASTE, clipId, updateFlags);		
 		}
 		else
 		{
@@ -633,7 +632,7 @@ void CCP_MainApp::OnPasteCompleted()
 {
 }
 
-void CCP_MainApp::OnCopyCompleted(long lLastID, int count)
+void CCP_MainApp::OnCopyCompleted(long lLastID, int count, CopyReasonEnum::CopyReason copyReason)
 {
 	if(count <= 0)
 	{
@@ -649,7 +648,7 @@ void CCP_MainApp::OnCopyCompleted(long lLastID, int count)
 		m_CopyBuffer.EndCopy(lLastID);
 	}
 
-	RefreshView();
+	RefreshView(copyReason);
 }
 
 void CCP_MainApp::SaveCurrentGroupState()

+ 43 - 44
CP_Main.h

@@ -1,7 +1,7 @@
 #pragma once
 
 #ifndef __AFXWIN_H__
-	#error include 'stdafx.h' before including this file for PCH
+#error include 'stdafx.h' before including this file for PCH
 #endif
 
 #include "resource.h"       // main symbols
@@ -43,53 +43,53 @@ public:
 
 	bool	m_bExitServerThread;
 
-// MainFrame
+	// MainFrame
 	HWND m_MainhWnd;
-	CMainFrame*	m_pMainFrame;
+	CMainFrame* m_pMainFrame;
 	CFrameWnd* m_pNoDbMainFrame;
 	void AfterMainCreate();  // called after main window creation
 	void BeforeMainClose();  // called before main window close
 
 // System-wide HotKeys
-	CHotKey*	m_pDittoHotKey; // activate ditto's qpaste window
-	CHotKey*	m_pDittoHotKey2; // activate ditto's qpaste window
-	CHotKey*	m_pDittoHotKey3; // activate ditto's qpaste window
-	
-	CHotKey*	m_pPosOne;
-	CHotKey*	m_pPosTwo;
-	CHotKey*	m_pPosThree;
-	CHotKey*	m_pPosFour;
-	CHotKey*	m_pPosFive;
-	CHotKey*	m_pPosSix;
-	CHotKey*	m_pPosSeven;
-	CHotKey*	m_pPosEight;
-	CHotKey*	m_pPosNine;
-	CHotKey*	m_pPosTen;
-
-	CHotKey		*m_pCopyBuffer1;
-	CHotKey		*m_pPasteBuffer1;
-	CHotKey		*m_pCutBuffer1;
-	CHotKey		*m_pCopyBuffer2;
-	CHotKey		*m_pPasteBuffer2;
-	CHotKey		*m_pCutBuffer2;
-	CHotKey		*m_pCopyBuffer3;
-	CHotKey		*m_pPasteBuffer3;
-	CHotKey		*m_pCutBuffer3;
-	CHotKey		*m_pTextOnlyPaste;
-	CHotKey		*m_pSaveClipboard;
-	CHotKey		*m_pCopyAndSaveClipboard;
+	CHotKey* m_pDittoHotKey; // activate ditto's qpaste window
+	CHotKey* m_pDittoHotKey2; // activate ditto's qpaste window
+	CHotKey* m_pDittoHotKey3; // activate ditto's qpaste window
+
+	CHotKey* m_pPosOne;
+	CHotKey* m_pPosTwo;
+	CHotKey* m_pPosThree;
+	CHotKey* m_pPosFour;
+	CHotKey* m_pPosFive;
+	CHotKey* m_pPosSix;
+	CHotKey* m_pPosSeven;
+	CHotKey* m_pPosEight;
+	CHotKey* m_pPosNine;
+	CHotKey* m_pPosTen;
+
+	CHotKey* m_pCopyBuffer1;
+	CHotKey* m_pPasteBuffer1;
+	CHotKey* m_pCutBuffer1;
+	CHotKey* m_pCopyBuffer2;
+	CHotKey* m_pPasteBuffer2;
+	CHotKey* m_pCutBuffer2;
+	CHotKey* m_pCopyBuffer3;
+	CHotKey* m_pPasteBuffer3;
+	CHotKey* m_pCutBuffer3;
+	CHotKey* m_pTextOnlyPaste;
+	CHotKey* m_pSaveClipboard;
+	CHotKey* m_pCopyAndSaveClipboard;
 
 	ExternalWindowTracker m_activeWnd;
-	
-// CopyThread and ClipViewer (Copy and Paste Management)
+
+	// CopyThread and ClipViewer (Copy and Paste Management)
 	CCopyThread	m_CopyThread;
 	void StartCopyThread();
 	void StopCopyThread();
 	// for posting messages
-	HWND GetClipboardViewer()			{ return m_CopyThread.m_pClipboardViewer->m_hWnd; }
-	bool EnableCbCopy(bool bState)		{ return m_CopyThread.SetCopyOnChange(bState); }
-	bool IsClipboardViewerConnected()	{ return m_CopyThread.IsClipboardViewerConnected(); }
-	bool GetConnectCV()					{ return m_CopyThread.GetConnectCV(); }
+	HWND GetClipboardViewer() { return m_CopyThread.m_pClipboardViewer->m_hWnd; }
+	bool EnableCbCopy(bool bState) { return m_CopyThread.SetCopyOnChange(bState); }
+	bool IsClipboardViewerConnected() { return m_CopyThread.IsClipboardViewerConnected(); }
+	bool GetConnectCV() { return m_CopyThread.GetConnectCV(); }
 	void SetConnectCV(bool bConnect);
 	bool ToggleConnectCV();
 	void UpdateMenuConnectCV(CMenu* pMenu, UINT nMenuID);
@@ -97,17 +97,17 @@ public:
 	void LoadGlobalClips();
 
 	void OnDeleteID(long lID);
-	BOOL GetClipData(long lID, CClipFormat &Clip);
-	bool EditItems(CClipIDs &Ids, bool bShowError); 
+	BOOL GetClipData(long lID, CClipFormat& Clip);
+	bool EditItems(CClipIDs& Ids, bool bShowError);
 
 	CClipTypes* LoadTypesFromDB(); // returns a "new" allocated object
 	void ReloadTypes();
-	void RefreshView(); // refreshes the view if it is visible
+	void RefreshView(CopyReasonEnum::CopyReason copyReason = CopyReasonEnum::COPY_TO_UNKOWN); // refreshes the view if it is visible
 	void RefreshClipAfterPaste(int clipId, int updateFlags);
-	void OnCopyCompleted( long lLastID, int count = 1 );
+	void OnCopyCompleted(long lLastID, int count = 1, CopyReasonEnum::CopyReason copyReason = CopyReasonEnum::COPY_TO_UNKOWN);
 	void OnPasteCompleted();
 
-// Groups
+	// Groups
 	long		m_GroupDefaultID; // new clips are saved to this group
 	long		m_GroupID;        // current group
 	long		m_GroupParentID;  // current group's parent
@@ -138,7 +138,6 @@ public:
 	void SetStatus(const TCHAR* status = NULL, bool bRepaintImmediately = false);
 
 	void ShowPersistent(bool bVal);
-
 	bool	m_bAsynchronousRefreshView;
 
 	//Socket Info
@@ -193,14 +192,14 @@ public:
 public:
 	virtual BOOL InitInstance();
 	virtual int ExitInstance();
-	
+
 	afx_msg void OnAppAbout();
 	DECLARE_MESSAGE_MAP()
 	virtual BOOL OnIdle(LONG lCount);
 
 protected:
 	void ShowCommandLineError(CString csTitle, CString csMessage);
-	CUAC_Thread *m_pUacPasteThread;
+	CUAC_Thread* m_pUacPasteThread;
 
 	int m_activeGroupId;
 	DWORD m_activeGroupStartTime;

+ 238 - 235
MainFrmThread.cpp

@@ -1,236 +1,239 @@
-#include "stdafx.h"
-#include "MainFrmThread.h"
-#include "DatabaseUtilities.h"
-#include "Options.h"
-#include "Misc.h"
-#include "cp_main.h"
-
-CMainFrmThread::CMainFrmThread(void)
-{
-	m_threadName = "CMainFrmThread";
-    for(int eventEnum = 0; eventEnum < ECMAINFRMTHREADEVENTS_COUNT; eventEnum++)
-    {
-        AddEvent(eventEnum);
-    }
-}
-
-CMainFrmThread::~CMainFrmThread(void)
-{
-
-}
-
-void CMainFrmThread::AddClipToSave(CClip *pClip)
-{
-	ATL::CCritSecLock csLock(m_cs.m_sect);
-
-	Log(_T("Adding clip to thread for save to db"));
-	m_saveClips.AddTail(pClip);
-	FireEvent(SAVE_CLIPS);
-}
-
-void CMainFrmThread::AddRemoteClipToSave(CClipList *pClipList)
-{
-	ATL::CCritSecLock csLock(m_cs.m_sect);
-
-	Log(_T("Adding REMOTE clip to thread for save to db"));
-	
-	POSITION pos = pClipList->GetHeadPosition();
-	while(pos)
-	{
-		CClip *pClip = pClipList->GetNext(pos);
-		m_saveRemoteClips.AddTail(pClip);
-	}
-
-	//local cliplist now owns the clip memory
-	pClipList->RemoveAll();
-	
-	FireEvent(SAVE_REMOTE_CLIPS);
-}
-
-void CMainFrmThread::OnEvent(int eventId, void *param)
-{
-    switch((eCMainFrmThreadEvents)eventId)
-    {
-        case DELETE_ENTRIES:
-            OnDeleteEntries();
-            break;
-        case REMOVE_TEMP_FILES:
-            OnRemoveTempFiles();
-            break;
-		case SAVE_CLIPS:
-			OnSaveClips();
-			break;
-		case SAVE_REMOTE_CLIPS:
-			OnSaveRemoteClips();
-			break;
-		case READ_DB_FILE:
-			OnReadDbFile();
-			break;
-    }
-}
-
-//try and keep our db file in windows cache by randomly reading some data
-//not sure if this does what i think it does but looking into issues with slow access on large dbs
-void CMainFrmThread::OnReadDbFile()
-{
-	double idle = IdleSeconds();
-
-	if (idle < CGetSetOptions::ReadRandomFileIdleMin())
-	{
-		CString dbFile = CGetSetOptions::GetDBPath();
-		__int64 dbSize = FileSize(dbFile);
-
-		srand((UINT)time(NULL));
-
-		int random = rand() % (dbSize - 1024) + 1;
-
-		CFile f;
-		if (f.Open(dbFile, CFile::modeRead | CFile::shareDenyNone))
-		{
-			f.Seek(random, 0);
-			char data[1024];
-			f.Read(&data, 1024);
-
-			f.Close();
-		}
-	}
-}
-
-void CMainFrmThread::OnDeleteEntries()
-{
-    RemoveOldEntries(true);
-}
-
-void CMainFrmThread::OnRemoveTempFiles()
-{
-	DeleteDittoTempFiles(TRUE);
-}
-
-void CMainFrmThread::OnSaveClips()
-{
-	CClipList *pLocalClips = new CClipList();
-
-	//Save the clips locally
-	{
-		ATL::CCritSecLock csLock(m_cs.m_sect);
-
-		POSITION pos;
-		CClip* pClip;
-
-		pos = m_saveClips.GetHeadPosition();
-		while(pos)
-		{
-			pClip = m_saveClips.GetNext(pos);
-			pLocalClips->AddTail(pClip);
-		}
-
-		//pLocalClips now own, the clips
-		m_saveClips.RemoveAll();
-	}
-
-	Log(_T("SaveCopyClips Before AddToDb")); 
-
-	int count = pLocalClips->AddToDB(true);
-
-	Log(StrF(_T("SaveCopyclips After AddToDb, Count: %d"), count));
-
-	if(count > 0)
-	{
-		int Id = pLocalClips->GetTail()->m_id;
-
-		Log(StrF(_T("SaveCopyclips After AddToDb, Id: %d Before OnCopyCopyCompleted"), Id));
-
-		theApp.OnCopyCompleted(Id, count);
-
-		Log(StrF(_T("SaveCopyclips After AddToDb, Id: %d After OnCopyCopyCompleted"), Id));
-
-		if (pLocalClips->GetTail()->m_copyReason == CopyReasonEnum::COPY_TO_GROUP &&
-			CGetSetOptions::GetShowMsgWndOnCopyToGroup())
-		{
-			CString groupName;
-			CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT mText FROM Main WHERE lID = %d"), pLocalClips->GetTail()->m_parentId);
-			if (q.eof() == false)
-			{
-				groupName = q.getStringField(0);
-			}
-
-			CString *pMsg = new CString();
-			pMsg->Format(_T("Saved new clip \"%s\"\r\ndirectly to the group \"%s\""), pLocalClips->GetTail()->m_Desc.Left(35), groupName);
-
-			theApp.m_pMainFrame->PostMessageW(WM_SHOW_MSG_WINDOW, (WPARAM) pMsg, pLocalClips->GetTail()->m_parentId);
-		}
-	
-		if(g_Opt.m_lAutoSendClientCount > 0)
-		{
-			m_sendToClientThread.FireSendToClient(pLocalClips);
-		}		
-	}
-
-	delete pLocalClips;
-}
-
-void CMainFrmThread::OnSaveRemoteClips()
-{
-	LogSendRecieveInfo("---------Start of OnSaveRemoteClips");
-
-	CClipList *pLocalClips = new CClipList();
-
-	//Save the clips locally
-	{
-		ATL::CCritSecLock csLock(m_cs.m_sect);
-
-		POSITION pos;
-		CClip* pClip;
-
-		pos = m_saveRemoteClips.GetHeadPosition();
-		while(pos)
-		{
-			pClip = m_saveRemoteClips.GetNext(pos);
-			pLocalClips->AddTail(pClip);
-		}
-
-		//pLocalClips now own, the clips
-		m_saveRemoteClips.RemoveAll();
-	}
-
-	LogSendRecieveInfo("---------OnSaveRemoteClips - Before AddToDB");
-
-	int count = pLocalClips->AddToDB(true);
-
-	LogSendRecieveInfo("---------OnSaveRemoteClips - After AddToDB");
-
-	//are we supposed to add this clip to the clipboard
-	CClip *pLastClip = pLocalClips->GetTail();
-	if (CGetSetOptions::GetShowMsgWhenReceivingManualSentClip())
-	{
-		if (pLastClip && (pLastClip->m_param1 & REMOTE_CLIP_MANUAL_SEND))
-		{
-			CString *pMsg = new CString();
-
-			//baloon message can only show 254 characters
-			pMsg->Format(_T("Received remote clip\r\n\r\n%s"), pLastClip->m_Desc.Left(225));
-
-			theApp.m_pMainFrame->PostMessageW(WM_SHOW_MSG_WINDOW, (WPARAM)pMsg, pLocalClips->GetTail()->m_parentId);
-		}
-	}
-
-	if(pLastClip && (pLastClip->m_param1 & REMOTE_CLIP_ADD_TO_CLIPBOARD))
-	{
-		LogSendRecieveInfo("---------OnSaveRemoteClips - Before Posting msg to main thread to set clipboard");
-
-		//set the clipboard on the main thread, i was having a problem with setting the clipboard on a thread
-		//guess it needs to be set on the main thread
-		//main window will clear this memory
-		PostMessage(theApp.m_MainhWnd, WM_LOAD_ClIP_ON_CLIPBOARD, (LPARAM)pLastClip, 0);
-
-		LogSendRecieveInfo("---------OnSaveRemoteClips - After Posting msg to main thread to set clipboard");
-
-		pLocalClips->RemoveTail();
-	}	
-
-	theApp.RefreshView();
-
-	delete pLocalClips;
-
-	LogSendRecieveInfo("---------End of OnSaveRemoteClips");
+#include "stdafx.h"
+#include "MainFrmThread.h"
+#include "DatabaseUtilities.h"
+#include "Options.h"
+#include "Misc.h"
+#include "cp_main.h"
+
+CMainFrmThread::CMainFrmThread(void)
+{
+	m_threadName = "CMainFrmThread";
+    for(int eventEnum = 0; eventEnum < ECMAINFRMTHREADEVENTS_COUNT; eventEnum++)
+    {
+        AddEvent(eventEnum);
+    }
+}
+
+CMainFrmThread::~CMainFrmThread(void)
+{
+
+}
+
+void CMainFrmThread::AddClipToSave(CClip *pClip)
+{
+	ATL::CCritSecLock csLock(m_cs.m_sect);
+
+	Log(_T("Adding clip to thread for save to db"));
+	m_saveClips.AddTail(pClip);
+	FireEvent(SAVE_CLIPS);
+}
+
+void CMainFrmThread::AddRemoteClipToSave(CClipList *pClipList)
+{
+	ATL::CCritSecLock csLock(m_cs.m_sect);
+
+	Log(_T("Adding REMOTE clip to thread for save to db"));
+	
+	POSITION pos = pClipList->GetHeadPosition();
+	while(pos)
+	{
+		CClip *pClip = pClipList->GetNext(pos);
+		m_saveRemoteClips.AddTail(pClip);
+	}
+
+	//local cliplist now owns the clip memory
+	pClipList->RemoveAll();
+	
+	FireEvent(SAVE_REMOTE_CLIPS);
+}
+
+void CMainFrmThread::OnEvent(int eventId, void *param)
+{
+    switch((eCMainFrmThreadEvents)eventId)
+    {
+        case DELETE_ENTRIES:
+            OnDeleteEntries();
+            break;
+        case REMOVE_TEMP_FILES:
+            OnRemoveTempFiles();
+            break;
+		case SAVE_CLIPS:
+			OnSaveClips();
+			break;
+		case SAVE_REMOTE_CLIPS:
+			OnSaveRemoteClips();
+			break;
+		case READ_DB_FILE:
+			OnReadDbFile();
+			break;
+    }
+}
+
+//try and keep our db file in windows cache by randomly reading some data
+//not sure if this does what i think it does but looking into issues with slow access on large dbs
+void CMainFrmThread::OnReadDbFile()
+{
+	double idle = IdleSeconds();
+
+	if (idle < CGetSetOptions::ReadRandomFileIdleMin())
+	{
+		CString dbFile = CGetSetOptions::GetDBPath();
+		__int64 dbSize = FileSize(dbFile);
+
+		srand((UINT)time(NULL));
+
+		int random = rand() % (dbSize - 1024) + 1;
+
+		CFile f;
+		if (f.Open(dbFile, CFile::modeRead | CFile::shareDenyNone))
+		{
+			f.Seek(random, 0);
+			char data[1024];
+			f.Read(&data, 1024);
+
+			f.Close();
+		}
+	}
+}
+
+void CMainFrmThread::OnDeleteEntries()
+{
+    RemoveOldEntries(true);
+}
+
+void CMainFrmThread::OnRemoveTempFiles()
+{
+	DeleteDittoTempFiles(TRUE);
+}
+
+void CMainFrmThread::OnSaveClips()
+{
+	CClipList *pLocalClips = new CClipList();
+
+	CopyReasonEnum::CopyReason copyReason = CopyReasonEnum::COPY_TO_UNKOWN;
+
+	//Save the clips locally
+	{
+		ATL::CCritSecLock csLock(m_cs.m_sect);
+
+		POSITION pos;
+		CClip* pClip;
+
+		pos = m_saveClips.GetHeadPosition();
+		while(pos)
+		{
+			pClip = m_saveClips.GetNext(pos);
+			copyReason = pClip->m_copyReason;
+			pLocalClips->AddTail(pClip);
+		}
+
+		//pLocalClips now own, the clips
+		m_saveClips.RemoveAll();
+	}
+
+	Log(_T("SaveCopyClips Before AddToDb")); 
+
+	int count = pLocalClips->AddToDB(true);
+
+	Log(StrF(_T("SaveCopyclips After AddToDb, Count: %d"), count));
+
+	if(count > 0)
+	{
+		int Id = pLocalClips->GetTail()->m_id;
+
+		Log(StrF(_T("SaveCopyclips After AddToDb, Id: %d Before OnCopyCopyCompleted"), Id));
+
+		theApp.OnCopyCompleted(Id, count, copyReason);
+
+		Log(StrF(_T("SaveCopyclips After AddToDb, Id: %d After OnCopyCopyCompleted"), Id));
+
+		if (pLocalClips->GetTail()->m_copyReason == CopyReasonEnum::COPY_TO_GROUP &&
+			CGetSetOptions::GetShowMsgWndOnCopyToGroup())
+		{
+			CString groupName;
+			CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT mText FROM Main WHERE lID = %d"), pLocalClips->GetTail()->m_parentId);
+			if (q.eof() == false)
+			{
+				groupName = q.getStringField(0);
+			}
+
+			CString *pMsg = new CString();
+			pMsg->Format(_T("Saved new clip \"%s\"\r\ndirectly to the group \"%s\""), pLocalClips->GetTail()->m_Desc.Left(35), groupName);
+
+			theApp.m_pMainFrame->PostMessageW(WM_SHOW_MSG_WINDOW, (WPARAM) pMsg, pLocalClips->GetTail()->m_parentId);
+		}
+	
+		if(g_Opt.m_lAutoSendClientCount > 0)
+		{
+			m_sendToClientThread.FireSendToClient(pLocalClips);
+		}		
+	}
+
+	delete pLocalClips;
+}
+
+void CMainFrmThread::OnSaveRemoteClips()
+{
+	LogSendRecieveInfo("---------Start of OnSaveRemoteClips");
+
+	CClipList *pLocalClips = new CClipList();
+
+	//Save the clips locally
+	{
+		ATL::CCritSecLock csLock(m_cs.m_sect);
+
+		POSITION pos;
+		CClip* pClip;
+
+		pos = m_saveRemoteClips.GetHeadPosition();
+		while(pos)
+		{
+			pClip = m_saveRemoteClips.GetNext(pos);
+			pLocalClips->AddTail(pClip);
+		}
+
+		//pLocalClips now own, the clips
+		m_saveRemoteClips.RemoveAll();
+	}
+
+	LogSendRecieveInfo("---------OnSaveRemoteClips - Before AddToDB");
+
+	int count = pLocalClips->AddToDB(true);
+
+	LogSendRecieveInfo("---------OnSaveRemoteClips - After AddToDB");
+
+	//are we supposed to add this clip to the clipboard
+	CClip *pLastClip = pLocalClips->GetTail();
+	if (CGetSetOptions::GetShowMsgWhenReceivingManualSentClip())
+	{
+		if (pLastClip && (pLastClip->m_param1 & REMOTE_CLIP_MANUAL_SEND))
+		{
+			CString *pMsg = new CString();
+
+			//baloon message can only show 254 characters
+			pMsg->Format(_T("Received remote clip\r\n\r\n%s"), pLastClip->m_Desc.Left(225));
+
+			theApp.m_pMainFrame->PostMessageW(WM_SHOW_MSG_WINDOW, (WPARAM)pMsg, pLocalClips->GetTail()->m_parentId);
+		}
+	}
+
+	if(pLastClip && (pLastClip->m_param1 & REMOTE_CLIP_ADD_TO_CLIPBOARD))
+	{
+		LogSendRecieveInfo("---------OnSaveRemoteClips - Before Posting msg to main thread to set clipboard");
+
+		//set the clipboard on the main thread, i was having a problem with setting the clipboard on a thread
+		//guess it needs to be set on the main thread
+		//main window will clear this memory
+		PostMessage(theApp.m_MainhWnd, WM_LOAD_ClIP_ON_CLIPBOARD, (LPARAM)pLastClip, 0);
+
+		LogSendRecieveInfo("---------OnSaveRemoteClips - After Posting msg to main thread to set clipboard");
+
+		pLocalClips->RemoveTail();
+	}	
+
+	theApp.RefreshView();
+
+	delete pLocalClips;
+
+	LogSendRecieveInfo("---------End of OnSaveRemoteClips");
 }

+ 2 - 1
Misc.h

@@ -35,7 +35,8 @@ public:
 	{ 
 		COPY_TO_UNKOWN,
 		COPY_TO_GROUP,
-		COPY_TO_BUFFER
+		COPY_TO_BUFFER,
+		COPY_FROM_TOOLTIP
 	};
 };
 

+ 7 - 4
QListCtrl.cpp

@@ -916,7 +916,7 @@ bool CQListCtrl::ShowFullDescription(bool bFromAuto, bool fromNextPrev)
 	GetToolTipText(nItem, csDescription);
 
 	if (m_pToolTip == NULL ||
-		fromNextPrev == false ||
+		//fromNextPrev == false ||
 		::IsWindow(m_toolTipHwnd) == FALSE)
 	{
 		if (m_pToolTip != NULL)
@@ -931,9 +931,12 @@ bool CQListCtrl::ShowFullDescription(bool bFromAuto, bool fromNextPrev)
 	}
 	else if (VALID_TOOLTIP)
 	{
-		CRect r;
-		m_pToolTip->GetWindowRectEx(r);
-		pt = r.TopLeft();
+		if (fromNextPrev)
+		{
+			CRect r;
+			m_pToolTip->GetWindowRectEx(r);
+			pt = r.TopLeft();
+		}
 
 		m_pToolTip->SetGdiplusBitmap(NULL);
 		m_pToolTip->SetRTFText("");

+ 19 - 4
QPasteWnd.cpp

@@ -84,6 +84,7 @@ CQPasteWnd::CQPasteWnd()
 	m_extraDataCounter = 0;
 	m_noSearchResults = false;
 	m_lastDbWrite = 0;
+	m_pendingRefresh = false;
 }
 
 CQPasteWnd::~CQPasteWnd()
@@ -832,7 +833,7 @@ BOOL CQPasteWnd::HideQPasteWindow(bool releaseFocus, bool clearSearchData)
 		m_search.SetWindowText(_T(""));
 		m_bHandleSearchTextChange = true;
 
-		if (m_strSQLSearch.IsEmpty() == FALSE)
+		if (m_strSQLSearch.IsEmpty() == FALSE || m_pendingRefresh)
 		{
 			{
 				ATL::CCritSecLock csLock(m_CritSection.m_sect);
@@ -862,6 +863,8 @@ BOOL CQPasteWnd::HideQPasteWindow(bool releaseFocus, bool clearSearchData)
 		theApp.TryEnterOldGroupState();
 	}
 
+	m_pendingRefresh = false;
+
 	DWORD endTick = GetTickCount();
 	if ((endTick - startTick) > 150)
 		Log(StrF(_T("Paste Timing HideQPasteWindow: %d"), endTick - startTick));
@@ -1213,6 +1216,16 @@ LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
 	// remove all additional refresh view messages from the queue
 	while (::PeekMessage(&msg, m_hWnd, WM_REFRESH_VIEW, WM_REFRESH_VIEW, PM_REMOVE)) {}
 
+	if (theApp.m_bShowingQuickPaste)
+	{
+		CopyReasonEnum::CopyReason copyReason = (CopyReasonEnum::CopyReason)wParam;
+		if (copyReason == CopyReasonEnum::COPY_FROM_TOOLTIP)
+		{
+			m_pendingRefresh = true;
+			return FALSE;
+		}
+	}
+
 	Log(_T("OnRefreshView - Start"));
 	CString action;
 
@@ -1224,8 +1237,8 @@ LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
 
 	if (theApp.m_bShowingQuickPaste)
 	{
-		FillList();
-		action = _T("Filled List");
+		FillList(_T(""));
+		action = _T("Filled List");		
 	}
 	else
 	{
@@ -1314,10 +1327,12 @@ void CQPasteWnd::UpdateStatus(bool bRepaintImmediately)
 	SetCustomWindowTitle(windowTitle);
 }
 
-BOOL CQPasteWnd::FillList(CString csSQLSearch /*=""*/)
+BOOL CQPasteWnd::FillList(CString csSQLSearch)
 {
 	KillTimer(TIMER_DO_SEARCH);
+	
 	m_lstHeader.HidePopup(true);
+	
 
 	Log(StrF(_T("Start Fill List - %s"), csSQLSearch));
 

+ 1 - 0
QPasteWnd.h

@@ -174,6 +174,7 @@ public:
 	bool m_noSearchResults;
 	CAccel m_timerAction;
 	__int64 m_lastDbWrite;
+	bool m_pendingRefresh;
 
     void RefreshNc();
     void UpdateStatus(bool bRepaintImmediately = false); // regenerates the status (caption) text

+ 1 - 0
ToolTipEx.cpp

@@ -383,6 +383,7 @@ BOOL CToolTipEx::PreTranslateMessage(MSG *pMsg)
                 if(GetKeyState(VK_CONTROL) &0x8000)
                 {
                     m_RichEdit.Copy();
+					theApp.SetCopyReason(CopyReasonEnum::COPY_FROM_TOOLTIP);
 					return TRUE;
                 }
                 break;