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 54 SvxUnoDrawPool::SvxUnoDrawPool( SdrModel* pModel, sal_Int32 nServiceId ) throw() 55 : PropertySetHelper( SvxPropertySetInfoPool::getOrCreate( nServiceId ) ), mpModel( pModel ) 56 { 57 init(); 58 } 59 60 /* deprecated */ 61 SvxUnoDrawPool::SvxUnoDrawPool( SdrModel* pModel ) throw() 62 : PropertySetHelper( SvxPropertySetInfoPool::getOrCreate( SVXUNO_SERVICEID_COM_SUN_STAR_DRAWING_DEFAULTS ) ), mpModel( pModel ) 63 { 64 init(); 65 } 66 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 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 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 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 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 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 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 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 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 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 345 uno::Any SAL_CALL SvxUnoDrawPool::queryInterface( const uno::Type & rType ) 346 throw( uno::RuntimeException ) 347 { 348 return OWeakAggObject::queryInterface( rType ); 349 } 350 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 372 void SAL_CALL SvxUnoDrawPool::acquire() throw ( ) 373 { 374 OWeakAggObject::acquire(); 375 } 376 377 void SAL_CALL SvxUnoDrawPool::release() throw ( ) 378 { 379 OWeakAggObject::release(); 380 } 381 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 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 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 426 OUString SAL_CALL SvxUnoDrawPool::getImplementationName() throw( uno::RuntimeException ) 427 { 428 return OUString( RTL_CONSTASCII_USTRINGPARAM("SvxUnoDrawPool") ); 429 } 430 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