diff options
author | Tsutomu Uchino <hanya@apache.org> | 2014-05-16 12:48:54 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-05-19 13:28:17 +0100 |
commit | 61ce018658cb673debae3d29a747252f6bc692ff (patch) | |
tree | 5919c957bcee23f5971a5f358aeae869e36f6d00 | |
parent | 39669d3244e3859471e665cf6afc754b6aca634e (diff) |
Resolves: #i86528# use the module manager to identify the context...
for addons menu merging
(cherry picked from commit 2aac0070dbef6c1ad7eeccf7d4015cdcbffe067e)
Conflicts:
framework/source/classes/menumanager.cxx
framework/source/fwe/classes/addonmenu.cxx
framework/source/uielement/menubarmanager.cxx
include/framework/addonmenu.hxx
Change-Id: I3b606671db3a4c6ba8ed2b850e01e1ac91db7581
-rw-r--r-- | framework/source/classes/menumanager.cxx | 2 | ||||
-rw-r--r-- | framework/source/dispatch/menudispatcher.cxx | 4 | ||||
-rw-r--r-- | framework/source/fwe/classes/addonmenu.cxx | 81 | ||||
-rw-r--r-- | framework/source/uielement/menubarmanager.cxx | 10 | ||||
-rw-r--r-- | include/framework/addonmenu.hxx | 20 | ||||
-rw-r--r-- | sfx2/source/menu/virtmenu.cxx | 12 |
6 files changed, 64 insertions, 65 deletions
diff --git a/framework/source/classes/menumanager.cxx b/framework/source/classes/menumanager.cxx index c850481b96c9..4a5b1395d39b 100644 --- a/framework/source/classes/menumanager.cxx +++ b/framework/source/classes/menumanager.cxx @@ -148,7 +148,7 @@ MenuManager::MenuManager( if ( ( nItemId == SID_ADDONLIST || aItemCommand == aSlotSpecialToolsMenu ) && AddonMenuManager::HasAddonMenuElements() ) { - AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu( rFrame ); + AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu(rFrame, rxContext); if ( pSubMenu && ( pSubMenu->GetItemCount() > 0 )) { sal_uInt16 nCount = 0; diff --git a/framework/source/dispatch/menudispatcher.cxx b/framework/source/dispatch/menudispatcher.cxx index 886bf65f214e..f4206e4ece80 100644 --- a/framework/source/dispatch/menudispatcher.cxx +++ b/framework/source/dispatch/menudispatcher.cxx @@ -261,10 +261,10 @@ bool MenuDispatcher::impl_setMenuBar( MenuBar* pMenuBar, bool bMenuFromResource xModel = uno::Reference< XModel >( xController->getModel(), UNO_QUERY ); // retrieve addon popup menus and add them to our menu bar - AddonMenuManager::MergeAddonPopupMenus( xFrame, xModel, nPos, pMenuBar ); + AddonMenuManager::MergeAddonPopupMenus( xFrame, nPos, pMenuBar, m_xContext ); // retrieve addon help menu items and add them to our help menu - AddonMenuManager::MergeAddonHelpMenu( xFrame, pMenuBar ); + AddonMenuManager::MergeAddonHelpMenu( xFrame, pMenuBar, m_xContext ); } // set new menu on our system window and create new menu manager diff --git a/framework/source/fwe/classes/addonmenu.cxx b/framework/source/fwe/classes/addonmenu.cxx index eda31f5fc97c..7e6720d950b6 100644 --- a/framework/source/fwe/classes/addonmenu.cxx +++ b/framework/source/fwe/classes/addonmenu.cxx @@ -22,11 +22,13 @@ #include <general.h> #include <framework/imageproducer.hxx> #include <framework/menuconfiguration.hxx> +#include <services.h> #include <com/sun/star/uno/Reference.hxx> #include <com/sun/star/util/URL.hpp> #include <com/sun/star/util/XURLTransformer.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/frame/ModuleManager.hpp> +#include <com/sun/star/frame/XModuleManager.hpp> #include <tools/config.hxx> #include <vcl/svapp.hxx> @@ -82,18 +84,21 @@ AddonPopupMenu::~AddonPopupMenu() { } -static Reference< XModel > GetModelFromFrame( const Reference< XFrame >& rFrame ) +static OUString GetModuleIdentifier(const Reference<XComponentContext>& rContext, + const Reference< XFrame >& rFrame) { - // Query for the model to get check the context information - Reference< XModel > xModel; - if ( rFrame.is() ) + Reference< XModuleManager > xModuleManager(ModuleManager::create(rContext)); + if ( xModuleManager.is() ) { - Reference< XController > xController( rFrame->getController(), UNO_QUERY ); - if ( xController.is() ) - xModel = xController->getModel(); + try + { + return xModuleManager->identify( rFrame ); + } + catch ( Exception& ) + { + } } - - return xModel; + return OUString(); } bool AddonMenuManager::HasAddonMenuElements() @@ -113,7 +118,8 @@ PopupMenu* AddonMenuManager::CreatePopupMenuType( MenuType eMenuType, const Refe } // Create the Add-Ons menu -AddonMenu* AddonMenuManager::CreateAddonMenu( const Reference< XFrame >& rFrame ) +AddonMenu* AddonMenuManager::CreateAddonMenu( const Reference< XFrame >& rFrame, + const Reference< XComponentContext >& rContext ) { AddonsOptions aOptions; AddonMenu* pAddonMenu = NULL; @@ -123,8 +129,8 @@ AddonMenu* AddonMenuManager::CreateAddonMenu( const Reference< XFrame >& rFrame if ( rAddonMenuEntries.getLength() > 0 ) { pAddonMenu = (AddonMenu *)AddonMenuManager::CreatePopupMenuType( ADDON_MENU, rFrame ); - Reference< XModel > xModel = GetModelFromFrame( rFrame ); - AddonMenuManager::BuildMenu( pAddonMenu, ADDON_MENU, MENU_APPEND, nUniqueMenuId, rAddonMenuEntries, rFrame, xModel ); + ::rtl::OUString aModuleIdentifier = GetModuleIdentifier( rContext, rFrame ); + AddonMenuManager::BuildMenu( pAddonMenu, ADDON_MENU, MENU_APPEND, nUniqueMenuId, rAddonMenuEntries, rFrame, aModuleIdentifier ); // Don't return an empty Add-On menu if ( pAddonMenu->GetItemCount() == 0 ) @@ -159,7 +165,9 @@ static sal_uInt16 FindMenuId( Menu* pMenu, const OUString& aCommand ) } // Merge the Add-Ons help menu items into the given menu bar at a defined pos -void AddonMenuManager::MergeAddonHelpMenu( const Reference< XFrame >& rFrame, MenuBar* pMergeMenuBar ) +void AddonMenuManager::MergeAddonHelpMenu( const Reference< XFrame >& rFrame, + MenuBar* pMergeMenuBar, + const Reference<XComponentContext>& rContext ) { if ( pMergeMenuBar ) { @@ -188,8 +196,8 @@ void AddonMenuManager::MergeAddonHelpMenu( const Reference< XFrame >& rFrame, Me if ( nInsPos < nItemCount && pHelpMenu->GetItemType( nInsPos ) != MENUITEM_SEPARATOR ) nInsSepAfterPos = nInsPos; - Reference< XModel > xModel = GetModelFromFrame( rFrame ); - AddonMenuManager::BuildMenu( pHelpMenu, ADDON_MENU, nInsPos, nUniqueMenuId, rAddonHelpMenuEntries, rFrame, xModel ); + ::rtl::OUString aModuleIdentifier = GetModuleIdentifier(rContext, rFrame); + AddonMenuManager::BuildMenu( pHelpMenu, ADDON_MENU, nInsPos, nUniqueMenuId, rAddonHelpMenuEntries, rFrame, aModuleIdentifier ); if ( pHelpMenu->GetItemCount() > nItemCount ) { @@ -207,9 +215,9 @@ void AddonMenuManager::MergeAddonHelpMenu( const Reference< XFrame >& rFrame, Me // Merge the addon popup menus into the given menu bar at the provided pos. void AddonMenuManager::MergeAddonPopupMenus( const Reference< XFrame >& rFrame, - const Reference< XModel >& rModel, sal_uInt16 nMergeAtPos, - MenuBar* pMergeMenuBar ) + MenuBar* pMergeMenuBar, + const Reference< XComponentContext >& rContext ) { if ( pMergeMenuBar ) { @@ -222,7 +230,8 @@ void AddonMenuManager::MergeAddonPopupMenus( const Reference< XFrame >& rFrame, OUString aImageId; OUString aContext; Sequence< Sequence< PropertyValue > > aAddonSubMenu; - sal_uInt16 nUniqueMenuId = ADDONMENU_ITEMID_START; + sal_uInt16 nUniqueMenuId = ADDONMENU_ITEMID_START; + OUString aModuleIdentifier = GetModuleIdentifier(rContext, rFrame); const Sequence< Sequence< PropertyValue > >& rAddonMenuEntries = aAddonsOptions.GetAddonsMenuBarPart(); for ( sal_Int32 i = 0; i < rAddonMenuEntries.getLength(); i++ ) @@ -237,12 +246,12 @@ void AddonMenuManager::MergeAddonPopupMenus( const Reference< XFrame >& rFrame, if ( !aTitle.isEmpty() && !aURL.isEmpty() && aAddonSubMenu.getLength() > 0 && - AddonMenuManager::IsCorrectContext( rModel, aContext )) + AddonMenuManager::IsCorrectContext( aModuleIdentifier, aContext )) { sal_uInt16 nId = nUniqueMenuId++; AddonPopupMenu* pAddonPopupMenu = (AddonPopupMenu *)AddonMenuManager::CreatePopupMenuType( ADDON_POPUPMENU, rFrame ); - AddonMenuManager::BuildMenu( pAddonPopupMenu, ADDON_MENU, MENU_APPEND, nUniqueMenuId, aAddonSubMenu, rFrame, rModel ); + AddonMenuManager::BuildMenu( pAddonPopupMenu, ADDON_MENU, MENU_APPEND, nUniqueMenuId, aAddonSubMenu, rFrame, aModuleIdentifier ); if ( pAddonPopupMenu->GetItemCount() > 0 ) { @@ -267,7 +276,7 @@ void AddonMenuManager::BuildMenu( PopupMenu* pCurrent sal_uInt16& nUniqueMenuId, const Sequence< Sequence< PropertyValue > >& aAddonMenuDefinition, const Reference< XFrame >& rFrame, - const Reference< XModel >& rModel ) + const ::rtl::OUString& rModuleIdentifier ) { Sequence< Sequence< PropertyValue > > aAddonSubMenu; bool bInsertSeparator = false; @@ -286,7 +295,7 @@ void AddonMenuManager::BuildMenu( PopupMenu* pCurrent { GetMenuEntry( aAddonMenuDefinition[i], aTitle, aURL, aTarget, aImageId, aContext, aAddonSubMenu ); - if ( !IsCorrectContext( rModel, aContext ) || ( aTitle.isEmpty() && aURL.isEmpty() )) + if ( !IsCorrectContext( rModuleIdentifier, aContext ) || ( aTitle.isEmpty() && aURL.isEmpty() )) continue; if ( aURL == "private:separator" ) @@ -297,7 +306,7 @@ void AddonMenuManager::BuildMenu( PopupMenu* pCurrent if ( aAddonSubMenu.getLength() > 0 ) { pSubMenu = AddonMenuManager::CreatePopupMenuType( nSubMenuType, rFrame ); - AddonMenuManager::BuildMenu( pSubMenu, nSubMenuType, MENU_APPEND, nUniqueMenuId, aAddonSubMenu, rFrame, rModel ); + AddonMenuManager::BuildMenu( pSubMenu, nSubMenuType, MENU_APPEND, nUniqueMenuId, aAddonSubMenu, rFrame, rModuleIdentifier ); // Don't create a menu item for an empty sub menu if ( pSubMenu->GetItemCount() == 0 ) @@ -366,26 +375,18 @@ void AddonMenuManager::GetMenuEntry( const Sequence< PropertyValue >& rAddonMenu } // Check if the context string matches the provided xModel context -bool AddonMenuManager::IsCorrectContext( const Reference< XModel >& rModel, const OUString& aContext ) +bool AddonMenuManager::IsCorrectContext( const OUString& rModuleIdentifier, const OUString& rContext ) { - if ( rModel.is() ) - { - Reference< com::sun::star::lang::XServiceInfo > xServiceInfo( rModel, UNO_QUERY ); - if ( xServiceInfo.is() ) - { - sal_Int32 nIndex = 0; - do - { - OUString aToken = aContext.getToken( 0, ',', nIndex ); + if ( rContext.isEmpty() ) + return true; - if ( xServiceInfo->supportsService( aToken )) - return true; - } - while ( nIndex >= 0 ); - } + if ( !rModuleIdentifier.isEmpty() ) + { + sal_Int32 nIndex = rContext.indexOf( rModuleIdentifier ); + return ( nIndex >= 0 ); } - return ( aContext.isEmpty() ); + return false; } } diff --git a/framework/source/uielement/menubarmanager.cxx b/framework/source/uielement/menubarmanager.cxx index 73f50df8f166..2755b67572ca 100644 --- a/framework/source/uielement/menubarmanager.cxx +++ b/framework/source/uielement/menubarmanager.cxx @@ -1182,17 +1182,13 @@ void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rF if ( nItemId == SID_MDIWINDOWLIST || aCommand == aSpecialWindowCommand) { // Retrieve addon popup menus and add them to our menu bar - Reference< com::sun::star::frame::XModel > xModel; - Reference< com::sun::star::frame::XController > xController( rFrame->getController(), UNO_QUERY ); - if ( xController.is() ) - xModel = Reference< com::sun::star::frame::XModel >( xController->getModel(), UNO_QUERY ); - framework::AddonMenuManager::MergeAddonPopupMenus( rFrame, xModel, nPos, (MenuBar *)pMenu ); + framework::AddonMenuManager::MergeAddonPopupMenus( rFrame, nPos, (MenuBar *)pMenu, m_xContext ); break; } } // Merge the Add-Ons help menu items into the Office help menu - framework::AddonMenuManager::MergeAddonHelpMenu( rFrame, (MenuBar *)pMenu ); + framework::AddonMenuManager::MergeAddonHelpMenu( rFrame, (MenuBar *)pMenu, m_xContext ); } OUString aEmpty; @@ -1288,7 +1284,7 @@ void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rF AddonMenuManager::HasAddonMenuElements() ) { // Create addon popup menu if there exist elements and this is the tools popup menu - AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu( rFrame ); + AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu(rFrame, m_xContext); if ( pSubMenu && ( pSubMenu->GetItemCount() > 0 )) { sal_uInt16 nCount = 0; diff --git a/include/framework/addonmenu.hxx b/include/framework/addonmenu.hxx index d948cfe3472d..c53b140467c0 100644 --- a/include/framework/addonmenu.hxx +++ b/include/framework/addonmenu.hxx @@ -22,6 +22,8 @@ #include <com/sun/star/frame/XFrame.hpp> #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <vcl/menu.hxx> #include <framework/fwedllapi.h> @@ -80,23 +82,25 @@ class FWE_DLLPUBLIC AddonMenuManager static bool IsAddonMenuId( sal_uInt16 nId ) { return (( nId >= ADDONMENU_ITEMID_START ) && ( nId < ADDONMENU_ITEMID_END )); } // Check if the context string matches the provided xModel context - static bool IsCorrectContext( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rModel, const OUString& aContext ); + static bool IsCorrectContext(const OUString& rModuleIdentifier, const OUString& rContext); // Factory method to create different Add-On menu types static PopupMenu* CreatePopupMenuType( MenuType eMenuType, const com::sun::star::uno::Reference< com::sun::star::frame::XFrame >& rFrame ); // Create the Add-Ons menu - static AddonMenu* CreateAddonMenu( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame ); + static AddonMenu* CreateAddonMenu( const css::uno::Reference< css::frame::XFrame >& rFrame, + const css::uno::Reference< css::uno::XComponentContext >& rContext ); // Merge the Add-Ons help menu items into the given menu bar at a defined pos - static void MergeAddonHelpMenu( const com::sun::star::uno::Reference< com::sun::star::frame::XFrame >& rFrame, - MenuBar* pMergeMenuBar ); + static void MergeAddonHelpMenu( const css::uno::Reference< css::frame::XFrame >& rFrame, + MenuBar* pMergeMenuBar, + const css::uno::Reference< css::uno::XComponentContext >& rContext ); // Merge the addon popup menus into the given menu bar at the provided pos. - static void MergeAddonPopupMenus( const com::sun::star::uno::Reference< com::sun::star::frame::XFrame >& rFrame, - const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& rModel, + static void MergeAddonPopupMenus( const css::uno::Reference< css::frame::XFrame >& rFrame, sal_uInt16 nMergeAtPos, - MenuBar* pMergeMenuBar ); + MenuBar* pMergeMenuBar, + const css::uno::Reference< css::uno::XComponentContext >& rContext ); // Returns the next position to insert a menu item/sub menu static sal_uInt16 GetNextPos( sal_uInt16 nPos ); @@ -108,7 +112,7 @@ class FWE_DLLPUBLIC AddonMenuManager sal_uInt16& nUniqueMenuId, const com::sun::star::uno::Sequence< com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > >& aAddonMenuDefinition, const com::sun::star::uno::Reference< com::sun::star::frame::XFrame >& rFrame, - const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& rModel ); + const ::rtl::OUString& rModuleIdentifier ); // Retrieve the menu entry property values from a sequence static void GetMenuEntry( const com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >& rAddonMenuEntry, diff --git a/sfx2/source/menu/virtmenu.cxx b/sfx2/source/menu/virtmenu.cxx index 8795ee402b99..76552d78dbdd 100644 --- a/sfx2/source/menu/virtmenu.cxx +++ b/sfx2/source/menu/virtmenu.cxx @@ -290,20 +290,17 @@ void SfxVirtualMenu::CreateFromSVMenu() if ( pSVMenu->IsMenuBar() ) { + Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext(); sal_uInt16 nPos = pSVMenu->GetItemPos( SID_MDIWINDOWLIST ); if ( nPos != MENU_ITEM_NOTFOUND && xFrame.is() ) { // Retrieve addon popup menus and add them to our menu bar - Reference< com::sun::star::frame::XModel > xModel; - Reference< com::sun::star::frame::XController > xController( xFrame->getController(), UNO_QUERY ); - if ( xController.is() ) - xModel = Reference< com::sun::star::frame::XModel >( xController->getModel(), UNO_QUERY ); - framework::AddonMenuManager::MergeAddonPopupMenus( xFrame, xModel, nPos, (MenuBar *)pSVMenu ); + framework::AddonMenuManager::MergeAddonPopupMenus( xFrame, nPos, (MenuBar *)pSVMenu, xContext ); } // Merge the Add-Ons help menu items into the Office help menu if ( xFrame.is() ) - framework::AddonMenuManager::MergeAddonHelpMenu( xFrame, (MenuBar *)pSVMenu ); + framework::AddonMenuManager::MergeAddonHelpMenu( xFrame, (MenuBar *)pSVMenu, xContext ); // Set addon menu pointer here to avoid problems. When accessibility is enabled, the whole menu // is created immediately! @@ -747,7 +744,8 @@ void SfxVirtualMenu::InsertAddOnsMenuItem( Menu* pMenu ) PopupMenu* pAddonMenu = NULL; try { - pAddonMenu = framework::AddonMenuManager::CreateAddonMenu( xFrame ); + Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext(); + pAddonMenu = framework::AddonMenuManager::CreateAddonMenu(xFrame, xContext); } catch ( const ::com::sun::star::lang::WrappedTargetException& ) { |