summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Raykowski <raykowj@gmail.com>2019-05-01 22:18:30 -0800
committerJim Raykowski <raykowj@gmail.com>2019-05-04 02:35:33 +0200
commit3f6fcaa97e3f75c5f12febe821c63f0c2f96e07a (patch)
tree6cf5a2b528e991bc7d815150121f1ac79b05737d
parent7ca7d61dc25f409e209b3a432c7f07469b17e316 (diff)
tdf#105881 Toolbar keyboard navigation fixes
This patch makes toolbar keyboard navigation wrap to the begining or end toolbar item and enables access to the overflow menu using the keyboard. Change-Id: I5975b0f731beb00cf26f8e8a33e6ea4fa9322881 Reviewed-on: https://gerrit.libreoffice.org/71718 Tested-by: Jenkins Reviewed-by: Jim Raykowski <raykowj@gmail.com>
-rw-r--r--framework/source/uielement/toolbarmanager.cxx8
-rw-r--r--vcl/inc/toolbox.h1
-rw-r--r--vcl/source/window/toolbox.cxx38
-rw-r--r--vcl/source/window/toolbox2.cxx1
4 files changed, 38 insertions, 10 deletions
diff --git a/framework/source/uielement/toolbarmanager.cxx b/framework/source/uielement/toolbarmanager.cxx
index 280958311ae4..e64eb89944ce 100644
--- a/framework/source/uielement/toolbarmanager.cxx
+++ b/framework/source/uielement/toolbarmanager.cxx
@@ -62,6 +62,7 @@
#include <comphelper/sequence.hxx>
#include <svtools/miscopt.hxx>
#include <svtools/imgdef.hxx>
+#include <vcl/event.hxx>
#include <vcl/svapp.hxx>
#include <vcl/menu.hxx>
#include <vcl/syswin.hxx>
@@ -1567,6 +1568,13 @@ IMPL_LINK( ToolBarManager, MenuButton, ToolBox*, pToolBar, void )
pOverflowToolBar->EnableDocking();
pOverflowToolBar->AddEventListener( LINK( this, ToolBarManager, OverflowEventListener ) );
vcl::Window::GetDockingManager()->StartPopupMode( pToolBar, pOverflowToolBar, FloatWinPopupFlags::AllMouseButtonClose );
+
+ // send HOME key to subtoolbar in order to select first item if keyboard activated
+ if(pToolBar->IsKeyEvent() )
+ {
+ ::KeyEvent aEvent( 0, vcl::KeyCode( KEY_HOME ) );
+ pOverflowToolBar->KeyInput(aEvent);
+ }
}
IMPL_LINK( ToolBarManager, OverflowEventListener, VclWindowEvent&, rWindowEvent, void )
diff --git a/vcl/inc/toolbox.h b/vcl/inc/toolbox.h
index 4540cb0c109c..1c9fb88d15a8 100644
--- a/vcl/inc/toolbox.h
+++ b/vcl/inc/toolbox.h
@@ -147,6 +147,7 @@ struct ImplToolBoxPrivateData
mbKeyInputDisabled:1, // no KEY input if all items disabled, closing/docking will be allowed though
mbIsPaintLocked:1, // don't allow paints
mbMenubuttonSelected:1, // menu button is highlighted
+ mbMenubuttonWasLastSelected:1, // menu button was highlighted when focus was lost
mbNativeButtons:1, // system supports native toolbar buttons
mbWillUsePopupMode:1, // this toolbox will be opened in popup mode
mbDropDownByKeyboard:1; // tells whether a dropdown was started by key input
diff --git a/vcl/source/window/toolbox.cxx b/vcl/source/window/toolbox.cxx
index c7bc19f089c1..6ff26a004ad5 100644
--- a/vcl/source/window/toolbox.cxx
+++ b/vcl/source/window/toolbox.cxx
@@ -3896,11 +3896,20 @@ bool ToolBox::EventNotify( NotifyEvent& rNEvt )
if( rNEvt.GetWindow() == this )
{
// the toolbar itself got the focus
- if( mnLastFocusItemId != 0 )
+ if( mnLastFocusItemId != 0 || mpData->mbMenubuttonWasLastSelected )
{
// restore last item
- ImplChangeHighlight( ImplGetItem( mnLastFocusItemId ) );
- mnLastFocusItemId = 0;
+ if( mpData->mbMenubuttonWasLastSelected )
+ {
+ ImplChangeHighlight( nullptr );
+ mpData->mbMenubuttonSelected = true;
+ InvalidateMenuButton();
+ }
+ else
+ {
+ ImplChangeHighlight( ImplGetItem( mnLastFocusItemId ) );
+ mnLastFocusItemId = 0;
+ }
}
else if( (GetGetFocusFlags() & (GetFocusFlags::Backward|GetFocusFlags::Tab) ) == (GetFocusFlags::Backward|GetFocusFlags::Tab))
// Shift-TAB was pressed in the parent
@@ -3934,6 +3943,7 @@ bool ToolBox::EventNotify( NotifyEvent& rNEvt )
{
// deselect
ImplHideFocus();
+ mpData->mbMenubuttonWasLastSelected = false;
mnHighItemId = 0;
mnCurPos = ITEM_NOTFOUND;
}
@@ -4458,18 +4468,17 @@ bool ToolBox::ImplOpenItem( vcl::KeyCode aKeyCode )
{
if( ImplCloseLastPopup( GetParent() ) )
return bRet;
-
+ mbIsKeyEvent = true;
if ( maMenuButtonHdl.IsSet() )
maMenuButtonHdl.Call( this );
else
ExecuteCustomMenu( mpData->maMenubuttonItem.maRect );
+ mpData->mbMenubuttonWasLastSelected = true;
+ mbIsKeyEvent = false;
}
else if( mnHighItemId && ImplGetItem( mnHighItemId ) &&
(ImplGetItem( mnHighItemId )->mnBits & ToolBoxItemBits::DROPDOWN) )
{
- if( ImplCloseLastPopup( GetParent() ) )
- return bRet;
-
mnDownItemId = mnCurItemId = mnHighItemId;
mnCurPos = GetItemPos( mnCurItemId );
mnLastFocusItemId = mnCurItemId; // save item id for possible later focus restore
@@ -4844,6 +4853,7 @@ bool ToolBox::ImplChangeHighlightUpDn( bool bUp, bool bNoCycle )
// menubutton highlighted ?
if( mpData->mbMenubuttonSelected )
{
+ mpData->mbMenubuttonSelected = false;
if( bUp )
{
// select last valid non-clipped item
@@ -4880,6 +4890,7 @@ bool ToolBox::ImplChangeHighlightUpDn( bool bUp, bool bNoCycle )
if( (it != mpData->m_aItems.end() && &(*it) == ImplGetFirstClippedItem()) && IsMenuEnabled() )
{
ImplChangeHighlight( nullptr );
+ mpData->mbMenubuttonSelected = true;
InvalidateMenuButton();
}
else
@@ -4891,9 +4902,10 @@ bool ToolBox::ImplChangeHighlightUpDn( bool bUp, bool bNoCycle )
// Select last valid item
// docked toolbars have the menubutton as last item - if this button is enabled
- if( IsMenuEnabled() && !ImplIsFloatingMode() )
+ if( ImplHasClippedItems() && IsMenuEnabled() && !ImplIsFloatingMode() )
{
ImplChangeHighlight( nullptr );
+ mpData->mbMenubuttonSelected = true;
InvalidateMenuButton();
}
else
@@ -4926,9 +4938,10 @@ bool ToolBox::ImplChangeHighlightUpDn( bool bUp, bool bNoCycle )
return false;
// highlight the menu button if it is the last item
- if( IsMenuEnabled() && !ImplIsFloatingMode() )
+ if( ImplHasClippedItems() && IsMenuEnabled() && !ImplIsFloatingMode() )
{
ImplChangeHighlight( nullptr );
+ mpData->mbMenubuttonSelected = true;
InvalidateMenuButton();
return true;
}
@@ -4944,9 +4957,10 @@ bool ToolBox::ImplChangeHighlightUpDn( bool bUp, bool bNoCycle )
return false;
// highlight the menu button if it is the last item
- if( IsMenuEnabled() && !ImplIsFloatingMode() )
+ if( ImplHasClippedItems() && IsMenuEnabled() && !ImplIsFloatingMode() )
{
ImplChangeHighlight( nullptr );
+ mpData->mbMenubuttonSelected = true;
InvalidateMenuButton();
return true;
}
@@ -4966,6 +4980,7 @@ bool ToolBox::ImplChangeHighlightUpDn( bool bUp, bool bNoCycle )
{
// select the menu button if a clipped item would be selected
ImplChangeHighlight( nullptr );
+ mpData->mbMenubuttonSelected = true;
InvalidateMenuButton();
}
else if( i != nCount )
@@ -4994,6 +5009,7 @@ void ToolBox::ImplHideFocus()
{
if( mnHighItemId )
{
+ mpData->mbMenubuttonWasLastSelected = false;
ImplToolItem* pItem = ImplGetItem( mnHighItemId );
if( pItem && pItem->mpWindow )
{
@@ -5005,7 +5021,9 @@ void ToolBox::ImplHideFocus()
if ( mpData && mpData->mbMenubuttonSelected )
{
+ mpData->mbMenubuttonWasLastSelected = true;
// remove highlight from menubutton
+ mpData->mbMenubuttonSelected = false;
InvalidateMenuButton();
}
}
diff --git a/vcl/source/window/toolbox2.cxx b/vcl/source/window/toolbox2.cxx
index 2ae429134a28..9981da0ada76 100644
--- a/vcl/source/window/toolbox2.cxx
+++ b/vcl/source/window/toolbox2.cxx
@@ -62,6 +62,7 @@ ImplToolBoxPrivateData::ImplToolBoxPrivateData()
mbAssumeFloating = false;
mbKeyInputDisabled = false;
mbMenubuttonSelected = false;
+ mbMenubuttonWasLastSelected = false;
mbWillUsePopupMode = false;
mbDropDownByKeyboard = false;
}