blob: ae39913c4ce2f113001514f8513c95e6d346efe8 [file] [log] [blame]
jaepark611adb82016-08-17 11:34:36 -07001// 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
dsinclair114e46a2016-09-29 17:18:21 -07007#ifndef FPDFSDK_CPDFSDK_INTERFORM_H_
8#define FPDFSDK_CPDFSDK_INTERFORM_H_
jaepark611adb82016-08-17 11:34:36 -07009
10#include <map>
Dan Sinclair85c8e7f2016-11-21 13:50:32 -050011#include <memory>
jaepark611adb82016-08-17 11:34:36 -070012#include <vector>
13
dsinclair1727aee2016-09-29 13:12:56 -070014#include "core/fpdfdoc/cpdf_action.h"
15#include "core/fpdfdoc/ipdf_formnotify.h"
Dan Sinclairaee0db02017-09-21 16:53:58 -040016#include "core/fxcrt/unowned_ptr.h"
dsinclair74a34fc2016-09-29 16:41:42 -070017#include "core/fxge/fx_dib.h"
tsepez8fa82792017-01-11 09:32:33 -080018#include "fpdfsdk/cpdfsdk_widget.h"
jaepark611adb82016-08-17 11:34:36 -070019
20class CPDF_Dictionary;
21class CPDF_FormControl;
22class CPDF_FormField;
23class CPDF_InterForm;
24class CPDF_Object;
dsinclair690c0332016-10-11 09:13:01 -070025class CPDFSDK_FormFillEnvironment;
jaepark611adb82016-08-17 11:34:36 -070026
27#ifdef PDF_ENABLE_XFA
28class CPDFSDK_XFAWidget;
29class CXFA_FFWidget;
30#endif // PDF_ENABLE_XFA
31
32class CPDFSDK_InterForm : public IPDF_FormNotify {
33 public:
dsinclair690c0332016-10-11 09:13:01 -070034 explicit CPDFSDK_InterForm(CPDFSDK_FormFillEnvironment* pFormFillEnv);
jaepark611adb82016-08-17 11:34:36 -070035 ~CPDFSDK_InterForm() override;
36
37 CPDF_InterForm* GetInterForm() const { return m_pInterForm.get(); }
Tom Sepezcc205132017-05-16 14:01:47 -070038 CPDFSDK_FormFillEnvironment* GetFormFillEnv() const {
39 return m_pFormFillEnv.Get();
40 }
jaepark611adb82016-08-17 11:34:36 -070041
tsepez4cf55152016-11-02 14:37:54 -070042 bool HighlightWidgets();
jaepark611adb82016-08-17 11:34:36 -070043
tsepez4cf55152016-11-02 14:37:54 -070044 CPDFSDK_Widget* GetSibling(CPDFSDK_Widget* pWidget, bool bNext) const;
dsinclairc5267c52016-11-04 15:35:12 -070045 CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const;
Ryan Harrison275e2602017-09-18 14:23:18 -040046 void GetWidgets(const WideString& sFieldName,
tsepez8fa82792017-01-11 09:32:33 -080047 std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const;
jaepark611adb82016-08-17 11:34:36 -070048 void GetWidgets(CPDF_FormField* pField,
tsepez8fa82792017-01-11 09:32:33 -080049 std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const;
jaepark611adb82016-08-17 11:34:36 -070050
51 void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget);
52 void RemoveMap(CPDF_FormControl* pControl);
53
tsepez4cf55152016-11-02 14:37:54 -070054 void EnableCalculate(bool bEnabled);
55 bool IsCalculateEnabled() const;
jaepark611adb82016-08-17 11:34:36 -070056
57#ifdef PDF_ENABLE_XFA
58 void AddXFAMap(CXFA_FFWidget* hWidget, CPDFSDK_XFAWidget* pWidget);
59 void RemoveXFAMap(CXFA_FFWidget* hWidget);
60 CPDFSDK_XFAWidget* GetXFAWidget(CXFA_FFWidget* hWidget);
tsepez4cf55152016-11-02 14:37:54 -070061 void XfaEnableCalculate(bool bEnabled);
62 bool IsXfaCalculateEnabled() const;
63 bool IsXfaValidationsEnabled();
64 void XfaSetValidationsEnabled(bool bEnabled);
65 void SynchronizeField(CPDF_FormField* pFormField, bool bSynchronizeElse);
jaepark611adb82016-08-17 11:34:36 -070066#endif // PDF_ENABLE_XFA
67
Ryan Harrison275e2602017-09-18 14:23:18 -040068 bool OnKeyStrokeCommit(CPDF_FormField* pFormField, const WideString& csValue);
69 bool OnValidate(CPDF_FormField* pFormField, const WideString& csValue);
jaepark611adb82016-08-17 11:34:36 -070070 void OnCalculate(CPDF_FormField* pFormField = nullptr);
Ryan Harrison275e2602017-09-18 14:23:18 -040071 WideString OnFormat(CPDF_FormField* pFormField, bool& bFormatted);
jaepark611adb82016-08-17 11:34:36 -070072
73 void ResetFieldAppearance(CPDF_FormField* pFormField,
Ryan Harrison275e2602017-09-18 14:23:18 -040074 const WideString* sValue,
tsepez4cf55152016-11-02 14:37:54 -070075 bool bValueChanged);
jaepark611adb82016-08-17 11:34:36 -070076 void UpdateField(CPDF_FormField* pFormField);
77
tsepez4cf55152016-11-02 14:37:54 -070078 bool DoAction_Hide(const CPDF_Action& action);
79 bool DoAction_SubmitForm(const CPDF_Action& action);
80 bool DoAction_ResetForm(const CPDF_Action& action);
81 bool DoAction_ImportData(const CPDF_Action& action);
jaepark611adb82016-08-17 11:34:36 -070082
83 std::vector<CPDF_FormField*> GetFieldFromObjects(
84 const std::vector<CPDF_Object*>& objects) const;
tsepez4cf55152016-11-02 14:37:54 -070085 bool IsValidField(CPDF_Dictionary* pFieldDict);
Ryan Harrison275e2602017-09-18 14:23:18 -040086 bool SubmitFields(const WideString& csDestination,
tsepez4cf55152016-11-02 14:37:54 -070087 const std::vector<CPDF_FormField*>& fields,
88 bool bIncludeOrExclude,
89 bool bUrlEncoded);
Ryan Harrison275e2602017-09-18 14:23:18 -040090 bool SubmitForm(const WideString& sDestination, bool bUrlEncoded);
91 ByteString ExportFormToFDFTextBuf();
92 ByteString ExportFieldsToFDFTextBuf(
Henrique Nakashima5c09f4c2017-08-04 12:28:52 -040093 const std::vector<CPDF_FormField*>& fields,
94 bool bIncludeOrExclude);
Ryan Harrison275e2602017-09-18 14:23:18 -040095 WideString GetTemporaryFileName(const WideString& sFileExt);
jaepark611adb82016-08-17 11:34:36 -070096
tsepez4cf55152016-11-02 14:37:54 -070097 bool IsNeedHighLight(int nFieldType);
jaepark611adb82016-08-17 11:34:36 -070098 void RemoveAllHighLight();
99 void SetHighlightAlpha(uint8_t alpha) { m_iHighlightAlpha = alpha; }
100 uint8_t GetHighlightAlpha() { return m_iHighlightAlpha; }
101 void SetHighlightColor(FX_COLORREF clr, int nFieldType);
102 FX_COLORREF GetHighlightColor(int nFieldType);
103
104 private:
105 // IPDF_FormNotify:
106 int BeforeValueChange(CPDF_FormField* pField,
Ryan Harrison275e2602017-09-18 14:23:18 -0400107 const WideString& csValue) override;
jaepark611adb82016-08-17 11:34:36 -0700108 void AfterValueChange(CPDF_FormField* pField) override;
109 int BeforeSelectionChange(CPDF_FormField* pField,
Ryan Harrison275e2602017-09-18 14:23:18 -0400110 const WideString& csValue) override;
jaepark611adb82016-08-17 11:34:36 -0700111 void AfterSelectionChange(CPDF_FormField* pField) override;
112 void AfterCheckedStatusChange(CPDF_FormField* pField) override;
113 int BeforeFormReset(CPDF_InterForm* pForm) override;
114 void AfterFormReset(CPDF_InterForm* pForm) override;
115 int BeforeFormImportData(CPDF_InterForm* pForm) override;
116 void AfterFormImportData(CPDF_InterForm* pForm) override;
117
Ryan Harrison875e98c2017-09-27 10:53:11 -0400118 bool FDFToURLEncodedData(uint8_t*& pBuf, size_t& nBufSize);
jaepark611adb82016-08-17 11:34:36 -0700119 int GetPageIndexByAnnotDict(CPDF_Document* pDocument,
120 CPDF_Dictionary* pAnnotDict) const;
121
122 using CPDFSDK_WidgetMap = std::map<CPDF_FormControl*, CPDFSDK_Widget*>;
123
Dan Sinclairaee0db02017-09-21 16:53:58 -0400124 UnownedPtr<CPDFSDK_FormFillEnvironment> m_pFormFillEnv;
jaepark611adb82016-08-17 11:34:36 -0700125 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;
tsepez4cf55152016-11-02 14:37:54 -0700129 bool m_bXfaCalculate;
130 bool m_bXfaValidationsEnabled;
jaepark611adb82016-08-17 11:34:36 -0700131 static const int kNumFieldTypes = 7;
132#else // PDF_ENABLE_XFA
133 static const int kNumFieldTypes = 6;
134#endif // PDF_ENABLE_XFA
tsepez4cf55152016-11-02 14:37:54 -0700135 bool m_bCalculate;
136 bool m_bBusy;
jaepark611adb82016-08-17 11:34:36 -0700137
138 FX_COLORREF m_aHighlightColor[kNumFieldTypes];
139 uint8_t m_iHighlightAlpha;
tsepez4cf55152016-11-02 14:37:54 -0700140 bool m_bNeedHightlight[kNumFieldTypes];
jaepark611adb82016-08-17 11:34:36 -0700141};
142
dsinclair114e46a2016-09-29 17:18:21 -0700143#endif // FPDFSDK_CPDFSDK_INTERFORM_H_