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