xref: /aosp_15_r20/external/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_
8 #define FPDFSDK_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_
9 
10 #include <map>
11 #include <memory>
12 #include <utility>
13 
14 #include "core/fxcrt/cfx_timer.h"
15 #include "core/fxcrt/mask.h"
16 #include "core/fxcrt/observed_ptr.h"
17 #include "core/fxcrt/unowned_ptr.h"
18 #include "fpdfsdk/cpdfsdk_annot.h"
19 #include "fpdfsdk/pwl/ipwl_fillernotify.h"
20 #include "public/fpdf_fwlevent.h"
21 
22 class CFFL_FormField;
23 class CPDFSDK_PageView;
24 class CPDFSDK_Widget;
25 
26 class CFFL_InteractiveFormFiller final : public IPWL_FillerNotify {
27  public:
28   class CallbackIface {
29    public:
30     virtual ~CallbackIface() = default;
31 
32     virtual void OnSetFieldInputFocus(const WideString& text) = 0;
33     virtual void OnCalculate(ObservedPtr<CPDFSDK_Annot>& pAnnot) = 0;
34     virtual void OnFormat(ObservedPtr<CPDFSDK_Annot>& pAnnot) = 0;
35     virtual void Invalidate(IPDF_Page* pPage, const FX_RECT& rect) = 0;
36     virtual CPDFSDK_PageView* GetOrCreatePageView(IPDF_Page* pPage) = 0;
37     virtual CPDFSDK_PageView* GetPageView(IPDF_Page* pPage) = 0;
38     virtual CFX_Timer::HandlerIface* GetTimerHandler() = 0;
39     virtual CPDFSDK_Annot* GetFocusAnnot() const = 0;
40     virtual bool SetFocusAnnot(ObservedPtr<CPDFSDK_Annot>& pAnnot) = 0;
41     virtual void InvalidateRect(CPDFSDK_Widget* pWidget,
42                                 const CFX_FloatRect& rect) = 0;
43     virtual void OutputSelectedRect(CFFL_FormField* pFormField,
44                                     const CFX_FloatRect& rect) = 0;
45     virtual bool IsSelectionImplemented() const = 0;
46     virtual void SetCursor(CursorStyle nCursorStyle) = 0;
47 
48     // See PDF Reference 1.7, table 3.20 for the permission bits. Returns true
49     // if any bit in |flags| is set.
50     virtual bool HasPermissions(uint32_t flags) const = 0;
51     virtual void OnChange() = 0;
52   };
53 
54   explicit CFFL_InteractiveFormFiller(CallbackIface* pCallbackIface);
55   ~CFFL_InteractiveFormFiller() override;
56 
57   bool Annot_HitTest(const CPDFSDK_Widget* pWidget, const CFX_PointF& point);
58   FX_RECT GetViewBBox(const CPDFSDK_PageView* pPageView,
59                       CPDFSDK_Widget* pWidget);
60 
61   void OnDraw(CPDFSDK_PageView* pPageView,
62               CPDFSDK_Widget* pWidget,
63               CFX_RenderDevice* pDevice,
64               const CFX_Matrix& mtUser2Device);
65   void OnDelete(CPDFSDK_Widget* pWidget);
66 
67   void OnMouseEnter(CPDFSDK_PageView* pPageView,
68                     ObservedPtr<CPDFSDK_Widget>& pWidget,
69                     Mask<FWL_EVENTFLAG> nFlag);
70   void OnMouseExit(CPDFSDK_PageView* pPageView,
71                    ObservedPtr<CPDFSDK_Widget>& pWidget,
72                    Mask<FWL_EVENTFLAG> nFlag);
73   bool OnLButtonDown(CPDFSDK_PageView* pPageView,
74                      ObservedPtr<CPDFSDK_Widget>& pWidget,
75                      Mask<FWL_EVENTFLAG> nFlags,
76                      const CFX_PointF& point);
77   bool OnLButtonUp(CPDFSDK_PageView* pPageView,
78                    ObservedPtr<CPDFSDK_Widget>& pWidget,
79                    Mask<FWL_EVENTFLAG> nFlags,
80                    const CFX_PointF& point);
81   bool OnLButtonDblClk(CPDFSDK_PageView* pPageView,
82                        ObservedPtr<CPDFSDK_Widget>& pWidget,
83                        Mask<FWL_EVENTFLAG> nFlags,
84                        const CFX_PointF& point);
85   bool OnMouseMove(CPDFSDK_PageView* pPageView,
86                    ObservedPtr<CPDFSDK_Widget>& pWidget,
87                    Mask<FWL_EVENTFLAG> nFlags,
88                    const CFX_PointF& point);
89   bool OnMouseWheel(CPDFSDK_PageView* pPageView,
90                     ObservedPtr<CPDFSDK_Widget>& pWidget,
91                     Mask<FWL_EVENTFLAG> nFlags,
92                     const CFX_PointF& point,
93                     const CFX_Vector& delta);
94   bool OnRButtonDown(CPDFSDK_PageView* pPageView,
95                      ObservedPtr<CPDFSDK_Widget>& pWidget,
96                      Mask<FWL_EVENTFLAG> nFlags,
97                      const CFX_PointF& point);
98   bool OnRButtonUp(CPDFSDK_PageView* pPageView,
99                    ObservedPtr<CPDFSDK_Widget>& pWidget,
100                    Mask<FWL_EVENTFLAG> nFlags,
101                    const CFX_PointF& point);
102 
103   bool OnKeyDown(CPDFSDK_Widget* pWidget,
104                  FWL_VKEYCODE nKeyCode,
105                  Mask<FWL_EVENTFLAG> nFlags);
106   bool OnChar(CPDFSDK_Widget* pWidget,
107               uint32_t nChar,
108               Mask<FWL_EVENTFLAG> nFlags);
109 
110   bool OnSetFocus(ObservedPtr<CPDFSDK_Widget>& pWidget,
111                   Mask<FWL_EVENTFLAG> nFlag);
112   bool OnKillFocus(ObservedPtr<CPDFSDK_Widget>& pWidget,
113                    Mask<FWL_EVENTFLAG> nFlag);
114 
115   // Wrapper methods for CallbackIface
116   void OnSetFieldInputFocus(const WideString& text);
117   void Invalidate(IPDF_Page* pPage, const FX_RECT& rect);
118   CPDFSDK_PageView* GetOrCreatePageView(IPDF_Page* pPage);
119   CPDFSDK_PageView* GetPageView(IPDF_Page* pPage);
120   CFX_Timer::HandlerIface* GetTimerHandler();
121   void OnChange();
122 
GetFormFieldForTesting(CPDFSDK_Widget * pAnnot)123   CFFL_FormField* GetFormFieldForTesting(CPDFSDK_Widget* pAnnot) {
124     return GetFormField(pAnnot);
125   }
126 
127   WideString GetText(CPDFSDK_Widget* pWidget);
128   WideString GetSelectedText(CPDFSDK_Widget* pWidget);
129   void ReplaceAndKeepSelection(CPDFSDK_Widget* pWidget, const WideString& text);
130   void ReplaceSelection(CPDFSDK_Widget* pWidget, const WideString& text);
131   bool SelectAllText(CPDFSDK_Widget* pWidget);
132 
133   bool CanUndo(CPDFSDK_Widget* pWidget);
134   bool CanRedo(CPDFSDK_Widget* pWidget);
135   bool Undo(CPDFSDK_Widget* pWidget);
136   bool Redo(CPDFSDK_Widget* pWidget);
137 
138   static bool IsVisible(CPDFSDK_Widget* pWidget);
139   static bool IsReadOnly(CPDFSDK_Widget* pWidget);
140   static bool IsValidAnnot(const CPDFSDK_PageView* pPageView,
141                            CPDFSDK_Widget* pWidget);
142 
143   bool OnKeyStrokeCommit(ObservedPtr<CPDFSDK_Widget>& pWidget,
144                          const CPDFSDK_PageView* pPageView,
145                          Mask<FWL_EVENTFLAG> nFlag);
146   bool OnValidate(ObservedPtr<CPDFSDK_Widget>& pWidget,
147                   const CPDFSDK_PageView* pPageView,
148                   Mask<FWL_EVENTFLAG> nFlag);
149   void OnCalculate(ObservedPtr<CPDFSDK_Widget>& pWidget);
150   void OnFormat(ObservedPtr<CPDFSDK_Widget>& pWidget);
151   bool OnButtonUp(ObservedPtr<CPDFSDK_Widget>& pWidget,
152                   const CPDFSDK_PageView* pPageView,
153                   Mask<FWL_EVENTFLAG> nFlag);
154 
155   bool SetIndexSelected(ObservedPtr<CPDFSDK_Widget>& pWidget,
156                         int index,
157                         bool selected);
158   bool IsIndexSelected(ObservedPtr<CPDFSDK_Widget>& pWidget, int index);
159 
160  private:
161   using WidgetToFormFillerMap =
162       std::map<CPDFSDK_Widget*, std::unique_ptr<CFFL_FormField>>;
163 
164   // IPWL_FillerNotify:
165   void InvalidateRect(PerWindowData* pWidgetData,
166                       const CFX_FloatRect& rect) override;
167   void OutputSelectedRect(PerWindowData* pWidgetData,
168                           const CFX_FloatRect& rect) override;
169   bool IsSelectionImplemented() const override;
170   void SetCursor(CursorStyle nCursorStyle) override;
171   void QueryWherePopup(const PerWindowData* pAttached,
172                        float fPopupMin,
173                        float fPopupMax,
174                        bool* bBottom,
175                        float* fPopupRet) override;
176   // Returns {bRC, bExit}.
177   std::pair<bool, bool> OnBeforeKeyStroke(const PerWindowData* pAttached,
178                                           WideString& strChange,
179                                           const WideString& strChangeEx,
180                                           int nSelStart,
181                                           int nSelEnd,
182                                           bool bKeyDown,
183                                           Mask<FWL_EVENTFLAG> nFlag) override;
184   bool OnPopupPreOpen(const PerWindowData* pAttached,
185                       Mask<FWL_EVENTFLAG> nFlag) override;
186   bool OnPopupPostOpen(const PerWindowData* pAttached,
187                        Mask<FWL_EVENTFLAG> nFlag) override;
188 
189 #ifdef PDF_ENABLE_XFA
190   void SetFocusAnnotTab(CPDFSDK_Widget* pWidget, bool bSameField, bool bNext);
191   bool OnClick(ObservedPtr<CPDFSDK_Widget>& pWidget,
192                const CPDFSDK_PageView* pPageView,
193                Mask<FWL_EVENTFLAG> nFlag);
194   bool OnFull(ObservedPtr<CPDFSDK_Widget>& pAnnot,
195               const CPDFSDK_PageView* pPageView,
196               Mask<FWL_EVENTFLAG> nFlag);
197   bool OnPreOpen(ObservedPtr<CPDFSDK_Widget>& pWidget,
198                  const CPDFSDK_PageView* pPageView,
199                  Mask<FWL_EVENTFLAG> nFlag);
200   bool OnPostOpen(ObservedPtr<CPDFSDK_Widget>& pWidget,
201                   const CPDFSDK_PageView* pPageView,
202                   Mask<FWL_EVENTFLAG> nFlag);
203 #endif  // PDF_ENABLE_XFA
204 
205   bool IsFillingAllowed(CPDFSDK_Widget* pWidget) const;
206   CFFL_FormField* GetFormField(CPDFSDK_Widget* pWidget);
207   CFFL_FormField* GetOrCreateFormField(CPDFSDK_Widget* pWidget);
208   void UnregisterFormField(CPDFSDK_Widget* pWidget);
209 
210   UnownedPtr<CallbackIface> const m_pCallbackIface;
211   WidgetToFormFillerMap m_Map;
212   bool m_bNotifying = false;
213 };
214 
215 #endif  // FPDFSDK_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_
216