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


Reply via email to