Kaydet (Commit) e55f887b authored tarafından Caolán McNamara's avatar Caolán McNamara

Related: tdf#107961 ensure notifyhdl is unset after dispose

Change-Id: I69790c8d3cfffc09ee6d6c165e17823223c5058a
Reviewed-on: https://gerrit.libreoffice.org/38205Tested-by: 's avatarJulien Nabet <serval2412@yahoo.fr>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 278bfe01
...@@ -101,6 +101,7 @@ private: ...@@ -101,6 +101,7 @@ private:
bool mbForwarderIsEditMode; // have to reflect that, since ENDEDIT can happen more often bool mbForwarderIsEditMode; // have to reflect that, since ENDEDIT can happen more often
bool mbShapeIsEditMode; // only true, if SdrHintKind::BeginEdit was received bool mbShapeIsEditMode; // only true, if SdrHintKind::BeginEdit was received
bool mbNotificationsDisabled; // prevent EditEngine/Outliner notifications (e.g. when setting up forwarder) bool mbNotificationsDisabled; // prevent EditEngine/Outliner notifications (e.g. when setting up forwarder)
bool mbNotifyEditOutlinerSet;
SvxUnoTextRangeBaseList maTextRanges; SvxUnoTextRangeBaseList maTextRanges;
...@@ -173,7 +174,8 @@ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject* pObject, SdrText* pText ...@@ -173,7 +174,8 @@ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject* pObject, SdrText* pText
mbOldUndoMode ( false ), mbOldUndoMode ( false ),
mbForwarderIsEditMode ( false ), mbForwarderIsEditMode ( false ),
mbShapeIsEditMode ( false ), mbShapeIsEditMode ( false ),
mbNotificationsDisabled ( false ) mbNotificationsDisabled ( false ),
mbNotifyEditOutlinerSet ( false )
{ {
DBG_ASSERT( mpObject, "invalid pObject!" ); DBG_ASSERT( mpObject, "invalid pObject!" );
...@@ -209,7 +211,8 @@ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject& rObject, SdrText* pText ...@@ -209,7 +211,8 @@ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject& rObject, SdrText* pText
mbOldUndoMode ( false ), mbOldUndoMode ( false ),
mbForwarderIsEditMode ( false ), mbForwarderIsEditMode ( false ),
mbShapeIsEditMode ( true ), mbShapeIsEditMode ( true ),
mbNotificationsDisabled ( false ) mbNotificationsDisabled ( false ),
mbNotifyEditOutlinerSet ( false )
{ {
if( !mpText ) if( !mpText )
{ {
...@@ -390,7 +393,10 @@ void SvxTextEditSourceImpl::Notify(SfxBroadcaster& rBC, const SfxHint& rHint) ...@@ -390,7 +393,10 @@ void SvxTextEditSourceImpl::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
// register as listener - need to broadcast state change messages // register as listener - need to broadcast state change messages
if( mpView && mpView->GetTextEditOutliner() ) if( mpView && mpView->GetTextEditOutliner() )
{
mpView->GetTextEditOutliner()->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) ); mpView->GetTextEditOutliner()->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) );
mbNotifyEditOutlinerSet = true;
}
// Only now we're really in edit mode // Only now we're really in edit mode
mbShapeIsEditMode = true; mbShapeIsEditMode = true;
...@@ -409,7 +415,10 @@ void SvxTextEditSourceImpl::Notify(SfxBroadcaster& rBC, const SfxHint& rHint) ...@@ -409,7 +415,10 @@ void SvxTextEditSourceImpl::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
// remove as listener - outliner might outlive ourselves // remove as listener - outliner might outlive ourselves
if( mpView && mpView->GetTextEditOutliner() ) if( mpView && mpView->GetTextEditOutliner() )
{
mpView->GetTextEditOutliner()->SetNotifyHdl( Link<EENotify&,void>() ); mpView->GetTextEditOutliner()->SetNotifyHdl( Link<EENotify&,void>() );
mbNotifyEditOutlinerSet = false;
}
// destroy view forwarder, OutlinerView no longer // destroy view forwarder, OutlinerView no longer
// valid (no need for UpdateData(), it's been // valid (no need for UpdateData(), it's been
...@@ -483,6 +492,12 @@ void SvxTextEditSourceImpl::dispose() ...@@ -483,6 +492,12 @@ void SvxTextEditSourceImpl::dispose()
if( mpView ) if( mpView )
{ {
// remove as listener - outliner might outlive ourselves
if (mbNotifyEditOutlinerSet && mpView && mpView->GetTextEditOutliner())
{
mpView->GetTextEditOutliner()->SetNotifyHdl(Link<EENotify&,void>());
mbNotifyEditOutlinerSet = false;
}
EndListening( *mpView ); EndListening( *mpView );
mpView = nullptr; mpView = nullptr;
} }
...@@ -730,6 +745,7 @@ SvxDrawOutlinerViewForwarder* SvxTextEditSourceImpl::CreateViewForwarder() ...@@ -730,6 +745,7 @@ SvxDrawOutlinerViewForwarder* SvxTextEditSourceImpl::CreateViewForwarder()
{ {
// register as listener - need to broadcast state change messages // register as listener - need to broadcast state change messages
mpView->GetTextEditOutliner()->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) ); mpView->GetTextEditOutliner()->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) );
mbNotifyEditOutlinerSet = true;
SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject ); SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject );
if( pTextObj ) if( pTextObj )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment