// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef XFA_FWL_CFWL_WIDGET_H_ #define XFA_FWL_CFWL_WIDGET_H_ #include <memory> #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/unowned_ptr.h" #include "xfa/fde/cfde_textout.h" #include "xfa/fwl/cfwl_event.h" #include "xfa/fwl/cfwl_themepart.h" #include "xfa/fwl/cfwl_widgetmgr.h" #include "xfa/fwl/fwl_widgethit.h" #include "xfa/fwl/ifwl_widgetdelegate.h" enum class FWL_Type { Unknown = 0, Barcode, Caret, CheckBox, ComboBox, DateTimePicker, Edit, Form, FormProxy, ListBox, MonthCalendar, PictureBox, PushButton, ScrollBar, SpinButton, ToolTip }; class CFWL_App; class CFWL_AppImp; class CFWL_MessageKey; class CFWL_Widget; class CFWL_WidgetMgr; class CFWL_WidgetProperties; class CXFA_FFWidget; class IFWL_ThemeProvider; class CFWL_Widget : public IFWL_WidgetDelegate { public: ~CFWL_Widget() override; virtual FWL_Type GetClassID() const = 0; virtual bool IsInstance(const WideStringView& wsClass) const; virtual CFX_RectF GetAutosizedWidgetRect(); virtual CFX_RectF GetWidgetRect(); virtual CFX_RectF GetClientRect(); virtual void ModifyStylesEx(uint32_t dwStylesExAdded, uint32_t dwStylesExRemoved); virtual void SetStates(uint32_t dwStates); virtual void RemoveStates(uint32_t dwStates); virtual void Update() = 0; virtual FWL_WidgetHit HitTest(const CFX_PointF& point); virtual void DrawWidget(CXFA_Graphics* pGraphics, const CFX_Matrix& matrix) = 0; virtual void SetThemeProvider(IFWL_ThemeProvider* pThemeProvider); // IFWL_WidgetDelegate. void OnProcessMessage(CFWL_Message* pMessage) override; void OnProcessEvent(CFWL_Event* pEvent) override; void OnDrawWidget(CXFA_Graphics* pGraphics, const CFX_Matrix& matrix) override; void InflateWidgetRect(CFX_RectF& rect); void SetWidgetRect(const CFX_RectF& rect); void SetParent(CFWL_Widget* pParent); CFWL_Widget* GetOwner() { return m_pWidgetMgr->GetOwnerWidget(this); } CFWL_Widget* GetOuter() const { return m_pOuter; } uint32_t GetStyles() const; void ModifyStyles(uint32_t dwStylesAdded, uint32_t dwStylesRemoved); uint32_t GetStylesEx() const; uint32_t GetStates() const; void LockUpdate() { m_iLock++; } void UnlockUpdate() { if (IsLocked()) m_iLock--; } CFX_PointF TransformTo(CFWL_Widget* pWidget, const CFX_PointF& point); CFX_Matrix GetMatrix(); IFWL_ThemeProvider* GetThemeProvider() const; void SetDelegate(IFWL_WidgetDelegate* delegate) { m_pDelegate = delegate; } IFWL_WidgetDelegate* GetDelegate() { return m_pDelegate ? m_pDelegate.Get() : this; } const IFWL_WidgetDelegate* GetDelegate() const { return m_pDelegate ? m_pDelegate.Get() : this; } const CFWL_App* GetOwnerApp() const { return m_pOwnerApp.Get(); } uint32_t GetEventKey() const { return m_nEventKey; } void SetEventKey(uint32_t key) { m_nEventKey = key; } CXFA_FFWidget* GetLayoutItem() const { return m_pLayoutItem; } void SetLayoutItem(CXFA_FFWidget* pItem) { m_pLayoutItem = pItem; } void SetFocus(bool bFocus); void RepaintRect(const CFX_RectF& pRect); void Repaint(); protected: CFWL_Widget(const CFWL_App* app, std::unique_ptr<CFWL_WidgetProperties> properties, CFWL_Widget* pOuter); bool IsEnabled() const; bool IsLocked() const { return m_iLock > 0; } bool HasBorder() const; CFX_RectF GetEdgeRect(); float GetBorderSize(bool bCX); CFX_RectF GetRelativeRect(); IFWL_ThemeProvider* GetAvailableTheme(); CFX_SizeF CalcTextSize(const WideString& wsText, IFWL_ThemeProvider* pTheme, bool bMultiLine); void CalcTextRect(const WideString& wsText, IFWL_ThemeProvider* pTheme, const FDE_TextStyle& dwTTOStyles, FDE_TextAlignment iTTOAlign, CFX_RectF& rect); void SetGrab(bool bSet); void GetPopupPos(float fMinHeight, float fMaxHeight, const CFX_RectF& rtAnchor, CFX_RectF& rtPopup); void RegisterEventTarget(CFWL_Widget* pEventSource); void UnregisterEventTarget(); void DispatchEvent(CFWL_Event* pEvent); void DrawBorder(CXFA_Graphics* pGraphics, CFWL_Part iPartBorder, IFWL_ThemeProvider* pTheme, const CFX_Matrix& pMatrix); UnownedPtr<const CFWL_App> const m_pOwnerApp; UnownedPtr<CFWL_WidgetMgr> const m_pWidgetMgr; std::unique_ptr<CFWL_WidgetProperties> m_pProperties; CFWL_Widget* m_pOuter; int32_t m_iLock; private: CFWL_Widget* GetParent() { return m_pWidgetMgr->GetParentWidget(this); } CFX_SizeF GetOffsetFromParent(CFWL_Widget* pParent); bool IsVisible() const; bool IsOverLapper() const; bool IsPopup() const; bool IsChild() const; CFWL_Widget* GetRootOuter(); bool GetPopupPosMenu(float fMinHeight, float fMaxHeight, const CFX_RectF& rtAnchor, CFX_RectF& rtPopup); bool GetPopupPosComboBox(float fMinHeight, float fMaxHeight, const CFX_RectF& rtAnchor, CFX_RectF& rtPopup); bool GetPopupPosGeneral(float fMinHeight, float fMaxHeight, const CFX_RectF& rtAnchor, CFX_RectF& rtPopup); void DrawBackground(CXFA_Graphics* pGraphics, CFWL_Part iPartBk, IFWL_ThemeProvider* pTheme, const CFX_Matrix* pMatrix); void NotifyDriver(); bool IsParent(CFWL_Widget* pParent); CXFA_FFWidget* m_pLayoutItem; uint32_t m_nEventKey; UnownedPtr<IFWL_WidgetDelegate> m_pDelegate; }; #endif // XFA_FWL_CFWL_WIDGET_H_