bool DictViewInstance::DictParams::Execute(const FarStringW &in_word) { far_assert(spell_factory); SpellInstance *dict_inst = spell_factory->GetDictInstance(dict); far_assert(dict_inst); if (transliteration_enabled) { FarStringW word = in_word; const bool transliterated = Transliterate(word); if (transliterated && transliteration_is_error) return false; return dict_inst->Check(word); } else return dict_inst->Check(in_word); }
int OnButtonPressed(WPARAM, LPARAM lParam) { CustomButtonClickData *cbcd = (CustomButtonClickData *)lParam; int iType; if (!mir_strcmp(cbcd->pszModule, "Switch Layout and Send")) iType = 1; else if (!mir_strcmp(cbcd->pszModule, "Translit and Send")) iType = 2; else if (!mir_strcmp(cbcd->pszModule, "Invert Case and Send")) iType = 3; else return 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); size_t slen = mir_tstrlen(sel); if (slen != 0) { switch (iType) { case 3: Invert(sel); break; case 2: Transliterate(sel); break; case 1: DWORD dwProcessID; DWORD dwThreadID = GetWindowThreadProcessId(cbcd->hwndFrom, &dwProcessID); HKL hkl = GetKeyboardLayout(dwThreadID); memset(&smgp, 0, sizeof(smgp)); smgp.cbSize = sizeof(smgp); smgp.str = sel; smgp.flag = SAFL_TCHAR; 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 < (int)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); break; } } ptrT tszSymbol(db_get_tsa(NULL, "TranslitSwitcher", "ResendSymbol")); if (tszSymbol == NULL) { SetWindowText(hEdit, sel); SendMessage(hEdit, EM_SETSEL, 0, (LPARAM)slen); SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); } else if (_tcsncmp(sel, tszSymbol, mir_tstrlen(tszSymbol)) == 0) { SetWindowText(hEdit, sel); SendMessage(hEdit, EM_SETSEL, 0, (LPARAM)slen); SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); } else { CMString tszFinal(FORMAT, _T("%s %s"), tszSymbol, sel); SetWindowText(hEdit, tszFinal.GetString()); SendMessage(hEdit, EM_SETSEL, 0, tszFinal.GetLength()); SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); } mir_free(sel); return 1; }
void TranslitLayout(bool lastword) { HWND hwnd = GetForegroundWindow(); if (hwnd == NULL) return; HWND hwnd2 = GetFocus(); if (hwnd2 == NULL) return; TCHAR szClassName[16]; GetClassName(hwnd2, szClassName, _countof(szClassName)); if (mir_tstrcmpi(szClassName, _T("RichEdit50W")) != 0) return; DWORD dwStart, dwEnd, dwFlags = SF_TEXT | SF_UNICODE; SendMessage(hwnd2, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); bool somethingIsSelected = (dwStart != dwEnd); if (somethingIsSelected) dwFlags += SFF_SELECTION; TCHAR *boo, *sel = Message_GetFromStream(hwnd2, dwFlags); size_t slen = mir_tstrlen(sel), start = 0, end = 0; if (slen != 0) { end = slen; if (lastword && !somethingIsSelected) { end = (size_t)dwStart; while (end < slen) { if (_istspace(sel[end]) || isItSmiley((int)end)) break; end++; } start = (size_t)dwStart - 1; while (start > 0 && start < (size_t)dwStart) { if ((_istspace(sel[start]) && (end - start > 2)) || isItSmiley((int)start)) break; start--; } boo = (TCHAR*)mir_alloc((end - start + 1) * sizeof(TCHAR)); mir_tstrncpy(boo, sel + start, end - start); boo[end - start] = 0; } else { boo = (TCHAR*)mir_alloc((slen + 1) * sizeof(TCHAR)); mir_tstrcpy(boo, sel); } Transliterate(boo); if (somethingIsSelected) SendMessage(hwnd2, EM_REPLACESEL, false, (LPARAM)boo); else { TCHAR *NewText = (TCHAR*)mir_alloc((start + mir_tstrlen(boo) + (slen - start) + 1) * sizeof(TCHAR)); NewText[0] = 0; mir_tstrncat(NewText, sel, start); mir_tstrcat(NewText, boo); mir_tstrncat(NewText, sel + end, slen - end); SetWindowText(hwnd2, NewText); mir_free(NewText); } SendMessage(hwnd2, EM_SETSEL, (WPARAM)dwStart, (LPARAM)dwEnd); mir_free(boo); } mir_free(sel); }