svtools/source/contnr/ivctrl.cxx | 8 +++++-- svtools/source/control/ctrlbox.cxx | 16 ++++++++++---- svx/source/tbxctrls/tbcontrl.cxx | 15 +++++++------ vcl/qa/cppunit/lifecycle.cxx | 9 ++++--- vcl/source/control/combobox.cxx | 6 ++--- vcl/source/window/event.cxx | 3 ++ vcl/source/window/window.cxx | 4 +++ vcl/source/window/window2.cxx | 42 +++++++++++++++++++------------------ 8 files changed, 63 insertions(+), 40 deletions(-)
New commits: commit 6fa72a677cc397435ad0e463484b0fe930d9f5a1 Author: Michael Meeks <[email protected]> Date: Tue Feb 17 22:03:11 2015 +0000 vcl: add assert and improve lifecycle test. Change-Id: Ic70a890dae41b04d6dd1f19cbea419fe5a794af3 diff --git a/vcl/qa/cppunit/lifecycle.cxx b/vcl/qa/cppunit/lifecycle.cxx index 3492b52..dc6bbf2 100644 --- a/vcl/qa/cppunit/lifecycle.cxx +++ b/vcl/qa/cppunit/lifecycle.cxx @@ -90,6 +90,7 @@ void LifecycleTest::testParentedWidgets() VclPtr<WorkWindow> xWin(new WorkWindow((vcl::Window *)NULL, WB_APP|WB_STDWORK)); CPPUNIT_ASSERT(xWin.get() != NULL); + xWin->Show(); testWidgets(xWin); } diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index d7f264b..c7ef813 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -144,6 +144,10 @@ void Window::dispose() assert( !mpWindowImpl->mbInDispose && "vcl::Window - already in dispose()" ); mpWindowImpl->mbInDispose = true; + assert( !mpWindowImpl->mpParent || + !mpWindowImpl->mpParent->IsDisposed() || + "vcl::Window child should have its parent disposed first" ); + // remove Key and Mouse events issued by Application::PostKey/MouseEvent Application::RemoveMouseAndKeyEvents( this ); commit a10f92014a9820de889c51b7def6311324c45a70 Author: Michael Meeks <[email protected]> Date: Tue Feb 17 19:49:27 2015 +0000 vcl: more double-dispose protection, and survival after dispose. Change-Id: I271f9bcb85d07a28abef2d97ef3c31287878324d diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx index 6bf1089..3f5516e 100644 --- a/svtools/source/control/ctrlbox.cxx +++ b/svtools/source/control/ctrlbox.cxx @@ -123,8 +123,12 @@ ColorListBox::~ColorListBox() void ColorListBox::dispose() { - ImplDestroyColorEntries(); - delete pColorList; + if ( pColorList ) + { + ImplDestroyColorEntries(); + delete pColorList; + pColorList = NULL; + } ListBox::dispose(); } @@ -992,8 +996,11 @@ FontNameBox::~FontNameBox() void FontNameBox::dispose() { - SaveMRUEntries (maFontMRUEntriesFile); - ImplDestroyFontList(); + if (mpFontList) + { + SaveMRUEntries (maFontMRUEntriesFile); + ImplDestroyFontList(); + } ComboBox::dispose(); } @@ -1056,6 +1063,7 @@ void FontNameBox::InitFontMRUEntriesFile() void FontNameBox::ImplDestroyFontList() { delete mpFontList; + mpFontList = NULL; } void FontNameBox::Fill( const FontList* pList ) diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx index 50530a7..be3f2f0 100644 --- a/svx/source/tbxctrls/tbcontrl.cxx +++ b/svx/source/tbxctrls/tbcontrl.cxx @@ -342,7 +342,10 @@ SvxStyleBox_Impl::~SvxStyleBox_Impl() void SvxStyleBox_Impl::dispose() { for(int i = 0; i < MAX_STYLES_ENTRIES; i++) + { delete m_pButtons[i]; + m_pButtons[i] = NULL; + } ComboBox::dispose(); } @@ -2301,21 +2304,19 @@ void SvxStyleToolBoxControl::SetFamilyState( sal_uInt16 nIdx, IMPL_LINK_NOARG(SvxStyleToolBoxControl, VisibilityNotification) { - - sal_uInt16 i; - // Call ReBind() && UnBind() according to visibility SvxStyleBox_Impl* pBox = static_cast<SvxStyleBox_Impl*>( GetToolBox().GetItemWindow( GetId() )); - if ( pBox->IsVisible() && !isBound() ) + + if ( pBox && pBox->IsVisible() && !isBound() ) { - for ( i=0; i<MAX_FAMILIES; i++ ) + for ( sal_uInt16 i=0; i<MAX_FAMILIES; i++ ) pBoundItems [i]->ReBind(); bindListener(); } - else if ( !pBox->IsVisible() && isBound() ) + else if ( (!pBox || !pBox->IsVisible()) && isBound() ) { - for ( i=0; i<MAX_FAMILIES; i++ ) + for ( sal_uInt16 i=0; i<MAX_FAMILIES; i++ ) pBoundItems[i]->UnBind(); unbindListener(); } diff --git a/vcl/qa/cppunit/lifecycle.cxx b/vcl/qa/cppunit/lifecycle.cxx index 8a453d4..3492b52 100644 --- a/vcl/qa/cppunit/lifecycle.cxx +++ b/vcl/qa/cppunit/lifecycle.cxx @@ -73,11 +73,11 @@ void LifecycleTest::testWidgets(vcl::Window *pParent) // Some widgets really insist on adoption. if (pParent) { - { VclPtr<CheckBox> aPtr(new CheckBox(pParent)); } -// { VclPtr<Edit> aPtr(new Edit(pParent)); } -// { VclPtr<ComboBox> aPtr(new ComboBox(pParent)); } + { VclPtr<CheckBox> aPtr(new CheckBox(pParent)); } + { VclPtr<Edit> aPtr(new Edit(pParent)); } + { VclPtr<ComboBox> aPtr(new ComboBox(pParent)); } + { VclPtr<RadioButton> aPtr(new RadioButton(pParent)); } } -// { VclPtr<RadioButton> aPtr(new RadioButton(pParent)); } } void LifecycleTest::testIsolatedWidgets() diff --git a/vcl/source/control/combobox.cxx b/vcl/source/control/combobox.cxx index 88a341e..5c80971 100644 --- a/vcl/source/control/combobox.cxx +++ b/vcl/source/control/combobox.cxx @@ -1267,7 +1267,7 @@ void ComboBox::SetMRUEntries( const OUString& rEntries, sal_Unicode cSep ) OUString ComboBox::GetMRUEntries( sal_Unicode cSep ) const { - return mpImplLB->GetMRUEntries( cSep ); + return mpImplLB ? mpImplLB->GetMRUEntries( cSep ) : OUString(); } void ComboBox::SetMaxMRUCount( sal_Int32 n ) @@ -1277,12 +1277,12 @@ void ComboBox::SetMaxMRUCount( sal_Int32 n ) sal_Int32 ComboBox::GetMaxMRUCount() const { - return mpImplLB->GetMaxMRUCount(); + return mpImplLB ? mpImplLB->GetMaxMRUCount() : 0; } sal_uInt16 ComboBox::GetDisplayLineCount() const { - return mpImplLB->GetDisplayLineCount(); + return mpImplLB ? mpImplLB->GetDisplayLineCount() : 0; } void ComboBox::SetEntryData( sal_Int32 nPos, void* pNewData ) diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx index 73c2c0b..54755e2 100644 --- a/vcl/source/window/window2.cxx +++ b/vcl/source/window/window2.cxx @@ -1381,7 +1381,7 @@ const Pointer& Window::GetPointer() const VCLXWindow* Window::GetWindowPeer() const { - return mpWindowImpl->mpVCLXWindow; + return mpWindowImpl ? mpWindowImpl->mpVCLXWindow : NULL; } void Window::SetPosPixel( const Point& rNewPos ) commit 55b5a6fac4a58360b8e7671913d1dde244d8161f Author: Michael Meeks <[email protected]> Date: Tue Feb 17 17:14:14 2015 +0000 vcl: don't emit events on disposed objects & handle some method calls. Change-Id: If8940edceb379025e322553c4b011e348e2d79d4 diff --git a/vcl/source/window/event.cxx b/vcl/source/window/event.cxx index 8a3c1fb..afe4a63 100644 --- a/vcl/source/window/event.cxx +++ b/vcl/source/window/event.cxx @@ -94,6 +94,9 @@ bool Window::Notify( NotifyEvent& rNEvt ) { bool nRet = false; + if (IsDisposed()) + return false; + // check for docking window // but do nothing if window is docked and locked ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx index 9b92e92..73c2c0b 100644 --- a/vcl/source/window/window2.cxx +++ b/vcl/source/window/window2.cxx @@ -1016,37 +1016,38 @@ const vcl::Window* Window::ImplGetFirstOverlapWindow() const vcl::Window* Window::ImplGetFrameWindow() const { - return mpWindowImpl->mpFrameWindow; + return mpWindowImpl ? mpWindowImpl->mpFrameWindow : NULL; } bool Window::IsDockingWindow() const { - return mpWindowImpl->mbDockWin; + return mpWindowImpl ? mpWindowImpl->mbDockWin : false; } bool Window::ImplIsFloatingWindow() const { - return mpWindowImpl->mbFloatWin; + return mpWindowImpl ? mpWindowImpl->mbFloatWin : false; } bool Window::ImplIsSplitter() const { - return mpWindowImpl->mbSplitter; + return mpWindowImpl ? mpWindowImpl->mbSplitter : false; } bool Window::ImplIsPushButton() const { - return mpWindowImpl->mbPushButton; + return mpWindowImpl ? mpWindowImpl->mbPushButton : false; } bool Window::ImplIsOverlapWindow() const { - return mpWindowImpl->mbOverlapWin; + return mpWindowImpl ? mpWindowImpl->mbOverlapWin : false; } void Window::ImplSetMouseTransparent( bool bTransparent ) { - mpWindowImpl->mbMouseTransparent = bTransparent; + if (mpWindowImpl) + mpWindowImpl->mbMouseTransparent = bTransparent; } Point Window::ImplOutputToFrame( const Point& rPos ) @@ -1061,7 +1062,8 @@ Point Window::ImplFrameToOutput( const Point& rPos ) void Window::SetCompoundControl( bool bCompound ) { - mpWindowImpl->mbCompoundControl = bCompound; + if (mpWindowImpl) + mpWindowImpl->mbCompoundControl = bCompound; } void Window::IncrementLockCount() @@ -1076,17 +1078,17 @@ void Window::DecrementLockCount() WinBits Window::GetStyle() const { - return mpWindowImpl->mnStyle; + return mpWindowImpl ? mpWindowImpl->mnStyle : 0; } WinBits Window::GetPrevStyle() const { - return mpWindowImpl->mnPrevStyle; + return mpWindowImpl ? mpWindowImpl->mnPrevStyle : 0; } WinBits Window::GetExtendedStyle() const { - return mpWindowImpl->mnExtendedStyle; + return mpWindowImpl ? mpWindowImpl->mnExtendedStyle : 0; } void Window::SetType( WindowType nType ) @@ -1120,22 +1122,22 @@ Dialog* Window::GetParentDialog() const bool Window::IsSystemWindow() const { - return mpWindowImpl->mbSysWin; + return mpWindowImpl ? mpWindowImpl->mbSysWin : false; } bool Window::IsDialog() const { - return mpWindowImpl->mbDialog; + return mpWindowImpl ? mpWindowImpl->mbDialog : false; } bool Window::IsMenuFloatingWindow() const { - return mpWindowImpl->mbMenuFloatingWindow; + return mpWindowImpl ? mpWindowImpl->mbMenuFloatingWindow : false; } bool Window::IsToolbarFloatingWindow() const { - return mpWindowImpl->mbToolbarFloatingWindow; + return mpWindowImpl ? mpWindowImpl->mbToolbarFloatingWindow : false; } void Window::EnableAllResize( bool bEnable ) @@ -1150,17 +1152,17 @@ void Window::EnableChildTransparentMode( bool bEnable ) bool Window::IsChildTransparentModeEnabled() const { - return mpWindowImpl->mbChildTransparent; + return mpWindowImpl ? mpWindowImpl->mbChildTransparent : false; } bool Window::IsMouseTransparent() const { - return mpWindowImpl->mbMouseTransparent; + return mpWindowImpl ? mpWindowImpl->mbMouseTransparent : false; } bool Window::IsPaintTransparent() const { - return mpWindowImpl->mbPaintTransparent; + return mpWindowImpl ? mpWindowImpl->mbPaintTransparent : false; } void Window::SetDialogControlStart( bool bStart ) @@ -1170,7 +1172,7 @@ void Window::SetDialogControlStart( bool bStart ) bool Window::IsDialogControlStart() const { - return mpWindowImpl->mbDlgCtrlStart; + return mpWindowImpl ? mpWindowImpl->mbDlgCtrlStart : false; } void Window::SetDialogControlFlags( sal_uInt16 nFlags ) commit 70f89d270cceca007faf51ae43335fc17f27585e Author: Michael Meeks <[email protected]> Date: Tue Feb 17 17:13:40 2015 +0000 protect against double dispose. Change-Id: Ib168188f7cfd8d4e0e6fe0617c5c9b7de840016b diff --git a/svtools/source/contnr/ivctrl.cxx b/svtools/source/contnr/ivctrl.cxx index 96a7529..4c08065 100644 --- a/svtools/source/contnr/ivctrl.cxx +++ b/svtools/source/contnr/ivctrl.cxx @@ -93,8 +93,12 @@ SvtIconChoiceCtrl::~SvtIconChoiceCtrl() void SvtIconChoiceCtrl::dispose() { - _pImp->CallEventListeners( VCLEVENT_OBJECT_DYING ); - delete _pImp; + if (_pImp) + { + _pImp->CallEventListeners( VCLEVENT_OBJECT_DYING ); + delete _pImp; + _pImp = NULL; + } Control::dispose(); } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
