From 42425a5edd2ca98e013d0f9065daf017f330ec0f Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Thu, 13 Sep 2018 12:00:42 +0200 Subject: [PATCH] + fix: changed Auto-Completion in cooperation with Inline-IME behavior --- src/Edit.c | 18 ++- src/Notepad3.c | 37 +++++- src/Notepad3.vcxproj.filters | 228 +++++++++++++++++------------------ 3 files changed, 153 insertions(+), 130 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index aa212488c..54102e1c4 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -120,6 +120,7 @@ extern bool g_bZeroBasedColumnIndex; extern CALLTIPTYPE g_CallTipType; extern FR_STATES g_FindReplaceMatchFoundState; +extern bool g_bAutoCinASCIIModeOnly; #define ANSI_CAHR_BUFFER 258 static char DelimChars[ANSI_CAHR_BUFFER] = { '\0' }; @@ -373,9 +374,9 @@ void EditInitWordDelimiter(HWND hwnd) } } } + g_bAutoCinASCIIModeOnly = (AutoCompleteWordASCII[0] != '\0'); - - // constuct wide char arrays + // construct wide char arrays //MultiByteToWideChar(Encoding_SciCP, 0, DelimChars, -1, W_DelimChars, COUNTOF(W_DelimChars)); //MultiByteToWideChar(Encoding_SciCP, 0, DelimCharsAccel, -1, W_DelimCharsAccel, COUNTOF(W_DelimCharsAccel)); //MultiByteToWideChar(Encoding_SciCP, 0, WhiteSpaceCharsDefault, -1, W_WhiteSpaceCharsDefault, COUNTOF(W_WhiteSpaceCharsDefault)); @@ -6569,13 +6570,8 @@ static const char* __fastcall _strNextLexKeyWord(const char* strg, const char* c void EditCompleteWord(HWND hwnd, bool autoInsert) { UNUSED(hwnd); - - // OLD: "_abcdefghijklmnopqrstuvwxyz0123456789" - char const* ALLOWED_WORD_CHARS = AutoCompleteWordASCII; - - if (ALLOWED_WORD_CHARS[0] == '\0') { - ALLOWED_WORD_CHARS = g_bAccelWordNavigation ? WordCharsAccelerated : WordCharsDefault; - } + char const* const pchAllowdWordChars = (g_bAutoCinASCIIModeOnly ? AutoCompleteWordASCII : + (g_bAccelWordNavigation ? WordCharsAccelerated : WordCharsDefault)); DocPos const iCurrentPos = SciCall_GetCurrentPos(); DocLn const iLine = SciCall_LineFromPosition(iCurrentPos); @@ -6587,7 +6583,7 @@ void EditCompleteWord(HWND hwnd, bool autoInsert) bool bWordAllNumbers = true; DocPos iStartWordPos = iCurrentLinePos; - while (iStartWordPos > 0 && StrChrIA(ALLOWED_WORD_CHARS, pLine[iStartWordPos - 1])) { + while (iStartWordPos > 0 && StrChrIA(pchAllowdWordChars, pLine[iStartWordPos - 1])) { iStartWordPos--; if (pLine[iStartWordPos] < '0' || pLine[iStartWordPos] > '9') { bWordAllNumbers = false; @@ -6623,7 +6619,7 @@ void EditCompleteWord(HWND hwnd, bool autoInsert) if (iPosFind != (iCurrentPos - iRootLen)) { - while ((wordEnd < iDocLen) && StrChrIA(ALLOWED_WORD_CHARS, SciCall_GetCharAt(wordEnd))) { ++wordEnd; } + while ((wordEnd < iDocLen) && StrChrIA(pchAllowdWordChars, SciCall_GetCharAt(wordEnd))) { ++wordEnd; } DocPos const wordLength = (wordEnd - iPosFind); if (wordLength > iRootLen) diff --git a/src/Notepad3.c b/src/Notepad3.c index a201e646d..f00972b76 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -249,6 +249,7 @@ int iUpdateDelayMarkAllCoccurrences; int iCurrentLineHorizontalSlop = 0; int iCurrentLineVerticalSlop = 0; bool g_bChasingDocTail = false; +bool g_bAutoCinASCIIModeOnly = false; CALLTIPTYPE g_CallTipType = CT_NONE; @@ -6157,6 +6158,28 @@ static void __fastcall _HandleTinyExpr() } +//============================================================================= +// +// _IsInlineIMEAsianLngMode() +// +static bool __fastcall _IsInlineIMEAsianLngMode() +{ + bool result = false; + if (g_IMEInteraction == SC_IME_INLINE) { + HIMC const himc = ImmGetContext(g_hwndEdit); + if (himc) { + if (ImmGetOpenStatus(himc)) { + DWORD dwConversion = IME_CMODE_ALPHANUMERIC, dwSentence = 0; + if (ImmGetConversionStatus(himc, &dwConversion, &dwSentence)) { + result = ((dwConversion & IME_CMODE_LANGUAGE) != IME_CMODE_ALPHANUMERIC); + } + } + ImmReleaseContext(g_hwndEdit, himc); + } + } + return result; +} + //============================================================================= // // MsgNotify() - Handles WM_NOTIFY @@ -6216,7 +6239,6 @@ LRESULT MsgNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) switch(pnmh->idFrom) { case IDC_EDIT: - switch (pnmh->code) { case SCN_MODIFIED: @@ -6331,12 +6353,13 @@ LRESULT MsgNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) case SCN_CHARADDED: { - if (g_CallTipType != CT_NONE) { + int const ich = scn->ch; + + if (g_CallTipType != CT_NONE) { SciCall_CallTipCancel(); g_CallTipType = CT_NONE; } - int const ich = scn->ch; switch (ich) { case '\r': case '\n': @@ -6352,8 +6375,12 @@ LRESULT MsgNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) break; } - if ((g_bAutoCompleteWords || g_bAutoCLexerKeyWords) && !SciCall_AutoCActive()) { - EditCompleteWord(g_hwndEdit, false); + if ((g_bAutoCompleteWords || g_bAutoCLexerKeyWords)) { + if (g_bAutoCinASCIIModeOnly && ((ich > 0x7F) || _IsInlineIMEAsianLngMode())) { + SciCall_AutoCCancel(); + return 0LL; + } + if (!SciCall_AutoCActive()) { EditCompleteWord(g_hwndEdit, false); } } } break; diff --git a/src/Notepad3.vcxproj.filters b/src/Notepad3.vcxproj.filters index 3678edd75..e5fefc1ef 100644 --- a/src/Notepad3.vcxproj.filters +++ b/src/Notepad3.vcxproj.filters @@ -13,37 +13,37 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {aad339da-f291-4358-9ab1-a0fdee012ac6} - {e817f780-f742-48b4-bc9c-2ab762ced6bc} - - {91d2fb70-4067-4692-b746-9a02db63f461} - - - {8d78b8ca-ff0f-46cb-8da2-83c4bde259b9} - - - {dbeb3dd1-1f65-45ec-a526-dc0e84e4c350} - - - {1d7878c8-36e3-4bae-91d9-fda61101aa81} - - - {fd5165c7-e622-408b-95f0-666d494aa8f1} - - - {1de8e161-7393-4043-be9d-7bd2d0cb02df} - - - {a6270a0b-5c38-4e68-b38c-5795ccb57302} - - + {82f9cc2d-9173-4af4-8967-5fd2e5f8aef7} - + + {aad339da-f291-4358-9ab1-a0fdee012ac6} + + + {a6270a0b-5c38-4e68-b38c-5795ccb57302} + + + {91d2fb70-4067-4692-b746-9a02db63f461} + + + {8d78b8ca-ff0f-46cb-8da2-83c4bde259b9} + + + {dbeb3dd1-1f65-45ec-a526-dc0e84e4c350} + + + {1d7878c8-36e3-4bae-91d9-fda61101aa81} + + + {fd5165c7-e622-408b-95f0-666d494aa8f1} + + + {1de8e161-7393-4043-be9d-7bd2d0cb02df} + + {24604833-5c1e-421c-813a-34c6a48bf6f9} @@ -70,184 +70,184 @@ Source Files - Crypto + Source Files\Crypto - Crypto + Source Files\Crypto - Crypto + Source Files\Crypto - Crypto + Source Files\Crypto Source Files - CED\util\languages + Source Files\CED\util\languages - CED\util\encodings + Source Files\CED\util\encodings - CED\compact_enc_det + Source Files\CED\compact_enc_det - CED\compact_enc_det + Source Files\CED\compact_enc_det Source Files - tinyexpr + Source Files\tinyexpr - ChooseFont + Source Files\ChooseFont - ChooseFont + Source Files\ChooseFont - ChooseFont + Source Files\ChooseFont - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers @@ -279,16 +279,16 @@ Header Files - Crypto + Source Files\Crypto - Crypto + Source Files\Crypto - Crypto + Source Files\Crypto - Crypto + Source Files\Crypto Resource Files @@ -300,85 +300,85 @@ Header Files - CED\util + Source Files\CED\util - CED\util + Source Files\CED\util - CED\util + Source Files\CED\util - CED\util + Source Files\CED\util - CED\util + Source Files\CED\util - CED\util + Source Files\CED\util - CED\util + Source Files\CED\util - CED\util\languages + Source Files\CED\util\languages - CED\util\languages + Source Files\CED\util\languages - CED\util\encodings + Source Files\CED\util\encodings - CED\util\encodings + Source Files\CED\util\encodings - CED\compact_enc_det + Source Files\CED\compact_enc_det - CED\compact_enc_det + Source Files\CED\compact_enc_det - CED\compact_enc_det + Source Files\CED\compact_enc_det - CED\compact_enc_det + Source Files\CED\compact_enc_det Header Files - tinyexpr + Source Files\tinyexpr - ChooseFont + Source Files\ChooseFont - ChooseFont + Source Files\ChooseFont - ChooseFont + Source Files\ChooseFont - StyleLexers + Source Files\StyleLexers - StyleLexers + Source Files\StyleLexers - uthash + Source Files\uthash - uthash + Source Files\uthash - uthash + Source Files\uthash - uthash + Source Files\uthash - uthash + Source Files\uthash