xref: /trunk/main/sd/source/ui/dlg/animobjs.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 #include <com/sun/star/presentation/AnimationEffect.hpp>
31 #include <com/sun/star/presentation/AnimationSpeed.hpp>
32 
33 #define _ANIMATION          //animation freischalten
34 
35 #define _SV_BITMAPEX
36 #include <svx/xoutbmp.hxx>
37 
38 #include <time.h>
39 #include <svl/eitem.hxx>
40 #include <svx/svdograf.hxx>
41 #include <svx/svdogrp.hxx>
42 #include <sfx2/dispatch.hxx>
43 #include <sfx2/progress.hxx>
44 #include <vcl/msgbox.hxx>
45 #include "anminfo.hxx"
46 #include "animobjs.hxx"
47 #include "animobjs.hrc"
48 #include "anmdef.hxx"
49 #include "app.hrc"
50 #include "strings.hrc"
51 #include "sdresid.hxx"
52 #include "View.hxx"
53 #include "drawdoc.hxx"
54 #include "sdpage.hxx"
55 #include "res_bmp.hrc"
56 #include "ViewShell.hxx"
57 
58 #ifndef _SV_SVAPP_HXX_
59 #include <vcl/svapp.hxx>
60 #endif
61 
62 #include <string>
63 #include <algorithm>
64 
65 using namespace ::com::sun::star;
66 
67 namespace sd {
68 
69 /*************************************************************************
70 |*  SdDisplay - Control
71 \************************************************************************/
72 
73 SdDisplay::SdDisplay( Window* pWin, SdResId Id ) :
74         Control( pWin, Id ),
75         aScale( 1, 1 )
76 {
77     SetMapMode( MAP_PIXEL );
78     const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
79     SetBackground( Wallpaper( Color( rStyles.GetFieldColor() ) ) );
80 }
81 
82 // -----------------------------------------------------------------------
83 
84 SdDisplay::~SdDisplay()
85 {
86 }
87 
88 // -----------------------------------------------------------------------
89 
90 void SdDisplay::SetBitmapEx( BitmapEx* pBmpEx )
91 {
92     if( pBmpEx )
93     {
94         aBitmapEx = *pBmpEx;
95     }
96     else
97     {
98         const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
99         const Color aFillColor = rStyles.GetFieldColor();
100         aBitmapEx.Erase(aFillColor);
101     }
102 }
103 
104 // -----------------------------------------------------------------------
105 
106 void SdDisplay::Paint( const Rectangle& )
107 {
108     Point aPt;
109     Size aSize = GetOutputSize();
110     Size aBmpSize = aBitmapEx.GetBitmap().GetSizePixel();
111     aBmpSize.Width() = (long) ( (double) aBmpSize.Width() * (double) aScale );
112     aBmpSize.Height() = (long) ( (double) aBmpSize.Height() * (double) aScale );
113 
114     if( aBmpSize.Width() < aSize.Width() )
115         aPt.X() = ( aSize.Width() - aBmpSize.Width() ) / 2;
116     if( aBmpSize.Height() < aSize.Height() )
117         aPt.Y() = ( aSize.Height() - aBmpSize.Height() ) / 2;
118 
119     aBitmapEx.Draw( this, aPt, aBmpSize );
120     //DrawBitmap( aPt, aBmpSize, *pBitmap );
121 }
122 
123 // -----------------------------------------------------------------------
124 
125 void SdDisplay::SetScale( const Fraction& rFrac )
126 {
127     aScale = rFrac;
128 }
129 
130 void SdDisplay::DataChanged( const DataChangedEvent& rDCEvt )
131 {
132     Control::DataChanged( rDCEvt );
133 
134     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
135     {
136         const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
137         SetBackground( Wallpaper( Color( rStyles.GetFieldColor() ) ) );
138         SetDrawMode( GetSettings().GetStyleSettings().GetHighContrastMode()
139             ? ViewShell::OUTPUT_DRAWMODE_CONTRAST
140             : ViewShell::OUTPUT_DRAWMODE_COLOR );
141     }
142 }
143 
144 /*************************************************************************
145 |*  AnimationWindow - FloatingWindow
146 \************************************************************************/
147 
148 AnimationWindow::AnimationWindow( SfxBindings* pInBindings,
149                 SfxChildWindow *pCW, Window* pParent, const SdResId& rSdResId ) :
150         SfxDockingWindow    ( pInBindings, pCW, pParent, rSdResId ),
151         aCtlDisplay         ( this, SdResId( CTL_DISPLAY ) ),
152         aBtnFirst           ( this, SdResId( BTN_FIRST ) ),
153         aBtnReverse         ( this, SdResId( BTN_REVERSE ) ),
154         aBtnStop            ( this, SdResId( BTN_STOP ) ),
155         aBtnPlay            ( this, SdResId( BTN_PLAY ) ),
156         aBtnLast            ( this, SdResId( BTN_LAST ) ),
157         aNumFldBitmap       ( this, SdResId( NUM_FLD_BITMAP ) ),
158         aTimeField          ( this, SdResId( TIME_FIELD ) ),
159         aLbLoopCount        ( this, SdResId( LB_LOOP_COUNT ) ),
160         aGrpBitmap          ( this, SdResId( GRP_BITMAP ) ),
161         aBtnGetOneObject    ( this, SdResId( BTN_GET_ONE_OBJECT ) ),
162         aBtnGetAllObjects   ( this, SdResId( BTN_GET_ALL_OBJECTS ) ),
163         aBtnRemoveBitmap    ( this, SdResId( BTN_REMOVE_BITMAP ) ),
164         aBtnRemoveAll       ( this, SdResId( BTN_REMOVE_ALL ) ),
165         aFtCount            ( this, SdResId( FT_COUNT ) ),
166         aFiCount            ( this, SdResId( FI_COUNT ) ),
167         aGrpAnimation       ( this, SdResId( GRP_ANIMATION_GROUP ) ),
168         aRbtGroup           ( this, SdResId( RBT_GROUP ) ),
169         aRbtBitmap          ( this, SdResId( RBT_BITMAP ) ),
170         aFtAdjustment       ( this, SdResId( FT_ADJUSTMENT ) ),
171         aLbAdjustment       ( this, SdResId( LB_ADJUSTMENT ) ),
172         aBtnCreateGroup     ( this, SdResId( BTN_CREATE_GROUP ) ),
173 
174         pWin                ( pParent ),
175         pBitmapEx           ( NULL ),
176 
177         bMovie              ( sal_False ),
178         bAllObjects         ( sal_False ),
179 
180         pBindings           ( pInBindings )
181 {
182     aCtlDisplay.SetAccessibleName(String (SdResId(STR_DISPLAY)));
183     FreeResource();
184 
185     aBtnGetOneObject.SetModeImage( Image( SdResId( IMG_GET1OBJECT_H ) ), BMP_COLOR_HIGHCONTRAST );
186     aBtnGetAllObjects.SetModeImage( Image( SdResId( IMG_GETALLOBJECT_H ) ), BMP_COLOR_HIGHCONTRAST );
187     aBtnRemoveBitmap.SetModeImage( Image( SdResId( IMG_REMOVEBMP_H ) ), BMP_COLOR_HIGHCONTRAST );
188     aBtnRemoveAll.SetModeImage( Image( SdResId( IMG_REMOVEALLBMP_H ) ), BMP_COLOR_HIGHCONTRAST );
189 
190     // neues Dokument mit Seite erzeugen
191     pMyDoc = new SdDrawDocument(DOCUMENT_TYPE_IMPRESS, NULL);
192     SdPage* pPage = (SdPage*) pMyDoc->AllocPage(sal_False);
193     pMyDoc->InsertPage(pPage);
194 
195     pControllerItem = new AnimationControllerItem( SID_ANIMATOR_STATE, this, pBindings );
196 
197     // Solange noch nicht in der Resource
198     aTimeField.SetFormat( TIMEF_SEC_CS );
199 
200     aBtnFirst.SetClickHdl( LINK( this, AnimationWindow, ClickFirstHdl ) );
201     aBtnReverse.SetClickHdl( LINK( this, AnimationWindow, ClickPlayHdl ) );
202     aBtnStop.SetClickHdl( LINK( this, AnimationWindow, ClickStopHdl ) );
203     aBtnPlay.SetClickHdl( LINK( this, AnimationWindow, ClickPlayHdl ) );
204     aBtnLast.SetClickHdl( LINK( this, AnimationWindow, ClickLastHdl ) );
205 
206     aBtnGetOneObject.SetClickHdl( LINK( this, AnimationWindow, ClickGetObjectHdl ) );
207     aBtnGetAllObjects.SetClickHdl( LINK( this, AnimationWindow, ClickGetObjectHdl ) );
208     aBtnRemoveBitmap.SetClickHdl( LINK( this, AnimationWindow, ClickRemoveBitmapHdl ) );
209     aBtnRemoveAll.SetClickHdl( LINK( this, AnimationWindow, ClickRemoveBitmapHdl ) );
210 
211     aRbtGroup.SetClickHdl( LINK( this, AnimationWindow, ClickRbtHdl ) );
212     aRbtBitmap.SetClickHdl( LINK( this, AnimationWindow, ClickRbtHdl ) );
213     aBtnCreateGroup.SetClickHdl( LINK( this, AnimationWindow, ClickCreateGroupHdl ) );
214     aNumFldBitmap.SetModifyHdl( LINK( this, AnimationWindow, ModifyBitmapHdl ) );
215     aTimeField.SetModifyHdl( LINK( this, AnimationWindow, ModifyTimeHdl ) );
216 
217     // disable 3D border
218     aCtlDisplay.SetBorderStyle(WINDOW_BORDER_MONO);
219     aDisplaySize = aCtlDisplay.GetOutputSize();
220 
221     aSize = GetOutputSizePixel();
222     SetMinOutputSizePixel( aSize );
223 
224     ResetAttrs();
225 
226     // der Animator ist leer; es kann keine Animationsgruppe erstellt werden
227     aBtnCreateGroup.Disable();
228 
229     aBtnGetOneObject.SetAccessibleRelationMemberOf( &aGrpBitmap );
230     aBtnGetAllObjects.SetAccessibleRelationMemberOf( &aGrpBitmap );
231     aBtnRemoveBitmap.SetAccessibleRelationMemberOf( &aGrpBitmap );
232     aBtnRemoveAll.SetAccessibleRelationMemberOf( &aGrpBitmap );
233 }
234 
235 // -----------------------------------------------------------------------
236 
237 AnimationWindow::~AnimationWindow()
238 {
239     sal_uLong i, nCount;
240 
241     delete pControllerItem;
242 
243     // Bitmapliste bereinigen
244     for( i = 0, nCount = aBmpExList.Count(); i < nCount; i++ )
245         delete static_cast< BitmapEx* >( aBmpExList.GetObject( i ) );
246     aBmpExList.Clear();
247 
248     // Timeliste bereinigen
249     for( i = 0, nCount = aTimeList.Count(); i < nCount; i++ )
250         delete static_cast< Time* >( aTimeList.GetObject( i ) );
251     aTimeList.Clear();
252 
253     // die Clones loeschen
254     delete pMyDoc;
255 }
256 
257 // -----------------------------------------------------------------------
258 
259 IMPL_LINK( AnimationWindow, ClickFirstHdl, void *, EMPTYARG )
260 {
261     aBmpExList.First();
262     pBitmapEx = static_cast< BitmapEx* >( aBmpExList.GetCurObject() );
263     UpdateControl( aBmpExList.GetCurPos() );
264 
265     return( 0L );
266 }
267 
268 // -----------------------------------------------------------------------
269 
270 IMPL_LINK( AnimationWindow, ClickStopHdl, void *, EMPTYARG )
271 {
272     bMovie = sal_False;
273     return( 0L );
274 }
275 
276 // -----------------------------------------------------------------------
277 
278 IMPL_LINK( AnimationWindow, ClickPlayHdl, void *, p )
279 {
280     ScopeLockGuard aGuard( maPlayLock );
281 
282     bMovie = sal_True;
283     sal_Bool bDisableCtrls = sal_False;
284     sal_uLong nCount = aBmpExList.Count();
285     sal_Bool bReverse = p == &aBtnReverse;
286 
287     // Kann spaeter schwer ermittelt werden
288     sal_Bool bRbtGroupEnabled = aRbtGroup.IsEnabled();
289     sal_Bool bBtnGetAllObjectsEnabled = aBtnGetAllObjects.IsEnabled();
290     sal_Bool bBtnGetOneObjectEnabled = aBtnGetOneObject.IsEnabled();
291 
292     // Gesamtzeit ermitteln
293     Time aTime( 0 );
294     long nFullTime;
295     if( aRbtBitmap.IsChecked() )
296     {
297         for( sal_uLong i = 0; i < nCount; i++ )
298             aTime += *static_cast< Time* >( aTimeList.GetObject( i ) );
299         nFullTime  = aTime.GetMSFromTime();
300     }
301     else
302     {
303         nFullTime = nCount * 100;
304         aTime.MakeTimeFromMS( nFullTime );
305     }
306 
307     // StatusBarManager ab 1 Sekunde
308     SfxProgress* pProgress = NULL;
309     if( nFullTime >= 1000 )
310     {
311         bDisableCtrls = sal_True;
312         aBtnStop.Enable();
313         aBtnStop.Update();
314         String aStr( RTL_CONSTASCII_USTRINGPARAM( "Animator:" ) ); // Hier sollte man sich noch etwas gescheites ausdenken!
315         pProgress = new SfxProgress( NULL, aStr, nFullTime );
316     }
317 
318     sal_uLong nTmpTime = 0;
319     long i = 0;
320     sal_Bool bCount = i < (long) nCount;
321     if( bReverse )
322     {
323         i = nCount - 1;
324         bCount = i >= 0;
325     }
326     while( bCount && bMovie )
327     {
328         // Um Konsistenz zwischen Liste und Anzeige zu erwirken
329         aBmpExList.Seek( i );
330         pBitmapEx = static_cast< BitmapEx* >(  aBmpExList.GetCurObject() );
331 
332         UpdateControl( i, bDisableCtrls );
333 
334         if( aRbtBitmap.IsChecked() )
335         {
336             Time* pTime = static_cast< Time* >( aTimeList.GetObject( i ) );
337             DBG_ASSERT( pTime, "Keine Zeit gefunden!" );
338 
339             aTimeField.SetTime( *pTime );
340             sal_uLong nTime = pTime->GetMSFromTime();
341 
342             WaitInEffect( nTime, nTmpTime, pProgress );
343             nTmpTime += nTime;
344         }
345         else
346         {
347             WaitInEffect( 100, nTmpTime, pProgress );
348             nTmpTime += 100;
349         }
350         if( bReverse )
351         {
352             i--;
353             if (i < 0)
354             {
355                 // Terminate loop.
356                 bCount = false;
357                 // Move i back into valid range.
358                 i = 0;
359             }
360         }
361         else
362         {
363             i++;
364             if (i >= (long) nCount)
365             {
366                 // Terminate loop.
367                 bCount = false;
368                 // Move i back into valid range.
369                 i = nCount - 1;
370             }
371         }
372     }
373 
374     // Um die Controls wieder zu enablen
375     bMovie = sal_False;
376     if (nCount > 0)
377         UpdateControl(i);
378 
379     if( pProgress )
380     {
381         delete pProgress;
382         aBtnStop.Disable();
383     }
384 
385     aRbtGroup.Enable( bRbtGroupEnabled );
386     aBtnGetAllObjects.Enable( bBtnGetAllObjectsEnabled );
387     aBtnGetOneObject.Enable( bBtnGetOneObjectEnabled );
388 
389     return( 0L );
390 }
391 
392 // -----------------------------------------------------------------------
393 
394 IMPL_LINK( AnimationWindow, ClickLastHdl, void *, EMPTYARG )
395 {
396     aBmpExList.Last();
397     pBitmapEx = static_cast< BitmapEx* >(  aBmpExList.GetCurObject() );
398     UpdateControl( aBmpExList.GetCurPos() );
399 
400     return( 0L );
401 }
402 
403 // -----------------------------------------------------------------------
404 
405 IMPL_LINK( AnimationWindow, ClickRbtHdl, void *, p )
406 {
407     if( !pBitmapEx || p == &aRbtGroup || aRbtGroup.IsChecked() )
408     {
409         aTimeField.SetText( String() );
410         aTimeField.Enable( sal_False );
411         aLbLoopCount.Enable( sal_False );
412     }
413     else if( p == &aRbtBitmap || aRbtBitmap.IsChecked() )
414     {
415         sal_uLong n = static_cast<sal_uLong>(aNumFldBitmap.GetValue());
416         if( n > 0 )
417         {
418             Time* pTime = static_cast< Time* >( aTimeList.GetObject( n - 1 ) );
419             if( pTime )
420                 aTimeField.SetTime( *pTime );
421         }
422         aTimeField.Enable();
423         aLbLoopCount.Enable();
424     }
425 
426     return( 0L );
427 }
428 
429 // -----------------------------------------------------------------------
430 
431 IMPL_LINK( AnimationWindow, ClickGetObjectHdl, void *, pBtn )
432 {
433     bAllObjects = pBtn == &aBtnGetAllObjects;
434 
435     // Code jetzt in AddObj()
436     SfxBoolItem aItem( SID_ANIMATOR_ADD, sal_True );
437 
438     GetBindings().GetDispatcher()->Execute(
439         SID_ANIMATOR_ADD, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L );
440     return( 0L );
441 }
442 
443 // -----------------------------------------------------------------------
444 
445 IMPL_LINK( AnimationWindow, ClickRemoveBitmapHdl, void *, pBtn )
446 {
447     SdPage*     pPage = pMyDoc->GetSdPage(0, PK_STANDARD);
448     SdrObject*  pObject;
449 
450     if( pBtn == &aBtnRemoveBitmap )
451     {
452         sal_uLong nPos = aBmpExList.GetCurPos();
453         pBitmapEx = static_cast< BitmapEx* >( aBmpExList.GetCurObject() );
454         if( pBitmapEx )
455         {
456             delete pBitmapEx;
457             aBmpExList.Remove();
458             pBitmapEx = static_cast< BitmapEx* >( aBmpExList.GetCurObject() );
459         }
460         Time* pTime = static_cast< Time* >( aTimeList.GetObject( nPos ) );
461         if( pTime )
462         {
463             delete pTime;
464             aTimeList.Remove( nPos );
465         }
466 
467         pObject = pPage->GetObj( nPos );
468         // Durch Uebernahme der AnimatedGIFs muessen nicht unbedingt
469         // Objekte vorhanden sein.
470         if( pObject )
471         {
472             pObject = pPage->RemoveObject(nPos);
473             DBG_ASSERT(pObject, "Clone beim Loeschen nicht gefunden");
474             SdrObject::Free( pObject );
475             pPage->RecalcObjOrdNums();
476         }
477 
478     }
479     else // Alles loeschen
480     {
481         WarningBox aWarnBox( this, WB_YES_NO, String( SdResId( STR_ASK_DELETE_ALL_PICTURES ) ) );
482         short nReturn = aWarnBox.Execute();
483 
484         if( nReturn == RET_YES )
485         {
486             // Bitmapliste bereinigen
487             long nCount = aBmpExList.Count();
488             long i;
489 
490             for( i = nCount - 1; i >= 0; i-- )
491             {
492                 pBitmapEx = static_cast< BitmapEx* >( aBmpExList.GetObject( i ) );
493                 delete pBitmapEx;
494 
495                 pObject = pPage->GetObj( i );
496                 if( pObject )
497                 {
498                     pObject = pPage->RemoveObject( i );
499                     DBG_ASSERT(pObject, "Clone beim Loeschen nicht gefunden");
500                     SdrObject::Free( pObject );
501                     //pPage->RecalcObjOrdNums();
502                 }
503 
504             }
505             aBmpExList.Clear();
506 
507             // Timeliste bereinigen
508             nCount = aTimeList.Count();
509             for( i = 0; i < nCount; i++ )
510             {
511                 delete static_cast< Time* >( aTimeList.GetObject( i ) );
512             }
513             aTimeList.Clear();
514         }
515     }
516 
517     // kann noch eine Animationsgruppe erstellt werden?
518     if (aBmpExList.Count() == 0)
519     {
520         aBtnCreateGroup.Disable();
521         // Falls vorher durch Uebernahme von AnimatedGIFs disabled:
522         //aRbtBitmap.Enable();
523         aRbtGroup.Enable();
524     }
525 
526     // Zoom fuer DisplayWin berechnen und setzen
527     Fraction aFrac( GetScale() );
528     aCtlDisplay.SetScale( aFrac );
529 
530     UpdateControl( aBmpExList.GetCurPos() );
531 
532     return( 0L );
533 }
534 
535 // -----------------------------------------------------------------------
536 
537 IMPL_LINK( AnimationWindow, ClickCreateGroupHdl, void *, EMPTYARG )
538 {
539     // Code jetzt in CreatePresObj()
540     SfxBoolItem aItem( SID_ANIMATOR_CREATE, sal_True );
541 
542     GetBindings().GetDispatcher()->Execute(
543         SID_ANIMATOR_CREATE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L );
544     return( 0L );
545 }
546 
547 // -----------------------------------------------------------------------
548 
549 IMPL_LINK( AnimationWindow, ModifyBitmapHdl, void *, EMPTYARG )
550 {
551     sal_uLong nBmp = static_cast<sal_uLong>(aNumFldBitmap.GetValue());
552 
553     if( nBmp > aBmpExList.Count() )
554         nBmp = aBmpExList.Count();
555 
556     pBitmapEx = static_cast< BitmapEx* >( aBmpExList.GetObject( nBmp - 1 ) );
557 
558     // Positionieren in der Liste
559     aBmpExList.Seek( nBmp - 1 );
560 
561     UpdateControl( nBmp - 1 );
562 
563     return( 0L );
564 }
565 
566 // -----------------------------------------------------------------------
567 
568 IMPL_LINK( AnimationWindow, ModifyTimeHdl, void *, EMPTYARG )
569 {
570     sal_uLong nPos = static_cast<sal_uLong>(aNumFldBitmap.GetValue() - 1);
571 
572     Time* pTime = static_cast< Time* >( aTimeList.GetObject( nPos ) );
573     DBG_ASSERT( pTime, "Zeit nicht gefunden!" );
574 
575     *pTime = aTimeField.GetTime();
576 
577     return( 0L );
578 }
579 
580 // -----------------------------------------------------------------------
581 
582 void AnimationWindow::UpdateControl( sal_uLong nListPos, sal_Bool bDisableCtrls )
583 {
584     String aString;
585 
586     if( pBitmapEx )
587     {
588         BitmapEx aBmp( *pBitmapEx );
589 
590         SdPage* pPage = pMyDoc->GetSdPage(0, PK_STANDARD);
591         SdrObject* pObject = (SdrObject*) pPage->GetObj( (sal_uLong) nListPos );
592         if( pObject )
593         {
594             VirtualDevice   aVD;
595             Rectangle       aObjRect( pObject->GetCurrentBoundRect() );
596             Size            aObjSize( aObjRect.GetSize() );
597             Point           aOrigin( Point( -aObjRect.Left(), -aObjRect.Top() ) );
598             MapMode         aMap( aVD.GetMapMode() );
599             aMap.SetMapUnit( MAP_100TH_MM );
600             aMap.SetOrigin( aOrigin );
601             aVD.SetMapMode( aMap );
602             aVD.SetOutputSize( aObjSize );
603             const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
604             aVD.SetBackground( Wallpaper( rStyles.GetFieldColor() ) );
605             aVD.SetDrawMode( rStyles.GetHighContrastMode()
606                 ? ViewShell::OUTPUT_DRAWMODE_CONTRAST
607                 : ViewShell::OUTPUT_DRAWMODE_COLOR );
608             aVD.Erase();
609             pObject->SingleObjectPainter( aVD ); // #110094#-17
610             aBmp = BitmapEx( aVD.GetBitmap( aObjRect.TopLeft(), aObjSize ) );
611         }
612 
613 
614         aCtlDisplay.SetBitmapEx( &aBmp );
615     }
616     else
617     {
618         aCtlDisplay.SetBitmapEx( pBitmapEx );
619     }
620     aCtlDisplay.Invalidate();
621     aCtlDisplay.Update();
622 
623     aFiCount.SetText( UniString::CreateFromInt32( aBmpExList.Count() ) );
624 
625     if( pBitmapEx && !bMovie )
626     {
627         aNumFldBitmap.SetValue( nListPos + 1 );
628 
629         // Wenn mind. 1 Objekt in der Liste ist
630         aBtnFirst.Enable();
631         aBtnReverse.Enable();
632         aBtnPlay.Enable();
633         aBtnLast.Enable();
634         aNumFldBitmap.Enable();
635         aTimeField.Enable();
636         aLbLoopCount.Enable();
637         aBtnRemoveBitmap.Enable();
638         aBtnRemoveAll.Enable();
639     }
640     else
641     {
642         //aFiCount.SetText( String( SdResId( STR_NULL ) ) );
643 
644         // Wenn kein Objekt in der Liste ist
645         aBtnFirst.Enable( sal_False );
646         aBtnReverse.Enable( sal_False );
647         aBtnPlay.Enable( sal_False );
648         aBtnLast.Enable( sal_False );
649         aNumFldBitmap.Enable( sal_False );
650         aTimeField.Enable( sal_False );
651         aLbLoopCount.Enable( sal_False );
652         aBtnRemoveBitmap.Enable( sal_False );
653         aBtnRemoveAll.Enable( sal_False );
654 
655         //aFtAdjustment.Enable();
656         //aLbAdjustment.Enable();
657     }
658 
659     if( bMovie && bDisableCtrls )
660     {
661         aBtnGetOneObject.Enable( sal_False );
662         aBtnGetAllObjects.Enable( sal_False );
663         aRbtGroup.Enable( sal_False );
664         aRbtBitmap.Enable( sal_False );
665         aBtnCreateGroup.Enable( sal_False );
666         aFtAdjustment.Enable( sal_False );
667         aLbAdjustment.Enable( sal_False );
668     }
669     else
670     {
671         // 'Gruppenobjekt' nur dann enablen, wenn es kein Animated GIF ist
672         if (aBmpExList.Count() == 0)
673             aRbtGroup.Enable();
674 
675         aRbtBitmap.Enable();
676         aBtnCreateGroup.Enable(aBmpExList.Count() != 0);
677         aFtAdjustment.Enable( sal_True );
678         aLbAdjustment.Enable( sal_True );
679     }
680 
681     ClickRbtHdl( NULL );
682 }
683 
684 // -----------------------------------------------------------------------
685 
686 void AnimationWindow::ResetAttrs()
687 {
688     aRbtGroup.Check();
689     aLbAdjustment.SelectEntryPos( BA_CENTER );
690     // LoopCount
691     aLbLoopCount.SelectEntryPos( aLbLoopCount.GetEntryCount() - 1);
692 
693     UpdateControl( 0 );
694 }
695 
696 // -----------------------------------------------------------------------
697 
698 void AnimationWindow::WaitInEffect( sal_uLong nMilliSeconds, sal_uLong nTime,
699                                     SfxProgress* pProgress ) const
700 {
701     clock_t aEnd = Time::GetSystemTicks() + nMilliSeconds;
702     clock_t aCurrent = Time::GetSystemTicks();
703     while (aCurrent < aEnd)
704     {
705         aCurrent = Time::GetSystemTicks();
706 
707         if( pProgress )
708             pProgress->SetState( nTime + nMilliSeconds + aCurrent - aEnd );
709 
710         Application::Reschedule();
711 
712         if( !bMovie )
713             return;
714     }
715 }
716 
717 // -----------------------------------------------------------------------
718 
719 Fraction AnimationWindow::GetScale()
720 {
721     Fraction aFrac;
722     sal_uLong nPos = aBmpExList.GetCurPos();
723     sal_uLong nCount = aBmpExList.Count();
724     if( nCount > 0 )
725     {
726         aBmpSize.Width() = 0;
727         aBmpSize.Height() = 0;
728         for( sal_uLong i = 0; i < nCount; i++ )
729         {
730             pBitmapEx = static_cast< BitmapEx* >( aBmpExList.GetObject( i ) );
731             Size aTempSize( pBitmapEx->GetBitmap().GetSizePixel() );
732             aBmpSize.Width() = Max( aBmpSize.Width(), aTempSize.Width() );
733             aBmpSize.Height() = Max( aBmpSize.Height(), aTempSize.Height() );
734         }
735 
736         aBmpSize.Width() += 10;
737         aBmpSize.Height() += 10;
738 
739         aFrac = Fraction( std::min( (double)aDisplaySize.Width() / (double)aBmpSize.Width(),
740                              (double)aDisplaySize.Height() / (double)aBmpSize.Height() ) );
741     }
742     // Liste wieder auf alten Stand bringen
743     pBitmapEx = static_cast< BitmapEx* >( aBmpExList.GetObject( nPos ) );
744     return( aFrac );
745 }
746 
747 // -----------------------------------------------------------------------
748 
749 void AnimationWindow::Resize()
750 {
751     //if( !IsZoomedIn() )
752     if ( !IsFloatingMode() ||
753          !GetFloatingWindow()->IsRollUp() )
754     {
755         Size aWinSize( GetOutputSizePixel() ); // vorher rSize im Resizing()
756 
757         Size aDiffSize;
758         aDiffSize.Width() = aWinSize.Width() - aSize.Width();
759         aDiffSize.Height() = aWinSize.Height() - aSize.Height();
760 
761         // Umgroessern des Display-Controls
762         aDisplaySize.Width() += aDiffSize.Width();
763         aDisplaySize.Height() += aDiffSize.Height();
764         aCtlDisplay.SetOutputSizePixel( aDisplaySize );
765 
766         Point aPt;
767         // aPt.X() = aDiffSize.Width() / 2;
768         aPt.Y() = aDiffSize.Height();
769 
770         // Verschieben der anderen Controls
771         aBtnFirst.Hide();
772         aBtnReverse.Hide();
773         aBtnStop.Hide();
774         aBtnPlay.Hide();
775         aBtnLast.Hide();
776         aTimeField.Hide();
777         aLbLoopCount.Hide();
778         aNumFldBitmap.Hide();
779         aFtCount.Hide();
780         aFiCount.Hide();
781         aBtnGetOneObject.Hide();
782         aBtnGetAllObjects.Hide();
783         aBtnRemoveBitmap.Hide();
784         aBtnRemoveAll.Hide();
785         aGrpBitmap.Hide();
786         aRbtGroup.Hide();
787         aRbtBitmap.Hide();
788         aFtAdjustment.Hide();
789         aLbAdjustment.Hide();
790         aBtnCreateGroup.Hide();
791         aGrpAnimation.Hide();
792 
793 
794         aBtnFirst.SetPosPixel( aBtnFirst.GetPosPixel() + aPt );
795         aBtnReverse.SetPosPixel( aBtnReverse.GetPosPixel() + aPt );
796         aBtnStop.SetPosPixel( aBtnStop.GetPosPixel() + aPt );
797         aBtnPlay.SetPosPixel( aBtnPlay.GetPosPixel() + aPt );
798         aBtnLast.SetPosPixel( aBtnLast.GetPosPixel() + aPt );
799         aNumFldBitmap.SetPosPixel( aNumFldBitmap.GetPosPixel() + aPt );
800         aTimeField.SetPosPixel( aTimeField.GetPosPixel() + aPt );
801         aLbLoopCount.SetPosPixel( aLbLoopCount.GetPosPixel() + aPt );
802         aFtCount.SetPosPixel( aFtCount.GetPosPixel() + aPt );
803         aFiCount.SetPosPixel( aFiCount.GetPosPixel() + aPt );
804         aRbtGroup.SetPosPixel( aRbtGroup.GetPosPixel() + aPt );
805         aRbtBitmap.SetPosPixel( aRbtBitmap.GetPosPixel() + aPt );
806         aFtAdjustment.SetPosPixel( aFtAdjustment.GetPosPixel() + aPt );
807         aLbAdjustment.SetPosPixel( aLbAdjustment.GetPosPixel() + aPt );
808         aBtnGetOneObject.SetPosPixel( aBtnGetOneObject.GetPosPixel() + aPt );
809         aBtnGetAllObjects.SetPosPixel( aBtnGetAllObjects.GetPosPixel() + aPt );
810         aBtnRemoveBitmap.SetPosPixel( aBtnRemoveBitmap.GetPosPixel() + aPt );
811         aBtnRemoveAll.SetPosPixel( aBtnRemoveAll.GetPosPixel() + aPt );
812         aBtnCreateGroup.SetPosPixel( aBtnCreateGroup.GetPosPixel() + aPt );
813         aGrpBitmap.SetPosPixel( aGrpBitmap.GetPosPixel() + aPt );
814         aGrpAnimation.SetPosPixel( aGrpAnimation.GetPosPixel() + aPt );
815 
816         // Zoom fuer DisplayWin berechnen und setzen
817         Fraction aFrac( GetScale() );
818         aCtlDisplay.SetScale( aFrac );
819 
820         aBtnFirst.Show();
821         aBtnReverse.Show();
822         aBtnStop.Show();
823         aBtnPlay.Show();
824         aBtnLast.Show();
825         aNumFldBitmap.Show();
826         aTimeField.Show();
827         aLbLoopCount.Show();
828         aFtCount.Show();
829         aFiCount.Show();
830         aFtAdjustment.Show();
831         aLbAdjustment.Show();
832         aBtnGetOneObject.Show();
833         aBtnGetAllObjects.Show();
834         aBtnRemoveBitmap.Show();
835         aBtnRemoveAll.Show();
836         aGrpBitmap.Show();
837         aRbtGroup.Show();
838         aRbtBitmap.Show();
839         aFtAdjustment.Show();
840         aLbAdjustment.Show();
841         aBtnCreateGroup.Show();
842         aGrpAnimation.Show();
843 
844         aSize = aWinSize;
845 
846         //aFltWinSize = GetSizePixel();
847     }
848     SfxDockingWindow::Resize();
849 }
850 
851 // -----------------------------------------------------------------------
852 
853 sal_Bool AnimationWindow::Close()
854 {
855     if( maPlayLock.isLocked() )
856     {
857         return sal_False;
858     }
859     else
860     {
861         SfxBoolItem aItem( SID_ANIMATION_OBJECTS, sal_False );
862 
863         GetBindings().GetDispatcher()->Execute(
864             SID_ANIMATION_OBJECTS, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
865 
866         SfxDockingWindow::Close();
867 
868         return sal_True;
869     }
870 }
871 
872 // -----------------------------------------------------------------------
873 
874 void AnimationWindow::FillInfo( SfxChildWinInfo& rInfo ) const
875 {
876     SfxDockingWindow::FillInfo( rInfo ) ;
877 }
878 
879 // -----------------------------------------------------------------------
880 
881 void AnimationWindow::AddObj (::sd::View& rView )
882 {
883     // Texteingabemodus beenden, damit Bitmap mit
884     // Objekt identisch ist.
885     if( rView.IsTextEdit() )
886         rView.SdrEndTextEdit();
887 
888     // Objekt(e) clonen und den/die Clone(s) in die Liste stellen
889     const SdrMarkList& rMarkList   = rView.GetMarkedObjectList();
890     sal_uLong              nMarkCount  = rMarkList.GetMarkCount();
891     SdPage*            pPage       = pMyDoc->GetSdPage(0, PK_STANDARD);
892     sal_uLong              nCloneCount = pPage->GetObjCount();
893 
894     if (nMarkCount > 0)
895     {
896         // Wenn es sich um EIN Animationsobjekt oder ein Gruppenobjekt
897         // handelt, das 'einzeln uebernommen' wurde,
898         // werden die einzelnen Objekte eingefuegt
899         sal_Bool bAnimObj = sal_False;
900         if( nMarkCount == 1 )
901         {
902             SdrMark*            pMark = rMarkList.GetMark(0);
903             SdrObject*          pObject = pMark->GetMarkedSdrObj();
904             SdAnimationInfo*    pAnimInfo = rView.GetDoc()->GetAnimationInfo( pObject );
905             sal_uInt32              nInv = pObject->GetObjInventor();
906             sal_uInt16              nId = pObject->GetObjIdentifier();
907 
908             // Animated Bitmap (GIF)
909             if( nInv == SdrInventor && nId == OBJ_GRAF && ( (SdrGrafObj*) pObject )->IsAnimated() )
910             {
911                 const SdrGrafObj*   pGrafObj = (SdrGrafObj*) pObject;
912                 Graphic             aGraphic( pGrafObj->GetTransformedGraphic() );
913                 sal_uInt16              nCount = 0;
914 
915                 if( aGraphic.IsAnimated() )
916                     nCount = aGraphic.GetAnimation().Count();
917 
918                 if( nCount > 0 )
919                 {
920                     const Animation aAnimation( aGraphic.GetAnimation() );
921 
922                     for( sal_uInt16 i = 0; i < nCount; i++ )
923                     {
924                         const AnimationBitmap& rAnimBmp = aAnimation.Get( i );
925 
926                         pBitmapEx = new BitmapEx( rAnimBmp.aBmpEx );
927                         aBmpExList.Insert( pBitmapEx, aBmpExList.GetCurPos() + 1 );
928 
929                         // LoopCount
930                         if( i == 0 )
931                         {
932                             long nLoopCount = aAnimation.GetLoopCount();
933 
934                             if( !nLoopCount ) // unendlich
935                                 aLbLoopCount.SelectEntryPos( aLbLoopCount.GetEntryCount() - 1);
936                             else
937                                 aLbLoopCount.SelectEntry( UniString::CreateFromInt32( nLoopCount ) );
938                         }
939 
940                         // Time
941                         long nTime = rAnimBmp.nWait;
942                         Time* pTime = new Time( 0, 0, nTime / 100, nTime % 100 );
943                         aTimeList.Insert( pTime, aBmpExList.GetCurPos() + 1 );
944 
945                         // Weiterschalten der BitmapListe
946                         aBmpExList.Next();
947                     }
948                     // Nachdem ein animated GIF uebernommen wurde, kann auch nur ein solches erstellt werden
949                     aRbtBitmap.Check();
950                     aRbtGroup.Enable( sal_False );
951                     bAnimObj = sal_True;
952                 }
953             }
954             else if( bAllObjects || ( pAnimInfo && pAnimInfo->mbIsMovie ) )
955             {
956                 // Mehrere Objekte
957                 SdrObjList* pObjList = ((SdrObjGroup*)pObject)->GetSubList();
958 
959                 for( sal_uInt16 nObject = 0; nObject < pObjList->GetObjCount(); nObject++ )
960                 {
961                     SdrObject* pSnapShot = (SdrObject*) pObjList->GetObj( (sal_uLong) nObject );
962 
963                     pBitmapEx = new BitmapEx( SdrExchangeView::GetObjGraphic( pSnapShot->GetModel(), pSnapShot ).GetBitmapEx() );
964                     aBmpExList.Insert( pBitmapEx, aBmpExList.GetCurPos() + 1 );
965 
966                     // Time
967                     Time* pTime = new Time( aTimeField.GetTime() );
968                     aTimeList.Insert( pTime, aBmpExList.GetCurPos() + 1 );
969 
970                     // Clone
971                     pPage->InsertObject( pSnapShot->Clone(), aBmpExList.GetCurPos() + 1 );
972 
973                     // Weiterschalten der BitmapListe
974                     aBmpExList.Next();
975                 }
976                 bAnimObj = sal_True;
977             }
978         }
979         // Auch ein einzelnes animiertes Objekt
980         if( !bAnimObj && !( bAllObjects && nMarkCount > 1 ) )
981         {
982             pBitmapEx = new BitmapEx( rView.GetAllMarkedGraphic().GetBitmapEx() );
983             aBmpExList.Insert( pBitmapEx, aBmpExList.GetCurPos() + 1 );
984 
985             // Time
986             Time* pTime = new Time( aTimeField.GetTime() );
987             aTimeList.Insert( pTime, aBmpExList.GetCurPos() + 1 );
988 
989         }
990 
991         // ein einzelnes Objekt
992         if( nMarkCount == 1 && !bAnimObj )
993         {
994             SdrMark*    pMark   = rMarkList.GetMark(0);
995             SdrObject*  pObject = pMark->GetMarkedSdrObj();
996             SdrObject*  pClone  = pObject->Clone();
997             pPage->InsertObject(pClone, aBmpExList.GetCurPos() + 1);
998         }
999         // mehrere Objekte: die Clones zu einer Gruppe zusammenfassen
1000         else if (nMarkCount > 1)
1001         {
1002             // Objekte einzeln uebernehmen
1003             if( bAllObjects )
1004             {
1005                 for( sal_uLong nObject= 0; nObject < nMarkCount; nObject++ )
1006                 {
1007                     // Clone
1008                     SdrObject* pObject = rMarkList.GetMark( nObject )->GetMarkedSdrObj();
1009 
1010                     pBitmapEx = new BitmapEx( SdrExchangeView::GetObjGraphic( pObject->GetModel(), pObject ).GetBitmapEx() );
1011                     aBmpExList.Insert( pBitmapEx, aBmpExList.GetCurPos() + 1 );
1012 
1013                     // Time
1014                     Time* pTime = new Time( aTimeField.GetTime() );
1015                     aTimeList.Insert( pTime, aBmpExList.GetCurPos() + 1 );
1016 
1017                     pPage->InsertObject( pObject->Clone(), aBmpExList.GetCurPos() + 1 );
1018 
1019                     aBmpExList.Next();
1020                 }
1021                 bAnimObj = sal_True; // damit nicht nochmal weitergeschaltet wird
1022             }
1023             else
1024             {
1025                 SdrObjGroup* pCloneGroup = new SdrObjGroup;
1026                 SdrObjList*  pObjList    = pCloneGroup->GetSubList();
1027 
1028                 for (sal_uLong nObject= 0; nObject < nMarkCount; nObject++)
1029                     pObjList->InsertObject(rMarkList.GetMark(nObject)->GetMarkedSdrObj()->Clone(), LIST_APPEND);
1030 
1031                 pPage->InsertObject(pCloneGroup, aBmpExList.GetCurPos() + 1);
1032             }
1033         }
1034 
1035         if( !bAnimObj )
1036             aBmpExList.Next();
1037 
1038         // wenn vorher nichts im Animator war und jetzt was da ist, kann eine
1039         // Animationsgruppe erstellt werden
1040         if (nCloneCount == 0 && aBmpExList.Count() > 0)
1041             aBtnCreateGroup.Enable();
1042 
1043         // Zoom fuer DisplayWin berechnen und setzen
1044         Fraction aFrac( GetScale() );
1045         aCtlDisplay.SetScale( aFrac );
1046 
1047         UpdateControl( aBmpExList.GetCurPos() );
1048     }
1049 }
1050 
1051 // -----------------------------------------------------------------------
1052 
1053 void AnimationWindow::CreateAnimObj (::sd::View& rView )
1054 {
1055     ::Window* pOutWin = static_cast< ::Window*>(rView.GetFirstOutputDevice()); // GetWin( 0 );
1056     DBG_ASSERT( pOutWin, "Window ist nicht vorhanden!" );
1057 
1058     // die Fentermitte ermitteln
1059     const MapMode       aMap100( MAP_100TH_MM );
1060     Size                aMaxSizeLog;
1061     Size                aMaxSizePix;
1062     Size                aTemp( pOutWin->GetOutputSizePixel() );
1063     const Point         aWindowCenter( pOutWin->PixelToLogic( Point( aTemp.Width() >> 1, aTemp.Height() >> 1 ) ) );
1064     const OutputDevice* pDefDev = Application::GetDefaultDevice();
1065     const sal_uLong         nCount = aBmpExList.Count();
1066     BitmapAdjustment    eBA = (BitmapAdjustment) aLbAdjustment.GetSelectEntryPos();
1067     sal_uLong               i;
1068 
1069     // Groesste Bitmap ermitteln
1070     for( i = 0; i < nCount; i++ )
1071     {
1072         const BitmapEx& rBmpEx = *static_cast< BitmapEx* >( aBmpExList.GetObject( i ) );
1073         const Graphic   aGraphic( rBmpEx );
1074         Size            aTmpSizeLog;
1075         const Size      aTmpSizePix( rBmpEx.GetSizePixel() );
1076 
1077         if ( aGraphic.GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
1078             aTmpSizeLog = pDefDev->PixelToLogic( aGraphic.GetPrefSize(), aMap100 );
1079         else
1080             aTmpSizeLog = pDefDev->LogicToLogic( aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), aMap100 );
1081 
1082         aMaxSizeLog.Width() = Max( aMaxSizeLog.Width(), aTmpSizeLog.Width() );
1083         aMaxSizeLog.Height() = Max( aMaxSizeLog.Height(), aTmpSizeLog.Height() );
1084 
1085         aMaxSizePix.Width() = Max( aMaxSizePix.Width(), aTmpSizePix.Width() );
1086         aMaxSizePix.Height() = Max( aMaxSizePix.Height(), aTmpSizePix.Height() );
1087     }
1088 
1089     SdrPageView* pPV = rView.GetSdrPageView();
1090 
1091     if( aRbtBitmap.IsChecked() )
1092     {
1093         // Bitmapgruppe erzeugen (Animated GIF)
1094         Animation   aAnimation;
1095         Point       aPt;
1096 
1097         for( i = 0; i < nCount; i++ )
1098         {
1099             Time* pTime = static_cast< Time* >( aTimeList.GetObject( i ) );
1100             long  nTime = pTime->Get100Sec();
1101             nTime += pTime->GetSec() * 100;
1102 
1103             pBitmapEx = static_cast< BitmapEx* >( aBmpExList.GetObject( i ) );
1104 
1105             // Offset fuer die gewuenschte Ausrichtung bestimmen
1106             const Size aBitmapSize( pBitmapEx->GetSizePixel() );
1107 
1108             switch( eBA )
1109             {
1110                 case BA_LEFT_UP:
1111                 break;
1112 
1113                 case BA_LEFT:
1114                     aPt.Y() = (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1;
1115                 break;
1116 
1117                 case BA_LEFT_DOWN:
1118                     aPt.Y() = aMaxSizePix.Height() - aBitmapSize.Height();
1119                 break;
1120 
1121                 case BA_UP:
1122                     aPt.X() = (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1;
1123                 break;
1124 
1125                 case BA_CENTER:
1126                     aPt.X()  = (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1;
1127                     aPt.Y() = (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1;
1128                 break;
1129 
1130                 case BA_DOWN:
1131                     aPt.X()  = (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1;
1132                     aPt.Y() = aMaxSizePix.Height() - aBitmapSize.Height();
1133                 break;
1134 
1135                 case BA_RIGHT_UP:
1136                     aPt.X() = aMaxSizePix.Width() - aBitmapSize.Width();
1137                 break;
1138 
1139                 case BA_RIGHT:
1140                     aPt.X()  = aMaxSizePix.Width() - aBitmapSize.Width();
1141                     aPt.Y() = (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1;
1142                 break;
1143 
1144                 case BA_RIGHT_DOWN:
1145                     aPt.X()  = aMaxSizePix.Width() - aBitmapSize.Width();
1146                     aPt.Y() = aMaxSizePix.Height() - aBitmapSize.Height();
1147                 break;
1148 
1149             }
1150 
1151             // LoopCount (Anzahl der Durchlaeufe) ermitteln
1152             AnimationBitmap aAnimBmp;
1153             long            nLoopCount = 0L;
1154             sal_uInt16          nPos = aLbLoopCount.GetSelectEntryPos();
1155 
1156             if( nPos != LISTBOX_ENTRY_NOTFOUND && nPos != aLbLoopCount.GetEntryCount() - 1 ) // unendlich
1157                 nLoopCount = (long) aLbLoopCount.GetSelectEntry().ToInt32();
1158 
1159             aAnimBmp.aBmpEx = *pBitmapEx;
1160             aAnimBmp.aPosPix = aPt;
1161             aAnimBmp.aSizePix = aBitmapSize;
1162             aAnimBmp.nWait = nTime;
1163             aAnimBmp.eDisposal = DISPOSE_BACK;
1164             aAnimBmp.bUserInput = sal_False;
1165 
1166             aAnimation.Insert( aAnimBmp );
1167             aAnimation.SetDisplaySizePixel( aMaxSizePix );
1168             aAnimation.SetLoopCount( nLoopCount );
1169         }
1170 
1171         SdrGrafObj* pGrafObj = new SdrGrafObj( Graphic( aAnimation ) );
1172         const Point aOrg( aWindowCenter.X() - ( aMaxSizeLog.Width() >> 1 ), aWindowCenter.Y() - ( aMaxSizeLog.Height() >> 1 ) );
1173 
1174         pGrafObj->SetLogicRect( Rectangle( aOrg, aMaxSizeLog ) );
1175         rView.InsertObjectAtView( pGrafObj, *pPV, SDRINSERT_SETDEFLAYER);
1176     }
1177     else
1178     {
1179         // Offset fuer die gewuenschte Ausrichtung bestimmen
1180         Size aOffset;
1181         SdrObject * pClone = NULL;
1182         SdPage* pPage = pMyDoc->GetSdPage(0, PK_STANDARD);
1183 
1184         for(i = 0; i < nCount; i++)
1185         {
1186             pClone = pPage->GetObj(i);
1187             Rectangle aRect( pClone->GetSnapRect() );
1188 
1189             switch( eBA )
1190             {
1191                 case BA_LEFT_UP:
1192                 break;
1193 
1194                 case BA_LEFT:
1195                     aOffset.Height() = (aMaxSizeLog.Height() - aRect.GetHeight()) / 2;
1196                 break;
1197 
1198                 case BA_LEFT_DOWN:
1199                     aOffset.Height() = aMaxSizeLog.Height() - aRect.GetHeight();
1200                 break;
1201 
1202                 case BA_UP:
1203                     aOffset.Width() = (aMaxSizeLog.Width() - aRect.GetWidth()) / 2;
1204                 break;
1205 
1206                 case BA_CENTER:
1207                     aOffset.Width()  = (aMaxSizeLog.Width() - aRect.GetWidth()) / 2;
1208                     aOffset.Height() = (aMaxSizeLog.Height() - aRect.GetHeight()) / 2;
1209                 break;
1210 
1211                 case BA_DOWN:
1212                     aOffset.Width()  = (aMaxSizeLog.Width() - aRect.GetWidth()) / 2;
1213                     aOffset.Height() = aMaxSizeLog.Height() - aRect.GetHeight();
1214                 break;
1215 
1216                 case BA_RIGHT_UP:
1217                     aOffset.Width() = aMaxSizeLog.Width() - aRect.GetWidth();
1218                 break;
1219 
1220                 case BA_RIGHT:
1221                     aOffset.Width()  = aMaxSizeLog.Width() - aRect.GetWidth();
1222                     aOffset.Height() = (aMaxSizeLog.Height() - aRect.GetHeight()) / 2;
1223                 break;
1224 
1225                 case BA_RIGHT_DOWN:
1226                     aOffset.Width()  = aMaxSizeLog.Width() - aRect.GetWidth();
1227                     aOffset.Height() = aMaxSizeLog.Height() - aRect.GetHeight();
1228                 break;
1229 
1230             }
1231             //aRect.SetPos(aWindowCenter + Point(aOffset.Width(), aOffset.Height()));
1232             //pClone->SetSnapRect( aRect );
1233             // SetSnapRect ist fuer Ellipsen leider nicht implementiert !!!
1234             Point aMovePt( aWindowCenter + Point( aOffset.Width(), aOffset.Height() ) - aRect.TopLeft() );
1235             Size aMoveSize( aMovePt.X(), aMovePt.Y() );
1236             pClone->NbcMove( aMoveSize );
1237         }
1238 
1239         // Animationsgruppe erzeugen
1240         SdrObjGroup* pGroup   = new SdrObjGroup;
1241         SdrObjList*  pObjList = pGroup->GetSubList();
1242 
1243         for (i = 0; i < nCount; i++)
1244         {
1245             // der Clone verbleibt im Animator; in die Gruppe kommt ein Clone
1246             // des Clones
1247             pClone = pPage->GetObj(i);
1248             SdrObject* pCloneOfClone = pClone->Clone();
1249             //SdrObject* pCloneOfClone = pPage->GetObj(i)->Clone();
1250             pObjList->InsertObject(pCloneOfClone, LIST_APPEND);
1251         }
1252 
1253         // bis jetzt liegt die linke obere Ecke der Gruppe in der Fenstermitte;
1254         // jetzt noch um die Haelfte der Groesse nach oben und links korrigieren
1255         aTemp = aMaxSizeLog;
1256         aTemp.Height() = - aTemp.Height() / 2;
1257         aTemp.Width()  = - aTemp.Width() / 2;
1258         pGroup->NbcMove(aTemp);
1259 
1260         // Animationsinformation erzeugen
1261         SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pGroup,true);
1262         pInfo->meEffect = presentation::AnimationEffect_NONE;
1263         pInfo->meSpeed = presentation::AnimationSpeed_MEDIUM;
1264         pInfo->mbActive = sal_True;
1265         pInfo->mbIsMovie = sal_True;
1266         pInfo->maBlueScreen = COL_WHITE;
1267 
1268         rView.InsertObjectAtView( pGroup, *pPV, SDRINSERT_SETDEFLAYER);
1269     }
1270 
1271     ClickFirstHdl( this );
1272 }
1273 
1274 void AnimationWindow::DataChanged( const DataChangedEvent& rDCEvt )
1275 {
1276     SfxDockingWindow::DataChanged( rDCEvt );
1277 
1278     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1279     {
1280         UpdateControl( aBmpExList.GetCurPos() );
1281     }
1282 }
1283 
1284 /*************************************************************************
1285 |*
1286 |* ControllerItem fuer Animator
1287 |*
1288 \************************************************************************/
1289 
1290 AnimationControllerItem::AnimationControllerItem(
1291     sal_uInt16 _nId,
1292     AnimationWindow* pAnimWin,
1293     SfxBindings*    _pBindings)
1294     : SfxControllerItem( _nId, *_pBindings ),
1295       pAnimationWin( pAnimWin )
1296 {
1297 }
1298 
1299 // -----------------------------------------------------------------------
1300 
1301 void AnimationControllerItem::StateChanged( sal_uInt16 nSId,
1302                         SfxItemState eState, const SfxPoolItem* pItem )
1303 {
1304     if( eState >= SFX_ITEM_AVAILABLE && nSId == SID_ANIMATOR_STATE )
1305     {
1306         const SfxUInt16Item* pStateItem = PTR_CAST( SfxUInt16Item, pItem );
1307         DBG_ASSERT( pStateItem, "SfxUInt16Item erwartet");
1308         sal_uInt16 nState = pStateItem->GetValue();
1309 
1310         pAnimationWin->aBtnGetOneObject.Enable( nState & 1 );
1311         pAnimationWin->aBtnGetAllObjects.Enable( nState & 2 );
1312     }
1313 }
1314 
1315 
1316 } // end of namespace sd
1317