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_PWL_CPWL_LIST_IMPL_H_
8 #define FPDFSDK_PWL_CPWL_LIST_IMPL_H_
9 
10 #include <map>
11 #include <memory>
12 #include <vector>
13 
14 #include "core/fxcrt/fx_coordinates.h"
15 #include "core/fxcrt/fx_string.h"
16 #include "core/fxcrt/unowned_ptr.h"
17 
18 class CPWL_EditImpl;
19 class CPWL_EditImpl_Iterator;
20 class CPWL_List_Notify;
21 class IPVT_FontMap;
22 
23 class CPLST_Select final {
24  public:
25   enum State { DESELECTING = -1, NORMAL = 0, SELECTING = 1 };
26   using const_iterator = std::map<int32_t, State>::const_iterator;
27 
28   CPLST_Select();
29   ~CPLST_Select();
30 
31   void Add(int32_t nItemIndex);
32   void Add(int32_t nBeginIndex, int32_t nEndIndex);
33   void Sub(int32_t nItemIndex);
34   void Sub(int32_t nBeginIndex, int32_t nEndIndex);
35   void DeselectAll();
36   void Done();
37 
begin()38   const_iterator begin() const { return m_Items.begin(); }
end()39   const_iterator end() const { return m_Items.end(); }
40 
41  private:
42   std::map<int32_t, State> m_Items;
43 };
44 
45 class CPWL_ListCtrl {
46  public:
47   CPWL_ListCtrl();
48   ~CPWL_ListCtrl();
49 
SetNotify(CPWL_List_Notify * pNotify)50   void SetNotify(CPWL_List_Notify* pNotify) { m_pNotify = pNotify; }
51   void OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl);
52   void OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl);
53   void OnVK_UP(bool bShift, bool bCtrl);
54   void OnVK_DOWN(bool bShift, bool bCtrl);
55   void OnVK_LEFT(bool bShift, bool bCtrl);
56   void OnVK_RIGHT(bool bShift, bool bCtrl);
57   void OnVK_HOME(bool bShift, bool bCtrl);
58   void OnVK_END(bool bShift, bool bCtrl);
59   bool OnChar(uint16_t nChar, bool bShift, bool bCtrl);
60 
61   void SetScrollPos(const CFX_PointF& point);
62   void ScrollToListItem(int32_t nItemIndex);
63   CFX_FloatRect GetItemRect(int32_t nIndex) const;
GetCaret()64   int32_t GetCaret() const { return m_nCaretIndex; }
GetSelect()65   int32_t GetSelect() const { return m_nSelItem; }
66   int32_t GetTopItem() const;
SetContentRect(const CFX_FloatRect & rect)67   void SetContentRect(const CFX_FloatRect& rect) { m_rcContent = rect; }
68   CFX_FloatRect GetContentRect() const;
69 
70   int32_t GetItemIndex(const CFX_PointF& point) const;
71   void AddString(const WideString& str);
72   void SetTopItem(int32_t nIndex);
73   void Select(int32_t nItemIndex);
74   void Deselect(int32_t nItemIndex);
75   void SetCaret(int32_t nItemIndex);
76   void Clear();
77   void Cancel();
78   WideString GetText() const;
79 
SetFontMap(IPVT_FontMap * pFontMap)80   void SetFontMap(IPVT_FontMap* pFontMap) { m_pFontMap = pFontMap; }
SetFontSize(float fFontSize)81   void SetFontSize(float fFontSize) { m_fFontSize = fFontSize; }
GetPlateRect()82   CFX_FloatRect GetPlateRect() const { return m_rcPlate; }
83   void SetPlateRect(const CFX_FloatRect& rect);
84 
GetFontSize()85   float GetFontSize() const { return m_fFontSize; }
86   CPWL_EditImpl* GetItemEdit(int32_t nIndex) const;
87   int32_t GetCount() const;
88   bool IsItemSelected(int32_t nIndex) const;
89   float GetFirstHeight() const;
SetMultipleSel(bool bMultiple)90   void SetMultipleSel(bool bMultiple) { m_bMultiple = bMultiple; }
IsMultipleSel()91   bool IsMultipleSel() const { return m_bMultiple; }
92   int32_t FindNext(int32_t nIndex, wchar_t nChar) const;
93   int32_t GetFirstSelected() const;
94 
95  private:
96   class Item {
97    public:
98     Item();
99     ~Item();
100 
101     void SetFontMap(IPVT_FontMap* pFontMap);
GetEdit()102     CPWL_EditImpl* GetEdit() const { return m_pEdit.get(); }
103 
SetRect(const CFX_FloatRect & rect)104     void SetRect(const CFX_FloatRect& rect) { m_rcListItem = rect; }
SetSelect(bool bSelected)105     void SetSelect(bool bSelected) { m_bSelected = bSelected; }
106     void SetText(const WideString& text);
107     void SetFontSize(float fFontSize);
108     WideString GetText() const;
109 
GetRect()110     CFX_FloatRect GetRect() const { return m_rcListItem; }
IsSelected()111     bool IsSelected() const { return m_bSelected; }
112     float GetItemHeight() const;
113     uint16_t GetFirstChar() const;
114 
115    private:
116     CPWL_EditImpl_Iterator* GetIterator() const;
117 
118     bool m_bSelected = false;
119     CFX_FloatRect m_rcListItem;
120     std::unique_ptr<CPWL_EditImpl> const m_pEdit;
121   };
122 
123   CFX_PointF InToOut(const CFX_PointF& point) const;
124   CFX_PointF OutToIn(const CFX_PointF& point) const;
125   CFX_FloatRect InToOut(const CFX_FloatRect& rect) const;
126   CFX_FloatRect OutToIn(const CFX_FloatRect& rect) const;
127 
128   CFX_PointF InnerToOuter(const CFX_PointF& point) const;
129   CFX_PointF OuterToInner(const CFX_PointF& point) const;
130   CFX_FloatRect InnerToOuter(const CFX_FloatRect& rect) const;
131   CFX_FloatRect OuterToInner(const CFX_FloatRect& rect) const;
132 
133   void OnVK(int32_t nItemIndex, bool bShift, bool bCtrl);
134   bool IsValid(int32_t nItemIndex) const;
135 
136   void ReArrange(int32_t nItemIndex);
137   CFX_FloatRect GetItemRectInternal(int32_t nIndex) const;
138   CFX_FloatRect GetContentRectInternal() const;
139   void SetMultipleSelect(int32_t nItemIndex, bool bSelected);
140   void SetSingleSelect(int32_t nItemIndex);
141   void InvalidateItem(int32_t nItemIndex);
142   void SelectItems();
143   bool IsItemVisible(int32_t nItemIndex) const;
144   void SetScrollInfo();
145   void SetScrollPosY(float fy);
146   void AddItem(const WideString& str);
147   WideString GetItemText(int32_t nIndex) const;
148   void SetItemSelect(int32_t nIndex, bool bSelected);
149   int32_t GetLastSelected() const;
GetBTPoint()150   CFX_PointF GetBTPoint() const {
151     return CFX_PointF(m_rcPlate.left, m_rcPlate.top);
152   }
153 
154   CFX_FloatRect m_rcPlate;
155   CFX_FloatRect m_rcContent;
156   UnownedPtr<CPWL_List_Notify> m_pNotify;
157   bool m_bNotifyFlag;
158   CFX_PointF m_ptScrollPos;
159   CPLST_Select m_aSelItems;  // for multiple
160   int32_t m_nSelItem;        // for single
161   int32_t m_nFootIndex;      // for multiple
162   bool m_bCtrlSel;           // for multiple
163   int32_t m_nCaretIndex;     // for multiple
164   std::vector<std::unique_ptr<Item>> m_ListItems;
165   float m_fFontSize;
166   UnownedPtr<IPVT_FontMap> m_pFontMap;
167   bool m_bMultiple;
168 };
169 
170 #endif  // FPDFSDK_PWL_CPWL_LIST_IMPL_H_
171