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