1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2016 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 FPDFSDK_CPDFSDK_WIDGET_H_
8*3ac0a46fSAndroid Build Coastguard Worker #define FPDFSDK_CPDFSDK_WIDGET_H_
9*3ac0a46fSAndroid Build Coastguard Worker
10*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_aaction.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_action.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_annot.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_formfield.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_coordinates.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/widestring.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_color.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_baannot.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/optional.h"
20*3ac0a46fSAndroid Build Coastguard Worker
21*3ac0a46fSAndroid Build Coastguard Worker class CFFL_InteractiveFormFiller;
22*3ac0a46fSAndroid Build Coastguard Worker class CFX_RenderDevice;
23*3ac0a46fSAndroid Build Coastguard Worker class CPDF_Annot;
24*3ac0a46fSAndroid Build Coastguard Worker class CPDF_FormControl;
25*3ac0a46fSAndroid Build Coastguard Worker class CPDF_FormField;
26*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_FormFillEnvironment;
27*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_InteractiveForm;
28*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_PageView;
29*3ac0a46fSAndroid Build Coastguard Worker struct CFFL_FieldAction;
30*3ac0a46fSAndroid Build Coastguard Worker
31*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
32*3ac0a46fSAndroid Build Coastguard Worker class CXFA_FFWidget;
33*3ac0a46fSAndroid Build Coastguard Worker class CXFA_FFWidgetHandler;
34*3ac0a46fSAndroid Build Coastguard Worker
35*3ac0a46fSAndroid Build Coastguard Worker enum PDFSDK_XFAAActionType {
36*3ac0a46fSAndroid Build Coastguard Worker PDFSDK_XFA_Click = 0,
37*3ac0a46fSAndroid Build Coastguard Worker PDFSDK_XFA_Full,
38*3ac0a46fSAndroid Build Coastguard Worker PDFSDK_XFA_PreOpen,
39*3ac0a46fSAndroid Build Coastguard Worker PDFSDK_XFA_PostOpen
40*3ac0a46fSAndroid Build Coastguard Worker };
41*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
42*3ac0a46fSAndroid Build Coastguard Worker
43*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_Widget final : public CPDFSDK_BAAnnot {
44*3ac0a46fSAndroid Build Coastguard Worker public:
45*3ac0a46fSAndroid Build Coastguard Worker enum ValueChanged : bool { kValueUnchanged = false, kValueChanged = true };
46*3ac0a46fSAndroid Build Coastguard Worker
47*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_Widget(CPDF_Annot* pAnnot,
48*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView,
49*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_InteractiveForm* pInteractiveForm);
50*3ac0a46fSAndroid Build Coastguard Worker ~CPDFSDK_Widget() override;
51*3ac0a46fSAndroid Build Coastguard Worker
52*3ac0a46fSAndroid Build Coastguard Worker // CPDFSDK_BAAnnot:
53*3ac0a46fSAndroid Build Coastguard Worker void OnLoad() override;
54*3ac0a46fSAndroid Build Coastguard Worker CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT) override;
55*3ac0a46fSAndroid Build Coastguard Worker bool IsAppearanceValid() override;
56*3ac0a46fSAndroid Build Coastguard Worker int GetLayoutOrder() const override;
57*3ac0a46fSAndroid Build Coastguard Worker void OnDraw(CFX_RenderDevice* pDevice,
58*3ac0a46fSAndroid Build Coastguard Worker const CFX_Matrix& mtUser2Device,
59*3ac0a46fSAndroid Build Coastguard Worker bool bDrawAnnots) override;
60*3ac0a46fSAndroid Build Coastguard Worker bool DoHitTest(const CFX_PointF& point) override;
61*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect GetViewBBox() override;
62*3ac0a46fSAndroid Build Coastguard Worker bool CanUndo() override;
63*3ac0a46fSAndroid Build Coastguard Worker bool CanRedo() override;
64*3ac0a46fSAndroid Build Coastguard Worker bool Undo() override;
65*3ac0a46fSAndroid Build Coastguard Worker bool Redo() override;
66*3ac0a46fSAndroid Build Coastguard Worker WideString GetText() override;
67*3ac0a46fSAndroid Build Coastguard Worker WideString GetSelectedText() override;
68*3ac0a46fSAndroid Build Coastguard Worker void ReplaceAndKeepSelection(const WideString& text) override;
69*3ac0a46fSAndroid Build Coastguard Worker void ReplaceSelection(const WideString& text) override;
70*3ac0a46fSAndroid Build Coastguard Worker bool SelectAllText() override;
71*3ac0a46fSAndroid Build Coastguard Worker bool SetIndexSelected(int index, bool selected) override;
72*3ac0a46fSAndroid Build Coastguard Worker bool IsIndexSelected(int index) override;
73*3ac0a46fSAndroid Build Coastguard Worker void DrawAppearance(CFX_RenderDevice* pDevice,
74*3ac0a46fSAndroid Build Coastguard Worker const CFX_Matrix& mtUser2Device,
75*3ac0a46fSAndroid Build Coastguard Worker CPDF_Annot::AppearanceMode mode) override;
76*3ac0a46fSAndroid Build Coastguard Worker
77*3ac0a46fSAndroid Build Coastguard Worker bool IsSignatureWidget() const;
78*3ac0a46fSAndroid Build Coastguard Worker void SetRect(const CFX_FloatRect& rect);
79*3ac0a46fSAndroid Build Coastguard Worker FormFieldType GetFieldType() const;
80*3ac0a46fSAndroid Build Coastguard Worker int GetFieldFlags() const;
81*3ac0a46fSAndroid Build Coastguard Worker int GetRotate() const;
82*3ac0a46fSAndroid Build Coastguard Worker
83*3ac0a46fSAndroid Build Coastguard Worker absl::optional<FX_COLORREF> GetFillColor() const;
84*3ac0a46fSAndroid Build Coastguard Worker absl::optional<FX_COLORREF> GetBorderColor() const;
85*3ac0a46fSAndroid Build Coastguard Worker absl::optional<FX_COLORREF> GetTextColor() const;
86*3ac0a46fSAndroid Build Coastguard Worker float GetFontSize() const;
87*3ac0a46fSAndroid Build Coastguard Worker
88*3ac0a46fSAndroid Build Coastguard Worker int GetSelectedIndex(int nIndex) const;
89*3ac0a46fSAndroid Build Coastguard Worker WideString GetValue() const;
90*3ac0a46fSAndroid Build Coastguard Worker WideString GetExportValue() const;
91*3ac0a46fSAndroid Build Coastguard Worker WideString GetOptionLabel(int nIndex) const;
92*3ac0a46fSAndroid Build Coastguard Worker WideString GetSelectExportText(int nIndex) const;
93*3ac0a46fSAndroid Build Coastguard Worker
94*3ac0a46fSAndroid Build Coastguard Worker int CountOptions() const;
95*3ac0a46fSAndroid Build Coastguard Worker bool IsOptionSelected(int nIndex) const;
96*3ac0a46fSAndroid Build Coastguard Worker int GetTopVisibleIndex() const;
97*3ac0a46fSAndroid Build Coastguard Worker bool IsChecked() const;
98*3ac0a46fSAndroid Build Coastguard Worker int GetAlignment() const;
99*3ac0a46fSAndroid Build Coastguard Worker int GetMaxLen() const;
100*3ac0a46fSAndroid Build Coastguard Worker
101*3ac0a46fSAndroid Build Coastguard Worker void SetCheck(bool bChecked);
102*3ac0a46fSAndroid Build Coastguard Worker void SetValue(const WideString& sValue);
103*3ac0a46fSAndroid Build Coastguard Worker void SetOptionSelection(int index);
104*3ac0a46fSAndroid Build Coastguard Worker void ClearSelection();
105*3ac0a46fSAndroid Build Coastguard Worker void SetTopVisibleIndex(int index);
106*3ac0a46fSAndroid Build Coastguard Worker
107*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
108*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* GetMixXFAWidget() const;
109*3ac0a46fSAndroid Build Coastguard Worker bool HasXFAAAction(PDFSDK_XFAAActionType eXFAAAT) const;
110*3ac0a46fSAndroid Build Coastguard Worker bool OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT,
111*3ac0a46fSAndroid Build Coastguard Worker CFFL_FieldAction* data,
112*3ac0a46fSAndroid Build Coastguard Worker const CPDFSDK_PageView* pPageView);
113*3ac0a46fSAndroid Build Coastguard Worker void Synchronize(bool bSynchronizeElse);
114*3ac0a46fSAndroid Build Coastguard Worker // TODO(thestig): Figure out if the parameter should be used or removed.
115*3ac0a46fSAndroid Build Coastguard Worker void ResetXFAAppearance(ValueChanged bValueChanged);
116*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
117*3ac0a46fSAndroid Build Coastguard Worker
118*3ac0a46fSAndroid Build Coastguard Worker void ResetAppearance(absl::optional<WideString> sValue,
119*3ac0a46fSAndroid Build Coastguard Worker ValueChanged bValueChanged);
120*3ac0a46fSAndroid Build Coastguard Worker void ResetFieldAppearance();
121*3ac0a46fSAndroid Build Coastguard Worker void UpdateField();
122*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> OnFormat();
123*3ac0a46fSAndroid Build Coastguard Worker
124*3ac0a46fSAndroid Build Coastguard Worker bool OnAAction(CPDF_AAction::AActionType type,
125*3ac0a46fSAndroid Build Coastguard Worker CFFL_FieldAction* data,
126*3ac0a46fSAndroid Build Coastguard Worker const CPDFSDK_PageView* pPageView);
127*3ac0a46fSAndroid Build Coastguard Worker
128*3ac0a46fSAndroid Build Coastguard Worker CPDF_FormField* GetFormField() const;
129*3ac0a46fSAndroid Build Coastguard Worker CPDF_FormControl* GetFormControl() const;
130*3ac0a46fSAndroid Build Coastguard Worker
131*3ac0a46fSAndroid Build Coastguard Worker void DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView);
132*3ac0a46fSAndroid Build Coastguard Worker
133*3ac0a46fSAndroid Build Coastguard Worker void SetAppModified();
134*3ac0a46fSAndroid Build Coastguard Worker void ClearAppModified();
135*3ac0a46fSAndroid Build Coastguard Worker bool IsAppModified() const;
136*3ac0a46fSAndroid Build Coastguard Worker
GetAppearanceAge()137*3ac0a46fSAndroid Build Coastguard Worker uint32_t GetAppearanceAge() const { return m_nAppearanceAge; }
GetValueAge()138*3ac0a46fSAndroid Build Coastguard Worker uint32_t GetValueAge() const { return m_nValueAge; }
139*3ac0a46fSAndroid Build Coastguard Worker
140*3ac0a46fSAndroid Build Coastguard Worker bool IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode) const;
141*3ac0a46fSAndroid Build Coastguard Worker bool IsPushHighlighted() const;
142*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix GetMatrix() const;
143*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect GetClientRect() const;
144*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect GetRotatedRect() const;
145*3ac0a46fSAndroid Build Coastguard Worker CFX_Color GetTextPWLColor() const;
146*3ac0a46fSAndroid Build Coastguard Worker CFX_Color GetBorderPWLColor() const;
147*3ac0a46fSAndroid Build Coastguard Worker CFX_Color GetFillPWLColor() const;
148*3ac0a46fSAndroid Build Coastguard Worker
149*3ac0a46fSAndroid Build Coastguard Worker private:
150*3ac0a46fSAndroid Build Coastguard Worker // CPDFSDK_Annot::UnsafeInputHandlers:
151*3ac0a46fSAndroid Build Coastguard Worker void OnMouseEnter(Mask<FWL_EVENTFLAG> nFlags) override;
152*3ac0a46fSAndroid Build Coastguard Worker void OnMouseExit(Mask<FWL_EVENTFLAG> nFlags) override;
153*3ac0a46fSAndroid Build Coastguard Worker bool OnLButtonDown(Mask<FWL_EVENTFLAG> nFlags,
154*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) override;
155*3ac0a46fSAndroid Build Coastguard Worker bool OnLButtonUp(Mask<FWL_EVENTFLAG> nFlags,
156*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) override;
157*3ac0a46fSAndroid Build Coastguard Worker bool OnLButtonDblClk(Mask<FWL_EVENTFLAG> nFlags,
158*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) override;
159*3ac0a46fSAndroid Build Coastguard Worker bool OnMouseMove(Mask<FWL_EVENTFLAG> nFlags,
160*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) override;
161*3ac0a46fSAndroid Build Coastguard Worker bool OnMouseWheel(Mask<FWL_EVENTFLAG> nFlags,
162*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point,
163*3ac0a46fSAndroid Build Coastguard Worker const CFX_Vector& delta) override;
164*3ac0a46fSAndroid Build Coastguard Worker bool OnRButtonDown(Mask<FWL_EVENTFLAG> nFlags,
165*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) override;
166*3ac0a46fSAndroid Build Coastguard Worker bool OnRButtonUp(Mask<FWL_EVENTFLAG> nFlags,
167*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) override;
168*3ac0a46fSAndroid Build Coastguard Worker bool OnChar(uint32_t nChar, Mask<FWL_EVENTFLAG> nFlags) override;
169*3ac0a46fSAndroid Build Coastguard Worker bool OnKeyDown(FWL_VKEYCODE nKeyCode, Mask<FWL_EVENTFLAG> nFlags) override;
170*3ac0a46fSAndroid Build Coastguard Worker bool OnSetFocus(Mask<FWL_EVENTFLAG> nFlags) override;
171*3ac0a46fSAndroid Build Coastguard Worker bool OnKillFocus(Mask<FWL_EVENTFLAG> nFlags) override;
172*3ac0a46fSAndroid Build Coastguard Worker
173*3ac0a46fSAndroid Build Coastguard Worker CFFL_InteractiveFormFiller* GetInteractiveFormFiller();
174*3ac0a46fSAndroid Build Coastguard Worker
175*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
176*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidgetHandler* GetXFAWidgetHandler() const;
177*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* GetGroupMixXFAWidget() const;
178*3ac0a46fSAndroid Build Coastguard Worker WideString GetName() const;
179*3ac0a46fSAndroid Build Coastguard Worker bool HandleXFAAAction(CPDF_AAction::AActionType type,
180*3ac0a46fSAndroid Build Coastguard Worker CFFL_FieldAction* data,
181*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* pFormFillEnv);
182*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
183*3ac0a46fSAndroid Build Coastguard Worker
184*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<CPDFSDK_InteractiveForm> const m_pInteractiveForm;
185*3ac0a46fSAndroid Build Coastguard Worker bool m_bAppModified = false;
186*3ac0a46fSAndroid Build Coastguard Worker uint32_t m_nAppearanceAge = 0;
187*3ac0a46fSAndroid Build Coastguard Worker uint32_t m_nValueAge = 0;
188*3ac0a46fSAndroid Build Coastguard Worker };
189*3ac0a46fSAndroid Build Coastguard Worker
ToCPDFSDKWidget(CPDFSDK_Annot * pAnnot)190*3ac0a46fSAndroid Build Coastguard Worker inline CPDFSDK_Widget* ToCPDFSDKWidget(CPDFSDK_Annot* pAnnot) {
191*3ac0a46fSAndroid Build Coastguard Worker return pAnnot && pAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET
192*3ac0a46fSAndroid Build Coastguard Worker ? static_cast<CPDFSDK_Widget*>(pAnnot)
193*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
194*3ac0a46fSAndroid Build Coastguard Worker }
195*3ac0a46fSAndroid Build Coastguard Worker
196*3ac0a46fSAndroid Build Coastguard Worker #endif // FPDFSDK_CPDFSDK_WIDGET_H_
197