xref: /AOO41X/main/svx/source/unodraw/unoshape.cxx (revision 28cc6868bb417932abfd09d8e2956a2a6d53e3c2)
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 
27 #define _SVX_USE_UNOGLOBALS_
28 #include <cppuhelper/typeprovider.hxx>
29 #include <com/sun/star/awt/XBitmap.hpp>
30 #include <com/sun/star/awt/Rectangle.hpp>
31 #include <com/sun/star/drawing/CircleKind.hpp>
32 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
33 #include <vcl/svapp.hxx>
34 #include <svl/itemprop.hxx>
35 #include <svtools/fltcall.hxx>
36 #include <vos/mutex.hxx>
37 #include <editeng/unotext.hxx>
38 #include <svx/svdobj.hxx>
39 #include <svx/svdoole2.hxx>
40 #include <osl/mutex.hxx>
41 #include <comphelper/extract.hxx>
42 #include "svx/shapepropertynotifier.hxx"
43 #include <comphelper/serviceinfohelper.hxx>
44 #include <toolkit/unohlp.hxx>
45 #include <comphelper/serviceinfohelper.hxx>
46 #include <rtl/uuid.h>
47 #include <rtl/memory.h>
48 #include <vcl/gfxlink.hxx>
49 #include <vcl/virdev.hxx>
50 #include <sfx2/objsh.hxx>
51 #include <sfx2/viewsh.hxx>
52 #include "svx/svdopage.hxx"
53 #include "svx/xflbstit.hxx"
54 #include "svx/xflbmtit.hxx"
55 #include "svx/xlnstit.hxx"
56 #include "svx/xlnedit.hxx"
57 #include "svx/svdogrp.hxx"
58 #include "svx/scene3d.hxx"
59 #include "svx/svdmodel.hxx"
60 #include "svx/globl3d.hxx"
61 #include "svx/fmglob.hxx"
62 #include "svx/unopage.hxx"
63 #include "svx/view3d.hxx"
64 #include "svx/unoshape.hxx"
65 #include "svx/svxids.hrc"
66 #include "svx/unoshtxt.hxx"
67 #include "svx/svdpage.hxx"
68 #include "svx/unoshprp.hxx"
69 #include "svx/sxciaitm.hxx" // todo: remove
70 #include "svx/svdograf.hxx"
71 #include "svx/unoapi.hxx"
72 #include "svx/svdomeas.hxx"
73 #include "svx/svdpagv.hxx"
74 #include "svx/svdpool.hxx"
75 #include <tools/shl.hxx>    //
76 #include "svx/dialmgr.hxx"      // not nice, we need our own resources some day
77 #include "svx/dialogs.hrc"      //
78 #include "svx/svdocapt.hxx"
79 #include <svx/obj3d.hxx>
80 #include <tools/diagnose_ex.h>
81 #include "svx/xflftrit.hxx"
82 #include "svx/xtable.hxx"
83 #include "svx/xbtmpit.hxx"
84 #include "svx/xflgrit.hxx"
85 #include "svx/xflhtit.hxx"
86 #include "svx/xlnedit.hxx"
87 #include "svx/xlnstit.hxx"
88 #include "svx/xlndsit.hxx"
89 #include "svx/svdglob.hxx"
90 #include "svx/svdstr.hrc"
91 #include "svx/unomaster.hxx"
92 #include <editeng/outlobj.hxx>
93 #include <basegfx/matrix/b2dhommatrix.hxx>
94 #include <basegfx/matrix/b2dhommatrixtools.hxx>
95 #include <basegfx/polygon/b2dpolypolygontools.hxx>
96 
97 #include <vector>
98 
99 // #i68523#
100 #include "svx/lathe3d.hxx"
101 #include "svx/extrud3d.hxx"
102 #include "unopolyhelper.hxx"
103 
104 #include <comphelper/scopeguard.hxx>
105 #include <boost/bind.hpp>
106 
107 using ::rtl::OUString;
108 using namespace ::osl;
109 using namespace ::vos;
110 using namespace ::cppu;
111 using namespace ::com::sun::star;
112 using namespace ::com::sun::star::uno;
113 using namespace ::com::sun::star::lang;
114 using namespace ::com::sun::star::container;
115 using ::svx::PropertyValueProvider;
116 using ::svx::IPropertyValueProvider;
117 
118 #define QUERYINT( xint ) \
119     if( rType == ::getCppuType((const uno::Reference< xint >*)0) ) \
120         aAny <<= uno::Reference< xint >(this)
121 
122 class GDIMetaFile;
123 class SvStream;
124 sal_Bool ConvertGDIMetaFileToWMF( const GDIMetaFile & rMTF, SvStream & rTargetStream,
125                               FilterConfigItem* pFilterConfigItem = NULL, sal_Bool bPlaceable = sal_True );
126 
127 uno::Reference< uno::XInterface > SAL_CALL SvxUnoGluePointAccess_createInstance( SdrObject* pObject );
128 
129 /***********************************************************************
130 * class SvxShapeImpl                                                   *
131 ***********************************************************************/
132 
133 struct SvxShapeImpl
134 {
135     SvxShape&       mrAntiImpl;
136     SfxItemSet*     mpItemSet;
137     sal_uInt32      mnObjId;
138     SvxShapeMaster* mpMaster;
139     bool            mbHasSdrObjectOwnership;
140     bool            mbDisposing;
141 
142     /** CL, OD 2005-07-19 #i52126# - this is initially 0 and set when
143      *  a SvxShape::Create() call is executed. It is then set to the created
144      *  SdrObject so a multiple call to SvxShape::Create() with same SdrObject
145      *  is prohibited.
146      */
147     ::tools::WeakReference< SdrObject > mpCreatedObj;
148 
149     // for xComponent
150     ::cppu::OInterfaceContainerHelper   maDisposeListeners;
151     ::svx::PropertyChangeNotifier       maPropertyNotifier;
152 
SvxShapeImplSvxShapeImpl153     SvxShapeImpl( SvxShape& _rAntiImpl, ::osl::Mutex& _rMutex )
154         :mrAntiImpl( _rAntiImpl )
155         ,mpItemSet( NULL )
156         ,mnObjId( 0 )
157         ,mpMaster( NULL )
158         ,mbHasSdrObjectOwnership( false )
159         ,mbDisposing( false )
160         ,mpCreatedObj()
161         ,maDisposeListeners( _rMutex )
162         ,maPropertyNotifier( _rAntiImpl, _rMutex )
163     {
164     }
165 };
166 
167 /**********************************************************************/
168 class ShapePositionProvider : public PropertyValueProvider
169 {
170 public:
ShapePositionProvider(const SvxShapeImpl & _shapeImpl)171     ShapePositionProvider( const SvxShapeImpl& _shapeImpl )
172         :PropertyValueProvider( _shapeImpl.mrAntiImpl, "Position" )
173     {
174     }
175 
176 protected:
getCurrentValue(Any & _out_rCurrentValue) const177     virtual void getCurrentValue( Any& _out_rCurrentValue ) const
178     {
179         _out_rCurrentValue <<= static_cast< SvxShape& >( getContext() ).getPosition();
180     }
181 };
182 
183 //----------------------------------------------------------------------
184 class ShapeSizeProvider : public PropertyValueProvider
185 {
186 public:
ShapeSizeProvider(const SvxShapeImpl & _shapeImpl)187     ShapeSizeProvider( const SvxShapeImpl& _shapeImpl )
188         :PropertyValueProvider( _shapeImpl.mrAntiImpl, "Size" )
189     {
190     }
191 
192 protected:
getCurrentValue(Any & _out_rCurrentValue) const193     virtual void getCurrentValue( Any& _out_rCurrentValue ) const
194     {
195         _out_rCurrentValue <<= static_cast< SvxShape& >( getContext() ).getSize();
196     }
197 };
198 
199 /***********************************************************************
200 * class SvxShape                                                       *
201 ***********************************************************************/
202 
DBG_NAME(SvxShape)203 DBG_NAME(SvxShape)
204 
205 SvxShape::SvxShape( SdrObject* pObject ) throw()
206 :   maSize(100,100)
207 ,   mpImpl( new SvxShapeImpl( *this, maMutex ) )
208 ,   mbIsMultiPropertyCall(false)
209 ,   mpPropSet(aSvxMapProvider.GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool()))
210 ,   maPropMapEntries(aSvxMapProvider.GetMap(SVXMAP_SHAPE))
211 ,   mpObj(pObject)
212 ,   mpModel(NULL)
213 ,   mnLockCount(0)
214 {
215     DBG_CTOR(SvxShape,NULL);
216     impl_construct();
217 }
218 
219 //----------------------------------------------------------------------
SvxShape(SdrObject * pObject,const SfxItemPropertyMapEntry * pEntries,const SvxItemPropertySet * pPropertySet)220 SvxShape::SvxShape( SdrObject* pObject, const SfxItemPropertyMapEntry* pEntries, const SvxItemPropertySet* pPropertySet ) throw()
221 :   maSize(100,100)
222 ,   mpImpl( new SvxShapeImpl( *this, maMutex ) )
223 ,   mbIsMultiPropertyCall(false)
224 ,   mpPropSet(pPropertySet)
225 ,   maPropMapEntries(pEntries)
226 ,   mpObj(pObject)
227 ,   mpModel(NULL)
228 ,   mnLockCount(0)
229 {
230     DBG_CTOR(SvxShape,NULL);
231     impl_construct();
232 }
233 
234 //----------------------------------------------------------------------
SvxShape()235 SvxShape::SvxShape() throw()
236 :   maSize(100,100)
237 ,   mpImpl( new SvxShapeImpl( *this, maMutex ) )
238 ,   mbIsMultiPropertyCall(false)
239 ,   mpPropSet(aSvxMapProvider.GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool()))
240 ,   maPropMapEntries(aSvxMapProvider.GetMap(SVXMAP_SHAPE))
241 ,   mpObj(NULL)
242 ,   mpModel(NULL)
243 ,   mnLockCount(0)
244 {
245     DBG_CTOR(SvxShape,NULL);
246     impl_construct();
247 }
248 
249 //----------------------------------------------------------------------
~SvxShape()250 SvxShape::~SvxShape() throw()
251 {
252     OGuard aGuard( Application::GetSolarMutex() );
253 
254     DBG_ASSERT( mnLockCount == 0, "Locked shape was disposed!" );
255 
256     if ( mpModel )
257         EndListening( *mpModel );
258 
259     if ( mpImpl->mpMaster )
260         mpImpl->mpMaster->dispose();
261 
262     if ( mpObj.is() )
263         mpObj->setUnoShape( NULL, SdrObject::GrantXShapeAccess() );
264 
265     if( HasSdrObjectOwnership() && mpObj.is() )
266     {
267         mpImpl->mbHasSdrObjectOwnership = false;
268         SdrObject* pObject = mpObj.get();
269         SdrObject::Free( pObject );
270     }
271 
272     delete mpImpl, mpImpl = NULL;
273 
274     DBG_DTOR(SvxShape,NULL);
275 }
276 
277 //----------------------------------------------------------------------
278 
TakeSdrObjectOwnership()279 void SvxShape::TakeSdrObjectOwnership()
280 {
281     mpImpl->mbHasSdrObjectOwnership = true;
282 }
283 
284 //----------------------------------------------------------------------
285 
HasSdrObjectOwnership() const286 bool SvxShape::HasSdrObjectOwnership() const
287 {
288     if ( !mpImpl->mbHasSdrObjectOwnership )
289         return false;
290 
291     OSL_ENSURE( mpObj.is(), "SvxShape::HasSdrObjectOwnership: have the ownership of an object which I don't know!" );
292     return mpObj.is();
293 }
294 
295 //----------------------------------------------------------------------
296 
setShapeKind(sal_uInt32 nKind)297 void SvxShape::setShapeKind( sal_uInt32 nKind )
298 {
299     mpImpl->mnObjId = nKind;
300 }
301 
302 //----------------------------------------------------------------------
303 
getShapeKind() const304 sal_uInt32 SvxShape::getShapeKind() const
305 {
306     return mpImpl->mnObjId;
307 }
308 
309 //----------------------------------------------------------------------
310 
setMaster(SvxShapeMaster * pMaster)311 void SvxShape::setMaster( SvxShapeMaster* pMaster )
312 {
313     mpImpl->mpMaster = pMaster;
314 }
315 
getMaster()316 SvxShapeMaster* SvxShape::getMaster()
317 {
318     return mpImpl->mpMaster;
319 }
320 
getMaster() const321 const SvxShapeMaster* SvxShape::getMaster() const
322 {
323     return mpImpl->mpMaster;
324 }
325 
326 //----------------------------------------------------------------------
327 
queryAggregation(const uno::Type & rType)328 uno::Any SAL_CALL SvxShape::queryAggregation( const uno::Type& rType ) throw (uno::RuntimeException)
329 {
330     if( mpImpl->mpMaster )
331     {
332         uno::Any aAny;
333         if( mpImpl->mpMaster->queryAggregation( rType, aAny ) )
334             return aAny;
335     }
336 
337     return SvxShape_UnoImplHelper::queryAggregation(rType);
338 }
339 
340 //----------------------------------------------------------------------
getUnoTunnelId()341 const ::com::sun::star::uno::Sequence< sal_Int8 > & SvxShape::getUnoTunnelId() throw()
342 {
343     static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = 0;
344     if( !pSeq )
345     {
346         ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() );
347         if( !pSeq )
348         {
349             static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq( 16 );
350             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
351             pSeq = &aSeq;
352         }
353     }
354     return *pSeq;
355 }
356 
357 //----------------------------------------------------------------------
getImplementation(const uno::Reference<uno::XInterface> & xInt)358 SvxShape* SvxShape::getImplementation( const uno::Reference< uno::XInterface >& xInt )
359 {
360     uno::Reference< lang::XUnoTunnel > xUT( xInt, ::com::sun::star::uno::UNO_QUERY );
361     if( xUT.is() )
362         return reinterpret_cast<SvxShape*>(sal::static_int_cast<sal_uIntPtr>(xUT->getSomething( SvxShape::getUnoTunnelId())));
363     else
364         return NULL;
365 }
366 
367 //----------------------------------------------------------------------
getSomething(const::com::sun::star::uno::Sequence<sal_Int8> & rId)368 sal_Int64 SAL_CALL SvxShape::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw(::com::sun::star::uno::RuntimeException) \
369 {
370     if( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) )
371     {
372         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this));
373     }
374     else
375     {
376         return 0;
377     }
378 }
379 
380 //----------------------------------------------------------------------
GetShapeForSdrObj(SdrObject * pObj)381 SvxShape* SvxShape::GetShapeForSdrObj( SdrObject* pObj ) throw()
382 {
383     return getImplementation( pObj->getUnoShape() );
384 }
385 
386 //----------------------------------------------------------------------
getShapePropertyChangeNotifier()387 ::svx::PropertyChangeNotifier& SvxShape::getShapePropertyChangeNotifier()
388 {
389     return mpImpl->maPropertyNotifier;
390 }
391 
392 //----------------------------------------------------------------------
impl_construct()393 void SvxShape::impl_construct()
394 {
395     mpImpl->maPropertyNotifier.registerProvider( ::svx::eShapePosition,
396         ::svx::PPropertyValueProvider( new ShapePositionProvider( *mpImpl ) ) );
397     mpImpl->maPropertyNotifier.registerProvider( ::svx::eShapeSize,
398         ::svx::PPropertyValueProvider( new ShapeSizeProvider( *mpImpl ) ) );
399 
400     if ( mpObj.is() )
401         impl_initFromSdrObject();
402 }
403 
404 //----------------------------------------------------------------------
impl_initFromSdrObject()405 void SvxShape::impl_initFromSdrObject()
406 {
407     DBG_TESTSOLARMUTEX();
408     OSL_PRECOND( mpObj.is(), "SvxShape::impl_initFromSdrObject: not to be called without SdrObject!" );
409     if ( !mpObj.is() )
410         return;
411 
412     osl_incrementInterlockedCount( &m_refCount );
413     {
414         mpObj->setUnoShape( *this, SdrObject::GrantXShapeAccess() );
415     }
416     osl_decrementInterlockedCount( &m_refCount );
417 
418     mpModel = mpObj->GetModel();
419 
420     // #i40944#
421     // Do not simply return when no model but do the type corrections
422     // following below.
423     if(mpModel)
424     {
425         StartListening( *mpModel );
426     }
427 
428     const sal_uInt32 nInventor = mpObj->GetObjInventor();
429 
430     // is it one of ours (svx) ?
431     if( nInventor == SdrInventor || nInventor == E3dInventor || nInventor == FmFormInventor )
432     {
433         if(nInventor == FmFormInventor)
434         {
435             mpImpl->mnObjId = OBJ_UNO;
436         }
437         else
438         {
439             mpImpl->mnObjId = mpObj->GetObjIdentifier();
440             if( nInventor == E3dInventor )
441                 mpImpl->mnObjId |= E3D_INVENTOR_FLAG;
442         }
443 
444         switch(mpImpl->mnObjId)
445         {
446         case OBJ_CCUT:          // Kreisabschnitt
447         case OBJ_CARC:          // Kreisbogen
448         case OBJ_SECT:          // Kreissektor
449             mpImpl->mnObjId = OBJ_CIRC;
450             break;
451 
452         case E3D_SCENE_ID | E3D_INVENTOR_FLAG:
453             mpImpl->mnObjId = E3D_POLYSCENE_ID | E3D_INVENTOR_FLAG;
454             break;
455         }
456     }
457 }
458 
459 //----------------------------------------------------------------------
Create(SdrObject * pNewObj,SvxDrawPage *)460 void SvxShape::Create( SdrObject* pNewObj, SvxDrawPage* /*pNewPage*/ )
461 {
462     DBG_TESTSOLARMUTEX();
463 
464     OSL_PRECOND( pNewObj, "SvxShape::Create: invalid new object!" );
465     if ( !pNewObj )
466         return;
467 
468     SdrObject* pCreatedObj = mpImpl->mpCreatedObj.get();
469     OSL_ENSURE( ( pCreatedObj == NULL ) || ( pCreatedObj == pNewObj ),
470         "SvxShape::Create: the same shape used for two different objects?! Strange ..." );
471 
472     // --> CL, OD 2005-07-19 #i52126# - correct condition
473     if ( pCreatedObj != pNewObj )
474     // <--
475     {
476         DBG_ASSERT( pNewObj->GetModel(), "no model for SdrObject?" );
477         // --> CL, OD 2005-07-19 #i52126#
478         mpImpl->mpCreatedObj = pNewObj;
479         // <--
480 
481         if( mpObj.is() && mpObj->GetModel() )
482         {
483             EndListening( *mpObj->GetModel() );
484         }
485 
486         mpObj.reset( pNewObj );
487 
488         OSL_ENSURE( !mbIsMultiPropertyCall, "SvxShape::Create: hmm?" );
489             // this was previously set in impl_initFromSdrObject, but I think it was superfluous
490             // (it definitely was in the other context where it was called, but I strongly suppose
491             // it was also superfluous when called from here)
492         impl_initFromSdrObject();
493 
494         ObtainSettingsFromPropertySet( *mpPropSet );
495 
496         // save user call
497         SdrObjUserCall* pUser = mpObj->GetUserCall();
498         mpObj->SetUserCall(NULL);
499 
500         setPosition( maPosition );
501         setSize( maSize );
502 
503         // restore user call after we set the initial size
504         mpObj->SetUserCall( pUser );
505 
506         // if this shape was already named, use this name
507         if( maShapeName.getLength() )
508         {
509             mpObj->SetName( maShapeName );
510             maShapeName = OUString();
511         }
512     }
513 }
514 
515 //----------------------------------------------------------------------
516 
ChangeModel(SdrModel * pNewModel)517 void SvxShape::ChangeModel( SdrModel* pNewModel )
518 {
519     DBG_TESTSOLARMUTEX();
520     if( mpObj.is() && mpObj->GetModel() )
521     {
522         if( mpObj->GetModel() != pNewModel )
523         {
524             EndListening( *mpObj->GetModel() );
525         }
526     }
527 
528     // --> CL, OD 2005-07-19 #i52126# - always listen to new model
529     if( pNewModel )
530     {
531         StartListening( *pNewModel );
532     }
533     // <--
534 
535     // HACK #i53696# ChangeModel should be virtual, but it isn't. can't change that for 2.0.1
536     SvxShapeText* pShapeText = dynamic_cast< SvxShapeText* >( this );
537     if( pShapeText )
538     {
539         SvxTextEditSource* pTextEditSource = dynamic_cast< SvxTextEditSource* >( pShapeText->GetEditSource() );
540         if( pTextEditSource )
541             pTextEditSource->ChangeModel( pNewModel );
542     }
543 
544     mpModel = pNewModel;
545 
546     if( mpImpl->mpMaster )
547         mpImpl->mpMaster->modelChanged( pNewModel );
548 }
549 
550 //----------------------------------------------------------------------
551 
ForceMetricToItemPoolMetric(Pair & rPoint) const552 void SvxShape::ForceMetricToItemPoolMetric(Pair& rPoint) const throw()
553 {
554     DBG_TESTSOLARMUTEX();
555     if(mpModel)
556     {
557         SfxMapUnit eMapUnit = mpModel->GetItemPool().GetMetric(0);
558         if(eMapUnit != SFX_MAPUNIT_100TH_MM)
559         {
560             switch(eMapUnit)
561             {
562                 case SFX_MAPUNIT_TWIP :
563                 {
564                     rPoint.A() = MM_TO_TWIPS(rPoint.A());
565                     rPoint.B() = MM_TO_TWIPS(rPoint.B());
566                     break;
567                 }
568                 default:
569                 {
570                     DBG_ERROR("AW: Missing unit translation to PoolMetric!");
571                 }
572             }
573         }
574     }
575 }
576 
577 //----------------------------------------------------------------------
578 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051
ForceMetricToItemPoolMetric(basegfx::B2DPolyPolygon & rPolyPolygon) const579 void SvxShape::ForceMetricToItemPoolMetric(basegfx::B2DPolyPolygon& rPolyPolygon) const throw()
580 {
581     DBG_TESTSOLARMUTEX();
582     if(mpModel)
583     {
584         SfxMapUnit eMapUnit = mpModel->GetItemPool().GetMetric(0);
585         if(eMapUnit != SFX_MAPUNIT_100TH_MM)
586         {
587             switch(eMapUnit)
588             {
589                 case SFX_MAPUNIT_TWIP :
590                 {
591                     basegfx::B2DHomMatrix aTransform;
592                     const double fMMToTWIPS(72.0 / 127.0);
593 
594                     aTransform.scale(fMMToTWIPS, fMMToTWIPS);
595                     rPolyPolygon.transform(aTransform);
596                     break;
597                 }
598                 default:
599                 {
600                     DBG_ERROR("Missing unit translation to PoolMetric!");
601                 }
602             }
603         }
604     }
605 }
606 // <--
607 
608 //----------------------------------------------------------------------
ForceMetricTo100th_mm(Pair & rPoint) const609 void SvxShape::ForceMetricTo100th_mm(Pair& rPoint) const throw()
610 {
611     DBG_TESTSOLARMUTEX();
612     SfxMapUnit eMapUnit = SFX_MAPUNIT_100TH_MM;
613     if(mpModel)
614     {
615         eMapUnit = mpModel->GetItemPool().GetMetric(0);
616         if(eMapUnit != SFX_MAPUNIT_100TH_MM)
617         {
618             switch(eMapUnit)
619             {
620                 case SFX_MAPUNIT_TWIP :
621                 {
622                     rPoint.A() = TWIPS_TO_MM(rPoint.A());
623                     rPoint.B() = TWIPS_TO_MM(rPoint.B());
624                     break;
625                 }
626                 default:
627                 {
628                     DBG_ERROR("AW: Missing unit translation to 100th mm!");
629                 }
630             }
631         }
632     }
633 }
634 
635 //----------------------------------------------------------------------
636 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051
ForceMetricTo100th_mm(basegfx::B2DPolyPolygon & rPolyPolygon) const637 void SvxShape::ForceMetricTo100th_mm(basegfx::B2DPolyPolygon& rPolyPolygon) const throw()
638 {
639     DBG_TESTSOLARMUTEX();
640     SfxMapUnit eMapUnit = SFX_MAPUNIT_100TH_MM;
641     if(mpModel)
642     {
643         eMapUnit = mpModel->GetItemPool().GetMetric(0);
644         if(eMapUnit != SFX_MAPUNIT_100TH_MM)
645         {
646             switch(eMapUnit)
647             {
648                 case SFX_MAPUNIT_TWIP :
649                 {
650                     basegfx::B2DHomMatrix aTransform;
651                     const double fTWIPSToMM(127.0 / 72.0);
652                     aTransform.scale(fTWIPSToMM, fTWIPSToMM);
653                     rPolyPolygon.transform(aTransform);
654                     break;
655                 }
656                 default:
657                 {
658                     DBG_ERROR("Missing unit translation to 100th mm!");
659                 }
660             }
661         }
662     }
663 }
664 // <--
665 //----------------------------------------------------------------------
666 
667 
668 //----------------------------------------------------------------------
SvxItemPropertySet_ObtainSettingsFromPropertySet(const SvxItemPropertySet & rPropSet,SfxItemSet & rSet,uno::Reference<beans::XPropertySet> xSet,const SfxItemPropertyMap * pMap)669 void SvxItemPropertySet_ObtainSettingsFromPropertySet(const SvxItemPropertySet& rPropSet,
670   SfxItemSet& rSet, uno::Reference< beans::XPropertySet > xSet, const SfxItemPropertyMap* pMap )
671 {
672     if(rPropSet.AreThereOwnUsrAnys())
673     {
674         const SfxItemPropertyMap* pSrc = rPropSet.getPropertyMap();
675         PropertyEntryVector_t aSrcPropVector = pSrc->getPropertyEntries();
676         PropertyEntryVector_t::const_iterator aSrcIt = aSrcPropVector.begin();
677         while(aSrcIt != aSrcPropVector.end())
678         {
679             if(aSrcIt->nWID)
680             {
681                 uno::Any* pUsrAny = rPropSet.GetUsrAnyForID(aSrcIt->nWID);
682                 if(pUsrAny)
683                 {
684                     // Aequivalenten Eintrag in pDst suchen
685                     const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( aSrcIt->sName );
686                     if(pEntry)
687                     {
688                         // entry found
689                         if(pEntry->nWID >= OWN_ATTR_VALUE_START && pEntry->nWID <= OWN_ATTR_VALUE_END)
690                         {
691                             // Special ID im PropertySet, kann nur direkt am
692                             // Objekt gesetzt werden+
693                             xSet->setPropertyValue( aSrcIt->sName, *pUsrAny);
694                         }
695                         else
696                         {
697                             if(rSet.GetPool()->IsWhich(pEntry->nWID))
698                                 rSet.Put(rSet.GetPool()->GetDefaultItem(pEntry->nWID));
699                             // setzen
700                             SvxItemPropertySet_setPropertyValue(rPropSet, pEntry, *pUsrAny, rSet);
701                         }
702                     }
703                 }
704             }
705 
706             // next entry
707             ++aSrcIt;
708         }
709         const_cast< SvxItemPropertySet& >(rPropSet).ClearAllUsrAny();
710     }
711 }
712 
713 
ObtainSettingsFromPropertySet(const SvxItemPropertySet & rPropSet)714 void SvxShape::ObtainSettingsFromPropertySet(const SvxItemPropertySet& rPropSet)
715 {
716     DBG_TESTSOLARMUTEX();
717     if(mpObj.is() && rPropSet.AreThereOwnUsrAnys() && mpModel)
718     {
719         SfxItemSet aSet( mpModel->GetItemPool(), SDRATTR_START, SDRATTR_END, 0);
720         Reference< beans::XPropertySet > xShape( (OWeakObject*)this, UNO_QUERY );
721         SvxItemPropertySet_ObtainSettingsFromPropertySet(rPropSet, aSet, xShape, mpPropSet->getPropertyMap() );
722 
723         mpObj->SetMergedItemSetAndBroadcast(aSet);
724 
725         mpObj->ApplyNotPersistAttr( aSet );
726     }
727 }
728 
729 //----------------------------------------------------------------------
730 
GetBitmap(sal_Bool bMetaFile) const731 uno::Any SvxShape::GetBitmap( sal_Bool bMetaFile /* = sal_False */ ) const throw()
732 {
733     DBG_TESTSOLARMUTEX();
734     uno::Any aAny;
735 
736     if( !mpObj.is() || mpModel == NULL || !mpObj->IsInserted() || NULL == mpObj->GetPage() )
737         return aAny;
738 
739     VirtualDevice aVDev;
740     aVDev.SetMapMode(MapMode(MAP_100TH_MM));
741 
742     SdrModel* pModel = mpObj->GetModel();
743     SdrPage* pPage = mpObj->GetPage();
744 
745     E3dView* pView = new E3dView( pModel, &aVDev );
746     pView->hideMarkHandles();
747     SdrPageView* pPageView = pView->ShowSdrPage(pPage);
748 
749     SdrObject *pTempObj = mpObj.get();
750     pView->MarkObj(pTempObj,pPageView);
751 
752     Rectangle aRect(pTempObj->GetCurrentBoundRect());
753     aRect.Justify();
754     Size aSize(aRect.GetSize());
755 
756     GDIMetaFile aMtf( pView->GetMarkedObjMetaFile() );
757     if( bMetaFile )
758     {
759         SvMemoryStream aDestStrm( 65535, 65535 );
760         ConvertGDIMetaFileToWMF( aMtf, aDestStrm, NULL, sal_False );
761         const uno::Sequence<sal_Int8> aSeq(
762             static_cast< const sal_Int8* >(aDestStrm.GetData()),
763             aDestStrm.GetEndOfData());
764         aAny.setValue( &aSeq, ::getCppuType((const uno::Sequence< sal_Int8 >*)0) );
765     }
766     else
767     {
768         Graphic aGraph(aMtf);
769         aGraph.SetPrefSize(aSize);
770         aGraph.SetPrefMapMode(MAP_100TH_MM);
771 
772         Reference< awt::XBitmap > xBmp( aGraph.GetXGraphic(), UNO_QUERY );
773         aAny <<= xBmp;
774     }
775 
776     pView->UnmarkAll();
777     delete pView;
778 
779     return aAny;
780 }
781 
782 //----------------------------------------------------------------------
783 
getTypes()784 uno::Sequence< uno::Type > SAL_CALL SvxShape::getTypes()
785     throw (uno::RuntimeException)
786 {
787     if( mpImpl->mpMaster )
788     {
789         return mpImpl->mpMaster->getTypes();
790     }
791     else
792     {
793         return _getTypes();
794     }
795 }
796 
797 //----------------------------------------------------------------------
798 
_getTypes()799 uno::Sequence< uno::Type > SAL_CALL SvxShape::_getTypes()
800     throw(uno::RuntimeException)
801 {
802     switch( mpImpl->mnObjId )
803     {
804     // shapes without text
805     case OBJ_PAGE:
806     case OBJ_FRAME:
807     case OBJ_OLE2_PLUGIN:
808     case OBJ_OLE2_APPLET:
809     case E3D_CUBEOBJ_ID|E3D_INVENTOR_FLAG:
810     case E3D_SPHEREOBJ_ID|E3D_INVENTOR_FLAG:
811     case E3D_LATHEOBJ_ID|E3D_INVENTOR_FLAG:
812     case E3D_EXTRUDEOBJ_ID|E3D_INVENTOR_FLAG:
813     case E3D_POLYGONOBJ_ID|E3D_INVENTOR_FLAG:
814     case OBJ_MEDIA:
815         {
816             static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence;
817 
818             if( aTypeSequence.getLength() == 0 )
819             {
820                 // Ready for multithreading; get global mutex for first call of this method only! see before
821                 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
822 
823                 // Control these pointer again ... it can be, that another instance will be faster then these!
824                 if( aTypeSequence.getLength() == 0 )
825                 {
826                     aTypeSequence.realloc( 12 );
827                     uno::Type* pTypes = aTypeSequence.getArray();
828 
829                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0);
830                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0);
831                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
832                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0);
833 //                  *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0);
834                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0);
835                     *pTypes++ = beans::XMultiPropertyStates::static_type();
836                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0);
837                     *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0);
838                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0);
839                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0);
840                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0);
841                     *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0);
842                 }
843             }
844             return aTypeSequence;
845         }
846     // group shape
847     case OBJ_GRUP:
848         {
849             static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence;
850 
851             if( aTypeSequence.getLength() == 0 )
852             {
853                 // Ready for multithreading; get global mutex for first call of this method only! see before
854                 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
855 
856                 // Control these pointer again ... it can be, that another instance will be faster then these!
857                 if( aTypeSequence.getLength() == 0 )
858                 {
859                     aTypeSequence.realloc( 14 );
860                     uno::Type* pTypes = aTypeSequence.getArray();
861 
862                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0);
863                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0);
864                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
865                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0);
866 //                  *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0);
867                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0);
868                     *pTypes++ = beans::XMultiPropertyStates::static_type();
869                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0);
870                     *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0);
871                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0);
872                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0);
873                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0);
874                     *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0);
875                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShapes>*)0);
876                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShapeGroup>*)0);
877                 }
878             }
879             return aTypeSequence;
880         }
881     // connector shape
882     case OBJ_EDGE:
883         {
884             static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence;
885 
886             if( aTypeSequence.getLength() == 0 )
887             {
888                 // Ready for multithreading; get global mutex for first call of this method only! see before
889                 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
890 
891                 // Control these pointer again ... it can be, that another instance will be faster then these!
892                 if( aTypeSequence.getLength() == 0 )
893                 {
894                     aTypeSequence.realloc( 17 );
895                     uno::Type* pTypes = aTypeSequence.getArray();
896 
897                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0);
898                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0);
899                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
900                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0);
901 //                  *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0);
902                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0);
903                     *pTypes++ = beans::XMultiPropertyStates::static_type();
904                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0);
905                     *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0);
906                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0);
907                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0);
908                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0);
909                     *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0);
910                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XConnectorShape>*)0);
911                     // from SvxUnoTextBase::getTypes()
912                     *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextAppend >*)0);
913                     *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextCopy >*)0);
914                     *pTypes++ = ::getCppuType(( const uno::Reference< container::XEnumerationAccess >*)0);
915                     *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRangeMover >*)0);
916                 }
917             }
918             return aTypeSequence;
919         }
920     // control shape
921     case OBJ_UNO:
922         {
923             static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence;
924 
925             if( aTypeSequence.getLength() == 0 )
926             {
927                 // Ready for multithreading; get global mutex for first call of this method only! see before
928                 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
929 
930                 // Control these pointer again ... it can be, that another instance will be faster then these!
931                 if( aTypeSequence.getLength() == 0 )
932                 {
933                     aTypeSequence.realloc( 13 );
934                     uno::Type* pTypes = aTypeSequence.getArray();
935 
936                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0);
937                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0);
938                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
939                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0);
940 //                  *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0);
941                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0);
942                     *pTypes++ = beans::XMultiPropertyStates::static_type();
943                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0);
944                     *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0);
945                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0);
946                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0);
947                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0);
948                     *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0);
949                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XControlShape>*)0);
950                 }
951             }
952             return aTypeSequence;
953         }
954     // 3d scene shape
955     case E3D_POLYSCENE_ID|E3D_INVENTOR_FLAG:
956         {
957             static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence;
958 
959             if( aTypeSequence.getLength() == 0 )
960             {
961                 // Ready for multithreading; get global mutex for first call of this method only! see before
962                 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
963 
964                 // Control these pointer again ... it can be, that another instance will be faster then these!
965                 if( aTypeSequence.getLength() == 0 )
966                 {
967                     aTypeSequence.realloc( 13 );
968                     uno::Type* pTypes = aTypeSequence.getArray();
969 
970                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0);
971                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0);
972                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
973                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0);
974 //                  *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0);
975                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0);
976                     *pTypes++ = beans::XMultiPropertyStates::static_type();
977                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0);
978                     *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0);
979                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0);
980                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0);
981                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0);
982                     *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0);
983                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShapes>*)0);
984                 }
985             }
986             return aTypeSequence;
987         }
988     case OBJ_CUSTOMSHAPE:
989         {
990             static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence;
991 
992             if( aTypeSequence.getLength() == 0 )
993             {
994                 // Ready for multithreading; get global mutex for first call of this method only! see before
995                 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
996 
997                 // Control these pointer again ... it can be, that another instance will be faster then these!
998                 if( aTypeSequence.getLength() == 0 )
999                 {
1000                     aTypeSequence.realloc( 16 );
1001                     uno::Type* pTypes = aTypeSequence.getArray();
1002 
1003                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0);
1004                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0);
1005                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
1006                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0);
1007 //                  *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0);
1008                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0);
1009                     *pTypes++ = beans::XMultiPropertyStates::static_type();
1010                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0);
1011                     *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0);
1012                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0);
1013                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0);
1014                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0);
1015                     *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0);
1016                     // from SvxUnoTextBase::getTypes()
1017                     *pTypes++ = ::getCppuType(( const uno::Reference< text::XText >*)0);
1018                     *pTypes++ = ::getCppuType(( const uno::Reference< container::XEnumerationAccess >*)0);
1019                     *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRangeMover >*)0);
1020                     *pTypes++ = ::getCppuType(( const uno::Reference< drawing::XEnhancedCustomShapeDefaulter >*)0);
1021                 }
1022             }
1023             return aTypeSequence;
1024         }
1025     // shapes with text
1026     case OBJ_RECT:
1027     case OBJ_CIRC:
1028     case OBJ_MEASURE:
1029     case OBJ_LINE:
1030     case OBJ_POLY:
1031     case OBJ_PLIN:
1032     case OBJ_PATHLINE:
1033     case OBJ_PATHFILL:
1034     case OBJ_FREELINE:
1035     case OBJ_FREEFILL:
1036     case OBJ_PATHPOLY:
1037     case OBJ_PATHPLIN:
1038     case OBJ_GRAF:
1039     case OBJ_TEXT:
1040     case OBJ_CAPTION:
1041     case OBJ_TABLE:
1042     case OBJ_OLE2: // #i118485# Moved to shapes with text, was at (shapes without text) before, see above
1043     default:
1044         {
1045             static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence;
1046 
1047             if( aTypeSequence.getLength() == 0 )
1048             {
1049                 // Ready for multithreading; get global mutex for first call of this method only! see before
1050                 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
1051 
1052                 // Control these pointer again ... it can be, that another instance will be faster then these!
1053                 if( aTypeSequence.getLength() == 0 )
1054                 {
1055                     aTypeSequence.realloc( 16 );
1056                     uno::Type* pTypes = aTypeSequence.getArray();
1057 
1058                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0);
1059                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0);
1060                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
1061                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0);
1062 //                  *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0);
1063                     *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0);
1064                     *pTypes++ = beans::XMultiPropertyStates::static_type();
1065                     *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0);
1066                     *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0);
1067                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0);
1068                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0);
1069                     *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0);
1070                     *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0);
1071                     // from SvxUnoTextBase::getTypes()
1072                     *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextAppend >*)0);
1073                     *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextCopy >*)0);
1074                     *pTypes++ = ::getCppuType(( const uno::Reference< container::XEnumerationAccess >*)0);
1075                     *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRangeMover >*)0);
1076                 }
1077             }
1078             return aTypeSequence;
1079         }
1080     }
1081 }
1082 
1083 //----------------------------------------------------------------------
1084 
getImplementationId()1085 uno::Sequence< sal_Int8 > SAL_CALL SvxShape::getImplementationId()
1086     throw (uno::RuntimeException)
1087 {
1088     static ::cppu::OImplementationId* pID = NULL ;
1089 
1090     if ( pID == NULL )
1091     {
1092         // Ready for multithreading; get global mutex for first call of this method only! see before
1093         MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
1094 
1095         // Control these pointer again ... it can be, that another instance will be faster then these!
1096         if ( pID == NULL )
1097         {
1098             // Create a new static ID ...
1099             static ::cppu::OImplementationId aID( sal_False ) ;
1100             // ... and set his address to static pointer!
1101             pID = &aID ;
1102         }
1103     }
1104 
1105     return pID->getImplementationId() ;
1106 }
1107 
1108 //----------------------------------------------------------------------
1109 
SvxShape_NewInstance()1110 Reference< uno::XInterface > SvxShape_NewInstance()
1111 {
1112     return uno::Reference< uno::XInterface >(static_cast< OWeakObject* >( new SvxShape() ) );
1113 }
1114 
1115 //----------------------------------------------------------------------
1116 
onUserCall(SdrUserCallType,const Rectangle &)1117 void SvxShape::onUserCall(SdrUserCallType /*_eUserCall*/, const Rectangle& /*_rNewBoundRect*/ )
1118 {
1119     // obsolete, not called anymore
1120 }
1121 
1122 //----------------------------------------------------------------------
1123 // SfxListener
1124 //----------------------------------------------------------------------
1125 
Notify(SfxBroadcaster &,const SfxHint & rHint)1126 void SvxShape::Notify( SfxBroadcaster&, const SfxHint& rHint ) throw()
1127 {
1128     DBG_TESTSOLARMUTEX();
1129     if( !mpObj.is() )
1130         return;
1131 
1132     // #i55919# HINT_OBJCHG is only interesting if it's for this object
1133 
1134     const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint );
1135     if (!pSdrHint || ( /* (pSdrHint->GetKind() != HINT_OBJREMOVED)  && */
1136         (pSdrHint->GetKind() != HINT_MODELCLEARED) &&
1137         // #110094#-9 (pSdrHint->GetKind() != HINT_OBJLISTCLEAR) &&
1138         ((pSdrHint->GetKind() != HINT_OBJCHG || pSdrHint->GetObject() != mpObj.get() ))))
1139         return;
1140 
1141     uno::Reference< uno::XInterface > xSelf( mpObj->getWeakUnoShape() );
1142     if( !xSelf.is() )
1143     {
1144         mpObj.reset( NULL );
1145         return;
1146     }
1147 
1148     sal_Bool bClearMe = sal_False;
1149 
1150     switch( pSdrHint->GetKind() )
1151     {
1152         case HINT_OBJCHG:
1153         {
1154             updateShapeKind();
1155             break;
1156         }
1157         case HINT_MODELCLEARED:
1158         {
1159             bClearMe = sal_True;
1160             mpModel = NULL;
1161             break;
1162         }
1163         default:
1164             break;
1165     };
1166 
1167     if( bClearMe )
1168     {
1169         if( !HasSdrObjectOwnership() )
1170             mpObj.reset( NULL );
1171         if ( !mpImpl->mbDisposing )
1172             dispose();
1173     }
1174 }
1175 
1176 // XShape
1177 
1178 //----------------------------------------------------------------------
1179 // The "*LogicRectHack" functions also existed in sch, and those
1180 // duplicate symbols cause Bad Things To Happen (TM)  #i9462#.
1181 // Prefixing with 'svx' and marking static to make sure name collisions
1182 // do not occur.
1183 
svx_needLogicRectHack(SdrObject * pObj)1184 static sal_Bool svx_needLogicRectHack( SdrObject* pObj )
1185 {
1186     if( pObj->GetObjInventor() == SdrInventor)
1187     {
1188         switch(pObj->GetObjIdentifier())
1189         {
1190         case OBJ_GRUP:
1191         case OBJ_LINE:
1192         case OBJ_POLY:
1193         case OBJ_PLIN:
1194         case OBJ_PATHLINE:
1195         case OBJ_PATHFILL:
1196         case OBJ_FREELINE:
1197         case OBJ_FREEFILL:
1198         case OBJ_SPLNLINE:
1199         case OBJ_SPLNFILL:
1200         case OBJ_EDGE:
1201         case OBJ_PATHPOLY:
1202         case OBJ_PATHPLIN:
1203         case OBJ_MEASURE:
1204             return sal_True;
1205         }
1206     }
1207     return sal_False;
1208 }
1209 
1210 //----------------------------------------------------------------------
1211 
svx_getLogicRectHack(SdrObject * pObj)1212 static Rectangle svx_getLogicRectHack( SdrObject* pObj )
1213 {
1214     if(svx_needLogicRectHack(pObj))
1215     {
1216         return pObj->GetSnapRect();
1217     }
1218     else
1219     {
1220         return pObj->GetLogicRect();
1221     }
1222 }
1223 
1224 //----------------------------------------------------------------------
1225 
svx_setLogicRectHack(SdrObject * pObj,const Rectangle & rRect)1226 static void svx_setLogicRectHack( SdrObject* pObj, const Rectangle& rRect )
1227 {
1228     if(svx_needLogicRectHack(pObj))
1229     {
1230         pObj->SetSnapRect( rRect );
1231     }
1232     else
1233     {
1234         pObj->SetLogicRect( rRect );
1235     }
1236 }
1237 
1238 //----------------------------------------------------------------------
1239 
getPosition()1240 awt::Point SAL_CALL SvxShape::getPosition() throw(uno::RuntimeException)
1241 {
1242     OGuard aGuard( Application::GetSolarMutex() );
1243 
1244     if( mpObj.is() && mpModel)
1245     {
1246         Rectangle aRect( svx_getLogicRectHack(mpObj.get()) );
1247         Point aPt( aRect.Left(), aRect.Top() );
1248 
1249         // Position is relativ to anchor, so recalc to absolut position
1250         if( mpModel->IsWriter() )
1251             aPt -= mpObj->GetAnchorPos();
1252 
1253         ForceMetricTo100th_mm(aPt);
1254         return ::com::sun::star::awt::Point( aPt.X(), aPt.Y() );
1255     }
1256     else
1257     {
1258         return maPosition;
1259     }
1260 }
1261 
1262 //----------------------------------------------------------------------
setPosition(const awt::Point & Position)1263 void SAL_CALL SvxShape::setPosition( const awt::Point& Position ) throw(uno::RuntimeException)
1264 {
1265     OGuard aGuard( Application::GetSolarMutex() );
1266 
1267     if( mpObj.is() && mpModel )
1268     {
1269         // do NOT move 3D objects, this would change the homogen
1270         // transformation matrix
1271         if(!mpObj->ISA(E3dCompoundObject))
1272         {
1273             Rectangle aRect( svx_getLogicRectHack(mpObj.get()) );
1274             Point aLocalPos( Position.X, Position.Y );
1275             ForceMetricToItemPoolMetric(aLocalPos);
1276 
1277             // Position ist absolut, relativ zum Anker stellen
1278             if( mpModel->IsWriter() )
1279                 aLocalPos += mpObj->GetAnchorPos();
1280 
1281             long nDX = aLocalPos.X() - aRect.Left();
1282             long nDY = aLocalPos.Y() - aRect.Top();
1283 
1284             mpObj->Move( Size( nDX, nDY ) );
1285             mpModel->SetChanged();
1286         }
1287     }
1288 
1289     maPosition = Position;
1290 }
1291 
1292 //----------------------------------------------------------------------
getSize()1293 awt::Size SAL_CALL SvxShape::getSize() throw(uno::RuntimeException)
1294 {
1295     OGuard aGuard( Application::GetSolarMutex() );
1296 
1297     if( mpObj.is() && mpModel)
1298     {
1299         Rectangle aRect( svx_getLogicRectHack(mpObj.get()) );
1300         Size aObjSize( aRect.getWidth(), aRect.getHeight() );
1301         ForceMetricTo100th_mm(aObjSize);
1302         return ::com::sun::star::awt::Size( aObjSize.getWidth(), aObjSize.getHeight() );
1303     }
1304     else
1305         return maSize;
1306 }
1307 
1308 //----------------------------------------------------------------------
setSize(const awt::Size & rSize)1309 void SAL_CALL SvxShape::setSize( const awt::Size& rSize )
1310     throw(beans::PropertyVetoException, uno::RuntimeException)
1311 {
1312     OGuard aGuard( Application::GetSolarMutex() );
1313 
1314     if( mpObj.is() && mpModel)
1315     {
1316         // #123539# optimization for 3D chart object generation: do not use UNO
1317         // API commmands to get the range, this is too expensive since for 3D
1318         // scenes it may recalculate the whole scene since in AOO this depends
1319         // on the contained geometry (layouted to show all content)
1320         const bool b3DConstruction(dynamic_cast< E3dObject* >(mpObj.get()) && mpModel->isLocked());
1321         Rectangle aRect(
1322             b3DConstruction ?
1323                 Rectangle(maPosition.X, maPosition.Y, maSize.Width, maSize.Height) :
1324                 svx_getLogicRectHack(mpObj.get()) );
1325         Size aLocalSize( rSize.Width, rSize.Height );
1326         ForceMetricToItemPoolMetric(aLocalSize);
1327 
1328         if(mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_MEASURE )
1329         {
1330             Fraction aWdt(aLocalSize.Width(),aRect.Right()-aRect.Left());
1331             Fraction aHgt(aLocalSize.Height(),aRect.Bottom()-aRect.Top());
1332             Point aPt = mpObj->GetSnapRect().TopLeft();
1333             mpObj->Resize(aPt,aWdt,aHgt);
1334         }
1335         else
1336         {
1337             //aRect.SetSize(aLocalSize); // this call substract 1 // http://www.openoffice.org/issues/show_bug.cgi?id=83193
1338             if ( !aLocalSize.Width() )
1339             {
1340                 aRect.Right() = RECT_EMPTY;
1341             }
1342             else
1343                 aRect.setWidth(aLocalSize.Width());
1344             if ( !aLocalSize.Height() )
1345             {
1346                 aRect.Bottom() = RECT_EMPTY;
1347             }
1348             else
1349                 aRect.setHeight(aLocalSize.Height());
1350 
1351             svx_setLogicRectHack( mpObj.get(), aRect );
1352         }
1353 
1354         mpModel->SetChanged();
1355     }
1356     maSize = rSize;
1357 }
1358 
1359 //----------------------------------------------------------------------
1360 
1361 // XNamed
getName()1362 OUString SAL_CALL SvxShape::getName(  ) throw(::com::sun::star::uno::RuntimeException)
1363 {
1364     OGuard aGuard( Application::GetSolarMutex() );
1365     if( mpObj.is() )
1366     {
1367         return mpObj->GetName();
1368     }
1369     else
1370     {
1371         return maShapeName;
1372     }
1373 }
1374 
1375 //----------------------------------------------------------------------
1376 
setName(const::rtl::OUString & aName)1377 void SAL_CALL SvxShape::setName( const ::rtl::OUString& aName ) throw(::com::sun::star::uno::RuntimeException)
1378 {
1379     OGuard aGuard( Application::GetSolarMutex() );
1380     if( mpObj.is() )
1381     {
1382         mpObj->SetName( aName );
1383     }
1384     else
1385     {
1386         maShapeName = aName;
1387     }
1388 }
1389 
1390 // XShapeDescriptor
1391 
1392 //----------------------------------------------------------------------
getShapeType()1393 OUString SAL_CALL SvxShape::getShapeType() throw(uno::RuntimeException)
1394 {
1395     if( 0 == maShapeType.getLength() )
1396     {
1397         UHashMapEntry* pMap = pSdrShapeIdentifierMap;
1398         while ( ( pMap->nId != mpImpl->mnObjId ) && pMap->aIdentifier.getLength() )
1399             ++pMap;
1400 
1401         if ( pMap->aIdentifier.getLength() )
1402         {
1403             return pMap->aIdentifier;
1404         }
1405         else
1406         {
1407             DBG_ERROR("[CL] unknown SdrObjekt identifier");
1408         }
1409     }
1410 
1411     return maShapeType;
1412 }
1413 
1414 // XComponent
1415 
1416 //----------------------------------------------------------------------
dispose()1417 void SAL_CALL SvxShape::dispose() throw(uno::RuntimeException)
1418 {
1419     OGuard aGuard( Application::GetSolarMutex() );
1420 
1421     if( mpImpl->mbDisposing )
1422         return; // caught a recursion
1423 
1424     mpImpl->mbDisposing = true;
1425 
1426     lang::EventObject aEvt;
1427     aEvt.Source = *(OWeakAggObject*) this;
1428     mpImpl->maDisposeListeners.disposeAndClear(aEvt);
1429     mpImpl->maPropertyNotifier.disposing();
1430 
1431     if ( mpObj.is() )
1432     {
1433         bool bFreeSdrObject = false;
1434 
1435         if ( mpObj->IsInserted() && mpObj->GetPage() )
1436         {
1437             OSL_ENSURE( HasSdrObjectOwnership(), "SvxShape::dispose: is the below code correct?" );
1438                 // normally, we are allowed to free the SdrObject only if we have its ownership.
1439                 // Why isn't this checked here?
1440 
1441             SdrPage* pPage = mpObj->GetPage();
1442             // SdrObject aus der Page loeschen
1443             sal_uInt32 nCount = pPage->GetObjCount();
1444             for ( sal_uInt32 nNum = 0; nNum < nCount; ++nNum )
1445             {
1446                 if ( pPage->GetObj( nNum ) == mpObj.get() )
1447                 {
1448                     OSL_VERIFY( pPage->RemoveObject( nNum ) == mpObj.get() );
1449                     bFreeSdrObject = true;
1450                     break;
1451                 }
1452             }
1453         }
1454 
1455         mpObj->setUnoShape( NULL, SdrObject::GrantXShapeAccess() );
1456 
1457         if ( bFreeSdrObject )
1458         {
1459             // in case we have the ownership of the SdrObject, a Free
1460             // would do nothing. So ensure the ownership is reset.
1461             mpImpl->mbHasSdrObjectOwnership = false;
1462             SdrObject* pObject = mpObj.get();
1463             SdrObject::Free( pObject );
1464         }
1465     }
1466 
1467     if( mpModel )
1468     {
1469         EndListening( *mpModel );
1470         mpModel = NULL;
1471     }
1472 }
1473 
1474 //----------------------------------------------------------------------
1475 
addEventListener(const Reference<lang::XEventListener> & xListener)1476 void SAL_CALL SvxShape::addEventListener( const Reference< lang::XEventListener >& xListener )
1477     throw(uno::RuntimeException)
1478 {
1479     mpImpl->maDisposeListeners.addInterface(xListener);
1480 }
1481 
1482 //----------------------------------------------------------------------
1483 
removeEventListener(const Reference<lang::XEventListener> & aListener)1484 void SAL_CALL SvxShape::removeEventListener( const Reference< lang::XEventListener >& aListener ) throw(uno::RuntimeException)
1485 {
1486    mpImpl->maDisposeListeners.removeInterface(aListener);
1487 }
1488 
1489 // XPropertySet
1490 
1491 //----------------------------------------------------------------------
1492 
1493 Reference< beans::XPropertySetInfo > SAL_CALL
getPropertySetInfo()1494     SvxShape::getPropertySetInfo() throw(uno::RuntimeException)
1495 {
1496     if( mpImpl->mpMaster )
1497     {
1498         return mpImpl->mpMaster->getPropertySetInfo();
1499     }
1500     else
1501     {
1502         return _getPropertySetInfo();
1503     }
1504 }
1505 
1506 Reference< beans::XPropertySetInfo > SAL_CALL
_getPropertySetInfo()1507     SvxShape::_getPropertySetInfo() throw(uno::RuntimeException)
1508 {
1509     return mpPropSet->getPropertySetInfo();
1510 }
1511 
1512 //----------------------------------------------------------------------
1513 
addPropertyChangeListener(const OUString & _propertyName,const Reference<beans::XPropertyChangeListener> & _listener)1514 void SAL_CALL SvxShape::addPropertyChangeListener( const OUString& _propertyName, const Reference< beans::XPropertyChangeListener >& _listener  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1515 {
1516     ::osl::MutexGuard aGuard( maMutex );
1517     mpImpl->maPropertyNotifier.addPropertyChangeListener( _propertyName, _listener );
1518 }
1519 
1520 //----------------------------------------------------------------------
1521 
removePropertyChangeListener(const OUString & _propertyName,const Reference<beans::XPropertyChangeListener> & _listener)1522 void SAL_CALL SvxShape::removePropertyChangeListener( const OUString& _propertyName, const Reference< beans::XPropertyChangeListener >& _listener  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1523 {
1524     ::osl::MutexGuard aGuard( maMutex );
1525     mpImpl->maPropertyNotifier.removePropertyChangeListener( _propertyName, _listener );
1526 }
1527 
1528 //----------------------------------------------------------------------
1529 
addVetoableChangeListener(const OUString &,const Reference<beans::XVetoableChangeListener> &)1530 void SAL_CALL SvxShape::addVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1531 {
1532     OSL_ENSURE( false, "SvxShape::addVetoableChangeListener: don't have any vetoable properties, so why ...?" );
1533 }
1534 
1535 //----------------------------------------------------------------------
1536 
removeVetoableChangeListener(const OUString &,const Reference<beans::XVetoableChangeListener> &)1537 void SAL_CALL SvxShape::removeVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1538 {
1539     OSL_ENSURE( false, "SvxShape::removeVetoableChangeListener: don't have any vetoable properties, so why ...?" );
1540 }
1541 
1542 //----------------------------------------------------------------------
1543 
SetFillAttribute(sal_Int32 nWID,const OUString & rName)1544 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const OUString& rName )
1545 {
1546     SfxItemSet aSet( mpModel->GetItemPool(),    (sal_uInt16)nWID, (sal_uInt16)nWID );
1547 
1548     if( SetFillAttribute( nWID, rName, aSet, mpModel ) )
1549     {
1550         //mpObj->SetItemSetAndBroadcast(aSet);
1551         mpObj->SetMergedItemSetAndBroadcast(aSet);
1552 
1553         return sal_True;
1554     }
1555     else
1556     {
1557         return sal_False;
1558     }
1559 }
1560 
1561 //----------------------------------------------------------------------
1562 
SetFillAttribute(sal_Int32 nWID,const::rtl::OUString & rName,SfxItemSet & rSet,SdrModel * pModel)1563 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const ::rtl::OUString& rName, SfxItemSet& rSet, SdrModel* pModel )
1564 {
1565     // check if an item with the given name and which id is inside the models
1566     // pool or the stylesheet pool, if found its puttet in the itemse
1567     if( !SetFillAttribute( nWID, rName, rSet ) )
1568     {
1569         // we did not find such item in one of the pools, so we check
1570         // the property lists that are loaded for the model for items
1571         // that support such.
1572         String aStrName;
1573         SvxUnogetInternalNameForItem( (sal_Int16)nWID, rName, aStrName );
1574 
1575         switch( nWID )
1576         {
1577         case XATTR_FILLBITMAP:
1578         {
1579             XBitmapListSharedPtr aBitmapList = pModel->GetBitmapListFromSdrModel();
1580 
1581             if( !aBitmapList.get() )
1582                 return sal_False;
1583 
1584             long nPos = aBitmapList->GetIndex(aStrName);
1585             if( nPos == -1 )
1586                 return sal_False;
1587 
1588             XBitmapEntry* pEntry = aBitmapList->GetBitmap( nPos );
1589             XFillBitmapItem aBmpItem;
1590             aBmpItem.SetWhich( XATTR_FILLBITMAP );
1591             aBmpItem.SetName( rName );
1592             aBmpItem.SetGraphicObject(pEntry->GetGraphicObject());
1593             rSet.Put( aBmpItem );
1594             break;
1595         }
1596         case XATTR_FILLGRADIENT:
1597         {
1598             XGradientListSharedPtr aGradientList = pModel->GetGradientListFromSdrModel();
1599 
1600             if( !aGradientList.get() )
1601                 return sal_False;
1602 
1603             long nPos = aGradientList->GetIndex(aStrName);
1604             if( nPos == -1 )
1605                 return sal_False;
1606 
1607             XGradientEntry* pEntry = aGradientList->GetGradient( nPos );
1608             XFillGradientItem aGrdItem;
1609             aGrdItem.SetWhich( XATTR_FILLGRADIENT );
1610             aGrdItem.SetName( rName );
1611             aGrdItem.SetGradientValue( pEntry->GetGradient() );
1612             rSet.Put( aGrdItem );
1613             break;
1614         }
1615         case XATTR_FILLHATCH:
1616         {
1617             XHatchListSharedPtr aHatchList = pModel->GetHatchListFromSdrModel();
1618 
1619             if( !aHatchList.get() )
1620                 return sal_False;
1621 
1622             long nPos = aHatchList->GetIndex(aStrName);
1623             if( nPos == -1 )
1624                 return sal_False;
1625 
1626             XHatchEntry* pEntry = aHatchList->GetHatch( nPos );
1627             XFillHatchItem aHatchItem;
1628             aHatchItem.SetWhich( XATTR_FILLHATCH );
1629             aHatchItem.SetName( rName );
1630             aHatchItem.SetHatchValue( pEntry->GetHatch() );
1631             rSet.Put( aHatchItem );
1632             break;
1633         }
1634         case XATTR_LINEEND:
1635         case XATTR_LINESTART:
1636         {
1637             XLineEndListSharedPtr aLineEndList = pModel->GetLineEndListFromSdrModel();
1638 
1639             if( !aLineEndList.get() )
1640                 return sal_False;
1641 
1642             long nPos = aLineEndList->GetIndex(aStrName);
1643             if( nPos == -1 )
1644                 return sal_False;
1645 
1646             XLineEndEntry* pEntry = aLineEndList->GetLineEnd( nPos );
1647             if( XATTR_LINEEND == nWID )
1648             {
1649                 XLineEndItem aLEItem;
1650                 aLEItem.SetWhich( XATTR_LINEEND );
1651                 aLEItem.SetName( rName );
1652                 aLEItem.SetLineEndValue( pEntry->GetLineEnd() );
1653                 rSet.Put( aLEItem );
1654             }
1655             else
1656             {
1657                 XLineStartItem aLSItem;
1658                 aLSItem.SetWhich( XATTR_LINESTART );
1659                 aLSItem.SetName( rName );
1660                 aLSItem.SetLineStartValue( pEntry->GetLineEnd() );
1661                 rSet.Put( aLSItem );
1662             }
1663 
1664             break;
1665         }
1666         case XATTR_LINEDASH:
1667         {
1668             XDashListSharedPtr aDashList = pModel->GetDashListFromSdrModel();
1669 
1670             if( !aDashList.get() )
1671                 return sal_False;
1672 
1673             long nPos = aDashList->GetIndex(aStrName);
1674             if( nPos == -1 )
1675                 return sal_False;
1676 
1677             XDashEntry* pEntry = aDashList->GetDash( nPos );
1678             XLineDashItem aDashItem;
1679             aDashItem.SetWhich( XATTR_LINEDASH );
1680             aDashItem.SetName( rName );
1681             aDashItem.SetDashValue( pEntry->GetDash() );
1682             rSet.Put( aDashItem );
1683             break;
1684         }
1685         default:
1686             return sal_False;
1687         }
1688     }
1689 
1690     return sal_True;
1691 }
1692 
1693 //----------------------------------------------------------------------
1694 
SetFillAttribute(sal_Int32 nWID,const OUString & rName,SfxItemSet & rSet)1695 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const OUString& rName, SfxItemSet& rSet )
1696 {
1697     String aName;
1698     SvxUnogetInternalNameForItem( (sal_Int16)nWID, rName, aName );
1699 
1700     if( aName.Len() == 0 )
1701     {
1702         switch( nWID )
1703         {
1704         case XATTR_LINEEND:
1705         case XATTR_LINESTART:
1706             {
1707                 const String aEmpty;
1708                 const basegfx::B2DPolyPolygon aEmptyPoly;
1709                 if( nWID == XATTR_LINEEND )
1710                     rSet.Put( XLineEndItem( aEmpty, aEmptyPoly ) );
1711                 else
1712                     rSet.Put( XLineStartItem( aEmpty, aEmptyPoly ) );
1713 
1714                 return sal_True;
1715             }
1716         case XATTR_FILLFLOATTRANSPARENCE:
1717             {
1718                 // #85953# Set a disabled XFillFloatTransparenceItem
1719                 rSet.Put(XFillFloatTransparenceItem());
1720 
1721                 return sal_True;
1722             }
1723         }
1724 
1725         return sal_False;
1726     }
1727 
1728     const SfxItemPool* pPool = rSet.GetPool();
1729 
1730     const String aSearchName( aName );
1731     const sal_uInt32 nCount = pPool->GetItemCount2((sal_uInt16)nWID);
1732     const NameOrIndex* pItem;
1733 
1734     for( sal_uInt32 nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1735     {
1736         pItem = (NameOrIndex*)pPool->GetItem2((sal_uInt16)nWID, nSurrogate);
1737         if( pItem && ( pItem->GetName() == aSearchName ) )
1738         {
1739             rSet.Put( *pItem );
1740             return sal_True;
1741         }
1742     }
1743 
1744     return sal_False;
1745 }
1746 
1747 //----------------------------------------------------------------------
1748 
setPropertyValue(const OUString & rPropertyName,const uno::Any & rVal)1749 void SAL_CALL SvxShape::setPropertyValue( const OUString& rPropertyName, const uno::Any& rVal )
1750     throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
1751 {
1752     if( mpImpl->mpMaster )
1753     {
1754         mpImpl->mpMaster->setPropertyValue( rPropertyName, rVal );
1755     }
1756     else
1757     {
1758         _setPropertyValue( rPropertyName, rVal );
1759     }
1760 }
1761 
_setPropertyValue(const OUString & rPropertyName,const uno::Any & rVal)1762 void SAL_CALL SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& rVal )
1763     throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
1764 {
1765     OGuard aGuard( Application::GetSolarMutex() );
1766 
1767     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(rPropertyName);
1768 
1769     if( mpObj.is() && mpModel )
1770     {
1771         if( pMap == NULL )
1772             throw beans::UnknownPropertyException();
1773 
1774         if( (pMap->nFlags & beans::PropertyAttribute::READONLY ) != 0 )
1775             throw beans::PropertyVetoException();
1776 
1777         mpModel->SetChanged();
1778 
1779         if(!setPropertyValueImpl( rPropertyName, pMap, rVal ) )
1780         {
1781             DBG_ASSERT( pMap->nWID == SDRATTR_TEXTDIRECTION || pMap->nWID < SDRATTR_NOTPERSIST_FIRST || pMap->nWID > SDRATTR_NOTPERSIST_LAST, "Not persist item not handled!" );
1782             DBG_ASSERT( pMap->nWID < OWN_ATTR_VALUE_START || pMap->nWID > OWN_ATTR_VALUE_END, "Not item property not handled!" );
1783 
1784             sal_Bool bIsNotPersist = pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST && pMap->nWID != SDRATTR_TEXTDIRECTION;
1785 
1786             if( pMap->nWID == SDRATTR_ECKENRADIUS )
1787             {
1788                 sal_Int32 nCornerRadius = 0;
1789                 if( !(rVal >>= nCornerRadius) || (nCornerRadius < 0) || (nCornerRadius > 5000000))
1790                     throw IllegalArgumentException();
1791             }
1792 
1793             SfxItemSet* pSet;
1794             if( mbIsMultiPropertyCall && !bIsNotPersist )
1795             {
1796                 if( mpImpl->mpItemSet == NULL )
1797                 {
1798                     pSet = mpImpl->mpItemSet = mpObj->GetMergedItemSet().Clone();
1799                 }
1800                 else
1801                 {
1802                     pSet = mpImpl->mpItemSet;
1803                 }
1804             }
1805             else
1806             {
1807                 pSet = new SfxItemSet( mpModel->GetItemPool(),  pMap->nWID, pMap->nWID);
1808             }
1809 
1810             if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET )
1811                 pSet->Put(mpObj->GetMergedItem(pMap->nWID));
1812 
1813             if( !SvxUnoTextRangeBase::SetPropertyValueHelper( *pSet, pMap, rVal, *pSet ))
1814             {
1815                 if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET )
1816                 {
1817                     if(bIsNotPersist)
1818                     {
1819                         // Not-Persistant Attribute, hole diese extra
1820                         mpObj->TakeNotPersistAttr(*pSet, sal_False);
1821                     }
1822                 }
1823 
1824                 if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET )
1825                 {
1826                     // Default aus ItemPool holen
1827                     if(mpModel->GetItemPool().IsWhich(pMap->nWID))
1828                         pSet->Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID));
1829                 }
1830 
1831                 if( pSet->GetItemState( pMap->nWID ) == SFX_ITEM_SET )
1832                 {
1833                     SvxItemPropertySet_setPropertyValue( *mpPropSet, pMap, rVal, *pSet );
1834                 }
1835             }
1836 
1837             if(bIsNotPersist)
1838             {
1839                 // Not-Persist Attribute extra setzen
1840                 mpObj->ApplyNotPersistAttr( *pSet );
1841                 delete pSet;
1842             }
1843             else
1844             {
1845                 // if we have a XMultiProperty call then the item set
1846                 // will be set in setPropertyValues later
1847                 if( !mbIsMultiPropertyCall )
1848                 {
1849                     mpObj->SetMergedItemSetAndBroadcast( *pSet );
1850 
1851                     delete pSet;
1852                 }
1853             }
1854             return;
1855         }
1856     }
1857     else
1858     {
1859         // since we have no actual sdr object right now
1860         // remember all properties in a list. These
1861         // properties will be set when the sdr object is
1862         // created
1863 
1864         if(pMap && pMap->nWID)
1865 // Fixme: We should throw a UnknownPropertyException here.
1866 //        But since this class is aggregated from classes
1867 //        that support additional properties that we don't
1868 //        know here we silently store *all* properties, even
1869 //        if they may be not supported after creation
1870             mpPropSet->setPropertyValue( pMap, rVal );
1871     }
1872 }
1873 
1874 //----------------------------------------------------------------------
1875 
getPropertyValue(const OUString & PropertyName)1876 uno::Any SAL_CALL SvxShape::getPropertyValue( const OUString& PropertyName )
1877     throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1878 {
1879     if ( mpImpl->mpMaster )
1880         return mpImpl->mpMaster->getPropertyValue( PropertyName );
1881     else
1882         return _getPropertyValue( PropertyName );
1883 }
1884 
1885 //----------------------------------------------------------------------
1886 
_getPropertyValue(const OUString & PropertyName)1887 uno::Any SvxShape::_getPropertyValue( const OUString& PropertyName )
1888     throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1889 {
1890     OGuard aGuard( Application::GetSolarMutex() );
1891 
1892     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName);
1893 
1894     uno::Any aAny;
1895     if( mpObj.is() && mpModel )
1896     {
1897         if(pMap == NULL )
1898             throw beans::UnknownPropertyException();
1899 
1900         if( !getPropertyValueImpl( PropertyName, pMap, aAny ) )
1901         {
1902             DBG_ASSERT( pMap->nWID == SDRATTR_TEXTDIRECTION || (pMap->nWID < SDRATTR_NOTPERSIST_FIRST || pMap->nWID > SDRATTR_NOTPERSIST_LAST), "Not persist item not handled!" );
1903             DBG_ASSERT( pMap->nWID < OWN_ATTR_VALUE_START || pMap->nWID > OWN_ATTR_VALUE_END, "Not item property not handled!" );
1904 
1905             SfxItemSet aSet( mpModel->GetItemPool(),    pMap->nWID, pMap->nWID);
1906             aSet.Put(mpObj->GetMergedItem(pMap->nWID));
1907 
1908             if(SvxUnoTextRangeBase::GetPropertyValueHelper(  aSet, pMap, aAny ))
1909                 return aAny;
1910 
1911             if(!aSet.Count())
1912             {
1913                 if(pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST)
1914                 {
1915                     // Not-Persistant Attribute, hole diese extra
1916                     mpObj->TakeNotPersistAttr(aSet, sal_False);
1917                 }
1918             }
1919 
1920             if(!aSet.Count())
1921             {
1922                 // Default aus ItemPool holen
1923                 if(mpModel->GetItemPool().IsWhich(pMap->nWID))
1924                     aSet.Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID));
1925             }
1926 
1927             if(aSet.Count())
1928                 aAny = GetAnyForItem( aSet, pMap );
1929         }
1930     }
1931     else
1932     {
1933 
1934 // Fixme: we should return default values for OWN_ATTR !
1935 
1936         if(pMap && pMap->nWID)
1937 //      FixMe: see setPropertyValue
1938             aAny = mpPropSet->getPropertyValue( pMap );
1939 
1940     }
1941     return aAny;
1942 }
1943 
1944 //----------------------------------------------------------------------
1945 
1946 // XMultiPropertySet
setPropertyValues(const::com::sun::star::uno::Sequence<::rtl::OUString> & aPropertyNames,const::com::sun::star::uno::Sequence<::com::sun::star::uno::Any> & aValues)1947 void SAL_CALL SvxShape::setPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aValues ) throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
1948 {
1949     OGuard aSolarGuard( Application::GetSolarMutex() );
1950 
1951     const sal_Int32 nCount = aPropertyNames.getLength();
1952     const OUString* pNames = aPropertyNames.getConstArray();
1953 
1954     const uno::Any* pValues = aValues.getConstArray();
1955 
1956     // make sure mbIsMultiPropertyCall and mpImpl->mpItemSet are
1957     // reseted even when an execption is thrown
1958     const ::comphelper::ScopeGuard aGuard( boost::bind( &SvxShape::endSetPropertyValues, this ) );
1959 
1960     mbIsMultiPropertyCall = sal_True;
1961 
1962     if( mpImpl->mpMaster )
1963     {
1964         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pValues++ )
1965         {
1966             try
1967             {
1968                 setPropertyValue( *pNames, *pValues );
1969             }
1970             catch( beans::UnknownPropertyException& e )
1971             {
1972                 (void)e;
1973             }
1974             catch( uno::Exception& ex )
1975             {
1976                 (void)ex;
1977             }
1978         }
1979     }
1980     else
1981     {
1982         uno::Reference< beans::XPropertySet > xSet;
1983         queryInterface( ::getCppuType( (const uno::Reference< beans::XPropertySet >*) 0) ) >>= xSet;
1984 
1985         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pValues++ )
1986         {
1987             try
1988             {
1989                 xSet->setPropertyValue( *pNames, *pValues );
1990             }
1991             catch( beans::UnknownPropertyException& e )
1992             {
1993                 (void)e;
1994             }
1995             catch( uno::Exception& ex )
1996             {
1997                 (void)ex;
1998             }
1999         }
2000     }
2001 
2002     if( mpImpl->mpItemSet && mpObj.is() )
2003         mpObj->SetMergedItemSetAndBroadcast( *mpImpl->mpItemSet );
2004 }
2005 
2006 //----------------------------------------------------------------------
2007 
endSetPropertyValues()2008 void SvxShape::endSetPropertyValues()
2009 {
2010     mbIsMultiPropertyCall = sal_False;
2011     if( mpImpl->mpItemSet )
2012     {
2013         delete mpImpl->mpItemSet;
2014         mpImpl->mpItemSet = 0;
2015     }
2016 }
2017 
2018 //----------------------------------------------------------------------
2019 
getPropertyValues(const::com::sun::star::uno::Sequence<::rtl::OUString> & aPropertyNames)2020 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > SAL_CALL SvxShape::getPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames ) throw (::com::sun::star::uno::RuntimeException)
2021 {
2022     const sal_Int32 nCount = aPropertyNames.getLength();
2023     const OUString* pNames = aPropertyNames.getConstArray();
2024 
2025     uno::Sequence< uno::Any > aRet( nCount );
2026     uno::Any* pValue = aRet.getArray();;
2027 
2028     if( mpImpl->mpMaster )
2029     {
2030         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pValue++, pNames++ )
2031         {
2032             try
2033             {
2034                 *pValue = getPropertyValue( *pNames );
2035             }
2036             catch( uno::Exception& )
2037             {
2038                 DBG_ERROR( "SvxShape::getPropertyValues, unknown property asked" );
2039             }
2040         }
2041     }
2042     else
2043     {
2044         uno::Reference< beans::XPropertySet > xSet;
2045         queryInterface( ::getCppuType( (const uno::Reference< beans::XPropertySet >*) 0) ) >>= xSet;
2046 
2047         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pValue++, pNames++ )
2048         {
2049             try
2050             {
2051                 *pValue = xSet->getPropertyValue( *pNames );
2052             }
2053             catch( uno::Exception& )
2054             {
2055                 DBG_ERROR( "SvxShape::getPropertyValues, unknown property asked" );
2056             }
2057         }
2058     }
2059 
2060     return aRet;
2061 }
2062 
addPropertiesChangeListener(const::com::sun::star::uno::Sequence<::rtl::OUString> &,const::com::sun::star::uno::Reference<::com::sun::star::beans::XPropertiesChangeListener> &)2063 void SAL_CALL SvxShape::addPropertiesChangeListener( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >&  ) throw (::com::sun::star::uno::RuntimeException)
2064 {
2065 }
2066 
removePropertiesChangeListener(const::com::sun::star::uno::Reference<::com::sun::star::beans::XPropertiesChangeListener> &)2067 void SAL_CALL SvxShape::removePropertiesChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >&  ) throw (::com::sun::star::uno::RuntimeException)
2068 {
2069 }
2070 
firePropertiesChangeEvent(const::com::sun::star::uno::Sequence<::rtl::OUString> &,const::com::sun::star::uno::Reference<::com::sun::star::beans::XPropertiesChangeListener> &)2071 void SAL_CALL SvxShape::firePropertiesChangeEvent( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >&  ) throw (::com::sun::star::uno::RuntimeException)
2072 {
2073 }
2074 
2075 //----------------------------------------------------------------------
2076 
GetAnyForItem(SfxItemSet & aSet,const SfxItemPropertySimpleEntry * pMap) const2077 uno::Any SvxShape::GetAnyForItem( SfxItemSet& aSet, const SfxItemPropertySimpleEntry* pMap ) const
2078 {
2079     DBG_TESTSOLARMUTEX();
2080     uno::Any aAny;
2081 
2082     switch(pMap->nWID)
2083     {
2084     case SDRATTR_CIRCSTARTANGLE:
2085     {
2086         const SfxPoolItem* pPoolItem=NULL;
2087         if(aSet.GetItemState(SDRATTR_CIRCSTARTANGLE,sal_False,&pPoolItem)==SFX_ITEM_SET)
2088         {
2089             sal_Int32 nAngle = ((SdrCircStartAngleItem*)pPoolItem)->GetValue();
2090             aAny <<= nAngle;
2091         }
2092         break;
2093     }
2094 
2095     case SDRATTR_CIRCENDANGLE:
2096     {
2097         const SfxPoolItem* pPoolItem=NULL;
2098         if (aSet.GetItemState(SDRATTR_CIRCENDANGLE,sal_False,&pPoolItem)==SFX_ITEM_SET)
2099         {
2100             sal_Int32 nAngle = ((SdrCircEndAngleItem*)pPoolItem)->GetValue();
2101             aAny <<= nAngle;
2102         }
2103         break;
2104     }
2105 
2106     case SDRATTR_CIRCKIND:
2107     {
2108         if( mpObj->GetObjInventor() == SdrInventor)
2109         {
2110             drawing::CircleKind eKind;
2111             switch(mpObj->GetObjIdentifier())
2112             {
2113             case OBJ_CIRC:          // Kreis, Ellipse
2114                 eKind = drawing::CircleKind_FULL;
2115                 break;
2116             case OBJ_CCUT:          // Kreisabschnitt
2117                 eKind = drawing::CircleKind_CUT;
2118                 break;
2119             case OBJ_CARC:          // Kreisbogen
2120                 eKind = drawing::CircleKind_ARC;
2121                 break;
2122             case OBJ_SECT:          // Kreissektor
2123                 eKind = drawing::CircleKind_SECTION;
2124                 break;
2125             }
2126             aAny <<= eKind;
2127         }
2128         break;
2129     }
2130     default:
2131     {
2132         // Hole Wert aus ItemSet
2133         aAny = SvxItemPropertySet_getPropertyValue( *mpPropSet, pMap, aSet );
2134 
2135         if( *pMap->pType != aAny.getValueType() )
2136         {
2137             // since the sfx uint16 item now exports a sal_Int32, we may have to fix this here
2138             if( ( *pMap->pType == ::getCppuType((const sal_Int16*)0)) && aAny.getValueType() == ::getCppuType((const sal_Int32*)0) )
2139             {
2140                 sal_Int32 nValue = 0;
2141                 aAny >>= nValue;
2142                 aAny <<= (sal_Int16)nValue;
2143             }
2144             else
2145             {
2146                 DBG_ERROR("SvxShape::GetAnyForItem() Returnvalue has wrong Type!" );
2147             }
2148         }
2149 
2150     }
2151     }
2152 
2153     return aAny;
2154 }
2155 
2156 //----------------------------------------------------------------------
2157 
2158 // XPropertyState
getPropertyState(const OUString & PropertyName)2159 beans::PropertyState SAL_CALL SvxShape::getPropertyState( const OUString& PropertyName )
2160     throw(beans::UnknownPropertyException, uno::RuntimeException)
2161 {
2162     if( mpImpl->mpMaster )
2163     {
2164         return mpImpl->mpMaster->getPropertyState( PropertyName );
2165     }
2166     else
2167     {
2168         return _getPropertyState( PropertyName );
2169     }
2170 }
2171 
_getPropertyState(const OUString & PropertyName)2172 beans::PropertyState SAL_CALL SvxShape::_getPropertyState( const OUString& PropertyName )
2173     throw(beans::UnknownPropertyException, uno::RuntimeException)
2174 {
2175     OGuard aGuard( Application::GetSolarMutex() );
2176 
2177     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName);
2178 
2179     if( !mpObj.is() || pMap == NULL )
2180         throw beans::UnknownPropertyException();
2181 
2182     beans::PropertyState eState;
2183     if( !getPropertyStateImpl( pMap, eState ) )
2184     {
2185         const SfxItemSet& rSet = mpObj->GetMergedItemSet();
2186 
2187         switch( rSet.GetItemState( pMap->nWID, sal_False ) )
2188         {
2189         case SFX_ITEM_READONLY:
2190         case SFX_ITEM_SET:
2191             eState = beans::PropertyState_DIRECT_VALUE;
2192             break;
2193         case SFX_ITEM_DEFAULT:
2194             eState = beans::PropertyState_DEFAULT_VALUE;
2195             break;
2196 //      case SFX_ITEM_UNKNOWN:
2197 //      case SFX_ITEM_DONTCARE:
2198 //      case SFX_ITEM_DISABLED:
2199         default:
2200             eState = beans::PropertyState_AMBIGUOUS_VALUE;
2201             break;
2202         }
2203 
2204         // if a item is set, this doesn't mean we want it :)
2205         if( ( beans::PropertyState_DIRECT_VALUE == eState ) )
2206         {
2207             switch( pMap->nWID )
2208             {
2209             // the following items are disabled by changing the
2210             // fill style or the line style. so there is no need
2211             // to export items without names which should be empty
2212             case XATTR_FILLBITMAP:
2213             case XATTR_FILLGRADIENT:
2214             case XATTR_FILLHATCH:
2215             case XATTR_LINEDASH:
2216                 {
2217                     NameOrIndex* pItem = (NameOrIndex*)rSet.GetItem((sal_uInt16)pMap->nWID);
2218                     if( ( pItem == NULL ) || ( pItem->GetName().Len() == 0) )
2219                         eState = beans::PropertyState_DEFAULT_VALUE;
2220                 }
2221                 break;
2222 
2223             // #i36115#
2224             // If e.g. the LineStart is on NONE and thus the string has length 0, it still
2225             // may be a hard attribute covering the set LineStart of the parent (Style).
2226             // #i37644#
2227             // same is for fill float transparency
2228             case XATTR_LINEEND:
2229             case XATTR_LINESTART:
2230             case XATTR_FILLFLOATTRANSPARENCE:
2231                 {
2232                     NameOrIndex* pItem = (NameOrIndex*)rSet.GetItem((sal_uInt16)pMap->nWID);
2233                     if( pItem == NULL )
2234                         eState = beans::PropertyState_DEFAULT_VALUE;
2235                 }
2236                 break;
2237             }
2238         }
2239     }
2240     return eState;
2241 }
2242 
2243 //----------------------------------------------------------------------
2244 
setPropertyValueImpl(const::rtl::OUString &,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)2245 bool SvxShape::setPropertyValueImpl( const ::rtl::OUString&, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
2246 {
2247     switch( pProperty->nWID )
2248     {
2249     case OWN_ATTR_CAPTION_POINT:
2250     {
2251         awt::Point aPnt;
2252         if( rValue >>= aPnt )
2253         {
2254             Point aVclPoint( aPnt.X, aPnt.Y );
2255 
2256             // #90763# position is relative to top left, make it absolute
2257             basegfx::B2DPolyPolygon aNewPolyPolygon;
2258             basegfx::B2DHomMatrix aNewHomogenMatrix;
2259             mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2260 
2261             aVclPoint.X() += basegfx::fround(aNewHomogenMatrix.get(0, 2));
2262             aVclPoint.Y() += basegfx::fround(aNewHomogenMatrix.get(1, 2));
2263 
2264             // #88657# metric of pool maybe twips (writer)
2265             ForceMetricToItemPoolMetric(aVclPoint);
2266 
2267             // #88491# position relative to anchor
2268             if( mpModel->IsWriter() )
2269             {
2270                 aVclPoint += mpObj->GetAnchorPos();
2271             }
2272 
2273             ((SdrCaptionObj*)mpObj.get())->SetTailPos(aVclPoint);
2274 
2275             return true;
2276         }
2277         break;
2278     }
2279     case OWN_ATTR_TRANSFORMATION:
2280     {
2281         drawing::HomogenMatrix3 aMatrix;
2282         if(rValue >>= aMatrix)
2283         {
2284             basegfx::B2DPolyPolygon aNewPolyPolygon;
2285             basegfx::B2DHomMatrix aNewHomogenMatrix;
2286 
2287             mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2288 
2289             aNewHomogenMatrix.set(0, 0, aMatrix.Line1.Column1);
2290             aNewHomogenMatrix.set(0, 1, aMatrix.Line1.Column2);
2291             aNewHomogenMatrix.set(0, 2, aMatrix.Line1.Column3);
2292             aNewHomogenMatrix.set(1, 0, aMatrix.Line2.Column1);
2293             aNewHomogenMatrix.set(1, 1, aMatrix.Line2.Column2);
2294             aNewHomogenMatrix.set(1, 2, aMatrix.Line2.Column3);
2295             aNewHomogenMatrix.set(2, 0, aMatrix.Line3.Column1);
2296             aNewHomogenMatrix.set(2, 1, aMatrix.Line3.Column2);
2297             aNewHomogenMatrix.set(2, 2, aMatrix.Line3.Column3);
2298 
2299             mpObj->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2300             return true;
2301         }
2302         break;
2303     }
2304 
2305     case OWN_ATTR_ZORDER:
2306     {
2307         sal_Int32 nNewOrdNum = 0;
2308         if(rValue >>= nNewOrdNum)
2309         {
2310             SdrObjList* pObjList = mpObj->GetObjList();
2311             if( pObjList )
2312             {
2313 #ifdef DBG_UTIL
2314                 SdrObject* pCheck =
2315 #endif
2316                             pObjList->SetObjectOrdNum( mpObj->GetOrdNum(), (sal_uIntPtr)nNewOrdNum );
2317                 DBG_ASSERT( pCheck == mpObj.get(), "GetOrdNum() failed!" );
2318             }
2319             return true;
2320         }
2321         break;
2322     }
2323     case OWN_ATTR_FRAMERECT:
2324     {
2325         awt::Rectangle aUnoRect;
2326         if(rValue >>= aUnoRect)
2327         {
2328             Point aTopLeft( aUnoRect.X, aUnoRect.Y );
2329             Size aObjSize( aUnoRect.Width, aUnoRect.Height );
2330             ForceMetricToItemPoolMetric(aTopLeft);
2331             ForceMetricToItemPoolMetric(aObjSize);
2332             Rectangle aRect;
2333             aRect.SetPos(aTopLeft);
2334             aRect.SetSize(aObjSize);
2335             mpObj->SetSnapRect(aRect);
2336             return true;
2337         }
2338         break;
2339     }
2340     case OWN_ATTR_MIRRORED:
2341     {
2342         sal_Bool bMirror = sal_Bool();
2343         if(rValue >>= bMirror )
2344         {
2345             SdrGrafObj* pObj = dynamic_cast< SdrGrafObj* >( mpObj.get() );
2346             if( pObj )
2347                 pObj->SetMirrored(bMirror);
2348             return true;
2349         }
2350         break;
2351     }
2352     case OWN_ATTR_EDGE_START_OBJ:
2353     case OWN_ATTR_EDGE_END_OBJ:
2354     case OWN_ATTR_GLUEID_HEAD:
2355     case OWN_ATTR_GLUEID_TAIL:
2356     case OWN_ATTR_EDGE_START_POS:
2357     case OWN_ATTR_EDGE_END_POS:
2358     case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
2359     {
2360         SdrEdgeObj* pEdgeObj = dynamic_cast< SdrEdgeObj* >(mpObj.get());
2361         if(pEdgeObj)
2362         {
2363             switch(pProperty->nWID)
2364             {
2365             case OWN_ATTR_EDGE_START_OBJ:
2366             case OWN_ATTR_EDGE_END_OBJ:
2367                 {
2368                     Reference< drawing::XShape > xShape;
2369                     if( rValue >>= xShape )
2370                     {
2371                         SdrObject* pNode = GetSdrObjectFromXShape( xShape );
2372                         if( pNode )
2373                         {
2374                             pEdgeObj->ConnectToNode( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, pNode );
2375                             pEdgeObj->setGluePointIndex( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, -1 );
2376                             return true;
2377                         }
2378                     }
2379                     break;
2380                 }
2381 
2382             case OWN_ATTR_EDGE_START_POS:
2383             case OWN_ATTR_EDGE_END_POS:
2384                 {
2385                     awt::Point aUnoPoint;
2386                     if( rValue >>= aUnoPoint )
2387                     {
2388                         Point aPoint( aUnoPoint.X, aUnoPoint.Y );
2389 
2390                         // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051
2391                         // perform metric change before applying anchor position,
2392                         // because the anchor position is in pool metric.
2393                         ForceMetricToItemPoolMetric( aPoint );
2394                         // <--
2395                         if( mpModel->IsWriter() )
2396                             aPoint += mpObj->GetAnchorPos();
2397 
2398                         pEdgeObj->SetTailPoint( pProperty->nWID == OWN_ATTR_EDGE_START_POS, aPoint );
2399                         return true;
2400                     }
2401                     break;
2402                 }
2403 
2404             case OWN_ATTR_GLUEID_HEAD:
2405             case OWN_ATTR_GLUEID_TAIL:
2406                 {
2407                     sal_Int32 nId = 0;
2408                     if( rValue >>= nId )
2409                     {
2410                         pEdgeObj->setGluePointIndex( pProperty->nWID == OWN_ATTR_GLUEID_HEAD, nId );
2411                         return true;
2412                     }
2413                     break;
2414                 }
2415             case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
2416                 {
2417                     basegfx::B2DPolyPolygon aNewPolyPolygon;
2418 
2419                     // #123616# be a little bit more flexible regardin gthe data type used
2420                     if( rValue.getValueType() == ::getCppuType(( const drawing::PointSequenceSequence*)0))
2421                     {
2422                         // get polygpon data from PointSequenceSequence
2423                         aNewPolyPolygon = basegfx::tools::UnoPointSequenceSequenceToB2DPolyPolygon(
2424                             *(const drawing::PointSequenceSequence*)rValue.getValue());
2425                     }
2426                     else if( rValue.getValueType() == ::getCppuType(( const drawing::PolyPolygonBezierCoords*)0))
2427                     {
2428                         // get polygpon data from PolyPolygonBezierCoords
2429                         aNewPolyPolygon = basegfx::tools::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(
2430                             *(const drawing::PolyPolygonBezierCoords*)rValue.getValue());
2431                     }
2432 
2433                     if(aNewPolyPolygon.count())
2434                     {
2435                         // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051
2436                         ForceMetricToItemPoolMetric( aNewPolyPolygon );
2437                         // <--
2438                         if( mpModel->IsWriter() )
2439                         {
2440                             Point aPoint( mpObj->GetAnchorPos() );
2441                             aNewPolyPolygon.transform(basegfx::tools::createTranslateB2DHomMatrix(aPoint.X(), aPoint.Y()));
2442                         }
2443                         pEdgeObj->SetEdgeTrackPath( aNewPolyPolygon );
2444                         return true;
2445                     }
2446                 }
2447             }
2448         }
2449         break;
2450     }
2451     case OWN_ATTR_MEASURE_START_POS:
2452     case OWN_ATTR_MEASURE_END_POS:
2453     {
2454         SdrMeasureObj* pMeasureObj = dynamic_cast< SdrMeasureObj* >(mpObj.get());
2455         awt::Point aUnoPoint;
2456         if(pMeasureObj && ( rValue >>= aUnoPoint ) )
2457         {
2458             Point aPoint( aUnoPoint.X, aUnoPoint.Y );
2459 
2460             // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051
2461             ForceMetricToItemPoolMetric( aPoint );
2462             // <--
2463             if( mpModel->IsWriter() )
2464                 aPoint += mpObj->GetAnchorPos();
2465 
2466             pMeasureObj->NbcSetPoint( aPoint, pProperty->nWID == OWN_ATTR_MEASURE_START_POS ? 0L : 1L );
2467             pMeasureObj->SetChanged();
2468             pMeasureObj->BroadcastObjectChange();
2469             return true;
2470         }
2471         break;
2472     }
2473     case OWN_ATTR_FILLBMP_MODE:
2474         {
2475             drawing::BitmapMode eMode;
2476             if(!(rValue >>= eMode) )
2477             {
2478                 sal_Int32 nMode = 0;
2479                 if(!(rValue >>= nMode))
2480                     break;
2481 
2482                 eMode = (drawing::BitmapMode)nMode;
2483             }
2484             mpObj->SetMergedItem( XFillBmpStretchItem( eMode == drawing::BitmapMode_STRETCH ) );
2485             mpObj->SetMergedItem( XFillBmpTileItem( eMode == drawing::BitmapMode_REPEAT ) );
2486             return true;
2487         }
2488 
2489     case SDRATTR_LAYERID:
2490     {
2491         sal_Int16 nLayerId = sal_Int16();
2492         if( rValue >>= nLayerId )
2493         {
2494             SdrLayer* pLayer = mpModel->GetLayerAdmin().GetLayerPerID((unsigned char)nLayerId);
2495             if( pLayer )
2496             {
2497                 mpObj->SetLayer((unsigned char)nLayerId);
2498                 return true;
2499             }
2500         }
2501         break;
2502     }
2503 
2504     case SDRATTR_LAYERNAME:
2505     {
2506         OUString aLayerName;
2507         if( rValue >>= aLayerName )
2508         {
2509             const SdrLayer* pLayer=mpModel->GetLayerAdmin().GetLayer(aLayerName, sal_True);
2510             if( pLayer != NULL )
2511             {
2512                 mpObj->SetLayer( pLayer->GetID() );
2513                 return true;
2514             }
2515         }
2516         break;
2517     }
2518     case SDRATTR_ROTATEANGLE:
2519     {
2520         sal_Int32 nAngle = 0;
2521         if( rValue >>= nAngle )
2522         {
2523             Point aRef1(mpObj->GetSnapRect().Center());
2524             nAngle -= mpObj->GetRotateAngle();
2525             if (nAngle!=0)
2526             {
2527                 double nSin=sin(nAngle*nPi180);
2528                 double nCos=cos(nAngle*nPi180);
2529                 mpObj->Rotate(aRef1,nAngle,nSin,nCos);
2530             }
2531             return true;
2532         }
2533 
2534         break;
2535     }
2536 
2537     case SDRATTR_SHEARANGLE:
2538     {
2539         sal_Int32 nShear = 0;
2540         if( rValue >>= nShear )
2541         {
2542             nShear -= mpObj->GetShearAngle();
2543             if(nShear != 0 )
2544             {
2545                 Point aRef1(mpObj->GetSnapRect().Center());
2546                 double nTan=tan(nShear*nPi180);
2547                 mpObj->Shear(aRef1,nShear,nTan,sal_False);
2548                 return true;
2549             }
2550         }
2551 
2552         break;
2553     }
2554 
2555     case SDRATTR_OBJMOVEPROTECT:
2556     {
2557         sal_Bool bMoveProtect = sal_Bool();
2558         if( rValue >>= bMoveProtect )
2559         {
2560             mpObj->SetMoveProtect(bMoveProtect);
2561             return true;
2562         }
2563         break;
2564     }
2565     case SDRATTR_OBJECTNAME:
2566     {
2567         OUString aName;
2568         if( rValue >>= aName )
2569         {
2570             mpObj->SetName( aName );
2571             return true;
2572         }
2573         break;
2574     }
2575 
2576     // #i68101#
2577     case OWN_ATTR_MISC_OBJ_TITLE:
2578     {
2579         OUString aTitle;
2580         if( rValue >>= aTitle )
2581         {
2582             mpObj->SetTitle( aTitle );
2583             return true;
2584         }
2585         break;
2586     }
2587     case OWN_ATTR_MISC_OBJ_DESCRIPTION:
2588     {
2589         OUString aDescription;
2590         if( rValue >>= aDescription )
2591         {
2592             mpObj->SetDescription( aDescription );
2593             return true;
2594         }
2595         break;
2596     }
2597 
2598     case SDRATTR_OBJPRINTABLE:
2599     {
2600         sal_Bool bPrintable = sal_Bool();
2601         if( rValue >>= bPrintable )
2602         {
2603             mpObj->SetPrintable(bPrintable);
2604             return true;
2605         }
2606         break;
2607     }
2608     case SDRATTR_OBJVISIBLE:
2609     {
2610         sal_Bool bVisible = sal_Bool();
2611         if( rValue >>= bVisible )
2612         {
2613             mpObj->SetVisible(bVisible);
2614             return true;
2615         }
2616         break;
2617     }
2618     case SDRATTR_OBJSIZEPROTECT:
2619     {
2620         sal_Bool bResizeProtect = sal_Bool();
2621         if( rValue >>= bResizeProtect )
2622         {
2623             mpObj->SetResizeProtect(bResizeProtect);
2624             return true;
2625         }
2626         break;
2627     }
2628     case OWN_ATTR_PAGE_NUMBER:
2629     {
2630         sal_Int32 nPageNum = 0;
2631         if( (rValue >>= nPageNum) && ( nPageNum >= 0 ) && ( nPageNum <= 0xffff ) )
2632         {
2633             SdrPageObj* pPageObj = dynamic_cast< SdrPageObj* >(mpObj.get());
2634             if( pPageObj )
2635             {
2636                 SdrModel* pModel = pPageObj->GetModel();
2637                 SdrPage* pNewPage = 0L;
2638                 const sal_uInt16 nDestinationPageNum((sal_uInt16)((nPageNum << 1L) - 1L));
2639 
2640                 if(pModel)
2641                 {
2642                     if(nDestinationPageNum < pModel->GetPageCount())
2643                     {
2644                         pNewPage = pModel->GetPage(nDestinationPageNum);
2645                     }
2646                 }
2647 
2648                 pPageObj->SetReferencedPage(pNewPage);
2649             }
2650 
2651             return true;
2652         }
2653         break;
2654     }
2655     case XATTR_FILLBITMAP:
2656     case XATTR_FILLGRADIENT:
2657     case XATTR_FILLHATCH:
2658     case XATTR_FILLFLOATTRANSPARENCE:
2659     case XATTR_LINEEND:
2660     case XATTR_LINESTART:
2661     case XATTR_LINEDASH:
2662     {
2663         if( pProperty->nMemberId == MID_NAME )
2664         {
2665             OUString aApiName;
2666             if( rValue >>= aApiName )
2667             {
2668                 if( SetFillAttribute( pProperty->nWID, aApiName ) )
2669                     return true;
2670             }
2671             break;
2672         }
2673         else
2674         {
2675             return false;
2676         }
2677     }
2678     default:
2679     {
2680         return false;
2681     }
2682     }
2683     throw lang::IllegalArgumentException();
2684 }
2685 
2686 //----------------------------------------------------------------------
2687 
getPropertyValueImpl(const::rtl::OUString &,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)2688 bool SvxShape::getPropertyValueImpl( const ::rtl::OUString&, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
2689 {
2690     switch( pProperty->nWID )
2691     {
2692 /*
2693     case OWN_ATTR_HASLEVELS:
2694     {
2695         rValue <<= SvxTextEditSource::hasLevels( mpObj.get() );
2696         break;
2697     }
2698 */
2699     case OWN_ATTR_CAPTION_POINT:
2700     {
2701         Point aVclPoint = ((SdrCaptionObj*)mpObj.get())->GetTailPos();
2702 
2703         // #88491# make pos relative to anchor
2704         if( mpModel->IsWriter() )
2705         {
2706             aVclPoint -= mpObj->GetAnchorPos();
2707         }
2708 
2709         // #88657# metric of pool maybe twips (writer)
2710         ForceMetricTo100th_mm(aVclPoint);
2711 
2712         // #90763# pos is absolute, make it relative to top left
2713         basegfx::B2DPolyPolygon aNewPolyPolygon;
2714         basegfx::B2DHomMatrix aNewHomogenMatrix;
2715         mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2716 
2717         aVclPoint.X() -= basegfx::fround(aNewHomogenMatrix.get(0, 2));
2718         aVclPoint.Y() -= basegfx::fround(aNewHomogenMatrix.get(1, 2));
2719 
2720         awt::Point aPnt( aVclPoint.X(), aVclPoint.Y() );
2721         rValue <<= aPnt;
2722         break;
2723     }
2724 
2725     case OWN_ATTR_TRANSFORMATION:
2726     {
2727         basegfx::B2DPolyPolygon aNewPolyPolygon;
2728         basegfx::B2DHomMatrix aNewHomogenMatrix;
2729         mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2730         drawing::HomogenMatrix3 aMatrix;
2731 
2732         aMatrix.Line1.Column1 = aNewHomogenMatrix.get(0, 0);
2733         aMatrix.Line1.Column2 = aNewHomogenMatrix.get(0, 1);
2734         aMatrix.Line1.Column3 = aNewHomogenMatrix.get(0, 2);
2735         aMatrix.Line2.Column1 = aNewHomogenMatrix.get(1, 0);
2736         aMatrix.Line2.Column2 = aNewHomogenMatrix.get(1, 1);
2737         aMatrix.Line2.Column3 = aNewHomogenMatrix.get(1, 2);
2738         aMatrix.Line3.Column1 = aNewHomogenMatrix.get(2, 0);
2739         aMatrix.Line3.Column2 = aNewHomogenMatrix.get(2, 1);
2740         aMatrix.Line3.Column3 = aNewHomogenMatrix.get(2, 2);
2741 
2742         rValue <<= aMatrix;
2743 
2744         break;
2745     }
2746 
2747     case OWN_ATTR_ZORDER:
2748     {
2749         rValue <<= (sal_Int32)mpObj->GetOrdNum();
2750         break;
2751     }
2752 
2753     case OWN_ATTR_BITMAP:
2754     {
2755         rValue = GetBitmap();
2756         if(!rValue.hasValue())
2757             throw uno::RuntimeException();
2758 
2759         break;
2760     }
2761 
2762     case OWN_ATTR_ISFONTWORK:
2763     {
2764         rValue <<= (sal_Bool)(mpObj->ISA(SdrTextObj) && ((SdrTextObj*)mpObj.get())->IsFontwork());
2765         break;
2766     }
2767 
2768     case OWN_ATTR_FRAMERECT:
2769     {
2770         Rectangle aRect( mpObj->GetSnapRect() );
2771         Point aTopLeft( aRect.TopLeft() );
2772         Size aObjSize( aRect.GetWidth(), aRect.GetHeight() );
2773         ForceMetricTo100th_mm(aTopLeft);
2774         ForceMetricTo100th_mm(aObjSize);
2775         ::com::sun::star::awt::Rectangle aUnoRect(
2776             aTopLeft.X(), aTopLeft.Y(),
2777             aObjSize.getWidth(), aObjSize.getHeight() );
2778         rValue <<= aUnoRect;
2779         break;
2780     }
2781 
2782     case OWN_ATTR_BOUNDRECT:
2783     {
2784         Rectangle aRect( mpObj->GetCurrentBoundRect() );
2785         Point aTopLeft( aRect.TopLeft() );
2786         Size aObjSize( aRect.GetWidth(), aRect.GetHeight() );
2787         ForceMetricTo100th_mm(aTopLeft);
2788         ForceMetricTo100th_mm(aObjSize);
2789         ::com::sun::star::awt::Rectangle aUnoRect(
2790             aTopLeft.X(), aTopLeft.Y(),
2791             aObjSize.getWidth(), aObjSize.getHeight() );
2792         rValue <<= aUnoRect;
2793         break;
2794     }
2795 
2796     case OWN_ATTR_LDNAME:
2797     {
2798         OUString aName( mpObj->GetName() );
2799         rValue <<= aName;
2800         break;
2801     }
2802 
2803     case OWN_ATTR_LDBITMAP:
2804     {
2805         sal_uInt16 nId;
2806         if( mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_OLE2 )
2807         {
2808             nId = RID_UNODRAW_OLE2;
2809         }
2810         else if( mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_GRAF )
2811         {
2812             nId = RID_UNODRAW_GRAPHICS;
2813         }
2814         else
2815         {
2816             nId = RID_UNODRAW_OBJECTS;
2817         }
2818 
2819         BitmapEx aBmp( SVX_RES(nId) );
2820         Reference< awt::XBitmap > xBmp( VCLUnoHelper::CreateBitmap( aBmp ) );
2821 
2822         rValue <<= xBmp;
2823         break;
2824     }
2825 
2826     case OWN_ATTR_MIRRORED:
2827     {
2828         sal_Bool bMirror = sal_False;
2829         if( mpObj.is() && mpObj->ISA(SdrGrafObj) )
2830             bMirror = ((SdrGrafObj*)mpObj.get())->IsMirrored();
2831 
2832         rValue <<= bMirror;
2833     }
2834 
2835     case OWN_ATTR_EDGE_START_OBJ:
2836     case OWN_ATTR_EDGE_START_POS:
2837     case OWN_ATTR_EDGE_END_POS:
2838     case OWN_ATTR_EDGE_END_OBJ:
2839     case OWN_ATTR_GLUEID_HEAD:
2840     case OWN_ATTR_GLUEID_TAIL:
2841     case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
2842     {
2843         SdrEdgeObj* pEdgeObj = dynamic_cast<SdrEdgeObj*>(mpObj.get());
2844         if(pEdgeObj)
2845         {
2846             switch(pProperty->nWID)
2847             {
2848             case OWN_ATTR_EDGE_START_OBJ:
2849             case OWN_ATTR_EDGE_END_OBJ:
2850                 {
2851                     SdrObject* pNode = pEdgeObj->GetConnectedNode(pProperty->nWID == OWN_ATTR_EDGE_START_OBJ);
2852                     if(pNode)
2853                     {
2854                         Reference< drawing::XShape > xShape( GetXShapeForSdrObject( pNode ) );
2855                         if(xShape.is())
2856                             rValue <<= xShape;
2857 
2858                     }
2859                     break;
2860                 }
2861 
2862             case OWN_ATTR_EDGE_START_POS:
2863             case OWN_ATTR_EDGE_END_POS:
2864                 {
2865                     Point aPoint( pEdgeObj->GetTailPoint( pProperty->nWID == OWN_ATTR_EDGE_START_POS ) );
2866                     if( mpModel->IsWriter() )
2867                         aPoint -= mpObj->GetAnchorPos();
2868 
2869                     ForceMetricTo100th_mm( aPoint );
2870                     awt::Point aUnoPoint( aPoint.X(), aPoint.Y() );
2871 
2872                     rValue <<= aUnoPoint;
2873                     break;
2874                 }
2875             case OWN_ATTR_GLUEID_HEAD:
2876             case OWN_ATTR_GLUEID_TAIL:
2877                 {
2878                     rValue <<= pEdgeObj->getGluePointIndex( pProperty->nWID == OWN_ATTR_GLUEID_HEAD );
2879                     break;
2880                 }
2881             case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
2882                 {
2883                     basegfx::B2DPolyPolygon aPolyPoly( pEdgeObj->GetEdgeTrackPath() );
2884                     if( mpModel->IsWriter() )
2885                     {
2886                         Point aPoint( mpObj->GetAnchorPos() );
2887                         aPolyPoly.transform(basegfx::tools::createTranslateB2DHomMatrix(-aPoint.X(), -aPoint.Y()));
2888                     }
2889                     // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue 59051
2890                     ForceMetricTo100th_mm( aPolyPoly );
2891                     // <--
2892                     drawing::PolyPolygonBezierCoords aRetval;
2893                     SvxConvertB2DPolyPolygonToPolyPolygonBezier( aPolyPoly, aRetval);
2894                     rValue <<= aRetval;
2895                     break;
2896                 }
2897             }
2898         }
2899         break;
2900     }
2901 
2902     case OWN_ATTR_MEASURE_START_POS:
2903     case OWN_ATTR_MEASURE_END_POS:
2904     {
2905         SdrMeasureObj* pMeasureObj = dynamic_cast<SdrMeasureObj*>(mpObj.get());
2906         if(pMeasureObj)
2907         {
2908             Point aPoint( pMeasureObj->GetPoint( pProperty->nWID == OWN_ATTR_MEASURE_START_POS ? 0 : 1 ) );
2909             if( mpModel->IsWriter() )
2910                 aPoint -= mpObj->GetAnchorPos();
2911 
2912             // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue 59051
2913             ForceMetricTo100th_mm( aPoint );
2914             // <--
2915             awt::Point aUnoPoint( aPoint.X(), aPoint.Y() );
2916 
2917             rValue <<= aUnoPoint;
2918             break;
2919         }
2920         break;
2921     }
2922 
2923     case OWN_ATTR_FILLBMP_MODE:
2924     {
2925         const SfxItemSet& rObjItemSet = mpObj->GetMergedItemSet();
2926 
2927         XFillBmpStretchItem* pStretchItem = (XFillBmpStretchItem*)&rObjItemSet.Get(XATTR_FILLBMP_STRETCH);
2928         XFillBmpTileItem* pTileItem = (XFillBmpTileItem*)&rObjItemSet.Get(XATTR_FILLBMP_TILE);
2929 
2930         if( pTileItem && pTileItem->GetValue() )
2931         {
2932             rValue <<= drawing::BitmapMode_REPEAT;
2933         }
2934         else if( pStretchItem && pStretchItem->GetValue() )
2935         {
2936             rValue <<= drawing::BitmapMode_STRETCH;
2937         }
2938         else
2939         {
2940             rValue <<= drawing::BitmapMode_NO_REPEAT;
2941         }
2942         break;
2943     }
2944     case SDRATTR_LAYERID:
2945         rValue <<= (sal_Int16)mpObj->GetLayer();
2946         break;
2947 
2948     case SDRATTR_LAYERNAME:
2949     {
2950         SdrLayer* pLayer = mpModel->GetLayerAdmin().GetLayerPerID(mpObj->GetLayer());
2951         if( pLayer )
2952         {
2953             OUString aName( pLayer->GetName() );
2954             rValue <<= aName;
2955         }
2956         break;
2957     }
2958 
2959     case SDRATTR_ROTATEANGLE:
2960         rValue <<= mpObj->GetRotateAngle();
2961         break;
2962 
2963     case SDRATTR_SHEARANGLE:
2964         rValue <<= mpObj->GetShearAngle();
2965         break;
2966 
2967     case SDRATTR_OBJMOVEPROTECT:
2968         rValue = uno::makeAny( (sal_Bool) mpObj->IsMoveProtect() );
2969         break;
2970 
2971     case SDRATTR_OBJECTNAME:
2972     {
2973         OUString aName( mpObj->GetName() );
2974         rValue <<= aName;
2975         break;
2976     }
2977 
2978     // #i68101#
2979     case OWN_ATTR_MISC_OBJ_TITLE:
2980     {
2981         OUString aTitle( mpObj->GetTitle() );
2982         rValue <<= aTitle;
2983         break;
2984     }
2985 
2986     case OWN_ATTR_MISC_OBJ_DESCRIPTION:
2987     {
2988         OUString aDescription( mpObj->GetDescription() );
2989         rValue <<= aDescription;
2990         break;
2991     }
2992 
2993     case SDRATTR_OBJPRINTABLE:
2994         rValue <<= static_cast<sal_Bool>( mpObj->IsPrintable() );
2995         break;
2996 
2997     case SDRATTR_OBJVISIBLE:
2998         rValue <<= static_cast<sal_Bool>( mpObj->IsVisible() );
2999         break;
3000 
3001     case SDRATTR_OBJSIZEPROTECT:
3002         rValue <<= static_cast<sal_Bool>( mpObj->IsResizeProtect() );
3003         break;
3004 
3005     case OWN_ATTR_PAGE_NUMBER:
3006     {
3007         SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(mpObj.get());
3008         if(pPageObj)
3009         {
3010             SdrPage* pPage = pPageObj->GetReferencedPage();
3011             sal_Int32 nPageNumber = (pPage) ? pPage->GetPageNum() : 0L;
3012             nPageNumber++;
3013             nPageNumber >>= 1;
3014             rValue <<= nPageNumber;
3015         }
3016         break;
3017     }
3018 
3019     case OWN_ATTR_UINAME_SINGULAR:
3020     {
3021         String aTmp;
3022         mpObj->TakeObjNameSingul( aTmp );
3023         rValue <<= OUString( aTmp );
3024         break;
3025     }
3026 
3027     case OWN_ATTR_UINAME_PLURAL:
3028     {
3029         String aTmp;
3030         mpObj->TakeObjNamePlural( aTmp );
3031         rValue <<= OUString( aTmp );
3032         break;
3033     }
3034     case OWN_ATTR_METAFILE:
3035     {
3036         SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>(mpObj.get());
3037         if( pObj )
3038         {
3039             Graphic* pGraphic = pObj->GetGraphic();
3040             if( pGraphic )
3041             {
3042                 sal_Bool bIsWMF = sal_False;
3043                 if ( pGraphic->IsLink() )
3044                 {
3045                     GfxLink aLnk = pGraphic->GetLink();
3046                     if ( aLnk.GetType() == GFX_LINK_TYPE_NATIVE_WMF )
3047                     {
3048                         bIsWMF = sal_True;
3049                         uno::Sequence<sal_Int8> aSeq((sal_Int8*)aLnk.GetData(), (sal_Int32) aLnk.GetDataSize());
3050                         rValue <<= aSeq;
3051                     }
3052                 }
3053                 if ( !bIsWMF )
3054                 {
3055                     // #119735# just use GetGDIMetaFile, it will create a bufferd version of contained bitmap now automatically
3056                     GDIMetaFile aMtf(pObj->GetGraphic()->GetGDIMetaFile());
3057                     SvMemoryStream aDestStrm( 65535, 65535 );
3058                     ConvertGDIMetaFileToWMF( aMtf, aDestStrm, NULL, sal_False );
3059                     const uno::Sequence<sal_Int8> aSeq(
3060                         static_cast< const sal_Int8* >(aDestStrm.GetData()),
3061                         aDestStrm.GetEndOfData());
3062                     rValue <<= aSeq;
3063                 }
3064             }
3065         }
3066         else
3067         {
3068             rValue = GetBitmap( sal_True );
3069         }
3070         break;
3071     }
3072 
3073 
3074     default:
3075         return false;
3076     }
3077     return true;
3078 }
3079 
3080 //----------------------------------------------------------------------
3081 
getPropertyStateImpl(const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::beans::PropertyState & rState)3082 bool SvxShape::getPropertyStateImpl( const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::beans::PropertyState& rState ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
3083 {
3084     if( pProperty->nWID == OWN_ATTR_FILLBMP_MODE )
3085     {
3086         const SfxItemSet& rSet = mpObj->GetMergedItemSet();
3087 
3088         if( rSet.GetItemState( XATTR_FILLBMP_STRETCH, false ) == SFX_ITEM_SET ||
3089             rSet.GetItemState( XATTR_FILLBMP_TILE, false ) == SFX_ITEM_SET )
3090         {
3091             rState = beans::PropertyState_DIRECT_VALUE;
3092         }
3093         else
3094         {
3095             rState = beans::PropertyState_AMBIGUOUS_VALUE;
3096         }
3097     }
3098     else if((( pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID <= OWN_ATTR_VALUE_END ) ||
3099        ( pProperty->nWID >= SDRATTR_NOTPERSIST_FIRST && pProperty->nWID <= SDRATTR_NOTPERSIST_LAST )) && ( pProperty->nWID != SDRATTR_TEXTDIRECTION ) )
3100     {
3101         rState = beans::PropertyState_DIRECT_VALUE;
3102     }
3103     else
3104     {
3105         return false;
3106     }
3107 
3108     return true;
3109 }
3110 
3111 //----------------------------------------------------------------------
3112 
setPropertyToDefaultImpl(const SfxItemPropertySimpleEntry * pProperty)3113 bool SvxShape::setPropertyToDefaultImpl( const SfxItemPropertySimpleEntry* pProperty ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
3114 {
3115     if( pProperty->nWID == OWN_ATTR_FILLBMP_MODE )
3116     {
3117         mpObj->ClearMergedItem( XATTR_FILLBMP_STRETCH );
3118         mpObj->ClearMergedItem( XATTR_FILLBMP_TILE );
3119         return true;
3120     }
3121     else if((pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID <= OWN_ATTR_VALUE_END ) ||
3122        ( pProperty->nWID >= SDRATTR_NOTPERSIST_FIRST && pProperty->nWID <= SDRATTR_NOTPERSIST_LAST ))
3123     {
3124         return true;
3125     }
3126     else
3127     {
3128         return false;
3129     }
3130 }
3131 
3132 //----------------------------------------------------------------------
3133 
getPropertyStates(const uno::Sequence<OUString> & aPropertyName)3134 uno::Sequence< beans::PropertyState > SAL_CALL SvxShape::getPropertyStates( const uno::Sequence< OUString >& aPropertyName )
3135     throw(beans::UnknownPropertyException, uno::RuntimeException)
3136 {
3137     const sal_Int32 nCount = aPropertyName.getLength();
3138     const OUString* pNames = aPropertyName.getConstArray();
3139 
3140     uno::Sequence< beans::PropertyState > aRet( nCount );
3141     beans::PropertyState* pState = aRet.getArray();
3142 
3143     if( mpImpl->mpMaster )
3144     {
3145         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++ )
3146             pState[nIdx] = getPropertyState( pNames[nIdx] );
3147 
3148     }
3149     else
3150     {
3151         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++ )
3152             pState[nIdx] = getPropertyState( pNames[nIdx] );
3153     }
3154 
3155     return aRet;
3156 }
3157 
3158 //----------------------------------------------------------------------
3159 
setPropertyToDefault(const OUString & PropertyName)3160 void SAL_CALL SvxShape::setPropertyToDefault( const OUString& PropertyName )
3161     throw(beans::UnknownPropertyException, uno::RuntimeException)
3162 {
3163     if( mpImpl->mpMaster )
3164     {
3165         mpImpl->mpMaster->setPropertyToDefault( PropertyName );
3166     }
3167     else
3168     {
3169         _setPropertyToDefault( PropertyName );
3170     }
3171 }
3172 
_setPropertyToDefault(const OUString & PropertyName)3173 void SAL_CALL SvxShape::_setPropertyToDefault( const OUString& PropertyName )
3174     throw(beans::UnknownPropertyException, uno::RuntimeException)
3175 {
3176     OGuard aGuard( Application::GetSolarMutex() );
3177 
3178     const SfxItemPropertySimpleEntry* pProperty = mpPropSet->getPropertyMapEntry(PropertyName);
3179 
3180     if( !mpObj.is() || mpModel == NULL || pProperty == NULL )
3181         throw beans::UnknownPropertyException();
3182 
3183     if( !setPropertyToDefaultImpl( pProperty ) )
3184     {
3185         mpObj->ClearMergedItem( pProperty->nWID );
3186     }
3187 
3188     mpModel->SetChanged();
3189 }
3190 
3191 //----------------------------------------------------------------------
3192 
getPropertyDefault(const OUString & aPropertyName)3193 uno::Any SAL_CALL SvxShape::getPropertyDefault( const OUString& aPropertyName )
3194     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
3195 {
3196     if( mpImpl->mpMaster )
3197     {
3198         return mpImpl->mpMaster->getPropertyDefault( aPropertyName );
3199     }
3200     else
3201     {
3202         return _getPropertyDefault( aPropertyName );
3203     }
3204 }
3205 
_getPropertyDefault(const OUString & aPropertyName)3206 uno::Any SAL_CALL SvxShape::_getPropertyDefault( const OUString& aPropertyName )
3207     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
3208 {
3209     OGuard aGuard( Application::GetSolarMutex() );
3210 
3211     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(aPropertyName);
3212 
3213     if( !mpObj.is() || pMap == NULL || mpModel == NULL )
3214         throw beans::UnknownPropertyException();
3215 
3216     if(( pMap->nWID >= OWN_ATTR_VALUE_START && pMap->nWID <= OWN_ATTR_VALUE_END ) ||
3217        ( pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST ))
3218     {
3219         return getPropertyValue( aPropertyName );
3220     }
3221 
3222     // Default aus ItemPool holen
3223     if(!mpModel->GetItemPool().IsWhich(pMap->nWID))
3224         throw beans::UnknownPropertyException();
3225 
3226     SfxItemSet aSet( mpModel->GetItemPool(),    pMap->nWID, pMap->nWID);
3227     aSet.Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID));
3228 
3229     return GetAnyForItem( aSet, pMap );
3230 }
3231 
3232 // XMultiPropertyStates
setAllPropertiesToDefault()3233 void SvxShape::setAllPropertiesToDefault() throw (uno::RuntimeException)
3234 {
3235     OGuard aGuard( Application::GetSolarMutex() );
3236 
3237     if( !mpObj.is() )
3238         throw lang::DisposedException();
3239     mpObj->ClearMergedItem(); // nWhich == 0 => all
3240 
3241     if(mpObj->ISA(SdrGrafObj))
3242     {
3243         // defaults for graphic objects have changed:
3244         mpObj->SetMergedItem( XFillStyleItem( XFILL_NONE ) );
3245         mpObj->SetMergedItem( XLineStyleItem( XLINE_NONE ) );
3246     }
3247 
3248     // #i68523# special handling for Svx3DCharacterModeItem, this is not saved
3249     // but needs to be sal_True in svx, pool default (false) in sch. Since sch
3250     // does not load lathe or extrude objects, it is possible to set the items
3251     // here.
3252     // For other solution possibilities, see task description.
3253     if(mpObj->ISA(E3dLatheObj) || mpObj->ISA(E3dExtrudeObj))
3254     {
3255         mpObj->SetMergedItem(Svx3DCharacterModeItem(true));
3256     }
3257 
3258     mpModel->SetChanged();
3259 }
3260 
setPropertiesToDefault(const uno::Sequence<OUString> & aPropertyNames)3261 void SvxShape::setPropertiesToDefault(
3262     const uno::Sequence<OUString>& aPropertyNames )
3263     throw (beans::UnknownPropertyException, uno::RuntimeException)
3264 {
3265     for ( sal_Int32 pos = 0; pos < aPropertyNames.getLength(); ++pos )
3266         setPropertyToDefault( aPropertyNames[pos] );
3267 }
3268 
getPropertyDefaults(const uno::Sequence<OUString> & aPropertyNames)3269 uno::Sequence<uno::Any> SvxShape::getPropertyDefaults(
3270     const uno::Sequence<OUString>& aPropertyNames )
3271     throw (beans::UnknownPropertyException, lang::WrappedTargetException,
3272            uno::RuntimeException)
3273 {
3274     ::std::vector<uno::Any> ret;
3275     for ( sal_Int32 pos = 0; pos < aPropertyNames.getLength(); ++pos )
3276         ret.push_back( getPropertyDefault( aPropertyNames[pos] ) );
3277     return uno::Sequence<uno::Any>( &ret[0], ret.size() );
3278 }
3279 
3280 //----------------------------------------------------------------------
3281 
3282 //----------------------------------------------------------------------
3283 // XServiceInfo
3284 //----------------------------------------------------------------------
getImplementationName()3285 OUString SAL_CALL SvxShape::getImplementationName()
3286     throw(uno::RuntimeException)
3287 {
3288     static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM("SvxShape") );
3289     return aServiceName;
3290 }
3291 
3292 #define STAR_NAMESPACE "com.sun.star."
3293 
3294 const char* sUNO_service_style_ParagraphProperties          = STAR_NAMESPACE "style.ParagraphProperties";
3295 const char* sUNO_service_style_ParagraphPropertiesComplex   = STAR_NAMESPACE "style.ParagraphPropertiesComplex";
3296 const char* sUNO_service_style_ParagraphPropertiesAsian     = STAR_NAMESPACE "style.ParagraphPropertiesAsian";
3297 const char* sUNO_service_style_CharacterProperties          = STAR_NAMESPACE "style.CharacterProperties";
3298 const char* sUNO_service_style_CharacterPropertiesComplex   = STAR_NAMESPACE "style.CharacterPropertiesComplex";
3299 const char* sUNO_service_style_CharacterPropertiesAsian     = STAR_NAMESPACE "style.CharacterPropertiesAsian";
3300 
3301 const char* sUNO_service_drawing_FillProperties             = STAR_NAMESPACE "drawing.FillProperties";
3302 const char* sUNO_service_drawing_TextProperties             = STAR_NAMESPACE "drawing.TextProperties";
3303 const char* sUNO_service_drawing_LineProperties             = STAR_NAMESPACE "drawing.LineProperties";
3304 const char* sUNO_service_drawing_ConnectorProperties        = STAR_NAMESPACE "drawing.ConnectorProperties";
3305 const char* sUNO_service_drawing_MeasureProperties          = STAR_NAMESPACE "drawing.MeasureProperties";
3306 const char* sUNO_service_drawing_ShadowProperties           = STAR_NAMESPACE "drawing.ShadowProperties";
3307 
3308 const char* sUNO_service_drawing_RotationDescriptor         = STAR_NAMESPACE "drawing.RotationDescriptor";
3309 
3310 const char* sUNO_service_drawing_Text                       = STAR_NAMESPACE "drawing.Text";
3311 const char* sUNO_service_drawing_GroupShape                 = STAR_NAMESPACE "drawing.GroupShape";
3312 
3313 const char* sUNO_service_drawing_CustomShapeProperties      = STAR_NAMESPACE "drawing.CustomShapeProperties";
3314 const char* sUNO_service_drawing_CustomShape                    = STAR_NAMESPACE "drawing.CustomShape";
3315 
3316 const char* sUNO_service_drawing_PolyPolygonDescriptor      = STAR_NAMESPACE "drawing.PolyPolygonDescriptor";
3317 const char* sUNO_service_drawing_PolyPolygonBezierDescriptor= STAR_NAMESPACE "drawing.PolyPolygonBezierDescriptor";
3318 
3319 const char* sUNO_service_drawing_LineShape                  = STAR_NAMESPACE "drawing.LineShape";
3320 const char* sUNO_service_drawing_Shape                      = STAR_NAMESPACE "drawing.Shape";
3321 const char* sUNO_service_drawing_RectangleShape             = STAR_NAMESPACE "drawing.RectangleShape";
3322 const char* sUNO_service_drawing_EllipseShape               = STAR_NAMESPACE "drawing.EllipseShape";
3323 const char* sUNO_service_drawing_PolyPolygonShape           = STAR_NAMESPACE "drawing.PolyPolygonShape";
3324 const char* sUNO_service_drawing_PolyLineShape              = STAR_NAMESPACE "drawing.PolyLineShape";
3325 const char* sUNO_service_drawing_OpenBezierShape            = STAR_NAMESPACE "drawing.OpenBezierShape";
3326 const char* sUNO_service_drawing_ClosedBezierShape          = STAR_NAMESPACE "drawing.ClosedBezierShape";
3327 const char* sUNO_service_drawing_TextShape                  = STAR_NAMESPACE "drawing.TextShape";
3328 const char* sUNO_service_drawing_GraphicObjectShape         = STAR_NAMESPACE "drawing.GraphicObjectShape";
3329 const char* sUNO_service_drawing_OLE2Shape                  = STAR_NAMESPACE "drawing.OLE2Shape";
3330 const char* sUNO_service_drawing_PageShape                  = STAR_NAMESPACE "drawing.PageShape";
3331 const char* sUNO_service_drawing_CaptionShape               = STAR_NAMESPACE "drawing.CaptionShape";
3332 const char* sUNO_service_drawing_MeasureShape               = STAR_NAMESPACE "drawing.MeasureShape";
3333 const char* sUNO_service_drawing_FrameShape                 = STAR_NAMESPACE "drawing.FrameShape";
3334 const char* sUNO_service_drawing_ControlShape               = STAR_NAMESPACE "drawing.ControlShape";
3335 const char* sUNO_service_drawing_ConnectorShape             = STAR_NAMESPACE "drawing.ConnectorShape";
3336 const char* sUNO_service_drawing_MediaShape                 = STAR_NAMESPACE "drawing.MediaShape";
3337 
3338 
getSupportedServiceNames()3339 uno::Sequence< OUString > SAL_CALL SvxShape::getSupportedServiceNames()
3340     throw(uno::RuntimeException)
3341 {
3342     if( mpImpl->mpMaster )
3343     {
3344         return mpImpl->mpMaster->getSupportedServiceNames();
3345     }
3346     else
3347     {
3348         return _getSupportedServiceNames();
3349     }
3350 }
3351 
_getSupportedServiceNames()3352 uno::Sequence< OUString > SAL_CALL SvxShape::_getSupportedServiceNames()
3353     throw(uno::RuntimeException)
3354 {
3355     OGuard aGuard( Application::GetSolarMutex() );
3356 
3357     if( mpObj.is() && mpObj->GetObjInventor() == SdrInventor)
3358     {
3359         const sal_uInt16 nIdent = mpObj->GetObjIdentifier();
3360 
3361         switch(nIdent)
3362         {
3363         case OBJ_GRUP:
3364             {
3365                 static uno::Sequence< OUString > *pSeq = 0;
3366                 if( 0 == pSeq )
3367                 {
3368 //                  OGuard aGuard( Application::GetSolarMutex() );
3369 //                  if( 0 == pSeq )
3370                     {
3371                         static uno::Sequence< OUString > SvxShape_GroupServices;
3372 
3373                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_GroupServices, 2,
3374                             sUNO_service_drawing_GroupShape,
3375                             sUNO_service_drawing_Shape );
3376 
3377                         pSeq = &SvxShape_GroupServices;
3378                     }
3379                 }
3380 
3381                 return *pSeq;
3382             }
3383         case OBJ_CUSTOMSHAPE:
3384             {
3385                 static uno::Sequence< OUString > *pSeq = 0;
3386                 if( 0 == pSeq )
3387                 {
3388 //                  OGuard aGuard( Application::GetSolarMutex() );
3389 //                  if( 0 == pSeq )
3390                     {
3391                         static uno::Sequence< OUString > SvxShape_CustomShapeServices;
3392 
3393                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_CustomShapeServices, 13,
3394                             sUNO_service_drawing_CustomShape,
3395                             sUNO_service_drawing_Shape,
3396                             sUNO_service_drawing_CustomShapeProperties,
3397                             sUNO_service_drawing_FillProperties,
3398                             sUNO_service_drawing_LineProperties,
3399                             sUNO_service_drawing_Text,
3400                             sUNO_service_drawing_TextProperties,
3401                             sUNO_service_style_ParagraphProperties,
3402                             sUNO_service_style_ParagraphPropertiesComplex,
3403                             sUNO_service_style_ParagraphPropertiesAsian,
3404                             sUNO_service_style_CharacterProperties,
3405                             sUNO_service_style_CharacterPropertiesComplex,
3406                             sUNO_service_style_CharacterPropertiesAsian,
3407                             sUNO_service_drawing_ShadowProperties,
3408                             sUNO_service_drawing_RotationDescriptor);
3409                         pSeq = &SvxShape_CustomShapeServices;
3410                     }
3411                 }
3412                 return *pSeq;
3413             }
3414         case OBJ_LINE:
3415             {
3416                 static uno::Sequence< OUString > *pSeq = 0;
3417                 if( 0 == pSeq )
3418                 {
3419 //                  OGuard aGuard( Application::GetSolarMutex() );
3420 //                  if( 0 == pSeq )
3421                     {
3422                         static uno::Sequence< OUString > SvxShape_LineServices;
3423 
3424                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_LineServices,14,
3425                             sUNO_service_drawing_LineShape,
3426 
3427                             sUNO_service_drawing_Shape,
3428                             sUNO_service_drawing_LineProperties,
3429 
3430                             sUNO_service_drawing_Text,
3431                             sUNO_service_drawing_TextProperties,
3432                             sUNO_service_style_ParagraphProperties,
3433                             sUNO_service_style_ParagraphPropertiesComplex,
3434                             sUNO_service_style_ParagraphPropertiesAsian,
3435                             sUNO_service_style_CharacterProperties,
3436                             sUNO_service_style_CharacterPropertiesComplex,
3437                             sUNO_service_style_CharacterPropertiesAsian,
3438 
3439                             sUNO_service_drawing_PolyPolygonDescriptor,
3440                             sUNO_service_drawing_ShadowProperties,
3441                             sUNO_service_drawing_RotationDescriptor);
3442 
3443                         pSeq = &SvxShape_LineServices;
3444                     }
3445                 }
3446                 return *pSeq;
3447             }
3448 
3449         case OBJ_RECT:
3450             {
3451                 static uno::Sequence< OUString > *pSeq = 0;
3452                 if( 0 == pSeq )
3453                 {
3454 //                  OGuard aGuard( Application::GetSolarMutex() );
3455 //                  if( 0 == pSeq )
3456                     {
3457                         static uno::Sequence< OUString > SvxShape_RectServices;
3458 
3459                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_RectServices,14,
3460                             sUNO_service_drawing_RectangleShape,
3461 
3462                             sUNO_service_drawing_Shape,
3463                             sUNO_service_drawing_FillProperties,
3464                             sUNO_service_drawing_LineProperties,
3465                             sUNO_service_drawing_Text,
3466                             sUNO_service_drawing_TextProperties,
3467                             sUNO_service_style_ParagraphProperties,
3468                             sUNO_service_style_ParagraphPropertiesComplex,
3469                             sUNO_service_style_ParagraphPropertiesAsian,
3470                             sUNO_service_style_CharacterProperties,
3471                             sUNO_service_style_CharacterPropertiesComplex,
3472                             sUNO_service_style_CharacterPropertiesAsian,
3473 
3474                             sUNO_service_drawing_ShadowProperties,
3475                             sUNO_service_drawing_RotationDescriptor);
3476                         pSeq = &SvxShape_RectServices;
3477                     }
3478 
3479                 }
3480                 return *pSeq;
3481             }
3482 
3483         case OBJ_CIRC:
3484         case OBJ_SECT:
3485         case OBJ_CARC:
3486         case OBJ_CCUT:
3487             {
3488                 static uno::Sequence< OUString > *pSeq = 0;
3489                 if( 0 == pSeq )
3490                 {
3491 //                  OGuard aGuard( Application::GetSolarMutex() );
3492 //                  if( 0 == pSeq )
3493                     {
3494                         static uno::Sequence< OUString > SvxShape_CircServices;
3495 
3496                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_CircServices,14,
3497                             sUNO_service_drawing_EllipseShape,
3498 
3499                             sUNO_service_drawing_Shape,
3500                             sUNO_service_drawing_FillProperties,
3501                             sUNO_service_drawing_LineProperties,
3502 
3503                             sUNO_service_drawing_Text,
3504                             sUNO_service_drawing_TextProperties,
3505                             sUNO_service_style_ParagraphProperties,
3506                             sUNO_service_style_ParagraphPropertiesComplex,
3507                             sUNO_service_style_ParagraphPropertiesAsian,
3508                             sUNO_service_style_CharacterProperties,
3509                             sUNO_service_style_CharacterPropertiesComplex,
3510                             sUNO_service_style_CharacterPropertiesAsian,
3511 
3512                             sUNO_service_drawing_ShadowProperties,
3513                             sUNO_service_drawing_RotationDescriptor);
3514 
3515                         pSeq = &SvxShape_CircServices;
3516                     }
3517                 }
3518 
3519                 return *pSeq;
3520             }
3521 
3522         case OBJ_PATHPLIN:
3523         case OBJ_PLIN:
3524             {
3525                 static uno::Sequence< OUString > *pSeq = 0;
3526                 if( 0 == pSeq )
3527                 {
3528 //                  OGuard aGuard( Application::GetSolarMutex() );
3529 //                  if( 0 == pSeq )
3530                     {
3531                         static uno::Sequence< OUString > SvxShape_PathServices;
3532                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_PathServices,14,
3533                             sUNO_service_drawing_PolyLineShape,
3534 
3535                             sUNO_service_drawing_Shape,
3536                             sUNO_service_drawing_LineProperties,
3537 
3538                             sUNO_service_drawing_PolyPolygonDescriptor,
3539 
3540                             sUNO_service_drawing_Text,
3541                             sUNO_service_drawing_TextProperties,
3542                             sUNO_service_style_ParagraphProperties,
3543                             sUNO_service_style_ParagraphPropertiesComplex,
3544                             sUNO_service_style_ParagraphPropertiesAsian,
3545                             sUNO_service_style_CharacterProperties,
3546                             sUNO_service_style_CharacterPropertiesComplex,
3547                             sUNO_service_style_CharacterPropertiesAsian,
3548 
3549                             sUNO_service_drawing_ShadowProperties,
3550                             sUNO_service_drawing_RotationDescriptor);
3551                         pSeq = &SvxShape_PathServices;
3552                     }
3553                 }
3554                 return *pSeq;
3555             }
3556 
3557         case OBJ_PATHPOLY:
3558         case OBJ_POLY:
3559             {
3560                 static uno::Sequence< OUString > *pSeq = 0;
3561                 if( 0 == pSeq )
3562                 {
3563 //                  OGuard aGuard( Application::GetSolarMutex() );
3564 //                  if( 0 == pSeq )
3565                     {
3566                         static uno::Sequence< OUString > SvxShape_PolyServices;
3567                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_PolyServices,15,
3568                             sUNO_service_drawing_PolyPolygonShape,
3569 
3570                             sUNO_service_drawing_Shape,
3571                             sUNO_service_drawing_LineProperties,
3572                             sUNO_service_drawing_FillProperties,
3573 
3574                             sUNO_service_drawing_PolyPolygonDescriptor,
3575 
3576                             sUNO_service_drawing_Text,
3577                             sUNO_service_drawing_TextProperties,
3578                             sUNO_service_style_ParagraphProperties,
3579                             sUNO_service_style_ParagraphPropertiesComplex,
3580                             sUNO_service_style_ParagraphPropertiesAsian,
3581                             sUNO_service_style_CharacterProperties,
3582                             sUNO_service_style_CharacterPropertiesComplex,
3583                             sUNO_service_style_CharacterPropertiesAsian,
3584 
3585                             sUNO_service_drawing_ShadowProperties,
3586                             sUNO_service_drawing_RotationDescriptor);
3587 
3588                         pSeq = &SvxShape_PolyServices;
3589                     }
3590                 }
3591                 return *pSeq;
3592             }
3593 
3594         case OBJ_FREELINE:
3595         case OBJ_PATHLINE:
3596             {
3597                 static uno::Sequence< OUString > *pSeq = 0;
3598                 if( 0 == pSeq )
3599                 {
3600 //                  OGuard aGuard( Application::GetSolarMutex() );
3601 //                  if( 0 == pSeq )
3602                     {
3603                         static uno::Sequence< OUString > SvxShape_FreeLineServices;
3604 
3605                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_FreeLineServices,15,
3606                             sUNO_service_drawing_OpenBezierShape,
3607 
3608                             sUNO_service_drawing_Shape,
3609                             sUNO_service_drawing_LineProperties,
3610                             sUNO_service_drawing_FillProperties,
3611 
3612                             sUNO_service_drawing_PolyPolygonBezierDescriptor,
3613 
3614                             sUNO_service_drawing_Text,
3615                             sUNO_service_drawing_TextProperties,
3616                             sUNO_service_style_ParagraphProperties,
3617                             sUNO_service_style_ParagraphPropertiesComplex,
3618                             sUNO_service_style_ParagraphPropertiesAsian,
3619                             sUNO_service_style_CharacterProperties,
3620                             sUNO_service_style_CharacterPropertiesComplex,
3621                             sUNO_service_style_CharacterPropertiesAsian,
3622 
3623                             sUNO_service_drawing_ShadowProperties,
3624                             sUNO_service_drawing_RotationDescriptor);
3625 
3626                         pSeq = &SvxShape_FreeLineServices;
3627                     }
3628                 }
3629 
3630                 return *pSeq;
3631             }
3632 
3633         case OBJ_FREEFILL:
3634         case OBJ_PATHFILL:
3635             {
3636                 static uno::Sequence< OUString > *pSeq = 0;
3637                 if( 0 == pSeq )
3638                 {
3639 //                  OGuard aGuard( Application::GetSolarMutex() );
3640 //                  if( 0 == pSeq )
3641                     {
3642                         static uno::Sequence< OUString > SvxShape_FreeFillServices;
3643                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_FreeFillServices,15,
3644                             sUNO_service_drawing_ClosedBezierShape,
3645 
3646                             sUNO_service_drawing_Shape,
3647                             sUNO_service_drawing_LineProperties,
3648                             sUNO_service_drawing_FillProperties,
3649 
3650                             sUNO_service_drawing_PolyPolygonBezierDescriptor,
3651 
3652                             sUNO_service_drawing_Text,
3653                             sUNO_service_drawing_TextProperties,
3654                             sUNO_service_style_ParagraphProperties,
3655                             sUNO_service_style_ParagraphPropertiesComplex,
3656                             sUNO_service_style_ParagraphPropertiesAsian,
3657                             sUNO_service_style_CharacterProperties,
3658                             sUNO_service_style_CharacterPropertiesComplex,
3659                             sUNO_service_style_CharacterPropertiesAsian,
3660 
3661                             sUNO_service_drawing_ShadowProperties,
3662                             sUNO_service_drawing_RotationDescriptor);
3663 
3664                         pSeq = &SvxShape_FreeFillServices;
3665                     }
3666                 }
3667                 return *pSeq;
3668             }
3669 
3670         case OBJ_OUTLINETEXT:
3671         case OBJ_TITLETEXT:
3672         case OBJ_TEXT:
3673             {
3674                 static uno::Sequence< OUString > *pSeq = 0;
3675                 if( 0 == pSeq )
3676                 {
3677 //                  OGuard aGuard( Application::GetSolarMutex() );
3678 //                  if( 0 == pSeq )
3679                     {
3680                         static uno::Sequence< OUString > SvxShape_TextServices;
3681                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_TextServices,14,
3682                             sUNO_service_drawing_TextShape,
3683 
3684                             sUNO_service_drawing_Shape,
3685                             sUNO_service_drawing_FillProperties,
3686                             sUNO_service_drawing_LineProperties,
3687 
3688                             sUNO_service_drawing_Text,
3689                             sUNO_service_drawing_TextProperties,
3690                             sUNO_service_style_ParagraphProperties,
3691                             sUNO_service_style_ParagraphPropertiesComplex,
3692                             sUNO_service_style_ParagraphPropertiesAsian,
3693                             sUNO_service_style_CharacterProperties,
3694                             sUNO_service_style_CharacterPropertiesComplex,
3695                             sUNO_service_style_CharacterPropertiesAsian,
3696 
3697                             sUNO_service_drawing_ShadowProperties,
3698                             sUNO_service_drawing_RotationDescriptor);
3699 
3700                         pSeq = &SvxShape_TextServices;
3701                     }
3702                 }
3703                 return *pSeq;
3704             }
3705 
3706         case OBJ_GRAF:
3707             {
3708                 static uno::Sequence< OUString > *pSeq = 0;
3709                 if( 0 == pSeq )
3710                 {
3711 //                  OGuard aGuard( Application::GetSolarMutex() );
3712 //                  if( 0 == pSeq )
3713                     {
3714                         static uno::Sequence< OUString > SvxShape_GrafServices;
3715                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_GrafServices, 12,
3716                             sUNO_service_drawing_GraphicObjectShape,
3717 
3718                             sUNO_service_drawing_Shape,
3719 
3720                             sUNO_service_drawing_Text,
3721                             sUNO_service_drawing_TextProperties,
3722                             sUNO_service_style_ParagraphProperties,
3723                             sUNO_service_style_ParagraphPropertiesComplex,
3724                             sUNO_service_style_ParagraphPropertiesAsian,
3725                             sUNO_service_style_CharacterProperties,
3726                             sUNO_service_style_CharacterPropertiesComplex,
3727                             sUNO_service_style_CharacterPropertiesAsian,
3728 
3729                             sUNO_service_drawing_ShadowProperties,
3730                             sUNO_service_drawing_RotationDescriptor);
3731 
3732                         pSeq = &SvxShape_GrafServices;
3733                     }
3734                 }
3735                 return *pSeq;
3736             }
3737 
3738         case OBJ_OLE2:
3739             {
3740                 static uno::Sequence< OUString > *pSeq = 0;
3741                 if( 0 == pSeq )
3742                 {
3743 //                  OGuard aGuard( Application::GetSolarMutex() );
3744 //                  if( 0 == pSeq )
3745                     {
3746                         static uno::Sequence< OUString > SvxShape_Ole2Services;
3747 
3748                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_Ole2Services, 2,
3749                             sUNO_service_drawing_OLE2Shape,
3750                             sUNO_service_drawing_Shape,
3751 
3752                             // #i118485# Added Text, Shadow and Rotation
3753                             sUNO_service_drawing_Text,
3754                             sUNO_service_drawing_TextProperties,
3755                             sUNO_service_style_ParagraphProperties,
3756                             sUNO_service_style_ParagraphPropertiesComplex,
3757                             sUNO_service_style_ParagraphPropertiesAsian,
3758                             sUNO_service_style_CharacterProperties,
3759                             sUNO_service_style_CharacterPropertiesComplex,
3760                             sUNO_service_style_CharacterPropertiesAsian,
3761 
3762                             sUNO_service_drawing_ShadowProperties,
3763                             sUNO_service_drawing_RotationDescriptor);
3764 
3765                         pSeq = &SvxShape_Ole2Services;
3766                     }
3767                 }
3768                 return *pSeq;
3769             }
3770 
3771         case OBJ_CAPTION:
3772             {
3773                 static uno::Sequence< OUString > *pSeq = 0;
3774                 if( 0 == pSeq )
3775                 {
3776 //                  OGuard aGuard( Application::GetSolarMutex() );
3777 //                  if( 0 == pSeq )
3778                     {
3779                         static uno::Sequence< OUString > SvxShape_CaptionServices;
3780 
3781                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_CaptionServices,14,
3782                             sUNO_service_drawing_CaptionShape,
3783 
3784                             sUNO_service_drawing_Shape,
3785                             sUNO_service_drawing_FillProperties,
3786                             sUNO_service_drawing_LineProperties,
3787 
3788                             sUNO_service_drawing_Text,
3789                             sUNO_service_drawing_TextProperties,
3790                             sUNO_service_style_ParagraphProperties,
3791                             sUNO_service_style_ParagraphPropertiesComplex,
3792                             sUNO_service_style_ParagraphPropertiesAsian,
3793                             sUNO_service_style_CharacterProperties,
3794                             sUNO_service_style_CharacterPropertiesComplex,
3795                             sUNO_service_style_CharacterPropertiesAsian,
3796 
3797                             sUNO_service_drawing_ShadowProperties,
3798                             sUNO_service_drawing_RotationDescriptor);
3799 
3800                         pSeq = &SvxShape_CaptionServices;
3801                     }
3802                 }
3803 
3804                 return *pSeq;
3805             }
3806 
3807         case OBJ_PAGE:
3808             {
3809                 static uno::Sequence< OUString > *pSeq = 0;
3810                 if( 0 == pSeq )
3811                 {
3812 //                  OGuard aGuard( Application::GetSolarMutex() );
3813 //                  if( 0 == pSeq )
3814                     {
3815                         static uno::Sequence< OUString > SvxShape_PageServices;
3816 
3817                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_PageServices, 2,
3818                             sUNO_service_drawing_PageShape,
3819                             sUNO_service_drawing_Shape );
3820 
3821                         pSeq = &SvxShape_PageServices;
3822                     }
3823                 }
3824 
3825                 return *pSeq;
3826             }
3827 
3828         case OBJ_MEASURE:
3829             {
3830                 static uno::Sequence< OUString > *pSeq = 0;
3831                 if( 0 == pSeq )
3832                 {
3833 //                  OGuard aGuard( Application::GetSolarMutex() );
3834 //                  if( 0 == pSeq )
3835                     {
3836                         static uno::Sequence< OUString > SvxShape_MeasureServices;
3837                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_MeasureServices,15,
3838                             sUNO_service_drawing_MeasureShape,
3839 
3840                             sUNO_service_drawing_MeasureProperties,
3841 
3842                             sUNO_service_drawing_Shape,
3843                             sUNO_service_drawing_LineProperties,
3844 
3845                             sUNO_service_drawing_Text,
3846                             sUNO_service_drawing_TextProperties,
3847                             sUNO_service_style_ParagraphProperties,
3848                             sUNO_service_style_ParagraphPropertiesComplex,
3849                             sUNO_service_style_ParagraphPropertiesAsian,
3850                             sUNO_service_style_CharacterProperties,
3851                             sUNO_service_style_CharacterPropertiesComplex,
3852                             sUNO_service_style_CharacterPropertiesAsian,
3853 
3854                             sUNO_service_drawing_PolyPolygonDescriptor,
3855                             sUNO_service_drawing_ShadowProperties,
3856                             sUNO_service_drawing_RotationDescriptor);
3857 
3858                         pSeq = &SvxShape_MeasureServices;
3859                     }
3860                 }
3861 
3862                 return *pSeq;
3863             }
3864 
3865         case OBJ_FRAME:
3866             {
3867                 static uno::Sequence< OUString > *pSeq = 0;
3868                 if( 0 == pSeq )
3869                 {
3870 //                  OGuard aGuard( Application::GetSolarMutex() );
3871 //                  if( 0 == pSeq )
3872                     {
3873                         static uno::Sequence< OUString > SvxShape_FrameServices;
3874 
3875                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_FrameServices, 2,
3876                             sUNO_service_drawing_FrameShape,
3877                             sUNO_service_drawing_Shape );
3878 
3879                         pSeq = &SvxShape_FrameServices;
3880                     }
3881                 }
3882 
3883                 return *pSeq;
3884             }
3885 
3886         case OBJ_UNO:
3887             {
3888                 static uno::Sequence< OUString > *pSeq = 0;
3889                 if( 0 == pSeq )
3890                 {
3891 //                  OGuard _aGuard( Application::GetSolarMutex() );
3892 //                  if( 0 == pSeq )
3893                     {
3894                         static uno::Sequence< OUString > SvxShape_UnoServices;
3895                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_UnoServices, 2,
3896                             sUNO_service_drawing_ControlShape,
3897                             sUNO_service_drawing_Shape );
3898 
3899                         pSeq = &SvxShape_UnoServices;
3900                     }
3901                 }
3902                 return *pSeq;
3903             }
3904 
3905         case OBJ_EDGE:
3906             {
3907                 static uno::Sequence< OUString > *pSeq = 0;
3908                 if( 0 == pSeq )
3909                 {
3910 //                  OGuard aGuard( Application::GetSolarMutex() );
3911 //                  if( 0 == pSeq )
3912                     {
3913                         static uno::Sequence< OUString > SvxShape_EdgeServices;
3914 
3915                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_EdgeServices,15,
3916                             sUNO_service_drawing_ConnectorShape,
3917                             sUNO_service_drawing_ConnectorProperties,
3918 
3919                             sUNO_service_drawing_Shape,
3920                             sUNO_service_drawing_LineProperties,
3921 
3922                             sUNO_service_drawing_Text,
3923                             sUNO_service_drawing_TextProperties,
3924                             sUNO_service_style_ParagraphProperties,
3925                             sUNO_service_style_ParagraphPropertiesComplex,
3926                             sUNO_service_style_ParagraphPropertiesAsian,
3927                             sUNO_service_style_CharacterProperties,
3928                             sUNO_service_style_CharacterPropertiesComplex,
3929                             sUNO_service_style_CharacterPropertiesAsian,
3930 
3931                             sUNO_service_drawing_PolyPolygonDescriptor,
3932                             sUNO_service_drawing_ShadowProperties,
3933                             sUNO_service_drawing_RotationDescriptor);
3934 
3935                         pSeq = &SvxShape_EdgeServices;
3936                     }
3937                 }
3938                 return *pSeq;
3939             }
3940         case OBJ_MEDIA:
3941             {
3942                 static uno::Sequence< OUString > *pSeq = 0;
3943                 if( 0 == pSeq )
3944                 {
3945 //                  OGuard aGuard( Application::GetSolarMutex() );
3946 //                  if( 0 == pSeq )
3947                     {
3948                         static uno::Sequence< OUString > SvxShape_MediaServices;
3949 
3950                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_MediaServices, 2,
3951                             sUNO_service_drawing_MediaShape,
3952                             sUNO_service_drawing_Shape);
3953 
3954                         pSeq = &SvxShape_MediaServices;
3955                     }
3956                 }
3957                 return *pSeq;
3958             }
3959         }
3960     }
3961     else if( mpObj.is() && mpObj->GetObjInventor() == FmFormInventor)
3962     {
3963 #if OSL_DEBUG_LEVEL > 0
3964         const sal_uInt16 nIdent = mpObj->GetObjIdentifier();
3965         OSL_ENSURE( nIdent == OBJ_UNO, "SvxShape::_getSupportedServiceNames: FmFormInventor, but no UNO object?" );
3966 #endif
3967         static uno::Sequence< OUString > *pSeq = 0;
3968         if( 0 == pSeq )
3969         {
3970 //                  OGuard aGuard( Application::GetSolarMutex() );
3971 //                  if( 0 == pSeq )
3972             {
3973                 static uno::Sequence< OUString > SvxShape_UnoServices;
3974                 comphelper::ServiceInfoHelper::addToSequence( SvxShape_UnoServices, 2,
3975                     sUNO_service_drawing_ControlShape,
3976                     sUNO_service_drawing_Shape );
3977 
3978                 pSeq = &SvxShape_UnoServices;
3979             }
3980         }
3981         return *pSeq;
3982     }
3983     OSL_ENSURE( false, "SvxShape::_getSupportedServiceNames: could not determine object type!" );
3984     uno::Sequence< OUString > aSeq;
3985     return aSeq;
3986 }
3987 
3988 //----------------------------------------------------------------------
supportsService(const OUString & ServiceName)3989 sal_Bool SAL_CALL SvxShape::supportsService( const OUString& ServiceName ) throw ( uno::RuntimeException )
3990 {
3991     Sequence< OUString > SupportedServices( getSupportedServiceNames() );
3992     const ::rtl::OUString * pArray = SupportedServices.getConstArray();
3993     const sal_Int32 nCount = SupportedServices.getLength();
3994     sal_Int32 i;
3995     for( i = 0; i < nCount; i++ )
3996         if( *pArray++ == ServiceName )
3997             return sal_True;
3998     return sal_False;
3999 }
4000 
4001 //----------------------------------------------------------------------
4002 
4003 // XGluePointsSupplier
getGluePoints()4004 uno::Reference< container::XIndexContainer > SAL_CALL SvxShape::getGluePoints()
4005     throw(uno::RuntimeException)
4006 {
4007     OGuard aGuard( Application::GetSolarMutex() );
4008     uno::Reference< container::XIndexContainer > xGluePoints( mxGluePoints );
4009 
4010     if( mpObj.is() && !xGluePoints.is() )
4011     {
4012         uno::Reference< container::XIndexContainer > xNew( SvxUnoGluePointAccess_createInstance( mpObj.get() ), uno::UNO_QUERY );
4013         mxGluePoints = xGluePoints = xNew;
4014     }
4015 
4016     return xGluePoints;
4017 }
4018 
4019 //----------------------------------------------------------------------
4020 
4021 // XChild
getParent()4022 uno::Reference< uno::XInterface > SAL_CALL SvxShape::getParent(  )
4023     throw(uno::RuntimeException)
4024 {
4025     OGuard aGuard( Application::GetSolarMutex() );
4026 
4027     if( mpObj.is() && mpObj->GetObjList() )
4028     {
4029         SdrObjList* pObjList = mpObj->GetObjList();
4030 
4031         switch( pObjList->GetListKind() )
4032         {
4033         case SDROBJLIST_GROUPOBJ:
4034             if( pObjList->GetOwnerObj()->ISA( SdrObjGroup ) )
4035                 return PTR_CAST( SdrObjGroup, pObjList->GetOwnerObj())->getUnoShape();
4036             else if( pObjList->GetOwnerObj()->ISA( E3dScene ) )
4037                 return PTR_CAST( E3dScene, pObjList->GetOwnerObj())->getUnoShape();
4038             break;
4039         case SDROBJLIST_DRAWPAGE:
4040         case SDROBJLIST_MASTERPAGE:
4041             return PTR_CAST( SdrPage, pObjList )->getUnoPage();
4042         default:
4043             DBG_ERROR( "SvxShape::getParent(  ): unexpected SdrObjListKind" );
4044             break;
4045         }
4046     }
4047 
4048     uno::Reference< uno::XInterface > xParent;
4049     return xParent;
4050 }
4051 
4052 //----------------------------------------------------------------------
4053 
setParent(const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> &)4054 void SAL_CALL SvxShape::setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& )
4055     throw(lang::NoSupportException, uno::RuntimeException)
4056 {
4057     throw lang::NoSupportException();
4058 }
4059 
4060 //----------------------------------------------------------------------
4061 
4062 /** called from the XActionLockable interface methods on initial locking */
lock()4063 void SvxShape::lock()
4064 {
4065 }
4066 
4067 //----------------------------------------------------------------------
4068 
4069 /** called from the XActionLockable interface methods on final unlock */
unlock()4070 void SvxShape::unlock()
4071 {
4072 }
4073 
4074 //----------------------------------------------------------------------
4075 
4076 // XActionLockable
isActionLocked()4077 sal_Bool SAL_CALL SvxShape::isActionLocked(  ) throw (::com::sun::star::uno::RuntimeException)
4078 {
4079     OGuard aGuard( Application::GetSolarMutex() );
4080 
4081     return mnLockCount != 0;
4082 }
4083 
4084 //----------------------------------------------------------------------
4085 
addActionLock()4086 void SAL_CALL SvxShape::addActionLock(  ) throw (::com::sun::star::uno::RuntimeException)
4087 {
4088     OGuard aGuard( Application::GetSolarMutex() );
4089 
4090     DBG_ASSERT( mnLockCount < 0xffff, "lock overflow in SvxShape!" );
4091     mnLockCount++;
4092 
4093     if( mnLockCount == 1 )
4094         lock();
4095 }
4096 
4097 //----------------------------------------------------------------------
4098 
removeActionLock()4099 void SAL_CALL SvxShape::removeActionLock(  ) throw (::com::sun::star::uno::RuntimeException)
4100 {
4101     OGuard aGuard( Application::GetSolarMutex() );
4102 
4103     DBG_ASSERT( mnLockCount > 0, "lock underflow in SvxShape!" );
4104     mnLockCount--;
4105 
4106     if( mnLockCount == 0 )
4107         unlock();
4108 }
4109 
4110 //----------------------------------------------------------------------
4111 
setActionLocks(sal_Int16 nLock)4112 void SAL_CALL SvxShape::setActionLocks( sal_Int16 nLock ) throw (::com::sun::star::uno::RuntimeException )
4113 {
4114     OGuard aGuard( Application::GetSolarMutex() );
4115 
4116     if( (mnLockCount == 0) && (nLock != 0) )
4117         unlock();
4118 
4119     if( (mnLockCount != 0) && (nLock == 0) )
4120         lock();
4121 
4122     mnLockCount = (sal_uInt16)nLock;
4123 }
4124 
4125 //----------------------------------------------------------------------
4126 
resetActionLocks()4127 sal_Int16 SAL_CALL SvxShape::resetActionLocks(  ) throw (::com::sun::star::uno::RuntimeException)
4128 {
4129     OGuard aGuard( Application::GetSolarMutex() );
4130 
4131     if( mnLockCount != 0 )
4132         unlock();
4133 
4134     sal_Int16 nOldLocks = (sal_Int16)mnLockCount;
4135     mnLockCount = 0;
4136 
4137     return nOldLocks;
4138 }
4139 
4140 //----------------------------------------------------------------------
4141 
4142 /** since polygon shapes can change theire kind during editing, we have
4143     to recheck it here.
4144     Circle shapes also change theire kind, but theire all treated equal
4145     so no update is necessary.
4146 */
updateShapeKind()4147 void SvxShape::updateShapeKind()
4148 {
4149     switch( mpImpl->mnObjId )
4150     {
4151         case OBJ_LINE:
4152         case OBJ_POLY:
4153         case OBJ_PLIN:
4154         case OBJ_PATHLINE:
4155         case OBJ_PATHFILL:
4156         case OBJ_FREELINE:
4157         case OBJ_FREEFILL:
4158         case OBJ_PATHPOLY:
4159         case OBJ_PATHPLIN:
4160         {
4161             const sal_uInt32 nId = mpObj->GetObjIdentifier();
4162 
4163             if( nId != mpImpl->mnObjId )
4164             {
4165                 mpImpl->mnObjId = nId;
4166 
4167             }
4168             break;
4169         }
4170     };
4171 }
4172 
4173 /***********************************************************************
4174 * class SvxShapeText                                                   *
4175 ***********************************************************************/
SvxShapeText()4176 SvxShapeText::SvxShapeText() throw ()
4177 : SvxShape(NULL, aSvxMapProvider.GetMap(SVXMAP_TEXT), aSvxMapProvider.GetPropertySet(SVXMAP_TEXT, SdrObject::GetGlobalDrawObjectItemPool()) ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() )
4178 {
4179 }
4180 
4181 //----------------------------------------------------------------------
SvxShapeText(SdrObject * pObject)4182 SvxShapeText::SvxShapeText( SdrObject* pObject ) throw ()
4183 : SvxShape( pObject, aSvxMapProvider.GetMap(SVXMAP_TEXT), aSvxMapProvider.GetPropertySet(SVXMAP_TEXT, SdrObject::GetGlobalDrawObjectItemPool()) ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() )
4184 {
4185     if( pObject && pObject->GetModel() )
4186         SetEditSource( new SvxTextEditSource( pObject, 0, static_cast< uno::XWeak * >( this ) ) );
4187 }
4188 
4189 //----------------------------------------------------------------------
SvxShapeText(SdrObject * pObject,const SfxItemPropertyMapEntry * pPropertyMap,const SvxItemPropertySet * pPropertySet)4190 SvxShapeText::SvxShapeText( SdrObject* pObject, const SfxItemPropertyMapEntry* pPropertyMap, const SvxItemPropertySet* pPropertySet ) throw ()
4191 : SvxShape( pObject, pPropertyMap, pPropertySet ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() )
4192 {
4193     if( pObject && pObject->GetModel() )
4194         SetEditSource( new SvxTextEditSource( pObject, 0, static_cast< uno::XWeak * >( this ) ) );
4195 }
4196 
4197 //----------------------------------------------------------------------
~SvxShapeText()4198 SvxShapeText::~SvxShapeText() throw ()
4199 {
4200     // check if only this instance is registered at the ranges
4201     DBG_ASSERT( (NULL == GetEditSource()) || (GetEditSource()->getRanges().size()==1),
4202         "svx::SvxShapeText::~SvxShapeText(), text shape with living text ranges destroyed!");
4203 }
4204 
Create(SdrObject * pNewObj,SvxDrawPage * pNewPage)4205 void SvxShapeText::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage )
4206 {
4207     if( pNewObj && (NULL == GetEditSource()))
4208         SetEditSource( new SvxTextEditSource( pNewObj, 0, static_cast< uno::XWeak* >(this) ) );
4209 
4210     SvxShape::Create( pNewObj, pNewPage );
4211 }
4212 
4213 // XInterface
4214 //----------------------------------------------------------------------
queryInterface(const uno::Type & rType)4215 uno::Any SAL_CALL SvxShapeText::queryInterface( const uno::Type & rType )
4216     throw( uno::RuntimeException )
4217 {
4218     return SvxShape::queryInterface( rType );
4219 }
4220 
4221 //----------------------------------------------------------------------
4222 
queryAggregation(const uno::Type & rType)4223 uno::Any SAL_CALL SvxShapeText::queryAggregation( const uno::Type & rType )
4224     throw( uno::RuntimeException )
4225 {
4226     uno::Any aAny( SvxShape::queryAggregation( rType ) );
4227     if( aAny.hasValue() )
4228         return aAny;
4229 
4230     return SvxUnoTextBase::queryAggregation( rType );
4231 }
4232 
4233 //----------------------------------------------------------------------
4234 
acquire()4235 void SAL_CALL SvxShapeText::acquire() throw()
4236 {
4237     SvxShape::acquire();
4238 }
4239 
4240 //----------------------------------------------------------------------
release()4241 void SAL_CALL SvxShapeText::release() throw()
4242 {
4243     SvxShape::release();
4244 }
4245 
4246 // XServiceInfo
4247 //----------------------------------------------------------------------
getImplementationName()4248 OUString SAL_CALL SvxShapeText::getImplementationName() throw( uno::RuntimeException )
4249 {
4250     static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM("SvxShapeText") );
4251     return aServiceName;
4252 }
4253 
4254 //----------------------------------------------------------------------
getSupportedServiceNames()4255 uno::Sequence< OUString > SAL_CALL SvxShapeText::getSupportedServiceNames() throw( uno::RuntimeException )
4256 {
4257     return SvxShape::getSupportedServiceNames();
4258 }
4259 
4260 //----------------------------------------------------------------------
supportsService(const OUString & ServiceName)4261 sal_Bool SAL_CALL SvxShapeText::supportsService( const OUString& ServiceName ) throw ( uno::RuntimeException )
4262 {
4263     return SvxShape::supportsService(ServiceName);
4264 }
4265 
4266     // XTypeProvider
4267 //----------------------------------------------------------------------
getTypes()4268 uno::Sequence< uno::Type > SAL_CALL SvxShapeText::getTypes()
4269     throw( uno::RuntimeException )
4270 {
4271     return SvxShape::getTypes();
4272 }
4273 
getSomething(const::com::sun::star::uno::Sequence<sal_Int8> & rId)4274 sal_Int64 SAL_CALL SvxShapeText::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw(::com::sun::star::uno::RuntimeException) \
4275 {
4276     const sal_Int64 nReturn = SvxShape::getSomething( rId );
4277     if( nReturn )
4278         return nReturn;
4279 
4280     return SvxUnoTextBase::getSomething( rId );
4281 }
4282 
4283 //----------------------------------------------------------------------
getImplementationId()4284 uno::Sequence< sal_Int8 > SAL_CALL SvxShapeText::getImplementationId()
4285     throw( uno::RuntimeException )
4286 {
4287     static ::cppu::OImplementationId* pID = NULL ;
4288 
4289     if ( pID == NULL )
4290     {
4291         // Ready for multithreading; get global mutex for first call of this method only! see before
4292         MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
4293 
4294         // Control these pointer again ... it can be, that another instance will be faster then these!
4295         if ( pID == NULL )
4296         {
4297             // Create a new static ID ...
4298             static ::cppu::OImplementationId aID( sal_False ) ;
4299             // ... and set his address to static pointer!
4300             pID = &aID ;
4301         }
4302     }
4303 
4304     return pID->getImplementationId() ;
4305 }
4306 
4307 //----------------------------------------------------------------------
4308 
4309 /** called from the XActionLockable interface methods on initial locking */
lock()4310 void SvxShapeText::lock()
4311 {
4312     SvxTextEditSource* pEditSource = (SvxTextEditSource*)GetEditSource();
4313     if( pEditSource )
4314         pEditSource->lock();
4315 }
4316 
4317 //----------------------------------------------------------------------
4318 
4319 /** called from the XActionLockable interface methods on final unlock */
unlock()4320 void SvxShapeText::unlock()
4321 {
4322     SvxTextEditSource* pEditSource = (SvxTextEditSource*)GetEditSource();
4323     if( pEditSource )
4324         pEditSource->unlock();
4325 }
4326 
4327 // ::com::sun::star::text::XTextRange
getStart()4328 uno::Reference< text::XTextRange > SAL_CALL SvxShapeText::getStart() throw(uno::RuntimeException)
4329 {
4330     ::vos::OGuard aGuard( Application::GetSolarMutex() );
4331     SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL;
4332     if( pForwarder )
4333         ::GetSelection( maSelection, pForwarder );
4334     return SvxUnoTextBase::getStart();
4335 
4336 }
4337 
getEnd()4338 uno::Reference< text::XTextRange > SAL_CALL SvxShapeText::getEnd() throw(uno::RuntimeException)
4339 {
4340     ::vos::OGuard aGuard( Application::GetSolarMutex() );
4341     SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL;
4342     if( pForwarder )
4343         ::GetSelection( maSelection, pForwarder );
4344     return SvxUnoTextBase::getEnd();
4345 }
4346 
getString()4347 OUString SAL_CALL SvxShapeText::getString() throw(uno::RuntimeException)
4348 {
4349     ::vos::OGuard aGuard( Application::GetSolarMutex() );
4350     SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL;
4351     if( pForwarder )
4352         ::GetSelection( maSelection, pForwarder );
4353     return SvxUnoTextBase::getString();
4354 }
4355 
4356 
setString(const OUString & aString)4357 void SAL_CALL SvxShapeText::setString( const OUString& aString ) throw(uno::RuntimeException)
4358 {
4359     ::vos::OGuard aGuard( Application::GetSolarMutex() );
4360     SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL;
4361     if( pForwarder )
4362         ::GetSelection( maSelection, pForwarder );
4363     SvxUnoTextBase::setString( aString );
4364 }
4365 
4366 // overide these for special property handling in subcasses. Return true if property is handled
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)4367 bool SvxShapeText::setPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
4368 {
4369     // HACK-fix #99090#
4370     // since SdrTextObj::SetVerticalWriting exchanges
4371     // SDRATTR_TEXT_AUTOGROWWIDTH and SDRATTR_TEXT_AUTOGROWHEIGHT,
4372     // we have to set the textdirection here
4373 
4374     if( pProperty->nWID == SDRATTR_TEXTDIRECTION )
4375     {
4376         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObj.get() );
4377         if( pTextObj )
4378         {
4379             com::sun::star::text::WritingMode eMode;
4380             if( rValue >>= eMode )
4381             {
4382                 pTextObj->SetVerticalWriting( eMode == com::sun::star::text::WritingMode_TB_RL );
4383             }
4384         }
4385         return true;
4386     }
4387     return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
4388 }
4389 
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)4390 bool SvxShapeText::getPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
4391 {
4392     if( pProperty->nWID == SDRATTR_TEXTDIRECTION )
4393     {
4394         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObj.get() );
4395         if( pTextObj && pTextObj->IsVerticalWriting() )
4396             rValue <<= com::sun::star::text::WritingMode_TB_RL;
4397         else
4398             rValue <<= com::sun::star::text::WritingMode_LR_TB;
4399         return true;
4400     }
4401 
4402     return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
4403 }
4404 
getPropertyStateImpl(const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::beans::PropertyState & rState)4405 bool SvxShapeText::getPropertyStateImpl( const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::beans::PropertyState& rState ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
4406 {
4407     return SvxShape::getPropertyStateImpl( pProperty, rState );
4408 }
4409 
setPropertyToDefaultImpl(const SfxItemPropertySimpleEntry * pProperty)4410 bool SvxShapeText::setPropertyToDefaultImpl( const SfxItemPropertySimpleEntry* pProperty ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
4411 {
4412     return SvxShape::setPropertyToDefaultImpl( pProperty );
4413 }
4414 
4415 /***********************************************************************
4416 * class SvxShapeRect                                                   *
4417 ***********************************************************************/
DBG_NAME(SvxShapeRect)4418 DBG_NAME(SvxShapeRect)
4419 SvxShapeRect::SvxShapeRect( SdrObject* pObj ) throw()
4420 : SvxShapeText( pObj, aSvxMapProvider.GetMap(SVXMAP_SHAPE), aSvxMapProvider.GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool()))
4421 {
4422     DBG_CTOR(SvxShapeRect,NULL);
4423 }
4424 
~SvxShapeRect()4425 SvxShapeRect::~SvxShapeRect() throw()
4426 {
4427     DBG_DTOR(SvxShapeRect,NULL);
4428 }
4429 
queryInterface(const uno::Type & rType)4430 uno::Any SAL_CALL SvxShapeRect::queryInterface( const uno::Type & rType ) throw(uno::RuntimeException)
4431 {
4432     return SvxShapeText::queryInterface( rType );
4433 }
4434 
queryAggregation(const uno::Type & rType)4435 uno::Any SAL_CALL SvxShapeRect::queryAggregation( const uno::Type & rType ) throw(uno::RuntimeException)
4436 {
4437     return SvxShapeText::queryAggregation( rType );
4438 }
4439 
acquire()4440 void SAL_CALL SvxShapeRect::acquire() throw()
4441 {
4442     OWeakAggObject::acquire();
4443 }
4444 
release()4445 void SAL_CALL SvxShapeRect::release() throw()
4446 {
4447     OWeakAggObject::release();
4448 }
4449 //----------------------------------------------------------------------
4450 // XServiceInfo
4451 //----------------------------------------------------------------------
getSupportedServiceNames(void)4452 uno::Sequence< OUString > SvxShapeRect::getSupportedServiceNames(void) throw( uno::RuntimeException )
4453 {
4454     return SvxShape::getSupportedServiceNames();
4455 }
4456 
4457 /** returns a StarOffice API wrapper for the given SdrObject */
GetXShapeForSdrObject(SdrObject * pObj)4458 uno::Reference< drawing::XShape > GetXShapeForSdrObject( SdrObject* pObj ) throw ()
4459 {
4460     uno::Reference< drawing::XShape > xShape( pObj->getUnoShape(), uno::UNO_QUERY );
4461     return xShape;
4462 }
4463 
4464 /** returns the SdrObject from the given StarOffice API wrapper */
GetSdrObjectFromXShape(uno::Reference<drawing::XShape> xShape)4465 SdrObject* GetSdrObjectFromXShape( uno::Reference< drawing::XShape > xShape ) throw()
4466 {
4467     SvxShape* pShape = SvxShape::getImplementation( xShape );
4468     return pShape ? pShape->GetSdrObject() : 0;
4469 }
4470 
4471 //----------------------------------------------------------------------
4472 
getSdrObjectFromXShape(const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & xInt)4473 SdrObject* SdrObject::getSdrObjectFromXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInt )
4474 {
4475     SvxShape* pSvxShape = SvxShape::getImplementation( xInt );
4476     return pSvxShape ? pSvxShape->GetSdrObject() : 0;
4477 }
4478 
SvxItemPropertySet_getPropertyValue(const SvxItemPropertySet & rPropSet,const SfxItemPropertySimpleEntry * pMap,const SfxItemSet & rSet)4479 uno::Any SvxItemPropertySet_getPropertyValue( const SvxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry* pMap, const SfxItemSet& rSet )
4480 {
4481     if(!pMap || !pMap->nWID)
4482         return uno::Any();
4483 
4484     // Check is for items that store either metric values if thei are positiv or percentage if thei are negativ.
4485     bool bDontConvertNegativeValues = ( pMap->nWID == XATTR_FILLBMP_SIZEX || pMap->nWID == XATTR_FILLBMP_SIZEY );
4486     return rPropSet.getPropertyValue( pMap, rSet, (pMap->nWID != SDRATTR_XMLATTRIBUTES), bDontConvertNegativeValues );
4487 }
4488 
SvxItemPropertySet_setPropertyValue(const SvxItemPropertySet & rPropSet,const SfxItemPropertySimpleEntry * pMap,const uno::Any & rVal,SfxItemSet & rSet)4489 void SvxItemPropertySet_setPropertyValue( const SvxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry* pMap, const uno::Any& rVal, SfxItemSet& rSet )
4490 {
4491     if(!pMap || !pMap->nWID)
4492         return;
4493 
4494     bool bDontConvertNegativeValues = ( pMap->nWID == XATTR_FILLBMP_SIZEX || pMap->nWID == XATTR_FILLBMP_SIZEY );
4495     rPropSet.setPropertyValue( pMap, rVal, rSet, bDontConvertNegativeValues );
4496 }
4497