1 // Copyright 2014 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 XFA_FXFA_CXFA_FFDOC_H_ 8 #define XFA_FXFA_CXFA_FFDOC_H_ 9 10 #include <map> 11 #include <memory> 12 13 #include "core/fxcrt/fx_coordinates.h" 14 #include "core/fxcrt/fx_stream.h" 15 #include "core/fxcrt/mask.h" 16 #include "core/fxcrt/retain_ptr.h" 17 #include "core/fxcrt/unowned_ptr.h" 18 #include "core/fxge/dib/fx_dib.h" 19 #include "fxjs/gc/heap.h" 20 #include "v8/include/cppgc/garbage-collected.h" 21 #include "v8/include/cppgc/member.h" 22 #include "v8/include/cppgc/prefinalizer.h" 23 #include "v8/include/cppgc/visitor.h" 24 #include "xfa/fxfa/fxfa.h" 25 #include "xfa/fxfa/parser/cxfa_document.h" 26 27 class CFGAS_GEFont; 28 class CFGAS_PDFFontMgr; 29 class CFX_DIBBase; 30 class CFX_DIBitmap; 31 class CFX_XMLDocument; 32 class CPDF_Document; 33 class CXFA_FFApp; 34 class CXFA_FFDoc; 35 class CXFA_FFDocView; 36 class CXFA_FFNotify; 37 class CXFA_FFPageView; 38 class CXFA_FFWidget; 39 class CXFA_LayoutProcessor; 40 class IJS_Runtime; 41 42 struct FX_IMAGEDIB_AND_DPI { 43 FX_IMAGEDIB_AND_DPI(); 44 FX_IMAGEDIB_AND_DPI(const FX_IMAGEDIB_AND_DPI& that); 45 FX_IMAGEDIB_AND_DPI(const RetainPtr<CFX_DIBBase>& pDib, 46 int32_t xDpi, 47 int32_t yDpi); 48 ~FX_IMAGEDIB_AND_DPI(); 49 50 RetainPtr<CFX_DIBBase> pDibSource; 51 int32_t iImageXDpi; 52 int32_t iImageYDpi; 53 }; 54 55 class CXFA_FFDoc : public cppgc::GarbageCollected<CXFA_FFDoc> { 56 CPPGC_USING_PRE_FINALIZER(CXFA_FFDoc, PreFinalize); 57 58 public: 59 enum class PageViewEvent { 60 kPostAdded = 1, 61 kPostRemoved = 3, 62 kStopLayout = 4, 63 }; 64 65 class CallbackIface { 66 public: 67 virtual ~CallbackIface() = default; 68 69 virtual void SetChangeMark(CXFA_FFDoc* hDoc) = 0; 70 virtual void InvalidateRect(CXFA_FFPageView* pPageView, 71 const CFX_RectF& rt) = 0; 72 // Show or hide caret. 73 virtual void DisplayCaret(CXFA_FFWidget* hWidget, 74 bool bVisible, 75 const CFX_RectF* pRtAnchor) = 0; 76 77 virtual bool GetPopupPos(CXFA_FFWidget* hWidget, 78 float fMinPopup, 79 float fMaxPopup, 80 const CFX_RectF& rtAnchor, 81 CFX_RectF* pPopupRect) = 0; 82 virtual bool PopupMenu(CXFA_FFWidget* hWidget, 83 const CFX_PointF& ptPopup) = 0; 84 85 virtual void OnPageViewEvent(CXFA_FFPageView* pPageView, 86 PageViewEvent eEvent) = 0; 87 88 // Caller must not pass in nullptr. 89 virtual void WidgetPostAdd(CXFA_FFWidget* hWidget) = 0; 90 virtual void WidgetPreRemove(CXFA_FFWidget* hWidget) = 0; 91 92 virtual int32_t CountPages(const CXFA_FFDoc* hDoc) const = 0; 93 virtual int32_t GetCurrentPage(const CXFA_FFDoc* hDoc) const = 0; 94 virtual void SetCurrentPage(CXFA_FFDoc* hDoc, int32_t iCurPage) = 0; 95 virtual bool IsCalculationsEnabled(const CXFA_FFDoc* hDoc) const = 0; 96 virtual void SetCalculationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) = 0; 97 virtual WideString GetTitle(const CXFA_FFDoc* hDoc) const = 0; 98 virtual void SetTitle(CXFA_FFDoc* hDoc, const WideString& wsTitle) = 0; 99 virtual void ExportData(CXFA_FFDoc* hDoc, 100 const WideString& wsFilePath, 101 bool bXDP) = 0; 102 virtual void GotoURL(CXFA_FFDoc* hDoc, const WideString& bsURL) = 0; 103 virtual bool IsValidationsEnabled(const CXFA_FFDoc* hDoc) const = 0; 104 virtual void SetValidationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) = 0; 105 virtual void SetFocusWidget(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0; 106 virtual void Print(CXFA_FFDoc* hDoc, 107 int32_t nStartPage, 108 int32_t nEndPage, 109 Mask<XFA_PrintOpt> dwOptions) = 0; 110 virtual FX_ARGB GetHighlightColor(const CXFA_FFDoc* hDoc) const = 0; 111 virtual IJS_Runtime* GetIJSRuntime(const CXFA_FFDoc* hDoc) const = 0; 112 virtual CFX_XMLDocument* GetXMLDoc() const = 0; 113 virtual RetainPtr<IFX_SeekableReadStream> OpenLinkedFile( 114 CXFA_FFDoc* hDoc, 115 const WideString& wsLink) = 0; 116 117 #ifdef PDF_XFA_ELEMENT_SUBMIT_ENABLED 118 virtual bool Submit(CXFA_FFDoc* hDoc, CXFA_Submit* submit) = 0; 119 #endif // PDF_XFA_ELEMENT_SUBMIT_ENABLED 120 }; 121 122 CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; 123 ~CXFA_FFDoc(); 124 125 void PreFinalize(); 126 void Trace(cppgc::Visitor* visitor) const; 127 128 bool OpenDoc(CFX_XMLDocument* pXML); 129 130 void SetChangeMark(); 131 void InvalidateRect(CXFA_FFPageView* pPageView, const CFX_RectF& rt); 132 void DisplayCaret(CXFA_FFWidget* hWidget, 133 bool bVisible, 134 const CFX_RectF* pRtAnchor); 135 bool GetPopupPos(CXFA_FFWidget* hWidget, 136 float fMinPopup, 137 float fMaxPopup, 138 const CFX_RectF& rtAnchor, 139 CFX_RectF* pPopupRect) const; 140 bool PopupMenu(CXFA_FFWidget* hWidget, const CFX_PointF& ptPopup); 141 void OnPageViewEvent(CXFA_FFPageView* pPageView, PageViewEvent eEvent); 142 void WidgetPostAdd(CXFA_FFWidget* hWidget); 143 void WidgetPreRemove(CXFA_FFWidget* hWidget); 144 int32_t CountPages() const; 145 int32_t GetCurrentPage() const; 146 void SetCurrentPage(int32_t iCurPage); 147 bool IsCalculationsEnabled() const; 148 void SetCalculationsEnabled(bool bEnabled); 149 WideString GetTitle() const; 150 void SetTitle(const WideString& wsTitle); 151 void ExportData(const WideString& wsFilePath, bool bXDP); 152 void GotoURL(const WideString& bsURL); 153 bool IsValidationsEnabled() const; 154 void SetValidationsEnabled(bool bEnabled); 155 void SetFocusWidget(CXFA_FFWidget* hWidget); 156 void Print(int32_t nStartPage, 157 int32_t nEndPage, 158 Mask<XFA_PrintOpt> dwOptions); 159 FX_ARGB GetHighlightColor() const; 160 IJS_Runtime* GetIJSRuntime() const; 161 CFX_XMLDocument* GetXMLDocument() const; 162 RetainPtr<IFX_SeekableReadStream> OpenLinkedFile(const WideString& wsLink); 163 164 CXFA_FFDocView* CreateDocView(); GetFormType()165 FormType GetFormType() const { return m_FormType; } GetHeap()166 cppgc::Heap* GetHeap() const { return m_pHeap; } GetXFADoc()167 CXFA_Document* GetXFADoc() const { return m_pDocument; } GetApp()168 CXFA_FFApp* GetApp() const { return m_pApp; } GetPDFDoc()169 CPDF_Document* GetPDFDoc() const { return m_pPDFDoc; } 170 CXFA_FFDocView* GetDocView(CXFA_LayoutProcessor* pLayout); 171 CXFA_FFDocView* GetDocView(); 172 RetainPtr<CFGAS_GEFont> GetPDFFont(const WideString& family, 173 uint32_t styles, 174 bool strict); 175 RetainPtr<CFX_DIBitmap> GetPDFNamedImage(WideStringView wsName, 176 int32_t& iImageXDpi, 177 int32_t& iImageYDpi); 178 179 bool SavePackage(CXFA_Node* pNode, 180 const RetainPtr<IFX_SeekableStream>& pFile); 181 182 private: 183 CXFA_FFDoc(CXFA_FFApp* pApp, 184 CallbackIface* pDocEnvironment, 185 CPDF_Document* pPDFDoc, 186 cppgc::Heap* pHeap); 187 bool BuildDoc(CFX_XMLDocument* pXML); 188 189 UnownedPtr<CallbackIface> const m_pDocEnvironment; 190 UnownedPtr<CPDF_Document> const m_pPDFDoc; 191 UnownedPtr<cppgc::Heap> const m_pHeap; 192 cppgc::Member<CXFA_FFApp> const m_pApp; 193 cppgc::Member<CXFA_FFNotify> m_pNotify; 194 cppgc::Member<CXFA_Document> m_pDocument; 195 cppgc::Member<CXFA_FFDocView> m_DocView; 196 std::unique_ptr<CFGAS_PDFFontMgr> m_pPDFFontMgr; 197 std::map<uint32_t, FX_IMAGEDIB_AND_DPI> m_HashToDibDpiMap; 198 FormType m_FormType = FormType::kXFAForeground; 199 }; 200 201 #endif // XFA_FXFA_CXFA_FFDOC_H_ 202