202 lines
7.4 KiB
C++
202 lines
7.4 KiB
C++
// 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 <map>
|
|
#include <memory>
|
|
|
|
#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<CFX_DIBBase>& pDib,
|
|
int32_t xDpi,
|
|
int32_t yDpi);
|
|
~FX_IMAGEDIB_AND_DPI();
|
|
|
|
RetainPtr<CFX_DIBBase> pDibSource;
|
|
int32_t iImageXDpi;
|
|
int32_t iImageYDpi;
|
|
};
|
|
|
|
class CXFA_FFDoc : public cppgc::GarbageCollected<CXFA_FFDoc> {
|
|
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<XFA_PrintOpt> 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<IFX_SeekableReadStream> 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<XFA_PrintOpt> dwOptions);
|
|
FX_ARGB GetHighlightColor() const;
|
|
IJS_Runtime* GetIJSRuntime() const;
|
|
CFX_XMLDocument* GetXMLDocument() const;
|
|
RetainPtr<IFX_SeekableReadStream> 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<CFGAS_GEFont> GetPDFFont(const WideString& family,
|
|
uint32_t styles,
|
|
bool strict);
|
|
RetainPtr<CFX_DIBitmap> GetPDFNamedImage(WideStringView wsName,
|
|
int32_t& iImageXDpi,
|
|
int32_t& iImageYDpi);
|
|
|
|
bool SavePackage(CXFA_Node* pNode,
|
|
const RetainPtr<IFX_SeekableStream>& pFile);
|
|
|
|
private:
|
|
CXFA_FFDoc(CXFA_FFApp* pApp,
|
|
CallbackIface* pDocEnvironment,
|
|
CPDF_Document* pPDFDoc,
|
|
cppgc::Heap* pHeap);
|
|
bool BuildDoc(CFX_XMLDocument* pXML);
|
|
|
|
UnownedPtr<CallbackIface> const m_pDocEnvironment;
|
|
UnownedPtr<CPDF_Document> const m_pPDFDoc;
|
|
UnownedPtr<cppgc::Heap> const m_pHeap;
|
|
cppgc::Member<CXFA_FFApp> const m_pApp;
|
|
cppgc::Member<CXFA_FFNotify> m_pNotify;
|
|
cppgc::Member<CXFA_Document> m_pDocument;
|
|
cppgc::Member<CXFA_FFDocView> m_DocView;
|
|
std::unique_ptr<CFGAS_PDFFontMgr> m_pPDFFontMgr;
|
|
std::map<uint32_t, FX_IMAGEDIB_AND_DPI> m_HashToDibDpiMap;
|
|
FormType m_FormType = FormType::kXFAForeground;
|
|
};
|
|
|
|
#endif // XFA_FXFA_CXFA_FFDOC_H_
|