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