summaryrefslogtreecommitdiff
path: root/framework/source/fwe
diff options
context:
space:
mode:
authorNoel Grandin <noel@peralex.com>2016-06-20 15:56:35 +0200
committerNoel Grandin <noelgrandin@gmail.com>2016-06-23 06:28:00 +0000
commitaa0d0536a444fb26d9e570bd6bf6c1bdc3596cf3 (patch)
tree8b2a5207e77fa4054a37b33c25378c23a00af8ed /framework/source/fwe
parentb722f3d6fc72877e8caaaae7291d5d736ddc494d (diff)
tdf#97527 - vcl: reference-count Menu
some places are marked with "dodgy"- need to check those to see what is going on, because they are leaving dangling pointers behind in the Menu class Change-Id: I41d5c7c0fec2f70ce9e3ffdc48cd03d26c0a869b Reviewed-on: https://gerrit.libreoffice.org/26516 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
Diffstat (limited to 'framework/source/fwe')
-rw-r--r--framework/source/fwe/classes/addonmenu.cxx42
-rw-r--r--framework/source/fwe/helper/actiontriggerhelper.cxx2
2 files changed, 20 insertions, 24 deletions
diff --git a/framework/source/fwe/classes/addonmenu.cxx b/framework/source/fwe/classes/addonmenu.cxx
index f69ae27ee94b..2e20b304bc0b 100644
--- a/framework/source/fwe/classes/addonmenu.cxx
+++ b/framework/source/fwe/classes/addonmenu.cxx
@@ -53,14 +53,12 @@ AddonMenu::AddonMenu( const css::uno::Reference< css::frame::XFrame >& rFrame )
AddonMenu::~AddonMenu()
{
- for ( sal_uInt16 i = 0; i < GetItemCount(); i++ )
- {
- if ( GetItemType( i ) != MenuItemType::SEPARATOR )
- {
- sal_uInt16 nId = GetItemId( i );
- delete GetPopupMenu( nId );
- }
- }
+ disposeOnce();
+}
+
+void AddonMenu::dispose()
+{
+ PopupMenu::dispose();
}
// Check if command URL string has the unique prefix to identify addon popup menus
@@ -101,36 +99,35 @@ bool AddonMenuManager::HasAddonMenuElements()
}
// Factory method to create different Add-On menu types
-PopupMenu* AddonMenuManager::CreatePopupMenuType( MenuType eMenuType, const Reference< XFrame >& rFrame )
+VclPtr<PopupMenu> AddonMenuManager::CreatePopupMenuType( MenuType eMenuType, const Reference< XFrame >& rFrame )
{
if ( eMenuType == ADDON_MENU )
- return new AddonMenu( rFrame );
+ return VclPtr<AddonMenu>::Create( rFrame );
else if ( eMenuType == ADDON_POPUPMENU )
- return new AddonPopupMenu( rFrame );
+ return VclPtr<AddonPopupMenu>::Create( rFrame );
else
return nullptr;
}
// Create the Add-Ons menu
-AddonMenu* AddonMenuManager::CreateAddonMenu( const Reference< XFrame >& rFrame,
+VclPtr<AddonMenu> AddonMenuManager::CreateAddonMenu( const Reference< XFrame >& rFrame,
const Reference< XComponentContext >& rContext )
{
- AddonsOptions aOptions;
- AddonMenu* pAddonMenu = nullptr;
- sal_uInt16 nUniqueMenuId = ADDONMENU_ITEMID_START;
+ AddonsOptions aOptions;
+ VclPtr<AddonMenu> pAddonMenu;
+ sal_uInt16 nUniqueMenuId = ADDONMENU_ITEMID_START;
const Sequence< Sequence< PropertyValue > >& rAddonMenuEntries = aOptions.GetAddonsMenu();
if ( rAddonMenuEntries.getLength() > 0 )
{
- pAddonMenu = static_cast<AddonMenu *>(AddonMenuManager::CreatePopupMenuType( ADDON_MENU, rFrame ));
+ pAddonMenu = static_cast<AddonMenu *>(AddonMenuManager::CreatePopupMenuType( ADDON_MENU, rFrame ).get());
::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 )
{
- delete pAddonMenu;
- pAddonMenu = nullptr;
+ pAddonMenu.disposeAndClear();
}
}
@@ -243,7 +240,7 @@ void AddonMenuManager::MergeAddonPopupMenus( const Reference< XFrame >& rFrame,
AddonMenuManager::IsCorrectContext( aModuleIdentifier, aContext ))
{
sal_uInt16 nId = nUniqueMenuId++;
- AddonPopupMenu* pAddonPopupMenu = static_cast<AddonPopupMenu *>(AddonMenuManager::CreatePopupMenuType( ADDON_POPUPMENU, rFrame ));
+ VclPtr<AddonPopupMenu> pAddonPopupMenu = static_cast<AddonPopupMenu *>(AddonMenuManager::CreatePopupMenuType( ADDON_POPUPMENU, rFrame ).get());
AddonMenuManager::BuildMenu( pAddonPopupMenu, ADDON_MENU, MENU_APPEND, nUniqueMenuId, aAddonSubMenu, rFrame, aModuleIdentifier );
@@ -257,7 +254,7 @@ void AddonMenuManager::MergeAddonPopupMenus( const Reference< XFrame >& rFrame,
pMergeMenuBar->SetItemCommand( nId, aURL );
}
else
- delete pAddonPopupMenu;
+ pAddonPopupMenu.disposeAndClear();
}
}
}
@@ -296,7 +293,7 @@ void AddonMenuManager::BuildMenu( PopupMenu* pCurrent
bInsertSeparator = true;
else
{
- PopupMenu* pSubMenu = nullptr;
+ VclPtr<PopupMenu> pSubMenu;
if ( aAddonSubMenu.getLength() > 0 )
{
pSubMenu = AddonMenuManager::CreatePopupMenuType( nSubMenuType, rFrame );
@@ -305,8 +302,7 @@ void AddonMenuManager::BuildMenu( PopupMenu* pCurrent
// Don't create a menu item for an empty sub menu
if ( pSubMenu->GetItemCount() == 0 )
{
- delete pSubMenu;
- pSubMenu = nullptr;
+ pSubMenu.disposeAndClear();
continue;
}
}
diff --git a/framework/source/fwe/helper/actiontriggerhelper.cxx b/framework/source/fwe/helper/actiontriggerhelper.cxx
index 3749606f7c3f..33a171b22d87 100644
--- a/framework/source/fwe/helper/actiontriggerhelper.cxx
+++ b/framework/source/fwe/helper/actiontriggerhelper.cxx
@@ -208,7 +208,7 @@ void InsertSubMenuItems( Menu* pSubMenu, sal_uInt16& nItemId, const Reference< X
if ( xSubContainer.is() )
{
- PopupMenu* pNewSubMenu = new PopupMenu;
+ VclPtr<PopupMenu> pNewSubMenu = VclPtr<PopupMenu>::Create();
// Sub menu (recursive call CreateSubMenu )
InsertSubMenuItems( pNewSubMenu, nItemId, xSubContainer );