#include "stdafx.h" #include "clip.h" #include "CP_Main.h" #include "shared/TextConvert.h" #include ".\dittorulerricheditctrl.h" #include "CopyProperties.h" CDittoRulerRichEditCtrl::CDittoRulerRichEditCtrl(void) { m_SaveTypes = stCF_UNICODETEXT|stCF_TEXT|stRTF; m_lID = -1; } CDittoRulerRichEditCtrl::~CDittoRulerRichEditCtrl(void) { } bool CDittoRulerRichEditCtrl::LoadItem(long lID, CString csDesc) { bool bSetText = false; CClipFormat Clip; m_lID = lID; m_csDescription = csDesc; //If creating a new clip if(m_lID < 0) { m_rtf.SetModify(FALSE); return false; } Clip.m_cfType = RegisterClipboardFormat(CF_RTF); if(theApp.GetClipData(lID, Clip) && Clip.m_hgData) { LPVOID pvData = GlobalLock(Clip.m_hgData); if(pvData) { SetRTF((char*)pvData); bSetText = true; } GlobalUnlock(Clip.m_hgData); Clip.Free(); Clip.Clear(); } if(bSetText == false) { Clip.m_cfType = CF_UNICODETEXT; if(theApp.GetClipData(lID, Clip) && Clip.m_hgData) { LPVOID pvData = GlobalLock(Clip.m_hgData); if(pvData) { CString csText = (WCHAR*)pvData; SetText(csText); bSetText = true; } GlobalUnlock(Clip.m_hgData); Clip.Free(); Clip.Clear(); } } if(bSetText == false) { Clip.m_cfType = CF_TEXT; if(theApp.GetClipData(lID, Clip) && Clip.m_hgData) { LPVOID pvData = GlobalLock(Clip.m_hgData); if(pvData) { CString csText = (char*)pvData; SetText(csText); bSetText = true; } GlobalUnlock(Clip.m_hgData); Clip.Free(); Clip.Clear(); } } m_rtf.SetModify(FALSE); return bSetText; } long CDittoRulerRichEditCtrl::GetTypeFlags(long lID) { long lRet = stNONE; try { CLIPFORMAT cfType = CF_TEXT; CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID FROM Data WHERE lParentID = %d AND strClipboardFormat = '%s'"), lID, GetFormatName(cfType)); if(q.eof() == false) { lRet |= stCF_TEXT; } cfType = CF_UNICODETEXT; q = theApp.m_db.execQueryEx(_T("SELECT lID FROM Data WHERE lParentID = %d AND strClipboardFormat = '%s'"), lID, GetFormatName(cfType)); if(q.eof() == false) { lRet |= stCF_UNICODETEXT; } cfType = RegisterClipboardFormat(_T("Rich Text Format")); q = theApp.m_db.execQueryEx(_T("SELECT lID FROM Data WHERE lParentID = %d AND strClipboardFormat = '%s'"), lID, GetFormatName(cfType)); if(q.eof() == false) { lRet |= stRTF; } } CATCH_SQLITE_EXCEPTION return lRet; } void CDittoRulerRichEditCtrl::d() { CString cs = m_rtf.GetText(); CString s; s.Format(_T("error = %d, %s"), GetLastError(), cs); MessageBox(s); } int CDittoRulerRichEditCtrl::SaveToDB(BOOL bUpdateDesc) { int nRet = FALSE; if(m_SaveTypes == stNONE && m_lID >= 0) { return DIDNT_NEED_TO_SAVE; } if(m_rtf.GetModify() == FALSE) { Log(_T("Clip has not been modified")); return DIDNT_NEED_TO_SAVE; } bool bSetModifyToFalse = true; try { CClip Clip; Clip.m_id = m_lID; if(m_SaveTypes & stRTF) { LoadRTFData(Clip); } if(m_SaveTypes & stCF_TEXT || m_SaveTypes & stCF_UNICODETEXT) { LoadTextData(Clip); } if(Clip.m_Formats.GetSize() <= 0) { return FALSE; } theApp.m_db.execDML(_T("begin transaction;")); if(m_lID >= 0) { Clip.SaveFromEditWnd(bUpdateDesc); } else { bSetModifyToFalse = false; Clip.MakeLatestOrder(); CCopyProperties Prop(-1, this, &Clip); Prop.SetHandleKillFocus(true); Prop.SetToTopMost(false); if(Prop.DoModal() == IDOK) { Clip.AddToDB(); m_csDescription = Clip.m_Desc; m_lID = Clip.m_id; bUpdateDesc = TRUE; bSetModifyToFalse = true; } } nRet = SAVED_CLIP_TO_DB; theApp.m_db.execDML(_T("commit transaction;")); if(bUpdateDesc) theApp.RefreshView(); } CATCH_SQLITE_EXCEPTION if(bSetModifyToFalse) m_rtf.SetModify(FALSE); return nRet; } bool CDittoRulerRichEditCtrl::LoadRTFData(CClip &Clip) { CString csRTFOriginal = GetRTF(); if(csRTFOriginal.IsEmpty()) { Log(_T("Rtf is empty, returning")); return false; } //remove the line feed at the end, not sure why the righ text always adds this CString right = csRTFOriginal.Right(9); if (right == _T("\\par\r\n}\r\n")) { CString r = csRTFOriginal.Left(csRTFOriginal.GetLength() - 9); r += _T("}"); csRTFOriginal = r; } CStringA csRTF = CTextConvert::ConvertToChar(csRTFOriginal); CClipFormat format; format.m_cfType = RegisterClipboardFormat(_T("Rich Text Format")); int nLength = csRTF.GetLength() + 1; format.m_hgData = NewGlobalP(csRTF.GetBuffer(nLength), nLength); Clip.m_Formats.Add(format); format.m_hgData = NULL; //Clip.m_formats owns data now return true; } bool CDittoRulerRichEditCtrl::LoadTextData(CClip &Clip) { CString csText = GetText(); if(csText.IsEmpty()) { for(int i = 0; i < 20; i++) { Sleep(100); csText = GetText(); if(csText.IsEmpty() == FALSE) break; Log(StrF(_T("Get Text still empty pass = %d"), i)); } if(csText.IsEmpty()) { Log(_T("Get Text still empty pass returning")); return false; } } CClipFormat format; #ifdef _UNICODE format.m_cfType = CF_UNICODETEXT; #else format.m_cfType = CF_TEXT; #endif int nLength = csText.GetLength() * sizeof(TCHAR) + sizeof(TCHAR); format.m_hgData = NewGlobalP(csText.GetBuffer(nLength), nLength); Clip.SetDescFromText(format.m_hgData, true); m_csDescription = Clip.m_Desc; m_csDescription = m_csDescription.Left(15); Clip.m_Formats.Add(format); format.m_hgData = NULL; //Clip.m_formats owns data now return true; } bool CDittoRulerRichEditCtrl::CloseEdit(bool bPrompt, BOOL bUpdateDesc) { if(m_rtf.GetModify()) { int nRet = IDYES; if(bPrompt) { CString cs; cs.Format(_T("%s '%s'"), theApp.m_Language.GetString("SaveChanges", "Do you want to save changes to"), m_csDescription); ::SetForegroundWindow(m_hWnd); nRet = MessageBox(cs, _T("Ditto"), MB_YESNOCANCEL); } if(nRet == IDYES) { if(SaveToDB(bUpdateDesc) == false) { CString cs; cs.Format(_T("%s '%s'"), theApp.m_Language.GetString("ErrorSaving", "Error saving clip"), m_csDescription); MessageBox(cs, _T("Ditto"), MB_OK); } } else if(nRet == IDCANCEL) { return false; } } return true; }