blob: 4c5d10dccf71418f81bd768f01fd747ac97446c8 [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>
11#include <vector>
12
dsinclair1727aee2016-09-29 13:12:56 -070013#include "core/fpdfdoc/cpdf_action.h"
14#include "core/fpdfdoc/ipdf_formnotify.h"
dsinclaira52ab742016-09-29 13:59:29 -070015#include "core/fxcrt/fx_basic.h"
dsinclair74a34fc2016-09-29 16:41:42 -070016#include "core/fxge/fx_dib.h"
jaepark611adb82016-08-17 11:34:36 -070017
18class CPDF_Dictionary;
19class CPDF_FormControl;
20class CPDF_FormField;
21class CPDF_InterForm;
22class CPDF_Object;
dsinclair690c0332016-10-11 09:13:01 -070023class CPDFSDK_FormFillEnvironment;
jaepark611adb82016-08-17 11:34:36 -070024class CPDFSDK_Widget;
25
26#ifdef PDF_ENABLE_XFA
27class CPDFSDK_XFAWidget;
28class CXFA_FFWidget;
29#endif // PDF_ENABLE_XFA
30
31class CPDFSDK_InterForm : public IPDF_FormNotify {
32 public:
dsinclair690c0332016-10-11 09:13:01 -070033 explicit CPDFSDK_InterForm(CPDFSDK_FormFillEnvironment* pFormFillEnv);
jaepark611adb82016-08-17 11:34:36 -070034 ~CPDFSDK_InterForm() override;
35
36 CPDF_InterForm* GetInterForm() const { return m_pInterForm.get(); }
dsinclair690c0332016-10-11 09:13:01 -070037 CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; }
jaepark611adb82016-08-17 11:34:36 -070038
tsepez4cf55152016-11-02 14:37:54 -070039 bool HighlightWidgets();
jaepark611adb82016-08-17 11:34:36 -070040
tsepez4cf55152016-11-02 14:37:54 -070041 CPDFSDK_Widget* GetSibling(CPDFSDK_Widget* pWidget, bool bNext) const;
dsinclairc5267c52016-11-04 15:35:12 -070042 CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const;
jaepark611adb82016-08-17 11:34:36 -070043 void GetWidgets(const CFX_WideString& sFieldName,
44 std::vector<CPDFSDK_Widget*>* widgets) const;
45 void GetWidgets(CPDF_FormField* pField,
46 std::vector<CPDFSDK_Widget*>* widgets) const;
47
48 void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget);
49 void RemoveMap(CPDF_FormControl* pControl);
50
tsepez4cf55152016-11-02 14:37:54 -070051 void EnableCalculate(bool bEnabled);
52 bool IsCalculateEnabled() const;
jaepark611adb82016-08-17 11:34:36 -070053
54#ifdef PDF_ENABLE_XFA
55 void AddXFAMap(CXFA_FFWidget* hWidget, CPDFSDK_XFAWidget* pWidget);
56 void RemoveXFAMap(CXFA_FFWidget* hWidget);
57 CPDFSDK_XFAWidget* GetXFAWidget(CXFA_FFWidget* hWidget);
tsepez4cf55152016-11-02 14:37:54 -070058 void XfaEnableCalculate(bool bEnabled);
59 bool IsXfaCalculateEnabled() const;
60 bool IsXfaValidationsEnabled();
61 void XfaSetValidationsEnabled(bool bEnabled);
62 void SynchronizeField(CPDF_FormField* pFormField, bool bSynchronizeElse);
jaepark611adb82016-08-17 11:34:36 -070063#endif // PDF_ENABLE_XFA
64
tsepez4cf55152016-11-02 14:37:54 -070065 bool OnKeyStrokeCommit(CPDF_FormField* pFormField,
66 const CFX_WideString& csValue);
67 bool OnValidate(CPDF_FormField* pFormField, const CFX_WideString& csValue);
jaepark611adb82016-08-17 11:34:36 -070068 void OnCalculate(CPDF_FormField* pFormField = nullptr);
tsepez4cf55152016-11-02 14:37:54 -070069 CFX_WideString OnFormat(CPDF_FormField* pFormField, bool& bFormatted);
jaepark611adb82016-08-17 11:34:36 -070070
71 void ResetFieldAppearance(CPDF_FormField* pFormField,
tsepeza31da742016-09-08 11:28:14 -070072 const CFX_WideString* sValue,
tsepez4cf55152016-11-02 14:37:54 -070073 bool bValueChanged);
jaepark611adb82016-08-17 11:34:36 -070074 void UpdateField(CPDF_FormField* pFormField);
75
tsepez4cf55152016-11-02 14:37:54 -070076 bool DoAction_Hide(const CPDF_Action& action);
77 bool DoAction_SubmitForm(const CPDF_Action& action);
78 bool DoAction_ResetForm(const CPDF_Action& action);
79 bool DoAction_ImportData(const CPDF_Action& action);
jaepark611adb82016-08-17 11:34:36 -070080
81 std::vector<CPDF_FormField*> GetFieldFromObjects(
82 const std::vector<CPDF_Object*>& objects) const;
tsepez4cf55152016-11-02 14:37:54 -070083 bool IsValidField(CPDF_Dictionary* pFieldDict);
84 bool SubmitFields(const CFX_WideString& csDestination,
85 const std::vector<CPDF_FormField*>& fields,
86 bool bIncludeOrExclude,
87 bool bUrlEncoded);
88 bool SubmitForm(const CFX_WideString& sDestination, bool bUrlEncoded);
89 bool ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf);
90 bool ExportFieldsToFDFTextBuf(const std::vector<CPDF_FormField*>& fields,
91 bool bIncludeOrExclude,
92 CFX_ByteTextBuf& textBuf);
jaepark611adb82016-08-17 11:34:36 -070093 CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt);
94
tsepez4cf55152016-11-02 14:37:54 -070095 bool IsNeedHighLight(int nFieldType);
jaepark611adb82016-08-17 11:34:36 -070096 void RemoveAllHighLight();
97 void SetHighlightAlpha(uint8_t alpha) { m_iHighlightAlpha = alpha; }
98 uint8_t GetHighlightAlpha() { return m_iHighlightAlpha; }
99 void SetHighlightColor(FX_COLORREF clr, int nFieldType);
100 FX_COLORREF GetHighlightColor(int nFieldType);
101
102 private:
103 // IPDF_FormNotify:
104 int BeforeValueChange(CPDF_FormField* pField,
105 const CFX_WideString& csValue) override;
106 void AfterValueChange(CPDF_FormField* pField) override;
107 int BeforeSelectionChange(CPDF_FormField* pField,
108 const CFX_WideString& csValue) override;
109 void AfterSelectionChange(CPDF_FormField* pField) override;
110 void AfterCheckedStatusChange(CPDF_FormField* pField) override;
111 int BeforeFormReset(CPDF_InterForm* pForm) override;
112 void AfterFormReset(CPDF_InterForm* pForm) override;
113 int BeforeFormImportData(CPDF_InterForm* pForm) override;
114 void AfterFormImportData(CPDF_InterForm* pForm) override;
115
tsepez4cf55152016-11-02 14:37:54 -0700116 bool FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile);
117 bool FDFToURLEncodedData(uint8_t*& pBuf, FX_STRSIZE& nBufSize);
jaepark611adb82016-08-17 11:34:36 -0700118 int GetPageIndexByAnnotDict(CPDF_Document* pDocument,
119 CPDF_Dictionary* pAnnotDict) const;
120
121 using CPDFSDK_WidgetMap = std::map<CPDF_FormControl*, CPDFSDK_Widget*>;
122
dsinclair690c0332016-10-11 09:13:01 -0700123 CPDFSDK_FormFillEnvironment* m_pFormFillEnv; // Not owned.
jaepark611adb82016-08-17 11:34:36 -0700124 std::unique_ptr<CPDF_InterForm> m_pInterForm;
125 CPDFSDK_WidgetMap m_Map;
126#ifdef PDF_ENABLE_XFA
127 std::map<CXFA_FFWidget*, CPDFSDK_XFAWidget*> m_XFAMap;
tsepez4cf55152016-11-02 14:37:54 -0700128 bool m_bXfaCalculate;
129 bool m_bXfaValidationsEnabled;
jaepark611adb82016-08-17 11:34:36 -0700130 static const int kNumFieldTypes = 7;
131#else // PDF_ENABLE_XFA
132 static const int kNumFieldTypes = 6;
133#endif // PDF_ENABLE_XFA
tsepez4cf55152016-11-02 14:37:54 -0700134 bool m_bCalculate;
135 bool m_bBusy;
jaepark611adb82016-08-17 11:34:36 -0700136
137 FX_COLORREF m_aHighlightColor[kNumFieldTypes];
138 uint8_t m_iHighlightAlpha;
tsepez4cf55152016-11-02 14:37:54 -0700139 bool m_bNeedHightlight[kNumFieldTypes];
jaepark611adb82016-08-17 11:34:36 -0700140};
141
dsinclair114e46a2016-09-29 17:18:21 -0700142#endif // FPDFSDK_CPDFSDK_INTERFORM_H_