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