Break down CXFA_FFWidget::On{L|R}ButtonDown() into two steps.
The first step, AcceptsFocusOnButtonDown(), returns whether the
widget wants focus on a mouse click.
The second step, On{L|R}ButtonDown(), handles the click after focus
has been assigned.
Bug: chromium:820256
Change-Id: I9da1f1a930f198fc17b24acb7f1e3e6ef7f12ae4
Reviewed-on: https://pdfium-review.googlesource.com/29951
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffbarcode.cpp b/xfa/fxfa/cxfa_ffbarcode.cpp
index c458696..e35f6c8 100644
--- a/xfa/fxfa/cxfa_ffbarcode.cpp
+++ b/xfa/fxfa/cxfa_ffbarcode.cpp
@@ -221,18 +221,14 @@
}
}
-bool CXFA_FFBarcode::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFBarcode::AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) {
auto* pBarCodeWidget = static_cast<CFWL_Barcode*>(m_pNormalWidget.get());
if (!pBarCodeWidget || pBarCodeWidget->IsProtectedType())
return false;
- if (!m_pNode->IsOpenAccess())
+ if (command == FWL_MouseCommand::LeftButtonDown && !m_pNode->IsOpenAccess())
return false;
- return CXFA_FFTextEdit::OnLButtonDown(dwFlags, point);
-}
-bool CXFA_FFBarcode::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
- auto* pBarCodeWidget = static_cast<CFWL_Barcode*>(m_pNormalWidget.get());
- if (!pBarCodeWidget || pBarCodeWidget->IsProtectedType())
- return false;
- return CXFA_FFTextEdit::OnRButtonDown(dwFlags, point);
+ return CXFA_FFTextEdit::AcceptsFocusOnButtonDown(dwFlags, point, command);
}
diff --git a/xfa/fxfa/cxfa_ffbarcode.h b/xfa/fxfa/cxfa_ffbarcode.h
index 7804ce3..672f89c 100644
--- a/xfa/fxfa/cxfa_ffbarcode.h
+++ b/xfa/fxfa/cxfa_ffbarcode.h
@@ -99,8 +99,9 @@
const CFX_Matrix& matrix,
uint32_t dwStatus) override;
void UpdateWidgetProperty() override;
- bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
- bool OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) override;
private:
UnownedPtr<CXFA_Barcode> barcode_;
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index 552a4e3..e9a3c49 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -382,7 +382,9 @@
: point;
}
-bool CXFA_FFField::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFField::AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) {
if (!m_pNormalWidget)
return false;
if (!m_pNode->IsOpenAccess() || !GetDoc()->GetXFADoc()->IsInteractive())
@@ -390,13 +392,16 @@
if (!PtInActiveRect(point))
return false;
+ return true;
+}
+
+void CXFA_FFField::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
SetButtonDown(true);
CFWL_MessageMouse ms(nullptr, m_pNormalWidget.get());
ms.m_dwCmd = FWL_MouseCommand::LeftButtonDown;
ms.m_dwFlags = dwFlags;
ms.m_pos = FWLToClient(point);
TranslateFWLMessage(&ms);
- return true;
}
bool CXFA_FFField::OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
@@ -452,14 +457,7 @@
return true;
}
-bool CXFA_FFField::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
- if (!m_pNormalWidget)
- return false;
- if (!m_pNode->IsOpenAccess() || !GetDoc()->GetXFADoc()->IsInteractive())
- return false;
- if (!PtInActiveRect(point))
- return false;
-
+void CXFA_FFField::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
SetButtonDown(true);
CFWL_MessageMouse ms(nullptr, m_pNormalWidget.get());
@@ -467,7 +465,6 @@
ms.m_dwFlags = dwFlags;
ms.m_pos = FWLToClient(point);
TranslateFWLMessage(&ms);
- return true;
}
bool CXFA_FFField::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
diff --git a/xfa/fxfa/cxfa_fffield.h b/xfa/fxfa/cxfa_fffield.h
index a27b384..b51234a 100644
--- a/xfa/fxfa/cxfa_fffield.h
+++ b/xfa/fxfa/cxfa_fffield.h
@@ -35,14 +35,17 @@
bool PerformLayout() override;
bool OnMouseEnter() override;
bool OnMouseExit() override;
- bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) override;
+ void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnLButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnMouseWheel(uint32_t dwFlags,
int16_t zDelta,
const CFX_PointF& point) override;
- bool OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ void OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnRButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) override;
diff --git a/xfa/fxfa/cxfa_ffimageedit.cpp b/xfa/fxfa/cxfa_ffimageedit.cpp
index df47493..40afdb1 100644
--- a/xfa/fxfa/cxfa_ffimageedit.cpp
+++ b/xfa/fxfa/cxfa_ffimageedit.cpp
@@ -96,13 +96,22 @@
iImageYDpi, iHorzAlign, iVertAlign);
}
-bool CXFA_FFImageEdit::OnLButtonDown(uint32_t dwFlags,
- const CFX_PointF& point) {
+bool CXFA_FFImageEdit::AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) {
+ if (command != FWL_MouseCommand::LeftButtonDown)
+ return CXFA_FFField::AcceptsFocusOnButtonDown(dwFlags, point, command);
+
if (!m_pNode->IsOpenAccess())
return false;
if (!PtInActiveRect(point))
return false;
+ return true;
+}
+
+void CXFA_FFImageEdit::OnLButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point) {
SetButtonDown(true);
CFWL_MessageMouse ms(nullptr, m_pNormalWidget.get());
@@ -110,7 +119,6 @@
ms.m_dwFlags = dwFlags;
ms.m_pos = FWLToClient(point);
TranslateFWLMessage(&ms);
- return true;
}
void CXFA_FFImageEdit::SetFWLRect() {
diff --git a/xfa/fxfa/cxfa_ffimageedit.h b/xfa/fxfa/cxfa_ffimageedit.h
index a7ef6a8..2b84c54 100644
--- a/xfa/fxfa/cxfa_ffimageedit.h
+++ b/xfa/fxfa/cxfa_ffimageedit.h
@@ -20,7 +20,10 @@
uint32_t dwStatus) override;
bool LoadWidget() override;
void UnloadWidget() override;
- bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) override;
+ void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
void OnProcessMessage(CFWL_Message* pMessage) override;
void OnProcessEvent(CFWL_Event* pEvent) override;
void OnDrawWidget(CXFA_Graphics* pGraphics,
diff --git a/xfa/fxfa/cxfa_ffsignature.cpp b/xfa/fxfa/cxfa_ffsignature.cpp
index 6911fac..b2e5c6a 100644
--- a/xfa/fxfa/cxfa_ffsignature.cpp
+++ b/xfa/fxfa/cxfa_ffsignature.cpp
@@ -44,11 +44,15 @@
return false;
}
-bool CXFA_FFSignature::OnLButtonDown(uint32_t dwFlags,
- const CFX_PointF& point) {
+bool CXFA_FFSignature::AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) {
return false;
}
+void CXFA_FFSignature::OnLButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point) {}
+
bool CXFA_FFSignature::OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
return false;
}
@@ -68,10 +72,8 @@
return false;
}
-bool CXFA_FFSignature::OnRButtonDown(uint32_t dwFlags,
- const CFX_PointF& point) {
- return false;
-}
+void CXFA_FFSignature::OnRButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point) {}
bool CXFA_FFSignature::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
return false;
diff --git a/xfa/fxfa/cxfa_ffsignature.h b/xfa/fxfa/cxfa_ffsignature.h
index bd09576..b8a21d3 100644
--- a/xfa/fxfa/cxfa_ffsignature.h
+++ b/xfa/fxfa/cxfa_ffsignature.h
@@ -21,14 +21,17 @@
bool LoadWidget() override;
bool OnMouseEnter() override;
bool OnMouseExit() override;
- bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) override;
+ void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnLButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnMouseWheel(uint32_t dwFlags,
int16_t zDelta,
const CFX_PointF& pointy) override;
- bool OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ void OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnRButtonDblClk(uint32_t dwFlags, const CFX_PointF& point) override;
diff --git a/xfa/fxfa/cxfa_fftext.cpp b/xfa/fxfa/cxfa_fftext.cpp
index a446993..5d6152e 100644
--- a/xfa/fxfa/cxfa_fftext.cpp
+++ b/xfa/fxfa/cxfa_fftext.cpp
@@ -99,7 +99,12 @@
return true;
}
-bool CXFA_FFText::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFText::AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) {
+ if (command != FWL_MouseCommand::LeftButtonDown)
+ return false;
+
if (!GetRectWithoutRotate().Contains(point))
return false;
@@ -107,10 +112,13 @@
if (!wsURLContent)
return false;
- SetButtonDown(true);
return true;
}
+void CXFA_FFText::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+ SetButtonDown(true);
+}
+
bool CXFA_FFText::OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) {
return GetRectWithoutRotate().Contains(point) && !!GetLinkURLAtPoint(point);
}
diff --git a/xfa/fxfa/cxfa_fftext.h b/xfa/fxfa/cxfa_fftext.h
index 8eeb523..9da39d4 100644
--- a/xfa/fxfa/cxfa_fftext.h
+++ b/xfa/fxfa/cxfa_fftext.h
@@ -15,7 +15,10 @@
~CXFA_FFText() override;
// CXFA_FFWidget
- bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) override;
+ void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnMouseMove(uint32_t dwFlags, const CFX_PointF& point) override;
FWL_WidgetHit OnHitTest(const CFX_PointF& point) override;
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 9861b52..fd2cfb7 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -107,9 +107,18 @@
m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
}
-bool CXFA_FFTextEdit::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFTextEdit::AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) {
+ if (command == FWL_MouseCommand::RightButtonDown && !m_pNode->IsOpenAccess())
+ return false;
if (!PtInActiveRect(point))
return false;
+
+ return true;
+}
+
+void CXFA_FFTextEdit::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
if (!IsFocused()) {
m_dwStatus |= XFA_WidgetStatus_Focused;
UpdateFWLData();
@@ -122,14 +131,9 @@
ms.m_dwFlags = dwFlags;
ms.m_pos = FWLToClient(point);
TranslateFWLMessage(&ms);
- return true;
}
-bool CXFA_FFTextEdit::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
- if (!m_pNode->IsOpenAccess())
- return false;
- if (!PtInActiveRect(point))
- return false;
+void CXFA_FFTextEdit::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
if (!IsFocused()) {
m_dwStatus |= XFA_WidgetStatus_Focused;
UpdateFWLData();
@@ -142,7 +146,6 @@
ms.m_dwFlags = dwFlags;
ms.m_pos = FWLToClient(point);
TranslateFWLMessage(&ms);
- return true;
}
bool CXFA_FFTextEdit::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
diff --git a/xfa/fxfa/cxfa_fftextedit.h b/xfa/fxfa/cxfa_fftextedit.h
index 1388db5..36251e1 100644
--- a/xfa/fxfa/cxfa_fftextedit.h
+++ b/xfa/fxfa/cxfa_fftextedit.h
@@ -25,8 +25,11 @@
// CXFA_FFField
bool LoadWidget() override;
void UpdateWidgetProperty() override;
- bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
- bool OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) override;
+ void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
+ void OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) override;
bool OnSetFocus(CXFA_FFWidget* pOldWidget) override;
bool OnKillFocus(CXFA_FFWidget* pNewWidget) override;
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 629f3bd..f9a4807 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -360,10 +360,14 @@
return false;
}
-bool CXFA_FFWidget::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
+bool CXFA_FFWidget::AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command) {
return false;
}
+void CXFA_FFWidget::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {}
+
bool CXFA_FFWidget::OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
return false;
}
@@ -382,9 +386,7 @@
return false;
}
-bool CXFA_FFWidget::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
- return false;
-}
+void CXFA_FFWidget::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {}
bool CXFA_FFWidget::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
return false;
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index 5098230..a16b27a 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -13,6 +13,7 @@
#include "core/fxcodec/fx_codec_def.h"
#include "core/fxge/cfx_graphstatedata.h"
#include "xfa/fwl/cfwl_app.h"
+#include "xfa/fwl/cfwl_messagemouse.h"
#include "xfa/fxfa/fxfa.h"
#include "xfa/fxfa/parser/cxfa_contentlayoutitem.h"
@@ -101,14 +102,18 @@
virtual void UpdateWidgetProperty();
virtual bool OnMouseEnter();
virtual bool OnMouseExit();
- virtual bool OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point);
+ // |command| must be LeftButtonDown or RightButtonDown.
+ virtual bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
+ const CFX_PointF& point,
+ FWL_MouseCommand command);
+ virtual void OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point);
virtual bool OnLButtonUp(uint32_t dwFlags, const CFX_PointF& point);
virtual bool OnLButtonDblClk(uint32_t dwFlags, const CFX_PointF& point);
virtual bool OnMouseMove(uint32_t dwFlags, const CFX_PointF& point);
virtual bool OnMouseWheel(uint32_t dwFlags,
int16_t zDelta,
const CFX_PointF& point);
- virtual bool OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point);
+ virtual void OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point);
virtual bool OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point);
virtual bool OnRButtonDblClk(uint32_t dwFlags, const CFX_PointF& point);
diff --git a/xfa/fxfa/cxfa_ffwidgethandler.cpp b/xfa/fxfa/cxfa_ffwidgethandler.cpp
index 566923e..f2bce57 100644
--- a/xfa/fxfa/cxfa_ffwidgethandler.cpp
+++ b/xfa/fxfa/cxfa_ffwidgethandler.cpp
@@ -47,10 +47,14 @@
uint32_t dwFlags,
const CFX_PointF& point) {
m_pDocView->LockUpdate();
- bool bRet = hWidget->OnLButtonDown(dwFlags, hWidget->Rotate2Normal(point));
- if (bRet && m_pDocView->SetFocus(hWidget)) {
- m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
- m_pDocView->GetDoc(), hWidget);
+ bool bRet = hWidget->AcceptsFocusOnButtonDown(
+ dwFlags, hWidget->Rotate2Normal(point), FWL_MouseCommand::LeftButtonDown);
+ if (bRet) {
+ if (m_pDocView->SetFocus(hWidget)) {
+ m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
+ m_pDocView->GetDoc(), hWidget);
+ }
+ hWidget->OnLButtonDown(dwFlags, hWidget->Rotate2Normal(point));
}
m_pDocView->UnlockUpdate();
m_pDocView->UpdateDocView();
@@ -94,10 +98,15 @@
bool CXFA_FFWidgetHandler::OnRButtonDown(CXFA_FFWidget* hWidget,
uint32_t dwFlags,
const CFX_PointF& point) {
- bool bRet = hWidget->OnRButtonDown(dwFlags, hWidget->Rotate2Normal(point));
- if (bRet && m_pDocView->SetFocus(hWidget)) {
- m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
- m_pDocView->GetDoc(), hWidget);
+ bool bRet =
+ hWidget->AcceptsFocusOnButtonDown(dwFlags, hWidget->Rotate2Normal(point),
+ FWL_MouseCommand::RightButtonDown);
+ if (bRet) {
+ if (m_pDocView->SetFocus(hWidget)) {
+ m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
+ m_pDocView->GetDoc(), hWidget);
+ }
+ hWidget->OnRButtonDown(dwFlags, hWidget->Rotate2Normal(point));
}
return bRet;
}