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 XFA_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_ 8 #define XFA_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_ 9 10 #include <memory> 11 12 #include "xfa/fwl/basewidget/fwl_editimp.h" 13 #include "xfa/fwl/basewidget/fwl_listboximp.h" 14 15 class CFWL_WidgetImp; 16 class CFWL_WidgetImpProperties; 17 class CFWL_WidgetImpDelegate; 18 class CFWL_ListBoxImp; 19 class CFWL_ListBoxImpDelegate; 20 class CFWL_FormProxyImp; 21 class IFWL_Widget; 22 class CFWL_ComboEditImp; 23 class CFWL_ComboEditImpDelegate; 24 class CFWL_ComboListImp; 25 class CFWL_ComboListImpDelegate; 26 class CFWL_ComboBoxImp; 27 class CFWL_ComboBoxImpDelegate; 28 class CFWL_ComboProxyImpDelegate; 29 class CFWL_ComboEditImp : public CFWL_EditImp { 30 public: 31 CFWL_ComboEditImp(const CFWL_WidgetImpProperties& properties, 32 IFWL_Widget* pOuter); 33 34 void ClearSelected(); 35 void SetSelected(); 36 void EndCaret(); 37 void FlagFocus(FX_BOOL bSet); 38 39 protected: 40 void SetComboBoxFocus(FX_BOOL bSet); 41 CFWL_ComboBoxImp* m_pOuter; 42 friend class CFWL_ComboEditImpDelegate; 43 }; 44 class CFWL_ComboEditImpDelegate : public CFWL_EditImpDelegate { 45 public: 46 CFWL_ComboEditImpDelegate(CFWL_ComboEditImp* pOwner); 47 void OnProcessMessage(CFWL_Message* pMessage) override; 48 49 protected: 50 CFWL_ComboEditImp* m_pOwner; 51 }; 52 class CFWL_ComboListImp : public CFWL_ListBoxImp { 53 public: 54 CFWL_ComboListImp(const CFWL_WidgetImpProperties& properties, 55 IFWL_Widget* pOuter); 56 57 // CFWL_WidgetImp 58 FWL_Error Initialize() override; 59 FWL_Error Finalize() override; 60 61 int32_t MatchItem(const CFX_WideString& wsMatch); 62 void ChangeSelected(int32_t iSel); 63 int32_t CountItems(); 64 void GetItemRect(int32_t nIndex, CFX_RectF& rtItem); 65 void ClientToOuter(FX_FLOAT& fx, FX_FLOAT& fy); 66 void SetFocus(FX_BOOL bSet); 67 68 FX_BOOL m_bNotifyOwner; 69 70 friend class CFWL_ComboListImpDelegate; 71 friend class CFWL_ComboBoxImp; 72 }; 73 class CFWL_ComboListImpDelegate : public CFWL_ListBoxImpDelegate { 74 public: 75 CFWL_ComboListImpDelegate(CFWL_ComboListImp* pOwner); 76 void OnProcessMessage(CFWL_Message* pMessage) override; 77 78 protected: 79 void OnDropListFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE); 80 int32_t OnDropListMouseMove(CFWL_MsgMouse* pMsg); 81 int32_t OnDropListLButtonDown(CFWL_MsgMouse* pMsg); 82 int32_t OnDropListLButtonUp(CFWL_MsgMouse* pMsg); 83 int32_t OnDropListKey(CFWL_MsgKey* pKey); 84 void OnDropListKeyDown(CFWL_MsgKey* pKey); 85 CFWL_ComboListImp* m_pOwner; 86 }; 87 class CFWL_ComboBoxImp : public CFWL_WidgetImp { 88 public: 89 CFWL_ComboBoxImp(const CFWL_WidgetImpProperties& properties, 90 IFWL_Widget* pOuter); 91 ~CFWL_ComboBoxImp() override; 92 93 // CFWL_WidgetImp 94 FWL_Error GetClassName(CFX_WideString& wsClass) const override; 95 FWL_Type GetClassID() const override; 96 FWL_Error Initialize() override; 97 FWL_Error Finalize() override; 98 FWL_Error GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE) override; 99 FWL_Error ModifyStylesEx(uint32_t dwStylesExAdded, 100 uint32_t dwStylesExRemoved) override; 101 void SetStates(uint32_t dwStates, FX_BOOL bSet = TRUE) override; 102 FWL_Error Update() override; 103 FWL_WidgetHit HitTest(FX_FLOAT fx, FX_FLOAT fy) override; 104 FWL_Error DrawWidget(CFX_Graphics* pGraphics, 105 const CFX_Matrix* pMatrix = nullptr) override; 106 FWL_Error SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) override; 107 108 int32_t GetCurSel(); 109 FWL_Error SetCurSel(int32_t iSel); 110 FWL_Error SetEditText(const CFX_WideString& wsText); 111 int32_t GetEditTextLength() const; 112 FWL_Error GetEditText(CFX_WideString& wsText, 113 int32_t nStart = 0, 114 int32_t nCount = -1) const; 115 FWL_Error SetEditSelRange(int32_t nStart, int32_t nCount = -1); 116 int32_t GetEditSelRange(int32_t nIndex, int32_t& nStart); 117 int32_t GetEditLimit(); 118 FWL_Error SetEditLimit(int32_t nLimit); 119 FWL_Error EditDoClipboard(int32_t iCmd); 120 FX_BOOL EditRedo(const IFDE_TxtEdtDoRecord* pRecord); 121 FX_BOOL EditUndo(const IFDE_TxtEdtDoRecord* pRecord); 122 IFWL_ListBox* GetListBoxt(); 123 FX_BOOL AfterFocusShowDropList(); 124 FWL_Error OpenDropDownList(FX_BOOL bActivate); 125 FX_BOOL EditCanUndo(); 126 FX_BOOL EditCanRedo(); 127 FX_BOOL EditUndo(); 128 FX_BOOL EditRedo(); 129 FX_BOOL EditCanCopy(); 130 FX_BOOL EditCanCut(); 131 FX_BOOL EditCanSelectAll(); 132 FX_BOOL EditCopy(CFX_WideString& wsCopy); 133 FX_BOOL EditCut(CFX_WideString& wsCut); 134 FX_BOOL EditPaste(const CFX_WideString& wsPaste); 135 FX_BOOL EditSelectAll(); 136 FX_BOOL EditDelete(); 137 FX_BOOL EditDeSelect(); 138 FWL_Error GetBBox(CFX_RectF& rect); 139 FWL_Error EditModifyStylesEx(uint32_t dwStylesExAdded, 140 uint32_t dwStylesExRemoved); 141 142 protected: 143 friend class CFWL_ComboListImp; 144 friend class CFWL_ComboEditImp; 145 friend class CFWL_ComboEditImpDelegate; 146 friend class CFWL_ComboListImpDelegate; 147 friend class CFWL_ComboBoxImpDelegate; 148 friend class CFWL_ComboProxyImpDelegate; 149 150 void DrawStretchHandler(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix); 151 FX_FLOAT GetListHeight(); 152 void ShowDropList(FX_BOOL bActivate); 153 FX_BOOL IsDropListShowed(); 154 FX_BOOL IsDropDownStyle() const; 155 void MatchEditText(); 156 void SynchrEditText(int32_t iListItem); 157 void Layout(); 158 void ReSetTheme(); 159 void ReSetEditAlignment(); 160 void ReSetListItemAlignment(); 161 void ProcessSelChanged(FX_BOOL bLButtonUp); 162 void InitProxyForm(); 163 FWL_Error DisForm_Initialize(); 164 void DisForm_InitComboList(); 165 void DisForm_InitComboEdit(); 166 void DisForm_ShowDropList(FX_BOOL bActivate); 167 FX_BOOL DisForm_IsDropListShowed(); 168 FWL_Error DisForm_ModifyStylesEx(uint32_t dwStylesExAdded, 169 uint32_t dwStylesExRemoved); 170 FWL_Error DisForm_Update(); 171 FWL_WidgetHit DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy); 172 FWL_Error DisForm_DrawWidget(CFX_Graphics* pGraphics, 173 const CFX_Matrix* pMatrix = nullptr); 174 FWL_Error DisForm_GetBBox(CFX_RectF& rect); 175 void DisForm_Layout(); 176 177 CFX_RectF m_rtClient; 178 CFX_RectF m_rtContent; 179 CFX_RectF m_rtBtn; 180 CFX_RectF m_rtList; 181 CFX_RectF m_rtProxy; 182 CFX_RectF m_rtHandler; 183 std::unique_ptr<IFWL_Edit> m_pEdit; 184 std::unique_ptr<IFWL_ListBox> m_pListBox; 185 IFWL_Form* m_pForm; 186 FX_BOOL m_bLButtonDown; 187 FX_BOOL m_bUpFormHandler; 188 int32_t m_iCurSel; 189 int32_t m_iBtnState; 190 FX_FLOAT m_fComboFormHandler; 191 FX_FLOAT m_fItemHeight; 192 FX_BOOL m_bNeedShowList; 193 CFWL_FormProxyImp* m_pProxy; 194 CFWL_ComboProxyImpDelegate* m_pListProxyDelegate; 195 }; 196 class CFWL_ComboBoxImpDelegate : public CFWL_WidgetImpDelegate { 197 public: 198 CFWL_ComboBoxImpDelegate(CFWL_ComboBoxImp* pOwner); 199 void OnProcessMessage(CFWL_Message* pMessage) override; 200 void OnProcessEvent(CFWL_Event* pEvent) override; 201 void OnDrawWidget(CFX_Graphics* pGraphics, 202 const CFX_Matrix* pMatrix = nullptr) override; 203 204 protected: 205 void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE); 206 void OnLButtonDown(CFWL_MsgMouse* pMsg); 207 void OnLButtonUp(CFWL_MsgMouse* pMsg); 208 void OnMouseMove(CFWL_MsgMouse* pMsg); 209 void OnMouseLeave(CFWL_MsgMouse* pMsg); 210 void OnKey(CFWL_MsgKey* pMsg); 211 void DoSubCtrlKey(CFWL_MsgKey* pMsg); 212 213 protected: 214 void DisForm_OnProcessMessage(CFWL_Message* pMessage); 215 void DisForm_OnLButtonDown(CFWL_MsgMouse* pMsg); 216 void DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE); 217 void DisForm_OnKey(CFWL_MsgKey* pMsg); 218 219 protected: 220 CFWL_ComboBoxImp* m_pOwner; 221 friend class CFWL_ComboEditImpDelegate; 222 friend class CFWL_ComboListImpDelegate; 223 }; 224 class CFWL_ComboProxyImpDelegate : public CFWL_WidgetImpDelegate { 225 public: 226 CFWL_ComboProxyImpDelegate(IFWL_Form* pForm, CFWL_ComboBoxImp* pComboBox); 227 void OnProcessMessage(CFWL_Message* pMessage) override; 228 void OnDrawWidget(CFX_Graphics* pGraphics, 229 const CFX_Matrix* pMatrix = nullptr) override; Reset()230 void Reset() { m_bLButtonUpSelf = FALSE; } 231 232 protected: 233 void OnLButtonDown(CFWL_MsgMouse* pMsg); 234 void OnLButtonUp(CFWL_MsgMouse* pMsg); 235 void OnMouseMove(CFWL_MsgMouse* pMsg); 236 void OnDeactive(CFWL_MsgDeactivate* pMsg); 237 void OnFocusChanged(CFWL_MsgKillFocus* pMsg, FX_BOOL bSet); 238 FX_BOOL m_bLButtonDown; 239 FX_BOOL m_bLButtonUpSelf; 240 FX_FLOAT m_fStartPos; 241 IFWL_Form* m_pForm; 242 CFWL_ComboBoxImp* m_pComboBox; 243 }; 244 245 #endif // XFA_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_ 246