sc/source/ui/Accessibility/AccessibleText.cxx | 2 - sc/source/ui/app/inputwin.cxx | 45 +++++++++++++++++--------- sc/source/ui/inc/inputwin.hxx | 12 +++--- 3 files changed, 37 insertions(+), 22 deletions(-)
New commits: commit b0fb6f08ea79a217e1753f5b368d5840865013b6 Author: Caolán McNamara <[email protected]> AuthorDate: Thu Nov 27 21:37:09 2025 +0000 Commit: Caolán McNamara <[email protected]> CommitDate: Fri Nov 28 16:22:35 2025 +0100 Resolves: tdf#169351 abandon inputbar mouse down on error dialog Change-Id: I5f5a282c6dd6a5bfbe264e3555d0d8c052221408 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194745 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> diff --git a/sc/source/ui/Accessibility/AccessibleText.cxx b/sc/source/ui/Accessibility/AccessibleText.cxx index 221eea10f4fe..1bcee2c072dc 100644 --- a/sc/source/ui/Accessibility/AccessibleText.cxx +++ b/sc/source/ui/Accessibility/AccessibleText.cxx @@ -847,7 +847,7 @@ SvxEditViewForwarder* ScAccessibleEditLineTextData::GetEditViewForwarder( bool b { if ( !mpTxtWnd->IsInputActive() ) { - mpTxtWnd->StartEditEngine(); + mpTxtWnd->StartEditEngine(ScInputHandler::ErrorMessage); mpTxtWnd->GrabFocus(); mpEditView = mpTxtWnd->GetEditView(); diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx index 6dd2d679627a..f38a45afd330 100644 --- a/sc/source/ui/app/inputwin.cxx +++ b/sc/source/ui/app/inputwin.cxx @@ -380,10 +380,10 @@ void ScInputWindow::Select() void ScInputWindow::StartFormula() { ScModule* pScMod = ScModule::get(); - mxTextWindow->StartEditEngine(); + mxTextWindow->StartEditEngine(ScInputHandler::ErrorMessage); if ( pScMod->IsEditMode() ) // Isn't if e.g. protected { - mxTextWindow->StartEditEngine(); + mxTextWindow->StartEditEngine(ScInputHandler::ErrorMessage); sal_Int32 nStartPos = 1; sal_Int32 nEndPos = 1; @@ -528,7 +528,7 @@ void ScInputWindow::SetFuncString( const OUString& rString, bool bDoEdit ) //! new method at ScModule to query if function autopilot is open SfxViewFrame* pViewFrm = SfxViewFrame::Current(); EnableButtons( pViewFrm && !pViewFrm->GetChildWindow( SID_OPENDLG_FUNCTION ) ); - mxTextWindow->StartEditEngine(); + mxTextWindow->StartEditEngine(ScInputHandler::ErrorMessage); ScModule* pScMod = ScModule::get(); if ( !pScMod->IsEditMode() ) @@ -666,7 +666,7 @@ void ScInputWindow::SwitchToTextWin() { // used for shift-ctrl-F2 - mxTextWindow->StartEditEngine(); + mxTextWindow->StartEditEngine(ScInputHandler::ErrorMessage); if (ScModule::get()->IsEditMode()) { mxTextWindow->TextGrabFocus(); @@ -958,9 +958,9 @@ void ScInputBarGroup::StopEditEngine(bool bAll) mxTextWndGroup->StopEditEngine(bAll); } -void ScInputBarGroup::StartEditEngine() +void ScInputBarGroup::StartEditEngine(const ErrorHdl& errorHdl) { - mxTextWndGroup->StartEditEngine(); + mxTextWndGroup->StartEditEngine(errorHdl); } void ScInputBarGroup::MakeDialogEditView() @@ -1286,9 +1286,9 @@ void ScTextWndGroup::SetTextString(const OUString& rString, bool bKitUpdate) mxTextWnd->SetTextString(rString, bKitUpdate); } -void ScTextWndGroup::StartEditEngine() +void ScTextWndGroup::StartEditEngine(const ErrorHdl& errorHdl) { - mxTextWnd->StartEditEngine(); + mxTextWnd->StartEditEngine(errorHdl); } void ScTextWndGroup::StopEditEngine(bool bAll) @@ -1447,7 +1447,7 @@ void ScTextWnd::DoScroll() } } -void ScTextWnd::StartEditEngine() +void ScTextWnd::StartEditEngine(const ErrorHdl& errorHdl) { // Don't activate if we're a modal dialog ourselves (Doc-modal dialog) SfxObjectShell* pObjSh = SfxObjectShell::Current(); @@ -1461,7 +1461,10 @@ void ScTextWnd::StartEditEngine() ScInputHandler* pHdl = mpViewShell->GetInputHandler(); if (pHdl) - pHdl->SetMode(SC_INPUT_TOP, nullptr, static_cast<ScEditEngineDefaulter*>(m_xEditEngine.get())); + { + pHdl->SetMode(SC_INPUT_TOP, nullptr, static_cast<ScEditEngineDefaulter*>(m_xEditEngine.get()), + errorHdl); + } SfxViewFrame* pViewFrm = SfxViewFrame::Current(); if (pViewFrm) @@ -1657,11 +1660,11 @@ bool ScTextWnd::CanFocus() const return ScModule::get()->IsEditMode(); } -void ScTextWnd::UpdateFocus() +void ScTextWnd::UpdateFocus(const ErrorHdl& errorHdl) { if (!HasFocus()) { - StartEditEngine(); + StartEditEngine(errorHdl); if (CanFocus()) TextGrabFocus(); } @@ -1669,7 +1672,19 @@ void ScTextWnd::UpdateFocus() bool ScTextWnd::MouseButtonDown( const MouseEvent& rMEvt ) { - UpdateFocus(); + // tdf#169351 If trying to set focus to the formula bar triggers an error + // dialog, intercept the launch of that dialog to detect this case, and in + // that case abandon the mouse handler. + bool bCanceled(false); + auto errorHdl = [&bCanceled](ScTabViewShell* pActiveViewShell, TranslateId messageId) { + ScInputHandler::ErrorMessage(pActiveViewShell, messageId); + bCanceled = true; + }; + + UpdateFocus(errorHdl); + + if (bCanceled) + return true; bool bClickOnSelection = false; if (m_xEditView) @@ -1794,7 +1809,7 @@ bool ScTextWnd::Command( const CommandEvent& rCEvt ) } if (IsMouseCaptured()) ReleaseMouse(); - UpdateFocus(); + UpdateFocus(ScInputHandler::ErrorMessage); pViewFrm->GetDispatcher()->ExecutePopup(u"formulabar"_ustr, &mrGroupBar.GetVclParent(), &aPos); } } @@ -1828,7 +1843,7 @@ bool ScTextWnd::Command( const CommandEvent& rCEvt ) // LOK uses this to setup caret position because drawingarea is replaced // with text input field, it sends logical caret position (start, end) not pixels - StartEditEngine(); + StartEditEngine(ScInputHandler::ErrorMessage); TextGrabFocus(); // information about paragraph is in additional data diff --git a/sc/source/ui/inc/inputwin.hxx b/sc/source/ui/inc/inputwin.hxx index 5d60aef1ecbb..2a6a94211362 100644 --- a/sc/source/ui/inc/inputwin.hxx +++ b/sc/source/ui/inc/inputwin.hxx @@ -31,13 +31,13 @@ #include <vcl/window.hxx> #include <formula/opcode.hxx> #include <svx/weldeditview.hxx> +#include "inputhdl.hxx" class EditView; class ScAccessibleEditLineTextData; class ScAccessibleEditObject; class ScTextWndGroup; class ScInputBarGroup; -class ScInputHandler; class ScTabViewShell; class ScTextWndBase @@ -47,7 +47,7 @@ public: virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0; virtual void SetTextString( const OUString& rString, bool bKitUpdate ) = 0; virtual const OUString& GetTextString() const = 0; - virtual void StartEditEngine() = 0; + virtual void StartEditEngine(const ErrorHdl& errorHdl) = 0; virtual void StopEditEngine( bool bAll ) = 0; virtual EditView* GetEditView() const = 0; virtual bool HasEditView() const = 0; @@ -79,7 +79,7 @@ public: // for function autopilots virtual void MakeDialogEditView() override; - virtual void StartEditEngine() override; + virtual void StartEditEngine(const ErrorHdl& errorHdl) override; virtual void StopEditEngine( bool bAll ) override; virtual void TextGrabFocus() override; @@ -132,7 +132,7 @@ private: void InitEditEngine(); - void UpdateFocus(); + void UpdateFocus(const ErrorHdl& errorHdl); rtl::Reference<svt::OStringTransferable> m_xHelper; @@ -222,7 +222,7 @@ public: void SetNumLines(tools::Long nLines); virtual void SetFormulaMode(bool bSet) override; virtual void SetTextString(const OUString& rString, bool bKitUpdate) override; - virtual void StartEditEngine() override; + virtual void StartEditEngine(const ErrorHdl& errorHdl) override; virtual void StopEditEngine(bool bAll) override; virtual void TextGrabFocus() override; @@ -247,7 +247,7 @@ public: virtual void InsertAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override; virtual void RemoveAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override; void SetTextString(const OUString& rString, bool bKitUpdate) override; - void StartEditEngine() override; + void StartEditEngine(const ErrorHdl& errorHdl) override; virtual EditView* GetEditView() const override; virtual bool HasEditView() const override; Point GetCursorScreenPixelPos(bool bBelowLine);
