summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svdundo.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/svdraw/svdundo.cxx')
-rw-r--r--svx/source/svdraw/svdundo.cxx1874
1 files changed, 1874 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx
new file mode 100644
index 000000000000..08cee1eb17d3
--- /dev/null
+++ b/svx/source/svdraw/svdundo.cxx
@@ -0,0 +1,1874 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: svdundo.cxx,v $
+ * $Revision: 1.31.226.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_svx.hxx"
+
+#include <svx/svdundo.hxx>
+#include "svditext.hxx"
+#include <svx/svdotext.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdlayer.hxx>
+#include <svx/svdmodel.hxx>
+#include <svx/svdview.hxx>
+#include "svdstr.hrc" // Namen aus der Resource
+#include "svdglob.hxx" // StringCache
+#include <svx/scene3d.hxx>
+#include <svx/outlobj.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/sdr/properties/itemsettools.hxx>
+#include <svx/sdr/properties/properties.hxx>
+#include <svx/svdocapt.hxx>
+#include <svtools/whiter.hxx>
+#include <svx/e3dsceneupdater.hxx>
+
+#include "svdviter.hxx"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// iterates over all views and unmarks this SdrObject if it is marked
+static void ImplUnmarkObject( SdrObject* pObj )
+{
+ SdrViewIter aIter( pObj );
+ for ( SdrView* pView = aIter.FirstView(); pView; pView = aIter.NextView() )
+ {
+ pView->MarkObj( pObj, pView->GetSdrPageView(), TRUE );
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+TYPEINIT1(SdrUndoAction,SfxUndoAction);
+
+BOOL SdrUndoAction::CanRepeat(SfxRepeatTarget& rView) const
+{
+ SdrView* pV=PTR_CAST(SdrView,&rView);
+ if (pV!=NULL) return CanSdrRepeat(*pV);
+ return FALSE;
+}
+
+void SdrUndoAction::Repeat(SfxRepeatTarget& rView)
+{
+ SdrView* pV=PTR_CAST(SdrView,&rView);
+ if (pV!=NULL) SdrRepeat(*pV);
+ DBG_ASSERT(pV!=NULL,"Repeat: Uebergebenes SfxRepeatTarget ist keine SdrView");
+}
+
+XubString SdrUndoAction::GetRepeatComment(SfxRepeatTarget& rView) const
+{
+ SdrView* pV=PTR_CAST(SdrView,&rView);
+ if (pV!=NULL) return GetSdrRepeatComment(*pV);
+ return String();
+}
+
+bool SdrUndoAction::CanSdrRepeat(SdrView& /*rView*/) const
+{
+ return FALSE;
+}
+
+void SdrUndoAction::SdrRepeat(SdrView& /*rView*/)
+{
+}
+
+XubString SdrUndoAction::GetSdrRepeatComment(SdrView& /*rView*/) const
+{
+ return String();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoGroup::SdrUndoGroup(SdrModel& rNewMod)
+: SdrUndoAction(rNewMod),
+ aBuf(1024,32,32),
+ eFunction(SDRREPFUNC_OBJ_NONE) /*#72642#*/
+{}
+
+SdrUndoGroup::SdrUndoGroup(SdrModel& rNewMod,const String& rStr)
+: SdrUndoAction(rNewMod),
+ aBuf(1024,32,32),
+ aComment(rStr),
+ eFunction(SDRREPFUNC_OBJ_NONE)
+{}
+
+SdrUndoGroup::~SdrUndoGroup()
+{
+ Clear();
+}
+
+void SdrUndoGroup::Clear()
+{
+ for (ULONG nu=0; nu<GetActionCount(); nu++) {
+ SdrUndoAction* pAct=GetAction(nu);
+ delete pAct;
+ }
+ aBuf.Clear();
+}
+
+void SdrUndoGroup::AddAction(SdrUndoAction* pAct)
+{
+ aBuf.Insert(pAct,CONTAINER_APPEND);
+}
+
+void SdrUndoGroup::push_front( SdrUndoAction* pAct )
+{
+ aBuf.Insert(pAct, (ULONG)0 );
+}
+
+void SdrUndoGroup::Undo()
+{
+ for (ULONG nu=GetActionCount(); nu>0;) {
+ nu--;
+ SdrUndoAction* pAct=GetAction(nu);
+ pAct->Undo();
+ }
+}
+
+void SdrUndoGroup::Redo()
+{
+ for (ULONG nu=0; nu<GetActionCount(); nu++) {
+ SdrUndoAction* pAct=GetAction(nu);
+ pAct->Redo();
+ }
+}
+
+XubString SdrUndoGroup::GetComment() const
+{
+ XubString aRet(aComment);
+ sal_Char aSearchText[] = "%1";
+ String aSearchString(aSearchText, sizeof(aSearchText-1));
+
+ aRet.SearchAndReplace(aSearchString, aObjDescription);
+
+ return aRet;
+}
+
+bool SdrUndoGroup::CanSdrRepeat(SdrView& rView) const
+{
+ switch (eFunction) {
+ case SDRREPFUNC_OBJ_NONE : return FALSE;
+ case SDRREPFUNC_OBJ_DELETE : return rView.AreObjectsMarked();
+ case SDRREPFUNC_OBJ_COMBINE_POLYPOLY: return rView.IsCombinePossible(FALSE);
+ case SDRREPFUNC_OBJ_COMBINE_ONEPOLY : return rView.IsCombinePossible(TRUE);
+ case SDRREPFUNC_OBJ_DISMANTLE_POLYS : return rView.IsDismantlePossible(FALSE);
+ case SDRREPFUNC_OBJ_DISMANTLE_LINES : return rView.IsDismantlePossible(TRUE);
+ case SDRREPFUNC_OBJ_CONVERTTOPOLY : return rView.IsConvertToPolyObjPossible(FALSE);
+ case SDRREPFUNC_OBJ_CONVERTTOPATH : return rView.IsConvertToPathObjPossible(FALSE);
+ case SDRREPFUNC_OBJ_GROUP : return rView.IsGroupPossible();
+ case SDRREPFUNC_OBJ_UNGROUP : return rView.IsUnGroupPossible();
+ case SDRREPFUNC_OBJ_PUTTOTOP : return rView.IsToTopPossible();
+ case SDRREPFUNC_OBJ_PUTTOBTM : return rView.IsToBtmPossible();
+ case SDRREPFUNC_OBJ_MOVTOTOP : return rView.IsToTopPossible();
+ case SDRREPFUNC_OBJ_MOVTOBTM : return rView.IsToBtmPossible();
+ case SDRREPFUNC_OBJ_REVORDER : return rView.IsReverseOrderPossible();
+ case SDRREPFUNC_OBJ_IMPORTMTF : return rView.IsImportMtfPossible();
+ default: break;
+ } // switch
+ return FALSE;
+}
+
+void SdrUndoGroup::SdrRepeat(SdrView& rView)
+{
+ switch (eFunction) {
+ case SDRREPFUNC_OBJ_NONE : break;
+ case SDRREPFUNC_OBJ_DELETE : rView.DeleteMarked(); break;
+ case SDRREPFUNC_OBJ_COMBINE_POLYPOLY: rView.CombineMarkedObjects(sal_False); break;
+ case SDRREPFUNC_OBJ_COMBINE_ONEPOLY : rView.CombineMarkedObjects(sal_True); break;
+ case SDRREPFUNC_OBJ_DISMANTLE_POLYS : rView.DismantleMarkedObjects(FALSE); break;
+ case SDRREPFUNC_OBJ_DISMANTLE_LINES : rView.DismantleMarkedObjects(TRUE); break;
+ case SDRREPFUNC_OBJ_CONVERTTOPOLY : rView.ConvertMarkedToPolyObj(FALSE); break;
+ case SDRREPFUNC_OBJ_CONVERTTOPATH : rView.ConvertMarkedToPathObj(FALSE); break;
+ case SDRREPFUNC_OBJ_GROUP : rView.GroupMarked(); break;
+ case SDRREPFUNC_OBJ_UNGROUP : rView.UnGroupMarked(); break;
+ case SDRREPFUNC_OBJ_PUTTOTOP : rView.PutMarkedToTop(); break;
+ case SDRREPFUNC_OBJ_PUTTOBTM : rView.PutMarkedToBtm(); break;
+ case SDRREPFUNC_OBJ_MOVTOTOP : rView.MovMarkedToTop(); break;
+ case SDRREPFUNC_OBJ_MOVTOBTM : rView.MovMarkedToBtm(); break;
+ case SDRREPFUNC_OBJ_REVORDER : rView.ReverseOrderOfMarked(); break;
+ case SDRREPFUNC_OBJ_IMPORTMTF : rView.DoImportMarkedMtf(); break;
+ default: break;
+ } // switch
+}
+
+XubString SdrUndoGroup::GetSdrRepeatComment(SdrView& /*rView*/) const
+{
+ XubString aRet(aComment);
+ sal_Char aSearchText[] = "%1";
+ String aSearchString(aSearchText, sizeof(aSearchText-1));
+
+ aRet.SearchAndReplace(aSearchString, ImpGetResStr(STR_ObjNameSingulPlural));
+
+ return aRet;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// @@@@ @@@@@ @@@@@@ @@@@@ @@@@ @@@@@@ @@@@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@@@@ @@ @@@@ @@ @@ @@@@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@@@ @@@@@ @@@@ @@@@@ @@@@ @@ @@@@
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoObj::SdrUndoObj(SdrObject& rNewObj):
+ SdrUndoAction(*rNewObj.GetModel()),
+ pObj(&rNewObj)
+{
+}
+
+void SdrUndoObj::GetDescriptionStringForObject( const SdrObject& _rForObject, USHORT nStrCacheID, String& rStr, FASTBOOL bRepeat )
+{
+ rStr = ImpGetResStr(nStrCacheID);
+ sal_Char aSearchText[] = "%1";
+ String aSearchString(aSearchText, sizeof(aSearchText-1));
+
+ xub_StrLen nPos = rStr.Search(aSearchString);
+
+ if(nPos != STRING_NOTFOUND)
+ {
+ rStr.Erase(nPos, 2);
+
+ if(bRepeat)
+ {
+ rStr.Insert(ImpGetResStr(STR_ObjNameSingulPlural), nPos);
+ }
+ else
+ {
+ XubString aStr;
+
+ _rForObject.TakeObjNameSingul(aStr);
+ rStr.Insert(aStr, nPos);
+ }
+ }
+}
+
+void SdrUndoObj::ImpTakeDescriptionStr(USHORT nStrCacheID, XubString& rStr, FASTBOOL bRepeat) const
+{
+ if ( pObj )
+ GetDescriptionStringForObject( *pObj, nStrCacheID, rStr, bRepeat );
+}
+
+// #94278# common call method for evtl. page change when UNDO/REDO
+// is triggered
+void SdrUndoObj::ImpShowPageOfThisObject()
+{
+ if(pObj && pObj->IsInserted() && pObj->GetPage() && pObj->GetModel())
+ {
+ SdrHint aHint(HINT_SWITCHTOPAGE);
+
+ aHint.SetObject(pObj);
+ aHint.SetPage(pObj->GetPage());
+
+ pObj->GetModel()->Broadcast(aHint);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoAttrObj::SdrUndoAttrObj(SdrObject& rNewObj, FASTBOOL bStyleSheet1, FASTBOOL bSaveText)
+: SdrUndoObj(rNewObj),
+ pUndoSet(NULL),
+ pRedoSet(NULL),
+ pRepeatSet(NULL),
+ pUndoStyleSheet(NULL),
+ pRedoStyleSheet(NULL),
+ pRepeatStyleSheet(NULL),
+ bHaveToTakeRedoSet(TRUE),
+ pTextUndo(NULL),
+
+ // #i8508#
+ pTextRedo(NULL),
+
+ pUndoGroup(NULL)
+{
+ bStyleSheet = bStyleSheet1;
+
+ SdrObjList* pOL = rNewObj.GetSubList();
+ BOOL bIsGroup(pOL!=NULL && pOL->GetObjCount());
+ BOOL bIs3DScene(bIsGroup && pObj->ISA(E3dScene));
+
+ if(bIsGroup)
+ {
+ // Aha, Gruppenobjekt
+ pUndoGroup = new SdrUndoGroup(*pObj->GetModel());
+ sal_uInt32 nObjAnz(pOL->GetObjCount());
+
+ for(sal_uInt32 nObjNum(0); nObjNum < nObjAnz; nObjNum++)
+ {
+ pUndoGroup->AddAction(
+ new SdrUndoAttrObj(*pOL->GetObj(nObjNum), bStyleSheet1));
+ }
+ }
+
+ if(!bIsGroup || bIs3DScene)
+ {
+ if(pUndoSet)
+ {
+ delete pUndoSet;
+ }
+
+ pUndoSet = new SfxItemSet(pObj->GetMergedItemSet());
+
+ if(bStyleSheet)
+ pUndoStyleSheet = pObj->GetStyleSheet();
+
+ if(bSaveText)
+ {
+ pTextUndo = pObj->GetOutlinerParaObject();
+ if(pTextUndo)
+ pTextUndo = new OutlinerParaObject(*pTextUndo);
+ }
+ }
+}
+
+SdrUndoAttrObj::~SdrUndoAttrObj()
+{
+ if(pUndoSet)
+ delete pUndoSet;
+ if(pRedoSet)
+ delete pRedoSet;
+ if(pRepeatSet)
+ delete pRepeatSet;
+ if(pUndoGroup)
+ delete pUndoGroup;
+ if(pTextUndo)
+ delete pTextUndo;
+
+ // #i8508#
+ if(pTextRedo)
+ delete pTextRedo;
+}
+
+void SdrUndoAttrObj::SetRepeatAttr(const SfxItemSet& rSet)
+{
+ if(pRepeatSet)
+ delete pRepeatSet;
+
+ pRepeatSet = new SfxItemSet(rSet);
+}
+
+void SdrUndoAttrObj::Undo()
+{
+ E3DModifySceneSnapRectUpdater aUpdater(pObj);
+ BOOL bIs3DScene(pObj && pObj->ISA(E3dScene));
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+
+ if(!pUndoGroup || bIs3DScene)
+ {
+ if(bHaveToTakeRedoSet)
+ {
+ bHaveToTakeRedoSet = FALSE;
+
+ if(pRedoSet)
+ {
+ delete pRedoSet;
+ }
+
+ pRedoSet = new SfxItemSet(pObj->GetMergedItemSet());
+
+ if(bStyleSheet)
+ pRedoStyleSheet=pObj->GetStyleSheet();
+
+ if(pTextUndo)
+ {
+ // #i8508#
+ pTextRedo = pObj->GetOutlinerParaObject();
+
+ if(pTextRedo)
+ pTextRedo = new OutlinerParaObject(*pTextRedo);
+ }
+ }
+
+ if(bStyleSheet)
+ {
+ pRedoStyleSheet = pObj->GetStyleSheet();
+ pObj->SetStyleSheet(pUndoStyleSheet, TRUE);
+ }
+
+ sdr::properties::ItemChangeBroadcaster aItemChange(*pObj);
+
+ // #105122# Since ClearItem sets back everything to normal
+ // it also sets fit-to-size text to non-fit-to-size text and
+ // switches on autogrowheight (the default). That may lead to
+ // loosing the geometry size info for the object when it is
+ // re-layouted from AdjustTextFrameWidthAndHeight(). This makes
+ // rescuing the size of the object necessary.
+ const Rectangle aSnapRect = pObj->GetSnapRect();
+
+ if(pUndoSet)
+ {
+ // #109587#
+ if(pObj->ISA(SdrCaptionObj))
+ {
+ // do a more smooth item deletion here, else the text
+ // rect will be reformatted, especially when information regarding
+ // vertical text is changed. When clearing only set items it's
+ // slower, but safer regarding such information (it's not changed
+ // usually)
+ SfxWhichIter aIter(*pUndoSet);
+ sal_uInt16 nWhich(aIter.FirstWhich());
+
+ while(nWhich)
+ {
+ if(SFX_ITEM_SET != pUndoSet->GetItemState(nWhich, sal_False))
+ {
+ pObj->ClearMergedItem(nWhich);
+ }
+
+ nWhich = aIter.NextWhich();
+ }
+ }
+ else
+ {
+ pObj->ClearMergedItem();
+ }
+
+ pObj->SetMergedItemSet(*pUndoSet);
+ }
+
+ // #105122# Restore prev size here when it was changed.
+ if(aSnapRect != pObj->GetSnapRect())
+ {
+ pObj->NbcSetSnapRect(aSnapRect);
+ }
+
+ pObj->GetProperties().BroadcastItemChange(aItemChange);
+
+ if(pTextUndo)
+ {
+ pObj->SetOutlinerParaObject(new OutlinerParaObject(*pTextUndo));
+ }
+ }
+
+ if(pUndoGroup)
+ {
+ pUndoGroup->Undo();
+ }
+}
+
+void SdrUndoAttrObj::Redo()
+{
+ E3DModifySceneSnapRectUpdater aUpdater(pObj);
+ BOOL bIs3DScene(pObj && pObj->ISA(E3dScene));
+
+ if(!pUndoGroup || bIs3DScene)
+ {
+ if(bStyleSheet)
+ {
+ pUndoStyleSheet = pObj->GetStyleSheet();
+ pObj->SetStyleSheet(pRedoStyleSheet, TRUE);
+ }
+
+ sdr::properties::ItemChangeBroadcaster aItemChange(*pObj);
+
+ // #105122#
+ const Rectangle aSnapRect = pObj->GetSnapRect();
+
+ if(pRedoSet)
+ {
+ // #109587#
+ if(pObj->ISA(SdrCaptionObj))
+ {
+ // do a more smooth item deletion here, else the text
+ // rect will be reformatted, especially when information regarding
+ // vertical text is changed. When clearing only set items it's
+ // slower, but safer regarding such information (it's not changed
+ // usually)
+ SfxWhichIter aIter(*pRedoSet);
+ sal_uInt16 nWhich(aIter.FirstWhich());
+
+ while(nWhich)
+ {
+ if(SFX_ITEM_SET != pRedoSet->GetItemState(nWhich, sal_False))
+ {
+ pObj->ClearMergedItem(nWhich);
+ }
+
+ nWhich = aIter.NextWhich();
+ }
+ }
+ else
+ {
+ pObj->ClearMergedItem();
+ }
+
+ pObj->SetMergedItemSet(*pRedoSet);
+ }
+
+ // #105122# Restore prev size here when it was changed.
+ if(aSnapRect != pObj->GetSnapRect())
+ {
+ pObj->NbcSetSnapRect(aSnapRect);
+ }
+
+ pObj->GetProperties().BroadcastItemChange(aItemChange);
+
+ // #i8508#
+ if(pTextRedo)
+ {
+ pObj->SetOutlinerParaObject(new OutlinerParaObject(*pTextRedo));
+ }
+ }
+
+ if(pUndoGroup)
+ {
+ pUndoGroup->Redo();
+ }
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+}
+
+XubString SdrUndoAttrObj::GetComment() const
+{
+ XubString aStr;
+
+ if(bStyleSheet)
+ {
+ ImpTakeDescriptionStr(STR_EditSetStylesheet, aStr);
+ }
+ else
+ {
+ ImpTakeDescriptionStr(STR_EditSetAttributes, aStr);
+ }
+
+ return aStr;
+}
+
+void SdrUndoAttrObj::SdrRepeat(SdrView& rView)
+{
+ if(pRepeatSet)
+ {
+ rView.SetAttrToMarked(*pRepeatSet, FALSE);
+ }
+}
+
+bool SdrUndoAttrObj::CanSdrRepeat(SdrView& rView) const
+{
+ return (pRepeatSet!=0L && rView.AreObjectsMarked());
+}
+
+XubString SdrUndoAttrObj::GetSdrRepeatComment(SdrView& /*rView*/) const
+{
+ XubString aStr;
+
+ if(bStyleSheet)
+ {
+ ImpTakeDescriptionStr(STR_EditSetStylesheet, aStr, TRUE);
+ }
+ else
+ {
+ ImpTakeDescriptionStr(STR_EditSetAttributes, aStr, TRUE);
+ }
+
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoMoveObj::Undo()
+{
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+
+ pObj->Move(Size(-aDistance.Width(),-aDistance.Height()));
+}
+
+void SdrUndoMoveObj::Redo()
+{
+ pObj->Move(Size(aDistance.Width(),aDistance.Height()));
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+}
+
+XubString SdrUndoMoveObj::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_EditMove,aStr);
+ return aStr;
+}
+
+void SdrUndoMoveObj::SdrRepeat(SdrView& rView)
+{
+ rView.MoveMarkedObj(aDistance);
+}
+
+bool SdrUndoMoveObj::CanSdrRepeat(SdrView& rView) const
+{
+ return rView.AreObjectsMarked();
+}
+
+XubString SdrUndoMoveObj::GetSdrRepeatComment(SdrView& /*rView*/) const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_EditMove,aStr,TRUE);
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoGeoObj::SdrUndoGeoObj(SdrObject& rNewObj):
+ SdrUndoObj(rNewObj),
+ pUndoGeo(NULL),
+ pRedoGeo(NULL),
+ pUndoGroup(NULL)
+{
+ SdrObjList* pOL=rNewObj.GetSubList();
+ if (pOL!=NULL && pOL->GetObjCount() && !rNewObj.ISA(E3dScene))
+ {
+ // Aha, Gruppenobjekt
+ // AW: Aber keine 3D-Szene, dann nur fuer die Szene selbst den Undo anlegen
+ pUndoGroup=new SdrUndoGroup(*pObj->GetModel());
+ ULONG nObjAnz=pOL->GetObjCount();
+ for (ULONG nObjNum=0; nObjNum<nObjAnz; nObjNum++) {
+ pUndoGroup->AddAction(new SdrUndoGeoObj(*pOL->GetObj(nObjNum)));
+ }
+ } else {
+ pUndoGeo=pObj->GetGeoData();
+ }
+}
+
+SdrUndoGeoObj::~SdrUndoGeoObj()
+{
+ if (pUndoGeo!=NULL) delete pUndoGeo;
+ if (pRedoGeo!=NULL) delete pRedoGeo;
+ if (pUndoGroup!=NULL) delete pUndoGroup;
+}
+
+void SdrUndoGeoObj::Undo()
+{
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+
+ if(pUndoGroup)
+ {
+ pUndoGroup->Undo();
+
+ // #97172#
+ // only repaint, no objectchange
+ pObj->ActionChanged();
+ }
+ else
+ {
+ if (pRedoGeo!=NULL) delete pRedoGeo;
+ pRedoGeo=pObj->GetGeoData();
+ pObj->SetGeoData(*pUndoGeo);
+ }
+}
+
+void SdrUndoGeoObj::Redo()
+{
+ if(pUndoGroup)
+ {
+ pUndoGroup->Redo();
+
+ // #97172#
+ // only repaint, no objectchange
+ pObj->ActionChanged();
+ }
+ else
+ {
+ if (pUndoGeo!=NULL) delete pUndoGeo;
+ pUndoGeo=pObj->GetGeoData();
+ pObj->SetGeoData(*pRedoGeo);
+ }
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+}
+
+XubString SdrUndoGeoObj::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_DragMethObjOwn,aStr);
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoObjList::SdrUndoObjList(SdrObject& rNewObj, bool bOrdNumDirect)
+: SdrUndoObj(rNewObj),
+ bOwner(FALSE),
+ pView(NULL),
+ pPageView(NULL)
+{
+ pObjList=pObj->GetObjList();
+ if (bOrdNumDirect) {
+ nOrdNum=pObj->GetOrdNumDirect();
+ } else {
+ nOrdNum=pObj->GetOrdNum();
+ }
+}
+
+SdrUndoObjList::~SdrUndoObjList()
+{
+ if (pObj!=NULL && IsOwner())
+ {
+ // Attribute muessen wieder in den regulaeren Pool
+ SetOwner(FALSE);
+
+ // nun loeschen
+ SdrObject::Free( pObj );
+ }
+}
+
+void SdrUndoObjList::SetOwner(bool bNew)
+{
+ bOwner = bNew;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoRemoveObj::Undo()
+{
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+
+ DBG_ASSERT(!pObj->IsInserted(),"UndoRemoveObj: pObj ist bereits Inserted");
+ if (!pObj->IsInserted())
+ {
+ // #i11426#
+ // For UNDOs in Calc/Writer it is necessary to adapt the anchor
+ // pos of the target object.
+ Point aOwnerAnchorPos(0, 0);
+
+ if(pObjList
+ && pObjList->GetOwnerObj()
+ && pObjList->GetOwnerObj()->ISA(SdrObjGroup))
+ {
+ aOwnerAnchorPos = pObjList->GetOwnerObj()->GetAnchorPos();
+ }
+
+ E3DModifySceneSnapRectUpdater aUpdater(pObjList->GetOwnerObj());
+ SdrInsertReason aReason(SDRREASON_UNDO);
+ pObjList->InsertObject(pObj,nOrdNum,&aReason);
+
+ // #i11426#
+ if(aOwnerAnchorPos.X() || aOwnerAnchorPos.Y())
+ {
+ pObj->NbcSetAnchorPos(aOwnerAnchorPos);
+ }
+ }
+}
+
+void SdrUndoRemoveObj::Redo()
+{
+ DBG_ASSERT(pObj->IsInserted(),"RedoRemoveObj: pObj ist nicht Inserted");
+ if (pObj->IsInserted())
+ {
+ ImplUnmarkObject( pObj );
+ E3DModifySceneSnapRectUpdater aUpdater(pObj);
+ pObjList->RemoveObject(nOrdNum);
+ }
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoInsertObj::Undo()
+{
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+
+ DBG_ASSERT(pObj->IsInserted(),"UndoInsertObj: pObj ist nicht Inserted");
+ if (pObj->IsInserted())
+ {
+ ImplUnmarkObject( pObj );
+
+#ifdef DBG_UTIL
+ SdrObject* pChkObj=
+#endif
+ pObjList->RemoveObject(nOrdNum);
+ DBG_ASSERT(pChkObj==pObj,"UndoInsertObj: RemoveObjNum!=pObj");
+ }
+}
+
+void SdrUndoInsertObj::Redo()
+{
+ DBG_ASSERT(!pObj->IsInserted(),"RedoInsertObj: pObj ist bereits Inserted");
+ if (!pObj->IsInserted())
+ {
+ // --> OD 2005-05-10 #i45952# - restore anchor position of an object,
+ // which becomes a member of a group, because its cleared in method
+ // <InsertObject(..)>. Needed for correct ReDo in Writer.
+ Point aAnchorPos( 0, 0 );
+ if ( pObjList &&
+ pObjList->GetOwnerObj() &&
+ pObjList->GetOwnerObj()->ISA(SdrObjGroup) )
+ {
+ aAnchorPos = pObj->GetAnchorPos();
+ }
+ // <--
+
+ SdrInsertReason aReason(SDRREASON_UNDO);
+ pObjList->InsertObject(pObj,nOrdNum,&aReason);
+
+ // --> OD 2005-05-10 #i45952#
+ if ( aAnchorPos.X() || aAnchorPos.Y() )
+ {
+ pObj->NbcSetAnchorPos( aAnchorPos );
+ }
+ // <--
+ }
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoDelObj::Undo()
+{
+ SdrUndoRemoveObj::Undo();
+ DBG_ASSERT(IsOwner(),"UndoDeleteObj: pObj gehoert nicht der UndoAction");
+ SetOwner(FALSE);
+}
+
+void SdrUndoDelObj::Redo()
+{
+ SdrUndoRemoveObj::Redo();
+ DBG_ASSERT(!IsOwner(),"RedoDeleteObj: pObj gehoert bereits der UndoAction");
+ SetOwner(TRUE);
+}
+
+XubString SdrUndoDelObj::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_EditDelete,aStr);
+ return aStr;
+}
+
+void SdrUndoDelObj::SdrRepeat(SdrView& rView)
+{
+ rView.DeleteMarked();
+}
+
+bool SdrUndoDelObj::CanSdrRepeat(SdrView& rView) const
+{
+ return rView.AreObjectsMarked();
+}
+
+XubString SdrUndoDelObj::GetSdrRepeatComment(SdrView& /*rView*/) const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_EditDelete,aStr,TRUE);
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoNewObj::Undo()
+{
+ SdrUndoInsertObj::Undo();
+ DBG_ASSERT(!IsOwner(),"RedoNewObj: pObj gehoert bereits der UndoAction");
+ SetOwner(TRUE);
+}
+
+void SdrUndoNewObj::Redo()
+{
+ SdrUndoInsertObj::Redo();
+ DBG_ASSERT(IsOwner(),"RedoNewObj: pObj gehoert nicht der UndoAction");
+ SetOwner(FALSE);
+}
+
+String SdrUndoNewObj::GetComment( const SdrObject& _rForObject )
+{
+ String sComment;
+ GetDescriptionStringForObject( _rForObject, STR_UndoInsertObj, sComment );
+ return sComment;
+}
+
+XubString SdrUndoNewObj::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoInsertObj,aStr);
+ return aStr;
+}
+
+SdrUndoReplaceObj::SdrUndoReplaceObj(SdrObject& rOldObj1, SdrObject& rNewObj1, bool bOrdNumDirect)
+: SdrUndoObj(rOldObj1),
+ bOldOwner(FALSE),
+ bNewOwner(FALSE),
+ pNewObj(&rNewObj1)
+{
+ SetOldOwner(TRUE);
+
+ pObjList=pObj->GetObjList();
+ if (bOrdNumDirect) {
+ nOrdNum=pObj->GetOrdNumDirect();
+ } else {
+ nOrdNum=pObj->GetOrdNum();
+ }
+}
+
+SdrUndoReplaceObj::~SdrUndoReplaceObj()
+{
+ if (pObj!=NULL && IsOldOwner())
+ {
+ // Attribute muessen wieder in den regulaeren Pool
+ SetOldOwner(FALSE);
+
+ // nun loeschen
+ SdrObject::Free( pObj );
+ }
+ if (pNewObj!=NULL && IsNewOwner())
+ {
+ // Attribute muessen wieder in den regulaeren Pool
+ SetNewOwner(FALSE);
+
+ // nun loeschen
+ SdrObject::Free( pNewObj );
+ }
+}
+
+void SdrUndoReplaceObj::Undo()
+{
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+
+ if (IsOldOwner() && !IsNewOwner())
+ {
+ DBG_ASSERT(!pObj->IsInserted(),"SdrUndoReplaceObj::Undo(): Altes Objekt ist bereits inserted!");
+ DBG_ASSERT(pNewObj->IsInserted(),"SdrUndoReplaceObj::Undo(): Neues Objekt ist nicht inserted!");
+ SetOldOwner(FALSE);
+ SetNewOwner(TRUE);
+
+ ImplUnmarkObject( pNewObj );
+ pObjList->ReplaceObject(pObj,nOrdNum);
+ }
+ else
+ {
+ DBG_ERROR("SdrUndoReplaceObj::Undo(): IsMine-Flags stehen verkehrt. Doppelter Undo-Aufruf?");
+ }
+}
+
+void SdrUndoReplaceObj::Redo()
+{
+ if (!IsOldOwner() && IsNewOwner())
+ {
+ DBG_ASSERT(!pNewObj->IsInserted(),"SdrUndoReplaceObj::Redo(): Neues Objekt ist bereits inserted!");
+ DBG_ASSERT(pObj->IsInserted(),"SdrUndoReplaceObj::Redo(): Altes Objekt ist nicht inserted!");
+ SetOldOwner(TRUE);
+ SetNewOwner(FALSE);
+
+ ImplUnmarkObject( pObj );
+ pObjList->ReplaceObject(pNewObj,nOrdNum);
+
+ }
+ else
+ {
+ DBG_ERROR("SdrUndoReplaceObj::Redo(): IsMine-Flags stehen verkehrt. Doppelter Redo-Aufruf?");
+ }
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+}
+
+void SdrUndoReplaceObj::SetNewOwner(bool bNew)
+{
+ bNewOwner = bNew;
+}
+
+void SdrUndoReplaceObj::SetOldOwner(bool bNew)
+{
+ bOldOwner = bNew;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+XubString SdrUndoCopyObj::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoCopyObj,aStr);
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// #i11702#
+
+SdrUndoObjectLayerChange::SdrUndoObjectLayerChange(SdrObject& rObj, SdrLayerID aOldLayer, SdrLayerID aNewLayer)
+: SdrUndoObj(rObj),
+ maOldLayer(aOldLayer),
+ maNewLayer(aNewLayer)
+{
+}
+
+void SdrUndoObjectLayerChange::Undo()
+{
+ ImpShowPageOfThisObject();
+ pObj->SetLayer(maOldLayer);
+}
+
+void SdrUndoObjectLayerChange::Redo()
+{
+ pObj->SetLayer(maNewLayer);
+ ImpShowPageOfThisObject();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoObjOrdNum::SdrUndoObjOrdNum(SdrObject& rNewObj, UINT32 nOldOrdNum1, UINT32 nNewOrdNum1):
+ SdrUndoObj(rNewObj),
+ nOldOrdNum(nOldOrdNum1),
+ nNewOrdNum(nNewOrdNum1)
+{
+}
+
+void SdrUndoObjOrdNum::Undo()
+{
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+
+ SdrObjList* pOL=pObj->GetObjList();
+ if (pOL==NULL) {
+ DBG_ERROR("UndoObjOrdNum: pObj hat keine ObjList");
+ return;
+ }
+ pOL->SetObjectOrdNum(nNewOrdNum,nOldOrdNum);
+}
+
+void SdrUndoObjOrdNum::Redo()
+{
+ SdrObjList* pOL=pObj->GetObjList();
+ if (pOL==NULL) {
+ DBG_ERROR("RedoObjOrdNum: pObj hat keine ObjList");
+ return;
+ }
+ pOL->SetObjectOrdNum(nOldOrdNum,nNewOrdNum);
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+}
+
+XubString SdrUndoObjOrdNum::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoObjOrdNum,aStr);
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoObjSetText::SdrUndoObjSetText(SdrObject& rNewObj, sal_Int32 nText)
+: SdrUndoObj(rNewObj)
+, pOldText(NULL)
+, pNewText(NULL)
+, bNewTextAvailable(FALSE)
+, bEmptyPresObj(FALSE)
+, mnText(nText)
+{
+ SdrText* pText = static_cast< SdrTextObj*>( &rNewObj )->getText(mnText);
+ if( pText && pText->GetOutlinerParaObject() )
+ pOldText = new OutlinerParaObject(*pText->GetOutlinerParaObject());
+
+ bEmptyPresObj = rNewObj.IsEmptyPresObj();
+}
+
+SdrUndoObjSetText::~SdrUndoObjSetText()
+{
+ if ( pOldText )
+ delete pOldText;
+ if ( pNewText )
+ delete pNewText;
+}
+
+void SdrUndoObjSetText::AfterSetText()
+{
+ if (!bNewTextAvailable)
+ {
+ SdrText* pText = static_cast< SdrTextObj*>( pObj )->getText(mnText);
+ if( pText && pText->GetOutlinerParaObject() )
+ pNewText = new OutlinerParaObject(*pText->GetOutlinerParaObject());
+ bNewTextAvailable=TRUE;
+ }
+}
+
+void SdrUndoObjSetText::Undo()
+{
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+
+ // alten Text sichern fuer Redo
+ if (!bNewTextAvailable)
+ AfterSetText();
+
+ // Text fuer Undo kopieren, denn SetOutlinerParaObject() ist Eigentumsuebereignung
+ OutlinerParaObject* pText1 = pOldText;
+ if(pText1)
+ pText1 = new OutlinerParaObject(*pText1);
+
+ SdrText* pText = static_cast< SdrTextObj*>( pObj )->getText(mnText);
+ if( pText )
+ pText->SetOutlinerParaObject(pText1);
+
+ pObj->SetEmptyPresObj( bEmptyPresObj );
+ pObj->ActionChanged();
+}
+
+void SdrUndoObjSetText::Redo()
+{
+ // Text fuer Undo kopieren, denn SetOutlinerParaObject() ist Eigentumsuebereignung
+ OutlinerParaObject* pText1 = pNewText;
+
+ if(pText1)
+ pText1 = new OutlinerParaObject(*pText1);
+
+ SdrText* pText = static_cast< SdrTextObj*>( pObj )->getText(mnText);
+ if( pText )
+ static_cast< SdrTextObj* >( pObj )->NbcSetOutlinerParaObjectForText( pText1, pText );
+
+ pObj->ActionChanged();
+
+ // #94278# Trigger PageChangeCall
+ ImpShowPageOfThisObject();
+}
+
+XubString SdrUndoObjSetText::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoObjSetText,aStr);
+ return aStr;
+}
+
+XubString SdrUndoObjSetText::GetSdrRepeatComment(SdrView& /*rView*/) const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoObjSetText,aStr);
+ return aStr;
+}
+
+void SdrUndoObjSetText::SdrRepeat(SdrView& rView)
+{
+ if (bNewTextAvailable && rView.AreObjectsMarked())
+ {
+ const SdrMarkList& rML=rView.GetMarkedObjectList();
+
+ const bool bUndo = rView.IsUndoEnabled();
+ if( bUndo )
+ {
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoObjSetText,aStr);
+ rView.BegUndo(aStr);
+ }
+
+ ULONG nAnz=rML.GetMarkCount();
+ for (ULONG nm=0; nm<nAnz; nm++)
+ {
+ SdrObject* pObj2=rML.GetMark(nm)->GetMarkedSdrObj();
+ SdrTextObj* pTextObj=PTR_CAST(SdrTextObj,pObj2);
+ if (pTextObj!=NULL)
+ {
+ if( bUndo )
+ rView.AddUndo(new SdrUndoObjSetText(*pTextObj,0));
+
+ OutlinerParaObject* pText1=pNewText;
+ if (pText1!=NULL)
+ pText1 = new OutlinerParaObject(*pText1);
+ pTextObj->SetOutlinerParaObject(pText1);
+ }
+ }
+
+ if( bUndo )
+ rView.EndUndo();
+ }
+}
+
+bool SdrUndoObjSetText::CanSdrRepeat(SdrView& rView) const
+{
+ FASTBOOL bOk=FALSE;
+ if (bNewTextAvailable && rView.AreObjectsMarked()) {
+ bOk=TRUE;
+ }
+ return bOk;
+}
+
+// --> OD 2009-07-09 #i73249#
+SdrUndoObjStrAttr::SdrUndoObjStrAttr( SdrObject& rNewObj,
+ const ObjStrAttrType eObjStrAttr,
+ const String& sOldStr,
+ const String& sNewStr)
+ : SdrUndoObj( rNewObj ),
+ meObjStrAttr( eObjStrAttr ),
+ msOldStr( sOldStr ),
+ msNewStr( sNewStr )
+{
+}
+
+void SdrUndoObjStrAttr::Undo()
+{
+ ImpShowPageOfThisObject();
+
+ switch ( meObjStrAttr )
+ {
+ case OBJ_NAME:
+ {
+ pObj->SetName( msOldStr );
+ }
+ break;
+ case OBJ_TITLE:
+ {
+ pObj->SetTitle( msOldStr );
+ }
+ break;
+ case OBJ_DESCRIPTION:
+ {
+ pObj->SetDescription( msOldStr );
+ }
+ break;
+ }
+}
+
+void SdrUndoObjStrAttr::Redo()
+{
+ switch ( meObjStrAttr )
+ {
+ case OBJ_NAME:
+ {
+ pObj->SetName( msNewStr );
+ }
+ break;
+ case OBJ_TITLE:
+ {
+ pObj->SetTitle( msNewStr );
+ }
+ break;
+ case OBJ_DESCRIPTION:
+ {
+ pObj->SetDescription( msNewStr );
+ }
+ break;
+ }
+
+ ImpShowPageOfThisObject();
+}
+
+String SdrUndoObjStrAttr::GetComment() const
+{
+ String aStr;
+ switch ( meObjStrAttr )
+ {
+ case OBJ_NAME:
+ {
+ ImpTakeDescriptionStr( STR_UndoObjName, aStr );
+ aStr += sal_Unicode(' ');
+ aStr += sal_Unicode('\'');
+ aStr += msNewStr;
+ aStr += sal_Unicode('\'');
+ }
+ break;
+ case OBJ_TITLE:
+ {
+ ImpTakeDescriptionStr( STR_UndoObjTitle, aStr );
+ }
+ break;
+ case OBJ_DESCRIPTION:
+ {
+ ImpTakeDescriptionStr( STR_UndoObjDescription, aStr );
+ }
+ break;
+ }
+
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// @@ @@@@ @@ @@ @@@@@ @@@@@
+// @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@@@@@ @@@@ @@@@ @@@@@
+// @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@
+// @@@@@ @@ @@ @@ @@@@@ @@ @@
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoLayer::SdrUndoLayer(USHORT nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel):
+ SdrUndoAction(rNewModel),
+ pLayer(rNewLayerAdmin.GetLayer(nLayerNum)),
+ pLayerAdmin(&rNewLayerAdmin),
+ nNum(nLayerNum),
+ bItsMine(FALSE)
+{
+}
+
+SdrUndoLayer::~SdrUndoLayer()
+{
+ if (bItsMine) {
+ delete pLayer;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoNewLayer::Undo()
+{
+ DBG_ASSERT(!bItsMine,"SdrUndoNewLayer::Undo(): Layer gehoert bereits der UndoAction");
+ bItsMine=TRUE;
+#ifdef DBG_UTIL
+ SdrLayer* pCmpLayer=
+#endif
+ pLayerAdmin->RemoveLayer(nNum);
+ DBG_ASSERT(pCmpLayer==pLayer,"SdrUndoNewLayer::Undo(): Removter Layer ist != pLayer");
+}
+
+void SdrUndoNewLayer::Redo()
+{
+ DBG_ASSERT(bItsMine,"SdrUndoNewLayer::Undo(): Layer gehoert nicht der UndoAction");
+ bItsMine=FALSE;
+ pLayerAdmin->InsertLayer(pLayer,nNum);
+}
+
+XubString SdrUndoNewLayer::GetComment() const
+{
+ return ImpGetResStr(STR_UndoNewLayer);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoDelLayer::Undo()
+{
+ DBG_ASSERT(bItsMine,"SdrUndoDelLayer::Undo(): Layer gehoert nicht der UndoAction");
+ bItsMine=FALSE;
+ pLayerAdmin->InsertLayer(pLayer,nNum);
+}
+
+void SdrUndoDelLayer::Redo()
+{
+ DBG_ASSERT(!bItsMine,"SdrUndoDelLayer::Undo(): Layer gehoert bereits der UndoAction");
+ bItsMine=TRUE;
+#ifdef DBG_UTIL
+ SdrLayer* pCmpLayer=
+#endif
+ pLayerAdmin->RemoveLayer(nNum);
+ DBG_ASSERT(pCmpLayer==pLayer,"SdrUndoDelLayer::Redo(): Removter Layer ist != pLayer");
+}
+
+XubString SdrUndoDelLayer::GetComment() const
+{
+ return ImpGetResStr(STR_UndoDelLayer);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoMoveLayer::Undo()
+{
+#ifdef DBG_UTIL
+ SdrLayer* pCmpLayer=
+#endif
+ pLayerAdmin->RemoveLayer(nNeuPos);
+ DBG_ASSERT(pCmpLayer==pLayer,"SdrUndoMoveLayer::Undo(): Removter Layer ist != pLayer");
+ pLayerAdmin->InsertLayer(pLayer,nNum);
+}
+
+void SdrUndoMoveLayer::Redo()
+{
+#ifdef DBG_UTIL
+ SdrLayer* pCmpLayer=
+#endif
+ pLayerAdmin->RemoveLayer(nNum);
+ DBG_ASSERT(pCmpLayer==pLayer,"SdrUndoMoveLayer::Redo(): Removter Layer ist != pLayer");
+ pLayerAdmin->InsertLayer(pLayer,nNeuPos);
+}
+
+XubString SdrUndoMoveLayer::GetComment() const
+{
+ return ImpGetResStr(STR_UndoMovLayer);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// @@@@@ @@@@ @@@@ @@@@@ @@@@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@
+// @@@@@ @@@@@@ @@ @@@ @@@@ @@@@
+// @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@@@@ @@@@@ @@@@
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoPage::SdrUndoPage(SdrPage& rNewPg)
+: SdrUndoAction(*rNewPg.GetModel()),
+ mrPage(rNewPg)
+{
+}
+
+void SdrUndoPage::ImpInsertPage(USHORT nNum)
+{
+ DBG_ASSERT(!mrPage.IsInserted(),"SdrUndoPage::ImpInsertPage(): mrPage ist bereits Inserted");
+ if (!mrPage.IsInserted()) {
+ if (mrPage.IsMasterPage()) {
+ rMod.InsertMasterPage(&mrPage,nNum);
+ } else {
+ rMod.InsertPage(&mrPage,nNum);
+ }
+ }
+}
+
+void SdrUndoPage::ImpRemovePage(USHORT nNum)
+{
+ DBG_ASSERT(mrPage.IsInserted(),"SdrUndoPage::ImpRemovePage(): mrPage ist nicht Inserted");
+ if (mrPage.IsInserted()) {
+ SdrPage* pChkPg=NULL;
+ if (mrPage.IsMasterPage()) {
+ pChkPg=rMod.RemoveMasterPage(nNum);
+ } else {
+ pChkPg=rMod.RemovePage(nNum);
+ }
+ DBG_ASSERT(pChkPg==&mrPage,"SdrUndoPage::ImpRemovePage(): RemovePage!=&mrPage");
+ }
+}
+
+void SdrUndoPage::ImpMovePage(USHORT nOldNum, USHORT nNewNum)
+{
+ DBG_ASSERT(mrPage.IsInserted(),"SdrUndoPage::ImpMovePage(): mrPage ist nicht Inserted");
+ if (mrPage.IsInserted()) {
+ if (mrPage.IsMasterPage()) {
+ rMod.MoveMasterPage(nOldNum,nNewNum);
+ } else {
+ rMod.MovePage(nOldNum,nNewNum);
+ }
+ }
+}
+
+void SdrUndoPage::ImpTakeDescriptionStr(USHORT nStrCacheID, XubString& rStr, USHORT /*n*/, FASTBOOL /*bRepeat*/) const
+{
+ rStr=ImpGetResStr(nStrCacheID);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoPageList::SdrUndoPageList(SdrPage& rNewPg):
+ SdrUndoPage(rNewPg),
+ bItsMine(FALSE)
+{
+ nPageNum=rNewPg.GetPageNum();
+}
+
+SdrUndoPageList::~SdrUndoPageList()
+{
+ if(bItsMine)
+ {
+ delete (&mrPage);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoDelPage::SdrUndoDelPage(SdrPage& rNewPg):
+ SdrUndoPageList(rNewPg),
+ pUndoGroup(NULL)
+{
+ bItsMine = TRUE;
+
+ // Und nun ggf. die MasterPage-Beziehungen merken
+ if(mrPage.IsMasterPage())
+ {
+ sal_uInt16 nPageAnz(rMod.GetPageCount());
+
+ for(sal_uInt16 nPageNum2(0); nPageNum2 < nPageAnz; nPageNum2++)
+ {
+ SdrPage* pDrawPage = rMod.GetPage(nPageNum2);
+
+ if(pDrawPage->TRG_HasMasterPage())
+ {
+ SdrPage& rMasterPage = pDrawPage->TRG_GetMasterPage();
+
+ if(&mrPage == &rMasterPage)
+ {
+ if(!pUndoGroup)
+ {
+ pUndoGroup = new SdrUndoGroup(rMod);
+ }
+
+ pUndoGroup->AddAction(rMod.GetSdrUndoFactory().CreateUndoPageRemoveMasterPage(*pDrawPage));
+ }
+ }
+ }
+ }
+}
+
+SdrUndoDelPage::~SdrUndoDelPage()
+{
+ if (pUndoGroup!=NULL) {
+ delete pUndoGroup;
+ }
+}
+
+void SdrUndoDelPage::Undo()
+{
+ ImpInsertPage(nPageNum);
+ if (pUndoGroup!=NULL) { // MasterPage-Beziehungen wiederherstellen
+ pUndoGroup->Undo();
+ }
+ DBG_ASSERT(bItsMine,"UndoDeletePage: mrPage gehoert nicht der UndoAction");
+ bItsMine=FALSE;
+}
+
+void SdrUndoDelPage::Redo()
+{
+ ImpRemovePage(nPageNum);
+ // Die MasterPage-Beziehungen werden ggf. von selbst geloesst
+ DBG_ASSERT(!bItsMine,"RedoDeletePage: mrPage gehoert bereits der UndoAction");
+ bItsMine=TRUE;
+}
+
+XubString SdrUndoDelPage::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoDelPage,aStr,0,FALSE);
+ return aStr;
+}
+
+XubString SdrUndoDelPage::GetSdrRepeatComment(SdrView& /*rView*/) const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoDelPage,aStr,0,FALSE);
+ return aStr;
+}
+
+void SdrUndoDelPage::SdrRepeat(SdrView& /*rView*/)
+{
+}
+
+bool SdrUndoDelPage::CanSdrRepeat(SdrView& /*rView*/) const
+{
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoNewPage::Undo()
+{
+ ImpRemovePage(nPageNum);
+ DBG_ASSERT(!bItsMine,"UndoNewPage: mrPage gehoert bereits der UndoAction");
+ bItsMine=TRUE;
+}
+
+void SdrUndoNewPage::Redo()
+{
+ ImpInsertPage(nPageNum);
+ DBG_ASSERT(bItsMine,"RedoNewPage: mrPage gehoert nicht der UndoAction");
+ bItsMine=FALSE;
+}
+
+XubString SdrUndoNewPage::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoNewPage,aStr,0,FALSE);
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+XubString SdrUndoCopyPage::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoCopPage,aStr,0,FALSE);
+ return aStr;
+}
+
+XubString SdrUndoCopyPage::GetSdrRepeatComment(SdrView& /*rView*/) const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoCopPage,aStr,0,FALSE);
+ return aStr;
+}
+
+void SdrUndoCopyPage::SdrRepeat(SdrView& /*rView*/)
+{
+
+}
+
+bool SdrUndoCopyPage::CanSdrRepeat(SdrView& /*rView*/) const
+{
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrUndoSetPageNum::Undo()
+{
+ ImpMovePage(nNewPageNum,nOldPageNum);
+}
+
+void SdrUndoSetPageNum::Redo()
+{
+ ImpMovePage(nOldPageNum,nNewPageNum);
+}
+
+XubString SdrUndoSetPageNum::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoMovPage,aStr,0,FALSE);
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// @@ @@ @@@@ @@@@ @@@@@@ @@@@@ @@@@@ @@@@@ @@@@ @@@@ @@@@@ @@@@
+// @@@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@@@@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@@@@@@ @@@@@@ @@@@ @@ @@@@ @@@@@ @@@@@ @@@@@@ @@ @@@ @@@@ @@@@
+// @@ @ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@@@ @@ @@@@@ @@ @@ @@ @@ @@ @@@@@ @@@@@ @@@@
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoPageMasterPage::SdrUndoPageMasterPage(SdrPage& rChangedPage)
+: SdrUndoPage(rChangedPage),
+ mbOldHadMasterPage(mrPage.TRG_HasMasterPage())
+{
+ // get current state from page
+ if(mbOldHadMasterPage)
+ {
+ maOldSet = mrPage.TRG_GetMasterPageVisibleLayers();
+ maOldMasterPageNumber = mrPage.TRG_GetMasterPage().GetPageNum();
+ }
+}
+
+SdrUndoPageMasterPage::~SdrUndoPageMasterPage()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoPageRemoveMasterPage::SdrUndoPageRemoveMasterPage(SdrPage& rChangedPage)
+: SdrUndoPageMasterPage(rChangedPage)
+{
+}
+
+void SdrUndoPageRemoveMasterPage::Undo()
+{
+ if(mbOldHadMasterPage)
+ {
+ mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maOldMasterPageNumber));
+ mrPage.TRG_SetMasterPageVisibleLayers(maOldSet);
+ }
+}
+
+void SdrUndoPageRemoveMasterPage::Redo()
+{
+ mrPage.TRG_ClearMasterPage();
+}
+
+XubString SdrUndoPageRemoveMasterPage::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoDelPageMasterDscr,aStr,0,FALSE);
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrUndoPageChangeMasterPage::SdrUndoPageChangeMasterPage(SdrPage& rChangedPage)
+: SdrUndoPageMasterPage(rChangedPage),
+ mbNewHadMasterPage(sal_False)
+{
+}
+
+void SdrUndoPageChangeMasterPage::Undo()
+{
+ // remember values from new page
+ if(mrPage.TRG_HasMasterPage())
+ {
+ mbNewHadMasterPage = sal_True;
+ maNewSet = mrPage.TRG_GetMasterPageVisibleLayers();
+ maNewMasterPageNumber = mrPage.TRG_GetMasterPage().GetPageNum();
+ }
+
+ // restore old values
+ if(mbOldHadMasterPage)
+ {
+ mrPage.TRG_ClearMasterPage();
+ mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maOldMasterPageNumber));
+ mrPage.TRG_SetMasterPageVisibleLayers(maOldSet);
+ }
+}
+
+void SdrUndoPageChangeMasterPage::Redo()
+{
+ // restore new values
+ if(mbNewHadMasterPage)
+ {
+ mrPage.TRG_ClearMasterPage();
+ mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maNewMasterPageNumber));
+ mrPage.TRG_SetMasterPageVisibleLayers(maNewSet);
+ }
+}
+
+XubString SdrUndoPageChangeMasterPage::GetComment() const
+{
+ XubString aStr;
+ ImpTakeDescriptionStr(STR_UndoChgPageMasterDscr,aStr,0,FALSE);
+ return aStr;
+}
+
+///////////////////////////////////////////////////////////////////////
+SdrUndoFactory::~SdrUndoFactory(){}
+// shapes
+SdrUndoAction* SdrUndoFactory::CreateUndoMoveObject( SdrObject& rObject )
+{
+ return new SdrUndoMoveObj( rObject );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoMoveObject( SdrObject& rObject, const Size& rDist )
+{
+ return new SdrUndoMoveObj( rObject, rDist );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoGeoObject( SdrObject& rObject )
+{
+ return new SdrUndoGeoObj( rObject );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoAttrObject( SdrObject& rObject, bool bStyleSheet1, bool bSaveText )
+{
+ return new SdrUndoAttrObj( rObject, bStyleSheet1 ? TRUE : FALSE, bSaveText ? TRUE : FALSE );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoRemoveObject( SdrObject& rObject, bool bOrdNumDirect )
+{
+ return new SdrUndoRemoveObj( rObject, bOrdNumDirect ? TRUE : FALSE );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoInsertObject( SdrObject& rObject, bool bOrdNumDirect )
+{
+ return new SdrUndoInsertObj( rObject, bOrdNumDirect ? TRUE : FALSE );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoDeleteObject( SdrObject& rObject, bool bOrdNumDirect )
+{
+ return new SdrUndoDelObj( rObject, bOrdNumDirect ? TRUE : FALSE );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoNewObject( SdrObject& rObject, bool bOrdNumDirect )
+{
+ return new SdrUndoNewObj( rObject, bOrdNumDirect ? TRUE : FALSE );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoCopyObject( SdrObject& rObject, bool bOrdNumDirect )
+{
+ return new SdrUndoCopyObj( rObject, bOrdNumDirect ? TRUE : FALSE );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoObjectOrdNum( SdrObject& rObject, sal_uInt32 nOldOrdNum1, sal_uInt32 nNewOrdNum1)
+{
+ return new SdrUndoObjOrdNum( rObject, nOldOrdNum1, nNewOrdNum1 );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject, bool bOrdNumDirect )
+{
+ return new SdrUndoReplaceObj( rOldObject, rNewObject, bOrdNumDirect ? TRUE : FALSE );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoObjectLayerChange( SdrObject& rObject, SdrLayerID aOldLayer, SdrLayerID aNewLayer )
+{
+ return new SdrUndoObjectLayerChange( rObject, aOldLayer, aNewLayer );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoObjectSetText( SdrObject& rNewObj, sal_Int32 nText )
+{
+ return new SdrUndoObjSetText( rNewObj, nText );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoObjectStrAttr( SdrObject& rObject,
+ SdrUndoObjStrAttr::ObjStrAttrType eObjStrAttrType,
+ String sOldStr,
+ String sNewStr )
+{
+ return new SdrUndoObjStrAttr( rObject, eObjStrAttrType, sOldStr, sNewStr );
+}
+
+
+// layer
+SdrUndoAction* SdrUndoFactory::CreateUndoNewLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel)
+{
+ return new SdrUndoNewLayer( nLayerNum, rNewLayerAdmin, rNewModel );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoDeleteLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel)
+{
+ return new SdrUndoDelLayer( nLayerNum, rNewLayerAdmin, rNewModel );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoMoveLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel, sal_uInt16 nNeuPos1)
+{
+ return new SdrUndoMoveLayer( nLayerNum, rNewLayerAdmin, rNewModel, nNeuPos1 );
+}
+
+// page
+SdrUndoAction* SdrUndoFactory::CreateUndoDeletePage(SdrPage& rPage)
+{
+ return new SdrUndoDelPage( rPage );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoNewPage(SdrPage& rPage)
+{
+ return new SdrUndoNewPage( rPage );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoCopyPage(SdrPage& rPage)
+{
+ return new SdrUndoCopyPage( rPage );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoSetPageNum(SdrPage& rNewPg, sal_uInt16 nOldPageNum1, sal_uInt16 nNewPageNum1)
+{
+ return new SdrUndoSetPageNum( rNewPg, nOldPageNum1, nNewPageNum1 );
+}
+ // master page
+SdrUndoAction* SdrUndoFactory::CreateUndoPageRemoveMasterPage(SdrPage& rChangedPage)
+{
+ return new SdrUndoPageRemoveMasterPage( rChangedPage );
+}
+
+SdrUndoAction* SdrUndoFactory::CreateUndoPageChangeMasterPage(SdrPage& rChangedPage)
+{
+ return new SdrUndoPageChangeMasterPage(rChangedPage);
+}
+
+// eof