Index: fpdfsdk/cpdfsdk_xfaannothandler.cpp |
diff --git a/fpdfsdk/cpdfsdk_xfaannothandler.cpp b/fpdfsdk/cpdfsdk_xfaannothandler.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8c97f1d3df54539ee918f0ec70ecc7a52a5f9116 |
--- /dev/null |
+++ b/fpdfsdk/cpdfsdk_xfaannothandler.cpp |
@@ -0,0 +1,392 @@ |
+// 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_xfaannothandler.h" |
+ |
+#ifdef PDF_ENABLE_XFA |
+ |
+#include "core/fpdfdoc/include/cpdf_interform.h" |
+#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h" |
+#include "fpdfsdk/include/cpdfsdk_annot.h" |
+#include "fpdfsdk/include/fsdk_mgr.h" |
+#include "xfa/fxfa/include/fxfa_basic.h" |
+#include "xfa/fxfa/include/xfa_ffdocview.h" |
+#include "xfa/fxfa/include/xfa_ffpageview.h" |
+#include "xfa/fxfa/include/xfa_ffwidget.h" |
+#include "xfa/fxfa/include/xfa_ffwidgethandler.h" |
+#include "xfa/fxgraphics/include/cfx_graphics.h" |
+#include "xfa/fwl/core/include/fwl_widgethit.h" |
+ |
+CPDFSDK_XFAAnnotHandler::CPDFSDK_XFAAnnotHandler(CPDFDoc_Environment* pApp) |
+ : m_pApp(pApp) {} |
+ |
+CPDFSDK_XFAAnnotHandler::~CPDFSDK_XFAAnnotHandler() {} |
+ |
+CFX_ByteString CPDFSDK_XFAAnnotHandler::GetType() { |
+ return FSDK_XFAWIDGET_TYPENAME; |
+} |
+ |
+CFX_ByteString CPDFSDK_XFAAnnotHandler::GetName() { |
+ return "XFAWidgetHandler"; |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) { |
+ return !!pAnnot->GetXFAWidget(); |
+} |
+ |
+CPDFSDK_Annot* CPDFSDK_XFAAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, |
+ CPDFSDK_PageView* pPage) { |
+ return nullptr; |
+} |
+ |
+CPDFSDK_Annot* CPDFSDK_XFAAnnotHandler::NewAnnot(CXFA_FFWidget* pAnnot, |
+ CPDFSDK_PageView* pPage) { |
+ CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument(); |
+ CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm(); |
+ CPDFSDK_XFAWidget* pWidget = new CPDFSDK_XFAWidget(pAnnot, pPage, pInterForm); |
+ pInterForm->AddXFAMap(pAnnot, pWidget); |
+ return pWidget; |
+} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnDraw(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ CFX_RenderDevice* pDevice, |
+ CFX_Matrix* pUser2Device, |
+ uint32_t dwFlags) { |
+ ASSERT(pPageView); |
+ ASSERT(pAnnot); |
+ |
+ CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ |
+ CFX_Graphics gs; |
+ gs.Create(pDevice); |
+ |
+ CFX_Matrix mt; |
+ mt = *pUser2Device; |
+ |
+ FX_BOOL bIsHighlight = FALSE; |
+ if (pSDKDoc->GetFocusAnnot() != pAnnot) |
+ bIsHighlight = TRUE; |
+ |
+ pWidgetHandler->RenderWidget(pAnnot->GetXFAWidget(), &gs, &mt, bIsHighlight); |
+ |
+ // to do highlight and shadow |
+} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnDrawSleep(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ CFX_RenderDevice* pDevice, |
+ CFX_Matrix* pUser2Device, |
+ const CFX_FloatRect& rcWindow, |
+ uint32_t dwFlags) {} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnCreate(CPDFSDK_Annot* pAnnot) {} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot) {} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnDelete(CPDFSDK_Annot* pAnnot) {} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnRelease(CPDFSDK_Annot* pAnnot) {} |
+ |
+void CPDFSDK_XFAAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { |
+ CPDFSDK_XFAWidget* pWidget = reinterpret_cast<CPDFSDK_XFAWidget*>(pAnnot); |
+ CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); |
+ pInterForm->RemoveXFAMap(pWidget->GetXFAWidget()); |
+ |
+ delete pWidget; |
+} |
+ |
+void CPDFSDK_XFAAnnotHandler::DeleteAnnot(CPDFSDK_Annot* pAnnot) {} |
+ |
+CFX_FloatRect CPDFSDK_XFAAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot) { |
+ ASSERT(pAnnot); |
+ |
+ CFX_RectF rcBBox; |
+ XFA_Element eType = pAnnot->GetXFAWidget()->GetDataAcc()->GetUIType(); |
+ if (eType == XFA_Element::Signature) |
+ pAnnot->GetXFAWidget()->GetBBox(rcBBox, XFA_WidgetStatus_Visible, TRUE); |
+ else |
+ pAnnot->GetXFAWidget()->GetBBox(rcBBox, XFA_WidgetStatus_None); |
+ |
+ CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, |
+ rcBBox.top + rcBBox.height); |
+ rcWidget.left -= 1.0f; |
+ rcWidget.right += 1.0f; |
+ rcWidget.bottom -= 1.0f; |
+ rcWidget.top += 1.0f; |
+ |
+ return rcWidget; |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::HitTest(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); |
+ if (!pSDKDoc) |
+ return FALSE; |
+ |
+ CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); |
+ if (!pDoc) |
+ return FALSE; |
+ |
+ CXFA_FFDocView* pDocView = pDoc->GetXFADocView(); |
+ if (!pDocView) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); |
+ if (!pWidgetHandler) |
+ return FALSE; |
+ |
+ FWL_WidgetHit dwHitTest = |
+ pWidgetHandler->OnHitTest(pAnnot->GetXFAWidget(), point.x, point.y); |
+ return dwHitTest != FWL_WidgetHit::Unknown; |
+} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnMouseEnter(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlag) { |
+ if (!pPageView || !pAnnot) |
+ return; |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ pWidgetHandler->OnMouseEnter(pAnnot->GetXFAWidget()); |
+} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnMouseExit(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlag) { |
+ if (!pPageView || !pAnnot) |
+ return; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ pWidgetHandler->OnMouseExit(pAnnot->GetXFAWidget()); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDown(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlags, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnLButtonDown(pAnnot->GetXFAWidget(), |
+ GetFWLFlags(nFlags), point.x, point.y); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonUp(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlags, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnLButtonUp(pAnnot->GetXFAWidget(), |
+ GetFWLFlags(nFlags), point.x, point.y); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlags, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnLButtonDblClk(pAnnot->GetXFAWidget(), |
+ GetFWLFlags(nFlags), point.x, point.y); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseMove(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlags, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnMouseMove(pAnnot->GetXFAWidget(), |
+ GetFWLFlags(nFlags), point.x, point.y); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseWheel(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlags, |
+ short zDelta, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnMouseWheel( |
+ pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), zDelta, point.x, point.y); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDown(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlags, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnRButtonDown(pAnnot->GetXFAWidget(), |
+ GetFWLFlags(nFlags), point.x, point.y); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonUp(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlags, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnRButtonUp(pAnnot->GetXFAWidget(), |
+ GetFWLFlags(nFlags), point.x, point.y); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView, |
+ CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlags, |
+ const CFX_FloatPoint& point) { |
+ if (!pPageView || !pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnRButtonDblClk(pAnnot->GetXFAWidget(), |
+ GetFWLFlags(nFlags), point.x, point.y); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, |
+ uint32_t nChar, |
+ uint32_t nFlags) { |
+ if (!pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnChar(pAnnot->GetXFAWidget(), nChar, |
+ GetFWLFlags(nFlags)); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, |
+ int nKeyCode, |
+ int nFlag) { |
+ if (!pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnKeyDown(pAnnot->GetXFAWidget(), nKeyCode, |
+ GetFWLFlags(nFlag)); |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, |
+ int nKeyCode, |
+ int nFlag) { |
+ if (!pAnnot) |
+ return FALSE; |
+ |
+ CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); |
+ return pWidgetHandler->OnKeyUp(pAnnot->GetXFAWidget(), nKeyCode, |
+ GetFWLFlags(nFlag)); |
+} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnDeSelected(CPDFSDK_Annot* pAnnot) {} |
+ |
+void CPDFSDK_XFAAnnotHandler::OnSelected(CPDFSDK_Annot* pAnnot) {} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlag) { |
+ return TRUE; |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, |
+ uint32_t nFlag) { |
+ return TRUE; |
+} |
+ |
+FX_BOOL CPDFSDK_XFAAnnotHandler::OnXFAChangedFocus(CPDFSDK_Annot* pOldAnnot, |
+ CPDFSDK_Annot* pNewAnnot) { |
+ CXFA_FFWidgetHandler* pWidgetHandler = nullptr; |
+ |
+ if (pOldAnnot) |
+ pWidgetHandler = GetXFAWidgetHandler(pOldAnnot); |
+ else if (pNewAnnot) |
+ pWidgetHandler = GetXFAWidgetHandler(pNewAnnot); |
+ |
+ if (pWidgetHandler) { |
+ FX_BOOL bRet = TRUE; |
+ CXFA_FFWidget* hWidget = pNewAnnot ? pNewAnnot->GetXFAWidget() : nullptr; |
+ if (hWidget) { |
+ CXFA_FFPageView* pXFAPageView = hWidget->GetPageView(); |
+ if (pXFAPageView) { |
+ bRet = pXFAPageView->GetDocView()->SetFocus(hWidget); |
+ if (pXFAPageView->GetDocView()->GetFocusWidget() == hWidget) |
+ bRet = TRUE; |
+ } |
+ } |
+ return bRet; |
+ } |
+ |
+ return TRUE; |
+} |
+ |
+CXFA_FFWidgetHandler* CPDFSDK_XFAAnnotHandler::GetXFAWidgetHandler( |
+ CPDFSDK_Annot* pAnnot) { |
+ if (!pAnnot) |
+ return nullptr; |
+ |
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); |
+ if (!pPageView) |
+ return nullptr; |
+ |
+ CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); |
+ if (!pSDKDoc) |
+ return nullptr; |
+ |
+ CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); |
+ if (!pDoc) |
+ return nullptr; |
+ |
+ CXFA_FFDocView* pDocView = pDoc->GetXFADocView(); |
+ if (!pDocView) |
+ return nullptr; |
+ |
+ return pDocView->GetWidgetHandler(); |
+} |
+ |
+const uint32_t FWL_KEYFLAG_Ctrl = (1 << 0); |
+const uint32_t FWL_KEYFLAG_Alt = (1 << 1); |
+const uint32_t FWL_KEYFLAG_Shift = (1 << 2); |
+const uint32_t FWL_KEYFLAG_LButton = (1 << 3); |
+const uint32_t FWL_KEYFLAG_RButton = (1 << 4); |
+const uint32_t FWL_KEYFLAG_MButton = (1 << 5); |
+ |
+uint32_t CPDFSDK_XFAAnnotHandler::GetFWLFlags(uint32_t dwFlag) { |
+ uint32_t dwFWLFlag = 0; |
+ |
+ if (dwFlag & FWL_EVENTFLAG_ControlKey) |
+ dwFWLFlag |= FWL_KEYFLAG_Ctrl; |
+ if (dwFlag & FWL_EVENTFLAG_LeftButtonDown) |
+ dwFWLFlag |= FWL_KEYFLAG_LButton; |
+ if (dwFlag & FWL_EVENTFLAG_MiddleButtonDown) |
+ dwFWLFlag |= FWL_KEYFLAG_MButton; |
+ if (dwFlag & FWL_EVENTFLAG_RightButtonDown) |
+ dwFWLFlag |= FWL_KEYFLAG_RButton; |
+ if (dwFlag & FWL_EVENTFLAG_ShiftKey) |
+ dwFWLFlag |= FWL_KEYFLAG_Shift; |
+ if (dwFlag & FWL_EVENTFLAG_AltKey) |
+ dwFWLFlag |= FWL_KEYFLAG_Alt; |
+ |
+ return dwFWLFlag; |
+} |
+ |
+#endif // PDF_ENABLE_XFA |