Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: fpdfsdk/cpdfsdk_document.cpp

Issue 2335243002: Split fsdk_mgr files apart. (Closed)
Patch Set: Sort headers Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "fpdfsdk/include/cpdfsdk_document.h"
8
9 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
11 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
12 #include "core/fpdfapi/fpdf_parser/include/cpdf_object.h"
13 #include "core/fpdfdoc/include/cpdf_action.h"
14 #include "core/fpdfdoc/include/cpdf_docjsactions.h"
15 #include "core/fpdfdoc/include/cpdf_occontext.h"
16 #include "fpdfsdk/include/cpdfdoc_environment.h"
17 #include "fpdfsdk/include/cpdfsdk_annot.h"
18 #include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
19 #include "fpdfsdk/include/cpdfsdk_interform.h"
20 #include "fpdfsdk/include/cpdfsdk_pageview.h"
21 #include "fpdfsdk/include/cpdfsdk_widget.h"
22 #include "fpdfsdk/include/fsdk_actionhandler.h"
23
24 // static
25 CPDFSDK_Document* CPDFSDK_Document::FromFPDFFormHandle(
26 FPDF_FORMHANDLE hHandle) {
27 CPDFDoc_Environment* pEnv = static_cast<CPDFDoc_Environment*>(hHandle);
28 return pEnv ? pEnv->GetSDKDocument() : nullptr;
29 }
30
31 CPDFSDK_Document::CPDFSDK_Document(UnderlyingDocumentType* pDoc,
32 CPDFDoc_Environment* pEnv)
33 : m_pDoc(pDoc),
34 m_pFocusAnnot(nullptr),
35 m_pEnv(pEnv),
36 m_bChangeMask(FALSE),
37 m_bBeingDestroyed(FALSE) {}
38
39 CPDFSDK_Document::~CPDFSDK_Document() {
40 m_bBeingDestroyed = TRUE;
41
42 for (auto& it : m_pageMap)
43 it.second->KillFocusAnnotIfNeeded();
44
45 for (auto& it : m_pageMap)
46 delete it.second;
47 m_pageMap.clear();
48 }
49
50 CPDFSDK_PageView* CPDFSDK_Document::GetPageView(
51 UnderlyingPageType* pUnderlyingPage,
52 bool ReNew) {
53 auto it = m_pageMap.find(pUnderlyingPage);
54 if (it != m_pageMap.end())
55 return it->second;
56
57 if (!ReNew)
58 return nullptr;
59
60 CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage);
61 m_pageMap[pUnderlyingPage] = pPageView;
62 // Delay to load all the annotations, to avoid endless loop.
63 pPageView->LoadFXAnnots();
64 return pPageView;
65 }
66
67 CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView() {
68 UnderlyingPageType* pPage =
69 UnderlyingFromFPDFPage(m_pEnv->FFI_GetCurrentPage(m_pDoc));
70 return pPage ? GetPageView(pPage, true) : nullptr;
71 }
72
73 CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex) {
74 UnderlyingPageType* pTempPage =
75 UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
76 if (!pTempPage)
77 return nullptr;
78
79 auto it = m_pageMap.find(pTempPage);
80 return it != m_pageMap.end() ? it->second : nullptr;
81 }
82
83 void CPDFSDK_Document::ProcJavascriptFun() {
84 CPDF_Document* pPDFDoc = GetPDFDocument();
85 CPDF_DocJSActions docJS(pPDFDoc);
86 int iCount = docJS.CountJSActions();
87 if (iCount < 1)
88 return;
89 for (int i = 0; i < iCount; i++) {
90 CFX_ByteString csJSName;
91 CPDF_Action jsAction = docJS.GetJSAction(i, csJSName);
92 if (m_pEnv->GetActionHander())
93 m_pEnv->GetActionHander()->DoAction_JavaScript(
94 jsAction, CFX_WideString::FromLocal(csJSName.AsStringC()), this);
95 }
96 }
97
98 FX_BOOL CPDFSDK_Document::ProcOpenAction() {
99 if (!m_pDoc)
100 return FALSE;
101
102 CPDF_Dictionary* pRoot = GetPDFDocument()->GetRoot();
103 if (!pRoot)
104 return FALSE;
105
106 CPDF_Object* pOpenAction = pRoot->GetDictBy("OpenAction");
107 if (!pOpenAction)
108 pOpenAction = pRoot->GetArrayBy("OpenAction");
109
110 if (!pOpenAction)
111 return FALSE;
112
113 if (pOpenAction->IsArray())
114 return TRUE;
115
116 if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) {
117 CPDF_Action action(pDict);
118 if (m_pEnv->GetActionHander())
119 m_pEnv->GetActionHander()->DoAction_DocOpen(action, this);
120 return TRUE;
121 }
122 return FALSE;
123 }
124
125 CPDF_OCContext* CPDFSDK_Document::GetOCContext() {
126 if (!m_pOccontent) {
127 m_pOccontent.reset(
128 new CPDF_OCContext(GetPDFDocument(), CPDF_OCContext::View));
129 }
130 return m_pOccontent.get();
131 }
132
133 void CPDFSDK_Document::RemovePageView(UnderlyingPageType* pUnderlyingPage) {
134 auto it = m_pageMap.find(pUnderlyingPage);
135 if (it == m_pageMap.end())
136 return;
137
138 CPDFSDK_PageView* pPageView = it->second;
139 if (pPageView->IsLocked())
140 return;
141
142 // This must happen before we remove |pPageView| from the map because
143 // |KillFocusAnnotIfNeeded| can call into the |GetPage| method which will
144 // look for this page view in the map, if it doesn't find it a new one will
145 // be created. We then have two page views pointing to the same page and
146 // bad things happen.
147 pPageView->KillFocusAnnotIfNeeded();
148
149 // Remove the page from the map to make sure we don't accidentally attempt
150 // to use the |pPageView| while we're cleaning it up.
151 m_pageMap.erase(it);
152
153 delete pPageView;
154 }
155
156 UnderlyingPageType* CPDFSDK_Document::GetPage(int nIndex) {
157 return UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
158 }
159
160 CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm() {
161 if (!m_pInterForm)
162 m_pInterForm.reset(new CPDFSDK_InterForm(this));
163 return m_pInterForm.get();
164 }
165
166 void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender,
167 CPDFSDK_Annot* pAnnot) {
168 for (const auto& it : m_pageMap) {
169 CPDFSDK_PageView* pPageView = it.second;
170 if (pPageView != pSender) {
171 pPageView->UpdateView(pAnnot);
172 }
173 }
174 }
175
176 CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot() {
177 return m_pFocusAnnot;
178 }
179
180 FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
181 if (m_bBeingDestroyed)
182 return FALSE;
183
184 if (m_pFocusAnnot == pAnnot)
185 return TRUE;
186
187 if (m_pFocusAnnot) {
188 if (!KillFocusAnnot(nFlag))
189 return FALSE;
190 }
191
192 if (!pAnnot)
193 return FALSE;
194
195 #ifdef PDF_ENABLE_XFA
196 CPDFSDK_Annot* pLastFocusAnnot = m_pFocusAnnot;
197 #endif // PDF_ENABLE_XFA
198 CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
199 if (pPageView && pPageView->IsValid()) {
200 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
201 if (!m_pFocusAnnot) {
202 #ifdef PDF_ENABLE_XFA
203 if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, pLastFocusAnnot))
204 return FALSE;
205 #endif // PDF_ENABLE_XFA
206 if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, nFlag))
207 return FALSE;
208 if (!m_pFocusAnnot) {
209 m_pFocusAnnot = pAnnot;
210 return TRUE;
211 }
212 }
213 }
214 return FALSE;
215 }
216
217 FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag) {
218 if (m_pFocusAnnot) {
219 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
220 CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
221 m_pFocusAnnot = nullptr;
222
223 #ifdef PDF_ENABLE_XFA
224 if (!pAnnotHandler->Annot_OnChangeFocus(nullptr, pFocusAnnot))
225 return FALSE;
226 #endif // PDF_ENABLE_XFA
227
228 if (pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag)) {
229 if (pFocusAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET) {
230 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;
231 int nFieldType = pWidget->GetFieldType();
232 if (FIELDTYPE_TEXTFIELD == nFieldType ||
233 FIELDTYPE_COMBOBOX == nFieldType) {
234 m_pEnv->FFI_OnSetFieldInputFocus(nullptr, nullptr, 0, FALSE);
235 }
236 }
237
238 if (!m_pFocusAnnot)
239 return TRUE;
240 } else {
241 m_pFocusAnnot = pFocusAnnot;
242 }
243 }
244 return FALSE;
245 }
246
247 void CPDFSDK_Document::OnCloseDocument() {
248 KillFocusAnnot();
249 }
250
251 FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag) {
252 return GetPDFDocument()->GetUserPermissions() & nFlag;
253 }
254
255 IJS_Runtime* CPDFSDK_Document::GetJsRuntime() {
256 return m_pEnv->GetJSRuntime();
257 }
258
259 CFX_WideString CPDFSDK_Document::GetPath() {
260 return m_pEnv->JS_docGetFilePath();
261 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698