xref: /aosp_15_r20/external/pdfium/xfa/fwl/cfwl_widget.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_WIDGET_H_
8*3ac0a46fSAndroid Build Coastguard Worker #define XFA_FWL_CFWL_WIDGET_H_
9*3ac0a46fSAndroid Build Coastguard Worker 
10*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h>
11*3ac0a46fSAndroid Build Coastguard Worker 
12*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_coordinates.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/widestring.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/fx_dib.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/heap.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/garbage-collected.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/macros.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/member.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/prefinalizer.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fde/cfde_data.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_themepart.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_widgetmgr.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/fwl_widgethit.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/ifwl_widgetdelegate.h"
26*3ac0a46fSAndroid Build Coastguard Worker 
27*3ac0a46fSAndroid Build Coastguard Worker class CFWL_App;
28*3ac0a46fSAndroid Build Coastguard Worker class CFWL_Event;
29*3ac0a46fSAndroid Build Coastguard Worker class CFWL_Widget;
30*3ac0a46fSAndroid Build Coastguard Worker class IFWL_ThemeProvider;
31*3ac0a46fSAndroid Build Coastguard Worker 
32*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLE_WGT_OverLapper 0
33*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLE_WGT_Popup (1L << 0)
34*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLE_WGT_Child (2L << 0)
35*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLE_WGT_WindowTypeMask (3L << 0)
36*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLE_WGT_Border (1L << 2)
37*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLE_WGT_VScroll (1L << 11)
38*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLE_WGT_Group (1L << 22)
39*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLE_WGT_NoBackground (1L << 28)
40*3ac0a46fSAndroid Build Coastguard Worker 
41*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STATE_WGT_Disabled (1L << 2)
42*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STATE_WGT_Focused (1L << 4)
43*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STATE_WGT_Invisible (1L << 5)
44*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STATE_WGT_MAX 6
45*3ac0a46fSAndroid Build Coastguard Worker 
46*3ac0a46fSAndroid Build Coastguard Worker enum class FWL_Type {
47*3ac0a46fSAndroid Build Coastguard Worker   Unknown = 0,
48*3ac0a46fSAndroid Build Coastguard Worker 
49*3ac0a46fSAndroid Build Coastguard Worker   Barcode,
50*3ac0a46fSAndroid Build Coastguard Worker   Caret,
51*3ac0a46fSAndroid Build Coastguard Worker   CheckBox,
52*3ac0a46fSAndroid Build Coastguard Worker   ComboBox,
53*3ac0a46fSAndroid Build Coastguard Worker   DateTimePicker,
54*3ac0a46fSAndroid Build Coastguard Worker   Edit,
55*3ac0a46fSAndroid Build Coastguard Worker   Form,
56*3ac0a46fSAndroid Build Coastguard Worker   FormProxy,
57*3ac0a46fSAndroid Build Coastguard Worker   ListBox,
58*3ac0a46fSAndroid Build Coastguard Worker   MonthCalendar,
59*3ac0a46fSAndroid Build Coastguard Worker   PictureBox,
60*3ac0a46fSAndroid Build Coastguard Worker   PushButton,
61*3ac0a46fSAndroid Build Coastguard Worker   ScrollBar,
62*3ac0a46fSAndroid Build Coastguard Worker   SpinButton,
63*3ac0a46fSAndroid Build Coastguard Worker   ToolTip
64*3ac0a46fSAndroid Build Coastguard Worker };
65*3ac0a46fSAndroid Build Coastguard Worker 
66*3ac0a46fSAndroid Build Coastguard Worker // NOTE: CFWL_Widget serves as its own delegate until replaced at runtime.
67*3ac0a46fSAndroid Build Coastguard Worker class CFWL_Widget : public cppgc::GarbageCollected<CFWL_Widget>,
68*3ac0a46fSAndroid Build Coastguard Worker                     public IFWL_WidgetDelegate {
69*3ac0a46fSAndroid Build Coastguard Worker   CPPGC_USING_PRE_FINALIZER(CFWL_Widget, PreFinalize);
70*3ac0a46fSAndroid Build Coastguard Worker 
71*3ac0a46fSAndroid Build Coastguard Worker  public:
72*3ac0a46fSAndroid Build Coastguard Worker   class AdapterIface : public cppgc::GarbageCollectedMixin {
73*3ac0a46fSAndroid Build Coastguard Worker    public:
74*3ac0a46fSAndroid Build Coastguard Worker     virtual ~AdapterIface() = default;
75*3ac0a46fSAndroid Build Coastguard Worker     virtual CFX_Matrix GetRotateMatrix() = 0;
76*3ac0a46fSAndroid Build Coastguard Worker     virtual void DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) = 0;
77*3ac0a46fSAndroid Build Coastguard Worker     virtual void GetBorderColorAndThickness(FX_ARGB* cr, float* fWidth) = 0;
78*3ac0a46fSAndroid Build Coastguard Worker   };
79*3ac0a46fSAndroid Build Coastguard Worker 
80*3ac0a46fSAndroid Build Coastguard Worker   class Properties {
81*3ac0a46fSAndroid Build Coastguard Worker    public:
82*3ac0a46fSAndroid Build Coastguard Worker     uint32_t m_dwStyles = FWL_STYLE_WGT_Child;  // Mask of FWL_STYLE_*_*.
83*3ac0a46fSAndroid Build Coastguard Worker     uint32_t m_dwStyleExts = 0;                 // Mask of FWL_STYLEEXT_*_*.
84*3ac0a46fSAndroid Build Coastguard Worker     uint32_t m_dwStates = 0;                    // Mask of FWL_STATE_*_*.
85*3ac0a46fSAndroid Build Coastguard Worker   };
86*3ac0a46fSAndroid Build Coastguard Worker 
87*3ac0a46fSAndroid Build Coastguard Worker   class ScopedUpdateLock {
88*3ac0a46fSAndroid Build Coastguard Worker     CPPGC_STACK_ALLOCATED();  // Allow raw/unowned pointers.
89*3ac0a46fSAndroid Build Coastguard Worker 
90*3ac0a46fSAndroid Build Coastguard Worker    public:
91*3ac0a46fSAndroid Build Coastguard Worker     explicit ScopedUpdateLock(CFWL_Widget* widget);
92*3ac0a46fSAndroid Build Coastguard Worker     ~ScopedUpdateLock();
93*3ac0a46fSAndroid Build Coastguard Worker 
94*3ac0a46fSAndroid Build Coastguard Worker    private:
95*3ac0a46fSAndroid Build Coastguard Worker     UnownedPtr<CFWL_Widget> const widget_;  // Ok, stack-only.
96*3ac0a46fSAndroid Build Coastguard Worker   };
97*3ac0a46fSAndroid Build Coastguard Worker 
98*3ac0a46fSAndroid Build Coastguard Worker   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
99*3ac0a46fSAndroid Build Coastguard Worker   ~CFWL_Widget() override;
100*3ac0a46fSAndroid Build Coastguard Worker 
101*3ac0a46fSAndroid Build Coastguard Worker   virtual void PreFinalize();
102*3ac0a46fSAndroid Build Coastguard Worker   void Trace(cppgc::Visitor* visitor) const override;
103*3ac0a46fSAndroid Build Coastguard Worker 
104*3ac0a46fSAndroid Build Coastguard Worker   virtual FWL_Type GetClassID() const = 0;
105*3ac0a46fSAndroid Build Coastguard Worker   virtual bool IsForm() const;
106*3ac0a46fSAndroid Build Coastguard Worker   virtual CFX_RectF GetAutosizedWidgetRect();
107*3ac0a46fSAndroid Build Coastguard Worker   virtual CFX_RectF GetWidgetRect();
108*3ac0a46fSAndroid Build Coastguard Worker   virtual CFX_RectF GetClientRect();
109*3ac0a46fSAndroid Build Coastguard Worker   virtual void ModifyStyleExts(uint32_t dwStyleExtsAdded,
110*3ac0a46fSAndroid Build Coastguard Worker                                uint32_t dwStyleExtsRemoved);
111*3ac0a46fSAndroid Build Coastguard Worker   virtual void SetStates(uint32_t dwStates);
112*3ac0a46fSAndroid Build Coastguard Worker   virtual void RemoveStates(uint32_t dwStates);
113*3ac0a46fSAndroid Build Coastguard Worker   virtual void Update() = 0;
114*3ac0a46fSAndroid Build Coastguard Worker   virtual FWL_WidgetHit HitTest(const CFX_PointF& point);
115*3ac0a46fSAndroid Build Coastguard Worker   virtual void DrawWidget(CFGAS_GEGraphics* pGraphics,
116*3ac0a46fSAndroid Build Coastguard Worker                           const CFX_Matrix& matrix) = 0;
117*3ac0a46fSAndroid Build Coastguard Worker 
118*3ac0a46fSAndroid Build Coastguard Worker   // IFWL_WidgetDelegate:
119*3ac0a46fSAndroid Build Coastguard Worker   void OnProcessMessage(CFWL_Message* pMessage) override;
120*3ac0a46fSAndroid Build Coastguard Worker   void OnProcessEvent(CFWL_Event* pEvent) override;
121*3ac0a46fSAndroid Build Coastguard Worker 
122*3ac0a46fSAndroid Build Coastguard Worker   void InflateWidgetRect(CFX_RectF& rect);
123*3ac0a46fSAndroid Build Coastguard Worker   void SetWidgetRect(const CFX_RectF& rect);
124*3ac0a46fSAndroid Build Coastguard Worker 
125*3ac0a46fSAndroid Build Coastguard Worker   bool IsVisible() const;
126*3ac0a46fSAndroid Build Coastguard Worker   bool IsOverLapper() const;
127*3ac0a46fSAndroid Build Coastguard Worker   bool IsPopup() const;
128*3ac0a46fSAndroid Build Coastguard Worker   bool IsChild() const;
129*3ac0a46fSAndroid Build Coastguard Worker 
GetWidgetMgr()130*3ac0a46fSAndroid Build Coastguard Worker   CFWL_WidgetMgr* GetWidgetMgr() const { return m_pWidgetMgr; }
GetOuter()131*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* GetOuter() const { return m_pOuter; }
132*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* GetOutmost() const;
133*3ac0a46fSAndroid Build Coastguard Worker 
134*3ac0a46fSAndroid Build Coastguard Worker   void ModifyStyles(uint32_t dwStylesAdded, uint32_t dwStylesRemoved);
GetStyleExts()135*3ac0a46fSAndroid Build Coastguard Worker   uint32_t GetStyleExts() const { return m_Properties.m_dwStyleExts; }
GetStates()136*3ac0a46fSAndroid Build Coastguard Worker   uint32_t GetStates() const { return m_Properties.m_dwStates; }
137*3ac0a46fSAndroid Build Coastguard Worker 
138*3ac0a46fSAndroid Build Coastguard Worker   CFX_PointF TransformTo(CFWL_Widget* pWidget, const CFX_PointF& point);
139*3ac0a46fSAndroid Build Coastguard Worker   CFX_Matrix GetMatrix() const;
140*3ac0a46fSAndroid Build Coastguard Worker   IFWL_ThemeProvider* GetThemeProvider() const;
SetDelegate(IFWL_WidgetDelegate * delegate)141*3ac0a46fSAndroid Build Coastguard Worker   void SetDelegate(IFWL_WidgetDelegate* delegate) { m_pDelegate = delegate; }
GetDelegate()142*3ac0a46fSAndroid Build Coastguard Worker   IFWL_WidgetDelegate* GetDelegate() {
143*3ac0a46fSAndroid Build Coastguard Worker     return m_pDelegate ? m_pDelegate.Get() : this;
144*3ac0a46fSAndroid Build Coastguard Worker   }
GetDelegate()145*3ac0a46fSAndroid Build Coastguard Worker   const IFWL_WidgetDelegate* GetDelegate() const {
146*3ac0a46fSAndroid Build Coastguard Worker     return m_pDelegate ? m_pDelegate.Get() : this;
147*3ac0a46fSAndroid Build Coastguard Worker   }
148*3ac0a46fSAndroid Build Coastguard Worker 
GetFWLApp()149*3ac0a46fSAndroid Build Coastguard Worker   CFWL_App* GetFWLApp() const { return m_pFWLApp; }
GetEventKey()150*3ac0a46fSAndroid Build Coastguard Worker   uint64_t GetEventKey() const { return m_nEventKey; }
SetEventKey(uint64_t key)151*3ac0a46fSAndroid Build Coastguard Worker   void SetEventKey(uint64_t key) { m_nEventKey = key; }
152*3ac0a46fSAndroid Build Coastguard Worker 
GetAdapterIface()153*3ac0a46fSAndroid Build Coastguard Worker   AdapterIface* GetAdapterIface() const { return m_pAdapterIface; }
SetAdapterIface(AdapterIface * pItem)154*3ac0a46fSAndroid Build Coastguard Worker   void SetAdapterIface(AdapterIface* pItem) { m_pAdapterIface = pItem; }
155*3ac0a46fSAndroid Build Coastguard Worker   void RepaintRect(const CFX_RectF& pRect);
156*3ac0a46fSAndroid Build Coastguard Worker 
157*3ac0a46fSAndroid Build Coastguard Worker  protected:
158*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget(CFWL_App* app, const Properties& properties, CFWL_Widget* pOuter);
159*3ac0a46fSAndroid Build Coastguard Worker 
160*3ac0a46fSAndroid Build Coastguard Worker   bool IsEnabled() const;
IsLocked()161*3ac0a46fSAndroid Build Coastguard Worker   bool IsLocked() const { return m_iLock > 0; }
162*3ac0a46fSAndroid Build Coastguard Worker   bool HasBorder() const;
163*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF GetEdgeRect() const;
164*3ac0a46fSAndroid Build Coastguard Worker   float GetCXBorderSize() const;
165*3ac0a46fSAndroid Build Coastguard Worker   float GetCYBorderSize() const;
166*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF GetRelativeRect() const;
167*3ac0a46fSAndroid Build Coastguard Worker   CFX_SizeF CalcTextSize(const WideString& wsText, bool bMultiLine);
168*3ac0a46fSAndroid Build Coastguard Worker   void CalcTextRect(const WideString& wsText,
169*3ac0a46fSAndroid Build Coastguard Worker                     const FDE_TextStyle& dwTTOStyles,
170*3ac0a46fSAndroid Build Coastguard Worker                     FDE_TextAlignment iTTOAlign,
171*3ac0a46fSAndroid Build Coastguard Worker                     CFX_RectF* pRect);
172*3ac0a46fSAndroid Build Coastguard Worker   void SetGrab(bool bSet);
173*3ac0a46fSAndroid Build Coastguard Worker   void UnregisterEventTarget();
174*3ac0a46fSAndroid Build Coastguard Worker   void DispatchEvent(CFWL_Event* pEvent);
175*3ac0a46fSAndroid Build Coastguard Worker   void DrawBorder(CFGAS_GEGraphics* pGraphics,
176*3ac0a46fSAndroid Build Coastguard Worker                   CFWL_ThemePart::Part iPartBorder,
177*3ac0a46fSAndroid Build Coastguard Worker                   const CFX_Matrix& pMatrix);
178*3ac0a46fSAndroid Build Coastguard Worker 
179*3ac0a46fSAndroid Build Coastguard Worker   Properties m_Properties;
180*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_WidgetRect;
181*3ac0a46fSAndroid Build Coastguard Worker 
182*3ac0a46fSAndroid Build Coastguard Worker  private:
LockUpdate()183*3ac0a46fSAndroid Build Coastguard Worker   void LockUpdate() { m_iLock++; }
UnlockUpdate()184*3ac0a46fSAndroid Build Coastguard Worker   void UnlockUpdate() {
185*3ac0a46fSAndroid Build Coastguard Worker     if (IsLocked())
186*3ac0a46fSAndroid Build Coastguard Worker       m_iLock--;
187*3ac0a46fSAndroid Build Coastguard Worker   }
188*3ac0a46fSAndroid Build Coastguard Worker 
GetParent()189*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* GetParent() const { return m_pWidgetMgr->GetParentWidget(this); }
190*3ac0a46fSAndroid Build Coastguard Worker   CFX_SizeF GetOffsetFromParent(CFWL_Widget* pParent);
191*3ac0a46fSAndroid Build Coastguard Worker   void DrawBackground(CFGAS_GEGraphics* pGraphics,
192*3ac0a46fSAndroid Build Coastguard Worker                       CFWL_ThemePart::Part iPartBk,
193*3ac0a46fSAndroid Build Coastguard Worker                       const CFX_Matrix& mtMatrix);
194*3ac0a46fSAndroid Build Coastguard Worker   void NotifyDriver();
195*3ac0a46fSAndroid Build Coastguard Worker   bool IsParent(CFWL_Widget* pParent);
196*3ac0a46fSAndroid Build Coastguard Worker 
197*3ac0a46fSAndroid Build Coastguard Worker   int32_t m_iLock = 0;
198*3ac0a46fSAndroid Build Coastguard Worker   uint64_t m_nEventKey = 0;
199*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<AdapterIface> m_pAdapterIface;
200*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CFWL_App> const m_pFWLApp;
201*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CFWL_WidgetMgr> const m_pWidgetMgr;
202*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<IFWL_WidgetDelegate> m_pDelegate;
203*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CFWL_Widget> const m_pOuter;
204*3ac0a46fSAndroid Build Coastguard Worker };
205*3ac0a46fSAndroid Build Coastguard Worker 
206*3ac0a46fSAndroid Build Coastguard Worker #endif  // XFA_FWL_CFWL_WIDGET_H_
207