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_sd.hxx"
26
27 #include "undo/undoobjects.hxx"
28 #include "sdpage.hxx"
29 #include "CustomAnimationEffect.hxx"
30 #include "drawdoc.hxx"
31 #include "undoanim.hxx"
32
33 using namespace sd;
34
35 ///////////////////////////////////////////////////////////////////////
36
UndoRemovePresObjectImpl(SdrObject & rObject)37 UndoRemovePresObjectImpl::UndoRemovePresObjectImpl( SdrObject& rObject )
38 : mpUndoUsercall(0)
39 , mpUndoAnimation(0)
40 , mpUndoPresObj(0)
41 {
42 SdPage* pPage = dynamic_cast< SdPage* >( rObject.GetPage() );
43 if( pPage )
44 {
45 if( pPage->IsPresObj(&rObject) )
46 mpUndoPresObj = new UndoObjectPresentationKind( rObject );
47 if( rObject.GetUserCall() )
48 mpUndoUsercall = new UndoObjectUserCall(rObject);
49
50 if( pPage->hasAnimationNode() )
51 {
52 com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xShape( rObject.getUnoShape(), com::sun::star::uno::UNO_QUERY );
53 if( pPage->getMainSequence()->hasEffect( xShape ) )
54 {
55 mpUndoAnimation = new UndoAnimation( static_cast< SdDrawDocument* >( pPage->GetModel() ), pPage );
56 }
57 }
58 }
59 }
60
61 //---------------------------------------------------------------------
62
~UndoRemovePresObjectImpl()63 UndoRemovePresObjectImpl::~UndoRemovePresObjectImpl()
64 {
65 delete mpUndoAnimation;
66 delete mpUndoPresObj;
67 delete mpUndoUsercall;
68 }
69
70 //---------------------------------------------------------------------
71
Undo()72 void UndoRemovePresObjectImpl::Undo()
73 {
74 if( mpUndoUsercall )
75 mpUndoUsercall->Undo();
76 if( mpUndoPresObj )
77 mpUndoPresObj->Undo();
78 if( mpUndoAnimation )
79 mpUndoAnimation->Undo();
80 }
81
82 //---------------------------------------------------------------------
83
Redo()84 void UndoRemovePresObjectImpl::Redo()
85 {
86 if( mpUndoAnimation )
87 mpUndoAnimation->Redo();
88 if( mpUndoPresObj )
89 mpUndoPresObj->Redo();
90 if( mpUndoUsercall )
91 mpUndoUsercall->Redo();
92 }
93
94 ///////////////////////////////////////////////////////////////////////
95
96
UndoRemoveObject(SdrObject & rObject,bool bOrdNumDirect)97 UndoRemoveObject::UndoRemoveObject( SdrObject& rObject, bool bOrdNumDirect )
98 : SdrUndoRemoveObj( rObject, bOrdNumDirect ), UndoRemovePresObjectImpl( rObject )
99 , mxSdrObject(&rObject)
100 {
101 }
102
103 //---------------------------------------------------------------------
104
Undo()105 void UndoRemoveObject::Undo()
106 {
107 DBG_ASSERT( mxSdrObject.is(), "sd::UndoRemoveObject::Undo(), object already dead!" );
108 if( mxSdrObject.is() )
109 {
110 SdrUndoRemoveObj::Undo();
111 UndoRemovePresObjectImpl::Undo();
112 }
113 }
114
115 //---------------------------------------------------------------------
116
Redo()117 void UndoRemoveObject::Redo()
118 {
119 DBG_ASSERT( mxSdrObject.is(), "sd::UndoRemoveObject::Redo(), object already dead!" );
120 if( mxSdrObject.is() )
121 {
122 UndoRemovePresObjectImpl::Redo();
123 SdrUndoRemoveObj::Redo();
124 }
125 }
126
127 ///////////////////////////////////////////////////////////////////////
128
UndoDeleteObject(SdrObject & rObject,bool bOrdNumDirect)129 UndoDeleteObject::UndoDeleteObject( SdrObject& rObject, bool bOrdNumDirect )
130 : SdrUndoDelObj( rObject, bOrdNumDirect )
131 , UndoRemovePresObjectImpl( rObject )
132 , mxSdrObject(&rObject)
133 {
134 }
135
136 //---------------------------------------------------------------------
137
Undo()138 void UndoDeleteObject::Undo()
139 {
140 DBG_ASSERT( mxSdrObject.is(), "sd::UndoDeleteObject::Undo(), object already dead!" );
141 if( mxSdrObject.is() )
142 {
143 SdrUndoDelObj::Undo();
144 UndoRemovePresObjectImpl::Undo();
145 }
146 }
147
148 //---------------------------------------------------------------------
149
Redo()150 void UndoDeleteObject::Redo()
151 {
152 DBG_ASSERT( mxSdrObject.is(), "sd::UndoDeleteObject::Redo(), object already dead!" );
153 if( mxSdrObject.is() )
154 {
155 UndoRemovePresObjectImpl::Redo();
156 SdrUndoDelObj::Redo();
157 }
158 }
159
160 ///////////////////////////////////////////////////////////////////////
161
UndoReplaceObject(SdrObject & rOldObject,SdrObject & rNewObject,bool bOrdNumDirect)162 UndoReplaceObject::UndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject, bool bOrdNumDirect )
163 : SdrUndoReplaceObj( rOldObject, rNewObject, bOrdNumDirect )
164 , UndoRemovePresObjectImpl( rOldObject )
165 , mxSdrObject( &rOldObject )
166 {
167 }
168
169 //---------------------------------------------------------------------
170
Undo()171 void UndoReplaceObject::Undo()
172 {
173 DBG_ASSERT( mxSdrObject.is(), "sd::UndoReplaceObject::Undo(), object already dead!" );
174 if( mxSdrObject.is() )
175 {
176 SdrUndoReplaceObj::Undo();
177 UndoRemovePresObjectImpl::Undo();
178 }
179 }
180
181 //---------------------------------------------------------------------
182
Redo()183 void UndoReplaceObject::Redo()
184 {
185 DBG_ASSERT( mxSdrObject.is(), "sd::UndoReplaceObject::Redo(), object already dead!" );
186 if( mxSdrObject.is() )
187 {
188 UndoRemovePresObjectImpl::Redo();
189 SdrUndoReplaceObj::Redo();
190 }
191 }
192
193 ///////////////////////////////////////////////////////////////////////
194
UndoObjectSetText(SdrObject & rObject,sal_Int32 nText)195 UndoObjectSetText::UndoObjectSetText( SdrObject& rObject, sal_Int32 nText )
196 : SdrUndoObjSetText( rObject, nText )
197 , mpUndoAnimation(0)
198 , mbNewEmptyPresObj(false)
199 , mxSdrObject( &rObject )
200 {
201 SdPage* pPage = dynamic_cast< SdPage* >( rObject.GetPage() );
202 if( pPage && pPage->hasAnimationNode() )
203 {
204 com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xShape( rObject.getUnoShape(), com::sun::star::uno::UNO_QUERY );
205 if( pPage->getMainSequence()->hasEffect( xShape ) )
206 {
207 mpUndoAnimation = new UndoAnimation( static_cast< SdDrawDocument* >( pPage->GetModel() ), pPage );
208 }
209 }
210 }
211
212 //---------------------------------------------------------------------
213
~UndoObjectSetText()214 UndoObjectSetText::~UndoObjectSetText()
215 {
216 delete mpUndoAnimation;
217 }
218
219 //---------------------------------------------------------------------
220
Undo()221 void UndoObjectSetText::Undo()
222 {
223 DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectSetText::Undo(), object already dead!" );
224 if( mxSdrObject.is() )
225 {
226 mbNewEmptyPresObj = mxSdrObject->IsEmptyPresObj() ? true : false;
227 SdrUndoObjSetText::Undo();
228 if( mpUndoAnimation )
229 mpUndoAnimation->Undo();
230 }
231 }
232
233 //---------------------------------------------------------------------
234
Redo()235 void UndoObjectSetText::Redo()
236 {
237 DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectSetText::Redo(), object already dead!" );
238 if( mxSdrObject.is() )
239 {
240 if( mpUndoAnimation )
241 mpUndoAnimation->Redo();
242 SdrUndoObjSetText::Redo();
243 mxSdrObject->SetEmptyPresObj(mbNewEmptyPresObj ? sal_True : sal_False );
244 }
245 }
246
247 //////////////////////////////////////////////////////////////////////////////
248 // Undo for SdrObject::SetUserCall()
249
UndoObjectUserCall(SdrObject & rObject)250 UndoObjectUserCall::UndoObjectUserCall(SdrObject& rObject)
251 : SdrUndoObj(rObject)
252 , mpOldUserCall((SdPage*)rObject.GetUserCall())
253 , mpNewUserCall(0)
254 , mxSdrObject( &rObject )
255 {
256 }
257
258 //---------------------------------------------------------------------
259
Undo()260 void UndoObjectUserCall::Undo()
261 {
262 DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectUserCall::Undo(), object already dead!" );
263 if( mxSdrObject.is() )
264 {
265 mpNewUserCall = mxSdrObject->GetUserCall();
266 mxSdrObject->SetUserCall(mpOldUserCall);
267 }
268 }
269
270 //---------------------------------------------------------------------
271
Redo()272 void UndoObjectUserCall::Redo()
273 {
274 DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectUserCall::Redo(), object already dead!" );
275 if( mxSdrObject.is() )
276 {
277 mxSdrObject->SetUserCall(mpNewUserCall);
278 }
279 }
280
281 //////////////////////////////////////////////////////////////////////////////
282 // Undo for SdPage::InsertPresObj() and SdPage::RemovePresObj()
283
UndoObjectPresentationKind(SdrObject & rObject)284 UndoObjectPresentationKind::UndoObjectPresentationKind(SdrObject& rObject)
285 : SdrUndoObj(rObject)
286 , meOldKind(PRESOBJ_NONE)
287 , meNewKind(PRESOBJ_NONE)
288 , mxPage( rObject.GetPage() )
289 , mxSdrObject( &rObject )
290 {
291 DBG_ASSERT( mxPage.is(), "sd::UndoObjectPresentationKind::UndoObjectPresentationKind(), does not work for shapes without a slide!" );
292
293 if( mxPage.is() )
294 meOldKind = static_cast< SdPage* >( mxPage.get() )->GetPresObjKind( &rObject );
295 }
296
297 //---------------------------------------------------------------------
298
Undo()299 void UndoObjectPresentationKind::Undo()
300 {
301 if( mxPage.is() && mxSdrObject.is() )
302 {
303 SdPage* pPage = static_cast< SdPage* >( mxPage.get() );
304 meNewKind = pPage->GetPresObjKind( mxSdrObject.get() );
305 if( meNewKind != PRESOBJ_NONE )
306 pPage->RemovePresObj( mxSdrObject.get() );
307 if( meOldKind != PRESOBJ_NONE )
308 pPage->InsertPresObj( mxSdrObject.get(), meOldKind );
309 }
310 }
311
312 //---------------------------------------------------------------------
313
Redo()314 void UndoObjectPresentationKind::Redo()
315 {
316 if( mxPage.is() && mxSdrObject.is() )
317 {
318 SdPage* pPage = static_cast< SdPage* >( mxPage.get() );
319 if( meOldKind != PRESOBJ_NONE )
320 pPage->RemovePresObj( mxSdrObject.get() );
321 if( meNewKind != PRESOBJ_NONE )
322 pPage->InsertPresObj( mxSdrObject.get(), meNewKind );
323 }
324 }
325
326 //////////////////////////////////////////////////////////////////////////////
327
UndoAutoLayoutPosAndSize(SdPage & rPage)328 UndoAutoLayoutPosAndSize::UndoAutoLayoutPosAndSize( SdPage& rPage )
329 : mxPage( &rPage )
330 {
331 }
332
333 //---------------------------------------------------------------------
334
Undo()335 void UndoAutoLayoutPosAndSize::Undo()
336 {
337 // do nothing
338 }
339
340 //---------------------------------------------------------------------
341
Redo()342 void UndoAutoLayoutPosAndSize::Redo()
343 {
344 SdPage* pPage = static_cast< SdPage* >( mxPage.get() );
345 if( pPage )
346 pPage->SetAutoLayout( pPage->GetAutoLayout(), sal_False, sal_False );
347 }
348
349 //////////////////////////////////////////////////////////////////////////////
350
UndoGeoObject(SdrObject & rNewObj)351 UndoGeoObject::UndoGeoObject( SdrObject& rNewObj )
352 : SdrUndoGeoObj( rNewObj )
353 , mxPage( rNewObj.GetPage() )
354 , mxSdrObject( &rNewObj )
355 {
356 }
357
358 //---------------------------------------------------------------------
359
Undo()360 void UndoGeoObject::Undo()
361 {
362 DBG_ASSERT( mxSdrObject.is(), "sd::UndoGeoObject::Undo(), object already dead!" );
363 if( mxSdrObject.is() )
364 {
365 if( mxPage.is() )
366 {
367 ScopeLockGuard aGuard( static_cast< SdPage* >( mxPage.get() )->maLockAutoLayoutArrangement );
368 SdrUndoGeoObj::Undo();
369 }
370 else
371 {
372 SdrUndoGeoObj::Undo();
373 }
374 }
375 }
376
377 //---------------------------------------------------------------------
378
Redo()379 void UndoGeoObject::Redo()
380 {
381 DBG_ASSERT( mxSdrObject.is(), "sd::UndoGeoObject::Redo(), object already dead!" );
382 if( mxSdrObject.is() )
383 {
384 if( mxPage.is() )
385 {
386 ScopeLockGuard aGuard( static_cast< SdPage* >(mxPage.get())->maLockAutoLayoutArrangement );
387 SdrUndoGeoObj::Redo();
388 }
389 else
390 {
391 SdrUndoGeoObj::Redo();
392 }
393 }
394 }
395
396 //---------------------------------------------------------------------
397
398 //////////////////////////////////////////////////////////////////////////////
399
UndoAttrObject(SdrObject & rObject,bool bStyleSheet1,bool bSaveText)400 UndoAttrObject::UndoAttrObject( SdrObject& rObject, bool bStyleSheet1, bool bSaveText )
401 : SdrUndoAttrObj( rObject, bStyleSheet1 ? sal_True : sal_False, bSaveText ? sal_True : sal_False )
402 , mxPage( rObject.GetPage() )
403 , mxSdrObject( &rObject )
404 {
405 }
406
407 //---------------------------------------------------------------------
408
Undo()409 void UndoAttrObject::Undo()
410 {
411 DBG_ASSERT( mxSdrObject.is(), "sd::UndoAttrObject::Undo(), object already dead!" );
412 if( mxSdrObject.is() )
413 {
414 if( mxPage.is() )
415 {
416 ScopeLockGuard aGuard( static_cast< SdPage* >( mxPage.get() )->maLockAutoLayoutArrangement );
417 SdrUndoAttrObj::Undo();
418 }
419 else
420 {
421 SdrUndoAttrObj::Undo();
422 }
423 }
424 }
425
426 //---------------------------------------------------------------------
427
Redo()428 void UndoAttrObject::Redo()
429 {
430 DBG_ASSERT( mxSdrObject.is(), "sd::UndoAttrObject::Redo(), object already dead!" );
431 if( mxSdrObject.is() )
432 {
433 if( mxPage.is() )
434 {
435 ScopeLockGuard aGuard( static_cast< SdPage* >( mxPage.get() )->maLockAutoLayoutArrangement );
436 SdrUndoAttrObj::Redo();
437 }
438 else
439 {
440 SdrUndoAttrObj::Redo();
441 }
442 }
443 }
444