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