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