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