Update Scintilla to version 3.5.4
[TortoiseGit.git] / ext / scintilla / win32 / HanjaDic.cxx
blob0f5b215aa14bf800c3bd7b0e9a81dc795151b722
1 // Scintilla source code edit control
2 /** @file HanjaDic.cxx
3 ** Korean Hanja Dictionary
4 ** Convert between Korean Hanja and Hangul by COM interface.
5 **/
6 // Copyright 2015 by Neil Hodgson <neilh@scintilla.org>
7 // The License.txt file describes the conditions under which this software may be distributed.
9 #include <windows.h>
11 #include "UniConversion.h"
12 #include "HanjaDic.h"
14 #ifdef SCI_NAMESPACE
15 using namespace Scintilla;
16 #endif
18 namespace HanjaDict {
20 interface IRadical;
21 interface IHanja;
22 interface IStrokes;
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 } };
59 class HanjaDic {
60 private:
61 HRESULT hr;
62 CLSID CLSID_HanjaDic;
64 public:
65 IHanjaDic *HJinterface;
67 HanjaDic() : HJinterface(NULL) {
68 hr = CLSIDFromProgID(OLESTR("mshjdic.hanjadic"), &CLSID_HanjaDic);
69 if (SUCCEEDED(hr)) {
70 hr = CoCreateInstance(CLSID_HanjaDic, NULL,
71 CLSCTX_INPROC_SERVER, IID_IHanjaDic,
72 (LPVOID *)& HJinterface);
73 if (SUCCEEDED(hr)) {
74 hr = HJinterface->OpenMainDic();
79 ~HanjaDic() {
80 if (SUCCEEDED(hr)) {
81 hr = HJinterface->CloseMainDic();
82 HJinterface->Release();
86 bool HJdictAvailable() {
87 return SUCCEEDED(hr);
90 bool IsHanja(int hanja) {
91 HANJA_TYPE hanjaType;
92 hr = HJinterface->GetHanjaType(static_cast<unsigned short>(hanja), &hanjaType);
93 if (SUCCEEDED(hr)) {
94 return (hanjaType > 0);
96 return false;
100 int GetHangulOfHanja(int hanjaChar) {
101 // Convert hanja character to hangul one.
102 int hangulChar = -1; // If fails, return -1.
103 HanjaDic dict;
104 if (!dict.HJdictAvailable() || !dict.IsHanja(hanjaChar)) {
105 return hangulChar;
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);
113 if (SUCCEEDED(hr)) {
114 wchar_t wHangul = static_cast<wchar_t *>(bstrHangul)[0];
115 hangulChar = static_cast<int>(wHangul);
117 SysFreeString(bstrHangul);
118 SysFreeString(bstrHanja);
119 return hangulChar;