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 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_sd.hxx"
24 #include <com/sun/star/lang/DisposedException.hpp>
25 #include <osl/mutex.hxx>
26 #include <vos/mutex.hxx>
27 #include <vcl/svapp.hxx>
28 #include <svx/svdpage.hxx>
29 #include <comphelper/extract.hxx>
30 #include <comphelper/serviceinfohelper.hxx>
31
32 #include "unohelp.hxx"
33 #include "unomodel.hxx"
34 #include "drawdoc.hxx"
35 #include "unocpres.hxx"
36 #include "cusshow.hxx"
37 #include "unopage.hxx"
38
39 using namespace ::rtl;
40 using namespace ::vos;
41 using namespace ::com::sun::star;
42
43
createUnoCustomShow(SdCustomShow * pShow)44 uno::Reference< uno::XInterface > createUnoCustomShow( SdCustomShow* pShow )
45 {
46 return (cppu::OWeakObject*)new SdXCustomPresentation( pShow, NULL );
47 }
48
SdXCustomPresentation()49 SdXCustomPresentation::SdXCustomPresentation() throw()
50 : mpSdCustomShow(NULL), mpModel(NULL),
51 aDisposeListeners( aDisposeContainerMutex ),
52 bDisposing( sal_False )
53 {
54 }
55
SdXCustomPresentation(SdCustomShow * pShow,SdXImpressDocument * pMyModel)56 SdXCustomPresentation::SdXCustomPresentation( SdCustomShow* pShow, SdXImpressDocument* pMyModel) throw()
57 : mpSdCustomShow(pShow), mpModel(pMyModel),
58 aDisposeListeners( aDisposeContainerMutex ),
59 bDisposing( sal_False )
60 {
61 }
62
~SdXCustomPresentation()63 SdXCustomPresentation::~SdXCustomPresentation() throw()
64 {
65 }
66
67 UNO3_GETIMPLEMENTATION_IMPL( SdXCustomPresentation );
68
69 // XServiceInfo
getImplementationName()70 OUString SAL_CALL SdXCustomPresentation::getImplementationName()
71 throw(uno::RuntimeException)
72 {
73 return OUString( RTL_CONSTASCII_USTRINGPARAM("SdXCustomPresentation") );
74 }
75
supportsService(const OUString & ServiceName)76 sal_Bool SAL_CALL SdXCustomPresentation::supportsService( const OUString& ServiceName )
77 throw(uno::RuntimeException)
78 {
79 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
80 }
81
getSupportedServiceNames()82 uno::Sequence< OUString > SAL_CALL SdXCustomPresentation::getSupportedServiceNames()
83 throw(uno::RuntimeException)
84 {
85 OUString aSN( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.CustomPresentation") );
86 uno::Sequence< OUString > aSeq( &aSN, 1 );
87 return aSeq;
88 }
89
90 // XIndexContainer
insertByIndex(sal_Int32 Index,const uno::Any & Element)91 void SAL_CALL SdXCustomPresentation::insertByIndex( sal_Int32 Index, const uno::Any& Element )
92 throw(lang::IllegalArgumentException, lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
93 {
94 OGuard aGuard( Application::GetSolarMutex() );
95
96 if( bDisposing )
97 throw lang::DisposedException();
98
99 if( Index < 0 || Index > (sal_Int32)( mpSdCustomShow ? mpSdCustomShow->Count() : 0 ) )
100 throw lang::IndexOutOfBoundsException();
101
102 uno::Reference< drawing::XDrawPage > xPage;
103 Element >>= xPage;
104
105 if(!xPage.is())
106 throw lang::IllegalArgumentException();
107
108 SdDrawPage* pPage = SdDrawPage::getImplementation( xPage );
109
110 if(pPage)
111 {
112 if( NULL == mpModel )
113 mpModel = pPage->GetModel();
114
115 if( NULL != mpModel && NULL == mpSdCustomShow && mpModel->GetDoc() )
116 mpSdCustomShow = new SdCustomShow( mpModel->GetDoc() );
117
118 mpSdCustomShow->Insert(pPage->GetSdrPage(), Index);
119 }
120
121 if( mpModel )
122 mpModel->SetModified();
123 }
124
removeByIndex(sal_Int32 Index)125 void SAL_CALL SdXCustomPresentation::removeByIndex( sal_Int32 Index )
126 throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
127 {
128 OGuard aGuard( Application::GetSolarMutex() );
129
130 if( bDisposing )
131 throw lang::DisposedException();
132
133 if(mpSdCustomShow)
134 {
135 uno::Reference< drawing::XDrawPage > xPage;
136 getByIndex( Index ) >>= xPage;
137
138 if( xPage.is() )
139 {
140 SvxDrawPage* pPage = SvxDrawPage::getImplementation( xPage );
141 if(pPage)
142 mpSdCustomShow->Remove(pPage->GetSdrPage());
143 }
144 }
145
146 if( mpModel )
147 mpModel->SetModified();
148 }
149
150 // XIndexReplace
replaceByIndex(sal_Int32 Index,const uno::Any & Element)151 void SAL_CALL SdXCustomPresentation::replaceByIndex( sal_Int32 Index, const uno::Any& Element )
152 throw(lang::IllegalArgumentException, lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
153 {
154 removeByIndex( Index );
155 insertByIndex( Index, Element );
156 }
157
158 // XElementAccess
getElementType()159 uno::Type SAL_CALL SdXCustomPresentation::getElementType()
160 throw(uno::RuntimeException)
161 {
162 return ITYPE( drawing::XDrawPage );
163 }
164
hasElements()165 sal_Bool SAL_CALL SdXCustomPresentation::hasElements()
166 throw(uno::RuntimeException)
167 {
168 OGuard aGuard( Application::GetSolarMutex() );
169
170 if( bDisposing )
171 throw lang::DisposedException();
172
173 return getCount() > 0;
174 }
175
176 // XIndexAccess
getCount()177 sal_Int32 SAL_CALL SdXCustomPresentation::getCount()
178 throw(uno::RuntimeException)
179 {
180 OGuard aGuard( Application::GetSolarMutex() );
181 if( bDisposing )
182 throw lang::DisposedException();
183
184 return mpSdCustomShow?mpSdCustomShow->Count():0;
185 }
186
getByIndex(sal_Int32 Index)187 uno::Any SAL_CALL SdXCustomPresentation::getByIndex( sal_Int32 Index )
188 throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
189 {
190 OGuard aGuard( Application::GetSolarMutex() );
191
192 if( bDisposing )
193 throw lang::DisposedException();
194
195 if( Index < 0 || Index >= (sal_Int32)mpSdCustomShow->Count() )
196 throw lang::IndexOutOfBoundsException();
197
198 uno::Any aAny;
199 if(mpSdCustomShow )
200 {
201 SdrPage* pPage = (SdrPage*)mpSdCustomShow->GetObject(Index);
202
203 if( pPage )
204 {
205 uno::Reference< drawing::XDrawPage > xRef( pPage->getUnoPage(), uno::UNO_QUERY );
206 aAny <<= xRef;
207 }
208 }
209
210 return aAny;
211 }
212
213 // XNamed
getName()214 OUString SAL_CALL SdXCustomPresentation::getName()
215 throw(uno::RuntimeException)
216 {
217 OGuard aGuard( Application::GetSolarMutex() );
218
219 if( bDisposing )
220 throw lang::DisposedException();
221
222 if(mpSdCustomShow)
223 return mpSdCustomShow->GetName();
224
225 return OUString();
226 }
227
setName(const OUString & aName)228 void SAL_CALL SdXCustomPresentation::setName( const OUString& aName )
229 throw(uno::RuntimeException)
230 {
231 OGuard aGuard( Application::GetSolarMutex() );
232
233 if( bDisposing )
234 throw lang::DisposedException();
235
236 if(mpSdCustomShow)
237 mpSdCustomShow->SetName( aName );
238 }
239
240 // XComponent
dispose()241 void SAL_CALL SdXCustomPresentation::dispose() throw(uno::RuntimeException)
242 {
243 OGuard aGuard( Application::GetSolarMutex() );
244
245 if( bDisposing )
246 return; // caught a recursion
247
248 bDisposing = sal_True;
249
250 uno::Reference< uno::XInterface > xSource( (cppu::OWeakObject*)this );
251
252 lang::EventObject aEvt;
253 aEvt.Source = xSource;
254 aDisposeListeners.disposeAndClear(aEvt);
255
256 mpSdCustomShow = NULL;
257 }
258
259 //----------------------------------------------------------------------
addEventListener(const uno::Reference<lang::XEventListener> & xListener)260 void SAL_CALL SdXCustomPresentation::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
261 throw(uno::RuntimeException)
262 {
263 if( bDisposing )
264 throw lang::DisposedException();
265
266 aDisposeListeners.addInterface(xListener);
267 }
268
269 //----------------------------------------------------------------------
removeEventListener(const uno::Reference<lang::XEventListener> & aListener)270 void SAL_CALL SdXCustomPresentation::removeEventListener( const uno::Reference< lang::XEventListener >& aListener ) throw(uno::RuntimeException)
271 {
272 if( !bDisposing )
273 aDisposeListeners.removeInterface(aListener);
274 }
275
276 /*===========================================================================*
277 * class SdXCustomPresentationAccess : public XCustomPresentationAccess, *
278 * public UsrObject *
279 *===========================================================================*/
280
SdXCustomPresentationAccess(SdXImpressDocument & rMyModel)281 SdXCustomPresentationAccess::SdXCustomPresentationAccess(SdXImpressDocument& rMyModel) throw()
282 : mrModel(rMyModel)
283 {
284 }
285
~SdXCustomPresentationAccess()286 SdXCustomPresentationAccess::~SdXCustomPresentationAccess() throw()
287 {
288 }
289
290 // XServiceInfo
getImplementationName()291 OUString SAL_CALL SdXCustomPresentationAccess::getImplementationName()
292 throw(uno::RuntimeException)
293 {
294 return OUString( RTL_CONSTASCII_USTRINGPARAM("SdXCustomPresentationAccess") );
295 }
296
supportsService(const OUString & ServiceName)297 sal_Bool SAL_CALL SdXCustomPresentationAccess::supportsService( const OUString& ServiceName )
298 throw(uno::RuntimeException)
299 {
300 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
301 }
302
getSupportedServiceNames()303 uno::Sequence< OUString > SAL_CALL SdXCustomPresentationAccess::getSupportedServiceNames()
304 throw(uno::RuntimeException)
305 {
306 const OUString aNS( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.CustomPresentationAccess") );
307 uno::Sequence< OUString > aSeq( &aNS, 1 );
308 return aSeq;
309 }
310
311 // XSingleServiceFactory
createInstance()312 uno::Reference< uno::XInterface > SAL_CALL SdXCustomPresentationAccess::createInstance()
313 throw(uno::Exception, uno::RuntimeException)
314 {
315 uno::Reference< uno::XInterface > xRef( (::cppu::OWeakObject*)new SdXCustomPresentation() );
316 return xRef;
317 }
318
createInstanceWithArguments(const uno::Sequence<uno::Any> &)319 uno::Reference< uno::XInterface > SAL_CALL SdXCustomPresentationAccess::createInstanceWithArguments( const uno::Sequence< uno::Any >& )
320 throw(uno::Exception, uno::RuntimeException)
321 {
322 return createInstance();
323 }
324
325 // XNameContainer
insertByName(const OUString & aName,const uno::Any & aElement)326 void SAL_CALL SdXCustomPresentationAccess::insertByName( const OUString& aName, const uno::Any& aElement )
327 throw(lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException)
328 {
329 OGuard aGuard( Application::GetSolarMutex() );
330
331 // get the documents custom show list
332 List* pList = 0;
333 if(mrModel.GetDoc())
334 pList = mrModel.GetDoc()->GetCustomShowList(sal_True);
335
336 // no list, no cookies
337 if( NULL == pList)
338 throw uno::RuntimeException();
339
340 // do we have an container::XIndexContainer?
341 SdXCustomPresentation* pXShow = NULL;
342
343 uno::Reference< container::XIndexContainer > xContainer;
344 if( (aElement >>= xContainer) && xContainer.is() )
345 pXShow = SdXCustomPresentation::getImplementation(xContainer);
346
347 if( NULL == pXShow )
348 throw lang::IllegalArgumentException();
349
350 // get the internal custom show from the api wrapper
351 SdCustomShow* pShow = pXShow->GetSdCustomShow();
352 if( NULL == pShow )
353 {
354 pShow = new SdCustomShow( mrModel.GetDoc(), xContainer );
355 pXShow->SetSdCustomShow( pShow );
356 }
357 else
358 {
359 if( NULL == pXShow->GetModel() || *pXShow->GetModel() != mrModel )
360 throw lang::IllegalArgumentException();
361 }
362
363 // give it a name
364 pShow->SetName( aName);
365
366 // check if this or another customshow with the same name already exists
367 for( SdCustomShow* pCompare = (SdCustomShow*)pList->First();
368 pCompare;
369 pCompare = (SdCustomShow*)pList->Next() )
370 {
371 if( pCompare == pShow || pCompare->GetName() == pShow->GetName() )
372 throw container::ElementExistException();
373 }
374
375 pList->Insert(pShow);
376
377 mrModel.SetModified();
378 }
379
removeByName(const OUString & Name)380 void SAL_CALL SdXCustomPresentationAccess::removeByName( const OUString& Name )
381 throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
382 {
383 OGuard aGuard( Application::GetSolarMutex() );
384
385 SdCustomShow* pShow = getSdCustomShow(Name);
386
387 List* pList = GetCustomShowList();
388 if(pList && pShow)
389 delete (SdCustomShow*)pList->Remove( pShow );
390 else
391 throw container::NoSuchElementException();
392
393 mrModel.SetModified();
394 }
395
396 // XNameReplace
replaceByName(const OUString & aName,const uno::Any & aElement)397 void SAL_CALL SdXCustomPresentationAccess::replaceByName( const OUString& aName, const uno::Any& aElement )
398 throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
399 {
400 removeByName( aName );
401 insertByName( aName, aElement );
402 }
403
404 // XNameAccess
getByName(const OUString & aName)405 uno::Any SAL_CALL SdXCustomPresentationAccess::getByName( const OUString& aName )
406 throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
407 {
408 OGuard aGuard( Application::GetSolarMutex() );
409
410 uno::Any aAny;
411
412 SdCustomShow* pShow = getSdCustomShow(aName);
413 if(pShow)
414 {
415 uno::Reference< container::XIndexContainer > xRef( pShow->getUnoCustomShow(), uno::UNO_QUERY );
416 aAny <<= xRef;
417 }
418 else
419 {
420 throw container::NoSuchElementException();
421 }
422
423 return aAny;
424 }
425
getElementNames()426 uno::Sequence< OUString > SAL_CALL SdXCustomPresentationAccess::getElementNames()
427 throw(uno::RuntimeException)
428 {
429 OGuard aGuard( Application::GetSolarMutex() );
430
431 List* pList = GetCustomShowList();
432 const sal_uInt32 nCount = pList?pList->Count():0;
433
434 uno::Sequence< OUString > aSequence( nCount );
435 OUString* pStringList = aSequence.getArray();
436
437 sal_uInt32 nIdx = 0;
438 while( nIdx < nCount )
439 {
440 const SdCustomShow* pShow = (const SdCustomShow*)pList->GetObject(nIdx);
441 pStringList[nIdx] = pShow->GetName();
442 nIdx++;
443 }
444
445 return aSequence;
446 }
447
448
hasByName(const OUString & aName)449 sal_Bool SAL_CALL SdXCustomPresentationAccess::hasByName( const OUString& aName )
450 throw(uno::RuntimeException)
451 {
452 OGuard aGuard( Application::GetSolarMutex() );
453 return getSdCustomShow(aName) != NULL;
454 }
455
456 // XElementAccess
getElementType()457 uno::Type SAL_CALL SdXCustomPresentationAccess::getElementType()
458 throw(uno::RuntimeException)
459 {
460 return ITYPE( container::XIndexContainer );
461 }
462
hasElements()463 sal_Bool SAL_CALL SdXCustomPresentationAccess::hasElements()
464 throw(uno::RuntimeException)
465 {
466 OGuard aGuard( Application::GetSolarMutex() );
467
468 List* pList = GetCustomShowList();
469 return pList && pList->Count() > 0;
470 }
471
getSdCustomShow(const OUString & Name) const472 SdCustomShow * SdXCustomPresentationAccess::getSdCustomShow( const OUString& Name ) const throw()
473 {
474 sal_uInt32 nIdx = 0;
475
476 List* pList = GetCustomShowList();
477 const sal_uInt32 nCount = pList?pList->Count():0;
478
479 const String aName( Name );
480
481 while( nIdx < nCount )
482 {
483 SdCustomShow* pShow = (SdCustomShow*)pList->GetObject(nIdx);
484 if( pShow->GetName() == aName )
485 return pShow;
486 nIdx++;
487 }
488 return NULL;
489 }
490
491 /* vim: set noet sw=4 ts=4: */
492