summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Monastirsky <momonasmon@gmail.com>2020-08-12 23:36:52 +0300
committerMaxim Monastirsky <momonasmon@gmail.com>2020-08-14 17:03:41 +0200
commitc5301f215fec9016c3a75ff4a6a0c6c22f152718 (patch)
tree7a4f147999967eeb161dbf4383ad19e20db5f4de
parentf3cb59c46398b3a0646b8b374d5626f715fa6884 (diff)
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 <momonasmon@gmail.com>
-rw-r--r--framework/inc/uielement/generictoolbarcontroller.hxx22
-rw-r--r--framework/source/uielement/generictoolbarcontroller.cxx95
-rw-r--r--framework/source/uielement/popuptoolbarcontroller.cxx33
-rw-r--r--framework/source/uielement/resourcemenucontroller.cxx4
-rw-r--r--framework/source/uielement/toolbarmanager.cxx3
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 <svtools/toolboxcontroller.hxx>
-#include <com/sun/star/container/XIndexAccess.hpp>
-
-#include <tools/link.hxx>
-#include <vcl/menu.hxx>
#include <vcl/vclptr.hxx>
-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<PopupMenu> 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 <com/sun/star/util/XURLTransformer.hpp>
#include <com/sun/star/frame/XDispatchProvider.hpp>
-#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/lang/DisposedException.hpp>
#include <com/sun/star/frame/status/ItemStatus.hpp>
#include <com/sun/star/frame/status/Visibility.hpp>
-#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
-#include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
#include <com/sun/star/frame/ControlCommand.hpp>
-#include <svtools/toolboxcontroller.hxx>
#include <vcl/svapp.hxx>
#include <vcl/toolbox.hxx>
#include <tools/urlobj.hxx>
#include <strings.hrc>
#include <classes/fwkresid.hxx>
-#include <uielement/menubarmanager.hxx>
-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<PopupMenu>::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<css::uno::Any> 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
{