Home » U++ Library support » U++ Libraries and TheIDE: i18n, Unicode and Internationalization » Japanese IME test code
Re: Japanese IME test code [message #15810 is a reply to message #15745] |
Thu, 08 May 2008 08:04 |
mobilehunter
Messages: 87 Registered: November 2006
|
Member |
|
|
I change my codes to support "on-the-spot" mode of IME for Windows, i also tried playing with XIM for linux, tested againt SCIM (this will come later sometime:)).
I still have problem with caret, and many behaviours not supported.
For this mode i tested with EditField control (i have to modify it's Paint function).
Here are my codes:
At CtrlCore.h
//Added for CJK
public:
virtual bool ImeIsInPreEditMode() { return imeIsInPreEditMode;}
virtual Font ImePreEditFont();
virtual Point ImePreEditStartPoint();
virtual void ImePreEditSetText(const WString & text);
virtual int ImePreEditGetTextCx(const wchar *txt, int n, bool password, Font fnt);
virtual void ImePreEditStart();
virtual void ImePreEditEnd();
virtual void ImePreEditSyncCaret();
virtual int ImePreEditPaint(Draw &w,int fcy, Color ink, Color paper, Font fnt);
private:
Font imeFont;
bool imeIsInPreEditMode;
Point imePreEditPoint;
int imePreEditCursor;
WString imePreEditString;
//End of CJK
At Ctrl.cpp
//Added for CJK
Font Ctrl::ImePreEditFont()
{
return StdFont();
}
Point Ctrl::ImePreEditStartPoint()
{
return Point(caretx,carety);
}
void Ctrl::ImePreEditSetText(const WString& text)
{
imePreEditString = text;
Refresh();
}
void Ctrl::ImePreEditSyncCaret()
{
int x = ImePreEditGetTextCx(imePreEditString,imePreEditCursor,false,imeFont);
FontInfo fi = imeFont.Info();
int ty = (GetSize().cy + 1 - fi.GetHeight()) / 2;
caretx=imePreEditPoint.x + x + 2 - fi.GetRightSpace('o') + fi.GetLeftSpace('o');
carety=ty;
caretcx=1;
caretcy=min(GetSize().cy - 2 * ty, fi.GetHeight());
}
int Ctrl::ImePreEditGetTextCx(const wchar *txt, int n, bool password, Font fnt)
{
FontInfo fi = fnt.Info();
if(password)
return n * fi['*'];
const wchar *s = txt;
int x = 0;
while(n--)
x += fi[*s++];
return x;
}
void Ctrl::ImePreEditStart()
{
imePreEditPoint = ImePreEditStartPoint();
imeIsInPreEditMode = true;
imePreEditCursor=0;
imePreEditString="";
imeFont = ImePreEditFont();
}
void Ctrl::ImePreEditEnd()
{
imeIsInPreEditMode = true;
imePreEditCursor=0;
imePreEditString="";
Refresh();
}
int Ctrl::ImePreEditPaint(Draw &w,int fcy, Color ink, Color paper, Font fnt)
{
int n=imePreEditString.GetLength();
if(n < 0) return 0;
const wchar * imtxt=imePreEditString;
int cx = ImePreEditGetTextCx(imePreEditString,n,false,imeFont);
w.DrawRect(imePreEditPoint.x, 0, cx, fcy, paper);
w.DrawText(imePreEditPoint.x, 0, imtxt, fnt, ink, n);
//draw feedback
w.DrawLine(imePreEditPoint.x,fcy,imePreEditPoint.x+cx,fcy,1);
return cx;
}
//End of CJK
At Win32Proc.cpp
case WM_IME_STARTCOMPOSITION:
{
Ctrl*f=GetFocusChild();
f->ImePreEditStart();
CANDIDATEFORM cf;
cf.dwStyle = CFS_CANDIDATEPOS;
cf.ptCurrentPos.x = f->imePreEditPoint.x;
cf.ptCurrentPos.y = f->imePreEditPoint.y;
HIMC hIMC = ImmGetContext(hwnd);
ImmSetCandidateWindow(hIMC, &cf);
ImmReleaseContext(hwnd, hIMC);
return 0L;
}
case WM_IME_ENDCOMPOSITION:
{
Ctrl*f=GetFocusChild();
f->ImePreEditEnd();
return 0L;
}
case WM_IME_COMPOSITION:
{
Ctrl*f=GetFocusChild();
if(lParam & GCS_COMPSTR)
{
HWND hWnd =GetHWND();
HIMC hIMC = ImmGetContext(hwnd);
long dwSize = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0);
wchar temp[1024];
wchar attribute[10];
if(lParam & GCS_COMPATTR)
{
int attrLen=ImmGetCompositionStringW(hIMC, GCS_COMPATTR, NULL, 0);
ImmGetCompositionStringW(hIMC, GCS_COMPATTR, attribute, attrLen);
LOGHEXDUMP(attribute,attrLen);
}
ImmGetCompositionStringW(hIMC, GCS_COMPSTR, temp, dwSize);
if(lParam & GCS_CURSORPOS)
{
int cursor = ImmGetCompositionString(hIMC, GCS_CURSORPOS, NULL, 0);
DUMP(cursor);
if(attribute[0] != ATTR_TARGET_CONVERTED)
f->imePreEditCursor = cursor/2;
}
ImmReleaseContext(hWnd, hIMC);
f->ImePreEditSetText(WString(temp,dwSize/2));
if(attribute[0] != ATTR_TARGET_CONVERTED)
{
f->ImePreEditSyncCaret();
SyncCaret();
}
return 0L;
}
break;
}
And at EditField.cpp
if(GetSelection(l, h)) {
Paints(w, x, fcy, txt, ink, paper, l, password, font);
Paints(w, x, fcy, txt, enabled ? st->selectedtext : paper,
enabled ? st->selected : ink, h - l, password, font);
Paints(w, x, fcy, txt, ink, paper, text.GetLength() - h, password, font);
}
else
{
if(!ImeIsInPreEditMode())
Paints(w, x, fcy, txt, ink, paper, text.GetLength(), password, font);
else
{
Paints(w, x, fcy, txt, ink, paper, cursor, password, font);
x+=ImePreEditPaint(w,fcy,ink,paper,font);
Paints(w, x, fcy, txt, ink, paper,text.GetLength() - cursor , password, font);
}
}
|
|
|
|
|
Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Sun, 06 April 2008 08:14
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Tue, 15 April 2008 21:17
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Wed, 23 April 2008 10:02
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Sat, 26 April 2008 10:26
|
|
|
Re: Japanese IME test code
By: mirek on Sat, 26 April 2008 10:27
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Sat, 26 April 2008 15:00
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Tue, 29 April 2008 18:56
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Tue, 06 May 2008 19:49
|
|
|
Re: Japanese IME test code
By: mirek on Tue, 06 May 2008 22:21
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Thu, 08 May 2008 09:52
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Wed, 14 May 2008 09:13
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
|
|
|
Re: Japanese IME test code
By: mirek on Fri, 16 May 2008 09:14
|
Goto Forum:
Current Time: Sat Sep 21 03:24:49 CEST 2024
Total time taken to generate the page: 0.03873 seconds
|