1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 #include <com/sun/star/presentation/EffectNodeType.hpp>
27 #include <com/sun/star/animations/Timing.hpp>
28 #include <com/sun/star/animations/Event.hpp>
29 #include <com/sun/star/animations/EventTrigger.hpp>
30 #include <com/sun/star/animations/AnimationFill.hpp>
31 #include <com/sun/star/presentation/TextAnimationType.hpp>
32 #include <com/sun/star/animations/ValuePair.hpp>
33 #include <com/sun/star/awt/FontSlant.hpp>
34 #include <com/sun/star/awt/FontWeight.hpp>
35 #include <com/sun/star/awt/FontUnderline.hpp>
36 #include <com/sun/star/drawing/XDrawPage.hpp>
37 #include <com/sun/star/beans/XPropertySet.hpp>
38 #include <com/sun/star/media/XManager.hpp>
39 #include <com/sun/star/media/XPlayer.hpp>
40 
41 #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
42 #include <boost/shared_ptr.hpp>
43 #endif
44 
45 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
46 #include <comphelper/processfactory.hxx>
47 #endif
48 #include <unotools/pathoptions.hxx>
49 #include <vcl/tabctrl.hxx>
50 #include <vcl/tabpage.hxx>
51 #include <vcl/menubtn.hxx>
52 #include <vcl/svapp.hxx>
53 #include <vcl/fixed.hxx>
54 #include <vcl/lstbox.hxx>
55 #include <vcl/field.hxx>
56 #include <vcl/msgbox.hxx>
57 #include <vcl/decoview.hxx>
58 #include <vcl/combobox.hxx>
59 #include <vcl/menu.hxx>
60 #include <svtools/ctrlbox.hxx>
61 #include <svtools/ctrltool.hxx>
62 #include <sfx2/objsh.hxx>
63 
64 #ifndef _SVX_SVXIDS_HRC
65 #include <svx/svxids.hrc>
66 #endif
67 #include <svx/dialmgr.hxx>
68 #include <editeng/flstitem.hxx>
69 #include <svx/drawitem.hxx>
70 
71 #include <svx/xtable.hxx>
72 #include <svx/gallery.hxx>
73 
74 #ifndef _SVX_DIALOGS_HRC
75 #include <svx/dialogs.hrc>
76 #endif
77 #include "sdresid.hxx"
78 
79 #include "glob.hrc"
80 #include "CustomAnimationDialog.hxx"
81 #ifndef _SD_CUSTOMANIMATIONDIALOG_HRC
82 #include "CustomAnimationDialog.hrc"
83 #endif
84 #ifndef _SD_CUSTOMANIMATION_HRC
85 #include "CustomAnimation.hrc"
86 #endif
87 #include "STLPropertySet.hxx"
88 
89 #include <avmedia/mediawindow.hxx>
90 
91 #include "filedlg.hxx"
92 #include "strings.hrc"
93 #include "helpids.h"
94 
95 using namespace ::com::sun::star;
96 using namespace ::com::sun::star::animations;
97 using namespace ::com::sun::star::presentation;
98 
99 using ::rtl::OUString;
100 using ::com::sun::star::uno::UNO_QUERY;
101 using ::com::sun::star::uno::UNO_QUERY_THROW;
102 using ::com::sun::star::uno::Any;
103 using ::com::sun::star::uno::makeAny;
104 using ::com::sun::star::uno::Sequence;
105 using ::com::sun::star::uno::Reference;
106 using ::com::sun::star::uno::Exception;
107 using ::com::sun::star::drawing::XShape;
108 using ::com::sun::star::drawing::XDrawPage;
109 using ::com::sun::star::beans::XPropertySet;
110 
111 namespace sd {
112 
113 extern void fillRepeatComboBox( ComboBox* pBox );
114 extern void fillDurationComboBox( ComboBox* pBox );
115 extern OUString getShapeDescription( const Reference< XShape >& xShape, bool bWithText = true );
116 extern OUString getPropertyName( sal_Int32 nPropertyType );
117 
118 // ====================================================================
119 
120 class PresetPropertyBox  : public PropertySubControl
121 {
122 public:
123 	PresetPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const OUString& aPresetId, const Link& rModifyHdl );
124 	~PresetPropertyBox();
125 
126 	virtual Any getValue();
127 	virtual void setValue( const Any& rValue, const OUString& rPresetId );
128 	virtual Control* getControl();
129 
130 private:
131 	std::map< sal_uInt16, rtl::OUString > maPropertyValues;
132 	ListBox* mpControl;
133 };
134 
135 // --------------------------------------------------------------------
136 
137 PresetPropertyBox::PresetPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const OUString& aPresetId, const Link& rModifyHdl )
138 : PropertySubControl( nControlType )
139 {
140 	mpControl = new ListBox( pParent, WB_BORDER|WB_TABSTOP|WB_DROPDOWN );
141 	mpControl->SetDropDownLineCount( 10 );
142 	mpControl->SetSelectHdl( rModifyHdl );
143 	mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_PRESETPROPERTYBOX );
144 
145 	setValue( rValue, aPresetId );
146 
147 }
148 
149 void PresetPropertyBox::setValue( const Any& rValue, const OUString& rPresetId )
150 {
151 	if( mpControl )
152 	{
153 		mpControl->Clear();
154 
155 		const CustomAnimationPresets& rPresets = CustomAnimationPresets::getCustomAnimationPresets();
156 		CustomAnimationPresetPtr pDescriptor = rPresets.getEffectDescriptor( rPresetId );
157 		if( pDescriptor.get() )
158 		{
159 
160 			OUString aPropertyValue;
161 			rValue >>= aPropertyValue;
162 
163 			UStringList aSubTypes( pDescriptor->getSubTypes() );
164 			UStringList::iterator aIter( aSubTypes.begin() );
165 			const UStringList::iterator aEnd( aSubTypes.end() );
166 
167 			mpControl->Enable( aIter != aEnd );
168 
169 			while( aIter != aEnd )
170 			{
171 				sal_uInt16 nPos = mpControl->InsertEntry( rPresets.getUINameForProperty( (*aIter) ) );
172 				if( (*aIter) == aPropertyValue )
173 					mpControl->SelectEntryPos( nPos );
174 				maPropertyValues[nPos] = (*aIter++);
175 			}
176 		}
177 		else
178 		{
179 			mpControl->Enable( sal_False );
180 		}
181 	}
182 }
183 
184 // --------------------------------------------------------------------
185 
186 PresetPropertyBox::~PresetPropertyBox()
187 {
188 	delete mpControl;
189 }
190 
191 // --------------------------------------------------------------------
192 
193 Any PresetPropertyBox::getValue()
194 {
195 	return makeAny( maPropertyValues[mpControl->GetSelectEntryPos()] );
196 }
197 
198 // --------------------------------------------------------------------
199 
200 Control* PresetPropertyBox::getControl()
201 {
202 	return mpControl;
203 }
204 
205 // ====================================================================
206 
207 class ColorPropertyBox  : public PropertySubControl
208 {
209 public:
210 	ColorPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl );
211 	~ColorPropertyBox();
212 
213 	virtual Any getValue();
214 	virtual void setValue( const Any& rValue, const OUString& rPresetId  );
215 	virtual Control* getControl();
216 
217 private:
218 	ColorListBox* mpControl;
219 };
220 
221 // --------------------------------------------------------------------
222 
223 ColorPropertyBox::ColorPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl )
224 : PropertySubControl( nControlType )
225 {
226 	mpControl = new ColorListBox( pParent, WB_BORDER|WB_TABSTOP|WB_DROPDOWN );
227 	mpControl->SetDropDownLineCount( 10 );
228 	mpControl->SetSelectHdl( rModifyHdl );
229 	mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_COLORPROPERTYBOX );
230 
231 	SfxObjectShell* pDocSh = SfxObjectShell::Current();
232 	DBG_ASSERT( pDocSh, "DocShell not found!" );
233 	XColorTable* pColorTable = NULL;
234 	bool bKillTable = false;
235 	const SfxPoolItem* pItem = NULL;
236 
237 	if ( pDocSh && ( ( pItem = pDocSh->GetItem( SID_COLOR_TABLE ) ) != 0) )
238 		pColorTable = ( (SvxColorTableItem*)pItem )->GetColorTable();
239 
240 	if ( !pColorTable )
241 	{
242 		pColorTable = new XColorTable( SvtPathOptions().GetPalettePath() );
243 		bKillTable = sal_True;
244 	}
245 
246 	sal_Int32 nColor = 0;
247 	rValue >>= nColor;
248 
249 	for ( long i = 0; i < pColorTable->Count(); i++ )
250 	{
251 		XColorEntry* pEntry = pColorTable->GetColor(i);
252 		sal_uInt16 nPos = mpControl->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
253 		if( pEntry->GetColor().GetRGBColor() == (sal_uInt32)nColor )
254 			mpControl->SelectEntryPos( nPos );
255 	}
256 
257 	if ( bKillTable )
258 		delete pColorTable;
259 }
260 
261 // --------------------------------------------------------------------
262 
263 ColorPropertyBox::~ColorPropertyBox()
264 {
265 	delete mpControl;
266 }
267 
268 // --------------------------------------------------------------------
269 
270 void ColorPropertyBox::setValue( const Any& rValue, const OUString& )
271 {
272 	if( mpControl )
273 	{
274 		sal_Int32 nColor = 0;
275 		rValue >>= nColor;
276 
277 		mpControl->SetNoSelection();
278 		mpControl->SelectEntryPos( mpControl->GetEntryPos( (Color)nColor ) );
279 	}
280 }
281 
282 // --------------------------------------------------------------------
283 
284 Any ColorPropertyBox::getValue()
285 {
286 	return makeAny( (sal_Int32)mpControl->GetSelectEntryColor().GetRGBColor() );
287 }
288 
289 // --------------------------------------------------------------------
290 
291 Control* ColorPropertyBox::getControl()
292 {
293 	return mpControl;
294 }
295 
296 // ====================================================================
297 
298 class FontPropertyBox : public PropertySubControl
299 {
300 public:
301 	FontPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl );
302 	virtual ~FontPropertyBox();
303 
304 	virtual Any getValue();
305 	virtual void setValue( const Any& rValue, const OUString& rPresetId  );
306 
307 	virtual Control* getControl();
308 
309 private:
310 	FontNameBox* mpControl;
311 };
312 
313 // --------------------------------------------------------------------
314 
315 FontPropertyBox::FontPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl )
316 : PropertySubControl( nControlType )
317 {
318 	mpControl = new FontNameBox( pParent, WB_BORDER|WB_TABSTOP|WB_DROPDOWN );
319 	mpControl->SetDropDownLineCount( 10 );
320 	mpControl->SetSelectHdl( rModifyHdl );
321 	mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_FONTPROPERTYBOX );
322 
323 	SfxObjectShell* pDocSh = SfxObjectShell::Current();
324 	const SfxPoolItem* pItem;
325 
326 	const FontList* pFontList = 0;
327 	bool bMustDelete = false;
328 
329     if ( pDocSh && ( (pItem = pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST ) ) != 0) )
330         pFontList = ( (SvxFontListItem*)pItem )->GetFontList();
331 
332 	if(!pFontList)
333 	{
334         pFontList = new FontList( Application::GetDefaultDevice(), NULL, sal_False );
335 		bMustDelete = true;
336 	}
337 
338 	mpControl->Fill( pFontList );
339 
340 	if( bMustDelete )
341 		delete pFontList;
342 
343 	OUString aPresetId;
344 	setValue( rValue, aPresetId );
345 }
346 
347 // --------------------------------------------------------------------
348 
349 void FontPropertyBox::setValue( const Any& rValue, const OUString& )
350 {
351 	if( mpControl )
352 	{
353 		OUString aFontName;
354 		rValue >>= aFontName;
355 		mpControl->SetText( aFontName );
356 	}
357 }
358 
359 // --------------------------------------------------------------------
360 
361 FontPropertyBox::~FontPropertyBox()
362 {
363 	delete mpControl;
364 }
365 
366 // --------------------------------------------------------------------
367 
368 Any FontPropertyBox::getValue()
369 {
370 	OUString aFontName( mpControl->GetText() );
371 	return makeAny( aFontName );
372 }
373 
374 // --------------------------------------------------------------------
375 
376 Control* FontPropertyBox::getControl()
377 {
378 	return mpControl;
379 }
380 
381 // ====================================================================
382 
383 class DropdownMenuBox : public Edit
384 {
385 public:
386 	DropdownMenuBox( Window* pParent, Edit* pSubControl, PopupMenu* pMenu );
387 	~DropdownMenuBox();
388 
389 	void Resize();
390 	long PreNotify( NotifyEvent& rNEvt );
391 
392 	void SetMenuSelectHdl( const Link& rLink ) { mpDropdownButton->SetSelectHdl( rLink ); }
393 
394 private:
395 	Edit* mpSubControl;
396 	MenuButton* mpDropdownButton;
397 	PopupMenu* mpMenu;
398 };
399 
400 // --------------------------------------------------------------------
401 
402 DropdownMenuBox::DropdownMenuBox( Window* pParent, Edit* pSubControl, PopupMenu* pMenu )
403 :	Edit( pParent, WB_BORDER|WB_TABSTOP| WB_DIALOGCONTROL ),
404 	mpSubControl(pSubControl),mpDropdownButton(0),mpMenu(pMenu)
405 {
406 	mpDropdownButton = new MenuButton( this, WB_NOLIGHTBORDER | WB_RECTSTYLE | WB_NOTABSTOP);
407 	mpDropdownButton->SetSymbol(SYMBOL_SPIN_DOWN);
408 	mpDropdownButton->Show();
409 	mpDropdownButton->SetPopupMenu( pMenu );
410 
411 	SetSubEdit( mpSubControl );
412 	mpSubControl->SetParent( this );
413 	mpSubControl->Show();
414 }
415 
416 // --------------------------------------------------------------------
417 
418 DropdownMenuBox::~DropdownMenuBox()
419 {
420 	SetSubEdit( 0 );
421 	delete mpSubControl;
422 	delete mpDropdownButton;
423 	delete mpMenu;
424 }
425 
426 // --------------------------------------------------------------------
427 
428 void DropdownMenuBox::Resize()
429 {
430 	Size aOutSz = GetOutputSizePixel();
431 
432 	long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize();
433 	nSBWidth = CalcZoom( nSBWidth );
434 	mpSubControl->SetPosSizePixel( 0, 1, aOutSz.Width() - nSBWidth, aOutSz.Height()-2 );
435 	mpDropdownButton->SetPosSizePixel( aOutSz.Width() - nSBWidth, 0, nSBWidth, aOutSz.Height() );
436 }
437 
438 // --------------------------------------------------------------------
439 
440 long DropdownMenuBox::PreNotify( NotifyEvent& rNEvt )
441 {
442 	long nResult=sal_True;
443 
444 	sal_uInt16 nSwitch=rNEvt.GetType();
445 	if (nSwitch==EVENT_KEYINPUT)
446 	{
447 		const KeyCode& aKeyCode=rNEvt.GetKeyEvent()->GetKeyCode();
448 		sal_uInt16 nKey=aKeyCode.GetCode();
449 
450 		if (nKey==KEY_DOWN && aKeyCode.IsMod2())
451 		{
452 			mpDropdownButton->KeyInput( *rNEvt.GetKeyEvent() );
453 		}
454 		else
455 		{
456 			nResult=Edit::PreNotify(rNEvt);
457 		}
458 	}
459 	else
460 		nResult=Edit::PreNotify(rNEvt);
461 
462 	return nResult;
463 }
464 
465 // --------------------------------------------------------------------
466 
467 class CharHeightPropertyBox : public PropertySubControl
468 {
469 public:
470 	CharHeightPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl );
471 	virtual ~CharHeightPropertyBox();
472 
473 	virtual Any getValue();
474 	virtual void setValue( const Any& rValue, const OUString& );
475 
476 	virtual Control* getControl();
477 
478 	DECL_LINK( implMenuSelectHdl, MenuButton* );
479 
480 private:
481 	DropdownMenuBox* mpControl;
482 	PopupMenu* mpMenu;
483 	MetricField* mpMetric;
484 };
485 
486 // --------------------------------------------------------------------
487 
488 CharHeightPropertyBox::CharHeightPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl )
489 : PropertySubControl( nControlType )
490 {
491 	mpMetric = new MetricField( pParent, WB_TABSTOP|WB_IGNORETAB| WB_NOBORDER);
492 	mpMetric->SetUnit( FUNIT_PERCENT );
493 	mpMetric->SetMin( 0 );
494 	mpMetric->SetMax( 1000 );
495 
496 	mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_FONTSIZE_POPUP ) );
497 	mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu );
498 	mpControl->SetMenuSelectHdl( LINK( this, CharHeightPropertyBox, implMenuSelectHdl ));
499 	mpControl->SetModifyHdl( rModifyHdl );
500 	mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX );
501 
502 	OUString aPresetId;
503 	setValue( rValue, aPresetId );
504 }
505 
506 // --------------------------------------------------------------------
507 
508 CharHeightPropertyBox::~CharHeightPropertyBox()
509 {
510 	delete mpControl;
511 }
512 
513 // --------------------------------------------------------------------
514 
515 IMPL_LINK( CharHeightPropertyBox, implMenuSelectHdl, MenuButton*, pPb )
516 {
517 	long nValue = 100;
518 	switch( pPb->GetCurItemId() )
519 	{
520 	case CM_SIZE_25: nValue = 25; break;
521 	case CM_SIZE_50: nValue = 50; break;
522 	case CM_SIZE_150: nValue = 150; break;
523 	case CM_SIZE_400: nValue = 400; break;
524 	}
525 	mpMetric->SetValue( nValue );
526 	mpMetric->Modify();
527 	return 0;
528 }
529 
530 // --------------------------------------------------------------------
531 
532 void CharHeightPropertyBox::setValue( const Any& rValue, const OUString& )
533 {
534 	if( mpMetric )
535 	{
536 		double fValue = 0.0;
537 		rValue >>= fValue;
538 		mpMetric->SetValue( (long)(fValue * 100.0) );
539 	}
540 }
541 
542 // --------------------------------------------------------------------
543 
544 Any CharHeightPropertyBox::getValue()
545 {
546 	return makeAny( (double)((double)mpMetric->GetValue() / 100.0) );
547 }
548 
549 // --------------------------------------------------------------------
550 
551 Control* CharHeightPropertyBox::getControl()
552 {
553 	return mpControl;
554 }
555 
556 // ====================================================================
557 
558 class TransparencyPropertyBox : public PropertySubControl
559 {
560 public:
561 	TransparencyPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl );
562 	~TransparencyPropertyBox();
563 
564 	virtual Any getValue();
565 	virtual void setValue( const Any& rValue, const OUString& rPresetId  );
566 
567 	virtual Control* getControl();
568 
569 	DECL_LINK( implMenuSelectHdl, MenuButton* );
570 	DECL_LINK( implModifyHdl, Control* );
571 
572 	void updateMenu();
573 
574 private:
575 	DropdownMenuBox* mpControl;
576 	PopupMenu* mpMenu;
577 	MetricField* mpMetric;
578 	Link maModifyHdl;
579 };
580 
581 // --------------------------------------------------------------------
582 
583 TransparencyPropertyBox::TransparencyPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl )
584 : PropertySubControl( nControlType )
585 , maModifyHdl( rModifyHdl )
586 {
587 	mpMetric = new MetricField( pParent ,WB_TABSTOP|WB_IGNORETAB| WB_NOBORDER);
588 	mpMetric->SetUnit( FUNIT_PERCENT );
589 	mpMetric->SetMin( 0 );
590 	mpMetric->SetMax( 100 );
591 
592 	mpMenu = new PopupMenu();
593 	for( sal_uInt16 i = 25; i < 101; i += 25 )
594 	{
595 		String aStr( String::CreateFromInt32( i ) );
596 		aStr += sal_Unicode('%');
597 		mpMenu->InsertItem( i, aStr );
598 	}
599 
600 	mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu );
601 	mpControl->SetMenuSelectHdl( LINK( this, TransparencyPropertyBox, implMenuSelectHdl ));
602 	mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX );
603 
604 	Link aLink( LINK( this, TransparencyPropertyBox, implModifyHdl ) );
605 	mpControl->SetModifyHdl( aLink );
606 
607 	OUString aPresetId;
608 	setValue( rValue, aPresetId  );
609 }
610 
611 // --------------------------------------------------------------------
612 
613 TransparencyPropertyBox::~TransparencyPropertyBox()
614 {
615 	delete mpControl;
616 }
617 
618 // --------------------------------------------------------------------
619 
620 void TransparencyPropertyBox::updateMenu()
621 {
622 	sal_Int64 nValue = mpMetric->GetValue();
623 	for( sal_uInt16 i = 25; i < 101; i += 25 )
624 		mpMenu->CheckItem( i, nValue == i );
625 }
626 
627 // --------------------------------------------------------------------
628 
629 IMPL_LINK( TransparencyPropertyBox, implModifyHdl, Control*, EMPTYARG )
630 {
631 	updateMenu();
632 	maModifyHdl.Call(mpMetric);
633 
634 	return 0;
635 }
636 
637 // --------------------------------------------------------------------
638 
639 IMPL_LINK( TransparencyPropertyBox, implMenuSelectHdl, MenuButton*, pPb )
640 {
641 	if( pPb->GetCurItemId() != mpMetric->GetValue() )
642 	{
643 		mpMetric->SetValue( pPb->GetCurItemId() );
644 		mpMetric->Modify();
645 	}
646 
647 	return 0;
648 }
649 
650 // --------------------------------------------------------------------
651 
652 void TransparencyPropertyBox::setValue( const Any& rValue, const OUString& )
653 {
654 	if( mpMetric )
655 	{
656 		double fValue = 0.0;
657 		rValue >>= fValue;
658 		long nValue = (long)(fValue * 100);
659 		mpMetric->SetValue( nValue );
660 		updateMenu();
661 	}
662 }
663 
664 // --------------------------------------------------------------------
665 
666 Any TransparencyPropertyBox::getValue()
667 {
668 	return makeAny( (double)((double)mpMetric->GetValue()) / 100.0 );
669 }
670 
671 // --------------------------------------------------------------------
672 
673 Control* TransparencyPropertyBox::getControl()
674 {
675 	return mpControl;
676 }
677 
678 // --------------------------------------------------------------------
679 
680 class RotationPropertyBox : public PropertySubControl
681 {
682 public:
683 	RotationPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl );
684 	~RotationPropertyBox();
685 
686 	virtual Any getValue();
687 	virtual void setValue( const Any& rValue, const OUString& );
688 
689 	virtual Control* getControl();
690 
691 	DECL_LINK( implMenuSelectHdl, MenuButton* );
692 	DECL_LINK( implModifyHdl, Control* );
693 
694 	void updateMenu();
695 
696 private:
697 	DropdownMenuBox* mpControl;
698 	PopupMenu* mpMenu;
699 	MetricField* mpMetric;
700 	Link maModifyHdl;
701 };
702 
703 // --------------------------------------------------------------------
704 
705 RotationPropertyBox::RotationPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl )
706 : PropertySubControl( nControlType )
707 , maModifyHdl( rModifyHdl )
708 {
709 	mpMetric = new MetricField( pParent ,WB_TABSTOP|WB_IGNORETAB| WB_NOBORDER);
710 	mpMetric->SetUnit( FUNIT_CUSTOM );
711 	mpMetric->SetCustomUnitText( OUString( sal_Unicode(0xb0)) ); // degree sign
712 	mpMetric->SetMin( -10000 );
713 	mpMetric->SetMax( 10000 );
714 
715 	mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_ROTATION_POPUP ) );
716 	mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu );
717 	mpControl->SetMenuSelectHdl( LINK( this, RotationPropertyBox, implMenuSelectHdl ));
718 	mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX );
719 
720 	Link aLink( LINK( this, RotationPropertyBox, implModifyHdl ) );
721 	mpControl->SetModifyHdl( aLink );
722 
723 	OUString aPresetId;
724 	setValue( rValue, aPresetId );
725 }
726 
727 // --------------------------------------------------------------------
728 
729 RotationPropertyBox::~RotationPropertyBox()
730 {
731 	delete mpControl;
732 }
733 
734 // --------------------------------------------------------------------
735 
736 void RotationPropertyBox::updateMenu()
737 {
738 	sal_Int64 nValue = mpMetric->GetValue();
739 	bool bDirection = nValue >= 0;
740 	nValue = (nValue < 0 ? -nValue : nValue);
741 
742 	mpMenu->CheckItem( CM_QUARTER_SPIN, nValue == 90 );
743 	mpMenu->CheckItem( CM_HALF_SPIN, nValue == 180 );
744 	mpMenu->CheckItem( CM_FULL_SPIN, nValue == 360 );
745 	mpMenu->CheckItem( CM_TWO_SPINS, nValue == 720 );
746 
747 	mpMenu->CheckItem( CM_CLOCKWISE, bDirection );
748 	mpMenu->CheckItem( CM_COUNTERCLOCKWISE, !bDirection );
749 }
750 
751 // --------------------------------------------------------------------
752 
753 IMPL_LINK( RotationPropertyBox, implModifyHdl, Control*, EMPTYARG )
754 {
755 	updateMenu();
756 	maModifyHdl.Call(mpMetric);
757 
758 	return 0;
759 }
760 
761 IMPL_LINK( RotationPropertyBox, implMenuSelectHdl, MenuButton*, pPb )
762 {
763 	sal_Int64 nValue = mpMetric->GetValue();
764 	bool bDirection = nValue >= 0;
765 	nValue = (nValue < 0 ? -nValue : nValue);
766 
767 	switch( pPb->GetCurItemId() )
768 	{
769 	case CM_QUARTER_SPIN: nValue = 90; break;
770 	case CM_HALF_SPIN: nValue = 180; break;
771 	case CM_FULL_SPIN: nValue = 360; break;
772 	case CM_TWO_SPINS: nValue = 720; break;
773 
774 	case CM_CLOCKWISE: bDirection = true; break;
775 	case CM_COUNTERCLOCKWISE: bDirection = false; break;
776 
777 	}
778 
779 	if( !bDirection )
780 		nValue = -nValue;
781 
782 	if( nValue != mpMetric->GetValue() )
783 	{
784 		mpMetric->SetValue( nValue );
785 		mpMetric->Modify();
786 	}
787 
788 	return 0;
789 }
790 
791 // --------------------------------------------------------------------
792 
793 void RotationPropertyBox::setValue( const Any& rValue, const OUString& )
794 {
795 	if( mpMetric )
796 	{
797 		double fValue = 0.0;
798 		rValue >>= fValue;
799 		long nValue = (long)(fValue);
800 		mpMetric->SetValue( nValue );
801 		updateMenu();
802 	}
803 }
804 
805 // --------------------------------------------------------------------
806 
807 Any RotationPropertyBox::getValue()
808 {
809 	return makeAny( (double)((double)mpMetric->GetValue()) );
810 }
811 
812 // --------------------------------------------------------------------
813 
814 Control* RotationPropertyBox::getControl()
815 {
816 	return mpControl;
817 }
818 
819 // --------------------------------------------------------------------
820 
821 class ScalePropertyBox : public PropertySubControl
822 {
823 public:
824 	ScalePropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl );
825 	~ScalePropertyBox();
826 
827 	virtual Any getValue();
828 	virtual void setValue( const Any& rValue, const OUString& );
829 
830 	virtual Control* getControl();
831 
832 	DECL_LINK( implMenuSelectHdl, MenuButton* );
833 	DECL_LINK( implModifyHdl, Control* );
834 
835 	void updateMenu();
836 
837 private:
838 	DropdownMenuBox* mpControl;
839 	PopupMenu* mpMenu;
840 	MetricField* mpMetric;
841 	Link maModifyHdl;
842 	int mnDirection;
843 };
844 
845 // --------------------------------------------------------------------
846 
847 ScalePropertyBox::ScalePropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl )
848 : PropertySubControl( nControlType )
849 , maModifyHdl( rModifyHdl )
850 {
851 	mpMetric = new MetricField( pParent ,WB_TABSTOP|WB_IGNORETAB| WB_NOBORDER);
852 	mpMetric->SetUnit( FUNIT_PERCENT );
853 	mpMetric->SetMin( 0 );
854 	mpMetric->SetMax( 10000 );
855 
856 	mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_SCALE_POPUP ) );
857 	mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu );
858 	mpControl->SetMenuSelectHdl( LINK( this, ScalePropertyBox, implMenuSelectHdl ));
859 	mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX );
860 
861 	Link aLink( LINK( this, ScalePropertyBox, implModifyHdl ) );
862 	mpControl->SetModifyHdl( aLink );
863 
864 	OUString aPresetId;
865 	setValue( rValue, aPresetId );
866 }
867 
868 // --------------------------------------------------------------------
869 
870 ScalePropertyBox::~ScalePropertyBox()
871 {
872 	delete mpControl;
873 }
874 
875 // --------------------------------------------------------------------
876 
877 void ScalePropertyBox::updateMenu()
878 {
879 	sal_Int64 nValue = mpMetric->GetValue();
880 
881 	mpMenu->CheckItem( 25, nValue == 25 );
882 	mpMenu->CheckItem( 50, nValue == 50 );
883 	mpMenu->CheckItem( 150, nValue == 150 );
884 	mpMenu->CheckItem( 400, nValue == 400 );
885 
886 	mpMenu->CheckItem( CM_HORIZONTAL, mnDirection == 1 );
887 	mpMenu->CheckItem( CM_VERTICAL, mnDirection == 2 );
888 	mpMenu->CheckItem( CM_BOTH, mnDirection == 3 );
889 }
890 
891 // --------------------------------------------------------------------
892 
893 IMPL_LINK( ScalePropertyBox, implModifyHdl, Control*, EMPTYARG )
894 {
895 	updateMenu();
896 	maModifyHdl.Call(mpMetric);
897 
898 	return 0;
899 }
900 
901 IMPL_LINK( ScalePropertyBox, implMenuSelectHdl, MenuButton*, pPb )
902 {
903 	sal_Int64 nValue = mpMetric->GetValue();
904 
905 	int nDirection = mnDirection;
906 
907 	switch( pPb->GetCurItemId() )
908 	{
909 	case CM_HORIZONTAL: nDirection = 1; break;
910 	case CM_VERTICAL: nDirection = 2; break;
911 	case CM_BOTH: nDirection = 3; break;
912 
913 	default:
914 		nValue = pPb->GetCurItemId();
915 	}
916 
917 	bool bModified = false;
918 
919 	if( nDirection != mnDirection )
920 	{
921 		mnDirection = nDirection;
922 		bModified = true;
923 	}
924 
925 	if( nValue != mpMetric->GetValue() )
926 	{
927 		mpMetric->SetValue( nValue );
928 		bModified = true;
929 	}
930 
931 	if( bModified )
932 	{
933 		mpMetric->Modify();
934 		updateMenu();
935 	}
936 
937 	return 0;
938 }
939 
940 // --------------------------------------------------------------------
941 
942 void ScalePropertyBox::setValue( const Any& rValue, const OUString& )
943 {
944 	if( mpMetric )
945 	{
946 		ValuePair aValues;
947 		rValue >>= aValues;
948 
949 		double fValue1 = 0.0;
950 		double fValue2 = 0.0;
951 
952 		aValues.First >>= fValue1;
953 		aValues.Second >>= fValue2;
954 
955 		if( fValue2 == 0.0 )
956 			mnDirection = 1;
957 		else if( fValue1 == 0.0 )
958 			mnDirection = 2;
959 		else
960 			mnDirection = 3;
961 
962 		long nValue;
963 		if( fValue1 )
964 			nValue = (long)(fValue1 * 100.0);
965 		else
966 			nValue = (long)(fValue2 * 100.0);
967 		mpMetric->SetValue( nValue );
968 		updateMenu();
969 	}
970 }
971 
972 // --------------------------------------------------------------------
973 
974 Any ScalePropertyBox::getValue()
975 {
976 	double fValue1 = (double)((double)mpMetric->GetValue() / 100.0);
977 	double fValue2 = fValue1;
978 
979 	if( mnDirection == 1 )
980 		fValue2 = 0.0;
981 	else if( mnDirection == 2 )
982 		fValue1 = 0.0;
983 
984 	ValuePair aValues;
985 	aValues.First <<= fValue1;
986 	aValues.Second <<= fValue2;
987 
988 	return makeAny( aValues );
989 }
990 
991 // --------------------------------------------------------------------
992 
993 Control* ScalePropertyBox::getControl()
994 {
995 	return mpControl;
996 }
997 
998 // ====================================================================
999 
1000 class FontStylePropertyBox : public PropertySubControl
1001 {
1002 public:
1003 	FontStylePropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl );
1004 	~FontStylePropertyBox();
1005 
1006 	virtual Any getValue();
1007 	virtual void setValue( const Any& rValue, const OUString& );
1008 
1009 	virtual Control* getControl();
1010 
1011 	DECL_LINK( implMenuSelectHdl, MenuButton* );
1012 
1013 	void update();
1014 
1015 private:
1016 	DropdownMenuBox* mpControl;
1017 	PopupMenu* mpMenu;
1018 	Edit* mpEdit;
1019 	Link maModifyHdl;
1020 
1021 	float mfFontWeight;
1022 	awt::FontSlant meFontSlant;
1023 	sal_Int16 mnFontUnderline;
1024 };
1025 
1026 // --------------------------------------------------------------------
1027 
1028 FontStylePropertyBox::FontStylePropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl )
1029 : PropertySubControl( nControlType )
1030 , maModifyHdl( rModifyHdl )
1031 {
1032 	mpEdit = new Edit( pParent, WB_TABSTOP|WB_IGNORETAB|WB_NOBORDER|WB_READONLY);
1033 	mpEdit->SetText( String( SdResId( STR_CUSTOMANIMATION_SAMPLE ) ) );
1034 
1035 	mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_FONTSTYLE_POPUP ) );
1036 	mpControl = new DropdownMenuBox( pParent, mpEdit, mpMenu );
1037 	mpControl->SetMenuSelectHdl( LINK( this, FontStylePropertyBox, implMenuSelectHdl ));
1038 	mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX );
1039 
1040 	OUString aPresetId;
1041 	setValue( rValue, aPresetId );
1042 }
1043 
1044 // --------------------------------------------------------------------
1045 
1046 FontStylePropertyBox::~FontStylePropertyBox()
1047 {
1048 	delete mpControl;
1049 }
1050 
1051 // --------------------------------------------------------------------
1052 
1053 void FontStylePropertyBox::update()
1054 {
1055 	// update menu
1056 	mpMenu->CheckItem( CM_BOLD, mfFontWeight == awt::FontWeight::BOLD );
1057 	mpMenu->CheckItem( CM_ITALIC, meFontSlant == awt::FontSlant_ITALIC);
1058 	mpMenu->CheckItem( CM_UNDERLINED, mnFontUnderline != awt::FontUnderline::NONE );
1059 
1060 	// update sample edit
1061 	Font aFont( mpEdit->GetFont() );
1062 	aFont.SetWeight( mfFontWeight == awt::FontWeight::BOLD ? WEIGHT_BOLD : WEIGHT_NORMAL );
1063 	aFont.SetItalic( meFontSlant == awt::FontSlant_ITALIC ? ITALIC_NORMAL : ITALIC_NONE  );
1064 	aFont.SetUnderline( mnFontUnderline == awt::FontUnderline::NONE ? UNDERLINE_NONE : UNDERLINE_SINGLE );
1065 	mpEdit->SetFont( aFont );
1066 	mpEdit->Invalidate();
1067 }
1068 
1069 // --------------------------------------------------------------------
1070 
1071 IMPL_LINK( FontStylePropertyBox, implMenuSelectHdl, MenuButton*, pPb )
1072 {
1073 	switch( pPb->GetCurItemId() )
1074 	{
1075 	case CM_BOLD:
1076 		if( mfFontWeight == awt::FontWeight::BOLD )
1077 			mfFontWeight = awt::FontWeight::NORMAL;
1078 		else
1079 			mfFontWeight = awt::FontWeight::BOLD;
1080 		break;
1081 	case CM_ITALIC:
1082 		if( meFontSlant == awt::FontSlant_ITALIC )
1083 			meFontSlant = awt::FontSlant_NONE;
1084 		else
1085 			meFontSlant = awt::FontSlant_ITALIC;
1086 		break;
1087 	case CM_UNDERLINED:
1088 		if( mnFontUnderline == awt::FontUnderline::SINGLE )
1089 			mnFontUnderline = awt::FontUnderline::NONE;
1090 		else
1091 			mnFontUnderline = awt::FontUnderline::SINGLE;
1092 		break;
1093 	default:
1094 		return 0;
1095 	}
1096 
1097 	update();
1098 	maModifyHdl.Call(mpEdit);
1099 
1100 	return 0;
1101 }
1102 
1103 // --------------------------------------------------------------------
1104 
1105 void FontStylePropertyBox::setValue( const Any& rValue, const OUString& )
1106 {
1107 	Sequence<Any> aValues;
1108 	rValue >>= aValues;
1109 
1110 	aValues[0] >>= mfFontWeight;
1111 	aValues[1] >>= meFontSlant;
1112 	aValues[2] >>= mnFontUnderline;
1113 
1114 	update();
1115 }
1116 
1117 // --------------------------------------------------------------------
1118 
1119 Any FontStylePropertyBox::getValue()
1120 {
1121 	Sequence<Any> aValues(3);
1122 	aValues[0] <<= mfFontWeight;
1123 	aValues[1] <<= meFontSlant;
1124 	aValues[2] <<= mnFontUnderline;
1125 	return makeAny( aValues );
1126 }
1127 
1128 // --------------------------------------------------------------------
1129 
1130 Control* FontStylePropertyBox::getControl()
1131 {
1132 	return mpControl;
1133 }
1134 
1135 // ====================================================================
1136 
1137 class CustomAnimationEffectTabPage : public TabPage
1138 {
1139 public:
1140 	CustomAnimationEffectTabPage( Window* pParent, const ResId& rResId, const STLPropertySet* pSet );
1141 	~CustomAnimationEffectTabPage();
1142 
1143 	void update( STLPropertySet* pSet );
1144 	DECL_LINK( implSelectHdl, Control* );
1145 
1146 private:
1147 	void updateControlStates();
1148 	void fillSoundListBox();
1149 	void clearSoundListBox();
1150 	sal_Int32 getSoundObject( const String& rStr );
1151 	void openSoundFileDialog();
1152 	void onSoundPreview();
1153 
1154 private:
1155 	List maSoundList;
1156 	sal_Bool mbHasText;
1157 	const STLPropertySet* mpSet;
1158 
1159 	FixedLine*		mpFLSettings;
1160 	FixedText*		mpFTProperty1;
1161 	PropertyControl* mpLBProperty1;
1162 	FixedText*		mpFTProperty2;
1163 	PropertyControl* mpLBProperty2;
1164 	CheckBox*		mpCBSmoothStart;
1165 	CheckBox*		mpCBSmoothEnd;
1166 	CheckBox*		mpCBAutoRestart;
1167 
1168 	FixedLine*		mpFLPlay;
1169 	RadioButton*	mpRBFromStart;
1170 	RadioButton*	mpRBFromLast;
1171 	RadioButton*	mpRBFromTime;
1172 	MetricField*	mpMFStartTime;
1173 	FixedLine*		mpFLStop;
1174 	RadioButton*	mpRBStopOnClick;
1175 	RadioButton*	mpRBStopOnNextSlide;
1176 	RadioButton*	mpRBStopAfterSlides;
1177 	MetricField*	mpMFStopAfterSlides;
1178 
1179 	FixedLine*		mpFLEnhancements;
1180 	FixedText*		mpFTSound;
1181 	ListBox*		mpLBSound;
1182 	PushButton*		mpPBSoundPreview;
1183 	FixedText*		mpFTAfterEffect;
1184 	ListBox*		mpLBAfterEffect;
1185 	FixedText*		mpFTDimColor;
1186 	ColorListBox*	mpCLBDimColor;
1187 	FixedText*		mpFTTextAnim;
1188 	ListBox*		mpLBTextAnim;
1189 	MetricField*	mpMFTextDelay;
1190 	FixedText*		mpFTTextDelay;
1191 
1192 	::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > mxPlayer;
1193 };
1194 
1195 
1196 static void move_down( Control* pControl, int nOffsetX, int nOffsetY )
1197 {
1198 	Point aPos( pControl->GetPosPixel() );
1199 	aPos.X() += nOffsetX;
1200 	aPos.Y() += nOffsetY;
1201 	pControl->SetPosPixel( aPos );
1202 }
1203 
1204 CustomAnimationEffectTabPage::CustomAnimationEffectTabPage( Window* pParent, const ResId& rResId, const STLPropertySet* pSet )
1205 : TabPage( pParent, rResId ), mbHasText( sal_False ), mpSet(pSet )
1206 {
1207 	mpFLSettings = new FixedLine( this, SdResId( FL_SETTINGS ) );
1208 	mpFTProperty1 = new FixedText( this, SdResId( FT_PROPERTY_1 ) );
1209 	mpLBProperty1 = new PropertyControl( this, SdResId( LB_PROPERTY_1 ) );
1210 	mpFTProperty2 = new FixedText( this, SdResId( FT_PROPERTY_2 ) );
1211 	mpLBProperty2 = new PropertyControl( this, SdResId( LB_PROPERTY_2 ) );
1212 	mpCBSmoothStart = new CheckBox( this, SdResId( CB_SMOOTH_START ) );
1213 	mpCBSmoothEnd = new CheckBox( this, SdResId( CB_SMOOTH_END ) );
1214 	mpCBAutoRestart = new CheckBox( this, SdResId( CB_AUTORESTART ) );
1215 /*
1216 	mpFLPlay = new FixedLine( this, SdResId( FL_PLAY ) );
1217 	mpRBFromStart = new RadioButton( this, SdResId( RB_FROM_START ) );
1218 	mpRBFromLast = new RadioButton( this, SdResId( RB_FROM_LAST ) );
1219 	mpRBFromTime = new RadioButton( this, SdResId( RB_FROM_TIME ) );
1220 	mpMFStartTime = new MetricField( this, SdResId( MF_START_TIME ) );
1221 	mpFLStop = new FixedLine( this, SdResId( FL_STOP ) );
1222 	mpRBStopOnClick = new RadioButton( this, SdResId( RB_STOP_ON_CLICK ) );
1223 	mpRBStopOnNextSlide = new RadioButton( this, SdResId( RB_STOP_ON_NEXT_SLIDE ) );
1224 	mpRBStopAfterSlides = new RadioButton( this, SdResId( RB_STOP_AFTER_N_SLIDES ) );
1225 	mpMFStopAfterSlides = new MetricField( this, SdResId( MF_STOP_AFTER_SLIDES ) );
1226 */
1227 	mpFLEnhancements = new FixedLine( this, SdResId( FL_ENHANCEMENTS ) );
1228 	mpFTSound = new FixedText( this, SdResId( FT_SOUND ) );
1229 	mpLBSound = new ListBox( this, SdResId( LB_SOUND ) );
1230 	mpPBSoundPreview = new PushButton( this, SdResId( PB_SOUND_PREVIEW ) );
1231 	mpFTAfterEffect = new FixedText( this, SdResId( FT_AFTER_EFFECT ) );
1232 	mpLBAfterEffect = new ListBox( this, SdResId( LB_AFTER_EFFECT ) );
1233 	mpFTDimColor = new FixedText( this, SdResId( FT_DIMCOLOR ) );
1234 	mpCLBDimColor = new ColorListBox( this, SdResId( CLB_DIMCOLOR ) );
1235 	mpFTTextAnim = new FixedText( this, SdResId( FT_TEXT_ANIM ) );
1236 	mpLBTextAnim = new ListBox( this, SdResId( LB_TEXT_ANIM ) );
1237 	mpMFTextDelay = new MetricField( this, SdResId( MF_TEXT_DELAY ) );
1238 	mpFTTextDelay = new FixedText( this, SdResId( FT_TEXT_DELAY ) );
1239 
1240 	FreeResource();
1241 
1242 	// fill the soundbox
1243 	fillSoundListBox();
1244 
1245 	mpLBSound->SetSelectHdl( LINK( this, CustomAnimationEffectTabPage, implSelectHdl ) );
1246 
1247 	mpPBSoundPreview->SetClickHdl( LINK( this, CustomAnimationEffectTabPage, implSelectHdl ) );
1248 	mpPBSoundPreview->SetSymbol( SYMBOL_PLAY );
1249 
1250 	// fill the color box
1251 	SfxObjectShell* pDocSh = SfxObjectShell::Current();
1252 	DBG_ASSERT( pDocSh, "DocShell not found!" );
1253 	XColorTable* pColorTable = NULL;
1254 	bool bKillTable = false;
1255 	const SfxPoolItem* pItem = NULL;
1256 
1257 	if ( pDocSh && ( (pItem = pDocSh->GetItem( SID_COLOR_TABLE ) ) != 0 ) )
1258 		pColorTable = ( (SvxColorTableItem*)pItem )->GetColorTable();
1259 
1260 	if ( !pColorTable )
1261 	{
1262 		pColorTable = new XColorTable( SvtPathOptions().GetPalettePath() );
1263 		bKillTable = sal_True;
1264 	}
1265 
1266     mpCLBDimColor->SetUpdateMode( sal_False );
1267 
1268     for ( long i = 0; i < pColorTable->Count(); i++ )
1269 	{
1270 		XColorEntry* pEntry = pColorTable->GetColor(i);
1271         mpCLBDimColor->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1272 	}
1273 
1274     mpCLBDimColor->SetUpdateMode( sal_True );
1275 
1276 	if ( bKillTable )
1277 		delete pColorTable;
1278 
1279 	//
1280 	// init settings controls
1281 	//
1282 
1283 	int nOffsetY = 0;
1284 	int nOffsetX = 0;
1285 
1286 	Size aSpace( LogicToPixel( Size( 3, 3 ), MAP_APPFONT ) );
1287 
1288 	// only show settings if all selected effects have the same preset-id
1289 	if( pSet->getPropertyState( nHandlePresetId ) != STLPropertyState_AMBIGUOUS )
1290 	{
1291 		OUString aPresetId;
1292 		pSet->getPropertyValue( nHandlePresetId ) >>= aPresetId;
1293 
1294 		//
1295 		// property 1
1296 		//
1297 
1298 		if( pSet->getPropertyState( nHandleProperty1Type ) != STLPropertyState_AMBIGUOUS )
1299 		{
1300 			sal_Int32 nType = 0;
1301 			pSet->getPropertyValue( nHandleProperty1Type ) >>= nType;
1302 
1303 			if( nType != nPropertyTypeNone )
1304 			{
1305 				// set ui name for property at fixed text
1306 				OUString aPropertyName( getPropertyName( nType ) );
1307 
1308 				if( aPropertyName.getLength() )
1309 				{
1310 					mpFTProperty1->Show();
1311 					mpLBProperty1->Show();
1312 
1313 					nOffsetY += mpLBProperty1->GetSizePixel().Height() + aSpace.Height();
1314 
1315 					mpFTProperty1->SetText( aPropertyName );
1316 				}
1317 
1318 				// get property value
1319 				const Any aValue( pSet->getPropertyValue( nHandleProperty1Value ) );
1320 
1321 				Link aModifyLink;
1322 				// create property sub control
1323 				mpLBProperty1->setSubControl( PropertySubControl::create( nType, this, aValue, aPresetId, aModifyLink ));
1324 			}
1325 		}
1326 
1327 		mpFTProperty1->Enable( mpLBProperty1->IsEnabled() );
1328 
1329 		//
1330 		// accelerate & deccelerate
1331 		//
1332 
1333 		if( pSet->getPropertyState( nHandleAccelerate ) == STLPropertyState_DIRECT )
1334 		{
1335 			mpCBSmoothStart->Show();
1336 			mpCBSmoothEnd->Show();
1337 
1338 			move_down( mpCBSmoothStart, nOffsetX, nOffsetY );
1339 			move_down( mpCBSmoothEnd, nOffsetX, nOffsetY );
1340 
1341 			nOffsetY += mpCBSmoothStart->GetSizePixel().Height() + aSpace.Height();
1342 
1343 			double fTemp = 0.0;
1344 			pSet->getPropertyValue( nHandleAccelerate ) >>= fTemp;
1345 			mpCBSmoothStart->Check( fTemp > 0.0 );
1346 
1347 			pSet->getPropertyValue( nHandleDecelerate ) >>= fTemp;
1348 			mpCBSmoothEnd->Check( fTemp > 0.0 );
1349 		}
1350 
1351 		//
1352 		// auto reverse
1353 		//
1354 
1355 
1356 		if( nOffsetY )
1357 		{
1358 			nOffsetY += mpFLSettings->GetSizePixel().Height() + aSpace.Height();
1359 			mpFLSettings->Show();
1360 
1361 			mpFLEnhancements->Show();
1362 			move_down( mpFLEnhancements, nOffsetX, nOffsetY );
1363 
1364 			nOffsetY += mpFLEnhancements->GetSizePixel().Height() + aSpace.Height();
1365 
1366 			nOffsetX = 2* aSpace.Width();
1367 		}
1368 	}
1369 
1370 	if( (nOffsetY != 0) || (nOffsetX != 0) )
1371 	{
1372 		move_down( mpFTSound, nOffsetX, nOffsetY );
1373 		move_down( mpLBSound, nOffsetX, nOffsetY );
1374 		move_down( mpPBSoundPreview, nOffsetX, nOffsetY );
1375 		move_down( mpFTAfterEffect, nOffsetX, nOffsetY );
1376 		move_down( mpLBAfterEffect, nOffsetX, nOffsetY );
1377 		move_down( mpFTDimColor, nOffsetX, nOffsetY );
1378 		move_down( mpCLBDimColor, nOffsetX, nOffsetY );
1379 		move_down( mpFTTextAnim, nOffsetX, nOffsetY );
1380 		move_down( mpLBTextAnim, nOffsetX, nOffsetY );
1381 		move_down( mpMFTextDelay, nOffsetX, nOffsetY );
1382 		move_down( mpFTTextDelay, nOffsetX, nOffsetY );
1383 	}
1384 
1385 	//
1386 	// init after effect controls
1387 	//
1388 
1389     mpLBAfterEffect->SetSelectHdl( LINK( this, CustomAnimationEffectTabPage, implSelectHdl ) );
1390     mpLBTextAnim->SetSelectHdl( LINK( this, CustomAnimationEffectTabPage, implSelectHdl ) );
1391 
1392 	if( (pSet->getPropertyState( nHandleHasAfterEffect ) != STLPropertyState_AMBIGUOUS) &&
1393 		(pSet->getPropertyState( nHandleAfterEffectOnNextEffect ) != STLPropertyState_AMBIGUOUS) &&
1394 		(pSet->getPropertyState( nHandleDimColor ) != STLPropertyState_AMBIGUOUS))
1395 	{
1396 		sal_Bool bHasAfterEffect = sal_False;
1397 		pSet->getPropertyValue( nHandleHasAfterEffect ) >>= bHasAfterEffect;
1398 
1399 		sal_uInt16 nPos = 0;
1400 		if( bHasAfterEffect )
1401 		{
1402 			nPos++;
1403 
1404 			sal_Bool bAfterEffectOnNextClick = sal_False;
1405 			pSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bAfterEffectOnNextClick;
1406 			Any aDimColor( pSet->getPropertyValue( nHandleDimColor ) );
1407 
1408 			if( aDimColor.hasValue() )
1409 			{
1410 				sal_Int32 nColor = 0;
1411 				aDimColor >>= nColor;
1412 				Color aColor( nColor );
1413 	            sal_uInt16 nColorPos = mpCLBDimColor->GetEntryPos( aColor );
1414 				if ( LISTBOX_ENTRY_NOTFOUND != nColorPos )
1415 					mpCLBDimColor->SelectEntryPos( nColorPos );
1416 				else
1417                     mpCLBDimColor->SelectEntryPos(
1418                         mpCLBDimColor->InsertEntry( aColor, String( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) );
1419 			}
1420 			else
1421 			{
1422 				nPos++;
1423 				if( bAfterEffectOnNextClick )
1424 					nPos++;
1425 			}
1426 		}
1427 
1428 		mpLBAfterEffect->SelectEntryPos( nPos );
1429 	}
1430 
1431 	if( pSet->getPropertyState( nHandleHasText ) != STLPropertyState_AMBIGUOUS )
1432 		pSet->getPropertyValue( nHandleHasText ) >>= mbHasText;
1433 
1434 	if( mbHasText )
1435 	{
1436 		if( pSet->getPropertyState( nHandleIterateType ) != STLPropertyState_AMBIGUOUS)
1437 		{
1438 			sal_uInt16 nPos = LISTBOX_ENTRY_NOTFOUND;
1439 
1440 			sal_Int32 nIterateType = 0;
1441 			pSet->getPropertyValue( nHandleIterateType ) >>= nIterateType;
1442 			switch( nIterateType )
1443 			{
1444 			case TextAnimationType::BY_PARAGRAPH:	nPos = 0; break;
1445 			case TextAnimationType::BY_WORD:		nPos = 1; break;
1446 			case TextAnimationType::BY_LETTER:		nPos = 2; break;
1447 			}
1448 
1449 			mpLBTextAnim->SelectEntryPos( nPos );
1450 		}
1451 
1452 		if( pSet->getPropertyState( nHandleIterateInterval ) )
1453 		{
1454 			double fIterateInterval = 0.0;
1455 			pSet->getPropertyValue( nHandleIterateInterval ) >>= fIterateInterval;
1456 			mpMFTextDelay->SetValue( (long)(fIterateInterval*10) );
1457 		}
1458 	}
1459 	else
1460 	{
1461 		mpFTTextAnim->Enable( sal_False );
1462 		mpLBTextAnim->Enable( sal_False );
1463 		mpMFTextDelay->Enable( sal_False );
1464 		mpFTTextDelay->Enable( sal_False );
1465 
1466 	}
1467 
1468 	if( pSet->getPropertyState( nHandleSoundURL ) != STLPropertyState_AMBIGUOUS )
1469 	{
1470 		sal_uInt16 nPos = 0;
1471 
1472 		const Any aValue( pSet->getPropertyValue( nHandleSoundURL ) );
1473 
1474 		if( aValue.getValueType() == ::getCppuType((const sal_Bool*)0) )
1475 		{
1476 			nPos = 1;
1477 		}
1478 		else
1479 		{
1480 			OUString aSoundURL;
1481 			aValue >>= aSoundURL;
1482 
1483 			if( aSoundURL.getLength() )
1484 			{
1485 				const String aTmp( aSoundURL );
1486 
1487 				sal_uLong i;
1488 				for( i = 0; i < maSoundList.Count(); i++ )
1489 				{
1490 					String* pString = (String*)maSoundList.GetObject( i );
1491 					if( *pString == aTmp )
1492 					{
1493 						nPos = (sal_uInt16)i+2;
1494 						break;
1495 					}
1496 				}
1497 
1498 				if( nPos == 0 )
1499 				{
1500 					nPos = (sal_uInt16)maSoundList.Count()+2;
1501 					maSoundList.Insert( new String( aTmp ), LIST_APPEND );
1502 					INetURLObject aURL( aTmp );
1503 					nPos = mpLBSound->InsertEntry( aURL.GetBase(), nPos );
1504 				}
1505 			}
1506 		}
1507 
1508 		if( nPos != LISTBOX_ENTRY_NOTFOUND )
1509 			mpLBSound->SelectEntryPos( nPos );
1510 	}
1511 
1512 	updateControlStates();
1513 
1514 	Size aSize( GetSizePixel() );
1515 	aSize.Height() += mpMFTextDelay->GetPosPixel().X() + GetSizePixel().Height() + aSpace.Height();
1516 	SetSizePixel( aSize );
1517 }
1518 
1519 CustomAnimationEffectTabPage::~CustomAnimationEffectTabPage()
1520 {
1521 	clearSoundListBox();
1522 
1523 	delete mpFLSettings;
1524 	delete mpFTProperty1;
1525 	delete mpLBProperty1;
1526 	delete mpFTProperty2;
1527 	delete mpLBProperty2;
1528 	delete mpCBSmoothStart;
1529 	delete mpCBSmoothEnd;
1530 	delete mpCBAutoRestart;
1531 
1532 	delete mpFLEnhancements;
1533 	delete mpFTSound;
1534 	delete mpLBSound;
1535 	delete mpPBSoundPreview;
1536 	delete mpFTAfterEffect;
1537 	delete mpLBAfterEffect;
1538 	delete mpFTDimColor;
1539 	delete mpCLBDimColor;
1540 	delete mpFTTextAnim;
1541 	delete mpLBTextAnim;
1542 	delete mpMFTextDelay;
1543 	delete mpFTTextDelay;
1544 }
1545 
1546 void CustomAnimationEffectTabPage::updateControlStates()
1547 {
1548 	sal_uInt16 nPos = mpLBAfterEffect->GetSelectEntryPos();
1549 	mpCLBDimColor->Enable( nPos == 1 );
1550 	mpFTDimColor->Enable( nPos == 1 );
1551 
1552 	if( mbHasText )
1553 	{
1554 		nPos = mpLBTextAnim->GetSelectEntryPos();
1555 		mpMFTextDelay->Enable( nPos != 0 );
1556 		mpFTTextDelay->Enable( nPos != 0 );
1557 	}
1558 
1559 	nPos = mpLBSound->GetSelectEntryPos();
1560 	mpPBSoundPreview->Enable( nPos >= 2 );
1561 }
1562 
1563 IMPL_LINK( CustomAnimationEffectTabPage, implSelectHdl, Control*, pControl )
1564 {
1565 	if( pControl == mpLBAfterEffect )
1566 	{
1567 		sal_uInt16 nPos = static_cast<ListBox*>( mpLBAfterEffect )->GetSelectEntryPos();
1568 		if( nPos == 1 )
1569 		{
1570 			if( mpCLBDimColor->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND )
1571 				mpCLBDimColor->SelectEntryPos(0);
1572 		}
1573 	}
1574 	else if( pControl == mpLBTextAnim )
1575 	{
1576 		if( mpMFTextDelay->GetValue() == 0 )
1577 			mpMFTextDelay->SetValue( 100 );
1578 	}
1579 	else if( pControl == mpLBSound )
1580 	{
1581 		sal_uInt16 nPos = mpLBSound->GetSelectEntryPos();
1582 		if( nPos == (mpLBSound->GetEntryCount() - 1) )
1583 		{
1584 			openSoundFileDialog();
1585 		}
1586 	}
1587 	else if( pControl == mpPBSoundPreview )
1588 	{
1589 		onSoundPreview();
1590 	}
1591 
1592 	updateControlStates();
1593 	return 0;
1594 }
1595 
1596 void CustomAnimationEffectTabPage::update( STLPropertySet* pSet )
1597 {
1598 	if( mpLBProperty1->getSubControl() )
1599 	{
1600 		Any aNewValue( mpLBProperty1->getSubControl()->getValue() );
1601 		Any aOldValue;
1602 		if( mpSet->getPropertyState( nHandleProperty1Value ) != STLPropertyState_AMBIGUOUS)
1603 			aOldValue = mpSet->getPropertyValue( nHandleProperty1Value );
1604 
1605 		if( aOldValue != aNewValue )
1606 			pSet->setPropertyValue( nHandleProperty1Value, aNewValue );
1607 	}
1608 
1609 	if( mpLBProperty2->getSubControl() )
1610 	{
1611 		Any aNewValue( mpLBProperty2->getSubControl()->getValue() );
1612 		Any aOldValue;
1613 		if( mpSet->getPropertyState( nHandleProperty2Value ) != STLPropertyState_AMBIGUOUS)
1614 			aOldValue = mpSet->getPropertyValue( nHandleProperty2Value );
1615 
1616 		if( aOldValue != aNewValue )
1617 			pSet->setPropertyValue( nHandleProperty2Value, aNewValue );
1618 	}
1619 
1620 	if( mpCBSmoothStart->IsVisible() )
1621 	{
1622 		// set selected value for accelerate if different then in original set
1623 
1624 		double fTemp = mpCBSmoothStart->IsChecked() ? 0.5 : 0.0;
1625 
1626 		double fOldTemp = 0.0;
1627 		if(mpSet->getPropertyState( nHandleAccelerate ) != STLPropertyState_AMBIGUOUS)
1628 			mpSet->getPropertyValue( nHandleAccelerate ) >>= fOldTemp;
1629 		else
1630 			fOldTemp = -2.0;
1631 
1632 		if( fOldTemp != fTemp )
1633 			pSet->setPropertyValue( nHandleAccelerate, makeAny( fTemp ) );
1634 
1635 		// set selected value for decelerate if different then in original set
1636 		fTemp = mpCBSmoothEnd->IsChecked() ? 0.5 : 0.0;
1637 
1638 		if(mpSet->getPropertyState( nHandleDecelerate ) != STLPropertyState_AMBIGUOUS)
1639 			mpSet->getPropertyValue( nHandleDecelerate ) >>= fOldTemp;
1640 		else
1641 			fOldTemp = -2.0;
1642 
1643 		if( fOldTemp != fTemp )
1644 			pSet->setPropertyValue( nHandleDecelerate, makeAny( fTemp ) );
1645 	}
1646 
1647 	sal_uInt16 nPos = mpLBAfterEffect->GetSelectEntryPos();
1648 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
1649 	{
1650 		sal_Bool bAfterEffect = nPos != 0;
1651 
1652 		sal_Bool bOldAfterEffect = sal_False;
1653 
1654 		if(mpSet->getPropertyState( nHandleHasAfterEffect ) != STLPropertyState_AMBIGUOUS)
1655 			mpSet->getPropertyValue( nHandleHasAfterEffect ) >>= bOldAfterEffect;
1656 		else
1657 			bOldAfterEffect = !bAfterEffect;
1658 
1659 		if( bOldAfterEffect != bAfterEffect )
1660 			pSet->setPropertyValue( nHandleHasAfterEffect, makeAny( bAfterEffect ) );
1661 
1662 		Any aDimColor;
1663 		if( nPos == 1 )
1664 		{
1665 			Color aSelectedColor;
1666 			if ( mpCLBDimColor->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
1667 				aSelectedColor = mpCLBDimColor->GetSelectEntryColor();
1668 
1669 			aDimColor = makeAny( makeAny( (sal_Int32)aSelectedColor.GetRGBColor() ) );
1670 		}
1671 
1672 		if( (mpSet->getPropertyState( nHandleDimColor ) == STLPropertyState_AMBIGUOUS) ||
1673 			(mpSet->getPropertyValue( nHandleDimColor ) != aDimColor) )
1674 			pSet->setPropertyValue( nHandleDimColor, makeAny( aDimColor ) );
1675 
1676 		sal_Bool bAfterEffectOnNextEffect = nPos != 2 ? sal_True : sal_False;
1677 		sal_Bool bOldAfterEffectOnNextEffect = !bAfterEffectOnNextEffect;
1678 
1679 		if( mpSet->getPropertyState( nHandleAfterEffectOnNextEffect ) != STLPropertyState_AMBIGUOUS)
1680 			mpSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bOldAfterEffectOnNextEffect;
1681 
1682 		if( bAfterEffectOnNextEffect != bOldAfterEffectOnNextEffect )
1683 			pSet->setPropertyValue( nHandleAfterEffectOnNextEffect, makeAny( bAfterEffectOnNextEffect ) );
1684 	}
1685 
1686 	// ---
1687 
1688 	nPos = mpLBTextAnim->GetSelectEntryPos();
1689 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
1690 	{
1691 		sal_Int16 nIterateType;
1692 
1693 		switch( nPos )
1694 		{
1695 		case 1: nIterateType = TextAnimationType::BY_WORD; break;
1696 		case 2: nIterateType = TextAnimationType::BY_LETTER; break;
1697 		default:
1698 			nIterateType = TextAnimationType::BY_PARAGRAPH;
1699 		}
1700 
1701 		sal_Int16 nOldIterateType = nIterateType-1;
1702 
1703 		if(mpSet->getPropertyState( nHandleIterateType ) != STLPropertyState_AMBIGUOUS)
1704 			mpSet->getPropertyValue( nHandleIterateType ) >>= nOldIterateType;
1705 
1706 		if( nIterateType != nOldIterateType )
1707 			pSet->setPropertyValue( nHandleIterateType, makeAny( nIterateType ) );
1708 	}
1709 
1710 	// ---
1711 
1712 	{
1713 		double fIterateInterval = static_cast< double >( mpMFTextDelay->GetValue() ) / 10;
1714 		double fOldIterateInterval = -1.0;
1715 
1716 		if( mpSet->getPropertyState( nHandleIterateInterval ) != STLPropertyState_AMBIGUOUS )
1717 			mpSet->getPropertyValue( nHandleIterateInterval ) >>= fOldIterateInterval;
1718 
1719 		if( fIterateInterval != fOldIterateInterval )
1720 			pSet->setPropertyValue( nHandleIterateInterval, makeAny( fIterateInterval ) );
1721 	}
1722 
1723 	nPos = mpLBSound->GetSelectEntryPos();
1724 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
1725 	{
1726 		Any aNewSoundURL, aOldSoundURL( makeAny( (sal_Int32) 0 ) );
1727 
1728 		if( nPos == 0 )
1729 		{
1730 			// 0 means no sound, so leave any empty
1731 		}
1732 		else if( nPos == 1 )
1733 		{
1734 			// this means stop sound
1735 			aNewSoundURL = makeAny( (sal_Bool)sal_True );
1736 		}
1737 		else
1738 		{
1739 			OUString aSoundURL( *(String*)maSoundList.GetObject( nPos-2 ) );
1740 			aNewSoundURL = makeAny( aSoundURL );
1741 		}
1742 
1743 		if( mpSet->getPropertyState( nHandleSoundURL ) != STLPropertyState_AMBIGUOUS )
1744 			mpSet->getPropertyValue( nHandleSoundURL  ) >>= aOldSoundURL;
1745 
1746 		if( aNewSoundURL != aOldSoundURL )
1747 			pSet->setPropertyValue( nHandleSoundURL, aNewSoundURL );
1748 	}
1749 }
1750 
1751 void CustomAnimationEffectTabPage::fillSoundListBox()
1752 {
1753 	GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, maSoundList );
1754 	GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, maSoundList );
1755 
1756 	mpLBSound->InsertEntry( String( SdResId( STR_CUSTOMANIMATION_NO_SOUND ) ) );
1757 	mpLBSound->InsertEntry( String( SdResId( STR_CUSTOMANIMATION_STOP_PREVIOUS_SOUND ) ) );
1758 	for( sal_uLong i = 0; i < maSoundList.Count(); i++ )
1759 	{
1760 		String* pString = (String*)maSoundList.GetObject( i );
1761 		INetURLObject aURL( *pString );
1762 		mpLBSound->InsertEntry( aURL.GetBase() );
1763 	}
1764 	mpLBSound->InsertEntry( String( SdResId( STR_CUSTOMANIMATION_BROWSE_SOUND ) ) );
1765 }
1766 
1767 void CustomAnimationEffectTabPage::clearSoundListBox()
1768 {
1769 	const sal_uInt32 nCount = maSoundList.Count();
1770 	sal_uInt32 i;
1771 	for( i = 0; i < nCount; i++ )
1772 		delete (String*)maSoundList.GetObject( i );
1773 	maSoundList.Clear();
1774 
1775 	mpLBSound->Clear();
1776 }
1777 
1778 sal_Int32 CustomAnimationEffectTabPage::getSoundObject( const String& rStr )
1779 {
1780 	String aStrIn( rStr );
1781 	aStrIn.ToLowerAscii();
1782 
1783 	sal_uInt32 i;
1784 	const sal_uInt32 nCount = maSoundList.Count();
1785 	for( i = 0; i < nCount; i++ )
1786 	{
1787 		String aTmpStr( *(String*)maSoundList.GetObject( i ) );
1788 		aTmpStr.ToLowerAscii();
1789 
1790 		if( aTmpStr == aStrIn )
1791 			return i+2;
1792 	}
1793 
1794 	return -1;
1795 }
1796 
1797 void CustomAnimationEffectTabPage::openSoundFileDialog()
1798 {
1799 	SdOpenSoundFileDialog	aFileDialog;
1800 
1801 	String aFile( SvtPathOptions().GetGraphicPath() );
1802 	aFileDialog.SetPath( aFile );
1803 
1804 	bool bValidSoundFile = false;
1805 	bool bQuitLoop = false;
1806 	long nPos = 0;
1807 
1808 	while( !bQuitLoop && (aFileDialog.Execute() == ERRCODE_NONE) )
1809 	{
1810 		aFile = aFileDialog.GetPath();
1811 		nPos = getSoundObject( aFile );
1812 
1813 		if( nPos < 0 ) // not in Soundliste
1814 		{
1815 			// try to insert in Gallery
1816 			if( GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aFile, SGA_FORMAT_SOUND ) )
1817 			{
1818 				clearSoundListBox();
1819 				fillSoundListBox();
1820 
1821 				nPos = getSoundObject( aFile );
1822 				DBG_ASSERT( nPos >= 0, "sd::CustomAnimationEffectTabPage::openSoundFileDialog(), Recently inserted sound not in list!" );
1823 
1824 				bValidSoundFile=true;
1825 				bQuitLoop=true;
1826 			}
1827 			else
1828 			{
1829 				String aStrWarning(SdResId(STR_WARNING_NOSOUNDFILE));
1830 				String aStr; aStr += sal_Unicode('%');
1831 				aStrWarning.SearchAndReplace( aStr , aFile );
1832 				WarningBox aWarningBox( NULL, WB_3DLOOK | WB_RETRY_CANCEL, aStrWarning );
1833 				aWarningBox.SetModalInputMode (sal_True);
1834 				bQuitLoop = aWarningBox.Execute()==RET_RETRY ? sal_False : sal_True;
1835 
1836 				bValidSoundFile=false;
1837 			}
1838 		}
1839 		else
1840 		{
1841 			bValidSoundFile=true;
1842 			bQuitLoop=true;
1843 		}
1844 	}
1845 
1846 	if( !bValidSoundFile )
1847 		nPos = 0;
1848 
1849 	mpLBSound->SelectEntryPos( (sal_uInt16) nPos );
1850 }
1851 
1852 void CustomAnimationEffectTabPage::onSoundPreview()
1853 {
1854 	const sal_uInt16 nPos = mpLBSound->GetSelectEntryPos();
1855 
1856 	if( nPos >= 2 ) try
1857     {
1858 		const OUString aSoundURL( *(String*)maSoundList.GetObject( nPos-2 ) );
1859                 mxPlayer.set( avmedia::MediaWindow::createPlayer( aSoundURL ), uno::UNO_QUERY_THROW );
1860 		mxPlayer->start();
1861 	}
1862     catch( uno::Exception& e )
1863     {
1864 		(void)e;
1865         DBG_ERROR("CustomAnimationEffectTabPage::onSoundPreview(), exception caught!" );
1866     }
1867 }
1868 
1869 class CustomAnimationDurationTabPage : public TabPage
1870 {
1871 public:
1872 	CustomAnimationDurationTabPage( Window* pParent, const ResId& rResId, const STLPropertySet* pSet );
1873 	~CustomAnimationDurationTabPage();
1874 
1875 	void update( STLPropertySet* pSet );
1876 
1877 	DECL_LINK( implControlHdl, Control* );
1878 
1879 private:
1880 	const STLPropertySet* mpSet;
1881 
1882 	boost::shared_ptr< FixedText > mpFTStart;
1883 	boost::shared_ptr< ListBox > mpLBStart;
1884 	boost::shared_ptr< FixedText > mpFTStartDelay;
1885 	boost::shared_ptr< MetricField > mpMFStartDelay;
1886 	boost::shared_ptr< FixedText > mpFTDuration;
1887 	boost::shared_ptr< ComboBox > mpCBDuration;
1888 	boost::shared_ptr< FixedText > mpFTRepeat;
1889 	boost::shared_ptr< ComboBox > mpCBRepeat;
1890 	boost::shared_ptr< CheckBox > mpCBXRewind;
1891 	boost::shared_ptr< FixedLine > mpFLTrigger;
1892 	boost::shared_ptr< RadioButton > mpRBClickSequence;
1893 	boost::shared_ptr< RadioButton > mpRBInteractive;
1894 	boost::shared_ptr< ListBox > mpLBTrigger;
1895 };
1896 
1897 CustomAnimationDurationTabPage::CustomAnimationDurationTabPage(Window* pParent, const ResId& rResId, const STLPropertySet* pSet)
1898 : TabPage( pParent, rResId ), mpSet( pSet )
1899 {
1900 	mpFTStart.reset( new FixedText( this, SdResId( FT_START ) ) );
1901 	mpLBStart.reset( new ListBox( this, SdResId( LB_START ) ) );
1902 	mpFTStartDelay.reset( new FixedText( this, SdResId( FT_START_DELAY ) ) );
1903 	mpMFStartDelay.reset( new MetricField( this, SdResId( MF_START_DELAY ) ) );
1904 	mpFTDuration.reset( new FixedText( this, SdResId( FT_DURATION ) ) );
1905 	mpCBDuration.reset( new ComboBox( this, SdResId( CB_DURATION ) ) );
1906 	mpFTRepeat.reset( new FixedText( this, SdResId( FT_REPEAT ) ) );
1907 	mpCBRepeat.reset( new ComboBox( this, SdResId( CB_REPEAT ) ) );
1908 	mpCBXRewind.reset( new CheckBox( this, SdResId( CBX_REWIND ) ) );
1909 	mpFLTrigger.reset( new FixedLine( this, SdResId( FL_TRIGGER ) ) );
1910 	mpRBClickSequence.reset( new RadioButton( this, SdResId( RB_CLICKSEQUENCE ) ) );
1911 	mpRBInteractive.reset( new RadioButton( this, SdResId( RB_INTERACTIVE ) ) );
1912 	mpLBTrigger.reset( new ListBox( this, SdResId( LB_TRIGGER ) ) );
1913 
1914 	fillRepeatComboBox( mpCBRepeat.get() );
1915 	fillDurationComboBox( mpCBDuration.get() );
1916 
1917 	FreeResource();
1918 
1919     mpRBClickSequence->SetClickHdl( LINK( this, CustomAnimationDurationTabPage, implControlHdl ) );
1920     mpRBClickSequence->SetClickHdl( LINK( this, CustomAnimationDurationTabPage, implControlHdl ) );
1921     mpLBTrigger->SetSelectHdl( LINK( this, CustomAnimationDurationTabPage, implControlHdl ) );
1922 
1923 	if( pSet->getPropertyState( nHandleStart ) != STLPropertyState_AMBIGUOUS )
1924 	{
1925 		sal_Int16 nStart = 0;
1926 		pSet->getPropertyValue( nHandleStart ) >>= nStart;
1927 		sal_uInt16 nPos = 0;
1928 		switch( nStart )
1929 		{
1930 			case EffectNodeType::WITH_PREVIOUS:		nPos = 1; break;
1931 			case EffectNodeType::AFTER_PREVIOUS:	nPos = 2; break;
1932 		}
1933 		mpLBStart->SelectEntryPos( nPos );
1934 	}
1935 
1936 	if( pSet->getPropertyState( nHandleBegin ) != STLPropertyState_AMBIGUOUS )
1937 	{
1938 		double fBegin = 0.0;
1939 		pSet->getPropertyValue( nHandleBegin ) >>= fBegin;
1940 		mpMFStartDelay->SetValue( (long)(fBegin*10) );
1941 	}
1942 
1943 	if( pSet->getPropertyState( nHandleDuration ) != STLPropertyState_AMBIGUOUS )
1944 	{
1945 		double fDuration = 0.0;
1946 		pSet->getPropertyValue( nHandleDuration ) >>= fDuration;
1947 
1948 		if( fDuration == 0.001 )
1949 		{
1950 			mpFTDuration->Disable();
1951 			mpCBDuration->Disable();
1952 			mpFTRepeat->Disable();
1953 			mpCBRepeat->Disable();
1954 			mpCBXRewind->Disable();
1955 		}
1956 		else
1957 		{
1958 			sal_uInt16 nPos = LISTBOX_ENTRY_NOTFOUND;
1959 
1960 			if( fDuration == 5.0 )
1961 				nPos = 0;
1962 			else if( fDuration == 3.0 )
1963 				nPos = 1;
1964 			else if( fDuration == 2.0 )
1965 				nPos = 2;
1966 			else if( fDuration == 1.0 )
1967 				nPos = 3;
1968 			else if( fDuration == 0.5 )
1969 				nPos = 4;
1970 
1971 			if( nPos != LISTBOX_ENTRY_NOTFOUND )
1972 				mpCBDuration->SelectEntryPos( nPos );
1973 			else
1974 				mpCBDuration->SetText( String::CreateFromDouble( fDuration ) );
1975 		}
1976 	}
1977 
1978 	if( pSet->getPropertyState( nHandleRepeat ) != STLPropertyState_AMBIGUOUS )
1979 	{
1980 		Any aRepeatCount( pSet->getPropertyValue( nHandleRepeat ) );
1981 		if( (aRepeatCount.getValueType() == ::getCppuType((const double*)0)) || !aRepeatCount.hasValue() )
1982 		{
1983 			double fRepeat = 0.0;
1984 			if( aRepeatCount.hasValue() )
1985 				aRepeatCount >>= fRepeat;
1986 
1987 			sal_uInt16 nPos = LISTBOX_ENTRY_NOTFOUND;
1988 
1989 			if( fRepeat == 0 )
1990 				nPos = 0;
1991 			else if( fRepeat == 2.0 )
1992 				nPos = 1;
1993 			else if( fRepeat == 3.0 )
1994 				nPos = 2;
1995 			else if( fRepeat == 4.0 )
1996 				nPos = 3;
1997 			else if( fRepeat == 5.0 )
1998 				nPos = 4;
1999 			else if( fRepeat == 10.0 )
2000 				nPos = 5;
2001 
2002 			if( nPos != LISTBOX_ENTRY_NOTFOUND )
2003 				mpCBRepeat->SelectEntryPos( nPos );
2004 			else
2005 				mpCBRepeat->SetText( String::CreateFromDouble( fRepeat ) );
2006 		}
2007 		else if( aRepeatCount.getValueType() == ::getCppuType((const Timing*)0) )
2008 		{
2009 			Any aEnd;
2010 			if( pSet->getPropertyState( nHandleEnd ) != STLPropertyState_AMBIGUOUS )
2011 				aEnd = pSet->getPropertyValue( nHandleEnd );
2012 
2013 			mpCBRepeat->SelectEntryPos( aEnd.hasValue() ? 6 : 7 );
2014 		}
2015 	}
2016 
2017 	if( pSet->getPropertyState( nHandleRewind ) != STLPropertyState_AMBIGUOUS )
2018 	{
2019 		sal_Int16 nFill = 0;
2020 		if( pSet->getPropertyValue( nHandleRewind ) >>= nFill )
2021 		{
2022 			mpCBXRewind->Check( (nFill == AnimationFill::REMOVE) ? sal_True : sal_False );
2023 		}
2024 		else
2025 		{
2026 			mpCBXRewind->SetState( STATE_DONTKNOW );
2027 		}
2028 	}
2029 
2030 	Reference< XShape > xTrigger;
2031 
2032 	if( pSet->getPropertyState( nHandleTrigger ) != STLPropertyState_AMBIGUOUS )
2033 	{
2034 		pSet->getPropertyValue( nHandleTrigger ) >>= xTrigger;
2035 
2036 		mpRBInteractive->Check( xTrigger.is() );
2037 		mpRBClickSequence->Check( !xTrigger.is() );
2038 	}
2039 
2040 	Reference< XDrawPage > xCurrentPage;
2041 	pSet->getPropertyValue( nHandleCurrentPage ) >>= xCurrentPage;
2042 	if( xCurrentPage.is() )
2043 	{
2044 		const OUString aStrIsEmptyPresObj( RTL_CONSTASCII_USTRINGPARAM( "IsEmptyPresentationObject" ) );
2045 
2046 		sal_Int32 nShape, nCount = xCurrentPage->getCount();
2047 		for( nShape = 0; nShape < nCount; nShape++ )
2048 		{
2049 			Reference< XShape > xShape( xCurrentPage->getByIndex( nShape ), UNO_QUERY );
2050 
2051 			if( !xShape.is() )
2052 				continue;
2053 
2054 			Reference< XPropertySet > xSet( xShape, UNO_QUERY );
2055 			if( xSet.is() && xSet->getPropertySetInfo()->hasPropertyByName( aStrIsEmptyPresObj ) )
2056 			{
2057 				sal_Bool bIsEmpty = sal_False;
2058 				xSet->getPropertyValue( aStrIsEmptyPresObj ) >>= bIsEmpty;
2059 				if( bIsEmpty )
2060 					continue;
2061 			}
2062 
2063 			String aDescription( getShapeDescription( xShape, true ) );
2064 			sal_uInt16 nPos = mpLBTrigger->InsertEntry( aDescription );
2065 
2066 			mpLBTrigger->SetEntryData( nPos, (void*)nShape );
2067 			if( xShape == xTrigger )
2068 				mpLBTrigger->SelectEntryPos( nPos );
2069 		}
2070 	}
2071 }
2072 
2073 CustomAnimationDurationTabPage::~CustomAnimationDurationTabPage()
2074 {
2075 }
2076 
2077 IMPL_LINK( CustomAnimationDurationTabPage, implControlHdl, Control*, pControl )
2078 {
2079 	if( pControl == mpLBTrigger.get() )
2080 	{
2081 		mpRBClickSequence->Check( sal_False );
2082 		mpRBInteractive->Check( sal_True );
2083 	}
2084 
2085 	return 0;
2086 }
2087 
2088 void CustomAnimationDurationTabPage::update( STLPropertySet* pSet )
2089 {
2090 	sal_uInt16 nPos = mpLBStart->GetSelectEntryPos();
2091 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
2092 	{
2093 		sal_Int16 nStart;
2094 		sal_Int16 nOldStart = -1;
2095 
2096 		switch( nPos )
2097 		{
2098 		case 1: nStart = EffectNodeType::WITH_PREVIOUS; break;
2099 		case 2: nStart = EffectNodeType::AFTER_PREVIOUS; break;
2100 		default:
2101 			nStart = EffectNodeType::ON_CLICK; break;
2102 		}
2103 
2104 		if(mpSet->getPropertyState( nHandleStart ) != STLPropertyState_AMBIGUOUS)
2105 			mpSet->getPropertyValue( nHandleStart ) >>= nOldStart;
2106 
2107 		if( nStart != nOldStart )
2108 			pSet->setPropertyValue( nHandleStart, makeAny( nStart ) );
2109 	}
2110 
2111 	// ---
2112 
2113 	{
2114 		double fBegin = static_cast<double>( mpMFStartDelay->GetValue()) / 10.0;
2115 		double fOldBegin = -1.0;
2116 
2117 		if( mpSet->getPropertyState( nHandleBegin ) != STLPropertyState_AMBIGUOUS )
2118 			mpSet->getPropertyValue( nHandleBegin ) >>= fOldBegin;
2119 
2120 		if( fBegin != fOldBegin )
2121 			pSet->setPropertyValue( nHandleBegin, makeAny( fBegin ) );
2122 	}
2123 
2124 	// ---
2125 
2126 	nPos = mpCBRepeat->GetSelectEntryPos();
2127 	if( (nPos != LISTBOX_ENTRY_NOTFOUND) || (mpCBRepeat->GetText().Len() != 0) )
2128 	{
2129 		Any aRepeatCount;
2130 		Any aEnd;
2131 
2132 		switch( nPos )
2133 		{
2134 		case 0:
2135 			break;
2136 		case 6:
2137 			{
2138 				Event aEvent;
2139 				aEvent.Trigger = EventTrigger::ON_NEXT;
2140 				aEvent.Repeat = 0;
2141 				aEnd <<= aEvent;
2142 			}
2143 			// ATTENTION: FALL THROUGH INTENDED!
2144 		case 7:
2145 			aRepeatCount <<= Timing_INDEFINITE;
2146 			break;
2147 		default:
2148 			{
2149 				String aText( mpCBRepeat->GetText() );
2150 				if( aText.Len() )
2151 					aRepeatCount <<= aText.ToDouble();
2152 			}
2153 		}
2154 
2155 		Any aOldRepeatCount( aRepeatCount );
2156 		if( mpSet->getPropertyState( nHandleRepeat ) != STLPropertyState_AMBIGUOUS )
2157 			aOldRepeatCount = mpSet->getPropertyValue( nHandleRepeat );
2158 
2159 		if( aRepeatCount != aOldRepeatCount )
2160 			pSet->setPropertyValue( nHandleRepeat, aRepeatCount );
2161 
2162 		Any aOldEnd( aEnd );
2163 		if( mpSet->getPropertyState( nHandleEnd ) != STLPropertyState_AMBIGUOUS )
2164 			aOldEnd = mpSet->getPropertyValue( nHandleEnd );
2165 
2166 		if( aEnd != aOldEnd )
2167 			pSet->setPropertyValue( nHandleEnd, aEnd );
2168 	}
2169 
2170 	// ---
2171 
2172 	double fDuration = -1.0;
2173 	nPos = mpCBDuration->GetSelectEntryPos();
2174 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
2175 	{
2176 		fDuration = *static_cast< const double * >( mpCBDuration->GetEntryData(nPos) );
2177 	}
2178 	else
2179 	{
2180 		String aText( mpCBDuration->GetText() );
2181 		if( aText.Len() )
2182 		{
2183 			fDuration = aText.ToDouble();
2184 		}
2185 	}
2186 
2187 	if( fDuration != -1.0 )
2188 	{
2189 		double fOldDuration = -1;
2190 
2191 		if( mpSet->getPropertyState( nHandleDuration ) != STLPropertyState_AMBIGUOUS )
2192 			mpSet->getPropertyValue( nHandleDuration ) >>= fOldDuration;
2193 
2194 		if( fDuration != fOldDuration )
2195 			pSet->setPropertyValue( nHandleDuration, makeAny( fDuration ) );
2196 	}
2197 
2198 	// ---
2199 
2200 	if( mpCBXRewind->GetState() != STATE_DONTKNOW )
2201 	{
2202 		sal_Int16 nFill = mpCBXRewind->IsChecked() ? AnimationFill::REMOVE : AnimationFill::HOLD;
2203 
2204 		bool bSet = true;
2205 
2206 		if( mpSet->getPropertyState( nHandleRewind ) != STLPropertyState_AMBIGUOUS )
2207 		{
2208 			sal_Int16 nOldFill = 0;
2209 			mpSet->getPropertyValue( nHandleRewind ) >>= nOldFill;
2210 			bSet = nFill != nOldFill;
2211 		}
2212 
2213 		if( bSet )
2214 			pSet->setPropertyValue( nHandleRewind, makeAny( nFill ) );
2215 	}
2216 
2217 	Reference< XShape > xTrigger;
2218 
2219 	if( mpRBInteractive->IsChecked() )
2220 	{
2221 		nPos = mpLBTrigger->GetSelectEntryPos();
2222 		if( nPos != LISTBOX_ENTRY_NOTFOUND )
2223 		{
2224 			sal_Int32 nShape = (sal_Int32)(sal_IntPtr)mpLBTrigger->GetEntryData( nPos );
2225 
2226 			Reference< XDrawPage > xCurrentPage;
2227 			mpSet->getPropertyValue( nHandleCurrentPage ) >>= xCurrentPage;
2228 
2229 			if( xCurrentPage.is() && (nShape >= 0) && (nShape < xCurrentPage->getCount()) )
2230 				xCurrentPage->getByIndex( nShape ) >>= xTrigger;
2231 		}
2232 	}
2233 
2234 
2235 	if( xTrigger.is() || mpRBClickSequence->IsChecked() )
2236 	{
2237 		Any aNewValue( makeAny( xTrigger ) );
2238 		Any aOldValue;
2239 
2240 		if( mpSet->getPropertyState( nHandleTrigger ) != STLPropertyState_AMBIGUOUS )
2241 			aOldValue = mpSet->getPropertyValue( nHandleTrigger );
2242 
2243 		if( aNewValue != aOldValue )
2244 			pSet->setPropertyValue( nHandleTrigger, aNewValue );
2245 	}
2246 }
2247 
2248 class CustomAnimationTextAnimTabPage : public TabPage
2249 {
2250 public:
2251 	CustomAnimationTextAnimTabPage( Window* pParent, const ResId& rResId, const STLPropertySet* pSet );
2252 
2253 	void update( STLPropertySet* pSet );
2254 
2255 	void updateControlStates();
2256 	DECL_LINK( implSelectHdl, Control* );
2257 
2258 private:
2259 	FixedText	maFTGroupText;
2260 	ListBox		maLBGroupText;
2261 	CheckBox	maCBXGroupAuto;
2262 	MetricField	maMFGroupAuto;
2263 	CheckBox	maCBXAnimateForm;
2264 	CheckBox	maCBXReverse;
2265 
2266 	const STLPropertySet* mpSet;
2267 
2268 	bool mbHasVisibleShapes;
2269 };
2270 
2271 CustomAnimationTextAnimTabPage::CustomAnimationTextAnimTabPage(Window* pParent, const ResId& rResId, const STLPropertySet* pSet)
2272 :	TabPage( pParent, rResId ),
2273 	maFTGroupText( this, SdResId( FT_GROUP_TEXT ) ),
2274 	maLBGroupText( this, SdResId( LB_GROUP_TEXT ) ),
2275 	maCBXGroupAuto( this, SdResId( CBX_GROUP_AUTO ) ),
2276 	maMFGroupAuto( this, SdResId( MF_GROUP_AUTO ) ),
2277 	maCBXAnimateForm( this, SdResId( CBX_ANIMATE_FORM ) ),
2278 	maCBXReverse( this, SdResId( CBX_REVERSE ) ),
2279 	mpSet( pSet ),
2280 	mbHasVisibleShapes(true)
2281 {
2282 	FreeResource();
2283 
2284 	maLBGroupText.SetSelectHdl( LINK( this, CustomAnimationTextAnimTabPage, implSelectHdl ) );
2285 
2286 	if( pSet->getPropertyState( nHandleTextGrouping ) != STLPropertyState_AMBIGUOUS )
2287 	{
2288 		sal_Int32 nTextGrouping = 0;
2289 		if( pSet->getPropertyValue( nHandleTextGrouping ) >>= nTextGrouping )
2290 			maLBGroupText.SelectEntryPos( (sal_uInt16)(nTextGrouping + 1) );
2291 	}
2292 
2293 	if( pSet->getPropertyState( nHandleHasVisibleShape ) != STLPropertyState_AMBIGUOUS )
2294 		pSet->getPropertyValue( nHandleHasVisibleShape ) >>= mbHasVisibleShapes;
2295 
2296 	if( pSet->getPropertyState( nHandleTextGroupingAuto ) != STLPropertyState_AMBIGUOUS )
2297 	{
2298 		double fTextGroupingAuto = 0.0;
2299 		if( pSet->getPropertyValue( nHandleTextGroupingAuto ) >>= fTextGroupingAuto )
2300 		{
2301 			maCBXGroupAuto.Check( fTextGroupingAuto >= 0.0 );
2302 			if( fTextGroupingAuto >= 0.0 )
2303 				maMFGroupAuto.SetValue( (long)(fTextGroupingAuto*10) );
2304 		}
2305 	}
2306 	else
2307 	{
2308 		maCBXGroupAuto.SetState( STATE_DONTKNOW );
2309 	}
2310 
2311 	maCBXAnimateForm.SetState( STATE_DONTKNOW );
2312 	if( pSet->getPropertyState( nHandleAnimateForm ) != STLPropertyState_AMBIGUOUS )
2313 	{
2314 		sal_Bool bAnimateForm = sal_False;
2315 		if( pSet->getPropertyValue( nHandleAnimateForm ) >>= bAnimateForm )
2316 		{
2317 			maCBXAnimateForm.Check( bAnimateForm );
2318 		}
2319 	}
2320 	else
2321 	{
2322 		maCBXAnimateForm.Enable( sal_False );
2323 	}
2324 
2325 	maCBXReverse.SetState( STATE_DONTKNOW );
2326 	if( pSet->getPropertyState( nHandleTextReverse ) != STLPropertyState_AMBIGUOUS )
2327 	{
2328 		sal_Bool bTextReverse = sal_False;
2329 		if( pSet->getPropertyValue( nHandleTextReverse ) >>= bTextReverse )
2330 		{
2331 			maCBXReverse.Check( bTextReverse );
2332 		}
2333 	}
2334 
2335 	if( pSet->getPropertyState( nHandleMaxParaDepth ) == STLPropertyState_DIRECT )
2336 	{
2337 		sal_Int32 nMaxParaDepth = 0;
2338 		pSet->getPropertyValue( nHandleMaxParaDepth ) >>= nMaxParaDepth;
2339 		nMaxParaDepth += 1;
2340 
2341 		sal_Int32 nPos = 6;
2342 		while( (nPos > 2) && (nPos > nMaxParaDepth) )
2343 		{
2344 			maLBGroupText.RemoveEntry( (sal_uInt16)nPos );
2345 			nPos--;
2346 		}
2347 	}
2348 
2349 	updateControlStates();
2350 }
2351 
2352 void CustomAnimationTextAnimTabPage::update( STLPropertySet* pSet )
2353 {
2354 	sal_uInt16 nPos = maLBGroupText.GetSelectEntryPos();
2355 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
2356 	{
2357 		sal_Int32 nTextGrouping = nPos - 1;
2358 		sal_Int32 nOldGrouping = -2;
2359 
2360 		if(mpSet->getPropertyState( nHandleTextGrouping ) != STLPropertyState_AMBIGUOUS)
2361 			mpSet->getPropertyValue( nHandleTextGrouping ) >>= nOldGrouping;
2362 
2363 		if( nTextGrouping != nOldGrouping )
2364 			pSet->setPropertyValue( nHandleTextGrouping, makeAny( nTextGrouping ) );
2365 	}
2366 
2367 	if( nPos > 0 )
2368 	{
2369 		sal_Bool bTextReverse = maCBXReverse.IsChecked();
2370 		sal_Bool bOldTextReverse = !bTextReverse;
2371 
2372 		if(mpSet->getPropertyState( nHandleTextReverse ) != STLPropertyState_AMBIGUOUS)
2373 			mpSet->getPropertyValue( nHandleTextReverse ) >>= bOldTextReverse;
2374 
2375 		if( bTextReverse != bOldTextReverse )
2376 			pSet->setPropertyValue( nHandleTextReverse, makeAny( bTextReverse ) );
2377 
2378 		if( nPos > 1 )
2379 		{
2380 			double fTextGroupingAuto = maCBXGroupAuto.IsChecked() ? maMFGroupAuto.GetValue() / 10.0 : -1.0;
2381 			double fOldTextGroupingAuto = -2.0;
2382 
2383 			if(mpSet->getPropertyState( nHandleTextGroupingAuto ) != STLPropertyState_AMBIGUOUS)
2384 				mpSet->getPropertyValue( nHandleTextGroupingAuto ) >>= fOldTextGroupingAuto;
2385 
2386 			if( fTextGroupingAuto != fOldTextGroupingAuto )
2387 				pSet->setPropertyValue( nHandleTextGroupingAuto, makeAny( fTextGroupingAuto ) );
2388 		}
2389 	}
2390 	//bug 120049
2391 	//[crash] Aoo crash when modify the "Random effects" animation effect's trigger condition to "Start effect on click of" .
2392 	//If this control is disabled, we should ignore its value
2393 	if (maCBXAnimateForm.IsEnabled())
2394 	{
2395 		sal_Bool bAnimateForm = maCBXAnimateForm.IsChecked();
2396 		sal_Bool bOldAnimateForm = !bAnimateForm;
2397 
2398 		if(mpSet->getPropertyState( nHandleAnimateForm ) != STLPropertyState_AMBIGUOUS)
2399 			mpSet->getPropertyValue( nHandleAnimateForm ) >>= bOldAnimateForm;
2400 
2401 		if( bAnimateForm != bOldAnimateForm )
2402 			pSet->setPropertyValue( nHandleAnimateForm, makeAny( bAnimateForm ) );
2403 	}
2404 }
2405 
2406 void CustomAnimationTextAnimTabPage::updateControlStates()
2407 {
2408 	sal_uInt16 nPos = maLBGroupText.GetSelectEntryPos();
2409 
2410 	maCBXGroupAuto.Enable( nPos > 1 );
2411 	maMFGroupAuto.Enable( nPos > 1 );
2412 	maCBXReverse.Enable( nPos > 0 );
2413 
2414 	if( !mbHasVisibleShapes && nPos > 0 )
2415 	{
2416 		maCBXAnimateForm.Check(sal_False);
2417 		maCBXAnimateForm.Enable(sal_False);
2418 	}
2419 	else
2420 	{
2421 		maCBXAnimateForm.Enable(sal_True);
2422 	}
2423 }
2424 
2425 IMPL_LINK( CustomAnimationTextAnimTabPage, implSelectHdl, Control*, EMPTYARG )
2426 {
2427 	updateControlStates();
2428 	return 0;
2429 }
2430 
2431 // --------------------------------------------------------------------
2432 
2433 CustomAnimationDialog::CustomAnimationDialog( Window* pParent, STLPropertySet* pSet, sal_uInt16 nPage /* = 0 */  )
2434 : TabDialog( pParent, SdResId( DLG_CUSTOMANIMATION ) ), mpSet( pSet ), mpResultSet( 0 )
2435 {
2436 	mpTabControl = new TabControl( this, SdResId( 1 ) );
2437 	mpOKButton = new OKButton(this, SdResId( 1 ) ) ;
2438 	mpCancelButton = new CancelButton(this, SdResId( 1 ) );
2439 	mpHelpButton = new HelpButton(this, SdResId( 1 ) );
2440 
2441 	FreeResource();
2442 
2443 	mpEffectTabPage = new CustomAnimationEffectTabPage( mpTabControl, SdResId( RID_TP_CUSTOMANIMATION_EFFECT ), mpSet );
2444 	mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_EFFECT, mpEffectTabPage );
2445 	mpDurationTabPage = new CustomAnimationDurationTabPage( mpTabControl, SdResId( RID_TP_CUSTOMANIMATION_DURATION ), mpSet );
2446 	mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_DURATION, mpDurationTabPage );
2447 
2448 	sal_Bool bHasText = sal_False;
2449 	if( pSet->getPropertyState( nHandleHasText ) != STLPropertyState_AMBIGUOUS )
2450 		pSet->getPropertyValue( nHandleHasText ) >>= bHasText;
2451 
2452 	if( bHasText )
2453 	{
2454 		mpTextAnimTabPage = new CustomAnimationTextAnimTabPage( mpTabControl, SdResId( RID_TP_CUSTOMANIMATION_TEXT ), mpSet );
2455 		mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_TEXT, mpTextAnimTabPage );
2456 	}
2457 	else
2458 	{
2459 		mpTextAnimTabPage = 0;
2460 		mpTabControl->RemovePage( RID_TP_CUSTOMANIMATION_TEXT );
2461 	}
2462 
2463 	if( nPage )
2464 		mpTabControl->SelectTabPage( nPage );
2465 }
2466 
2467 CustomAnimationDialog::~CustomAnimationDialog()
2468 {
2469 	delete mpEffectTabPage;
2470 	delete mpDurationTabPage;
2471 	delete mpTextAnimTabPage;
2472 
2473 	delete mpTabControl;
2474 	delete mpOKButton;
2475 	delete mpCancelButton;
2476 	delete mpHelpButton;
2477 
2478 	delete mpSet;
2479 	delete mpResultSet;
2480 }
2481 
2482 STLPropertySet* CustomAnimationDialog::getResultSet()
2483 {
2484 	if( mpResultSet )
2485 		delete mpResultSet;
2486 
2487 	mpResultSet = createDefaultSet();
2488 
2489 	mpEffectTabPage->update( mpResultSet );
2490 	mpDurationTabPage->update( mpResultSet );
2491 	if( mpTextAnimTabPage )
2492 		mpTextAnimTabPage->update( mpResultSet );
2493 
2494 	return mpResultSet;
2495 }
2496 
2497 STLPropertySet* CustomAnimationDialog::createDefaultSet()
2498 {
2499 	Any aEmpty;
2500 
2501 	STLPropertySet* pSet = new STLPropertySet();
2502 	pSet->setPropertyDefaultValue( nHandleMaxParaDepth, makeAny( (sal_Int32)-1 ) );
2503 
2504 	pSet->setPropertyDefaultValue( nHandleHasAfterEffect, makeAny( (sal_Bool)sal_False ) );
2505 	pSet->setPropertyDefaultValue( nHandleAfterEffectOnNextEffect, makeAny( (sal_Bool)sal_False ) );
2506 	pSet->setPropertyDefaultValue( nHandleDimColor, aEmpty );
2507 	pSet->setPropertyDefaultValue( nHandleIterateType, makeAny( (sal_Int16)0 ) );
2508 	pSet->setPropertyDefaultValue( nHandleIterateInterval, makeAny( (double)0.0 ) );
2509 
2510 	pSet->setPropertyDefaultValue( nHandleStart, makeAny( (sal_Int16)EffectNodeType::ON_CLICK ) );
2511 	pSet->setPropertyDefaultValue( nHandleBegin, makeAny( (double)0.0 ) );
2512 	pSet->setPropertyDefaultValue( nHandleDuration, makeAny( (double)2.0 ) );
2513 	pSet->setPropertyDefaultValue( nHandleRepeat, aEmpty );
2514 	pSet->setPropertyDefaultValue( nHandleRewind, makeAny( AnimationFill::HOLD ) );
2515 
2516 	pSet->setPropertyDefaultValue( nHandleEnd, aEmpty );
2517 
2518 	pSet->setPropertyDefaultValue( nHandlePresetId, aEmpty );
2519 	pSet->setPropertyDefaultValue( nHandleProperty1Type, makeAny( nPropertyTypeNone ) );
2520 	pSet->setPropertyDefaultValue( nHandleProperty1Value, aEmpty );
2521 	pSet->setPropertyDefaultValue( nHandleProperty2Type, makeAny( nPropertyTypeNone ) );
2522 	pSet->setPropertyDefaultValue( nHandleProperty2Value, aEmpty );
2523 	pSet->setPropertyDefaultValue( nHandleAccelerate, aEmpty );
2524 	pSet->setPropertyDefaultValue( nHandleDecelerate, aEmpty );
2525 	pSet->setPropertyDefaultValue( nHandleAutoReverse, aEmpty );
2526 	pSet->setPropertyDefaultValue( nHandleTrigger, aEmpty );
2527 
2528 	pSet->setPropertyDefaultValue( nHandleHasText, makeAny( sal_False ) );
2529 	pSet->setPropertyDefaultValue( nHandleHasVisibleShape, makeAny( sal_False ) );
2530 	pSet->setPropertyDefaultValue( nHandleTextGrouping, makeAny( (sal_Int32)-1 ) );
2531 	pSet->setPropertyDefaultValue( nHandleAnimateForm, makeAny( sal_True ) );
2532 	pSet->setPropertyDefaultValue( nHandleTextGroupingAuto, makeAny( (double)-1.0 ) );
2533 	pSet->setPropertyDefaultValue( nHandleTextReverse, makeAny( sal_False ) );
2534 
2535 	pSet->setPropertyDefaultValue( nHandleCurrentPage, aEmpty );
2536 
2537 	pSet->setPropertyDefaultValue( nHandleSoundURL, aEmpty );
2538 	pSet->setPropertyDefaultValue( nHandleSoundVolumne, makeAny( (double)1.0) );
2539 	pSet->setPropertyDefaultValue( nHandleSoundEndAfterSlide, makeAny( (sal_Int32)0 ) );
2540 
2541 	pSet->setPropertyDefaultValue( nHandleCommand, makeAny( (sal_Int16)0 ) );
2542 	return pSet;
2543 }
2544 
2545 PropertyControl::PropertyControl( Window* pParent, const ResId& rResId )
2546 : ListBox( pParent, rResId ), mpSubControl(0)
2547 {
2548 }
2549 
2550 PropertyControl::~PropertyControl()
2551 {
2552 	if( mpSubControl )
2553 		delete mpSubControl;
2554 }
2555 
2556 void PropertyControl::setSubControl( PropertySubControl* pSubControl )
2557 {
2558 	if( mpSubControl && mpSubControl != pSubControl )
2559 		delete mpSubControl;
2560 
2561 	mpSubControl = pSubControl;
2562 
2563 	Control* pControl = pSubControl ? pSubControl->getControl() : 0;
2564 
2565 	if( pControl )
2566 	{
2567 		pControl->SetPosSizePixel( GetPosPixel(), GetSizePixel() );
2568 		pControl->SetZOrder( this, WINDOW_ZORDER_BEFOR );
2569 		pControl->Show();
2570 		Hide();
2571 	}
2572 	else
2573 	{
2574 		Show();
2575 	}
2576 }
2577 
2578 void PropertyControl::Resize()
2579 {
2580 	Control* pControl = mpSubControl ? mpSubControl->getControl() : 0;
2581 	if( pControl )
2582 		pControl->SetPosSizePixel( GetPosPixel(), GetSizePixel() );
2583 	ListBox::Resize();
2584 }
2585 
2586 // ====================================================================
2587 
2588 PropertySubControl::~PropertySubControl()
2589 {
2590 }
2591 
2592 PropertySubControl* PropertySubControl::create( sal_Int32 nType, Window* pParent, const Any& rValue, const OUString& rPresetId, const Link& rModifyHdl )
2593 {
2594 	PropertySubControl* pSubControl = NULL;
2595 	switch( nType )
2596 	{
2597 	case nPropertyTypeDirection:
2598 	case nPropertyTypeSpokes:
2599 	case nPropertyTypeZoom:
2600 		pSubControl = new PresetPropertyBox( nType, pParent, rValue, rPresetId, rModifyHdl );
2601 		break;
2602 
2603 	case nPropertyTypeColor:
2604 	case nPropertyTypeFillColor:
2605 	case nPropertyTypeFirstColor:
2606 	case nPropertyTypeCharColor:
2607 	case nPropertyTypeLineColor:
2608 		pSubControl = new ColorPropertyBox( nType, pParent, rValue, rModifyHdl );
2609 		break;
2610 
2611 	case nPropertyTypeFont:
2612 		pSubControl = new FontPropertyBox( nType, pParent, rValue, rModifyHdl );
2613 		break;
2614 
2615 	case nPropertyTypeCharHeight:
2616 		pSubControl = new CharHeightPropertyBox( nType, pParent, rValue, rModifyHdl );
2617 		break;
2618 
2619 	case nPropertyTypeRotate:
2620 		pSubControl = new RotationPropertyBox( nType, pParent, rValue, rModifyHdl );
2621 		break;
2622 
2623 	case nPropertyTypeTransparency:
2624 		pSubControl = new TransparencyPropertyBox( nType, pParent, rValue, rModifyHdl );
2625 		break;
2626 
2627 	case nPropertyTypeScale:
2628 		pSubControl = new ScalePropertyBox( nType, pParent, rValue, rModifyHdl );
2629 		break;
2630 
2631 	case nPropertyTypeCharDecoration:
2632 		pSubControl = new FontStylePropertyBox( nType, pParent, rValue, rModifyHdl );
2633 		break;
2634 	}
2635 
2636 	return pSubControl;
2637 }
2638 
2639 }
2640