[NEW_FEATURE] Process WM_IME_REQUEST message to support Windows IME.
git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@374 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
parent
aaccc02a2b
commit
0c6496f6b3
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user