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