From 3182d972021c69dc23d6a7968dc0d141032b4acc Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Wed, 4 May 2011 19:22:26 +0000 Subject: added PackUpdater added TranslitSwitcher git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@69 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- TranslitSwitcher/Src/Layoutproc.cpp | 870 ++++++++++++++++++++++++++++++++++++ 1 file changed, 870 insertions(+) create mode 100644 TranslitSwitcher/Src/Layoutproc.cpp (limited to 'TranslitSwitcher/Src/Layoutproc.cpp') diff --git a/TranslitSwitcher/Src/Layoutproc.cpp b/TranslitSwitcher/Src/Layoutproc.cpp new file mode 100644 index 0000000..c610380 --- /dev/null +++ b/TranslitSwitcher/Src/Layoutproc.cpp @@ -0,0 +1,870 @@ +/* +Copyright (C) 2007 Dmitry Titkov (C) 2010 tico-tico, Mataes + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + +#include "TranslitSwitcher.h" + +SMADD_BATCHPARSE2 smgp; +SMADD_BATCHPARSERES *smileyPrs = NULL; + +BOOL isItSmiley(unsigned int position) +{ + unsigned int j; + + if (smileyPrs == NULL) + return FALSE; + + for (j = 0; j < smgp.numSmileys; j++) + { + if (position >= smileyPrs[j].startChar && position < (smileyPrs[j].startChar + smileyPrs[j].size)) + return TRUE; + } + + return FALSE; +} + +static DWORD CALLBACK StreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb) +{ + static int sendBufferSize; + char ** ppText = (char **) dwCookie; + + if (*ppText == NULL) + sendBufferSize = 0; + + *ppText = (char *)mir_realloc(*ppText, sendBufferSize + cb + 2); + memcpy (*ppText + sendBufferSize, pbBuff, cb); + sendBufferSize += cb; + *((TCHAR *)(*ppText + sendBufferSize)) = '\0'; + *pcb = cb; + return 0; +} + +TCHAR* Message_GetFromStream(HWND hwndRtf, DWORD dwPassedFlags) +{ + EDITSTREAM stream = {0}; + TCHAR *pszText = NULL; + + if (hwndRtf == 0) + return NULL; + + stream.pfnCallback = StreamOutCallback; + stream.dwCookie = (DWORD_PTR) & pszText; + SendMessage(hwndRtf, EM_STREAMOUT, (WPARAM)dwPassedFlags, (LPARAM) & stream); + + return pszText; +} + +VOID Transliterate(TCHAR*& str) +{ + TCHAR* newStr = (TCHAR*)mir_alloc(sizeof(TCHAR)*lstrlen(str)*3+1); + newStr[0] = 0; + for (; *str != 0; str++) + { + switch (str[0]) + { + case _T('à'): _tcscat(newStr, _T("a")); break; + case _T('á'): _tcscat(newStr, _T("b")); break; + case _T('â'): _tcscat(newStr, _T("v")); break; + case _T('ã'): _tcscat(newStr, _T("g")); break; + case _T('ä'): _tcscat(newStr, _T("d")); break; + case _T('å'): _tcscat(newStr, _T("e")); break; + case _T('¸'): _tcscat(newStr, _T("ye")); break; + case _T('æ'): _tcscat(newStr, _T("zh")); break; + case _T('ç'): _tcscat(newStr, _T("z")); break; + case _T('è'): _tcscat(newStr, _T("i")); break; + case _T('é'): _tcscat(newStr, _T("y")); break; + case _T('ê'): _tcscat(newStr, _T("k")); break; + case _T('ë'): _tcscat(newStr, _T("l")); break; + case _T('ì'): _tcscat(newStr, _T("m")); break; + case _T('í'): _tcscat(newStr, _T("n")); break; + case _T('î'): _tcscat(newStr, _T("o")); break; + case _T('ï'): _tcscat(newStr, _T("p")); break; + case _T('ð'): _tcscat(newStr, _T("r")); break; + case _T('ñ'): _tcscat(newStr, _T("s")); break; + case _T('ò'): _tcscat(newStr, _T("t")); break; + case _T('ó'): _tcscat(newStr, _T("u")); break; + case _T('ô'): _tcscat(newStr, _T("f")); break; + case _T('õ'): _tcscat(newStr, _T("kh")); break; + case _T('ö'): _tcscat(newStr, _T("ts")); break; + case _T('÷'): _tcscat(newStr, _T("ch")); break; + case _T('ø'): _tcscat(newStr, _T("sh")); break; + case _T('ù'): _tcscat(newStr, _T("sch")); break; + case _T('ú'): _tcscat(newStr, _T("'")); break; + case _T('û'): _tcscat(newStr, _T("yi")); break; + case _T('ü'): _tcscat(newStr, _T("")); break; + case _T('ý'): _tcscat(newStr, _T("e")); break; + case _T('þ'): _tcscat(newStr, _T("yu")); break; + case _T('ÿ'): _tcscat(newStr, _T("ya")); break; + case _T('À'): _tcscat(newStr, _T("A")); break; + case _T('Á'): _tcscat(newStr, _T("B")); break; + case _T('Â'): _tcscat(newStr, _T("V")); break; + case _T('Ã'): _tcscat(newStr, _T("G")); break; + case _T('Ä'): _tcscat(newStr, _T("D")); break; + case _T('Å'): _tcscat(newStr, _T("E")); break; + case _T('¨'): _tcscat(newStr, _T("Ye")); break; + case _T('Æ'): _tcscat(newStr, _T("Zh")); break; + case _T('Ç'): _tcscat(newStr, _T("Z")); break; + case _T('È'): _tcscat(newStr, _T("I")); break; + case _T('É'): _tcscat(newStr, _T("Y")); break; + case _T('Ê'): _tcscat(newStr, _T("K")); break; + case _T('Ë'): _tcscat(newStr, _T("L")); break; + case _T('Ì'): _tcscat(newStr, _T("M")); break; + case _T('Í'): _tcscat(newStr, _T("N")); break; + case _T('Î'): _tcscat(newStr, _T("O")); break; + case _T('Ï'): _tcscat(newStr, _T("P")); break; + case _T('Ð'): _tcscat(newStr, _T("R")); break; + case _T('Ñ'): _tcscat(newStr, _T("S")); break; + case _T('Ò'): _tcscat(newStr, _T("T")); break; + case _T('Ó'): _tcscat(newStr, _T("U")); break; + case _T('Ô'): _tcscat(newStr, _T("F")); break; + case _T('Õ'): _tcscat(newStr, _T("Kh")); break; + case _T('Ö'): _tcscat(newStr, _T("Ts")); break; + case _T('×'): _tcscat(newStr, _T("Ch")); break; + case _T('Ø'): _tcscat(newStr, _T("Sh")); break; + case _T('Ù'): _tcscat(newStr, _T("Sch")); break; + case _T('Ú'): _tcscat(newStr, _T("'")); break; + case _T('Û'): _tcscat(newStr, _T("Yi")); break; + case _T('Ü'): _tcscat(newStr, _T("")); break; + case _T('Ý'): _tcscat(newStr, _T("E")); break; + case _T('Þ'): _tcscat(newStr, _T("Yu")); break; + case _T('ß'): _tcscat(newStr, _T("Ya")); break; + + case _T('a'): _tcscat(newStr, _T("à")); break; + case _T('b'): _tcscat(newStr, _T("á")); break; + case _T('v'): _tcscat(newStr, _T("â")); break; + case _T('g'): _tcscat(newStr, _T("ã")); break; + case _T('d'): _tcscat(newStr, _T("ä")); break; + case _T('e'): _tcscat(newStr, _T("å")); break; + case _T('z'): + { + if (str[1] == _T('h')) + { + _tcscat(newStr, _T("æ")); + str++; + break; + } + else + { + _tcscat(newStr, _T("ç")); + break; + } + } + case _T('i'): _tcscat(newStr, _T("è")); break; + case _T('y'): + { + if (str[1] == _T('a')) + { + _tcscat(newStr, _T("ÿ")); + str++; + break; + } + else if (str[1] == _T('e')) + { + _tcscat(newStr, _T("¸")); + str++; + break; + } + else if (str[1] == _T('u')) + { + _tcscat(newStr, _T("þ")); + str++; + break; + } + else if (str[1] == _T('i')) + { + _tcscat(newStr, _T("û")); + str++; + break; + } + else + { + _tcscat(newStr, _T("é")); + break; + } + } + case _T('k'): + { + if (str[1] == _T('h')) + { + _tcscat(newStr, _T("õ")); + str++; + break; + } + else + { + _tcscat(newStr, _T("ê")); + break; + } + } + case _T('l'): _tcscat(newStr, _T("ë")); break; + case _T('m'): _tcscat(newStr, _T("ì")); break; + case _T('n'): _tcscat(newStr, _T("í")); break; + case _T('o'): _tcscat(newStr, _T("î")); break; + case _T('p'): _tcscat(newStr, _T("ï")); break; + case _T('r'): _tcscat(newStr, _T("ð")); break; + case _T('s'): + { + if (str[1] == _T('h')) + { + _tcscat(newStr, _T("ø")); + str++; + break; + } + else if (str[1] == _T('c') && str[2] == _T('h')) + { + _tcscat(newStr, _T("ù")); + str+=2; + break; + } + else + { + _tcscat(newStr, _T("ñ")); + break; + } + } + case _T('t'): + { + if (str[1] == _T('s')) + { + _tcscat(newStr, _T("ö")); + str++; + break; + } + else + { + _tcscat(newStr, _T("ò")); + break; + } + } + case _T('u'): _tcscat(newStr, _T("ó")); break; + case _T('f'): _tcscat(newStr, _T("ô")); break; + case _T('c'): + { + if (str[1] == _T('h')) + { + _tcscat(newStr, _T("÷")); + str++; + break; + } + } + case _T('A'): _tcscat(newStr, _T("À")); break; + case _T('B'): _tcscat(newStr, _T("Á")); break; + case _T('V'): _tcscat(newStr, _T("Â")); break; + case _T('G'): _tcscat(newStr, _T("Ã")); break; + case _T('D'): _tcscat(newStr, _T("Ä")); break; + case _T('E'): _tcscat(newStr, _T("Å")); break; + case _T('Y'): + { + if (str[1] == _T('a')) + { + _tcscat(newStr, _T("ß")); + str++; + break; + } + else if (str[1] == _T('e')) + { + _tcscat(newStr, _T("¨")); + str++; + break; + } + else if (str[1] == _T('u')) + { + _tcscat(newStr, _T("Þ")); + str++; + break; + } + else if (str[1] == _T('i')) + { + _tcscat(newStr, _T("Û")); + str++; + break; + } + else + { + _tcscat(newStr, _T("É")); + break; + } + } + case _T('Z'): + { + if (str[1] == _T('h')) + { + _tcscat(newStr, _T("Æ")); + str++; + break; + } + else + { + _tcscat(newStr, _T("Ç")); + break; + } + } + case _T('I'): _tcscat(newStr, _T("È")); break; + case _T('K'): + { + if (str[1] == _T('h')) + { + _tcscat(newStr, _T("Õ")); + str++; + break; + } + else + { + _tcscat(newStr, _T("Ê")); + break; + } + } + case _T('L'): _tcscat(newStr, _T("Ë")); break; + case _T('M'): _tcscat(newStr, _T("Ì")); break; + case _T('N'): _tcscat(newStr, _T("Í")); break; + case _T('O'): _tcscat(newStr, _T("Î")); break; + case _T('P'): _tcscat(newStr, _T("Ï")); break; + case _T('R'): _tcscat(newStr, _T("Ð")); break; + case _T('S'): + { + if (str[1] == _T('h')) + { + _tcscat(newStr, _T("Ø")); + str++; + break; + } + else if (str[1] == _T('c') && str[2] == _T('h')) + { + _tcscat(newStr, _T("Ù")); + str+=2; + break; + } + else + { + _tcscat(newStr, _T("Ñ")); + break; + } + } + case _T('T'): + { + if (str[1] == _T('s')) + { + _tcscat(newStr, _T("Ö")); + str++; + break; + } + else + { + _tcscat(newStr, _T("Ò")); + break; + } + } + case _T('U'): _tcscat(newStr, _T("Ó")); break; + case _T('F'): _tcscat(newStr, _T("Ô")); break; + case _T('C'): + { + if (str[1] == _T('h')) + { + _tcscat(newStr, _T("×")); + str++; + break; + } + } + case _T('\''): _tcscat(newStr, _T("ú")); break; + + default: { TCHAR Temp[2] = { str[0], 0} ; _tcscat(newStr, &Temp[0]); } + } + } + int len = lstrlen(newStr); + str = (TCHAR*)mir_alloc((len+1)*sizeof(TCHAR)); + str[0] = 0; + _tcscpy(str, newStr); + mir_free(newStr); +} + +VOID Invert(TCHAR *str) +{ + while(*str) + { + if(IsCharUpper(*str)) + { + *str = (TCHAR)CharLower((LPTSTR)*str); + } + else if(IsCharLower(*str)) + *str = (TCHAR)CharUpper((LPTSTR)*str); + str++; + } + keybd_event(VK_CAPITAL,0x45,KEYEVENTF_EXTENDEDKEY|0,0); + keybd_event(VK_CAPITAL,0x45,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0); +} + +VOID SwitchLayout(BOOL lastword) +{ + HWND hwnd = GetForegroundWindow(); + + if(hwnd != NULL) + { + DWORD dwProcessID; + DWORD dwThreadID = GetWindowThreadProcessId(hwnd, &dwProcessID); + HWND hwnd2 = GetFocus(); + + if(hwnd2 != NULL) + { + TCHAR szClassName[16]; + + GetClassName(hwnd2, szClassName, SIZEOF(szClassName)); + + if(lstrcmp(szClassName, _T("RichEdit20W")) == 0) + { + DWORD dwStart, dwEnd; + int i, slen, start = 0, end = 0; + TCHAR *sel, tchr; + BOOL somethingIsSelected = TRUE; + SHORT vks; + BYTE keys[256] = {0}; + HKL hkl = GetKeyboardLayout(dwThreadID); + + SendMessage(hwnd2, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); + + if (dwStart == dwEnd) + somethingIsSelected = FALSE; + + if (somethingIsSelected) + sel = Message_GetFromStream(hwnd2, SF_TEXT|SF_UNICODE|SFF_SELECTION); + else + sel = Message_GetFromStream(hwnd2, SF_TEXT|SF_UNICODE); + + slen = lstrlen(sel); + + if (slen != 0) + { + ZeroMemory(&smgp, sizeof(smgp)); + smgp.cbSize = sizeof(smgp); + smgp.str = sel; + smgp.flag = SAFL_UNICODE; + + if (ServiceExists(MS_SMILEYADD_BATCHPARSE)) + smileyPrs = (SMADD_BATCHPARSERES *)CallService(MS_SMILEYADD_BATCHPARSE, 0, (LPARAM)&smgp); + + end = slen; + if (lastword && !somethingIsSelected) + { + end = dwStart; + while (end < slen) + { + if (_istspace(sel[end]) || isItSmiley(end)) + break; + end++; + } + start = dwStart-1; + while (start > 0 && start < (int)dwStart) + { + if ((_istspace(sel[start]) && (end-start>2)) || isItSmiley(start)) + break; + start--; + } + } + + ActivateKeyboardLayout((HKL)HKL_PREV, KLF_ACTIVATE); + + for(i = start; i < end; i++) + { + vks = VkKeyScanEx(sel[i], hkl); + + keys[VK_SHIFT] = (HIBYTE(vks) & 1) ? 0xFF : 0x00; // shift + keys[VK_CONTROL] = (HIBYTE(vks) & 2) ? 0xFF : 0x00; // ctrl + keys[VK_MENU] = (HIBYTE(vks) & 4) ? 0xFF : 0x00; // alt + + if (!isItSmiley(i)) + { + if(ToUnicodeEx(LOBYTE(vks), 0, keys, &tchr, 1, 0, GetKeyboardLayout(dwThreadID)) == 1) + sel[i] = tchr; + } + } + + if (smileyPrs != NULL) + CallService(MS_SMILEYADD_BATCHFREE, 0, (LPARAM)smileyPrs); + + if (somethingIsSelected) + SendMessage(hwnd2, EM_REPLACESEL, FALSE, (LPARAM)sel); + else + SendMessage(hwnd2, WM_SETTEXT, 0, (LPARAM)sel); + + SendMessage(hwnd2, EM_SETSEL, dwStart, dwEnd); + } + mir_free(sel); + } + } + } +} + +void TranslitLayout(BOOL lastword) +{ + HWND hwnd = GetForegroundWindow(); + + if(hwnd != NULL) + { + DWORD dwProcessID; + DWORD dwThreadID = GetWindowThreadProcessId(hwnd, &dwProcessID); + HWND hwnd2 = GetFocus(); + + if(hwnd2 != NULL) + { + TCHAR szClassName[16]; + + GetClassName(hwnd2, szClassName, SIZEOF(szClassName)); + + if(lstrcmp(szClassName, _T("RichEdit20W")) == 0) + { + DWORD dwStart, dwEnd; + int slen, start = 0, end = 0; + TCHAR *sel, *boo; + BOOL somethingIsSelected = TRUE; + + SendMessage(hwnd2, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); + + if (dwStart == dwEnd) + somethingIsSelected = FALSE; + + if (somethingIsSelected) + sel = Message_GetFromStream(hwnd2, SF_TEXT|SF_UNICODE|SFF_SELECTION); + else + sel = Message_GetFromStream(hwnd2, SF_TEXT|SF_UNICODE); + + slen = lstrlen(sel); + + if (slen != 0) + { + end = slen; + if (lastword && !somethingIsSelected) + { + end = dwStart; + while (end < slen) + { + if (_istspace(sel[end]) || isItSmiley(end)) + break; + end++; + } + start = dwStart-1; + while (start > 0 && start < (int)dwStart) + { + if ((_istspace(sel[start]) && (end-start>2)) || isItSmiley(start)) + break; + start--; + } + boo = (TCHAR*)mir_alloc((end-start+1 ) * sizeof(TCHAR)); + _tcsncpy(boo, sel+start, end-start); + boo[end-start] = 0; + } + else + { + boo = (TCHAR*)mir_alloc((slen+1 ) * sizeof(TCHAR)); + _tcscpy(boo, sel); + } + + Transliterate(boo); + + if (somethingIsSelected) + SendMessage(hwnd2, EM_REPLACESEL, FALSE, (LPARAM)boo); + else + { + TCHAR* NewText = (TCHAR*)mir_alloc((start+_tcslen(boo)+(slen-start)+1)* sizeof(TCHAR)); + NewText[0] = 0; + _tcsncat(NewText, sel, start); + _tcscat(NewText, boo); + _tcsncat(NewText, sel+end, slen-end); + SendMessage(hwnd2, WM_SETTEXT, 0, (LPARAM)NewText); + mir_free(NewText); + } + + SendMessage(hwnd2, EM_SETSEL, dwStart, dwEnd); + } + mir_free(sel); + mir_free(boo); + } + } + } +} + +void InvertCase(BOOL lastword) +{ + HWND hwnd = GetForegroundWindow(); + + if(hwnd != NULL) + { + DWORD dwProcessID; + DWORD dwThreadID = GetWindowThreadProcessId(hwnd, &dwProcessID); + HWND hwnd2 = GetFocus(); + + if(hwnd2 != NULL) + { + TCHAR szClassName[16]; + + GetClassName(hwnd2, szClassName, SIZEOF(szClassName)); + + if(lstrcmp(szClassName, _T("RichEdit20W")) == 0) + { + DWORD dwStart, dwEnd; + int slen, start = 0, end = 0; + TCHAR *sel, *boo; + BOOL somethingIsSelected = TRUE; + + SendMessage(hwnd2, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); + + if (dwStart == dwEnd) + somethingIsSelected = FALSE; + + if (somethingIsSelected) + sel = Message_GetFromStream(hwnd2, SF_TEXT|SF_UNICODE|SFF_SELECTION); + else + sel = Message_GetFromStream(hwnd2, SF_TEXT|SF_UNICODE); + + slen = lstrlen(sel); + + if (slen != 0) + { + end = slen; + if (lastword && !somethingIsSelected) + { + end = dwStart; + while (end < slen) + { + if (_istspace(sel[end]) || isItSmiley(end)) + break; + end++; + } + start = dwStart-1; + while (start > 0 && start < (int)dwStart) + { + if ((_istspace(sel[start]) && (end-start>2)) || isItSmiley(start)) + break; + start--; + } + boo = (TCHAR*)mir_alloc((end-start+1 ) * sizeof(TCHAR)); + _tcsncpy(boo, sel+start, end-start); + boo[end-start] = 0; + } + else + { + boo = (TCHAR*)mir_alloc((slen+1 ) * sizeof(TCHAR)); + _tcscpy(boo, sel); + } + + Invert(boo); + + if (somethingIsSelected) + SendMessage(hwnd2, EM_REPLACESEL, FALSE, (LPARAM)boo); + else + { + TCHAR* NewText = (TCHAR*)mir_alloc((start+_tcslen(boo)+(slen-start)+1)* sizeof(TCHAR)); + NewText[0] = 0; + _tcsncat(NewText, sel, start); + _tcscat(NewText, boo); + _tcsncat(NewText, sel+end, slen-end); + SendMessage(hwnd2, WM_SETTEXT, 0, (LPARAM)NewText); + mir_free(NewText); + } + + SendMessage(hwnd2, EM_SETSEL, dwStart, dwEnd); + } + mir_free(sel); + mir_free(boo); + } + } + } +} + +int OnButtonPressed(WPARAM wParam, LPARAM lParam) +{ + CustomButtonClickData *cbcd = (CustomButtonClickData *)lParam; + if (lstrcmpA(cbcd->pszModule, "SwitchLayout and Send") == 0) + { + HWND hEdit = GetDlgItem(cbcd->hwndFrom, IDC_MESSAGE); + if (!hEdit) hEdit = GetDlgItem(cbcd->hwndFrom, IDC_CHATMESSAGE); + + BYTE byKeybState[256]; + GetKeyboardState(byKeybState); + byKeybState[VK_CONTROL] = 128; + SetKeyboardState(byKeybState); + SendMessage(hEdit, WM_KEYDOWN, VK_UP, 0); + byKeybState[VK_CONTROL] = 0; + SetKeyboardState(byKeybState); + + DWORD dwProcessID; + DWORD dwThreadID = GetWindowThreadProcessId(cbcd->hwndFrom, &dwProcessID); + HKL hkl = GetKeyboardLayout(dwThreadID); + + TCHAR *sel = Message_GetFromStream(hEdit, SF_TEXT|SF_UNICODE); + int slen = lstrlen(sel); + + if (slen != 0) + { + ZeroMemory(&smgp, sizeof(smgp)); + smgp.cbSize = sizeof(smgp); + smgp.str = sel; + smgp.flag = SAFL_UNICODE; + + if (ServiceExists(MS_SMILEYADD_BATCHPARSE)) + smileyPrs = (SMADD_BATCHPARSERES *)CallService(MS_SMILEYADD_BATCHPARSE, 0, (LPARAM)&smgp); + + ActivateKeyboardLayout((HKL)HKL_PREV, KLF_ACTIVATE); + + for(int i = 0; i < slen; i++) + { + TCHAR tchr; + BYTE keys[256] = {0}; + SHORT vks = VkKeyScanEx(sel[i], hkl); + + keys[VK_SHIFT] = (HIBYTE(vks) & 1) ? 0xFF : 0x00; // shift + keys[VK_CONTROL] = (HIBYTE(vks) & 2) ? 0xFF : 0x00; // ctrl + keys[VK_MENU] = (HIBYTE(vks) & 4) ? 0xFF : 0x00; // alt + + if (!isItSmiley(i)) + { + if(ToUnicodeEx(LOBYTE(vks), 0, keys, &tchr, 1, 0, GetKeyboardLayout(dwThreadID)) == 1) + sel[i] = tchr; + } + } + if (smileyPrs != NULL) + CallService(MS_SMILEYADD_BATCHFREE, 0, (LPARAM)smileyPrs); + + DBVARIANT dbv = {0}; + DBGetContactSettingTString(NULL, "TranslitSwitcher", "ResendSymbol", &dbv); + if (lstrcmp(dbv.ptszVal, NULL) == 0) + { + DBFreeVariant(&dbv); + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)sel); + SendMessage(hEdit, EM_SETSEL, 0, slen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + } + else + { + if (_tcsncmp(sel, dbv.ptszVal, _tcslen(dbv.ptszVal)) == 0) + { + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)sel); + SendMessage(hEdit, EM_SETSEL, 0, slen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + } + else + { + int FinalLen = slen + SIZEOF(dbv.ptszVal) + 1; + TCHAR* FinalString = (TCHAR*)mir_alloc((FinalLen+1)*sizeof(TCHAR)); + mir_sntprintf(FinalString, FinalLen, _T("%s %s"), dbv.ptszVal, sel); + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)FinalString); + SendMessage(hEdit, EM_SETSEL, 0, FinalLen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + mir_free(FinalString); + } + } + } + mir_free(sel); + return 1; + } + if (lstrcmpA(cbcd->pszModule, "Translit and Send") == 0) + { + HWND hEdit = GetDlgItem(cbcd->hwndFrom, IDC_MESSAGE); + if (!hEdit) hEdit = GetDlgItem(cbcd->hwndFrom, IDC_CHATMESSAGE); + + BYTE byKeybState[256]; + GetKeyboardState(byKeybState); + byKeybState[VK_CONTROL] = 128; + SetKeyboardState(byKeybState); + SendMessage(hEdit, WM_KEYDOWN, VK_UP, 0); + byKeybState[VK_CONTROL] = 0; + SetKeyboardState(byKeybState); + + TCHAR *sel = Message_GetFromStream(hEdit, SF_TEXT|SF_UNICODE); + int slen = lstrlen(sel); + if (slen != 0) + Transliterate(sel); + DBVARIANT dbv = {0}; + DBGetContactSettingTString(NULL, "TranslitSwitcher", "ResendSymbol", &dbv); + if (lstrcmp(dbv.ptszVal, NULL) == 0) + { + DBFreeVariant(&dbv); + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)sel); + SendMessage(hEdit, EM_SETSEL, 0, slen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + } + else + { + if (_tcsncmp(sel, dbv.ptszVal, _tcslen(dbv.ptszVal)) == 0) + { + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)sel); + SendMessage(hEdit, EM_SETSEL, 0, slen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + } + else + { + int FinalLen = slen + SIZEOF(dbv.ptszVal) + 1; + TCHAR* FinalString = (TCHAR*)mir_alloc((FinalLen+1)*sizeof(TCHAR)); + mir_sntprintf(FinalString, FinalLen, _T("%s %s"), dbv.ptszVal, sel); + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)FinalString); + SendMessage(hEdit, EM_SETSEL, 0, FinalLen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + mir_free(FinalString); + } + } + mir_free(sel); + return 1; + } + if (lstrcmpA(cbcd->pszModule, "Invert Case and Send") == 0) + { + HWND hEdit = GetDlgItem(cbcd->hwndFrom, IDC_MESSAGE); + if (!hEdit) hEdit = GetDlgItem(cbcd->hwndFrom, IDC_CHATMESSAGE); + + BYTE byKeybState[256]; + GetKeyboardState(byKeybState); + byKeybState[VK_CONTROL] = 128; + SetKeyboardState(byKeybState); + SendMessage(hEdit, WM_KEYDOWN, VK_UP, 0); + byKeybState[VK_CONTROL] = 0; + SetKeyboardState(byKeybState); + + TCHAR *sel = Message_GetFromStream(hEdit, SF_TEXT|SF_UNICODE); + int slen = lstrlen(sel); + if (slen != 0) + Invert(sel); + DBVARIANT dbv = {0}; + DBGetContactSettingTString(NULL, "TranslitSwitcher", "ResendSymbol", &dbv); + if (lstrcmp(dbv.ptszVal, NULL) == 0) + { + DBFreeVariant(&dbv); + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)sel); + SendMessage(hEdit, EM_SETSEL, 0, slen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + } + else + { + if (_tcsncmp(sel, dbv.ptszVal, _tcslen(dbv.ptszVal)) == 0) + { + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)sel); + SendMessage(hEdit, EM_SETSEL, 0, slen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + } + else + { + int FinalLen = slen + SIZEOF(dbv.ptszVal) + 1; + TCHAR* FinalString = (TCHAR*)mir_alloc((FinalLen+1)*sizeof(TCHAR)); + mir_sntprintf(FinalString, FinalLen, _T("%s %s"), dbv.ptszVal, sel); + SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)FinalString); + SendMessage(hEdit, EM_SETSEL, 0, FinalLen); + SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); + mir_free(FinalString); + } + } + mir_free(sel); + return 1; + } + return 0; +} \ No newline at end of file -- cgit v1.2.3