diff options
Diffstat (limited to 'sd/source/ui/animations/CustomAnimationDialog.cxx')
-rw-r--r-- | sd/source/ui/animations/CustomAnimationDialog.cxx | 2638 |
1 files changed, 2638 insertions, 0 deletions
diff --git a/sd/source/ui/animations/CustomAnimationDialog.cxx b/sd/source/ui/animations/CustomAnimationDialog.cxx new file mode 100644 index 000000000000..7f942562b951 --- /dev/null +++ b/sd/source/ui/animations/CustomAnimationDialog.cxx @@ -0,0 +1,2638 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sd.hxx" +#include <com/sun/star/presentation/EffectNodeType.hpp> +#include <com/sun/star/animations/Timing.hpp> +#include <com/sun/star/animations/Event.hpp> +#include <com/sun/star/animations/EventTrigger.hpp> +#include <com/sun/star/animations/AnimationFill.hpp> +#include <com/sun/star/presentation/TextAnimationType.hpp> +#include <com/sun/star/animations/ValuePair.hpp> +#include <com/sun/star/awt/FontSlant.hpp> +#include <com/sun/star/awt/FontWeight.hpp> +#include <com/sun/star/awt/FontUnderline.hpp> +#include <com/sun/star/drawing/XDrawPage.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/media/XManager.hpp> +#include <com/sun/star/media/XPlayer.hpp> + +#ifndef BOOST_SHARED_PTR_HPP_INCLUDED +#include <boost/shared_ptr.hpp> +#endif + +#ifndef _UNOTOOLS_PROCESSFACTORY_HXX +#include <comphelper/processfactory.hxx> +#endif +#include <unotools/pathoptions.hxx> +#include <vcl/tabctrl.hxx> +#include <vcl/tabpage.hxx> +#include <vcl/menubtn.hxx> +#include <vcl/svapp.hxx> +#include <vcl/fixed.hxx> +#include <vcl/lstbox.hxx> +#include <vcl/field.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/decoview.hxx> +#include <vcl/combobox.hxx> +#include <vcl/menu.hxx> +#include <svtools/ctrlbox.hxx> +#include <svtools/ctrltool.hxx> +#include <sfx2/objsh.hxx> + +#ifndef _SVX_SVXIDS_HRC +#include <svx/svxids.hrc> +#endif +#include <svx/dialmgr.hxx> +#include <editeng/flstitem.hxx> +#include <svx/drawitem.hxx> + +#include <svx/xtable.hxx> +#include <svx/gallery.hxx> + +#ifndef _SVX_DIALOGS_HRC +#include <svx/dialogs.hrc> +#endif +#include "sdresid.hxx" + +#include "glob.hrc" +#include "CustomAnimationDialog.hxx" +#ifndef _SD_CUSTOMANIMATIONDIALOG_HRC +#include "CustomAnimationDialog.hrc" +#endif +#ifndef _SD_CUSTOMANIMATION_HRC +#include "CustomAnimation.hrc" +#endif +#include "STLPropertySet.hxx" + +#include <avmedia/mediawindow.hxx> + +#include "filedlg.hxx" +#include "strings.hrc" +#include "helpids.h" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::animations; +using namespace ::com::sun::star::presentation; + +using ::rtl::OUString; +using ::com::sun::star::uno::UNO_QUERY; +using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::uno::Any; +using ::com::sun::star::uno::makeAny; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Exception; +using ::com::sun::star::drawing::XShape; +using ::com::sun::star::drawing::XDrawPage; +using ::com::sun::star::beans::XPropertySet; + +namespace sd { + +extern void fillRepeatComboBox( ComboBox* pBox ); +extern void fillDurationComboBox( ComboBox* pBox ); +extern OUString getShapeDescription( const Reference< XShape >& xShape, bool bWithText = true ); +extern OUString getPropertyName( sal_Int32 nPropertyType ); + +// ==================================================================== + +class PresetPropertyBox : public PropertySubControl +{ +public: + PresetPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const OUString& aPresetId, const Link& rModifyHdl ); + ~PresetPropertyBox(); + + virtual Any getValue(); + virtual void setValue( const Any& rValue, const OUString& rPresetId ); + virtual Control* getControl(); + +private: + std::map< USHORT, rtl::OUString > maPropertyValues; + ListBox* mpControl; +}; + +// -------------------------------------------------------------------- + +PresetPropertyBox::PresetPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const OUString& aPresetId, const Link& rModifyHdl ) +: PropertySubControl( nControlType ) +{ + mpControl = new ListBox( pParent, WB_BORDER|WB_TABSTOP|WB_DROPDOWN ); + mpControl->SetDropDownLineCount( 10 ); + mpControl->SetSelectHdl( rModifyHdl ); + mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_PRESETPROPERTYBOX ); + + setValue( rValue, aPresetId ); + +} + +void PresetPropertyBox::setValue( const Any& rValue, const OUString& rPresetId ) +{ + if( mpControl ) + { + mpControl->Clear(); + + const CustomAnimationPresets& rPresets = CustomAnimationPresets::getCustomAnimationPresets(); + CustomAnimationPresetPtr pDescriptor = rPresets.getEffectDescriptor( rPresetId ); + if( pDescriptor.get() ) + { + + OUString aPropertyValue; + rValue >>= aPropertyValue; + + UStringList aSubTypes( pDescriptor->getSubTypes() ); + UStringList::iterator aIter( aSubTypes.begin() ); + const UStringList::iterator aEnd( aSubTypes.end() ); + + mpControl->Enable( aIter != aEnd ); + + while( aIter != aEnd ) + { + USHORT nPos = mpControl->InsertEntry( rPresets.getUINameForProperty( (*aIter) ) ); + if( (*aIter) == aPropertyValue ) + mpControl->SelectEntryPos( nPos ); + maPropertyValues[nPos] = (*aIter++); + } + } + else + { + mpControl->Enable( FALSE ); + } + } +} + +// -------------------------------------------------------------------- + +PresetPropertyBox::~PresetPropertyBox() +{ + delete mpControl; +} + +// -------------------------------------------------------------------- + +Any PresetPropertyBox::getValue() +{ + return makeAny( maPropertyValues[mpControl->GetSelectEntryPos()] ); +} + +// -------------------------------------------------------------------- + +Control* PresetPropertyBox::getControl() +{ + return mpControl; +} + +// ==================================================================== + +class ColorPropertyBox : public PropertySubControl +{ +public: + ColorPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ); + ~ColorPropertyBox(); + + virtual Any getValue(); + virtual void setValue( const Any& rValue, const OUString& rPresetId ); + virtual Control* getControl(); + +private: + ColorListBox* mpControl; +}; + +// -------------------------------------------------------------------- + +ColorPropertyBox::ColorPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ) +: PropertySubControl( nControlType ) +{ + mpControl = new ColorListBox( pParent, WB_BORDER|WB_TABSTOP|WB_DROPDOWN ); + mpControl->SetDropDownLineCount( 10 ); + mpControl->SetSelectHdl( rModifyHdl ); + mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_COLORPROPERTYBOX ); + + SfxObjectShell* pDocSh = SfxObjectShell::Current(); + DBG_ASSERT( pDocSh, "DocShell not found!" ); + XColorTable* pColorTable = NULL; + bool bKillTable = false; + const SfxPoolItem* pItem = NULL; + + if ( pDocSh && ( ( pItem = pDocSh->GetItem( SID_COLOR_TABLE ) ) != 0) ) + pColorTable = ( (SvxColorTableItem*)pItem )->GetColorTable(); + + if ( !pColorTable ) + { + pColorTable = new XColorTable( SvtPathOptions().GetPalettePath() ); + bKillTable = TRUE; + } + + sal_Int32 nColor = 0; + rValue >>= nColor; + + for ( long i = 0; i < pColorTable->Count(); i++ ) + { + XColorEntry* pEntry = pColorTable->GetColor(i); + USHORT nPos = mpControl->InsertEntry( pEntry->GetColor(), pEntry->GetName() ); + if( pEntry->GetColor().GetRGBColor() == (sal_uInt32)nColor ) + mpControl->SelectEntryPos( nPos ); + } + + if ( bKillTable ) + delete pColorTable; +} + +// -------------------------------------------------------------------- + +ColorPropertyBox::~ColorPropertyBox() +{ + delete mpControl; +} + +// -------------------------------------------------------------------- + +void ColorPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if( mpControl ) + { + sal_Int32 nColor = 0; + rValue >>= nColor; + + mpControl->SetNoSelection(); + mpControl->SelectEntryPos( mpControl->GetEntryPos( (Color)nColor ) ); + } +} + +// -------------------------------------------------------------------- + +Any ColorPropertyBox::getValue() +{ + return makeAny( (sal_Int32)mpControl->GetSelectEntryColor().GetRGBColor() ); +} + +// -------------------------------------------------------------------- + +Control* ColorPropertyBox::getControl() +{ + return mpControl; +} + +// ==================================================================== + +class FontPropertyBox : public PropertySubControl +{ +public: + FontPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ); + virtual ~FontPropertyBox(); + + virtual Any getValue(); + virtual void setValue( const Any& rValue, const OUString& rPresetId ); + + virtual Control* getControl(); + +private: + FontNameBox* mpControl; +}; + +// -------------------------------------------------------------------- + +FontPropertyBox::FontPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ) +: PropertySubControl( nControlType ) +{ + mpControl = new FontNameBox( pParent, WB_BORDER|WB_TABSTOP|WB_DROPDOWN ); + mpControl->SetDropDownLineCount( 10 ); + mpControl->SetSelectHdl( rModifyHdl ); + mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_FONTPROPERTYBOX ); + + SfxObjectShell* pDocSh = SfxObjectShell::Current(); + const SfxPoolItem* pItem; + + const FontList* pFontList = 0; + bool bMustDelete = false; + + if ( pDocSh && ( (pItem = pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST ) ) != 0) ) + pFontList = ( (SvxFontListItem*)pItem )->GetFontList(); + + if(!pFontList) + { + pFontList = new FontList( Application::GetDefaultDevice(), NULL, FALSE ); + bMustDelete = true; + } + + mpControl->Fill( pFontList ); + + if( bMustDelete ) + delete pFontList; + + OUString aPresetId; + setValue( rValue, aPresetId ); +} + +// -------------------------------------------------------------------- + +void FontPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if( mpControl ) + { + OUString aFontName; + rValue >>= aFontName; + mpControl->SetText( aFontName ); + } +} + +// -------------------------------------------------------------------- + +FontPropertyBox::~FontPropertyBox() +{ + delete mpControl; +} + +// -------------------------------------------------------------------- + +Any FontPropertyBox::getValue() +{ + OUString aFontName( mpControl->GetText() ); + return makeAny( aFontName ); +} + +// -------------------------------------------------------------------- + +Control* FontPropertyBox::getControl() +{ + return mpControl; +} + +// ==================================================================== + +class DropdownMenuBox : public Edit +{ +public: + DropdownMenuBox( Window* pParent, Edit* pSubControl, PopupMenu* pMenu ); + ~DropdownMenuBox(); + + void Resize(); + long PreNotify( NotifyEvent& rNEvt ); + + void SetMenuSelectHdl( const Link& rLink ) { mpDropdownButton->SetSelectHdl( rLink ); } + +private: + Edit* mpSubControl; + MenuButton* mpDropdownButton; + PopupMenu* mpMenu; +}; + +// -------------------------------------------------------------------- + +DropdownMenuBox::DropdownMenuBox( Window* pParent, Edit* pSubControl, PopupMenu* pMenu ) +: Edit( pParent, WB_BORDER|WB_TABSTOP| WB_DIALOGCONTROL ), + mpSubControl(pSubControl),mpDropdownButton(0),mpMenu(pMenu) +{ + mpDropdownButton = new MenuButton( this, WB_NOLIGHTBORDER | WB_RECTSTYLE | WB_NOTABSTOP); + mpDropdownButton->SetSymbol(SYMBOL_SPIN_DOWN); + mpDropdownButton->Show(); + mpDropdownButton->SetPopupMenu( pMenu ); + + SetSubEdit( mpSubControl ); + mpSubControl->SetParent( this ); + mpSubControl->Show(); +} + +// -------------------------------------------------------------------- + +DropdownMenuBox::~DropdownMenuBox() +{ + SetSubEdit( 0 ); + delete mpSubControl; + delete mpDropdownButton; + delete mpMenu; +} + +// -------------------------------------------------------------------- + +void DropdownMenuBox::Resize() +{ + Size aOutSz = GetOutputSizePixel(); + + long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize(); + nSBWidth = CalcZoom( nSBWidth ); + mpSubControl->SetPosSizePixel( 0, 1, aOutSz.Width() - nSBWidth, aOutSz.Height()-2 ); + mpDropdownButton->SetPosSizePixel( aOutSz.Width() - nSBWidth, 0, nSBWidth, aOutSz.Height() ); +} + +// -------------------------------------------------------------------- + +long DropdownMenuBox::PreNotify( NotifyEvent& rNEvt ) +{ + long nResult=sal_True; + + sal_uInt16 nSwitch=rNEvt.GetType(); + if (nSwitch==EVENT_KEYINPUT) + { + const KeyCode& aKeyCode=rNEvt.GetKeyEvent()->GetKeyCode(); + sal_uInt16 nKey=aKeyCode.GetCode(); + + if (nKey==KEY_DOWN && aKeyCode.IsMod2()) + { + mpDropdownButton->KeyInput( *rNEvt.GetKeyEvent() ); + } + else + { + nResult=Edit::PreNotify(rNEvt); + } + } + else + nResult=Edit::PreNotify(rNEvt); + + return nResult; +} + +// -------------------------------------------------------------------- + +class CharHeightPropertyBox : public PropertySubControl +{ +public: + CharHeightPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ); + virtual ~CharHeightPropertyBox(); + + virtual Any getValue(); + virtual void setValue( const Any& rValue, const OUString& ); + + virtual Control* getControl(); + + DECL_LINK( implMenuSelectHdl, MenuButton* ); + +private: + DropdownMenuBox* mpControl; + PopupMenu* mpMenu; + MetricField* mpMetric; +}; + +// -------------------------------------------------------------------- + +CharHeightPropertyBox::CharHeightPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ) +: PropertySubControl( nControlType ) +{ + mpMetric = new MetricField( pParent, WB_TABSTOP|WB_IGNORETAB| WB_NOBORDER); + mpMetric->SetUnit( FUNIT_PERCENT ); + mpMetric->SetMin( 0 ); + mpMetric->SetMax( 1000 ); + + mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_FONTSIZE_POPUP ) ); + mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu ); + mpControl->SetMenuSelectHdl( LINK( this, CharHeightPropertyBox, implMenuSelectHdl )); + mpControl->SetModifyHdl( rModifyHdl ); + mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX ); + + OUString aPresetId; + setValue( rValue, aPresetId ); +} + +// -------------------------------------------------------------------- + +CharHeightPropertyBox::~CharHeightPropertyBox() +{ + delete mpControl; +} + +// -------------------------------------------------------------------- + +IMPL_LINK( CharHeightPropertyBox, implMenuSelectHdl, MenuButton*, pPb ) +{ + long nValue = 100; + switch( pPb->GetCurItemId() ) + { + case CM_SIZE_25: nValue = 25; break; + case CM_SIZE_50: nValue = 50; break; + case CM_SIZE_150: nValue = 150; break; + case CM_SIZE_400: nValue = 400; break; + } + mpMetric->SetValue( nValue ); + mpMetric->Modify(); + return 0; +} + +// -------------------------------------------------------------------- + +void CharHeightPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if( mpMetric ) + { + double fValue = 0.0; + rValue >>= fValue; + mpMetric->SetValue( (long)(fValue * 100.0) ); + } +} + +// -------------------------------------------------------------------- + +Any CharHeightPropertyBox::getValue() +{ + return makeAny( (double)((double)mpMetric->GetValue() / 100.0) ); +} + +// -------------------------------------------------------------------- + +Control* CharHeightPropertyBox::getControl() +{ + return mpControl; +} + +// ==================================================================== + +class TransparencyPropertyBox : public PropertySubControl +{ +public: + TransparencyPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ); + ~TransparencyPropertyBox(); + + virtual Any getValue(); + virtual void setValue( const Any& rValue, const OUString& rPresetId ); + + virtual Control* getControl(); + + DECL_LINK( implMenuSelectHdl, MenuButton* ); + DECL_LINK( implModifyHdl, Control* ); + + void updateMenu(); + +private: + DropdownMenuBox* mpControl; + PopupMenu* mpMenu; + MetricField* mpMetric; + Link maModifyHdl; +}; + +// -------------------------------------------------------------------- + +TransparencyPropertyBox::TransparencyPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ) +: PropertySubControl( nControlType ) +, maModifyHdl( rModifyHdl ) +{ + mpMetric = new MetricField( pParent ,WB_TABSTOP|WB_IGNORETAB| WB_NOBORDER); + mpMetric->SetUnit( FUNIT_PERCENT ); + mpMetric->SetMin( 0 ); + mpMetric->SetMax( 100 ); + + mpMenu = new PopupMenu(); + for( USHORT i = 25; i < 101; i += 25 ) + { + String aStr( String::CreateFromInt32( i ) ); + aStr += sal_Unicode('%'); + mpMenu->InsertItem( i, aStr ); + } + + mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu ); + mpControl->SetMenuSelectHdl( LINK( this, TransparencyPropertyBox, implMenuSelectHdl )); + mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX ); + + Link aLink( LINK( this, TransparencyPropertyBox, implModifyHdl ) ); + mpControl->SetModifyHdl( aLink ); + + OUString aPresetId; + setValue( rValue, aPresetId ); +} + +// -------------------------------------------------------------------- + +TransparencyPropertyBox::~TransparencyPropertyBox() +{ + delete mpControl; +} + +// -------------------------------------------------------------------- + +void TransparencyPropertyBox::updateMenu() +{ + sal_Int64 nValue = mpMetric->GetValue(); + for( USHORT i = 25; i < 101; i += 25 ) + mpMenu->CheckItem( i, nValue == i ); +} + +// -------------------------------------------------------------------- + +IMPL_LINK( TransparencyPropertyBox, implModifyHdl, Control*, EMPTYARG ) +{ + updateMenu(); + maModifyHdl.Call(mpMetric); + + return 0; +} + +// -------------------------------------------------------------------- + +IMPL_LINK( TransparencyPropertyBox, implMenuSelectHdl, MenuButton*, pPb ) +{ + if( pPb->GetCurItemId() != mpMetric->GetValue() ) + { + mpMetric->SetValue( pPb->GetCurItemId() ); + mpMetric->Modify(); + } + + return 0; +} + +// -------------------------------------------------------------------- + +void TransparencyPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if( mpMetric ) + { + double fValue = 0.0; + rValue >>= fValue; + long nValue = (long)(fValue * 100); + mpMetric->SetValue( nValue ); + updateMenu(); + } +} + +// -------------------------------------------------------------------- + +Any TransparencyPropertyBox::getValue() +{ + return makeAny( (double)((double)mpMetric->GetValue()) / 100.0 ); +} + +// -------------------------------------------------------------------- + +Control* TransparencyPropertyBox::getControl() +{ + return mpControl; +} + +// -------------------------------------------------------------------- + +class RotationPropertyBox : public PropertySubControl +{ +public: + RotationPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ); + ~RotationPropertyBox(); + + virtual Any getValue(); + virtual void setValue( const Any& rValue, const OUString& ); + + virtual Control* getControl(); + + DECL_LINK( implMenuSelectHdl, MenuButton* ); + DECL_LINK( implModifyHdl, Control* ); + + void updateMenu(); + +private: + DropdownMenuBox* mpControl; + PopupMenu* mpMenu; + MetricField* mpMetric; + Link maModifyHdl; +}; + +// -------------------------------------------------------------------- + +RotationPropertyBox::RotationPropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ) +: PropertySubControl( nControlType ) +, maModifyHdl( rModifyHdl ) +{ + mpMetric = new MetricField( pParent ,WB_TABSTOP|WB_IGNORETAB| WB_NOBORDER); + mpMetric->SetUnit( FUNIT_CUSTOM ); + mpMetric->SetCustomUnitText( OUString( sal_Unicode(0xb0)) ); // degree sign + mpMetric->SetMin( -10000 ); + mpMetric->SetMax( 10000 ); + + mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_ROTATION_POPUP ) ); + mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu ); + mpControl->SetMenuSelectHdl( LINK( this, RotationPropertyBox, implMenuSelectHdl )); + mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX ); + + Link aLink( LINK( this, RotationPropertyBox, implModifyHdl ) ); + mpControl->SetModifyHdl( aLink ); + + OUString aPresetId; + setValue( rValue, aPresetId ); +} + +// -------------------------------------------------------------------- + +RotationPropertyBox::~RotationPropertyBox() +{ + delete mpControl; +} + +// -------------------------------------------------------------------- + +void RotationPropertyBox::updateMenu() +{ + sal_Int64 nValue = mpMetric->GetValue(); + bool bDirection = nValue >= 0; + nValue = (nValue < 0 ? -nValue : nValue); + + mpMenu->CheckItem( CM_QUARTER_SPIN, nValue == 90 ); + mpMenu->CheckItem( CM_HALF_SPIN, nValue == 180 ); + mpMenu->CheckItem( CM_FULL_SPIN, nValue == 360 ); + mpMenu->CheckItem( CM_TWO_SPINS, nValue == 720 ); + + mpMenu->CheckItem( CM_CLOCKWISE, bDirection ); + mpMenu->CheckItem( CM_COUNTERCLOCKWISE, !bDirection ); +} + +// -------------------------------------------------------------------- + +IMPL_LINK( RotationPropertyBox, implModifyHdl, Control*, EMPTYARG ) +{ + updateMenu(); + maModifyHdl.Call(mpMetric); + + return 0; +} + +IMPL_LINK( RotationPropertyBox, implMenuSelectHdl, MenuButton*, pPb ) +{ + sal_Int64 nValue = mpMetric->GetValue(); + bool bDirection = nValue >= 0; + nValue = (nValue < 0 ? -nValue : nValue); + + switch( pPb->GetCurItemId() ) + { + case CM_QUARTER_SPIN: nValue = 90; break; + case CM_HALF_SPIN: nValue = 180; break; + case CM_FULL_SPIN: nValue = 360; break; + case CM_TWO_SPINS: nValue = 720; break; + + case CM_CLOCKWISE: bDirection = true; break; + case CM_COUNTERCLOCKWISE: bDirection = false; break; + + } + + if( !bDirection ) + nValue = -nValue; + + if( nValue != mpMetric->GetValue() ) + { + mpMetric->SetValue( nValue ); + mpMetric->Modify(); + } + + return 0; +} + +// -------------------------------------------------------------------- + +void RotationPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if( mpMetric ) + { + double fValue = 0.0; + rValue >>= fValue; + long nValue = (long)(fValue); + mpMetric->SetValue( nValue ); + updateMenu(); + } +} + +// -------------------------------------------------------------------- + +Any RotationPropertyBox::getValue() +{ + return makeAny( (double)((double)mpMetric->GetValue()) ); +} + +// -------------------------------------------------------------------- + +Control* RotationPropertyBox::getControl() +{ + return mpControl; +} + +// -------------------------------------------------------------------- + +class ScalePropertyBox : public PropertySubControl +{ +public: + ScalePropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ); + ~ScalePropertyBox(); + + virtual Any getValue(); + virtual void setValue( const Any& rValue, const OUString& ); + + virtual Control* getControl(); + + DECL_LINK( implMenuSelectHdl, MenuButton* ); + DECL_LINK( implModifyHdl, Control* ); + + void updateMenu(); + +private: + DropdownMenuBox* mpControl; + PopupMenu* mpMenu; + MetricField* mpMetric; + Link maModifyHdl; + int mnDirection; +}; + +// -------------------------------------------------------------------- + +ScalePropertyBox::ScalePropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ) +: PropertySubControl( nControlType ) +, maModifyHdl( rModifyHdl ) +{ + mpMetric = new MetricField( pParent ,WB_TABSTOP|WB_IGNORETAB| WB_NOBORDER); + mpMetric->SetUnit( FUNIT_PERCENT ); + mpMetric->SetMin( 0 ); + mpMetric->SetMax( 10000 ); + + mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_SCALE_POPUP ) ); + mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu ); + mpControl->SetMenuSelectHdl( LINK( this, ScalePropertyBox, implMenuSelectHdl )); + mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX ); + + Link aLink( LINK( this, ScalePropertyBox, implModifyHdl ) ); + mpControl->SetModifyHdl( aLink ); + + OUString aPresetId; + setValue( rValue, aPresetId ); +} + +// -------------------------------------------------------------------- + +ScalePropertyBox::~ScalePropertyBox() +{ + delete mpControl; +} + +// -------------------------------------------------------------------- + +void ScalePropertyBox::updateMenu() +{ + sal_Int64 nValue = mpMetric->GetValue(); + + mpMenu->CheckItem( 25, nValue == 25 ); + mpMenu->CheckItem( 50, nValue == 50 ); + mpMenu->CheckItem( 150, nValue == 150 ); + mpMenu->CheckItem( 400, nValue == 400 ); + + mpMenu->CheckItem( CM_HORIZONTAL, mnDirection == 1 ); + mpMenu->CheckItem( CM_VERTICAL, mnDirection == 2 ); + mpMenu->CheckItem( CM_BOTH, mnDirection == 3 ); +} + +// -------------------------------------------------------------------- + +IMPL_LINK( ScalePropertyBox, implModifyHdl, Control*, EMPTYARG ) +{ + updateMenu(); + maModifyHdl.Call(mpMetric); + + return 0; +} + +IMPL_LINK( ScalePropertyBox, implMenuSelectHdl, MenuButton*, pPb ) +{ + sal_Int64 nValue = mpMetric->GetValue(); + + int nDirection = mnDirection; + + switch( pPb->GetCurItemId() ) + { + case CM_HORIZONTAL: nDirection = 1; break; + case CM_VERTICAL: nDirection = 2; break; + case CM_BOTH: nDirection = 3; break; + + default: + nValue = pPb->GetCurItemId(); + } + + bool bModified = false; + + if( nDirection != mnDirection ) + { + mnDirection = nDirection; + bModified = true; + } + + if( nValue != mpMetric->GetValue() ) + { + mpMetric->SetValue( nValue ); + bModified = true; + } + + if( bModified ) + { + mpMetric->Modify(); + updateMenu(); + } + + return 0; +} + +// -------------------------------------------------------------------- + +void ScalePropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if( mpMetric ) + { + ValuePair aValues; + rValue >>= aValues; + + double fValue1 = 0.0; + double fValue2 = 0.0; + + aValues.First >>= fValue1; + aValues.Second >>= fValue2; + + if( fValue2 == 0.0 ) + mnDirection = 1; + else if( fValue1 == 0.0 ) + mnDirection = 2; + else + mnDirection = 3; + + long nValue; + if( fValue1 ) + nValue = (long)(fValue1 * 100.0); + else + nValue = (long)(fValue2 * 100.0); + mpMetric->SetValue( nValue ); + updateMenu(); + } +} + +// -------------------------------------------------------------------- + +Any ScalePropertyBox::getValue() +{ + double fValue1 = (double)((double)mpMetric->GetValue() / 100.0); + double fValue2 = fValue1; + + if( mnDirection == 1 ) + fValue2 = 0.0; + else if( mnDirection == 2 ) + fValue1 = 0.0; + + ValuePair aValues; + aValues.First <<= fValue1; + aValues.Second <<= fValue2; + + return makeAny( aValues ); +} + +// -------------------------------------------------------------------- + +Control* ScalePropertyBox::getControl() +{ + return mpControl; +} + +// ==================================================================== + +class FontStylePropertyBox : public PropertySubControl +{ +public: + FontStylePropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ); + ~FontStylePropertyBox(); + + virtual Any getValue(); + virtual void setValue( const Any& rValue, const OUString& ); + + virtual Control* getControl(); + + DECL_LINK( implMenuSelectHdl, MenuButton* ); + + void update(); + +private: + DropdownMenuBox* mpControl; + PopupMenu* mpMenu; + Edit* mpEdit; + Link maModifyHdl; + + float mfFontWeight; + awt::FontSlant meFontSlant; + sal_Int16 mnFontUnderline; +}; + +// -------------------------------------------------------------------- + +FontStylePropertyBox::FontStylePropertyBox( sal_Int32 nControlType, Window* pParent, const Any& rValue, const Link& rModifyHdl ) +: PropertySubControl( nControlType ) +, maModifyHdl( rModifyHdl ) +{ + mpEdit = new Edit( pParent, WB_TABSTOP|WB_IGNORETAB|WB_NOBORDER|WB_READONLY); + mpEdit->SetText( String( SdResId( STR_CUSTOMANIMATION_SAMPLE ) ) ); + + mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_FONTSTYLE_POPUP ) ); + mpControl = new DropdownMenuBox( pParent, mpEdit, mpMenu ); + mpControl->SetMenuSelectHdl( LINK( this, FontStylePropertyBox, implMenuSelectHdl )); + mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX ); + + OUString aPresetId; + setValue( rValue, aPresetId ); +} + +// -------------------------------------------------------------------- + +FontStylePropertyBox::~FontStylePropertyBox() +{ + delete mpControl; +} + +// -------------------------------------------------------------------- + +void FontStylePropertyBox::update() +{ + // update menu + mpMenu->CheckItem( CM_BOLD, mfFontWeight == awt::FontWeight::BOLD ); + mpMenu->CheckItem( CM_ITALIC, meFontSlant == awt::FontSlant_ITALIC); + mpMenu->CheckItem( CM_UNDERLINED, mnFontUnderline != awt::FontUnderline::NONE ); + + // update sample edit + Font aFont( mpEdit->GetFont() ); + aFont.SetWeight( mfFontWeight == awt::FontWeight::BOLD ? WEIGHT_BOLD : WEIGHT_NORMAL ); + aFont.SetItalic( meFontSlant == awt::FontSlant_ITALIC ? ITALIC_NORMAL : ITALIC_NONE ); + aFont.SetUnderline( mnFontUnderline == awt::FontUnderline::NONE ? UNDERLINE_NONE : UNDERLINE_SINGLE ); + mpEdit->SetFont( aFont ); + mpEdit->Invalidate(); +} + +// -------------------------------------------------------------------- + +IMPL_LINK( FontStylePropertyBox, implMenuSelectHdl, MenuButton*, pPb ) +{ + switch( pPb->GetCurItemId() ) + { + case CM_BOLD: + if( mfFontWeight == awt::FontWeight::BOLD ) + mfFontWeight = awt::FontWeight::NORMAL; + else + mfFontWeight = awt::FontWeight::BOLD; + break; + case CM_ITALIC: + if( meFontSlant == awt::FontSlant_ITALIC ) + meFontSlant = awt::FontSlant_NONE; + else + meFontSlant = awt::FontSlant_ITALIC; + break; + case CM_UNDERLINED: + if( mnFontUnderline == awt::FontUnderline::SINGLE ) + mnFontUnderline = awt::FontUnderline::NONE; + else + mnFontUnderline = awt::FontUnderline::SINGLE; + break; + default: + return 0; + } + + update(); + maModifyHdl.Call(mpEdit); + + return 0; +} + +// -------------------------------------------------------------------- + +void FontStylePropertyBox::setValue( const Any& rValue, const OUString& ) +{ + Sequence<Any> aValues; + rValue >>= aValues; + + aValues[0] >>= mfFontWeight; + aValues[1] >>= meFontSlant; + aValues[2] >>= mnFontUnderline; + + update(); +} + +// -------------------------------------------------------------------- + +Any FontStylePropertyBox::getValue() +{ + Sequence<Any> aValues(3); + aValues[0] <<= mfFontWeight; + aValues[1] <<= meFontSlant; + aValues[2] <<= mnFontUnderline; + return makeAny( aValues ); +} + +// -------------------------------------------------------------------- + +Control* FontStylePropertyBox::getControl() +{ + return mpControl; +} + +// ==================================================================== + +class CustomAnimationEffectTabPage : public TabPage +{ +public: + CustomAnimationEffectTabPage( Window* pParent, const ResId& rResId, const STLPropertySet* pSet ); + ~CustomAnimationEffectTabPage(); + + void update( STLPropertySet* pSet ); + DECL_LINK( implSelectHdl, Control* ); + +private: + void updateControlStates(); + void fillSoundListBox(); + void clearSoundListBox(); + sal_Int32 getSoundObject( const String& rStr ); + void openSoundFileDialog(); + void onSoundPreview(); + +private: + List maSoundList; + sal_Bool mbHasText; + const STLPropertySet* mpSet; + + FixedLine* mpFLSettings; + FixedText* mpFTProperty1; + PropertyControl* mpLBProperty1; + FixedText* mpFTProperty2; + PropertyControl* mpLBProperty2; + CheckBox* mpCBSmoothStart; + CheckBox* mpCBSmoothEnd; + CheckBox* mpCBAutoRestart; + + FixedLine* mpFLPlay; + RadioButton* mpRBFromStart; + RadioButton* mpRBFromLast; + RadioButton* mpRBFromTime; + MetricField* mpMFStartTime; + FixedLine* mpFLStop; + RadioButton* mpRBStopOnClick; + RadioButton* mpRBStopOnNextSlide; + RadioButton* mpRBStopAfterSlides; + MetricField* mpMFStopAfterSlides; + + FixedLine* mpFLEnhancements; + FixedText* mpFTSound; + ListBox* mpLBSound; + PushButton* mpPBSoundPreview; + FixedText* mpFTAfterEffect; + ListBox* mpLBAfterEffect; + FixedText* mpFTDimColor; + ColorListBox* mpCLBDimColor; + FixedText* mpFTTextAnim; + ListBox* mpLBTextAnim; + MetricField* mpMFTextDelay; + FixedText* mpFTTextDelay; + + ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > mxPlayer; +}; + + +static void move_down( Control* pControl, int nOffsetX, int nOffsetY ) +{ + Point aPos( pControl->GetPosPixel() ); + aPos.X() += nOffsetX; + aPos.Y() += nOffsetY; + pControl->SetPosPixel( aPos ); +} + +CustomAnimationEffectTabPage::CustomAnimationEffectTabPage( Window* pParent, const ResId& rResId, const STLPropertySet* pSet ) +: TabPage( pParent, rResId ), mbHasText( sal_False ), mpSet(pSet ) +{ + mpFLSettings = new FixedLine( this, SdResId( FL_SETTINGS ) ); + mpFTProperty1 = new FixedText( this, SdResId( FT_PROPERTY_1 ) ); + mpLBProperty1 = new PropertyControl( this, SdResId( LB_PROPERTY_1 ) ); + mpFTProperty2 = new FixedText( this, SdResId( FT_PROPERTY_2 ) ); + mpLBProperty2 = new PropertyControl( this, SdResId( LB_PROPERTY_2 ) ); + mpCBSmoothStart = new CheckBox( this, SdResId( CB_SMOOTH_START ) ); + mpCBSmoothEnd = new CheckBox( this, SdResId( CB_SMOOTH_END ) ); + mpCBAutoRestart = new CheckBox( this, SdResId( CB_AUTORESTART ) ); +/* + mpFLPlay = new FixedLine( this, SdResId( FL_PLAY ) ); + mpRBFromStart = new RadioButton( this, SdResId( RB_FROM_START ) ); + mpRBFromLast = new RadioButton( this, SdResId( RB_FROM_LAST ) ); + mpRBFromTime = new RadioButton( this, SdResId( RB_FROM_TIME ) ); + mpMFStartTime = new MetricField( this, SdResId( MF_START_TIME ) ); + mpFLStop = new FixedLine( this, SdResId( FL_STOP ) ); + mpRBStopOnClick = new RadioButton( this, SdResId( RB_STOP_ON_CLICK ) ); + mpRBStopOnNextSlide = new RadioButton( this, SdResId( RB_STOP_ON_NEXT_SLIDE ) ); + mpRBStopAfterSlides = new RadioButton( this, SdResId( RB_STOP_AFTER_N_SLIDES ) ); + mpMFStopAfterSlides = new MetricField( this, SdResId( MF_STOP_AFTER_SLIDES ) ); +*/ + mpFLEnhancements = new FixedLine( this, SdResId( FL_ENHANCEMENTS ) ); + mpFTSound = new FixedText( this, SdResId( FT_SOUND ) ); + mpLBSound = new ListBox( this, SdResId( LB_SOUND ) ); + mpPBSoundPreview = new PushButton( this, SdResId( PB_SOUND_PREVIEW ) ); + mpFTAfterEffect = new FixedText( this, SdResId( FT_AFTER_EFFECT ) ); + mpLBAfterEffect = new ListBox( this, SdResId( LB_AFTER_EFFECT ) ); + mpFTDimColor = new FixedText( this, SdResId( FT_DIMCOLOR ) ); + mpCLBDimColor = new ColorListBox( this, SdResId( CLB_DIMCOLOR ) ); + mpFTTextAnim = new FixedText( this, SdResId( FT_TEXT_ANIM ) ); + mpLBTextAnim = new ListBox( this, SdResId( LB_TEXT_ANIM ) ); + mpMFTextDelay = new MetricField( this, SdResId( MF_TEXT_DELAY ) ); + mpFTTextDelay = new FixedText( this, SdResId( FT_TEXT_DELAY ) ); + + FreeResource(); + + // fill the soundbox + fillSoundListBox(); + + mpLBSound->SetSelectHdl( LINK( this, CustomAnimationEffectTabPage, implSelectHdl ) ); + + mpPBSoundPreview->SetClickHdl( LINK( this, CustomAnimationEffectTabPage, implSelectHdl ) ); + mpPBSoundPreview->SetSymbol( SYMBOL_PLAY ); + + // fill the color box + SfxObjectShell* pDocSh = SfxObjectShell::Current(); + DBG_ASSERT( pDocSh, "DocShell not found!" ); + XColorTable* pColorTable = NULL; + bool bKillTable = false; + const SfxPoolItem* pItem = NULL; + + if ( pDocSh && ( (pItem = pDocSh->GetItem( SID_COLOR_TABLE ) ) != 0 ) ) + pColorTable = ( (SvxColorTableItem*)pItem )->GetColorTable(); + + if ( !pColorTable ) + { + pColorTable = new XColorTable( SvtPathOptions().GetPalettePath() ); + bKillTable = TRUE; + } + + mpCLBDimColor->SetUpdateMode( FALSE ); + + for ( long i = 0; i < pColorTable->Count(); i++ ) + { + XColorEntry* pEntry = pColorTable->GetColor(i); + mpCLBDimColor->InsertEntry( pEntry->GetColor(), pEntry->GetName() ); + } + + mpCLBDimColor->SetUpdateMode( TRUE ); + + if ( bKillTable ) + delete pColorTable; + + // + // init settings controls + // + + int nOffsetY = 0; + int nOffsetX = 0; + + Size aSpace( LogicToPixel( Size( 3, 3 ), MAP_APPFONT ) ); + + // only show settings if all selected effects have the same preset-id + if( pSet->getPropertyState( nHandlePresetId ) != STLPropertyState_AMBIGUOUS ) + { + OUString aPresetId; + pSet->getPropertyValue( nHandlePresetId ) >>= aPresetId; + + // + // property 1 + // + + if( pSet->getPropertyState( nHandleProperty1Type ) != STLPropertyState_AMBIGUOUS ) + { + sal_Int32 nType = 0; + pSet->getPropertyValue( nHandleProperty1Type ) >>= nType; + + if( nType != nPropertyTypeNone ) + { + // set ui name for property at fixed text + OUString aPropertyName( getPropertyName( nType ) ); + + if( aPropertyName.getLength() ) + { + mpFTProperty1->Show(); + mpLBProperty1->Show(); + + nOffsetY += mpLBProperty1->GetSizePixel().Height() + aSpace.Height(); + + mpFTProperty1->SetText( aPropertyName ); + } + + // get property value + const Any aValue( pSet->getPropertyValue( nHandleProperty1Value ) ); + + Link aModifyLink; + // create property sub control + mpLBProperty1->setSubControl( PropertySubControl::create( nType, this, aValue, aPresetId, aModifyLink )); + } + } + + mpFTProperty1->Enable( mpLBProperty1->IsEnabled() ); + + // + // accelerate & deccelerate + // + + if( pSet->getPropertyState( nHandleAccelerate ) == STLPropertyState_DIRECT ) + { + mpCBSmoothStart->Show(); + mpCBSmoothEnd->Show(); + + move_down( mpCBSmoothStart, nOffsetX, nOffsetY ); + move_down( mpCBSmoothEnd, nOffsetX, nOffsetY ); + + nOffsetY += mpCBSmoothStart->GetSizePixel().Height() + aSpace.Height(); + + double fTemp = 0.0; + pSet->getPropertyValue( nHandleAccelerate ) >>= fTemp; + mpCBSmoothStart->Check( fTemp > 0.0 ); + + pSet->getPropertyValue( nHandleDecelerate ) >>= fTemp; + mpCBSmoothEnd->Check( fTemp > 0.0 ); + } + + // + // auto reverse + // + + + if( nOffsetY ) + { + nOffsetY += mpFLSettings->GetSizePixel().Height() + aSpace.Height(); + mpFLSettings->Show(); + + mpFLEnhancements->Show(); + move_down( mpFLEnhancements, nOffsetX, nOffsetY ); + + nOffsetY += mpFLEnhancements->GetSizePixel().Height() + aSpace.Height(); + + nOffsetX = 2* aSpace.Width(); + } + } + + if( (nOffsetY != 0) || (nOffsetX != 0) ) + { + move_down( mpFTSound, nOffsetX, nOffsetY ); + move_down( mpLBSound, nOffsetX, nOffsetY ); + move_down( mpPBSoundPreview, nOffsetX, nOffsetY ); + move_down( mpFTAfterEffect, nOffsetX, nOffsetY ); + move_down( mpLBAfterEffect, nOffsetX, nOffsetY ); + move_down( mpFTDimColor, nOffsetX, nOffsetY ); + move_down( mpCLBDimColor, nOffsetX, nOffsetY ); + move_down( mpFTTextAnim, nOffsetX, nOffsetY ); + move_down( mpLBTextAnim, nOffsetX, nOffsetY ); + move_down( mpMFTextDelay, nOffsetX, nOffsetY ); + move_down( mpFTTextDelay, nOffsetX, nOffsetY ); + } + + // + // init after effect controls + // + + mpLBAfterEffect->SetSelectHdl( LINK( this, CustomAnimationEffectTabPage, implSelectHdl ) ); + mpLBTextAnim->SetSelectHdl( LINK( this, CustomAnimationEffectTabPage, implSelectHdl ) ); + + if( (pSet->getPropertyState( nHandleHasAfterEffect ) != STLPropertyState_AMBIGUOUS) && + (pSet->getPropertyState( nHandleAfterEffectOnNextEffect ) != STLPropertyState_AMBIGUOUS) && + (pSet->getPropertyState( nHandleDimColor ) != STLPropertyState_AMBIGUOUS)) + { + sal_Bool bHasAfterEffect = sal_False; + pSet->getPropertyValue( nHandleHasAfterEffect ) >>= bHasAfterEffect; + + USHORT nPos = 0; + if( bHasAfterEffect ) + { + nPos++; + + sal_Bool bAfterEffectOnNextClick = sal_False; + pSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bAfterEffectOnNextClick; + Any aDimColor( pSet->getPropertyValue( nHandleDimColor ) ); + + if( aDimColor.hasValue() ) + { + sal_Int32 nColor = 0; + aDimColor >>= nColor; + Color aColor( nColor ); + USHORT nColorPos = mpCLBDimColor->GetEntryPos( aColor ); + if ( LISTBOX_ENTRY_NOTFOUND != nColorPos ) + mpCLBDimColor->SelectEntryPos( nColorPos ); + else + mpCLBDimColor->SelectEntryPos( + mpCLBDimColor->InsertEntry( aColor, String( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) ); + } + else + { + nPos++; + if( bAfterEffectOnNextClick ) + nPos++; + } + } + + mpLBAfterEffect->SelectEntryPos( nPos ); + } + + if( pSet->getPropertyState( nHandleHasText ) != STLPropertyState_AMBIGUOUS ) + pSet->getPropertyValue( nHandleHasText ) >>= mbHasText; + + if( mbHasText ) + { + if( pSet->getPropertyState( nHandleIterateType ) != STLPropertyState_AMBIGUOUS) + { + USHORT nPos = LISTBOX_ENTRY_NOTFOUND; + + sal_Int32 nIterateType = 0; + pSet->getPropertyValue( nHandleIterateType ) >>= nIterateType; + switch( nIterateType ) + { + case TextAnimationType::BY_PARAGRAPH: nPos = 0; break; + case TextAnimationType::BY_WORD: nPos = 1; break; + case TextAnimationType::BY_LETTER: nPos = 2; break; + } + + mpLBTextAnim->SelectEntryPos( nPos ); + } + + if( pSet->getPropertyState( nHandleIterateInterval ) ) + { + double fIterateInterval = 0.0; + pSet->getPropertyValue( nHandleIterateInterval ) >>= fIterateInterval; + mpMFTextDelay->SetValue( (long)(fIterateInterval*10) ); + } + } + else + { + mpFTTextAnim->Enable( FALSE ); + mpLBTextAnim->Enable( FALSE ); + mpMFTextDelay->Enable( FALSE ); + mpFTTextDelay->Enable( FALSE ); + + } + + if( pSet->getPropertyState( nHandleSoundURL ) != STLPropertyState_AMBIGUOUS ) + { + USHORT nPos = 0; + + const Any aValue( pSet->getPropertyValue( nHandleSoundURL ) ); + + if( aValue.getValueType() == ::getCppuType((const sal_Bool*)0) ) + { + nPos = 1; + } + else + { + OUString aSoundURL; + aValue >>= aSoundURL; + + if( aSoundURL.getLength() ) + { + const String aTmp( aSoundURL ); + + ULONG i; + for( i = 0; i < maSoundList.Count(); i++ ) + { + String* pString = (String*)maSoundList.GetObject( i ); + if( *pString == aTmp ) + { + nPos = (USHORT)i+2; + break; + } + } + + if( nPos == 0 ) + { + nPos = (USHORT)maSoundList.Count()+2; + maSoundList.Insert( new String( aTmp ), LIST_APPEND ); + INetURLObject aURL( aTmp ); + nPos = mpLBSound->InsertEntry( aURL.GetBase(), nPos ); + } + } + } + + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + mpLBSound->SelectEntryPos( nPos ); + } + + updateControlStates(); + + Size aSize( GetSizePixel() ); + aSize.Height() += mpMFTextDelay->GetPosPixel().X() + GetSizePixel().Height() + aSpace.Height(); + SetSizePixel( aSize ); +} + +CustomAnimationEffectTabPage::~CustomAnimationEffectTabPage() +{ + clearSoundListBox(); + + delete mpFLSettings; + delete mpFTProperty1; + delete mpLBProperty1; + delete mpFTProperty2; + delete mpLBProperty2; + delete mpCBSmoothStart; + delete mpCBSmoothEnd; + delete mpCBAutoRestart; + + delete mpFLEnhancements; + delete mpFTSound; + delete mpLBSound; + delete mpPBSoundPreview; + delete mpFTAfterEffect; + delete mpLBAfterEffect; + delete mpFTDimColor; + delete mpCLBDimColor; + delete mpFTTextAnim; + delete mpLBTextAnim; + delete mpMFTextDelay; + delete mpFTTextDelay; +} + +void CustomAnimationEffectTabPage::updateControlStates() +{ + USHORT nPos = mpLBAfterEffect->GetSelectEntryPos(); + mpCLBDimColor->Enable( nPos == 1 ); + mpFTDimColor->Enable( nPos == 1 ); + + if( mbHasText ) + { + nPos = mpLBTextAnim->GetSelectEntryPos(); + mpMFTextDelay->Enable( nPos != 0 ); + mpFTTextDelay->Enable( nPos != 0 ); + } + + nPos = mpLBSound->GetSelectEntryPos(); + mpPBSoundPreview->Enable( nPos >= 2 ); +} + +IMPL_LINK( CustomAnimationEffectTabPage, implSelectHdl, Control*, pControl ) +{ + if( pControl == mpLBAfterEffect ) + { + USHORT nPos = static_cast<ListBox*>( mpLBAfterEffect )->GetSelectEntryPos(); + if( nPos == 1 ) + { + if( mpCLBDimColor->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ) + mpCLBDimColor->SelectEntryPos(0); + } + } + else if( pControl == mpLBTextAnim ) + { + if( mpMFTextDelay->GetValue() == 0 ) + mpMFTextDelay->SetValue( 100 ); + } + else if( pControl == mpLBSound ) + { + USHORT nPos = mpLBSound->GetSelectEntryPos(); + if( nPos == (mpLBSound->GetEntryCount() - 1) ) + { + openSoundFileDialog(); + } + } + else if( pControl == mpPBSoundPreview ) + { + onSoundPreview(); + } + + updateControlStates(); + return 0; +} + +void CustomAnimationEffectTabPage::update( STLPropertySet* pSet ) +{ + if( mpLBProperty1->getSubControl() ) + { + Any aNewValue( mpLBProperty1->getSubControl()->getValue() ); + Any aOldValue; + if( mpSet->getPropertyState( nHandleProperty1Value ) != STLPropertyState_AMBIGUOUS) + aOldValue = mpSet->getPropertyValue( nHandleProperty1Value ); + + if( aOldValue != aNewValue ) + pSet->setPropertyValue( nHandleProperty1Value, aNewValue ); + } + + if( mpLBProperty2->getSubControl() ) + { + Any aNewValue( mpLBProperty2->getSubControl()->getValue() ); + Any aOldValue; + if( mpSet->getPropertyState( nHandleProperty2Value ) != STLPropertyState_AMBIGUOUS) + aOldValue = mpSet->getPropertyValue( nHandleProperty2Value ); + + if( aOldValue != aNewValue ) + pSet->setPropertyValue( nHandleProperty2Value, aNewValue ); + } + + if( mpCBSmoothStart->IsVisible() ) + { + // set selected value for accelerate if different then in original set + + double fTemp = mpCBSmoothStart->IsChecked() ? 0.5 : 0.0; + + double fOldTemp = 0.0; + if(mpSet->getPropertyState( nHandleAccelerate ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleAccelerate ) >>= fOldTemp; + else + fOldTemp = -2.0; + + if( fOldTemp != fTemp ) + pSet->setPropertyValue( nHandleAccelerate, makeAny( fTemp ) ); + + // set selected value for decelerate if different then in original set + fTemp = mpCBSmoothEnd->IsChecked() ? 0.5 : 0.0; + + if(mpSet->getPropertyState( nHandleDecelerate ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleDecelerate ) >>= fOldTemp; + else + fOldTemp = -2.0; + + if( fOldTemp != fTemp ) + pSet->setPropertyValue( nHandleDecelerate, makeAny( fTemp ) ); + } + + USHORT nPos = mpLBAfterEffect->GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + { + sal_Bool bAfterEffect = nPos != 0; + + sal_Bool bOldAfterEffect = sal_False; + + if(mpSet->getPropertyState( nHandleHasAfterEffect ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleHasAfterEffect ) >>= bOldAfterEffect; + else + bOldAfterEffect = !bAfterEffect; + + if( bOldAfterEffect != bAfterEffect ) + pSet->setPropertyValue( nHandleHasAfterEffect, makeAny( bAfterEffect ) ); + + Any aDimColor; + if( nPos == 1 ) + { + Color aSelectedColor; + if ( mpCLBDimColor->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND ) + aSelectedColor = mpCLBDimColor->GetSelectEntryColor(); + + aDimColor = makeAny( makeAny( (sal_Int32)aSelectedColor.GetRGBColor() ) ); + } + + if( (mpSet->getPropertyState( nHandleDimColor ) == STLPropertyState_AMBIGUOUS) || + (mpSet->getPropertyValue( nHandleDimColor ) != aDimColor) ) + pSet->setPropertyValue( nHandleDimColor, makeAny( aDimColor ) ); + + sal_Bool bAfterEffectOnNextEffect = nPos != 2 ? sal_True : sal_False; + sal_Bool bOldAfterEffectOnNextEffect = !bAfterEffectOnNextEffect; + + if( mpSet->getPropertyState( nHandleAfterEffectOnNextEffect ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bOldAfterEffectOnNextEffect; + + if( bAfterEffectOnNextEffect != bOldAfterEffectOnNextEffect ) + pSet->setPropertyValue( nHandleAfterEffectOnNextEffect, makeAny( bAfterEffectOnNextEffect ) ); + } + + // --- + + nPos = mpLBTextAnim->GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + { + sal_Int16 nIterateType; + + switch( nPos ) + { + case 1: nIterateType = TextAnimationType::BY_WORD; break; + case 2: nIterateType = TextAnimationType::BY_LETTER; break; + default: + nIterateType = TextAnimationType::BY_PARAGRAPH; + } + + sal_Int16 nOldIterateType = nIterateType-1; + + if(mpSet->getPropertyState( nHandleIterateType ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleIterateType ) >>= nOldIterateType; + + if( nIterateType != nOldIterateType ) + pSet->setPropertyValue( nHandleIterateType, makeAny( nIterateType ) ); + } + + // --- + + { + double fIterateInterval = static_cast< double >( mpMFTextDelay->GetValue() ) / 10; + double fOldIterateInterval = -1.0; + + if( mpSet->getPropertyState( nHandleIterateInterval ) != STLPropertyState_AMBIGUOUS ) + mpSet->getPropertyValue( nHandleIterateInterval ) >>= fOldIterateInterval; + + if( fIterateInterval != fOldIterateInterval ) + pSet->setPropertyValue( nHandleIterateInterval, makeAny( fIterateInterval ) ); + } + + nPos = mpLBSound->GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + { + Any aNewSoundURL, aOldSoundURL( makeAny( (sal_Int32) 0 ) ); + + if( nPos == 0 ) + { + // 0 means no sound, so leave any empty + } + else if( nPos == 1 ) + { + // this means stop sound + aNewSoundURL = makeAny( (sal_Bool)sal_True ); + } + else + { + OUString aSoundURL( *(String*)maSoundList.GetObject( nPos-2 ) ); + aNewSoundURL = makeAny( aSoundURL ); + } + + if( mpSet->getPropertyState( nHandleSoundURL ) != STLPropertyState_AMBIGUOUS ) + mpSet->getPropertyValue( nHandleSoundURL ) >>= aOldSoundURL; + + if( aNewSoundURL != aOldSoundURL ) + pSet->setPropertyValue( nHandleSoundURL, aNewSoundURL ); + } +} + +void CustomAnimationEffectTabPage::fillSoundListBox() +{ + GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, maSoundList ); + GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, maSoundList ); + + mpLBSound->InsertEntry( String( SdResId( STR_CUSTOMANIMATION_NO_SOUND ) ) ); + mpLBSound->InsertEntry( String( SdResId( STR_CUSTOMANIMATION_STOP_PREVIOUS_SOUND ) ) ); + for( ULONG i = 0; i < maSoundList.Count(); i++ ) + { + String* pString = (String*)maSoundList.GetObject( i ); + INetURLObject aURL( *pString ); + mpLBSound->InsertEntry( aURL.GetBase() ); + } + mpLBSound->InsertEntry( String( SdResId( STR_CUSTOMANIMATION_BROWSE_SOUND ) ) ); +} + +void CustomAnimationEffectTabPage::clearSoundListBox() +{ + const sal_uInt32 nCount = maSoundList.Count(); + sal_uInt32 i; + for( i = 0; i < nCount; i++ ) + delete (String*)maSoundList.GetObject( i ); + maSoundList.Clear(); + + mpLBSound->Clear(); +} + +sal_Int32 CustomAnimationEffectTabPage::getSoundObject( const String& rStr ) +{ + String aStrIn( rStr ); + aStrIn.ToLowerAscii(); + + sal_uInt32 i; + const sal_uInt32 nCount = maSoundList.Count(); + for( i = 0; i < nCount; i++ ) + { + String aTmpStr( *(String*)maSoundList.GetObject( i ) ); + aTmpStr.ToLowerAscii(); + + if( aTmpStr == aStrIn ) + return i+2; + } + + return -1; +} + +void CustomAnimationEffectTabPage::openSoundFileDialog() +{ + SdOpenSoundFileDialog aFileDialog; + + String aFile( SvtPathOptions().GetGraphicPath() ); + aFileDialog.SetPath( aFile ); + + bool bValidSoundFile = false; + bool bQuitLoop = false; + long nPos = 0; + + while( !bQuitLoop && (aFileDialog.Execute() == ERRCODE_NONE) ) + { + aFile = aFileDialog.GetPath(); + nPos = getSoundObject( aFile ); + + if( nPos < 0 ) // not in Soundliste + { + // try to insert in Gallery + if( GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aFile, SGA_FORMAT_SOUND ) ) + { + clearSoundListBox(); + fillSoundListBox(); + + nPos = getSoundObject( aFile ); + DBG_ASSERT( nPos >= 0, "sd::CustomAnimationEffectTabPage::openSoundFileDialog(), Recently inserted sound not in list!" ); + + bValidSoundFile=true; + bQuitLoop=true; + } + else + { + String aStrWarning(SdResId(STR_WARNING_NOSOUNDFILE)); + String aStr; aStr += sal_Unicode('%'); + aStrWarning.SearchAndReplace( aStr , aFile ); + WarningBox aWarningBox( NULL, WB_3DLOOK | WB_RETRY_CANCEL, aStrWarning ); + aWarningBox.SetModalInputMode (TRUE); + bQuitLoop = aWarningBox.Execute()==RET_RETRY ? FALSE : TRUE; + + bValidSoundFile=false; + } + } + else + { + bValidSoundFile=true; + bQuitLoop=true; + } + } + + if( !bValidSoundFile ) + nPos = 0; + + mpLBSound->SelectEntryPos( (USHORT) nPos ); +} + +void CustomAnimationEffectTabPage::onSoundPreview() +{ + const USHORT nPos = mpLBSound->GetSelectEntryPos(); + + if( nPos >= 2 ) try + { + const OUString aSoundURL( *(String*)maSoundList.GetObject( nPos-2 ) ); + mxPlayer.set( avmedia::MediaWindow::createPlayer( aSoundURL ), uno::UNO_QUERY_THROW ); + mxPlayer->start(); + } + catch( uno::Exception& e ) + { + (void)e; + DBG_ERROR("CustomAnimationEffectTabPage::onSoundPreview(), exception caught!" ); + } +} + +class CustomAnimationDurationTabPage : public TabPage +{ +public: + CustomAnimationDurationTabPage( Window* pParent, const ResId& rResId, const STLPropertySet* pSet ); + ~CustomAnimationDurationTabPage(); + + void update( STLPropertySet* pSet ); + + DECL_LINK( implControlHdl, Control* ); + +private: + const STLPropertySet* mpSet; + + boost::shared_ptr< FixedText > mpFTStart; + boost::shared_ptr< ListBox > mpLBStart; + boost::shared_ptr< FixedText > mpFTStartDelay; + boost::shared_ptr< MetricField > mpMFStartDelay; + boost::shared_ptr< FixedText > mpFTDuration; + boost::shared_ptr< ComboBox > mpCBDuration; + boost::shared_ptr< FixedText > mpFTRepeat; + boost::shared_ptr< ComboBox > mpCBRepeat; + boost::shared_ptr< CheckBox > mpCBXRewind; + boost::shared_ptr< FixedLine > mpFLTrigger; + boost::shared_ptr< RadioButton > mpRBClickSequence; + boost::shared_ptr< RadioButton > mpRBInteractive; + boost::shared_ptr< ListBox > mpLBTrigger; +}; + +CustomAnimationDurationTabPage::CustomAnimationDurationTabPage(Window* pParent, const ResId& rResId, const STLPropertySet* pSet) +: TabPage( pParent, rResId ), mpSet( pSet ) +{ + mpFTStart.reset( new FixedText( this, SdResId( FT_START ) ) ); + mpLBStart.reset( new ListBox( this, SdResId( LB_START ) ) ); + mpFTStartDelay.reset( new FixedText( this, SdResId( FT_START_DELAY ) ) ); + mpMFStartDelay.reset( new MetricField( this, SdResId( MF_START_DELAY ) ) ); + mpFTDuration.reset( new FixedText( this, SdResId( FT_DURATION ) ) ); + mpCBDuration.reset( new ComboBox( this, SdResId( CB_DURATION ) ) ); + mpFTRepeat.reset( new FixedText( this, SdResId( FT_REPEAT ) ) ); + mpCBRepeat.reset( new ComboBox( this, SdResId( CB_REPEAT ) ) ); + mpCBXRewind.reset( new CheckBox( this, SdResId( CBX_REWIND ) ) ); + mpFLTrigger.reset( new FixedLine( this, SdResId( FL_TRIGGER ) ) ); + mpRBClickSequence.reset( new RadioButton( this, SdResId( RB_CLICKSEQUENCE ) ) ); + mpRBInteractive.reset( new RadioButton( this, SdResId( RB_INTERACTIVE ) ) ); + mpLBTrigger.reset( new ListBox( this, SdResId( LB_TRIGGER ) ) ); + + fillRepeatComboBox( mpCBRepeat.get() ); + fillDurationComboBox( mpCBDuration.get() ); + + FreeResource(); + + mpRBClickSequence->SetClickHdl( LINK( this, CustomAnimationDurationTabPage, implControlHdl ) ); + mpRBClickSequence->SetClickHdl( LINK( this, CustomAnimationDurationTabPage, implControlHdl ) ); + mpLBTrigger->SetSelectHdl( LINK( this, CustomAnimationDurationTabPage, implControlHdl ) ); + + if( pSet->getPropertyState( nHandleStart ) != STLPropertyState_AMBIGUOUS ) + { + sal_Int16 nStart = 0; + pSet->getPropertyValue( nHandleStart ) >>= nStart; + USHORT nPos = 0; + switch( nStart ) + { + case EffectNodeType::WITH_PREVIOUS: nPos = 1; break; + case EffectNodeType::AFTER_PREVIOUS: nPos = 2; break; + } + mpLBStart->SelectEntryPos( nPos ); + } + + if( pSet->getPropertyState( nHandleBegin ) != STLPropertyState_AMBIGUOUS ) + { + double fBegin = 0.0; + pSet->getPropertyValue( nHandleBegin ) >>= fBegin; + mpMFStartDelay->SetValue( (long)(fBegin*10) ); + } + + if( pSet->getPropertyState( nHandleDuration ) != STLPropertyState_AMBIGUOUS ) + { + double fDuration = 0.0; + pSet->getPropertyValue( nHandleDuration ) >>= fDuration; + + if( fDuration == 0.001 ) + { + mpFTDuration->Disable(); + mpCBDuration->Disable(); + mpFTRepeat->Disable(); + mpCBRepeat->Disable(); + mpCBXRewind->Disable(); + } + else + { + USHORT nPos = LISTBOX_ENTRY_NOTFOUND; + + if( fDuration == 5.0 ) + nPos = 0; + else if( fDuration == 3.0 ) + nPos = 1; + else if( fDuration == 2.0 ) + nPos = 2; + else if( fDuration == 1.0 ) + nPos = 3; + else if( fDuration == 0.5 ) + nPos = 4; + + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + mpCBDuration->SelectEntryPos( nPos ); + else + mpCBDuration->SetText( String::CreateFromDouble( fDuration ) ); + } + } + + if( pSet->getPropertyState( nHandleRepeat ) != STLPropertyState_AMBIGUOUS ) + { + Any aRepeatCount( pSet->getPropertyValue( nHandleRepeat ) ); + if( (aRepeatCount.getValueType() == ::getCppuType((const double*)0)) || !aRepeatCount.hasValue() ) + { + double fRepeat = 0.0; + if( aRepeatCount.hasValue() ) + aRepeatCount >>= fRepeat; + + USHORT nPos = LISTBOX_ENTRY_NOTFOUND; + + if( fRepeat == 0 ) + nPos = 0; + else if( fRepeat == 2.0 ) + nPos = 1; + else if( fRepeat == 3.0 ) + nPos = 2; + else if( fRepeat == 4.0 ) + nPos = 3; + else if( fRepeat == 5.0 ) + nPos = 4; + else if( fRepeat == 10.0 ) + nPos = 5; + + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + mpCBRepeat->SelectEntryPos( nPos ); + else + mpCBRepeat->SetText( String::CreateFromDouble( fRepeat ) ); + } + else if( aRepeatCount.getValueType() == ::getCppuType((const Timing*)0) ) + { + Any aEnd; + if( pSet->getPropertyState( nHandleEnd ) != STLPropertyState_AMBIGUOUS ) + aEnd = pSet->getPropertyValue( nHandleEnd ); + + mpCBRepeat->SelectEntryPos( aEnd.hasValue() ? 6 : 7 ); + } + } + + if( pSet->getPropertyState( nHandleRewind ) != STLPropertyState_AMBIGUOUS ) + { + sal_Int16 nFill = 0; + if( pSet->getPropertyValue( nHandleRewind ) >>= nFill ) + { + mpCBXRewind->Check( (nFill == AnimationFill::REMOVE) ? TRUE : FALSE ); + } + else + { + mpCBXRewind->SetState( STATE_DONTKNOW ); + } + } + + Reference< XShape > xTrigger; + + if( pSet->getPropertyState( nHandleTrigger ) != STLPropertyState_AMBIGUOUS ) + { + pSet->getPropertyValue( nHandleTrigger ) >>= xTrigger; + + mpRBInteractive->Check( xTrigger.is() ); + mpRBClickSequence->Check( !xTrigger.is() ); + } + + Reference< XDrawPage > xCurrentPage; + pSet->getPropertyValue( nHandleCurrentPage ) >>= xCurrentPage; + if( xCurrentPage.is() ) + { + const OUString aStrIsEmptyPresObj( RTL_CONSTASCII_USTRINGPARAM( "IsEmptyPresentationObject" ) ); + + sal_Int32 nShape, nCount = xCurrentPage->getCount(); + for( nShape = 0; nShape < nCount; nShape++ ) + { + Reference< XShape > xShape( xCurrentPage->getByIndex( nShape ), UNO_QUERY ); + + if( !xShape.is() ) + continue; + + Reference< XPropertySet > xSet( xShape, UNO_QUERY ); + if( xSet.is() && xSet->getPropertySetInfo()->hasPropertyByName( aStrIsEmptyPresObj ) ) + { + sal_Bool bIsEmpty = sal_False; + xSet->getPropertyValue( aStrIsEmptyPresObj ) >>= bIsEmpty; + if( bIsEmpty ) + continue; + } + + String aDescription( getShapeDescription( xShape, true ) ); + USHORT nPos = mpLBTrigger->InsertEntry( aDescription ); + + mpLBTrigger->SetEntryData( nPos, (void*)nShape ); + if( xShape == xTrigger ) + mpLBTrigger->SelectEntryPos( nPos ); + } + } +} + +CustomAnimationDurationTabPage::~CustomAnimationDurationTabPage() +{ +} + +IMPL_LINK( CustomAnimationDurationTabPage, implControlHdl, Control*, pControl ) +{ + if( pControl == mpLBTrigger.get() ) + { + mpRBClickSequence->Check( FALSE ); + mpRBInteractive->Check( TRUE ); + } + + return 0; +} + +void CustomAnimationDurationTabPage::update( STLPropertySet* pSet ) +{ + USHORT nPos = mpLBStart->GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + { + sal_Int16 nStart; + sal_Int16 nOldStart = -1; + + switch( nPos ) + { + case 1: nStart = EffectNodeType::WITH_PREVIOUS; break; + case 2: nStart = EffectNodeType::AFTER_PREVIOUS; break; + default: + nStart = EffectNodeType::ON_CLICK; break; + } + + if(mpSet->getPropertyState( nHandleStart ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleStart ) >>= nOldStart; + + if( nStart != nOldStart ) + pSet->setPropertyValue( nHandleStart, makeAny( nStart ) ); + } + + // --- + + { + double fBegin = static_cast<double>( mpMFStartDelay->GetValue()) / 10.0; + double fOldBegin = -1.0; + + if( mpSet->getPropertyState( nHandleBegin ) != STLPropertyState_AMBIGUOUS ) + mpSet->getPropertyValue( nHandleBegin ) >>= fOldBegin; + + if( fBegin != fOldBegin ) + pSet->setPropertyValue( nHandleBegin, makeAny( fBegin ) ); + } + + // --- + + nPos = mpCBRepeat->GetSelectEntryPos(); + if( (nPos != LISTBOX_ENTRY_NOTFOUND) || (mpCBRepeat->GetText().Len() != 0) ) + { + Any aRepeatCount; + Any aEnd; + + switch( nPos ) + { + case 0: + break; + case 6: + { + Event aEvent; + aEvent.Trigger = EventTrigger::ON_NEXT; + aEvent.Repeat = 0; + aEnd <<= aEvent; + } + // ATTENTION: FALL THROUGH INTENDED! + case 7: + aRepeatCount <<= Timing_INDEFINITE; + break; + default: + { + String aText( mpCBRepeat->GetText() ); + if( aText.Len() ) + aRepeatCount <<= aText.ToDouble(); + } + } + + Any aOldRepeatCount( aRepeatCount ); + if( mpSet->getPropertyState( nHandleRepeat ) != STLPropertyState_AMBIGUOUS ) + aOldRepeatCount = mpSet->getPropertyValue( nHandleRepeat ); + + if( aRepeatCount != aOldRepeatCount ) + pSet->setPropertyValue( nHandleRepeat, aRepeatCount ); + + Any aOldEnd( aEnd ); + if( mpSet->getPropertyState( nHandleEnd ) != STLPropertyState_AMBIGUOUS ) + aOldEnd = mpSet->getPropertyValue( nHandleEnd ); + + if( aEnd != aOldEnd ) + pSet->setPropertyValue( nHandleEnd, aEnd ); + } + + // --- + + double fDuration = -1.0; + nPos = mpCBDuration->GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + { + fDuration = *static_cast< const double * >( mpCBDuration->GetEntryData(nPos) ); + } + else + { + String aText( mpCBDuration->GetText() ); + if( aText.Len() ) + { + fDuration = aText.ToDouble(); + } + } + + if( fDuration != -1.0 ) + { + double fOldDuration = -1; + + if( mpSet->getPropertyState( nHandleDuration ) != STLPropertyState_AMBIGUOUS ) + mpSet->getPropertyValue( nHandleDuration ) >>= fOldDuration; + + if( fDuration != fOldDuration ) + pSet->setPropertyValue( nHandleDuration, makeAny( fDuration ) ); + } + + // --- + + if( mpCBXRewind->GetState() != STATE_DONTKNOW ) + { + sal_Int16 nFill = mpCBXRewind->IsChecked() ? AnimationFill::REMOVE : AnimationFill::HOLD; + + bool bSet = true; + + if( mpSet->getPropertyState( nHandleRewind ) != STLPropertyState_AMBIGUOUS ) + { + sal_Int16 nOldFill = 0; + mpSet->getPropertyValue( nHandleRewind ) >>= nOldFill; + bSet = nFill != nOldFill; + } + + if( bSet ) + pSet->setPropertyValue( nHandleRewind, makeAny( nFill ) ); + } + + Reference< XShape > xTrigger; + + if( mpRBInteractive->IsChecked() ) + { + nPos = mpLBTrigger->GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + { + sal_Int32 nShape = (sal_Int32)(sal_IntPtr)mpLBTrigger->GetEntryData( nPos ); + + Reference< XDrawPage > xCurrentPage; + mpSet->getPropertyValue( nHandleCurrentPage ) >>= xCurrentPage; + + if( xCurrentPage.is() && (nShape >= 0) && (nShape < xCurrentPage->getCount()) ) + xCurrentPage->getByIndex( nShape ) >>= xTrigger; + } + } + + + if( xTrigger.is() || mpRBClickSequence->IsChecked() ) + { + Any aNewValue( makeAny( xTrigger ) ); + Any aOldValue; + + if( mpSet->getPropertyState( nHandleTrigger ) != STLPropertyState_AMBIGUOUS ) + aOldValue = mpSet->getPropertyValue( nHandleTrigger ); + + if( aNewValue != aOldValue ) + pSet->setPropertyValue( nHandleTrigger, aNewValue ); + } +} + +class CustomAnimationTextAnimTabPage : public TabPage +{ +public: + CustomAnimationTextAnimTabPage( Window* pParent, const ResId& rResId, const STLPropertySet* pSet ); + + void update( STLPropertySet* pSet ); + + void updateControlStates(); + DECL_LINK( implSelectHdl, Control* ); + +private: + FixedText maFTGroupText; + ListBox maLBGroupText; + CheckBox maCBXGroupAuto; + MetricField maMFGroupAuto; + CheckBox maCBXAnimateForm; + CheckBox maCBXReverse; + + const STLPropertySet* mpSet; + + bool mbHasVisibleShapes; +}; + +CustomAnimationTextAnimTabPage::CustomAnimationTextAnimTabPage(Window* pParent, const ResId& rResId, const STLPropertySet* pSet) +: TabPage( pParent, rResId ), + maFTGroupText( this, SdResId( FT_GROUP_TEXT ) ), + maLBGroupText( this, SdResId( LB_GROUP_TEXT ) ), + maCBXGroupAuto( this, SdResId( CBX_GROUP_AUTO ) ), + maMFGroupAuto( this, SdResId( MF_GROUP_AUTO ) ), + maCBXAnimateForm( this, SdResId( CBX_ANIMATE_FORM ) ), + maCBXReverse( this, SdResId( CBX_REVERSE ) ), + mpSet( pSet ), + mbHasVisibleShapes(true) +{ + FreeResource(); + + maLBGroupText.SetSelectHdl( LINK( this, CustomAnimationTextAnimTabPage, implSelectHdl ) ); + + if( pSet->getPropertyState( nHandleTextGrouping ) != STLPropertyState_AMBIGUOUS ) + { + sal_Int32 nTextGrouping = 0; + if( pSet->getPropertyValue( nHandleTextGrouping ) >>= nTextGrouping ) + maLBGroupText.SelectEntryPos( (USHORT)(nTextGrouping + 1) ); + } + + if( pSet->getPropertyState( nHandleHasVisibleShape ) != STLPropertyState_AMBIGUOUS ) + pSet->getPropertyValue( nHandleHasVisibleShape ) >>= mbHasVisibleShapes; + + if( pSet->getPropertyState( nHandleTextGroupingAuto ) != STLPropertyState_AMBIGUOUS ) + { + double fTextGroupingAuto = 0.0; + if( pSet->getPropertyValue( nHandleTextGroupingAuto ) >>= fTextGroupingAuto ) + { + maCBXGroupAuto.Check( fTextGroupingAuto >= 0.0 ); + if( fTextGroupingAuto >= 0.0 ) + maMFGroupAuto.SetValue( (long)(fTextGroupingAuto*10) ); + } + } + else + { + maCBXGroupAuto.SetState( STATE_DONTKNOW ); + } + + maCBXAnimateForm.SetState( STATE_DONTKNOW ); + if( pSet->getPropertyState( nHandleAnimateForm ) != STLPropertyState_AMBIGUOUS ) + { + sal_Bool bAnimateForm = sal_False; + if( pSet->getPropertyValue( nHandleAnimateForm ) >>= bAnimateForm ) + { + maCBXAnimateForm.Check( bAnimateForm ); + } + } + else + { + maCBXAnimateForm.Enable( FALSE ); + } + + maCBXReverse.SetState( STATE_DONTKNOW ); + if( pSet->getPropertyState( nHandleTextReverse ) != STLPropertyState_AMBIGUOUS ) + { + sal_Bool bTextReverse = sal_False; + if( pSet->getPropertyValue( nHandleTextReverse ) >>= bTextReverse ) + { + maCBXReverse.Check( bTextReverse ); + } + } + + if( pSet->getPropertyState( nHandleMaxParaDepth ) == STLPropertyState_DIRECT ) + { + sal_Int32 nMaxParaDepth = 0; + pSet->getPropertyValue( nHandleMaxParaDepth ) >>= nMaxParaDepth; + nMaxParaDepth += 1; + + sal_Int32 nPos = 6; + while( (nPos > 2) && (nPos > nMaxParaDepth) ) + { + maLBGroupText.RemoveEntry( (USHORT)nPos ); + nPos--; + } + } + + updateControlStates(); +} + +void CustomAnimationTextAnimTabPage::update( STLPropertySet* pSet ) +{ + USHORT nPos = maLBGroupText.GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + { + sal_Int32 nTextGrouping = nPos - 1; + sal_Int32 nOldGrouping = -2; + + if(mpSet->getPropertyState( nHandleTextGrouping ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleTextGrouping ) >>= nOldGrouping; + + if( nTextGrouping != nOldGrouping ) + pSet->setPropertyValue( nHandleTextGrouping, makeAny( nTextGrouping ) ); + } + + if( nPos > 0 ) + { + sal_Bool bTextReverse = maCBXReverse.IsChecked(); + sal_Bool bOldTextReverse = !bTextReverse; + + if(mpSet->getPropertyState( nHandleTextReverse ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleTextReverse ) >>= bOldTextReverse; + + if( bTextReverse != bOldTextReverse ) + pSet->setPropertyValue( nHandleTextReverse, makeAny( bTextReverse ) ); + + if( nPos > 1 ) + { + double fTextGroupingAuto = maCBXGroupAuto.IsChecked() ? maMFGroupAuto.GetValue() / 10.0 : -1.0; + double fOldTextGroupingAuto = -2.0; + + if(mpSet->getPropertyState( nHandleTextGroupingAuto ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleTextGroupingAuto ) >>= fOldTextGroupingAuto; + + if( fTextGroupingAuto != fOldTextGroupingAuto ) + pSet->setPropertyValue( nHandleTextGroupingAuto, makeAny( fTextGroupingAuto ) ); + } + } + + sal_Bool bAnimateForm = maCBXAnimateForm.IsChecked(); + sal_Bool bOldAnimateForm = !bAnimateForm; + + if(mpSet->getPropertyState( nHandleAnimateForm ) != STLPropertyState_AMBIGUOUS) + mpSet->getPropertyValue( nHandleAnimateForm ) >>= bOldAnimateForm; + + if( bAnimateForm != bOldAnimateForm ) + pSet->setPropertyValue( nHandleAnimateForm, makeAny( bAnimateForm ) ); +} + +void CustomAnimationTextAnimTabPage::updateControlStates() +{ + USHORT nPos = maLBGroupText.GetSelectEntryPos(); + + maCBXGroupAuto.Enable( nPos > 1 ); + maMFGroupAuto.Enable( nPos > 1 ); + maCBXReverse.Enable( nPos > 0 ); + + if( !mbHasVisibleShapes && nPos > 0 ) + { + maCBXAnimateForm.Check(FALSE); + maCBXAnimateForm.Enable(FALSE); + } + else + { + maCBXAnimateForm.Enable(TRUE); + } +} + +IMPL_LINK( CustomAnimationTextAnimTabPage, implSelectHdl, Control*, EMPTYARG ) +{ + updateControlStates(); + return 0; +} + +// -------------------------------------------------------------------- + +CustomAnimationDialog::CustomAnimationDialog( Window* pParent, STLPropertySet* pSet, USHORT nPage /* = 0 */ ) +: TabDialog( pParent, SdResId( DLG_CUSTOMANIMATION ) ), mpSet( pSet ), mpResultSet( 0 ) +{ + mpTabControl = new TabControl( this, SdResId( 1 ) ); + mpOKButton = new OKButton(this, SdResId( 1 ) ) ; + mpCancelButton = new CancelButton(this, SdResId( 1 ) ); + mpHelpButton = new HelpButton(this, SdResId( 1 ) ); + + FreeResource(); + + mpEffectTabPage = new CustomAnimationEffectTabPage( mpTabControl, SdResId( RID_TP_CUSTOMANIMATION_EFFECT ), mpSet ); + mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_EFFECT, mpEffectTabPage ); + mpDurationTabPage = new CustomAnimationDurationTabPage( mpTabControl, SdResId( RID_TP_CUSTOMANIMATION_DURATION ), mpSet ); + mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_DURATION, mpDurationTabPage ); + + sal_Bool bHasText = sal_False; + if( pSet->getPropertyState( nHandleHasText ) != STLPropertyState_AMBIGUOUS ) + pSet->getPropertyValue( nHandleHasText ) >>= bHasText; + + if( bHasText ) + { + mpTextAnimTabPage = new CustomAnimationTextAnimTabPage( mpTabControl, SdResId( RID_TP_CUSTOMANIMATION_TEXT ), mpSet ); + mpTabControl->SetTabPage( RID_TP_CUSTOMANIMATION_TEXT, mpTextAnimTabPage ); + } + else + { + mpTextAnimTabPage = 0; + mpTabControl->RemovePage( RID_TP_CUSTOMANIMATION_TEXT ); + } + + if( nPage ) + mpTabControl->SelectTabPage( nPage ); +} + +CustomAnimationDialog::~CustomAnimationDialog() +{ + delete mpEffectTabPage; + delete mpDurationTabPage; + delete mpTextAnimTabPage; + + delete mpTabControl; + delete mpOKButton; + delete mpCancelButton; + delete mpHelpButton; + + delete mpSet; + delete mpResultSet; +} + +STLPropertySet* CustomAnimationDialog::getResultSet() +{ + if( mpResultSet ) + delete mpResultSet; + + mpResultSet = createDefaultSet(); + + mpEffectTabPage->update( mpResultSet ); + mpDurationTabPage->update( mpResultSet ); + if( mpTextAnimTabPage ) + mpTextAnimTabPage->update( mpResultSet ); + + return mpResultSet; +} + +STLPropertySet* CustomAnimationDialog::createDefaultSet() +{ + Any aEmpty; + + STLPropertySet* pSet = new STLPropertySet(); + pSet->setPropertyDefaultValue( nHandleMaxParaDepth, makeAny( (sal_Int32)-1 ) ); + + pSet->setPropertyDefaultValue( nHandleHasAfterEffect, makeAny( (sal_Bool)sal_False ) ); + pSet->setPropertyDefaultValue( nHandleAfterEffectOnNextEffect, makeAny( (sal_Bool)sal_False ) ); + pSet->setPropertyDefaultValue( nHandleDimColor, aEmpty ); + pSet->setPropertyDefaultValue( nHandleIterateType, makeAny( (sal_Int16)0 ) ); + pSet->setPropertyDefaultValue( nHandleIterateInterval, makeAny( (double)0.0 ) ); + + pSet->setPropertyDefaultValue( nHandleStart, makeAny( (sal_Int16)EffectNodeType::ON_CLICK ) ); + pSet->setPropertyDefaultValue( nHandleBegin, makeAny( (double)0.0 ) ); + pSet->setPropertyDefaultValue( nHandleDuration, makeAny( (double)2.0 ) ); + pSet->setPropertyDefaultValue( nHandleRepeat, aEmpty ); + pSet->setPropertyDefaultValue( nHandleRewind, makeAny( AnimationFill::HOLD ) ); + + pSet->setPropertyDefaultValue( nHandleEnd, aEmpty ); + + pSet->setPropertyDefaultValue( nHandlePresetId, aEmpty ); + pSet->setPropertyDefaultValue( nHandleProperty1Type, makeAny( nPropertyTypeNone ) ); + pSet->setPropertyDefaultValue( nHandleProperty1Value, aEmpty ); + pSet->setPropertyDefaultValue( nHandleProperty2Type, makeAny( nPropertyTypeNone ) ); + pSet->setPropertyDefaultValue( nHandleProperty2Value, aEmpty ); + pSet->setPropertyDefaultValue( nHandleAccelerate, aEmpty ); + pSet->setPropertyDefaultValue( nHandleDecelerate, aEmpty ); + pSet->setPropertyDefaultValue( nHandleAutoReverse, aEmpty ); + pSet->setPropertyDefaultValue( nHandleTrigger, aEmpty ); + + pSet->setPropertyDefaultValue( nHandleHasText, makeAny( sal_False ) ); + pSet->setPropertyDefaultValue( nHandleHasVisibleShape, makeAny( sal_False ) ); + pSet->setPropertyDefaultValue( nHandleTextGrouping, makeAny( (sal_Int32)-1 ) ); + pSet->setPropertyDefaultValue( nHandleAnimateForm, makeAny( sal_True ) ); + pSet->setPropertyDefaultValue( nHandleTextGroupingAuto, makeAny( (double)-1.0 ) ); + pSet->setPropertyDefaultValue( nHandleTextReverse, makeAny( sal_False ) ); + + pSet->setPropertyDefaultValue( nHandleCurrentPage, aEmpty ); + + pSet->setPropertyDefaultValue( nHandleSoundURL, aEmpty ); + pSet->setPropertyDefaultValue( nHandleSoundVolumne, makeAny( (double)1.0) ); + pSet->setPropertyDefaultValue( nHandleSoundEndAfterSlide, makeAny( (sal_Int32)0 ) ); + + pSet->setPropertyDefaultValue( nHandleCommand, makeAny( (sal_Int16)0 ) ); + return pSet; +} + +PropertyControl::PropertyControl( Window* pParent, const ResId& rResId ) +: ListBox( pParent, rResId ), mpSubControl(0) +{ +} + +PropertyControl::~PropertyControl() +{ + if( mpSubControl ) + delete mpSubControl; +} + +void PropertyControl::setSubControl( PropertySubControl* pSubControl ) +{ + if( mpSubControl && mpSubControl != pSubControl ) + delete mpSubControl; + + mpSubControl = pSubControl; + + Control* pControl = pSubControl ? pSubControl->getControl() : 0; + + if( pControl ) + { + pControl->SetPosSizePixel( GetPosPixel(), GetSizePixel() ); + pControl->SetZOrder( this, WINDOW_ZORDER_BEFOR ); + pControl->Show(); + Hide(); + } + else + { + Show(); + } +} + +void PropertyControl::Resize() +{ + Control* pControl = mpSubControl ? mpSubControl->getControl() : 0; + if( pControl ) + pControl->SetPosSizePixel( GetPosPixel(), GetSizePixel() ); + ListBox::Resize(); +} + +// ==================================================================== + +PropertySubControl::~PropertySubControl() +{ +} + +PropertySubControl* PropertySubControl::create( sal_Int32 nType, Window* pParent, const Any& rValue, const OUString& rPresetId, const Link& rModifyHdl ) +{ + PropertySubControl* pSubControl = NULL; + switch( nType ) + { + case nPropertyTypeDirection: + case nPropertyTypeSpokes: + case nPropertyTypeZoom: + pSubControl = new PresetPropertyBox( nType, pParent, rValue, rPresetId, rModifyHdl ); + break; + + case nPropertyTypeColor: + case nPropertyTypeFillColor: + case nPropertyTypeFirstColor: + case nPropertyTypeCharColor: + case nPropertyTypeLineColor: + pSubControl = new ColorPropertyBox( nType, pParent, rValue, rModifyHdl ); + break; + + case nPropertyTypeFont: + pSubControl = new FontPropertyBox( nType, pParent, rValue, rModifyHdl ); + break; + + case nPropertyTypeCharHeight: + pSubControl = new CharHeightPropertyBox( nType, pParent, rValue, rModifyHdl ); + break; + + case nPropertyTypeRotate: + pSubControl = new RotationPropertyBox( nType, pParent, rValue, rModifyHdl ); + break; + + case nPropertyTypeTransparency: + pSubControl = new TransparencyPropertyBox( nType, pParent, rValue, rModifyHdl ); + break; + + case nPropertyTypeScale: + pSubControl = new ScalePropertyBox( nType, pParent, rValue, rModifyHdl ); + break; + + case nPropertyTypeCharDecoration: + pSubControl = new FontStylePropertyBox( nType, pParent, rValue, rModifyHdl ); + break; + } + + return pSubControl; +} + +} |