57 #ifdef _MGNCSENGINE_IME
63 #define IME_STOP_MSG 1
64 #define IME_CONTINUE_MSG 0
66 typedef int (*NCSCB_LEN_FIRST_CHAR)(
const unsigned char*,
int len);
68 typedef int (*NCSCB_RETRIEVE_CHAR)(
const char*);
69 typedef struct _CHARSET_CONVERTER
72 NCSCB_RETRIEVE_CHAR retrieve_char;
77 MGNCS_EXPORT BOOL ncsIMInitCharsetConv(CHARSET_CONVERTER* conv,
const char* from_charset,
const char* to_charset, NCSCB_RETRIEVE_CHAR retrieve_char);
78 MGNCS_EXPORT
void ncsIMFreeCharsetConv(CHARSET_CONVERTER* conv);
79 MGNCS_EXPORT
unsigned int ncsIMCharsetConv(CHARSET_CONVERTER* conv,
const char ** pwords);
80 MGNCS_EXPORT
char* ncsIMConvertWord(CHARSET_CONVERTER* conv,
const char* word,
char* out,
int len);
82 MGNCS_EXPORT NCSCB_LEN_FIRST_CHAR ncsIMGetFirstCharCallback(
const char* encoding);
84 typedef struct _mIMEngineClass mIMEngineClass;
85 typedef struct _mIMEngine mIMEngine;
86 typedef struct _mIMIteratorClass mIMIteratorClass;
87 typedef struct _mIMIterator mIMIterator;
89 #define NCS_IM_SCANCODE_ISDIGIT(s) ((s) >= SCANCODE_1 && (s) <= SCANCODE_0)
90 #define NCS_IM_SCANCODE_ISALPHA(s) \
91 ( ((s) >= SCANCODE_Q && (s) <= SCANCODE_P) \
92 || ((s) >= SCANCODE_A && (s) <= SCANCODE_L) \
93 || ((s) >= SCANCODE_Z && (s) <= SCANCODE_M) \
100 #define mIMIteratorClassHeader(clss, super) \
101 mObjectClassHeader(clss, super) \
102 PUBLIC void (*empty)(clss*); \
103 PUBLIC int (*count)(clss*); \
104 PUBLIC int (*next)(clss*); \
105 PUBLIC int (*prev)(clss*); \
106 PUBLIC int (*locate)(clss*,int off, int type); \
107 PUBLIC int (*curIndex)(clss*); \
108 PUBLIC DWORD (*setProperty)(clss*, int id, DWORD valude); \
109 PUBLIC DWORD (*getProperty)(clss*, int id); \
110 PUBLIC const char*(*word)(clss*);
112 #define mIMIteratorHeader(clss) \
113 mObjectHeader(clss) \
114 CHARSET_CONVERTER *charset_converter;
117 struct _mIMIteratorClass {
118 mIMIteratorClassHeader(mIMIterator,
mObject)
121 struct _mIMIterator {
122 mIMIteratorHeader(mIMIterator)
125 MGNCS_EXPORT
extern mIMIteratorClass g_stmIMIteratorCls;
127 #define MAX_IME_NAME_LEN 16
128 #define mIMEngineClassHeader(clss, super) \
129 mObjectClassHeader(clss, super) \
130 const char* (*imeName)(clss*); \
131 mIMEngine * (*create)(const char* pdict, DWORD add_data); \
132 const char* (*getEncoding)(clss*); \
133 PROTECTED NCSCB_RETRIEVE_CHAR (*getRetrieveChar)(clss*);\
134 mIMIterator* (*newIterator)(clss*); \
135 mIMIterator* (*newAssocIterator)(clss*); \
137 BOOL (*findWords)(clss*, mIMIterator* it, const char* input, int start); \
138 BOOL (*findAssociate)(clss*, mIMIterator* it, const char* input);
140 #define mIMEngineHeader(clss) \
143 struct _mIMEngineClass{
144 mIMEngineClassHeader(mIMEngine,
mObject)
148 mIMEngineHeader(mIMEngine)
151 MGNCS_EXPORT
extern mIMEngineClass g_stmIMEngineCls;
153 typedef struct _mIMEClass mIMEClass;
154 typedef struct _mIME mIME;
156 typedef struct _mIMManagerClass mIMManagerClass;
157 typedef struct _mIMManager mIMManager;
160 #define NCS_MAX_INPUT 128
161 #define NCS_IME_UPDATE_KEY 0x01
162 #define NCS_IME_UPDATE_WORDS 0x02
163 #define NCS_IME_UPDATE_FEEDBACK 0x04
164 #define NCS_IME_UPDATE_CURSOR 0x08
165 #define NCS_IME_UPDATE_ALL 0xFFFF
167 #define NCS_IMM_BEGIN (MSG_USER + 100)
168 #define NCS_IMM_UPDATE (NCS_IMM_BEGIN + 1)
170 #define NCS_IMM_GETSELWORD (NCS_IMM_BEGIN + 2)
172 #define NCS_IMM_ISSELWORDCTRLACTIVE (NCS_IMM_BEGIN + 3)
173 #define NCS_IMM_SETSELWORDACTIVE (NCS_IMM_BEGIN + 4)
175 #define mIMEClassHeader(clss, super) \
176 mObjectClassHeader(clss, super) \
178 PROTECTED BOOL (*showIME)(clss*); \
179 PROTECTED void (*hideIME)(clss*); \
180 PROTECTED void (*update)(clss*, DWORD flfags); \
181 PROTECTED const char* (*getSelWord)(clss*, BOOL braw); \
182 PROTECTED DWORD (*getIMStatus)(clss*, int); \
183 PROTECTED BOOL (*setIMStatus)(clss*,int, DWORD); \
184 PROTECTED BOOL (*onCaretPos)(clss*, int,int); \
185 PROTECTED BOOL (*findWords)(clss*, const char* input, int start, int len); \
186 PROTECTED BOOL (*findAssociate)(clss*, const char* words); \
187 PROTECTED BOOL (*emptyKey)(clss*); \
188 PROTECTED BOOL (*setEncoding)(clss*, const char*); \
189 PROTECTED BOOL (*addChar)(clss*, int ch); \
190 PROTECTED BOOL (*delChar)(clss*,BOOL bback); \
191 PROTECTED BOOL (*setInsert)(clss*, int pos, int type); \
192 PROTECTED BOOL (*clearInput)(clss*); \
193 PROTECTED int (*onChar)(clss*, int ch,DWORD keyflags); \
194 PROTECTED int (*onKeyDown)(clss*,int scancode, DWORD keyflags); \
195 PUBLIC void (*setIMEngine)(clss*, mIMEngine*); \
196 PUBLIC void (*empty)(clss*, BOOL bUpdate);
199 #define mIMEHeader(clss) \
200 mObjectHeader(clss) \
202 char input[NCS_MAX_INPUT]; \
206 mIMManager *ime_manager; \
207 mIMEngine *ime_engine; \
208 mIMIterator *key_it; \
209 mIMIterator *assoc_it; \
210 CHARSET_CONVERTER charset_conv; \
212 WNDPROC old_view_proc;
222 MGNCS_EXPORT
extern mIMEClass g_stmIMECls;
224 #define mIME_sendWords(ime) (_c(ime->ime_manager)->sendWords(ime->ime_manager))
225 #define mIME_sendKeys(ime) (_c(ime->ime_manager)->sendKeys(ime->ime_manager))
227 #define mIME_FromView(hwnd) ((mIME*)GetWindowAdditionalData(hwnd))
228 MGNCS_EXPORT
void mIME_attach(mIME *ime, HWND hwnd);
230 MGNCS_EXPORT
void mIME_passMessage(mIME* ime, UINT message, WPARAM wParam, LPARAM lParam);
231 #define mIMView_passMessage(hwnd, message, wParam, lParam) \
232 mIME_passMessage(mIME_FromView(hwnd), (message), (wParam), (lParam))
234 #define mIMManagerClassHeader(clss, super) \
235 mObjectClassHeader(clss, super) \
236 PROTECTED int (*procIMMsg)(clss*,UINT,WPARAM,LPARAM,LRESULT*); \
237 PROTECTED BOOL (*nextIME)(clss*); \
238 PROTECTED BOOL (*setIME)(clss*, const char*); \
239 PUBLIC BOOL (*addIME)(clss*, mIME *ime); \
240 PROTECTED BOOL (*sendWords)(clss*); \
241 PROTECTED BOOL (*sendKeys)(clss*); \
242 PUBLIC void (*setEncoding)(clss*, const char*);
244 #define mIMManagerHeader(clss) \
245 mObjectHeader(clss) \
246 NCSCB_LEN_FIRST_CHAR len_first_char; \
255 #define NCSF_IMM_DISABLE 0x01
256 #define NCSF_IMM_ACTIVED 0x02
257 #define NCSF_IMM_NULLIME 0x04
258 #define NCSF_IMM_SETTING_IME 0x80000000
261 NCSN_IMM_IMEOPEN = 5678,
266 struct _mIMManagerClass {
267 mIMManagerClassHeader(mIMManager,
mObject)
270 mIMManagerHeader(mIMManager)
273 MGNCS_EXPORT
extern mIMManagerClass g_stmIMManagerCls;
275 #endif //_MGNCSENGINE_IME
280 #ifdef _MGNCSENGINE_DIGIT
282 #define NCS_DIGIT_MAX_FINDS 32
284 #define mDigitIteratorClassHeader(clss, super) \
285 mIMIteratorClassHeader(clss, super) \
286 PUBLIC mIMIterator* (*subIterator)(clss*);
288 #define mDigitIteratorHeader(clss) \
289 mIMIteratorHeader(clss) \
292 mIMIterator * sub_it; \
293 const char** words; \
294 int finds[NCS_DIGIT_MAX_FINDS][2];
296 DECLARE_CLASS(mDigitIterator, mIMIterator)
298 #define mDigitIMEClassHeader(clss, super) \
299 mIMEClassHeader(clss, super)
301 #define mDigitIMEHeader(clss) \
303 CHARSET_CONVERTER sub_conv;
305 DECLARE_CLASS(mDigitIME, mIME)
308 #define mDigitEngineClassHeader(clss, super) \
309 mIMEngineClassHeader(clss, super) \
310 PROTECTED BOOL (*findRange)(clss*, \
312 int start, int len, \
313 int *pbegin, int *pend);
315 #define mDigitEngineHeader(clss) \
316 mIMEngineHeader(clss) \
317 mIMEngine* sub_engine;
319 DECLARE_CLASS(mDigitEngine, mIMEngine)
321 #endif //_MGNCSENGINE_DIGIT
323 #ifdef _MGNCSENGINE_DIGITPTI
326 #define mDigitPtiEngineClassHeader(clss, super) \
327 mDigitEngineClassHeader(clss, super)
329 #define mDigitPtiEngineHeader(clss) \
330 mDigitEngineHeader(clss) \
333 DECLARE_CLASS(mDigitPtiEngine, mDigitEngine)
335 #define mDigitPtiIteratorClassHeader(clss, super) \
336 mDigitIteratorClassHeader(clss, super)
338 #define mDigitPtiIteratorHeader(clss) \
339 mDigitIteratorHeader(clss) \
340 char* letters; //only for signle letters, for example "a\0b\0\c\0"
342 DECLARE_CLASS(mDigitPtiIterator, mDigitIterator)
344 #endif //_MGNCSENGINE_DIGITPTI
349 #ifdef _MGNCSENGINE_DIGITPY
351 #define mDigitPyEngineClassHeader(clss, super) \
352 mDigitEngineClassHeader(clss, super)
354 #define mDigitPyEngineHeader(clss) \
355 mDigitEngineHeader(clss) \
357 unsigned int * keys; \
358 const char** pinyins;
360 DECLARE_CLASS(mDigitPyEngine, mDigitEngine)
362 #define mDigitPyIteratorClassHeader(clss, super) \
363 mDigitIteratorClassHeader(clss, super)
366 #define mDigitPyIteratorHeader(clss) \
367 mDigitIteratorHeader(clss) \
368 mIMEngine* py_engine;
370 DECLARE_CLASS(mDigitPyIterator, mDigitIterator)
372 #endif //_MGNCSENGINE_DIGITPY
376 #ifdef _MGNCSENGINE_PTI
378 #define mPtiIteratorClassHeader(clss, super) \
379 mIMIteratorClassHeader(clss, super)
381 #define mPtiIteratorHeader(clss) \
382 mIMIteratorHeader(clss) \
384 const char** words; \
387 char upper_buffer[128]; \
389 const char* lead_letter;
391 DECLARE_CLASS(mPtiIterator, mIMIterator)
393 #define mPtiEngineClassHeader(clss, super) \
394 mIMEngineClassHeader(clss, super)
396 #define MGPTI_2ND_HASH_TABLE_SIZE 100
403 typedef struct _MGPTI_2ND_HASH_BUCKET {
406 } MGPTI_2ND_HASH_BUCKET;
408 typedef struct _MGPTI_1ST_HASH_BUCKET {
410 MGPTI_2ND_HASH_BUCKET* buckets;
411 } MGPTI_1ST_HASH_BUCKET;
414 #define mPtiEngineHeader(clss) \
415 mIMEngineHeader(clss) \
416 char **sorted_words; \
418 MGPTI_1ST_HASH_BUCKET *buckets[26];
421 DECLARE_CLASS(mPtiEngine, mIMEngine)
423 MGNCS_EXPORT BOOL mPtiEngine_findWordRange(mPtiEngine*
self,
int* pbegin,
int* pend,
const char* input,
int start,
int len);
425 #endif //_MGNCSENGINE_PTI
429 #ifdef _MGNCSENGINE_PINYIN
431 #define PINYIN_MAGIC_NUMBER "CCEGB"
432 #define PINYIN_ENAME_LENGTH 24
433 #define PINYIN_CNAME_LENGTH 16
434 #define PINYIN_WORD_LENGTH 16
435 #define PINYIN_SELECT_KEY_LENGTH 16
436 #define PINYIN_KEY_LENGTH 16
437 #define PINYIN_SEL_LENGTH 58
443 unsigned short word_offset_idx;
444 unsigned short frequency;
448 unsigned int off_begin;
449 unsigned int off_end;
450 }NCS_PINYIN_PHOFFSET;
453 char magic_number[
sizeof(PINYIN_MAGIC_NUMBER)];
454 char ename[PINYIN_ENAME_LENGTH];
455 char cname[PINYIN_CNAME_LENGTH];
456 char selkey[PINYIN_SELECT_KEY_LENGTH];
464 unsigned char keyMap[128];
465 unsigned char keyName[64];
466 unsigned short keyIndex[64];
471 NCS_PINYIN_ITEM * item;
472 }NCS_PINYIN_IME_TABLE;
475 #define mPinyinEngineClassHeader(clss, super) \
476 mIMEngineClassHeader(clss, super)
478 #define mPinyinEngineHeader(clss) \
479 mIMEngineHeader(clss) \
480 NCS_PINYIN_IME_TABLE * ime_table;
482 DECLARE_CLASS(mPinyinEngine, mIMEngine)
484 #define PINYIN_MAX_WORD 64
485 #define PINYIN_MAX_WORDLEN 64
486 #define PINYIN_INPUT_MAX 32
493 }NCS_PINYIN_WORD_INFO;
496 #define mPinyinIteratorClassHeader(clss, super) \
497 mIMIteratorClassHeader(clss, super)
499 #define mPinyinIteratorHeader(clss) \
500 mIMIteratorHeader(clss) \
503 unsigned int charIndex[PINYIN_INPUT_MAX]; \
504 unsigned int startKey; \
505 unsigned int endKey; \
506 unsigned long matched_key1; \
507 unsigned long matched_key2; \
508 NCS_PINYIN_WORD_INFO words[PINYIN_MAX_WORD]; \
509 char word[PINYIN_MAX_WORDLEN]; \
512 DECLARE_CLASS(mPinyinIterator, mIMIterator)
514 #if MGUI_BYTEORDER == MGUI_BIG_ENDIAN
515 #define ARCH_SWAP16(v16) ArchSwap16(v16)
516 #define ARCH_SWAP32(v32) ArchSwap32(v32)
518 #define ARCH_SWAP16(v16) (v16)
519 #define ARCH_SWAP32(v32) (v32)
526 #endif //_MGNCSENGINE_PINYIN