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