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