OLD | NEW |
| (Empty) |
1 // Copyright 2014 PDFium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
6 | |
7 #ifndef FPDFSDK_INCLUDE_FXEDIT_FXET_LIST_H_ | |
8 #define FPDFSDK_INCLUDE_FXEDIT_FXET_LIST_H_ | |
9 | |
10 #include "fpdfsdk/include/fxedit/fx_edit.h" | |
11 | |
12 class IFX_Edit; | |
13 | |
14 class CLST_Size { | |
15 public: | |
16 CLST_Size() : x(0.0f), y(0.0f) {} | |
17 | |
18 CLST_Size(FX_FLOAT other_x, FX_FLOAT other_y) { | |
19 x = other_x; | |
20 y = other_y; | |
21 } | |
22 | |
23 void Default() { | |
24 x = 0.0f; | |
25 y = 0.0f; | |
26 } | |
27 | |
28 FX_BOOL operator!=(const CLST_Size& size) const { | |
29 return FXSYS_memcmp(this, &size, sizeof(CLST_Size)) != 0; | |
30 } | |
31 | |
32 FX_FLOAT x, y; | |
33 }; | |
34 | |
35 class CLST_Rect : public CFX_FloatRect { | |
36 public: | |
37 CLST_Rect() { left = top = right = bottom = 0.0f; } | |
38 | |
39 CLST_Rect(FX_FLOAT other_left, | |
40 FX_FLOAT other_top, | |
41 FX_FLOAT other_right, | |
42 FX_FLOAT other_bottom) { | |
43 left = other_left; | |
44 top = other_top; | |
45 right = other_right; | |
46 bottom = other_bottom; | |
47 } | |
48 | |
49 CLST_Rect(const CFX_FloatRect& rect) { | |
50 left = rect.left; | |
51 top = rect.top; | |
52 right = rect.right; | |
53 bottom = rect.bottom; | |
54 } | |
55 | |
56 ~CLST_Rect() {} | |
57 | |
58 void Default() { left = top = right = bottom = 0.0f; } | |
59 | |
60 const CLST_Rect operator=(const CFX_FloatRect& rect) { | |
61 left = rect.left; | |
62 top = rect.top; | |
63 right = rect.right; | |
64 bottom = rect.bottom; | |
65 | |
66 return *this; | |
67 } | |
68 | |
69 bool operator==(const CLST_Rect& rect) const { | |
70 return FXSYS_memcmp(this, &rect, sizeof(CLST_Rect)) == 0; | |
71 } | |
72 | |
73 bool operator!=(const CLST_Rect& rect) const { return !(*this == rect); } | |
74 | |
75 FX_FLOAT Width() const { return right - left; } | |
76 | |
77 FX_FLOAT Height() const { | |
78 if (top > bottom) | |
79 return top - bottom; | |
80 return bottom - top; | |
81 } | |
82 | |
83 CFX_FloatPoint LeftTop() const { return CFX_FloatPoint(left, top); } | |
84 | |
85 CFX_FloatPoint RightBottom() const { return CFX_FloatPoint(right, bottom); } | |
86 | |
87 const CLST_Rect operator+=(const CFX_FloatPoint& point) { | |
88 left += point.x; | |
89 right += point.x; | |
90 top += point.y; | |
91 bottom += point.y; | |
92 | |
93 return *this; | |
94 } | |
95 | |
96 const CLST_Rect operator-=(const CFX_FloatPoint& point) { | |
97 left -= point.x; | |
98 right -= point.x; | |
99 top -= point.y; | |
100 bottom -= point.y; | |
101 | |
102 return *this; | |
103 } | |
104 | |
105 CLST_Rect operator+(const CFX_FloatPoint& point) const { | |
106 return CLST_Rect(left + point.x, top + point.y, right + point.x, | |
107 bottom + point.y); | |
108 } | |
109 | |
110 CLST_Rect operator-(const CFX_FloatPoint& point) const { | |
111 return CLST_Rect(left - point.x, top - point.y, right - point.x, | |
112 bottom - point.y); | |
113 } | |
114 }; | |
115 | |
116 class CFX_ListItem { | |
117 public: | |
118 CFX_ListItem(); | |
119 virtual ~CFX_ListItem(); | |
120 | |
121 void SetFontMap(IPVT_FontMap* pFontMap); | |
122 IFX_Edit_Iterator* GetIterator() const; | |
123 IFX_Edit* GetEdit() const; | |
124 | |
125 public: | |
126 void SetRect(const CLST_Rect& rect); | |
127 void SetSelect(FX_BOOL bSelected); | |
128 void SetCaret(FX_BOOL bCaret); | |
129 void SetText(const FX_WCHAR* text); | |
130 void SetFontSize(FX_FLOAT fFontSize); | |
131 CFX_WideString GetText() const; | |
132 | |
133 CLST_Rect GetRect() const; | |
134 FX_BOOL IsSelected() const; | |
135 FX_BOOL IsCaret() const; | |
136 FX_FLOAT GetItemHeight() const; | |
137 uint16_t GetFirstChar() const; | |
138 | |
139 private: | |
140 IFX_Edit* m_pEdit; | |
141 FX_BOOL m_bSelected; | |
142 FX_BOOL m_bCaret; | |
143 CLST_Rect m_rcListItem; | |
144 }; | |
145 | |
146 class CFX_ListContainer { | |
147 public: | |
148 CFX_ListContainer() | |
149 : m_rcPlate(0.0f, 0.0f, 0.0f, 0.0f), | |
150 m_rcContent(0.0f, 0.0f, 0.0f, 0.0f) {} | |
151 virtual ~CFX_ListContainer() {} | |
152 virtual void SetPlateRect(const CFX_FloatRect& rect) { m_rcPlate = rect; } | |
153 CFX_FloatRect GetPlateRect() const { return m_rcPlate; } | |
154 void SetContentRect(const CLST_Rect& rect) { m_rcContent = rect; } | |
155 CLST_Rect GetContentRect() const { return m_rcContent; } | |
156 CFX_FloatPoint GetBTPoint() const { | |
157 return CFX_FloatPoint(m_rcPlate.left, m_rcPlate.top); | |
158 } | |
159 CFX_FloatPoint GetETPoint() const { | |
160 return CFX_FloatPoint(m_rcPlate.right, m_rcPlate.bottom); | |
161 } | |
162 | |
163 public: | |
164 CFX_FloatPoint InnerToOuter(const CFX_FloatPoint& point) const { | |
165 return CFX_FloatPoint(point.x + GetBTPoint().x, GetBTPoint().y - point.y); | |
166 } | |
167 CFX_FloatPoint OuterToInner(const CFX_FloatPoint& point) const { | |
168 return CFX_FloatPoint(point.x - GetBTPoint().x, GetBTPoint().y - point.y); | |
169 } | |
170 CFX_FloatRect InnerToOuter(const CLST_Rect& rect) const { | |
171 CFX_FloatPoint ptLeftTop = | |
172 InnerToOuter(CFX_FloatPoint(rect.left, rect.top)); | |
173 CFX_FloatPoint ptRightBottom = | |
174 InnerToOuter(CFX_FloatPoint(rect.right, rect.bottom)); | |
175 return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, | |
176 ptLeftTop.y); | |
177 } | |
178 CLST_Rect OuterToInner(const CFX_FloatRect& rect) const { | |
179 CFX_FloatPoint ptLeftTop = | |
180 OuterToInner(CFX_FloatPoint(rect.left, rect.top)); | |
181 CFX_FloatPoint ptRightBottom = | |
182 OuterToInner(CFX_FloatPoint(rect.right, rect.bottom)); | |
183 return CLST_Rect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, | |
184 ptRightBottom.y); | |
185 } | |
186 | |
187 private: | |
188 CFX_FloatRect m_rcPlate; | |
189 CLST_Rect m_rcContent; // positive forever! | |
190 }; | |
191 | |
192 template <class TYPE> | |
193 class CLST_ArrayTemplate : public CFX_ArrayTemplate<TYPE> { | |
194 public: | |
195 FX_BOOL IsEmpty() { return CFX_ArrayTemplate<TYPE>::GetSize() <= 0; } | |
196 TYPE GetAt(int32_t nIndex) const { | |
197 if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) | |
198 return CFX_ArrayTemplate<TYPE>::GetAt(nIndex); | |
199 return NULL; | |
200 } | |
201 void RemoveAt(int32_t nIndex) { | |
202 if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) | |
203 CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex); | |
204 } | |
205 }; | |
206 | |
207 class CFX_List : protected CFX_ListContainer, public IFX_List { | |
208 public: | |
209 CFX_List(); | |
210 ~CFX_List() override; | |
211 | |
212 // IFX_List: | |
213 void SetFontMap(IPVT_FontMap* pFontMap) override; | |
214 void SetFontSize(FX_FLOAT fFontSize) override; | |
215 CFX_FloatRect GetPlateRect() const override; | |
216 CFX_FloatRect GetContentRect() const override; | |
217 FX_FLOAT GetFontSize() const override; | |
218 IFX_Edit* GetItemEdit(int32_t nIndex) const override; | |
219 int32_t GetCount() const override; | |
220 FX_BOOL IsItemSelected(int32_t nIndex) const override; | |
221 FX_FLOAT GetFirstHeight() const override; | |
222 void SetMultipleSel(FX_BOOL bMultiple) override; | |
223 FX_BOOL IsMultipleSel() const override; | |
224 FX_BOOL IsValid(int32_t nItemIndex) const override; | |
225 int32_t FindNext(int32_t nIndex, FX_WCHAR nChar) const override; | |
226 void Empty() override; | |
227 CFX_FloatRect GetItemRect(int32_t nIndex) const override; | |
228 int32_t GetItemIndex(const CFX_FloatPoint& point) const override; | |
229 int32_t GetFirstSelected() const override; | |
230 | |
231 protected: | |
232 void AddItem(const FX_WCHAR* str); | |
233 virtual void ReArrange(int32_t nItemIndex); | |
234 CFX_WideString GetItemText(int32_t nIndex) const; | |
235 void SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected); | |
236 void SetItemCaret(int32_t nItemIndex, FX_BOOL bCaret); | |
237 int32_t GetLastSelected() const; | |
238 FX_WCHAR Toupper(FX_WCHAR c) const; | |
239 | |
240 private: | |
241 CLST_ArrayTemplate<CFX_ListItem*> m_aListItems; | |
242 FX_FLOAT m_fFontSize; | |
243 IPVT_FontMap* m_pFontMap; | |
244 FX_BOOL m_bMultiple; | |
245 }; | |
246 | |
247 struct CPLST_Select_Item { | |
248 CPLST_Select_Item(int32_t other_nItemIndex, int32_t other_nState) { | |
249 nItemIndex = other_nItemIndex; | |
250 nState = other_nState; | |
251 } | |
252 | |
253 int32_t nItemIndex; | |
254 int32_t nState; // 0:normal select -1:to deselect 1: to select | |
255 }; | |
256 | |
257 class CPLST_Select { | |
258 public: | |
259 CPLST_Select(); | |
260 virtual ~CPLST_Select(); | |
261 | |
262 public: | |
263 void Add(int32_t nItemIndex); | |
264 void Add(int32_t nBeginIndex, int32_t nEndIndex); | |
265 void Sub(int32_t nItemIndex); | |
266 void Sub(int32_t nBeginIndex, int32_t nEndIndex); | |
267 FX_BOOL IsExist(int32_t nItemIndex) const; | |
268 int32_t Find(int32_t nItemIndex) const; | |
269 int32_t GetCount() const; | |
270 int32_t GetItemIndex(int32_t nIndex) const; | |
271 int32_t GetState(int32_t nIndex) const; | |
272 void Done(); | |
273 void DeselectAll(); | |
274 | |
275 private: | |
276 CFX_ArrayTemplate<CPLST_Select_Item*> m_aItems; | |
277 }; | |
278 | |
279 class CFX_ListCtrl : public CFX_List { | |
280 public: | |
281 CFX_ListCtrl(); | |
282 ~CFX_ListCtrl() override; | |
283 | |
284 // CFX_List | |
285 void SetNotify(IFX_List_Notify* pNotify) override; | |
286 void OnMouseDown(const CFX_FloatPoint& point, | |
287 FX_BOOL bShift, | |
288 FX_BOOL bCtrl) override; | |
289 void OnMouseMove(const CFX_FloatPoint& point, | |
290 FX_BOOL bShift, | |
291 FX_BOOL bCtrl) override; | |
292 void OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl) override; | |
293 void OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl) override; | |
294 void OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl) override; | |
295 void OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl) override; | |
296 void OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl) override; | |
297 void OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl) override; | |
298 void OnVK(int32_t nItemIndex, FX_BOOL bShift, FX_BOOL bCtrl) override; | |
299 FX_BOOL OnChar(uint16_t nChar, FX_BOOL bShift, FX_BOOL bCtrl) override; | |
300 void SetPlateRect(const CFX_FloatRect& rect) override; | |
301 void SetScrollPos(const CFX_FloatPoint& point) override; | |
302 void ScrollToListItem(int32_t nItemIndex) override; | |
303 CFX_FloatRect GetItemRect(int32_t nIndex) const override; | |
304 int32_t GetCaret() const override { return m_nCaretIndex; } | |
305 int32_t GetSelect() const override { return m_nSelItem; } | |
306 int32_t GetTopItem() const override; | |
307 CFX_FloatRect GetContentRect() const override; | |
308 int32_t GetItemIndex(const CFX_FloatPoint& point) const override; | |
309 void AddString(const FX_WCHAR* str) override; | |
310 void SetTopItem(int32_t nIndex) override; | |
311 void Select(int32_t nItemIndex) override; | |
312 void SetCaret(int32_t nItemIndex) override; | |
313 void Empty() override; | |
314 void Cancel() override; | |
315 CFX_WideString GetText() const override; | |
316 void ReArrange(int32_t nItemIndex) override; | |
317 | |
318 virtual CFX_FloatPoint InToOut(const CFX_FloatPoint& point) const; | |
319 virtual CFX_FloatPoint OutToIn(const CFX_FloatPoint& point) const; | |
320 virtual CFX_FloatRect InToOut(const CFX_FloatRect& rect) const; | |
321 virtual CFX_FloatRect OutToIn(const CFX_FloatRect& rect) const; | |
322 | |
323 private: | |
324 void SetMultipleSelect(int32_t nItemIndex, FX_BOOL bSelected); | |
325 void SetSingleSelect(int32_t nItemIndex); | |
326 void InvalidateItem(int32_t nItemIndex); | |
327 void SelectItems(); | |
328 FX_BOOL IsItemVisible(int32_t nItemIndex) const; | |
329 void SetScrollInfo(); | |
330 void SetScrollPosY(FX_FLOAT fy); | |
331 | |
332 private: | |
333 IFX_List_Notify* m_pNotify; | |
334 FX_BOOL m_bNotifyFlag; | |
335 CFX_FloatPoint m_ptScrollPos; | |
336 CPLST_Select m_aSelItems; // for multiple | |
337 int32_t m_nSelItem; // for single | |
338 int32_t m_nFootIndex; // for multiple | |
339 FX_BOOL m_bCtrlSel; // for multiple | |
340 int32_t m_nCaretIndex; // for multiple | |
341 }; | |
342 | |
343 #endif // FPDFSDK_INCLUDE_FXEDIT_FXET_LIST_H_ | |
OLD | NEW |