forked from EasyIME/libIME
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CandidateWindow.h
135 lines (109 loc) · 3.3 KB
/
CandidateWindow.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//
// Copyright (C) 2013 Hong Jen Yee (PCMan) <[email protected]>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the
// Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301, USA.
//
#ifndef IME_CANDIDATE_WINDOW_H
#define IME_CANDIDATE_WINDOW_H
#include "ImeWindow.h"
#include <string>
#include <vector>
namespace Ime {
class TextService;
class EditSession;
class KeyEvent;
// TODO: make the candidate window looks different in immersive mode
class CandidateWindow :
public ImeWindow,
public ITfCandidateListUIElement {
public:
CandidateWindow(TextService* service, EditSession* session);
// IUnknown
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// ITfUIElement
STDMETHODIMP GetDescription(BSTR *pbstrDescription);
STDMETHODIMP GetGUID(GUID *pguid);
STDMETHODIMP Show(BOOL bShow);
STDMETHODIMP IsShown(BOOL *pbShow);
// ITfCandidateListUIElement
STDMETHODIMP GetUpdatedFlags(DWORD *pdwFlags);
STDMETHODIMP GetDocumentMgr(ITfDocumentMgr **ppdim);
STDMETHODIMP GetCount(UINT *puCount);
STDMETHODIMP GetSelection(UINT *puIndex);
STDMETHODIMP GetString(UINT uIndex, BSTR *pstr);
STDMETHODIMP GetPageIndex(UINT *puIndex, UINT uSize, UINT *puPageCnt);
STDMETHODIMP SetPageIndex(UINT *puIndex, UINT uPageCnt);
STDMETHODIMP GetCurrentPage(UINT *puPage);
const std::vector<std::wstring>& items() const {
return items_;
}
void setItems(const std::vector<std::wstring>& items, const std::vector<wchar_t>& sekKeys) {
items_ = items;
selKeys_ = selKeys_;
recalculateSize();
refresh();
}
void add(std::wstring item, wchar_t selKey) {
items_.push_back(item);
selKeys_.push_back(selKey);
}
void clear();
int candPerRow() const {
return candPerRow_;
}
void setCandPerRow(int n);
virtual void recalculateSize();
bool filterKeyEvent(KeyEvent& keyEvent);
int currentSel() const {
return currentSel_;
}
void setCurrentSel(int sel);
wchar_t currentSelKey() const {
return selKeys_.at(currentSel_);
}
bool hasResult() const {
return hasResult_;
}
bool useCursor() const {
return useCursor_;
}
void setUseCursor(bool use);
protected:
LRESULT wndProc(UINT msg, WPARAM wp , LPARAM lp);
void onPaint(WPARAM wp, LPARAM lp);
void paintItem(HDC hDC, int i, int x, int y);
void itemRect(int i, RECT& rect);
protected: // COM object should not be deleted directly. calling Release() instead.
~CandidateWindow(void);
private:
ULONG refCount_;
BOOL shown_;
int selKeyWidth_;
int textWidth_;
int itemHeight_;
int candPerRow_;
int colSpacing_;
int rowSpacing_;
std::vector<wchar_t> selKeys_;
std::vector<std::wstring> items_;
int currentSel_;
bool hasResult_;
bool useCursor_;
};
}
#endif