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);

Reply via email to