LCOV - code coverage report
Current view: top level - sd/source/ui/animations - CustomAnimationCreateDialog.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 309 0.3 %
Date: 2015-06-13 12:38:46 Functions: 2 50 4.0 %
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             : #include <com/sun/star/i18n/Collator.hpp>
      21             : 
      22             : #include <comphelper/processfactory.hxx>
      23             : #include <vcl/svapp.hxx>
      24             : #include <vcl/tabctrl.hxx>
      25             : #include <vcl/tabpage.hxx>
      26             : 
      27             : #include <vcl/builderfactory.hxx>
      28             : #include <vcl/button.hxx>
      29             : #include <vcl/fixed.hxx>
      30             : #include <vcl/lstbox.hxx>
      31             : #include <vcl/combobox.hxx>
      32             : #include <vcl/settings.hxx>
      33             : 
      34             : #include <svx/svdetc.hxx>
      35             : #include <svx/svdstr.hrc>
      36             : #include "sdresid.hxx"
      37             : #include <unotools/viewoptions.hxx>
      38             : #include <com/sun/star/presentation/EffectNodeType.hpp>
      39             : #include "CustomAnimationCreateDialog.hxx"
      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 ::com::sun::star::uno::UNO_QUERY;
      51             : using ::com::sun::star::uno::UNO_QUERY_THROW;
      52             : using ::com::sun::star::uno::Any;
      53             : using ::com::sun::star::uno::Reference;
      54             : using ::com::sun::star::uno::Exception;
      55             : 
      56             : using namespace ::com::sun::star::presentation;
      57             : 
      58             : namespace sd {
      59             : 
      60             : const int ENTRANCE = 0;
      61             : const int EMPHASIS = 1;
      62             : const int EXIT = 2;
      63             : const int MOTIONPATH = 3;
      64             : const int MISCEFFECTS = 4;
      65             : 
      66             : class CategoryListBox : public ListBox
      67             : {
      68             : public:
      69             :     CategoryListBox( vcl::Window* pParent );
      70             :     virtual ~CategoryListBox();
      71             : 
      72             :     virtual void        MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
      73             : 
      74             :     sal_Int32           InsertCategory( const OUString& rStr, sal_Int32  nPos = LISTBOX_APPEND );
      75             : 
      76           0 :     void            SetDoubleClickLink( const Link<>& rDoubleClickHdl ) { maDoubleClickHdl = rDoubleClickHdl; }
      77             : 
      78             :     DECL_LINK(implDoubleClickHdl, void *);
      79             : 
      80             : private:
      81             :     virtual void    UserDraw( const UserDrawEvent& rUDEvt ) SAL_OVERRIDE;
      82             : 
      83             :     Link<>          maDoubleClickHdl;
      84             : };
      85             : 
      86           0 : CategoryListBox::CategoryListBox( vcl::Window* pParent )
      87           0 : : ListBox( pParent, WB_TABSTOP | WB_BORDER )
      88             : {
      89           0 :     EnableUserDraw( true );
      90           0 :     SetDoubleClickHdl( LINK( this, CategoryListBox, implDoubleClickHdl ) );
      91           0 : }
      92             : 
      93           0 : VCL_BUILDER_FACTORY(CategoryListBox)
      94             : 
      95           0 : CategoryListBox::~CategoryListBox()
      96             : {
      97           0 : }
      98             : 
      99           0 : sal_Int32  CategoryListBox::InsertCategory( const OUString& rStr, sal_Int32  nPos /* = LISTBOX_APPEND */ )
     100             : {
     101           0 :     sal_Int32  n = ListBox::InsertEntry( rStr, nPos );
     102           0 :     if( n != LISTBOX_ENTRY_NOTFOUND )
     103           0 :         ListBox::SetEntryFlags( n, ListBox::GetEntryFlags(n) | ListBoxEntryFlags::DisableSelection );
     104             : 
     105           0 :     return n;
     106             : }
     107             : 
     108           0 : void CategoryListBox::UserDraw( const UserDrawEvent& rUDEvt )
     109             : {
     110           0 :     const sal_uInt16 nItem = rUDEvt.GetItemId();
     111             : 
     112           0 :     if( ListBox::GetEntryFlags(nItem) & ListBoxEntryFlags::DisableSelection )
     113             :     {
     114           0 :         Rectangle aOutRect( rUDEvt.GetRect() );
     115           0 :         OutputDevice* pDev = rUDEvt.GetDevice();
     116             : 
     117             :         // fill the background
     118           0 :         Color aColor (GetSettings().GetStyleSettings().GetDialogColor());
     119             : 
     120           0 :         pDev->SetFillColor (aColor);
     121           0 :         pDev->SetLineColor ();
     122           0 :         pDev->DrawRect(aOutRect);
     123             : 
     124             :         // Erase the four corner pixels to make the rectangle appear rounded.
     125           0 :         pDev->SetLineColor( GetSettings().GetStyleSettings().GetWindowColor());
     126           0 :         pDev->DrawPixel( aOutRect.TopLeft());
     127           0 :         pDev->DrawPixel( Point(aOutRect.Right(), aOutRect.Top()));
     128           0 :         pDev->DrawPixel( Point(aOutRect.Left(), aOutRect.Bottom()));
     129           0 :         pDev->DrawPixel( Point(aOutRect.Right(), aOutRect.Bottom()));
     130             : 
     131             :         // draw the category title
     132           0 :         pDev->DrawText (aOutRect, GetEntry(nItem), DrawTextFlags::Center );
     133             :     }
     134             :     else
     135             :     {
     136           0 :         DrawEntry( rUDEvt, true, true );
     137             :     }
     138           0 : }
     139             : 
     140           0 : IMPL_LINK_NOARG(CategoryListBox, implDoubleClickHdl)
     141             : {
     142           0 :     CaptureMouse();
     143           0 :     return 0;
     144             : }
     145             : 
     146           0 : void CategoryListBox::MouseButtonUp( const MouseEvent& rMEvt )
     147             : {
     148           0 :     ReleaseMouse();
     149           0 :     if( rMEvt.IsLeft() && (rMEvt.GetClicks() == 2) )
     150             :     {
     151           0 :         if( maDoubleClickHdl.IsSet() )
     152           0 :             maDoubleClickHdl.Call( this );
     153             :     }
     154             :     else
     155             :     {
     156           0 :         ListBox::MouseButtonUp( rMEvt );
     157             :     }
     158           0 : }
     159             : 
     160             : class CustomAnimationCreateTabPage : public TabPage
     161             : {
     162             : public:
     163             :     CustomAnimationCreateTabPage( vcl::Window* pParent, CustomAnimationCreateDialog* pDialogParent, sal_uInt16 nTabId, const PresetCategoryList& rCategoryList, bool bHasText, bool bIsMotionPath = false );
     164             :     virtual ~CustomAnimationCreateTabPage();
     165             :     virtual void dispose() SAL_OVERRIDE;
     166             : 
     167             :     PathKind getCreatePathKind() const;
     168             :     CustomAnimationPresetPtr getSelectedPreset() const;
     169             :     double getDuration() const;
     170             :     void setDuration( double fDuration );
     171             : 
     172             :     bool getIsPreview() const;
     173             :     void setIsPreview( bool bIsPreview );
     174             : 
     175           0 :     sal_uInt16 getId() const { return mnId;}
     176             : 
     177             :     bool select( const OUString& rsPresetId );
     178             : 
     179             : private:
     180             :     DECL_LINK( implSelectHdl, Control* );
     181             :     DECL_LINK( implDoubleClickHdl, Control* );
     182             : 
     183             :     void onSelectEffect();
     184             : 
     185             :     void clearEffects();
     186             : 
     187             : private:
     188             :     VclPtr<CategoryListBox>    mpLBEffects;
     189             :     VclPtr<FixedText>  mpFTSpeed;
     190             :     VclPtr<ListBox>    mpCBSpeed;
     191             :     VclPtr<CheckBox>   mpCBXPReview;
     192             : 
     193             :     VclPtr<CustomAnimationCreateDialog>        mpParent;
     194             : 
     195             :     sal_uInt16 mnId;
     196             : 
     197             :     sal_Int32 mnCurvePathPos;
     198             :     sal_Int32 mnPolygonPathPos;
     199             :     sal_Int32 mnFreeformPathPos;
     200             : 
     201             : };
     202             : 
     203           0 : struct ImplStlEffectCategorySortHelper
     204             : {
     205             :     ImplStlEffectCategorySortHelper();
     206             :     bool operator()( const CustomAnimationPresetPtr& p1, const CustomAnimationPresetPtr& p2 );
     207             : 
     208             : private:
     209             :     uno::Reference< i18n::XCollator > mxCollator;
     210             : };
     211             : 
     212           0 : ImplStlEffectCategorySortHelper::ImplStlEffectCategorySortHelper()
     213             : {
     214           0 :     mxCollator = i18n::Collator::create( ::comphelper::getProcessComponentContext() );
     215             : 
     216           0 :     const lang::Locale& rLocale = Application::GetSettings().GetLanguageTag().getLocale();
     217           0 :     mxCollator->loadDefaultCollator(rLocale, 0);
     218           0 : }
     219             : 
     220           0 : bool ImplStlEffectCategorySortHelper::operator()( const CustomAnimationPresetPtr& p1, const CustomAnimationPresetPtr& p2 )
     221             : {
     222           0 :     return mxCollator->compareString(p1->getLabel(), p2->getLabel()) == -1;
     223             : }
     224             : 
     225           0 : CustomAnimationCreateTabPage::CustomAnimationCreateTabPage( vcl::Window* pParent, CustomAnimationCreateDialog* pDialogParent, sal_uInt16 nTabId, const PresetCategoryList& rCategoryList, bool bHasText, bool bIsMotionPath )
     226             : : TabPage( pParent, "CustomAnimationCreateTab", "modules/simpress/ui/customanimationcreatetab.ui" )
     227             : , mpParent( pDialogParent )
     228             : , mnId( nTabId )
     229             : , mnCurvePathPos( LISTBOX_ENTRY_NOTFOUND )
     230             : , mnPolygonPathPos( LISTBOX_ENTRY_NOTFOUND )
     231           0 : , mnFreeformPathPos( LISTBOX_ENTRY_NOTFOUND )
     232             : {
     233           0 :     get( mpLBEffects, "effect_list" );
     234           0 :     mpLBEffects->set_height_request( mpLBEffects->GetTextHeight() * 16 );
     235             : 
     236           0 :     get( mpFTSpeed, "effect_speed_label" );
     237           0 :     get( mpCBSpeed, "effect_speed_list" );
     238           0 :     get( mpCBXPReview, "auto_preview" );
     239             : 
     240           0 :     fillDurationComboBox(mpCBSpeed);
     241             : 
     242           0 :     OUString sMotionPathLabel( SD_RESSTR( STR_CUSTOMANIMATION_USERPATH ) );
     243             : 
     244           0 :     sal_Int32  nFirstEffect = LISTBOX_ENTRY_NOTFOUND;
     245             : 
     246           0 :     if( bIsMotionPath )
     247             :     {
     248           0 :         mpLBEffects->InsertCategory( sMotionPathLabel );
     249             : 
     250           0 :         mnCurvePathPos = nFirstEffect = mpLBEffects->InsertEntry( sdr::GetResourceString(STR_ObjNameSingulCOMBLINE) );
     251           0 :         mnPolygonPathPos = mpLBEffects->InsertEntry( sdr::GetResourceString(STR_ObjNameSingulPOLY) );
     252           0 :         mnFreeformPathPos = mpLBEffects->InsertEntry( sdr::GetResourceString(STR_ObjNameSingulFREELINE) );
     253             :     };
     254             : 
     255           0 :     PresetCategoryList::const_iterator aCategoryIter( rCategoryList.begin() );
     256           0 :     const PresetCategoryList::const_iterator aCategoryEnd( rCategoryList.end() );
     257           0 :     while( aCategoryIter != aCategoryEnd )
     258             :     {
     259           0 :         PresetCategoryPtr pCategory( *aCategoryIter++ );
     260           0 :         if( pCategory.get() )
     261             :         {
     262           0 :             mpLBEffects->InsertCategory( pCategory->maLabel );
     263             : 
     264           0 :             std::vector< CustomAnimationPresetPtr > aSortedVector(pCategory->maEffects.size());
     265           0 :             std::copy( pCategory->maEffects.begin(), pCategory->maEffects.end(), aSortedVector.begin() );
     266           0 :             ImplStlEffectCategorySortHelper aSortHelper;
     267           0 :             std::sort( aSortedVector.begin(), aSortedVector.end(), aSortHelper );
     268             : 
     269           0 :             std::vector< CustomAnimationPresetPtr >::const_iterator aIter( aSortedVector.begin() );
     270           0 :             const std::vector< CustomAnimationPresetPtr >::const_iterator aEnd( aSortedVector.end() );
     271           0 :             while( aIter != aEnd )
     272             :             {
     273           0 :                 CustomAnimationPresetPtr pDescriptor = (*aIter++);
     274           0 :                 if( pDescriptor.get() && (bHasText || !pDescriptor->isTextOnly() ) )
     275             :                 {
     276           0 :                     sal_Int32 nPos = mpLBEffects->InsertEntry( pDescriptor->getLabel() );
     277           0 :                     mpLBEffects->SetEntryData( nPos, static_cast<void*>( new CustomAnimationPresetPtr( pDescriptor ) ) );
     278             : 
     279           0 :                     if( nFirstEffect == LISTBOX_ENTRY_NOTFOUND )
     280           0 :                         nFirstEffect = nPos;
     281             :                 }
     282           0 :             }
     283             :         }
     284           0 :     }
     285             : 
     286           0 :     mpLBEffects->SelectEntryPos( nFirstEffect );
     287             : 
     288           0 :     if( nFirstEffect != LISTBOX_ENTRY_NOTFOUND )
     289           0 :         onSelectEffect();
     290             : 
     291           0 :     mpLBEffects->SetSelectHdl( LINK( this, CustomAnimationCreateTabPage, implSelectHdl ) );
     292           0 :     mpLBEffects->SetDoubleClickLink( LINK( this, CustomAnimationCreateTabPage, implDoubleClickHdl ) );
     293           0 : }
     294             : 
     295           0 : CustomAnimationCreateTabPage::~CustomAnimationCreateTabPage()
     296             : {
     297           0 :     disposeOnce();
     298           0 : }
     299             : 
     300           0 : void CustomAnimationCreateTabPage::dispose()
     301             : {
     302           0 :     clearEffects();
     303           0 :     mpLBEffects.clear();
     304           0 :     mpFTSpeed.clear();
     305           0 :     mpCBSpeed.clear();
     306           0 :     mpCBXPReview.clear();
     307           0 :     mpParent.clear();
     308           0 :     TabPage::dispose();
     309           0 : }
     310             : 
     311           0 : IMPL_LINK( CustomAnimationCreateTabPage, implSelectHdl, Control*, pControl )
     312             : {
     313           0 :     if( pControl == mpLBEffects )
     314           0 :         onSelectEffect();
     315           0 :     return 0;
     316             : }
     317             : 
     318           0 : IMPL_LINK( CustomAnimationCreateTabPage, implDoubleClickHdl, Control*, pControl )
     319             : {
     320           0 :     if( pControl == mpLBEffects )
     321             :     {
     322           0 :         if( mpLBEffects->GetSelectEntryCount() )
     323           0 :             mpParent->EndDialog( RET_OK );
     324             :     }
     325           0 :     return 0;
     326             : }
     327             : 
     328           0 : void CustomAnimationCreateTabPage::onSelectEffect()
     329             : {
     330           0 :     CustomAnimationPresetPtr*p = static_cast< CustomAnimationPresetPtr* >( mpLBEffects->GetSelectEntryData() );
     331             : 
     332           0 :     if( !p )
     333           0 :         return;
     334             : 
     335           0 :     CustomAnimationPresetPtr pPreset( *p );
     336             : 
     337           0 :     const double fDuration = pPreset->getDuration();
     338           0 :     sal_Int32 nPos = LISTBOX_ENTRY_NOTFOUND;
     339             : 
     340           0 :     if( fDuration == 5.0 )
     341           0 :         nPos = 0;
     342           0 :     else if( fDuration == 3.0 )
     343           0 :         nPos = 1;
     344           0 :     else if( fDuration == 2.0 )
     345           0 :         nPos = 2;
     346           0 :     else if( fDuration == 1.0 )
     347           0 :         nPos = 3;
     348           0 :     else if( fDuration == 0.5 )
     349           0 :         nPos = 4;
     350             : 
     351           0 :     mpCBSpeed->SelectEntryPos( nPos );
     352             : 
     353           0 :     bool bHasSpeed = pPreset->getDuration() > 0.001;
     354           0 :     mpCBSpeed->Enable( bHasSpeed );
     355           0 :     mpFTSpeed->Enable( bHasSpeed );
     356             : 
     357           0 :     if( mpCBXPReview->IsChecked() )
     358             :     {
     359           0 :         mpParent->preview( pPreset );
     360           0 :     }
     361             : }
     362             : 
     363           0 : void CustomAnimationCreateTabPage::clearEffects()
     364             : {
     365           0 :     sal_Int32 nPos = mpLBEffects->GetEntryCount();
     366           0 :     while( nPos-- )
     367           0 :         delete static_cast< CustomAnimationPresetPtr* >( mpLBEffects->GetEntryData( nPos ) );
     368             : 
     369           0 :     mpLBEffects->Clear();
     370           0 : }
     371             : 
     372           0 : CustomAnimationPresetPtr CustomAnimationCreateTabPage::getSelectedPreset() const
     373             : {
     374           0 :     CustomAnimationPresetPtr pPreset;
     375             : 
     376           0 :     if( mpLBEffects->GetSelectEntryCount() == 1 )
     377             :     {
     378           0 :         void* pEntryData = mpLBEffects->GetSelectEntryData();
     379           0 :         if( pEntryData )
     380           0 :             pPreset = *static_cast< CustomAnimationPresetPtr* >( pEntryData );
     381             :     }
     382             : 
     383           0 :     return pPreset;
     384             : }
     385             : 
     386           0 : PathKind CustomAnimationCreateTabPage::getCreatePathKind() const
     387             : {
     388           0 :     PathKind eKind = PathKind::NONE;
     389             : 
     390           0 :     if( mpLBEffects->GetSelectEntryCount() == 1 )
     391             :     {
     392           0 :         const sal_Int32 nPos = mpLBEffects->GetSelectEntryPos();
     393           0 :         if( nPos == mnCurvePathPos )
     394             :         {
     395           0 :             eKind = PathKind::CURVE;
     396             :         }
     397           0 :         else if( nPos == mnPolygonPathPos )
     398             :         {
     399           0 :             eKind = PathKind::POLYGON;
     400             :         }
     401           0 :         else if( nPos == mnFreeformPathPos )
     402             :         {
     403           0 :             eKind = PathKind::FREEFORM;
     404             :         }
     405             :     }
     406             : 
     407           0 :     return eKind;
     408             : }
     409             : 
     410           0 : double CustomAnimationCreateTabPage::getDuration() const
     411             : {
     412           0 :     sal_Int32 nPos = mpCBSpeed->GetSelectEntryPos();
     413           0 :     if( (nPos == LISTBOX_ENTRY_NOTFOUND) || !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_Int32 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();
     464             : }
     465             : 
     466           0 : void CustomAnimationCreateTabPage::setIsPreview( bool bIsPreview )
     467             : {
     468           0 :     mpCBXPReview->Check( bIsPreview );
     469           0 : }
     470             : 
     471           0 : bool CustomAnimationCreateTabPage::select( const OUString& rsPresetId )
     472             : {
     473           0 :     sal_Int32 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           0 : CustomAnimationCreateDialog::CustomAnimationCreateDialog( vcl::Window* pParent, CustomAnimationPane* pPane, const std::vector< ::com::sun::star::uno::Any >& rTargets, bool bHasText, const OUString& rsPresetId, double fDuration  )
     492             : :   TabDialog( pParent, "CustomAnimationCreate", "modules/simpress/ui/customanimationcreatedialog.ui" )
     493             : ,   mpPane( pPane )
     494             : ,   mrTargets( rTargets )
     495           0 : ,   mfDuration( fDuration )
     496             : {
     497           0 :     get( mpTabControl, "tabs" );
     498             : 
     499           0 :     SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
     500           0 :     mbIsPreview = pOptions->IsPreviewNewEffects();
     501             : 
     502           0 :     mnEntranceId = mpTabControl->GetPageId("entrance");
     503           0 :     mnEmphasisId = mpTabControl->GetPageId("emphasis");
     504           0 :     mnExitId = mpTabControl->GetPageId("exit");
     505           0 :     mnMPathId = mpTabControl->GetPageId("motion_paths");
     506           0 :     mnMiscId = mpTabControl->GetPageId("misc_effects");
     507             : 
     508           0 :     const CustomAnimationPresets& rPresets = CustomAnimationPresets::getCustomAnimationPresets();
     509           0 :     mpTabPages[ENTRANCE] = VclPtr<CustomAnimationCreateTabPage>::Create( mpTabControl, this, mnEntranceId, rPresets.getEntrancePresets(), bHasText );
     510           0 :     mpTabControl->SetTabPage( mnEntranceId, mpTabPages[ENTRANCE] );
     511           0 :     mpTabPages[EMPHASIS] = VclPtr<CustomAnimationCreateTabPage>::Create( mpTabControl, this, mnEmphasisId, rPresets.getEmphasisPresets(), bHasText );
     512           0 :     mpTabControl->SetTabPage( mnEmphasisId, mpTabPages[EMPHASIS] );
     513           0 :     mpTabPages[EXIT] = VclPtr<CustomAnimationCreateTabPage>::Create( mpTabControl, this, mnExitId, rPresets.getExitPresets(), bHasText );
     514           0 :     mpTabControl->SetTabPage( mnExitId, mpTabPages[EXIT] );
     515           0 :     mpTabPages[MOTIONPATH] = VclPtr<CustomAnimationCreateTabPage>::Create( mpTabControl, this, mnMPathId, rPresets.getMotionPathsPresets(), bHasText, true );
     516           0 :     mpTabControl->SetTabPage( mnMPathId, mpTabPages[MOTIONPATH] );
     517           0 :     mpTabPages[MISCEFFECTS] = VclPtr<CustomAnimationCreateTabPage>::Create( mpTabControl, this, mnMiscId, rPresets.getMiscPresets(), bHasText );
     518           0 :     mpTabControl->SetTabPage( mnMiscId, mpTabPages[MISCEFFECTS] );
     519             : 
     520           0 :     getCurrentPage()->setDuration( mfDuration );
     521           0 :     getCurrentPage()->setIsPreview( mbIsPreview );
     522             : 
     523           0 :     mpTabControl->SetActivatePageHdl( LINK( this, CustomAnimationCreateDialog, implActivatePagekHdl ) );
     524           0 :     mpTabControl->SetDeactivatePageHdl( LINK( this, CustomAnimationCreateDialog, implDeactivatePagekHdl ) );
     525             : 
     526           0 :     setPosition();
     527             : 
     528             :     // select current preset if available
     529           0 :     if( !rsPresetId.isEmpty() )
     530             :     {
     531           0 :         for( sal_uInt16 i = ENTRANCE; i <= MISCEFFECTS; i++ )
     532             :         {
     533           0 :             if( mpTabPages[i]->select( rsPresetId ) )
     534             :             {
     535           0 :                 mpTabControl->SetCurPageId( mpTabPages[i]->getId() );
     536           0 :                 break;
     537             :             }
     538             :         }
     539             :     }
     540           0 : }
     541             : 
     542           0 : CustomAnimationCreateDialog::~CustomAnimationCreateDialog()
     543             : {
     544           0 :     disposeOnce();
     545           0 : }
     546             : 
     547           0 : void CustomAnimationCreateDialog::dispose()
     548             : {
     549           0 :     storePosition();
     550             : 
     551           0 :     SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
     552           0 :     pOptions->SetPreviewNewEffects( getCurrentPage()->getIsPreview() );
     553             : 
     554           0 :     mpTabPages[ENTRANCE].disposeAndClear();
     555           0 :     mpTabPages[EMPHASIS].disposeAndClear();
     556           0 :     mpTabPages[EXIT].disposeAndClear();
     557           0 :     mpTabPages[MOTIONPATH].disposeAndClear();
     558           0 :     mpTabPages[MISCEFFECTS].disposeAndClear();
     559             : 
     560           0 :     mpTabControl.clear();
     561           0 :     mpPane.clear();
     562           0 :     TabDialog::dispose();
     563           0 : }
     564             : 
     565           0 : CustomAnimationCreateTabPage* CustomAnimationCreateDialog::getCurrentPage() const
     566             : {
     567           0 :     sal_Int16 curPageId = mpTabControl->GetCurPageId();
     568             : 
     569           0 :     for( sal_uInt16 i = ENTRANCE; i <= MISCEFFECTS; i++ )
     570             :     {
     571           0 :         if( mpTabPages[i]->getId() == curPageId )
     572           0 :             return mpTabPages[i];
     573             :     }
     574           0 :     return mpTabPages[MOTIONPATH];
     575             : }
     576             : 
     577           0 : PathKind CustomAnimationCreateDialog::getCreatePathKind() const
     578             : {
     579           0 :     return getCurrentPage()->getCreatePathKind();
     580             : }
     581             : 
     582           0 : CustomAnimationPresetPtr CustomAnimationCreateDialog::getSelectedPreset() const
     583             : {
     584           0 :     return getCurrentPage()->getSelectedPreset();
     585             : }
     586             : 
     587           0 : double CustomAnimationCreateDialog::getSelectedDuration() const
     588             : {
     589           0 :     return getCurrentPage()->getDuration();
     590             : }
     591             : 
     592           0 : IMPL_LINK_NOARG(CustomAnimationCreateDialog, implActivatePagekHdl)
     593             : {
     594           0 :     getCurrentPage()->setDuration( mfDuration );
     595           0 :     getCurrentPage()->setIsPreview( mbIsPreview );
     596           0 :     return 1;
     597             : }
     598             : 
     599           0 : IMPL_LINK_NOARG_TYPED(CustomAnimationCreateDialog, implDeactivatePagekHdl, TabControl *, bool)
     600             : {
     601           0 :     mfDuration = getCurrentPage()->getDuration();
     602           0 :     mbIsPreview = getCurrentPage()->getIsPreview();
     603           0 :     return true;
     604             : }
     605             : 
     606           0 : void CustomAnimationCreateDialog::preview( const CustomAnimationPresetPtr& pPreset ) const
     607             : {
     608           0 :     MainSequencePtr pSequence( new MainSequence() );
     609             : 
     610           0 :     std::vector< Any >::const_iterator aIter( mrTargets.begin() );
     611           0 :     const std::vector< Any >::const_iterator aEnd( mrTargets.end() );
     612             : 
     613           0 :     const double fDuration = getSelectedDuration();
     614             : 
     615           0 :     bool bFirst = true;
     616           0 :     while( aIter != aEnd )
     617             :     {
     618             :         CustomAnimationEffectPtr pNew(
     619           0 :             pSequence->append( pPreset, (*aIter++), fDuration ) );
     620             : 
     621           0 :         if( bFirst )
     622           0 :             bFirst = false;
     623             :         else
     624           0 :             pNew->setNodeType( EffectNodeType::WITH_PREVIOUS );
     625           0 :     }
     626             : 
     627           0 :     mpPane->preview( pSequence->getRootNode() );
     628           0 : }
     629             : 
     630             : namespace
     631             : {
     632           0 : vcl::Window * lcl_GetTopmostParent( vcl::Window * pWindow )
     633             : {
     634           0 :     vcl::Window * pResult = 0;
     635           0 :     vcl::Window * pCurrent = pWindow ? pWindow->GetParent() : 0;
     636           0 :     while( pCurrent )
     637             :     {
     638           0 :         pResult = pCurrent;
     639           0 :         pCurrent = pCurrent->GetParent();
     640             :     }
     641           0 :     return pResult;
     642             : }
     643             : }
     644             : 
     645           0 : void CustomAnimationCreateDialog::setPosition()
     646             : {
     647           0 :     SvtViewOptions aDlgOpt(E_TABDIALOG, OStringToOUString(GetHelpId(), RTL_TEXTENCODING_UTF8));
     648           0 :     if ( aDlgOpt.Exists() )
     649             :     {
     650             :         SetWindowState( OUStringToOString(aDlgOpt.GetWindowState(),
     651           0 :             RTL_TEXTENCODING_ASCII_US) );
     652             :     }
     653             :     else
     654             :     {
     655             :         // default position: aligned with right edge of parent
     656           0 :         vcl::Window * pParent = lcl_GetTopmostParent( this );
     657           0 :         if( pParent )
     658             :         {
     659           0 :             Point aPos( GetPosPixel());
     660           0 :             Size  aSize( GetSizePixel());
     661           0 :             Size  aParentSize( pParent->GetSizePixel());
     662             : 
     663             :             // right center
     664           0 :             aPos.setX( aParentSize.getWidth() - aSize.getWidth() );
     665           0 :             aPos.setY( (aParentSize.getHeight() - aSize.getHeight()) / 2 );
     666           0 :             SetPosPixel( aPos );
     667             :         }
     668           0 :     }
     669           0 : }
     670             : 
     671           0 : void CustomAnimationCreateDialog::storePosition()
     672             : {
     673             :     // save settings (screen position and current page)
     674           0 :     SvtViewOptions aDlgOpt(E_TABDIALOG, OStringToOUString(GetHelpId(), RTL_TEXTENCODING_UTF8));
     675             :     aDlgOpt.SetWindowState(OStringToOUString(
     676           0 :         GetWindowState(WINDOWSTATE_MASK_POS), RTL_TEXTENCODING_ASCII_US));
     677           0 : }
     678             : 
     679          66 : }
     680             : 
     681             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11