Index: main/svx/inc/svx/svdundo.hxx =================================================================== --- main/svx/inc/svx/svdundo.hxx (revision 1350159) +++ main/svx/inc/svx/svdundo.hxx (working copy) @@ -33,12 +33,13 @@ #include // fuer enum RepeatFuncts #include #include "svx/svxdllapi.h" - +#include //************************************************************ // Vorausdeklarationen //************************************************************ class SfxItemSet; +class SfxStyleSheetBase; class SfxStyleSheet; class SdrView; class SdrPageView; @@ -158,7 +159,7 @@ // //************************************************************ -class SVX_DLLPUBLIC SdrUndoAttrObj : public SdrUndoObj +class SVX_DLLPUBLIC SdrUndoAttrObj : public SdrUndoObj , public SfxListener { protected: SfxItemSet* pUndoSet; @@ -193,6 +194,9 @@ virtual void SdrRepeat(SdrView& rView); virtual bool CanSdrRepeat(SdrView& rView) const; + + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint); + void ReplaceSpecStyleByDefault(SfxStyleSheetBase* pStyle, SfxStyleSheet* pDef); }; //************************************************************ Index: main/svx/source/svdraw/svdundo.cxx =================================================================== --- main/svx/source/svdraw/svdundo.cxx (revision 1350159) +++ main/svx/source/svdraw/svdundo.cxx (working copy) @@ -45,6 +45,10 @@ #include "svx/svdviter.hxx" + +#ifndef _SFXSTYLE_HXX +#include +#endif //////////////////////////////////////////////////////////////////////////////////////////////////// // iterates over all views and unmarks this SdrObject if it is marked @@ -335,7 +339,11 @@ pUndoSet = new SfxItemSet(pObj->GetMergedItemSet()); if(bStyleSheet) + { pUndoStyleSheet = pObj->GetStyleSheet(); + if(pUndoStyleSheet && pUndoStyleSheet!=pObj->GetModel()->GetDefaultStyleSheet() ) + StartListening(*pUndoStyleSheet); + } if(bSaveText) { @@ -362,6 +370,11 @@ // #i8508# if(pTextRedo) delete pTextRedo; + + if(pUndoStyleSheet && pUndoStyleSheet!=pObj->GetModel()->GetDefaultStyleSheet()) + EndListening(*pUndoStyleSheet); + if(pRedoStyleSheet && pRedoStyleSheet !=pObj->GetModel()->GetDefaultStyleSheet()) + EndListening(*pRedoStyleSheet); } void SdrUndoAttrObj::SetRepeatAttr(const SfxItemSet& rSet) @@ -372,6 +385,37 @@ pRepeatSet = new SfxItemSet(rSet); } + +void SdrUndoAttrObj::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint) +{ + SfxStyleSheetHint *pStyleHint = PTR_CAST(SfxStyleSheetHint, &rHint); + + if(pStyleHint && pStyleHint->GetStyleSheet()) + { + if(pStyleHint->GetHint() == SFX_STYLESHEET_ERASED || + pStyleHint->GetHint() == SFX_STYLESHEET_INDESTRUCTION) + { + ReplaceSpecStyleByDefault(pStyleHint->GetStyleSheet(), pObj->GetModel()->GetDefaultStyleSheet()); + } + } +} + +void SdrUndoAttrObj::ReplaceSpecStyleByDefault(SfxStyleSheetBase* pStyle, SfxStyleSheet* pDef) +{ + if (pUndoStyleSheet == pStyle && pUndoStyleSheet != pObj->GetModel()->GetDefaultStyleSheet()) + { + EndListening(*pUndoStyleSheet); + pUndoStyleSheet = pDef; + } + if (pRedoStyleSheet == pStyle && pRedoStyleSheet != pObj->GetModel()->GetDefaultStyleSheet()) + { + EndListening(*pRedoStyleSheet); + pRedoStyleSheet = pDef; + } + if (pRepeatStyleSheet == pStyle) + pRepeatStyleSheet = pDef; +} + void SdrUndoAttrObj::Undo() { E3DModifySceneSnapRectUpdater aUpdater(pObj); @@ -410,6 +454,8 @@ { pRedoStyleSheet = pObj->GetStyleSheet(); pObj->SetStyleSheet(pUndoStyleSheet, sal_True); + if(pRedoStyleSheet && pRedoStyleSheet != pObj->GetModel()->GetDefaultStyleSheet()) + StartListening(*pRedoStyleSheet); } sdr::properties::ItemChangeBroadcaster aItemChange(*pObj);