Merge pull request #687 from RaiKoHoff/Dev_0918

IME and Auto-Completion cooperation
This commit is contained in:
Rainer Kottenhoff 2018-09-19 02:50:11 +02:00 committed by GitHub
commit c2dabe462b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 46 additions and 260 deletions

View File

@ -1541,27 +1541,6 @@
#define SCE_TXT2TAGS_OPTION 23
#define SCE_TXT2TAGS_PREPROC 24
#define SCE_TXT2TAGS_POSTPROC 25
#define SCE_AHK_DEFAULT 0
#define SCE_AHK_COMMENTLINE 1
#define SCE_AHK_COMMENTBLOCK 2
#define SCE_AHK_ESCAPE 3
#define SCE_AHK_SYNOPERATOR 4
#define SCE_AHK_EXPOPERATOR 5
#define SCE_AHK_STRING 6
#define SCE_AHK_NUMBER 7
#define SCE_AHK_IDENTIFIER 8
#define SCE_AHK_VARREF 9
#define SCE_AHK_LABEL 10
#define SCE_AHK_WORD_CF 11
#define SCE_AHK_WORD_CMD 12
#define SCE_AHK_WORD_FN 13
#define SCE_AHK_WORD_DIR 14
#define SCE_AHK_WORD_KB 15
#define SCE_AHK_WORD_VAR 16
#define SCE_AHK_WORD_SP 17
#define SCE_AHK_WORD_UD 18
#define SCE_AHK_VARREFKW 19
#define SCE_AHK_ERROR 20
#define SCE_A68K_DEFAULT 0
#define SCE_A68K_COMMENT 1
#define SCE_A68K_NUMBER_DEC 2

View File

@ -103,6 +103,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SC_IME_INLINE 1
#define SCI_GETIMEINTERACTION 2678
#define SCI_SETIMEINTERACTION 2679
#define SCI_ISIMEOPEN 2717
#define SCI_ISIMEMODECJK 2718
#define MARKER_MAX 31
#define SC_MARK_CIRCLE 0
#define SC_MARK_ROUNDRECT 1
@ -399,9 +401,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCI_GETPRINTCOLOURMODE 2149
#define SCFIND_WHOLEWORD 0x2
#define SCFIND_MATCHCASE 0x4
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
#define SCFIND_DOT_MATCH_ALL 0x1000
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
#define SCFIND_WORDSTART 0x00100000
#define SCFIND_REGEXP 0x00200000
#define SCFIND_POSIX 0x00400000
@ -691,10 +691,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SC_POPUP_TEXT 2
#define SCI_USEPOPUP 2371
#define SCI_SELECTIONISRECTANGLE 2372
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
#define SC_MIN_ZOOM_LEVEL 10
#define SC_MAX_ZOOM_LEVEL 500
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
#define SCI_SETZOOM 2373
#define SCI_GETZOOM 2374
#define SC_DOCUMENTOPTION_DEFAULT 0
@ -1046,14 +1044,6 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SC_MOD_INSERTCHECK 0x100000
#define SC_MOD_CHANGETABSTOPS 0x200000
#define SC_MODEVENTMASKALL 0x3FFFFF
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
#define SC_IME_CLOSE 0
#define SC_IME_OPEN 1
#define SCI_GETIMEOPEN 3860 // to Neil: I do not know how to allocate number. Change it.
#define SC_IME_MODE_NATIVE 0 // = IME_CMODE_ALPHANUMERIC
#define SC_IME_MODE_CJK 1 // Other than IME_CMODE_ALPHANUMERIC
#define SCI_GETIMEMODEACTIVE 3861 // to Neil: I do not know how to allocate number. Change it.
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
#define SC_UPDATE_CONTENT 0x1
#define SC_UPDATE_SELECTION 0x2
#define SC_UPDATE_V_SCROLL 0x4

View File

@ -266,6 +266,11 @@ get int GetIMEInteraction=2678(,)
# Choose to display the the IME in a winow or inline.
set void SetIMEInteraction=2679(int imeInteraction,)
# >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
get bool IsIMEOpen=2717(,)
get bool IsIMEModeCJK=2718(,)
# <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
enu MarkerSymbol=SC_MARK_
val MARKER_MAX=31
val SC_MARK_CIRCLE=0
@ -949,6 +954,9 @@ get int GetPrintColourMode=2149(,)
enu FindOption=SCFIND_
val SCFIND_WHOLEWORD=0x2
val SCFIND_MATCHCASE=0x4
# >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
val SCFIND_DOT_MATCH_ALL=0x1000
# <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
val SCFIND_WORDSTART=0x00100000
val SCFIND_REGEXP=0x00200000
val SCFIND_POSIX=0x00400000
@ -2766,14 +2774,6 @@ val SC_MOD_INSERTCHECK=0x100000
val SC_MOD_CHANGETABSTOPS=0x200000
val SC_MODEVENTMASKALL=0x3FFFFF
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
# modifiers for SCN_CHARADDED: normal input, inline IME tentative, IME full composited
val SC_IME_CLOSE=0
val SC_IME_OPEN=1
val SC_IME_MODE_NATIVE=0
val SC_IME_MODE_CJK=1
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
enu Update=SC_UPDATE_
val SC_UPDATE_CONTENT=0x1
val SC_UPDATE_SELECTION=0x2
@ -4910,29 +4910,6 @@ val SCE_SAS_MACRO_KEYWORD=12
val SCE_SAS_BLOCK_KEYWORD=13
val SCE_SAS_MACRO_FUNCTION=14
val SCE_SAS_STATEMENT=15
# Lexical states for SCLEX_AHK
lex AHK=SCLEX_AHK SCE_AHK_
val SCE_AHK_DEFAULT=0
val SCE_AHK_COMMENTLINE=1
val SCE_AHK_COMMENTBLOCK=2
val SCE_AHK_ESCAPE=3
val SCE_AHK_SYNOPERATOR=4
val SCE_AHK_EXPOPERATOR=5
val SCE_AHK_STRING=6
val SCE_AHK_NUMBER=7
val SCE_AHK_IDENTIFIER=8
val SCE_AHK_VARREF=9
val SCE_AHK_LABEL=10
val SCE_AHK_WORD_CF=11
val SCE_AHK_WORD_CMD=12
val SCE_AHK_WORD_FN=13
val SCE_AHK_WORD_DIR=14
val SCE_AHK_WORD_KB=15
val SCE_AHK_WORD_VAR=16
val SCE_AHK_WORD_SP=17
val SCE_AHK_WORD_UD=18
val SCE_AHK_VARREFKW=19
val SCE_AHK_ERROR=20
# Events

View File

@ -63,8 +63,8 @@ EditModel::EditModel() : braces{} {
primarySelection = true;
imeInteraction = imeWindowed;
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
isIMEOpen = SC_IME_CLOSE;
isIMEModeCJK = 0;
imeIsOpen = false;
imeIsInModeCJK = false;
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
bidirectional = Bidirectional::bidiDisabled;
foldFlags = 0;

View File

@ -38,8 +38,8 @@ public:
enum IMEInteraction { imeWindowed, imeInline } imeInteraction;
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
bool isIMEOpen;
bool isIMEModeCJK;
bool imeIsOpen;
bool imeIsInModeCJK;
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
enum class Bidirectional { bidiDisabled, bidiL2R, bidiR2L } bidirectional;

View File

@ -6789,11 +6789,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return imeInteraction;
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
case SCI_GETIMEOPEN:
return isIMEOpen;
case SCI_ISIMEOPEN:
return imeIsOpen;
case SCI_GETIMEMODEACTIVE:
return isIMEModeCJK;
case SCI_ISIMEMODECJK:
return imeIsInModeCJK;
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
case SCI_SETBIDIRECTIONAL:

View File

@ -1029,26 +1029,30 @@ bool ScintillaWin::KoreanIME() noexcept {
const int codePage = InputCodePage();
return codePage == 949 || codePage == 1361;
}
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
bool ScintillaWin::IsIMEOpen() {
IMContext imc(MainHWND());
if (imc.hIMC) {
if (ImmGetOpenStatus(imc.hIMC))
return true;
if (ImmGetOpenStatus(imc.hIMC)) {
return true;
}
}
return false;
}
DWORD ScintillaWin::GetIMEInputMode() {
DWORD dwConversion, dwSentence;
IMContext imc(MainHWND());
if (imc.hIMC && ImmGetOpenStatus(imc.hIMC)) {
if (ImmGetConversionStatus(imc.hIMC, &dwConversion, &dwSentence))
DWORD dwConversion = IME_CMODE_ALPHANUMERIC, dwSentence = IME_SMODE_NONE;
if (ImmGetConversionStatus(imc.hIMC, &dwConversion, &dwSentence)) {
return dwConversion;
}
}
return 0;
}
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
void ScintillaWin::MoveImeCarets(Sci::Position offset) {
// Move carets relatively by bytes.
for (size_t r = 0; r < sel.Count(); r++) {
@ -1749,17 +1753,14 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam
return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam);
// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>>
case WM_IME_NOTIFY: {
case WM_IME_NOTIFY:
if (wParam == IMN_SETOPENSTATUS) {
isIMEOpen = (IsIMEOpen() ? SC_IME_OPEN : SC_IME_CLOSE);
imeIsOpen = IsIMEOpen();
}
if (wParam == IMN_SETOPENSTATUS || wParam == IMN_SETCONVERSIONMODE) {
DWORD dwIMEInputMode = GetIMEInputMode();
isIMEModeCJK = (dwIMEInputMode != IME_CMODE_ALPHANUMERIC ?
SC_IME_MODE_CJK : SC_IME_MODE_NATIVE);
imeIsInModeCJK = (GetIMEInputMode() != IME_CMODE_ALPHANUMERIC);
}
return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam);
}
// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<<
// These are not handled in Scintilla and its faster to dispatch them here.

View File

@ -8353,142 +8353,4 @@ void EditShowZeroLengthCallTip(HWND hwnd, DocPos iPosition)
g_CallTipType = CT_ZEROLEN_MATCH;
}
//=============================================================================
//
// SciInitThemes()
//
//WNDPROC pfnSciWndProc = NULL;
//
//FARPROC pfnOpenThemeData = NULL;
//FARPROC pfnCloseThemeData = NULL;
//FARPROC pfnDrawThemeBackground = NULL;
//FARPROC pfnGetThemeBackgroundContentRect = NULL;
//FARPROC pfnIsThemeActive = NULL;
//FARPROC pfnDrawThemeParentBackground = NULL;
//FARPROC pfnIsThemeBackgroundPartiallyTransparent = NULL;
//
//bool bThemesPresent = false;
//extern bool bIsAppThemed;
//extern HMODULE hModUxTheme;
//
//void SciInitThemes(HWND hwnd)
//{
// if (hModUxTheme) {
//
// pfnOpenThemeData = GetProcAddress(hModUxTheme,"OpenThemeData");
// pfnCloseThemeData = GetProcAddress(hModUxTheme,"CloseThemeData");
// pfnDrawThemeBackground = GetProcAddress(hModUxTheme,"DrawThemeBackground");
// pfnGetThemeBackgroundContentRect = GetProcAddress(hModUxTheme,"GetThemeBackgroundContentRect");
// pfnIsThemeActive = GetProcAddress(hModUxTheme,"IsThemeActive");
// pfnDrawThemeParentBackground = GetProcAddress(hModUxTheme,"DrawThemeParentBackground");
// pfnIsThemeBackgroundPartiallyTransparent = GetProcAddress(hModUxTheme,"IsThemeBackgroundPartiallyTransparent");
//
// pfnSciWndProc = (WNDPROC)SetWindowLongPtrW(hwnd,GWLP_WNDPROC,(LONG_PTR)&SciThemedWndProc);
// bThemesPresent = true;
// }
//}
//
//
////=============================================================================
////
//// SciThemedWndProc()
////
//LRESULT CALLBACK SciThemedWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
//{
// static RECT rcContent;
//
// if (umsg == WM_NCCALCSIZE) {
// if (wParam) {
// LRESULT lresult = CallWindowProcW(pfnSciWndProc,hwnd,WM_NCCALCSIZE,wParam,lParam);
// NCCALCSIZE_PARAMS *csp = (NCCALCSIZE_PARAMS*)lParam;
//
// if (bThemesPresent && bIsAppThemed) {
// HANDLE hTheme = (HANDLE)pfnOpenThemeData(hwnd,L"edit");
// if(hTheme) {
// bool bSuccess = false;
// RECT rcClient;
//
// if(pfnGetThemeBackgroundContentRect(
// hTheme,NULL,/*EP_EDITTEXT*/1,/*ETS_NORMAL*/1,&csp->rgrc[0],&rcClient) == S_OK) {
// InflateRect(&rcClient,-1,-1);
//
// rcContent.left = rcClient.left-csp->rgrc[0].left;
// rcContent.top = rcClient.top-csp->rgrc[0].top;
// rcContent.right = csp->rgrc[0].right-rcClient.right;
// rcContent.bottom = csp->rgrc[0].bottom-rcClient.bottom;
//
// CopyRect(&csp->rgrc[0],&rcClient);
// bSuccess = true;
// }
// pfnCloseThemeData(hTheme);
//
// if (bSuccess)
// return WVR_REDRAW;
// }
// }
// return lresult;
// }
// }
//
// else if (umsg == WM_NCPAINT) {
// LRESULT lresult = CallWindowProcW(pfnSciWndProc,hwnd,WM_NCPAINT,wParam,lParam);
// if(bThemesPresent && bIsAppThemed) {
//
// HANDLE hTheme = (HANDLE)pfnOpenThemeData(hwnd,L"edit");
// if(hTheme) {
// RECT rcBorder;
// RECT rcClient;
// int nState;
//
// HDC hdc = GetWindowDC(hwnd);
//
// GetWindowRect(hwnd,&rcBorder);
// OffsetRect(&rcBorder,-rcBorder.left,-rcBorder.top);
//
// CopyRect(&rcClient,&rcBorder);
// rcClient.left += rcContent.left;
// rcClient.top += rcContent.top;
// rcClient.right -= rcContent.right;
// rcClient.bottom -= rcContent.bottom;
//
// ExcludeClipRect(hdc,rcClient.left,rcClient.top,rcClient.right,rcClient.bottom);
//
// if(pfnIsThemeBackgroundPartiallyTransparent(hTheme,/*EP_EDITTEXT*/1,/*ETS_NORMAL*/1))
// pfnDrawThemeParentBackground(hwnd,hdc,&rcBorder);
//
// /*
// ETS_NORMAL = 1
// ETS_HOT = 2
// ETS_SELECTED = 3
// ETS_DISABLED = 4
// ETS_FOCUSED = 5
// ETS_READONLY = 6
// ETS_ASSIST = 7
// */
//
// if(!IsWindowEnabled(hwnd))
// nState = /*ETS_DISABLED*/4;
// else if (GetFocus() == hwnd)
// nState = /*ETS_FOCUSED*/5;
// else if(SendMessage(hwnd,SCI_GETREADONLY,0,0))
// nState = /*ETS_READONLY*/6;
// else
// nState = /*ETS_NORMAL*/1;
//
// pfnDrawThemeBackground(hTheme,hdc,/*EP_EDITTEXT*/1,nState,&rcBorder,NULL);
// pfnCloseThemeData(hTheme);
//
// ReleaseDC(hwnd,hdc);
// return 0;
// }
// }
// return lresult;
// }
//
// return CallWindowProcW(pfnSciWndProc,hwnd,umsg,wParam,lParam);
//}
/// End of Edit.c \\\

View File

@ -426,29 +426,6 @@ HBITMAP ResizeImageForCurrentDPI(HBITMAP hbmp)
}
//=============================================================================
//
// PrivateIsAppThemed()
//
extern HMODULE hModUxTheme;
bool PrivateIsAppThemed()
{
bool bIsAppThemed = IsWin8() ? true : false;
if (hModUxTheme && !bIsAppThemed)
{
FARPROC pfnIsAppThemed = GetProcAddress(hModUxTheme,"IsAppThemed");
if (pfnIsAppThemed) {
bIsAppThemed = (bool)pfnIsAppThemed();
}
}
return bIsAppThemed;
}
//=============================================================================
//
// PrivateSetCurrentProcessExplicitAppUserModelID()

View File

@ -211,7 +211,6 @@ inline int ScaleToCurrentDPI(float fVal) { return float2int((fVal * g_uCurrentDP
inline int ScaleFontSize(float fSize) { return float2int((fSize * g_uCurrentDPI) / (float)g_uCurrentPPI); }
inline int ScaleFractionalFontSize(float fSize) { return float2int((fSize * 10.0f * g_uCurrentDPI) / (float)g_uCurrentPPI) * 10; }
bool PrivateIsAppThemed();
HRESULT PrivateSetCurrentProcessExplicitAppUserModelID(PCWSTR);
bool IsElevated();
bool IsUserAdmin();

View File

@ -27,6 +27,7 @@
#define NOMINMAX 1
#include <windows.h>
#include <commctrl.h>
#include <uxtheme.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <shellapi.h>
@ -343,7 +344,6 @@ WIN32_FIND_DATA fdCurFile;
UINT msgTaskbarCreated = 0;
HMODULE hModUxTheme = NULL;
HMODULE hRichEdit = NULL;
static bool g_bRunningWatch = false;
@ -718,8 +718,6 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInst, _In_
msgTaskbarCreated = RegisterWindowMessage(L"TaskbarCreated");
if (!IsWin8()) { hModUxTheme = LoadLibrary(L"uxtheme.dll"); }
hRichEdit = LoadLibrary(L"RICHED20.DLL"); // Use "RichEdit20W" for control in .rc
//hRichEdit = LoadLibrary(L"MSFTEDIT.DLL"); // Use "RichEdit50W" for control in .rc
@ -790,8 +788,6 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInst, _In_
Scintilla_ReleaseResources();
UnregisterClass(wchWndClass, g_hInstance);
if (hModUxTheme) { FreeLibrary(hModUxTheme); }
OleUninitialize();
if (g_hLngResContainer != g_hInstance) { FreeMUILibrary(g_hLngResContainer); }
@ -1799,7 +1795,7 @@ LRESULT MsgCreate(HWND hwnd, WPARAM wParam,LPARAM lParam)
hInstance,
NULL);
if (PrivateIsAppThemed()) {
if (IsAppThemed()) {
RECT rc, rc2;
@ -2051,13 +2047,12 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
REBARBANDINFO rbBand;
bool const bIsPrivAppThemed = PrivateIsAppThemed();
rbBand.cbSize = sizeof(REBARBANDINFO);
rbBand.fMask = /*RBBIM_COLORS | RBBIM_TEXT | RBBIM_BACKGROUND | */
RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE /*| RBBIM_SIZE*/;
//rbBand.fStyle = /*RBBS_CHILDEDGE |*//* RBBS_BREAK |*/ RBBS_FIXEDSIZE /*| RBBS_GRIPPERALWAYS*/;
rbBand.fStyle = bIsPrivAppThemed ? (RBBS_FIXEDSIZE | RBBS_CHILDEDGE) : RBBS_FIXEDSIZE;
rbBand.fStyle = bIsAppThemed ? (RBBS_FIXEDSIZE | RBBS_CHILDEDGE) : RBBS_FIXEDSIZE;
rbBand.hbmBack = NULL;
rbBand.lpText = L"Toolbar";
rbBand.hwndChild = g_hwndToolbar;
@ -2070,7 +2065,7 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
GetWindowRect(g_hwndReBar,&rc);
cyReBar = rc.bottom - rc.top;
cyReBarFrame = bIsPrivAppThemed ? 0 : 2;
cyReBarFrame = bIsAppThemed ? 0 : 2;
}
@ -2215,7 +2210,7 @@ LRESULT MsgThemeChanged(HWND hwnd, WPARAM wParam ,LPARAM lParam)
// reinitialize edit frame
if (PrivateIsAppThemed()) {
if (IsAppThemed()) {
bIsAppThemed = true;
SetWindowLongPtr(g_hwndEdit,GWL_EXSTYLE,GetWindowLongPtr(g_hwndEdit,GWL_EXSTYLE) & ~WS_EX_CLIENTEDGE);
@ -6366,13 +6361,10 @@ LRESULT MsgNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
if ((g_bAutoCompleteWords || g_bAutoCLexerKeyWords)) {
//if (g_bAutoCinASCIIModeOnly && (ich > 0x7F) ) {
bool isIMEModeActive,
bIMEOpen = (bool)SendMessage(g_hwndEdit, SCI_GETIMEOPEN, 0, 0);
if (bIMEOpen) { // || (scn->modifiers != SC_CHARADDED_NORMAL)
isIMEModeActive = (bool)SendMessage(g_hwndEdit, SCI_GETIMEMODEACTIVE, 0, 0);
if (isIMEModeActive ) {
if (SciCall_IsIMEOpen()) {
if (SciCall_IsIMEModeCJK()) {
SciCall_AutoCCancel();
return 0LL;
return 0;
}
}
//} //g_bAutoCinASCIIModeOnly section

View File

@ -439,7 +439,16 @@ DeclareSciCallV1(SetUndoCollection, SETUNDOCOLLECTION, bool, bCollectUndo)
DeclareSciCallV1(SetBufferedDraw, SETBUFFEREDDRAW, bool, value)
DeclareSciCallV1(SetTechnology, SETTECHNOLOGY, int, technology)
DeclareSciCallV1(SetBidirectional, SETBIDIRECTIONAL, int, direction)
//=============================================================================
//
// IME
//
DeclareSciCallV1(SetIMEInteraction, SETIMEINTERACTION, int, interact)
DeclareSciCallR0(IsIMEOpen, ISIMEOPEN, bool)
DeclareSciCallR0(IsIMEModeCJK, ISIMEMODECJK, bool)
//=============================================================================
//