OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "fpdfsdk/cpdfsdk_document.h" | 7 #include "fpdfsdk/cpdfsdk_document.h" |
8 | 8 |
9 #include "core/fpdfapi/parser/cpdf_array.h" | 9 #include "core/fpdfapi/parser/cpdf_array.h" |
10 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 10 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 CPDFSDK_Document::CPDFSDK_Document(UnderlyingDocumentType* pDoc, | 32 CPDFSDK_Document::CPDFSDK_Document(UnderlyingDocumentType* pDoc, |
33 CPDFSDK_Environment* pEnv) | 33 CPDFSDK_Environment* pEnv) |
34 : m_pDoc(pDoc), | 34 : m_pDoc(pDoc), |
35 m_pEnv(pEnv), | 35 m_pEnv(pEnv), |
36 m_bChangeMask(FALSE), | 36 m_bChangeMask(FALSE), |
37 m_bBeingDestroyed(FALSE) {} | 37 m_bBeingDestroyed(FALSE) {} |
38 | 38 |
39 CPDFSDK_Document::~CPDFSDK_Document() { | 39 CPDFSDK_Document::~CPDFSDK_Document() { |
40 m_bBeingDestroyed = TRUE; | 40 m_bBeingDestroyed = TRUE; |
41 | 41 |
42 for (auto& it : m_pageMap) | 42 for (auto& it : m_pageMap) { |
43 it.second->KillFocusAnnotIfNeeded(); | 43 if (it.second->IsValidSDKAnnot(GetFocusAnnot())) |
| 44 KillFocusAnnot(0); |
| 45 } |
44 | 46 |
45 for (auto& it : m_pageMap) | 47 for (auto& it : m_pageMap) |
46 delete it.second; | 48 delete it.second; |
47 m_pageMap.clear(); | 49 m_pageMap.clear(); |
48 } | 50 } |
49 | 51 |
50 CPDFSDK_PageView* CPDFSDK_Document::GetPageView( | 52 CPDFSDK_PageView* CPDFSDK_Document::GetPageView( |
51 UnderlyingPageType* pUnderlyingPage, | 53 UnderlyingPageType* pUnderlyingPage, |
52 bool ReNew) { | 54 bool ReNew) { |
53 auto it = m_pageMap.find(pUnderlyingPage); | 55 auto it = m_pageMap.find(pUnderlyingPage); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 | 139 |
138 CPDFSDK_PageView* pPageView = it->second; | 140 CPDFSDK_PageView* pPageView = it->second; |
139 if (pPageView->IsLocked() || pPageView->IsBeingDestroyed()) | 141 if (pPageView->IsLocked() || pPageView->IsBeingDestroyed()) |
140 return; | 142 return; |
141 | 143 |
142 // Mark the page view so we do not come into |RemovePageView| a second | 144 // Mark the page view so we do not come into |RemovePageView| a second |
143 // time while we're in the process of removing. | 145 // time while we're in the process of removing. |
144 pPageView->SetBeingDestroyed(); | 146 pPageView->SetBeingDestroyed(); |
145 | 147 |
146 // This must happen before we remove |pPageView| from the map because | 148 // This must happen before we remove |pPageView| from the map because |
147 // |KillFocusAnnotIfNeeded| can call into the |GetPage| method which will | 149 // |KillFocusAnnot| can call into the |GetPage| method which will |
148 // look for this page view in the map, if it doesn't find it a new one will | 150 // look for this page view in the map, if it doesn't find it a new one will |
149 // be created. We then have two page views pointing to the same page and | 151 // be created. We then have two page views pointing to the same page and |
150 // bad things happen. | 152 // bad things happen. |
151 pPageView->KillFocusAnnotIfNeeded(); | 153 if (pPageView->IsValidSDKAnnot(GetFocusAnnot())) |
| 154 KillFocusAnnot(0); |
152 | 155 |
153 // Remove the page from the map to make sure we don't accidentally attempt | 156 // Remove the page from the map to make sure we don't accidentally attempt |
154 // to use the |pPageView| while we're cleaning it up. | 157 // to use the |pPageView| while we're cleaning it up. |
155 m_pageMap.erase(it); | 158 m_pageMap.erase(it); |
156 | 159 |
157 delete pPageView; | 160 delete pPageView; |
158 } | 161 } |
159 | 162 |
160 UnderlyingPageType* CPDFSDK_Document::GetPage(int nIndex) { | 163 UnderlyingPageType* CPDFSDK_Document::GetPage(int nIndex) { |
161 return UnderlyingFromFPDFPage(m_pEnv->GetPage(m_pDoc, nIndex)); | 164 return UnderlyingFromFPDFPage(m_pEnv->GetPage(m_pDoc, nIndex)); |
162 } | 165 } |
163 | 166 |
164 CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm() { | 167 CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm() { |
165 if (!m_pInterForm) | 168 if (!m_pInterForm) |
166 m_pInterForm = pdfium::MakeUnique<CPDFSDK_InterForm>(this); | 169 m_pInterForm = pdfium::MakeUnique<CPDFSDK_InterForm>(this); |
167 return m_pInterForm.get(); | 170 return m_pInterForm.get(); |
168 } | 171 } |
169 | 172 |
170 void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender, | 173 void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender, |
171 CPDFSDK_Annot* pAnnot) { | 174 CPDFSDK_Annot* pAnnot) { |
172 for (const auto& it : m_pageMap) { | 175 for (const auto& it : m_pageMap) { |
173 CPDFSDK_PageView* pPageView = it.second; | 176 CPDFSDK_PageView* pPageView = it.second; |
174 if (pPageView != pSender) { | 177 if (pPageView != pSender) |
175 pPageView->UpdateView(pAnnot); | 178 pPageView->UpdateView(pAnnot); |
176 } | |
177 } | 179 } |
178 } | 180 } |
179 | 181 |
180 CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot() { | 182 FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot::ObservedPtr* pAnnot) { |
181 return m_pFocusAnnot.Get(); | |
182 } | |
183 | |
184 FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot::ObservedPtr* pAnnot, | |
185 uint32_t nFlag) { | |
186 if (m_bBeingDestroyed) | 183 if (m_bBeingDestroyed) |
187 return FALSE; | 184 return FALSE; |
188 | |
189 if (m_pFocusAnnot == *pAnnot) | 185 if (m_pFocusAnnot == *pAnnot) |
190 return TRUE; | 186 return TRUE; |
191 | 187 if (m_pFocusAnnot && !KillFocusAnnot(0)) |
192 if (m_pFocusAnnot) { | 188 return FALSE; |
193 if (!KillFocusAnnot(nFlag)) | |
194 return FALSE; | |
195 } | |
196 | |
197 if (!*pAnnot) | 189 if (!*pAnnot) |
198 return FALSE; | 190 return FALSE; |
199 | 191 |
200 #ifdef PDF_ENABLE_XFA | 192 #ifdef PDF_ENABLE_XFA |
201 CPDFSDK_Annot::ObservedPtr pLastFocusAnnot(m_pFocusAnnot.Get()); | 193 CPDFSDK_Annot::ObservedPtr pLastFocusAnnot(m_pFocusAnnot.Get()); |
202 #endif // PDF_ENABLE_XFA | 194 #endif // PDF_ENABLE_XFA |
203 CPDFSDK_PageView* pPageView = (*pAnnot)->GetPageView(); | 195 CPDFSDK_PageView* pPageView = (*pAnnot)->GetPageView(); |
204 if (pPageView && pPageView->IsValid()) { | 196 if (pPageView && pPageView->IsValid()) { |
205 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr(); | 197 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr(); |
206 if (!m_pFocusAnnot) { | 198 if (!m_pFocusAnnot) { |
207 #ifdef PDF_ENABLE_XFA | 199 #ifdef PDF_ENABLE_XFA |
208 if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, &pLastFocusAnnot)) | 200 if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, &pLastFocusAnnot)) |
209 return FALSE; | 201 return FALSE; |
210 #endif // PDF_ENABLE_XFA | 202 #endif // PDF_ENABLE_XFA |
211 if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, nFlag)) | 203 if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, 0)) |
212 return FALSE; | 204 return FALSE; |
213 if (!m_pFocusAnnot) { | 205 if (!m_pFocusAnnot) { |
214 m_pFocusAnnot.Reset(pAnnot->Get()); | 206 m_pFocusAnnot.Reset(pAnnot->Get()); |
215 return TRUE; | 207 return TRUE; |
216 } | 208 } |
217 } | 209 } |
218 } | 210 } |
219 return FALSE; | 211 return FALSE; |
220 } | 212 } |
221 | 213 |
(...skipping 22 matching lines...) Expand all Loading... |
244 if (!m_pFocusAnnot) | 236 if (!m_pFocusAnnot) |
245 return TRUE; | 237 return TRUE; |
246 } else { | 238 } else { |
247 m_pFocusAnnot.Reset(pFocusAnnot.Get()); | 239 m_pFocusAnnot.Reset(pFocusAnnot.Get()); |
248 } | 240 } |
249 } | 241 } |
250 return FALSE; | 242 return FALSE; |
251 } | 243 } |
252 | 244 |
253 void CPDFSDK_Document::OnCloseDocument() { | 245 void CPDFSDK_Document::OnCloseDocument() { |
254 KillFocusAnnot(); | 246 KillFocusAnnot(0); |
255 } | 247 } |
256 | 248 |
257 FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag) { | 249 FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag) { |
258 return GetPDFDocument()->GetUserPermissions() & nFlag; | 250 return GetPDFDocument()->GetUserPermissions() & nFlag; |
259 } | 251 } |
260 | 252 |
261 IJS_Runtime* CPDFSDK_Document::GetJsRuntime() { | 253 IJS_Runtime* CPDFSDK_Document::GetJsRuntime() { |
262 return m_pEnv->GetJSRuntime(); | 254 return m_pEnv->GetJSRuntime(); |
263 } | 255 } |
264 | 256 |
265 CFX_WideString CPDFSDK_Document::GetPath() { | 257 CFX_WideString CPDFSDK_Document::GetPath() { |
266 return m_pEnv->JS_docGetFilePath(); | 258 return m_pEnv->JS_docGetFilePath(); |
267 } | 259 } |
OLD | NEW |