xref: /trunk/main/svx/source/unodraw/unopool.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_svx.hxx"
30 #include <com/sun/star/lang/XServiceInfo.hpp>
31 #ifndef _COM_SUN_STAR_BEANS_PROPERTYSTATE_HDL_
32 #include <com/sun/star/beans/PropertyState.hpp>
33 #endif
34 
35 #include <comphelper/propertysetinfo.hxx>
36 #include <rtl/uuid.h>
37 #include <vos/mutex.hxx>
38 #include <vcl/svapp.hxx>
39 #include "svx/unopool.hxx"
40 #include <svx/svdmodel.hxx>
41 #include <svx/svdpool.hxx>
42 #include <svx/unoprov.hxx>
43 #include <svx/svdobj.hxx>
44 #include <svx/unoshprp.hxx>
45 #include <svx/xflbstit.hxx>
46 #include <svx/xflbmtit.hxx>
47 #include <svx/unopage.hxx>
48 #include <svx/svdetc.hxx>
49 #include <editeng/editeng.hxx>
50 
51 #include "svx/unoapi.hxx"
52 #include <memory>
53 
54 using namespace ::com::sun::star;
55 using namespace ::rtl;
56 using namespace ::cppu;
57 
58 SvxUnoDrawPool::SvxUnoDrawPool( SdrModel* pModel, sal_Int32 nServiceId ) throw()
59 : PropertySetHelper( SvxPropertySetInfoPool::getOrCreate( nServiceId ) ), mpModel( pModel )
60 {
61     init();
62 }
63 
64 /* deprecated */
65 SvxUnoDrawPool::SvxUnoDrawPool( SdrModel* pModel ) throw()
66 : PropertySetHelper( SvxPropertySetInfoPool::getOrCreate( SVXUNO_SERVICEID_COM_SUN_STAR_DRAWING_DEFAULTS ) ), mpModel( pModel )
67 {
68     init();
69 }
70 
71 SvxUnoDrawPool::~SvxUnoDrawPool() throw()
72 {
73     SfxItemPool::Free(mpDefaultsPool);
74 }
75 
76 void SvxUnoDrawPool::init()
77 {
78     mpDefaultsPool = new SdrItemPool();
79     SfxItemPool* pOutlPool=EditEngine::CreatePool();
80     mpDefaultsPool->SetSecondaryPool(pOutlPool);
81 
82     SdrModel::SetTextDefaults( mpDefaultsPool, SdrEngineDefaults::GetFontHeight() );
83     mpDefaultsPool->SetDefaultMetric((SfxMapUnit)SdrEngineDefaults::GetMapUnit());
84     mpDefaultsPool->FreezeIdRanges();
85 }
86 
87 SfxItemPool* SvxUnoDrawPool::getModelPool( sal_Bool bReadOnly ) throw()
88 {
89     if( mpModel )
90     {
91         return &mpModel->GetItemPool();
92     }
93     else
94     {
95         if( bReadOnly )
96             return mpDefaultsPool;
97         else
98             return NULL;
99     }
100 }
101 
102 void SvxUnoDrawPool::getAny( SfxItemPool* pPool, const comphelper::PropertyMapEntry* pEntry, uno::Any& rValue )
103     throw(beans::UnknownPropertyException)
104 {
105     switch( pEntry->mnHandle )
106     {
107     case OWN_ATTR_FILLBMP_MODE:
108         {
109             XFillBmpStretchItem* pStretchItem = (XFillBmpStretchItem*)&pPool->GetDefaultItem(XATTR_FILLBMP_STRETCH);
110             XFillBmpTileItem* pTileItem = (XFillBmpTileItem*)&pPool->GetDefaultItem(XATTR_FILLBMP_TILE);
111             if( pTileItem && pTileItem->GetValue() )
112             {
113                 rValue <<= drawing::BitmapMode_REPEAT;
114             }
115             else if( pStretchItem && pStretchItem->GetValue() )
116             {
117                 rValue <<= drawing::BitmapMode_STRETCH;
118             }
119             else
120             {
121                 rValue <<= drawing::BitmapMode_NO_REPEAT;
122             }
123             break;
124         }
125     default:
126         {
127             const SfxMapUnit eMapUnit = pPool ? pPool->GetMetric((sal_uInt16)pEntry->mnHandle) : SFX_MAPUNIT_100TH_MM;
128 
129             sal_uInt8 nMemberId = pEntry->mnMemberId & (~SFX_METRIC_ITEM);
130             if( eMapUnit == SFX_MAPUNIT_100TH_MM )
131                 nMemberId &= (~CONVERT_TWIPS);
132 
133             // DVO, OD 10.10.2003 #i18732#
134             // Assure, that ID is a Which-ID (it could be a Slot-ID.)
135             // Thus, convert handle to Which-ID.
136             pPool->GetDefaultItem( pPool->GetWhich( (sal_uInt16)pEntry->mnHandle ) ).QueryValue( rValue, nMemberId );
137         }
138     }
139 
140 
141     // check for needed metric translation
142     const SfxMapUnit eMapUnit = pPool->GetMetric((sal_uInt16)pEntry->mnHandle);
143     if(pEntry->mnMemberId & SFX_METRIC_ITEM && eMapUnit != SFX_MAPUNIT_100TH_MM)
144     {
145         SvxUnoConvertToMM( eMapUnit, rValue );
146     }
147     // convert int32 to correct enum type if needed
148     else if ( pEntry->mpType->getTypeClass() == uno::TypeClass_ENUM && rValue.getValueType() == ::getCppuType((const sal_Int32*)0) )
149     {
150         sal_Int32 nEnum;
151         rValue >>= nEnum;
152 
153         rValue.setValue( &nEnum, *pEntry->mpType );
154     }
155 }
156 
157 void SvxUnoDrawPool::putAny( SfxItemPool* pPool, const comphelper::PropertyMapEntry* pEntry, const uno::Any& rValue )
158     throw(beans::UnknownPropertyException, lang::IllegalArgumentException)
159 {
160     uno::Any aValue( rValue );
161 
162     const SfxMapUnit eMapUnit = pPool->GetMetric((sal_uInt16)pEntry->mnHandle);
163     if(pEntry->mnMemberId & SFX_METRIC_ITEM && eMapUnit != SFX_MAPUNIT_100TH_MM)
164     {
165         SvxUnoConvertFromMM( eMapUnit, aValue );
166     }
167 
168     // DVO, OD 10.10.2003 #i18732#
169     // Assure, that ID is a Which-ID (it could be a Slot-ID.)
170     // Thus, convert handle to Which-ID.
171     const sal_uInt16 nWhich = pPool->GetWhich( (sal_uInt16)pEntry->mnHandle );
172     switch( nWhich )
173     {
174         case OWN_ATTR_FILLBMP_MODE:
175             do
176             {
177                 drawing::BitmapMode eMode;
178                 if(!(aValue >>= eMode) )
179                 {
180                     sal_Int32 nMode = 0;
181                     if(!(aValue >>= nMode))
182                         throw lang::IllegalArgumentException();
183 
184                     eMode = (drawing::BitmapMode)nMode;
185                 }
186 
187                 pPool->SetPoolDefaultItem( XFillBmpStretchItem( eMode == drawing::BitmapMode_STRETCH ) );
188                 pPool->SetPoolDefaultItem( XFillBmpTileItem( eMode == drawing::BitmapMode_REPEAT ) );
189                 return;
190             }
191             while(0);
192 
193     default:
194         {
195             ::std::auto_ptr<SfxPoolItem> pNewItem( pPool->GetDefaultItem( nWhich ).Clone() );
196             sal_uInt8 nMemberId = pEntry->mnMemberId & (~SFX_METRIC_ITEM);
197             if( !pPool || (pPool->GetMetric(nWhich) == SFX_MAPUNIT_100TH_MM) )
198                 nMemberId &= (~CONVERT_TWIPS);
199 
200             if( !pNewItem->PutValue( aValue, nMemberId ) )
201                 throw lang::IllegalArgumentException();
202 
203             pPool->SetPoolDefaultItem( *pNewItem );
204         }
205     }
206 }
207 
208 void SvxUnoDrawPool::_setPropertyValues( const comphelper::PropertyMapEntry** ppEntries, const uno::Any* pValues )
209     throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException )
210 {
211     vos::OGuard aGuard( Application::GetSolarMutex() );
212 
213     SfxItemPool* pPool = getModelPool( sal_False );
214 
215     DBG_ASSERT( pPool, "I need a SfxItemPool!" );
216     if( NULL == pPool )
217         throw beans::UnknownPropertyException();
218 
219     while( *ppEntries )
220         putAny( pPool, *ppEntries++, *pValues++ );
221 }
222 
223 void SvxUnoDrawPool::_getPropertyValues( const comphelper::PropertyMapEntry** ppEntries, uno::Any* pValue )
224     throw(beans::UnknownPropertyException, lang::WrappedTargetException )
225 {
226     vos::OGuard aGuard( Application::GetSolarMutex() );
227 
228     SfxItemPool* pPool = getModelPool( sal_True );
229 
230     DBG_ASSERT( pPool, "I need a SfxItemPool!" );
231     if( NULL == pPool )
232         throw beans::UnknownPropertyException();
233 
234     while( *ppEntries )
235         getAny( pPool, *ppEntries++, *pValue++ );
236 }
237 
238 void SvxUnoDrawPool::_getPropertyStates( const comphelper::PropertyMapEntry** ppEntries, beans::PropertyState* pStates )
239     throw(beans::UnknownPropertyException )
240 {
241     vos::OGuard aGuard( Application::GetSolarMutex() );
242 
243     SfxItemPool* pPool = getModelPool( sal_True );
244 
245     if( pPool && pPool != mpDefaultsPool )
246     {
247         while( *ppEntries )
248         {
249             // OD 13.10.2003 #i18732#
250             // Assure, that ID is a Which-ID (it could be a Slot-ID.)
251             // Thus, convert handle to Which-ID.
252             const sal_uInt16 nWhich = pPool->GetWhich( ((sal_uInt16)(*ppEntries)->mnHandle) );
253 
254             switch( nWhich )
255             {
256             case OWN_ATTR_FILLBMP_MODE:
257                 {
258                     // use method <IsStaticDefaultItem(..)> instead of using
259                     // probably incompatible item pool <mpDefaultPool>.
260                     if ( IsStaticDefaultItem( &(pPool->GetDefaultItem( XATTR_FILLBMP_STRETCH )) ) ||
261                          IsStaticDefaultItem( &(pPool->GetDefaultItem( XATTR_FILLBMP_TILE )) ) )
262                     {
263                         *pStates = beans::PropertyState_DEFAULT_VALUE;
264                     }
265                     else
266                     {
267                         *pStates = beans::PropertyState_DIRECT_VALUE;
268                     }
269                 }
270                 break;
271             default:
272                 // OD 13.10.2003 #i18732# - correction:
273                 // use method <IsStaticDefaultItem(..)> instead of using probably
274                 // incompatible item pool <mpDefaultPool>.
275                 const SfxPoolItem& r1 = pPool->GetDefaultItem( nWhich );
276                 //const SfxPoolItem& r2 = mpDefaultPool->GetDefaultItem( nWhich );
277 
278                 if ( IsStaticDefaultItem( &r1 ) )
279                 {
280                     *pStates = beans::PropertyState_DEFAULT_VALUE;
281                 }
282                 else
283                 {
284                     *pStates = beans::PropertyState_DIRECT_VALUE;
285                 }
286             }
287 
288             pStates++;
289             ppEntries++;
290         }
291     }
292     else
293     {
294         // as long as we have no model, all properties are default
295         while( *ppEntries++ )
296             *pStates++ = beans::PropertyState_DEFAULT_VALUE;
297         return;
298     }
299 }
300 
301 void SvxUnoDrawPool::_setPropertyToDefault( const comphelper::PropertyMapEntry* pEntry )
302     throw(beans::UnknownPropertyException )
303 {
304     vos::OGuard aGuard( Application::GetSolarMutex() );
305 
306     SfxItemPool* pPool = getModelPool( sal_True );
307 
308     // OD 10.10.2003 #i18732#
309     // Assure, that ID is a Which-ID (it could be a Slot-ID.)
310     // Thus, convert handle to Which-ID.
311     const sal_uInt16 nWhich = pPool->GetWhich( (sal_uInt16)pEntry->mnHandle );
312     if ( pPool && pPool != mpDefaultsPool )
313     {
314         // OD 13.10.2003 #i18732# - use method <ResetPoolDefaultItem(..)>
315         // instead of using probably incompatible item pool <mpDefaultsPool>.
316         pPool->ResetPoolDefaultItem( nWhich );
317     }
318 }
319 
320 uno::Any SvxUnoDrawPool::_getPropertyDefault( const comphelper::PropertyMapEntry* pEntry )
321     throw(beans::UnknownPropertyException, lang::WrappedTargetException )
322 {
323     vos::OGuard aGuard( Application::GetSolarMutex() );
324 
325     // OD 13.10.2003 #i18732# - use method <GetPoolDefaultItem(..)> instead of
326     // using probably incompatible item pool <mpDefaultsPool>
327     uno::Any aAny;
328     SfxItemPool* pPool = getModelPool( sal_True );
329     const sal_uInt16 nWhich = pPool->GetWhich( (sal_uInt16)pEntry->mnHandle );
330     const SfxPoolItem *pItem = pPool->GetPoolDefaultItem ( nWhich );
331     pItem->QueryValue( aAny, pEntry->mnMemberId );
332 
333     return aAny;
334 }
335 
336 // XInterface
337 
338 uno::Any SAL_CALL SvxUnoDrawPool::queryInterface( const uno::Type & rType )
339     throw( uno::RuntimeException )
340 {
341     return OWeakAggObject::queryInterface( rType );
342 }
343 
344 uno::Any SAL_CALL SvxUnoDrawPool::queryAggregation( const uno::Type & rType )
345     throw(uno::RuntimeException)
346 {
347     uno::Any aAny;
348 
349     if( rType == ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0) )
350         aAny <<= uno::Reference< lang::XServiceInfo >(this);
351     else if( rType == ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0) )
352         aAny <<= uno::Reference< lang::XTypeProvider >(this);
353     else if( rType == ::getCppuType((const uno::Reference< beans::XPropertySet >*)0) )
354         aAny <<= uno::Reference< beans::XPropertySet >(this);
355     else if( rType == ::getCppuType((const uno::Reference< beans::XPropertyState >*)0) )
356         aAny <<= uno::Reference< beans::XPropertyState >(this);
357     else if( rType == ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0) )
358         aAny <<= uno::Reference< beans::XMultiPropertySet >(this);
359     else
360         aAny <<= OWeakAggObject::queryAggregation( rType );
361 
362     return aAny;
363 }
364 
365 void SAL_CALL SvxUnoDrawPool::acquire() throw ( )
366 {
367     OWeakAggObject::acquire();
368 }
369 
370 void SAL_CALL SvxUnoDrawPool::release() throw ( )
371 {
372     OWeakAggObject::release();
373 }
374 
375 uno::Sequence< uno::Type > SAL_CALL SvxUnoDrawPool::getTypes()
376     throw (uno::RuntimeException)
377 {
378     uno::Sequence< uno::Type > aTypes( 6 );
379     uno::Type* pTypes = aTypes.getArray();
380 
381     *pTypes++ = ::getCppuType((const uno::Reference< uno::XAggregation>*)0);
382     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo>*)0);
383     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider>*)0);
384     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet>*)0);
385     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState>*)0);
386     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet>*)0);
387 
388     return aTypes;
389 }
390 
391 uno::Sequence< sal_Int8 > SAL_CALL SvxUnoDrawPool::getImplementationId()
392     throw (uno::RuntimeException)
393 {
394     vos::OGuard aGuard( Application::GetSolarMutex() );
395 
396     static uno::Sequence< sal_Int8 > aId;
397     if( aId.getLength() == 0 )
398     {
399         aId.realloc( 16 );
400         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
401     }
402     return aId;
403 }
404 
405 // XServiceInfo
406 
407 sal_Bool SAL_CALL SvxUnoDrawPool::supportsService( const  OUString& ServiceName ) throw(uno::RuntimeException)
408 {
409     uno::Sequence< OUString > aSNL( getSupportedServiceNames() );
410     const OUString * pArray = aSNL.getConstArray();
411 
412     for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
413         if( pArray[i] == ServiceName )
414             return sal_True;
415 
416     return sal_False;
417 }
418 
419 OUString SAL_CALL SvxUnoDrawPool::getImplementationName() throw( uno::RuntimeException )
420 {
421     return OUString( RTL_CONSTASCII_USTRINGPARAM("SvxUnoDrawPool") );
422 }
423 
424 uno::Sequence< OUString > SAL_CALL SvxUnoDrawPool::getSupportedServiceNames(  )
425     throw( uno::RuntimeException )
426 {
427     uno::Sequence< OUString > aSNS( 1 );
428     aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.Defaults" ));
429     return aSNS;
430 }
431