xref: /AOO41X/main/sd/source/ui/animations/CustomAnimationDialog.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
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