summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--framework/source/uielement/toolbarmanager.cxx16
-rw-r--r--vcl/source/window/toolbox2.cxx8
2 files changed, 21 insertions, 3 deletions
diff --git a/framework/source/uielement/toolbarmanager.cxx b/framework/source/uielement/toolbarmanager.cxx
index 2878d2b7ef9c..39ecdb22c388 100644
--- a/framework/source/uielement/toolbarmanager.cxx
+++ b/framework/source/uielement/toolbarmanager.cxx
@@ -226,8 +226,6 @@ ToolBarManager::ToolBarManager( const Reference< XComponentContext >& rxContext,
m_pToolBar->SetCommandHdl( LINK( this, ToolBarManager, Command ) );
m_pToolBar->SetMenuType( nMenuType );
m_pToolBar->SetMenuButtonHdl( LINK( this, ToolBarManager, MenuButton ) );
- m_pToolBar->GetMenu()->SetSelectHdl( LINK( this, ToolBarManager, MenuSelect ) );
- m_pToolBar->GetMenu()->SetDeactivateHdl( LINK( this, ToolBarManager, MenuDeactivate ) );
// set name for testtool, the useful part is after the last '/'
sal_Int32 idx = rResourceName.lastIndexOf('/');
@@ -1786,10 +1784,24 @@ IMPL_LINK( ToolBarManager, Command, CommandEvent*, pCmdEvt )
::PopupMenu * pMenu = GetToolBarCustomMenu(m_pToolBar);
if (pMenu)
{
+ // We only want to handle events for the context menu, but not events
+ // on the toolbars overflow menu, hence we should only receive events
+ // from the toolbox menu when we are actually showing it as our context
+ // menu (the same menu retrieved with GetMenu() is reused for both the
+ // overflow and context menus). If we set these Hdls permanently rather
+ // than just when the context menu is showing, then events are duplicated
+ // when the menu is being used as an overflow menu.
+ m_pToolBar->GetMenu()->SetSelectHdl( LINK( this, ToolBarManager, MenuSelect ) );
+ m_pToolBar->GetMenu()->SetDeactivateHdl( LINK( this, ToolBarManager, MenuDeactivate ) );
+
// make sure all disabled entries will be shown
pMenu->SetMenuFlags( pMenu->GetMenuFlags() | MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES );
::Point aPoint( pCmdEvt->GetMousePosPixel() );
pMenu->Execute( m_pToolBar, aPoint );
+
+ // Unlink our listeners again -- see above for why.
+ m_pToolBar->GetMenu()->SetSelectHdl( Link() );
+ m_pToolBar->GetMenu()->SetDeactivateHdl( Link() );
}
return 0;
diff --git a/vcl/source/window/toolbox2.cxx b/vcl/source/window/toolbox2.cxx
index 5b36f8c3cf61..0168219039df 100644
--- a/vcl/source/window/toolbox2.cxx
+++ b/vcl/source/window/toolbox2.cxx
@@ -1992,7 +1992,13 @@ void ToolBox::ImplExecuteCustomMenu()
// call button handler to allow for menu customization
mpData->maMenuButtonHdl.Call( this );
- // register handler
+ // We specifically only register this event listener when executing our
+ // overflow menu (and remove it directly afterwards), as the same menu
+ // is reused for both the overflow menu (as managed here in ToolBox),
+ // but also by ToolBarManager for its context menu. If we leave event
+ // listeners alive beyond when the menu is showing in the desired mode
+ // then duplicate events can happen as the context menu "duplicates"
+ // items from the overflow menu, which both listeners would then act on.
GetMenu()->AddEventListener( LINK( this, ToolBox, ImplCustomMenuListener ) );
// make sure all disabled entries will be shown