xref: /aosp_15_r20/external/pdfium/core/fpdfdoc/cpdf_interactiveform.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2016 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 CORE_FPDFDOC_CPDF_INTERACTIVEFORM_H_
8 #define CORE_FPDFDOC_CPDF_INTERACTIVEFORM_H_
9 
10 #include <stddef.h>
11 #include <stdint.h>
12 
13 #include <functional>
14 #include <map>
15 #include <memory>
16 #include <vector>
17 
18 #include "core/fpdfapi/parser/cpdf_dictionary.h"
19 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
20 #include "core/fpdfdoc/cpdf_defaultappearance.h"
21 #include "core/fpdfdoc/cpdf_formfield.h"
22 #include "core/fxcrt/fx_coordinates.h"
23 #include "core/fxcrt/fx_string.h"
24 #include "core/fxcrt/retain_ptr.h"
25 #include "core/fxcrt/unowned_ptr.h"
26 #include "third_party/base/containers/span.h"
27 
28 class CFieldTree;
29 class CFDF_Document;
30 class CPDF_Document;
31 class CPDF_Font;
32 class CPDF_FormControl;
33 class CPDF_Page;
34 
35 class CPDF_InteractiveForm {
36  public:
37   class NotifierIface {
38    public:
39     virtual ~NotifierIface() = default;
40 
41     virtual bool BeforeValueChange(CPDF_FormField* pField,
42                                    const WideString& csValue) = 0;
43     virtual void AfterValueChange(CPDF_FormField* pField) = 0;
44     virtual bool BeforeSelectionChange(CPDF_FormField* pField,
45                                        const WideString& csValue) = 0;
46     virtual void AfterSelectionChange(CPDF_FormField* pField) = 0;
47     virtual void AfterCheckedStatusChange(CPDF_FormField* pField) = 0;
48     virtual void AfterFormReset(CPDF_InteractiveForm* pForm) = 0;
49   };
50 
51   explicit CPDF_InteractiveForm(CPDF_Document* pDocument);
52   ~CPDF_InteractiveForm();
53 
54   static bool IsUpdateAPEnabled();
55   static void SetUpdateAP(bool bUpdateAP);
56   static RetainPtr<CPDF_Font> AddNativeInteractiveFormFont(
57       CPDF_Document* pDocument,
58       ByteString* csNameTag);
59 
60   size_t CountFields(const WideString& csFieldName) const;
61   CPDF_FormField* GetField(size_t index, const WideString& csFieldName) const;
62   CPDF_FormField* GetFieldByDict(const CPDF_Dictionary* pFieldDict) const;
63 
64   const CPDF_FormControl* GetControlAtPoint(const CPDF_Page* pPage,
65                                             const CFX_PointF& point,
66                                             int* z_order) const;
67   CPDF_FormControl* GetControlByDict(const CPDF_Dictionary* pWidgetDict) const;
68 
69   bool NeedConstructAP() const;
70   int CountFieldsInCalculationOrder();
71   CPDF_FormField* GetFieldInCalculationOrder(int index);
72   int FindFieldInCalculationOrder(const CPDF_FormField* pField);
73 
74   RetainPtr<CPDF_Font> GetFormFont(ByteString csNameTag) const;
75   RetainPtr<CPDF_Font> GetFontForElement(
76       RetainPtr<CPDF_Dictionary> pElement) const;
77   CPDF_DefaultAppearance GetDefaultAppearance() const;
78   int GetFormAlignment() const;
79   bool CheckRequiredFields(const std::vector<CPDF_FormField*>* fields,
80                            bool bIncludeOrExclude) const;
81 
82   std::unique_ptr<CFDF_Document> ExportToFDF(const WideString& pdf_path) const;
83   std::unique_ptr<CFDF_Document> ExportToFDF(
84       const WideString& pdf_path,
85       const std::vector<CPDF_FormField*>& fields,
86       bool bIncludeOrExclude) const;
87 
88   void ResetForm();
89   void ResetForm(pdfium::span<CPDF_FormField*> fields, bool bIncludeOrExclude);
90 
91   void SetNotifierIface(NotifierIface* pNotify);
92   void FixPageFields(CPDF_Page* pPage);
93 
94   // Wrap callbacks thru NotifierIface.
95   bool NotifyBeforeValueChange(CPDF_FormField* pField,
96                                const WideString& csValue);
97   void NotifyAfterValueChange(CPDF_FormField* pField);
98   bool NotifyBeforeSelectionChange(CPDF_FormField* pField,
99                                    const WideString& csValue);
100   void NotifyAfterSelectionChange(CPDF_FormField* pField);
101   void NotifyAfterCheckedStatusChange(CPDF_FormField* pField);
102 
103   const std::vector<UnownedPtr<CPDF_FormControl>>& GetControlsForField(
104       const CPDF_FormField* pField);
105 
106  private:
107   void LoadField(RetainPtr<CPDF_Dictionary> pFieldDict, int nLevel);
108   void AddTerminalField(RetainPtr<CPDF_Dictionary> pFieldDict);
109   CPDF_FormControl* AddControl(CPDF_FormField* pField,
110                                RetainPtr<CPDF_Dictionary> pWidgetDict);
111 
112   static bool s_bUpdateAP;
113 
114   ByteString m_bsEncoding;
115   UnownedPtr<CPDF_Document> const m_pDocument;
116   RetainPtr<CPDF_Dictionary> m_pFormDict;
117   std::unique_ptr<CFieldTree> m_pFieldTree;
118   std::map<RetainPtr<const CPDF_Dictionary>,
119            std::unique_ptr<CPDF_FormControl>,
120            std::less<>>
121       m_ControlMap;
122   // Points into |m_ControlMap|.
123   std::map<UnownedPtr<const CPDF_FormField>,
124            std::vector<UnownedPtr<CPDF_FormControl>>,
125            std::less<>>
126       m_ControlLists;
127   UnownedPtr<NotifierIface> m_pFormNotify;
128 };
129 
130 #endif  // CORE_FPDFDOC_CPDF_INTERACTIVEFORM_H_
131