| Index: fpdfsdk/cpdfsdk_pageview.cpp
|
| diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
|
| index 5989e29f647e7d515d9038fcde51b2a38c600459..900ea48670a3c4e0dc5dc6b958eee11b463731df 100644
|
| --- a/fpdfsdk/cpdfsdk_pageview.cpp
|
| +++ b/fpdfsdk/cpdfsdk_pageview.cpp
|
| @@ -29,7 +29,6 @@ CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,
|
| UnderlyingPageType* page)
|
| : m_page(page),
|
| m_pSDKDoc(pSDKDoc),
|
| - m_CaptureWidget(nullptr),
|
| #ifndef PDF_ENABLE_XFA
|
| m_bOwnsPage(false),
|
| #endif // PDF_ENABLE_XFA
|
| @@ -259,8 +258,8 @@ FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) {
|
| auto it = std::find(m_fxAnnotArray.begin(), m_fxAnnotArray.end(), pAnnot);
|
| if (it != m_fxAnnotArray.end())
|
| m_fxAnnotArray.erase(it);
|
| - if (m_CaptureWidget == pAnnot)
|
| - m_CaptureWidget = nullptr;
|
| + if (m_pCaptureWidget.Get() == pAnnot)
|
| + m_pCaptureWidget.Reset();
|
|
|
| return TRUE;
|
| #else // PDF_ENABLE_XFA
|
| @@ -318,37 +317,40 @@ CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(CXFA_FFWidget* hWidget) {
|
|
|
| FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CFX_FloatPoint& point,
|
| uint32_t nFlag) {
|
| - CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv();
|
| - ASSERT(pEnv);
|
| - CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
|
| - if (!pFXAnnot) {
|
| + CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point.x, point.y));
|
| + if (!pAnnot) {
|
| KillFocusAnnot(nFlag);
|
| return FALSE;
|
| }
|
|
|
| + CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv();
|
| CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
|
| - FX_BOOL bRet =
|
| - pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag, point);
|
| - if (bRet)
|
| - SetFocusAnnot(pFXAnnot);
|
| - return bRet;
|
| + if (!pAnnotHandlerMgr->Annot_OnLButtonDown(this, &pAnnot, nFlag, point))
|
| + return FALSE;
|
| +
|
| + if (!pAnnot)
|
| + return FALSE;
|
| +
|
| + SetFocusAnnot(&pAnnot);
|
| + return TRUE;
|
| }
|
|
|
| #ifdef PDF_ENABLE_XFA
|
| FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point,
|
| uint32_t nFlag) {
|
| + CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point.x, point.y));
|
| + if (!pAnnot)
|
| + return FALSE;
|
| +
|
| CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv();
|
| - ASSERT(pEnv);
|
| CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
|
| - ASSERT(pAnnotHandlerMgr);
|
| -
|
| - CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
|
| -
|
| - if (!pFXAnnot)
|
| + FX_BOOL ok =
|
| + pAnnotHandlerMgr->Annot_OnRButtonDown(this, &pAnnot, nFlag, point);
|
| + if (!pAnnot)
|
| return FALSE;
|
|
|
| - if (pAnnotHandlerMgr->Annot_OnRButtonDown(this, pFXAnnot, nFlag, point))
|
| - SetFocusAnnot(pFXAnnot);
|
| + if (ok)
|
| + SetFocusAnnot(&pAnnot);
|
|
|
| return TRUE;
|
| }
|
| @@ -356,16 +358,13 @@ FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point,
|
| FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point,
|
| uint32_t nFlag) {
|
| CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv();
|
| - ASSERT(pEnv);
|
| CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
|
| -
|
| - CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
|
| -
|
| + CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXWidgetAtPoint(point.x, point.y));
|
| if (!pFXAnnot)
|
| return FALSE;
|
|
|
| - if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, pFXAnnot, nFlag, point))
|
| - SetFocusAnnot(pFXAnnot);
|
| + if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, &pFXAnnot, nFlag, point))
|
| + SetFocusAnnot(&pFXAnnot);
|
|
|
| return TRUE;
|
| }
|
| @@ -374,46 +373,45 @@ FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point,
|
| FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CFX_FloatPoint& point,
|
| uint32_t nFlag) {
|
| CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv();
|
| - ASSERT(pEnv);
|
| CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
|
| - CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
|
| - CPDFSDK_Annot* pFocusAnnot = GetFocusAnnot();
|
| - FX_BOOL bRet = FALSE;
|
| + CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXWidgetAtPoint(point.x, point.y));
|
| + CPDFSDK_Annot::ObservedPtr pFocusAnnot(GetFocusAnnot());
|
| if (pFocusAnnot && pFocusAnnot != pFXAnnot) {
|
| // Last focus Annot gets a chance to handle the event.
|
| - bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag, point);
|
| + if (pAnnotHandlerMgr->Annot_OnLButtonUp(this, &pFocusAnnot, nFlag, point))
|
| + return TRUE;
|
| }
|
| - if (pFXAnnot && !bRet)
|
| - bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag, point);
|
| - return bRet;
|
| + return pFXAnnot &&
|
| + pAnnotHandlerMgr->Annot_OnLButtonUp(this, &pFXAnnot, nFlag, point);
|
| }
|
|
|
| FX_BOOL CPDFSDK_PageView::OnMouseMove(const CFX_FloatPoint& point, int nFlag) {
|
| CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv();
|
| CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
|
| - if (CPDFSDK_Annot* pFXAnnot = GetFXAnnotAtPoint(point.x, point.y)) {
|
| - if (m_CaptureWidget && m_CaptureWidget != pFXAnnot) {
|
| + CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXAnnotAtPoint(point.x, point.y));
|
| + if (pFXAnnot) {
|
| + if (m_pCaptureWidget && m_pCaptureWidget != pFXAnnot) {
|
| m_bExitWidget = TRUE;
|
| m_bEnterWidget = FALSE;
|
| - pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
|
| + pAnnotHandlerMgr->Annot_OnMouseExit(this, &m_pCaptureWidget, nFlag);
|
| }
|
| - m_CaptureWidget = pFXAnnot;
|
| + m_pCaptureWidget.Reset(pFXAnnot.Get());
|
| m_bOnWidget = TRUE;
|
| if (!m_bEnterWidget) {
|
| m_bEnterWidget = TRUE;
|
| m_bExitWidget = FALSE;
|
| - pAnnotHandlerMgr->Annot_OnMouseEnter(this, pFXAnnot, nFlag);
|
| + pAnnotHandlerMgr->Annot_OnMouseEnter(this, &pFXAnnot, nFlag);
|
| }
|
| - pAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point);
|
| + pAnnotHandlerMgr->Annot_OnMouseMove(this, &pFXAnnot, nFlag, point);
|
| return TRUE;
|
| }
|
| if (m_bOnWidget) {
|
| m_bOnWidget = FALSE;
|
| m_bExitWidget = TRUE;
|
| m_bEnterWidget = FALSE;
|
| - if (m_CaptureWidget) {
|
| - pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
|
| - m_CaptureWidget = nullptr;
|
| + if (m_pCaptureWidget) {
|
| + pAnnotHandlerMgr->Annot_OnMouseExit(this, &m_pCaptureWidget, nFlag);
|
| + m_pCaptureWidget.Reset();
|
| }
|
| }
|
| return FALSE;
|
| @@ -423,13 +421,14 @@ FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX,
|
| double deltaY,
|
| const CFX_FloatPoint& point,
|
| int nFlag) {
|
| - if (CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y)) {
|
| - CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv();
|
| - CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
|
| - return pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag,
|
| - (int)deltaY, point);
|
| - }
|
| - return FALSE;
|
| + CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point.x, point.y));
|
| + if (!pAnnot)
|
| + return FALSE;
|
| +
|
| + CPDFSDK_Environment* pEnv = m_pSDKDoc->GetEnv();
|
| + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
|
| + return pAnnotHandlerMgr->Annot_OnMouseWheel(this, &pAnnot, nFlag, (int)deltaY,
|
| + point);
|
| }
|
|
|
| FX_BOOL CPDFSDK_PageView::OnChar(int nChar, uint32_t nFlag) {
|
| @@ -511,9 +510,11 @@ void CPDFSDK_PageView::LoadFXAnnots() {
|
|
|
| void CPDFSDK_PageView::ClearFXAnnots() {
|
| SetLock(TRUE);
|
| - if (m_pSDKDoc && GetFocusAnnot())
|
| - m_pSDKDoc->SetFocusAnnot(nullptr);
|
| - m_CaptureWidget = nullptr;
|
| + if (m_pSDKDoc && GetFocusAnnot()) {
|
| + CPDFSDK_Annot::ObservedPtr pNull;
|
| + m_pSDKDoc->SetFocusAnnot(&pNull);
|
| + }
|
| + m_pCaptureWidget.Reset();
|
| for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
|
| m_pSDKDoc->GetEnv()->GetAnnotHandlerMgr()->ReleaseAnnot(pAnnot);
|
| m_fxAnnotArray.clear();
|
|
|