Deletion of vcl::Window's inside ToolBar

Dennis Francis dennisfrancis.in at gmail.com
Wed Aug 26 03:12:16 PDT 2015


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 at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/libreoffice/attachments/20150826/c431cb41/attachment.html>


More information about the LibreOffice mailing list