• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 PDFium Authors. All rights reserved.
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_CPDFSDK_INTERFORM_H_
8 #define FPDFSDK_CPDFSDK_INTERFORM_H_
9 
10 #include <map>
11 #include <memory>
12 #include <vector>
13 
14 #include "core/fpdfdoc/cpdf_action.h"
15 #include "core/fpdfdoc/ipdf_formnotify.h"
16 #include "core/fxcrt/fx_basic.h"
17 #include "core/fxge/fx_dib.h"
18 #include "fpdfsdk/cpdfsdk_widget.h"
19 
20 class CPDF_Dictionary;
21 class CPDF_FormControl;
22 class CPDF_FormField;
23 class CPDF_InterForm;
24 class CPDF_Object;
25 class CPDFSDK_FormFillEnvironment;
26 
27 #ifdef PDF_ENABLE_XFA
28 class CPDFSDK_XFAWidget;
29 class CXFA_FFWidget;
30 #endif  // PDF_ENABLE_XFA
31 
32 class CPDFSDK_InterForm : public IPDF_FormNotify {
33  public:
34   explicit CPDFSDK_InterForm(CPDFSDK_FormFillEnvironment* pFormFillEnv);
35   ~CPDFSDK_InterForm() override;
36 
GetInterForm()37   CPDF_InterForm* GetInterForm() const { return m_pInterForm.get(); }
GetFormFillEnv()38   CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; }
39 
40   bool HighlightWidgets();
41 
42   CPDFSDK_Widget* GetSibling(CPDFSDK_Widget* pWidget, bool bNext) const;
43   CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const;
44   void GetWidgets(const CFX_WideString& sFieldName,
45                   std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const;
46   void GetWidgets(CPDF_FormField* pField,
47                   std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const;
48 
49   void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget);
50   void RemoveMap(CPDF_FormControl* pControl);
51 
52   void EnableCalculate(bool bEnabled);
53   bool IsCalculateEnabled() const;
54 
55 #ifdef PDF_ENABLE_XFA
56   void AddXFAMap(CXFA_FFWidget* hWidget, CPDFSDK_XFAWidget* pWidget);
57   void RemoveXFAMap(CXFA_FFWidget* hWidget);
58   CPDFSDK_XFAWidget* GetXFAWidget(CXFA_FFWidget* hWidget);
59   void XfaEnableCalculate(bool bEnabled);
60   bool IsXfaCalculateEnabled() const;
61   bool IsXfaValidationsEnabled();
62   void XfaSetValidationsEnabled(bool bEnabled);
63   void SynchronizeField(CPDF_FormField* pFormField, bool bSynchronizeElse);
64 #endif  // PDF_ENABLE_XFA
65 
66   bool OnKeyStrokeCommit(CPDF_FormField* pFormField,
67                          const CFX_WideString& csValue);
68   bool OnValidate(CPDF_FormField* pFormField, const CFX_WideString& csValue);
69   void OnCalculate(CPDF_FormField* pFormField = nullptr);
70   CFX_WideString OnFormat(CPDF_FormField* pFormField, bool& bFormatted);
71 
72   void ResetFieldAppearance(CPDF_FormField* pFormField,
73                             const CFX_WideString* sValue,
74                             bool bValueChanged);
75   void UpdateField(CPDF_FormField* pFormField);
76 
77   bool DoAction_Hide(const CPDF_Action& action);
78   bool DoAction_SubmitForm(const CPDF_Action& action);
79   bool DoAction_ResetForm(const CPDF_Action& action);
80   bool DoAction_ImportData(const CPDF_Action& action);
81 
82   std::vector<CPDF_FormField*> GetFieldFromObjects(
83       const std::vector<CPDF_Object*>& objects) const;
84   bool IsValidField(CPDF_Dictionary* pFieldDict);
85   bool SubmitFields(const CFX_WideString& csDestination,
86                     const std::vector<CPDF_FormField*>& fields,
87                     bool bIncludeOrExclude,
88                     bool bUrlEncoded);
89   bool SubmitForm(const CFX_WideString& sDestination, bool bUrlEncoded);
90   bool ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf);
91   bool ExportFieldsToFDFTextBuf(const std::vector<CPDF_FormField*>& fields,
92                                 bool bIncludeOrExclude,
93                                 CFX_ByteTextBuf& textBuf);
94   CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt);
95 
96   bool IsNeedHighLight(int nFieldType);
97   void RemoveAllHighLight();
SetHighlightAlpha(uint8_t alpha)98   void SetHighlightAlpha(uint8_t alpha) { m_iHighlightAlpha = alpha; }
GetHighlightAlpha()99   uint8_t GetHighlightAlpha() { return m_iHighlightAlpha; }
100   void SetHighlightColor(FX_COLORREF clr, int nFieldType);
101   FX_COLORREF GetHighlightColor(int nFieldType);
102 
103  private:
104   // IPDF_FormNotify:
105   int BeforeValueChange(CPDF_FormField* pField,
106                         const CFX_WideString& csValue) override;
107   void AfterValueChange(CPDF_FormField* pField) override;
108   int BeforeSelectionChange(CPDF_FormField* pField,
109                             const CFX_WideString& csValue) override;
110   void AfterSelectionChange(CPDF_FormField* pField) override;
111   void AfterCheckedStatusChange(CPDF_FormField* pField) override;
112   int BeforeFormReset(CPDF_InterForm* pForm) override;
113   void AfterFormReset(CPDF_InterForm* pForm) override;
114   int BeforeFormImportData(CPDF_InterForm* pForm) override;
115   void AfterFormImportData(CPDF_InterForm* pForm) override;
116 
117   bool FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile);
118   bool FDFToURLEncodedData(uint8_t*& pBuf, FX_STRSIZE& nBufSize);
119   int GetPageIndexByAnnotDict(CPDF_Document* pDocument,
120                               CPDF_Dictionary* pAnnotDict) const;
121 
122   using CPDFSDK_WidgetMap = std::map<CPDF_FormControl*, CPDFSDK_Widget*>;
123 
124   CPDFSDK_FormFillEnvironment* m_pFormFillEnv;  // Not owned.
125   std::unique_ptr<CPDF_InterForm> m_pInterForm;
126   CPDFSDK_WidgetMap m_Map;
127 #ifdef PDF_ENABLE_XFA
128   std::map<CXFA_FFWidget*, CPDFSDK_XFAWidget*> m_XFAMap;
129   bool m_bXfaCalculate;
130   bool m_bXfaValidationsEnabled;
131   static const int kNumFieldTypes = 7;
132 #else   // PDF_ENABLE_XFA
133   static const int kNumFieldTypes = 6;
134 #endif  // PDF_ENABLE_XFA
135   bool m_bCalculate;
136   bool m_bBusy;
137 
138   FX_COLORREF m_aHighlightColor[kNumFieldTypes];
139   uint8_t m_iHighlightAlpha;
140   bool m_bNeedHightlight[kNumFieldTypes];
141 };
142 
143 #endif  // FPDFSDK_CPDFSDK_INTERFORM_H_
144