• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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