You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ha...@apache.org on 2014/05/16 14:48:54 UTC

svn commit: r1595181 - in /openoffice/trunk/main: framework/inc/framework/ framework/source/classes/ framework/source/dispatch/ framework/source/fwe/classes/ framework/source/uielement/ sfx2/source/menu/

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 )
 	{