--- svl/source/items/style.cxx (revision 1348808) +++ svl/source/items/style.cxx (working copy) @@ -806,14 +806,19 @@ // Alle Styles umsetzen, deren Parent dieser hier ist ChangeParent( p->GetName(), p->GetParent() ); - com::sun::star::uno::Reference< com::sun::star::lang::XComponent > xComp( static_cast< ::cppu::OWeakObject* >((*aIter).get()), com::sun::star::uno::UNO_QUERY ); - if( xComp.is() ) try - { - xComp->dispose(); - } - catch( com::sun::star::uno::Exception& ) - { - } + // #120015# Do not dispose, the removed StyleSheet may still be used in + // existing SdrUndoAttrObj incarnations. Rely on refcounting for disposal, + // this works well under normal conditions (checked breaking and counting + // on SfxStyleSheetBase constructors and destructors) + // + // com::sun::star::uno::Reference< com::sun::star::lang::XComponent > xComp( static_cast< ::cppu::OWeakObject* >((*aIter).get()), com::sun::star::uno::UNO_QUERY ); + // if( xComp.is() ) try + // { + // xComp->dispose(); + // } + // catch( com::sun::star::uno::Exception& ) + // { + // } aStyles.erase(aIter); Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *p ) ); --- svx/source/svdraw/svdundo.cxx (revision 1348808) +++ svx/source/svdraw/svdundo.cxx (working copy) @@ -290,14 +290,29 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// +void SdrUndoAttrObj::ensureStyleSheetInStyleSheetPool(SfxStyleSheetBasePool& rStyleSheetPool, SfxStyleSheet& rSheet) +{ + SfxStyleSheetBase* pThere = rStyleSheetPool.Find(rSheet.GetName(), rSheet.GetFamily()); + + if(!pThere) + { + // re-insert remembered style which was removed in the meantime. To do this + // without assertion, do it without parent and set parent after insertion + const UniString aParent(rSheet.GetParent()); + + rSheet.SetParent(UniString()); + rStyleSheetPool.Insert(&rSheet); + rSheet.SetParent(aParent); + } +} + SdrUndoAttrObj::SdrUndoAttrObj(SdrObject& rNewObj, FASTBOOL bStyleSheet1, FASTBOOL bSaveText) : SdrUndoObj(rNewObj), pUndoSet(NULL), pRedoSet(NULL), pRepeatSet(NULL), - pUndoStyleSheet(NULL), - pRedoStyleSheet(NULL), - pRepeatStyleSheet(NULL), + mxUndoStyleSheet(), + mxRedoStyleSheet(), bHaveToTakeRedoSet(sal_True), pTextUndo(NULL), @@ -335,7 +350,7 @@ pUndoSet = new SfxItemSet(pObj->GetMergedItemSet()); if(bStyleSheet) - pUndoStyleSheet = pObj->GetStyleSheet(); + mxUndoStyleSheet = pObj->GetStyleSheet(); if(bSaveText) { @@ -394,7 +409,7 @@ pRedoSet = new SfxItemSet(pObj->GetMergedItemSet()); if(bStyleSheet) - pRedoStyleSheet=pObj->GetStyleSheet(); + mxRedoStyleSheet = pObj->GetStyleSheet(); if(pTextUndo) { @@ -408,8 +423,18 @@ if(bStyleSheet) { - pRedoStyleSheet = pObj->GetStyleSheet(); - pObj->SetStyleSheet(pUndoStyleSheet, sal_True); + mxRedoStyleSheet = pObj->GetStyleSheet(); + SfxStyleSheet* pSheet = dynamic_cast< SfxStyleSheet* >(mxUndoStyleSheet.get()); + + if(pSheet && pObj->GetModel() && pObj->GetModel()->GetStyleSheetPool()) + { + ensureStyleSheetInStyleSheetPool(*pObj->GetModel()->GetStyleSheetPool(), *pSheet); + pObj->SetStyleSheet(pSheet, sal_True); + } + else + { + OSL_ENSURE(false, "OOps, something went wrong in SdrUndoAttrObj (!)"); + } } sdr::properties::ItemChangeBroadcaster aItemChange(*pObj); @@ -482,8 +507,18 @@ { if(bStyleSheet) { - pUndoStyleSheet = pObj->GetStyleSheet(); - pObj->SetStyleSheet(pRedoStyleSheet, sal_True); + mxUndoStyleSheet = pObj->GetStyleSheet(); + SfxStyleSheet* pSheet = dynamic_cast< SfxStyleSheet* >(mxRedoStyleSheet.get()); + + if(pSheet && pObj->GetModel() && pObj->GetModel()->GetStyleSheetPool()) + { + ensureStyleSheetInStyleSheetPool(*pObj->GetModel()->GetStyleSheetPool(), *pSheet); + pObj->SetStyleSheet(pSheet, sal_True); + } + else + { + OSL_ENSURE(false, "OOps, something went wrong in SdrUndoAttrObj (!)"); + } } sdr::properties::ItemChangeBroadcaster aItemChange(*pObj); --- svx/inc/svx/svdundo.hxx (revision 1348808) +++ svx/inc/svx/svdundo.hxx (working copy) @@ -33,6 +33,7 @@ #include // fuer enum RepeatFuncts #include #include "svx/svxdllapi.h" +#include //************************************************************ // Vorausdeklarationen @@ -166,9 +167,8 @@ SfxItemSet* pRepeatSet; // oder besser den StyleSheetNamen merken? - SfxStyleSheet* pUndoStyleSheet; - SfxStyleSheet* pRedoStyleSheet; - SfxStyleSheet* pRepeatStyleSheet; + rtl::Reference< SfxStyleSheetBase > mxUndoStyleSheet; + rtl::Reference< SfxStyleSheetBase > mxRedoStyleSheet; FASTBOOL bStyleSheet; FASTBOOL bHaveToTakeRedoSet; @@ -181,6 +181,9 @@ // Wenn sich um ein Gruppenobjekt handelt: SdrUndoGroup* pUndoGroup; + // helper to ensure StyleSheet is in pool (provided by SdrModel from SdrObject) + void ensureStyleSheetInStyleSheetPool(SfxStyleSheetBasePool& rStyleSheetPool, SfxStyleSheet& rSheet); + public: SdrUndoAttrObj(SdrObject& rNewObj, FASTBOOL bStyleSheet1=sal_False, FASTBOOL bSaveText=sal_False); virtual ~SdrUndoAttrObj();