xref: /trunk/main/svx/source/svdraw/svdundo.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 #include <svx/svdundo.hxx>
32 #include "svx/svditext.hxx"
33 #include <svx/svdotext.hxx>
34 #include <svx/svdobj.hxx>
35 #include <svx/svdpage.hxx>
36 #include <svx/svdlayer.hxx>
37 #include <svx/svdmodel.hxx>
38 #include <svx/svdview.hxx>
39 #include "svx/svdstr.hrc"   // Namen aus der Resource
40 #include "svx/svdglob.hxx"  // StringCache
41 #include <svx/scene3d.hxx>
42 #include <editeng/outlobj.hxx>
43 #include <svx/svdogrp.hxx>
44 #include <svx/sdr/properties/itemsettools.hxx>
45 #include <svx/sdr/properties/properties.hxx>
46 #include <svx/svdocapt.hxx>
47 #include <svl/whiter.hxx>
48 #include <svx/e3dsceneupdater.hxx>
49 
50 #include "svx/svdviter.hxx"
51 
52 ////////////////////////////////////////////////////////////////////////////////////////////////////
53 
54 // iterates over all views and unmarks this SdrObject if it is marked
55 static void ImplUnmarkObject( SdrObject* pObj )
56 {
57     SdrViewIter aIter( pObj );
58     for ( SdrView* pView = aIter.FirstView(); pView; pView = aIter.NextView() )
59     {
60         pView->MarkObj( pObj, pView->GetSdrPageView(), sal_True );
61     }
62 }
63 
64 ////////////////////////////////////////////////////////////////////////////////////////////////////
65 
66 TYPEINIT1(SdrUndoAction,SfxUndoAction);
67 
68 sal_Bool SdrUndoAction::CanRepeat(SfxRepeatTarget& rView) const
69 {
70     SdrView* pV=PTR_CAST(SdrView,&rView);
71     if (pV!=NULL) return CanSdrRepeat(*pV);
72     return sal_False;
73 }
74 
75 void SdrUndoAction::Repeat(SfxRepeatTarget& rView)
76 {
77     SdrView* pV=PTR_CAST(SdrView,&rView);
78     if (pV!=NULL) SdrRepeat(*pV);
79     DBG_ASSERT(pV!=NULL,"Repeat: Uebergebenes SfxRepeatTarget ist keine SdrView");
80 }
81 
82 XubString SdrUndoAction::GetRepeatComment(SfxRepeatTarget& rView) const
83 {
84     SdrView* pV=PTR_CAST(SdrView,&rView);
85     if (pV!=NULL) return GetSdrRepeatComment(*pV);
86     return String();
87 }
88 
89 bool SdrUndoAction::CanSdrRepeat(SdrView& /*rView*/) const
90 {
91     return sal_False;
92 }
93 
94 void SdrUndoAction::SdrRepeat(SdrView& /*rView*/)
95 {
96 }
97 
98 XubString SdrUndoAction::GetSdrRepeatComment(SdrView& /*rView*/) const
99 {
100     return String();
101 }
102 
103 ////////////////////////////////////////////////////////////////////////////////////////////////////
104 
105 SdrUndoGroup::SdrUndoGroup(SdrModel& rNewMod)
106 :   SdrUndoAction(rNewMod),
107     aBuf(1024,32,32),
108     eFunction(SDRREPFUNC_OBJ_NONE)      /*#72642#*/
109 {}
110 
111 SdrUndoGroup::SdrUndoGroup(SdrModel& rNewMod,const String& rStr)
112 :   SdrUndoAction(rNewMod),
113     aBuf(1024,32,32),
114     aComment(rStr),
115     eFunction(SDRREPFUNC_OBJ_NONE)
116 {}
117 
118 SdrUndoGroup::~SdrUndoGroup()
119 {
120     Clear();
121 }
122 
123 void SdrUndoGroup::Clear()
124 {
125     for (sal_uIntPtr nu=0; nu<GetActionCount(); nu++) {
126         SdrUndoAction* pAct=GetAction(nu);
127         delete pAct;
128     }
129     aBuf.Clear();
130 }
131 
132 void SdrUndoGroup::AddAction(SdrUndoAction* pAct)
133 {
134     aBuf.Insert(pAct,CONTAINER_APPEND);
135 }
136 
137 void SdrUndoGroup::push_front( SdrUndoAction* pAct )
138 {
139     aBuf.Insert(pAct, (sal_uIntPtr)0 );
140 }
141 
142 void SdrUndoGroup::Undo()
143 {
144     for (sal_uIntPtr nu=GetActionCount(); nu>0;) {
145         nu--;
146         SdrUndoAction* pAct=GetAction(nu);
147         pAct->Undo();
148     }
149 }
150 
151 void SdrUndoGroup::Redo()
152 {
153     for (sal_uIntPtr nu=0; nu<GetActionCount(); nu++) {
154         SdrUndoAction* pAct=GetAction(nu);
155         pAct->Redo();
156     }
157 }
158 
159 XubString SdrUndoGroup::GetComment() const
160 {
161     XubString aRet(aComment);
162     sal_Char aSearchText[] = "%1";
163     String aSearchString(aSearchText, sizeof(aSearchText-1));
164 
165     aRet.SearchAndReplace(aSearchString, aObjDescription);
166 
167     return aRet;
168 }
169 
170 bool SdrUndoGroup::CanSdrRepeat(SdrView& rView) const
171 {
172     switch (eFunction) {
173         case SDRREPFUNC_OBJ_NONE            :  return sal_False;
174         case SDRREPFUNC_OBJ_DELETE          :  return rView.AreObjectsMarked();
175         case SDRREPFUNC_OBJ_COMBINE_POLYPOLY:  return rView.IsCombinePossible(sal_False);
176         case SDRREPFUNC_OBJ_COMBINE_ONEPOLY :  return rView.IsCombinePossible(sal_True);
177         case SDRREPFUNC_OBJ_DISMANTLE_POLYS :  return rView.IsDismantlePossible(sal_False);
178         case SDRREPFUNC_OBJ_DISMANTLE_LINES :  return rView.IsDismantlePossible(sal_True);
179         case SDRREPFUNC_OBJ_CONVERTTOPOLY   :  return rView.IsConvertToPolyObjPossible(sal_False);
180         case SDRREPFUNC_OBJ_CONVERTTOPATH   :  return rView.IsConvertToPathObjPossible(sal_False);
181         case SDRREPFUNC_OBJ_GROUP           :  return rView.IsGroupPossible();
182         case SDRREPFUNC_OBJ_UNGROUP         :  return rView.IsUnGroupPossible();
183         case SDRREPFUNC_OBJ_PUTTOTOP        :  return rView.IsToTopPossible();
184         case SDRREPFUNC_OBJ_PUTTOBTM        :  return rView.IsToBtmPossible();
185         case SDRREPFUNC_OBJ_MOVTOTOP        :  return rView.IsToTopPossible();
186         case SDRREPFUNC_OBJ_MOVTOBTM        :  return rView.IsToBtmPossible();
187         case SDRREPFUNC_OBJ_REVORDER        :  return rView.IsReverseOrderPossible();
188         case SDRREPFUNC_OBJ_IMPORTMTF       :  return rView.IsImportMtfPossible();
189         default: break;
190     } // switch
191     return sal_False;
192 }
193 
194 void SdrUndoGroup::SdrRepeat(SdrView& rView)
195 {
196     switch (eFunction) {
197         case SDRREPFUNC_OBJ_NONE            :  break;
198         case SDRREPFUNC_OBJ_DELETE          :  rView.DeleteMarked();                break;
199         case SDRREPFUNC_OBJ_COMBINE_POLYPOLY:  rView.CombineMarkedObjects(sal_False);   break;
200         case SDRREPFUNC_OBJ_COMBINE_ONEPOLY :  rView.CombineMarkedObjects(sal_True);    break;
201         case SDRREPFUNC_OBJ_DISMANTLE_POLYS :  rView.DismantleMarkedObjects(sal_False); break;
202         case SDRREPFUNC_OBJ_DISMANTLE_LINES :  rView.DismantleMarkedObjects(sal_True);  break;
203         case SDRREPFUNC_OBJ_CONVERTTOPOLY   :  rView.ConvertMarkedToPolyObj(sal_False); break;
204         case SDRREPFUNC_OBJ_CONVERTTOPATH   :  rView.ConvertMarkedToPathObj(sal_False); break;
205         case SDRREPFUNC_OBJ_GROUP           :  rView.GroupMarked();                 break;
206         case SDRREPFUNC_OBJ_UNGROUP         :  rView.UnGroupMarked();               break;
207         case SDRREPFUNC_OBJ_PUTTOTOP        :  rView.PutMarkedToTop();              break;
208         case SDRREPFUNC_OBJ_PUTTOBTM        :  rView.PutMarkedToBtm();              break;
209         case SDRREPFUNC_OBJ_MOVTOTOP        :  rView.MovMarkedToTop();              break;
210         case SDRREPFUNC_OBJ_MOVTOBTM        :  rView.MovMarkedToBtm();              break;
211         case SDRREPFUNC_OBJ_REVORDER        :  rView.ReverseOrderOfMarked();        break;
212         case SDRREPFUNC_OBJ_IMPORTMTF       :  rView.DoImportMarkedMtf();           break;
213         default: break;
214     } // switch
215 }
216 
217 XubString SdrUndoGroup::GetSdrRepeatComment(SdrView& /*rView*/) const
218 {
219     XubString aRet(aComment);
220     sal_Char aSearchText[] = "%1";
221     String aSearchString(aSearchText, sizeof(aSearchText-1));
222 
223     aRet.SearchAndReplace(aSearchString, ImpGetResStr(STR_ObjNameSingulPlural));
224 
225     return aRet;
226 }
227 
228 ////////////////////////////////////////////////////////////////////////////////////////////////////
229 ////////////////////////////////////////////////////////////////////////////////////////////////////
230 //
231 //   @@@@   @@@@@   @@@@@@  @@@@@   @@@@   @@@@@@   @@@@
232 //  @@  @@  @@  @@      @@  @@     @@  @@    @@    @@  @@
233 //  @@  @@  @@  @@      @@  @@     @@        @@    @@
234 //  @@  @@  @@@@@       @@  @@@@   @@        @@     @@@@
235 //  @@  @@  @@  @@      @@  @@     @@        @@        @@
236 //  @@  @@  @@  @@  @@  @@  @@     @@  @@    @@    @@  @@
237 //   @@@@   @@@@@    @@@@   @@@@@   @@@@     @@     @@@@
238 //
239 ////////////////////////////////////////////////////////////////////////////////////////////////////
240 ////////////////////////////////////////////////////////////////////////////////////////////////////
241 
242 SdrUndoObj::SdrUndoObj(SdrObject& rNewObj):
243     SdrUndoAction(*rNewObj.GetModel()),
244     pObj(&rNewObj)
245 {
246 }
247 
248 void SdrUndoObj::GetDescriptionStringForObject( const SdrObject& _rForObject, sal_uInt16 nStrCacheID, String& rStr, FASTBOOL bRepeat )
249 {
250     rStr = ImpGetResStr(nStrCacheID);
251     sal_Char aSearchText[] = "%1";
252     String aSearchString(aSearchText, sizeof(aSearchText-1));
253 
254     xub_StrLen nPos = rStr.Search(aSearchString);
255 
256     if(nPos != STRING_NOTFOUND)
257     {
258         rStr.Erase(nPos, 2);
259 
260         if(bRepeat)
261         {
262             rStr.Insert(ImpGetResStr(STR_ObjNameSingulPlural), nPos);
263         }
264         else
265         {
266             XubString aStr;
267 
268             _rForObject.TakeObjNameSingul(aStr);
269             rStr.Insert(aStr, nPos);
270         }
271     }
272 }
273 
274 void SdrUndoObj::ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, XubString& rStr, FASTBOOL bRepeat) const
275 {
276     if ( pObj )
277         GetDescriptionStringForObject( *pObj, nStrCacheID, rStr, bRepeat );
278 }
279 
280 // #94278# common call method for evtl. page change when UNDO/REDO
281 // is triggered
282 void SdrUndoObj::ImpShowPageOfThisObject()
283 {
284     if(pObj && pObj->IsInserted() && pObj->GetPage() && pObj->GetModel())
285     {
286         SdrHint aHint(HINT_SWITCHTOPAGE);
287 
288         aHint.SetObject(pObj);
289         aHint.SetPage(pObj->GetPage());
290 
291         pObj->GetModel()->Broadcast(aHint);
292     }
293 }
294 
295 ////////////////////////////////////////////////////////////////////////////////////////////////////
296 
297 SdrUndoAttrObj::SdrUndoAttrObj(SdrObject& rNewObj, FASTBOOL bStyleSheet1, FASTBOOL bSaveText)
298 :   SdrUndoObj(rNewObj),
299     pUndoSet(NULL),
300     pRedoSet(NULL),
301     pRepeatSet(NULL),
302     pUndoStyleSheet(NULL),
303     pRedoStyleSheet(NULL),
304     pRepeatStyleSheet(NULL),
305     bHaveToTakeRedoSet(sal_True),
306     pTextUndo(NULL),
307 
308     // #i8508#
309     pTextRedo(NULL),
310 
311     pUndoGroup(NULL)
312 {
313     bStyleSheet = bStyleSheet1;
314 
315     SdrObjList* pOL = rNewObj.GetSubList();
316     sal_Bool bIsGroup(pOL!=NULL && pOL->GetObjCount());
317     sal_Bool bIs3DScene(bIsGroup && pObj->ISA(E3dScene));
318 
319     if(bIsGroup)
320     {
321         // Aha, Gruppenobjekt
322         pUndoGroup = new SdrUndoGroup(*pObj->GetModel());
323         sal_uInt32 nObjAnz(pOL->GetObjCount());
324 
325         for(sal_uInt32 nObjNum(0); nObjNum < nObjAnz; nObjNum++)
326         {
327             pUndoGroup->AddAction(
328                 new SdrUndoAttrObj(*pOL->GetObj(nObjNum), bStyleSheet1));
329         }
330     }
331 
332     if(!bIsGroup || bIs3DScene)
333     {
334         if(pUndoSet)
335         {
336             delete pUndoSet;
337         }
338 
339         pUndoSet = new SfxItemSet(pObj->GetMergedItemSet());
340 
341         if(bStyleSheet)
342             pUndoStyleSheet = pObj->GetStyleSheet();
343 
344         if(bSaveText)
345         {
346             pTextUndo = pObj->GetOutlinerParaObject();
347             if(pTextUndo)
348                 pTextUndo = new OutlinerParaObject(*pTextUndo);
349         }
350     }
351 }
352 
353 SdrUndoAttrObj::~SdrUndoAttrObj()
354 {
355     if(pUndoSet)
356         delete pUndoSet;
357     if(pRedoSet)
358         delete pRedoSet;
359     if(pRepeatSet)
360         delete pRepeatSet;
361     if(pUndoGroup)
362         delete pUndoGroup;
363     if(pTextUndo)
364         delete pTextUndo;
365 
366     // #i8508#
367     if(pTextRedo)
368         delete pTextRedo;
369 }
370 
371 void SdrUndoAttrObj::SetRepeatAttr(const SfxItemSet& rSet)
372 {
373     if(pRepeatSet)
374         delete pRepeatSet;
375 
376     pRepeatSet = new SfxItemSet(rSet);
377 }
378 
379 void SdrUndoAttrObj::Undo()
380 {
381     E3DModifySceneSnapRectUpdater aUpdater(pObj);
382     sal_Bool bIs3DScene(pObj && pObj->ISA(E3dScene));
383 
384     // #94278# Trigger PageChangeCall
385     ImpShowPageOfThisObject();
386 
387     if(!pUndoGroup || bIs3DScene)
388     {
389         if(bHaveToTakeRedoSet)
390         {
391             bHaveToTakeRedoSet = sal_False;
392 
393             if(pRedoSet)
394             {
395                 delete pRedoSet;
396             }
397 
398             pRedoSet = new SfxItemSet(pObj->GetMergedItemSet());
399 
400             if(bStyleSheet)
401                 pRedoStyleSheet=pObj->GetStyleSheet();
402 
403             if(pTextUndo)
404             {
405                 // #i8508#
406                 pTextRedo = pObj->GetOutlinerParaObject();
407 
408                 if(pTextRedo)
409                     pTextRedo = new OutlinerParaObject(*pTextRedo);
410             }
411         }
412 
413         if(bStyleSheet)
414         {
415             pRedoStyleSheet = pObj->GetStyleSheet();
416             pObj->SetStyleSheet(pUndoStyleSheet, sal_True);
417         }
418 
419         sdr::properties::ItemChangeBroadcaster aItemChange(*pObj);
420 
421         // #105122# Since ClearItem sets back everything to normal
422         // it also sets fit-to-size text to non-fit-to-size text and
423         // switches on autogrowheight (the default). That may lead to
424         // loosing the geometry size info for the object when it is
425         // re-layouted from AdjustTextFrameWidthAndHeight(). This makes
426         // rescuing the size of the object necessary.
427         const Rectangle aSnapRect = pObj->GetSnapRect();
428 
429         if(pUndoSet)
430         {
431             // #109587#
432             if(pObj->ISA(SdrCaptionObj))
433             {
434                 // do a more smooth item deletion here, else the text
435                 // rect will be reformatted, especially when information regarding
436                 // vertical text is changed. When clearing only set items it's
437                 // slower, but safer regarding such information (it's not changed
438                 // usually)
439                 SfxWhichIter aIter(*pUndoSet);
440                 sal_uInt16 nWhich(aIter.FirstWhich());
441 
442                 while(nWhich)
443                 {
444                     if(SFX_ITEM_SET != pUndoSet->GetItemState(nWhich, sal_False))
445                     {
446                         pObj->ClearMergedItem(nWhich);
447                     }
448 
449                     nWhich = aIter.NextWhich();
450                 }
451             }
452             else
453             {
454                 pObj->ClearMergedItem();
455             }
456 
457             pObj->SetMergedItemSet(*pUndoSet);
458         }
459 
460         // #105122# Restore prev size here when it was changed.
461         if(aSnapRect != pObj->GetSnapRect())
462         {
463             pObj->NbcSetSnapRect(aSnapRect);
464         }
465 
466         pObj->GetProperties().BroadcastItemChange(aItemChange);
467 
468         if(pTextUndo)
469         {
470             pObj->SetOutlinerParaObject(new OutlinerParaObject(*pTextUndo));
471         }
472     }
473 
474     if(pUndoGroup)
475     {
476         pUndoGroup->Undo();
477     }
478 }
479 
480 void SdrUndoAttrObj::Redo()
481 {
482     E3DModifySceneSnapRectUpdater aUpdater(pObj);
483     sal_Bool bIs3DScene(pObj && pObj->ISA(E3dScene));
484 
485     if(!pUndoGroup || bIs3DScene)
486     {
487         if(bStyleSheet)
488         {
489             pUndoStyleSheet = pObj->GetStyleSheet();
490             pObj->SetStyleSheet(pRedoStyleSheet, sal_True);
491         }
492 
493         sdr::properties::ItemChangeBroadcaster aItemChange(*pObj);
494 
495         // #105122#
496         const Rectangle aSnapRect = pObj->GetSnapRect();
497 
498         if(pRedoSet)
499         {
500             // #109587#
501             if(pObj->ISA(SdrCaptionObj))
502             {
503                 // do a more smooth item deletion here, else the text
504                 // rect will be reformatted, especially when information regarding
505                 // vertical text is changed. When clearing only set items it's
506                 // slower, but safer regarding such information (it's not changed
507                 // usually)
508                 SfxWhichIter aIter(*pRedoSet);
509                 sal_uInt16 nWhich(aIter.FirstWhich());
510 
511                 while(nWhich)
512                 {
513                     if(SFX_ITEM_SET != pRedoSet->GetItemState(nWhich, sal_False))
514                     {
515                         pObj->ClearMergedItem(nWhich);
516                     }
517 
518                     nWhich = aIter.NextWhich();
519                 }
520             }
521             else
522             {
523                 pObj->ClearMergedItem();
524             }
525 
526             pObj->SetMergedItemSet(*pRedoSet);
527         }
528 
529         // #105122# Restore prev size here when it was changed.
530         if(aSnapRect != pObj->GetSnapRect())
531         {
532             pObj->NbcSetSnapRect(aSnapRect);
533         }
534 
535         pObj->GetProperties().BroadcastItemChange(aItemChange);
536 
537         // #i8508#
538         if(pTextRedo)
539         {
540             pObj->SetOutlinerParaObject(new OutlinerParaObject(*pTextRedo));
541         }
542     }
543 
544     if(pUndoGroup)
545     {
546         pUndoGroup->Redo();
547     }
548 
549     // #94278# Trigger PageChangeCall
550     ImpShowPageOfThisObject();
551 }
552 
553 XubString SdrUndoAttrObj::GetComment() const
554 {
555     XubString aStr;
556 
557     if(bStyleSheet)
558     {
559         ImpTakeDescriptionStr(STR_EditSetStylesheet, aStr);
560     }
561     else
562     {
563         ImpTakeDescriptionStr(STR_EditSetAttributes, aStr);
564     }
565 
566     return aStr;
567 }
568 
569 void SdrUndoAttrObj::SdrRepeat(SdrView& rView)
570 {
571     if(pRepeatSet)
572     {
573         rView.SetAttrToMarked(*pRepeatSet, sal_False);
574     }
575 }
576 
577 bool SdrUndoAttrObj::CanSdrRepeat(SdrView& rView) const
578 {
579     return (pRepeatSet!=0L && rView.AreObjectsMarked());
580 }
581 
582 XubString SdrUndoAttrObj::GetSdrRepeatComment(SdrView& /*rView*/) const
583 {
584     XubString aStr;
585 
586     if(bStyleSheet)
587     {
588         ImpTakeDescriptionStr(STR_EditSetStylesheet, aStr, sal_True);
589     }
590     else
591     {
592         ImpTakeDescriptionStr(STR_EditSetAttributes, aStr, sal_True);
593     }
594 
595     return aStr;
596 }
597 
598 ////////////////////////////////////////////////////////////////////////////////////////////////////
599 
600 void SdrUndoMoveObj::Undo()
601 {
602     // #94278# Trigger PageChangeCall
603     ImpShowPageOfThisObject();
604 
605     pObj->Move(Size(-aDistance.Width(),-aDistance.Height()));
606 }
607 
608 void SdrUndoMoveObj::Redo()
609 {
610     pObj->Move(Size(aDistance.Width(),aDistance.Height()));
611 
612     // #94278# Trigger PageChangeCall
613     ImpShowPageOfThisObject();
614 }
615 
616 XubString SdrUndoMoveObj::GetComment() const
617 {
618     XubString aStr;
619     ImpTakeDescriptionStr(STR_EditMove,aStr);
620     return aStr;
621 }
622 
623 void SdrUndoMoveObj::SdrRepeat(SdrView& rView)
624 {
625     rView.MoveMarkedObj(aDistance);
626 }
627 
628 bool SdrUndoMoveObj::CanSdrRepeat(SdrView& rView) const
629 {
630     return rView.AreObjectsMarked();
631 }
632 
633 XubString SdrUndoMoveObj::GetSdrRepeatComment(SdrView& /*rView*/) const
634 {
635     XubString aStr;
636     ImpTakeDescriptionStr(STR_EditMove,aStr,sal_True);
637     return aStr;
638 }
639 
640 ////////////////////////////////////////////////////////////////////////////////////////////////////
641 
642 SdrUndoGeoObj::SdrUndoGeoObj(SdrObject& rNewObj):
643     SdrUndoObj(rNewObj),
644     pUndoGeo(NULL),
645     pRedoGeo(NULL),
646     pUndoGroup(NULL)
647 {
648     SdrObjList* pOL=rNewObj.GetSubList();
649     if (pOL!=NULL && pOL->GetObjCount() && !rNewObj.ISA(E3dScene))
650     {
651         // Aha, Gruppenobjekt
652         // AW: Aber keine 3D-Szene, dann nur fuer die Szene selbst den Undo anlegen
653         pUndoGroup=new SdrUndoGroup(*pObj->GetModel());
654         sal_uIntPtr nObjAnz=pOL->GetObjCount();
655         for (sal_uIntPtr nObjNum=0; nObjNum<nObjAnz; nObjNum++) {
656             pUndoGroup->AddAction(new SdrUndoGeoObj(*pOL->GetObj(nObjNum)));
657         }
658     } else {
659         pUndoGeo=pObj->GetGeoData();
660     }
661 }
662 
663 SdrUndoGeoObj::~SdrUndoGeoObj()
664 {
665     if (pUndoGeo!=NULL) delete pUndoGeo;
666     if (pRedoGeo!=NULL) delete pRedoGeo;
667     if (pUndoGroup!=NULL) delete pUndoGroup;
668 }
669 
670 void SdrUndoGeoObj::Undo()
671 {
672     // #94278# Trigger PageChangeCall
673     ImpShowPageOfThisObject();
674 
675     if(pUndoGroup)
676     {
677         pUndoGroup->Undo();
678 
679         // #97172#
680         // only repaint, no objectchange
681         pObj->ActionChanged();
682     }
683     else
684     {
685         if (pRedoGeo!=NULL) delete pRedoGeo;
686         pRedoGeo=pObj->GetGeoData();
687         pObj->SetGeoData(*pUndoGeo);
688     }
689 }
690 
691 void SdrUndoGeoObj::Redo()
692 {
693     if(pUndoGroup)
694     {
695         pUndoGroup->Redo();
696 
697         // #97172#
698         // only repaint, no objectchange
699         pObj->ActionChanged();
700     }
701     else
702     {
703         if (pUndoGeo!=NULL) delete pUndoGeo;
704         pUndoGeo=pObj->GetGeoData();
705         pObj->SetGeoData(*pRedoGeo);
706     }
707 
708     // #94278# Trigger PageChangeCall
709     ImpShowPageOfThisObject();
710 }
711 
712 XubString SdrUndoGeoObj::GetComment() const
713 {
714     XubString aStr;
715     ImpTakeDescriptionStr(STR_DragMethObjOwn,aStr);
716     return aStr;
717 }
718 
719 ////////////////////////////////////////////////////////////////////////////////////////////////////
720 
721 SdrUndoObjList::SdrUndoObjList(SdrObject& rNewObj, bool bOrdNumDirect)
722 :   SdrUndoObj(rNewObj),
723     bOwner(sal_False),
724     pView(NULL),
725     pPageView(NULL)
726 {
727     pObjList=pObj->GetObjList();
728     if (bOrdNumDirect) {
729         nOrdNum=pObj->GetOrdNumDirect();
730     } else {
731         nOrdNum=pObj->GetOrdNum();
732     }
733 }
734 
735 SdrUndoObjList::~SdrUndoObjList()
736 {
737     if (pObj!=NULL && IsOwner())
738     {
739         // Attribute muessen wieder in den regulaeren Pool
740         SetOwner(sal_False);
741 
742         // nun loeschen
743         SdrObject::Free( pObj );
744     }
745 }
746 
747 void SdrUndoObjList::SetOwner(bool bNew)
748 {
749     bOwner = bNew;
750 }
751 
752 ////////////////////////////////////////////////////////////////////////////////////////////////////
753 
754 void SdrUndoRemoveObj::Undo()
755 {
756     // #94278# Trigger PageChangeCall
757     ImpShowPageOfThisObject();
758 
759     DBG_ASSERT(!pObj->IsInserted(),"UndoRemoveObj: pObj ist bereits Inserted");
760     if (!pObj->IsInserted())
761     {
762         // #i11426#
763         // For UNDOs in Calc/Writer it is necessary to adapt the anchor
764         // pos of the target object.
765         Point aOwnerAnchorPos(0, 0);
766 
767         if(pObjList
768             && pObjList->GetOwnerObj()
769             && pObjList->GetOwnerObj()->ISA(SdrObjGroup))
770         {
771             aOwnerAnchorPos = pObjList->GetOwnerObj()->GetAnchorPos();
772         }
773 
774         E3DModifySceneSnapRectUpdater aUpdater(pObjList->GetOwnerObj());
775         SdrInsertReason aReason(SDRREASON_UNDO);
776         pObjList->InsertObject(pObj,nOrdNum,&aReason);
777 
778         // #i11426#
779         if(aOwnerAnchorPos.X() || aOwnerAnchorPos.Y())
780         {
781             pObj->NbcSetAnchorPos(aOwnerAnchorPos);
782         }
783     }
784 }
785 
786 void SdrUndoRemoveObj::Redo()
787 {
788     DBG_ASSERT(pObj->IsInserted(),"RedoRemoveObj: pObj ist nicht Inserted");
789     if (pObj->IsInserted())
790     {
791         ImplUnmarkObject( pObj );
792         E3DModifySceneSnapRectUpdater aUpdater(pObj);
793         pObjList->RemoveObject(nOrdNum);
794     }
795 
796     // #94278# Trigger PageChangeCall
797     ImpShowPageOfThisObject();
798 }
799 
800 ////////////////////////////////////////////////////////////////////////////////////////////////////
801 
802 void SdrUndoInsertObj::Undo()
803 {
804     // #94278# Trigger PageChangeCall
805     ImpShowPageOfThisObject();
806 
807     DBG_ASSERT(pObj->IsInserted(),"UndoInsertObj: pObj ist nicht Inserted");
808     if (pObj->IsInserted())
809     {
810         ImplUnmarkObject( pObj );
811 
812 #ifdef DBG_UTIL
813         SdrObject* pChkObj=
814 #endif
815         pObjList->RemoveObject(nOrdNum);
816         DBG_ASSERT(pChkObj==pObj,"UndoInsertObj: RemoveObjNum!=pObj");
817     }
818 }
819 
820 void SdrUndoInsertObj::Redo()
821 {
822     DBG_ASSERT(!pObj->IsInserted(),"RedoInsertObj: pObj ist bereits Inserted");
823     if (!pObj->IsInserted())
824     {
825         // --> OD 2005-05-10 #i45952# - restore anchor position of an object,
826         // which becomes a member of a group, because its cleared in method
827         // <InsertObject(..)>. Needed for correct ReDo in Writer.
828         Point aAnchorPos( 0, 0 );
829         if ( pObjList &&
830              pObjList->GetOwnerObj() &&
831              pObjList->GetOwnerObj()->ISA(SdrObjGroup) )
832         {
833             aAnchorPos = pObj->GetAnchorPos();
834         }
835         // <--
836 
837         SdrInsertReason aReason(SDRREASON_UNDO);
838         pObjList->InsertObject(pObj,nOrdNum,&aReason);
839 
840         // --> OD 2005-05-10 #i45952#
841         if ( aAnchorPos.X() || aAnchorPos.Y() )
842         {
843             pObj->NbcSetAnchorPos( aAnchorPos );
844         }
845         // <--
846     }
847 
848     // #94278# Trigger PageChangeCall
849     ImpShowPageOfThisObject();
850 }
851 
852 ////////////////////////////////////////////////////////////////////////////////////////////////////
853 
854 void SdrUndoDelObj::Undo()
855 {
856     SdrUndoRemoveObj::Undo();
857     DBG_ASSERT(IsOwner(),"UndoDeleteObj: pObj gehoert nicht der UndoAction");
858     SetOwner(sal_False);
859 }
860 
861 void SdrUndoDelObj::Redo()
862 {
863     SdrUndoRemoveObj::Redo();
864     DBG_ASSERT(!IsOwner(),"RedoDeleteObj: pObj gehoert bereits der UndoAction");
865     SetOwner(sal_True);
866 }
867 
868 XubString SdrUndoDelObj::GetComment() const
869 {
870     XubString aStr;
871     ImpTakeDescriptionStr(STR_EditDelete,aStr);
872     return aStr;
873 }
874 
875 void SdrUndoDelObj::SdrRepeat(SdrView& rView)
876 {
877     rView.DeleteMarked();
878 }
879 
880 bool SdrUndoDelObj::CanSdrRepeat(SdrView& rView) const
881 {
882     return rView.AreObjectsMarked();
883 }
884 
885 XubString SdrUndoDelObj::GetSdrRepeatComment(SdrView& /*rView*/) const
886 {
887     XubString aStr;
888     ImpTakeDescriptionStr(STR_EditDelete,aStr,sal_True);
889     return aStr;
890 }
891 
892 ////////////////////////////////////////////////////////////////////////////////////////////////////
893 
894 void SdrUndoNewObj::Undo()
895 {
896     SdrUndoInsertObj::Undo();
897     DBG_ASSERT(!IsOwner(),"RedoNewObj: pObj gehoert bereits der UndoAction");
898     SetOwner(sal_True);
899 }
900 
901 void SdrUndoNewObj::Redo()
902 {
903     SdrUndoInsertObj::Redo();
904     DBG_ASSERT(IsOwner(),"RedoNewObj: pObj gehoert nicht der UndoAction");
905     SetOwner(sal_False);
906 }
907 
908 String SdrUndoNewObj::GetComment( const SdrObject& _rForObject )
909 {
910     String sComment;
911     GetDescriptionStringForObject( _rForObject, STR_UndoInsertObj, sComment );
912     return sComment;
913 }
914 
915 XubString SdrUndoNewObj::GetComment() const
916 {
917     XubString aStr;
918     ImpTakeDescriptionStr(STR_UndoInsertObj,aStr);
919     return aStr;
920 }
921 
922 SdrUndoReplaceObj::SdrUndoReplaceObj(SdrObject& rOldObj1, SdrObject& rNewObj1, bool bOrdNumDirect)
923 :   SdrUndoObj(rOldObj1),
924     bOldOwner(sal_False),
925     bNewOwner(sal_False),
926     pNewObj(&rNewObj1)
927 {
928     SetOldOwner(sal_True);
929 
930     pObjList=pObj->GetObjList();
931     if (bOrdNumDirect) {
932         nOrdNum=pObj->GetOrdNumDirect();
933     } else {
934         nOrdNum=pObj->GetOrdNum();
935     }
936 }
937 
938 SdrUndoReplaceObj::~SdrUndoReplaceObj()
939 {
940     if (pObj!=NULL && IsOldOwner())
941     {
942         // Attribute muessen wieder in den regulaeren Pool
943         SetOldOwner(sal_False);
944 
945         // nun loeschen
946         SdrObject::Free( pObj );
947     }
948     if (pNewObj!=NULL && IsNewOwner())
949     {
950         // Attribute muessen wieder in den regulaeren Pool
951         SetNewOwner(sal_False);
952 
953         // nun loeschen
954         SdrObject::Free( pNewObj );
955     }
956 }
957 
958 void SdrUndoReplaceObj::Undo()
959 {
960     // #94278# Trigger PageChangeCall
961     ImpShowPageOfThisObject();
962 
963     if (IsOldOwner() && !IsNewOwner())
964     {
965         DBG_ASSERT(!pObj->IsInserted(),"SdrUndoReplaceObj::Undo(): Altes Objekt ist bereits inserted!");
966         DBG_ASSERT(pNewObj->IsInserted(),"SdrUndoReplaceObj::Undo(): Neues Objekt ist nicht inserted!");
967         SetOldOwner(sal_False);
968         SetNewOwner(sal_True);
969 
970         ImplUnmarkObject( pNewObj );
971         pObjList->ReplaceObject(pObj,nOrdNum);
972     }
973     else
974     {
975         DBG_ERROR("SdrUndoReplaceObj::Undo(): IsMine-Flags stehen verkehrt. Doppelter Undo-Aufruf?");
976     }
977 }
978 
979 void SdrUndoReplaceObj::Redo()
980 {
981     if (!IsOldOwner() && IsNewOwner())
982     {
983         DBG_ASSERT(!pNewObj->IsInserted(),"SdrUndoReplaceObj::Redo(): Neues Objekt ist bereits inserted!");
984         DBG_ASSERT(pObj->IsInserted(),"SdrUndoReplaceObj::Redo(): Altes Objekt ist nicht inserted!");
985         SetOldOwner(sal_True);
986         SetNewOwner(sal_False);
987 
988         ImplUnmarkObject( pObj );
989         pObjList->ReplaceObject(pNewObj,nOrdNum);
990 
991     }
992     else
993     {
994         DBG_ERROR("SdrUndoReplaceObj::Redo(): IsMine-Flags stehen verkehrt. Doppelter Redo-Aufruf?");
995     }
996 
997     // #94278# Trigger PageChangeCall
998     ImpShowPageOfThisObject();
999 }
1000 
1001 void SdrUndoReplaceObj::SetNewOwner(bool bNew)
1002 {
1003     bNewOwner = bNew;
1004 }
1005 
1006 void SdrUndoReplaceObj::SetOldOwner(bool bNew)
1007 {
1008     bOldOwner = bNew;
1009 }
1010 
1011 ////////////////////////////////////////////////////////////////////////////////////////////////////
1012 
1013 XubString SdrUndoCopyObj::GetComment() const
1014 {
1015     XubString aStr;
1016     ImpTakeDescriptionStr(STR_UndoCopyObj,aStr);
1017     return aStr;
1018 }
1019 
1020 ////////////////////////////////////////////////////////////////////////////////////////////////////
1021 // #i11702#
1022 
1023 SdrUndoObjectLayerChange::SdrUndoObjectLayerChange(SdrObject& rObj, SdrLayerID aOldLayer, SdrLayerID aNewLayer)
1024 :   SdrUndoObj(rObj),
1025     maOldLayer(aOldLayer),
1026     maNewLayer(aNewLayer)
1027 {
1028 }
1029 
1030 void SdrUndoObjectLayerChange::Undo()
1031 {
1032     ImpShowPageOfThisObject();
1033     pObj->SetLayer(maOldLayer);
1034 }
1035 
1036 void SdrUndoObjectLayerChange::Redo()
1037 {
1038     pObj->SetLayer(maNewLayer);
1039     ImpShowPageOfThisObject();
1040 }
1041 
1042 ////////////////////////////////////////////////////////////////////////////////////////////////////
1043 
1044 SdrUndoObjOrdNum::SdrUndoObjOrdNum(SdrObject& rNewObj, sal_uInt32 nOldOrdNum1, sal_uInt32 nNewOrdNum1):
1045     SdrUndoObj(rNewObj),
1046     nOldOrdNum(nOldOrdNum1),
1047     nNewOrdNum(nNewOrdNum1)
1048 {
1049 }
1050 
1051 void SdrUndoObjOrdNum::Undo()
1052 {
1053     // #94278# Trigger PageChangeCall
1054     ImpShowPageOfThisObject();
1055 
1056     SdrObjList* pOL=pObj->GetObjList();
1057     if (pOL==NULL) {
1058         DBG_ERROR("UndoObjOrdNum: pObj hat keine ObjList");
1059         return;
1060     }
1061     pOL->SetObjectOrdNum(nNewOrdNum,nOldOrdNum);
1062 }
1063 
1064 void SdrUndoObjOrdNum::Redo()
1065 {
1066     SdrObjList* pOL=pObj->GetObjList();
1067     if (pOL==NULL) {
1068         DBG_ERROR("RedoObjOrdNum: pObj hat keine ObjList");
1069         return;
1070     }
1071     pOL->SetObjectOrdNum(nOldOrdNum,nNewOrdNum);
1072 
1073     // #94278# Trigger PageChangeCall
1074     ImpShowPageOfThisObject();
1075 }
1076 
1077 XubString SdrUndoObjOrdNum::GetComment() const
1078 {
1079     XubString aStr;
1080     ImpTakeDescriptionStr(STR_UndoObjOrdNum,aStr);
1081     return aStr;
1082 }
1083 
1084 ////////////////////////////////////////////////////////////////////////////////////////////////////
1085 
1086 SdrUndoObjSetText::SdrUndoObjSetText(SdrObject& rNewObj, sal_Int32 nText)
1087 : SdrUndoObj(rNewObj)
1088 , pOldText(NULL)
1089 , pNewText(NULL)
1090 , bNewTextAvailable(sal_False)
1091 , bEmptyPresObj(sal_False)
1092 , mnText(nText)
1093 {
1094     SdrText* pText = static_cast< SdrTextObj*>( &rNewObj )->getText(mnText);
1095     if( pText && pText->GetOutlinerParaObject() )
1096         pOldText = new OutlinerParaObject(*pText->GetOutlinerParaObject());
1097 
1098     bEmptyPresObj = rNewObj.IsEmptyPresObj();
1099 }
1100 
1101 SdrUndoObjSetText::~SdrUndoObjSetText()
1102 {
1103     if ( pOldText )
1104         delete pOldText;
1105     if ( pNewText )
1106         delete pNewText;
1107 }
1108 
1109 void SdrUndoObjSetText::AfterSetText()
1110 {
1111     if (!bNewTextAvailable)
1112     {
1113         SdrText* pText = static_cast< SdrTextObj*>( pObj )->getText(mnText);
1114         if( pText && pText->GetOutlinerParaObject() )
1115             pNewText = new OutlinerParaObject(*pText->GetOutlinerParaObject());
1116         bNewTextAvailable=sal_True;
1117     }
1118 }
1119 
1120 void SdrUndoObjSetText::Undo()
1121 {
1122     // #94278# Trigger PageChangeCall
1123     ImpShowPageOfThisObject();
1124 
1125     // alten Text sichern fuer Redo
1126     if (!bNewTextAvailable)
1127         AfterSetText();
1128 
1129     // Text fuer Undo kopieren, denn SetOutlinerParaObject() ist Eigentumsuebereignung
1130     OutlinerParaObject* pText1 = pOldText;
1131     if(pText1)
1132         pText1 = new OutlinerParaObject(*pText1);
1133 
1134     SdrText* pText = static_cast< SdrTextObj*>( pObj )->getText(mnText);
1135     if( pText )
1136         pText->SetOutlinerParaObject(pText1);
1137 
1138     pObj->SetEmptyPresObj( bEmptyPresObj );
1139     pObj->ActionChanged();
1140 }
1141 
1142 void SdrUndoObjSetText::Redo()
1143 {
1144     // Text fuer Undo kopieren, denn SetOutlinerParaObject() ist Eigentumsuebereignung
1145     OutlinerParaObject* pText1 = pNewText;
1146 
1147     if(pText1)
1148         pText1 = new OutlinerParaObject(*pText1);
1149 
1150     SdrText* pText = static_cast< SdrTextObj*>( pObj )->getText(mnText);
1151     if( pText )
1152         static_cast< SdrTextObj* >( pObj )->NbcSetOutlinerParaObjectForText( pText1, pText );
1153 
1154     pObj->ActionChanged();
1155 
1156     // #94278# Trigger PageChangeCall
1157     ImpShowPageOfThisObject();
1158 }
1159 
1160 XubString SdrUndoObjSetText::GetComment() const
1161 {
1162     XubString aStr;
1163     ImpTakeDescriptionStr(STR_UndoObjSetText,aStr);
1164     return aStr;
1165 }
1166 
1167 XubString SdrUndoObjSetText::GetSdrRepeatComment(SdrView& /*rView*/) const
1168 {
1169     XubString aStr;
1170     ImpTakeDescriptionStr(STR_UndoObjSetText,aStr);
1171     return aStr;
1172 }
1173 
1174 void SdrUndoObjSetText::SdrRepeat(SdrView& rView)
1175 {
1176     if (bNewTextAvailable && rView.AreObjectsMarked())
1177     {
1178         const SdrMarkList& rML=rView.GetMarkedObjectList();
1179 
1180         const bool bUndo = rView.IsUndoEnabled();
1181         if( bUndo )
1182         {
1183             XubString aStr;
1184             ImpTakeDescriptionStr(STR_UndoObjSetText,aStr);
1185             rView.BegUndo(aStr);
1186         }
1187 
1188         sal_uIntPtr nAnz=rML.GetMarkCount();
1189         for (sal_uIntPtr nm=0; nm<nAnz; nm++)
1190         {
1191             SdrObject* pObj2=rML.GetMark(nm)->GetMarkedSdrObj();
1192             SdrTextObj* pTextObj=PTR_CAST(SdrTextObj,pObj2);
1193             if (pTextObj!=NULL)
1194             {
1195                 if( bUndo )
1196                     rView.AddUndo(new SdrUndoObjSetText(*pTextObj,0));
1197 
1198                 OutlinerParaObject* pText1=pNewText;
1199                 if (pText1!=NULL)
1200                     pText1 = new OutlinerParaObject(*pText1);
1201                 pTextObj->SetOutlinerParaObject(pText1);
1202             }
1203         }
1204 
1205         if( bUndo )
1206             rView.EndUndo();
1207     }
1208 }
1209 
1210 bool SdrUndoObjSetText::CanSdrRepeat(SdrView& rView) const
1211 {
1212     bool bOk=sal_False;
1213     if (bNewTextAvailable && rView.AreObjectsMarked()) {
1214         bOk=sal_True;
1215     }
1216     return bOk;
1217 }
1218 
1219 // --> OD 2009-07-09 #i73249#
1220 SdrUndoObjStrAttr::SdrUndoObjStrAttr( SdrObject& rNewObj,
1221                                       const ObjStrAttrType eObjStrAttr,
1222                                       const String& sOldStr,
1223                                       const String& sNewStr)
1224     : SdrUndoObj( rNewObj ),
1225       meObjStrAttr( eObjStrAttr ),
1226       msOldStr( sOldStr ),
1227       msNewStr( sNewStr )
1228 {
1229 }
1230 
1231 void SdrUndoObjStrAttr::Undo()
1232 {
1233     ImpShowPageOfThisObject();
1234 
1235     switch ( meObjStrAttr )
1236     {
1237         case OBJ_NAME:
1238         {
1239             pObj->SetName( msOldStr );
1240         }
1241         break;
1242         case OBJ_TITLE:
1243         {
1244             pObj->SetTitle( msOldStr );
1245         }
1246         break;
1247         case OBJ_DESCRIPTION:
1248         {
1249             pObj->SetDescription( msOldStr );
1250         }
1251         break;
1252     }
1253 }
1254 
1255 void SdrUndoObjStrAttr::Redo()
1256 {
1257     switch ( meObjStrAttr )
1258     {
1259         case OBJ_NAME:
1260         {
1261             pObj->SetName( msNewStr );
1262         }
1263         break;
1264         case OBJ_TITLE:
1265         {
1266             pObj->SetTitle( msNewStr );
1267         }
1268         break;
1269         case OBJ_DESCRIPTION:
1270         {
1271             pObj->SetDescription( msNewStr );
1272         }
1273         break;
1274     }
1275 
1276     ImpShowPageOfThisObject();
1277 }
1278 
1279 String SdrUndoObjStrAttr::GetComment() const
1280 {
1281     String aStr;
1282     switch ( meObjStrAttr )
1283     {
1284         case OBJ_NAME:
1285         {
1286             ImpTakeDescriptionStr( STR_UndoObjName, aStr );
1287             aStr += sal_Unicode(' ');
1288             aStr += sal_Unicode('\'');
1289             aStr += msNewStr;
1290             aStr += sal_Unicode('\'');
1291         }
1292         break;
1293         case OBJ_TITLE:
1294         {
1295             ImpTakeDescriptionStr( STR_UndoObjTitle, aStr );
1296         }
1297         break;
1298         case OBJ_DESCRIPTION:
1299         {
1300             ImpTakeDescriptionStr( STR_UndoObjDescription, aStr );
1301         }
1302         break;
1303     }
1304 
1305     return aStr;
1306 }
1307 
1308 ////////////////////////////////////////////////////////////////////////////////////////////////////
1309 ////////////////////////////////////////////////////////////////////////////////////////////////////
1310 //
1311 //  @@      @@@@   @@  @@  @@@@@  @@@@@
1312 //  @@     @@  @@  @@  @@  @@     @@  @@
1313 //  @@     @@  @@  @@  @@  @@     @@  @@
1314 //  @@     @@@@@@   @@@@   @@@@   @@@@@
1315 //  @@     @@  @@    @@    @@     @@  @@
1316 //  @@     @@  @@    @@    @@     @@  @@
1317 //  @@@@@  @@  @@    @@    @@@@@  @@  @@
1318 //
1319 ////////////////////////////////////////////////////////////////////////////////////////////////////
1320 ////////////////////////////////////////////////////////////////////////////////////////////////////
1321 
1322 SdrUndoLayer::SdrUndoLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel):
1323     SdrUndoAction(rNewModel),
1324     pLayer(rNewLayerAdmin.GetLayer(nLayerNum)),
1325     pLayerAdmin(&rNewLayerAdmin),
1326     nNum(nLayerNum),
1327     bItsMine(sal_False)
1328 {
1329 }
1330 
1331 SdrUndoLayer::~SdrUndoLayer()
1332 {
1333     if (bItsMine) {
1334         delete pLayer;
1335     }
1336 }
1337 
1338 ////////////////////////////////////////////////////////////////////////////////////////////////////
1339 
1340 void SdrUndoNewLayer::Undo()
1341 {
1342     DBG_ASSERT(!bItsMine,"SdrUndoNewLayer::Undo(): Layer gehoert bereits der UndoAction");
1343     bItsMine=sal_True;
1344 #ifdef DBG_UTIL
1345     SdrLayer* pCmpLayer=
1346 #endif
1347     pLayerAdmin->RemoveLayer(nNum);
1348     DBG_ASSERT(pCmpLayer==pLayer,"SdrUndoNewLayer::Undo(): Removter Layer ist != pLayer");
1349 }
1350 
1351 void SdrUndoNewLayer::Redo()
1352 {
1353     DBG_ASSERT(bItsMine,"SdrUndoNewLayer::Undo(): Layer gehoert nicht der UndoAction");
1354     bItsMine=sal_False;
1355     pLayerAdmin->InsertLayer(pLayer,nNum);
1356 }
1357 
1358 XubString SdrUndoNewLayer::GetComment() const
1359 {
1360     return ImpGetResStr(STR_UndoNewLayer);
1361 }
1362 
1363 ////////////////////////////////////////////////////////////////////////////////////////////////////
1364 
1365 void SdrUndoDelLayer::Undo()
1366 {
1367     DBG_ASSERT(bItsMine,"SdrUndoDelLayer::Undo(): Layer gehoert nicht der UndoAction");
1368     bItsMine=sal_False;
1369     pLayerAdmin->InsertLayer(pLayer,nNum);
1370 }
1371 
1372 void SdrUndoDelLayer::Redo()
1373 {
1374     DBG_ASSERT(!bItsMine,"SdrUndoDelLayer::Undo(): Layer gehoert bereits der UndoAction");
1375     bItsMine=sal_True;
1376 #ifdef DBG_UTIL
1377     SdrLayer* pCmpLayer=
1378 #endif
1379     pLayerAdmin->RemoveLayer(nNum);
1380     DBG_ASSERT(pCmpLayer==pLayer,"SdrUndoDelLayer::Redo(): Removter Layer ist != pLayer");
1381 }
1382 
1383 XubString SdrUndoDelLayer::GetComment() const
1384 {
1385     return ImpGetResStr(STR_UndoDelLayer);
1386 }
1387 
1388 ////////////////////////////////////////////////////////////////////////////////////////////////////
1389 
1390 void SdrUndoMoveLayer::Undo()
1391 {
1392 #ifdef DBG_UTIL
1393     SdrLayer* pCmpLayer=
1394 #endif
1395     pLayerAdmin->RemoveLayer(nNeuPos);
1396     DBG_ASSERT(pCmpLayer==pLayer,"SdrUndoMoveLayer::Undo(): Removter Layer ist != pLayer");
1397     pLayerAdmin->InsertLayer(pLayer,nNum);
1398 }
1399 
1400 void SdrUndoMoveLayer::Redo()
1401 {
1402 #ifdef DBG_UTIL
1403     SdrLayer* pCmpLayer=
1404 #endif
1405     pLayerAdmin->RemoveLayer(nNum);
1406     DBG_ASSERT(pCmpLayer==pLayer,"SdrUndoMoveLayer::Redo(): Removter Layer ist != pLayer");
1407     pLayerAdmin->InsertLayer(pLayer,nNeuPos);
1408 }
1409 
1410 XubString SdrUndoMoveLayer::GetComment() const
1411 {
1412     return ImpGetResStr(STR_UndoMovLayer);
1413 }
1414 
1415 ////////////////////////////////////////////////////////////////////////////////////////////////////
1416 ////////////////////////////////////////////////////////////////////////////////////////////////////
1417 //
1418 //  @@@@@    @@@@    @@@@   @@@@@   @@@@
1419 //  @@  @@  @@  @@  @@  @@  @@     @@  @@
1420 //  @@  @@  @@  @@  @@      @@     @@
1421 //  @@@@@   @@@@@@  @@ @@@  @@@@    @@@@
1422 //  @@      @@  @@  @@  @@  @@         @@
1423 //  @@      @@  @@  @@  @@  @@     @@  @@
1424 //  @@      @@  @@   @@@@@  @@@@@   @@@@
1425 //
1426 ////////////////////////////////////////////////////////////////////////////////////////////////////
1427 ////////////////////////////////////////////////////////////////////////////////////////////////////
1428 
1429 SdrUndoPage::SdrUndoPage(SdrPage& rNewPg)
1430 :   SdrUndoAction(*rNewPg.GetModel()),
1431     mrPage(rNewPg)
1432 {
1433 }
1434 
1435 void SdrUndoPage::ImpInsertPage(sal_uInt16 nNum)
1436 {
1437     DBG_ASSERT(!mrPage.IsInserted(),"SdrUndoPage::ImpInsertPage(): mrPage ist bereits Inserted");
1438     if (!mrPage.IsInserted()) {
1439         if (mrPage.IsMasterPage()) {
1440             rMod.InsertMasterPage(&mrPage,nNum);
1441         } else {
1442             rMod.InsertPage(&mrPage,nNum);
1443         }
1444     }
1445 }
1446 
1447 void SdrUndoPage::ImpRemovePage(sal_uInt16 nNum)
1448 {
1449     DBG_ASSERT(mrPage.IsInserted(),"SdrUndoPage::ImpRemovePage(): mrPage ist nicht Inserted");
1450     if (mrPage.IsInserted()) {
1451         SdrPage* pChkPg=NULL;
1452         if (mrPage.IsMasterPage()) {
1453             pChkPg=rMod.RemoveMasterPage(nNum);
1454         } else {
1455             pChkPg=rMod.RemovePage(nNum);
1456         }
1457         DBG_ASSERT(pChkPg==&mrPage,"SdrUndoPage::ImpRemovePage(): RemovePage!=&mrPage");
1458     }
1459 }
1460 
1461 void SdrUndoPage::ImpMovePage(sal_uInt16 nOldNum, sal_uInt16 nNewNum)
1462 {
1463     DBG_ASSERT(mrPage.IsInserted(),"SdrUndoPage::ImpMovePage(): mrPage ist nicht Inserted");
1464     if (mrPage.IsInserted()) {
1465         if (mrPage.IsMasterPage()) {
1466             rMod.MoveMasterPage(nOldNum,nNewNum);
1467         } else {
1468             rMod.MovePage(nOldNum,nNewNum);
1469         }
1470     }
1471 }
1472 
1473 void SdrUndoPage::ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, XubString& rStr, sal_uInt16 /*n*/, FASTBOOL /*bRepeat*/) const
1474 {
1475     rStr=ImpGetResStr(nStrCacheID);
1476 }
1477 
1478 ////////////////////////////////////////////////////////////////////////////////////////////////////
1479 
1480 SdrUndoPageList::SdrUndoPageList(SdrPage& rNewPg):
1481     SdrUndoPage(rNewPg),
1482     bItsMine(sal_False)
1483 {
1484     nPageNum=rNewPg.GetPageNum();
1485 }
1486 
1487 SdrUndoPageList::~SdrUndoPageList()
1488 {
1489     if(bItsMine)
1490     {
1491         delete (&mrPage);
1492     }
1493 }
1494 
1495 ////////////////////////////////////////////////////////////////////////////////////////////////////
1496 
1497 SdrUndoDelPage::SdrUndoDelPage(SdrPage& rNewPg):
1498     SdrUndoPageList(rNewPg),
1499     pUndoGroup(NULL)
1500 {
1501     bItsMine = sal_True;
1502 
1503     // Und nun ggf. die MasterPage-Beziehungen merken
1504     if(mrPage.IsMasterPage())
1505     {
1506         sal_uInt16 nPageAnz(rMod.GetPageCount());
1507 
1508         for(sal_uInt16 nPageNum2(0); nPageNum2 < nPageAnz; nPageNum2++)
1509         {
1510             SdrPage* pDrawPage = rMod.GetPage(nPageNum2);
1511 
1512             if(pDrawPage->TRG_HasMasterPage())
1513             {
1514                 SdrPage& rMasterPage = pDrawPage->TRG_GetMasterPage();
1515 
1516                 if(&mrPage == &rMasterPage)
1517                 {
1518                     if(!pUndoGroup)
1519                     {
1520                         pUndoGroup = new SdrUndoGroup(rMod);
1521                     }
1522 
1523                     pUndoGroup->AddAction(rMod.GetSdrUndoFactory().CreateUndoPageRemoveMasterPage(*pDrawPage));
1524                 }
1525             }
1526         }
1527     }
1528 }
1529 
1530 SdrUndoDelPage::~SdrUndoDelPage()
1531 {
1532     if (pUndoGroup!=NULL) {
1533         delete pUndoGroup;
1534     }
1535 }
1536 
1537 void SdrUndoDelPage::Undo()
1538 {
1539     ImpInsertPage(nPageNum);
1540     if (pUndoGroup!=NULL) { // MasterPage-Beziehungen wiederherstellen
1541         pUndoGroup->Undo();
1542     }
1543     DBG_ASSERT(bItsMine,"UndoDeletePage: mrPage gehoert nicht der UndoAction");
1544     bItsMine=sal_False;
1545 }
1546 
1547 void SdrUndoDelPage::Redo()
1548 {
1549     ImpRemovePage(nPageNum);
1550     // Die MasterPage-Beziehungen werden ggf. von selbst geloesst
1551     DBG_ASSERT(!bItsMine,"RedoDeletePage: mrPage gehoert bereits der UndoAction");
1552     bItsMine=sal_True;
1553 }
1554 
1555 XubString SdrUndoDelPage::GetComment() const
1556 {
1557     XubString aStr;
1558     ImpTakeDescriptionStr(STR_UndoDelPage,aStr,0,sal_False);
1559     return aStr;
1560 }
1561 
1562 XubString SdrUndoDelPage::GetSdrRepeatComment(SdrView& /*rView*/) const
1563 {
1564     XubString aStr;
1565     ImpTakeDescriptionStr(STR_UndoDelPage,aStr,0,sal_False);
1566     return aStr;
1567 }
1568 
1569 void SdrUndoDelPage::SdrRepeat(SdrView& /*rView*/)
1570 {
1571 }
1572 
1573 bool SdrUndoDelPage::CanSdrRepeat(SdrView& /*rView*/) const
1574 {
1575     return sal_False;
1576 }
1577 
1578 ////////////////////////////////////////////////////////////////////////////////////////////////////
1579 
1580 void SdrUndoNewPage::Undo()
1581 {
1582     ImpRemovePage(nPageNum);
1583     DBG_ASSERT(!bItsMine,"UndoNewPage: mrPage gehoert bereits der UndoAction");
1584     bItsMine=sal_True;
1585 }
1586 
1587 void SdrUndoNewPage::Redo()
1588 {
1589     ImpInsertPage(nPageNum);
1590     DBG_ASSERT(bItsMine,"RedoNewPage: mrPage gehoert nicht der UndoAction");
1591     bItsMine=sal_False;
1592 }
1593 
1594 XubString SdrUndoNewPage::GetComment() const
1595 {
1596     XubString aStr;
1597     ImpTakeDescriptionStr(STR_UndoNewPage,aStr,0,sal_False);
1598     return aStr;
1599 }
1600 
1601 ////////////////////////////////////////////////////////////////////////////////////////////////////
1602 
1603 XubString SdrUndoCopyPage::GetComment() const
1604 {
1605     XubString aStr;
1606     ImpTakeDescriptionStr(STR_UndoCopPage,aStr,0,sal_False);
1607     return aStr;
1608 }
1609 
1610 XubString SdrUndoCopyPage::GetSdrRepeatComment(SdrView& /*rView*/) const
1611 {
1612     XubString aStr;
1613     ImpTakeDescriptionStr(STR_UndoCopPage,aStr,0,sal_False);
1614     return aStr;
1615 }
1616 
1617 void SdrUndoCopyPage::SdrRepeat(SdrView& /*rView*/)
1618 {
1619 
1620 }
1621 
1622 bool SdrUndoCopyPage::CanSdrRepeat(SdrView& /*rView*/) const
1623 {
1624     return sal_False;
1625 }
1626 
1627 ////////////////////////////////////////////////////////////////////////////////////////////////////
1628 
1629 void SdrUndoSetPageNum::Undo()
1630 {
1631     ImpMovePage(nNewPageNum,nOldPageNum);
1632 }
1633 
1634 void SdrUndoSetPageNum::Redo()
1635 {
1636     ImpMovePage(nOldPageNum,nNewPageNum);
1637 }
1638 
1639 XubString SdrUndoSetPageNum::GetComment() const
1640 {
1641     XubString aStr;
1642     ImpTakeDescriptionStr(STR_UndoMovPage,aStr,0,sal_False);
1643     return aStr;
1644 }
1645 
1646 ////////////////////////////////////////////////////////////////////////////////////////////////////
1647 //
1648 //  @@   @@  @@@@   @@@@  @@@@@@ @@@@@ @@@@@   @@@@@   @@@@   @@@@  @@@@@  @@@@
1649 //  @@@ @@@ @@  @@ @@  @@   @@   @@    @@  @@  @@  @@ @@  @@ @@  @@ @@    @@  @@
1650 //  @@@@@@@ @@  @@ @@       @@   @@    @@  @@  @@  @@ @@  @@ @@     @@    @@
1651 //  @@@@@@@ @@@@@@  @@@@    @@   @@@@  @@@@@   @@@@@  @@@@@@ @@ @@@ @@@@   @@@@
1652 //  @@ @ @@ @@  @@     @@   @@   @@    @@  @@  @@     @@  @@ @@  @@ @@        @@
1653 //  @@   @@ @@  @@ @@  @@   @@   @@    @@  @@  @@     @@  @@ @@  @@ @@    @@  @@
1654 //  @@   @@ @@  @@  @@@@    @@   @@@@@ @@  @@  @@     @@  @@  @@@@@ @@@@@  @@@@
1655 //
1656 ////////////////////////////////////////////////////////////////////////////////////////////////////
1657 
1658 SdrUndoPageMasterPage::SdrUndoPageMasterPage(SdrPage& rChangedPage)
1659 :   SdrUndoPage(rChangedPage),
1660     mbOldHadMasterPage(mrPage.TRG_HasMasterPage())
1661 {
1662     // get current state from page
1663     if(mbOldHadMasterPage)
1664     {
1665         maOldSet = mrPage.TRG_GetMasterPageVisibleLayers();
1666         maOldMasterPageNumber = mrPage.TRG_GetMasterPage().GetPageNum();
1667     }
1668 }
1669 
1670 SdrUndoPageMasterPage::~SdrUndoPageMasterPage()
1671 {
1672 }
1673 
1674 ////////////////////////////////////////////////////////////////////////////////////////////////////
1675 
1676 SdrUndoPageRemoveMasterPage::SdrUndoPageRemoveMasterPage(SdrPage& rChangedPage)
1677 :   SdrUndoPageMasterPage(rChangedPage)
1678 {
1679 }
1680 
1681 void SdrUndoPageRemoveMasterPage::Undo()
1682 {
1683     if(mbOldHadMasterPage)
1684     {
1685         mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maOldMasterPageNumber));
1686         mrPage.TRG_SetMasterPageVisibleLayers(maOldSet);
1687     }
1688 }
1689 
1690 void SdrUndoPageRemoveMasterPage::Redo()
1691 {
1692     mrPage.TRG_ClearMasterPage();
1693 }
1694 
1695 XubString SdrUndoPageRemoveMasterPage::GetComment() const
1696 {
1697     XubString aStr;
1698     ImpTakeDescriptionStr(STR_UndoDelPageMasterDscr,aStr,0,sal_False);
1699     return aStr;
1700 }
1701 
1702 ////////////////////////////////////////////////////////////////////////////////////////////////////
1703 
1704 SdrUndoPageChangeMasterPage::SdrUndoPageChangeMasterPage(SdrPage& rChangedPage)
1705 :   SdrUndoPageMasterPage(rChangedPage),
1706     mbNewHadMasterPage(sal_False)
1707 {
1708 }
1709 
1710 void SdrUndoPageChangeMasterPage::Undo()
1711 {
1712     // remember values from new page
1713     if(mrPage.TRG_HasMasterPage())
1714     {
1715         mbNewHadMasterPage = sal_True;
1716         maNewSet = mrPage.TRG_GetMasterPageVisibleLayers();
1717         maNewMasterPageNumber = mrPage.TRG_GetMasterPage().GetPageNum();
1718     }
1719 
1720     // restore old values
1721     if(mbOldHadMasterPage)
1722     {
1723         mrPage.TRG_ClearMasterPage();
1724         mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maOldMasterPageNumber));
1725         mrPage.TRG_SetMasterPageVisibleLayers(maOldSet);
1726     }
1727 }
1728 
1729 void SdrUndoPageChangeMasterPage::Redo()
1730 {
1731     // restore new values
1732     if(mbNewHadMasterPage)
1733     {
1734         mrPage.TRG_ClearMasterPage();
1735         mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maNewMasterPageNumber));
1736         mrPage.TRG_SetMasterPageVisibleLayers(maNewSet);
1737     }
1738 }
1739 
1740 XubString SdrUndoPageChangeMasterPage::GetComment() const
1741 {
1742     XubString aStr;
1743     ImpTakeDescriptionStr(STR_UndoChgPageMasterDscr,aStr,0,sal_False);
1744     return aStr;
1745 }
1746 
1747 ///////////////////////////////////////////////////////////////////////
1748 SdrUndoFactory::~SdrUndoFactory(){}
1749 // shapes
1750 SdrUndoAction* SdrUndoFactory::CreateUndoMoveObject( SdrObject& rObject )
1751 {
1752     return new SdrUndoMoveObj( rObject );
1753 }
1754 
1755 SdrUndoAction* SdrUndoFactory::CreateUndoMoveObject( SdrObject& rObject, const Size& rDist )
1756 {
1757     return new SdrUndoMoveObj( rObject, rDist );
1758 }
1759 
1760 SdrUndoAction* SdrUndoFactory::CreateUndoGeoObject( SdrObject& rObject )
1761 {
1762     return new SdrUndoGeoObj( rObject );
1763 }
1764 
1765 SdrUndoAction* SdrUndoFactory::CreateUndoAttrObject( SdrObject& rObject, bool bStyleSheet1, bool bSaveText )
1766 {
1767     return new SdrUndoAttrObj( rObject, bStyleSheet1 ? sal_True : sal_False, bSaveText ? sal_True : sal_False );
1768 }
1769 
1770 SdrUndoAction* SdrUndoFactory::CreateUndoRemoveObject( SdrObject& rObject, bool bOrdNumDirect )
1771 {
1772     return new SdrUndoRemoveObj( rObject, bOrdNumDirect ? sal_True : sal_False );
1773 }
1774 
1775 SdrUndoAction* SdrUndoFactory::CreateUndoInsertObject( SdrObject& rObject, bool bOrdNumDirect )
1776 {
1777     return new SdrUndoInsertObj( rObject, bOrdNumDirect ? sal_True : sal_False );
1778 }
1779 
1780 SdrUndoAction* SdrUndoFactory::CreateUndoDeleteObject( SdrObject& rObject, bool bOrdNumDirect )
1781 {
1782     return new SdrUndoDelObj( rObject, bOrdNumDirect ? sal_True : sal_False );
1783 }
1784 
1785 SdrUndoAction* SdrUndoFactory::CreateUndoNewObject( SdrObject& rObject, bool bOrdNumDirect )
1786 {
1787     return new SdrUndoNewObj( rObject, bOrdNumDirect ? sal_True : sal_False );
1788 }
1789 
1790 SdrUndoAction* SdrUndoFactory::CreateUndoCopyObject( SdrObject& rObject, bool bOrdNumDirect )
1791 {
1792     return new SdrUndoCopyObj( rObject, bOrdNumDirect ? sal_True : sal_False );
1793 }
1794 
1795 SdrUndoAction* SdrUndoFactory::CreateUndoObjectOrdNum( SdrObject& rObject, sal_uInt32 nOldOrdNum1, sal_uInt32 nNewOrdNum1)
1796 {
1797     return new SdrUndoObjOrdNum( rObject, nOldOrdNum1, nNewOrdNum1 );
1798 }
1799 
1800 SdrUndoAction* SdrUndoFactory::CreateUndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject, bool bOrdNumDirect )
1801 {
1802     return new SdrUndoReplaceObj( rOldObject, rNewObject, bOrdNumDirect ? sal_True : sal_False );
1803 }
1804 
1805 SdrUndoAction* SdrUndoFactory::CreateUndoObjectLayerChange( SdrObject& rObject, SdrLayerID aOldLayer, SdrLayerID aNewLayer )
1806 {
1807     return new SdrUndoObjectLayerChange( rObject, aOldLayer, aNewLayer );
1808 }
1809 
1810 SdrUndoAction* SdrUndoFactory::CreateUndoObjectSetText( SdrObject& rNewObj, sal_Int32 nText )
1811 {
1812     return new SdrUndoObjSetText( rNewObj, nText );
1813 }
1814 
1815 SdrUndoAction* SdrUndoFactory::CreateUndoObjectStrAttr( SdrObject& rObject,
1816                                                         SdrUndoObjStrAttr::ObjStrAttrType eObjStrAttrType,
1817                                                         String sOldStr,
1818                                                         String sNewStr )
1819 {
1820     return new SdrUndoObjStrAttr( rObject, eObjStrAttrType, sOldStr, sNewStr );
1821 }
1822 
1823 
1824 // layer
1825 SdrUndoAction* SdrUndoFactory::CreateUndoNewLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel)
1826 {
1827     return new SdrUndoNewLayer( nLayerNum, rNewLayerAdmin, rNewModel );
1828 }
1829 
1830 SdrUndoAction* SdrUndoFactory::CreateUndoDeleteLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel)
1831 {
1832     return new SdrUndoDelLayer( nLayerNum, rNewLayerAdmin, rNewModel );
1833 }
1834 
1835 SdrUndoAction* SdrUndoFactory::CreateUndoMoveLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel, sal_uInt16 nNeuPos1)
1836 {
1837     return new SdrUndoMoveLayer( nLayerNum, rNewLayerAdmin, rNewModel, nNeuPos1 );
1838 }
1839 
1840 // page
1841 SdrUndoAction*  SdrUndoFactory::CreateUndoDeletePage(SdrPage& rPage)
1842 {
1843     return new SdrUndoDelPage( rPage );
1844 }
1845 
1846 SdrUndoAction* SdrUndoFactory::CreateUndoNewPage(SdrPage& rPage)
1847 {
1848     return new SdrUndoNewPage( rPage );
1849 }
1850 
1851 SdrUndoAction* SdrUndoFactory::CreateUndoCopyPage(SdrPage& rPage)
1852 {
1853     return new SdrUndoCopyPage( rPage );
1854 }
1855 
1856 SdrUndoAction* SdrUndoFactory::CreateUndoSetPageNum(SdrPage& rNewPg, sal_uInt16 nOldPageNum1, sal_uInt16 nNewPageNum1)
1857 {
1858     return new SdrUndoSetPageNum( rNewPg, nOldPageNum1, nNewPageNum1 );
1859 }
1860     // master page
1861 SdrUndoAction* SdrUndoFactory::CreateUndoPageRemoveMasterPage(SdrPage& rChangedPage)
1862 {
1863     return new SdrUndoPageRemoveMasterPage( rChangedPage );
1864 }
1865 
1866 SdrUndoAction* SdrUndoFactory::CreateUndoPageChangeMasterPage(SdrPage& rChangedPage)
1867 {
1868     return new SdrUndoPageChangeMasterPage(rChangedPage);
1869 }
1870 
1871 // eof
1872