Преглед на файлове

Added commands to export bitmaps to file and to export clip to google translate

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@760 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden преди 10 години
родител
ревизия
16875bf7b4
променени са 9 файла, в които са добавени 306 реда и са изтрити 8 реда
  1. 3 0
      ActionEnums.h
  2. 2 0
      CP_Main.rc
  3. 78 1
      Misc.cpp
  4. 4 0
      Misc.h
  5. 5 0
      Options.cpp
  6. 2 2
      Options.h
  7. 198 2
      QPasteWnd.cpp
  8. 6 0
      QPasteWnd.h
  9. 8 3
      Resource.h

+ 3 - 0
ActionEnums.h

@@ -41,6 +41,9 @@ public:
 		SELECT_RIGHT_SITE_AND_DO_COMPARE,
 		EXPORT_TO_TEXT_FILE,
 		EXPORT_TO_QR_CODE,
+		EXPORT_TO_GOOGLE_TRANSLATE,
+		EXPORT_TO_BITMAP_FILE,
+
 	};
 };
 

+ 2 - 0
CP_Main.rc

@@ -314,6 +314,8 @@ BEGIN
             MENUITEM "Export Clip(s)",              32853,MFT_STRING,MFS_ENABLED
             MENUITEM "View as QRCode",              ID_MENU_VIEWASQRCODE,MFT_STRING,MFS_ENABLED
             MENUITEM "Export Clip(s) to Text File", ID_EXPORT_EXPORTTOTEXTFILE,MFT_STRING,MFS_ENABLED
+            MENUITEM "Export Clip(s) to Bitmap File", ID_IMPORT_EXPORTCLIP_BITMAP,MFT_STRING,MFS_ENABLED
+            MENUITEM "Export to Google Translate",  ID_IMPORT_EXPORTTOGOOGLETRANSLATE,MFT_STRING,MFS_ENABLED
         END
         MENUITEM MFT_SEPARATOR
         MENUITEM "Options...",                  32805,MFT_STRING,MFS_ENABLED

+ 78 - 1
Misc.cpp

@@ -5,6 +5,7 @@
 #include "shared/TextConvert.h"
 #include "AlphaBlend.h"
 #include "Tlhelp32.h"
+#include <Wininet.h>
 
 CString GetIPAddress()
 {
@@ -1135,4 +1136,80 @@ void OnInitMenuPopupEx(CMenu *pPopupMenu, UINT nIndex, BOOL bSysMenu, CWnd *pWnd
 		}
 		state.m_nIndexMax = nCount;
 	}
-} 
+} 
+
+CString InternetEncode(CString text)
+{
+	CString ret = _T("");
+	LPTSTR lpOutputBuffer = new TCHAR[1];
+	DWORD dwSize = 1;
+	BOOL fRes = ::InternetCanonicalizeUrl(text, lpOutputBuffer, &dwSize, ICU_DECODE | ICU_NO_ENCODE);
+	DWORD dwError = ::GetLastError();
+	if (!fRes && dwError == ERROR_INSUFFICIENT_BUFFER)
+	{
+		delete lpOutputBuffer;
+		lpOutputBuffer = new TCHAR[dwSize];
+		fRes = ::InternetCanonicalizeUrl(text, lpOutputBuffer, &dwSize, ICU_DECODE | ICU_NO_ENCODE);
+		if (fRes)
+		{
+			ret = lpOutputBuffer;
+			//lpOutputBuffer has decoded url
+		}
+		else
+		{
+			//failed to decode
+		}
+		if (lpOutputBuffer != NULL)
+		{
+			delete [] lpOutputBuffer;
+			lpOutputBuffer = NULL;
+		}
+	}
+	else
+	{
+		//some other error OR the input string url is just 1 char and was successfully decoded
+	}
+
+	return ret;
+}
+
+bool WriteCF_DIBToFile(CString csPath, LPVOID data, ULONG size)
+{
+	bool bRet = false;
+	CFile file;
+	CFileException ex;
+	if (file.Open(csPath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, &ex))
+	{
+		BITMAPINFO *lpBI = (BITMAPINFO *) data;
+
+		int nPaletteEntries = 1 << lpBI->bmiHeader.biBitCount;
+		if (lpBI->bmiHeader.biBitCount > 8)
+			nPaletteEntries = 0;
+		else if (lpBI->bmiHeader.biClrUsed != 0)
+			nPaletteEntries = lpBI->bmiHeader.biClrUsed;
+
+		BITMAPFILEHEADER BFH;
+		memset(&BFH, 0, sizeof(BITMAPFILEHEADER));
+		BFH.bfType = 'MB';
+		BFH.bfSize = sizeof(BITMAPFILEHEADER) + size;
+		BFH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nPaletteEntries * sizeof(RGBQUAD);
+
+		file.Write(&BFH, sizeof(BITMAPFILEHEADER));
+		file.Write(data, size);
+
+		file.Close();
+
+		bRet = true;
+	}
+	else
+	{
+		CString csError;
+		TCHAR exError[250];
+		ex.GetErrorMessage(exError, sizeof(exError));
+
+		csError.Format(_T("OutLookExpress Addin - Failed to write CF_DIB to file: %s, Error: %s"), csPath, exError);
+		OutputDebugString(csPath);
+	}
+
+	return bRet;
+}

+ 4 - 0
Misc.h

@@ -146,4 +146,8 @@ int FindNoCaseAndInsert(CString& mainStr, CString& findStr, CString preInsert, C
 
 void OnInitMenuPopupEx(CMenu *pPopupMenu, UINT nIndex, BOOL bSysMenu, CWnd *pWnd);
 
+CString InternetEncode(CString text);
+
+bool WriteCF_DIBToFile(CString csPath, LPVOID data, ULONG size);
+
 #endif // !defined(AFX_CP_GUI_GLOBALS__FBCDED09_A6F2_47EB_873F_50A746EBC86B__INCLUDED_)

+ 5 - 0
Options.cpp

@@ -2174,6 +2174,11 @@ int CGetSetOptions::GetQRCodeBorderPixels()
 	return GetProfileLong(_T("QRCodeBorderPixels"), 30);
 }
 
+CString	CGetSetOptions::GetTranslateUrl()
+{
+	return GetProfileString(_T("TranslateUrl"), _T("https://translate.google.com/?tl=en#auto/en/%s"));
+}
+
 void CGetSetOptions::SetNetworkReadTimeoutMS(int val)
 {
 	SetProfileLong(_T("NetworkReadTimeoutMS"), val);

+ 2 - 2
Options.h

@@ -467,13 +467,13 @@ public:
 	static BOOL GetRegExTextSearch();
 	static void SetRegExTextSearch(BOOL val);
 
+	static CString GetTranslateUrl();
+
 	static void SetNetworkReadTimeoutMS(int val);
 	static int GetNetworkReadTimeoutMS();
 
 	static void SetRequestFilesUsingIP(int val);
 	static int GetRequestFilesUsingIP();
-
-
 };
 
 // global for easy access and for initialization of fast access variables

+ 198 - 2
QPasteWnd.cpp

@@ -221,7 +221,14 @@ ON_MESSAGE(NM_SHOW_PROPERTIES, OnShowProperties)
 ON_MESSAGE(NM_NEW_GROUP, OnNewGroup)
 ON_MESSAGE(NM_DELETE_ID, OnDeleteId)
 ON_COMMAND(ID_MENU_REGULAREXPRESSIONSEARCH, &CQPasteWnd::OnMenuRegularexpressionsearch)
+
+ON_COMMAND(ID_IMPORT_EXPORTTOGOOGLETRANSLATE, &CQPasteWnd::OnImportExporttogoogletranslate)
+ON_UPDATE_COMMAND_UI(ID_IMPORT_EXPORTTOGOOGLETRANSLATE, &CQPasteWnd::OnUpdateImportExporttogoogletranslate)
+ON_COMMAND(ID_IMPORT_EXPORTCLIP_BITMAP, &CQPasteWnd::OnImportExportclipBitmap)
+ON_UPDATE_COMMAND_UI(ID_IMPORT_EXPORTCLIP_BITMAP, &CQPasteWnd::OnUpdateImportExportclipBitmap)
+
 ON_COMMAND(ID_MENU_WILDCARDSEARCH, &CQPasteWnd::OnMenuWildcardsearch)
+
 END_MESSAGE_MAP()
 
 
@@ -2715,7 +2722,13 @@ bool CQPasteWnd::DoAction(DWORD actionId)
 		ret = DoExportToTextFile();
 		break;
 	case ActionEnums::EXPORT_TO_QR_CODE:
-		return DoExportToQRCode();
+		ret = DoExportToQRCode();
+		break;
+	case ActionEnums::EXPORT_TO_GOOGLE_TRANSLATE:
+		ret = DoExportToGoogleTranslate();
+		break;
+	case ActionEnums::EXPORT_TO_BITMAP_FILE:
+		ret = DoExportToBitMapFile();
 		break;
 	}
 
@@ -3276,7 +3289,7 @@ bool CQPasteWnd::DoClipCompare()
 		{
 			CClipCompare compare;
 			compare.Compare(IDs[0], IDs[1]);
-
+			
 			return true;
 		}
 		else
@@ -3481,6 +3494,155 @@ bool CQPasteWnd::DoExportToQRCode()
 	return ret;
 }
 
+bool CQPasteWnd::DoExportToGoogleTranslate()
+{
+	bool ret = false;
+
+	ARRAY IDs;
+	m_lstHeader.GetSelectionItemData(IDs);
+
+	if (IDs.GetCount() > 0)
+	{
+		int id = IDs[0];
+		CClip clip;
+		if (clip.LoadMainTable(id))
+		{
+			if (clip.LoadFormats(id, true))
+			{
+				CString clipText = clip.GetUnicodeTextFormat();
+				if(clipText == _T(""))
+				{
+					CStringA aText = clip.GetCFTextTextFormat();
+					if(aText != _T(""))
+					{
+						clipText = CTextConvert::MultiByteToUnicodeString(aText);
+					}
+				}
+
+				if (clipText != _T(""))
+				{
+					CString clipTextUrlEncoded = InternetEncode(clipText);
+
+					CString url;
+					url.Format(CGetSetOptions::GetTranslateUrl(), clipTextUrlEncoded);
+
+					CHyperLink::GotoURL(url, SW_SHOW);
+
+					ret = true;
+				}
+			}
+		}
+	}
+
+	return true;
+}
+
+bool CQPasteWnd::DoExportToBitMapFile()
+{
+	bool ret = false;
+
+	CClipIDs IDs;
+	INT_PTR lCount = m_lstHeader.GetSelectedCount();
+	if (lCount <= 0)
+	{
+		return ret;
+	}
+
+	m_lstHeader.GetSelectionItemData(IDs);
+	lCount = IDs.GetSize();
+	if (lCount <= 0)
+	{
+		return ret;
+	}
+
+	OPENFILENAME ofn;
+	TCHAR szFile[400];
+	TCHAR szDir[400];
+
+	memset(&szFile, 0, sizeof(szFile));
+	memset(szDir, 0, sizeof(szDir));
+	memset(&ofn, 0, sizeof(ofn));
+
+	CString csInitialDir = CGetSetOptions::GetLastImportDir();
+	STRCPY(szDir, csInitialDir);
+
+	ofn.lStructSize = sizeof(OPENFILENAME);
+	ofn.hwndOwner = m_hWnd;
+	ofn.lpstrFile = szFile;
+	ofn.nMaxFile = sizeof(szFile);
+	ofn.lpstrFilter = _T("Exported Ditto Clips (.bmp)\0*.bmp\0\0");
+	ofn.nFilterIndex = 1;
+	ofn.lpstrFileTitle = NULL;
+	ofn.nMaxFileTitle = 0;
+	ofn.lpstrInitialDir = szDir;
+	ofn.lpstrDefExt = _T("txt");
+	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
+
+	m_bHideWnd = false;
+
+	if (GetSaveFileName(&ofn))
+	{
+		using namespace nsPath;
+		CString startingFilePath = ofn.lpstrFile;
+		CPath path(ofn.lpstrFile);
+		CString csPath = path.GetPath();
+		CString csExt = path.GetExtension();
+		path.RemoveExtension();
+		CString csFileName = path.GetName();
+
+		CGetSetOptions::SetLastExportDir(csPath);
+
+		for (int i = 0; i < IDs.GetCount(); i++)
+		{
+			int id = IDs[i];
+
+			HGLOBAL dibGlobal = CClip::LoadFormat(id, CF_DIB);
+			if (dibGlobal != NULL)
+			{
+				CString savePath = startingFilePath;
+				if (IDs.GetCount() > 1 ||
+					FileExists(startingFilePath))
+				{
+					savePath = _T("");
+
+					for (int y = 1; y < 1001; y++)
+					{
+						CString testFilePath;
+						testFilePath.Format(_T("%s%s_%d.%s"), csPath, csFileName, y, csExt);
+						if (FileExists(testFilePath) == FALSE)
+						{
+							savePath = testFilePath;
+							break;
+						}
+					}
+				}
+
+				if (savePath != _T(""))
+				{
+					LPVOID pvData = GlobalLock(dibGlobal);
+					ULONG size = (ULONG) GlobalSize(dibGlobal);
+					
+					WriteCF_DIBToFile(savePath, pvData, size);
+
+					GlobalUnlock(dibGlobal);
+
+					ret = true;
+				}
+				else
+				{
+					Log(StrF(_T("Failed to find a valid file name for starting path: %s"), startingFilePath));
+				}
+
+				::GlobalFree(dibGlobal);
+			}
+		}
+	}
+
+	m_bHideWnd = true;
+
+	return ret;
+}
+
 LRESULT CQPasteWnd::OnCancelFilter(WPARAM wParam, LPARAM lParam)
 {
 	this->DoAction(ActionEnums::CANCELFILTER);
@@ -4653,8 +4815,42 @@ void CQPasteWnd::OnMenuRegularexpressionsearch()
 	CGetSetOptions::SetRegExTextSearch(!CGetSetOptions::GetRegExTextSearch());
 }
 
+
+void CQPasteWnd::OnImportExporttogoogletranslate()
+{
+	DoAction(ActionEnums::EXPORT_TO_GOOGLE_TRANSLATE);
+}
+
+void CQPasteWnd::OnUpdateImportExporttogoogletranslate(CCmdUI *pCmdUI)
+{
+	if (!pCmdUI->m_pMenu)
+	{
+		return;
+	}
+
+	UpdateMenuShortCut(pCmdUI, ActionEnums::EXPORT_TO_GOOGLE_TRANSLATE);
+}
+
+
+void CQPasteWnd::OnImportExportclipBitmap()
+{
+	DoAction(ActionEnums::EXPORT_TO_BITMAP_FILE);
+}
+
+
+void CQPasteWnd::OnUpdateImportExportclipBitmap(CCmdUI *pCmdUI)
+{
+	if (!pCmdUI->m_pMenu)
+	{
+		return;
+	}
+
+	UpdateMenuShortCut(pCmdUI, ActionEnums::EXPORT_TO_BITMAP_FILE);
+}
+
 void CQPasteWnd::OnMenuWildcardsearch()
 {
 	CGetSetOptions::SetSimpleTextSearch(FALSE);
 	CGetSetOptions::SetRegExTextSearch(FALSE);
 }
+

+ 6 - 0
QPasteWnd.h

@@ -244,6 +244,8 @@ public:
 	bool DoSelectRightSideAndDoCompare();
 	bool DoExportToQRCode();
 	bool DoExportToTextFile();
+	bool DoExportToGoogleTranslate();
+	bool DoExportToBitMapFile();
 
 	void UpdateMenuShortCut(CCmdUI *pCmdUI, DWORD action);
 
@@ -400,5 +402,9 @@ public:
 	afx_msg LRESULT OnNewGroup(WPARAM wParam, LPARAM lParam);
 	afx_msg LRESULT OnDeleteId(WPARAM wParam, LPARAM lParam);
 	afx_msg void OnMenuRegularexpressionsearch();
+	afx_msg void OnImportExporttogoogletranslate();
+	afx_msg void OnUpdateImportExporttogoogletranslate(CCmdUI *pCmdUI);
+	afx_msg void OnImportExportclipBitmap();
+	afx_msg void OnUpdateImportExportclipBitmap(CCmdUI *pCmdUI);
 	afx_msg void OnMenuWildcardsearch();
 };

+ 8 - 3
Resource.h

@@ -497,7 +497,11 @@
 #define ID_MENU_DELETEGROUP             32897
 #define ID_MENU_PROPERTIES32898         32898
 #define ID_MENU_REGULAREXPRESSIONSEARCH 32899
-#define ID_MENU_WILDCARDSEARCH          32900
+#define ID_IMPORT_EXPORTTOGOOGLETRANSLATE 32900
+#define ID_IMPORT_EXPORTCLIP            32901
+#define ID_IMPORT_EXPORTCLIP_BITMAP     32902
+#define ID_MENU_WILDCARDSEARCH          32903
+
 
 // Next default values for new objects
 // 
@@ -505,8 +509,9 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
 #define _APS_NEXT_RESOURCE_VALUE        240
-#define _APS_NEXT_COMMAND_VALUE         32901
-#define _APS_NEXT_CONTROL_VALUE         2131
+
+#define _APS_NEXT_COMMAND_VALUE         32904
+#define _APS_NEXT_CONTROL_VALUE         2127
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif