diff options
Diffstat (limited to 'fpdfsdk/cpdfsdk_annothandlermgr.cpp')
-rw-r--r-- | fpdfsdk/cpdfsdk_annothandlermgr.cpp | 386 |
1 files changed, 386 insertions, 0 deletions
diff --git a/fpdfsdk/cpdfsdk_annothandlermgr.cpp b/fpdfsdk/cpdfsdk_annothandlermgr.cpp new file mode 100644 index 0000000000..c3fac483fd --- /dev/null +++ b/fpdfsdk/cpdfsdk_annothandlermgr.cpp @@ -0,0 +1,386 @@ +// 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_annothandlermgr.h" + +#include "core/fpdfdoc/include/cpdf_annot.h" +#include "fpdfsdk/include/cpdfsdk_annot.h" +#include "fpdfsdk/include/cpdfsdk_baannot.h" +#include "fpdfsdk/include/cpdfsdk_bfannothandler.h" +#include "fpdfsdk/include/cpdfsdk_datetime.h" +#include "fpdfsdk/include/fsdk_mgr.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/include/cpdfsdk_xfaannothandler.h" +#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h" +#include "xfa/fxfa/include/xfa_ffpageview.h" +#include "xfa/fxfa/include/xfa_ffwidget.h" +#endif // PDF_ENABLE_XFA + +CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp) { + m_pApp = pApp; + + CPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp); + pHandler->SetFormFiller(m_pApp->GetIFormFiller()); + RegisterAnnotHandler(pHandler); +#ifdef PDF_ENABLE_XFA + CPDFSDK_XFAAnnotHandler* pXFAAnnotHandler = + new CPDFSDK_XFAAnnotHandler(m_pApp); + RegisterAnnotHandler(pXFAAnnotHandler); +#endif // PDF_ENABLE_XFA +} + +CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() {} + +void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler( + IPDFSDK_AnnotHandler* pAnnotHandler) { + ASSERT(!GetAnnotHandler(pAnnotHandler->GetType())); + + m_mapType2Handler[pAnnotHandler->GetType()].reset(pAnnotHandler); +} + +void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler( + IPDFSDK_AnnotHandler* pAnnotHandler) { + m_mapType2Handler.erase(pAnnotHandler->GetType()); +} + +CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPageView) { + ASSERT(pPageView); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = + GetAnnotHandler(pAnnot->GetSubType())) { + return pAnnotHandler->NewAnnot(pAnnot, pPageView); + } + + return new CPDFSDK_BAAnnot(pAnnot, pPageView); +} + +#ifdef PDF_ENABLE_XFA +CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CXFA_FFWidget* pAnnot, + CPDFSDK_PageView* pPageView) { + ASSERT(pAnnot); + ASSERT(pPageView); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = + GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) { + return pAnnotHandler->NewAnnot(pAnnot, pPageView); + } + + return nullptr; +} +#endif // PDF_ENABLE_XFA + +void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { + pAnnotHandler->OnRelease(pAnnot); + pAnnotHandler->ReleaseAnnot(pAnnot); + } else { + delete pAnnot; + } +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) { + CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); + + CPDFSDK_DateTime curTime; + pPDFAnnot->GetAnnotDict()->SetAtString("M", curTime.ToPDFDateTimeString()); + pPDFAnnot->GetAnnotDict()->SetAtNumber("F", 0); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + pAnnotHandler->OnCreate(pAnnot); +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + pAnnotHandler->OnLoad(pAnnot); +} + +IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler( + CPDFSDK_Annot* pAnnot) const { + CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); + if (pPDFAnnot) + return GetAnnotHandler(pPDFAnnot->GetSubType()); +#ifdef PDF_ENABLE_XFA + if (pAnnot->GetXFAWidget()) + return GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME); +#endif // PDF_ENABLE_XFA + return nullptr; +} + +IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler( + const CFX_ByteString& sType) const { + auto it = m_mapType2Handler.find(sType); + return it != m_mapType2Handler.end() ? it->second.get() : nullptr; +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + uint32_t dwFlags) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { + pAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); + } else { +#ifdef PDF_ENABLE_XFA + if (pAnnot->IsXFAField()) + return; +#endif // PDF_ENABLE_XFA + static_cast<CPDFSDK_BAAnnot*>(pAnnot)->DrawAppearance( + pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); + } +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_FloatPoint& point) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnLButtonDown(pPageView, pAnnot, nFlags, point); + + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_FloatPoint& point) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnLButtonUp(pPageView, pAnnot, nFlags, point); + + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_FloatPoint& point) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); + + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_FloatPoint& point) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnMouseMove(pPageView, pAnnot, nFlags, point); + + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_FloatPoint& point) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { + return pAnnotHandler->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, + point); + } + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_FloatPoint& point) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnRButtonDown(pPageView, pAnnot, nFlags, point); + + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_FloatPoint& point) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnRButtonUp(pPageView, pAnnot, nFlags, point); + + return FALSE; +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlag) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + pAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag); +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlag) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + pAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag); +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnChar(pAnnot, nChar, nFlags); + + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + if (!m_pApp->FFI_IsCTRLKeyDown(nFlag) && !m_pApp->FFI_IsALTKeyDown(nFlag)) { + CPDFSDK_PageView* pPage = pAnnot->GetPageView(); + CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot(); + if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) { + CPDFSDK_Annot* pNext = + GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag)); + + if (pNext && pNext != pFocusAnnot) { + CPDFSDK_Document* pDocument = pPage->GetSDKDocument(); + pDocument->SetFocusAnnot(pNext); + return TRUE; + } + } + } + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnKeyDown(pAnnot, nKeyCode, nFlag); + + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, + uint32_t nFlag) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { + if (pAnnotHandler->OnSetFocus(pAnnot, nFlag)) { + CPDFSDK_PageView* pPage = pAnnot->GetPageView(); + pPage->GetSDKDocument(); + return TRUE; + } + } + return FALSE; +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, + uint32_t nFlag) { + ASSERT(pAnnot); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->OnKillFocus(pAnnot, nFlag); + + return FALSE; +} + +#ifdef PDF_ENABLE_XFA +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus( + CPDFSDK_Annot* pSetAnnot, + CPDFSDK_Annot* pKillAnnot) { + FX_BOOL bXFA = (pSetAnnot && pSetAnnot->GetXFAWidget()) || + (pKillAnnot && pKillAnnot->GetXFAWidget()); + + if (bXFA) { + if (IPDFSDK_AnnotHandler* pXFAAnnotHandler = + GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) + return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot); + } + + return TRUE; +} +#endif // PDF_ENABLE_XFA + +CFX_FloatRect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + ASSERT(pAnnot); + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) + return pAnnotHandler->GetViewBBox(pPageView, pAnnot); + + return pAnnot->GetRect(); +} + +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_FloatPoint& point) { + ASSERT(pAnnot); + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { + if (pAnnotHandler->CanAnswer(pAnnot)) + return pAnnotHandler->HitTest(pPageView, pAnnot, point); + } + return FALSE; +} + +CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot, + FX_BOOL bNext) { +#ifdef PDF_ENABLE_XFA + CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView(); + CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage(); + if (!pPage) + return nullptr; + if (pPage->GetPDFPage()) { // for pdf annots. + CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), pSDKAnnot->GetType(), ""); + CPDFSDK_Annot* pNext = + bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); + return pNext; + } + // 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 + CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget", ""); + return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); +#endif // PDF_ENABLE_XFA +} |