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