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