xref: /trunk/main/svx/source/unogallery/unogaltheme.cxx (revision a5b190bfa3e1bed4623e2958a8877664a3b5506c)
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_svx.hxx"
30 
31 #include <algorithm>
32 
33 #include "unogaltheme.hxx"
34 #include "unogalitem.hxx"
35 #include "svx/galtheme.hxx"
36 #include "svx/gallery1.hxx"
37 #include "svx/galmisc.hxx"
38 #include <svx/fmmodel.hxx>
39 #include <svx/svdpage.hxx>
40 #include <svx/unopage.hxx>
41 #include <svl/itempool.hxx>
42 #include <rtl/uuid.h>
43 #include <vos/mutex.hxx>
44 #ifndef _SV_SVAPP_HXX_
45 #include <vcl/svapp.hxx>
46 #endif
47 #include <unotools/pathoptions.hxx>
48 
49 using namespace ::com::sun::star;
50 
51 namespace unogallery {
52 
53 // -----------------
54 // - GalleryTheme -
55 // -----------------
56 
57 GalleryTheme::GalleryTheme( const ::rtl::OUString& rThemeName )
58 {
59     mpGallery = ::Gallery::GetGalleryInstance();
60     mpTheme = ( mpGallery ? mpGallery->AcquireTheme( rThemeName, *this ) : NULL );
61 
62     if( mpGallery )
63         StartListening( *mpGallery );
64 }
65 
66 // ------------------------------------------------------------------------------
67 
68 GalleryTheme::~GalleryTheme()
69 {
70     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
71 
72     DBG_ASSERT( !mpTheme || mpGallery, "Theme is living without Gallery" );
73 
74     implReleaseItems( NULL );
75 
76     if( mpGallery )
77     {
78         EndListening( *mpGallery );
79 
80         if( mpTheme )
81             mpGallery->ReleaseTheme( mpTheme, *this );
82     }
83 }
84 
85 // ------------------------------------------------------------------------------
86 
87 ::rtl::OUString GalleryTheme::getImplementationName_Static()
88     throw()
89 {
90     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.gallery.GalleryTheme" ) );
91 }
92 
93 // ------------------------------------------------------------------------------
94 
95 uno::Sequence< ::rtl::OUString > GalleryTheme::getSupportedServiceNames_Static()
96     throw()
97 {
98     uno::Sequence< ::rtl::OUString > aSeq( 1 );
99 
100     aSeq.getArray()[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.gallery.GalleryTheme" ) );
101 
102     return aSeq;
103 }
104 
105 // ------------------------------------------------------------------------------
106 
107 ::rtl::OUString SAL_CALL GalleryTheme::getImplementationName()
108     throw( uno::RuntimeException )
109 {
110     return getImplementationName_Static();
111 }
112 
113 // ------------------------------------------------------------------------------
114 
115 sal_Bool SAL_CALL GalleryTheme::supportsService( const ::rtl::OUString& ServiceName )
116     throw( uno::RuntimeException )
117 {
118     uno::Sequence< ::rtl::OUString >    aSNL( getSupportedServiceNames() );
119     const ::rtl::OUString*              pArray = aSNL.getConstArray();
120 
121     for( int i = 0; i < aSNL.getLength(); i++ )
122         if( pArray[i] == ServiceName )
123             return true;
124 
125     return false;
126 }
127 
128 // ------------------------------------------------------------------------------
129 
130 uno::Sequence< ::rtl::OUString > SAL_CALL GalleryTheme::getSupportedServiceNames()
131     throw( uno::RuntimeException )
132 {
133     return getSupportedServiceNames_Static();
134 }
135 
136 // ------------------------------------------------------------------------------
137 
138 uno::Sequence< uno::Type > SAL_CALL GalleryTheme::getTypes()
139     throw(uno::RuntimeException)
140 {
141     uno::Sequence< uno::Type >  aTypes( 5 );
142     uno::Type*                  pTypes = aTypes.getArray();
143 
144     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo>*)0);
145     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider>*)0);
146     *pTypes++ = ::getCppuType((const uno::Reference< container::XElementAccess>*)0);
147     *pTypes++ = ::getCppuType((const uno::Reference< container::XIndexAccess>*)0);
148     *pTypes++ = ::getCppuType((const uno::Reference< gallery::XGalleryTheme>*)0);
149 
150     return aTypes;
151 }
152 
153 // ------------------------------------------------------------------------------
154 
155 uno::Sequence< sal_Int8 > SAL_CALL GalleryTheme::getImplementationId()
156     throw(uno::RuntimeException)
157 {
158     const vos::OGuard                   aGuard( Application::GetSolarMutex() );
159     static uno::Sequence< sal_Int8 >    aId;
160 
161     if( aId.getLength() == 0 )
162     {
163         aId.realloc( 16 );
164         rtl_createUuid( reinterpret_cast< sal_uInt8* >( aId.getArray() ), 0, sal_True );
165     }
166 
167     return aId;
168 }
169 
170 // ------------------------------------------------------------------------------
171 
172 uno::Type SAL_CALL GalleryTheme::getElementType()
173     throw (uno::RuntimeException)
174 {
175     return ::getCppuType( (const uno::Reference< gallery::XGalleryItem >*) 0);
176 }
177 
178 // ------------------------------------------------------------------------------
179 
180 sal_Bool SAL_CALL GalleryTheme::hasElements()
181     throw (uno::RuntimeException)
182 {
183     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
184 
185     return( ( mpTheme != NULL ) && ( mpTheme->GetObjectCount() > 0 ) );
186 }
187 
188 // ------------------------------------------------------------------------------
189 
190 sal_Int32 SAL_CALL GalleryTheme::getCount()
191     throw (uno::RuntimeException)
192 {
193     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
194 
195     return( mpTheme ? mpTheme->GetObjectCount() : 0 );
196 }
197 
198 // ------------------------------------------------------------------------------
199 
200 uno::Any SAL_CALL GalleryTheme::getByIndex( ::sal_Int32 nIndex )
201     throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
202 {
203     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
204     uno::Any            aRet;
205 
206     if( mpTheme )
207     {
208         if( ( nIndex < 0 ) || ( nIndex >= getCount() ) )
209         {
210             throw lang::IndexOutOfBoundsException();
211         }
212         else
213         {
214             const GalleryObject* pObj = mpTheme->ImplGetGalleryObject( nIndex );
215 
216             if( pObj )
217                 aRet = uno::makeAny( uno::Reference< gallery::XGalleryItem >( new GalleryItem( *this, *pObj ) ) );
218         }
219     }
220 
221     return aRet;
222 }
223 
224 // ------------------------------------------------------------------------------
225 
226 ::rtl::OUString SAL_CALL GalleryTheme::getName(  )
227     throw (uno::RuntimeException)
228 {
229     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
230     ::rtl::OUString     aRet;
231 
232     if( mpTheme )
233         aRet = mpTheme->GetName();
234 
235     return aRet;
236 }
237 
238 // ------------------------------------------------------------------------------
239 
240 void SAL_CALL GalleryTheme::update(  )
241     throw (uno::RuntimeException)
242 {
243     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
244 
245     if( mpTheme )
246     {
247         const Link aDummyLink;
248         mpTheme->Actualize( aDummyLink );
249     }
250 }
251 
252 // ------------------------------------------------------------------------------
253 
254 ::sal_Int32 SAL_CALL GalleryTheme::insertURLByIndex(
255     const ::rtl::OUString& rURL, ::sal_Int32 nIndex )
256     throw (lang::WrappedTargetException, uno::RuntimeException)
257 {
258     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
259     sal_Int32           nRet = -1;
260 
261     if( mpTheme )
262     {
263         try
264         {
265             const INetURLObject aURL( rURL );
266 
267             nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) );
268 
269             if( ( aURL.GetProtocol() != INET_PROT_NOT_VALID ) && mpTheme->InsertURL( aURL, nIndex ) )
270             {
271                 const GalleryObject* pObj = mpTheme->ImplGetGalleryObject( aURL );
272 
273                 if( pObj )
274                     nRet = mpTheme->ImplGetGalleryObjectPos( pObj );
275             }
276         }
277         catch( ... )
278         {
279         }
280     }
281 
282     return nRet;
283 }
284 
285 // ------------------------------------------------------------------------------
286 
287 ::sal_Int32 SAL_CALL GalleryTheme::insertGraphicByIndex(
288     const uno::Reference< graphic::XGraphic >& rxGraphic, sal_Int32 nIndex )
289     throw (lang::WrappedTargetException, uno::RuntimeException)
290 {
291     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
292     sal_Int32           nRet = -1;
293 
294     if( mpTheme )
295     {
296         try
297         {
298             const Graphic aGraphic( rxGraphic );
299 
300             nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) );
301 
302             if( mpTheme->InsertGraphic( aGraphic, nIndex ) )
303                 nRet = nIndex;
304         }
305         catch( ... )
306         {
307         }
308     }
309 
310     return nRet;
311 }
312 
313 // ------------------------------------------------------------------------------
314 
315 ::sal_Int32 SAL_CALL GalleryTheme::insertDrawingByIndex(
316     const uno::Reference< lang::XComponent >& Drawing, sal_Int32 nIndex )
317     throw (lang::WrappedTargetException, uno::RuntimeException)
318 {
319     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
320     sal_Int32           nRet = -1;
321 
322     if( mpTheme )
323     {
324         GalleryDrawingModel* pModel = GalleryDrawingModel::getImplementation( Drawing );
325 
326         if( pModel && pModel->GetDoc() && pModel->GetDoc()->ISA( FmFormModel ) )
327         {
328             nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) );
329 
330             if( mpTheme->InsertModel( *static_cast< FmFormModel* >( pModel->GetDoc() ), nIndex ) )
331                 nRet = nIndex;
332         }
333         else if (!pModel)
334         {
335             try
336             {
337                 uno::Reference< drawing::XDrawPagesSupplier > xDrawPagesSupplier( Drawing, uno::UNO_QUERY_THROW );
338                 uno::Reference< drawing::XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), uno::UNO_QUERY_THROW );
339                 uno::Reference< drawing::XDrawPage > xPage( xDrawPages->getByIndex( 0 ), uno::UNO_QUERY_THROW );
340                 SvxDrawPage* pUnoPage = xPage.is() ? SvxDrawPage::getImplementation( xPage ) : NULL;
341                 SdrModel* pOrigModel = pUnoPage ? pUnoPage->GetSdrPage()->GetModel() : NULL;
342                 SdrPage* pOrigPage = pUnoPage ? pUnoPage->GetSdrPage() : NULL;
343 
344                 if (pOrigPage && pOrigModel)
345                 {
346                     FmFormModel* pTmpModel = new FmFormModel(&pOrigModel->GetItemPool());
347                     SdrPage* pNewPage = pOrigPage->Clone();
348                     pTmpModel->InsertPage(pNewPage, 0);
349 
350                     uno::Reference< lang::XComponent > xDrawing( new GalleryDrawingModel( pTmpModel ) );
351                     pTmpModel->setUnoModel( uno::Reference< uno::XInterface >::query( xDrawing ) );
352 
353                     nRet = insertDrawingByIndex( xDrawing, nIndex );
354                     return nRet;
355                 }
356             }
357             catch (...)
358             {
359             }
360         }
361     }
362 
363     return nRet;
364 }
365 
366 // ------------------------------------------------------------------------------
367 
368 void SAL_CALL GalleryTheme::removeByIndex( sal_Int32 nIndex )
369     throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
370 {
371     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
372 
373     if( mpTheme )
374     {
375         if( ( nIndex < 0 ) || ( nIndex >= getCount() ) )
376             throw lang::IndexOutOfBoundsException();
377         else
378             mpTheme->RemoveObject( nIndex );
379     }
380 }
381 
382 // ------------------------------------------------------------------------------
383 
384 void GalleryTheme::Notify( SfxBroadcaster&, const SfxHint& rHint )
385 {
386     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
387     const GalleryHint&  rGalleryHint = static_cast< const GalleryHint& >( rHint );
388 
389     switch( rGalleryHint.GetType() )
390     {
391         case( GALLERY_HINT_CLOSE_THEME ):
392         {
393             DBG_ASSERT( !mpTheme || mpGallery, "Theme is living without Gallery" );
394 
395             implReleaseItems( NULL );
396 
397             if( mpGallery && mpTheme )
398             {
399                 mpGallery->ReleaseTheme( mpTheme, *this );
400                 mpTheme = NULL;
401             }
402         }
403         break;
404 
405         case( GALLERY_HINT_CLOSE_OBJECT ):
406         {
407             GalleryObject* pObj = reinterpret_cast< GalleryObject* >( rGalleryHint.GetData1() );
408 
409             if( pObj )
410                 implReleaseItems( pObj );
411         }
412         break;
413 
414         default:
415         break;
416     }
417 }
418 
419 // ------------------------------------------------------------------------------
420 
421 void GalleryTheme::implReleaseItems( GalleryObject* pObj )
422 {
423     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
424 
425     for( GalleryItemList::iterator aIter = maItemList.begin(); aIter != maItemList.end();  )
426     {
427         if( !pObj || ( (*aIter)->implGetObject() == pObj ) )
428         {
429             (*aIter)->implSetInvalid();
430             aIter = maItemList.erase( aIter );
431         }
432         else
433             ++aIter;
434     }
435 }
436 
437 // ------------------------------------------------------------------------------
438 
439 ::GalleryTheme* GalleryTheme::implGetTheme() const
440 {
441     return mpTheme;
442 }
443 
444 // ------------------------------------------------------------------------------
445 
446 void GalleryTheme::implRegisterGalleryItem( ::unogallery::GalleryItem& rItem )
447 {
448     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
449 
450 //  DBG_ASSERT( maItemList.find( &rItem ) == maItemList.end(), "Item already registered" );
451     maItemList.push_back( &rItem );
452 }
453 
454 // ------------------------------------------------------------------------------
455 
456 void GalleryTheme::implDeregisterGalleryItem( ::unogallery::GalleryItem& rItem )
457 {
458     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
459 
460 //  DBG_ASSERT( maItemList.find( &rItem ) != maItemList.end(), "Item is not registered" );
461     maItemList.remove( &rItem );
462 }
463 
464 }
465