diff options
-rw-r--r-- | framework/source/uielement/toolbarmanager.cxx | 16 | ||||
-rw-r--r-- | vcl/source/window/toolbox2.cxx | 8 |
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 |