1 // Scintilla source code edit control
3 ** Korean Hanja Dictionary
4 ** Convert between Korean Hanja and Hangul by COM interface.
6 // Copyright 2015 by Neil Hodgson <neilh@scintilla.org>
7 // The License.txt file describes the conditions under which this software may be distributed.
11 #include "UniConversion.h"
15 using namespace Scintilla
;
24 typedef enum { HANJA_UNKNOWN
= 0, HANJA_K0
= 1, HANJA_K1
= 2, HANJA_OTHER
= 3 } HANJA_TYPE
;
26 interface IHanjaDic
: IUnknown
{
27 STDMETHOD(OpenMainDic
)();
28 STDMETHOD(CloseMainDic
)();
29 STDMETHOD(GetHanjaWords
)(BSTR bstrHangul
, SAFEARRAY
* ppsaHanja
, VARIANT_BOOL
* pfFound
);
30 STDMETHOD(GetHanjaChars
)(unsigned short wchHangul
, BSTR
* pbstrHanjaChars
, VARIANT_BOOL
* pfFound
);
31 STDMETHOD(HanjaToHangul
)(BSTR bstrHanja
, BSTR
* pbstrHangul
);
32 STDMETHOD(GetHanjaType
)(unsigned short wchHanja
, HANJA_TYPE
* pHanjaType
);
33 STDMETHOD(GetHanjaSense
)(unsigned short wchHanja
, BSTR
* pbstrSense
);
34 STDMETHOD(GetRadicalID
)(short SeqNumOfRadical
, short* pRadicalID
, unsigned short* pwchRadical
);
35 STDMETHOD(GetRadical
)(short nRadicalID
, IRadical
** ppIRadical
);
36 STDMETHOD(RadicalIDToHanja
)(short nRadicalID
, unsigned short* pwchRadical
);
37 STDMETHOD(GetHanja
)(unsigned short wchHanja
, IHanja
** ppIHanja
);
38 STDMETHOD(GetStrokes
)(short nStrokes
, IStrokes
** ppIStrokes
);
39 STDMETHOD(OpenDefaultCustomDic
)();
40 STDMETHOD(OpenCustomDic
)(BSTR bstrPath
, long* plUdr
);
41 STDMETHOD(CloseDefaultCustomDic
)();
42 STDMETHOD(CloseCustomDic
)(long lUdr
);
43 STDMETHOD(CloseAllCustomDics
)();
44 STDMETHOD(GetDefaultCustomHanjaWords
)(BSTR bstrHangul
, SAFEARRAY
** ppsaHanja
, VARIANT_BOOL
* pfFound
);
45 STDMETHOD(GetCustomHanjaWords
)(long lUdr
, BSTR bstrHangul
, SAFEARRAY
** ppsaHanja
, VARIANT_BOOL
* pfFound
);
46 STDMETHOD(PutDefaultCustomHanjaWord
)(BSTR bstrHangul
, BSTR bstrHanja
);
47 STDMETHOD(PutCustomHanjaWord
)(long lUdr
, BSTR bstrHangul
, BSTR bstrHanja
);
48 STDMETHOD(MaxNumOfRadicals
)(short* pVal
);
49 STDMETHOD(MaxNumOfStrokes
)(short* pVal
);
50 STDMETHOD(DefaultCustomDic
)(long* pVal
);
51 STDMETHOD(DefaultCustomDic
)(long pVal
);
52 STDMETHOD(MaxHanjaType
)(HANJA_TYPE
* pHanjaType
);
53 STDMETHOD(MaxHanjaType
)(HANJA_TYPE pHanjaType
);
56 extern "C" const GUID
__declspec(selectany
) IID_IHanjaDic
=
57 { 0xad75f3ac, 0x18cd, 0x48c6, { 0xa2, 0x7d, 0xf1, 0xe9, 0xa7, 0xdc, 0xe4, 0x32 } };
65 IHanjaDic
*HJinterface
;
67 HanjaDic() : HJinterface(NULL
) {
68 hr
= CLSIDFromProgID(OLESTR("mshjdic.hanjadic"), &CLSID_HanjaDic
);
70 hr
= CoCreateInstance(CLSID_HanjaDic
, NULL
,
71 CLSCTX_INPROC_SERVER
, IID_IHanjaDic
,
72 (LPVOID
*)& HJinterface
);
74 hr
= HJinterface
->OpenMainDic();
81 hr
= HJinterface
->CloseMainDic();
82 HJinterface
->Release();
86 bool HJdictAvailable() {
90 bool IsHanja(int hanja
) {
92 hr
= HJinterface
->GetHanjaType(static_cast<unsigned short>(hanja
), &hanjaType
);
94 return (hanjaType
> 0);
100 int GetHangulOfHanja(int hanjaChar
) {
101 // Convert hanja character to hangul one.
102 int hangulChar
= -1; // If fails, return -1.
104 if (!dict
.HJdictAvailable() || !dict
.IsHanja(hanjaChar
)) {
107 wchar_t convHnja
[UTF8MaxBytes
] = {0};
108 convHnja
[0] = static_cast<wchar_t>(hanjaChar
);
110 BSTR bstrHangul
= SysAllocString(NULL
);
111 BSTR bstrHanja
= SysAllocString(convHnja
);
112 HRESULT hr
= dict
.HJinterface
->HanjaToHangul(bstrHanja
, &bstrHangul
);
114 wchar_t wHangul
= static_cast<wchar_t *>(bstrHangul
)[0];
115 hangulChar
= static_cast<int>(wHangul
);
117 SysFreeString(bstrHangul
);
118 SysFreeString(bstrHanja
);