Hi Caolán and Maxim
Thanks for your replies, My reply is inline.
On Tue, Aug 25, 2015 at 7:38 PM, Caolán McNamara <caolanm@redhat.com>
wrote:
Digging into the other examples, I guess that SetItemWindow was called
on the toolbar with the SvxFontNameBox_Impl window as an argument ?
yes.
If that's the case then the pattern appears to be that what object
called SetItemWindow on the toolbar should call SetItemWindow(id, 0) to
remove the window from the toolbar and then call disposeAndClear on the
window.
i.e. what entity put the item into the toolbar is the same entity that
has to remove it and dispose it.
What's the reproducing scenario here, is it the fontname widget in the
standard toolbar, e.g. just start and exit writer to reproduce ?
I think it should work with writer too, I ran soffice --calc and opened a
new spreadsheet and then closed it.
C.
Here is what I observe in gdb :
===========================================================================
breakpoints were set on :
SvxFontNameBox_Impl::SvxFontNameBox_Impl()
SvxFontNameBox_Impl::FillList()
SvxFontNameBox_Impl::~SvxFontNameBox_Impl()
Order of calls observed from gdb each with address of SvxFontNameBox_Impl
object :
1. (SvxFontNameBox_Impl * const) 0x1cd4290,
SvxFontNameBox_Impl::SvxFontNameBox_Impl - from toolbar code
2. (SvxFontNameBox_Impl * const) 0x1cd4290, SvxFontNameBox_Impl::FillList
3. (SvxFontNameBox_Impl * const) 0x1e60cc0,
SvxFontNameBox_Impl::SvxFontNameBox_Impl - from sidebar::ControllerFactory
4. (SvxFontNameBox_Impl * const) 0x1e60cc0,
SvxFontNameBox_Impl::~SvxFontNameBox_Impl - sidebar
5. (SvxFontNameBox_Impl * const) 0x1e60cc0,
SvxFontNameBox_Impl::~SvxFontNameBox_Impl - sidebar
No call of destructor SvxFontNameBox_Impl::~SvxFontNameBox_Impl() for the
instance 0x1cd4290
==============================================================================
I tried setting break point on
framework::ToolBarManager::RemoveControllers and it calls SetItemWindow(id,
0) for all items :
m_pToolBar->SetItemWindow(nItemId, 0);
But in ToolBox::SetItemWindow() method, I think the pItem->mpWindow is
just overwritten and not getting deleted. Is the deletion code missing here
?
Is it ok to add
if (pItem->mpWindow)
delete pItem->mpWindow;
before assigning pNewWindow to it ?
1296 void ToolBox::SetItemWindow( sal_uInt16 nItemId, vcl::Window*
pNewWindow )
1297 {
1298 sal_uInt16 nPos = GetItemPos( nItemId );
1299
1300 if ( nPos != TOOLBOX_ITEM_NOTFOUND )
1301 {
1302 ImplToolItem* pItem = &mpData->m_aItems[nPos];
1303 * pItem->mpWindow = pNewWindow;*
1304 if ( pNewWindow )
1305 pNewWindow->Hide();
1306 ImplInvalidate( true );
1307 CallEventListeners( VCLEVENT_TOOLBOX_ITEMWINDOWCHANGED,
reinterpret_cast< void* >( nPos ) );
1308 }
1309 }
Thanks,
Dennis
http://www.ldcs.co.in