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
28 #include "fuoaprms.hxx"
29
30 #include "sdattr.hxx"
31 #include <svx/svdpagv.hxx>
32 #include <editeng/colritem.hxx>
33 #include <svx/svdundo.hxx>
34 #include <vcl/group.hxx>
35 #include <vcl/fixed.hxx>
36 #include <sfx2/objsh.hxx>
37 #include <sfx2/request.hxx>
38 #include <sfx2/viewfrm.hxx>
39 #ifndef _MSGBOX_HXX //autogen
40 #include <vcl/msgbox.hxx>
41 #endif
42 #include <svl/aeitem.hxx>
43 #include "svx/xtable.hxx"
44
45 #include "strings.hrc"
46 #include "glob.hrc"
47 #include "drawdoc.hxx"
48 #include "ViewShell.hxx"
49 #include "anminfo.hxx"
50 #include "unoaprms.hxx" // Undo-Action
51 #include "sdundogr.hxx" // Undo Gruppe
52 #include "View.hxx"
53 #include "sdabstdlg.hxx"
54 #include "sdresid.hxx"
55 #include <vcl/salbtype.hxx> // FRound
56 #include <basegfx/polygon/b2dpolygon.hxx>
57
58 using namespace ::com::sun::star;
59
60 namespace sd {
61
62 TYPEINIT1( FuObjectAnimationParameters, FuPoor );
63
64 #define ATTR_MISSING 0 // Attribut nicht verfuegbar
65 #define ATTR_MIXED 1 // Attribut uneindeutig (bei Mehrfachselektion)
66 #define ATTR_SET 2 // Attribut eindeutig
67
68 /*************************************************************************
69 |*
70 |* Konstruktor
71 |*
72 \************************************************************************/
73
FuObjectAnimationParameters(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)74 FuObjectAnimationParameters::FuObjectAnimationParameters (
75 ViewShell* pViewSh,
76 ::sd::Window* pWin,
77 ::sd::View* pView,
78 SdDrawDocument* pDoc,
79 SfxRequest& rReq)
80 : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
81 {
82 }
83
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)84 FunctionReference FuObjectAnimationParameters::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
85 {
86 FunctionReference xFunc( new FuObjectAnimationParameters( pViewSh, pWin, pView, pDoc, rReq ) );
87 xFunc->DoExecute(rReq);
88 return xFunc;
89 }
90
DoExecute(SfxRequest & rReq)91 void FuObjectAnimationParameters::DoExecute( SfxRequest& rReq )
92 {
93 ::svl::IUndoManager* pUndoMgr = mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager();
94
95 const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
96 sal_uLong nCount = rMarkList.GetMarkCount();
97 sal_uLong nObject = 0;
98
99 short nAnimationSet = ATTR_MISSING;
100 short nEffectSet = ATTR_MISSING;
101 short nTextEffectSet = ATTR_MISSING;
102 short nSpeedSet = ATTR_MISSING;
103 short nFadeColorSet = ATTR_MISSING;
104 short nFadeOutSet = ATTR_MISSING;
105 short nInvisibleSet = ATTR_MISSING;
106 short nSoundOnSet = ATTR_MISSING;
107 short nSoundFileSet = ATTR_MISSING;
108 short nPlayFullSet = ATTR_MISSING;
109 short nClickActionSet = ATTR_MISSING;
110 short nBookmarkSet = ATTR_MISSING;
111
112 short nSecondEffectSet = ATTR_MISSING;
113 short nSecondSpeedSet = ATTR_MISSING;
114 short nSecondSoundOnSet = ATTR_MISSING;
115 short nSecondPlayFullSet = ATTR_MISSING;
116
117
118
119 // sal_Bool bDontKnow = sal_False;
120
121 // defaulten (fuer Undo-Aktion)
122 presentation::AnimationEffect eEffect = presentation::AnimationEffect_NONE;
123 presentation::AnimationEffect eTextEffect = presentation::AnimationEffect_NONE;
124 presentation::AnimationSpeed eSpeed = presentation::AnimationSpeed_MEDIUM;
125 sal_Bool bActive = sal_False;
126 sal_Bool bFadeOut = sal_False;
127 Color aFadeColor = COL_LIGHTGRAY;
128 sal_Bool bInvisible = sal_False;
129 sal_Bool bSoundOn = sal_False;
130 String aSound;
131 sal_Bool bPlayFull = sal_False;
132 presentation::ClickAction eClickAction = presentation::ClickAction_NONE;
133 String aBookmark;
134
135 presentation::AnimationEffect eSecondEffect = presentation::AnimationEffect_NONE;
136 presentation::AnimationSpeed eSecondSpeed = presentation::AnimationSpeed_MEDIUM;
137 sal_Bool bSecondSoundOn = sal_False;
138 sal_Bool bSecondPlayFull = sal_False;
139
140
141 SdAnimationInfo* pInfo;
142 SdrMark* pMark;
143
144 // das erste Objekt untersuchen
145 pMark = rMarkList.GetMark(0);
146 pInfo = mpDoc->GetAnimationInfo(pMark->GetMarkedSdrObj());
147 if( pInfo )
148 {
149 bActive = pInfo->mbActive;
150 nAnimationSet = ATTR_SET;
151
152 eEffect = pInfo->meEffect;
153 nEffectSet = ATTR_SET;
154
155 eTextEffect = pInfo->meTextEffect;
156 nTextEffectSet = ATTR_SET;
157
158 eSpeed = pInfo->meSpeed;
159 nSpeedSet = ATTR_SET;
160
161 bFadeOut = pInfo->mbDimPrevious;
162 nFadeOutSet = ATTR_SET;
163
164 aFadeColor = pInfo->maDimColor;
165 nFadeColorSet = ATTR_SET;
166
167 bInvisible = pInfo->mbDimHide;
168 nInvisibleSet = ATTR_SET;
169
170 bSoundOn = pInfo->mbSoundOn;
171 nSoundOnSet = ATTR_SET;
172
173 aSound = pInfo->maSoundFile;
174 nSoundFileSet = ATTR_SET;
175
176 bPlayFull = pInfo->mbPlayFull;
177 nPlayFullSet = ATTR_SET;
178
179 eClickAction = pInfo->meClickAction;
180 nClickActionSet = ATTR_SET;
181
182 aBookmark = pInfo->GetBookmark();
183 nBookmarkSet = ATTR_SET;
184
185 eSecondEffect = pInfo->meSecondEffect;
186 nSecondEffectSet = ATTR_SET;
187
188 eSecondSpeed = pInfo->meSecondSpeed;
189 nSecondSpeedSet = ATTR_SET;
190
191 bSecondSoundOn = pInfo->mbSecondSoundOn;
192 nSecondSoundOnSet = ATTR_SET;
193
194 bSecondPlayFull = pInfo->mbSecondPlayFull;
195 nSecondPlayFullSet = ATTR_SET;
196 }
197
198 // ggfs. weitere Objekte untersuchen
199 for( nObject = 1; nObject < nCount; nObject++ )
200 {
201 pMark = rMarkList.GetMark( nObject );
202 SdrObject* pObject = pMark->GetMarkedSdrObj();
203 pInfo = mpDoc->GetAnimationInfo(pObject);
204 if( pInfo )
205 {
206 if( bActive != pInfo->mbActive )
207 nAnimationSet = ATTR_MIXED;
208
209 if( eEffect != pInfo->meEffect )
210 nEffectSet = ATTR_MIXED;
211
212 if( eTextEffect != pInfo->meTextEffect )
213 nTextEffectSet = ATTR_MIXED;
214
215 if( eSpeed != pInfo->meSpeed )
216 nSpeedSet = ATTR_MIXED;
217
218 if( bFadeOut != pInfo->mbDimPrevious )
219 nFadeOutSet = ATTR_MIXED;
220
221 if( aFadeColor != pInfo->maDimColor )
222 nFadeColorSet = ATTR_MIXED;
223
224 if( bInvisible != pInfo->mbDimHide )
225 nInvisibleSet = ATTR_MIXED;
226
227 if( bSoundOn != pInfo->mbSoundOn )
228 nSoundOnSet = ATTR_MIXED;
229
230 if( aSound != pInfo->maSoundFile )
231 nSoundFileSet = ATTR_MIXED;
232
233 if( bPlayFull != pInfo->mbPlayFull )
234 nPlayFullSet = ATTR_MIXED;
235
236 if( eClickAction != pInfo->meClickAction )
237 nClickActionSet = ATTR_MIXED;
238
239 if( aBookmark != pInfo->GetBookmark() )
240 nBookmarkSet = ATTR_MIXED;
241
242 if( eSecondEffect != pInfo->meSecondEffect )
243 nSecondEffectSet = ATTR_MIXED;
244
245 if( eSecondSpeed != pInfo->meSecondSpeed )
246 nSecondSpeedSet = ATTR_MIXED;
247
248 if( bSecondSoundOn != pInfo->mbSecondSoundOn )
249 nSecondSoundOnSet = ATTR_MIXED;
250
251 if( bSecondPlayFull != pInfo->mbSecondPlayFull )
252 nSecondPlayFullSet = ATTR_MIXED;
253 }
254 else
255 {
256 if (nAnimationSet == ATTR_SET && bActive == sal_True)
257 nAnimationSet = ATTR_MIXED;
258
259 if (nEffectSet == ATTR_SET && eEffect != presentation::AnimationEffect_NONE)
260 nEffectSet = ATTR_MIXED;
261
262 if (nTextEffectSet == ATTR_SET && eTextEffect != presentation::AnimationEffect_NONE)
263 nTextEffectSet = ATTR_MIXED;
264
265 if (nSpeedSet == ATTR_SET)
266 nSpeedSet = ATTR_MIXED;
267
268 if (nFadeOutSet == ATTR_SET && bFadeOut == sal_True)
269 nFadeOutSet = ATTR_MIXED;
270
271 if (nFadeColorSet == ATTR_SET)
272 nFadeColorSet = ATTR_MIXED;
273
274 if (nInvisibleSet == ATTR_SET && bInvisible == sal_True)
275 nInvisibleSet = ATTR_MIXED;
276
277 if (nSoundOnSet == ATTR_SET && bSoundOn == sal_True)
278 nSoundOnSet = ATTR_MIXED;
279
280 if (nSoundFileSet == ATTR_SET)
281 nSoundFileSet = ATTR_MIXED;
282
283 if (nPlayFullSet == ATTR_SET && bPlayFull == sal_True)
284 nPlayFullSet = ATTR_MIXED;
285
286 if (nClickActionSet == ATTR_SET && eClickAction != presentation::ClickAction_NONE)
287 nClickActionSet = ATTR_MIXED;
288
289 if (nBookmarkSet == ATTR_SET)
290 nBookmarkSet = ATTR_MIXED;
291
292 if (nSecondEffectSet == ATTR_SET && eSecondEffect != presentation::AnimationEffect_NONE)
293 nSecondEffectSet = ATTR_MIXED;
294
295 if (nSecondSpeedSet == ATTR_SET)
296 nSecondSpeedSet = ATTR_MIXED;
297
298 if (nSecondSoundOnSet == ATTR_SET && bSecondSoundOn == sal_True)
299 nSecondSoundOnSet = ATTR_MIXED;
300
301 if (nSecondPlayFullSet == ATTR_SET && bSecondPlayFull == sal_True)
302 nSecondPlayFullSet = ATTR_MIXED;
303 }
304 }
305
306 // Genau zwei Objekte mit Pfadeffekt? Dann gilt nur die Animationsinfo
307 // am bewegten Objekt.
308 if (nCount == 2)
309 {
310 SdrObject* pObject1 = rMarkList.GetMark(0)->GetMarkedSdrObj();
311 SdrObject* pObject2 = rMarkList.GetMark(1)->GetMarkedSdrObj();
312 SdrObjKind eKind1 = (SdrObjKind)pObject1->GetObjIdentifier();
313 SdrObjKind eKind2 = (SdrObjKind)pObject2->GetObjIdentifier();
314 SdAnimationInfo* pInfo1 = mpDoc->GetAnimationInfo(pObject1);
315 SdAnimationInfo* pInfo2 = mpDoc->GetAnimationInfo(pObject2);
316 pInfo = NULL;
317
318 if (pObject1->GetObjInventor() == SdrInventor &&
319 ((eKind1 == OBJ_LINE) || // 2-Punkt-Linie
320 (eKind1 == OBJ_PLIN) || // Polygon
321 (eKind1 == OBJ_PATHLINE)) && // Bezier-Kurve
322 (pInfo2 && pInfo2->meEffect == presentation::AnimationEffect_PATH))
323 {
324 pInfo = pInfo2;
325 }
326
327 if (pObject2->GetObjInventor() == SdrInventor &&
328 ((eKind2 == OBJ_LINE) || // 2-Punkt-Linie
329 (eKind2 == OBJ_PLIN) || // Polygon
330 (eKind2 == OBJ_PATHLINE)) && // Bezier-Kurve
331 (pInfo1 && pInfo1->meEffect == presentation::AnimationEffect_PATH))
332 {
333 pInfo = pInfo1;
334 }
335
336 if (pInfo)
337 {
338 bActive = pInfo->mbActive; nAnimationSet = ATTR_SET;
339 eEffect = pInfo->meEffect; nEffectSet = ATTR_SET;
340 eTextEffect = pInfo->meTextEffect; nTextEffectSet = ATTR_SET;
341 eSpeed = pInfo->meSpeed; nSpeedSet = ATTR_SET;
342 bFadeOut = pInfo->mbDimPrevious; nFadeOutSet = ATTR_SET;
343 aFadeColor = pInfo->maDimColor; nFadeColorSet = ATTR_SET;
344 bInvisible = pInfo->mbDimHide; nInvisibleSet = ATTR_SET;
345 bSoundOn = pInfo->mbSoundOn; nSoundOnSet = ATTR_SET;
346 aSound = pInfo->maSoundFile; nSoundFileSet = ATTR_SET;
347 bPlayFull = pInfo->mbPlayFull; nPlayFullSet = ATTR_SET;
348 eClickAction = pInfo->meClickAction; nClickActionSet = ATTR_SET;
349 aBookmark = pInfo->GetBookmark(); nBookmarkSet = ATTR_SET;
350 eSecondEffect = pInfo->meSecondEffect; nSecondEffectSet = ATTR_SET;
351 eSecondSpeed = pInfo->meSecondSpeed; nSecondSpeedSet = ATTR_SET;
352 bSecondSoundOn = pInfo->mbSecondSoundOn; nSecondSoundOnSet = ATTR_SET;
353 bSecondPlayFull = pInfo->mbSecondPlayFull; nSecondPlayFullSet = ATTR_SET;
354 }
355 }
356
357 const SfxItemSet* pArgs = rReq.GetArgs();
358
359 if(!pArgs)
360 {
361 // ItemSet fuer Dialog fuellen
362 SfxItemSet aSet(mpDoc->GetPool(), ATTR_ANIMATION_START, ATTR_ACTION_END);
363
364 // das Set besetzen
365 if (nAnimationSet == ATTR_SET)
366 aSet.Put( SfxBoolItem( ATTR_ANIMATION_ACTIVE, bActive));
367 else if (nAnimationSet == ATTR_MIXED)
368 aSet.InvalidateItem(ATTR_ANIMATION_ACTIVE);
369 else
370 aSet.Put(SfxBoolItem(ATTR_ANIMATION_ACTIVE, sal_False));
371
372 if (nEffectSet == ATTR_SET)
373 aSet.Put(SfxAllEnumItem(ATTR_ANIMATION_EFFECT, (sal_uInt16)eEffect));
374 else if (nEffectSet == ATTR_MIXED)
375 aSet.InvalidateItem( ATTR_ANIMATION_EFFECT );
376 else
377 aSet.Put(SfxAllEnumItem(ATTR_ANIMATION_EFFECT, presentation::AnimationEffect_NONE));
378
379 if (nTextEffectSet == ATTR_SET)
380 aSet.Put(SfxAllEnumItem(ATTR_ANIMATION_TEXTEFFECT, (sal_uInt16)eTextEffect));
381 else if (nTextEffectSet == ATTR_MIXED)
382 aSet.InvalidateItem( ATTR_ANIMATION_TEXTEFFECT );
383 else
384 aSet.Put(SfxAllEnumItem(ATTR_ANIMATION_TEXTEFFECT, presentation::AnimationEffect_NONE));
385
386 if (nSpeedSet == ATTR_SET)
387 aSet.Put(SfxAllEnumItem(ATTR_ANIMATION_SPEED, (sal_uInt16)eSpeed));
388 else
389 aSet.InvalidateItem(ATTR_ANIMATION_SPEED);
390
391 if (nFadeOutSet == ATTR_SET)
392 aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, bFadeOut));
393 else if (nFadeOutSet == ATTR_MIXED)
394 aSet.InvalidateItem(ATTR_ANIMATION_FADEOUT);
395 else
396 aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, sal_False));
397
398 if (nFadeColorSet == ATTR_SET)
399 aSet.Put(SvxColorItem(aFadeColor, ATTR_ANIMATION_COLOR));
400 else if (nFadeColorSet == ATTR_MIXED)
401 aSet.InvalidateItem(ATTR_ANIMATION_COLOR);
402 else
403 aSet.Put(SvxColorItem(RGB_Color(COL_LIGHTGRAY), ATTR_ANIMATION_COLOR));
404
405 if (nInvisibleSet == ATTR_SET)
406 aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, bInvisible));
407 else if (nInvisibleSet == ATTR_MIXED)
408 aSet.InvalidateItem(ATTR_ANIMATION_INVISIBLE);
409 else
410 aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, sal_False));
411
412 if (nSoundOnSet == ATTR_SET)
413 aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, bSoundOn));
414 else if (nSoundOnSet == ATTR_MIXED)
415 aSet.InvalidateItem(ATTR_ANIMATION_SOUNDON);
416 else
417 aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, sal_False));
418
419 if (nSoundFileSet == ATTR_SET)
420 aSet.Put(SfxStringItem(ATTR_ANIMATION_SOUNDFILE, aSound));
421 else
422 aSet.InvalidateItem(ATTR_ANIMATION_SOUNDFILE);
423
424 if (nPlayFullSet == ATTR_SET)
425 aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, bPlayFull));
426 else if (nPlayFullSet == ATTR_MIXED)
427 aSet.InvalidateItem(ATTR_ANIMATION_PLAYFULL);
428 else
429 aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, sal_False));
430
431 if (nClickActionSet == ATTR_SET)
432 aSet.Put(SfxAllEnumItem(ATTR_ACTION, (sal_uInt16)eClickAction));
433 else if (nClickActionSet == ATTR_MIXED)
434 aSet.InvalidateItem(ATTR_ACTION);
435 else
436 aSet.Put(SfxAllEnumItem(ATTR_ACTION, presentation::ClickAction_NONE));
437
438 if (nBookmarkSet == ATTR_SET)
439 aSet.Put(SfxStringItem(ATTR_ACTION_FILENAME, aBookmark));
440 else
441 aSet.InvalidateItem(ATTR_ACTION_FILENAME);
442
443 if (nSecondEffectSet == ATTR_SET)
444 aSet.Put(SfxAllEnumItem(ATTR_ACTION_EFFECT, (sal_uInt16)eSecondEffect));
445 else if (nSecondEffectSet == ATTR_MIXED)
446 aSet.InvalidateItem( ATTR_ACTION_EFFECT );
447 else
448 aSet.Put(SfxAllEnumItem(ATTR_ACTION_EFFECT, presentation::AnimationEffect_NONE));
449
450 if (nSecondSpeedSet == ATTR_SET)
451 aSet.Put(SfxAllEnumItem(ATTR_ACTION_EFFECTSPEED, (sal_uInt16)eSecondSpeed));
452 else
453 aSet.InvalidateItem(ATTR_ACTION_EFFECTSPEED);
454
455 if (nSecondSoundOnSet == ATTR_SET)
456 aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, bSecondSoundOn));
457 else if (nSecondSoundOnSet == ATTR_MIXED)
458 aSet.InvalidateItem(ATTR_ACTION_SOUNDON);
459 else
460 aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, sal_False));
461
462 if (nSecondPlayFullSet == ATTR_SET)
463 aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, bSecondPlayFull));
464 else if (nPlayFullSet == ATTR_MIXED)
465 aSet.InvalidateItem(ATTR_ACTION_PLAYFULL);
466 else
467 aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, sal_False));
468
469 SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
470 SfxAbstractDialog* pDlg = pFact ? pFact->CreatSdActionDialog( NULL, &aSet, mpView ) : 0;
471
472 sal_uInt16 nResult = pDlg ? pDlg->Execute() : RET_CANCEL;
473
474 if( nResult == RET_OK )
475 {
476 rReq.Done( *( pDlg->GetOutputItemSet() ) );
477 pArgs = rReq.GetArgs();
478 }
479
480 delete pDlg;
481
482 if( nResult != RET_OK )
483 return;
484 }
485
486 // Auswertung des ItemSets
487 if (pArgs->GetItemState(ATTR_ANIMATION_ACTIVE) == SFX_ITEM_SET)
488 {
489 bActive = ((SfxBoolItem&)pArgs->Get(ATTR_ANIMATION_ACTIVE)).GetValue();
490 nAnimationSet = ATTR_SET;
491 }
492 else
493 nAnimationSet = ATTR_MISSING;
494
495 if (pArgs->GetItemState(ATTR_ANIMATION_EFFECT) == SFX_ITEM_SET)
496 {
497 eEffect = (presentation::AnimationEffect)((SfxAllEnumItem&) pArgs->
498 Get(ATTR_ANIMATION_EFFECT)).GetValue();
499 nEffectSet = ATTR_SET;
500 }
501 else
502 nEffectSet = ATTR_MISSING;
503
504 if (pArgs->GetItemState(ATTR_ANIMATION_TEXTEFFECT) == SFX_ITEM_SET)
505 {
506 eTextEffect = (presentation::AnimationEffect)((SfxAllEnumItem&) pArgs->
507 Get(ATTR_ANIMATION_TEXTEFFECT)).GetValue();
508 nTextEffectSet = ATTR_SET;
509 }
510 else
511 nTextEffectSet = ATTR_MISSING;
512
513 if (pArgs->GetItemState(ATTR_ANIMATION_SPEED) == SFX_ITEM_SET)
514 {
515 eSpeed = (presentation::AnimationSpeed)((SfxAllEnumItem&) pArgs->
516 Get(ATTR_ANIMATION_SPEED)).GetValue();
517 nSpeedSet = ATTR_SET;
518 }
519 else
520 nSpeedSet = ATTR_MISSING;
521
522 if (pArgs->GetItemState(ATTR_ANIMATION_FADEOUT) == SFX_ITEM_SET)
523 {
524 bFadeOut = ((SfxBoolItem&)pArgs->Get(ATTR_ANIMATION_FADEOUT)).GetValue();
525 nFadeOutSet = ATTR_SET;
526 }
527 else
528 nFadeOutSet = ATTR_MISSING;
529
530 if (pArgs->GetItemState(ATTR_ANIMATION_INVISIBLE) == SFX_ITEM_SET)
531 {
532 bInvisible = ((SfxBoolItem&)pArgs->Get(ATTR_ANIMATION_INVISIBLE)).GetValue();
533 nInvisibleSet = ATTR_SET;
534 }
535 else
536 nInvisibleSet = ATTR_MISSING;
537
538 if (pArgs->GetItemState(ATTR_ANIMATION_SOUNDON) == SFX_ITEM_SET)
539 {
540 bSoundOn = ((SfxBoolItem&)pArgs->Get(ATTR_ANIMATION_SOUNDON)).GetValue();
541 nSoundOnSet = ATTR_SET;
542 }
543 else
544 nSoundOnSet = ATTR_MISSING;
545
546 if (pArgs->GetItemState(ATTR_ANIMATION_SOUNDFILE) == SFX_ITEM_SET)
547 {
548 aSound = ((SfxStringItem&)pArgs->Get(ATTR_ANIMATION_SOUNDFILE)).GetValue();
549 nSoundFileSet = ATTR_SET;
550 }
551 else
552 nSoundFileSet = ATTR_MISSING;
553
554 if (pArgs->GetItemState(ATTR_ANIMATION_COLOR) == SFX_ITEM_SET)
555 {
556 aFadeColor = ((SvxColorItem&)pArgs->Get(ATTR_ANIMATION_COLOR)).GetValue();
557 nFadeColorSet = ATTR_SET;
558 }
559 else
560 nFadeColorSet = ATTR_MISSING;
561
562 if (pArgs->GetItemState(ATTR_ANIMATION_PLAYFULL) == SFX_ITEM_SET)
563 {
564 bPlayFull = ((SfxBoolItem&)pArgs->Get(ATTR_ANIMATION_PLAYFULL)).GetValue();
565 nPlayFullSet = ATTR_SET;
566 }
567 else
568 nPlayFullSet = ATTR_MISSING;
569
570 if (pArgs->GetItemState(ATTR_ACTION) == SFX_ITEM_SET)
571 {
572 eClickAction = (presentation::ClickAction)((SfxAllEnumItem&)pArgs->
573 Get(ATTR_ACTION)).GetValue();
574 nClickActionSet = ATTR_SET;
575 }
576 else
577 nClickActionSet = ATTR_MISSING;
578
579 if (pArgs->GetItemState(ATTR_ACTION_FILENAME) == SFX_ITEM_SET)
580 {
581 aBookmark = ((SfxStringItem&)pArgs->
582 Get(ATTR_ACTION_FILENAME)).GetValue();
583 nBookmarkSet = ATTR_SET;
584 }
585 else
586 nBookmarkSet = ATTR_MISSING;
587
588 if (pArgs->GetItemState(ATTR_ACTION_EFFECT) == SFX_ITEM_SET)
589 {
590 eSecondEffect = (presentation::AnimationEffect)((SfxAllEnumItem&) pArgs->
591 Get(ATTR_ACTION_EFFECT)).GetValue();
592 nSecondEffectSet = ATTR_SET;
593 }
594 else
595 nSecondEffectSet = ATTR_MISSING;
596
597 if (pArgs->GetItemState(ATTR_ACTION_EFFECTSPEED) == SFX_ITEM_SET)
598 {
599 eSecondSpeed = (presentation::AnimationSpeed)((SfxAllEnumItem&) pArgs->
600 Get(ATTR_ACTION_EFFECTSPEED)).GetValue();
601 nSecondSpeedSet = ATTR_SET;
602 }
603 else
604 nSecondSpeedSet = ATTR_MISSING;
605
606 if (pArgs->GetItemState(ATTR_ACTION_SOUNDON) == SFX_ITEM_SET)
607 {
608 bSecondSoundOn = ((SfxBoolItem&)pArgs->Get(ATTR_ACTION_SOUNDON)).GetValue();
609 nSecondSoundOnSet = ATTR_SET;
610 }
611 else
612 nSecondSoundOnSet = ATTR_MISSING;
613
614 if (pArgs->GetItemState(ATTR_ACTION_PLAYFULL) == SFX_ITEM_SET)
615 {
616 bSecondPlayFull = ((SfxBoolItem&)pArgs->Get(ATTR_ACTION_PLAYFULL)).GetValue();
617 nSecondPlayFullSet = ATTR_SET;
618 }
619 else
620 nSecondPlayFullSet = ATTR_MISSING;
621
622 // Wenn irgendwelche Attribute ausgewaehlt wurden
623 if (nEffectSet == ATTR_SET ||
624 nTextEffectSet == ATTR_SET ||
625 nSpeedSet == ATTR_SET ||
626 nAnimationSet == ATTR_SET ||
627 nFadeOutSet == ATTR_SET ||
628 nFadeColorSet == ATTR_SET ||
629 nInvisibleSet == ATTR_SET ||
630 nSoundOnSet == ATTR_SET ||
631 nSoundFileSet == ATTR_SET ||
632 nPlayFullSet == ATTR_SET ||
633 nClickActionSet == ATTR_SET ||
634 nBookmarkSet == ATTR_SET ||
635 nSecondEffectSet == ATTR_SET ||
636 nSecondSpeedSet == ATTR_SET ||
637 nSecondSoundOnSet == ATTR_SET ||
638 nSecondPlayFullSet == ATTR_SET)
639 {
640 // String fuer Undo-Group und List-Action
641 String aComment(SdResId(STR_UNDO_ANIMATION));
642
643 // bei 'an Kurve entlang' gibt's noch eine extra UndoAction, darum
644 // hier klammern
645 pUndoMgr->EnterListAction(aComment, aComment);
646
647 // Undo Gruppe erzeugen
648 SdUndoGroup* pUndoGroup = new SdUndoGroup(mpDoc);
649 pUndoGroup->SetComment(aComment);
650
651
652 // fuer den Pfad-Effekt einige Dinge merken
653 SdrObject* pRunningObj = NULL;
654 SdrPathObj* pPath = NULL;
655 if (eEffect == presentation::AnimationEffect_PATH && nEffectSet == ATTR_SET)
656 {
657 DBG_ASSERT(nCount == 2, "dieser Effekt braucht genau 2 selektierte Objekte");
658 SdrObject* pObject1 = rMarkList.GetMark(0)->GetMarkedSdrObj();
659 SdrObject* pObject2 = rMarkList.GetMark(1)->GetMarkedSdrObj();
660 SdrObjKind eKind1 = (SdrObjKind)pObject1->GetObjIdentifier();
661 SdrObjKind eKind2 = (SdrObjKind)pObject2->GetObjIdentifier();
662
663 if (pObject1->GetObjInventor() == SdrInventor &&
664 ((eKind1 == OBJ_LINE) || // 2-Punkt-Linie
665 (eKind1 == OBJ_PLIN) || // Polygon
666 (eKind1 == OBJ_PATHLINE))) // Bezier-Kurve
667 {
668 pPath = (SdrPathObj*)pObject1;
669 pRunningObj = pObject2;
670 }
671
672 if (pObject2->GetObjInventor() == SdrInventor &&
673 ((eKind2 == OBJ_LINE) || // 2-Punkt-Linie
674 (eKind2 == OBJ_PLIN) || // Polygon
675 (eKind2 == OBJ_PATHLINE))) // Bezier-Kurve
676 {
677 pPath = (SdrPathObj*)pObject2;
678 pRunningObj = pObject1;
679 }
680
681 DBG_ASSERT(pPath, "keine Kurve gefunden");
682
683
684 // das laufende Objekt auf das Kurvenende schieben
685 Rectangle aCurRect(pRunningObj->GetLogicRect());
686 Point aCurCenter(aCurRect.Center());
687 const ::basegfx::B2DPolyPolygon& rPolyPolygon = pPath->GetPathPoly();
688 sal_uInt32 nNoOfPolygons(rPolyPolygon.count());
689 const ::basegfx::B2DPolygon aPolygon(rPolyPolygon.getB2DPolygon(nNoOfPolygons - 1L));
690 sal_uInt32 nPoints(aPolygon.count());
691 const ::basegfx::B2DPoint aNewB2DCenter(aPolygon.getB2DPoint(nPoints - 1L));
692 const Point aNewCenter(FRound(aNewB2DCenter.getX()), FRound(aNewB2DCenter.getY()));
693 Size aDistance(aNewCenter.X() - aCurCenter.X(), aNewCenter.Y() - aCurCenter.Y());
694 pRunningObj->Move(aDistance);
695
696 pUndoMgr->AddUndoAction(mpDoc->GetSdrUndoFactory().CreateUndoMoveObject( *pRunningObj, aDistance));
697 }
698
699 for (nObject = 0; nObject < nCount; nObject++)
700 {
701 SdrObject* pObject = rMarkList.GetMark(nObject)->GetMarkedSdrObj();
702
703 pInfo = mpDoc->GetAnimationInfo(pObject);
704
705 sal_Bool bCreated = sal_False;
706 if( !pInfo )
707 {
708 pInfo = SdDrawDocument::GetShapeUserData(*pObject,true);
709 bCreated = sal_True;
710 }
711
712 // das Pfadobjekt fuer 'an Kurve entlang'?
713 if (eEffect == presentation::AnimationEffect_PATH && pObject == pPath)
714 {
715 SdAnimationPrmsUndoAction* pAction = new SdAnimationPrmsUndoAction
716 (mpDoc, pObject, bCreated);
717 pAction->SetActive(pInfo->mbActive, pInfo->mbActive);
718 pAction->SetEffect(pInfo->meEffect, pInfo->meEffect);
719 pAction->SetTextEffect(pInfo->meTextEffect, pInfo->meTextEffect);
720 pAction->SetSpeed(pInfo->meSpeed, pInfo->meSpeed);
721 pAction->SetDim(pInfo->mbDimPrevious, pInfo->mbDimPrevious);
722 pAction->SetDimColor(pInfo->maDimColor, pInfo->maDimColor);
723 pAction->SetDimHide(pInfo->mbDimHide, pInfo->mbDimHide);
724 pAction->SetSoundOn(pInfo->mbSoundOn, pInfo->mbSoundOn);
725 pAction->SetSound(pInfo->maSoundFile, pInfo->maSoundFile);
726 pAction->SetPlayFull(pInfo->mbPlayFull, pInfo->mbPlayFull);
727 // pAction->SetPathObj(pInfo->mpPathObj, pInfo->mpPathObj);
728 pAction->SetClickAction(pInfo->meClickAction, pInfo->meClickAction);
729 pAction->SetBookmark(pInfo->GetBookmark(), pInfo->GetBookmark());
730 // pAction->SetInvisibleInPres(pInfo->mbInvisibleInPresentation, sal_True);
731 pAction->SetVerb(pInfo->mnVerb, pInfo->mnVerb);
732 pAction->SetSecondEffect(pInfo->meSecondEffect, pInfo->meSecondEffect);
733 pAction->SetSecondSpeed(pInfo->meSecondSpeed, pInfo->meSecondSpeed);
734 pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, pInfo->mbSecondSoundOn);
735 pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull, pInfo->mbSecondPlayFull);
736 pUndoGroup->AddAction(pAction);
737
738 // pInfo->mbInvisibleInPresentation = sal_True;
739 }
740 else
741 {
742
743 // Undo-Action mit alten und neuen Groessen erzeugen
744 SdAnimationPrmsUndoAction* pAction = new SdAnimationPrmsUndoAction
745 (mpDoc, pObject, bCreated);
746 pAction->SetActive(pInfo->mbActive, bActive);
747 pAction->SetEffect(pInfo->meEffect, eEffect);
748 pAction->SetTextEffect(pInfo->meTextEffect, eTextEffect);
749 pAction->SetSpeed(pInfo->meSpeed, eSpeed);
750 pAction->SetDim(pInfo->mbDimPrevious, bFadeOut);
751 pAction->SetDimColor(pInfo->maDimColor, aFadeColor);
752 pAction->SetDimHide(pInfo->mbDimHide, bInvisible);
753 pAction->SetSoundOn(pInfo->mbSoundOn, bSoundOn);
754 pAction->SetSound(pInfo->maSoundFile, aSound);
755 pAction->SetPlayFull(pInfo->mbPlayFull, bPlayFull);
756 pAction->SetPathObj(pInfo->mpPathObj, pPath);
757 pAction->SetClickAction(pInfo->meClickAction, eClickAction);
758 pAction->SetBookmark(pInfo->GetBookmark(), aBookmark);
759 // pAction->SetInvisibleInPres(pInfo->mbInvisibleInPresentation,
760 // pInfo->mbInvisibleInPresentation);
761 pAction->SetVerb(pInfo->mnVerb, (sal_uInt16)pInfo->GetBookmark().ToInt32() );
762 pAction->SetSecondEffect(pInfo->meSecondEffect, eSecondEffect);
763 pAction->SetSecondSpeed(pInfo->meSecondSpeed, eSecondSpeed);
764 pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, bSecondSoundOn);
765 pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull,bSecondPlayFull);
766 pUndoGroup->AddAction(pAction);
767
768 // neue Werte am Infoblock des Objekts eintragen
769 if (nAnimationSet == ATTR_SET)
770 pInfo->mbActive = bActive;
771
772 if (nEffectSet == ATTR_SET)
773 pInfo->meEffect = eEffect;
774
775 if (nTextEffectSet == ATTR_SET)
776 pInfo->meTextEffect = eTextEffect;
777
778 if (nSpeedSet == ATTR_SET)
779 pInfo->meSpeed = eSpeed;
780
781 if (nFadeOutSet == ATTR_SET)
782 pInfo->mbDimPrevious = bFadeOut;
783
784 if (nFadeColorSet == ATTR_SET)
785 pInfo->maDimColor = aFadeColor;
786
787 if (nInvisibleSet == ATTR_SET)
788 pInfo->mbDimHide = bInvisible;
789
790 if (nSoundOnSet == ATTR_SET)
791 pInfo->mbSoundOn = bSoundOn;
792
793 if (nSoundFileSet == ATTR_SET)
794 pInfo->maSoundFile = aSound;
795
796 if (nPlayFullSet == ATTR_SET)
797 pInfo->mbPlayFull = bPlayFull;
798
799 if (nClickActionSet == ATTR_SET)
800 pInfo->meClickAction = eClickAction;
801
802 if (nBookmarkSet == ATTR_SET)
803 pInfo->SetBookmark( aBookmark );
804
805 if (nSecondEffectSet == ATTR_SET)
806 pInfo->meSecondEffect = eSecondEffect;
807
808 if (nSecondSpeedSet == ATTR_SET)
809 pInfo->meSecondSpeed = eSecondSpeed;
810
811 if (nSecondSoundOnSet == ATTR_SET)
812 pInfo->mbSecondSoundOn = bSecondSoundOn;
813
814 if (nSecondPlayFullSet == ATTR_SET)
815 pInfo->mbSecondPlayFull = bSecondPlayFull;
816
817 // noch ein paar Spezialitaeten
818 // if (eEffect == presentation::AnimationEffect_PATH && nEffectSet == ATTR_SET)
819 // pInfo->mSetPath(pPath);
820
821 if (eClickAction == presentation::ClickAction_VERB)
822 pInfo->mnVerb = (sal_uInt16)aBookmark.ToInt32();
823 }
824 }
825 // Undo Gruppe dem Undo Manager uebergeben
826 pUndoMgr->AddUndoAction(pUndoGroup);
827 pUndoMgr->LeaveListAction();
828
829 // Model geaendert
830 mpDoc->SetChanged();
831 }
832 // sieht man nicht, also muss an den Bindings nicht invalidiert werden
833 }
834
835 } // end of namespace sd
836