xref: /aosp_15_r20/external/pdfium/xfa/fwl/cfwl_combobox.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #ifndef XFA_FWL_CFWL_COMBOBOX_H_
8*3ac0a46fSAndroid Build Coastguard Worker #define XFA_FWL_CFWL_COMBOBOX_H_
9*3ac0a46fSAndroid Build Coastguard Worker 
10*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/graphics/cfgas_gegraphics.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_comboedit.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_combolist.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_listbox.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_widget.h"
15*3ac0a46fSAndroid Build Coastguard Worker 
16*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_DropDown (1L << 0)
17*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_Sort (1L << 1)
18*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_OwnerDraw (1L << 3)
19*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_EditHNear 0
20*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_EditHCenter (1L << 4)
21*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_EditVNear 0
22*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_EditVCenter (1L << 6)
23*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_EditVFar (2L << 6)
24*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_EditJustified (1L << 8)
25*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_EditHAlignMask (3L << 4)
26*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_EditVAlignMask (3L << 6)
27*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_ListItemLeftAlign 0
28*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_ListItemCenterAlign (1L << 10)
29*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_ListItemAlignMask (3L << 10)
30*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_CMB_ReadOnly (1L << 13)
31*3ac0a46fSAndroid Build Coastguard Worker 
32*3ac0a46fSAndroid Build Coastguard Worker class CFWL_ComboBox final : public CFWL_Widget {
33*3ac0a46fSAndroid Build Coastguard Worker  public:
34*3ac0a46fSAndroid Build Coastguard Worker   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
35*3ac0a46fSAndroid Build Coastguard Worker   ~CFWL_ComboBox() override;
36*3ac0a46fSAndroid Build Coastguard Worker 
37*3ac0a46fSAndroid Build Coastguard Worker   // CFWL_Widget
38*3ac0a46fSAndroid Build Coastguard Worker   void Trace(cppgc::Visitor* visitor) const override;
39*3ac0a46fSAndroid Build Coastguard Worker   FWL_Type GetClassID() const override;
40*3ac0a46fSAndroid Build Coastguard Worker   void ModifyStyleExts(uint32_t dwStyleExtsAdded,
41*3ac0a46fSAndroid Build Coastguard Worker                        uint32_t dwStyleExtsRemoved) override;
42*3ac0a46fSAndroid Build Coastguard Worker   void SetStates(uint32_t dwStates) override;
43*3ac0a46fSAndroid Build Coastguard Worker   void RemoveStates(uint32_t dwStates) override;
44*3ac0a46fSAndroid Build Coastguard Worker   void Update() override;
45*3ac0a46fSAndroid Build Coastguard Worker   FWL_WidgetHit HitTest(const CFX_PointF& point) override;
46*3ac0a46fSAndroid Build Coastguard Worker   void DrawWidget(CFGAS_GEGraphics* pGraphics,
47*3ac0a46fSAndroid Build Coastguard Worker                   const CFX_Matrix& matrix) override;
48*3ac0a46fSAndroid Build Coastguard Worker   void OnProcessMessage(CFWL_Message* pMessage) override;
49*3ac0a46fSAndroid Build Coastguard Worker   void OnProcessEvent(CFWL_Event* pEvent) override;
50*3ac0a46fSAndroid Build Coastguard Worker   void OnDrawWidget(CFGAS_GEGraphics* pGraphics,
51*3ac0a46fSAndroid Build Coastguard Worker                     const CFX_Matrix& matrix) override;
52*3ac0a46fSAndroid Build Coastguard Worker 
53*3ac0a46fSAndroid Build Coastguard Worker   WideString GetTextByIndex(int32_t iIndex) const;
GetCurSel()54*3ac0a46fSAndroid Build Coastguard Worker   int32_t GetCurSel() const { return m_iCurSel; }
55*3ac0a46fSAndroid Build Coastguard Worker   void SetCurSel(int32_t iSel);
56*3ac0a46fSAndroid Build Coastguard Worker 
57*3ac0a46fSAndroid Build Coastguard Worker   void AddString(const WideString& wsText);
58*3ac0a46fSAndroid Build Coastguard Worker   void RemoveAt(int32_t iIndex);
59*3ac0a46fSAndroid Build Coastguard Worker   void RemoveAll();
60*3ac0a46fSAndroid Build Coastguard Worker 
61*3ac0a46fSAndroid Build Coastguard Worker   void SetEditText(const WideString& wsText);
62*3ac0a46fSAndroid Build Coastguard Worker   WideString GetEditText() const;
63*3ac0a46fSAndroid Build Coastguard Worker 
EditCanUndo()64*3ac0a46fSAndroid Build Coastguard Worker   bool EditCanUndo() const { return m_pEdit->CanUndo(); }
EditCanRedo()65*3ac0a46fSAndroid Build Coastguard Worker   bool EditCanRedo() const { return m_pEdit->CanRedo(); }
EditUndo()66*3ac0a46fSAndroid Build Coastguard Worker   bool EditUndo() { return m_pEdit->Undo(); }
EditRedo()67*3ac0a46fSAndroid Build Coastguard Worker   bool EditRedo() { return m_pEdit->Redo(); }
EditCanCopy()68*3ac0a46fSAndroid Build Coastguard Worker   bool EditCanCopy() const { return m_pEdit->HasSelection(); }
EditCanCut()69*3ac0a46fSAndroid Build Coastguard Worker   bool EditCanCut() const {
70*3ac0a46fSAndroid Build Coastguard Worker     if (m_pEdit->GetStyleExts() & FWL_STYLEEXT_EDT_ReadOnly)
71*3ac0a46fSAndroid Build Coastguard Worker       return false;
72*3ac0a46fSAndroid Build Coastguard Worker     return EditCanCopy();
73*3ac0a46fSAndroid Build Coastguard Worker   }
EditCanSelectAll()74*3ac0a46fSAndroid Build Coastguard Worker   bool EditCanSelectAll() const { return m_pEdit->GetTextLength() > 0; }
EditCopy()75*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> EditCopy() const { return m_pEdit->Copy(); }
EditCut()76*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> EditCut() { return m_pEdit->Cut(); }
EditPaste(const WideString & wsPaste)77*3ac0a46fSAndroid Build Coastguard Worker   bool EditPaste(const WideString& wsPaste) { return m_pEdit->Paste(wsPaste); }
EditSelectAll()78*3ac0a46fSAndroid Build Coastguard Worker   void EditSelectAll() { m_pEdit->SelectAll(); }
EditDelete()79*3ac0a46fSAndroid Build Coastguard Worker   void EditDelete() { m_pEdit->ClearText(); }
EditDeSelect()80*3ac0a46fSAndroid Build Coastguard Worker   void EditDeSelect() { m_pEdit->ClearSelection(); }
81*3ac0a46fSAndroid Build Coastguard Worker 
82*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF GetBBox() const;
83*3ac0a46fSAndroid Build Coastguard Worker   void EditModifyStyleExts(uint32_t dwStyleExtsAdded,
84*3ac0a46fSAndroid Build Coastguard Worker                            uint32_t dwStyleExtsRemoved);
85*3ac0a46fSAndroid Build Coastguard Worker   void ShowDropDownList();
86*3ac0a46fSAndroid Build Coastguard Worker   void HideDropDownList();
87*3ac0a46fSAndroid Build Coastguard Worker 
GetComboEdit()88*3ac0a46fSAndroid Build Coastguard Worker   CFWL_ComboEdit* GetComboEdit() const { return m_pEdit; }
89*3ac0a46fSAndroid Build Coastguard Worker 
90*3ac0a46fSAndroid Build Coastguard Worker   void ProcessSelChanged(bool bLButtonUp);
GetCurrentSelection()91*3ac0a46fSAndroid Build Coastguard Worker   int32_t GetCurrentSelection() const { return m_iCurSel; }
92*3ac0a46fSAndroid Build Coastguard Worker 
93*3ac0a46fSAndroid Build Coastguard Worker  private:
94*3ac0a46fSAndroid Build Coastguard Worker   explicit CFWL_ComboBox(CFWL_App* pApp);
95*3ac0a46fSAndroid Build Coastguard Worker 
IsDropDownStyle()96*3ac0a46fSAndroid Build Coastguard Worker   bool IsDropDownStyle() const {
97*3ac0a46fSAndroid Build Coastguard Worker     return !!(GetStyleExts() & FWL_STYLEEXT_CMB_DropDown);
98*3ac0a46fSAndroid Build Coastguard Worker   }
99*3ac0a46fSAndroid Build Coastguard Worker   void MatchEditText();
100*3ac0a46fSAndroid Build Coastguard Worker   void SyncEditText(int32_t iListItem);
101*3ac0a46fSAndroid Build Coastguard Worker   void Layout();
102*3ac0a46fSAndroid Build Coastguard Worker   void ResetEditAlignment();
103*3ac0a46fSAndroid Build Coastguard Worker   void ResetListItemAlignment();
104*3ac0a46fSAndroid Build Coastguard Worker   void GetPopupPos(float fMinHeight,
105*3ac0a46fSAndroid Build Coastguard Worker                    float fMaxHeight,
106*3ac0a46fSAndroid Build Coastguard Worker                    const CFX_RectF& rtAnchor,
107*3ac0a46fSAndroid Build Coastguard Worker                    CFX_RectF* pPopupRect);
108*3ac0a46fSAndroid Build Coastguard Worker   void OnLButtonUp(CFWL_MessageMouse* pMsg);
IsDropListVisible()109*3ac0a46fSAndroid Build Coastguard Worker   bool IsDropListVisible() const { return m_pListBox->IsVisible(); }
110*3ac0a46fSAndroid Build Coastguard Worker   void OnLButtonDown(CFWL_MessageMouse* pMsg);
111*3ac0a46fSAndroid Build Coastguard Worker   void OnFocusGained();
112*3ac0a46fSAndroid Build Coastguard Worker   void OnFocusLost();
113*3ac0a46fSAndroid Build Coastguard Worker   void OnKey(CFWL_MessageKey* pMsg);
114*3ac0a46fSAndroid Build Coastguard Worker   void RepaintInflatedListBoxRect();
115*3ac0a46fSAndroid Build Coastguard Worker 
116*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_ClientRect;
117*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_ContentRect;
118*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_BtnRect;
119*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CFWL_ComboEdit> const m_pEdit;
120*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CFWL_ComboList> const m_pListBox;
121*3ac0a46fSAndroid Build Coastguard Worker   int32_t m_iCurSel = -1;
122*3ac0a46fSAndroid Build Coastguard Worker   Mask<CFWL_PartState> m_iBtnState = CFWL_PartState::kNormal;
123*3ac0a46fSAndroid Build Coastguard Worker };
124*3ac0a46fSAndroid Build Coastguard Worker 
125*3ac0a46fSAndroid Build Coastguard Worker #endif  // XFA_FWL_CFWL_COMBOBOX_H_
126