xref: /trunk/main/sd/source/ui/animations/CustomAnimationList.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
15b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55b190011SAndrew Rist  * distributed with this work for additional information
65b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
85b190011SAndrew Rist  * "License"); you may not use this file except in compliance
95b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
115b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
135b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
145b190011SAndrew Rist  * software distributed under the License is distributed on an
155b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
175b190011SAndrew Rist  * specific language governing permissions and limitations
185b190011SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
205b190011SAndrew Rist  *************************************************************/
215b190011SAndrew Rist 
225b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir #include <com/sun/star/drawing/XShapes.hpp>
27cdf0e10cSrcweir #include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
28cdf0e10cSrcweir #include <com/sun/star/presentation/EffectNodeType.hpp>
29cdf0e10cSrcweir #include <com/sun/star/presentation/ParagraphTarget.hpp>
30cdf0e10cSrcweir #include <com/sun/star/container/XEnumerationAccess.hpp>
31cdf0e10cSrcweir #include <com/sun/star/animations/XIterateContainer.hpp>
32cdf0e10cSrcweir #include <com/sun/star/presentation/EffectPresetClass.hpp>
33cdf0e10cSrcweir #include <com/sun/star/presentation/EffectCommands.hpp>
34cdf0e10cSrcweir #include <com/sun/star/text/XTextRange.hpp>
35cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
36cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPage.hpp>
37cdf0e10cSrcweir #include <svx/ShapeTypeHandler.hxx>
38cdf0e10cSrcweir #include "CustomAnimationList.hxx"
39cdf0e10cSrcweir #ifndef _SD_CUSTOMANIMATIONPANE_HRC
40cdf0e10cSrcweir #include "CustomAnimationPane.hrc"
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir #ifndef _SD_CUSTOMANIMATION_HRC
43cdf0e10cSrcweir #include "CustomAnimation.hrc"
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir #include "CustomAnimationPreset.hxx"
46cdf0e10cSrcweir #include <svtools/treelist.hxx>
47cdf0e10cSrcweir #include <vcl/svapp.hxx>
48cdf0e10cSrcweir #include "sdresid.hxx"
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #include "res_bmp.hrc"
51cdf0e10cSrcweir #include "glob.hrc"
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include <algorithm>
54cdf0e10cSrcweir 
55cdf0e10cSrcweir using namespace ::com::sun::star;
56cdf0e10cSrcweir using namespace ::com::sun::star::animations;
57cdf0e10cSrcweir using namespace ::com::sun::star::presentation;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir using ::rtl::OUString;
60cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY;
61cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW;
62cdf0e10cSrcweir using ::com::sun::star::uno::Any;
63cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
64cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
65cdf0e10cSrcweir using ::com::sun::star::uno::Exception;
66cdf0e10cSrcweir using ::com::sun::star::uno::XInterface;
67cdf0e10cSrcweir using ::com::sun::star::text::XTextRange;
68cdf0e10cSrcweir using ::com::sun::star::drawing::XShape;
69cdf0e10cSrcweir using ::com::sun::star::drawing::XShapes;
70cdf0e10cSrcweir using ::com::sun::star::drawing::XDrawPage;
71cdf0e10cSrcweir using ::com::sun::star::container::XChild;
72cdf0e10cSrcweir using ::com::sun::star::container::XIndexAccess;
73cdf0e10cSrcweir using ::com::sun::star::container::XEnumerationAccess;
74cdf0e10cSrcweir using ::com::sun::star::container::XEnumeration;
75cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet;
76cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySetInfo;
77cdf0e10cSrcweir using ::accessibility::ShapeTypeHandler;
78cdf0e10cSrcweir 
79cdf0e10cSrcweir namespace sd {
80cdf0e10cSrcweir 
81cdf0e10cSrcweir // go recursivly through all shapes in the given XShapes collection and return true as soon as the
82cdf0e10cSrcweir // given shape is found. nIndex is incremented for each shape with the same shape type as the given
83cdf0e10cSrcweir // shape is found until the given shape is found.
getShapeIndex(const Reference<XShapes> & xShapes,const Reference<XShape> & xShape,sal_Int32 & nIndex)84cdf0e10cSrcweir static bool getShapeIndex(  const Reference< XShapes >& xShapes, const Reference< XShape >& xShape, sal_Int32& nIndex )
85cdf0e10cSrcweir {
86cdf0e10cSrcweir     const sal_Int32 nCount = xShapes->getCount();
87cdf0e10cSrcweir     sal_Int32 n;
88cdf0e10cSrcweir     for( n = 0; n < nCount; n++ )
89cdf0e10cSrcweir     {
90cdf0e10cSrcweir         Reference< XShape > xChild;
91cdf0e10cSrcweir         xShapes->getByIndex( n ) >>= xChild;
92cdf0e10cSrcweir         if( xChild == xShape )
93cdf0e10cSrcweir             return true;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir         if( xChild->getShapeType() == xShape->getShapeType() )
96cdf0e10cSrcweir             nIndex++;
97cdf0e10cSrcweir 
98cdf0e10cSrcweir         Reference< XShapes > xChildContainer( xChild, UNO_QUERY );
99cdf0e10cSrcweir         if( xChildContainer.is() )
100cdf0e10cSrcweir         {
101cdf0e10cSrcweir             if( getShapeIndex( xChildContainer, xShape, nIndex ) )
102cdf0e10cSrcweir                 return true;
103cdf0e10cSrcweir         }
104cdf0e10cSrcweir     }
105cdf0e10cSrcweir 
106cdf0e10cSrcweir     return false;
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir // returns the index of the shape type from the given shape
getShapeIndex(const Reference<XShape> & xShape)110cdf0e10cSrcweir static sal_Int32 getShapeIndex( const Reference< XShape >& xShape )
111cdf0e10cSrcweir {
112cdf0e10cSrcweir     Reference< XChild > xChild( xShape, UNO_QUERY );
113cdf0e10cSrcweir     Reference< XShapes > xPage;
114cdf0e10cSrcweir 
115cdf0e10cSrcweir     while( xChild.is() && !xPage.is() )
116cdf0e10cSrcweir     {
117cdf0e10cSrcweir         Reference< XInterface > x( xChild->getParent() );
118cdf0e10cSrcweir         xChild = Reference< XChild >::query( x );
119cdf0e10cSrcweir         Reference< XDrawPage > xTestPage( x, UNO_QUERY );
120cdf0e10cSrcweir         if( xTestPage.is() )
121cdf0e10cSrcweir             xPage = Reference< XShapes >::query( x );
122cdf0e10cSrcweir     }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir     sal_Int32 nIndex = 1;
125cdf0e10cSrcweir 
126cdf0e10cSrcweir     if( xPage.is() && getShapeIndex( xPage, xShape, nIndex ) )
127cdf0e10cSrcweir         return nIndex;
128cdf0e10cSrcweir     else
129cdf0e10cSrcweir         return -1;
130cdf0e10cSrcweir }
131cdf0e10cSrcweir 
getShapeDescription(const Reference<XShape> & xShape,bool bWithText=true)132cdf0e10cSrcweir OUString getShapeDescription( const Reference< XShape >& xShape, bool bWithText = true )
133cdf0e10cSrcweir {
134cdf0e10cSrcweir     OUString aDescription;
135cdf0e10cSrcweir     Reference< XPropertySet > xSet( xShape, UNO_QUERY );
136cdf0e10cSrcweir     if( xSet.is() )
137cdf0e10cSrcweir     {
138cdf0e10cSrcweir         Reference< XPropertySetInfo > xInfo( xSet->getPropertySetInfo() );
139cdf0e10cSrcweir         const OUString aPropName( RTL_CONSTASCII_USTRINGPARAM("UINameSingular") );
140cdf0e10cSrcweir         if( xInfo->hasPropertyByName( aPropName ) )
141cdf0e10cSrcweir             xSet->getPropertyValue( aPropName ) >>= aDescription;
142cdf0e10cSrcweir     }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir     aDescription += OUString( RTL_CONSTASCII_USTRINGPARAM(" "));
145cdf0e10cSrcweir     aDescription += OUString::valueOf( getShapeIndex( xShape ) );
146cdf0e10cSrcweir 
147cdf0e10cSrcweir     if( bWithText )
148cdf0e10cSrcweir     {
149cdf0e10cSrcweir         Reference< XTextRange > xText( xShape, UNO_QUERY );
150cdf0e10cSrcweir         if( xText.is() )
151cdf0e10cSrcweir         {
152cdf0e10cSrcweir             OUString aText( xText->getString() );
153cdf0e10cSrcweir             if( aText.getLength() )
154cdf0e10cSrcweir             {
155cdf0e10cSrcweir                 aDescription += OUString(RTL_CONSTASCII_USTRINGPARAM(": "));
156cdf0e10cSrcweir 
157cdf0e10cSrcweir                 aText = aText.replace( (sal_Unicode)'\n', (sal_Unicode)' ' );
158cdf0e10cSrcweir                 aText = aText.replace( (sal_Unicode)'\r', (sal_Unicode)' ' );
159cdf0e10cSrcweir 
160cdf0e10cSrcweir                 aDescription += aText;
161cdf0e10cSrcweir             }
162cdf0e10cSrcweir         }
163cdf0e10cSrcweir     }
164cdf0e10cSrcweir     return aDescription;
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
getDescription(const Any & rTarget,bool bWithText=true)167cdf0e10cSrcweir static OUString getDescription( const Any& rTarget, bool bWithText = true )
168cdf0e10cSrcweir {
169cdf0e10cSrcweir     OUString aDescription;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     if( rTarget.getValueType() == ::getCppuType((const ParagraphTarget*)0) )
172cdf0e10cSrcweir     {
173cdf0e10cSrcweir         ParagraphTarget aParaTarget;
174cdf0e10cSrcweir         rTarget >>= aParaTarget;
175cdf0e10cSrcweir 
176cdf0e10cSrcweir         Reference< XEnumerationAccess > xText( aParaTarget.Shape, UNO_QUERY_THROW );
177cdf0e10cSrcweir         Reference< XEnumeration > xEnumeration( xText->createEnumeration(), UNO_QUERY_THROW );
178cdf0e10cSrcweir         sal_Int32 nPara = aParaTarget.Paragraph;
179cdf0e10cSrcweir 
180cdf0e10cSrcweir         while( xEnumeration->hasMoreElements() && nPara )
181cdf0e10cSrcweir         {
182cdf0e10cSrcweir             xEnumeration->nextElement();
183cdf0e10cSrcweir             nPara--;
184cdf0e10cSrcweir         }
185cdf0e10cSrcweir 
186cdf0e10cSrcweir         DBG_ASSERT( xEnumeration->hasMoreElements(), "sd::CustomAnimationEffect::prepareText(), paragraph out of range!" );
187cdf0e10cSrcweir 
188cdf0e10cSrcweir         if( xEnumeration->hasMoreElements() )
189cdf0e10cSrcweir         {
190cdf0e10cSrcweir             Reference< XTextRange > xParagraph;
191cdf0e10cSrcweir             xEnumeration->nextElement() >>= xParagraph;
192cdf0e10cSrcweir 
193cdf0e10cSrcweir             if( xParagraph.is() )
194cdf0e10cSrcweir                 aDescription = xParagraph->getString();
195cdf0e10cSrcweir         }
196cdf0e10cSrcweir     }
197cdf0e10cSrcweir     else
198cdf0e10cSrcweir     {
199cdf0e10cSrcweir         Reference< XShape > xShape;
200cdf0e10cSrcweir         rTarget >>= xShape;
201cdf0e10cSrcweir         if( xShape.is() )
202cdf0e10cSrcweir             aDescription = getShapeDescription( xShape, bWithText );
203cdf0e10cSrcweir     }
204cdf0e10cSrcweir 
205cdf0e10cSrcweir     return aDescription;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir // ====================================================================
209cdf0e10cSrcweir 
210cdf0e10cSrcweir class CustomAnimationListEntryItem : public SvLBoxString
211cdf0e10cSrcweir {
212cdf0e10cSrcweir public:
213cdf0e10cSrcweir                     CustomAnimationListEntryItem( SvLBoxEntry*,sal_uInt16 nFlags, OUString aDescription, CustomAnimationEffectPtr pEffect, CustomAnimationList* pParent  );
214cdf0e10cSrcweir     virtual         ~CustomAnimationListEntryItem();
215cdf0e10cSrcweir     void            InitViewData( SvLBox*,SvLBoxEntry*,SvViewDataItem* );
216cdf0e10cSrcweir     void            Paint( const Point&, SvLBox& rDev, sal_uInt16 nFlags,SvLBoxEntry* );
217cdf0e10cSrcweir     SvLBoxItem*     Create() const;
218cdf0e10cSrcweir     void            Clone( SvLBoxItem* pSource );
219cdf0e10cSrcweir 
220cdf0e10cSrcweir private:
221cdf0e10cSrcweir     CustomAnimationList* mpParent;
222cdf0e10cSrcweir     OUString        maDescription;
223cdf0e10cSrcweir     CustomAnimationEffectPtr mpEffect;
224cdf0e10cSrcweir };
225cdf0e10cSrcweir 
226cdf0e10cSrcweir // --------------------------------------------------------------------
227cdf0e10cSrcweir 
CustomAnimationListEntryItem(SvLBoxEntry * pEntry,sal_uInt16 nFlags,OUString aDescription,CustomAnimationEffectPtr pEffect,CustomAnimationList * pParent)228cdf0e10cSrcweir CustomAnimationListEntryItem::CustomAnimationListEntryItem( SvLBoxEntry* pEntry, sal_uInt16 nFlags, OUString aDescription, CustomAnimationEffectPtr pEffect, CustomAnimationList* pParent  )
229cdf0e10cSrcweir : SvLBoxString( pEntry, nFlags, aDescription )
230cdf0e10cSrcweir , mpParent( pParent )
231cdf0e10cSrcweir , maDescription( aDescription )
232cdf0e10cSrcweir , mpEffect(pEffect)
233cdf0e10cSrcweir {
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir // --------------------------------------------------------------------
237cdf0e10cSrcweir 
~CustomAnimationListEntryItem()238cdf0e10cSrcweir CustomAnimationListEntryItem::~CustomAnimationListEntryItem()
239cdf0e10cSrcweir {
240cdf0e10cSrcweir }
241cdf0e10cSrcweir 
242cdf0e10cSrcweir // --------------------------------------------------------------------
243cdf0e10cSrcweir 
InitViewData(SvLBox * pView,SvLBoxEntry * pEntry,SvViewDataItem * pViewData)244cdf0e10cSrcweir void CustomAnimationListEntryItem::InitViewData( SvLBox* pView, SvLBoxEntry* pEntry, SvViewDataItem* pViewData )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir     if( !pViewData )
247cdf0e10cSrcweir         pViewData = pView->GetViewDataItem( pEntry, this );
248cdf0e10cSrcweir 
249cdf0e10cSrcweir     Size aSize(pView->GetTextWidth( maDescription ) + 2 * 19, pView->GetTextHeight() );
250cdf0e10cSrcweir     if( aSize.Height() < 19 )
251cdf0e10cSrcweir         aSize.Height() = 19;
252cdf0e10cSrcweir     pViewData->aSize = aSize;
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir // --------------------------------------------------------------------
256cdf0e10cSrcweir 
Paint(const Point & rPos,SvLBox & rDev,sal_uInt16,SvLBoxEntry * pEntry)257cdf0e10cSrcweir void CustomAnimationListEntryItem::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16, SvLBoxEntry* pEntry )
258cdf0e10cSrcweir {
259cdf0e10cSrcweir     const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
260cdf0e10cSrcweir 
261cdf0e10cSrcweir     SvViewDataItem* pViewData = mpParent->GetViewDataItem( pEntry, this );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir     Point aPos( rPos );
264cdf0e10cSrcweir     Size aSize( pViewData->aSize );
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     sal_Int16 nNodeType = mpEffect->getNodeType();
267cdf0e10cSrcweir     if( nNodeType == EffectNodeType::ON_CLICK )
268cdf0e10cSrcweir     {
269cdf0e10cSrcweir         rDev.DrawImage( aPos, mpParent->getImage( IMG_CUSTOMANIMATION_ON_CLICK, bHighContrast ) );
270cdf0e10cSrcweir     }
271cdf0e10cSrcweir     else if( nNodeType == EffectNodeType::AFTER_PREVIOUS )
272cdf0e10cSrcweir     {
273cdf0e10cSrcweir         rDev.DrawImage( aPos, mpParent->getImage( IMG_CUSTOMANIMATION_AFTER_PREVIOUS, bHighContrast ) );
274cdf0e10cSrcweir     }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir     aPos.X() += 19;
277cdf0e10cSrcweir 
278cdf0e10cSrcweir     sal_uInt16 nImage;
279cdf0e10cSrcweir     switch( mpEffect->getPresetClass() )
280cdf0e10cSrcweir     {
281cdf0e10cSrcweir     case EffectPresetClass::ENTRANCE:   nImage = IMG_CUSTOMANIMATION_ENTRANCE_EFFECT; break;
282cdf0e10cSrcweir     case EffectPresetClass::EXIT:       nImage =  IMG_CUSTOMANIMATION_EXIT_EFFECT; break;
283cdf0e10cSrcweir     case EffectPresetClass::EMPHASIS:   nImage =  IMG_CUSTOMANIMATION_EMPHASIS_EFFECT; break;
284cdf0e10cSrcweir     case EffectPresetClass::MOTIONPATH: nImage = IMG_CUSTOMANIMATION_MOTION_PATH; break;
285cdf0e10cSrcweir     case EffectPresetClass::OLEACTION:  nImage = IMG_CUSTOMANIMATION_OLE; break;
286cdf0e10cSrcweir     case EffectPresetClass::MEDIACALL:
287cdf0e10cSrcweir         switch( mpEffect->getCommand() )
288cdf0e10cSrcweir         {
289cdf0e10cSrcweir         case EffectCommands::TOGGLEPAUSE:   nImage = IMG_CUSTOMANIMATION_MEDIA_PAUSE; break;
290cdf0e10cSrcweir         case EffectCommands::STOP:          nImage = IMG_CUSTOMANIMATION_MEDIA_STOP; break;
291cdf0e10cSrcweir         case EffectCommands::PLAY:
292cdf0e10cSrcweir         default:                            nImage = IMG_CUSTOMANIMATION_MEDIA_PLAY; break;
293cdf0e10cSrcweir         }
294cdf0e10cSrcweir         break;
295cdf0e10cSrcweir     default:                            nImage = 0xffff;
296cdf0e10cSrcweir     }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     if( nImage != 0xffff )
299cdf0e10cSrcweir     {
300cdf0e10cSrcweir         const Image& rImage = mpParent->getImage( nImage, bHighContrast );
301cdf0e10cSrcweir         Point aImagePos( aPos );
302cdf0e10cSrcweir         aImagePos.Y() += ( aSize.Height() - rImage.GetSizePixel().Height() ) >> 1;
303cdf0e10cSrcweir         rDev.DrawImage( aImagePos, rImage );
304cdf0e10cSrcweir     }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     aPos.X() += 19;
307cdf0e10cSrcweir     aPos.Y() += ( aSize.Height() - rDev.GetTextHeight()) >> 1;
308cdf0e10cSrcweir 
309cdf0e10cSrcweir     rDev.DrawText( aPos, rDev.GetEllipsisString( maDescription, rDev.GetOutputSizePixel().Width() - aPos.X() ) );
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir // --------------------------------------------------------------------
313cdf0e10cSrcweir 
Create() const314cdf0e10cSrcweir SvLBoxItem* CustomAnimationListEntryItem::Create() const
315cdf0e10cSrcweir {
316cdf0e10cSrcweir     return NULL;
317cdf0e10cSrcweir }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir // --------------------------------------------------------------------
320cdf0e10cSrcweir 
Clone(SvLBoxItem *)321cdf0e10cSrcweir void CustomAnimationListEntryItem::Clone( SvLBoxItem* )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir }
324cdf0e10cSrcweir 
325cdf0e10cSrcweir // ====================================================================
326cdf0e10cSrcweir 
327cdf0e10cSrcweir class CustomAnimationListEntry : public SvLBoxEntry
328cdf0e10cSrcweir {
329cdf0e10cSrcweir public:
330cdf0e10cSrcweir     CustomAnimationListEntry();
331cdf0e10cSrcweir     CustomAnimationListEntry( CustomAnimationEffectPtr pEffect );
332cdf0e10cSrcweir     virtual ~CustomAnimationListEntry();
333cdf0e10cSrcweir 
getEffect() const334cdf0e10cSrcweir     CustomAnimationEffectPtr getEffect() const { return mpEffect; }
335cdf0e10cSrcweir 
336cdf0e10cSrcweir private:
337cdf0e10cSrcweir     CustomAnimationEffectPtr mpEffect;
338cdf0e10cSrcweir };
339cdf0e10cSrcweir 
340cdf0e10cSrcweir // --------------------------------------------------------------------
341cdf0e10cSrcweir 
CustomAnimationListEntry()342cdf0e10cSrcweir CustomAnimationListEntry::CustomAnimationListEntry()
343cdf0e10cSrcweir {
344cdf0e10cSrcweir }
345cdf0e10cSrcweir 
346cdf0e10cSrcweir // --------------------------------------------------------------------
347cdf0e10cSrcweir 
CustomAnimationListEntry(CustomAnimationEffectPtr pEffect)348cdf0e10cSrcweir CustomAnimationListEntry::CustomAnimationListEntry( CustomAnimationEffectPtr pEffect )
349cdf0e10cSrcweir : mpEffect( pEffect )
350cdf0e10cSrcweir {
351cdf0e10cSrcweir }
352cdf0e10cSrcweir 
353cdf0e10cSrcweir // --------------------------------------------------------------------
354cdf0e10cSrcweir 
~CustomAnimationListEntry()355cdf0e10cSrcweir CustomAnimationListEntry::~CustomAnimationListEntry()
356cdf0e10cSrcweir {
357cdf0e10cSrcweir }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir // ====================================================================
360cdf0e10cSrcweir 
361cdf0e10cSrcweir class CustomAnimationTriggerEntryItem : public SvLBoxString
362cdf0e10cSrcweir {
363cdf0e10cSrcweir public:
364cdf0e10cSrcweir                     CustomAnimationTriggerEntryItem( SvLBoxEntry*,sal_uInt16 nFlags, OUString aDescription, CustomAnimationList* pParent  );
365cdf0e10cSrcweir     virtual         ~CustomAnimationTriggerEntryItem();
366cdf0e10cSrcweir     virtual sal_uInt16  IsA();
367cdf0e10cSrcweir     void            InitViewData( SvLBox*,SvLBoxEntry*,SvViewDataItem* );
368cdf0e10cSrcweir     void            Paint( const Point&, SvLBox& rDev, sal_uInt16 nFlags,SvLBoxEntry* );
369cdf0e10cSrcweir     SvLBoxItem*     Create() const;
370cdf0e10cSrcweir     void            Clone( SvLBoxItem* pSource );
371cdf0e10cSrcweir 
372cdf0e10cSrcweir private:
373cdf0e10cSrcweir     CustomAnimationList* mpParent;
374cdf0e10cSrcweir     OUString        maDescription;
375cdf0e10cSrcweir };
376cdf0e10cSrcweir 
377cdf0e10cSrcweir // --------------------------------------------------------------------
378cdf0e10cSrcweir 
CustomAnimationTriggerEntryItem(SvLBoxEntry * pEntry,sal_uInt16 nFlags,OUString aDescription,CustomAnimationList * pParent)379cdf0e10cSrcweir CustomAnimationTriggerEntryItem::CustomAnimationTriggerEntryItem( SvLBoxEntry* pEntry, sal_uInt16 nFlags, OUString aDescription, CustomAnimationList* pParent  )
380cdf0e10cSrcweir : SvLBoxString( pEntry, nFlags, aDescription ), mpParent( pParent ), maDescription( aDescription )
381cdf0e10cSrcweir {
382cdf0e10cSrcweir }
383cdf0e10cSrcweir 
384cdf0e10cSrcweir // --------------------------------------------------------------------
385cdf0e10cSrcweir 
~CustomAnimationTriggerEntryItem()386cdf0e10cSrcweir CustomAnimationTriggerEntryItem::~CustomAnimationTriggerEntryItem()
387cdf0e10cSrcweir {
388cdf0e10cSrcweir }
389cdf0e10cSrcweir 
390cdf0e10cSrcweir // --------------------------------------------------------------------
391cdf0e10cSrcweir 
IsA()392cdf0e10cSrcweir sal_uInt16 CustomAnimationTriggerEntryItem::IsA()
393cdf0e10cSrcweir {
394cdf0e10cSrcweir     return (sal_uInt16)-1;
395cdf0e10cSrcweir }
396cdf0e10cSrcweir 
397cdf0e10cSrcweir // --------------------------------------------------------------------
398cdf0e10cSrcweir 
InitViewData(SvLBox * pView,SvLBoxEntry * pEntry,SvViewDataItem * pViewData)399cdf0e10cSrcweir void CustomAnimationTriggerEntryItem::InitViewData( SvLBox* pView, SvLBoxEntry* pEntry, SvViewDataItem* pViewData )
400cdf0e10cSrcweir {
401cdf0e10cSrcweir     if( !pViewData )
402cdf0e10cSrcweir         pViewData = pView->GetViewDataItem( pEntry, this );
403cdf0e10cSrcweir 
404cdf0e10cSrcweir     Size aSize(pView->GetTextWidth( maDescription ) + 2 * 19, pView->GetTextHeight() );
405cdf0e10cSrcweir     if( aSize.Height() < 19 )
406cdf0e10cSrcweir         aSize.Height() = 19;
407cdf0e10cSrcweir     pViewData->aSize = aSize;
408cdf0e10cSrcweir 
409cdf0e10cSrcweir /*
410cdf0e10cSrcweir         SvViewData* pViewData = pView->GetViewData( pEntry );
411cdf0e10cSrcweir         if( pViewData )
412cdf0e10cSrcweir             pViewData->SetSelectable(false);
413cdf0e10cSrcweir */
414cdf0e10cSrcweir }
415cdf0e10cSrcweir 
416cdf0e10cSrcweir // --------------------------------------------------------------------
417cdf0e10cSrcweir 
Paint(const Point & rPos,SvLBox & rDev,sal_uInt16,SvLBoxEntry *)418cdf0e10cSrcweir void CustomAnimationTriggerEntryItem::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16, SvLBoxEntry* )
419cdf0e10cSrcweir {
420cdf0e10cSrcweir     Size aSize( rDev.GetOutputSizePixel().Width(), static_cast< SvTreeListBox* >(&rDev)->GetEntryHeight() );
421cdf0e10cSrcweir 
422cdf0e10cSrcweir     Point aPos( 0, rPos.Y() );
423cdf0e10cSrcweir 
424cdf0e10cSrcweir     Rectangle aOutRect( aPos, aSize );
425cdf0e10cSrcweir 
426cdf0e10cSrcweir     // fill the background
427cdf0e10cSrcweir     Color aColor (rDev.GetSettings().GetStyleSettings().GetDialogColor());
428cdf0e10cSrcweir 
429cdf0e10cSrcweir     rDev.Push();
430cdf0e10cSrcweir     rDev.SetFillColor (aColor);
431cdf0e10cSrcweir     rDev.SetLineColor ();
432cdf0e10cSrcweir     rDev.DrawRect(aOutRect);
433cdf0e10cSrcweir 
434cdf0e10cSrcweir     // Erase the four corner pixels to make the rectangle appear rounded.
435cdf0e10cSrcweir     rDev.SetLineColor( rDev.GetSettings().GetStyleSettings().GetWindowColor());
436cdf0e10cSrcweir     rDev.DrawPixel( aOutRect.TopLeft());
437cdf0e10cSrcweir     rDev.DrawPixel( Point(aOutRect.Right(), aOutRect.Top()));
438cdf0e10cSrcweir     rDev.DrawPixel( Point(aOutRect.Left(), aOutRect.Bottom()));
439cdf0e10cSrcweir     rDev.DrawPixel( Point(aOutRect.Right(), aOutRect.Bottom()));
440cdf0e10cSrcweir 
441cdf0e10cSrcweir     // draw the category title
442cdf0e10cSrcweir 
443cdf0e10cSrcweir     int nVertBorder = (( aSize.Height() - rDev.GetTextHeight()) >> 1);
444cdf0e10cSrcweir     int nHorzBorder = rDev.LogicToPixel( Size( 3, 3 ), MAP_APPFONT ).Width();
445cdf0e10cSrcweir 
446cdf0e10cSrcweir     aOutRect.nLeft += nHorzBorder;
447cdf0e10cSrcweir     aOutRect.nRight -= nHorzBorder;
448cdf0e10cSrcweir     aOutRect.nTop += nVertBorder;
449cdf0e10cSrcweir     aOutRect.nBottom -= nVertBorder;
450cdf0e10cSrcweir 
451cdf0e10cSrcweir     rDev.DrawText (aOutRect, rDev.GetEllipsisString( maDescription, aOutRect.GetWidth() ) );
452cdf0e10cSrcweir     rDev.Pop();
453cdf0e10cSrcweir }
454cdf0e10cSrcweir 
455cdf0e10cSrcweir // --------------------------------------------------------------------
456cdf0e10cSrcweir 
Create() const457cdf0e10cSrcweir SvLBoxItem* CustomAnimationTriggerEntryItem::Create() const
458cdf0e10cSrcweir {
459cdf0e10cSrcweir     return NULL;
460cdf0e10cSrcweir }
461cdf0e10cSrcweir 
462cdf0e10cSrcweir // --------------------------------------------------------------------
463cdf0e10cSrcweir 
Clone(SvLBoxItem *)464cdf0e10cSrcweir void CustomAnimationTriggerEntryItem::Clone( SvLBoxItem* )
465cdf0e10cSrcweir {
466cdf0e10cSrcweir }
467cdf0e10cSrcweir 
468cdf0e10cSrcweir // ====================================================================
469cdf0e10cSrcweir 
CustomAnimationList(::Window * pParent,const ResId & rResId,ICustomAnimationListController * pController)470cdf0e10cSrcweir CustomAnimationList::CustomAnimationList( ::Window* pParent, const ResId& rResId, ICustomAnimationListController* pController )
471cdf0e10cSrcweir :   SvTreeListBox( pParent, rResId )
472cdf0e10cSrcweir ,   mbIgnorePaint( false )
473cdf0e10cSrcweir ,   mpController( pController )
474cdf0e10cSrcweir ,   mpLastParentEntry(0)
475cdf0e10cSrcweir {
476cdf0e10cSrcweir     SetStyle( GetStyle() | WB_TABSTOP | WB_BORDER | WB_HASLINES | WB_HASBUTTONS | WB_HASBUTTONSATROOT );
477cdf0e10cSrcweir 
478cdf0e10cSrcweir     EnableContextMenuHandling();
479cdf0e10cSrcweir     SetSelectionMode( MULTIPLE_SELECTION );
480cdf0e10cSrcweir     SetIndent(16);
481cdf0e10cSrcweir     SetNodeDefaultImages();
482cdf0e10cSrcweir }
483cdf0e10cSrcweir 
484cdf0e10cSrcweir // --------------------------------------------------------------------
485cdf0e10cSrcweir 
getImage(sal_uInt16 nId,bool bHighContrast)486cdf0e10cSrcweir const Image&  CustomAnimationList::getImage( sal_uInt16 nId, bool bHighContrast )
487cdf0e10cSrcweir {
488cdf0e10cSrcweir     DBG_ASSERT( (nId >= IMG_CUSTOMANIMATION_ON_CLICK) && (nId <= IMG_CUSTOMANIMATION_MEDIA_STOP), "sd::CustomAnimationList::getImage(), illegal index!" );
489cdf0e10cSrcweir 
490cdf0e10cSrcweir     if( bHighContrast )
491cdf0e10cSrcweir         nId += 1;
492cdf0e10cSrcweir 
493cdf0e10cSrcweir     Image& rImage = maImages[nId - IMG_CUSTOMANIMATION_ON_CLICK];
494cdf0e10cSrcweir 
495cdf0e10cSrcweir     // load on demand
496cdf0e10cSrcweir     if( rImage.GetSizePixel().Width() == 0 )
497cdf0e10cSrcweir         rImage = Image(SdResId( nId ) );
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     return rImage;
500cdf0e10cSrcweir }
501cdf0e10cSrcweir 
502cdf0e10cSrcweir // --------------------------------------------------------------------
503cdf0e10cSrcweir 
~CustomAnimationList()504cdf0e10cSrcweir CustomAnimationList::~CustomAnimationList()
505cdf0e10cSrcweir {
506cdf0e10cSrcweir     if( mpMainSequence.get() )
507cdf0e10cSrcweir         mpMainSequence->removeListener( this );
508cdf0e10cSrcweir 
509cdf0e10cSrcweir     clear();
510cdf0e10cSrcweir }
511cdf0e10cSrcweir 
512cdf0e10cSrcweir // --------------------------------------------------------------------
513cdf0e10cSrcweir 
KeyInput(const KeyEvent & rKEvt)514cdf0e10cSrcweir void CustomAnimationList::KeyInput( const KeyEvent& rKEvt )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir     const int nKeyCode = rKEvt.GetKeyCode().GetCode();
517cdf0e10cSrcweir     switch( nKeyCode )
518cdf0e10cSrcweir     {
519cdf0e10cSrcweir         case KEY_DELETE:    mpController->onContextMenu( CM_REMOVE ); return;
520cdf0e10cSrcweir         case KEY_INSERT:    mpController->onContextMenu( CM_CREATE ); return;
521cdf0e10cSrcweir         case KEY_SPACE:
522cdf0e10cSrcweir             {
523cdf0e10cSrcweir                 const Point aPos;
524cdf0e10cSrcweir                 const CommandEvent aCEvt( aPos, COMMAND_CONTEXTMENU );
525cdf0e10cSrcweir                 Command( aCEvt );
526cdf0e10cSrcweir                 return;
527cdf0e10cSrcweir             }
528cdf0e10cSrcweir 
529cdf0e10cSrcweir     }
530cdf0e10cSrcweir 
531cdf0e10cSrcweir     ::SvTreeListBox::KeyInput( rKEvt );
532cdf0e10cSrcweir }
533cdf0e10cSrcweir 
534cdf0e10cSrcweir // --------------------------------------------------------------------
535cdf0e10cSrcweir 
536cdf0e10cSrcweir /** selects or deselects the given effect.
537cdf0e10cSrcweir     Selections of other effects are not changed */
select(CustomAnimationEffectPtr pEffect,bool bSelect)538cdf0e10cSrcweir void CustomAnimationList::select( CustomAnimationEffectPtr pEffect, bool bSelect /* = true */ )
539cdf0e10cSrcweir {
540cdf0e10cSrcweir     CustomAnimationListEntry* pEntry = static_cast< CustomAnimationListEntry* >(First());
541cdf0e10cSrcweir     while( pEntry )
542cdf0e10cSrcweir     {
543cdf0e10cSrcweir         if( pEntry->getEffect() == pEffect )
544cdf0e10cSrcweir         {
545cdf0e10cSrcweir             Select( pEntry, bSelect );
546cdf0e10cSrcweir             break;
547cdf0e10cSrcweir         }
548cdf0e10cSrcweir         pEntry = static_cast< CustomAnimationListEntry* >(Next( pEntry ));
549cdf0e10cSrcweir     }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir     if( !pEntry && bSelect )
552cdf0e10cSrcweir     {
553cdf0e10cSrcweir         append( pEffect );
554cdf0e10cSrcweir         select( pEffect );
555cdf0e10cSrcweir     }
556cdf0e10cSrcweir }
557cdf0e10cSrcweir 
558cdf0e10cSrcweir // --------------------------------------------------------------------
559cdf0e10cSrcweir 
clear()560cdf0e10cSrcweir void CustomAnimationList::clear()
561cdf0e10cSrcweir {
562cdf0e10cSrcweir     Clear();
563cdf0e10cSrcweir 
564cdf0e10cSrcweir     mpLastParentEntry = 0;
565cdf0e10cSrcweir     mxLastTargetShape = 0;
566cdf0e10cSrcweir }
567cdf0e10cSrcweir 
568cdf0e10cSrcweir // --------------------------------------------------------------------
569cdf0e10cSrcweir 
update(MainSequencePtr pMainSequence)570cdf0e10cSrcweir void CustomAnimationList::update( MainSequencePtr pMainSequence )
571cdf0e10cSrcweir {
572cdf0e10cSrcweir     if( mpMainSequence.get() )
573cdf0e10cSrcweir         mpMainSequence->removeListener( this );
574cdf0e10cSrcweir 
575cdf0e10cSrcweir     mpMainSequence = pMainSequence;
576cdf0e10cSrcweir     update();
577cdf0e10cSrcweir 
578cdf0e10cSrcweir     if( mpMainSequence.get() )
579cdf0e10cSrcweir         mpMainSequence->addListener( this );
580cdf0e10cSrcweir }
581cdf0e10cSrcweir 
582cdf0e10cSrcweir // --------------------------------------------------------------------
583cdf0e10cSrcweir 
584cdf0e10cSrcweir struct stl_append_effect_func : public std::unary_function<CustomAnimationEffectPtr, void>
585cdf0e10cSrcweir {
stl_append_effect_funcsd::stl_append_effect_func586cdf0e10cSrcweir     stl_append_effect_func( CustomAnimationList& rList ) : mrList( rList ) {}
587cdf0e10cSrcweir     void operator()(CustomAnimationEffectPtr pEffect);
588cdf0e10cSrcweir     CustomAnimationList& mrList;
589cdf0e10cSrcweir };
590cdf0e10cSrcweir 
operator ()(CustomAnimationEffectPtr pEffect)591cdf0e10cSrcweir void stl_append_effect_func::operator()(CustomAnimationEffectPtr pEffect)
592cdf0e10cSrcweir {
593cdf0e10cSrcweir     mrList.append( pEffect );
594cdf0e10cSrcweir }
595cdf0e10cSrcweir // --------------------------------------------------------------------
596cdf0e10cSrcweir 
update()597cdf0e10cSrcweir void CustomAnimationList::update()
598cdf0e10cSrcweir {
599cdf0e10cSrcweir     mbIgnorePaint = true;
600cdf0e10cSrcweir 
601cdf0e10cSrcweir     CustomAnimationListEntry* pEntry = 0;
602cdf0e10cSrcweir 
603cdf0e10cSrcweir     std::list< CustomAnimationEffectPtr > aExpanded;
604cdf0e10cSrcweir     std::list< CustomAnimationEffectPtr > aSelected;
605cdf0e10cSrcweir 
606cdf0e10cSrcweir     CustomAnimationEffectPtr pFirstVisibleEffect;
607cdf0e10cSrcweir 
608cdf0e10cSrcweir     if( mpMainSequence.get() )
609cdf0e10cSrcweir     {
610cdf0e10cSrcweir         // save selection and expand states
611cdf0e10cSrcweir         pEntry = static_cast<CustomAnimationListEntry*>(FirstVisible());
612cdf0e10cSrcweir         if( pEntry )
613cdf0e10cSrcweir             pFirstVisibleEffect = pEntry->getEffect();
614cdf0e10cSrcweir 
615cdf0e10cSrcweir         pEntry = static_cast<CustomAnimationListEntry*>(First());
616cdf0e10cSrcweir 
617cdf0e10cSrcweir         while( pEntry )
618cdf0e10cSrcweir         {
619cdf0e10cSrcweir             CustomAnimationEffectPtr pEffect( pEntry->getEffect() );
620cdf0e10cSrcweir             if( pEffect.get() )
621cdf0e10cSrcweir             {
622cdf0e10cSrcweir                 if( IsExpanded( pEntry ) )
623cdf0e10cSrcweir                     aExpanded.push_back( pEffect );
624cdf0e10cSrcweir 
625cdf0e10cSrcweir                 if( IsSelected( pEntry ) )
626cdf0e10cSrcweir                     aSelected.push_back( pEffect );
627cdf0e10cSrcweir             }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir             pEntry = static_cast<CustomAnimationListEntry*>(Next( pEntry ));
630cdf0e10cSrcweir         }
631cdf0e10cSrcweir     }
632cdf0e10cSrcweir 
633cdf0e10cSrcweir     // rebuild list
634cdf0e10cSrcweir     clear();
635cdf0e10cSrcweir     if( mpMainSequence.get() )
636cdf0e10cSrcweir     {
637cdf0e10cSrcweir         std::for_each( mpMainSequence->getBegin(), mpMainSequence->getEnd(), stl_append_effect_func( *this ) );
638cdf0e10cSrcweir         mpLastParentEntry = 0;
639cdf0e10cSrcweir 
640cdf0e10cSrcweir         const InteractiveSequenceList& rISL = mpMainSequence->getInteractiveSequenceList();
641cdf0e10cSrcweir 
642cdf0e10cSrcweir         InteractiveSequenceList::const_iterator aIter( rISL.begin() );
643cdf0e10cSrcweir         const InteractiveSequenceList::const_iterator aEnd( rISL.end() );
644cdf0e10cSrcweir         while( aIter != aEnd )
645cdf0e10cSrcweir         {
646cdf0e10cSrcweir             InteractiveSequencePtr pIS( (*aIter++) );
647cdf0e10cSrcweir 
648cdf0e10cSrcweir             Reference< XShape > xShape( pIS->getTriggerShape() );
649cdf0e10cSrcweir             if( xShape.is() )
650cdf0e10cSrcweir             {
651cdf0e10cSrcweir                 SvLBoxEntry* pLBoxEntry = new CustomAnimationListEntry;
652cdf0e10cSrcweir                 pLBoxEntry->AddItem( new SvLBoxContextBmp( pLBoxEntry, 0, Image(), Image(), 0));
653cdf0e10cSrcweir                 OUString aDescription = String( SdResId( STR_CUSTOMANIMATION_TRIGGER ) );
654cdf0e10cSrcweir                 aDescription += OUString( RTL_CONSTASCII_USTRINGPARAM(": ") );
655cdf0e10cSrcweir                 aDescription += getShapeDescription( xShape, false );
656cdf0e10cSrcweir                 pLBoxEntry->AddItem( new CustomAnimationTriggerEntryItem( pLBoxEntry, 0, aDescription, this ) );
657cdf0e10cSrcweir                 Insert( pLBoxEntry );
658cdf0e10cSrcweir                 SvViewData* pViewData = GetViewData( pLBoxEntry );
659cdf0e10cSrcweir                 if( pViewData )
660cdf0e10cSrcweir                     pViewData->SetSelectable(false);
661cdf0e10cSrcweir 
662cdf0e10cSrcweir                 std::for_each( pIS->getBegin(), pIS->getEnd(), stl_append_effect_func( *this ) );
663cdf0e10cSrcweir                 mpLastParentEntry = 0;
664cdf0e10cSrcweir             }
665cdf0e10cSrcweir         }
666cdf0e10cSrcweir 
667cdf0e10cSrcweir         // restore selection and expand states
668cdf0e10cSrcweir         pEntry = static_cast<CustomAnimationListEntry*>(First());
669cdf0e10cSrcweir 
670cdf0e10cSrcweir         while( pEntry )
671cdf0e10cSrcweir         {
672cdf0e10cSrcweir             CustomAnimationEffectPtr pEffect( pEntry->getEffect() );
673cdf0e10cSrcweir             if( pEffect.get() )
674cdf0e10cSrcweir             {
675cdf0e10cSrcweir                 if( std::find( aExpanded.begin(), aExpanded.end(), pEffect ) != aExpanded.end() )
676cdf0e10cSrcweir                     Expand( pEntry );
677cdf0e10cSrcweir 
678cdf0e10cSrcweir                 if( std::find( aSelected.begin(), aSelected.end(), pEffect ) != aSelected.end() )
679cdf0e10cSrcweir                     Select( pEntry );
680cdf0e10cSrcweir 
681cdf0e10cSrcweir                 if( pFirstVisibleEffect == pEffect )
682cdf0e10cSrcweir                     MakeVisible( pEntry );
683cdf0e10cSrcweir             }
684cdf0e10cSrcweir 
685cdf0e10cSrcweir             pEntry = static_cast<CustomAnimationListEntry*>(Next( pEntry ));
686cdf0e10cSrcweir         }
687cdf0e10cSrcweir     }
688cdf0e10cSrcweir 
689cdf0e10cSrcweir     mbIgnorePaint = false;
690cdf0e10cSrcweir     Invalidate();
691cdf0e10cSrcweir }
692cdf0e10cSrcweir 
693cdf0e10cSrcweir // --------------------------------------------------------------------
694cdf0e10cSrcweir 
695cdf0e10cSrcweir /*
696cdf0e10cSrcweir void CustomAnimationList::update( CustomAnimationEffectPtr pEffect )
697cdf0e10cSrcweir {
698cdf0e10cSrcweir     SvLBoxEntry* pEntry = First();
699cdf0e10cSrcweir     while( pEntry )
700cdf0e10cSrcweir     {
701cdf0e10cSrcweir         if( static_cast< CustomAnimationEffectPtr * >( pEntry->GetUserData() )->get() == pEffect.get() )
702cdf0e10cSrcweir         {
703cdf0e10cSrcweir             CustomAnimationPresetsPtr pPresets = mpController->getPresets();
704cdf0e10cSrcweir             const CustomAnimationPresetPtr pPreset = pPresets->getEffectDescriptor( pEffect->getPresetId() );
705cdf0e10cSrcweir             if( pPreset.get() )
706cdf0e10cSrcweir                 pEffect->setName( pPresets->getUINameForPresetId( pPreset->getPresetId() ) );
707cdf0e10cSrcweir             else
708cdf0e10cSrcweir                 pEffect->setName( pEffect->getPresetId() );
709cdf0e10cSrcweir             break;
710cdf0e10cSrcweir         }
711cdf0e10cSrcweir         pEntry = Next( pEntry );
712cdf0e10cSrcweir     }
713cdf0e10cSrcweir 
714cdf0e10cSrcweir     Invalidate();
715cdf0e10cSrcweir }
716cdf0e10cSrcweir */
717cdf0e10cSrcweir 
718cdf0e10cSrcweir // --------------------------------------------------------------------
719cdf0e10cSrcweir 
append(CustomAnimationEffectPtr pEffect)720cdf0e10cSrcweir void CustomAnimationList::append( CustomAnimationEffectPtr pEffect )
721cdf0e10cSrcweir {
722cdf0e10cSrcweir     // create a ui description
723cdf0e10cSrcweir     OUString aDescription;
724cdf0e10cSrcweir 
725cdf0e10cSrcweir     Any aTarget( pEffect->getTarget() );
726cdf0e10cSrcweir     if( aTarget.hasValue() ) try
727cdf0e10cSrcweir     {
728cdf0e10cSrcweir         aDescription = getDescription( aTarget, pEffect->getTargetSubItem() != ShapeAnimationSubType::ONLY_BACKGROUND );
729cdf0e10cSrcweir 
730cdf0e10cSrcweir         SvLBoxEntry* pParentEntry = 0;
731cdf0e10cSrcweir 
732cdf0e10cSrcweir         Reference< XShape > xTargetShape( pEffect->getTargetShape() );
733cdf0e10cSrcweir         sal_Int32 nGroupId = pEffect->getGroupId();
734cdf0e10cSrcweir 
735cdf0e10cSrcweir         // if this effect has the same target and group-id as the last root effect,
736cdf0e10cSrcweir         // the last root effect is also this effects parent
737cdf0e10cSrcweir         if( mpLastParentEntry && (nGroupId != -1) && (mxLastTargetShape == xTargetShape) && (mnLastGroupId == nGroupId) )
738cdf0e10cSrcweir             pParentEntry = mpLastParentEntry;
739cdf0e10cSrcweir 
740cdf0e10cSrcweir         // create an entry for the effect
741cdf0e10cSrcweir         SvLBoxEntry* pEntry = new CustomAnimationListEntry( pEffect );
742cdf0e10cSrcweir 
743cdf0e10cSrcweir         pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));
744cdf0e10cSrcweir         pEntry->AddItem( new CustomAnimationListEntryItem( pEntry, 0, aDescription, pEffect, this ) );
745cdf0e10cSrcweir 
746cdf0e10cSrcweir         if( pParentEntry )
747cdf0e10cSrcweir         {
748cdf0e10cSrcweir             // add a subentry
749cdf0e10cSrcweir             Insert( pEntry, pParentEntry );
750cdf0e10cSrcweir         }
751cdf0e10cSrcweir         else
752cdf0e10cSrcweir         {
753cdf0e10cSrcweir             // add a root entry
754cdf0e10cSrcweir             Insert( pEntry );
755cdf0e10cSrcweir 
756cdf0e10cSrcweir             // and the new root entry becomes the possible next group header
757cdf0e10cSrcweir             mxLastTargetShape = xTargetShape;
758cdf0e10cSrcweir             mnLastGroupId = nGroupId;
759cdf0e10cSrcweir             mpLastParentEntry = pEntry;
760cdf0e10cSrcweir         }
761cdf0e10cSrcweir     }
762cdf0e10cSrcweir     catch( Exception& e )
763cdf0e10cSrcweir     {
764cdf0e10cSrcweir         (void)e;
765cdf0e10cSrcweir         DBG_ERROR("sd::CustomAnimationList::append(), exception catched!" );
766cdf0e10cSrcweir     }
767cdf0e10cSrcweir }
768cdf0e10cSrcweir 
769cdf0e10cSrcweir // --------------------------------------------------------------------
770cdf0e10cSrcweir 
771cdf0e10cSrcweir /*
772cdf0e10cSrcweir void CustomAnimationList::remove( CustomAnimationEffectPtr pEffect )
773cdf0e10cSrcweir {
774cdf0e10cSrcweir     SvLBoxEntry* pEntry = First();
775cdf0e10cSrcweir     while( pEntry )
776cdf0e10cSrcweir     {
777cdf0e10cSrcweir         if( static_cast< CustomAnimationEffectPtr * >( pEntry->GetUserData() )->get() == pEffect.get() )
778cdf0e10cSrcweir         {
779cdf0e10cSrcweir             GetModel()->Remove( pEntry );
780cdf0e10cSrcweir             if( pEntry == mpLastParentEntry )
781cdf0e10cSrcweir             {
782cdf0e10cSrcweir                 mpLastParentEntry = 0;
783cdf0e10cSrcweir                 mxLastTargetShape = 0;
784cdf0e10cSrcweir             }
785cdf0e10cSrcweir             break;
786cdf0e10cSrcweir         }
787cdf0e10cSrcweir         pEntry = Next( pEntry );
788cdf0e10cSrcweir     }
789cdf0e10cSrcweir 
790cdf0e10cSrcweir     Invalidate();
791cdf0e10cSrcweir }
792cdf0e10cSrcweir */
793cdf0e10cSrcweir 
794cdf0e10cSrcweir // --------------------------------------------------------------------
795cdf0e10cSrcweir 
selectShape(SvTreeListBox * pTreeList,Reference<XShape> xShape)796cdf0e10cSrcweir void selectShape( SvTreeListBox* pTreeList, Reference< XShape > xShape )
797cdf0e10cSrcweir {
798cdf0e10cSrcweir     CustomAnimationListEntry* pEntry = static_cast< CustomAnimationListEntry* >(pTreeList->First());
799cdf0e10cSrcweir     while( pEntry )
800cdf0e10cSrcweir     {
801cdf0e10cSrcweir         CustomAnimationEffectPtr pEffect( pEntry->getEffect() );
802cdf0e10cSrcweir         if( pEffect.get() )
803cdf0e10cSrcweir         {
804cdf0e10cSrcweir             if( pEffect->getTarget() == xShape )
805cdf0e10cSrcweir                 pTreeList->Select( pEntry );
806cdf0e10cSrcweir         }
807cdf0e10cSrcweir 
808cdf0e10cSrcweir         pEntry = static_cast< CustomAnimationListEntry* >(pTreeList->Next( pEntry ));
809cdf0e10cSrcweir     }
810cdf0e10cSrcweir }
811cdf0e10cSrcweir 
812cdf0e10cSrcweir // --------------------------------------------------------------------
813cdf0e10cSrcweir 
onSelectionChanged(Any aSelection)814cdf0e10cSrcweir void CustomAnimationList::onSelectionChanged( Any aSelection )
815cdf0e10cSrcweir {
816cdf0e10cSrcweir     try
817cdf0e10cSrcweir     {
818cdf0e10cSrcweir         SelectAll(sal_False);
819cdf0e10cSrcweir 
820cdf0e10cSrcweir         if( aSelection.hasValue() )
821cdf0e10cSrcweir         {
822cdf0e10cSrcweir             Reference< XIndexAccess > xShapes( aSelection, UNO_QUERY );
823cdf0e10cSrcweir             if( xShapes.is() )
824cdf0e10cSrcweir             {
825cdf0e10cSrcweir                 sal_Int32 nCount = xShapes->getCount();
826cdf0e10cSrcweir                 sal_Int32 nIndex;
827cdf0e10cSrcweir                 for( nIndex = 0; nIndex < nCount; nIndex++ )
828cdf0e10cSrcweir                 {
829cdf0e10cSrcweir                     Reference< XShape > xShape( xShapes->getByIndex( nIndex ), UNO_QUERY );
830cdf0e10cSrcweir                     if( xShape.is() )
831cdf0e10cSrcweir                         selectShape( this, xShape );
832cdf0e10cSrcweir                 }
833cdf0e10cSrcweir             }
834cdf0e10cSrcweir             else
835cdf0e10cSrcweir             {
836cdf0e10cSrcweir                 Reference< XShape > xShape( aSelection, UNO_QUERY );
837cdf0e10cSrcweir                 if( xShape.is() )
838cdf0e10cSrcweir                     selectShape( this, xShape );
839cdf0e10cSrcweir             }
840cdf0e10cSrcweir         }
841cdf0e10cSrcweir 
842cdf0e10cSrcweir         SelectHdl();
843cdf0e10cSrcweir     }
844cdf0e10cSrcweir     catch( Exception& )
845cdf0e10cSrcweir     {
846cdf0e10cSrcweir         DBG_ERROR( "sd::CustomAnimationList::onSelectionChanged(), Exception catched!" );
847cdf0e10cSrcweir     }
848cdf0e10cSrcweir }
849cdf0e10cSrcweir 
850cdf0e10cSrcweir // --------------------------------------------------------------------
851cdf0e10cSrcweir 
SelectHdl()852cdf0e10cSrcweir void CustomAnimationList::SelectHdl()
853cdf0e10cSrcweir {
854cdf0e10cSrcweir     SvTreeListBox::SelectHdl();
855cdf0e10cSrcweir     mpController->onSelect();
856cdf0e10cSrcweir }
857cdf0e10cSrcweir 
858cdf0e10cSrcweir // --------------------------------------------------------------------
859cdf0e10cSrcweir 
isExpanded(const CustomAnimationEffectPtr & pEffect) const860cdf0e10cSrcweir bool CustomAnimationList::isExpanded( const CustomAnimationEffectPtr& pEffect ) const
861cdf0e10cSrcweir {
862cdf0e10cSrcweir     CustomAnimationListEntry* pEntry = static_cast<CustomAnimationListEntry*>(First());
863cdf0e10cSrcweir 
864cdf0e10cSrcweir     while( pEntry )
865cdf0e10cSrcweir     {
866cdf0e10cSrcweir         if( pEntry->getEffect() == pEffect )
867cdf0e10cSrcweir             break;
868cdf0e10cSrcweir 
869cdf0e10cSrcweir         pEntry = static_cast<CustomAnimationListEntry*>(Next( pEntry ));
870cdf0e10cSrcweir     }
871cdf0e10cSrcweir 
872cdf0e10cSrcweir     if( pEntry )
873cdf0e10cSrcweir         pEntry = static_cast<CustomAnimationListEntry*>(GetParent( pEntry ));
874cdf0e10cSrcweir 
875cdf0e10cSrcweir     return (pEntry == 0) || IsExpanded( pEntry );
876cdf0e10cSrcweir }
877cdf0e10cSrcweir 
878cdf0e10cSrcweir // --------------------------------------------------------------------
getSelection() const879cdf0e10cSrcweir EffectSequence CustomAnimationList::getSelection() const
880cdf0e10cSrcweir {
881cdf0e10cSrcweir     EffectSequence aSelection;
882cdf0e10cSrcweir 
883cdf0e10cSrcweir     CustomAnimationListEntry* pEntry = dynamic_cast< CustomAnimationListEntry* >(FirstSelected());
884cdf0e10cSrcweir     while( pEntry )
885cdf0e10cSrcweir     {
886cdf0e10cSrcweir         CustomAnimationEffectPtr pEffect( pEntry->getEffect() );
887cdf0e10cSrcweir         if( pEffect.get() )
888cdf0e10cSrcweir             aSelection.push_back( pEffect );
889cdf0e10cSrcweir 
890cdf0e10cSrcweir         // if the selected effect is not expanded and has children
891*86e1cf34SPedro Giffuni         // we say that the children are automatically selected
892cdf0e10cSrcweir         if( !IsExpanded( pEntry ) )
893cdf0e10cSrcweir         {
894cdf0e10cSrcweir             CustomAnimationListEntry* pChild = dynamic_cast< CustomAnimationListEntry* >( FirstChild( pEntry ) );
895cdf0e10cSrcweir             while( pChild )
896cdf0e10cSrcweir             {
897cdf0e10cSrcweir                 if( !IsSelected( pChild ) )
898cdf0e10cSrcweir                 {
899cdf0e10cSrcweir                     CustomAnimationEffectPtr pChildEffect( pChild->getEffect() );
900cdf0e10cSrcweir                     if( pChildEffect.get() )
901cdf0e10cSrcweir                         aSelection.push_back( pChildEffect );
902cdf0e10cSrcweir                 }
903cdf0e10cSrcweir 
904cdf0e10cSrcweir                 pChild = dynamic_cast< CustomAnimationListEntry* >(  NextSibling( pChild ) );
905cdf0e10cSrcweir             }
906cdf0e10cSrcweir         }
907cdf0e10cSrcweir 
908cdf0e10cSrcweir         pEntry = static_cast< CustomAnimationListEntry* >(NextSelected( pEntry ));
909cdf0e10cSrcweir     }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir     return aSelection;
912cdf0e10cSrcweir }
913cdf0e10cSrcweir 
914cdf0e10cSrcweir // --------------------------------------------------------------------
915cdf0e10cSrcweir 
DoubleClickHdl()916cdf0e10cSrcweir sal_Bool CustomAnimationList::DoubleClickHdl()
917cdf0e10cSrcweir {
918cdf0e10cSrcweir     mpController->onDoubleClick();
919cdf0e10cSrcweir     return false;
920cdf0e10cSrcweir }
921cdf0e10cSrcweir 
922cdf0e10cSrcweir // --------------------------------------------------------------------
923cdf0e10cSrcweir 
CreateContextMenu()924cdf0e10cSrcweir PopupMenu* CustomAnimationList::CreateContextMenu()
925cdf0e10cSrcweir {
926cdf0e10cSrcweir     PopupMenu* pMenu = new PopupMenu(SdResId( RID_EFFECT_CONTEXTMENU ));
927cdf0e10cSrcweir 
928cdf0e10cSrcweir     sal_Int16 nNodeType = -1;
929cdf0e10cSrcweir     sal_Int16 nEntries = 0;
930cdf0e10cSrcweir 
931cdf0e10cSrcweir     CustomAnimationListEntry* pEntry = static_cast< CustomAnimationListEntry* >(FirstSelected());
932cdf0e10cSrcweir     while( pEntry )
933cdf0e10cSrcweir     {
934cdf0e10cSrcweir         nEntries++;
935cdf0e10cSrcweir         CustomAnimationEffectPtr pEffect( pEntry->getEffect() );
936cdf0e10cSrcweir         if( pEffect.get() )
937cdf0e10cSrcweir         {
938cdf0e10cSrcweir             if( nNodeType == -1 )
939cdf0e10cSrcweir             {
940cdf0e10cSrcweir                 nNodeType = pEffect->getNodeType();
941cdf0e10cSrcweir             }
942cdf0e10cSrcweir             else
943cdf0e10cSrcweir             {
944cdf0e10cSrcweir                 if( nNodeType != pEffect->getNodeType() )
945cdf0e10cSrcweir                 {
946cdf0e10cSrcweir                     nNodeType = -1;
947cdf0e10cSrcweir                     break;
948cdf0e10cSrcweir                 }
949cdf0e10cSrcweir             }
950cdf0e10cSrcweir         }
951cdf0e10cSrcweir 
952cdf0e10cSrcweir         pEntry = static_cast< CustomAnimationListEntry* >(NextSelected( pEntry ));
953cdf0e10cSrcweir     }
954cdf0e10cSrcweir 
955cdf0e10cSrcweir     pMenu->CheckItem( CM_WITH_CLICK, nNodeType == EffectNodeType::ON_CLICK );
956cdf0e10cSrcweir     pMenu->CheckItem( CM_WITH_PREVIOUS, nNodeType == EffectNodeType::WITH_PREVIOUS );
957cdf0e10cSrcweir     pMenu->CheckItem( CM_AFTER_PREVIOUS, nNodeType == EffectNodeType::AFTER_PREVIOUS );
958cdf0e10cSrcweir     pMenu->EnableItem( CM_OPTIONS, nEntries == 1 );
959cdf0e10cSrcweir     pMenu->EnableItem( CM_DURATION, nEntries == 1 );
960cdf0e10cSrcweir 
961cdf0e10cSrcweir     return pMenu;
962cdf0e10cSrcweir }
963cdf0e10cSrcweir 
964cdf0e10cSrcweir // --------------------------------------------------------------------
965cdf0e10cSrcweir 
ExcecuteContextMenuAction(sal_uInt16 nSelectedPopupEntry)966cdf0e10cSrcweir void CustomAnimationList::ExcecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry )
967cdf0e10cSrcweir {
968cdf0e10cSrcweir     mpController->onContextMenu( nSelectedPopupEntry );
969cdf0e10cSrcweir }
970cdf0e10cSrcweir 
971cdf0e10cSrcweir // --------------------------------------------------------------------
972cdf0e10cSrcweir 
SetTabs()973cdf0e10cSrcweir void CustomAnimationList::SetTabs()
974cdf0e10cSrcweir {
975cdf0e10cSrcweir     SvTreeListBox::SetTabs();
976cdf0e10cSrcweir }
977cdf0e10cSrcweir 
978cdf0e10cSrcweir // --------------------------------------------------------------------
979cdf0e10cSrcweir 
notify_change()980cdf0e10cSrcweir void CustomAnimationList::notify_change()
981cdf0e10cSrcweir {
982cdf0e10cSrcweir     update();
983cdf0e10cSrcweir     mpController->onSelect();
984cdf0e10cSrcweir }
985cdf0e10cSrcweir 
Paint(const Rectangle & rRect)986cdf0e10cSrcweir void CustomAnimationList::Paint( const Rectangle& rRect )
987cdf0e10cSrcweir {
988cdf0e10cSrcweir     if( mbIgnorePaint )
989cdf0e10cSrcweir         return;
990cdf0e10cSrcweir 
991cdf0e10cSrcweir     SvTreeListBox::Paint( rRect );
992cdf0e10cSrcweir 
993cdf0e10cSrcweir     // draw help text if list box is still empty
994cdf0e10cSrcweir     if( First() == 0 )
995cdf0e10cSrcweir     {
996cdf0e10cSrcweir         Color aOldColor( GetTextColor() );
997cdf0e10cSrcweir         SetTextColor( GetSettings().GetStyleSettings().GetDisableColor() );
998cdf0e10cSrcweir         ::Point aOffset( LogicToPixel( Point( 6, 6 ), MAP_APPFONT ) );
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir         Rectangle aRect( Point( 0,0 ), GetOutputSizePixel() );
1001cdf0e10cSrcweir 
1002cdf0e10cSrcweir         aRect.Left() += aOffset.X();
1003cdf0e10cSrcweir         aRect.Top() += aOffset.Y();
1004cdf0e10cSrcweir         aRect.Right() -= aOffset.X();
1005cdf0e10cSrcweir         aRect.Bottom() -= aOffset.Y();
1006cdf0e10cSrcweir 
1007cdf0e10cSrcweir         DrawText( aRect, String( SdResId( STR_CUSTOMANIMATION_LIST_HELPTEXT ) ),
1008cdf0e10cSrcweir             TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK | TEXT_DRAW_CENTER | TEXT_DRAW_VCENTER );
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir         SetTextColor( aOldColor );
1011cdf0e10cSrcweir     }
1012cdf0e10cSrcweir }
1013cdf0e10cSrcweir 
1014cdf0e10cSrcweir }
1015