diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp index f2f168f7..f49927ae 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp @@ -253,6 +253,85 @@ LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wPa break; } + case WM_IME_REQUEST: + { + + if (wParam == IMR_RECONVERTSTRING) + { + int textLength; + int selectSize; + char smallTextBuffer[128]; + char * selectedStr = smallTextBuffer; + RECONVERTSTRING * reconvert = (RECONVERTSTRING *)lParam; + + // does nothing with a rectangular selection + if (execute(SCI_SELECTIONISRECTANGLE, 0, 0)) + return 0; + + // get the codepage of the text + + unsigned int codepage = execute(SCI_GETCODEPAGE); + + // get the current text selection + + CharacterRange range = getSelection(); + if (range.cpMax == range.cpMin) + { + // no selection: select the current word instead + + expandWordSelection(); + range = getSelection(); + } + selectSize = range.cpMax - range.cpMin; + + // does nothing if still no luck with the selection + + if (selectSize == 0) + return 0; + + if (selectSize + 1 > sizeof(smallTextBuffer)) + selectedStr = new char[selectSize + 1]; + getText(selectedStr, range.cpMin, range.cpMax); + + if (reconvert == NULL) + { + // convert the selection to Unicode, and get the number + // of bytes required for the converted text + textLength = sizeof(WCHAR) * ::MultiByteToWideChar(codepage, 0, selectedStr, selectSize, NULL, 0); + } + else + { + // convert the selection to Unicode, and store it at the end of the structure. + // Beware: For a Unicode IME, dwStrLen , dwCompStrLen, and dwTargetStrLen + // are TCHAR values, that is, character counts. The members dwStrOffset, + // dwCompStrOffset, and dwTargetStrOffset specify byte counts. + + textLength = ::MultiByteToWideChar( codepage, 0, + selectedStr, selectSize, + (LPWSTR)((LPSTR)reconvert + sizeof(RECONVERTSTRING)), + reconvert->dwSize - sizeof(RECONVERTSTRING)); + + // fill the structure + reconvert->dwVersion = 0; + reconvert->dwStrLen = textLength; + reconvert->dwStrOffset = sizeof(RECONVERTSTRING); + reconvert->dwCompStrLen = textLength; + reconvert->dwCompStrOffset = 0; + reconvert->dwTargetStrLen = reconvert->dwCompStrLen; + reconvert->dwTargetStrOffset = reconvert->dwCompStrOffset; + + textLength *= sizeof(WCHAR); + } + + if (selectedStr != smallTextBuffer) + delete [] selectedStr; + + // return the total length of the structure + return sizeof(RECONVERTSTRING) + textLength; + } + break; + } + case WM_VSCROLL : { break; diff --git a/PowerEditor/src/winmain.cpp b/PowerEditor/src/winmain.cpp index fef7870f..f7b0bcc4 100644 --- a/PowerEditor/src/winmain.cpp +++ b/PowerEditor/src/winmain.cpp @@ -323,7 +323,7 @@ void doException(Notepad_plus & notepad_plus_plus) { printMsg(TEXT("Notepad++ will attempt to save any unsaved data. However, dataloss is very likely."), TEXT("Recovery initiating"), MB_OK | MB_ICONINFORMATION); bool res = notepad_plus_plus.emergency(); if (res) { - printMsg(TEXT("Notepad++ was able to successfully recover some unsaved documents, or nothing to be saved could be found.\r\nYou can find the results at C:\\N++RECOV"), TEXT("Recovery success"), MB_OK | MB_ICONINFORMATION); + printMsg(TEXT("Notepad++ was able to successfully recover some unsaved documents, or nothing to be saved could be found.\r\nYou can find the results at N++RECOV directory, located in your system temporary directory."), TEXT("Recovery success"), MB_OK | MB_ICONINFORMATION); } else { printMsg(TEXT("Unfortunatly, Notepad++ was not able to save your work. We are sorry for any lost data."), TEXT("Recovery failure"), MB_OK | MB_ICONERROR); }