You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
8.2 KiB
220 lines
8.2 KiB
// Copyright 2016 PDFium Authors. All rights reserved. |
|
// 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 FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_ |
|
#define FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_ |
|
|
|
#include <map> |
|
#include <memory> |
|
#include <vector> |
|
|
|
#include "core/fpdfapi/page/cpdf_page.h" |
|
#include "core/fpdfapi/parser/cpdf_document.h" |
|
#include "core/fpdfdoc/cpdf_occontext.h" |
|
#include "core/fxcrt/cfx_observable.h" |
|
#include "fpdfsdk/cfx_systemhandler.h" |
|
#include "fpdfsdk/cpdfsdk_annot.h" |
|
#include "fpdfsdk/fsdk_define.h" |
|
#include "public/fpdf_formfill.h" |
|
#include "public/fpdf_fwlevent.h" |
|
|
|
class CFFL_InteractiveFormFiller; |
|
class CFX_SystemHandler; |
|
class CPDFSDK_ActionHandler; |
|
class CPDFSDK_AnnotHandlerMgr; |
|
class CPDFSDK_InterForm; |
|
class CPDFSDK_PageView; |
|
class IJS_Runtime; |
|
|
|
class CPDFSDK_FormFillEnvironment |
|
: public CFX_Observable<CPDFSDK_FormFillEnvironment> { |
|
public: |
|
CPDFSDK_FormFillEnvironment(UnderlyingDocumentType* pDoc, |
|
FPDF_FORMFILLINFO* pFFinfo); |
|
~CPDFSDK_FormFillEnvironment(); |
|
|
|
CPDFSDK_PageView* GetPageView(UnderlyingPageType* pPage, bool renew); |
|
CPDFSDK_PageView* GetPageView(int nIndex); |
|
CPDFSDK_PageView* GetCurrentView(); |
|
void RemovePageView(UnderlyingPageType* pPage); |
|
void UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot); |
|
|
|
CPDFSDK_Annot* GetFocusAnnot() { return m_pFocusAnnot.Get(); } |
|
bool SetFocusAnnot(CPDFSDK_Annot::ObservedPtr* pAnnot); |
|
bool KillFocusAnnot(uint32_t nFlag); |
|
void ClearAllFocusedAnnots(); |
|
|
|
bool ExtractPages(const std::vector<uint16_t>& arrExtraPages, |
|
CPDF_Document* pDstDoc); |
|
bool InsertPages(int nInsertAt, |
|
const CPDF_Document* pSrcDoc, |
|
const std::vector<uint16_t>& arrSrcPages); |
|
bool ReplacePages(int nPage, |
|
const CPDF_Document* pSrcDoc, |
|
const std::vector<uint16_t>& arrSrcPages); |
|
|
|
int GetPageCount() { return m_pUnderlyingDoc->GetPageCount(); } |
|
bool GetPermissions(int nFlag); |
|
|
|
bool GetChangeMark() const { return m_bChangeMask; } |
|
void SetChangeMark() { m_bChangeMask = true; } |
|
void ClearChangeMark() { m_bChangeMask = false; } |
|
|
|
UnderlyingPageType* GetPage(int nIndex); |
|
|
|
void ProcJavascriptFun(); |
|
bool ProcOpenAction(); |
|
|
|
void Invalidate(FPDF_PAGE page, const FX_RECT& rect); |
|
void OutputSelectedRect(FPDF_PAGE page, const CFX_FloatRect& rect); |
|
|
|
void SetCursor(int nCursorType); |
|
int SetTimer(int uElapse, TimerCallback lpTimerFunc); |
|
void KillTimer(int nTimerID); |
|
FX_SYSTEMTIME GetLocalTime() const; |
|
|
|
void OnChange(); |
|
bool IsSHIFTKeyDown(uint32_t nFlag) const; |
|
bool IsCTRLKeyDown(uint32_t nFlag) const; |
|
bool IsALTKeyDown(uint32_t nFlag) const; |
|
|
|
FPDF_PAGE GetPage(FPDF_DOCUMENT document, int nPageIndex); |
|
FPDF_PAGE GetCurrentPage(FPDF_DOCUMENT document); |
|
|
|
void ExecuteNamedAction(const FX_CHAR* namedAction); |
|
void OnSetFieldInputFocus(FPDF_WIDESTRING focusText, |
|
FPDF_DWORD nTextLen, |
|
bool bFocus); |
|
void DoURIAction(const FX_CHAR* bsURI); |
|
void DoGoToAction(int nPageIndex, |
|
int zoomMode, |
|
float* fPosArray, |
|
int sizeOfArray); |
|
|
|
UnderlyingDocumentType* GetUnderlyingDocument() const { |
|
return m_pUnderlyingDoc; |
|
} |
|
|
|
#ifdef PDF_ENABLE_XFA |
|
CPDF_Document* GetPDFDocument() const { |
|
return m_pUnderlyingDoc ? m_pUnderlyingDoc->GetPDFDoc() : nullptr; |
|
} |
|
|
|
CPDFXFA_Context* GetXFAContext() const { return m_pUnderlyingDoc; } |
|
void ResetXFADocument() { m_pUnderlyingDoc = nullptr; } |
|
|
|
int GetPageViewCount() const { return m_PageMap.size(); } |
|
|
|
void DisplayCaret(FPDF_PAGE page, |
|
FPDF_BOOL bVisible, |
|
double left, |
|
double top, |
|
double right, |
|
double bottom); |
|
int GetCurrentPageIndex(FPDF_DOCUMENT document); |
|
void SetCurrentPage(FPDF_DOCUMENT document, int iCurPage); |
|
|
|
// TODO(dsinclair): This should probably change to PDFium? |
|
CFX_WideString FFI_GetAppName() const { return CFX_WideString(L"Acrobat"); } |
|
|
|
CFX_WideString GetPlatform(); |
|
void GotoURL(FPDF_DOCUMENT document, const CFX_WideStringC& wsURL); |
|
void GetPageViewRect(FPDF_PAGE page, FS_RECTF& dstRect); |
|
bool PopupMenu(FPDF_PAGE page, |
|
FPDF_WIDGET hWidget, |
|
int menuFlag, |
|
CFX_PointF pt); |
|
|
|
void Alert(FPDF_WIDESTRING Msg, FPDF_WIDESTRING Title, int Type, int Icon); |
|
void EmailTo(FPDF_FILEHANDLER* fileHandler, |
|
FPDF_WIDESTRING pTo, |
|
FPDF_WIDESTRING pSubject, |
|
FPDF_WIDESTRING pCC, |
|
FPDF_WIDESTRING pBcc, |
|
FPDF_WIDESTRING pMsg); |
|
void UploadTo(FPDF_FILEHANDLER* fileHandler, |
|
int fileFlag, |
|
FPDF_WIDESTRING uploadTo); |
|
FPDF_FILEHANDLER* OpenFile(int fileType, |
|
FPDF_WIDESTRING wsURL, |
|
const char* mode); |
|
CFX_RetainPtr<IFX_SeekableReadStream> DownloadFromURL(const FX_WCHAR* url); |
|
CFX_WideString PostRequestURL(const FX_WCHAR* wsURL, |
|
const FX_WCHAR* wsData, |
|
const FX_WCHAR* wsContentType, |
|
const FX_WCHAR* wsEncode, |
|
const FX_WCHAR* wsHeader); |
|
FPDF_BOOL PutRequestURL(const FX_WCHAR* wsURL, |
|
const FX_WCHAR* wsData, |
|
const FX_WCHAR* wsEncode); |
|
CFX_WideString GetLanguage(); |
|
|
|
void PageEvent(int iPageCount, uint32_t dwEventType) const; |
|
#else // PDF_ENABLE_XFA |
|
CPDF_Document* GetPDFDocument() const { return m_pUnderlyingDoc; } |
|
#endif // PDF_ENABLE_XFA |
|
|
|
int JS_appAlert(const FX_WCHAR* Msg, |
|
const FX_WCHAR* Title, |
|
uint32_t Type, |
|
uint32_t Icon); |
|
int JS_appResponse(const FX_WCHAR* Question, |
|
const FX_WCHAR* Title, |
|
const FX_WCHAR* Default, |
|
const FX_WCHAR* cLabel, |
|
FPDF_BOOL bPassword, |
|
void* response, |
|
int length); |
|
void JS_appBeep(int nType); |
|
CFX_WideString JS_fieldBrowse(); |
|
CFX_WideString JS_docGetFilePath(); |
|
void JS_docSubmitForm(void* formData, int length, const FX_WCHAR* URL); |
|
void JS_docmailForm(void* mailData, |
|
int length, |
|
FPDF_BOOL bUI, |
|
const FX_WCHAR* To, |
|
const FX_WCHAR* Subject, |
|
const FX_WCHAR* CC, |
|
const FX_WCHAR* BCC, |
|
const FX_WCHAR* Msg); |
|
void JS_docprint(FPDF_BOOL bUI, |
|
int nStart, |
|
int nEnd, |
|
FPDF_BOOL bSilent, |
|
FPDF_BOOL bShrinkToFit, |
|
FPDF_BOOL bPrintAsImage, |
|
FPDF_BOOL bReverse, |
|
FPDF_BOOL bAnnotations); |
|
void JS_docgotoPage(int nPageNum); |
|
|
|
bool IsJSInitiated() const { return m_pInfo && m_pInfo->m_pJsPlatform; } |
|
CFX_ByteString GetAppName() const { return ""; } |
|
CFX_SystemHandler* GetSysHandler() const { return m_pSysHandler.get(); } |
|
FPDF_FORMFILLINFO* GetFormFillInfo() const { return m_pInfo; } |
|
|
|
// Creates if not present. |
|
CFFL_InteractiveFormFiller* GetInteractiveFormFiller(); |
|
CPDFSDK_AnnotHandlerMgr* GetAnnotHandlerMgr(); // Creates if not present. |
|
IJS_Runtime* GetJSRuntime(); // Creates if not present. |
|
CPDFSDK_ActionHandler* GetActionHander(); // Creates if not present. |
|
CPDFSDK_InterForm* GetInterForm(); // Creates if not present. |
|
|
|
private: |
|
std::unique_ptr<CPDFSDK_AnnotHandlerMgr> m_pAnnotHandlerMgr; |
|
std::unique_ptr<CPDFSDK_ActionHandler> m_pActionHandler; |
|
std::unique_ptr<IJS_Runtime> m_pJSRuntime; |
|
FPDF_FORMFILLINFO* const m_pInfo; |
|
std::map<UnderlyingPageType*, std::unique_ptr<CPDFSDK_PageView>> m_PageMap; |
|
std::unique_ptr<CPDFSDK_InterForm> m_pInterForm; |
|
CPDFSDK_Annot::ObservedPtr m_pFocusAnnot; |
|
UnderlyingDocumentType* m_pUnderlyingDoc; |
|
std::unique_ptr<CFFL_InteractiveFormFiller> m_pFormFiller; |
|
std::unique_ptr<CFX_SystemHandler> m_pSysHandler; |
|
bool m_bChangeMask; |
|
bool m_bBeingDestroyed; |
|
}; |
|
|
|
#endif // FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_
|
|
|