Home | History | Annotate | Download | only in pwl
      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 {
     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 
     45 class 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