Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <algorithm>
21 :
22 : #include "unogaltheme.hxx"
23 : #include "unogalitem.hxx"
24 : #include "svx/galtheme.hxx"
25 : #include "svx/gallery1.hxx"
26 : #include "svx/galmisc.hxx"
27 : #include <svx/fmmodel.hxx>
28 : #include <svx/svdpage.hxx>
29 : #include <svx/unopage.hxx>
30 : #include <svl/itempool.hxx>
31 : #include <osl/mutex.hxx>
32 : #include <vcl/svapp.hxx>
33 : #include <unotools/pathoptions.hxx>
34 : #include <comphelper/servicehelper.hxx>
35 :
36 : using namespace ::com::sun::star;
37 :
38 : namespace unogallery {
39 :
40 : // -----------------
41 : // - GalleryTheme -
42 : // -----------------
43 :
44 0 : GalleryTheme::GalleryTheme( const ::rtl::OUString& rThemeName )
45 : {
46 0 : mpGallery = ::Gallery::GetGalleryInstance();
47 0 : mpTheme = ( mpGallery ? mpGallery->AcquireTheme( rThemeName, *this ) : NULL );
48 :
49 0 : if( mpGallery )
50 0 : StartListening( *mpGallery );
51 0 : }
52 :
53 : // ------------------------------------------------------------------------------
54 :
55 0 : GalleryTheme::~GalleryTheme()
56 : {
57 0 : const SolarMutexGuard aGuard;
58 :
59 : DBG_ASSERT( !mpTheme || mpGallery, "Theme is living without Gallery" );
60 :
61 0 : implReleaseItems( NULL );
62 :
63 0 : if( mpGallery )
64 : {
65 0 : EndListening( *mpGallery );
66 :
67 0 : if( mpTheme )
68 0 : mpGallery->ReleaseTheme( mpTheme, *this );
69 0 : }
70 0 : }
71 :
72 : // ------------------------------------------------------------------------------
73 :
74 0 : ::rtl::OUString GalleryTheme::getImplementationName_Static()
75 : throw()
76 : {
77 0 : return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.gallery.GalleryTheme" ) );
78 : }
79 :
80 : // ------------------------------------------------------------------------------
81 :
82 0 : uno::Sequence< ::rtl::OUString > GalleryTheme::getSupportedServiceNames_Static()
83 : throw()
84 : {
85 0 : uno::Sequence< ::rtl::OUString > aSeq( 1 );
86 :
87 0 : aSeq.getArray()[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.gallery.GalleryTheme" ) );
88 :
89 0 : return aSeq;
90 : }
91 :
92 : // ------------------------------------------------------------------------------
93 :
94 0 : ::rtl::OUString SAL_CALL GalleryTheme::getImplementationName()
95 : throw( uno::RuntimeException )
96 : {
97 0 : return getImplementationName_Static();
98 : }
99 :
100 : // ------------------------------------------------------------------------------
101 :
102 0 : sal_Bool SAL_CALL GalleryTheme::supportsService( const ::rtl::OUString& ServiceName )
103 : throw( uno::RuntimeException )
104 : {
105 0 : uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() );
106 0 : const ::rtl::OUString* pArray = aSNL.getConstArray();
107 :
108 0 : for( int i = 0; i < aSNL.getLength(); i++ )
109 0 : if( pArray[i] == ServiceName )
110 0 : return true;
111 :
112 0 : return false;
113 : }
114 :
115 : // ------------------------------------------------------------------------------
116 :
117 0 : uno::Sequence< ::rtl::OUString > SAL_CALL GalleryTheme::getSupportedServiceNames()
118 : throw( uno::RuntimeException )
119 : {
120 0 : return getSupportedServiceNames_Static();
121 : }
122 :
123 : // ------------------------------------------------------------------------------
124 :
125 0 : uno::Sequence< uno::Type > SAL_CALL GalleryTheme::getTypes()
126 : throw(uno::RuntimeException)
127 : {
128 0 : uno::Sequence< uno::Type > aTypes( 5 );
129 0 : uno::Type* pTypes = aTypes.getArray();
130 :
131 0 : *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo>*)0);
132 0 : *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider>*)0);
133 0 : *pTypes++ = ::getCppuType((const uno::Reference< container::XElementAccess>*)0);
134 0 : *pTypes++ = ::getCppuType((const uno::Reference< container::XIndexAccess>*)0);
135 0 : *pTypes++ = ::getCppuType((const uno::Reference< gallery::XGalleryTheme>*)0);
136 :
137 0 : return aTypes;
138 : }
139 :
140 : namespace
141 : {
142 : class theGalleryThemeImplementationId : public rtl::Static< UnoTunnelIdInit, theGalleryThemeImplementationId > {};
143 : }
144 :
145 0 : uno::Sequence< sal_Int8 > SAL_CALL GalleryTheme::getImplementationId()
146 : throw(uno::RuntimeException)
147 : {
148 0 : return theGalleryThemeImplementationId::get().getSeq();
149 : }
150 :
151 : // ------------------------------------------------------------------------------
152 :
153 0 : uno::Type SAL_CALL GalleryTheme::getElementType()
154 : throw (uno::RuntimeException)
155 : {
156 0 : return ::getCppuType( (const uno::Reference< gallery::XGalleryItem >*) 0);
157 : }
158 :
159 : // ------------------------------------------------------------------------------
160 :
161 0 : sal_Bool SAL_CALL GalleryTheme::hasElements()
162 : throw (uno::RuntimeException)
163 : {
164 0 : const SolarMutexGuard aGuard;
165 :
166 0 : return( ( mpTheme != NULL ) && ( mpTheme->GetObjectCount() > 0 ) );
167 : }
168 :
169 : // ------------------------------------------------------------------------------
170 :
171 0 : sal_Int32 SAL_CALL GalleryTheme::getCount()
172 : throw (uno::RuntimeException)
173 : {
174 0 : const SolarMutexGuard aGuard;
175 :
176 0 : return( mpTheme ? mpTheme->GetObjectCount() : 0 );
177 : }
178 :
179 : // ------------------------------------------------------------------------------
180 :
181 0 : uno::Any SAL_CALL GalleryTheme::getByIndex( ::sal_Int32 nIndex )
182 : throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
183 : {
184 0 : const SolarMutexGuard aGuard;
185 0 : uno::Any aRet;
186 :
187 0 : if( mpTheme )
188 : {
189 0 : if( ( nIndex < 0 ) || ( nIndex >= getCount() ) )
190 : {
191 0 : throw lang::IndexOutOfBoundsException();
192 : }
193 : else
194 : {
195 0 : const GalleryObject* pObj = mpTheme->ImplGetGalleryObject( nIndex );
196 :
197 0 : if( pObj )
198 0 : aRet = uno::makeAny( uno::Reference< gallery::XGalleryItem >( new GalleryItem( *this, *pObj ) ) );
199 : }
200 : }
201 :
202 0 : return aRet;
203 : }
204 :
205 : // ------------------------------------------------------------------------------
206 :
207 0 : ::rtl::OUString SAL_CALL GalleryTheme::getName( )
208 : throw (uno::RuntimeException)
209 : {
210 0 : const SolarMutexGuard aGuard;
211 0 : ::rtl::OUString aRet;
212 :
213 0 : if( mpTheme )
214 0 : aRet = mpTheme->GetName();
215 :
216 0 : return aRet;
217 : }
218 :
219 : // ------------------------------------------------------------------------------
220 :
221 0 : void SAL_CALL GalleryTheme::update( )
222 : throw (uno::RuntimeException)
223 : {
224 0 : const SolarMutexGuard aGuard;
225 :
226 0 : if( mpTheme )
227 : {
228 0 : const Link aDummyLink;
229 0 : mpTheme->Actualize( aDummyLink );
230 0 : }
231 0 : }
232 :
233 : // ------------------------------------------------------------------------------
234 :
235 0 : ::sal_Int32 SAL_CALL GalleryTheme::insertURLByIndex(
236 : const ::rtl::OUString& rURL, ::sal_Int32 nIndex )
237 : throw (lang::WrappedTargetException, uno::RuntimeException)
238 : {
239 0 : const SolarMutexGuard aGuard;
240 0 : sal_Int32 nRet = -1;
241 :
242 0 : if( mpTheme )
243 : {
244 : try
245 : {
246 0 : const INetURLObject aURL( rURL );
247 :
248 0 : nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) );
249 :
250 0 : if( ( aURL.GetProtocol() != INET_PROT_NOT_VALID ) && mpTheme->InsertURL( aURL, nIndex ) )
251 : {
252 0 : const GalleryObject* pObj = mpTheme->ImplGetGalleryObject( aURL );
253 :
254 0 : if( pObj )
255 0 : nRet = mpTheme->ImplGetGalleryObjectPos( pObj );
256 0 : }
257 : }
258 0 : catch( ... )
259 : {
260 : }
261 : }
262 :
263 0 : return nRet;
264 : }
265 :
266 : // ------------------------------------------------------------------------------
267 :
268 0 : ::sal_Int32 SAL_CALL GalleryTheme::insertGraphicByIndex(
269 : const uno::Reference< graphic::XGraphic >& rxGraphic, sal_Int32 nIndex )
270 : throw (lang::WrappedTargetException, uno::RuntimeException)
271 : {
272 0 : const SolarMutexGuard aGuard;
273 0 : sal_Int32 nRet = -1;
274 :
275 0 : if( mpTheme )
276 : {
277 : try
278 : {
279 0 : const Graphic aGraphic( rxGraphic );
280 :
281 0 : nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) );
282 :
283 0 : if( mpTheme->InsertGraphic( aGraphic, nIndex ) )
284 0 : nRet = nIndex;
285 : }
286 0 : catch( ... )
287 : {
288 : }
289 : }
290 :
291 0 : return nRet;
292 : }
293 :
294 : // ------------------------------------------------------------------------------
295 :
296 0 : ::sal_Int32 SAL_CALL GalleryTheme::insertDrawingByIndex(
297 : const uno::Reference< lang::XComponent >& Drawing, sal_Int32 nIndex )
298 : throw (lang::WrappedTargetException, uno::RuntimeException)
299 : {
300 0 : const SolarMutexGuard aGuard;
301 0 : sal_Int32 nRet = -1;
302 :
303 0 : if( mpTheme )
304 : {
305 0 : GalleryDrawingModel* pModel = GalleryDrawingModel::getImplementation( Drawing );
306 :
307 0 : if( pModel && pModel->GetDoc() && pModel->GetDoc()->ISA( FmFormModel ) )
308 : {
309 : // Here we're inserting something that's already a gallery theme drawing
310 0 : nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) );
311 :
312 0 : if( mpTheme->InsertModel( *static_cast< FmFormModel* >( pModel->GetDoc() ), nIndex ) )
313 0 : nRet = nIndex;
314 : }
315 0 : else if (!pModel)
316 : {
317 : // #i80184# Try to do the right thing and make a Gallery drawing out
318 : // of an ordinary Drawing if possible.
319 : try
320 : {
321 0 : uno::Reference< drawing::XDrawPagesSupplier > xDrawPagesSupplier( Drawing, uno::UNO_QUERY_THROW );
322 0 : uno::Reference< drawing::XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), uno::UNO_QUERY_THROW );
323 0 : uno::Reference< drawing::XDrawPage > xPage( xDrawPages->getByIndex( 0 ), uno::UNO_QUERY_THROW );
324 0 : SvxDrawPage* pUnoPage = xPage.is() ? SvxDrawPage::getImplementation( xPage ) : NULL;
325 0 : SdrModel* pOrigModel = pUnoPage ? pUnoPage->GetSdrPage()->GetModel() : NULL;
326 0 : SdrPage* pOrigPage = pUnoPage ? pUnoPage->GetSdrPage() : NULL;
327 :
328 0 : if (pOrigPage && pOrigModel)
329 : {
330 0 : FmFormModel* pTmpModel = new FmFormModel(&pOrigModel->GetItemPool());
331 0 : SdrPage* pNewPage = pOrigPage->Clone();
332 0 : pTmpModel->InsertPage(pNewPage, 0);
333 :
334 0 : uno::Reference< lang::XComponent > xDrawing( new GalleryDrawingModel( pTmpModel ) );
335 0 : pTmpModel->setUnoModel( uno::Reference< uno::XInterface >::query( xDrawing ) );
336 :
337 0 : nRet = insertDrawingByIndex( xDrawing, nIndex );
338 0 : return nRet;
339 0 : }
340 : }
341 0 : catch (...)
342 : {
343 : }
344 : }
345 : }
346 :
347 0 : return nRet;
348 : }
349 :
350 : // ------------------------------------------------------------------------------
351 :
352 0 : void SAL_CALL GalleryTheme::removeByIndex( sal_Int32 nIndex )
353 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
354 : {
355 0 : const SolarMutexGuard aGuard;
356 :
357 0 : if( mpTheme )
358 : {
359 0 : if( ( nIndex < 0 ) || ( nIndex >= getCount() ) )
360 0 : throw lang::IndexOutOfBoundsException();
361 : else
362 0 : mpTheme->RemoveObject( nIndex );
363 0 : }
364 0 : }
365 :
366 : // ------------------------------------------------------------------------------
367 :
368 0 : void GalleryTheme::Notify( SfxBroadcaster&, const SfxHint& rHint )
369 : {
370 0 : const SolarMutexGuard aGuard;
371 0 : const GalleryHint& rGalleryHint = static_cast< const GalleryHint& >( rHint );
372 :
373 0 : switch( rGalleryHint.GetType() )
374 : {
375 : case( GALLERY_HINT_CLOSE_THEME ):
376 : {
377 : DBG_ASSERT( !mpTheme || mpGallery, "Theme is living without Gallery" );
378 :
379 0 : implReleaseItems( NULL );
380 :
381 0 : if( mpGallery && mpTheme )
382 : {
383 0 : mpGallery->ReleaseTheme( mpTheme, *this );
384 0 : mpTheme = NULL;
385 : }
386 : }
387 0 : break;
388 :
389 : case( GALLERY_HINT_CLOSE_OBJECT ):
390 : {
391 0 : GalleryObject* pObj = reinterpret_cast< GalleryObject* >( rGalleryHint.GetData1() );
392 :
393 0 : if( pObj )
394 0 : implReleaseItems( pObj );
395 : }
396 0 : break;
397 :
398 : default:
399 0 : break;
400 0 : }
401 0 : }
402 :
403 : // ------------------------------------------------------------------------------
404 :
405 0 : void GalleryTheme::implReleaseItems( GalleryObject* pObj )
406 : {
407 0 : const SolarMutexGuard aGuard;
408 :
409 0 : for( GalleryItemList::iterator aIter = maItemList.begin(); aIter != maItemList.end(); )
410 : {
411 0 : if( !pObj || ( (*aIter)->implGetObject() == pObj ) )
412 : {
413 0 : (*aIter)->implSetInvalid();
414 0 : aIter = maItemList.erase( aIter );
415 : }
416 : else
417 0 : ++aIter;
418 0 : }
419 0 : }
420 :
421 : // ------------------------------------------------------------------------------
422 :
423 0 : ::GalleryTheme* GalleryTheme::implGetTheme() const
424 : {
425 0 : return mpTheme;
426 : }
427 :
428 : // ------------------------------------------------------------------------------
429 :
430 0 : void GalleryTheme::implRegisterGalleryItem( ::unogallery::GalleryItem& rItem )
431 : {
432 0 : const SolarMutexGuard aGuard;
433 :
434 : // DBG_ASSERT( maItemList.find( &rItem ) == maItemList.end(), "Item already registered" );
435 0 : maItemList.push_back( &rItem );
436 0 : }
437 :
438 : // ------------------------------------------------------------------------------
439 :
440 0 : void GalleryTheme::implDeregisterGalleryItem( ::unogallery::GalleryItem& rItem )
441 : {
442 0 : const SolarMutexGuard aGuard;
443 :
444 : // DBG_ASSERT( maItemList.find( &rItem ) != maItemList.end(), "Item is not registered" );
445 0 : maItemList.remove( &rItem );
446 0 : }
447 :
448 : }
449 :
450 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|