xref: /trunk/main/svx/source/unogallery/unogalitem.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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_svx.hxx"
26 
27 #include "unogalitem.hxx"
28 #include "unogaltheme.hxx"
29 #include "svx/galtheme.hxx"
30 #include "svx/galmisc.hxx"
31 #include <svx/fmmodel.hxx>
32 #include <rtl/uuid.h>
33 #include <vos/mutex.hxx>
34 #include <vcl/svapp.hxx>
35 #include <vcl/graph.hxx>
36 #include <svl/itemprop.hxx>
37 #include <svl/itempool.hxx>
38 #include "galobj.hxx"
39 
40 #ifndef _COM_SUN_STAR_BEANS_PROPERTYSTATE_HDL_
41 #include <com/sun/star/beans/PropertyState.hpp>
42 #endif
43 #ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HDL_
44 #include <com/sun/star/beans/PropertyAttribute.hpp>
45 #endif
46 #include <com/sun/star/gallery/GalleryItemType.hpp>
47 
48 #define UNOGALLERY_GALLERYITEMTYPE  1
49 #define UNOGALLERY_URL              2
50 #define UNOGALLERY_TITLE            3
51 #define UNOGALLERY_THUMBNAIL        4
52 #define UNOGALLERY_GRAPHIC          5
53 #define UNOGALLERY_DRAWING          6
54 
55 using namespace ::com::sun::star;
56 
57 namespace unogallery {
58 
59 // -----------------
60 // - GalleryItem -
61 // -----------------
62 
GalleryItem(::unogallery::GalleryTheme & rTheme,const GalleryObject & rObject)63 GalleryItem::GalleryItem( ::unogallery::GalleryTheme& rTheme, const GalleryObject& rObject ) :
64     ::comphelper::PropertySetHelper( createPropertySetInfo() ),
65     mpTheme( &rTheme ),
66     mpGalleryObject( &rObject )
67 {
68     mpTheme->implRegisterGalleryItem( *this );
69 }
70 
71 // ------------------------------------------------------------------------------
72 
~GalleryItem()73 GalleryItem::~GalleryItem()
74     throw()
75 {
76     if( mpTheme )
77         mpTheme->implDeregisterGalleryItem( *this );
78 }
79 
80 // ------------------------------------------------------------------------------
81 
isValid() const82 bool GalleryItem::isValid() const
83 {
84     return( mpTheme != NULL );
85 }
86 
87 // ------------------------------------------------------------------------------
88 
queryAggregation(const uno::Type & rType)89 uno::Any SAL_CALL GalleryItem::queryAggregation( const uno::Type & rType )
90 {
91     uno::Any aAny;
92 
93     if( rType == ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0) )
94         aAny <<= uno::Reference< lang::XServiceInfo >(this);
95     else if( rType == ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0) )
96         aAny <<= uno::Reference< lang::XTypeProvider >(this);
97     else if( rType == ::getCppuType((const uno::Reference< gallery::XGalleryItem >*)0) )
98         aAny <<= uno::Reference< gallery::XGalleryItem >(this);
99     else if( rType == ::getCppuType((const uno::Reference< beans::XPropertySet >*)0) )
100         aAny <<= uno::Reference< beans::XPropertySet >(this);
101     else if( rType == ::getCppuType((const uno::Reference< beans::XPropertyState >*)0) )
102         aAny <<= uno::Reference< beans::XPropertyState >(this);
103     else if( rType == ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0) )
104         aAny <<= uno::Reference< beans::XMultiPropertySet >(this);
105     else
106         aAny <<= OWeakAggObject::queryAggregation( rType );
107 
108     return aAny;
109 }
110 
111 // ------------------------------------------------------------------------------
112 
queryInterface(const uno::Type & rType)113 uno::Any SAL_CALL GalleryItem::queryInterface( const uno::Type & rType )
114 {
115     return OWeakAggObject::queryInterface( rType );
116 }
117 
118 // ------------------------------------------------------------------------------
119 
acquire()120 void SAL_CALL GalleryItem::acquire()
121     throw()
122 {
123     OWeakAggObject::acquire();
124 }
125 
126 // ------------------------------------------------------------------------------
127 
release()128 void SAL_CALL GalleryItem::release()
129     throw()
130 {
131     OWeakAggObject::release();
132 }
133 
134 // ------------------------------------------------------------------------------
135 
getImplementationName_Static()136 ::rtl::OUString GalleryItem::getImplementationName_Static()
137     throw()
138 {
139     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.gallery.GalleryItem" ) );
140 }
141 
142 // ------------------------------------------------------------------------------
143 
getSupportedServiceNames_Static()144 uno::Sequence< ::rtl::OUString > GalleryItem::getSupportedServiceNames_Static()
145     throw()
146 {
147     uno::Sequence< ::rtl::OUString > aSeq( 1 );
148 
149     aSeq.getArray()[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.gallery.GalleryItem" ) );
150 
151     return aSeq;
152 }
153 
154 // ------------------------------------------------------------------------------
155 
getImplementationName()156 ::rtl::OUString SAL_CALL GalleryItem::getImplementationName()
157 {
158     return getImplementationName_Static();
159 }
160 
161 // ------------------------------------------------------------------------------
162 
supportsService(const::rtl::OUString & ServiceName)163 sal_Bool SAL_CALL GalleryItem::supportsService( const ::rtl::OUString& ServiceName )
164 {
165     uno::Sequence< ::rtl::OUString >    aSNL( getSupportedServiceNames() );
166     const ::rtl::OUString*              pArray = aSNL.getConstArray();
167 
168     for( int i = 0; i < aSNL.getLength(); i++ )
169         if( pArray[i] == ServiceName )
170             return true;
171 
172     return false;
173 }
174 
175 // ------------------------------------------------------------------------------
176 
getSupportedServiceNames()177 uno::Sequence< ::rtl::OUString > SAL_CALL GalleryItem::getSupportedServiceNames()
178 {
179     return getSupportedServiceNames_Static();
180 }
181 
182 // ------------------------------------------------------------------------------
183 
getTypes()184 uno::Sequence< uno::Type > SAL_CALL GalleryItem::getTypes()
185 {
186     uno::Sequence< uno::Type >  aTypes( 6 );
187     uno::Type*                  pTypes = aTypes.getArray();
188 
189     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo>*)0);
190     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider>*)0);
191     *pTypes++ = ::getCppuType((const uno::Reference< gallery::XGalleryItem>*)0);
192     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet>*)0);
193     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState>*)0);
194     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet>*)0);
195 
196     return aTypes;
197 }
198 
199 // ------------------------------------------------------------------------------
200 
getImplementationId()201 uno::Sequence< sal_Int8 > SAL_CALL GalleryItem::getImplementationId()
202 {
203     const vos::OGuard                   aGuard( Application::GetSolarMutex() );
204     static uno::Sequence< sal_Int8 >    aId;
205 
206     if( aId.getLength() == 0 )
207     {
208         aId.realloc( 16 );
209         rtl_createUuid( reinterpret_cast< sal_uInt8* >( aId.getArray() ), 0, sal_True );
210     }
211 
212     return aId;
213 }
214 
215 // ------------------------------------------------------------------------------
216 
getType()217 sal_Int8 SAL_CALL GalleryItem::getType()
218 {
219     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
220     sal_Int8            nRet = gallery::GalleryItemType::EMPTY;
221 
222     if( isValid() )
223     {
224         switch( implGetObject()->eObjKind )
225         {
226             case( SGA_OBJ_SOUND ):
227             case( SGA_OBJ_VIDEO ):
228                 nRet = gallery::GalleryItemType::MEDIA;
229             break;
230 
231             case( SGA_OBJ_SVDRAW ):
232                 nRet = gallery::GalleryItemType::DRAWING;
233             break;
234 
235             default:
236                 nRet = gallery::GalleryItemType::GRAPHIC;
237             break;
238         }
239     }
240 
241     return nRet;
242 }
243 
244 // ------------------------------------------------------------------------------
245 
createPropertySetInfo()246 ::comphelper::PropertySetInfo* GalleryItem::createPropertySetInfo()
247 {
248     vos::OGuard                     aGuard( Application::GetSolarMutex() );
249     ::comphelper::PropertySetInfo*  pRet = new ::comphelper::PropertySetInfo();
250 
251     static ::comphelper::PropertyMapEntry aEntries[] =
252     {
253         { MAP_CHAR_LEN( "GalleryItemType" ), UNOGALLERY_GALLERYITEMTYPE, &::getCppuType( (const sal_Int8*)(0)),
254           beans::PropertyAttribute::READONLY, 0 },
255 
256         { MAP_CHAR_LEN( "URL" ), UNOGALLERY_URL, &::getCppuType( (const ::rtl::OUString*)(0)),
257           beans::PropertyAttribute::READONLY, 0 },
258 
259         { MAP_CHAR_LEN( "Title" ), UNOGALLERY_TITLE, &::getCppuType( (const ::rtl::OUString*)(0)),
260           0, 0 },
261 
262         { MAP_CHAR_LEN( "Thumbnail" ), UNOGALLERY_THUMBNAIL, &::getCppuType( (const uno::Reference< graphic::XGraphic >*)(0)),
263           beans::PropertyAttribute::READONLY, 0 },
264 
265         { MAP_CHAR_LEN( "Graphic" ), UNOGALLERY_GRAPHIC, &::getCppuType( (const uno::Reference< graphic::XGraphic >*)(0)),
266           beans::PropertyAttribute::READONLY, 0 },
267 
268         { MAP_CHAR_LEN( "Drawing" ), UNOGALLERY_DRAWING, &::getCppuType( (const uno::Reference< lang::XComponent >*)(0) ),
269           beans::PropertyAttribute::READONLY, 0 },
270 
271         { 0,0,0,0,0,0}
272     };
273 
274     pRet->acquire();
275     pRet->add( aEntries );
276 
277     return pRet;
278 }
279 
280 // ------------------------------------------------------------------------------
281 
_setPropertyValues(const comphelper::PropertyMapEntry ** ppEntries,const uno::Any * pValues)282 void GalleryItem::_setPropertyValues( const comphelper::PropertyMapEntry** ppEntries, const uno::Any* pValues )
283 {
284     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
285 
286     while( *ppEntries )
287     {
288         if( UNOGALLERY_TITLE == (*ppEntries)->mnHandle )
289         {
290             ::rtl::OUString aNewTitle;
291 
292             if( *pValues >>= aNewTitle )
293             {
294                 ::GalleryTheme* pGalTheme = ( isValid() ? mpTheme->implGetTheme() : NULL );
295 
296                 if( pGalTheme )
297                 {
298                     SgaObject* pObj = pGalTheme->ImplReadSgaObject( const_cast< GalleryObject* >( implGetObject() ) );
299 
300                     if( pObj )
301                     {
302                         if( ::rtl::OUString( pObj->GetTitle() ) != aNewTitle )
303                         {
304                             pObj->SetTitle( aNewTitle );
305                             pGalTheme->InsertObject( *pObj );
306                         }
307 
308                         delete pObj;
309                     }
310                 }
311             }
312             else
313             {
314                 throw lang::IllegalArgumentException();
315             }
316         }
317 
318         ++ppEntries;
319         ++pValues;
320     }
321 }
322 
323 // ------------------------------------------------------------------------------
324 
_getPropertyValues(const comphelper::PropertyMapEntry ** ppEntries,uno::Any * pValue)325 void GalleryItem::_getPropertyValues( const comphelper::PropertyMapEntry** ppEntries, uno::Any* pValue )
326 {
327     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
328 
329     while( *ppEntries )
330     {
331         switch( (*ppEntries)->mnHandle )
332         {
333             case( UNOGALLERY_GALLERYITEMTYPE ):
334             {
335                 *pValue <<= sal_Int8( getType() );
336             }
337             break;
338 
339             case( UNOGALLERY_URL ):
340             {
341                 ::GalleryTheme* pGalTheme = ( isValid() ? mpTheme->implGetTheme() : NULL );
342 
343                 if( pGalTheme )
344                     *pValue <<= ::rtl::OUString( implGetObject()->aURL.GetMainURL( INetURLObject::NO_DECODE ) );
345             }
346             break;
347 
348             case( UNOGALLERY_TITLE ):
349             {
350                 ::GalleryTheme* pGalTheme = ( isValid() ? mpTheme->implGetTheme() : NULL );
351 
352                 if( pGalTheme )
353                 {
354                     SgaObject* pObj = pGalTheme->AcquireObject( pGalTheme->ImplGetGalleryObjectPos( implGetObject() ) );
355 
356                     if( pObj )
357                     {
358                         *pValue <<= ::rtl::OUString( pObj->GetTitle() );
359                         pGalTheme->ReleaseObject( pObj );
360                     }
361                 }
362             }
363             break;
364 
365             case( UNOGALLERY_THUMBNAIL ):
366             {
367                 ::GalleryTheme* pGalTheme = ( isValid() ? mpTheme->implGetTheme() : NULL );
368 
369                 if( pGalTheme )
370                 {
371                     SgaObject* pObj = pGalTheme->AcquireObject( pGalTheme->ImplGetGalleryObjectPos( implGetObject() ) );
372 
373                     if( pObj )
374                     {
375                         Graphic aThumbnail;
376 
377                         if( pObj->IsThumbBitmap() )
378                             aThumbnail = pObj->GetThumbBmp();
379                         else
380                             aThumbnail = pObj->GetThumbMtf();
381 
382                         *pValue <<= aThumbnail.GetXGraphic();
383                         pGalTheme->ReleaseObject( pObj );
384                     }
385                 }
386             }
387             break;
388 
389             case( UNOGALLERY_GRAPHIC ):
390             {
391                 ::GalleryTheme* pGalTheme = ( isValid() ? mpTheme->implGetTheme() : NULL );
392                 Graphic         aGraphic;
393 
394                 if( pGalTheme && pGalTheme->GetGraphic( pGalTheme->ImplGetGalleryObjectPos( implGetObject() ), aGraphic ) )
395                     *pValue <<= aGraphic.GetXGraphic();
396             }
397             break;
398 
399             case( UNOGALLERY_DRAWING ):
400             {
401                 if( gallery::GalleryItemType::DRAWING == getType() )
402                 {
403                     ::GalleryTheme* pGalTheme = ( isValid() ? mpTheme->implGetTheme() : NULL );
404                     FmFormModel*    pModel = new FmFormModel;
405 
406                     pModel->GetItemPool().FreezeIdRanges();
407 
408                     if( pGalTheme && pGalTheme->GetModel( pGalTheme->ImplGetGalleryObjectPos( implGetObject() ), *pModel ) )
409                     {
410                         uno::Reference< lang::XComponent > xDrawing( new GalleryDrawingModel( pModel ) );
411 
412                         pModel->setUnoModel( uno::Reference< uno::XInterface >::query( xDrawing ) );
413                         *pValue <<= xDrawing;
414                     }
415                     else
416                         delete pModel;
417                 }
418             }
419             break;
420         }
421 
422         ++ppEntries;
423         ++pValue;
424     }
425 }
426 
427 // ------------------------------------------------------------------------------
428 
implGetObject() const429 const ::GalleryObject* GalleryItem::implGetObject() const
430 {
431     return mpGalleryObject;
432 }
433 
434 // ------------------------------------------------------------------------------
435 
implSetInvalid()436 void GalleryItem::implSetInvalid()
437 {
438     if( mpTheme )
439     {
440         mpTheme = NULL;
441         mpGalleryObject = NULL;
442     }
443 }
444 
445 // -----------------------
446 // - GalleryDrawingModel -
447 // -----------------------
448 
GalleryDrawingModel(SdrModel * pDoc)449 GalleryDrawingModel::GalleryDrawingModel( SdrModel* pDoc )
450     throw() :
451     SvxUnoDrawingModel( pDoc )
452 {
453 }
454 
455 // -----------------------------------------------------------------------------
456 
~GalleryDrawingModel()457 GalleryDrawingModel::~GalleryDrawingModel()
458     throw()
459 {
460     delete GetDoc();
461 }
462 
463 // -----------------------------------------------------------------------------
464 
465 UNO3_GETIMPLEMENTATION_IMPL( GalleryDrawingModel );
466 
467 }
468