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