[Libreoffice-commits] core.git: 2 commits - framework/source include/framework sfx2/source sw/source

Caolán McNamara caolanm at redhat.com
Mon May 19 05:28:48 PDT 2014


 framework/source/classes/menumanager.cxx      |    2 
 framework/source/dispatch/menudispatcher.cxx  |    4 -
 framework/source/fwe/classes/addonmenu.cxx    |   81 +++++++++++++-------------
 framework/source/uielement/menubarmanager.cxx |   10 ---
 include/framework/addonmenu.hxx               |   20 +++---
 sfx2/source/menu/virtmenu.cxx                 |   12 +--
 sw/source/core/access/accmap.cxx              |    2 
 7 files changed, 66 insertions(+), 65 deletions(-)

New commits:
commit 7f47b578bc918aad2900bd81a59090ac2bb3281c
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Mon May 19 10:53:49 2014 +0100

    valgrind: memory leak
    
    Change-Id: I4cd6f99151348c97a116cd86cc5da9f4f6e68d9d

diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx
index 60b1509..f36fb14 100644
--- a/sw/source/core/access/accmap.cxx
+++ b/sw/source/core/access/accmap.cxx
@@ -1211,6 +1211,8 @@ void SwAccessibleMap::InvalidateShapeInParaSelection()
         }//else
     }
 
+    delete[] pShapes;
+
     //Checked for FlyFrm
     if (mpFrmMap)
     {
commit 61ce018658cb673debae3d29a747252f6bc692ff
Author: Tsutomu Uchino <hanya at apache.org>
Date:   Fri May 16 12:48:54 2014 +0000

    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

diff --git a/framework/source/classes/menumanager.cxx b/framework/source/classes/menumanager.cxx
index c850481..4a5b139 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 886bf65..f4206e4 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 eda31f5..7e6720d 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 73f50df..2755b67 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 d948cfe..c53b140 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 8795ee4..76552d7 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& )
     {


More information about the Libreoffice-commits mailing list