| 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_pageview.h" | 7 #include "fpdfsdk/cpdfsdk_pageview.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 CPDFSDK_PageView::~CPDFSDK_PageView() { | 60 CPDFSDK_PageView::~CPDFSDK_PageView() { |
| 61 #ifndef PDF_ENABLE_XFA | 61 #ifndef PDF_ENABLE_XFA |
| 62 // The call to |ReleaseAnnot| can cause the page pointed to by |m_page| to | 62 // The call to |ReleaseAnnot| can cause the page pointed to by |m_page| to |
| 63 // be freed, which will cause issues if we try to cleanup the pageview pointer | 63 // be freed, which will cause issues if we try to cleanup the pageview pointer |
| 64 // in |m_page|. So, reset the pageview pointer before doing anything else. | 64 // in |m_page|. So, reset the pageview pointer before doing anything else. |
| 65 m_page->SetView(nullptr); | 65 m_page->SetView(nullptr); |
| 66 #endif // PDF_ENABLE_XFA | 66 #endif // PDF_ENABLE_XFA |
| 67 | 67 |
| 68 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 68 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 69 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); | 69 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); |
| 70 for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) | 70 for (CPDFSDK_Annot* pAnnot : m_SDKAnnotArray) |
| 71 pAnnotHandlerMgr->ReleaseAnnot(pAnnot); | 71 pAnnotHandlerMgr->ReleaseAnnot(pAnnot); |
| 72 | 72 |
| 73 m_fxAnnotArray.clear(); | 73 m_SDKAnnotArray.clear(); |
| 74 m_pAnnotList.reset(); | 74 m_pAnnotList.reset(); |
| 75 | 75 |
| 76 #ifndef PDF_ENABLE_XFA | 76 #ifndef PDF_ENABLE_XFA |
| 77 if (m_bOwnsPage) | 77 if (m_bOwnsPage) |
| 78 delete m_page; | 78 delete m_page; |
| 79 #endif // PDF_ENABLE_XFA | 79 #endif // PDF_ENABLE_XFA |
| 80 } | 80 } |
| 81 | 81 |
| 82 void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, | 82 void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, |
| 83 CFX_Matrix* pUser2Device, | 83 CFX_Matrix* pUser2Device, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 | 126 |
| 127 // for pdf/static xfa. | 127 // for pdf/static xfa. |
| 128 CPDFSDK_AnnotIterator annotIterator(this, true); | 128 CPDFSDK_AnnotIterator annotIterator(this, true); |
| 129 while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) { | 129 while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) { |
| 130 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); | 130 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); |
| 131 pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device, | 131 pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device, |
| 132 pOptions->m_bDrawAnnots); | 132 pOptions->m_bDrawAnnots); |
| 133 } | 133 } |
| 134 } | 134 } |
| 135 | 135 |
| 136 const CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX, | |
| 137 FX_FLOAT pageY) { | |
| 138 for (const auto& pAnnot : m_pAnnotList->All()) { | |
| 139 CFX_FloatRect annotRect = pAnnot->GetRect(); | |
| 140 if (annotRect.Contains(pageX, pageY)) | |
| 141 return pAnnot.get(); | |
| 142 } | |
| 143 return nullptr; | |
| 144 } | |
| 145 | |
| 146 const CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX, | |
| 147 FX_FLOAT pageY) { | |
| 148 for (const auto& pAnnot : m_pAnnotList->All()) { | |
| 149 if (pAnnot->GetSubtype() == CPDF_Annot::Subtype::WIDGET) { | |
| 150 CFX_FloatRect annotRect = pAnnot->GetRect(); | |
| 151 if (annotRect.Contains(pageX, pageY)) | |
| 152 return pAnnot.get(); | |
| 153 } | |
| 154 } | |
| 155 return nullptr; | |
| 156 } | |
| 157 | |
| 158 CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX, | 136 CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX, |
| 159 FX_FLOAT pageY) { | 137 FX_FLOAT pageY) { |
| 160 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 138 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 161 CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr(); | 139 CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr(); |
| 162 CPDFSDK_AnnotIterator annotIterator(this, false); | 140 CPDFSDK_AnnotIterator annotIterator(this, false); |
| 163 while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) { | 141 while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) { |
| 164 CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot); | 142 CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot); |
| 165 if (pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP) | 143 if (pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP) |
| 166 continue; | 144 continue; |
| 167 if (rc.Contains(pageX, pageY)) | 145 if (rc.Contains(pageX, pageY)) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 186 pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot); | 164 pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot); |
| 187 CFX_FloatPoint point(pageX, pageY); | 165 CFX_FloatPoint point(pageX, pageY); |
| 188 if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point)) | 166 if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point)) |
| 189 return pSDKAnnot; | 167 return pSDKAnnot; |
| 190 } | 168 } |
| 191 } | 169 } |
| 192 | 170 |
| 193 return nullptr; | 171 return nullptr; |
| 194 } | 172 } |
| 195 | 173 |
| 196 void CPDFSDK_PageView::KillFocusAnnotIfNeeded() { | |
| 197 // if there is a focused annot on the page, we should kill the focus first. | |
| 198 if (CPDFSDK_Annot* focusedAnnot = m_pSDKDoc->GetFocusAnnot()) { | |
| 199 if (pdfium::ContainsValue(m_fxAnnotArray, focusedAnnot)) | |
| 200 KillFocusAnnot(); | |
| 201 } | |
| 202 } | |
| 203 | |
| 204 CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot* pPDFAnnot) { | |
| 205 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | |
| 206 ASSERT(pEnv); | |
| 207 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr(); | |
| 208 CPDFSDK_Annot* pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this); | |
| 209 if (!pSDKAnnot) | |
| 210 return nullptr; | |
| 211 | |
| 212 m_fxAnnotArray.push_back(pSDKAnnot); | |
| 213 pAnnotHandler->Annot_OnCreate(pSDKAnnot); | |
| 214 return pSDKAnnot; | |
| 215 } | |
| 216 | |
| 217 #ifdef PDF_ENABLE_XFA | 174 #ifdef PDF_ENABLE_XFA |
| 218 CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CXFA_FFWidget* pPDFAnnot) { | 175 CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CXFA_FFWidget* pPDFAnnot) { |
| 219 if (!pPDFAnnot) | 176 if (!pPDFAnnot) |
| 220 return nullptr; | 177 return nullptr; |
| 221 | 178 |
| 222 CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot); | 179 CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot); |
| 223 if (pSDKAnnot) | 180 if (pSDKAnnot) |
| 224 return pSDKAnnot; | 181 return pSDKAnnot; |
| 225 | 182 |
| 226 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 183 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 227 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr(); | 184 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr(); |
| 228 pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this); | 185 pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this); |
| 229 if (!pSDKAnnot) | 186 if (!pSDKAnnot) |
| 230 return nullptr; | 187 return nullptr; |
| 231 | 188 |
| 232 m_fxAnnotArray.push_back(pSDKAnnot); | 189 m_SDKAnnotArray.push_back(pSDKAnnot); |
| 233 return pSDKAnnot; | 190 return pSDKAnnot; |
| 234 } | 191 } |
| 235 #endif // PDF_ENABLE_XFA | |
| 236 | |
| 237 CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary* pDict) { | |
| 238 return pDict ? AddAnnot(pDict->GetStringFor("Subtype").c_str(), pDict) | |
| 239 : nullptr; | |
| 240 } | |
| 241 | |
| 242 CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(const FX_CHAR* lpSubType, | |
| 243 CPDF_Dictionary* pDict) { | |
| 244 return nullptr; | |
| 245 } | |
| 246 | 192 |
| 247 FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) { | 193 FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) { |
| 248 #ifdef PDF_ENABLE_XFA | |
| 249 if (!pAnnot) | 194 if (!pAnnot) |
| 250 return FALSE; | 195 return FALSE; |
| 251 CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage(); | 196 CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage(); |
| 252 if (!pPage || (pPage->GetDocument()->GetDocType() != DOCTYPE_STATIC_XFA && | 197 if (!pPage || (pPage->GetDocument()->GetDocType() != DOCTYPE_STATIC_XFA && |
| 253 pPage->GetDocument()->GetDocType() != DOCTYPE_DYNAMIC_XFA)) | 198 pPage->GetDocument()->GetDocType() != DOCTYPE_DYNAMIC_XFA)) |
| 254 return FALSE; | 199 return FALSE; |
| 255 | 200 |
| 256 if (GetFocusAnnot() == pAnnot) | 201 if (GetFocusAnnot() == pAnnot) |
| 257 KillFocusAnnot(); | 202 m_pSDKDoc->KillFocusAnnot(0); |
| 258 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 203 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 259 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr(); | 204 CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr(); |
| 260 if (pAnnotHandler) | 205 if (pAnnotHandler) |
| 261 pAnnotHandler->ReleaseAnnot(pAnnot); | 206 pAnnotHandler->ReleaseAnnot(pAnnot); |
| 262 | 207 |
| 263 auto it = std::find(m_fxAnnotArray.begin(), m_fxAnnotArray.end(), pAnnot); | 208 auto it = std::find(m_SDKAnnotArray.begin(), m_SDKAnnotArray.end(), pAnnot); |
| 264 if (it != m_fxAnnotArray.end()) | 209 if (it != m_SDKAnnotArray.end()) |
| 265 m_fxAnnotArray.erase(it); | 210 m_SDKAnnotArray.erase(it); |
| 266 if (m_pCaptureWidget.Get() == pAnnot) | 211 if (m_pCaptureWidget.Get() == pAnnot) |
| 267 m_pCaptureWidget.Reset(); | 212 m_pCaptureWidget.Reset(); |
| 268 | 213 |
| 269 return TRUE; | 214 return TRUE; |
| 270 #else // PDF_ENABLE_XFA | 215 } |
| 271 return FALSE; | |
| 272 #endif // PDF_ENABLE_XFA | 216 #endif // PDF_ENABLE_XFA |
| 273 } | |
| 274 | 217 |
| 275 CPDF_Document* CPDFSDK_PageView::GetPDFDocument() { | 218 CPDF_Document* CPDFSDK_PageView::GetPDFDocument() { |
| 276 if (m_page) { | 219 if (m_page) { |
| 277 #ifdef PDF_ENABLE_XFA | 220 #ifdef PDF_ENABLE_XFA |
| 278 return m_page->GetDocument()->GetPDFDoc(); | 221 return m_page->GetDocument()->GetPDFDoc(); |
| 279 #else // PDF_ENABLE_XFA | 222 #else // PDF_ENABLE_XFA |
| 280 return m_page->m_pDocument; | 223 return m_page->m_pDocument; |
| 281 #endif // PDF_ENABLE_XFA | 224 #endif // PDF_ENABLE_XFA |
| 282 } | 225 } |
| 283 return nullptr; | 226 return nullptr; |
| 284 } | 227 } |
| 285 | 228 |
| 286 CPDF_Page* CPDFSDK_PageView::GetPDFPage() const { | 229 CPDF_Page* CPDFSDK_PageView::GetPDFPage() const { |
| 287 #ifdef PDF_ENABLE_XFA | 230 #ifdef PDF_ENABLE_XFA |
| 288 return m_page ? m_page->GetPDFPage() : nullptr; | 231 return m_page ? m_page->GetPDFPage() : nullptr; |
| 289 #else // PDF_ENABLE_XFA | 232 #else // PDF_ENABLE_XFA |
| 290 return m_page; | 233 return m_page; |
| 291 #endif // PDF_ENABLE_XFA | 234 #endif // PDF_ENABLE_XFA |
| 292 } | 235 } |
| 293 | 236 |
| 294 size_t CPDFSDK_PageView::CountAnnots() const { | |
| 295 return m_fxAnnotArray.size(); | |
| 296 } | |
| 297 | |
| 298 CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(size_t nIndex) { | |
| 299 return nIndex < m_fxAnnotArray.size() ? m_fxAnnotArray[nIndex] : nullptr; | |
| 300 } | |
| 301 | |
| 302 CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) { | 237 CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) { |
| 303 for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) { | 238 for (CPDFSDK_Annot* pAnnot : m_SDKAnnotArray) { |
| 304 if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict) | 239 if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict) |
| 305 return pAnnot; | 240 return pAnnot; |
| 306 } | 241 } |
| 307 return nullptr; | 242 return nullptr; |
| 308 } | 243 } |
| 309 | 244 |
| 310 #ifdef PDF_ENABLE_XFA | 245 #ifdef PDF_ENABLE_XFA |
| 311 CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(CXFA_FFWidget* hWidget) { | 246 CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(CXFA_FFWidget* hWidget) { |
| 312 if (!hWidget) | 247 if (!hWidget) |
| 313 return nullptr; | 248 return nullptr; |
| 314 | 249 |
| 315 for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) { | 250 for (CPDFSDK_Annot* pAnnot : m_SDKAnnotArray) { |
| 316 if (pAnnot->GetXFAWidget() == hWidget) | 251 if (pAnnot->GetXFAWidget() == hWidget) |
| 317 return pAnnot; | 252 return pAnnot; |
| 318 } | 253 } |
| 319 return nullptr; | 254 return nullptr; |
| 320 } | 255 } |
| 321 #endif // PDF_ENABLE_XFA | 256 #endif // PDF_ENABLE_XFA |
| 322 | 257 |
| 323 FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CFX_FloatPoint& point, | 258 FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CFX_FloatPoint& point, |
| 324 uint32_t nFlag) { | 259 uint32_t nFlag) { |
| 325 CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point.x, point.y)); | 260 CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point.x, point.y)); |
| 326 if (!pAnnot) { | 261 if (!pAnnot) { |
| 327 KillFocusAnnot(nFlag); | 262 m_pSDKDoc->KillFocusAnnot(nFlag); |
| 328 return FALSE; | 263 return FALSE; |
| 329 } | 264 } |
| 330 | 265 |
| 331 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 266 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 332 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); | 267 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); |
| 333 if (!pAnnotHandlerMgr->Annot_OnLButtonDown(this, &pAnnot, nFlag, point)) | 268 if (!pAnnotHandlerMgr->Annot_OnLButtonDown(this, &pAnnot, nFlag, point)) |
| 334 return FALSE; | 269 return FALSE; |
| 335 | 270 |
| 336 if (!pAnnot) | 271 if (!pAnnot) |
| 337 return FALSE; | 272 return FALSE; |
| 338 | 273 |
| 339 SetFocusAnnot(&pAnnot); | 274 m_pSDKDoc->SetFocusAnnot(&pAnnot); |
| 340 return TRUE; | 275 return TRUE; |
| 341 } | 276 } |
| 342 | 277 |
| 343 #ifdef PDF_ENABLE_XFA | 278 #ifdef PDF_ENABLE_XFA |
| 344 FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point, | 279 FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point, |
| 345 uint32_t nFlag) { | 280 uint32_t nFlag) { |
| 346 CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point.x, point.y)); | 281 CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point.x, point.y)); |
| 347 if (!pAnnot) | 282 if (!pAnnot) |
| 348 return FALSE; | 283 return FALSE; |
| 349 | 284 |
| 350 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 285 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 351 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); | 286 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); |
| 352 FX_BOOL ok = | 287 FX_BOOL ok = |
| 353 pAnnotHandlerMgr->Annot_OnRButtonDown(this, &pAnnot, nFlag, point); | 288 pAnnotHandlerMgr->Annot_OnRButtonDown(this, &pAnnot, nFlag, point); |
| 354 if (!pAnnot) | 289 if (!pAnnot) |
| 355 return FALSE; | 290 return FALSE; |
| 356 | 291 |
| 357 if (ok) | 292 if (ok) |
| 358 SetFocusAnnot(&pAnnot); | 293 m_pSDKDoc->SetFocusAnnot(&pAnnot); |
| 359 | 294 |
| 360 return TRUE; | 295 return TRUE; |
| 361 } | 296 } |
| 362 | 297 |
| 363 FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point, | 298 FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point, |
| 364 uint32_t nFlag) { | 299 uint32_t nFlag) { |
| 365 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 300 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 366 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); | 301 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); |
| 367 CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXWidgetAtPoint(point.x, point.y)); | 302 CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXWidgetAtPoint(point.x, point.y)); |
| 368 if (!pFXAnnot) | 303 if (!pFXAnnot) |
| 369 return FALSE; | 304 return FALSE; |
| 370 | 305 |
| 371 if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, &pFXAnnot, nFlag, point)) | 306 if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, &pFXAnnot, nFlag, point)) |
| 372 SetFocusAnnot(&pFXAnnot); | 307 m_pSDKDoc->SetFocusAnnot(&pFXAnnot); |
| 373 | 308 |
| 374 return TRUE; | 309 return TRUE; |
| 375 } | 310 } |
| 376 #endif // PDF_ENABLE_XFA | 311 #endif // PDF_ENABLE_XFA |
| 377 | 312 |
| 378 FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CFX_FloatPoint& point, | 313 FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CFX_FloatPoint& point, |
| 379 uint32_t nFlag) { | 314 uint32_t nFlag) { |
| 380 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 315 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 381 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); | 316 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); |
| 382 CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXWidgetAtPoint(point.x, point.y)); | 317 CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXWidgetAtPoint(point.x, point.y)); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable)); | 410 XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable)); |
| 476 if (!pWidgetHander) { | 411 if (!pWidgetHander) { |
| 477 SetLock(FALSE); | 412 SetLock(FALSE); |
| 478 return; | 413 return; |
| 479 } | 414 } |
| 480 | 415 |
| 481 while (CXFA_FFWidget* pXFAAnnot = pWidgetHander->MoveToNext()) { | 416 while (CXFA_FFWidget* pXFAAnnot = pWidgetHander->MoveToNext()) { |
| 482 CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this); | 417 CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this); |
| 483 if (!pAnnot) | 418 if (!pAnnot) |
| 484 continue; | 419 continue; |
| 485 m_fxAnnotArray.push_back(pAnnot); | 420 m_SDKAnnotArray.push_back(pAnnot); |
| 486 pAnnotHandlerMgr->Annot_OnLoad(pAnnot); | 421 pAnnotHandlerMgr->Annot_OnLoad(pAnnot); |
| 487 } | 422 } |
| 488 | 423 |
| 489 SetLock(FALSE); | 424 SetLock(FALSE); |
| 490 return; | 425 return; |
| 491 } | 426 } |
| 492 #endif // PDF_ENABLE_XFA | 427 #endif // PDF_ENABLE_XFA |
| 493 | 428 |
| 494 CPDF_Page* pPage = GetPDFPage(); | 429 CPDF_Page* pPage = GetPDFPage(); |
| 495 ASSERT(pPage); | 430 ASSERT(pPage); |
| 496 bool bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled(); | 431 bool bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled(); |
| 497 // Disable the default AP construction. | 432 // Disable the default AP construction. |
| 498 CPDF_InterForm::SetUpdateAP(false); | 433 CPDF_InterForm::SetUpdateAP(false); |
| 499 m_pAnnotList = pdfium::MakeUnique<CPDF_AnnotList>(pPage); | 434 m_pAnnotList = pdfium::MakeUnique<CPDF_AnnotList>(pPage); |
| 500 CPDF_InterForm::SetUpdateAP(bUpdateAP); | 435 CPDF_InterForm::SetUpdateAP(bUpdateAP); |
| 501 | 436 |
| 502 const size_t nCount = m_pAnnotList->Count(); | 437 const size_t nCount = m_pAnnotList->Count(); |
| 503 for (size_t i = 0; i < nCount; ++i) { | 438 for (size_t i = 0; i < nCount; ++i) { |
| 504 CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i); | 439 CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i); |
| 505 CheckUnSupportAnnot(GetPDFDocument(), pPDFAnnot); | 440 CheckUnSupportAnnot(GetPDFDocument(), pPDFAnnot); |
| 506 CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this); | 441 CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this); |
| 507 if (!pAnnot) | 442 if (!pAnnot) |
| 508 continue; | 443 continue; |
| 509 m_fxAnnotArray.push_back(pAnnot); | 444 m_SDKAnnotArray.push_back(pAnnot); |
| 510 pAnnotHandlerMgr->Annot_OnLoad(pAnnot); | 445 pAnnotHandlerMgr->Annot_OnLoad(pAnnot); |
| 511 } | 446 } |
| 512 | 447 |
| 513 SetLock(FALSE); | 448 SetLock(FALSE); |
| 514 } | 449 } |
| 515 | 450 |
| 516 void CPDFSDK_PageView::UpdateRects(const std::vector<CFX_FloatRect>& rects) { | 451 void CPDFSDK_PageView::UpdateRects(const std::vector<CFX_FloatRect>& rects) { |
| 517 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); | 452 CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv(); |
| 518 for (const auto& rc : rects) | 453 for (const auto& rc : rects) |
| 519 pEnv->Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom); | 454 pEnv->Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 return false; | 488 return false; |
| 554 | 489 |
| 555 const auto& annots = m_pAnnotList->All(); | 490 const auto& annots = m_pAnnotList->All(); |
| 556 auto it = std::find_if(annots.begin(), annots.end(), | 491 auto it = std::find_if(annots.begin(), annots.end(), |
| 557 [p](const std::unique_ptr<CPDF_Annot>& annot) { | 492 [p](const std::unique_ptr<CPDF_Annot>& annot) { |
| 558 return annot.get() == p; | 493 return annot.get() == p; |
| 559 }); | 494 }); |
| 560 return it != annots.end(); | 495 return it != annots.end(); |
| 561 } | 496 } |
| 562 | 497 |
| 498 bool CPDFSDK_PageView::IsValidSDKAnnot(const CPDFSDK_Annot* p) const { |
| 499 if (!p) |
| 500 return false; |
| 501 return pdfium::ContainsValue(m_SDKAnnotArray, p); |
| 502 } |
| 503 |
| 563 CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() { | 504 CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() { |
| 564 CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot(); | 505 CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot(); |
| 565 if (!pFocusAnnot) | 506 return IsValidSDKAnnot(pFocusAnnot) ? pFocusAnnot : nullptr; |
| 566 return nullptr; | |
| 567 | |
| 568 for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) { | |
| 569 if (pAnnot == pFocusAnnot) | |
| 570 return pAnnot; | |
| 571 } | |
| 572 return nullptr; | |
| 573 } | 507 } |
| 574 | 508 |
| 575 int CPDFSDK_PageView::GetPageIndexForStaticPDF() const { | 509 int CPDFSDK_PageView::GetPageIndexForStaticPDF() const { |
| 576 CPDF_Dictionary* pDict = GetPDFPage()->m_pFormDict; | 510 CPDF_Dictionary* pDict = GetPDFPage()->m_pFormDict; |
| 577 CPDF_Document* pDoc = m_pSDKDoc->GetPDFDocument(); | 511 CPDF_Document* pDoc = m_pSDKDoc->GetPDFDocument(); |
| 578 return (pDoc && pDict) ? pDoc->GetPageIndex(pDict->GetObjNum()) : -1; | 512 return (pDoc && pDict) ? pDoc->GetPageIndex(pDict->GetObjNum()) : -1; |
| 579 } | 513 } |
| OLD | NEW |