blob: fef4ae2bc46728b5b5e78ded9acd2f0c2b548288 [file] [log] [blame]
dsinclaircac704d2016-07-28 12:59:09 -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
dsinclair1727aee2016-09-29 13:12:56 -07007#ifndef CORE_FPDFDOC_CPDF_INTERFORM_H_
8#define CORE_FPDFDOC_CPDF_INTERFORM_H_
dsinclaircac704d2016-07-28 12:59:09 -07009
10#include <map>
11#include <memory>
12#include <vector>
13
dsinclair488b7ad2016-10-04 11:55:50 -070014#include "core/fpdfapi/parser/fpdf_parser_decode.h"
dsinclair1727aee2016-09-29 13:12:56 -070015#include "core/fpdfdoc/cpdf_defaultappearance.h"
dsinclaira52ab742016-09-29 13:59:29 -070016#include "core/fxcrt/fx_string.h"
17#include "core/fxcrt/fx_system.h"
dsinclaircac704d2016-07-28 12:59:09 -070018
19class CFieldTree;
20class CFDF_Document;
21class CPDF_Document;
22class CPDF_Dictionary;
23class CPDF_Font;
24class CPDF_FormControl;
25class CPDF_FormField;
26class CPDF_Object;
27class CPDF_Page;
28class IPDF_FormNotify;
29
dsinclair27053d82016-08-02 15:43:46 -070030CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict,
31 CPDF_Document* pDocument,
32 CFX_ByteString& csNameTag);
33
dsinclaircac704d2016-07-28 12:59:09 -070034class CPDF_InterForm {
35 public:
36 explicit CPDF_InterForm(CPDF_Document* pDocument);
37 ~CPDF_InterForm();
38
thestig7c292e02016-09-28 14:14:26 -070039 static void SetUpdateAP(bool bUpdateAP);
40 static bool IsUpdateAPEnabled();
dsinclaircac704d2016-07-28 12:59:09 -070041 static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict,
42 const FX_CHAR* csType,
thestig7c292e02016-09-28 14:14:26 -070043 int iMinLen,
44 const FX_CHAR* csPrefix);
dsinclaircac704d2016-07-28 12:59:09 -070045 static CPDF_Font* AddStandardFont(CPDF_Document* pDocument,
46 CFX_ByteString csFontName);
thestig7c292e02016-09-28 14:14:26 -070047 static CFX_ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont);
dsinclaircac704d2016-07-28 12:59:09 -070048 static uint8_t GetNativeCharSet();
49 static CPDF_Font* AddNativeFont(uint8_t iCharSet, CPDF_Document* pDocument);
50 static CPDF_Font* AddNativeFont(CPDF_Document* pDocument);
51
thestig7c292e02016-09-28 14:14:26 -070052 size_t CountFields(const CFX_WideString& csFieldName) const;
dsinclaircac704d2016-07-28 12:59:09 -070053 CPDF_FormField* GetField(uint32_t index,
thestig7c292e02016-09-28 14:14:26 -070054 const CFX_WideString& csFieldName) const;
dsinclaircac704d2016-07-28 12:59:09 -070055 CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
56
57 CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage,
58 FX_FLOAT pdf_x,
59 FX_FLOAT pdf_y,
60 int* z_order) const;
61 CPDF_FormControl* GetControlByDict(const CPDF_Dictionary* pWidgetDict) const;
62
dsinclaircac704d2016-07-28 12:59:09 -070063 FX_BOOL NeedConstructAP() const;
64 int CountFieldsInCalculationOrder();
65 CPDF_FormField* GetFieldInCalculationOrder(int index);
66 int FindFieldInCalculationOrder(const CPDF_FormField* pField);
67
dsinclaircac704d2016-07-28 12:59:09 -070068 CPDF_Font* GetFormFont(CFX_ByteString csNameTag);
thestig7c292e02016-09-28 14:14:26 -070069 CPDF_DefaultAppearance GetDefaultAppearance() const;
70 int GetFormAlignment() const;
dsinclaircac704d2016-07-28 12:59:09 -070071
72 CPDF_FormField* CheckRequiredFields(
73 const std::vector<CPDF_FormField*>* fields,
74 bool bIncludeOrExclude) const;
75
76 CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
thestig7c292e02016-09-28 14:14:26 -070077 bool bSimpleFileSpec) const;
dsinclaircac704d2016-07-28 12:59:09 -070078 CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
79 const std::vector<CPDF_FormField*>& fields,
thestig7c292e02016-09-28 14:14:26 -070080 bool bIncludeOrExclude,
81 bool bSimpleFileSpec) const;
dsinclaircac704d2016-07-28 12:59:09 -070082
83 bool ResetForm(const std::vector<CPDF_FormField*>& fields,
thestig7c292e02016-09-28 14:14:26 -070084 bool bIncludeOrExclude,
85 bool bNotify);
86 bool ResetForm(bool bNotify);
dsinclaircac704d2016-07-28 12:59:09 -070087
88 void SetFormNotify(IPDF_FormNotify* pNotify);
89 FX_BOOL HasXFAForm() const;
90 void FixPageFields(const CPDF_Page* pPage);
91
92 private:
93 friend class CPDF_FormControl;
94 friend class CPDF_FormField;
95
thestig7c292e02016-09-28 14:14:26 -070096 void LoadField(CPDF_Dictionary* pFieldDict, int nLevel);
dsinclaircac704d2016-07-28 12:59:09 -070097 CPDF_FormField* AddTerminalField(CPDF_Dictionary* pFieldDict);
98 CPDF_FormControl* AddControl(CPDF_FormField* pField,
99 CPDF_Dictionary* pWidgetDict);
100 void FDF_ImportField(CPDF_Dictionary* pField,
101 const CFX_WideString& parent_name,
102 FX_BOOL bNotify = FALSE,
103 int nLevel = 0);
thestig7c292e02016-09-28 14:14:26 -0700104 bool ValidateFieldName(CFX_WideString& csNewFieldName,
105 int iType,
106 const CPDF_FormField* pExcludedField,
107 const CPDF_FormControl* pExcludedControl) const;
dsinclaircac704d2016-07-28 12:59:09 -0700108
thestig7c292e02016-09-28 14:14:26 -0700109 static bool s_bUpdateAP;
dsinclaircac704d2016-07-28 12:59:09 -0700110
111 CPDF_Document* const m_pDocument;
112 CPDF_Dictionary* m_pFormDict;
113 std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap;
114 std::unique_ptr<CFieldTree> m_pFieldTree;
115 CFX_ByteString m_bsEncoding;
116 IPDF_FormNotify* m_pFormNotify;
117};
118
dsinclair1727aee2016-09-29 13:12:56 -0700119#endif // CORE_FPDFDOC_CPDF_INTERFORM_H_