1 // Copyright 2014 The PDFium Authors 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_WND_H_ 8 #define FPDFSDK_PWL_CPWL_WND_H_ 9 10 #include <memory> 11 #include <vector> 12 13 #include "core/fxcrt/cfx_timer.h" 14 #include "core/fxcrt/mask.h" 15 #include "core/fxcrt/observed_ptr.h" 16 #include "core/fxcrt/unowned_ptr.h" 17 #include "core/fxcrt/unowned_ptr_exclusion.h" 18 #include "core/fxcrt/widestring.h" 19 #include "core/fxge/cfx_color.h" 20 #include "core/fxge/cfx_renderdevice.h" 21 #include "fpdfsdk/pwl/ipwl_fillernotify.h" 22 #include "public/fpdf_fwlevent.h" 23 24 class CPWL_Edit; 25 class CPWL_ScrollBar; 26 class IPVT_FontMap; 27 struct PWL_SCROLL_INFO; 28 29 // window styles 30 #define PWS_BORDER 0x40000000L 31 #define PWS_BACKGROUND 0x20000000L 32 #define PWS_VSCROLL 0x08000000L 33 #define PWS_VISIBLE 0x04000000L 34 #define PWS_READONLY 0x01000000L 35 #define PWS_AUTOFONTSIZE 0x00800000L 36 #define PWS_AUTOTRANSPARENT 0x00400000L 37 #define PWS_NOREFRESHCLIP 0x00200000L 38 39 // edit and label styles 40 #define PES_MULTILINE 0x0001L 41 #define PES_PASSWORD 0x0002L 42 #define PES_LEFT 0x0004L 43 #define PES_RIGHT 0x0008L 44 #define PES_MIDDLE 0x0010L 45 #define PES_TOP 0x0020L 46 #define PES_CENTER 0x0080L 47 #define PES_CHARARRAY 0x0100L 48 #define PES_AUTOSCROLL 0x0200L 49 #define PES_AUTORETURN 0x0400L 50 #define PES_UNDO 0x0800L 51 #define PES_RICH 0x1000L 52 #define PES_TEXTOVERFLOW 0x4000L 53 54 // listbox styles 55 #define PLBS_MULTIPLESEL 0x0001L 56 #define PLBS_HOVERSEL 0x0008L 57 58 // combobox styles 59 #define PCBS_ALLOWCUSTOMTEXT 0x0001L 60 61 struct CPWL_Dash { 62 int32_t nDash; 63 int32_t nGap; 64 int32_t nPhase; 65 }; 66 67 class CPWL_Wnd : public Observable { 68 public: 69 static const CFX_Color kDefaultBlackColor; 70 static const CFX_Color kDefaultWhiteColor; 71 72 class SharedCaptureFocusState; 73 74 class ProviderIface : public Observable { 75 public: 76 virtual ~ProviderIface() = default; 77 78 // get a matrix which map user space to CWnd client space 79 virtual CFX_Matrix GetWindowMatrix( 80 const IPWL_FillerNotify::PerWindowData* pAttached) = 0; 81 82 virtual void OnSetFocusForEdit(CPWL_Edit* pEdit) = 0; 83 }; 84 85 // Caller-provided options for window creation. 86 class CreateParams { 87 public: 88 CreateParams(CFX_Timer::HandlerIface* timer_handler, 89 IPWL_FillerNotify* filler_notify, 90 ProviderIface* provider); 91 CreateParams(const CreateParams& other); 92 ~CreateParams(); 93 94 // Required: 95 CFX_FloatRect rcRectWnd; 96 ObservedPtr<CFX_Timer::HandlerIface> const pTimerHandler; 97 UnownedPtr<IPWL_FillerNotify> const pFillerNotify; 98 UnownedPtr<IPVT_FontMap> pFontMap; 99 ObservedPtr<ProviderIface> pProvider; 100 101 // Optional: 102 uint32_t dwFlags = 0; 103 CFX_Color sBackgroundColor; 104 BorderStyle nBorderStyle = BorderStyle::kSolid; 105 int32_t dwBorderWidth = 1; 106 CFX_Color sBorderColor; 107 CFX_Color sTextColor; 108 int32_t nTransparency = 255; 109 float fFontSize; 110 CPWL_Dash sDash; 111 112 // Ignore, used internally only: 113 // TODO(tsepez): fix murky ownership, bare delete. 114 UNOWNED_PTR_EXCLUSION SharedCaptureFocusState* pSharedCaptureFocusState = 115 nullptr; 116 IPWL_FillerNotify::CursorStyle eCursorType = 117 IPWL_FillerNotify::CursorStyle::kArrow; 118 }; 119 120 static bool IsSHIFTKeyDown(Mask<FWL_EVENTFLAG> nFlag); 121 static bool IsCTRLKeyDown(Mask<FWL_EVENTFLAG> nFlag); 122 static bool IsALTKeyDown(Mask<FWL_EVENTFLAG> nFlag); 123 static bool IsMETAKeyDown(Mask<FWL_EVENTFLAG> nFlag); 124 125 // Selects between IsCTRLKeyDown() and IsMETAKeyDown() depending on platform. 126 static bool IsPlatformShortcutKey(Mask<FWL_EVENTFLAG> nFlag); 127 128 CPWL_Wnd(const CreateParams& cp, 129 std::unique_ptr<IPWL_FillerNotify::PerWindowData> pAttachedData); 130 virtual ~CPWL_Wnd(); 131 132 // Returns |true| iff this instance is still allocated. 133 [[nodiscard]] virtual bool InvalidateRect(const CFX_FloatRect* pRect); 134 135 virtual bool OnKeyDown(FWL_VKEYCODE nKeyCode, Mask<FWL_EVENTFLAG> nFlag); 136 virtual bool OnChar(uint16_t nChar, Mask<FWL_EVENTFLAG> nFlag); 137 virtual bool OnLButtonDblClk(Mask<FWL_EVENTFLAG> nFlag, 138 const CFX_PointF& point); 139 virtual bool OnLButtonDown(Mask<FWL_EVENTFLAG> nFlag, 140 const CFX_PointF& point); 141 virtual bool OnLButtonUp(Mask<FWL_EVENTFLAG> nFlag, const CFX_PointF& point); 142 virtual bool OnRButtonDown(Mask<FWL_EVENTFLAG> nFlag, 143 const CFX_PointF& point); 144 virtual bool OnRButtonUp(Mask<FWL_EVENTFLAG> nFlag, const CFX_PointF& point); 145 virtual bool OnMouseMove(Mask<FWL_EVENTFLAG> nFlag, const CFX_PointF& point); 146 virtual bool OnMouseWheel(Mask<FWL_EVENTFLAG> nFlag, 147 const CFX_PointF& point, 148 const CFX_Vector& delta); 149 virtual void SetScrollInfo(const PWL_SCROLL_INFO& info); 150 virtual void SetScrollPosition(float pos); 151 virtual void ScrollWindowVertically(float pos); 152 virtual void NotifyLButtonDown(CPWL_Wnd* child, const CFX_PointF& pos); 153 virtual void NotifyLButtonUp(CPWL_Wnd* child, const CFX_PointF& pos); 154 virtual void NotifyMouseMove(CPWL_Wnd* child, const CFX_PointF& pos); 155 virtual void SetFocus(); 156 virtual void KillFocus(); 157 virtual void SetCursor(); 158 159 // Returns |true| iff this instance is still allocated. 160 [[nodiscard]] virtual bool SetVisible(bool bVisible); 161 virtual void SetFontSize(float fFontSize); 162 virtual float GetFontSize() const; 163 164 virtual WideString GetText(); 165 virtual WideString GetSelectedText(); 166 virtual void ReplaceAndKeepSelection(const WideString& text); 167 virtual void ReplaceSelection(const WideString& text); 168 virtual bool SelectAllText(); 169 170 virtual bool CanUndo(); 171 virtual bool CanRedo(); 172 virtual bool Undo(); 173 virtual bool Redo(); 174 175 virtual CFX_FloatRect GetFocusRect() const; 176 virtual CFX_FloatRect GetClientRect() const; 177 178 virtual void OnSetFocus(); 179 virtual void OnKillFocus(); 180 181 void AddChild(std::unique_ptr<CPWL_Wnd> pWnd); 182 void RemoveChild(CPWL_Wnd* pWnd); 183 void Realize(); 184 void Destroy(); 185 bool Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh); 186 187 void InvalidateProvider(ProviderIface* provider); 188 void DrawAppearance(CFX_RenderDevice* pDevice, 189 const CFX_Matrix& mtUser2Device); 190 191 int32_t GetBorderWidth() const; 192 CFX_FloatRect GetWindowRect() const; 193 IsVisible()194 bool IsVisible() const { return m_bVisible; } 195 bool HasFlag(uint32_t dwFlags) const; 196 void RemoveFlag(uint32_t dwFlags); 197 void SetClipRect(const CFX_FloatRect& rect); 198 GetAttachedData()199 IPWL_FillerNotify::PerWindowData* GetAttachedData() const { 200 return m_pAttachedData.get(); 201 } 202 std::unique_ptr<IPWL_FillerNotify::PerWindowData> CloneAttachedData() const; 203 std::vector<UnownedPtr<CPWL_Wnd>> GetAncestors(); 204 205 bool WndHitTest(const CFX_PointF& point) const; 206 bool ClientHitTest(const CFX_PointF& point) const; 207 bool IsCaptureMouse() const; 208 209 bool IsFocused() const; 210 bool IsReadOnly() const; 211 212 void SetTransparency(int32_t nTransparency); 213 CFX_Matrix GetWindowMatrix() const; 214 215 protected: 216 virtual void CreateChildWnd(const CreateParams& cp); 217 218 // Returns |true| iff this instance is still allocated. 219 [[nodiscard]] virtual bool RepositionChildWnd(); 220 221 virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, 222 const CFX_Matrix& mtUser2Device); 223 224 virtual void OnCreated(); 225 virtual void OnDestroy(); 226 IsValid()227 bool IsValid() const { return m_bCreated; } GetCreationParams()228 CreateParams* GetCreationParams() { return &m_CreationParams; } GetProvider()229 ProviderIface* GetProvider() const { 230 return m_CreationParams.pProvider.Get(); 231 } GetTimerHandler()232 CFX_Timer::HandlerIface* GetTimerHandler() const { 233 return m_CreationParams.pTimerHandler.Get(); 234 } GetFillerNotify()235 IPWL_FillerNotify* GetFillerNotify() const { 236 return m_CreationParams.pFillerNotify; 237 } 238 GetParentWindow()239 CPWL_Wnd* GetParentWindow() const { return m_pParent; } 240 CPWL_ScrollBar* GetVScrollBar() const; 241 242 // Returns |true| iff this instance is still allocated. 243 [[nodiscard]] bool InvalidateRectMove(const CFX_FloatRect& rcOld, 244 const CFX_FloatRect& rcNew); 245 246 void SetCapture(); 247 void ReleaseCapture(); 248 bool IsWndCaptureMouse(const CPWL_Wnd* pWnd) const; 249 bool IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const; 250 251 CFX_Color GetBackgroundColor() const; 252 CFX_Color GetBorderColor() const; 253 CFX_Color GetTextColor() const; 254 CFX_Color GetBorderLeftTopColor(BorderStyle nBorderStyle) const; 255 CFX_Color GetBorderRightBottomColor(BorderStyle nBorderStyle) const; 256 BorderStyle GetBorderStyle() const; 257 const CPWL_Dash& GetBorderDash() const; 258 259 int32_t GetTransparency(); 260 int32_t GetInnerBorderWidth() const; 261 CFX_PointF GetCenterPoint() const; 262 const CFX_FloatRect& GetClipRect() const; 263 GetFontMap()264 IPVT_FontMap* GetFontMap() const { return m_CreationParams.pFontMap; } 265 266 private: 267 void DrawChildAppearance(CFX_RenderDevice* pDevice, 268 const CFX_Matrix& mtUser2Device); 269 270 CFX_FloatRect PWLtoWnd(const CFX_FloatRect& rect) const; 271 272 void CreateVScrollBar(const CreateParams& cp); 273 274 void AdjustStyle(); 275 void CreateSharedCaptureFocusState(); 276 void DestroySharedCaptureFocusState(); 277 SharedCaptureFocusState* GetSharedCaptureFocusState() const; 278 279 CreateParams m_CreationParams; 280 std::unique_ptr<IPWL_FillerNotify::PerWindowData> m_pAttachedData; 281 UnownedPtr<CPWL_Wnd> m_pParent; 282 std::vector<std::unique_ptr<CPWL_Wnd>> m_Children; 283 UnownedPtr<CPWL_ScrollBar> m_pVScrollBar; 284 CFX_FloatRect m_rcWindow; 285 CFX_FloatRect m_rcClip; 286 bool m_bCreated = false; 287 bool m_bVisible = false; 288 }; 289 290 #endif // FPDFSDK_PWL_CPWL_WND_H_ 291