Split fsdk_mgr files apart.
This CL separates the CPDFDoc_Environment, CPDFSDK_Document and CPDFSDK_PageView
classes into their own h and cpp files.
Review-Url: https://codereview.chromium.org/2335243002
diff --git a/BUILD.gn b/BUILD.gn
index 29cf5f5..4f356ee 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -65,13 +65,16 @@
"fpdfsdk/cba_annotiterator.cpp",
"fpdfsdk/cfx_systemhandler.cpp",
"fpdfsdk/cfx_systemhandler.h",
+ "fpdfsdk/cpdfdoc_environment.cpp",
"fpdfsdk/cpdfsdk_annot.cpp",
"fpdfsdk/cpdfsdk_annothandlermgr.cpp",
"fpdfsdk/cpdfsdk_annotiterator.cpp",
"fpdfsdk/cpdfsdk_baannot.cpp",
"fpdfsdk/cpdfsdk_baannothandler.cpp",
"fpdfsdk/cpdfsdk_datetime.cpp",
+ "fpdfsdk/cpdfsdk_document.cpp",
"fpdfsdk/cpdfsdk_interform.cpp",
+ "fpdfsdk/cpdfsdk_pageview.cpp",
"fpdfsdk/cpdfsdk_widget.cpp",
"fpdfsdk/cpdfsdk_widgethandler.cpp",
"fpdfsdk/fpdf_dataavail.cpp",
@@ -90,16 +93,18 @@
"fpdfsdk/fpdftext.cpp",
"fpdfsdk/fpdfview.cpp",
"fpdfsdk/fsdk_actionhandler.cpp",
- "fpdfsdk/fsdk_mgr.cpp",
"fpdfsdk/fsdk_pauseadapter.cpp",
"fpdfsdk/include/cba_annotiterator.h",
+ "fpdfsdk/include/cpdfdoc_environment.h",
"fpdfsdk/include/cpdfsdk_annot.h",
"fpdfsdk/include/cpdfsdk_annothandlermgr.h",
"fpdfsdk/include/cpdfsdk_annotiterator.h",
"fpdfsdk/include/cpdfsdk_baannot.h",
"fpdfsdk/include/cpdfsdk_baannothandler.h",
"fpdfsdk/include/cpdfsdk_datetime.h",
+ "fpdfsdk/include/cpdfsdk_document.h",
"fpdfsdk/include/cpdfsdk_interform.h",
+ "fpdfsdk/include/cpdfsdk_pageview.h",
"fpdfsdk/include/cpdfsdk_widget.h",
"fpdfsdk/include/cpdfsdk_widgethandler.h",
"fpdfsdk/include/fsdk_actionhandler.h",
diff --git a/fpdfsdk/cba_annotiterator.cpp b/fpdfsdk/cba_annotiterator.cpp
index b99fabf..51ee54b 100644
--- a/fpdfsdk/cba_annotiterator.cpp
+++ b/fpdfsdk/cba_annotiterator.cpp
@@ -8,7 +8,7 @@
#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
#include "fpdfsdk/include/cpdfsdk_annot.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
// static
bool CBA_AnnotIterator::CompareByLeftAscending(const CPDFSDK_Annot* p1,
diff --git a/fpdfsdk/cfx_systemhandler.cpp b/fpdfsdk/cfx_systemhandler.cpp
index 996a17a..2589565 100644
--- a/fpdfsdk/cfx_systemhandler.cpp
+++ b/fpdfsdk/cfx_systemhandler.cpp
@@ -8,11 +8,15 @@
#include <memory>
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "core/fxge/include/cfx_fontmapper.h"
#include "core/fxge/include/cfx_fontmgr.h"
#include "core/fxge/include/cfx_gemodule.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
namespace {
diff --git a/fpdfsdk/cpdfdoc_environment.cpp b/fpdfsdk/cpdfdoc_environment.cpp
new file mode 100644
index 0000000..ddc9917
--- /dev/null
+++ b/fpdfsdk/cpdfdoc_environment.cpp
@@ -0,0 +1,214 @@
+// 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
+
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+
+#include "fpdfsdk/formfiller/cffl_iformfiller.h"
+#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
+#include "fpdfsdk/include/fsdk_actionhandler.h"
+#include "fpdfsdk/javascript/ijs_runtime.h"
+
+#ifdef PDF_ENABLE_XFA
+#include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
+#endif // PDF_ENABLE_XFA
+
+namespace {
+
+// NOTE: |bsUTF16LE| must outlive the use of the result. Care must be taken
+// since modifying the result would impact |bsUTF16LE|.
+FPDF_WIDESTRING AsFPDFWideString(CFX_ByteString* bsUTF16LE) {
+ return reinterpret_cast<FPDF_WIDESTRING>(
+ bsUTF16LE->GetBuffer(bsUTF16LE->GetLength()));
+}
+
+} // namespace
+
+CPDFDoc_Environment::CPDFDoc_Environment(UnderlyingDocumentType* pDoc,
+ FPDF_FORMFILLINFO* pFFinfo)
+ : m_pInfo(pFFinfo), m_pSDKDoc(nullptr), m_pUnderlyingDoc(pDoc) {
+ m_pSysHandler.reset(new CFX_SystemHandler(this));
+}
+
+CPDFDoc_Environment::~CPDFDoc_Environment() {
+#ifdef PDF_ENABLE_XFA
+ CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance();
+ if (pProvider->m_pEnvList.GetSize() == 0)
+ pProvider->SetJavaScriptInitialized(FALSE);
+#endif // PDF_ENABLE_XFA
+ if (m_pInfo && m_pInfo->Release)
+ m_pInfo->Release(m_pInfo);
+}
+
+int CPDFDoc_Environment::JS_appAlert(const FX_WCHAR* Msg,
+ const FX_WCHAR* Title,
+ FX_UINT Type,
+ FX_UINT Icon) {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->app_alert) {
+ return -1;
+ }
+ CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
+ CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
+ return m_pInfo->m_pJsPlatform->app_alert(
+ m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsMsg),
+ AsFPDFWideString(&bsTitle), Type, Icon);
+}
+
+int CPDFDoc_Environment::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) {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->app_response) {
+ return -1;
+ }
+ CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode();
+ CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
+ CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode();
+ CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode();
+ return m_pInfo->m_pJsPlatform->app_response(
+ m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsQuestion),
+ AsFPDFWideString(&bsTitle), AsFPDFWideString(&bsDefault),
+ AsFPDFWideString(&bsLabel), bPassword, response, length);
+}
+
+void CPDFDoc_Environment::JS_appBeep(int nType) {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->app_beep) {
+ return;
+ }
+ m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType);
+}
+
+CFX_WideString CPDFDoc_Environment::JS_fieldBrowse() {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->Field_browse) {
+ return CFX_WideString();
+ }
+ const int nRequiredLen =
+ m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, nullptr, 0);
+ if (nRequiredLen <= 0)
+ return CFX_WideString();
+
+ std::unique_ptr<char[]> pBuff(new char[nRequiredLen]);
+ memset(pBuff.get(), 0, nRequiredLen);
+ const int nActualLen = m_pInfo->m_pJsPlatform->Field_browse(
+ m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen);
+ if (nActualLen <= 0 || nActualLen > nRequiredLen)
+ return CFX_WideString();
+
+ return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen));
+}
+
+CFX_WideString CPDFDoc_Environment::JS_docGetFilePath() {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->Doc_getFilePath) {
+ return CFX_WideString();
+ }
+ const int nRequiredLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(
+ m_pInfo->m_pJsPlatform, nullptr, 0);
+ if (nRequiredLen <= 0)
+ return CFX_WideString();
+
+ std::unique_ptr<char[]> pBuff(new char[nRequiredLen]);
+ memset(pBuff.get(), 0, nRequiredLen);
+ const int nActualLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(
+ m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen);
+ if (nActualLen <= 0 || nActualLen > nRequiredLen)
+ return CFX_WideString();
+
+ return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen));
+}
+
+void CPDFDoc_Environment::JS_docSubmitForm(void* formData,
+ int length,
+ const FX_WCHAR* URL) {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->Doc_submitForm) {
+ return;
+ }
+ CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode();
+ m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData,
+ length,
+ AsFPDFWideString(&bsDestination));
+}
+
+void CPDFDoc_Environment::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) {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->Doc_mail) {
+ return;
+ }
+ CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode();
+ CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode();
+ CFX_ByteString bsCC = CFX_WideString(CC).UTF16LE_Encode();
+ CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode();
+ CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
+ m_pInfo->m_pJsPlatform->Doc_mail(
+ m_pInfo->m_pJsPlatform, mailData, length, bUI, AsFPDFWideString(&bsTo),
+ AsFPDFWideString(&bsSubject), AsFPDFWideString(&bsCC),
+ AsFPDFWideString(&bsBcc), AsFPDFWideString(&bsMsg));
+}
+
+void CPDFDoc_Environment::JS_docprint(FPDF_BOOL bUI,
+ int nStart,
+ int nEnd,
+ FPDF_BOOL bSilent,
+ FPDF_BOOL bShrinkToFit,
+ FPDF_BOOL bPrintAsImage,
+ FPDF_BOOL bReverse,
+ FPDF_BOOL bAnnotations) {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->Doc_print) {
+ return;
+ }
+ m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd,
+ bSilent, bShrinkToFit, bPrintAsImage,
+ bReverse, bAnnotations);
+}
+
+void CPDFDoc_Environment::JS_docgotoPage(int nPageNum) {
+ if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+ !m_pInfo->m_pJsPlatform->Doc_gotoPage) {
+ return;
+ }
+ m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum);
+}
+
+IJS_Runtime* CPDFDoc_Environment::GetJSRuntime() {
+ if (!IsJSInitiated())
+ return nullptr;
+ if (!m_pJSRuntime)
+ m_pJSRuntime.reset(IJS_Runtime::Create(this));
+ return m_pJSRuntime.get();
+}
+
+CPDFSDK_AnnotHandlerMgr* CPDFDoc_Environment::GetAnnotHandlerMgr() {
+ if (!m_pAnnotHandlerMgr)
+ m_pAnnotHandlerMgr.reset(new CPDFSDK_AnnotHandlerMgr(this));
+ return m_pAnnotHandlerMgr.get();
+}
+
+CPDFSDK_ActionHandler* CPDFDoc_Environment::GetActionHander() {
+ if (!m_pActionHandler)
+ m_pActionHandler.reset(new CPDFSDK_ActionHandler());
+ return m_pActionHandler.get();
+}
+
+CFFL_IFormFiller* CPDFDoc_Environment::GetIFormFiller() {
+ if (!m_pIFormFiller)
+ m_pIFormFiller.reset(new CFFL_IFormFiller(this));
+ return m_pIFormFiller.get();
+}
diff --git a/fpdfsdk/cpdfsdk_annot.cpp b/fpdfsdk/cpdfsdk_annot.cpp
index 738508f..7752cf1 100644
--- a/fpdfsdk/cpdfsdk_annot.cpp
+++ b/fpdfsdk/cpdfsdk_annot.cpp
@@ -8,7 +8,7 @@
#include <algorithm>
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "third_party/base/stl_util.h"
#ifdef PDF_ENABLE_XFA
diff --git a/fpdfsdk/cpdfsdk_annothandlermgr.cpp b/fpdfsdk/cpdfsdk_annothandlermgr.cpp
index 0fd48d2..8fa1093 100644
--- a/fpdfsdk/cpdfsdk_annothandlermgr.cpp
+++ b/fpdfsdk/cpdfsdk_annothandlermgr.cpp
@@ -8,12 +8,14 @@
#include "core/fpdfdoc/include/cpdf_annot.h"
#include "fpdfsdk/include/cba_annotiterator.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_annot.h"
#include "fpdfsdk/include/cpdfsdk_baannot.h"
#include "fpdfsdk/include/cpdfsdk_baannothandler.h"
#include "fpdfsdk/include/cpdfsdk_datetime.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "fpdfsdk/include/cpdfsdk_widgethandler.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#ifdef PDF_ENABLE_XFA
#include "fpdfsdk/include/cpdfsdk_xfawidgethandler.h"
diff --git a/fpdfsdk/cpdfsdk_annotiterator.cpp b/fpdfsdk/cpdfsdk_annotiterator.cpp
index 01a4e15..0505ce0 100644
--- a/fpdfsdk/cpdfsdk_annotiterator.cpp
+++ b/fpdfsdk/cpdfsdk_annotiterator.cpp
@@ -9,7 +9,7 @@
#include <algorithm>
#include "fpdfsdk/include/cpdfsdk_annot.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView* pPageView,
bool bReverse)
diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp
index a2fd7c7..48daaf9 100644
--- a/fpdfsdk/cpdfsdk_baannot.cpp
+++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -7,11 +7,13 @@
#include "fpdfsdk/include/cpdfsdk_baannot.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
#include "fpdfsdk/include/cpdfsdk_datetime.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
CPDFSDK_BAAnnot::CPDFSDK_BAAnnot(CPDF_Annot* pAnnot,
CPDFSDK_PageView* pPageView)
diff --git a/fpdfsdk/cpdfsdk_baannothandler.cpp b/fpdfsdk/cpdfsdk_baannothandler.cpp
index f0d67f4..1422c75 100644
--- a/fpdfsdk/cpdfsdk_baannothandler.cpp
+++ b/fpdfsdk/cpdfsdk_baannothandler.cpp
@@ -15,7 +15,7 @@
#include "fpdfsdk/formfiller/cffl_formfiller.h"
#include "fpdfsdk/include/cpdfsdk_annot.h"
#include "fpdfsdk/include/cpdfsdk_baannot.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#ifdef PDF_ENABLE_XFA
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
diff --git a/fpdfsdk/cpdfsdk_document.cpp b/fpdfsdk/cpdfsdk_document.cpp
new file mode 100644
index 0000000..232adba
--- /dev/null
+++ b/fpdfsdk/cpdfsdk_document.cpp
@@ -0,0 +1,261 @@
+// 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
+
+#include "fpdfsdk/include/cpdfsdk_document.h"
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_object.h"
+#include "core/fpdfdoc/include/cpdf_action.h"
+#include "core/fpdfdoc/include/cpdf_docjsactions.h"
+#include "core/fpdfdoc/include/cpdf_occontext.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
+#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/cpdfsdk_widget.h"
+#include "fpdfsdk/include/fsdk_actionhandler.h"
+
+// static
+CPDFSDK_Document* CPDFSDK_Document::FromFPDFFormHandle(
+ FPDF_FORMHANDLE hHandle) {
+ CPDFDoc_Environment* pEnv = static_cast<CPDFDoc_Environment*>(hHandle);
+ return pEnv ? pEnv->GetSDKDocument() : nullptr;
+}
+
+CPDFSDK_Document::CPDFSDK_Document(UnderlyingDocumentType* pDoc,
+ CPDFDoc_Environment* pEnv)
+ : m_pDoc(pDoc),
+ m_pFocusAnnot(nullptr),
+ m_pEnv(pEnv),
+ m_bChangeMask(FALSE),
+ m_bBeingDestroyed(FALSE) {}
+
+CPDFSDK_Document::~CPDFSDK_Document() {
+ m_bBeingDestroyed = TRUE;
+
+ for (auto& it : m_pageMap)
+ it.second->KillFocusAnnotIfNeeded();
+
+ for (auto& it : m_pageMap)
+ delete it.second;
+ m_pageMap.clear();
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(
+ UnderlyingPageType* pUnderlyingPage,
+ bool ReNew) {
+ auto it = m_pageMap.find(pUnderlyingPage);
+ if (it != m_pageMap.end())
+ return it->second;
+
+ if (!ReNew)
+ return nullptr;
+
+ CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage);
+ m_pageMap[pUnderlyingPage] = pPageView;
+ // Delay to load all the annotations, to avoid endless loop.
+ pPageView->LoadFXAnnots();
+ return pPageView;
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView() {
+ UnderlyingPageType* pPage =
+ UnderlyingFromFPDFPage(m_pEnv->FFI_GetCurrentPage(m_pDoc));
+ return pPage ? GetPageView(pPage, true) : nullptr;
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex) {
+ UnderlyingPageType* pTempPage =
+ UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
+ if (!pTempPage)
+ return nullptr;
+
+ auto it = m_pageMap.find(pTempPage);
+ return it != m_pageMap.end() ? it->second : nullptr;
+}
+
+void CPDFSDK_Document::ProcJavascriptFun() {
+ CPDF_Document* pPDFDoc = GetPDFDocument();
+ CPDF_DocJSActions docJS(pPDFDoc);
+ int iCount = docJS.CountJSActions();
+ if (iCount < 1)
+ return;
+ for (int i = 0; i < iCount; i++) {
+ CFX_ByteString csJSName;
+ CPDF_Action jsAction = docJS.GetJSAction(i, csJSName);
+ if (m_pEnv->GetActionHander())
+ m_pEnv->GetActionHander()->DoAction_JavaScript(
+ jsAction, CFX_WideString::FromLocal(csJSName.AsStringC()), this);
+ }
+}
+
+FX_BOOL CPDFSDK_Document::ProcOpenAction() {
+ if (!m_pDoc)
+ return FALSE;
+
+ CPDF_Dictionary* pRoot = GetPDFDocument()->GetRoot();
+ if (!pRoot)
+ return FALSE;
+
+ CPDF_Object* pOpenAction = pRoot->GetDictBy("OpenAction");
+ if (!pOpenAction)
+ pOpenAction = pRoot->GetArrayBy("OpenAction");
+
+ if (!pOpenAction)
+ return FALSE;
+
+ if (pOpenAction->IsArray())
+ return TRUE;
+
+ if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) {
+ CPDF_Action action(pDict);
+ if (m_pEnv->GetActionHander())
+ m_pEnv->GetActionHander()->DoAction_DocOpen(action, this);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+CPDF_OCContext* CPDFSDK_Document::GetOCContext() {
+ if (!m_pOccontent) {
+ m_pOccontent.reset(
+ new CPDF_OCContext(GetPDFDocument(), CPDF_OCContext::View));
+ }
+ return m_pOccontent.get();
+}
+
+void CPDFSDK_Document::RemovePageView(UnderlyingPageType* pUnderlyingPage) {
+ auto it = m_pageMap.find(pUnderlyingPage);
+ if (it == m_pageMap.end())
+ return;
+
+ CPDFSDK_PageView* pPageView = it->second;
+ if (pPageView->IsLocked())
+ return;
+
+ // This must happen before we remove |pPageView| from the map because
+ // |KillFocusAnnotIfNeeded| can call into the |GetPage| method which will
+ // look for this page view in the map, if it doesn't find it a new one will
+ // be created. We then have two page views pointing to the same page and
+ // bad things happen.
+ pPageView->KillFocusAnnotIfNeeded();
+
+ // Remove the page from the map to make sure we don't accidentally attempt
+ // to use the |pPageView| while we're cleaning it up.
+ m_pageMap.erase(it);
+
+ delete pPageView;
+}
+
+UnderlyingPageType* CPDFSDK_Document::GetPage(int nIndex) {
+ return UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
+}
+
+CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm() {
+ if (!m_pInterForm)
+ m_pInterForm.reset(new CPDFSDK_InterForm(this));
+ return m_pInterForm.get();
+}
+
+void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender,
+ CPDFSDK_Annot* pAnnot) {
+ for (const auto& it : m_pageMap) {
+ CPDFSDK_PageView* pPageView = it.second;
+ if (pPageView != pSender) {
+ pPageView->UpdateView(pAnnot);
+ }
+ }
+}
+
+CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot() {
+ return m_pFocusAnnot;
+}
+
+FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
+ if (m_bBeingDestroyed)
+ return FALSE;
+
+ if (m_pFocusAnnot == pAnnot)
+ return TRUE;
+
+ if (m_pFocusAnnot) {
+ if (!KillFocusAnnot(nFlag))
+ return FALSE;
+ }
+
+ if (!pAnnot)
+ return FALSE;
+
+#ifdef PDF_ENABLE_XFA
+ CPDFSDK_Annot* pLastFocusAnnot = m_pFocusAnnot;
+#endif // PDF_ENABLE_XFA
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ if (pPageView && pPageView->IsValid()) {
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
+ if (!m_pFocusAnnot) {
+#ifdef PDF_ENABLE_XFA
+ if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, pLastFocusAnnot))
+ return FALSE;
+#endif // PDF_ENABLE_XFA
+ if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, nFlag))
+ return FALSE;
+ if (!m_pFocusAnnot) {
+ m_pFocusAnnot = pAnnot;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag) {
+ if (m_pFocusAnnot) {
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
+ m_pFocusAnnot = nullptr;
+
+#ifdef PDF_ENABLE_XFA
+ if (!pAnnotHandler->Annot_OnChangeFocus(nullptr, pFocusAnnot))
+ return FALSE;
+#endif // PDF_ENABLE_XFA
+
+ if (pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag)) {
+ if (pFocusAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET) {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;
+ int nFieldType = pWidget->GetFieldType();
+ if (FIELDTYPE_TEXTFIELD == nFieldType ||
+ FIELDTYPE_COMBOBOX == nFieldType) {
+ m_pEnv->FFI_OnSetFieldInputFocus(nullptr, nullptr, 0, FALSE);
+ }
+ }
+
+ if (!m_pFocusAnnot)
+ return TRUE;
+ } else {
+ m_pFocusAnnot = pFocusAnnot;
+ }
+ }
+ return FALSE;
+}
+
+void CPDFSDK_Document::OnCloseDocument() {
+ KillFocusAnnot();
+}
+
+FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag) {
+ return GetPDFDocument()->GetUserPermissions() & nFlag;
+}
+
+IJS_Runtime* CPDFSDK_Document::GetJsRuntime() {
+ return m_pEnv->GetJSRuntime();
+}
+
+CFX_WideString CPDFSDK_Document::GetPath() {
+ return m_pEnv->JS_docGetFilePath();
+}
diff --git a/fpdfsdk/cpdfsdk_interform.cpp b/fpdfsdk/cpdfsdk_interform.cpp
index 1f182d4..f762b89 100644
--- a/fpdfsdk/cpdfsdk_interform.cpp
+++ b/fpdfsdk/cpdfsdk_interform.cpp
@@ -22,11 +22,13 @@
#include "fpdfsdk/formfiller/cffl_formfiller.h"
#include "fpdfsdk/fxedit/include/fxet_edit.h"
#include "fpdfsdk/include/cba_annotiterator.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
#include "fpdfsdk/include/fsdk_actionhandler.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/include/ipdfsdk_annothandler.h"
#include "fpdfsdk/javascript/ijs_context.h"
#include "fpdfsdk/javascript/ijs_runtime.h"
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
new file mode 100644
index 0000000..ae0d3fa
--- /dev/null
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -0,0 +1,587 @@
+// 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
+
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
+#include "core/fpdfdoc/include/cpdf_annotlist.h"
+#include "core/fpdfdoc/include/cpdf_interform.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
+#include "fpdfsdk/include/cpdfsdk_annotiterator.h"
+#include "fpdfsdk/include/cpdfsdk_interform.h"
+
+#ifdef PDF_ENABLE_XFA
+#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
+#include "xfa/fxfa/include/xfa_ffdocview.h"
+#include "xfa/fxfa/include/xfa_ffpageview.h"
+#include "xfa/fxfa/include/xfa_ffwidgethandler.h"
+#include "xfa/fxfa/include/xfa_rendercontext.h"
+#include "xfa/fxgraphics/include/cfx_graphics.h"
+#endif // PDF_ENABLE_XFA
+
+CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,
+ UnderlyingPageType* page)
+ : m_page(page),
+ m_pSDKDoc(pSDKDoc),
+ m_CaptureWidget(nullptr),
+#ifndef PDF_ENABLE_XFA
+ m_bOwnsPage(false),
+#endif // PDF_ENABLE_XFA
+ m_bEnterWidget(FALSE),
+ m_bExitWidget(FALSE),
+ m_bOnWidget(FALSE),
+ m_bValid(FALSE),
+ m_bLocked(FALSE) {
+ CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();
+ if (pInterForm) {
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+#ifdef PDF_ENABLE_XFA
+ if (page->GetPDFPage())
+ pPDFInterForm->FixPageFields(page->GetPDFPage());
+#else // PDF_ENABLE_XFA
+ pPDFInterForm->FixPageFields(page);
+#endif // PDF_ENABLE_XFA
+ }
+#ifndef PDF_ENABLE_XFA
+ m_page->SetView(this);
+#endif // PDF_ENABLE_XFA
+}
+
+CPDFSDK_PageView::~CPDFSDK_PageView() {
+#ifndef PDF_ENABLE_XFA
+ // The call to |ReleaseAnnot| can cause the page pointed to by |m_page| to
+ // be freed, which will cause issues if we try to cleanup the pageview pointer
+ // in |m_page|. So, reset the pageview pointer before doing anything else.
+ m_page->SetView(nullptr);
+#endif // PDF_ENABLE_XFA
+
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
+ pAnnotHandlerMgr->ReleaseAnnot(pAnnot);
+
+ m_fxAnnotArray.clear();
+ m_pAnnotList.reset();
+
+#ifndef PDF_ENABLE_XFA
+ if (m_bOwnsPage)
+ delete m_page;
+#endif // PDF_ENABLE_XFA
+}
+
+void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice,
+ CFX_Matrix* pUser2Device,
+#ifdef PDF_ENABLE_XFA
+ CPDF_RenderOptions* pOptions,
+ const FX_RECT& pClip) {
+#else
+ CPDF_RenderOptions* pOptions) {
+#endif // PDF_ENABLE_XFA
+ m_curMatrix = *pUser2Device;
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+
+#ifdef PDF_ENABLE_XFA
+ CPDFXFA_Page* pPage = GetPDFXFAPage();
+ if (!pPage)
+ return;
+
+ if (pPage->GetDocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) {
+ CFX_Graphics gs;
+ gs.Create(pDevice);
+ CFX_RectF rectClip;
+ rectClip.Set(static_cast<FX_FLOAT>(pClip.left),
+ static_cast<FX_FLOAT>(pClip.top),
+ static_cast<FX_FLOAT>(pClip.Width()),
+ static_cast<FX_FLOAT>(pClip.Height()));
+ gs.SetClipRect(rectClip);
+ std::unique_ptr<CXFA_RenderContext> pRenderContext(new CXFA_RenderContext);
+ CXFA_RenderOptions renderOptions;
+ renderOptions.m_bHighlight = TRUE;
+ CXFA_FFPageView* xfaView = pPage->GetXFAPageView();
+ pRenderContext->StartRender(xfaView, &gs, *pUser2Device, renderOptions);
+ pRenderContext->DoRender();
+ pRenderContext->StopRender();
+ CXFA_FFDocView* docView = xfaView->GetDocView();
+ if (!docView)
+ return;
+ CPDFSDK_Annot* annot = GetFocusAnnot();
+ if (!annot)
+ return;
+ // Render the focus widget
+ docView->GetWidgetHandler()->RenderWidget(annot->GetXFAWidget(), &gs,
+ pUser2Device, FALSE);
+ return;
+ }
+#endif // PDF_ENABLE_XFA
+
+ // for pdf/static xfa.
+ CPDFSDK_AnnotIterator annotIterator(this, true);
+ while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device,
+ pOptions->m_bDrawAnnots);
+ }
+}
+
+const CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX,
+ FX_FLOAT pageY) {
+ for (const auto& pAnnot : m_pAnnotList->All()) {
+ CFX_FloatRect annotRect = pAnnot->GetRect();
+ if (annotRect.Contains(pageX, pageY))
+ return pAnnot.get();
+ }
+ return nullptr;
+}
+
+const CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX,
+ FX_FLOAT pageY) {
+ for (const auto& pAnnot : m_pAnnotList->All()) {
+ if (pAnnot->GetSubtype() == CPDF_Annot::Subtype::WIDGET) {
+ CFX_FloatRect annotRect = pAnnot->GetRect();
+ if (annotRect.Contains(pageX, pageY))
+ return pAnnot.get();
+ }
+ }
+ return nullptr;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX,
+ FX_FLOAT pageY) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_AnnotIterator annotIterator(this, false);
+ while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
+ CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
+ if (pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP)
+ continue;
+ if (rc.Contains(pageX, pageY))
+ return pSDKAnnot;
+ }
+
+ return nullptr;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX,
+ FX_FLOAT pageY) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_AnnotIterator annotIterator(this, false);
+ while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
+ bool bHitTest = pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET;
+#ifdef PDF_ENABLE_XFA
+ bHitTest = bHitTest ||
+ pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::XFAWIDGET;
+#endif // PDF_ENABLE_XFA
+ if (bHitTest) {
+ pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
+ CFX_FloatPoint point(pageX, pageY);
+ if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point))
+ return pSDKAnnot;
+ }
+ }
+
+ return nullptr;
+}
+
+void CPDFSDK_PageView::KillFocusAnnotIfNeeded() {
+ // if there is a focused annot on the page, we should kill the focus first.
+ if (CPDFSDK_Annot* focusedAnnot = m_pSDKDoc->GetFocusAnnot()) {
+ if (pdfium::ContainsValue(m_fxAnnotArray, focusedAnnot))
+ KillFocusAnnot();
+ }
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot* pPDFAnnot) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_Annot* pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
+ if (!pSDKAnnot)
+ return nullptr;
+
+ m_fxAnnotArray.push_back(pSDKAnnot);
+ pAnnotHandler->Annot_OnCreate(pSDKAnnot);
+ return pSDKAnnot;
+}
+
+#ifdef PDF_ENABLE_XFA
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CXFA_FFWidget* pPDFAnnot) {
+ if (!pPDFAnnot)
+ return nullptr;
+
+ CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot);
+ if (pSDKAnnot)
+ return pSDKAnnot;
+
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
+ pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
+ if (!pSDKAnnot)
+ return nullptr;
+
+ m_fxAnnotArray.push_back(pSDKAnnot);
+ return pSDKAnnot;
+}
+#endif // PDF_ENABLE_XFA
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary* pDict) {
+ return pDict ? AddAnnot(pDict->GetStringBy("Subtype").c_str(), pDict)
+ : nullptr;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(const FX_CHAR* lpSubType,
+ CPDF_Dictionary* pDict) {
+ return nullptr;
+}
+
+FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) {
+#ifdef PDF_ENABLE_XFA
+ if (!pAnnot)
+ return FALSE;
+ CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage();
+ if (!pPage || (pPage->GetDocument()->GetDocType() != DOCTYPE_STATIC_XFA &&
+ pPage->GetDocument()->GetDocType() != DOCTYPE_DYNAMIC_XFA))
+ return FALSE;
+
+ if (GetFocusAnnot() == pAnnot)
+ KillFocusAnnot();
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
+ if (pAnnotHandler)
+ pAnnotHandler->ReleaseAnnot(pAnnot);
+
+ auto it = std::find(m_fxAnnotArray.begin(), m_fxAnnotArray.end(), pAnnot);
+ if (it != m_fxAnnotArray.end())
+ m_fxAnnotArray.erase(it);
+ if (m_CaptureWidget == pAnnot)
+ m_CaptureWidget = nullptr;
+
+ return TRUE;
+#else // PDF_ENABLE_XFA
+ return FALSE;
+#endif // PDF_ENABLE_XFA
+}
+
+CPDF_Document* CPDFSDK_PageView::GetPDFDocument() {
+ if (m_page) {
+#ifdef PDF_ENABLE_XFA
+ return m_page->GetDocument()->GetPDFDoc();
+#else // PDF_ENABLE_XFA
+ return m_page->m_pDocument;
+#endif // PDF_ENABLE_XFA
+ }
+ return nullptr;
+}
+
+CPDF_Page* CPDFSDK_PageView::GetPDFPage() const {
+#ifdef PDF_ENABLE_XFA
+ return m_page ? m_page->GetPDFPage() : nullptr;
+#else // PDF_ENABLE_XFA
+ return m_page;
+#endif // PDF_ENABLE_XFA
+}
+
+size_t CPDFSDK_PageView::CountAnnots() const {
+ return m_fxAnnotArray.size();
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(size_t nIndex) {
+ return nIndex < m_fxAnnotArray.size() ? m_fxAnnotArray[nIndex] : nullptr;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) {
+ for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
+ if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict)
+ return pAnnot;
+ }
+ return nullptr;
+}
+
+#ifdef PDF_ENABLE_XFA
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(CXFA_FFWidget* hWidget) {
+ if (!hWidget)
+ return nullptr;
+
+ for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
+ if (pAnnot->GetXFAWidget() == hWidget)
+ return pAnnot;
+ }
+ return nullptr;
+}
+#endif // PDF_ENABLE_XFA
+
+FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CFX_FloatPoint& point,
+ FX_UINT nFlag) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+ if (!pFXAnnot) {
+ KillFocusAnnot(nFlag);
+ return FALSE;
+ }
+
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ FX_BOOL bRet =
+ pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag, point);
+ if (bRet)
+ SetFocusAnnot(pFXAnnot);
+ return bRet;
+}
+
+#ifdef PDF_ENABLE_XFA
+FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point,
+ FX_UINT nFlag) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+
+ CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+
+ if (!pFXAnnot)
+ return FALSE;
+
+ if (pAnnotHandlerMgr->Annot_OnRButtonDown(this, pFXAnnot, nFlag, point))
+ SetFocusAnnot(pFXAnnot);
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point,
+ FX_UINT nFlag) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+
+ CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+
+ if (!pFXAnnot)
+ return FALSE;
+
+ if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, pFXAnnot, nFlag, point))
+ SetFocusAnnot(pFXAnnot);
+
+ return TRUE;
+}
+#endif // PDF_ENABLE_XFA
+
+FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CFX_FloatPoint& point,
+ FX_UINT nFlag) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+ CPDFSDK_Annot* pFocusAnnot = GetFocusAnnot();
+ FX_BOOL bRet = FALSE;
+ if (pFocusAnnot && pFocusAnnot != pFXAnnot) {
+ // Last focus Annot gets a chance to handle the event.
+ bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag, point);
+ }
+ if (pFXAnnot && !bRet)
+ bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag, point);
+ return bRet;
+}
+
+FX_BOOL CPDFSDK_PageView::OnMouseMove(const CFX_FloatPoint& point, int nFlag) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ if (CPDFSDK_Annot* pFXAnnot = GetFXAnnotAtPoint(point.x, point.y)) {
+ if (m_CaptureWidget && m_CaptureWidget != pFXAnnot) {
+ m_bExitWidget = TRUE;
+ m_bEnterWidget = FALSE;
+ pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
+ }
+ m_CaptureWidget = pFXAnnot;
+ m_bOnWidget = TRUE;
+ if (!m_bEnterWidget) {
+ m_bEnterWidget = TRUE;
+ m_bExitWidget = FALSE;
+ pAnnotHandlerMgr->Annot_OnMouseEnter(this, pFXAnnot, nFlag);
+ }
+ pAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point);
+ return TRUE;
+ }
+ if (m_bOnWidget) {
+ m_bOnWidget = FALSE;
+ m_bExitWidget = TRUE;
+ m_bEnterWidget = FALSE;
+ if (m_CaptureWidget) {
+ pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
+ m_CaptureWidget = nullptr;
+ }
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX,
+ double deltaY,
+ const CFX_FloatPoint& point,
+ int nFlag) {
+ if (CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y)) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ return pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag,
+ (int)deltaY, point);
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnChar(int nChar, FX_UINT nFlag) {
+ if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ return pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag) {
+ if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag);
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag) {
+ return FALSE;
+}
+
+void CPDFSDK_PageView::LoadFXAnnots() {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+
+ SetLock(TRUE);
+
+#ifdef PDF_ENABLE_XFA
+ CFX_RetainPtr<CPDFXFA_Page> protector(m_page);
+ if (m_pSDKDoc->GetXFADocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) {
+ CXFA_FFPageView* pageView = m_page->GetXFAPageView();
+ std::unique_ptr<IXFA_WidgetIterator> pWidgetHander(
+ pageView->CreateWidgetIterator(
+ XFA_TRAVERSEWAY_Form,
+ XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable));
+ if (!pWidgetHander) {
+ SetLock(FALSE);
+ return;
+ }
+
+ while (CXFA_FFWidget* pXFAAnnot = pWidgetHander->MoveToNext()) {
+ CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this);
+ if (!pAnnot)
+ continue;
+ m_fxAnnotArray.push_back(pAnnot);
+ pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
+ }
+
+ SetLock(FALSE);
+ return;
+ }
+#endif // PDF_ENABLE_XFA
+
+ CPDF_Page* pPage = GetPDFPage();
+ ASSERT(pPage);
+ FX_BOOL bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled();
+ // Disable the default AP construction.
+ CPDF_InterForm::SetUpdateAP(FALSE);
+ m_pAnnotList.reset(new CPDF_AnnotList(pPage));
+ CPDF_InterForm::SetUpdateAP(bUpdateAP);
+
+ const size_t nCount = m_pAnnotList->Count();
+ for (size_t i = 0; i < nCount; ++i) {
+ CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
+ CheckUnSupportAnnot(GetPDFDocument(), pPDFAnnot);
+ CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
+ if (!pAnnot)
+ continue;
+ m_fxAnnotArray.push_back(pAnnot);
+ pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
+ }
+
+ SetLock(FALSE);
+}
+
+void CPDFSDK_PageView::ClearFXAnnots() {
+ SetLock(TRUE);
+ if (m_pSDKDoc && GetFocusAnnot())
+ m_pSDKDoc->SetFocusAnnot(nullptr);
+ m_CaptureWidget = nullptr;
+ for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
+ m_pSDKDoc->GetEnv()->GetAnnotHandlerMgr()->ReleaseAnnot(pAnnot);
+ m_fxAnnotArray.clear();
+ m_pAnnotList.reset();
+ SetLock(FALSE);
+}
+
+void CPDFSDK_PageView::UpdateRects(const std::vector<CFX_FloatRect>& rects) {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ for (const auto& rc : rects)
+ pEnv->FFI_Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom);
+}
+
+void CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot) {
+ CFX_FloatRect rcWindow = pAnnot->GetRect();
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ pEnv->FFI_Invalidate(m_page, rcWindow.left, rcWindow.top, rcWindow.right,
+ rcWindow.bottom);
+}
+
+int CPDFSDK_PageView::GetPageIndex() const {
+ if (!m_page)
+ return -1;
+
+#ifdef PDF_ENABLE_XFA
+ int nDocType = m_page->GetDocument()->GetDocType();
+ switch (nDocType) {
+ case DOCTYPE_DYNAMIC_XFA: {
+ CXFA_FFPageView* pPageView = m_page->GetXFAPageView();
+ return pPageView ? pPageView->GetPageIndex() : -1;
+ }
+ case DOCTYPE_STATIC_XFA:
+ case DOCTYPE_PDF:
+ return GetPageIndexForStaticPDF();
+ default:
+ return -1;
+ }
+#else // PDF_ENABLE_XFA
+ return GetPageIndexForStaticPDF();
+#endif // PDF_ENABLE_XFA
+}
+
+bool CPDFSDK_PageView::IsValidAnnot(const CPDF_Annot* p) const {
+ if (!p)
+ return false;
+
+ const auto& annots = m_pAnnotList->All();
+ auto it = std::find_if(annots.begin(), annots.end(),
+ [p](const std::unique_ptr<CPDF_Annot>& annot) {
+ return annot.get() == p;
+ });
+ return it != annots.end();
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() {
+ CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot();
+ if (!pFocusAnnot)
+ return nullptr;
+
+ for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
+ if (pAnnot == pFocusAnnot)
+ return pAnnot;
+ }
+ return nullptr;
+}
+
+int CPDFSDK_PageView::GetPageIndexForStaticPDF() const {
+ CPDF_Dictionary* pDict = GetPDFPage()->m_pFormDict;
+ CPDF_Document* pDoc = m_pSDKDoc->GetPDFDocument();
+ return (pDoc && pDict) ? pDoc->GetPageIndex(pDict->GetObjNum()) : -1;
+}
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 016e78a..11e9883 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -21,9 +21,12 @@
#include "core/fxge/include/cfx_renderdevice.h"
#include "fpdfsdk/formfiller/cba_fontmap.h"
#include "fpdfsdk/fxedit/include/fxet_edit.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/fsdk_actionhandler.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/pdfwindow/PWL_Edit.h"
#include "fpdfsdk/pdfwindow/PWL_Utils.h"
diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index 8a061e5..965a26c 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -13,10 +13,12 @@
#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "core/fpdfdoc/include/cpdf_interform.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#ifdef PDF_ENABLE_XFA
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
diff --git a/fpdfsdk/cpdfsdk_xfawidgethandler.cpp b/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
index 8621f77..0765011 100644
--- a/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
@@ -8,10 +8,12 @@
#include "core/fpdfdoc/include/cpdf_interform.h"
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "fpdfsdk/include/cpdfsdk_xfawidget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "xfa/fxfa/include/fxfa_basic.h"
#include "xfa/fxfa/include/xfa_ffdocview.h"
#include "xfa/fxfa/include/xfa_ffpageview.h"
diff --git a/fpdfsdk/formfiller/cffl_checkbox.cpp b/fpdfsdk/formfiller/cffl_checkbox.cpp
index ed81f37..3455cde 100644
--- a/fpdfsdk/formfiller/cffl_checkbox.cpp
+++ b/fpdfsdk/formfiller/cffl_checkbox.cpp
@@ -7,8 +7,8 @@
#include "fpdfsdk/formfiller/cffl_checkbox.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/pdfwindow/PWL_SpecialButton.h"
#include "public/fpdf_fwlevent.h"
diff --git a/fpdfsdk/formfiller/cffl_combobox.cpp b/fpdfsdk/formfiller/cffl_combobox.cpp
index fc590fd..3eea1e4 100644
--- a/fpdfsdk/formfiller/cffl_combobox.cpp
+++ b/fpdfsdk/formfiller/cffl_combobox.cpp
@@ -9,9 +9,9 @@
#include "fpdfsdk/formfiller/cba_fontmap.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
#include "fpdfsdk/formfiller/cffl_iformfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
#include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/pdfwindow/PWL_ComboBox.h"
CFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot)
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index f97df0a..4b33c38 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -8,10 +8,12 @@
#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
#include "core/fxge/include/cfx_renderdevice.h"
-#include "fpdfsdk/include/cpdfsdk_widget.h"
#include "fpdfsdk/formfiller/cba_fontmap.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/cpdfsdk_widget.h"
#include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/pdfwindow/PWL_Utils.h"
#define GetRed(rgb) ((uint8_t)(rgb))
diff --git a/fpdfsdk/formfiller/cffl_iformfiller.cpp b/fpdfsdk/formfiller/cffl_iformfiller.cpp
index 24a6122..d7ccaf2 100644
--- a/fpdfsdk/formfiller/cffl_iformfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_iformfiller.cpp
@@ -18,9 +18,11 @@
#include "fpdfsdk/formfiller/cffl_pushbutton.h"
#include "fpdfsdk/formfiller/cffl_radiobutton.h"
#include "fpdfsdk/formfiller/cffl_textfield.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/pdfwindow/PWL_Utils.h"
#define FFL_MAXLISTBOXHEIGHT 140.0f
diff --git a/fpdfsdk/formfiller/cffl_listbox.cpp b/fpdfsdk/formfiller/cffl_listbox.cpp
index 860fd07..39b766a 100644
--- a/fpdfsdk/formfiller/cffl_listbox.cpp
+++ b/fpdfsdk/formfiller/cffl_listbox.cpp
@@ -9,9 +9,9 @@
#include "fpdfsdk/formfiller/cba_fontmap.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
#include "fpdfsdk/formfiller/cffl_iformfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
#include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/pdfwindow/PWL_ListBox.h"
#define FFL_DEFAULTLISTBOXFONTSIZE 12.0f
diff --git a/fpdfsdk/formfiller/cffl_radiobutton.cpp b/fpdfsdk/formfiller/cffl_radiobutton.cpp
index d5474f9..752baad 100644
--- a/fpdfsdk/formfiller/cffl_radiobutton.cpp
+++ b/fpdfsdk/formfiller/cffl_radiobutton.cpp
@@ -7,9 +7,10 @@
#include "fpdfsdk/formfiller/cffl_radiobutton.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/pdfwindow/PWL_SpecialButton.h"
+#include "public/fpdf_fwlevent.h"
CFFL_RadioButton::CFFL_RadioButton(CPDFDoc_Environment* pApp,
CPDFSDK_Annot* pWidget)
diff --git a/fpdfsdk/formfiller/cffl_textfield.cpp b/fpdfsdk/formfiller/cffl_textfield.cpp
index 369bb4d..15bfbc8 100644
--- a/fpdfsdk/formfiller/cffl_textfield.cpp
+++ b/fpdfsdk/formfiller/cffl_textfield.cpp
@@ -7,9 +7,9 @@
#include "fpdfsdk/formfiller/cffl_textfield.h"
#include "fpdfsdk/formfiller/cba_fontmap.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
#include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
CFFL_TextField::CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot)
: CFFL_FormFiller(pApp, pAnnot) {}
diff --git a/fpdfsdk/fpdfformfill.cpp b/fpdfsdk/fpdfformfill.cpp
index 2ac6c60..8658584 100644
--- a/fpdfsdk/fpdfformfill.cpp
+++ b/fpdfsdk/fpdfformfill.cpp
@@ -15,10 +15,14 @@
#include "core/fpdfdoc/include/cpdf_formcontrol.h"
#include "core/fpdfdoc/include/cpdf_formfield.h"
#include "core/fpdfdoc/include/cpdf_interform.h"
+#include "core/fpdfdoc/include/cpdf_occontext.h"
#include "core/fxge/include/cfx_fxgedevice.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/fsdk_actionhandler.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "public/fpdfview.h"
#include "third_party/base/stl_util.h"
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index 4e20751..76540fc 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -18,14 +18,15 @@
#include "core/fpdfapi/include/cpdf_pagerendercontext.h"
#include "core/fpdfdoc/include/cpdf_annotlist.h"
#include "core/fpdfdoc/include/cpdf_nametree.h"
+#include "core/fpdfdoc/include/cpdf_occontext.h"
#include "core/fpdfdoc/include/cpdf_viewerpreferences.h"
#include "core/fxcodec/include/fx_codec.h"
#include "core/fxcrt/include/fx_memory.h"
#include "core/fxcrt/include/fx_safe_types.h"
#include "core/fxge/include/cfx_fxgedevice.h"
#include "core/fxge/include/cfx_gemodule.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/include/fsdk_pauseadapter.h"
#include "fpdfsdk/javascript/ijs_runtime.h"
#include "public/fpdf_ext.h"
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
index b829246..9f89a14 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
@@ -7,8 +7,8 @@
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "xfa/fxbarcode/include/BC_Library.h"
#include "xfa/fxfa/include/xfa_ffapp.h"
#include "xfa/fxfa/include/xfa_fontmgr.h"
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_doc.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_doc.cpp
index d4c43c5..63f4bb9 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_doc.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_doc.cpp
@@ -13,9 +13,11 @@
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
-#include "fpdfsdk/include/fsdk_define.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/fsdk_define.h"
#include "fpdfsdk/javascript/ijs_runtime.h"
#include "public/fpdf_formfill.h"
#include "xfa/fxfa/include/cxfa_eventparam.h"
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
index 8c4301f..451175a 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
@@ -6,11 +6,12 @@
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "public/fpdf_formfill.h"
#include "xfa/fxfa/include/xfa_ffdocview.h"
#include "xfa/fxfa/include/xfa_ffpageview.h"
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_util.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_util.cpp
index 9971f5d..b3a77a8 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_util.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_util.cpp
@@ -8,8 +8,8 @@
#include <vector>
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
std::vector<CFWL_TimerInfo*>* CXFA_FWLAdapterTimerMgr::s_TimerArray = nullptr;
diff --git a/fpdfsdk/fsdk_actionhandler.cpp b/fpdfsdk/fsdk_actionhandler.cpp
index c755d72..8168d4a 100644
--- a/fpdfsdk/fsdk_actionhandler.cpp
+++ b/fpdfsdk/fsdk_actionhandler.cpp
@@ -11,9 +11,10 @@
#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
#include "core/fpdfdoc/include/cpdf_formfield.h"
#include "core/fpdfdoc/include/cpdf_interform.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/ijs_context.h"
#include "fpdfsdk/javascript/ijs_runtime.h"
#include "third_party/base/stl_util.h"
diff --git a/fpdfsdk/fsdk_baseform_embeddertest.cpp b/fpdfsdk/fsdk_baseform_embeddertest.cpp
index 53611ae..1bb081d 100644
--- a/fpdfsdk/fsdk_baseform_embeddertest.cpp
+++ b/fpdfsdk/fsdk_baseform_embeddertest.cpp
@@ -3,8 +3,9 @@
// found in the LICENSE file.
#include "fpdfsdk/include/cba_annotiterator.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "testing/embedder_test.h"
#include "testing/embedder_test_mock_delegate.h"
#include "testing/embedder_test_timer_handling_delegate.h"
diff --git a/fpdfsdk/fsdk_mgr.cpp b/fpdfsdk/fsdk_mgr.cpp
deleted file mode 100644
index c8f387e..0000000
--- a/fpdfsdk/fsdk_mgr.cpp
+++ /dev/null
@@ -1,1045 +0,0 @@
-// Copyright 2014 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
-
-#include "fpdfsdk/include/fsdk_mgr.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
-#include "core/fpdfdoc/include/cpdf_docjsactions.h"
-#include "core/fpdfdoc/include/cpdf_interform.h"
-#include "core/fxcrt/include/cfx_retain_ptr.h"
-#include "core/fxge/include/cfx_renderdevice.h"
-#include "fpdfsdk/formfiller/cffl_formfiller.h"
-#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
-#include "fpdfsdk/include/cpdfsdk_annotiterator.h"
-#include "fpdfsdk/include/cpdfsdk_interform.h"
-#include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/ipdfsdk_annothandler.h"
-#include "fpdfsdk/javascript/ijs_runtime.h"
-#include "public/fpdf_ext.h"
-#include "third_party/base/stl_util.h"
-
-#ifdef PDF_ENABLE_XFA
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
-#include "xfa/fxfa/include/xfa_ffdocview.h"
-#include "xfa/fxfa/include/xfa_ffpageview.h"
-#include "xfa/fxfa/include/xfa_ffwidgethandler.h"
-#include "xfa/fxfa/include/xfa_rendercontext.h"
-#include "xfa/fxgraphics/include/cfx_graphics.h"
-#endif // PDF_ENABLE_XFA
-
-#if _FX_OS_ == _FX_ANDROID_
-#include "time.h"
-#else
-#include <ctime>
-#endif
-
-namespace {
-
-// NOTE: |bsUTF16LE| must outlive the use of the result. Care must be taken
-// since modifying the result would impact |bsUTF16LE|.
-FPDF_WIDESTRING AsFPDFWideString(CFX_ByteString* bsUTF16LE) {
- return reinterpret_cast<FPDF_WIDESTRING>(
- bsUTF16LE->GetBuffer(bsUTF16LE->GetLength()));
-}
-
-} // namespace
-
-CPDFDoc_Environment::CPDFDoc_Environment(UnderlyingDocumentType* pDoc,
- FPDF_FORMFILLINFO* pFFinfo)
- : m_pInfo(pFFinfo), m_pSDKDoc(nullptr), m_pUnderlyingDoc(pDoc) {
- m_pSysHandler.reset(new CFX_SystemHandler(this));
-}
-
-CPDFDoc_Environment::~CPDFDoc_Environment() {
-#ifdef PDF_ENABLE_XFA
- CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance();
- if (pProvider->m_pEnvList.GetSize() == 0)
- pProvider->SetJavaScriptInitialized(FALSE);
-#endif // PDF_ENABLE_XFA
- if (m_pInfo && m_pInfo->Release)
- m_pInfo->Release(m_pInfo);
-}
-
-int CPDFDoc_Environment::JS_appAlert(const FX_WCHAR* Msg,
- const FX_WCHAR* Title,
- FX_UINT Type,
- FX_UINT Icon) {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->app_alert) {
- return -1;
- }
- CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
- CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
- return m_pInfo->m_pJsPlatform->app_alert(
- m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsMsg),
- AsFPDFWideString(&bsTitle), Type, Icon);
-}
-
-int CPDFDoc_Environment::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) {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->app_response) {
- return -1;
- }
- CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode();
- CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
- CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode();
- CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode();
- return m_pInfo->m_pJsPlatform->app_response(
- m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsQuestion),
- AsFPDFWideString(&bsTitle), AsFPDFWideString(&bsDefault),
- AsFPDFWideString(&bsLabel), bPassword, response, length);
-}
-
-void CPDFDoc_Environment::JS_appBeep(int nType) {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->app_beep) {
- return;
- }
- m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType);
-}
-
-CFX_WideString CPDFDoc_Environment::JS_fieldBrowse() {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->Field_browse) {
- return CFX_WideString();
- }
- const int nRequiredLen =
- m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, nullptr, 0);
- if (nRequiredLen <= 0)
- return CFX_WideString();
-
- std::unique_ptr<char[]> pBuff(new char[nRequiredLen]);
- memset(pBuff.get(), 0, nRequiredLen);
- const int nActualLen = m_pInfo->m_pJsPlatform->Field_browse(
- m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen);
- if (nActualLen <= 0 || nActualLen > nRequiredLen)
- return CFX_WideString();
-
- return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen));
-}
-
-CFX_WideString CPDFDoc_Environment::JS_docGetFilePath() {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->Doc_getFilePath) {
- return CFX_WideString();
- }
- const int nRequiredLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(
- m_pInfo->m_pJsPlatform, nullptr, 0);
- if (nRequiredLen <= 0)
- return CFX_WideString();
-
- std::unique_ptr<char[]> pBuff(new char[nRequiredLen]);
- memset(pBuff.get(), 0, nRequiredLen);
- const int nActualLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(
- m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen);
- if (nActualLen <= 0 || nActualLen > nRequiredLen)
- return CFX_WideString();
-
- return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen));
-}
-
-void CPDFDoc_Environment::JS_docSubmitForm(void* formData,
- int length,
- const FX_WCHAR* URL) {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->Doc_submitForm) {
- return;
- }
- CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode();
- m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData,
- length,
- AsFPDFWideString(&bsDestination));
-}
-
-void CPDFDoc_Environment::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) {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->Doc_mail) {
- return;
- }
- CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode();
- CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode();
- CFX_ByteString bsCC = CFX_WideString(CC).UTF16LE_Encode();
- CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode();
- CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
- m_pInfo->m_pJsPlatform->Doc_mail(
- m_pInfo->m_pJsPlatform, mailData, length, bUI, AsFPDFWideString(&bsTo),
- AsFPDFWideString(&bsSubject), AsFPDFWideString(&bsCC),
- AsFPDFWideString(&bsBcc), AsFPDFWideString(&bsMsg));
-}
-
-void CPDFDoc_Environment::JS_docprint(FPDF_BOOL bUI,
- int nStart,
- int nEnd,
- FPDF_BOOL bSilent,
- FPDF_BOOL bShrinkToFit,
- FPDF_BOOL bPrintAsImage,
- FPDF_BOOL bReverse,
- FPDF_BOOL bAnnotations) {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->Doc_print) {
- return;
- }
- m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd,
- bSilent, bShrinkToFit, bPrintAsImage,
- bReverse, bAnnotations);
-}
-
-void CPDFDoc_Environment::JS_docgotoPage(int nPageNum) {
- if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
- !m_pInfo->m_pJsPlatform->Doc_gotoPage) {
- return;
- }
- m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum);
-}
-
-IJS_Runtime* CPDFDoc_Environment::GetJSRuntime() {
- if (!IsJSInitiated())
- return nullptr;
- if (!m_pJSRuntime)
- m_pJSRuntime.reset(IJS_Runtime::Create(this));
- return m_pJSRuntime.get();
-}
-
-CPDFSDK_AnnotHandlerMgr* CPDFDoc_Environment::GetAnnotHandlerMgr() {
- if (!m_pAnnotHandlerMgr)
- m_pAnnotHandlerMgr.reset(new CPDFSDK_AnnotHandlerMgr(this));
- return m_pAnnotHandlerMgr.get();
-}
-
-CPDFSDK_ActionHandler* CPDFDoc_Environment::GetActionHander() {
- if (!m_pActionHandler)
- m_pActionHandler.reset(new CPDFSDK_ActionHandler());
- return m_pActionHandler.get();
-}
-
-CFFL_IFormFiller* CPDFDoc_Environment::GetIFormFiller() {
- if (!m_pIFormFiller)
- m_pIFormFiller.reset(new CFFL_IFormFiller(this));
- return m_pIFormFiller.get();
-}
-
-// static
-CPDFSDK_Document* CPDFSDK_Document::FromFPDFFormHandle(
- FPDF_FORMHANDLE hHandle) {
- CPDFDoc_Environment* pEnv = static_cast<CPDFDoc_Environment*>(hHandle);
- return pEnv ? pEnv->GetSDKDocument() : nullptr;
-}
-
-CPDFSDK_Document::CPDFSDK_Document(UnderlyingDocumentType* pDoc,
- CPDFDoc_Environment* pEnv)
- : m_pDoc(pDoc),
- m_pFocusAnnot(nullptr),
- m_pEnv(pEnv),
- m_bChangeMask(FALSE),
- m_bBeingDestroyed(FALSE) {}
-
-CPDFSDK_Document::~CPDFSDK_Document() {
- m_bBeingDestroyed = TRUE;
-
- for (auto& it : m_pageMap)
- it.second->KillFocusAnnotIfNeeded();
-
- for (auto& it : m_pageMap)
- delete it.second;
- m_pageMap.clear();
-}
-
-CPDFSDK_PageView* CPDFSDK_Document::GetPageView(
- UnderlyingPageType* pUnderlyingPage,
- bool ReNew) {
- auto it = m_pageMap.find(pUnderlyingPage);
- if (it != m_pageMap.end())
- return it->second;
-
- if (!ReNew)
- return nullptr;
-
- CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage);
- m_pageMap[pUnderlyingPage] = pPageView;
- // Delay to load all the annotations, to avoid endless loop.
- pPageView->LoadFXAnnots();
- return pPageView;
-}
-
-CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView() {
- UnderlyingPageType* pPage =
- UnderlyingFromFPDFPage(m_pEnv->FFI_GetCurrentPage(m_pDoc));
- return pPage ? GetPageView(pPage, true) : nullptr;
-}
-
-CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex) {
- UnderlyingPageType* pTempPage =
- UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
- if (!pTempPage)
- return nullptr;
-
- auto it = m_pageMap.find(pTempPage);
- return it != m_pageMap.end() ? it->second : nullptr;
-}
-
-void CPDFSDK_Document::ProcJavascriptFun() {
- CPDF_Document* pPDFDoc = GetPDFDocument();
- CPDF_DocJSActions docJS(pPDFDoc);
- int iCount = docJS.CountJSActions();
- if (iCount < 1)
- return;
- for (int i = 0; i < iCount; i++) {
- CFX_ByteString csJSName;
- CPDF_Action jsAction = docJS.GetJSAction(i, csJSName);
- if (m_pEnv->GetActionHander())
- m_pEnv->GetActionHander()->DoAction_JavaScript(
- jsAction, CFX_WideString::FromLocal(csJSName.AsStringC()), this);
- }
-}
-
-FX_BOOL CPDFSDK_Document::ProcOpenAction() {
- if (!m_pDoc)
- return FALSE;
-
- CPDF_Dictionary* pRoot = GetPDFDocument()->GetRoot();
- if (!pRoot)
- return FALSE;
-
- CPDF_Object* pOpenAction = pRoot->GetDictBy("OpenAction");
- if (!pOpenAction)
- pOpenAction = pRoot->GetArrayBy("OpenAction");
-
- if (!pOpenAction)
- return FALSE;
-
- if (pOpenAction->IsArray())
- return TRUE;
-
- if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) {
- CPDF_Action action(pDict);
- if (m_pEnv->GetActionHander())
- m_pEnv->GetActionHander()->DoAction_DocOpen(action, this);
- return TRUE;
- }
- return FALSE;
-}
-
-CPDF_OCContext* CPDFSDK_Document::GetOCContext() {
- if (!m_pOccontent) {
- m_pOccontent.reset(
- new CPDF_OCContext(GetPDFDocument(), CPDF_OCContext::View));
- }
- return m_pOccontent.get();
-}
-
-void CPDFSDK_Document::RemovePageView(UnderlyingPageType* pUnderlyingPage) {
- auto it = m_pageMap.find(pUnderlyingPage);
- if (it == m_pageMap.end())
- return;
-
- CPDFSDK_PageView* pPageView = it->second;
- if (pPageView->IsLocked())
- return;
-
- // This must happen before we remove |pPageView| from the map because
- // |KillFocusAnnotIfNeeded| can call into the |GetPage| method which will
- // look for this page view in the map, if it doesn't find it a new one will
- // be created. We then have two page views pointing to the same page and
- // bad things happen.
- pPageView->KillFocusAnnotIfNeeded();
-
- // Remove the page from the map to make sure we don't accidentally attempt
- // to use the |pPageView| while we're cleaning it up.
- m_pageMap.erase(it);
-
- delete pPageView;
-}
-
-UnderlyingPageType* CPDFSDK_Document::GetPage(int nIndex) {
- return UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
-}
-
-CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm() {
- if (!m_pInterForm)
- m_pInterForm.reset(new CPDFSDK_InterForm(this));
- return m_pInterForm.get();
-}
-
-void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender,
- CPDFSDK_Annot* pAnnot) {
- for (const auto& it : m_pageMap) {
- CPDFSDK_PageView* pPageView = it.second;
- if (pPageView != pSender) {
- pPageView->UpdateView(pAnnot);
- }
- }
-}
-
-CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot() {
- return m_pFocusAnnot;
-}
-
-FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
- if (m_bBeingDestroyed)
- return FALSE;
-
- if (m_pFocusAnnot == pAnnot)
- return TRUE;
-
- if (m_pFocusAnnot) {
- if (!KillFocusAnnot(nFlag))
- return FALSE;
- }
-
- if (!pAnnot)
- return FALSE;
-
-#ifdef PDF_ENABLE_XFA
- CPDFSDK_Annot* pLastFocusAnnot = m_pFocusAnnot;
-#endif // PDF_ENABLE_XFA
- CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
- if (pPageView && pPageView->IsValid()) {
- CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
- if (!m_pFocusAnnot) {
-#ifdef PDF_ENABLE_XFA
- if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, pLastFocusAnnot))
- return FALSE;
-#endif // PDF_ENABLE_XFA
- if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, nFlag))
- return FALSE;
- if (!m_pFocusAnnot) {
- m_pFocusAnnot = pAnnot;
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-
-FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag) {
- if (m_pFocusAnnot) {
- CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
- CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
- m_pFocusAnnot = nullptr;
-
-#ifdef PDF_ENABLE_XFA
- if (!pAnnotHandler->Annot_OnChangeFocus(nullptr, pFocusAnnot))
- return FALSE;
-#endif // PDF_ENABLE_XFA
-
- if (pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag)) {
- if (pFocusAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET) {
- CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;
- int nFieldType = pWidget->GetFieldType();
- if (FIELDTYPE_TEXTFIELD == nFieldType ||
- FIELDTYPE_COMBOBOX == nFieldType) {
- m_pEnv->FFI_OnSetFieldInputFocus(nullptr, nullptr, 0, FALSE);
- }
- }
-
- if (!m_pFocusAnnot)
- return TRUE;
- } else {
- m_pFocusAnnot = pFocusAnnot;
- }
- }
- return FALSE;
-}
-
-void CPDFSDK_Document::OnCloseDocument() {
- KillFocusAnnot();
-}
-
-FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag) {
- return GetPDFDocument()->GetUserPermissions() & nFlag;
-}
-
-IJS_Runtime* CPDFSDK_Document::GetJsRuntime() {
- return m_pEnv->GetJSRuntime();
-}
-
-CFX_WideString CPDFSDK_Document::GetPath() {
- return m_pEnv->JS_docGetFilePath();
-}
-
-CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,
- UnderlyingPageType* page)
- : m_page(page),
- m_pSDKDoc(pSDKDoc),
- m_CaptureWidget(nullptr),
-#ifndef PDF_ENABLE_XFA
- m_bOwnsPage(false),
-#endif // PDF_ENABLE_XFA
- m_bEnterWidget(FALSE),
- m_bExitWidget(FALSE),
- m_bOnWidget(FALSE),
- m_bValid(FALSE),
- m_bLocked(FALSE) {
- CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();
- if (pInterForm) {
- CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
-#ifdef PDF_ENABLE_XFA
- if (page->GetPDFPage())
- pPDFInterForm->FixPageFields(page->GetPDFPage());
-#else // PDF_ENABLE_XFA
- pPDFInterForm->FixPageFields(page);
-#endif // PDF_ENABLE_XFA
- }
-#ifndef PDF_ENABLE_XFA
- m_page->SetView(this);
-#endif // PDF_ENABLE_XFA
-}
-
-CPDFSDK_PageView::~CPDFSDK_PageView() {
-#ifndef PDF_ENABLE_XFA
- // The call to |ReleaseAnnot| can cause the page pointed to by |m_page| to
- // be freed, which will cause issues if we try to cleanup the pageview pointer
- // in |m_page|. So, reset the pageview pointer before doing anything else.
- m_page->SetView(nullptr);
-#endif // PDF_ENABLE_XFA
-
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
- pAnnotHandlerMgr->ReleaseAnnot(pAnnot);
-
- m_fxAnnotArray.clear();
- m_pAnnotList.reset();
-
-#ifndef PDF_ENABLE_XFA
- if (m_bOwnsPage)
- delete m_page;
-#endif // PDF_ENABLE_XFA
-}
-
-void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice,
- CFX_Matrix* pUser2Device,
-#ifdef PDF_ENABLE_XFA
- CPDF_RenderOptions* pOptions,
- const FX_RECT& pClip) {
-#else
- CPDF_RenderOptions* pOptions) {
-#endif // PDF_ENABLE_XFA
- m_curMatrix = *pUser2Device;
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-
-#ifdef PDF_ENABLE_XFA
- CPDFXFA_Page* pPage = GetPDFXFAPage();
- if (!pPage)
- return;
-
- if (pPage->GetDocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) {
- CFX_Graphics gs;
- gs.Create(pDevice);
- CFX_RectF rectClip;
- rectClip.Set(static_cast<FX_FLOAT>(pClip.left),
- static_cast<FX_FLOAT>(pClip.top),
- static_cast<FX_FLOAT>(pClip.Width()),
- static_cast<FX_FLOAT>(pClip.Height()));
- gs.SetClipRect(rectClip);
- std::unique_ptr<CXFA_RenderContext> pRenderContext(new CXFA_RenderContext);
- CXFA_RenderOptions renderOptions;
- renderOptions.m_bHighlight = TRUE;
- CXFA_FFPageView* xfaView = pPage->GetXFAPageView();
- pRenderContext->StartRender(xfaView, &gs, *pUser2Device, renderOptions);
- pRenderContext->DoRender();
- pRenderContext->StopRender();
- CXFA_FFDocView* docView = xfaView->GetDocView();
- if (!docView)
- return;
- CPDFSDK_Annot* annot = GetFocusAnnot();
- if (!annot)
- return;
- // Render the focus widget
- docView->GetWidgetHandler()->RenderWidget(annot->GetXFAWidget(), &gs,
- pUser2Device, FALSE);
- return;
- }
-#endif // PDF_ENABLE_XFA
-
- // for pdf/static xfa.
- CPDFSDK_AnnotIterator annotIterator(this, true);
- while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device,
- pOptions->m_bDrawAnnots);
- }
-}
-
-const CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX,
- FX_FLOAT pageY) {
- for (const auto& pAnnot : m_pAnnotList->All()) {
- CFX_FloatRect annotRect = pAnnot->GetRect();
- if (annotRect.Contains(pageX, pageY))
- return pAnnot.get();
- }
- return nullptr;
-}
-
-const CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX,
- FX_FLOAT pageY) {
- for (const auto& pAnnot : m_pAnnotList->All()) {
- if (pAnnot->GetSubtype() == CPDF_Annot::Subtype::WIDGET) {
- CFX_FloatRect annotRect = pAnnot->GetRect();
- if (annotRect.Contains(pageX, pageY))
- return pAnnot.get();
- }
- }
- return nullptr;
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX,
- FX_FLOAT pageY) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
- CPDFSDK_AnnotIterator annotIterator(this, false);
- while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
- CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
- if (pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP)
- continue;
- if (rc.Contains(pageX, pageY))
- return pSDKAnnot;
- }
-
- return nullptr;
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX,
- FX_FLOAT pageY) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
- CPDFSDK_AnnotIterator annotIterator(this, false);
- while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
- bool bHitTest = pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET;
-#ifdef PDF_ENABLE_XFA
- bHitTest = bHitTest ||
- pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::XFAWIDGET;
-#endif // PDF_ENABLE_XFA
- if (bHitTest) {
- pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
- CFX_FloatPoint point(pageX, pageY);
- if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point))
- return pSDKAnnot;
- }
- }
-
- return nullptr;
-}
-
-void CPDFSDK_PageView::KillFocusAnnotIfNeeded() {
- // if there is a focused annot on the page, we should kill the focus first.
- if (CPDFSDK_Annot* focusedAnnot = m_pSDKDoc->GetFocusAnnot()) {
- if (pdfium::ContainsValue(m_fxAnnotArray, focusedAnnot))
- KillFocusAnnot();
- }
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot* pPDFAnnot) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- ASSERT(pEnv);
- CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
- CPDFSDK_Annot* pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
- if (!pSDKAnnot)
- return nullptr;
-
- m_fxAnnotArray.push_back(pSDKAnnot);
- pAnnotHandler->Annot_OnCreate(pSDKAnnot);
- return pSDKAnnot;
-}
-
-#ifdef PDF_ENABLE_XFA
-CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CXFA_FFWidget* pPDFAnnot) {
- if (!pPDFAnnot)
- return nullptr;
-
- CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot);
- if (pSDKAnnot)
- return pSDKAnnot;
-
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
- pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
- if (!pSDKAnnot)
- return nullptr;
-
- m_fxAnnotArray.push_back(pSDKAnnot);
- return pSDKAnnot;
-}
-#endif // PDF_ENABLE_XFA
-
-CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary* pDict) {
- return pDict ? AddAnnot(pDict->GetStringBy("Subtype").c_str(), pDict)
- : nullptr;
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(const FX_CHAR* lpSubType,
- CPDF_Dictionary* pDict) {
- return nullptr;
-}
-
-FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) {
-#ifdef PDF_ENABLE_XFA
- if (!pAnnot)
- return FALSE;
- CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage();
- if (!pPage || (pPage->GetDocument()->GetDocType() != DOCTYPE_STATIC_XFA &&
- pPage->GetDocument()->GetDocType() != DOCTYPE_DYNAMIC_XFA))
- return FALSE;
-
- if (GetFocusAnnot() == pAnnot)
- KillFocusAnnot();
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
- if (pAnnotHandler)
- pAnnotHandler->ReleaseAnnot(pAnnot);
-
- auto it = std::find(m_fxAnnotArray.begin(), m_fxAnnotArray.end(), pAnnot);
- if (it != m_fxAnnotArray.end())
- m_fxAnnotArray.erase(it);
- if (m_CaptureWidget == pAnnot)
- m_CaptureWidget = nullptr;
-
- return TRUE;
-#else // PDF_ENABLE_XFA
- return FALSE;
-#endif // PDF_ENABLE_XFA
-}
-
-CPDF_Document* CPDFSDK_PageView::GetPDFDocument() {
- if (m_page) {
-#ifdef PDF_ENABLE_XFA
- return m_page->GetDocument()->GetPDFDoc();
-#else // PDF_ENABLE_XFA
- return m_page->m_pDocument;
-#endif // PDF_ENABLE_XFA
- }
- return nullptr;
-}
-
-CPDF_Page* CPDFSDK_PageView::GetPDFPage() const {
-#ifdef PDF_ENABLE_XFA
- return m_page ? m_page->GetPDFPage() : nullptr;
-#else // PDF_ENABLE_XFA
- return m_page;
-#endif // PDF_ENABLE_XFA
-}
-
-size_t CPDFSDK_PageView::CountAnnots() const {
- return m_fxAnnotArray.size();
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(size_t nIndex) {
- return nIndex < m_fxAnnotArray.size() ? m_fxAnnotArray[nIndex] : nullptr;
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) {
- for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
- if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict)
- return pAnnot;
- }
- return nullptr;
-}
-
-#ifdef PDF_ENABLE_XFA
-CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(CXFA_FFWidget* hWidget) {
- if (!hWidget)
- return nullptr;
-
- for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
- if (pAnnot->GetXFAWidget() == hWidget)
- return pAnnot;
- }
- return nullptr;
-}
-#endif // PDF_ENABLE_XFA
-
-FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CFX_FloatPoint& point,
- FX_UINT nFlag) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- ASSERT(pEnv);
- CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
- if (!pFXAnnot) {
- KillFocusAnnot(nFlag);
- return FALSE;
- }
-
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- FX_BOOL bRet =
- pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag, point);
- if (bRet)
- SetFocusAnnot(pFXAnnot);
- return bRet;
-}
-
-#ifdef PDF_ENABLE_XFA
-FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point,
- FX_UINT nFlag) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- ASSERT(pEnv);
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- ASSERT(pAnnotHandlerMgr);
-
- CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
-
- if (!pFXAnnot)
- return FALSE;
-
- if (pAnnotHandlerMgr->Annot_OnRButtonDown(this, pFXAnnot, nFlag, point))
- SetFocusAnnot(pFXAnnot);
-
- return TRUE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point,
- FX_UINT nFlag) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- ASSERT(pEnv);
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-
- CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
-
- if (!pFXAnnot)
- return FALSE;
-
- if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, pFXAnnot, nFlag, point))
- SetFocusAnnot(pFXAnnot);
-
- return TRUE;
-}
-#endif // PDF_ENABLE_XFA
-
-FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CFX_FloatPoint& point,
- FX_UINT nFlag) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- ASSERT(pEnv);
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
- CPDFSDK_Annot* pFocusAnnot = GetFocusAnnot();
- FX_BOOL bRet = FALSE;
- if (pFocusAnnot && pFocusAnnot != pFXAnnot) {
- // Last focus Annot gets a chance to handle the event.
- bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag, point);
- }
- if (pFXAnnot && !bRet)
- bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag, point);
- return bRet;
-}
-
-FX_BOOL CPDFSDK_PageView::OnMouseMove(const CFX_FloatPoint& point, int nFlag) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- if (CPDFSDK_Annot* pFXAnnot = GetFXAnnotAtPoint(point.x, point.y)) {
- if (m_CaptureWidget && m_CaptureWidget != pFXAnnot) {
- m_bExitWidget = TRUE;
- m_bEnterWidget = FALSE;
- pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
- }
- m_CaptureWidget = pFXAnnot;
- m_bOnWidget = TRUE;
- if (!m_bEnterWidget) {
- m_bEnterWidget = TRUE;
- m_bExitWidget = FALSE;
- pAnnotHandlerMgr->Annot_OnMouseEnter(this, pFXAnnot, nFlag);
- }
- pAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point);
- return TRUE;
- }
- if (m_bOnWidget) {
- m_bOnWidget = FALSE;
- m_bExitWidget = TRUE;
- m_bEnterWidget = FALSE;
- if (m_CaptureWidget) {
- pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
- m_CaptureWidget = nullptr;
- }
- }
- return FALSE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX,
- double deltaY,
- const CFX_FloatPoint& point,
- int nFlag) {
- if (CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y)) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- return pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag,
- (int)deltaY, point);
- }
- return FALSE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnChar(int nChar, FX_UINT nFlag) {
- if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- return pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag);
- }
-
- return FALSE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag) {
- if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
- return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag);
- }
- return FALSE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag) {
- return FALSE;
-}
-
-void CPDFSDK_PageView::LoadFXAnnots() {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-
- SetLock(TRUE);
-
-#ifdef PDF_ENABLE_XFA
- CFX_RetainPtr<CPDFXFA_Page> protector(m_page);
- if (m_pSDKDoc->GetXFADocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) {
- CXFA_FFPageView* pageView = m_page->GetXFAPageView();
- std::unique_ptr<IXFA_WidgetIterator> pWidgetHander(
- pageView->CreateWidgetIterator(
- XFA_TRAVERSEWAY_Form,
- XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable));
- if (!pWidgetHander) {
- SetLock(FALSE);
- return;
- }
-
- while (CXFA_FFWidget* pXFAAnnot = pWidgetHander->MoveToNext()) {
- CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this);
- if (!pAnnot)
- continue;
- m_fxAnnotArray.push_back(pAnnot);
- pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
- }
-
- SetLock(FALSE);
- return;
- }
-#endif // PDF_ENABLE_XFA
-
- CPDF_Page* pPage = GetPDFPage();
- ASSERT(pPage);
- FX_BOOL bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled();
- // Disable the default AP construction.
- CPDF_InterForm::SetUpdateAP(FALSE);
- m_pAnnotList.reset(new CPDF_AnnotList(pPage));
- CPDF_InterForm::SetUpdateAP(bUpdateAP);
-
- const size_t nCount = m_pAnnotList->Count();
- for (size_t i = 0; i < nCount; ++i) {
- CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
- CheckUnSupportAnnot(GetPDFDocument(), pPDFAnnot);
- CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
- if (!pAnnot)
- continue;
- m_fxAnnotArray.push_back(pAnnot);
- pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
- }
-
- SetLock(FALSE);
-}
-
-void CPDFSDK_PageView::ClearFXAnnots() {
- SetLock(TRUE);
- if (m_pSDKDoc && GetFocusAnnot())
- m_pSDKDoc->SetFocusAnnot(nullptr);
- m_CaptureWidget = nullptr;
- for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
- m_pSDKDoc->GetEnv()->GetAnnotHandlerMgr()->ReleaseAnnot(pAnnot);
- m_fxAnnotArray.clear();
- m_pAnnotList.reset();
- SetLock(FALSE);
-}
-
-void CPDFSDK_PageView::UpdateRects(const std::vector<CFX_FloatRect>& rects) {
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- for (const auto& rc : rects)
- pEnv->FFI_Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom);
-}
-
-void CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot) {
- CFX_FloatRect rcWindow = pAnnot->GetRect();
- CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
- pEnv->FFI_Invalidate(m_page, rcWindow.left, rcWindow.top, rcWindow.right,
- rcWindow.bottom);
-}
-
-int CPDFSDK_PageView::GetPageIndex() const {
- if (!m_page)
- return -1;
-
-#ifdef PDF_ENABLE_XFA
- int nDocType = m_page->GetDocument()->GetDocType();
- switch (nDocType) {
- case DOCTYPE_DYNAMIC_XFA: {
- CXFA_FFPageView* pPageView = m_page->GetXFAPageView();
- return pPageView ? pPageView->GetPageIndex() : -1;
- }
- case DOCTYPE_STATIC_XFA:
- case DOCTYPE_PDF:
- return GetPageIndexForStaticPDF();
- default:
- return -1;
- }
-#else // PDF_ENABLE_XFA
- return GetPageIndexForStaticPDF();
-#endif // PDF_ENABLE_XFA
-}
-
-bool CPDFSDK_PageView::IsValidAnnot(const CPDF_Annot* p) const {
- if (!p)
- return false;
-
- const auto& annots = m_pAnnotList->All();
- auto it = std::find_if(annots.begin(), annots.end(),
- [p](const std::unique_ptr<CPDF_Annot>& annot) {
- return annot.get() == p;
- });
- return it != annots.end();
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() {
- CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot();
- if (!pFocusAnnot)
- return nullptr;
-
- for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
- if (pAnnot == pFocusAnnot)
- return pAnnot;
- }
- return nullptr;
-}
-
-int CPDFSDK_PageView::GetPageIndexForStaticPDF() const {
- CPDF_Dictionary* pDict = GetPDFPage()->m_pFormDict;
- CPDF_Document* pDoc = m_pSDKDoc->GetPDFDocument();
- return (pDoc && pDict) ? pDoc->GetPageIndex(pDict->GetObjNum()) : -1;
-}
diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/cpdfdoc_environment.h
similarity index 68%
rename from fpdfsdk/include/fsdk_mgr.h
rename to fpdfsdk/include/cpdfdoc_environment.h
index 38b06a9..f6211d2 100644
--- a/fpdfsdk/include/fsdk_mgr.h
+++ b/fpdfsdk/include/cpdfdoc_environment.h
@@ -1,37 +1,28 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// 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_INCLUDE_FSDK_MGR_H_
-#define FPDFSDK_INCLUDE_FSDK_MGR_H_
+#ifndef FPDFSDK_INCLUDE_CPDFDOC_ENVIRONMENT_H_
+#define FPDFSDK_INCLUDE_CPDFDOC_ENVIRONMENT_H_
-#include <map>
#include <memory>
-#include <vector>
#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "core/fpdfdoc/include/cpdf_occontext.h"
#include "core/fxcrt/include/cfx_observable.h"
#include "fpdfsdk/cfx_systemhandler.h"
-#include "fpdfsdk/include/cpdfsdk_annot.h"
-#include "fpdfsdk/include/fsdk_actionhandler.h"
-#include "fpdfsdk/include/fsdk_common.h"
#include "fpdfsdk/include/fsdk_define.h"
#include "public/fpdf_formfill.h"
#include "public/fpdf_fwlevent.h"
class CFFL_IFormFiller;
class CFX_SystemHandler;
-class CPDF_AnnotList;
class CPDFSDK_ActionHandler;
-class CPDFSDK_Annot;
class CPDFSDK_AnnotHandlerMgr;
-class CPDFSDK_InterForm;
-class CPDFSDK_PageView;
-class CPDFSDK_Widget;
+class CPDFSDK_Document;
class IJS_Runtime;
class CPDFDoc_Environment final {
@@ -445,188 +436,4 @@
std::unique_ptr<CFX_SystemHandler> m_pSysHandler;
};
-class CPDFSDK_Document : public CFX_Observable<CPDFSDK_Document> {
- public:
- static CPDFSDK_Document* FromFPDFFormHandle(FPDF_FORMHANDLE hHandle);
-
- CPDFSDK_Document(UnderlyingDocumentType* pDoc, CPDFDoc_Environment* pEnv);
- ~CPDFSDK_Document();
-
- CPDFSDK_InterForm* GetInterForm();
-
- // Gets the document object for the next layer down; for master this is
- // a CPDF_Document, but for XFA it is a CPDFXFA_Document.
- UnderlyingDocumentType* GetUnderlyingDocument() const {
-#ifdef PDF_ENABLE_XFA
- return GetXFADocument();
-#else // PDF_ENABLE_XFA
- return GetPDFDocument();
-#endif // PDF_ENABLE_XFA
- }
-
- // Gets the CPDF_Document, either directly in master, or from the
- // CPDFXFA_Document for XFA.
- CPDF_Document* GetPDFDocument() const {
-#ifdef PDF_ENABLE_XFA
- return m_pDoc ? m_pDoc->GetPDFDoc() : nullptr;
-#else // PDF_ENABLE_XFA
- return m_pDoc;
-#endif // PDF_ENABLE_XFA
- }
-
-#ifdef PDF_ENABLE_XFA
- // Gets the XFA document directly (XFA-only).
- CPDFXFA_Document* GetXFADocument() const { return m_pDoc; }
-
- int GetPageViewCount() const { return m_pageMap.size(); }
-#endif // PDF_ENABLE_XFA
-
- 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();
-
- IJS_Runtime* GetJsRuntime();
-
- FX_BOOL SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag = 0);
- FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0);
-
- FX_BOOL ExtractPages(const std::vector<uint16_t>& arrExtraPages,
- CPDF_Document* pDstDoc);
- FX_BOOL InsertPages(int nInsertAt,
- const CPDF_Document* pSrcDoc,
- const std::vector<uint16_t>& arrSrcPages);
- FX_BOOL ReplacePages(int nPage,
- const CPDF_Document* pSrcDoc,
- const std::vector<uint16_t>& arrSrcPages);
-
- void OnCloseDocument();
-
- int GetPageCount() { return m_pDoc->GetPageCount(); }
- FX_BOOL GetPermissions(int nFlag);
- FX_BOOL GetChangeMark() { return m_bChangeMask; }
- void SetChangeMark() { m_bChangeMask = TRUE; }
- void ClearChangeMark() { m_bChangeMask = FALSE; }
- CFX_WideString GetPath();
- UnderlyingPageType* GetPage(int nIndex);
- CPDFDoc_Environment* GetEnv() { return m_pEnv; }
- void ProcJavascriptFun();
- FX_BOOL ProcOpenAction();
- CPDF_OCContext* GetOCContext();
-
- private:
- std::map<UnderlyingPageType*, CPDFSDK_PageView*> m_pageMap;
- UnderlyingDocumentType* m_pDoc;
- std::unique_ptr<CPDFSDK_InterForm> m_pInterForm;
- CPDFSDK_Annot* m_pFocusAnnot;
- CPDFDoc_Environment* m_pEnv;
- std::unique_ptr<CPDF_OCContext> m_pOccontent;
- FX_BOOL m_bChangeMask;
- FX_BOOL m_bBeingDestroyed;
-};
-
-class CPDFSDK_PageView final : public CPDF_Page::View {
- public:
- CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc, UnderlyingPageType* page);
- ~CPDFSDK_PageView();
-
-#ifdef PDF_ENABLE_XFA
- void PageView_OnDraw(CFX_RenderDevice* pDevice,
- CFX_Matrix* pUser2Device,
- CPDF_RenderOptions* pOptions,
- const FX_RECT& pClip);
-#else // PDF_ENABLE_XFA
- void PageView_OnDraw(CFX_RenderDevice* pDevice,
- CFX_Matrix* pUser2Device,
- CPDF_RenderOptions* pOptions);
-#endif // PDF_ENABLE_XFA
-
- const CPDF_Annot* GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
- CPDFSDK_Annot* GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
- const CPDF_Annot* GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
- CPDFSDK_Annot* GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
- CPDFSDK_Annot* GetFocusAnnot();
- void SetFocusAnnot(CPDFSDK_Annot* pSDKAnnot, FX_UINT nFlag = 0) {
- m_pSDKDoc->SetFocusAnnot(pSDKAnnot, nFlag);
- }
- FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0) {
- return m_pSDKDoc->KillFocusAnnot(nFlag);
- }
- void KillFocusAnnotIfNeeded();
-
- CPDFSDK_Annot* AddAnnot(CPDF_Dictionary* pDict);
- CPDFSDK_Annot* AddAnnot(const FX_CHAR* lpSubType, CPDF_Dictionary* pDict);
- CPDFSDK_Annot* AddAnnot(CPDF_Annot* pPDFAnnot);
-
- FX_BOOL DeleteAnnot(CPDFSDK_Annot* pAnnot);
- size_t CountAnnots() const;
- CPDFSDK_Annot* GetAnnot(size_t nIndex);
- CPDFSDK_Annot* GetAnnotByDict(CPDF_Dictionary* pDict);
-
-#ifdef PDF_ENABLE_XFA
- CPDFSDK_Annot* AddAnnot(CXFA_FFWidget* pPDFAnnot);
- CPDFSDK_Annot* GetAnnotByXFAWidget(CXFA_FFWidget* hWidget);
- CPDFXFA_Page* GetPDFXFAPage() { return m_page; }
-#endif // PDF_ENABLE_XFA
-
- CPDF_Page* GetPDFPage() const;
- CPDF_Document* GetPDFDocument();
- CPDFSDK_Document* GetSDKDocument() { return m_pSDKDoc; }
- FX_BOOL OnLButtonDown(const CFX_FloatPoint& point, FX_UINT nFlag);
- FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, FX_UINT nFlag);
-#ifdef PDF_ENABLE_XFA
- FX_BOOL OnRButtonDown(const CFX_FloatPoint& point, FX_UINT nFlag);
- FX_BOOL OnRButtonUp(const CFX_FloatPoint& point, FX_UINT nFlag);
-#endif // PDF_ENABLE_XFA
- FX_BOOL OnChar(int nChar, FX_UINT nFlag);
- FX_BOOL OnKeyDown(int nKeyCode, int nFlag);
- FX_BOOL OnKeyUp(int nKeyCode, int nFlag);
-
- FX_BOOL OnMouseMove(const CFX_FloatPoint& point, int nFlag);
- FX_BOOL OnMouseWheel(double deltaX,
- double deltaY,
- const CFX_FloatPoint& point,
- int nFlag);
- bool IsValidAnnot(const CPDF_Annot* p) const;
- void GetCurrentMatrix(CFX_Matrix& matrix) { matrix = m_curMatrix; }
- void UpdateRects(const std::vector<CFX_FloatRect>& rects);
- void UpdateView(CPDFSDK_Annot* pAnnot);
- const std::vector<CPDFSDK_Annot*>& GetAnnotList() const {
- return m_fxAnnotArray;
- }
-
- int GetPageIndex() const;
- void LoadFXAnnots();
- void ClearFXAnnots();
- void SetValid(FX_BOOL bValid) { m_bValid = bValid; }
- FX_BOOL IsValid() { return m_bValid; }
- void SetLock(FX_BOOL bLocked) { m_bLocked = bLocked; }
- FX_BOOL IsLocked() { return m_bLocked; }
-#ifndef PDF_ENABLE_XFA
- bool OwnsPage() const { return m_bOwnsPage; }
- void TakePageOwnership() { m_bOwnsPage = true; }
-#endif // PDF_ENABLE_XFA
-
- private:
- int GetPageIndexForStaticPDF() const;
-
- CFX_Matrix m_curMatrix;
- UnderlyingPageType* const m_page;
- std::unique_ptr<CPDF_AnnotList> m_pAnnotList;
- std::vector<CPDFSDK_Annot*> m_fxAnnotArray;
- CPDFSDK_Document* const m_pSDKDoc;
- CPDFSDK_Annot* m_CaptureWidget;
-#ifndef PDF_ENABLE_XFA
- bool m_bOwnsPage;
-#endif // PDF_ENABLE_XFA
- FX_BOOL m_bEnterWidget;
- FX_BOOL m_bExitWidget;
- FX_BOOL m_bOnWidget;
- FX_BOOL m_bValid;
- FX_BOOL m_bLocked;
-};
-
-#endif // FPDFSDK_INCLUDE_FSDK_MGR_H_
+#endif // FPDFSDK_INCLUDE_CPDFDOC_ENVIRONMENT_H_
diff --git a/fpdfsdk/include/cpdfsdk_document.h b/fpdfsdk/include/cpdfsdk_document.h
new file mode 100644
index 0000000..610fb17
--- /dev/null
+++ b/fpdfsdk/include/cpdfsdk_document.h
@@ -0,0 +1,108 @@
+// 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_INCLUDE_CPDFSDK_DOCUMENT_H_
+#define FPDFSDK_INCLUDE_CPDFSDK_DOCUMENT_H_
+
+#include <map>
+#include <memory>
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/fxcrt/include/cfx_observable.h"
+#include "fpdfsdk/include/fsdk_define.h"
+#include "public/fpdf_formfill.h"
+
+class CPDF_OCContext;
+class CPDFDoc_Environment;
+class CPDFSDK_Annot;
+class CPDFSDK_InterForm;
+class CPDFSDK_PageView;
+class IJS_Runtime;
+
+class CPDFSDK_Document : public CFX_Observable<CPDFSDK_Document> {
+ public:
+ static CPDFSDK_Document* FromFPDFFormHandle(FPDF_FORMHANDLE hHandle);
+
+ CPDFSDK_Document(UnderlyingDocumentType* pDoc, CPDFDoc_Environment* pEnv);
+ ~CPDFSDK_Document();
+
+ CPDFSDK_InterForm* GetInterForm();
+
+ // Gets the document object for the next layer down; for master this is
+ // a CPDF_Document, but for XFA it is a CPDFXFA_Document.
+ UnderlyingDocumentType* GetUnderlyingDocument() const {
+#ifdef PDF_ENABLE_XFA
+ return GetXFADocument();
+#else // PDF_ENABLE_XFA
+ return GetPDFDocument();
+#endif // PDF_ENABLE_XFA
+ }
+
+ // Gets the CPDF_Document, either directly in master, or from the
+ // CPDFXFA_Document for XFA.
+ CPDF_Document* GetPDFDocument() const {
+#ifdef PDF_ENABLE_XFA
+ return m_pDoc ? m_pDoc->GetPDFDoc() : nullptr;
+#else // PDF_ENABLE_XFA
+ return m_pDoc;
+#endif // PDF_ENABLE_XFA
+ }
+
+#ifdef PDF_ENABLE_XFA
+ // Gets the XFA document directly (XFA-only).
+ CPDFXFA_Document* GetXFADocument() const { return m_pDoc; }
+
+ int GetPageViewCount() const { return m_pageMap.size(); }
+#endif // PDF_ENABLE_XFA
+
+ 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();
+
+ IJS_Runtime* GetJsRuntime();
+
+ FX_BOOL SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag = 0);
+ FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0);
+
+ FX_BOOL ExtractPages(const std::vector<uint16_t>& arrExtraPages,
+ CPDF_Document* pDstDoc);
+ FX_BOOL InsertPages(int nInsertAt,
+ const CPDF_Document* pSrcDoc,
+ const std::vector<uint16_t>& arrSrcPages);
+ FX_BOOL ReplacePages(int nPage,
+ const CPDF_Document* pSrcDoc,
+ const std::vector<uint16_t>& arrSrcPages);
+
+ void OnCloseDocument();
+
+ int GetPageCount() { return m_pDoc->GetPageCount(); }
+ FX_BOOL GetPermissions(int nFlag);
+ FX_BOOL GetChangeMark() { return m_bChangeMask; }
+ void SetChangeMark() { m_bChangeMask = TRUE; }
+ void ClearChangeMark() { m_bChangeMask = FALSE; }
+ CFX_WideString GetPath();
+ UnderlyingPageType* GetPage(int nIndex);
+ CPDFDoc_Environment* GetEnv() { return m_pEnv; }
+ void ProcJavascriptFun();
+ FX_BOOL ProcOpenAction();
+ CPDF_OCContext* GetOCContext();
+
+ private:
+ std::map<UnderlyingPageType*, CPDFSDK_PageView*> m_pageMap;
+ UnderlyingDocumentType* m_pDoc;
+ std::unique_ptr<CPDFSDK_InterForm> m_pInterForm;
+ CPDFSDK_Annot* m_pFocusAnnot;
+ CPDFDoc_Environment* m_pEnv;
+ std::unique_ptr<CPDF_OCContext> m_pOccontent;
+ FX_BOOL m_bChangeMask;
+ FX_BOOL m_bBeingDestroyed;
+};
+
+#endif // FPDFSDK_INCLUDE_CPDFSDK_DOCUMENT_H_
diff --git a/fpdfsdk/include/cpdfsdk_pageview.h b/fpdfsdk/include/cpdfsdk_pageview.h
new file mode 100644
index 0000000..a496334
--- /dev/null
+++ b/fpdfsdk/include/cpdfsdk_pageview.h
@@ -0,0 +1,122 @@
+// 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_INCLUDE_CPDFSDK_PAGEVIEW_H_
+#define FPDFSDK_INCLUDE_CPDFSDK_PAGEVIEW_H_
+
+#include <memory>
+#include <vector>
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+
+class CFX_RenderDevice;
+class CPDF_AnnotList;
+class CPDF_RenderOptions;
+
+class CPDFSDK_PageView final : public CPDF_Page::View {
+ public:
+ CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc, UnderlyingPageType* page);
+ ~CPDFSDK_PageView();
+
+#ifdef PDF_ENABLE_XFA
+ void PageView_OnDraw(CFX_RenderDevice* pDevice,
+ CFX_Matrix* pUser2Device,
+ CPDF_RenderOptions* pOptions,
+ const FX_RECT& pClip);
+#else // PDF_ENABLE_XFA
+ void PageView_OnDraw(CFX_RenderDevice* pDevice,
+ CFX_Matrix* pUser2Device,
+ CPDF_RenderOptions* pOptions);
+#endif // PDF_ENABLE_XFA
+
+ const CPDF_Annot* GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ const CPDF_Annot* GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFocusAnnot();
+ void SetFocusAnnot(CPDFSDK_Annot* pSDKAnnot, FX_UINT nFlag = 0) {
+ m_pSDKDoc->SetFocusAnnot(pSDKAnnot, nFlag);
+ }
+ FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0) {
+ return m_pSDKDoc->KillFocusAnnot(nFlag);
+ }
+ void KillFocusAnnotIfNeeded();
+
+ CPDFSDK_Annot* AddAnnot(CPDF_Dictionary* pDict);
+ CPDFSDK_Annot* AddAnnot(const FX_CHAR* lpSubType, CPDF_Dictionary* pDict);
+ CPDFSDK_Annot* AddAnnot(CPDF_Annot* pPDFAnnot);
+
+ FX_BOOL DeleteAnnot(CPDFSDK_Annot* pAnnot);
+ size_t CountAnnots() const;
+ CPDFSDK_Annot* GetAnnot(size_t nIndex);
+ CPDFSDK_Annot* GetAnnotByDict(CPDF_Dictionary* pDict);
+
+#ifdef PDF_ENABLE_XFA
+ CPDFSDK_Annot* AddAnnot(CXFA_FFWidget* pPDFAnnot);
+ CPDFSDK_Annot* GetAnnotByXFAWidget(CXFA_FFWidget* hWidget);
+ CPDFXFA_Page* GetPDFXFAPage() { return m_page; }
+#endif // PDF_ENABLE_XFA
+
+ CPDF_Page* GetPDFPage() const;
+ CPDF_Document* GetPDFDocument();
+ CPDFSDK_Document* GetSDKDocument() { return m_pSDKDoc; }
+ FX_BOOL OnLButtonDown(const CFX_FloatPoint& point, FX_UINT nFlag);
+ FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, FX_UINT nFlag);
+#ifdef PDF_ENABLE_XFA
+ FX_BOOL OnRButtonDown(const CFX_FloatPoint& point, FX_UINT nFlag);
+ FX_BOOL OnRButtonUp(const CFX_FloatPoint& point, FX_UINT nFlag);
+#endif // PDF_ENABLE_XFA
+ FX_BOOL OnChar(int nChar, FX_UINT nFlag);
+ FX_BOOL OnKeyDown(int nKeyCode, int nFlag);
+ FX_BOOL OnKeyUp(int nKeyCode, int nFlag);
+
+ FX_BOOL OnMouseMove(const CFX_FloatPoint& point, int nFlag);
+ FX_BOOL OnMouseWheel(double deltaX,
+ double deltaY,
+ const CFX_FloatPoint& point,
+ int nFlag);
+ bool IsValidAnnot(const CPDF_Annot* p) const;
+ void GetCurrentMatrix(CFX_Matrix& matrix) { matrix = m_curMatrix; }
+ void UpdateRects(const std::vector<CFX_FloatRect>& rects);
+ void UpdateView(CPDFSDK_Annot* pAnnot);
+ const std::vector<CPDFSDK_Annot*>& GetAnnotList() const {
+ return m_fxAnnotArray;
+ }
+
+ int GetPageIndex() const;
+ void LoadFXAnnots();
+ void ClearFXAnnots();
+ void SetValid(FX_BOOL bValid) { m_bValid = bValid; }
+ FX_BOOL IsValid() { return m_bValid; }
+ void SetLock(FX_BOOL bLocked) { m_bLocked = bLocked; }
+ FX_BOOL IsLocked() { return m_bLocked; }
+#ifndef PDF_ENABLE_XFA
+ bool OwnsPage() const { return m_bOwnsPage; }
+ void TakePageOwnership() { m_bOwnsPage = true; }
+#endif // PDF_ENABLE_XFA
+
+ private:
+ int GetPageIndexForStaticPDF() const;
+
+ CFX_Matrix m_curMatrix;
+ UnderlyingPageType* const m_page;
+ std::unique_ptr<CPDF_AnnotList> m_pAnnotList;
+ std::vector<CPDFSDK_Annot*> m_fxAnnotArray;
+ CPDFSDK_Document* const m_pSDKDoc;
+ CPDFSDK_Annot* m_CaptureWidget;
+#ifndef PDF_ENABLE_XFA
+ bool m_bOwnsPage;
+#endif // PDF_ENABLE_XFA
+ FX_BOOL m_bEnterWidget;
+ FX_BOOL m_bExitWidget;
+ FX_BOOL m_bOnWidget;
+ FX_BOOL m_bValid;
+ FX_BOOL m_bLocked;
+};
+
+#endif // FPDFSDK_INCLUDE_CPDFSDK_PAGEVIEW_H_
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index fe623e9..cbf155a 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -15,10 +15,12 @@
#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
#include "core/fpdfdoc/include/cpdf_interform.h"
#include "core/fpdfdoc/include/cpdf_nametree.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/include/cpdfsdk_annotiterator.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/Annot.h"
#include "fpdfsdk/javascript/Field.h"
#include "fpdfsdk/javascript/Icon.h"
diff --git a/fpdfsdk/javascript/Document.h b/fpdfsdk/javascript/Document.h
index a35358d..544a042 100644
--- a/fpdfsdk/javascript/Document.h
+++ b/fpdfsdk/javascript/Document.h
@@ -13,7 +13,7 @@
#include "core/fpdfapi/fpdf_page/include/cpdf_pageobject.h"
#include "core/fpdfapi/fpdf_page/include/cpdf_textobject.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/javascript/JS_Define.h"
class PrintParamsObj : public CJS_EmbedObj {
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index 8b9e981..0803cfa 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -13,10 +13,13 @@
#include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "core/fpdfdoc/include/cpdf_interform.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
#include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/Document.h"
#include "fpdfsdk/javascript/Icon.h"
#include "fpdfsdk/javascript/JS_Define.h"
diff --git a/fpdfsdk/javascript/Field.h b/fpdfsdk/javascript/Field.h
index 700302c..56cfd20 100644
--- a/fpdfsdk/javascript/Field.h
+++ b/fpdfsdk/javascript/Field.h
@@ -11,7 +11,7 @@
#include <vector>
#include "core/fxcrt/include/cfx_observable.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/javascript/JS_Define.h"
#include "fpdfsdk/pdfwindow/PWL_Wnd.h" // For CPWL_Color.
diff --git a/fpdfsdk/javascript/JS_Object.cpp b/fpdfsdk/javascript/JS_Object.cpp
index 3de0ece..88dd288 100644
--- a/fpdfsdk/javascript/JS_Object.cpp
+++ b/fpdfsdk/javascript/JS_Object.cpp
@@ -6,7 +6,6 @@
#include "fpdfsdk/javascript/JS_Object.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/JS_Define.h"
#include "fpdfsdk/javascript/cjs_context.h"
diff --git a/fpdfsdk/javascript/JS_Runtime_Stub.cpp b/fpdfsdk/javascript/JS_Runtime_Stub.cpp
index 98c641f..2b4a624 100644
--- a/fpdfsdk/javascript/JS_Runtime_Stub.cpp
+++ b/fpdfsdk/javascript/JS_Runtime_Stub.cpp
@@ -6,7 +6,6 @@
#include <memory>
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/ijs_context.h"
#include "fpdfsdk/javascript/ijs_runtime.h"
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index 749c8d7..5a793f4 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -11,8 +11,9 @@
#include "core/fpdfdoc/include/cpdf_interform.h"
#include "core/fxcrt/include/fx_ext.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/Field.h"
#include "fpdfsdk/javascript/JS_Define.h"
#include "fpdfsdk/javascript/JS_EventHandler.h"
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp
index 1e3ea2f..5e708de 100644
--- a/fpdfsdk/javascript/app.cpp
+++ b/fpdfsdk/javascript/app.cpp
@@ -9,8 +9,9 @@
#include <memory>
#include <vector>
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
#include "fpdfsdk/include/cpdfsdk_interform.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/Document.h"
#include "fpdfsdk/javascript/JS_Define.h"
#include "fpdfsdk/javascript/JS_EventHandler.h"
diff --git a/fpdfsdk/javascript/cjs_runtime.cpp b/fpdfsdk/javascript/cjs_runtime.cpp
index bfed82e..e35ee5b 100644
--- a/fpdfsdk/javascript/cjs_runtime.cpp
+++ b/fpdfsdk/javascript/cjs_runtime.cpp
@@ -8,7 +8,7 @@
#include <algorithm>
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
#include "fpdfsdk/javascript/Annot.h"
#include "fpdfsdk/javascript/Consts.h"
#include "fpdfsdk/javascript/Document.h"
@@ -28,6 +28,7 @@
#include "fpdfsdk/javascript/global.h"
#include "fpdfsdk/javascript/report.h"
#include "fpdfsdk/javascript/util.h"
+#include "public/fpdf_formfill.h"
#include "third_party/base/stl_util.h"
#ifdef PDF_ENABLE_XFA