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