From c5301f215fec9016c3a75ff4a6a0c6c22f152718 Mon Sep 17 00:00:00 2001 From: Maxim Monastirsky Date: Wed, 12 Aug 2020 23:36:52 +0300 Subject: Replace MenuToolbarController with the usual approach for menu buttons i.e. ResourceMenuController + GenericPopupToolbarController. (Decl. of both isn't available in a header file, so they are instantiated via the service manager for now. This is a bit weird for something from the same module, but should not make any difference in practice.) Change-Id: Ia3fc7ba82b0f6e1a43aa7b5e56e2cff7e039d877 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100725 Tested-by: Jenkins Reviewed-by: Maxim Monastirsky --- .../inc/uielement/generictoolbarcontroller.hxx | 22 ----- .../source/uielement/generictoolbarcontroller.cxx | 95 ---------------------- .../source/uielement/popuptoolbarcontroller.cxx | 33 ++++++-- .../source/uielement/resourcemenucontroller.cxx | 4 + framework/source/uielement/toolbarmanager.cxx | 3 +- 5 files changed, 33 insertions(+), 124 deletions(-) diff --git a/framework/inc/uielement/generictoolbarcontroller.hxx b/framework/inc/uielement/generictoolbarcontroller.hxx index eac6e8276b50..35934818ccb7 100644 --- a/framework/inc/uielement/generictoolbarcontroller.hxx +++ b/framework/inc/uielement/generictoolbarcontroller.hxx @@ -21,13 +21,8 @@ #define INCLUDED_FRAMEWORK_INC_UIELEMENT_GENERICTOOLBARCONTROLLER_HXX #include -#include - -#include -#include #include -class PopupMenu; class ToolBox; namespace framework @@ -69,23 +64,6 @@ class GenericToolbarController final : public svt::ToolboxController OUString m_aEnumCommand; }; -class MenuToolbarController final : public svt::ToolboxController -{ - css::uno::Reference< css::container::XIndexAccess > m_xMenuDesc; - VclPtr pMenu; - css::uno::Reference< css::lang::XComponent > m_xMenuManager; - -public: - // XStatusListener - virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& ) override {} - // XComponent - virtual void SAL_CALL dispose() override; - // XInitialization - virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& rArgs ) override; - // XToolbarController - virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createPopupWindow() override; -}; - } #endif // INCLUDED_FRAMEWORK_INC_UIELEMENT_GENERICTOOLBARCONTROLLER_HXX diff --git a/framework/source/uielement/generictoolbarcontroller.cxx b/framework/source/uielement/generictoolbarcontroller.cxx index b13739932b32..8bea883d90d6 100644 --- a/framework/source/uielement/generictoolbarcontroller.cxx +++ b/framework/source/uielement/generictoolbarcontroller.cxx @@ -21,30 +21,22 @@ #include #include -#include #include #include #include -#include -#include #include -#include #include #include #include #include #include -#include -using namespace ::com::sun::star::awt; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::frame; using namespace ::com::sun::star::frame::status; -using namespace ::com::sun::star::util; -using namespace ::com::sun::star::container; namespace framework { @@ -281,93 +273,6 @@ IMPL_STATIC_LINK( GenericToolbarController, ExecuteHdl_Impl, void*, p, void ) delete pExecuteInfo; } -void MenuToolbarController::dispose() -{ - try - { - if ( m_xMenuManager.is() ) - m_xMenuManager->dispose(); - } - catch( const Exception& ) {} - - m_xMenuManager.clear(); - m_xMenuDesc.clear(); - pMenu.disposeAndClear(); -} - -void MenuToolbarController::initialize( const css::uno::Sequence< css::uno::Any >& rArgs ) -{ - ToolboxController::initialize( rArgs ); - - css::uno::Reference< css::container::XIndexAccess > xMenuContainer; - try - { - css::uno::Reference< css::frame::XController > xController( m_xFrame->getController() ); - css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > xSupplier( xController->getModel(), css::uno::UNO_QUERY_THROW ); - css::uno::Reference< css::ui::XUIConfigurationManager > xConfigManager( xSupplier->getUIConfigurationManager() ); - xMenuContainer.set( xConfigManager->getSettings( m_aCommandURL, false ) ); - } - catch( const css::uno::Exception& ) - {} - - if ( !xMenuContainer.is() ) - { - try - { - css::uno::Reference< css::ui::XModuleUIConfigurationManagerSupplier > xSupplier( - css::ui::theModuleUIConfigurationManagerSupplier::get( m_xContext ) ); - css::uno::Reference< css::ui::XUIConfigurationManager > xConfigManager( - xSupplier->getUIConfigurationManager( m_sModuleName ) ); - xMenuContainer.set( xConfigManager->getSettings( m_aCommandURL, false ) ); - } - catch( const css::uno::Exception& ) - {} - } - - if ( !(xMenuContainer.is() && xMenuContainer->getCount()) ) - return; - - Sequence< PropertyValue > aProps; - // drop down menu info is currently the first ( and only ) menu in the menusettings container - xMenuContainer->getByIndex(0) >>= aProps; - for ( const auto& aProp : std::as_const(aProps) ) - { - if ( aProp.Name == "ItemDescriptorContainer" ) - { - aProp.Value >>= m_xMenuDesc; - break; - } - } - - ToolBox* pToolBox = nullptr; - sal_uInt16 nId = 0; - if ( getToolboxId( nId, &pToolBox ) ) - pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY ); -} - -Reference< XWindow > SAL_CALL -MenuToolbarController::createPopupWindow() -{ - if ( !pMenu ) - { - pMenu = VclPtr::Create(); - css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY ); - sal_uInt16 m_nMenuId = 1; - MenuBarManager::FillMenu( m_nMenuId, pMenu, m_sModuleName, m_xMenuDesc, xDispatchProvider ); - m_xMenuManager.set( new MenuBarManager( m_xContext, m_xFrame, m_xUrlTransformer, xDispatchProvider, m_sModuleName, pMenu, false, false ) ); - } - - ToolBox* pToolBox = nullptr; - sal_uInt16 nId = 0; - if ( !getToolboxId( nId, &pToolBox ) ) - return nullptr; - - pToolBox->SetItemDown( m_nToolBoxId, true ); - pMenu->Execute( pToolBox, pToolBox->GetItemRect( nId ), PopupMenuFlags::ExecuteDown ); - pToolBox->SetItemDown( m_nToolBoxId, false ); - - return nullptr; -} } // namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/uielement/popuptoolbarcontroller.cxx b/framework/source/uielement/popuptoolbarcontroller.cxx index dca150045cb6..8c91779a8518 100644 --- a/framework/source/uielement/popuptoolbarcontroller.cxx +++ b/framework/source/uielement/popuptoolbarcontroller.cxx @@ -78,6 +78,7 @@ protected: void createPopupMenuController(); bool m_bHasController; + bool m_bResourceURL; OUString m_aPopupCommand; css::uno::Reference< css::awt::XPopupMenu > m_xPopupMenu; @@ -91,6 +92,7 @@ PopupMenuToolbarController::PopupMenuToolbarController( const OUString &rPopupCommand ) : ToolBarBase( xContext, css::uno::Reference< css::frame::XFrame >(), /*aCommandURL*/OUString() ) , m_bHasController( false ) + , m_bResourceURL( false ) , m_aPopupCommand( rPopupCommand ) { } @@ -142,6 +144,12 @@ void SAL_CALL PopupMenuToolbarController::initialize( TOOLS_INFO_EXCEPTION( "fwk.uielement", "" ); } + if ( !m_bHasController && m_aPopupCommand.startsWith( "private:resource/" ) ) + { + m_bResourceURL = true; + m_bHasController = true; + } + SolarMutexGuard aSolarLock; VclPtr< ToolBox > pToolBox = static_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ).get() ); if ( pToolBox ) @@ -158,6 +166,9 @@ void SAL_CALL PopupMenuToolbarController::initialize( void SAL_CALL PopupMenuToolbarController::statusChanged( const css::frame::FeatureStateEvent& rEvent ) { + if ( m_bResourceURL ) + return; + ToolBox* pToolBox = nullptr; sal_uInt16 nItemId = 0; if ( getToolboxId( nItemId, &pToolBox ) ) @@ -228,10 +239,12 @@ void PopupMenuToolbarController::createPopupMenuController() } else { - css::uno::Sequence< css::uno::Any > aArgs( 3 ); - aArgs[0] <<= comphelper::makePropertyValue( "Frame", m_xFrame ); - aArgs[1] <<= comphelper::makePropertyValue( "ModuleIdentifier", getModuleName() ); - aArgs[2] <<= comphelper::makePropertyValue( "InToolbar", true ); + css::uno::Sequence aArgs { + css::uno::makeAny(comphelper::makePropertyValue("Frame", m_xFrame)), + css::uno::makeAny(comphelper::makePropertyValue("ModuleIdentifier", m_sModuleName)), + css::uno::makeAny(comphelper::makePropertyValue("InToolbar", true)), + css::uno::makeAny(comphelper::makePropertyValue("ResourceURL", m_aPopupCommand)) + }; try { @@ -239,9 +252,17 @@ void PopupMenuToolbarController::createPopupMenuController() m_xContext->getServiceManager()->createInstanceWithContext( "com.sun.star.awt.PopupMenu", m_xContext ), css::uno::UNO_QUERY_THROW ); - m_xPopupMenuController.set( - m_xPopupMenuFactory->createInstanceWithArgumentsAndContext( + + if (m_bResourceURL) + { + m_xPopupMenuController.set( m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.comp.framework.ResourceMenuController", aArgs, m_xContext), css::uno::UNO_QUERY_THROW ); + } + else + { + m_xPopupMenuController.set( m_xPopupMenuFactory->createInstanceWithArgumentsAndContext( m_aPopupCommand, aArgs, m_xContext), css::uno::UNO_QUERY_THROW ); + } m_xPopupMenuController->setPopupMenu( m_xPopupMenu ); } diff --git a/framework/source/uielement/resourcemenucontroller.cxx b/framework/source/uielement/resourcemenucontroller.cxx index 0594bfea8ddf..f1f7dace3289 100644 --- a/framework/source/uielement/resourcemenucontroller.cxx +++ b/framework/source/uielement/resourcemenucontroller.cxx @@ -93,6 +93,10 @@ ResourceMenuController::ResourceMenuController( const css::uno::Reference< css:: else m_aMenuURL = "private:resource/popupmenu/" + aMenuName; } + else if ( aPropValue.Name == "ResourceURL" ) + { + aPropValue.Value >>= m_aMenuURL; + } else if ( aPropValue.Name == "Frame" ) aPropValue.Value >>= m_xFrame; else if ( aPropValue.Name == "ModuleIdentifier" ) diff --git a/framework/source/uielement/toolbarmanager.cxx b/framework/source/uielement/toolbarmanager.cxx index 5aae377c4066..e3d8a20f8b4b 100644 --- a/framework/source/uielement/toolbarmanager.cxx +++ b/framework/source/uielement/toolbarmanager.cxx @@ -759,7 +759,8 @@ void ToolBarManager::CreateControllers() } else if ( aCommandURL.startsWith( "private:resource/menubar/" ) ) { - xController.set( new MenuToolbarController ); + xController.set( m_xContext->getServiceManager()->createInstanceWithContext( + "com.sun.star.comp.framework.GenericPopupToolbarController", m_xContext ), UNO_QUERY ); } else { -- cgit v1.2.3