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
18class CPWL_EditImpl;
19class CPWL_EditImpl_Iterator;
20class CPWL_List_Notify;
21class IPVT_FontMap;
22
23class CPLST_Select {
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  virtual ~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
38  const_iterator begin() const { return m_Items.begin(); }
39  const_iterator end() const { return m_Items.end(); }
40
41 private:
42  std::map<int32_t, State> m_Items;
43};
44
45class CPWL_ListCtrl {
46 public:
47  CPWL_ListCtrl();
48  ~CPWL_ListCtrl();
49
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;
64  int32_t GetCaret() const { return m_nCaretIndex; }
65  int32_t GetSelect() const { return m_nSelItem; }
66  int32_t GetTopItem() const;
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 SetCaret(int32_t nItemIndex);
75  void Empty();
76  void Cancel();
77  WideString GetText() const;
78
79  void SetFontMap(IPVT_FontMap* pFontMap) { m_pFontMap = pFontMap; }
80  void SetFontSize(float fFontSize) { m_fFontSize = fFontSize; }
81  CFX_FloatRect GetPlateRect() const { return m_rcPlate; }
82  void SetPlateRect(const CFX_FloatRect& rect);
83
84  float GetFontSize() const { return m_fFontSize; }
85  CPWL_EditImpl* GetItemEdit(int32_t nIndex) const;
86  int32_t GetCount() const;
87  bool IsItemSelected(int32_t nIndex) const;
88  float GetFirstHeight() const;
89  void SetMultipleSel(bool bMultiple) { m_bMultiple = bMultiple; }
90  bool IsMultipleSel() const { return m_bMultiple; }
91  int32_t FindNext(int32_t nIndex, wchar_t nChar) const;
92  int32_t GetFirstSelected() const;
93
94 private:
95  class Item {
96   public:
97    Item();
98    ~Item();
99
100    void SetFontMap(IPVT_FontMap* pFontMap);
101    CPWL_EditImpl* GetEdit() const { return m_pEdit.get(); }
102
103    void SetRect(const CFX_FloatRect& rect) { m_rcListItem = rect; }
104    void SetSelect(bool bSelected) { m_bSelected = bSelected; }
105    void SetText(const WideString& text);
106    void SetFontSize(float fFontSize);
107    WideString GetText() const;
108
109    CFX_FloatRect GetRect() const { return m_rcListItem; }
110    bool IsSelected() const { return m_bSelected; }
111    float GetItemHeight() const;
112    uint16_t GetFirstChar() const;
113
114   private:
115    CPWL_EditImpl_Iterator* GetIterator() const;
116
117    std::unique_ptr<CPWL_EditImpl> m_pEdit;
118    bool m_bSelected;
119    CFX_FloatRect m_rcListItem;
120  };
121
122  CFX_PointF InToOut(const CFX_PointF& point) const;
123  CFX_PointF OutToIn(const CFX_PointF& point) const;
124  CFX_FloatRect InToOut(const CFX_FloatRect& rect) const;
125  CFX_FloatRect OutToIn(const CFX_FloatRect& rect) const;
126
127  CFX_PointF InnerToOuter(const CFX_PointF& point) const;
128  CFX_PointF OuterToInner(const CFX_PointF& point) const;
129  CFX_FloatRect InnerToOuter(const CFX_FloatRect& rect) const;
130  CFX_FloatRect OuterToInner(const CFX_FloatRect& rect) const;
131
132  void OnVK(int32_t nItemIndex, bool bShift, bool bCtrl);
133  bool IsValid(int32_t nItemIndex) const;
134
135  void ReArrange(int32_t nItemIndex);
136  CFX_FloatRect GetItemRectInternal(int32_t nIndex) const;
137  CFX_FloatRect GetContentRectInternal() const;
138  void SetMultipleSelect(int32_t nItemIndex, bool bSelected);
139  void SetSingleSelect(int32_t nItemIndex);
140  void InvalidateItem(int32_t nItemIndex);
141  void SelectItems();
142  bool IsItemVisible(int32_t nItemIndex) const;
143  void SetScrollInfo();
144  void SetScrollPosY(float fy);
145  void AddItem(const WideString& str);
146  WideString GetItemText(int32_t nIndex) const;
147  void SetItemSelect(int32_t nItemIndex, bool bSelected);
148  int32_t GetLastSelected() const;
149  CFX_PointF GetBTPoint() const {
150    return CFX_PointF(m_rcPlate.left, m_rcPlate.top);
151  }
152
153  CFX_FloatRect m_rcPlate;
154  CFX_FloatRect m_rcContent;
155  UnownedPtr<CPWL_List_Notify> m_pNotify;
156  bool m_bNotifyFlag;
157  CFX_PointF m_ptScrollPos;
158  CPLST_Select m_aSelItems;  // for multiple
159  int32_t m_nSelItem;        // for single
160  int32_t m_nFootIndex;      // for multiple
161  bool m_bCtrlSel;           // for multiple
162  int32_t m_nCaretIndex;     // for multiple
163  std::vector<std::unique_ptr<Item>> m_ListItems;
164  float m_fFontSize;
165  UnownedPtr<IPVT_FontMap> m_pFontMap;
166  bool m_bMultiple;
167};
168
169#endif  // FPDFSDK_PWL_CPWL_LIST_IMPL_H_
170