xref: /trunk/main/sd/source/core/undoanim.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*5b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5b190011SAndrew Rist  * distributed with this work for additional information
6*5b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5b190011SAndrew Rist  * "License"); you may not use this file except in compliance
9*5b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*5b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*5b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5b190011SAndrew Rist  * software distributed under the License is distributed on an
15*5b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
17*5b190011SAndrew Rist  * specific language governing permissions and limitations
18*5b190011SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*5b190011SAndrew Rist  *************************************************************/
21*5b190011SAndrew Rist 
22*5b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir #include <com/sun/star/util/XCloneable.hpp>
27cdf0e10cSrcweir #include <com/sun/star/animations/XAnimationNode.hpp>
28cdf0e10cSrcweir #include "CustomAnimationCloner.hxx"
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include "undoanim.hxx"
31cdf0e10cSrcweir #include "glob.hrc"
32cdf0e10cSrcweir #include "sdpage.hxx"
33cdf0e10cSrcweir #include "sdresid.hxx"
34cdf0e10cSrcweir #include "CustomAnimationEffect.hxx"
35cdf0e10cSrcweir #include "drawdoc.hxx"
36cdf0e10cSrcweir 
37cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
38cdf0e10cSrcweir using ::com::sun::star::uno::Exception;
39cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW;
40cdf0e10cSrcweir using ::com::sun::star::util::XCloneable;
41cdf0e10cSrcweir using namespace ::com::sun::star::animations;
42cdf0e10cSrcweir 
43cdf0e10cSrcweir 
44cdf0e10cSrcweir namespace sd
45cdf0e10cSrcweir {
46cdf0e10cSrcweir 
47cdf0e10cSrcweir struct UndoAnimationImpl
48cdf0e10cSrcweir {
49cdf0e10cSrcweir     SdPage*         mpPage;
50cdf0e10cSrcweir     Reference< XAnimationNode > mxOldNode;
51cdf0e10cSrcweir     Reference< XAnimationNode > mxNewNode;
52cdf0e10cSrcweir     bool            mbNewNodeSet;
53cdf0e10cSrcweir };
54cdf0e10cSrcweir 
UndoAnimation(SdDrawDocument * pDoc,SdPage * pThePage)55cdf0e10cSrcweir UndoAnimation::UndoAnimation( SdDrawDocument* pDoc, SdPage* pThePage )
56cdf0e10cSrcweir : SdrUndoAction( *pDoc ), mpImpl( new UndoAnimationImpl )
57cdf0e10cSrcweir {
58cdf0e10cSrcweir     mpImpl->mpPage = pThePage;
59cdf0e10cSrcweir     mpImpl->mbNewNodeSet = false;
60cdf0e10cSrcweir 
61cdf0e10cSrcweir     try
62cdf0e10cSrcweir     {
63cdf0e10cSrcweir         if( pThePage->mxAnimationNode.is() )
64cdf0e10cSrcweir             mpImpl->mxOldNode = ::sd::Clone( pThePage->getAnimationNode() );
65cdf0e10cSrcweir     }
66cdf0e10cSrcweir     catch( Exception& e )
67cdf0e10cSrcweir     {
68cdf0e10cSrcweir         (void)e;
69cdf0e10cSrcweir         DBG_ERROR("sd::UndoAnimation::UndoAnimation(), exception caught!");
70cdf0e10cSrcweir     }
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
~UndoAnimation()73cdf0e10cSrcweir UndoAnimation::~UndoAnimation()
74cdf0e10cSrcweir {
75cdf0e10cSrcweir     delete mpImpl;
76cdf0e10cSrcweir }
77cdf0e10cSrcweir 
Undo()78cdf0e10cSrcweir void UndoAnimation::Undo()
79cdf0e10cSrcweir {
80cdf0e10cSrcweir     try
81cdf0e10cSrcweir     {
82cdf0e10cSrcweir         if( !mpImpl->mbNewNodeSet )
83cdf0e10cSrcweir         {
84cdf0e10cSrcweir             if( mpImpl->mpPage->mxAnimationNode.is() )
85cdf0e10cSrcweir                 mpImpl->mxNewNode.set( ::sd::Clone( mpImpl->mpPage->mxAnimationNode ) );
86cdf0e10cSrcweir             mpImpl->mbNewNodeSet = true;
87cdf0e10cSrcweir         }
88cdf0e10cSrcweir 
89cdf0e10cSrcweir         Reference< XAnimationNode > xOldNode;
90cdf0e10cSrcweir         if( mpImpl->mxOldNode.is() )
91cdf0e10cSrcweir             xOldNode = ::sd::Clone( mpImpl->mxOldNode );
92cdf0e10cSrcweir 
93cdf0e10cSrcweir         mpImpl->mpPage->setAnimationNode( xOldNode );
94cdf0e10cSrcweir     }
95cdf0e10cSrcweir     catch( Exception& e )
96cdf0e10cSrcweir     {
97cdf0e10cSrcweir         (void)e;
98cdf0e10cSrcweir         DBG_ERROR("sd::UndoAnimation::Undo(), exception caught!");
99cdf0e10cSrcweir     }
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
Redo()102cdf0e10cSrcweir void UndoAnimation::Redo()
103cdf0e10cSrcweir {
104cdf0e10cSrcweir     try
105cdf0e10cSrcweir     {
106cdf0e10cSrcweir         Reference< XAnimationNode > xNewNode;
107cdf0e10cSrcweir         if( mpImpl->mxNewNode.is() )
108cdf0e10cSrcweir             xNewNode = ::sd::Clone( mpImpl->mxNewNode );
109cdf0e10cSrcweir         mpImpl->mpPage->setAnimationNode( xNewNode );
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir     catch( Exception& e )
112cdf0e10cSrcweir     {
113cdf0e10cSrcweir         (void)e;
114cdf0e10cSrcweir         DBG_ERROR("sd::UndoAnimation::Redo(), exception caught!");
115cdf0e10cSrcweir     }
116cdf0e10cSrcweir }
117cdf0e10cSrcweir 
GetComment() const118cdf0e10cSrcweir String UndoAnimation::GetComment() const
119cdf0e10cSrcweir {
120cdf0e10cSrcweir     return String(SdResId(STR_UNDO_ANIMATION));
121cdf0e10cSrcweir }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir struct UndoAnimationPathImpl
124cdf0e10cSrcweir {
125cdf0e10cSrcweir     SdPage*         mpPage;
126cdf0e10cSrcweir     sal_Int32       mnEffectOffset;
127cdf0e10cSrcweir     ::rtl::OUString msUndoPath;
128cdf0e10cSrcweir     ::rtl::OUString msRedoPath;
129cdf0e10cSrcweir 
UndoAnimationPathImplsd::UndoAnimationPathImpl130cdf0e10cSrcweir     UndoAnimationPathImpl( SdPage* pThePage, const com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode )
131cdf0e10cSrcweir         : mpPage( pThePage )
132cdf0e10cSrcweir         , mnEffectOffset( -1 )
133cdf0e10cSrcweir     {
134cdf0e10cSrcweir         if( mpPage && xNode.is() )
135cdf0e10cSrcweir         {
136cdf0e10cSrcweir             boost::shared_ptr< sd::MainSequence > pMainSequence( mpPage->getMainSequence() );
137cdf0e10cSrcweir             if( pMainSequence.get() )
138cdf0e10cSrcweir             {
139cdf0e10cSrcweir                 CustomAnimationEffectPtr pEffect( pMainSequence->findEffect( xNode ) );
140cdf0e10cSrcweir                 if( pEffect.get() )
141cdf0e10cSrcweir                 {
142cdf0e10cSrcweir                     mnEffectOffset = pMainSequence->getOffsetFromEffect( pEffect );
143cdf0e10cSrcweir                     msUndoPath = pEffect->getPath();
144cdf0e10cSrcweir                 }
145cdf0e10cSrcweir             }
146cdf0e10cSrcweir         }
147cdf0e10cSrcweir     }
148cdf0e10cSrcweir 
getEffectsd::UndoAnimationPathImpl149cdf0e10cSrcweir     CustomAnimationEffectPtr getEffect() const
150cdf0e10cSrcweir     {
151cdf0e10cSrcweir         CustomAnimationEffectPtr pEffect;
152cdf0e10cSrcweir         if( mpPage && (mnEffectOffset >= 0) )
153cdf0e10cSrcweir         {
154cdf0e10cSrcweir             boost::shared_ptr< sd::MainSequence > pMainSequence( mpPage->getMainSequence() );
155cdf0e10cSrcweir             if( pMainSequence.get() )
156cdf0e10cSrcweir                 pEffect = pMainSequence->getEffectFromOffset( mnEffectOffset );
157cdf0e10cSrcweir         }
158cdf0e10cSrcweir         return pEffect;
159cdf0e10cSrcweir     }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     private:
162cdf0e10cSrcweir         UndoAnimationPathImpl( const UndoAnimationPathImpl& ); //not implemented
163cdf0e10cSrcweir         const UndoAnimationPathImpl& operator=( const UndoAnimationPathImpl& ); // not implemented
164cdf0e10cSrcweir 
165cdf0e10cSrcweir };
166cdf0e10cSrcweir 
UndoAnimationPath(SdDrawDocument * pDoc,SdPage * pThePage,const com::sun::star::uno::Reference<::com::sun::star::animations::XAnimationNode> & xNode)167cdf0e10cSrcweir UndoAnimationPath::UndoAnimationPath( SdDrawDocument* pDoc, SdPage* pThePage, const com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode )
168cdf0e10cSrcweir : SdrUndoAction( *pDoc )
169cdf0e10cSrcweir , mpImpl( new UndoAnimationPathImpl( pThePage, xNode ) )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir }
172cdf0e10cSrcweir 
~UndoAnimationPath()173cdf0e10cSrcweir UndoAnimationPath::~UndoAnimationPath()
174cdf0e10cSrcweir {
175cdf0e10cSrcweir }
176cdf0e10cSrcweir 
Undo()177cdf0e10cSrcweir void UndoAnimationPath::Undo()
178cdf0e10cSrcweir {
179cdf0e10cSrcweir     CustomAnimationEffectPtr pEffect = mpImpl->getEffect();
180cdf0e10cSrcweir     if( pEffect.get() )
181cdf0e10cSrcweir     {
182cdf0e10cSrcweir         mpImpl->msRedoPath = pEffect->getPath();
183cdf0e10cSrcweir         pEffect->setPath( mpImpl->msUndoPath );
184cdf0e10cSrcweir     }
185cdf0e10cSrcweir }
186cdf0e10cSrcweir 
Redo()187cdf0e10cSrcweir void UndoAnimationPath::Redo()
188cdf0e10cSrcweir {
189cdf0e10cSrcweir     CustomAnimationEffectPtr pEffect = mpImpl->getEffect();
190cdf0e10cSrcweir     if( pEffect.get() )
191cdf0e10cSrcweir     {
192cdf0e10cSrcweir         pEffect->setPath( mpImpl->msRedoPath );
193cdf0e10cSrcweir     }
194cdf0e10cSrcweir }
195cdf0e10cSrcweir 
GetComment() const196cdf0e10cSrcweir String UndoAnimationPath::GetComment() const
197cdf0e10cSrcweir {
198cdf0e10cSrcweir     return String(SdResId(STR_UNDO_ANIMATION));
199cdf0e10cSrcweir }
200cdf0e10cSrcweir 
201cdf0e10cSrcweir struct UndoTransitionImpl
202cdf0e10cSrcweir {
203cdf0e10cSrcweir     SdPage*         mpPage;
204cdf0e10cSrcweir 
205cdf0e10cSrcweir     sal_Int16 mnNewTransitionType;
206cdf0e10cSrcweir     sal_Int16 mnNewTransitionSubtype;
207cdf0e10cSrcweir     sal_Bool mbNewTransitionDirection;
208cdf0e10cSrcweir     sal_Int32 mnNewTransitionFadeColor;
209cdf0e10cSrcweir     double mfNewTransitionDuration;
210cdf0e10cSrcweir     String maNewSoundFile;
211cdf0e10cSrcweir     bool mbNewSoundOn;
212cdf0e10cSrcweir     bool mbNewLoopSound;
213cdf0e10cSrcweir     bool mbNewStopSound;
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     sal_Int16 mnOldTransitionType;
216cdf0e10cSrcweir     sal_Int16 mnOldTransitionSubtype;
217cdf0e10cSrcweir     sal_Bool mbOldTransitionDirection;
218cdf0e10cSrcweir     sal_Int32 mnOldTransitionFadeColor;
219cdf0e10cSrcweir     double mfOldTransitionDuration;
220cdf0e10cSrcweir     String maOldSoundFile;
221cdf0e10cSrcweir     bool mbOldSoundOn;
222cdf0e10cSrcweir     bool mbOldLoopSound;
223cdf0e10cSrcweir     bool mbOldStopSound;
224cdf0e10cSrcweir };
225cdf0e10cSrcweir 
UndoTransition(SdDrawDocument * _pDoc,SdPage * pThePage)226cdf0e10cSrcweir UndoTransition::UndoTransition( SdDrawDocument* _pDoc, SdPage* pThePage )
227cdf0e10cSrcweir : SdUndoAction( _pDoc ), mpImpl( new UndoTransitionImpl )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir     mpImpl->mpPage = pThePage;
230cdf0e10cSrcweir 
231cdf0e10cSrcweir     mpImpl->mnNewTransitionType = -1;
232cdf0e10cSrcweir     mpImpl->mnOldTransitionType = pThePage->mnTransitionType;
233cdf0e10cSrcweir     mpImpl->mnOldTransitionSubtype = pThePage->mnTransitionSubtype;
234cdf0e10cSrcweir     mpImpl->mbOldTransitionDirection = pThePage->mbTransitionDirection;
235cdf0e10cSrcweir     mpImpl->mnOldTransitionFadeColor = pThePage->mnTransitionFadeColor;
236cdf0e10cSrcweir     mpImpl->mfOldTransitionDuration = pThePage->mfTransitionDuration;
237cdf0e10cSrcweir     mpImpl->maOldSoundFile = pThePage->maSoundFile;
238cdf0e10cSrcweir     mpImpl->mbOldSoundOn = pThePage->mbSoundOn;
239cdf0e10cSrcweir     mpImpl->mbOldLoopSound = pThePage->mbLoopSound;
240cdf0e10cSrcweir     mpImpl->mbOldStopSound = pThePage->mbStopSound;
241cdf0e10cSrcweir }
242cdf0e10cSrcweir 
~UndoTransition()243cdf0e10cSrcweir UndoTransition::~UndoTransition()
244cdf0e10cSrcweir {
245cdf0e10cSrcweir     delete mpImpl;
246cdf0e10cSrcweir }
247cdf0e10cSrcweir 
Undo()248cdf0e10cSrcweir void UndoTransition::Undo()
249cdf0e10cSrcweir {
250cdf0e10cSrcweir     if( mpImpl->mnNewTransitionType == -1 )
251cdf0e10cSrcweir     {
252cdf0e10cSrcweir         mpImpl->mnNewTransitionType = mpImpl->mpPage->mnTransitionType;
253cdf0e10cSrcweir         mpImpl->mnNewTransitionSubtype = mpImpl->mpPage->mnTransitionSubtype;
254cdf0e10cSrcweir         mpImpl->mbNewTransitionDirection = mpImpl->mpPage->mbTransitionDirection;
255cdf0e10cSrcweir         mpImpl->mnNewTransitionFadeColor = mpImpl->mpPage->mnTransitionFadeColor;
256cdf0e10cSrcweir         mpImpl->mfNewTransitionDuration = mpImpl->mpPage->mfTransitionDuration;
257cdf0e10cSrcweir         mpImpl->maNewSoundFile = mpImpl->mpPage->maSoundFile;
258cdf0e10cSrcweir         mpImpl->mbNewSoundOn = mpImpl->mpPage->mbSoundOn;
259cdf0e10cSrcweir         mpImpl->mbNewLoopSound = mpImpl->mpPage->mbLoopSound;
260cdf0e10cSrcweir         mpImpl->mbNewStopSound = mpImpl->mpPage->mbStopSound;
261cdf0e10cSrcweir     }
262cdf0e10cSrcweir 
263cdf0e10cSrcweir     mpImpl->mpPage->mnTransitionType = mpImpl->mnOldTransitionType;
264cdf0e10cSrcweir     mpImpl->mpPage->mnTransitionSubtype = mpImpl->mnOldTransitionSubtype;
265cdf0e10cSrcweir     mpImpl->mpPage->mbTransitionDirection = mpImpl->mbOldTransitionDirection;
266cdf0e10cSrcweir     mpImpl->mpPage->mnTransitionFadeColor = mpImpl->mnOldTransitionFadeColor;
267cdf0e10cSrcweir     mpImpl->mpPage->mfTransitionDuration = mpImpl->mfOldTransitionDuration;
268cdf0e10cSrcweir     mpImpl->mpPage->maSoundFile = mpImpl->maOldSoundFile;
269cdf0e10cSrcweir     mpImpl->mpPage->mbSoundOn = mpImpl->mbOldSoundOn;
270cdf0e10cSrcweir     mpImpl->mpPage->mbLoopSound = mpImpl->mbOldLoopSound;
271cdf0e10cSrcweir     mpImpl->mpPage->mbStopSound = mpImpl->mbOldStopSound;
272cdf0e10cSrcweir }
273cdf0e10cSrcweir 
Redo()274cdf0e10cSrcweir void UndoTransition::Redo()
275cdf0e10cSrcweir {
276cdf0e10cSrcweir     mpImpl->mpPage->mnTransitionType = mpImpl->mnNewTransitionType;
277cdf0e10cSrcweir     mpImpl->mpPage->mnTransitionSubtype = mpImpl->mnNewTransitionSubtype;
278cdf0e10cSrcweir     mpImpl->mpPage->mbTransitionDirection = mpImpl->mbNewTransitionDirection;
279cdf0e10cSrcweir     mpImpl->mpPage->mnTransitionFadeColor = mpImpl->mnNewTransitionFadeColor;
280cdf0e10cSrcweir     mpImpl->mpPage->mfTransitionDuration = mpImpl->mfNewTransitionDuration;
281cdf0e10cSrcweir     mpImpl->mpPage->maSoundFile = mpImpl->maNewSoundFile;
282cdf0e10cSrcweir     mpImpl->mpPage->mbSoundOn = mpImpl->mbNewSoundOn;
283cdf0e10cSrcweir     mpImpl->mpPage->mbLoopSound = mpImpl->mbNewLoopSound;
284cdf0e10cSrcweir     mpImpl->mpPage->mbStopSound = mpImpl->mbNewStopSound;
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
GetComment() const287cdf0e10cSrcweir String UndoTransition::GetComment() const
288cdf0e10cSrcweir {
289cdf0e10cSrcweir     return String(SdResId(STR_UNDO_SLIDE_PARAMS));
290cdf0e10cSrcweir }
291cdf0e10cSrcweir 
292cdf0e10cSrcweir }
293