// Copyright 2014 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef XFA_FXFA_CXFA_FFDOC_H_ #define XFA_FXFA_CXFA_FFDOC_H_ #include #include #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_stream.h" #include "core/fxcrt/mask.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/unowned_ptr.h" #include "core/fxge/dib/fx_dib.h" #include "fxjs/gc/heap.h" #include "v8/include/cppgc/garbage-collected.h" #include "v8/include/cppgc/member.h" #include "v8/include/cppgc/prefinalizer.h" #include "v8/include/cppgc/visitor.h" #include "xfa/fxfa/fxfa.h" #include "xfa/fxfa/parser/cxfa_document.h" class CFGAS_GEFont; class CFGAS_PDFFontMgr; class CFX_DIBBase; class CFX_DIBitmap; class CFX_XMLDocument; class CPDF_Document; class CXFA_FFApp; class CXFA_FFDoc; class CXFA_FFDocView; class CXFA_FFNotify; class CXFA_FFPageView; class CXFA_FFWidget; class CXFA_LayoutProcessor; class IJS_Runtime; struct FX_IMAGEDIB_AND_DPI { FX_IMAGEDIB_AND_DPI(); FX_IMAGEDIB_AND_DPI(const FX_IMAGEDIB_AND_DPI& that); FX_IMAGEDIB_AND_DPI(const RetainPtr& pDib, int32_t xDpi, int32_t yDpi); ~FX_IMAGEDIB_AND_DPI(); RetainPtr pDibSource; int32_t iImageXDpi; int32_t iImageYDpi; }; class CXFA_FFDoc : public cppgc::GarbageCollected { CPPGC_USING_PRE_FINALIZER(CXFA_FFDoc, PreFinalize); public: enum class PageViewEvent { kPostAdded = 1, kPostRemoved = 3, kStopLayout = 4, }; class CallbackIface { public: virtual ~CallbackIface() = default; virtual void SetChangeMark(CXFA_FFDoc* hDoc) = 0; virtual void InvalidateRect(CXFA_FFPageView* pPageView, const CFX_RectF& rt) = 0; // Show or hide caret. virtual void DisplayCaret(CXFA_FFWidget* hWidget, bool bVisible, const CFX_RectF* pRtAnchor) = 0; virtual bool GetPopupPos(CXFA_FFWidget* hWidget, float fMinPopup, float fMaxPopup, const CFX_RectF& rtAnchor, CFX_RectF* pPopupRect) = 0; virtual bool PopupMenu(CXFA_FFWidget* hWidget, const CFX_PointF& ptPopup) = 0; virtual void OnPageViewEvent(CXFA_FFPageView* pPageView, PageViewEvent eEvent) = 0; // Caller must not pass in nullptr. virtual void WidgetPostAdd(CXFA_FFWidget* hWidget) = 0; virtual void WidgetPreRemove(CXFA_FFWidget* hWidget) = 0; virtual int32_t CountPages(const CXFA_FFDoc* hDoc) const = 0; virtual int32_t GetCurrentPage(const CXFA_FFDoc* hDoc) const = 0; virtual void SetCurrentPage(CXFA_FFDoc* hDoc, int32_t iCurPage) = 0; virtual bool IsCalculationsEnabled(const CXFA_FFDoc* hDoc) const = 0; virtual void SetCalculationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) = 0; virtual WideString GetTitle(const CXFA_FFDoc* hDoc) const = 0; virtual void SetTitle(CXFA_FFDoc* hDoc, const WideString& wsTitle) = 0; virtual void ExportData(CXFA_FFDoc* hDoc, const WideString& wsFilePath, bool bXDP) = 0; virtual void GotoURL(CXFA_FFDoc* hDoc, const WideString& bsURL) = 0; virtual bool IsValidationsEnabled(const CXFA_FFDoc* hDoc) const = 0; virtual void SetValidationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) = 0; virtual void SetFocusWidget(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0; virtual void Print(CXFA_FFDoc* hDoc, int32_t nStartPage, int32_t nEndPage, Mask dwOptions) = 0; virtual FX_ARGB GetHighlightColor(const CXFA_FFDoc* hDoc) const = 0; virtual IJS_Runtime* GetIJSRuntime(const CXFA_FFDoc* hDoc) const = 0; virtual CFX_XMLDocument* GetXMLDoc() const = 0; virtual RetainPtr OpenLinkedFile( CXFA_FFDoc* hDoc, const WideString& wsLink) = 0; #ifdef PDF_XFA_ELEMENT_SUBMIT_ENABLED virtual bool Submit(CXFA_FFDoc* hDoc, CXFA_Submit* submit) = 0; #endif // PDF_XFA_ELEMENT_SUBMIT_ENABLED }; CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; ~CXFA_FFDoc(); void PreFinalize(); void Trace(cppgc::Visitor* visitor) const; bool OpenDoc(CFX_XMLDocument* pXML); void SetChangeMark(); void InvalidateRect(CXFA_FFPageView* pPageView, const CFX_RectF& rt); void DisplayCaret(CXFA_FFWidget* hWidget, bool bVisible, const CFX_RectF* pRtAnchor); bool GetPopupPos(CXFA_FFWidget* hWidget, float fMinPopup, float fMaxPopup, const CFX_RectF& rtAnchor, CFX_RectF* pPopupRect) const; bool PopupMenu(CXFA_FFWidget* hWidget, const CFX_PointF& ptPopup); void OnPageViewEvent(CXFA_FFPageView* pPageView, PageViewEvent eEvent); void WidgetPostAdd(CXFA_FFWidget* hWidget); void WidgetPreRemove(CXFA_FFWidget* hWidget); int32_t CountPages() const; int32_t GetCurrentPage() const; void SetCurrentPage(int32_t iCurPage); bool IsCalculationsEnabled() const; void SetCalculationsEnabled(bool bEnabled); WideString GetTitle() const; void SetTitle(const WideString& wsTitle); void ExportData(const WideString& wsFilePath, bool bXDP); void GotoURL(const WideString& bsURL); bool IsValidationsEnabled() const; void SetValidationsEnabled(bool bEnabled); void SetFocusWidget(CXFA_FFWidget* hWidget); void Print(int32_t nStartPage, int32_t nEndPage, Mask dwOptions); FX_ARGB GetHighlightColor() const; IJS_Runtime* GetIJSRuntime() const; CFX_XMLDocument* GetXMLDocument() const; RetainPtr OpenLinkedFile(const WideString& wsLink); CXFA_FFDocView* CreateDocView(); FormType GetFormType() const { return m_FormType; } cppgc::Heap* GetHeap() const { return m_pHeap; } CXFA_Document* GetXFADoc() const { return m_pDocument; } CXFA_FFApp* GetApp() const { return m_pApp; } CPDF_Document* GetPDFDoc() const { return m_pPDFDoc; } CXFA_FFDocView* GetDocView(CXFA_LayoutProcessor* pLayout); CXFA_FFDocView* GetDocView(); RetainPtr GetPDFFont(const WideString& family, uint32_t styles, bool strict); RetainPtr GetPDFNamedImage(WideStringView wsName, int32_t& iImageXDpi, int32_t& iImageYDpi); bool SavePackage(CXFA_Node* pNode, const RetainPtr& pFile); private: CXFA_FFDoc(CXFA_FFApp* pApp, CallbackIface* pDocEnvironment, CPDF_Document* pPDFDoc, cppgc::Heap* pHeap); bool BuildDoc(CFX_XMLDocument* pXML); UnownedPtr const m_pDocEnvironment; UnownedPtr const m_pPDFDoc; UnownedPtr const m_pHeap; cppgc::Member const m_pApp; cppgc::Member m_pNotify; cppgc::Member m_pDocument; cppgc::Member m_DocView; std::unique_ptr m_pPDFFontMgr; std::map m_HashToDibDpiMap; FormType m_FormType = FormType::kXFAForeground; }; #endif // XFA_FXFA_CXFA_FFDOC_H_