LCOV - code coverage report
Current view: top level - libreoffice/sd/source/ui/animations - CustomAnimationCreateDialog.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 305 0.3 %
Date: 2012-12-27 Functions: 2 46 4.3 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10