diff options
-rw-r--r-- | fpdfsdk/cpdfsdk_annot.cpp | 7 | ||||
-rw-r--r-- | fpdfsdk/cpdfsdk_annot.h | 2 | ||||
-rw-r--r-- | fpdfsdk/cpdfsdk_annothandlermgr.cpp | 49 |
3 files changed, 27 insertions, 31 deletions
diff --git a/fpdfsdk/cpdfsdk_annot.cpp b/fpdfsdk/cpdfsdk_annot.cpp index 6c17628a33..cfd87b3255 100644 --- a/fpdfsdk/cpdfsdk_annot.cpp +++ b/fpdfsdk/cpdfsdk_annot.cpp @@ -75,10 +75,11 @@ CFX_FloatRect CPDFSDK_Annot::GetRect() const { IPDF_Page* CPDFSDK_Annot::GetPage() { #ifdef PDF_ENABLE_XFA - return GetPDFXFAPage(); -#else // PDF_ENABLE_XFA - return GetPDFPage(); + CPDFXFA_Page* pXFAPage = GetPDFXFAPage(); + if (pXFAPage) + return pXFAPage; #endif // PDF_ENABLE_XFA + return GetPDFPage(); } CPDF_Page* CPDFSDK_Annot::GetPDFPage() { diff --git a/fpdfsdk/cpdfsdk_annot.h b/fpdfsdk/cpdfsdk_annot.h index 2d97f0870c..459c6d0233 100644 --- a/fpdfsdk/cpdfsdk_annot.h +++ b/fpdfsdk/cpdfsdk_annot.h @@ -45,7 +45,7 @@ class CPDFSDK_Annot : public Observable<CPDFSDK_Annot> { virtual CFX_FloatRect GetRect() const; virtual void SetRect(const CFX_FloatRect& rect); - IPDF_Page* GetPage(); + IPDF_Page* GetPage(); // Returns XFA Page if possible, else PDF page. CPDF_Page* GetPDFPage(); #ifdef PDF_ENABLE_XFA CPDFXFA_Page* GetPDFXFAPage(); diff --git a/fpdfsdk/cpdfsdk_annothandlermgr.cpp b/fpdfsdk/cpdfsdk_annothandlermgr.cpp index 117bf936e4..09d844f809 100644 --- a/fpdfsdk/cpdfsdk_annothandlermgr.cpp +++ b/fpdfsdk/cpdfsdk_annothandlermgr.cpp @@ -309,34 +309,29 @@ CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot, #ifdef PDF_ENABLE_XFA CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView(); CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage(); - if (!pPage) - return nullptr; - if (pPage->AsPDFPage()) { // for pdf annots. - CPDFSDK_AnnotIterator ai(pSDKAnnot->GetPageView(), - pSDKAnnot->GetAnnotSubtype()); - CPDFSDK_Annot* pNext = - bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); - return pNext; + if (pPage && !pPage->AsPDFPage()) { + // For xfa annots in XFA pages not backed by PDF pages. + std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator( + pPage->GetXFAPageView()->CreateWidgetIterator( + XFA_TRAVERSEWAY_Tranvalse, XFA_WidgetStatus_Visible | + XFA_WidgetStatus_Viewable | + XFA_WidgetStatus_Focused)); + if (!pWidgetIterator) + return nullptr; + if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget()) + pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget()); + CXFA_FFWidget* hNextFocus = bNext ? pWidgetIterator->MoveToNext() + : pWidgetIterator->MoveToPrevious(); + if (!hNextFocus && pSDKAnnot) + hNextFocus = pWidgetIterator->MoveToFirst(); + + return pPageView->GetAnnotByXFAWidget(hNextFocus); } - // for xfa annots - std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator( - pPage->GetXFAPageView()->CreateWidgetIterator( - XFA_TRAVERSEWAY_Tranvalse, XFA_WidgetStatus_Visible | - XFA_WidgetStatus_Viewable | - XFA_WidgetStatus_Focused)); - if (!pWidgetIterator) - return nullptr; - if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget()) - pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget()); - CXFA_FFWidget* hNextFocus = - bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious(); - if (!hNextFocus && pSDKAnnot) - hNextFocus = pWidgetIterator->MoveToFirst(); - - return pPageView->GetAnnotByXFAWidget(hNextFocus); -#else // PDF_ENABLE_XFA +#endif // PDF_ENABLE_XFA + + // For PDF annots. + ASSERT(pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET); CPDFSDK_AnnotIterator ai(pSDKAnnot->GetPageView(), - CPDF_Annot::Subtype::WIDGET); + pSDKAnnot->GetAnnotSubtype()); return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); -#endif // PDF_ENABLE_XFA } |