xref: /AOO41X/main/sd/source/ui/animations/CustomAnimationCreateDialog.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
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 
27 #ifndef _COM_SUN_STAR_UTIL_XCOLLATOR_HPP_
28 #include <com/sun/star/i18n/XCollator.hpp>
29 #endif
30 
31 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
32 #include <comphelper/processfactory.hxx>
33 #endif
34 #include <vcl/svapp.hxx>
35 #include <vcl/tabctrl.hxx>
36 #include <vcl/tabpage.hxx>
37 
38 #ifndef _SV_BUTTON_HXX
39 #include <vcl/button.hxx>
40 #endif
41 #include <vcl/fixed.hxx>
42 #include <vcl/lstbox.hxx>
43 #include <vcl/combobox.hxx>
44 #include <svtools/valueset.hxx>
45 
46 #include <svx/svdetc.hxx>
47 #include <svx/svdstr.hrc>
48 #include "sdresid.hxx"
49 #include <unotools/viewoptions.hxx>
50 #include <com/sun/star/presentation/EffectNodeType.hpp>
51 #include "CustomAnimationCreateDialog.hxx"
52 #ifndef _SD_CUSTOMANIMATIONCREATEDIALOG_HRC
53 #include "CustomAnimationCreateDialog.hrc"
54 #endif
55 #ifndef _SD_CUSTOMANIMATION_HRC
56 #include "CustomAnimation.hrc"
57 #endif
58 #include "CustomAnimationPane.hxx"
59 #include "optsitem.hxx"
60 #include "sddll.hxx"
61 
62 #include "helpids.h"
63 
64 using namespace ::com::sun::star;
65 
66 using ::rtl::OUString;
67 using ::com::sun::star::uno::UNO_QUERY;
68 using ::com::sun::star::uno::UNO_QUERY_THROW;
69 using ::com::sun::star::uno::Any;
70 using ::com::sun::star::uno::Reference;
71 using ::com::sun::star::uno::Exception;
72 
73 using namespace ::com::sun::star::presentation;
74 
75 namespace sd {
76 
77 
78 const int ENTRANCE = 0;
79 const int EMPHASIS = 1;
80 const int EXIT = 2;
81 const int MOTIONPATH = 3;
82 const int MISCEFFECTS = 4;
83 
84 extern void fillDurationComboBox( ComboBox* pBox );
85 
86 // --------------------------------------------------------------------
87 
88 class CategoryListBox : public ListBox
89 {
90 public:
91     CategoryListBox( Window* pParent, const ResId& rResId );
92     ~CategoryListBox();
93 
94     virtual void        MouseButtonUp( const MouseEvent& rMEvt );
95 
96     sal_uInt16          InsertCategory( const XubString& rStr, sal_uInt16 nPos = LISTBOX_APPEND );
97 
SetDoubleClickLink(const Link & rDoubleClickHdl)98     void            SetDoubleClickLink( const Link& rDoubleClickHdl ) { maDoubleClickHdl = rDoubleClickHdl; }
99 
100     DECL_LINK( implDoubleClickHdl, Control* );
101 
102 private:
103     virtual void    UserDraw( const UserDrawEvent& rUDEvt );
104 
105     Link            maDoubleClickHdl;
106 };
107 
CategoryListBox(Window * pParent,const ResId & rResId)108 CategoryListBox::CategoryListBox( Window* pParent, const ResId& rResId )
109 : ListBox( pParent, rResId )
110 {
111     EnableUserDraw( sal_True );
112     SetDoubleClickHdl( LINK( this, CategoryListBox, implDoubleClickHdl ) );
113 }
114 
~CategoryListBox()115 CategoryListBox::~CategoryListBox()
116 {
117 }
118 
InsertCategory(const XubString & rStr,sal_uInt16 nPos)119 sal_uInt16 CategoryListBox::InsertCategory( const XubString& rStr, sal_uInt16 nPos /* = LISTBOX_APPEND */ )
120 {
121     sal_uInt16 n = ListBox::InsertEntry( rStr, nPos );
122     if( n != LISTBOX_ENTRY_NOTFOUND )
123         ListBox::SetEntryFlags( n, ListBox::GetEntryFlags(n) | LISTBOX_ENTRY_FLAG_DISABLE_SELECTION );
124 
125     return n;
126 }
127 
UserDraw(const UserDrawEvent & rUDEvt)128 void CategoryListBox::UserDraw( const UserDrawEvent& rUDEvt )
129 {
130     const sal_uInt16 nItem = rUDEvt.GetItemId();
131 
132     if( ListBox::GetEntryFlags(nItem) & LISTBOX_ENTRY_FLAG_DISABLE_SELECTION )
133     {
134         Rectangle aOutRect( rUDEvt.GetRect() );
135         OutputDevice* pDev = rUDEvt.GetDevice();
136 
137         // fill the background
138         Color aColor (GetSettings().GetStyleSettings().GetDialogColor());
139 
140         pDev->SetFillColor (aColor);
141         pDev->SetLineColor ();
142         pDev->DrawRect(aOutRect);
143 
144         // Erase the four corner pixels to make the rectangle appear rounded.
145         pDev->SetLineColor( GetSettings().GetStyleSettings().GetWindowColor());
146         pDev->DrawPixel( aOutRect.TopLeft());
147         pDev->DrawPixel( Point(aOutRect.Right(), aOutRect.Top()));
148         pDev->DrawPixel( Point(aOutRect.Left(), aOutRect.Bottom()));
149         pDev->DrawPixel( Point(aOutRect.Right(), aOutRect.Bottom()));
150 
151         // draw the category title
152         pDev->DrawText (aOutRect, GetEntry(nItem), TEXT_DRAW_CENTER );
153     }
154     else
155     {
156         DrawEntry( rUDEvt, sal_True, sal_True );
157     }
158 }
159 
160 // --------------------------------------------------------------------
161 
IMPL_LINK(CategoryListBox,implDoubleClickHdl,Control *,EMPTYARG)162 IMPL_LINK( CategoryListBox, implDoubleClickHdl, Control*, EMPTYARG )
163 {
164     CaptureMouse();
165     return 0;
166 }
167 
168 // --------------------------------------------------------------------
169 
MouseButtonUp(const MouseEvent & rMEvt)170 void CategoryListBox::MouseButtonUp( const MouseEvent& rMEvt )
171 {
172     ReleaseMouse();
173     if( rMEvt.IsLeft() && (rMEvt.GetClicks() == 2) )
174     {
175         if( maDoubleClickHdl.IsSet() )
176             maDoubleClickHdl.Call( this );
177     }
178     else
179     {
180         ListBox::MouseButtonUp( rMEvt );
181     }
182 }
183 
184 // --------------------------------------------------------------------
185 
186 class CustomAnimationCreateTabPage : public TabPage
187 {
188 public:
189     CustomAnimationCreateTabPage( Window* pParent, CustomAnimationCreateDialog* pDialogParent, int nTabId, const PresetCategoryList& rCategoryList, bool bHasText );
190     ~CustomAnimationCreateTabPage();
191 
192     PathKind getCreatePathKind() const;
193     CustomAnimationPresetPtr getSelectedPreset() const;
194     double getDuration() const;
195     void setDuration( double fDuration );
196 
197     bool getIsPreview() const;
198     void setIsPreview( bool bIsPreview );
199 
200     bool select( const OUString& rsPresetId );
201 
202 private:
203     DECL_LINK( implSelectHdl, Control* );
204     DECL_LINK( implDoubleClickHdl, Control* );
205 
206     void onSelectEffect();
207 
208     void clearEffects();
209 
210 private:
211     CategoryListBox*    mpLBEffects;
212     FixedText*  mpFTSpeed;
213     ComboBox*   mpCBSpeed;
214     CheckBox*   mpCBXPReview;
215 
216     CustomAnimationCreateDialog*        mpParent;
217 
218     sal_uInt16 mnCurvePathPos;
219     sal_uInt16 mnPolygonPathPos;
220     sal_uInt16 mnFreeformPathPos;
221 
222 };
223 
224 struct ImplStlEffectCategorySortHelper
225 {
226     ImplStlEffectCategorySortHelper();
227     bool operator()( const CustomAnimationPresetPtr& p1, const CustomAnimationPresetPtr& p2 );
228 
229 private:
230     uno::Reference< i18n::XCollator > mxCollator;
231 };
232 
ImplStlEffectCategorySortHelper()233 ImplStlEffectCategorySortHelper::ImplStlEffectCategorySortHelper()
234 {
235     uno::Reference<lang::XMultiServiceFactory> xFac( ::comphelper::getProcessServiceFactory() );
236     if( xFac.is() )
237     {
238         mxCollator.set( xFac->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.i18n.Collator" ) ), uno::UNO_QUERY );
239 
240         if( mxCollator.is() )
241         {
242             const lang::Locale& rLocale = Application::GetSettings().GetLocale();
243             mxCollator->loadDefaultCollator(rLocale, 0);
244         }
245     }
246 }
247 
operator ()(const CustomAnimationPresetPtr & p1,const CustomAnimationPresetPtr & p2)248 bool ImplStlEffectCategorySortHelper::operator()( const CustomAnimationPresetPtr& p1, const CustomAnimationPresetPtr& p2 )
249 {
250     return mxCollator.is() ? mxCollator->compareString(p1->getLabel(), p2->getLabel()) == -1 : false;
251 }
252 
CustomAnimationCreateTabPage(Window * pParent,CustomAnimationCreateDialog * pDialogParent,int nTabId,const PresetCategoryList & rCategoryList,bool bHasText)253 CustomAnimationCreateTabPage::CustomAnimationCreateTabPage( Window* pParent, CustomAnimationCreateDialog* pDialogParent, int nTabId, const PresetCategoryList& rCategoryList, bool bHasText )
254 : TabPage( pParent, SdResId( RID_TP_CUSTOMANIMATION_ENTRANCE ) )
255 , mpParent( pDialogParent )
256 , mnCurvePathPos( LISTBOX_ENTRY_NOTFOUND )
257 , mnPolygonPathPos( LISTBOX_ENTRY_NOTFOUND )
258 , mnFreeformPathPos( LISTBOX_ENTRY_NOTFOUND )
259 {
260     mpLBEffects = new CategoryListBox( this, SdResId( LB_EFFECTS ) );
261     mpFTSpeed = new FixedText( this, SdResId( FT_SPEED ) );
262     mpCBSpeed = new ComboBox( this, SdResId( CB_SPEED ) );
263     mpCBXPReview = new CheckBox( this, SdResId( CBX_PREVIEW ) );
264 
265     String sMotionPathLabel( SdResId( STR_USERPATH ) );
266 
267     FreeResource();
268 
269     sal_uInt16 nFirstEffect = LISTBOX_ENTRY_NOTFOUND;
270 
271     if( nTabId == MOTIONPATH )
272     {
273         mpLBEffects->InsertCategory( sMotionPathLabel );
274 
275         mnCurvePathPos = nFirstEffect = mpLBEffects->InsertEntry( sdr::GetResourceString(STR_ObjNameSingulCOMBLINE) );
276         mnPolygonPathPos = mpLBEffects->InsertEntry( sdr::GetResourceString(STR_ObjNameSingulPOLY) );
277         mnFreeformPathPos = mpLBEffects->InsertEntry( sdr::GetResourceString(STR_ObjNameSingulFREELINE) );
278     };
279 
280     PresetCategoryList::const_iterator aCategoryIter( rCategoryList.begin() );
281     const PresetCategoryList::const_iterator aCategoryEnd( rCategoryList.end() );
282     while( aCategoryIter != aCategoryEnd )
283     {
284         PresetCategoryPtr pCategory( *aCategoryIter++ );
285         if( pCategory.get() )
286         {
287             mpLBEffects->InsertCategory( pCategory->maLabel );
288 
289             std::vector< CustomAnimationPresetPtr > aSortedVector(pCategory->maEffects.size());
290             std::copy( pCategory->maEffects.begin(), pCategory->maEffects.end(), aSortedVector.begin() );
291             ImplStlEffectCategorySortHelper aSortHelper;
292             std::sort( aSortedVector.begin(), aSortedVector.end(), aSortHelper );
293 
294             std::vector< CustomAnimationPresetPtr >::const_iterator aIter( aSortedVector.begin() );
295             const std::vector< CustomAnimationPresetPtr >::const_iterator aEnd( aSortedVector.end() );
296             while( aIter != aEnd )
297             {
298                 CustomAnimationPresetPtr pDescriptor = (*aIter++);
299                 if( pDescriptor.get() && (bHasText || !pDescriptor->isTextOnly() ) )
300                 {
301                     sal_uInt16 nPos = mpLBEffects->InsertEntry( pDescriptor->getLabel() );
302                     mpLBEffects->SetEntryData( nPos, static_cast<void*>( new CustomAnimationPresetPtr( pDescriptor ) ) );
303 
304                     if( nFirstEffect == LISTBOX_ENTRY_NOTFOUND )
305                         nFirstEffect = nPos;
306                 }
307             }
308         }
309     }
310 
311     mpLBEffects->SelectEntryPos( nFirstEffect );
312 
313     fillDurationComboBox( mpCBSpeed );
314 
315     if( nFirstEffect != LISTBOX_ENTRY_NOTFOUND )
316         onSelectEffect();
317 
318     mpLBEffects->SetSelectHdl( LINK( this, CustomAnimationCreateTabPage, implSelectHdl ) );
319     mpLBEffects->SetDoubleClickLink( LINK( this, CustomAnimationCreateTabPage, implDoubleClickHdl ) );
320 }
321 
~CustomAnimationCreateTabPage()322 CustomAnimationCreateTabPage::~CustomAnimationCreateTabPage()
323 {
324     clearEffects();
325 
326     delete mpLBEffects;
327     delete mpFTSpeed;
328     delete mpCBSpeed;
329     delete mpCBXPReview;
330 }
331 
IMPL_LINK(CustomAnimationCreateTabPage,implSelectHdl,Control *,pControl)332 IMPL_LINK( CustomAnimationCreateTabPage, implSelectHdl, Control*, pControl )
333 {
334     if( pControl == mpLBEffects )
335         onSelectEffect();
336     return 0;
337 }
338 
IMPL_LINK(CustomAnimationCreateTabPage,implDoubleClickHdl,Control *,pControl)339 IMPL_LINK( CustomAnimationCreateTabPage, implDoubleClickHdl, Control*, pControl )
340 {
341     if( pControl == mpLBEffects )
342     {
343         if( mpLBEffects->GetSelectEntryCount() )
344             mpParent->EndDialog( sal_True );
345     }
346     return 0;
347 }
348 
onSelectEffect()349 void CustomAnimationCreateTabPage::onSelectEffect()
350 {
351     CustomAnimationPresetPtr*p = static_cast< CustomAnimationPresetPtr* >( mpLBEffects->GetEntryData( mpLBEffects->GetSelectEntryPos() ) );
352 
353     if( !p )
354         return;
355 
356     CustomAnimationPresetPtr pPreset( *p );
357 
358     const double fDuration = pPreset->getDuration();
359     sal_uInt16 nPos = 0xffff;
360 
361     if( fDuration == 5.0 )
362         nPos = 0;
363     else if( fDuration == 3.0 )
364         nPos = 1;
365     else if( fDuration == 2.0 )
366         nPos = 2;
367     else if( fDuration == 1.0 )
368         nPos = 3;
369     else if( fDuration == 0.5 )
370         nPos = 4;
371 
372     mpCBSpeed->SelectEntryPos( nPos );
373 
374     bool bHasSpeed = pPreset->getDuration() > 0.001;
375     mpCBSpeed->Enable( bHasSpeed );
376     mpFTSpeed->Enable( bHasSpeed );
377 
378     if( mpCBXPReview->IsChecked() )
379     {
380         mpParent->preview( pPreset );
381     }
382 }
383 
clearEffects()384 void CustomAnimationCreateTabPage::clearEffects()
385 {
386     sal_uInt16 nPos = mpLBEffects->GetEntryCount();
387     while( nPos-- )
388         delete static_cast< CustomAnimationPresetPtr* >( mpLBEffects->GetEntryData( nPos ) );
389 
390     mpLBEffects->Clear();
391 }
392 
getSelectedPreset() const393 CustomAnimationPresetPtr CustomAnimationCreateTabPage::getSelectedPreset() const
394 {
395     CustomAnimationPresetPtr pPreset;
396 
397     if( mpLBEffects->GetSelectEntryCount() == 1 )
398     {
399         void* pEntryData = mpLBEffects->GetEntryData( mpLBEffects->GetSelectEntryPos() );
400         if( pEntryData )
401             pPreset = *static_cast< CustomAnimationPresetPtr* >( pEntryData );
402     }
403 
404     return pPreset;
405 }
406 
getCreatePathKind() const407 PathKind CustomAnimationCreateTabPage::getCreatePathKind() const
408 {
409     PathKind eKind = NONE;
410 
411     if( mpLBEffects->GetSelectEntryCount() == 1 )
412     {
413         const sal_uInt16 nPos = mpLBEffects->GetSelectEntryPos();
414         if( nPos == mnCurvePathPos )
415         {
416             eKind = CURVE;
417         }
418         else if( nPos == mnPolygonPathPos )
419         {
420             eKind = POLYGON;
421         }
422         else if( nPos == mnFreeformPathPos )
423         {
424             eKind = FREEFORM;
425         }
426     }
427 
428     return eKind;
429 }
430 
431 
432 
getDuration() const433 double CustomAnimationCreateTabPage::getDuration() const
434 {
435     sal_uInt16 nPos = mpCBSpeed->GetSelectEntryPos();
436     if( (nPos == 0xffff) || !mpCBSpeed->IsEnabled() )
437     {
438         CustomAnimationPresetPtr pPreset = getSelectedPreset();
439         if( pPreset.get() )
440             return pPreset->getDuration();
441     }
442 
443     switch( nPos )
444     {
445     case 0: return 5.0f;
446     case 1: return 3.0f;
447     case 2: return 2.0f;
448     case 3: return 1.0f;
449     case 4: return 0.5f;
450     }
451 
452     return 0.0f;
453 }
454 
setDuration(double fDuration)455 void CustomAnimationCreateTabPage::setDuration( double fDuration )
456 {
457     sal_uInt16 nPos = 0;
458     if( fDuration < 2.0f )
459     {
460         if( fDuration < 1.0f )
461         {
462             nPos = 4;
463         }
464         else
465         {
466             nPos = 3;
467         }
468     }
469     else if( fDuration < 5.0f )
470     {
471         if( fDuration < 3.0f )
472         {
473             nPos = 2;
474         }
475         else
476         {
477             nPos = 1;
478         }
479     }
480 
481     mpCBSpeed->SelectEntryPos( nPos );
482 }
483 
getIsPreview() const484 bool CustomAnimationCreateTabPage::getIsPreview() const
485 {
486     return mpCBXPReview->IsChecked() ? true : false;
487 }
488 
setIsPreview(bool bIsPreview)489 void CustomAnimationCreateTabPage::setIsPreview( bool bIsPreview )
490 {
491     mpCBXPReview->Check( bIsPreview ? sal_True : sal_False );
492 }
493 
select(const OUString & rsPresetId)494 bool CustomAnimationCreateTabPage::select( const OUString& rsPresetId )
495 {
496     sal_uInt16 nPos = mpLBEffects->GetEntryCount();
497     while( nPos-- )
498     {
499         void* pEntryData = mpLBEffects->GetEntryData( nPos );
500         if( pEntryData )
501         {
502             CustomAnimationPresetPtr& pPtr = *static_cast< CustomAnimationPresetPtr* >(pEntryData);
503             if( pPtr.get() && pPtr->getPresetId() == rsPresetId )
504             {
505                 mpLBEffects->SelectEntryPos( nPos );
506                 return true;
507             }
508         }
509     }
510 
511     return false;
512 }
513 
514 // --------------------------------------------------------------------
515 
CustomAnimationCreateDialog(Window * pParent,CustomAnimationPane * pPane,const std::vector<::com::sun::star::uno::Any> & rTargets,bool bHasText,const::rtl::OUString & rsPresetId,double fDuration)516 CustomAnimationCreateDialog::CustomAnimationCreateDialog( Window* pParent, CustomAnimationPane* pPane, const std::vector< ::com::sun::star::uno::Any >& rTargets, bool bHasText, const ::rtl::OUString& rsPresetId, double fDuration  )
517 :   TabDialog( pParent, SdResId( DLG_CUSTOMANIMATION_CREATE ) )
518 ,   mpPane( pPane )
519 ,   mrTargets( rTargets )
520 ,   mfDuration( fDuration )
521 {
522     mpTabControl = new TabControl( this, SdResId( 1 ) );
523     mpOKButton = new OKButton(this, SdResId( 1 ) ) ;
524     mpCancelButton = new CancelButton(this, SdResId( 1 ) );
525     mpHelpButton = new HelpButton(this, SdResId( 1 ) );
526 
527     FreeResource();
528 
529     SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
530     mbIsPreview = pOptions->IsPreviewNewEffects();
531 
532     const CustomAnimationPresets& rPresets = CustomAnimationPresets::getCustomAnimationPresets();
533     mpTabPages[ENTRANCE] = new CustomAnimationCreateTabPage( mpTabControl, this, ENTRANCE, rPresets.getEntrancePresets(), bHasText );
534     mpTabPages[ENTRANCE]->SetHelpId( HID_SD_CUSTOMANIMATIONDIALOG_ENTRANCE );
535     mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_ENTRANCE, mpTabPages[ENTRANCE] );
536     mpTabPages[EMPHASIS] = new CustomAnimationCreateTabPage( mpTabControl, this, EMPHASIS, rPresets.getEmphasisPresets(), bHasText );
537     mpTabPages[EMPHASIS]->SetHelpId( HID_SD_CUSTOMANIMATIONDIALOG_EMPHASIS );
538     mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_EMPHASIS, mpTabPages[EMPHASIS] );
539     mpTabPages[EXIT] = new CustomAnimationCreateTabPage( mpTabControl, this, EXIT, rPresets.getExitPresets(), bHasText );
540     mpTabPages[EXIT]->SetHelpId( HID_SD_CUSTOMANIMATIONDIALOG_EXIT );
541     mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_EXIT, mpTabPages[EXIT] );
542     mpTabPages[MOTIONPATH] = new CustomAnimationCreateTabPage( mpTabControl, this, MOTIONPATH, rPresets.getMotionPathsPresets(), bHasText );
543     mpTabPages[MOTIONPATH]->SetHelpId( HID_SD_CUSTOMANIMATIONDIALOG_MOTIONPATH );
544     mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_MOTIONPATH, mpTabPages[MOTIONPATH] );
545     mpTabPages[MISCEFFECTS] = new CustomAnimationCreateTabPage( mpTabControl, this, MISCEFFECTS, rPresets.getMiscPresets(), bHasText );
546     mpTabPages[MISCEFFECTS]->SetHelpId( HID_SD_CUSTOMANIMATIONDIALOG_MISCEFFECTS );
547     mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_MISCEFFECTS, mpTabPages[MISCEFFECTS] );
548 
549     getCurrentPage()->setDuration( mfDuration );
550     getCurrentPage()->setIsPreview( mbIsPreview );
551 
552     mpTabControl->SetActivatePageHdl( LINK( this, CustomAnimationCreateDialog, implActivatePagekHdl ) );
553     mpTabControl->SetDeactivatePageHdl( LINK( this, CustomAnimationCreateDialog, implDeactivatePagekHdl ) );
554 
555     setPosition();
556 
557     // select current preset if available
558     if( rsPresetId.getLength() != 0 )
559     {
560         for( sal_uInt16 i = ENTRANCE; i <= MOTIONPATH; i++ )
561         {
562             if( mpTabPages[i]->select( rsPresetId ) )
563             {
564                 mpTabControl->SetCurPageId( RID_TP_CUSTOMANIMATION_ENTRANCE + i );
565                 break;
566             }
567         }
568     }
569 }
570 
~CustomAnimationCreateDialog()571 CustomAnimationCreateDialog::~CustomAnimationCreateDialog()
572 {
573     storePosition();
574 
575     SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
576     pOptions->SetPreviewNewEffects( getCurrentPage()->getIsPreview() );
577 
578     delete mpTabPages[ENTRANCE];
579     delete mpTabPages[EMPHASIS];
580     delete mpTabPages[EXIT];
581     delete mpTabPages[MOTIONPATH];
582     delete mpTabPages[MISCEFFECTS];
583 
584     delete mpTabControl;
585     delete mpOKButton;
586     delete mpCancelButton;
587     delete mpHelpButton;
588 }
589 
getCurrentPage() const590 CustomAnimationCreateTabPage* CustomAnimationCreateDialog::getCurrentPage() const
591 {
592     switch( mpTabControl->GetCurPageId() )
593     {
594     case RID_TP_CUSTOMANIMATION_ENTRANCE:   return mpTabPages[ENTRANCE];
595     case RID_TP_CUSTOMANIMATION_EMPHASIS:   return mpTabPages[EMPHASIS];
596     case RID_TP_CUSTOMANIMATION_EXIT:       return mpTabPages[EXIT];
597     case RID_TP_CUSTOMANIMATION_MISCEFFECTS:return mpTabPages[MISCEFFECTS];
598     //case RID_TP_CUSTOMANIMATION_MOTIONPATH:
599     default:
600                                             return mpTabPages[MOTIONPATH];
601     }
602 }
603 
getCreatePathKind() const604 PathKind CustomAnimationCreateDialog::getCreatePathKind() const
605 {
606     return getCurrentPage()->getCreatePathKind();
607 }
608 
getSelectedPreset() const609 CustomAnimationPresetPtr CustomAnimationCreateDialog::getSelectedPreset() const
610 {
611     return getCurrentPage()->getSelectedPreset();
612 }
613 
getSelectedDuration() const614 double CustomAnimationCreateDialog::getSelectedDuration() const
615 {
616     return getCurrentPage()->getDuration();
617 }
618 
IMPL_LINK(CustomAnimationCreateDialog,implActivatePagekHdl,Control *,EMPTYARG)619 IMPL_LINK( CustomAnimationCreateDialog, implActivatePagekHdl, Control*, EMPTYARG )
620 {
621     getCurrentPage()->setDuration( mfDuration );
622     getCurrentPage()->setIsPreview( mbIsPreview );
623     return 1;
624 }
625 
IMPL_LINK(CustomAnimationCreateDialog,implDeactivatePagekHdl,Control *,EMPTYARG)626 IMPL_LINK( CustomAnimationCreateDialog, implDeactivatePagekHdl, Control*, EMPTYARG )
627 {
628     mfDuration = getCurrentPage()->getDuration();
629     mbIsPreview = getCurrentPage()->getIsPreview();
630     return 1;
631 }
632 
preview(const CustomAnimationPresetPtr & pPreset) const633 void CustomAnimationCreateDialog::preview( const CustomAnimationPresetPtr& pPreset ) const
634 {
635     MainSequencePtr pSequence( new MainSequence() );
636 
637     std::vector< Any >::const_iterator aIter( mrTargets.begin() );
638     const std::vector< Any >::const_iterator aEnd( mrTargets.end() );
639 
640     const double fDuration = getSelectedDuration();
641 
642     bool bFirst = true;
643     while( aIter != aEnd )
644     {
645         CustomAnimationEffectPtr pNew(
646             pSequence->append( pPreset, (*aIter++), fDuration ) );
647 
648         if( bFirst )
649             bFirst = false;
650         else
651             pNew->setNodeType( EffectNodeType::WITH_PREVIOUS );
652     }
653 
654     mpPane->preview( pSequence->getRootNode() );
655 }
656 
657 namespace
658 {
lcl_GetTopmostParent(Window * pWindow)659 Window * lcl_GetTopmostParent( Window * pWindow )
660 {
661     Window * pResult = 0;
662     Window * pCurrent = pWindow ? pWindow->GetParent() : 0;
663     while( pCurrent )
664     {
665         pResult = pCurrent;
666         pCurrent = pCurrent->GetParent();
667     }
668     return pResult;
669 }
670 }
671 
setPosition()672 void CustomAnimationCreateDialog::setPosition()
673 {
674     SvtViewOptions aDlgOpt(
675         E_TABDIALOG, String::CreateFromInt32( DLG_CUSTOMANIMATION_CREATE ) );
676     if ( aDlgOpt.Exists() )
677     {
678         SetWindowState( ByteString( aDlgOpt.GetWindowState().getStr(),
679                                     RTL_TEXTENCODING_ASCII_US ) );
680     }
681     else
682     {
683         // default position: aligned with right edge of parent
684         Window * pParent = lcl_GetTopmostParent( this );
685         if( pParent )
686         {
687             Point aPos( GetPosPixel());
688             Size  aSize( GetSizePixel());
689             Point aParentPos( pParent->GetPosPixel());
690             Size  aParentSize( pParent->GetSizePixel());
691 
692             // right center
693             aPos.setX( aParentSize.getWidth() - aSize.getWidth() );
694             aPos.setY( (aParentSize.getHeight() - aSize.getHeight()) / 2 );
695             SetPosPixel( aPos );
696         }
697     }
698 }
699 
storePosition()700 void CustomAnimationCreateDialog::storePosition()
701 {
702     // save settings (screen position and current page)
703     SvtViewOptions aDlgOpt(
704         E_TABDIALOG, String::CreateFromInt32( DLG_CUSTOMANIMATION_CREATE ) );
705     aDlgOpt.SetWindowState(
706         OUString::createFromAscii( GetWindowState( WINDOWSTATE_MASK_POS ).GetBuffer() ) );
707 }
708 
709 }
710