Kaydet (Commit) 1d0f08cd authored tarafından Maxim Monastirsky's avatar Maxim Monastirsky

Use ResourceMenuController for toolbar-based menus too

No need for yet another controller that does similar things.

Change-Id: I4ad79d82ea34a90a43e36082d1fb834201dba3a1
üst 80d1c914
...@@ -156,7 +156,6 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\ ...@@ -156,7 +156,6 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\
framework/source/uielement/subtoolbarcontroller \ framework/source/uielement/subtoolbarcontroller \
framework/source/uielement/thesaurusmenucontroller \ framework/source/uielement/thesaurusmenucontroller \
framework/source/uielement/togglebuttontoolbarcontroller \ framework/source/uielement/togglebuttontoolbarcontroller \
framework/source/uielement/toolbarasmenucontroller \
framework/source/uielement/toolbarmanager \ framework/source/uielement/toolbarmanager \
framework/source/uielement/toolbarmerger \ framework/source/uielement/toolbarmerger \
framework/source/uielement/toolbarwrapper \ framework/source/uielement/toolbarwrapper \
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <com/sun/star/embed/VerbDescriptor.hpp> #include <com/sun/star/embed/VerbDescriptor.hpp>
#include <com/sun/star/frame/ModuleManager.hpp> #include <com/sun/star/frame/ModuleManager.hpp>
#include <com/sun/star/frame/XStorable.hpp> #include <com/sun/star/frame/XStorable.hpp>
#include <com/sun/star/ui/ItemType.hpp>
#include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp> #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp> #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
#include <com/sun/star/util/URL.hpp> #include <com/sun/star/util/URL.hpp>
...@@ -26,7 +27,7 @@ class ResourceMenuController : public cppu::ImplInheritanceHelper< svt::PopupMen ...@@ -26,7 +27,7 @@ class ResourceMenuController : public cppu::ImplInheritanceHelper< svt::PopupMen
{ {
public: public:
ResourceMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext, ResourceMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
const css::uno::Sequence< css::uno::Any >& rxArgs ); const css::uno::Sequence< css::uno::Any >& rxArgs, bool bToolbarContainer );
virtual ~ResourceMenuController(); virtual ~ResourceMenuController();
// XPopupMenuController // XPopupMenuController
...@@ -55,20 +56,23 @@ private: ...@@ -55,20 +56,23 @@ private:
OUString m_aMenuURL; OUString m_aMenuURL;
bool m_bContextMenu; bool m_bContextMenu;
bool m_bInToolbar; bool m_bInToolbar;
bool m_bToolbarContainer;
sal_uInt16 m_nNewMenuId; sal_uInt16 m_nNewMenuId;
rtl::Reference< framework::MenuBarManager > m_xMenuBarManager; rtl::Reference< framework::MenuBarManager > m_xMenuBarManager;
css::uno::Reference< css::container::XIndexAccess > m_xMenuContainer; css::uno::Reference< css::container::XIndexAccess > m_xMenuContainer;
css::uno::Reference< css::uno::XComponentContext > m_xContext; css::uno::Reference< css::uno::XComponentContext > m_xContext;
css::uno::Reference< css::ui::XUIConfigurationManager > m_xConfigManager, m_xModuleConfigManager; css::uno::Reference< css::ui::XUIConfigurationManager > m_xConfigManager, m_xModuleConfigManager;
void addVerbs( const css::uno::Sequence< css::embed::VerbDescriptor >& rVerbs ); void addVerbs( const css::uno::Sequence< css::embed::VerbDescriptor >& rVerbs );
void fillToolbarData();
virtual void SAL_CALL disposing() override; virtual void SAL_CALL disposing() override;
}; };
ResourceMenuController::ResourceMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext, ResourceMenuController::ResourceMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
const css::uno::Sequence< css::uno::Any >& rxArgs ) : const css::uno::Sequence< css::uno::Any >& rxArgs, bool bToolbarContainer ) :
ImplInheritanceHelper( rxContext ), ImplInheritanceHelper( rxContext ),
m_bContextMenu( false ), m_bContextMenu( false ),
m_bInToolbar( false ), m_bInToolbar( false ),
m_bToolbarContainer( bToolbarContainer ),
m_nNewMenuId( 1 ), m_nNewMenuId( 1 ),
m_xContext( rxContext ) m_xContext( rxContext )
{ {
...@@ -81,7 +85,10 @@ ResourceMenuController::ResourceMenuController( const css::uno::Reference< css:: ...@@ -81,7 +85,10 @@ ResourceMenuController::ResourceMenuController( const css::uno::Reference< css::
{ {
OUString aMenuName; OUString aMenuName;
aPropValue.Value >>= aMenuName; aPropValue.Value >>= aMenuName;
m_aMenuURL = "private:resource/popupmenu/" + aMenuName; if ( m_bToolbarContainer )
m_aMenuURL = "private:resource/toolbar/" + aMenuName;
else
m_aMenuURL = "private:resource/popupmenu/" + aMenuName;
} }
else if ( aPropValue.Name == "Frame" ) else if ( aPropValue.Name == "Frame" )
aPropValue.Value >>= m_xFrame; aPropValue.Value >>= m_xFrame;
...@@ -184,9 +191,11 @@ void ResourceMenuController::updatePopupMenu() ...@@ -184,9 +191,11 @@ void ResourceMenuController::updatePopupMenu()
m_nNewMenuId = 1; m_nNewMenuId = 1;
// Now fill the menu with the configuration data. // Now fill the menu with the configuration data.
VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation( m_xPopupMenu );
css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY ); css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY );
framework::MenuBarManager::FillMenu( m_nNewMenuId, pAwtMenu->GetMenu(), m_aModuleName, m_xMenuContainer, xDispatchProvider ); if ( m_bToolbarContainer )
fillToolbarData();
else
framework::MenuBarManager::FillMenu( m_nNewMenuId, VCLXMenu::GetImplementation( m_xPopupMenu )->GetMenu(), m_aModuleName, m_xMenuContainer, xDispatchProvider );
// For context menus, add object verbs. // For context menus, add object verbs.
if ( m_bContextMenu ) if ( m_bContextMenu )
...@@ -235,6 +244,63 @@ void ResourceMenuController::addVerbs( const css::uno::Sequence< css::embed::Ver ...@@ -235,6 +244,63 @@ void ResourceMenuController::addVerbs( const css::uno::Sequence< css::embed::Ver
} }
} }
void ResourceMenuController::fillToolbarData()
{
if ( !m_xMenuContainer.is() )
return;
VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation( m_xPopupMenu );
Menu* pVCLMenu = pAwtMenu->GetMenu();
css::uno::Sequence< css::beans::PropertyValue > aPropSequence;
for ( sal_Int32 i = 0; i < m_xMenuContainer->getCount(); ++i )
{
try
{
if ( m_xMenuContainer->getByIndex( i ) >>= aPropSequence )
{
OUString aCommandURL;
OUString aLabel;
sal_uInt16 nType = css::ui::ItemType::DEFAULT;
bool bVisible = true;
for ( const auto& aProp: aPropSequence )
{
if ( aProp.Name == "CommandURL" )
aProp.Value >>= aCommandURL;
else if ( aProp.Name == "Label" )
aProp.Value >>= aLabel;
else if ( aProp.Name == "Type" )
aProp.Value >>= nType;
else if ( aProp.Name == "IsVisible" )
aProp.Value >>= bVisible;
}
switch ( nType )
{
case css::ui::ItemType::DEFAULT:
if ( bVisible )
{
pVCLMenu->InsertItem( m_nNewMenuId, aLabel );
pVCLMenu->SetItemCommand( m_nNewMenuId++, aCommandURL );
}
break;
case css::ui::ItemType::SEPARATOR_LINE:
case css::ui::ItemType::SEPARATOR_LINEBREAK:
if ( bVisible && pVCLMenu->GetItemId( pVCLMenu->GetItemCount() - 1 ) != 0 )
pVCLMenu->InsertSeparator();
break;
default: ;
}
}
}
catch ( const css::uno::Exception& )
{
break;
}
}
}
void ResourceMenuController::itemActivated( const css::awt::MenuEvent& /*rEvent*/ ) void ResourceMenuController::itemActivated( const css::awt::MenuEvent& /*rEvent*/ )
throw ( css::uno::RuntimeException, std::exception ) throw ( css::uno::RuntimeException, std::exception )
{ {
...@@ -316,14 +382,16 @@ void ResourceMenuController::disposing() ...@@ -316,14 +382,16 @@ void ResourceMenuController::disposing()
OUString ResourceMenuController::getImplementationName() OUString ResourceMenuController::getImplementationName()
throw ( css::uno::RuntimeException, std::exception ) throw ( css::uno::RuntimeException, std::exception )
{ {
if ( m_bToolbarContainer )
return OUString( "com.sun.star.comp.framework.ToolbarAsMenuController" );
return OUString( "com.sun.star.comp.framework.ResourceMenuController" ); return OUString( "com.sun.star.comp.framework.ResourceMenuController" );
} }
css::uno::Sequence< OUString > ResourceMenuController::getSupportedServiceNames() css::uno::Sequence< OUString > ResourceMenuController::getSupportedServiceNames()
throw ( css::uno::RuntimeException, std::exception ) throw ( css::uno::RuntimeException, std::exception )
{ {
css::uno::Sequence< OUString > aRet { "com.sun.star.frame.PopupMenuController" }; return { "com.sun.star.frame.PopupMenuController" };
return aRet;
} }
} }
...@@ -333,7 +401,15 @@ com_sun_star_comp_framework_ResourceMenuController_get_implementation( ...@@ -333,7 +401,15 @@ com_sun_star_comp_framework_ResourceMenuController_get_implementation(
css::uno::XComponentContext* context, css::uno::XComponentContext* context,
css::uno::Sequence< css::uno::Any > const & args ) css::uno::Sequence< css::uno::Any > const & args )
{ {
return cppu::acquire( new ResourceMenuController( context, args ) ); return cppu::acquire( new ResourceMenuController( context, args, false ) );
}
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
com_sun_star_comp_framework_ToolbarAsMenuController_get_implementation(
css::uno::XComponentContext* context,
css::uno::Sequence< css::uno::Any > const & args )
{
return cppu::acquire( new ResourceMenuController( context, args, true ) );
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment