[Libreoffice-commits] core.git: sw/source

Jim Raykowski (via logerrit) logerrit at kemper.freedesktop.org
Wed Apr 7 23:34:12 UTC 2021


 sw/source/uibase/docvw/OutlineContentVisibilityWin.cxx |   61 ++++-------------
 sw/source/uibase/inc/OutlineContentVisibilityWin.hxx   |    1 
 2 files changed, 15 insertions(+), 47 deletions(-)

New commits:
commit 7d6e12c01e6c1dd050818a2ea76faa6bf89e41f1
Author:     Jim Raykowski <raykowj at gmail.com>
AuthorDate: Thu Apr 1 17:28:03 2021 -0800
Commit:     Jim Raykowski <raykowj at gmail.com>
CommitDate: Thu Apr 8 01:33:28 2021 +0200

    tdf#141276 Don't grab focus to the fold buttons
    
    Change-Id: I30b612c168a1592549c57e871594cb840e6e5be8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113496
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <raykowj at gmail.com>

diff --git a/sw/source/uibase/docvw/OutlineContentVisibilityWin.cxx b/sw/source/uibase/docvw/OutlineContentVisibilityWin.cxx
index e866ac0549be..263009c13683 100644
--- a/sw/source/uibase/docvw/OutlineContentVisibilityWin.cxx
+++ b/sw/source/uibase/docvw/OutlineContentVisibilityWin.cxx
@@ -49,9 +49,6 @@ SwOutlineContentVisibilityWin::SwOutlineContentVisibilityWin(SwEditWin* pEditWin
     m_xShowBtn->connect_mouse_press(LINK(this, SwOutlineContentVisibilityWin, MousePressHdl));
     m_xHideBtn->connect_mouse_press(LINK(this, SwOutlineContentVisibilityWin, MousePressHdl));
 
-    m_xShowBtn->connect_key_press(LINK(this, SwOutlineContentVisibilityWin, KeyInputHdl));
-    m_xHideBtn->connect_key_press(LINK(this, SwOutlineContentVisibilityWin, KeyInputHdl));
-
     m_aDelayTimer.SetTimeout(25);
     m_aDelayTimer.SetInvokeHandler(LINK(this, SwOutlineContentVisibilityWin, DelayAppearHandler));
 }
@@ -87,8 +84,6 @@ void SwOutlineContentVisibilityWin::SetSymbol(ButtonSymbol eStyle)
     bool bShow = eStyle == ButtonSymbol::SHOW;
     bool bHide = eStyle == ButtonSymbol::HIDE;
 
-    bool bControlHasFocus = ControlHasFocus();
-
     // disable mouse move for the hidden button so we don't get mouse
     // leave events we don't care about when we swap buttons
     m_xShowBtn->connect_mouse_move(Link<const MouseEvent&, bool>());
@@ -104,11 +99,7 @@ void SwOutlineContentVisibilityWin::SetSymbol(ButtonSymbol eStyle)
         pButton = m_xHideBtn.get();
     InitControlBase(pButton);
     if (pButton)
-    {
         pButton->connect_mouse_move(LINK(this, SwOutlineContentVisibilityWin, MouseMoveHdl));
-        if (bControlHasFocus)
-            pButton->grab_focus();
-    }
 }
 
 void SwOutlineContentVisibilityWin::Set()
@@ -194,9 +185,6 @@ void SwOutlineContentVisibilityWin::ToggleOutlineContentVisibility(const bool bS
     if (GetEditWin()->GetView().IsDrawMode())
         GetEditWin()->GetView().LeaveDrawCreate();
     rSh.EnterStdMode();
-    // set cursor position here so Navigator tracks outline
-    // when doc changed broadcast message is sent in toggle function
-    rSh.GotoOutline(m_nOutlinePos);
     if (rSh.GetViewOptions()->IsTreatSubOutlineLevelsAsContent())
         rSh.ToggleOutlineContentVisibility(m_nOutlinePos);
     else if (bSubs)
@@ -216,40 +204,16 @@ void SwOutlineContentVisibilityWin::ToggleOutlineContentVisibility(const bool bS
     }
     else
         rSh.ToggleOutlineContentVisibility(m_nOutlinePos);
-    if (!m_bDestroyed)
-    {
-        SetSymbol(rSh.IsOutlineContentVisible(m_nOutlinePos) ? ButtonSymbol::HIDE
-                                                             : ButtonSymbol::SHOW);
-    }
+    // set cursor position to the toggled outline node
+    rSh.GotoOutline(m_nOutlinePos);
     rSh.LockView(false);
 }
 
-IMPL_LINK(SwOutlineContentVisibilityWin, KeyInputHdl, const KeyEvent&, rKEvt, bool)
-{
-    bool bConsumed = false;
-
-    vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
-    if (!aKeyCode.GetModifier()
-        && (aKeyCode.GetCode() == KEY_RETURN || aKeyCode.GetCode() == KEY_SPACE))
-    {
-        ToggleOutlineContentVisibility(aKeyCode.GetCode() == KEY_RETURN);
-        bConsumed = true;
-    }
-    else if (aKeyCode.GetCode() == KEY_ESCAPE)
-    {
-        Hide();
-        GrabFocusToDocument();
-        bConsumed = true;
-    }
-
-    return bConsumed;
-}
-
 IMPL_LINK(SwOutlineContentVisibilityWin, MouseMoveHdl, const MouseEvent&, rMEvt, bool)
 {
     if (rMEvt.IsLeaveWindow())
     {
-        if (GetSymbol() != ButtonSymbol::SHOW)
+        if (GetSymbol() == ButtonSymbol::HIDE)
         {
             // MouseMove event may not be seen by the edit window for example when move is to
             // a show button or when move is outside of the edit window.
@@ -261,7 +225,6 @@ IMPL_LINK(SwOutlineContentVisibilityWin, MouseMoveHdl, const MouseEvent&, rMEvt,
                 || nY >= GetEditWin()->GetSizePixel().Height())
                 Hide();
         }
-        GrabFocusToDocument();
     }
     else if (rMEvt.IsEnterWindow())
     {
@@ -269,16 +232,25 @@ IMPL_LINK(SwOutlineContentVisibilityWin, MouseMoveHdl, const MouseEvent&, rMEvt,
             m_aDelayTimer.Stop();
         // bring button to top and grab focus
         SetZOrder(this, ZOrderFlags::First);
-        if (!ControlHasFocus())
-            GrabFocus();
     }
-    GetEditWin()->SetSavedOutlineFrame(const_cast<SwFrame*>(GetFrame()));
     return false;
 }
 
 IMPL_LINK(SwOutlineContentVisibilityWin, MousePressHdl, const MouseEvent&, rMEvt, bool)
 {
+    Hide();
+    // Crash occurs if control does not have focus when toggling from hidden to shown.
+    // Seems to happen due to the control being disposed in the toggle process.
+    // Does NOT crash in debugger with GrabFocus and GrabFocusToDocument commented out.
+    // DOES crash in debugger on GrabFocusToDocument when GrabFocus is commented out.
+    // Until light is shed on why this happens, prevent crash by doing the following:
+    //  1) grab focus to the control
+    //  2) toggle content visibility
+    //  3) grab focus to the document
+    if (!ControlHasFocus())
+        GrabFocus();
     ToggleOutlineContentVisibility(rMEvt.IsRight());
+    GrabFocusToDocument();
     return false;
 }
 
@@ -292,10 +264,7 @@ IMPL_LINK_NOARG(SwOutlineContentVisibilityWin, DelayAppearHandler, Timer*, void)
         return;
     }
     if (GetEditWin()->GetSavedOutlineFrame() == GetFrame())
-    {
         Show();
-        //GrabFocus(); commented out for tdf#140567
-    }
     m_aDelayTimer.Stop();
 }
 
diff --git a/sw/source/uibase/inc/OutlineContentVisibilityWin.hxx b/sw/source/uibase/inc/OutlineContentVisibilityWin.hxx
index fcd7617e40a1..96c0c0500ac4 100644
--- a/sw/source/uibase/inc/OutlineContentVisibilityWin.hxx
+++ b/sw/source/uibase/inc/OutlineContentVisibilityWin.hxx
@@ -55,7 +55,6 @@ private:
     DECL_LINK(DelayAppearHandler, Timer*, void);
     DECL_LINK(MousePressHdl, const MouseEvent&, bool);
     DECL_LINK(MouseMoveHdl, const MouseEvent&, bool);
-    DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list