Author: hanya Date: Fri May 16 12:48:54 2014 New Revision: 1595181 URL: http://svn.apache.org/r1595181 Log: #i86528# use the module manager to identify the context for addons menu merging
Modified: openoffice/trunk/main/framework/inc/framework/addonmenu.hxx openoffice/trunk/main/framework/source/classes/menumanager.cxx openoffice/trunk/main/framework/source/dispatch/menudispatcher.cxx openoffice/trunk/main/framework/source/fwe/classes/addonmenu.cxx openoffice/trunk/main/framework/source/uielement/menubarmanager.cxx openoffice/trunk/main/sfx2/source/menu/virtmenu.cxx Modified: openoffice/trunk/main/framework/inc/framework/addonmenu.hxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/framework/inc/framework/addonmenu.hxx?rev=1595181&r1=1595180&r2=1595181&view=diff ============================================================================== --- openoffice/trunk/main/framework/inc/framework/addonmenu.hxx (original) +++ openoffice/trunk/main/framework/inc/framework/addonmenu.hxx Fri May 16 12:48:54 2014 @@ -30,6 +30,7 @@ #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/lang/XMultiServiceFactory.hpp> //_________________________________________________________________________________________________________________ // includes of other projects @@ -92,23 +93,25 @@ class FWE_DLLPUBLIC AddonMenuManager static sal_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 sal_Bool IsCorrectContext( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rModel, const rtl::OUString& aContext ); + static sal_Bool IsCorrectContext( const ::rtl::OUString& rModuleIdentifier, const rtl::OUString& aContext ); // 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 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager ); // 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 ); + MenuBar* pMergeMenuBar, + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager ); // 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, sal_uInt16 nMergeAtPos, - MenuBar* pMergeMenuBar ); + MenuBar* pMergeMenuBar, + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager ); // Returns the next position to insert a menu item/sub menu static sal_uInt16 GetNextPos( sal_uInt16 nPos ); @@ -120,7 +123,7 @@ class FWE_DLLPUBLIC AddonMenuManager sal_uInt16& nUniqueMenuId, 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, Modified: openoffice/trunk/main/framework/source/classes/menumanager.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/framework/source/classes/menumanager.cxx?rev=1595181&r1=1595180&r2=1595181&view=diff ============================================================================== --- openoffice/trunk/main/framework/source/classes/menumanager.cxx (original) +++ openoffice/trunk/main/framework/source/classes/menumanager.cxx Fri May 16 12:48:54 2014 @@ -192,7 +192,7 @@ MenuManager::MenuManager( AddonMenuManager::HasAddonMenuElements() ) { sal_uInt16 nCount = 0; - AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu( rFrame ); + AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu( rFrame, xServiceFactory ); if ( pSubMenu && ( pSubMenu->GetItemCount() > 0 )) { if ( pPopupMenu->GetItemType( nCount-1 ) != MENUITEM_SEPARATOR ) Modified: openoffice/trunk/main/framework/source/dispatch/menudispatcher.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/framework/source/dispatch/menudispatcher.cxx?rev=1595181&r1=1595180&r2=1595181&view=diff ============================================================================== --- openoffice/trunk/main/framework/source/dispatch/menudispatcher.cxx (original) +++ openoffice/trunk/main/framework/source/dispatch/menudispatcher.cxx Fri May 16 12:48:54 2014 @@ -344,10 +344,10 @@ sal_Bool MenuDispatcher::impl_setMenuBar 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_xFactory ); // retrieve addon help menu items and add them to our help menu - AddonMenuManager::MergeAddonHelpMenu( xFrame, pMenuBar ); + AddonMenuManager::MergeAddonHelpMenu( xFrame, pMenuBar, m_xFactory ); } // set new menu on our system window and create new menu manager Modified: openoffice/trunk/main/framework/source/fwe/classes/addonmenu.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/framework/source/fwe/classes/addonmenu.cxx?rev=1595181&r1=1595180&r2=1595181&view=diff ============================================================================== --- openoffice/trunk/main/framework/source/fwe/classes/addonmenu.cxx (original) +++ openoffice/trunk/main/framework/source/fwe/classes/addonmenu.cxx Fri May 16 12:48:54 2014 @@ -33,6 +33,7 @@ #include <macros/debug/assertion.hxx> #include <framework/imageproducer.hxx> #include <framework/menuconfiguration.hxx> +#include <services.h> //_________________________________________________________________________________________________________________ // interface includes @@ -40,7 +41,7 @@ #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/XModuleManager.hpp> //_________________________________________________________________________________________________________________ // includes of other projects @@ -108,18 +109,21 @@ AddonPopupMenu::~AddonPopupMenu() // ------------------------------------------------------------------------ -static Reference< XModel > GetModelFromFrame( const Reference< XFrame >& rFrame ) +static ::rtl::OUString GetModuleIdentifier( const Reference< XMultiServiceFactory >& rServiceManager, + const Reference< XFrame >& rFrame ) { - // Query for the model to get check the context information - Reference< XModel > xModel; - if ( rFrame.is() ) - { - Reference< XController > xController( rFrame->getController(), UNO_QUERY ); - if ( xController.is() ) - xModel = xController->getModel(); - } - - return xModel; + Reference< XModuleManager > xModuleManager( rServiceManager->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY ); + if ( xModuleManager.is() ) + { + try + { + return xModuleManager->identify( rFrame ); + } + catch ( Exception& ) + { + } + } + return ::rtl::OUString(); } // ------------------------------------------------------------------------ @@ -146,7 +150,8 @@ PopupMenu* AddonMenuManager::CreatePopup } // Create the Add-Ons menu -AddonMenu* AddonMenuManager::CreateAddonMenu( const Reference< XFrame >& rFrame ) +AddonMenu* AddonMenuManager::CreateAddonMenu( const Reference< XFrame >& rFrame, + const Reference< XMultiServiceFactory >& rServiceManager ) { AddonsOptions aOptions; AddonMenu* pAddonMenu = NULL; @@ -156,8 +161,8 @@ AddonMenu* AddonMenuManager::CreateAddon 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( rServiceManager, rFrame ); + AddonMenuManager::BuildMenu( pAddonMenu, ADDON_MENU, MENU_APPEND, nUniqueMenuId, rAddonMenuEntries, rFrame, aModuleIdentifier ); // Don't return an empty Add-On menu if ( pAddonMenu->GetItemCount() == 0 ) @@ -194,7 +199,9 @@ static sal_uInt16 FindMenuId( Menu* pMen // 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< XMultiServiceFactory >& rServiceManager ) { if ( pMergeMenuBar ) { @@ -245,8 +252,8 @@ void AddonMenuManager::MergeAddonHelpMen 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( rServiceManager, rFrame ); + AddonMenuManager::BuildMenu( pHelpMenu, ADDON_MENU, nInsPos, nUniqueMenuId, rAddonHelpMenuEntries, rFrame, aModuleIdentifier ); if ( pHelpMenu->GetItemCount() > nItemCount ) { @@ -267,9 +274,9 @@ void AddonMenuManager::MergeAddonHelpMen // 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< XMultiServiceFactory >& rServiceManager ) { if ( pMergeMenuBar ) { @@ -283,6 +290,7 @@ void AddonMenuManager::MergeAddonPopupMe ::rtl::OUString aContext; Sequence< Sequence< PropertyValue > > aAddonSubMenu; sal_uInt16 nUniqueMenuId = ADDONMENU_ITEMID_START; + ::rtl::OUString aModuleIdentifier = GetModuleIdentifier( rServiceManager, rFrame ); const Sequence< Sequence< PropertyValue > >& rAddonMenuEntries = aAddonsOptions.GetAddonsMenuBarPart(); for ( sal_Int32 i = 0; i < rAddonMenuEntries.getLength(); i++ ) @@ -297,12 +305,12 @@ void AddonMenuManager::MergeAddonPopupMe if ( aTitle.getLength() > 0 && aURL.getLength() > 0 && 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 ) { @@ -327,7 +335,7 @@ void AddonMenuManager::BuildMenu( PopupM sal_uInt16& nUniqueMenuId, Sequence< Sequence< PropertyValue > > aAddonMenuDefinition, const Reference< XFrame >& rFrame, - const Reference< XModel >& rModel ) + const ::rtl::OUString& rModuleIdentifier ) { Sequence< Sequence< PropertyValue > > aAddonSubMenu; sal_Bool bInsertSeparator = sal_False; @@ -346,7 +354,7 @@ void AddonMenuManager::BuildMenu( PopupM { GetMenuEntry( aAddonMenuDefinition[i], aTitle, aURL, aTarget, aImageId, aContext, aAddonSubMenu ); - if ( !IsCorrectContext( rModel, aContext ) || ( !aTitle.getLength() && !aURL.getLength() )) + if ( !IsCorrectContext( rModuleIdentifier, aContext ) || ( !aTitle.getLength() && !aURL.getLength() )) continue; if ( aURL == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:separator" ))) @@ -357,7 +365,7 @@ void AddonMenuManager::BuildMenu( PopupM 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 ) @@ -426,26 +434,18 @@ void AddonMenuManager::GetMenuEntry( con } // Check if the context string matches the provided xModel context -sal_Bool AddonMenuManager::IsCorrectContext( const Reference< XModel >& rModel, const ::rtl::OUString& aContext ) +sal_Bool AddonMenuManager::IsCorrectContext( const ::rtl::OUString& rModuleIdentifier, const ::rtl::OUString& aContext ) { - if ( rModel.is() ) - { - Reference< com::sun::star::lang::XServiceInfo > xServiceInfo( rModel, UNO_QUERY ); - if ( xServiceInfo.is() ) - { - sal_Int32 nIndex = 0; - do - { - ::rtl::OUString aToken = aContext.getToken( 0, ',', nIndex ); - - if ( xServiceInfo->supportsService( aToken )) - return sal_True; - } - while ( nIndex >= 0 ); - } - } - - return ( aContext.getLength() == 0 ); + if ( aContext.isEmpty() ) + return sal_True; + + if ( !rModuleIdentifier.isEmpty() ) + { + sal_Int32 nIndex = aContext.indexOf( rModuleIdentifier ); + return ( nIndex >= 0 ); + } + + return sal_False; } } Modified: openoffice/trunk/main/framework/source/uielement/menubarmanager.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/framework/source/uielement/menubarmanager.cxx?rev=1595181&r1=1595180&r2=1595181&view=diff ============================================================================== --- openoffice/trunk/main/framework/source/uielement/menubarmanager.cxx (original) +++ openoffice/trunk/main/framework/source/uielement/menubarmanager.cxx Fri May 16 12:48:54 2014 @@ -1292,17 +1292,13 @@ void MenuBarManager::FillMenuManager( Me 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, mxServiceFactory ); 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, mxServiceFactory ); } String aEmpty; @@ -1398,7 +1394,7 @@ void MenuBarManager::FillMenuManager( Me { // Create addon popup menu if there exist elements and this is the tools popup menu sal_uInt16 nCount = 0; - AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu( rFrame ); + AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu( rFrame, mxServiceFactory ); if ( pSubMenu && ( pSubMenu->GetItemCount() > 0 )) { if ( pPopup->GetItemType( nCount-1 ) != MENUITEM_SEPARATOR ) Modified: openoffice/trunk/main/sfx2/source/menu/virtmenu.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sfx2/source/menu/virtmenu.cxx?rev=1595181&r1=1595180&r2=1595181&view=diff ============================================================================== --- openoffice/trunk/main/sfx2/source/menu/virtmenu.cxx (original) +++ openoffice/trunk/main/sfx2/source/menu/virtmenu.cxx Fri May 16 12:48:54 2014 @@ -341,20 +341,17 @@ void SfxVirtualMenu::CreateFromSVMenu() if ( pSVMenu->IsMenuBar() ) { + Reference<com::sun::star::lang::XMultiServiceFactory> aXMultiServiceFactory(::comphelper::getProcessServiceFactory()); 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, aXMultiServiceFactory ); } // 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, aXMultiServiceFactory ); // Set addon menu pointer here to avoid problems. When accessibility is enabled, the whole menu // is created immediately! @@ -870,7 +867,7 @@ void SfxVirtualMenu::InsertAddOnsMenuIte PopupMenu* pAddonMenu = NULL; try { - pAddonMenu = framework::AddonMenuManager::CreateAddonMenu( xFrame ); + pAddonMenu = framework::AddonMenuManager::CreateAddonMenu( xFrame, aXMultiServiceFactory ); } catch ( ::com::sun::star::lang::WrappedTargetException ) {