diff options
author | Noel Grandin <noel@peralex.com> | 2016-06-20 15:56:35 +0200 |
---|---|---|
committer | Noel Grandin <noelgrandin@gmail.com> | 2016-06-23 06:28:00 +0000 |
commit | aa0d0536a444fb26d9e570bd6bf6c1bdc3596cf3 (patch) | |
tree | 8b2a5207e77fa4054a37b33c25378c23a00af8ed /framework/source/fwe | |
parent | b722f3d6fc72877e8caaaae7291d5d736ddc494d (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.cxx | 42 | ||||
-rw-r--r-- | framework/source/fwe/helper/actiontriggerhelper.cxx | 2 |
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 ); |