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