xref: /trunk/main/svx/source/unodraw/unoshape.cxx (revision b597708ba18998e5b62934c916addb8de3415a8a)
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 
153     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:
171     ShapePositionProvider( const SvxShapeImpl& _shapeImpl )
172         :PropertyValueProvider( _shapeImpl.mrAntiImpl, "Position" )
173     {
174     }
175 
176 protected:
177     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:
187     ShapeSizeProvider( const SvxShapeImpl& _shapeImpl )
188         :PropertyValueProvider( _shapeImpl.mrAntiImpl, "Size" )
189     {
190     }
191 
192 protected:
193     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 
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 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
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 
279 void SvxShape::TakeSdrObjectOwnership()
280 {
281     mpImpl->mbHasSdrObjectOwnership = true;
282 }
283 
284 //----------------------------------------------------------------------
285 
286 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 
297 void SvxShape::setShapeKind( sal_uInt32 nKind )
298 {
299     mpImpl->mnObjId = nKind;
300 }
301 
302 //----------------------------------------------------------------------
303 
304 sal_uInt32 SvxShape::getShapeKind() const
305 {
306     return mpImpl->mnObjId;
307 }
308 
309 //----------------------------------------------------------------------
310 
311 void SvxShape::setMaster( SvxShapeMaster* pMaster )
312 {
313     mpImpl->mpMaster = pMaster;
314 }
315 
316 SvxShapeMaster* SvxShape::getMaster()
317 {
318     return mpImpl->mpMaster;
319 }
320 
321 const SvxShapeMaster* SvxShape::getMaster() const
322 {
323     return mpImpl->mpMaster;
324 }
325 
326 //----------------------------------------------------------------------
327 
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 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
381 SvxShape* SvxShape::GetShapeForSdrObj( SdrObject* pObj ) throw()
382 {
383     return getImplementation( pObj->getUnoShape() );
384 }
385 
386 //----------------------------------------------------------------------
387 ::svx::PropertyChangeNotifier& SvxShape::getShapePropertyChangeNotifier()
388 {
389     return mpImpl->maPropertyNotifier;
390 }
391 
392 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
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 
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 
552 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
579 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 //----------------------------------------------------------------------
609 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
637 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 //----------------------------------------------------------------------
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 
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 
731 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 
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 
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 
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 
1110 Reference< uno::XInterface > SvxShape_NewInstance()
1111 {
1112     return uno::Reference< uno::XInterface >(static_cast< OWeakObject* >( new SvxShape() ) );
1113 }
1114 
1115 //----------------------------------------------------------------------
1116 
1117 void SvxShape::onUserCall(SdrUserCallType /*_eUserCall*/, const Rectangle& /*_rNewBoundRect*/ )
1118 {
1119     // obsolete, not called anymore
1120 }
1121 
1122 //----------------------------------------------------------------------
1123 // SfxListener
1124 //----------------------------------------------------------------------
1125 
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 
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 
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 
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 
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 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
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 //----------------------------------------------------------------------
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         Rectangle aRect( svx_getLogicRectHack(mpObj.get()) );
1317         Size aLocalSize( rSize.Width, rSize.Height );
1318         ForceMetricToItemPoolMetric(aLocalSize);
1319 
1320         if(mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_MEASURE )
1321         {
1322             Fraction aWdt(aLocalSize.Width(),aRect.Right()-aRect.Left());
1323             Fraction aHgt(aLocalSize.Height(),aRect.Bottom()-aRect.Top());
1324             Point aPt = mpObj->GetSnapRect().TopLeft();
1325             mpObj->Resize(aPt,aWdt,aHgt);
1326         }
1327         else
1328         {
1329             //aRect.SetSize(aLocalSize); // this call substract 1 // http://www.openoffice.org/issues/show_bug.cgi?id=83193
1330             if ( !aLocalSize.Width() )
1331             {
1332                 aRect.Right() = RECT_EMPTY;
1333             }
1334             else
1335                 aRect.setWidth(aLocalSize.Width());
1336             if ( !aLocalSize.Height() )
1337             {
1338                 aRect.Bottom() = RECT_EMPTY;
1339             }
1340             else
1341                 aRect.setHeight(aLocalSize.Height());
1342 
1343             svx_setLogicRectHack( mpObj.get(), aRect );
1344         }
1345 
1346         mpModel->SetChanged();
1347     }
1348     maSize = rSize;
1349 }
1350 
1351 //----------------------------------------------------------------------
1352 
1353 // XNamed
1354 OUString SAL_CALL SvxShape::getName(  ) throw(::com::sun::star::uno::RuntimeException)
1355 {
1356     OGuard aGuard( Application::GetSolarMutex() );
1357     if( mpObj.is() )
1358     {
1359         return mpObj->GetName();
1360     }
1361     else
1362     {
1363         return maShapeName;
1364     }
1365 }
1366 
1367 //----------------------------------------------------------------------
1368 
1369 void SAL_CALL SvxShape::setName( const ::rtl::OUString& aName ) throw(::com::sun::star::uno::RuntimeException)
1370 {
1371     OGuard aGuard( Application::GetSolarMutex() );
1372     if( mpObj.is() )
1373     {
1374         mpObj->SetName( aName );
1375     }
1376     else
1377     {
1378         maShapeName = aName;
1379     }
1380 }
1381 
1382 // XShapeDescriptor
1383 
1384 //----------------------------------------------------------------------
1385 OUString SAL_CALL SvxShape::getShapeType() throw(uno::RuntimeException)
1386 {
1387     if( 0 == maShapeType.getLength() )
1388     {
1389         UHashMapEntry* pMap = pSdrShapeIdentifierMap;
1390         while ( ( pMap->nId != mpImpl->mnObjId ) && pMap->aIdentifier.getLength() )
1391             ++pMap;
1392 
1393         if ( pMap->aIdentifier.getLength() )
1394         {
1395             return pMap->aIdentifier;
1396         }
1397         else
1398         {
1399             DBG_ERROR("[CL] unknown SdrObjekt identifier");
1400         }
1401     }
1402 
1403     return maShapeType;
1404 }
1405 
1406 // XComponent
1407 
1408 //----------------------------------------------------------------------
1409 void SAL_CALL SvxShape::dispose() throw(uno::RuntimeException)
1410 {
1411     OGuard aGuard( Application::GetSolarMutex() );
1412 
1413     if( mpImpl->mbDisposing )
1414         return; // caught a recursion
1415 
1416     mpImpl->mbDisposing = true;
1417 
1418     lang::EventObject aEvt;
1419     aEvt.Source = *(OWeakAggObject*) this;
1420     mpImpl->maDisposeListeners.disposeAndClear(aEvt);
1421     mpImpl->maPropertyNotifier.disposing();
1422 
1423     if ( mpObj.is() )
1424     {
1425         bool bFreeSdrObject = false;
1426 
1427         if ( mpObj->IsInserted() && mpObj->GetPage() )
1428         {
1429             OSL_ENSURE( HasSdrObjectOwnership(), "SvxShape::dispose: is the below code correct?" );
1430                 // normally, we are allowed to free the SdrObject only if we have its ownership.
1431                 // Why isn't this checked here?
1432 
1433             SdrPage* pPage = mpObj->GetPage();
1434             // SdrObject aus der Page loeschen
1435             sal_uInt32 nCount = pPage->GetObjCount();
1436             for ( sal_uInt32 nNum = 0; nNum < nCount; ++nNum )
1437             {
1438                 if ( pPage->GetObj( nNum ) == mpObj.get() )
1439                 {
1440                     OSL_VERIFY( pPage->RemoveObject( nNum ) == mpObj.get() );
1441                     bFreeSdrObject = true;
1442                     break;
1443                 }
1444             }
1445         }
1446 
1447         mpObj->setUnoShape( NULL, SdrObject::GrantXShapeAccess() );
1448 
1449         if ( bFreeSdrObject )
1450         {
1451             // in case we have the ownership of the SdrObject, a Free
1452             // would do nothing. So ensure the ownership is reset.
1453             mpImpl->mbHasSdrObjectOwnership = false;
1454             SdrObject* pObject = mpObj.get();
1455             SdrObject::Free( pObject );
1456         }
1457     }
1458 
1459     if( mpModel )
1460     {
1461         EndListening( *mpModel );
1462         mpModel = NULL;
1463     }
1464 }
1465 
1466 //----------------------------------------------------------------------
1467 
1468 void SAL_CALL SvxShape::addEventListener( const Reference< lang::XEventListener >& xListener )
1469     throw(uno::RuntimeException)
1470 {
1471     mpImpl->maDisposeListeners.addInterface(xListener);
1472 }
1473 
1474 //----------------------------------------------------------------------
1475 
1476 void SAL_CALL SvxShape::removeEventListener( const Reference< lang::XEventListener >& aListener ) throw(uno::RuntimeException)
1477 {
1478    mpImpl->maDisposeListeners.removeInterface(aListener);
1479 }
1480 
1481 // XPropertySet
1482 
1483 //----------------------------------------------------------------------
1484 
1485 Reference< beans::XPropertySetInfo > SAL_CALL
1486     SvxShape::getPropertySetInfo() throw(uno::RuntimeException)
1487 {
1488     if( mpImpl->mpMaster )
1489     {
1490         return mpImpl->mpMaster->getPropertySetInfo();
1491     }
1492     else
1493     {
1494         return _getPropertySetInfo();
1495     }
1496 }
1497 
1498 Reference< beans::XPropertySetInfo > SAL_CALL
1499     SvxShape::_getPropertySetInfo() throw(uno::RuntimeException)
1500 {
1501     return mpPropSet->getPropertySetInfo();
1502 }
1503 
1504 //----------------------------------------------------------------------
1505 
1506 void SAL_CALL SvxShape::addPropertyChangeListener( const OUString& _propertyName, const Reference< beans::XPropertyChangeListener >& _listener  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1507 {
1508     ::osl::MutexGuard aGuard( maMutex );
1509     mpImpl->maPropertyNotifier.addPropertyChangeListener( _propertyName, _listener );
1510 }
1511 
1512 //----------------------------------------------------------------------
1513 
1514 void SAL_CALL SvxShape::removePropertyChangeListener( const OUString& _propertyName, const Reference< beans::XPropertyChangeListener >& _listener  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1515 {
1516     ::osl::MutexGuard aGuard( maMutex );
1517     mpImpl->maPropertyNotifier.removePropertyChangeListener( _propertyName, _listener );
1518 }
1519 
1520 //----------------------------------------------------------------------
1521 
1522 void SAL_CALL SvxShape::addVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1523 {
1524     OSL_ENSURE( false, "SvxShape::addVetoableChangeListener: don't have any vetoable properties, so why ...?" );
1525 }
1526 
1527 //----------------------------------------------------------------------
1528 
1529 void SAL_CALL SvxShape::removeVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1530 {
1531     OSL_ENSURE( false, "SvxShape::removeVetoableChangeListener: don't have any vetoable properties, so why ...?" );
1532 }
1533 
1534 //----------------------------------------------------------------------
1535 
1536 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const OUString& rName )
1537 {
1538     SfxItemSet aSet( mpModel->GetItemPool(),    (sal_uInt16)nWID, (sal_uInt16)nWID );
1539 
1540     if( SetFillAttribute( nWID, rName, aSet, mpModel ) )
1541     {
1542         //mpObj->SetItemSetAndBroadcast(aSet);
1543         mpObj->SetMergedItemSetAndBroadcast(aSet);
1544 
1545         return sal_True;
1546     }
1547     else
1548     {
1549         return sal_False;
1550     }
1551 }
1552 
1553 //----------------------------------------------------------------------
1554 
1555 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const ::rtl::OUString& rName, SfxItemSet& rSet, SdrModel* pModel )
1556 {
1557     // check if an item with the given name and which id is inside the models
1558     // pool or the stylesheet pool, if found its puttet in the itemse
1559     if( !SetFillAttribute( nWID, rName, rSet ) )
1560     {
1561         // we did not find such item in one of the pools, so we check
1562         // the property lists that are loaded for the model for items
1563         // that support such.
1564         String aStrName;
1565         SvxUnogetInternalNameForItem( (sal_Int16)nWID, rName, aStrName );
1566 
1567         switch( nWID )
1568         {
1569         case XATTR_FILLBITMAP:
1570         {
1571             XBitmapListSharedPtr aBitmapList = pModel->GetBitmapListFromSdrModel();
1572 
1573             if( !aBitmapList.get() )
1574                 return sal_False;
1575 
1576             long nPos = aBitmapList->GetIndex(aStrName);
1577             if( nPos == -1 )
1578                 return sal_False;
1579 
1580             XBitmapEntry* pEntry = aBitmapList->GetBitmap( nPos );
1581             XFillBitmapItem aBmpItem;
1582             aBmpItem.SetWhich( XATTR_FILLBITMAP );
1583             aBmpItem.SetName( rName );
1584             aBmpItem.SetGraphicObject(pEntry->GetGraphicObject());
1585             rSet.Put( aBmpItem );
1586             break;
1587         }
1588         case XATTR_FILLGRADIENT:
1589         {
1590             XGradientListSharedPtr aGradientList = pModel->GetGradientListFromSdrModel();
1591 
1592             if( !aGradientList.get() )
1593                 return sal_False;
1594 
1595             long nPos = aGradientList->GetIndex(aStrName);
1596             if( nPos == -1 )
1597                 return sal_False;
1598 
1599             XGradientEntry* pEntry = aGradientList->GetGradient( nPos );
1600             XFillGradientItem aGrdItem;
1601             aGrdItem.SetWhich( XATTR_FILLGRADIENT );
1602             aGrdItem.SetName( rName );
1603             aGrdItem.SetGradientValue( pEntry->GetGradient() );
1604             rSet.Put( aGrdItem );
1605             break;
1606         }
1607         case XATTR_FILLHATCH:
1608         {
1609             XHatchListSharedPtr aHatchList = pModel->GetHatchListFromSdrModel();
1610 
1611             if( !aHatchList.get() )
1612                 return sal_False;
1613 
1614             long nPos = aHatchList->GetIndex(aStrName);
1615             if( nPos == -1 )
1616                 return sal_False;
1617 
1618             XHatchEntry* pEntry = aHatchList->GetHatch( nPos );
1619             XFillHatchItem aHatchItem;
1620             aHatchItem.SetWhich( XATTR_FILLHATCH );
1621             aHatchItem.SetName( rName );
1622             aHatchItem.SetHatchValue( pEntry->GetHatch() );
1623             rSet.Put( aHatchItem );
1624             break;
1625         }
1626         case XATTR_LINEEND:
1627         case XATTR_LINESTART:
1628         {
1629             XLineEndListSharedPtr aLineEndList = pModel->GetLineEndListFromSdrModel();
1630 
1631             if( !aLineEndList.get() )
1632                 return sal_False;
1633 
1634             long nPos = aLineEndList->GetIndex(aStrName);
1635             if( nPos == -1 )
1636                 return sal_False;
1637 
1638             XLineEndEntry* pEntry = aLineEndList->GetLineEnd( nPos );
1639             if( XATTR_LINEEND == nWID )
1640             {
1641                 XLineEndItem aLEItem;
1642                 aLEItem.SetWhich( XATTR_LINEEND );
1643                 aLEItem.SetName( rName );
1644                 aLEItem.SetLineEndValue( pEntry->GetLineEnd() );
1645                 rSet.Put( aLEItem );
1646             }
1647             else
1648             {
1649                 XLineStartItem aLSItem;
1650                 aLSItem.SetWhich( XATTR_LINESTART );
1651                 aLSItem.SetName( rName );
1652                 aLSItem.SetLineStartValue( pEntry->GetLineEnd() );
1653                 rSet.Put( aLSItem );
1654             }
1655 
1656             break;
1657         }
1658         case XATTR_LINEDASH:
1659         {
1660             XDashListSharedPtr aDashList = pModel->GetDashListFromSdrModel();
1661 
1662             if( !aDashList.get() )
1663                 return sal_False;
1664 
1665             long nPos = aDashList->GetIndex(aStrName);
1666             if( nPos == -1 )
1667                 return sal_False;
1668 
1669             XDashEntry* pEntry = aDashList->GetDash( nPos );
1670             XLineDashItem aDashItem;
1671             aDashItem.SetWhich( XATTR_LINEDASH );
1672             aDashItem.SetName( rName );
1673             aDashItem.SetDashValue( pEntry->GetDash() );
1674             rSet.Put( aDashItem );
1675             break;
1676         }
1677         default:
1678             return sal_False;
1679         }
1680     }
1681 
1682     return sal_True;
1683 }
1684 
1685 //----------------------------------------------------------------------
1686 
1687 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const OUString& rName, SfxItemSet& rSet )
1688 {
1689     String aName;
1690     SvxUnogetInternalNameForItem( (sal_Int16)nWID, rName, aName );
1691 
1692     if( aName.Len() == 0 )
1693     {
1694         switch( nWID )
1695         {
1696         case XATTR_LINEEND:
1697         case XATTR_LINESTART:
1698             {
1699                 const String aEmpty;
1700                 const basegfx::B2DPolyPolygon aEmptyPoly;
1701                 if( nWID == XATTR_LINEEND )
1702                     rSet.Put( XLineEndItem( aEmpty, aEmptyPoly ) );
1703                 else
1704                     rSet.Put( XLineStartItem( aEmpty, aEmptyPoly ) );
1705 
1706                 return sal_True;
1707             }
1708         case XATTR_FILLFLOATTRANSPARENCE:
1709             {
1710                 // #85953# Set a disabled XFillFloatTransparenceItem
1711                 rSet.Put(XFillFloatTransparenceItem());
1712 
1713                 return sal_True;
1714             }
1715         }
1716 
1717         return sal_False;
1718     }
1719 
1720     const SfxItemPool* pPool = rSet.GetPool();
1721 
1722     const String aSearchName( aName );
1723     const sal_uInt32 nCount = pPool->GetItemCount2((sal_uInt16)nWID);
1724     const NameOrIndex* pItem;
1725 
1726     for( sal_uInt32 nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1727     {
1728         pItem = (NameOrIndex*)pPool->GetItem2((sal_uInt16)nWID, nSurrogate);
1729         if( pItem && ( pItem->GetName() == aSearchName ) )
1730         {
1731             rSet.Put( *pItem );
1732             return sal_True;
1733         }
1734     }
1735 
1736     return sal_False;
1737 }
1738 
1739 //----------------------------------------------------------------------
1740 
1741 void SAL_CALL SvxShape::setPropertyValue( const OUString& rPropertyName, const uno::Any& rVal )
1742     throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
1743 {
1744     if( mpImpl->mpMaster )
1745     {
1746         mpImpl->mpMaster->setPropertyValue( rPropertyName, rVal );
1747     }
1748     else
1749     {
1750         _setPropertyValue( rPropertyName, rVal );
1751     }
1752 }
1753 
1754 void SAL_CALL SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& rVal )
1755     throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
1756 {
1757     OGuard aGuard( Application::GetSolarMutex() );
1758 
1759     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(rPropertyName);
1760 
1761     if( mpObj.is() && mpModel )
1762     {
1763         if( pMap == NULL )
1764             throw beans::UnknownPropertyException();
1765 
1766         if( (pMap->nFlags & beans::PropertyAttribute::READONLY ) != 0 )
1767             throw beans::PropertyVetoException();
1768 
1769         mpModel->SetChanged();
1770 
1771         if(!setPropertyValueImpl( rPropertyName, pMap, rVal ) )
1772         {
1773             DBG_ASSERT( pMap->nWID == SDRATTR_TEXTDIRECTION || pMap->nWID < SDRATTR_NOTPERSIST_FIRST || pMap->nWID > SDRATTR_NOTPERSIST_LAST, "Not persist item not handled!" );
1774             DBG_ASSERT( pMap->nWID < OWN_ATTR_VALUE_START || pMap->nWID > OWN_ATTR_VALUE_END, "Not item property not handled!" );
1775 
1776             sal_Bool bIsNotPersist = pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST && pMap->nWID != SDRATTR_TEXTDIRECTION;
1777 
1778             if( pMap->nWID == SDRATTR_ECKENRADIUS )
1779             {
1780                 sal_Int32 nCornerRadius = 0;
1781                 if( !(rVal >>= nCornerRadius) || (nCornerRadius < 0) || (nCornerRadius > 5000000))
1782                     throw IllegalArgumentException();
1783             }
1784 
1785             SfxItemSet* pSet;
1786             if( mbIsMultiPropertyCall && !bIsNotPersist )
1787             {
1788                 if( mpImpl->mpItemSet == NULL )
1789                 {
1790                     pSet = mpImpl->mpItemSet = mpObj->GetMergedItemSet().Clone();
1791                 }
1792                 else
1793                 {
1794                     pSet = mpImpl->mpItemSet;
1795                 }
1796             }
1797             else
1798             {
1799                 pSet = new SfxItemSet( mpModel->GetItemPool(),  pMap->nWID, pMap->nWID);
1800             }
1801 
1802             if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET )
1803                 pSet->Put(mpObj->GetMergedItem(pMap->nWID));
1804 
1805             if( !SvxUnoTextRangeBase::SetPropertyValueHelper( *pSet, pMap, rVal, *pSet ))
1806             {
1807                 if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET )
1808                 {
1809                     if(bIsNotPersist)
1810                     {
1811                         // Not-Persistant Attribute, hole diese extra
1812                         mpObj->TakeNotPersistAttr(*pSet, sal_False);
1813                     }
1814                 }
1815 
1816                 if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET )
1817                 {
1818                     // Default aus ItemPool holen
1819                     if(mpModel->GetItemPool().IsWhich(pMap->nWID))
1820                         pSet->Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID));
1821                 }
1822 
1823                 if( pSet->GetItemState( pMap->nWID ) == SFX_ITEM_SET )
1824                 {
1825                     SvxItemPropertySet_setPropertyValue( *mpPropSet, pMap, rVal, *pSet );
1826                 }
1827             }
1828 
1829             if(bIsNotPersist)
1830             {
1831                 // Not-Persist Attribute extra setzen
1832                 mpObj->ApplyNotPersistAttr( *pSet );
1833                 delete pSet;
1834             }
1835             else
1836             {
1837                 // if we have a XMultiProperty call then the item set
1838                 // will be set in setPropertyValues later
1839                 if( !mbIsMultiPropertyCall )
1840                 {
1841                     mpObj->SetMergedItemSetAndBroadcast( *pSet );
1842 
1843                     delete pSet;
1844                 }
1845             }
1846             return;
1847         }
1848     }
1849     else
1850     {
1851         // since we have no actual sdr object right now
1852         // remember all properties in a list. These
1853         // properties will be set when the sdr object is
1854         // created
1855 
1856         if(pMap && pMap->nWID)
1857 // Fixme: We should throw a UnknownPropertyException here.
1858 //        But since this class is aggregated from classes
1859 //        that support additional properties that we don't
1860 //        know here we silently store *all* properties, even
1861 //        if they may be not supported after creation
1862             mpPropSet->setPropertyValue( pMap, rVal );
1863     }
1864 }
1865 
1866 //----------------------------------------------------------------------
1867 
1868 uno::Any SAL_CALL SvxShape::getPropertyValue( const OUString& PropertyName )
1869     throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1870 {
1871     if ( mpImpl->mpMaster )
1872         return mpImpl->mpMaster->getPropertyValue( PropertyName );
1873     else
1874         return _getPropertyValue( PropertyName );
1875 }
1876 
1877 //----------------------------------------------------------------------
1878 
1879 uno::Any SvxShape::_getPropertyValue( const OUString& PropertyName )
1880     throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1881 {
1882     OGuard aGuard( Application::GetSolarMutex() );
1883 
1884     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName);
1885 
1886     uno::Any aAny;
1887     if( mpObj.is() && mpModel )
1888     {
1889         if(pMap == NULL )
1890             throw beans::UnknownPropertyException();
1891 
1892         if( !getPropertyValueImpl( PropertyName, pMap, aAny ) )
1893         {
1894             DBG_ASSERT( pMap->nWID == SDRATTR_TEXTDIRECTION || (pMap->nWID < SDRATTR_NOTPERSIST_FIRST || pMap->nWID > SDRATTR_NOTPERSIST_LAST), "Not persist item not handled!" );
1895             DBG_ASSERT( pMap->nWID < OWN_ATTR_VALUE_START || pMap->nWID > OWN_ATTR_VALUE_END, "Not item property not handled!" );
1896 
1897             SfxItemSet aSet( mpModel->GetItemPool(),    pMap->nWID, pMap->nWID);
1898             aSet.Put(mpObj->GetMergedItem(pMap->nWID));
1899 
1900             if(SvxUnoTextRangeBase::GetPropertyValueHelper(  aSet, pMap, aAny ))
1901                 return aAny;
1902 
1903             if(!aSet.Count())
1904             {
1905                 if(pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST)
1906                 {
1907                     // Not-Persistant Attribute, hole diese extra
1908                     mpObj->TakeNotPersistAttr(aSet, sal_False);
1909                 }
1910             }
1911 
1912             if(!aSet.Count())
1913             {
1914                 // Default aus ItemPool holen
1915                 if(mpModel->GetItemPool().IsWhich(pMap->nWID))
1916                     aSet.Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID));
1917             }
1918 
1919             if(aSet.Count())
1920                 aAny = GetAnyForItem( aSet, pMap );
1921         }
1922     }
1923     else
1924     {
1925 
1926 // Fixme: we should return default values for OWN_ATTR !
1927 
1928         if(pMap && pMap->nWID)
1929 //      FixMe: see setPropertyValue
1930             aAny = mpPropSet->getPropertyValue( pMap );
1931 
1932     }
1933     return aAny;
1934 }
1935 
1936 //----------------------------------------------------------------------
1937 
1938 // XMultiPropertySet
1939 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)
1940 {
1941     OGuard aSolarGuard( Application::GetSolarMutex() );
1942 
1943     const sal_Int32 nCount = aPropertyNames.getLength();
1944     const OUString* pNames = aPropertyNames.getConstArray();
1945 
1946     const uno::Any* pValues = aValues.getConstArray();
1947 
1948     // make sure mbIsMultiPropertyCall and mpImpl->mpItemSet are
1949     // reseted even when an execption is thrown
1950     const ::comphelper::ScopeGuard aGuard( boost::bind( &SvxShape::endSetPropertyValues, this ) );
1951 
1952     mbIsMultiPropertyCall = sal_True;
1953 
1954     if( mpImpl->mpMaster )
1955     {
1956         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pValues++ )
1957         {
1958             try
1959             {
1960                 setPropertyValue( *pNames, *pValues );
1961             }
1962             catch( beans::UnknownPropertyException& e )
1963             {
1964                 (void)e;
1965             }
1966             catch( uno::Exception& ex )
1967             {
1968                 (void)ex;
1969             }
1970         }
1971     }
1972     else
1973     {
1974         uno::Reference< beans::XPropertySet > xSet;
1975         queryInterface( ::getCppuType( (const uno::Reference< beans::XPropertySet >*) 0) ) >>= xSet;
1976 
1977         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pValues++ )
1978         {
1979             try
1980             {
1981                 xSet->setPropertyValue( *pNames, *pValues );
1982             }
1983             catch( beans::UnknownPropertyException& e )
1984             {
1985                 (void)e;
1986             }
1987             catch( uno::Exception& ex )
1988             {
1989                 (void)ex;
1990             }
1991         }
1992     }
1993 
1994     if( mpImpl->mpItemSet && mpObj.is() )
1995         mpObj->SetMergedItemSetAndBroadcast( *mpImpl->mpItemSet );
1996 }
1997 
1998 //----------------------------------------------------------------------
1999 
2000 void SvxShape::endSetPropertyValues()
2001 {
2002     mbIsMultiPropertyCall = sal_False;
2003     if( mpImpl->mpItemSet )
2004     {
2005         delete mpImpl->mpItemSet;
2006         mpImpl->mpItemSet = 0;
2007     }
2008 }
2009 
2010 //----------------------------------------------------------------------
2011 
2012 ::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)
2013 {
2014     const sal_Int32 nCount = aPropertyNames.getLength();
2015     const OUString* pNames = aPropertyNames.getConstArray();
2016 
2017     uno::Sequence< uno::Any > aRet( nCount );
2018     uno::Any* pValue = aRet.getArray();;
2019 
2020     if( mpImpl->mpMaster )
2021     {
2022         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pValue++, pNames++ )
2023         {
2024             try
2025             {
2026                 *pValue = getPropertyValue( *pNames );
2027             }
2028             catch( uno::Exception& )
2029             {
2030                 DBG_ERROR( "SvxShape::getPropertyValues, unknown property asked" );
2031             }
2032         }
2033     }
2034     else
2035     {
2036         uno::Reference< beans::XPropertySet > xSet;
2037         queryInterface( ::getCppuType( (const uno::Reference< beans::XPropertySet >*) 0) ) >>= xSet;
2038 
2039         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pValue++, pNames++ )
2040         {
2041             try
2042             {
2043                 *pValue = xSet->getPropertyValue( *pNames );
2044             }
2045             catch( uno::Exception& )
2046             {
2047                 DBG_ERROR( "SvxShape::getPropertyValues, unknown property asked" );
2048             }
2049         }
2050     }
2051 
2052     return aRet;
2053 }
2054 
2055 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)
2056 {
2057 }
2058 
2059 void SAL_CALL SvxShape::removePropertiesChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >&  ) throw (::com::sun::star::uno::RuntimeException)
2060 {
2061 }
2062 
2063 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)
2064 {
2065 }
2066 
2067 //----------------------------------------------------------------------
2068 
2069 uno::Any SvxShape::GetAnyForItem( SfxItemSet& aSet, const SfxItemPropertySimpleEntry* pMap ) const
2070 {
2071     DBG_TESTSOLARMUTEX();
2072     uno::Any aAny;
2073 
2074     switch(pMap->nWID)
2075     {
2076     case SDRATTR_CIRCSTARTANGLE:
2077     {
2078         const SfxPoolItem* pPoolItem=NULL;
2079         if(aSet.GetItemState(SDRATTR_CIRCSTARTANGLE,sal_False,&pPoolItem)==SFX_ITEM_SET)
2080         {
2081             sal_Int32 nAngle = ((SdrCircStartAngleItem*)pPoolItem)->GetValue();
2082             aAny <<= nAngle;
2083         }
2084         break;
2085     }
2086 
2087     case SDRATTR_CIRCENDANGLE:
2088     {
2089         const SfxPoolItem* pPoolItem=NULL;
2090         if (aSet.GetItemState(SDRATTR_CIRCENDANGLE,sal_False,&pPoolItem)==SFX_ITEM_SET)
2091         {
2092             sal_Int32 nAngle = ((SdrCircEndAngleItem*)pPoolItem)->GetValue();
2093             aAny <<= nAngle;
2094         }
2095         break;
2096     }
2097 
2098     case SDRATTR_CIRCKIND:
2099     {
2100         if( mpObj->GetObjInventor() == SdrInventor)
2101         {
2102             drawing::CircleKind eKind;
2103             switch(mpObj->GetObjIdentifier())
2104             {
2105             case OBJ_CIRC:          // Kreis, Ellipse
2106                 eKind = drawing::CircleKind_FULL;
2107                 break;
2108             case OBJ_CCUT:          // Kreisabschnitt
2109                 eKind = drawing::CircleKind_CUT;
2110                 break;
2111             case OBJ_CARC:          // Kreisbogen
2112                 eKind = drawing::CircleKind_ARC;
2113                 break;
2114             case OBJ_SECT:          // Kreissektor
2115                 eKind = drawing::CircleKind_SECTION;
2116                 break;
2117             }
2118             aAny <<= eKind;
2119         }
2120         break;
2121     }
2122     default:
2123     {
2124         // Hole Wert aus ItemSet
2125         aAny = SvxItemPropertySet_getPropertyValue( *mpPropSet, pMap, aSet );
2126 
2127         if( *pMap->pType != aAny.getValueType() )
2128         {
2129             // since the sfx uint16 item now exports a sal_Int32, we may have to fix this here
2130             if( ( *pMap->pType == ::getCppuType((const sal_Int16*)0)) && aAny.getValueType() == ::getCppuType((const sal_Int32*)0) )
2131             {
2132                 sal_Int32 nValue = 0;
2133                 aAny >>= nValue;
2134                 aAny <<= (sal_Int16)nValue;
2135             }
2136             else
2137             {
2138                 DBG_ERROR("SvxShape::GetAnyForItem() Returnvalue has wrong Type!" );
2139             }
2140         }
2141 
2142     }
2143     }
2144 
2145     return aAny;
2146 }
2147 
2148 //----------------------------------------------------------------------
2149 
2150 // XPropertyState
2151 beans::PropertyState SAL_CALL SvxShape::getPropertyState( const OUString& PropertyName )
2152     throw(beans::UnknownPropertyException, uno::RuntimeException)
2153 {
2154     if( mpImpl->mpMaster )
2155     {
2156         return mpImpl->mpMaster->getPropertyState( PropertyName );
2157     }
2158     else
2159     {
2160         return _getPropertyState( PropertyName );
2161     }
2162 }
2163 
2164 beans::PropertyState SAL_CALL SvxShape::_getPropertyState( const OUString& PropertyName )
2165     throw(beans::UnknownPropertyException, uno::RuntimeException)
2166 {
2167     OGuard aGuard( Application::GetSolarMutex() );
2168 
2169     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName);
2170 
2171     if( !mpObj.is() || pMap == NULL )
2172         throw beans::UnknownPropertyException();
2173 
2174     beans::PropertyState eState;
2175     if( !getPropertyStateImpl( pMap, eState ) )
2176     {
2177         const SfxItemSet& rSet = mpObj->GetMergedItemSet();
2178 
2179         switch( rSet.GetItemState( pMap->nWID, sal_False ) )
2180         {
2181         case SFX_ITEM_READONLY:
2182         case SFX_ITEM_SET:
2183             eState = beans::PropertyState_DIRECT_VALUE;
2184             break;
2185         case SFX_ITEM_DEFAULT:
2186             eState = beans::PropertyState_DEFAULT_VALUE;
2187             break;
2188 //      case SFX_ITEM_UNKNOWN:
2189 //      case SFX_ITEM_DONTCARE:
2190 //      case SFX_ITEM_DISABLED:
2191         default:
2192             eState = beans::PropertyState_AMBIGUOUS_VALUE;
2193             break;
2194         }
2195 
2196         // if a item is set, this doesn't mean we want it :)
2197         if( ( beans::PropertyState_DIRECT_VALUE == eState ) )
2198         {
2199             switch( pMap->nWID )
2200             {
2201             // the following items are disabled by changing the
2202             // fill style or the line style. so there is no need
2203             // to export items without names which should be empty
2204             case XATTR_FILLBITMAP:
2205             case XATTR_FILLGRADIENT:
2206             case XATTR_FILLHATCH:
2207             case XATTR_LINEDASH:
2208                 {
2209                     NameOrIndex* pItem = (NameOrIndex*)rSet.GetItem((sal_uInt16)pMap->nWID);
2210                     if( ( pItem == NULL ) || ( pItem->GetName().Len() == 0) )
2211                         eState = beans::PropertyState_DEFAULT_VALUE;
2212                 }
2213                 break;
2214 
2215             // #i36115#
2216             // If e.g. the LineStart is on NONE and thus the string has length 0, it still
2217             // may be a hard attribute covering the set LineStart of the parent (Style).
2218             // #i37644#
2219             // same is for fill float transparency
2220             case XATTR_LINEEND:
2221             case XATTR_LINESTART:
2222             case XATTR_FILLFLOATTRANSPARENCE:
2223                 {
2224                     NameOrIndex* pItem = (NameOrIndex*)rSet.GetItem((sal_uInt16)pMap->nWID);
2225                     if( ( pItem == NULL ) )
2226                         eState = beans::PropertyState_DEFAULT_VALUE;
2227                 }
2228                 break;
2229             }
2230         }
2231     }
2232     return eState;
2233 }
2234 
2235 //----------------------------------------------------------------------
2236 
2237 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)
2238 {
2239     switch( pProperty->nWID )
2240     {
2241     case OWN_ATTR_CAPTION_POINT:
2242     {
2243         awt::Point aPnt;
2244         if( rValue >>= aPnt )
2245         {
2246             Point aVclPoint( aPnt.X, aPnt.Y );
2247 
2248             // #90763# position is relative to top left, make it absolute
2249             basegfx::B2DPolyPolygon aNewPolyPolygon;
2250             basegfx::B2DHomMatrix aNewHomogenMatrix;
2251             mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2252 
2253             aVclPoint.X() += basegfx::fround(aNewHomogenMatrix.get(0, 2));
2254             aVclPoint.Y() += basegfx::fround(aNewHomogenMatrix.get(1, 2));
2255 
2256             // #88657# metric of pool maybe twips (writer)
2257             ForceMetricToItemPoolMetric(aVclPoint);
2258 
2259             // #88491# position relative to anchor
2260             if( mpModel->IsWriter() )
2261             {
2262                 aVclPoint += mpObj->GetAnchorPos();
2263             }
2264 
2265             ((SdrCaptionObj*)mpObj.get())->SetTailPos(aVclPoint);
2266 
2267             return true;
2268         }
2269         break;
2270     }
2271     case OWN_ATTR_TRANSFORMATION:
2272     {
2273         drawing::HomogenMatrix3 aMatrix;
2274         if(rValue >>= aMatrix)
2275         {
2276             basegfx::B2DPolyPolygon aNewPolyPolygon;
2277             basegfx::B2DHomMatrix aNewHomogenMatrix;
2278 
2279             mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2280 
2281             aNewHomogenMatrix.set(0, 0, aMatrix.Line1.Column1);
2282             aNewHomogenMatrix.set(0, 1, aMatrix.Line1.Column2);
2283             aNewHomogenMatrix.set(0, 2, aMatrix.Line1.Column3);
2284             aNewHomogenMatrix.set(1, 0, aMatrix.Line2.Column1);
2285             aNewHomogenMatrix.set(1, 1, aMatrix.Line2.Column2);
2286             aNewHomogenMatrix.set(1, 2, aMatrix.Line2.Column3);
2287             aNewHomogenMatrix.set(2, 0, aMatrix.Line3.Column1);
2288             aNewHomogenMatrix.set(2, 1, aMatrix.Line3.Column2);
2289             aNewHomogenMatrix.set(2, 2, aMatrix.Line3.Column3);
2290 
2291             mpObj->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2292             return true;
2293         }
2294         break;
2295     }
2296 
2297     case OWN_ATTR_ZORDER:
2298     {
2299         sal_Int32 nNewOrdNum = 0;
2300         if(rValue >>= nNewOrdNum)
2301         {
2302             SdrObjList* pObjList = mpObj->GetObjList();
2303             if( pObjList )
2304             {
2305 #ifdef DBG_UTIL
2306                 SdrObject* pCheck =
2307 #endif
2308                             pObjList->SetObjectOrdNum( mpObj->GetOrdNum(), (sal_uIntPtr)nNewOrdNum );
2309                 DBG_ASSERT( pCheck == mpObj.get(), "GetOrdNum() failed!" );
2310             }
2311             return true;
2312         }
2313         break;
2314     }
2315     case OWN_ATTR_FRAMERECT:
2316     {
2317         awt::Rectangle aUnoRect;
2318         if(rValue >>= aUnoRect)
2319         {
2320             Point aTopLeft( aUnoRect.X, aUnoRect.Y );
2321             Size aObjSize( aUnoRect.Width, aUnoRect.Height );
2322             ForceMetricToItemPoolMetric(aTopLeft);
2323             ForceMetricToItemPoolMetric(aObjSize);
2324             Rectangle aRect;
2325             aRect.SetPos(aTopLeft);
2326             aRect.SetSize(aObjSize);
2327             mpObj->SetSnapRect(aRect);
2328             return true;
2329         }
2330         break;
2331     }
2332     case OWN_ATTR_MIRRORED:
2333     {
2334         sal_Bool bMirror = sal_Bool();
2335         if(rValue >>= bMirror )
2336         {
2337             SdrGrafObj* pObj = dynamic_cast< SdrGrafObj* >( mpObj.get() );
2338             if( pObj )
2339                 pObj->SetMirrored(bMirror);
2340             return true;
2341         }
2342         break;
2343     }
2344     case OWN_ATTR_EDGE_START_OBJ:
2345     case OWN_ATTR_EDGE_END_OBJ:
2346     case OWN_ATTR_GLUEID_HEAD:
2347     case OWN_ATTR_GLUEID_TAIL:
2348     case OWN_ATTR_EDGE_START_POS:
2349     case OWN_ATTR_EDGE_END_POS:
2350     case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
2351     {
2352         SdrEdgeObj* pEdgeObj = dynamic_cast< SdrEdgeObj* >(mpObj.get());
2353         if(pEdgeObj)
2354         {
2355             switch(pProperty->nWID)
2356             {
2357             case OWN_ATTR_EDGE_START_OBJ:
2358             case OWN_ATTR_EDGE_END_OBJ:
2359                 {
2360                     Reference< drawing::XShape > xShape;
2361                     if( rValue >>= xShape )
2362                     {
2363                         SdrObject* pNode = GetSdrObjectFromXShape( xShape );
2364                         if( pNode )
2365                         {
2366                             pEdgeObj->ConnectToNode( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, pNode );
2367                             pEdgeObj->setGluePointIndex( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, -1 );
2368                             return true;
2369                         }
2370                     }
2371                     break;
2372                 }
2373 
2374             case OWN_ATTR_EDGE_START_POS:
2375             case OWN_ATTR_EDGE_END_POS:
2376                 {
2377                     awt::Point aUnoPoint;
2378                     if( rValue >>= aUnoPoint )
2379                     {
2380                         Point aPoint( aUnoPoint.X, aUnoPoint.Y );
2381 
2382                         // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051
2383                         // perform metric change before applying anchor position,
2384                         // because the anchor position is in pool metric.
2385                         ForceMetricToItemPoolMetric( aPoint );
2386                         // <--
2387                         if( mpModel->IsWriter() )
2388                             aPoint += mpObj->GetAnchorPos();
2389 
2390                         pEdgeObj->SetTailPoint( pProperty->nWID == OWN_ATTR_EDGE_START_POS, aPoint );
2391                         return true;
2392                     }
2393                     break;
2394                 }
2395 
2396             case OWN_ATTR_GLUEID_HEAD:
2397             case OWN_ATTR_GLUEID_TAIL:
2398                 {
2399                     sal_Int32 nId = 0;
2400                     if( rValue >>= nId )
2401                     {
2402                         pEdgeObj->setGluePointIndex( pProperty->nWID == OWN_ATTR_GLUEID_HEAD, nId );
2403                         return true;
2404                     }
2405                     break;
2406                 }
2407             case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
2408                 {
2409                     basegfx::B2DPolyPolygon aNewPolyPolygon;
2410 
2411                     // #123616# be a little bit more flexible regardin gthe data type used
2412                     if( rValue.getValueType() == ::getCppuType(( const drawing::PointSequenceSequence*)0))
2413                     {
2414                         // get polygpon data from PointSequenceSequence
2415                         aNewPolyPolygon = basegfx::tools::UnoPointSequenceSequenceToB2DPolyPolygon(
2416                             *(const drawing::PointSequenceSequence*)rValue.getValue());
2417                     }
2418                     else if( rValue.getValueType() == ::getCppuType(( const drawing::PolyPolygonBezierCoords*)0))
2419                     {
2420                         // get polygpon data from PolyPolygonBezierCoords
2421                         aNewPolyPolygon = basegfx::tools::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(
2422                             *(const drawing::PolyPolygonBezierCoords*)rValue.getValue());
2423                     }
2424 
2425                     if(aNewPolyPolygon.count())
2426                     {
2427                         // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051
2428                         ForceMetricToItemPoolMetric( aNewPolyPolygon );
2429                         // <--
2430                         if( mpModel->IsWriter() )
2431                         {
2432                             Point aPoint( mpObj->GetAnchorPos() );
2433                             aNewPolyPolygon.transform(basegfx::tools::createTranslateB2DHomMatrix(aPoint.X(), aPoint.Y()));
2434                         }
2435                         pEdgeObj->SetEdgeTrackPath( aNewPolyPolygon );
2436                         return true;
2437                     }
2438                 }
2439             }
2440         }
2441         break;
2442     }
2443     case OWN_ATTR_MEASURE_START_POS:
2444     case OWN_ATTR_MEASURE_END_POS:
2445     {
2446         SdrMeasureObj* pMeasureObj = dynamic_cast< SdrMeasureObj* >(mpObj.get());
2447         awt::Point aUnoPoint;
2448         if(pMeasureObj && ( rValue >>= aUnoPoint ) )
2449         {
2450             Point aPoint( aUnoPoint.X, aUnoPoint.Y );
2451 
2452             // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051
2453             ForceMetricToItemPoolMetric( aPoint );
2454             // <--
2455             if( mpModel->IsWriter() )
2456                 aPoint += mpObj->GetAnchorPos();
2457 
2458             pMeasureObj->NbcSetPoint( aPoint, pProperty->nWID == OWN_ATTR_MEASURE_START_POS ? 0L : 1L );
2459             pMeasureObj->SetChanged();
2460             pMeasureObj->BroadcastObjectChange();
2461             return true;
2462         }
2463         break;
2464     }
2465     case OWN_ATTR_FILLBMP_MODE:
2466         {
2467             drawing::BitmapMode eMode;
2468             if(!(rValue >>= eMode) )
2469             {
2470                 sal_Int32 nMode = 0;
2471                 if(!(rValue >>= nMode))
2472                     break;
2473 
2474                 eMode = (drawing::BitmapMode)nMode;
2475             }
2476             mpObj->SetMergedItem( XFillBmpStretchItem( eMode == drawing::BitmapMode_STRETCH ) );
2477             mpObj->SetMergedItem( XFillBmpTileItem( eMode == drawing::BitmapMode_REPEAT ) );
2478             return true;
2479         }
2480 
2481     case SDRATTR_LAYERID:
2482     {
2483         sal_Int16 nLayerId = sal_Int16();
2484         if( rValue >>= nLayerId )
2485         {
2486             SdrLayer* pLayer = mpModel->GetLayerAdmin().GetLayerPerID((unsigned char)nLayerId);
2487             if( pLayer )
2488             {
2489                 mpObj->SetLayer((unsigned char)nLayerId);
2490                 return true;
2491             }
2492         }
2493         break;
2494     }
2495 
2496     case SDRATTR_LAYERNAME:
2497     {
2498         OUString aLayerName;
2499         if( rValue >>= aLayerName )
2500         {
2501             const SdrLayer* pLayer=mpModel->GetLayerAdmin().GetLayer(aLayerName, sal_True);
2502             if( pLayer != NULL )
2503             {
2504                 mpObj->SetLayer( pLayer->GetID() );
2505                 return true;
2506             }
2507         }
2508         break;
2509     }
2510     case SDRATTR_ROTATEANGLE:
2511     {
2512         sal_Int32 nAngle = 0;
2513         if( rValue >>= nAngle )
2514         {
2515             Point aRef1(mpObj->GetSnapRect().Center());
2516             nAngle -= mpObj->GetRotateAngle();
2517             if (nAngle!=0)
2518             {
2519                 double nSin=sin(nAngle*nPi180);
2520                 double nCos=cos(nAngle*nPi180);
2521                 mpObj->Rotate(aRef1,nAngle,nSin,nCos);
2522             }
2523             return true;
2524         }
2525 
2526         break;
2527     }
2528 
2529     case SDRATTR_SHEARANGLE:
2530     {
2531         sal_Int32 nShear = 0;
2532         if( rValue >>= nShear )
2533         {
2534             nShear -= mpObj->GetShearAngle();
2535             if(nShear != 0 )
2536             {
2537                 Point aRef1(mpObj->GetSnapRect().Center());
2538                 double nTan=tan(nShear*nPi180);
2539                 mpObj->Shear(aRef1,nShear,nTan,sal_False);
2540                 return true;
2541             }
2542         }
2543 
2544         break;
2545     }
2546 
2547     case SDRATTR_OBJMOVEPROTECT:
2548     {
2549         sal_Bool bMoveProtect = sal_Bool();
2550         if( rValue >>= bMoveProtect )
2551         {
2552             mpObj->SetMoveProtect(bMoveProtect);
2553             return true;
2554         }
2555         break;
2556     }
2557     case SDRATTR_OBJECTNAME:
2558     {
2559         OUString aName;
2560         if( rValue >>= aName )
2561         {
2562             mpObj->SetName( aName );
2563             return true;
2564         }
2565         break;
2566     }
2567 
2568     // #i68101#
2569     case OWN_ATTR_MISC_OBJ_TITLE:
2570     {
2571         OUString aTitle;
2572         if( rValue >>= aTitle )
2573         {
2574             mpObj->SetTitle( aTitle );
2575             return true;
2576         }
2577         break;
2578     }
2579     case OWN_ATTR_MISC_OBJ_DESCRIPTION:
2580     {
2581         OUString aDescription;
2582         if( rValue >>= aDescription )
2583         {
2584             mpObj->SetDescription( aDescription );
2585             return true;
2586         }
2587         break;
2588     }
2589 
2590     case SDRATTR_OBJPRINTABLE:
2591     {
2592         sal_Bool bPrintable = sal_Bool();
2593         if( rValue >>= bPrintable )
2594         {
2595             mpObj->SetPrintable(bPrintable);
2596             return true;
2597         }
2598         break;
2599     }
2600     case SDRATTR_OBJVISIBLE:
2601     {
2602         sal_Bool bVisible = sal_Bool();
2603         if( rValue >>= bVisible )
2604         {
2605             mpObj->SetVisible(bVisible);
2606             return true;
2607         }
2608         break;
2609     }
2610     case SDRATTR_OBJSIZEPROTECT:
2611     {
2612         sal_Bool bResizeProtect = sal_Bool();
2613         if( rValue >>= bResizeProtect )
2614         {
2615             mpObj->SetResizeProtect(bResizeProtect);
2616             return true;
2617         }
2618         break;
2619     }
2620     case OWN_ATTR_PAGE_NUMBER:
2621     {
2622         sal_Int32 nPageNum = 0;
2623         if( (rValue >>= nPageNum) && ( nPageNum >= 0 ) && ( nPageNum <= 0xffff ) )
2624         {
2625             SdrPageObj* pPageObj = dynamic_cast< SdrPageObj* >(mpObj.get());
2626             if( pPageObj )
2627             {
2628                 SdrModel* pModel = pPageObj->GetModel();
2629                 SdrPage* pNewPage = 0L;
2630                 const sal_uInt16 nDestinationPageNum((sal_uInt16)((nPageNum << 1L) - 1L));
2631 
2632                 if(pModel)
2633                 {
2634                     if(nDestinationPageNum < pModel->GetPageCount())
2635                     {
2636                         pNewPage = pModel->GetPage(nDestinationPageNum);
2637                     }
2638                 }
2639 
2640                 pPageObj->SetReferencedPage(pNewPage);
2641             }
2642 
2643             return true;
2644         }
2645         break;
2646     }
2647     case XATTR_FILLBITMAP:
2648     case XATTR_FILLGRADIENT:
2649     case XATTR_FILLHATCH:
2650     case XATTR_FILLFLOATTRANSPARENCE:
2651     case XATTR_LINEEND:
2652     case XATTR_LINESTART:
2653     case XATTR_LINEDASH:
2654     {
2655         if( pProperty->nMemberId == MID_NAME )
2656         {
2657             OUString aApiName;
2658             if( rValue >>= aApiName )
2659             {
2660                 if( SetFillAttribute( pProperty->nWID, aApiName ) )
2661                     return true;
2662             }
2663             break;
2664         }
2665         else
2666         {
2667             return false;
2668         }
2669     }
2670     default:
2671     {
2672         return false;
2673     }
2674     }
2675     throw lang::IllegalArgumentException();
2676 }
2677 
2678 //----------------------------------------------------------------------
2679 
2680 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)
2681 {
2682     switch( pProperty->nWID )
2683     {
2684 /*
2685     case OWN_ATTR_HASLEVELS:
2686     {
2687         rValue <<= SvxTextEditSource::hasLevels( mpObj.get() );
2688         break;
2689     }
2690 */
2691     case OWN_ATTR_CAPTION_POINT:
2692     {
2693         Point aVclPoint = ((SdrCaptionObj*)mpObj.get())->GetTailPos();
2694 
2695         // #88491# make pos relative to anchor
2696         if( mpModel->IsWriter() )
2697         {
2698             aVclPoint -= mpObj->GetAnchorPos();
2699         }
2700 
2701         // #88657# metric of pool maybe twips (writer)
2702         ForceMetricTo100th_mm(aVclPoint);
2703 
2704         // #90763# pos is absolute, make it relative to top left
2705         basegfx::B2DPolyPolygon aNewPolyPolygon;
2706         basegfx::B2DHomMatrix aNewHomogenMatrix;
2707         mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2708 
2709         aVclPoint.X() -= basegfx::fround(aNewHomogenMatrix.get(0, 2));
2710         aVclPoint.Y() -= basegfx::fround(aNewHomogenMatrix.get(1, 2));
2711 
2712         awt::Point aPnt( aVclPoint.X(), aVclPoint.Y() );
2713         rValue <<= aPnt;
2714         break;
2715     }
2716 
2717     case OWN_ATTR_TRANSFORMATION:
2718     {
2719         basegfx::B2DPolyPolygon aNewPolyPolygon;
2720         basegfx::B2DHomMatrix aNewHomogenMatrix;
2721         mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
2722         drawing::HomogenMatrix3 aMatrix;
2723 
2724         aMatrix.Line1.Column1 = aNewHomogenMatrix.get(0, 0);
2725         aMatrix.Line1.Column2 = aNewHomogenMatrix.get(0, 1);
2726         aMatrix.Line1.Column3 = aNewHomogenMatrix.get(0, 2);
2727         aMatrix.Line2.Column1 = aNewHomogenMatrix.get(1, 0);
2728         aMatrix.Line2.Column2 = aNewHomogenMatrix.get(1, 1);
2729         aMatrix.Line2.Column3 = aNewHomogenMatrix.get(1, 2);
2730         aMatrix.Line3.Column1 = aNewHomogenMatrix.get(2, 0);
2731         aMatrix.Line3.Column2 = aNewHomogenMatrix.get(2, 1);
2732         aMatrix.Line3.Column3 = aNewHomogenMatrix.get(2, 2);
2733 
2734         rValue <<= aMatrix;
2735 
2736         break;
2737     }
2738 
2739     case OWN_ATTR_ZORDER:
2740     {
2741         rValue <<= (sal_Int32)mpObj->GetOrdNum();
2742         break;
2743     }
2744 
2745     case OWN_ATTR_BITMAP:
2746     {
2747         rValue = GetBitmap();
2748         if(!rValue.hasValue())
2749             throw uno::RuntimeException();
2750 
2751         break;
2752     }
2753 
2754     case OWN_ATTR_ISFONTWORK:
2755     {
2756         rValue <<= (sal_Bool)(mpObj->ISA(SdrTextObj) && ((SdrTextObj*)mpObj.get())->IsFontwork());
2757         break;
2758     }
2759 
2760     case OWN_ATTR_FRAMERECT:
2761     {
2762         Rectangle aRect( mpObj->GetSnapRect() );
2763         Point aTopLeft( aRect.TopLeft() );
2764         Size aObjSize( aRect.GetWidth(), aRect.GetHeight() );
2765         ForceMetricTo100th_mm(aTopLeft);
2766         ForceMetricTo100th_mm(aObjSize);
2767         ::com::sun::star::awt::Rectangle aUnoRect(
2768             aTopLeft.X(), aTopLeft.Y(),
2769             aObjSize.getWidth(), aObjSize.getHeight() );
2770         rValue <<= aUnoRect;
2771         break;
2772     }
2773 
2774     case OWN_ATTR_BOUNDRECT:
2775     {
2776         Rectangle aRect( mpObj->GetCurrentBoundRect() );
2777         Point aTopLeft( aRect.TopLeft() );
2778         Size aObjSize( aRect.GetWidth(), aRect.GetHeight() );
2779         ForceMetricTo100th_mm(aTopLeft);
2780         ForceMetricTo100th_mm(aObjSize);
2781         ::com::sun::star::awt::Rectangle aUnoRect(
2782             aTopLeft.X(), aTopLeft.Y(),
2783             aObjSize.getWidth(), aObjSize.getHeight() );
2784         rValue <<= aUnoRect;
2785         break;
2786     }
2787 
2788     case OWN_ATTR_LDNAME:
2789     {
2790         OUString aName( mpObj->GetName() );
2791         rValue <<= aName;
2792         break;
2793     }
2794 
2795     case OWN_ATTR_LDBITMAP:
2796     {
2797         sal_uInt16 nId;
2798         if( mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_OLE2 )
2799         {
2800             nId = RID_UNODRAW_OLE2;
2801         }
2802         else if( mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_GRAF )
2803         {
2804             nId = RID_UNODRAW_GRAPHICS;
2805         }
2806         else
2807         {
2808             nId = RID_UNODRAW_OBJECTS;
2809         }
2810 
2811         BitmapEx aBmp( SVX_RES(nId) );
2812         Reference< awt::XBitmap > xBmp( VCLUnoHelper::CreateBitmap( aBmp ) );
2813 
2814         rValue <<= xBmp;
2815         break;
2816     }
2817 
2818     case OWN_ATTR_MIRRORED:
2819     {
2820         sal_Bool bMirror = sal_False;
2821         if( mpObj.is() && mpObj->ISA(SdrGrafObj) )
2822             bMirror = ((SdrGrafObj*)mpObj.get())->IsMirrored();
2823 
2824         rValue <<= bMirror;
2825     }
2826 
2827     case OWN_ATTR_EDGE_START_OBJ:
2828     case OWN_ATTR_EDGE_START_POS:
2829     case OWN_ATTR_EDGE_END_POS:
2830     case OWN_ATTR_EDGE_END_OBJ:
2831     case OWN_ATTR_GLUEID_HEAD:
2832     case OWN_ATTR_GLUEID_TAIL:
2833     case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
2834     {
2835         SdrEdgeObj* pEdgeObj = dynamic_cast<SdrEdgeObj*>(mpObj.get());
2836         if(pEdgeObj)
2837         {
2838             switch(pProperty->nWID)
2839             {
2840             case OWN_ATTR_EDGE_START_OBJ:
2841             case OWN_ATTR_EDGE_END_OBJ:
2842                 {
2843                     SdrObject* pNode = pEdgeObj->GetConnectedNode(pProperty->nWID == OWN_ATTR_EDGE_START_OBJ);
2844                     if(pNode)
2845                     {
2846                         Reference< drawing::XShape > xShape( GetXShapeForSdrObject( pNode ) );
2847                         if(xShape.is())
2848                             rValue <<= xShape;
2849 
2850                     }
2851                     break;
2852                 }
2853 
2854             case OWN_ATTR_EDGE_START_POS:
2855             case OWN_ATTR_EDGE_END_POS:
2856                 {
2857                     Point aPoint( pEdgeObj->GetTailPoint( pProperty->nWID == OWN_ATTR_EDGE_START_POS ) );
2858                     if( mpModel->IsWriter() )
2859                         aPoint -= mpObj->GetAnchorPos();
2860 
2861                     ForceMetricTo100th_mm( aPoint );
2862                     awt::Point aUnoPoint( aPoint.X(), aPoint.Y() );
2863 
2864                     rValue <<= aUnoPoint;
2865                     break;
2866                 }
2867             case OWN_ATTR_GLUEID_HEAD:
2868             case OWN_ATTR_GLUEID_TAIL:
2869                 {
2870                     rValue <<= pEdgeObj->getGluePointIndex( pProperty->nWID == OWN_ATTR_GLUEID_HEAD );
2871                     break;
2872                 }
2873             case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
2874                 {
2875                     basegfx::B2DPolyPolygon aPolyPoly( pEdgeObj->GetEdgeTrackPath() );
2876                     if( mpModel->IsWriter() )
2877                     {
2878                         Point aPoint( mpObj->GetAnchorPos() );
2879                         aPolyPoly.transform(basegfx::tools::createTranslateB2DHomMatrix(-aPoint.X(), -aPoint.Y()));
2880                     }
2881                     // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue 59051
2882                     ForceMetricTo100th_mm( aPolyPoly );
2883                     // <--
2884                     drawing::PolyPolygonBezierCoords aRetval;
2885                     SvxConvertB2DPolyPolygonToPolyPolygonBezier( aPolyPoly, aRetval);
2886                     rValue <<= aRetval;
2887                     break;
2888                 }
2889             }
2890         }
2891         break;
2892     }
2893 
2894     case OWN_ATTR_MEASURE_START_POS:
2895     case OWN_ATTR_MEASURE_END_POS:
2896     {
2897         SdrMeasureObj* pMeasureObj = dynamic_cast<SdrMeasureObj*>(mpObj.get());
2898         if(pMeasureObj)
2899         {
2900             Point aPoint( pMeasureObj->GetPoint( pProperty->nWID == OWN_ATTR_MEASURE_START_POS ? 0 : 1 ) );
2901             if( mpModel->IsWriter() )
2902                 aPoint -= mpObj->GetAnchorPos();
2903 
2904             // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue 59051
2905             ForceMetricTo100th_mm( aPoint );
2906             // <--
2907             awt::Point aUnoPoint( aPoint.X(), aPoint.Y() );
2908 
2909             rValue <<= aUnoPoint;
2910             break;
2911         }
2912         break;
2913     }
2914 
2915     case OWN_ATTR_FILLBMP_MODE:
2916     {
2917         const SfxItemSet& rObjItemSet = mpObj->GetMergedItemSet();
2918 
2919         XFillBmpStretchItem* pStretchItem = (XFillBmpStretchItem*)&rObjItemSet.Get(XATTR_FILLBMP_STRETCH);
2920         XFillBmpTileItem* pTileItem = (XFillBmpTileItem*)&rObjItemSet.Get(XATTR_FILLBMP_TILE);
2921 
2922         if( pTileItem && pTileItem->GetValue() )
2923         {
2924             rValue <<= drawing::BitmapMode_REPEAT;
2925         }
2926         else if( pStretchItem && pStretchItem->GetValue() )
2927         {
2928             rValue <<= drawing::BitmapMode_STRETCH;
2929         }
2930         else
2931         {
2932             rValue <<= drawing::BitmapMode_NO_REPEAT;
2933         }
2934         break;
2935     }
2936     case SDRATTR_LAYERID:
2937         rValue <<= (sal_Int16)mpObj->GetLayer();
2938         break;
2939 
2940     case SDRATTR_LAYERNAME:
2941     {
2942         SdrLayer* pLayer = mpModel->GetLayerAdmin().GetLayerPerID(mpObj->GetLayer());
2943         if( pLayer )
2944         {
2945             OUString aName( pLayer->GetName() );
2946             rValue <<= aName;
2947         }
2948         break;
2949     }
2950 
2951     case SDRATTR_ROTATEANGLE:
2952         rValue <<= mpObj->GetRotateAngle();
2953         break;
2954 
2955     case SDRATTR_SHEARANGLE:
2956         rValue <<= mpObj->GetShearAngle();
2957         break;
2958 
2959     case SDRATTR_OBJMOVEPROTECT:
2960         rValue = uno::makeAny( (sal_Bool) mpObj->IsMoveProtect() );
2961         break;
2962 
2963     case SDRATTR_OBJECTNAME:
2964     {
2965         OUString aName( mpObj->GetName() );
2966         rValue <<= aName;
2967         break;
2968     }
2969 
2970     // #i68101#
2971     case OWN_ATTR_MISC_OBJ_TITLE:
2972     {
2973         OUString aTitle( mpObj->GetTitle() );
2974         rValue <<= aTitle;
2975         break;
2976     }
2977 
2978     case OWN_ATTR_MISC_OBJ_DESCRIPTION:
2979     {
2980         OUString aDescription( mpObj->GetDescription() );
2981         rValue <<= aDescription;
2982         break;
2983     }
2984 
2985     case SDRATTR_OBJPRINTABLE:
2986         rValue <<= static_cast<sal_Bool>( mpObj->IsPrintable() );
2987         break;
2988 
2989     case SDRATTR_OBJVISIBLE:
2990         rValue <<= static_cast<sal_Bool>( mpObj->IsVisible() );
2991         break;
2992 
2993     case SDRATTR_OBJSIZEPROTECT:
2994         rValue <<= static_cast<sal_Bool>( mpObj->IsResizeProtect() );
2995         break;
2996 
2997     case OWN_ATTR_PAGE_NUMBER:
2998     {
2999         SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(mpObj.get());
3000         if(pPageObj)
3001         {
3002             SdrPage* pPage = pPageObj->GetReferencedPage();
3003             sal_Int32 nPageNumber = (pPage) ? pPage->GetPageNum() : 0L;
3004             nPageNumber++;
3005             nPageNumber >>= 1;
3006             rValue <<= nPageNumber;
3007         }
3008         break;
3009     }
3010 
3011     case OWN_ATTR_UINAME_SINGULAR:
3012     {
3013         String aTmp;
3014         mpObj->TakeObjNameSingul( aTmp );
3015         rValue <<= OUString( aTmp );
3016         break;
3017     }
3018 
3019     case OWN_ATTR_UINAME_PLURAL:
3020     {
3021         String aTmp;
3022         mpObj->TakeObjNamePlural( aTmp );
3023         rValue <<= OUString( aTmp );
3024         break;
3025     }
3026     case OWN_ATTR_METAFILE:
3027     {
3028         SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>(mpObj.get());
3029         if( pObj )
3030         {
3031             Graphic* pGraphic = pObj->GetGraphic();
3032             if( pGraphic )
3033             {
3034                 sal_Bool bIsWMF = sal_False;
3035                 if ( pGraphic->IsLink() )
3036                 {
3037                     GfxLink aLnk = pGraphic->GetLink();
3038                     if ( aLnk.GetType() == GFX_LINK_TYPE_NATIVE_WMF )
3039                     {
3040                         bIsWMF = sal_True;
3041                         uno::Sequence<sal_Int8> aSeq((sal_Int8*)aLnk.GetData(), (sal_Int32) aLnk.GetDataSize());
3042                         rValue <<= aSeq;
3043                     }
3044                 }
3045                 if ( !bIsWMF )
3046                 {
3047                     // #119735# just use GetGDIMetaFile, it will create a bufferd version of contained bitmap now automatically
3048                     GDIMetaFile aMtf(pObj->GetGraphic()->GetGDIMetaFile());
3049                     SvMemoryStream aDestStrm( 65535, 65535 );
3050                     ConvertGDIMetaFileToWMF( aMtf, aDestStrm, NULL, sal_False );
3051                     const uno::Sequence<sal_Int8> aSeq(
3052                         static_cast< const sal_Int8* >(aDestStrm.GetData()),
3053                         aDestStrm.GetEndOfData());
3054                     rValue <<= aSeq;
3055                 }
3056             }
3057         }
3058         else
3059         {
3060             rValue = GetBitmap( sal_True );
3061         }
3062         break;
3063     }
3064 
3065 
3066     default:
3067         return false;
3068     }
3069     return true;
3070 }
3071 
3072 //----------------------------------------------------------------------
3073 
3074 bool SvxShape::getPropertyStateImpl( const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::beans::PropertyState& rState ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
3075 {
3076     if( pProperty->nWID == OWN_ATTR_FILLBMP_MODE )
3077     {
3078         const SfxItemSet& rSet = mpObj->GetMergedItemSet();
3079 
3080         if( rSet.GetItemState( XATTR_FILLBMP_STRETCH, false ) == SFX_ITEM_SET ||
3081             rSet.GetItemState( XATTR_FILLBMP_TILE, false ) == SFX_ITEM_SET )
3082         {
3083             rState = beans::PropertyState_DIRECT_VALUE;
3084         }
3085         else
3086         {
3087             rState = beans::PropertyState_AMBIGUOUS_VALUE;
3088         }
3089     }
3090     else if((( pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID <= OWN_ATTR_VALUE_END ) ||
3091        ( pProperty->nWID >= SDRATTR_NOTPERSIST_FIRST && pProperty->nWID <= SDRATTR_NOTPERSIST_LAST )) && ( pProperty->nWID != SDRATTR_TEXTDIRECTION ) )
3092     {
3093         rState = beans::PropertyState_DIRECT_VALUE;
3094     }
3095     else
3096     {
3097         return false;
3098     }
3099 
3100     return true;
3101 }
3102 
3103 //----------------------------------------------------------------------
3104 
3105 bool SvxShape::setPropertyToDefaultImpl( const SfxItemPropertySimpleEntry* pProperty ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
3106 {
3107     if( pProperty->nWID == OWN_ATTR_FILLBMP_MODE )
3108     {
3109         mpObj->ClearMergedItem( XATTR_FILLBMP_STRETCH );
3110         mpObj->ClearMergedItem( XATTR_FILLBMP_TILE );
3111         return true;
3112     }
3113     else if((pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID <= OWN_ATTR_VALUE_END ) ||
3114        ( pProperty->nWID >= SDRATTR_NOTPERSIST_FIRST && pProperty->nWID <= SDRATTR_NOTPERSIST_LAST ))
3115     {
3116         return true;
3117     }
3118     else
3119     {
3120         return false;
3121     }
3122 }
3123 
3124 //----------------------------------------------------------------------
3125 
3126 uno::Sequence< beans::PropertyState > SAL_CALL SvxShape::getPropertyStates( const uno::Sequence< OUString >& aPropertyName )
3127     throw(beans::UnknownPropertyException, uno::RuntimeException)
3128 {
3129     const sal_Int32 nCount = aPropertyName.getLength();
3130     const OUString* pNames = aPropertyName.getConstArray();
3131 
3132     uno::Sequence< beans::PropertyState > aRet( nCount );
3133     beans::PropertyState* pState = aRet.getArray();
3134 
3135     if( mpImpl->mpMaster )
3136     {
3137         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++ )
3138             pState[nIdx] = getPropertyState( pNames[nIdx] );
3139 
3140     }
3141     else
3142     {
3143         for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++ )
3144             pState[nIdx] = getPropertyState( pNames[nIdx] );
3145     }
3146 
3147     return aRet;
3148 }
3149 
3150 //----------------------------------------------------------------------
3151 
3152 void SAL_CALL SvxShape::setPropertyToDefault( const OUString& PropertyName )
3153     throw(beans::UnknownPropertyException, uno::RuntimeException)
3154 {
3155     if( mpImpl->mpMaster )
3156     {
3157         mpImpl->mpMaster->setPropertyToDefault( PropertyName );
3158     }
3159     else
3160     {
3161         _setPropertyToDefault( PropertyName );
3162     }
3163 }
3164 
3165 void SAL_CALL SvxShape::_setPropertyToDefault( const OUString& PropertyName )
3166     throw(beans::UnknownPropertyException, uno::RuntimeException)
3167 {
3168     OGuard aGuard( Application::GetSolarMutex() );
3169 
3170     const SfxItemPropertySimpleEntry* pProperty = mpPropSet->getPropertyMapEntry(PropertyName);
3171 
3172     if( !mpObj.is() || mpModel == NULL || pProperty == NULL )
3173         throw beans::UnknownPropertyException();
3174 
3175     if( !setPropertyToDefaultImpl( pProperty ) )
3176     {
3177         mpObj->ClearMergedItem( pProperty->nWID );
3178     }
3179 
3180     mpModel->SetChanged();
3181 }
3182 
3183 //----------------------------------------------------------------------
3184 
3185 uno::Any SAL_CALL SvxShape::getPropertyDefault( const OUString& aPropertyName )
3186     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
3187 {
3188     if( mpImpl->mpMaster )
3189     {
3190         return mpImpl->mpMaster->getPropertyDefault( aPropertyName );
3191     }
3192     else
3193     {
3194         return _getPropertyDefault( aPropertyName );
3195     }
3196 }
3197 
3198 uno::Any SAL_CALL SvxShape::_getPropertyDefault( const OUString& aPropertyName )
3199     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
3200 {
3201     OGuard aGuard( Application::GetSolarMutex() );
3202 
3203     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(aPropertyName);
3204 
3205     if( !mpObj.is() || pMap == NULL || mpModel == NULL )
3206         throw beans::UnknownPropertyException();
3207 
3208     if(( pMap->nWID >= OWN_ATTR_VALUE_START && pMap->nWID <= OWN_ATTR_VALUE_END ) ||
3209        ( pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST ))
3210     {
3211         return getPropertyValue( aPropertyName );
3212     }
3213 
3214     // Default aus ItemPool holen
3215     if(!mpModel->GetItemPool().IsWhich(pMap->nWID))
3216         throw beans::UnknownPropertyException();
3217 
3218     SfxItemSet aSet( mpModel->GetItemPool(),    pMap->nWID, pMap->nWID);
3219     aSet.Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID));
3220 
3221     return GetAnyForItem( aSet, pMap );
3222 }
3223 
3224 // XMultiPropertyStates
3225 void SvxShape::setAllPropertiesToDefault() throw (uno::RuntimeException)
3226 {
3227     OGuard aGuard( Application::GetSolarMutex() );
3228 
3229     if( !mpObj.is() )
3230         throw lang::DisposedException();
3231     mpObj->ClearMergedItem(); // nWhich == 0 => all
3232 
3233     if(mpObj->ISA(SdrGrafObj))
3234     {
3235         // defaults for graphic objects have changed:
3236         mpObj->SetMergedItem( XFillStyleItem( XFILL_NONE ) );
3237         mpObj->SetMergedItem( XLineStyleItem( XLINE_NONE ) );
3238     }
3239 
3240     // #i68523# special handling for Svx3DCharacterModeItem, this is not saved
3241     // but needs to be sal_True in svx, pool default (false) in sch. Since sch
3242     // does not load lathe or extrude objects, it is possible to set the items
3243     // here.
3244     // For other solution possibilities, see task description.
3245     if(mpObj->ISA(E3dLatheObj) || mpObj->ISA(E3dExtrudeObj))
3246     {
3247         mpObj->SetMergedItem(Svx3DCharacterModeItem(true));
3248     }
3249 
3250     mpModel->SetChanged();
3251 }
3252 
3253 void SvxShape::setPropertiesToDefault(
3254     const uno::Sequence<OUString>& aPropertyNames )
3255     throw (beans::UnknownPropertyException, uno::RuntimeException)
3256 {
3257     for ( sal_Int32 pos = 0; pos < aPropertyNames.getLength(); ++pos )
3258         setPropertyToDefault( aPropertyNames[pos] );
3259 }
3260 
3261 uno::Sequence<uno::Any> SvxShape::getPropertyDefaults(
3262     const uno::Sequence<OUString>& aPropertyNames )
3263     throw (beans::UnknownPropertyException, lang::WrappedTargetException,
3264            uno::RuntimeException)
3265 {
3266     ::std::vector<uno::Any> ret;
3267     for ( sal_Int32 pos = 0; pos < aPropertyNames.getLength(); ++pos )
3268         ret.push_back( getPropertyDefault( aPropertyNames[pos] ) );
3269     return uno::Sequence<uno::Any>( &ret[0], ret.size() );
3270 }
3271 
3272 //----------------------------------------------------------------------
3273 
3274 //----------------------------------------------------------------------
3275 // XServiceInfo
3276 //----------------------------------------------------------------------
3277 OUString SAL_CALL SvxShape::getImplementationName()
3278     throw(uno::RuntimeException)
3279 {
3280     static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM("SvxShape") );
3281     return aServiceName;
3282 }
3283 
3284 #define STAR_NAMESPACE "com.sun.star."
3285 
3286 const char* sUNO_service_style_ParagraphProperties          = STAR_NAMESPACE "style.ParagraphProperties";
3287 const char* sUNO_service_style_ParagraphPropertiesComplex   = STAR_NAMESPACE "style.ParagraphPropertiesComplex";
3288 const char* sUNO_service_style_ParagraphPropertiesAsian     = STAR_NAMESPACE "style.ParagraphPropertiesAsian";
3289 const char* sUNO_service_style_CharacterProperties          = STAR_NAMESPACE "style.CharacterProperties";
3290 const char* sUNO_service_style_CharacterPropertiesComplex   = STAR_NAMESPACE "style.CharacterPropertiesComplex";
3291 const char* sUNO_service_style_CharacterPropertiesAsian     = STAR_NAMESPACE "style.CharacterPropertiesAsian";
3292 
3293 const char* sUNO_service_drawing_FillProperties             = STAR_NAMESPACE "drawing.FillProperties";
3294 const char* sUNO_service_drawing_TextProperties             = STAR_NAMESPACE "drawing.TextProperties";
3295 const char* sUNO_service_drawing_LineProperties             = STAR_NAMESPACE "drawing.LineProperties";
3296 const char* sUNO_service_drawing_ConnectorProperties        = STAR_NAMESPACE "drawing.ConnectorProperties";
3297 const char* sUNO_service_drawing_MeasureProperties          = STAR_NAMESPACE "drawing.MeasureProperties";
3298 const char* sUNO_service_drawing_ShadowProperties           = STAR_NAMESPACE "drawing.ShadowProperties";
3299 
3300 const char* sUNO_service_drawing_RotationDescriptor         = STAR_NAMESPACE "drawing.RotationDescriptor";
3301 
3302 const char* sUNO_service_drawing_Text                       = STAR_NAMESPACE "drawing.Text";
3303 const char* sUNO_service_drawing_GroupShape                 = STAR_NAMESPACE "drawing.GroupShape";
3304 
3305 const char* sUNO_service_drawing_CustomShapeProperties      = STAR_NAMESPACE "drawing.CustomShapeProperties";
3306 const char* sUNO_service_drawing_CustomShape                    = STAR_NAMESPACE "drawing.CustomShape";
3307 
3308 const char* sUNO_service_drawing_PolyPolygonDescriptor      = STAR_NAMESPACE "drawing.PolyPolygonDescriptor";
3309 const char* sUNO_service_drawing_PolyPolygonBezierDescriptor= STAR_NAMESPACE "drawing.PolyPolygonBezierDescriptor";
3310 
3311 const char* sUNO_service_drawing_LineShape                  = STAR_NAMESPACE "drawing.LineShape";
3312 const char* sUNO_service_drawing_Shape                      = STAR_NAMESPACE "drawing.Shape";
3313 const char* sUNO_service_drawing_RectangleShape             = STAR_NAMESPACE "drawing.RectangleShape";
3314 const char* sUNO_service_drawing_EllipseShape               = STAR_NAMESPACE "drawing.EllipseShape";
3315 const char* sUNO_service_drawing_PolyPolygonShape           = STAR_NAMESPACE "drawing.PolyPolygonShape";
3316 const char* sUNO_service_drawing_PolyLineShape              = STAR_NAMESPACE "drawing.PolyLineShape";
3317 const char* sUNO_service_drawing_OpenBezierShape            = STAR_NAMESPACE "drawing.OpenBezierShape";
3318 const char* sUNO_service_drawing_ClosedBezierShape          = STAR_NAMESPACE "drawing.ClosedBezierShape";
3319 const char* sUNO_service_drawing_TextShape                  = STAR_NAMESPACE "drawing.TextShape";
3320 const char* sUNO_service_drawing_GraphicObjectShape         = STAR_NAMESPACE "drawing.GraphicObjectShape";
3321 const char* sUNO_service_drawing_OLE2Shape                  = STAR_NAMESPACE "drawing.OLE2Shape";
3322 const char* sUNO_service_drawing_PageShape                  = STAR_NAMESPACE "drawing.PageShape";
3323 const char* sUNO_service_drawing_CaptionShape               = STAR_NAMESPACE "drawing.CaptionShape";
3324 const char* sUNO_service_drawing_MeasureShape               = STAR_NAMESPACE "drawing.MeasureShape";
3325 const char* sUNO_service_drawing_FrameShape                 = STAR_NAMESPACE "drawing.FrameShape";
3326 const char* sUNO_service_drawing_ControlShape               = STAR_NAMESPACE "drawing.ControlShape";
3327 const char* sUNO_service_drawing_ConnectorShape             = STAR_NAMESPACE "drawing.ConnectorShape";
3328 const char* sUNO_service_drawing_MediaShape                 = STAR_NAMESPACE "drawing.MediaShape";
3329 
3330 
3331 uno::Sequence< OUString > SAL_CALL SvxShape::getSupportedServiceNames()
3332     throw(uno::RuntimeException)
3333 {
3334     if( mpImpl->mpMaster )
3335     {
3336         return mpImpl->mpMaster->getSupportedServiceNames();
3337     }
3338     else
3339     {
3340         return _getSupportedServiceNames();
3341     }
3342 }
3343 
3344 uno::Sequence< OUString > SAL_CALL SvxShape::_getSupportedServiceNames()
3345     throw(uno::RuntimeException)
3346 {
3347     OGuard aGuard( Application::GetSolarMutex() );
3348 
3349     if( mpObj.is() && mpObj->GetObjInventor() == SdrInventor)
3350     {
3351         const sal_uInt16 nIdent = mpObj->GetObjIdentifier();
3352 
3353         switch(nIdent)
3354         {
3355         case OBJ_GRUP:
3356             {
3357                 static uno::Sequence< OUString > *pSeq = 0;
3358                 if( 0 == pSeq )
3359                 {
3360 //                  OGuard aGuard( Application::GetSolarMutex() );
3361 //                  if( 0 == pSeq )
3362                     {
3363                         static uno::Sequence< OUString > SvxShape_GroupServices;
3364 
3365                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_GroupServices, 2,
3366                             sUNO_service_drawing_GroupShape,
3367                             sUNO_service_drawing_Shape );
3368 
3369                         pSeq = &SvxShape_GroupServices;
3370                     }
3371                 }
3372 
3373                 return *pSeq;
3374             }
3375         case OBJ_CUSTOMSHAPE:
3376             {
3377                 static uno::Sequence< OUString > *pSeq = 0;
3378                 if( 0 == pSeq )
3379                 {
3380 //                  OGuard aGuard( Application::GetSolarMutex() );
3381 //                  if( 0 == pSeq )
3382                     {
3383                         static uno::Sequence< OUString > SvxShape_CustomShapeServices;
3384 
3385                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_CustomShapeServices, 13,
3386                             sUNO_service_drawing_CustomShape,
3387                             sUNO_service_drawing_Shape,
3388                             sUNO_service_drawing_CustomShapeProperties,
3389                             sUNO_service_drawing_FillProperties,
3390                             sUNO_service_drawing_LineProperties,
3391                             sUNO_service_drawing_Text,
3392                             sUNO_service_drawing_TextProperties,
3393                             sUNO_service_style_ParagraphProperties,
3394                             sUNO_service_style_ParagraphPropertiesComplex,
3395                             sUNO_service_style_ParagraphPropertiesAsian,
3396                             sUNO_service_style_CharacterProperties,
3397                             sUNO_service_style_CharacterPropertiesComplex,
3398                             sUNO_service_style_CharacterPropertiesAsian,
3399                             sUNO_service_drawing_ShadowProperties,
3400                             sUNO_service_drawing_RotationDescriptor);
3401                         pSeq = &SvxShape_CustomShapeServices;
3402                     }
3403                 }
3404                 return *pSeq;
3405             }
3406         case OBJ_LINE:
3407             {
3408                 static uno::Sequence< OUString > *pSeq = 0;
3409                 if( 0 == pSeq )
3410                 {
3411 //                  OGuard aGuard( Application::GetSolarMutex() );
3412 //                  if( 0 == pSeq )
3413                     {
3414                         static uno::Sequence< OUString > SvxShape_LineServices;
3415 
3416                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_LineServices,14,
3417                             sUNO_service_drawing_LineShape,
3418 
3419                             sUNO_service_drawing_Shape,
3420                             sUNO_service_drawing_LineProperties,
3421 
3422                             sUNO_service_drawing_Text,
3423                             sUNO_service_drawing_TextProperties,
3424                             sUNO_service_style_ParagraphProperties,
3425                             sUNO_service_style_ParagraphPropertiesComplex,
3426                             sUNO_service_style_ParagraphPropertiesAsian,
3427                             sUNO_service_style_CharacterProperties,
3428                             sUNO_service_style_CharacterPropertiesComplex,
3429                             sUNO_service_style_CharacterPropertiesAsian,
3430 
3431                             sUNO_service_drawing_PolyPolygonDescriptor,
3432                             sUNO_service_drawing_ShadowProperties,
3433                             sUNO_service_drawing_RotationDescriptor);
3434 
3435                         pSeq = &SvxShape_LineServices;
3436                     }
3437                 }
3438                 return *pSeq;
3439             }
3440 
3441         case OBJ_RECT:
3442             {
3443                 static uno::Sequence< OUString > *pSeq = 0;
3444                 if( 0 == pSeq )
3445                 {
3446 //                  OGuard aGuard( Application::GetSolarMutex() );
3447 //                  if( 0 == pSeq )
3448                     {
3449                         static uno::Sequence< OUString > SvxShape_RectServices;
3450 
3451                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_RectServices,14,
3452                             sUNO_service_drawing_RectangleShape,
3453 
3454                             sUNO_service_drawing_Shape,
3455                             sUNO_service_drawing_FillProperties,
3456                             sUNO_service_drawing_LineProperties,
3457                             sUNO_service_drawing_Text,
3458                             sUNO_service_drawing_TextProperties,
3459                             sUNO_service_style_ParagraphProperties,
3460                             sUNO_service_style_ParagraphPropertiesComplex,
3461                             sUNO_service_style_ParagraphPropertiesAsian,
3462                             sUNO_service_style_CharacterProperties,
3463                             sUNO_service_style_CharacterPropertiesComplex,
3464                             sUNO_service_style_CharacterPropertiesAsian,
3465 
3466                             sUNO_service_drawing_ShadowProperties,
3467                             sUNO_service_drawing_RotationDescriptor);
3468                         pSeq = &SvxShape_RectServices;
3469                     }
3470 
3471                 }
3472                 return *pSeq;
3473             }
3474 
3475         case OBJ_CIRC:
3476         case OBJ_SECT:
3477         case OBJ_CARC:
3478         case OBJ_CCUT:
3479             {
3480                 static uno::Sequence< OUString > *pSeq = 0;
3481                 if( 0 == pSeq )
3482                 {
3483 //                  OGuard aGuard( Application::GetSolarMutex() );
3484 //                  if( 0 == pSeq )
3485                     {
3486                         static uno::Sequence< OUString > SvxShape_CircServices;
3487 
3488                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_CircServices,14,
3489                             sUNO_service_drawing_EllipseShape,
3490 
3491                             sUNO_service_drawing_Shape,
3492                             sUNO_service_drawing_FillProperties,
3493                             sUNO_service_drawing_LineProperties,
3494 
3495                             sUNO_service_drawing_Text,
3496                             sUNO_service_drawing_TextProperties,
3497                             sUNO_service_style_ParagraphProperties,
3498                             sUNO_service_style_ParagraphPropertiesComplex,
3499                             sUNO_service_style_ParagraphPropertiesAsian,
3500                             sUNO_service_style_CharacterProperties,
3501                             sUNO_service_style_CharacterPropertiesComplex,
3502                             sUNO_service_style_CharacterPropertiesAsian,
3503 
3504                             sUNO_service_drawing_ShadowProperties,
3505                             sUNO_service_drawing_RotationDescriptor);
3506 
3507                         pSeq = &SvxShape_CircServices;
3508                     }
3509                 }
3510 
3511                 return *pSeq;
3512             }
3513 
3514         case OBJ_PATHPLIN:
3515         case OBJ_PLIN:
3516             {
3517                 static uno::Sequence< OUString > *pSeq = 0;
3518                 if( 0 == pSeq )
3519                 {
3520 //                  OGuard aGuard( Application::GetSolarMutex() );
3521 //                  if( 0 == pSeq )
3522                     {
3523                         static uno::Sequence< OUString > SvxShape_PathServices;
3524                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_PathServices,14,
3525                             sUNO_service_drawing_PolyLineShape,
3526 
3527                             sUNO_service_drawing_Shape,
3528                             sUNO_service_drawing_LineProperties,
3529 
3530                             sUNO_service_drawing_PolyPolygonDescriptor,
3531 
3532                             sUNO_service_drawing_Text,
3533                             sUNO_service_drawing_TextProperties,
3534                             sUNO_service_style_ParagraphProperties,
3535                             sUNO_service_style_ParagraphPropertiesComplex,
3536                             sUNO_service_style_ParagraphPropertiesAsian,
3537                             sUNO_service_style_CharacterProperties,
3538                             sUNO_service_style_CharacterPropertiesComplex,
3539                             sUNO_service_style_CharacterPropertiesAsian,
3540 
3541                             sUNO_service_drawing_ShadowProperties,
3542                             sUNO_service_drawing_RotationDescriptor);
3543                         pSeq = &SvxShape_PathServices;
3544                     }
3545                 }
3546                 return *pSeq;
3547             }
3548 
3549         case OBJ_PATHPOLY:
3550         case OBJ_POLY:
3551             {
3552                 static uno::Sequence< OUString > *pSeq = 0;
3553                 if( 0 == pSeq )
3554                 {
3555 //                  OGuard aGuard( Application::GetSolarMutex() );
3556 //                  if( 0 == pSeq )
3557                     {
3558                         static uno::Sequence< OUString > SvxShape_PolyServices;
3559                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_PolyServices,15,
3560                             sUNO_service_drawing_PolyPolygonShape,
3561 
3562                             sUNO_service_drawing_Shape,
3563                             sUNO_service_drawing_LineProperties,
3564                             sUNO_service_drawing_FillProperties,
3565 
3566                             sUNO_service_drawing_PolyPolygonDescriptor,
3567 
3568                             sUNO_service_drawing_Text,
3569                             sUNO_service_drawing_TextProperties,
3570                             sUNO_service_style_ParagraphProperties,
3571                             sUNO_service_style_ParagraphPropertiesComplex,
3572                             sUNO_service_style_ParagraphPropertiesAsian,
3573                             sUNO_service_style_CharacterProperties,
3574                             sUNO_service_style_CharacterPropertiesComplex,
3575                             sUNO_service_style_CharacterPropertiesAsian,
3576 
3577                             sUNO_service_drawing_ShadowProperties,
3578                             sUNO_service_drawing_RotationDescriptor);
3579 
3580                         pSeq = &SvxShape_PolyServices;
3581                     }
3582                 }
3583                 return *pSeq;
3584             }
3585 
3586         case OBJ_FREELINE:
3587         case OBJ_PATHLINE:
3588             {
3589                 static uno::Sequence< OUString > *pSeq = 0;
3590                 if( 0 == pSeq )
3591                 {
3592 //                  OGuard aGuard( Application::GetSolarMutex() );
3593 //                  if( 0 == pSeq )
3594                     {
3595                         static uno::Sequence< OUString > SvxShape_FreeLineServices;
3596 
3597                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_FreeLineServices,15,
3598                             sUNO_service_drawing_OpenBezierShape,
3599 
3600                             sUNO_service_drawing_Shape,
3601                             sUNO_service_drawing_LineProperties,
3602                             sUNO_service_drawing_FillProperties,
3603 
3604                             sUNO_service_drawing_PolyPolygonBezierDescriptor,
3605 
3606                             sUNO_service_drawing_Text,
3607                             sUNO_service_drawing_TextProperties,
3608                             sUNO_service_style_ParagraphProperties,
3609                             sUNO_service_style_ParagraphPropertiesComplex,
3610                             sUNO_service_style_ParagraphPropertiesAsian,
3611                             sUNO_service_style_CharacterProperties,
3612                             sUNO_service_style_CharacterPropertiesComplex,
3613                             sUNO_service_style_CharacterPropertiesAsian,
3614 
3615                             sUNO_service_drawing_ShadowProperties,
3616                             sUNO_service_drawing_RotationDescriptor);
3617 
3618                         pSeq = &SvxShape_FreeLineServices;
3619                     }
3620                 }
3621 
3622                 return *pSeq;
3623             }
3624 
3625         case OBJ_FREEFILL:
3626         case OBJ_PATHFILL:
3627             {
3628                 static uno::Sequence< OUString > *pSeq = 0;
3629                 if( 0 == pSeq )
3630                 {
3631 //                  OGuard aGuard( Application::GetSolarMutex() );
3632 //                  if( 0 == pSeq )
3633                     {
3634                         static uno::Sequence< OUString > SvxShape_FreeFillServices;
3635                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_FreeFillServices,15,
3636                             sUNO_service_drawing_ClosedBezierShape,
3637 
3638                             sUNO_service_drawing_Shape,
3639                             sUNO_service_drawing_LineProperties,
3640                             sUNO_service_drawing_FillProperties,
3641 
3642                             sUNO_service_drawing_PolyPolygonBezierDescriptor,
3643 
3644                             sUNO_service_drawing_Text,
3645                             sUNO_service_drawing_TextProperties,
3646                             sUNO_service_style_ParagraphProperties,
3647                             sUNO_service_style_ParagraphPropertiesComplex,
3648                             sUNO_service_style_ParagraphPropertiesAsian,
3649                             sUNO_service_style_CharacterProperties,
3650                             sUNO_service_style_CharacterPropertiesComplex,
3651                             sUNO_service_style_CharacterPropertiesAsian,
3652 
3653                             sUNO_service_drawing_ShadowProperties,
3654                             sUNO_service_drawing_RotationDescriptor);
3655 
3656                         pSeq = &SvxShape_FreeFillServices;
3657                     }
3658                 }
3659                 return *pSeq;
3660             }
3661 
3662         case OBJ_OUTLINETEXT:
3663         case OBJ_TITLETEXT:
3664         case OBJ_TEXT:
3665             {
3666                 static uno::Sequence< OUString > *pSeq = 0;
3667                 if( 0 == pSeq )
3668                 {
3669 //                  OGuard aGuard( Application::GetSolarMutex() );
3670 //                  if( 0 == pSeq )
3671                     {
3672                         static uno::Sequence< OUString > SvxShape_TextServices;
3673                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_TextServices,14,
3674                             sUNO_service_drawing_TextShape,
3675 
3676                             sUNO_service_drawing_Shape,
3677                             sUNO_service_drawing_FillProperties,
3678                             sUNO_service_drawing_LineProperties,
3679 
3680                             sUNO_service_drawing_Text,
3681                             sUNO_service_drawing_TextProperties,
3682                             sUNO_service_style_ParagraphProperties,
3683                             sUNO_service_style_ParagraphPropertiesComplex,
3684                             sUNO_service_style_ParagraphPropertiesAsian,
3685                             sUNO_service_style_CharacterProperties,
3686                             sUNO_service_style_CharacterPropertiesComplex,
3687                             sUNO_service_style_CharacterPropertiesAsian,
3688 
3689                             sUNO_service_drawing_ShadowProperties,
3690                             sUNO_service_drawing_RotationDescriptor);
3691 
3692                         pSeq = &SvxShape_TextServices;
3693                     }
3694                 }
3695                 return *pSeq;
3696             }
3697 
3698         case OBJ_GRAF:
3699             {
3700                 static uno::Sequence< OUString > *pSeq = 0;
3701                 if( 0 == pSeq )
3702                 {
3703 //                  OGuard aGuard( Application::GetSolarMutex() );
3704 //                  if( 0 == pSeq )
3705                     {
3706                         static uno::Sequence< OUString > SvxShape_GrafServices;
3707                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_GrafServices, 12,
3708                             sUNO_service_drawing_GraphicObjectShape,
3709 
3710                             sUNO_service_drawing_Shape,
3711 
3712                             sUNO_service_drawing_Text,
3713                             sUNO_service_drawing_TextProperties,
3714                             sUNO_service_style_ParagraphProperties,
3715                             sUNO_service_style_ParagraphPropertiesComplex,
3716                             sUNO_service_style_ParagraphPropertiesAsian,
3717                             sUNO_service_style_CharacterProperties,
3718                             sUNO_service_style_CharacterPropertiesComplex,
3719                             sUNO_service_style_CharacterPropertiesAsian,
3720 
3721                             sUNO_service_drawing_ShadowProperties,
3722                             sUNO_service_drawing_RotationDescriptor);
3723 
3724                         pSeq = &SvxShape_GrafServices;
3725                     }
3726                 }
3727                 return *pSeq;
3728             }
3729 
3730         case OBJ_OLE2:
3731             {
3732                 static uno::Sequence< OUString > *pSeq = 0;
3733                 if( 0 == pSeq )
3734                 {
3735 //                  OGuard aGuard( Application::GetSolarMutex() );
3736 //                  if( 0 == pSeq )
3737                     {
3738                         static uno::Sequence< OUString > SvxShape_Ole2Services;
3739 
3740                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_Ole2Services, 2,
3741                             sUNO_service_drawing_OLE2Shape,
3742                             sUNO_service_drawing_Shape,
3743 
3744                             // #i118485# Added Text, Shadow and Rotation
3745                             sUNO_service_drawing_Text,
3746                             sUNO_service_drawing_TextProperties,
3747                             sUNO_service_style_ParagraphProperties,
3748                             sUNO_service_style_ParagraphPropertiesComplex,
3749                             sUNO_service_style_ParagraphPropertiesAsian,
3750                             sUNO_service_style_CharacterProperties,
3751                             sUNO_service_style_CharacterPropertiesComplex,
3752                             sUNO_service_style_CharacterPropertiesAsian,
3753 
3754                             sUNO_service_drawing_ShadowProperties,
3755                             sUNO_service_drawing_RotationDescriptor);
3756 
3757                         pSeq = &SvxShape_Ole2Services;
3758                     }
3759                 }
3760                 return *pSeq;
3761             }
3762 
3763         case OBJ_CAPTION:
3764             {
3765                 static uno::Sequence< OUString > *pSeq = 0;
3766                 if( 0 == pSeq )
3767                 {
3768 //                  OGuard aGuard( Application::GetSolarMutex() );
3769 //                  if( 0 == pSeq )
3770                     {
3771                         static uno::Sequence< OUString > SvxShape_CaptionServices;
3772 
3773                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_CaptionServices,14,
3774                             sUNO_service_drawing_CaptionShape,
3775 
3776                             sUNO_service_drawing_Shape,
3777                             sUNO_service_drawing_FillProperties,
3778                             sUNO_service_drawing_LineProperties,
3779 
3780                             sUNO_service_drawing_Text,
3781                             sUNO_service_drawing_TextProperties,
3782                             sUNO_service_style_ParagraphProperties,
3783                             sUNO_service_style_ParagraphPropertiesComplex,
3784                             sUNO_service_style_ParagraphPropertiesAsian,
3785                             sUNO_service_style_CharacterProperties,
3786                             sUNO_service_style_CharacterPropertiesComplex,
3787                             sUNO_service_style_CharacterPropertiesAsian,
3788 
3789                             sUNO_service_drawing_ShadowProperties,
3790                             sUNO_service_drawing_RotationDescriptor);
3791 
3792                         pSeq = &SvxShape_CaptionServices;
3793                     }
3794                 }
3795 
3796                 return *pSeq;
3797             }
3798 
3799         case OBJ_PAGE:
3800             {
3801                 static uno::Sequence< OUString > *pSeq = 0;
3802                 if( 0 == pSeq )
3803                 {
3804 //                  OGuard aGuard( Application::GetSolarMutex() );
3805 //                  if( 0 == pSeq )
3806                     {
3807                         static uno::Sequence< OUString > SvxShape_PageServices;
3808 
3809                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_PageServices, 2,
3810                             sUNO_service_drawing_PageShape,
3811                             sUNO_service_drawing_Shape );
3812 
3813                         pSeq = &SvxShape_PageServices;
3814                     }
3815                 }
3816 
3817                 return *pSeq;
3818             }
3819 
3820         case OBJ_MEASURE:
3821             {
3822                 static uno::Sequence< OUString > *pSeq = 0;
3823                 if( 0 == pSeq )
3824                 {
3825 //                  OGuard aGuard( Application::GetSolarMutex() );
3826 //                  if( 0 == pSeq )
3827                     {
3828                         static uno::Sequence< OUString > SvxShape_MeasureServices;
3829                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_MeasureServices,15,
3830                             sUNO_service_drawing_MeasureShape,
3831 
3832                             sUNO_service_drawing_MeasureProperties,
3833 
3834                             sUNO_service_drawing_Shape,
3835                             sUNO_service_drawing_LineProperties,
3836 
3837                             sUNO_service_drawing_Text,
3838                             sUNO_service_drawing_TextProperties,
3839                             sUNO_service_style_ParagraphProperties,
3840                             sUNO_service_style_ParagraphPropertiesComplex,
3841                             sUNO_service_style_ParagraphPropertiesAsian,
3842                             sUNO_service_style_CharacterProperties,
3843                             sUNO_service_style_CharacterPropertiesComplex,
3844                             sUNO_service_style_CharacterPropertiesAsian,
3845 
3846                             sUNO_service_drawing_PolyPolygonDescriptor,
3847                             sUNO_service_drawing_ShadowProperties,
3848                             sUNO_service_drawing_RotationDescriptor);
3849 
3850                         pSeq = &SvxShape_MeasureServices;
3851                     }
3852                 }
3853 
3854                 return *pSeq;
3855             }
3856 
3857         case OBJ_FRAME:
3858             {
3859                 static uno::Sequence< OUString > *pSeq = 0;
3860                 if( 0 == pSeq )
3861                 {
3862 //                  OGuard aGuard( Application::GetSolarMutex() );
3863 //                  if( 0 == pSeq )
3864                     {
3865                         static uno::Sequence< OUString > SvxShape_FrameServices;
3866 
3867                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_FrameServices, 2,
3868                             sUNO_service_drawing_FrameShape,
3869                             sUNO_service_drawing_Shape );
3870 
3871                         pSeq = &SvxShape_FrameServices;
3872                     }
3873                 }
3874 
3875                 return *pSeq;
3876             }
3877 
3878         case OBJ_UNO:
3879             {
3880                 static uno::Sequence< OUString > *pSeq = 0;
3881                 if( 0 == pSeq )
3882                 {
3883 //                  OGuard _aGuard( Application::GetSolarMutex() );
3884 //                  if( 0 == pSeq )
3885                     {
3886                         static uno::Sequence< OUString > SvxShape_UnoServices;
3887                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_UnoServices, 2,
3888                             sUNO_service_drawing_ControlShape,
3889                             sUNO_service_drawing_Shape );
3890 
3891                         pSeq = &SvxShape_UnoServices;
3892                     }
3893                 }
3894                 return *pSeq;
3895             }
3896 
3897         case OBJ_EDGE:
3898             {
3899                 static uno::Sequence< OUString > *pSeq = 0;
3900                 if( 0 == pSeq )
3901                 {
3902 //                  OGuard aGuard( Application::GetSolarMutex() );
3903 //                  if( 0 == pSeq )
3904                     {
3905                         static uno::Sequence< OUString > SvxShape_EdgeServices;
3906 
3907                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_EdgeServices,15,
3908                             sUNO_service_drawing_ConnectorShape,
3909                             sUNO_service_drawing_ConnectorProperties,
3910 
3911                             sUNO_service_drawing_Shape,
3912                             sUNO_service_drawing_LineProperties,
3913 
3914                             sUNO_service_drawing_Text,
3915                             sUNO_service_drawing_TextProperties,
3916                             sUNO_service_style_ParagraphProperties,
3917                             sUNO_service_style_ParagraphPropertiesComplex,
3918                             sUNO_service_style_ParagraphPropertiesAsian,
3919                             sUNO_service_style_CharacterProperties,
3920                             sUNO_service_style_CharacterPropertiesComplex,
3921                             sUNO_service_style_CharacterPropertiesAsian,
3922 
3923                             sUNO_service_drawing_PolyPolygonDescriptor,
3924                             sUNO_service_drawing_ShadowProperties,
3925                             sUNO_service_drawing_RotationDescriptor);
3926 
3927                         pSeq = &SvxShape_EdgeServices;
3928                     }
3929                 }
3930                 return *pSeq;
3931             }
3932         case OBJ_MEDIA:
3933             {
3934                 static uno::Sequence< OUString > *pSeq = 0;
3935                 if( 0 == pSeq )
3936                 {
3937 //                  OGuard aGuard( Application::GetSolarMutex() );
3938 //                  if( 0 == pSeq )
3939                     {
3940                         static uno::Sequence< OUString > SvxShape_MediaServices;
3941 
3942                         comphelper::ServiceInfoHelper::addToSequence( SvxShape_MediaServices, 2,
3943                             sUNO_service_drawing_MediaShape,
3944                             sUNO_service_drawing_Shape);
3945 
3946                         pSeq = &SvxShape_MediaServices;
3947                     }
3948                 }
3949                 return *pSeq;
3950             }
3951         }
3952     }
3953     else if( mpObj.is() && mpObj->GetObjInventor() == FmFormInventor)
3954     {
3955 #if OSL_DEBUG_LEVEL > 0
3956         const sal_uInt16 nIdent = mpObj->GetObjIdentifier();
3957         OSL_ENSURE( nIdent == OBJ_UNO, "SvxShape::_getSupportedServiceNames: FmFormInventor, but no UNO object?" );
3958 #endif
3959         static uno::Sequence< OUString > *pSeq = 0;
3960         if( 0 == pSeq )
3961         {
3962 //                  OGuard aGuard( Application::GetSolarMutex() );
3963 //                  if( 0 == pSeq )
3964             {
3965                 static uno::Sequence< OUString > SvxShape_UnoServices;
3966                 comphelper::ServiceInfoHelper::addToSequence( SvxShape_UnoServices, 2,
3967                     sUNO_service_drawing_ControlShape,
3968                     sUNO_service_drawing_Shape );
3969 
3970                 pSeq = &SvxShape_UnoServices;
3971             }
3972         }
3973         return *pSeq;
3974     }
3975     OSL_ENSURE( false, "SvxShape::_getSupportedServiceNames: could not determine object type!" );
3976     uno::Sequence< OUString > aSeq;
3977     return aSeq;
3978 }
3979 
3980 //----------------------------------------------------------------------
3981 sal_Bool SAL_CALL SvxShape::supportsService( const OUString& ServiceName ) throw ( uno::RuntimeException )
3982 {
3983     Sequence< OUString > SupportedServices( getSupportedServiceNames() );
3984     const ::rtl::OUString * pArray = SupportedServices.getConstArray();
3985     const sal_Int32 nCount = SupportedServices.getLength();
3986     sal_Int32 i;
3987     for( i = 0; i < nCount; i++ )
3988         if( *pArray++ == ServiceName )
3989             return sal_True;
3990     return sal_False;
3991 }
3992 
3993 //----------------------------------------------------------------------
3994 
3995 // XGluePointsSupplier
3996 uno::Reference< container::XIndexContainer > SAL_CALL SvxShape::getGluePoints()
3997     throw(uno::RuntimeException)
3998 {
3999     OGuard aGuard( Application::GetSolarMutex() );
4000     uno::Reference< container::XIndexContainer > xGluePoints( mxGluePoints );
4001 
4002     if( mpObj.is() && !xGluePoints.is() )
4003     {
4004         uno::Reference< container::XIndexContainer > xNew( SvxUnoGluePointAccess_createInstance( mpObj.get() ), uno::UNO_QUERY );
4005         mxGluePoints = xGluePoints = xNew;
4006     }
4007 
4008     return xGluePoints;
4009 }
4010 
4011 //----------------------------------------------------------------------
4012 
4013 // XChild
4014 uno::Reference< uno::XInterface > SAL_CALL SvxShape::getParent(  )
4015     throw(uno::RuntimeException)
4016 {
4017     OGuard aGuard( Application::GetSolarMutex() );
4018 
4019     if( mpObj.is() && mpObj->GetObjList() )
4020     {
4021         SdrObjList* pObjList = mpObj->GetObjList();
4022 
4023         switch( pObjList->GetListKind() )
4024         {
4025         case SDROBJLIST_GROUPOBJ:
4026             if( pObjList->GetOwnerObj()->ISA( SdrObjGroup ) )
4027                 return PTR_CAST( SdrObjGroup, pObjList->GetOwnerObj())->getUnoShape();
4028             else if( pObjList->GetOwnerObj()->ISA( E3dScene ) )
4029                 return PTR_CAST( E3dScene, pObjList->GetOwnerObj())->getUnoShape();
4030             break;
4031         case SDROBJLIST_DRAWPAGE:
4032         case SDROBJLIST_MASTERPAGE:
4033             return PTR_CAST( SdrPage, pObjList )->getUnoPage();
4034         default:
4035             DBG_ERROR( "SvxShape::getParent(  ): unexpected SdrObjListKind" );
4036             break;
4037         }
4038     }
4039 
4040     uno::Reference< uno::XInterface > xParent;
4041     return xParent;
4042 }
4043 
4044 //----------------------------------------------------------------------
4045 
4046 void SAL_CALL SvxShape::setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& )
4047     throw(lang::NoSupportException, uno::RuntimeException)
4048 {
4049     throw lang::NoSupportException();
4050 }
4051 
4052 //----------------------------------------------------------------------
4053 
4054 /** called from the XActionLockable interface methods on initial locking */
4055 void SvxShape::lock()
4056 {
4057 }
4058 
4059 //----------------------------------------------------------------------
4060 
4061 /** called from the XActionLockable interface methods on final unlock */
4062 void SvxShape::unlock()
4063 {
4064 }
4065 
4066 //----------------------------------------------------------------------
4067 
4068 // XActionLockable
4069 sal_Bool SAL_CALL SvxShape::isActionLocked(  ) throw (::com::sun::star::uno::RuntimeException)
4070 {
4071     OGuard aGuard( Application::GetSolarMutex() );
4072 
4073     return mnLockCount != 0;
4074 }
4075 
4076 //----------------------------------------------------------------------
4077 
4078 void SAL_CALL SvxShape::addActionLock(  ) throw (::com::sun::star::uno::RuntimeException)
4079 {
4080     OGuard aGuard( Application::GetSolarMutex() );
4081 
4082     DBG_ASSERT( mnLockCount < 0xffff, "lock overflow in SvxShape!" );
4083     mnLockCount++;
4084 
4085     if( mnLockCount == 1 )
4086         lock();
4087 }
4088 
4089 //----------------------------------------------------------------------
4090 
4091 void SAL_CALL SvxShape::removeActionLock(  ) throw (::com::sun::star::uno::RuntimeException)
4092 {
4093     OGuard aGuard( Application::GetSolarMutex() );
4094 
4095     DBG_ASSERT( mnLockCount > 0, "lock underflow in SvxShape!" );
4096     mnLockCount--;
4097 
4098     if( mnLockCount == 0 )
4099         unlock();
4100 }
4101 
4102 //----------------------------------------------------------------------
4103 
4104 void SAL_CALL SvxShape::setActionLocks( sal_Int16 nLock ) throw (::com::sun::star::uno::RuntimeException )
4105 {
4106     OGuard aGuard( Application::GetSolarMutex() );
4107 
4108     if( (mnLockCount == 0) && (nLock != 0) )
4109         unlock();
4110 
4111     if( (mnLockCount != 0) && (nLock == 0) )
4112         lock();
4113 
4114     mnLockCount = (sal_uInt16)nLock;
4115 }
4116 
4117 //----------------------------------------------------------------------
4118 
4119 sal_Int16 SAL_CALL SvxShape::resetActionLocks(  ) throw (::com::sun::star::uno::RuntimeException)
4120 {
4121     OGuard aGuard( Application::GetSolarMutex() );
4122 
4123     if( mnLockCount != 0 )
4124         unlock();
4125 
4126     sal_Int16 nOldLocks = (sal_Int16)mnLockCount;
4127     mnLockCount = 0;
4128 
4129     return nOldLocks;
4130 }
4131 
4132 //----------------------------------------------------------------------
4133 
4134 /** since polygon shapes can change theire kind during editing, we have
4135     to recheck it here.
4136     Circle shapes also change theire kind, but theire all treated equal
4137     so no update is necessary.
4138 */
4139 void SvxShape::updateShapeKind()
4140 {
4141     switch( mpImpl->mnObjId )
4142     {
4143         case OBJ_LINE:
4144         case OBJ_POLY:
4145         case OBJ_PLIN:
4146         case OBJ_PATHLINE:
4147         case OBJ_PATHFILL:
4148         case OBJ_FREELINE:
4149         case OBJ_FREEFILL:
4150         case OBJ_PATHPOLY:
4151         case OBJ_PATHPLIN:
4152         {
4153             const sal_uInt32 nId = mpObj->GetObjIdentifier();
4154 
4155             if( nId != mpImpl->mnObjId )
4156             {
4157                 mpImpl->mnObjId = nId;
4158 
4159             }
4160             break;
4161         }
4162     };
4163 }
4164 
4165 /***********************************************************************
4166 * class SvxShapeText                                                   *
4167 ***********************************************************************/
4168 SvxShapeText::SvxShapeText() throw ()
4169 : SvxShape(NULL, aSvxMapProvider.GetMap(SVXMAP_TEXT), aSvxMapProvider.GetPropertySet(SVXMAP_TEXT, SdrObject::GetGlobalDrawObjectItemPool()) ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() )
4170 {
4171 }
4172 
4173 //----------------------------------------------------------------------
4174 SvxShapeText::SvxShapeText( SdrObject* pObject ) throw ()
4175 : SvxShape( pObject, aSvxMapProvider.GetMap(SVXMAP_TEXT), aSvxMapProvider.GetPropertySet(SVXMAP_TEXT, SdrObject::GetGlobalDrawObjectItemPool()) ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() )
4176 {
4177     if( pObject && pObject->GetModel() )
4178         SetEditSource( new SvxTextEditSource( pObject, 0, static_cast< uno::XWeak * >( this ) ) );
4179 }
4180 
4181 //----------------------------------------------------------------------
4182 SvxShapeText::SvxShapeText( SdrObject* pObject, const SfxItemPropertyMapEntry* pPropertyMap, const SvxItemPropertySet* pPropertySet ) throw ()
4183 : SvxShape( pObject, pPropertyMap, pPropertySet ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() )
4184 {
4185     if( pObject && pObject->GetModel() )
4186         SetEditSource( new SvxTextEditSource( pObject, 0, static_cast< uno::XWeak * >( this ) ) );
4187 }
4188 
4189 //----------------------------------------------------------------------
4190 SvxShapeText::~SvxShapeText() throw ()
4191 {
4192     // check if only this instance is registered at the ranges
4193     DBG_ASSERT( (NULL == GetEditSource()) || (GetEditSource()->getRanges().size()==1),
4194         "svx::SvxShapeText::~SvxShapeText(), text shape with living text ranges destroyed!");
4195 }
4196 
4197 void SvxShapeText::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage )
4198 {
4199     if( pNewObj && (NULL == GetEditSource()))
4200         SetEditSource( new SvxTextEditSource( pNewObj, 0, static_cast< uno::XWeak* >(this) ) );
4201 
4202     SvxShape::Create( pNewObj, pNewPage );
4203 }
4204 
4205 // XInterface
4206 //----------------------------------------------------------------------
4207 uno::Any SAL_CALL SvxShapeText::queryInterface( const uno::Type & rType )
4208     throw( uno::RuntimeException )
4209 {
4210     return SvxShape::queryInterface( rType );
4211 }
4212 
4213 //----------------------------------------------------------------------
4214 
4215 uno::Any SAL_CALL SvxShapeText::queryAggregation( const uno::Type & rType )
4216     throw( uno::RuntimeException )
4217 {
4218     uno::Any aAny( SvxShape::queryAggregation( rType ) );
4219     if( aAny.hasValue() )
4220         return aAny;
4221 
4222     return SvxUnoTextBase::queryAggregation( rType );
4223 }
4224 
4225 //----------------------------------------------------------------------
4226 
4227 void SAL_CALL SvxShapeText::acquire() throw()
4228 {
4229     SvxShape::acquire();
4230 }
4231 
4232 //----------------------------------------------------------------------
4233 void SAL_CALL SvxShapeText::release() throw()
4234 {
4235     SvxShape::release();
4236 }
4237 
4238 // XServiceInfo
4239 //----------------------------------------------------------------------
4240 OUString SAL_CALL SvxShapeText::getImplementationName() throw( uno::RuntimeException )
4241 {
4242     static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM("SvxShapeText") );
4243     return aServiceName;
4244 }
4245 
4246 //----------------------------------------------------------------------
4247 uno::Sequence< OUString > SAL_CALL SvxShapeText::getSupportedServiceNames() throw( uno::RuntimeException )
4248 {
4249     return SvxShape::getSupportedServiceNames();
4250 }
4251 
4252 //----------------------------------------------------------------------
4253 sal_Bool SAL_CALL SvxShapeText::supportsService( const OUString& ServiceName ) throw ( uno::RuntimeException )
4254 {
4255     return SvxShape::supportsService(ServiceName);
4256 }
4257 
4258     // XTypeProvider
4259 //----------------------------------------------------------------------
4260 uno::Sequence< uno::Type > SAL_CALL SvxShapeText::getTypes()
4261     throw( uno::RuntimeException )
4262 {
4263     return SvxShape::getTypes();
4264 }
4265 
4266 sal_Int64 SAL_CALL SvxShapeText::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw(::com::sun::star::uno::RuntimeException) \
4267 {
4268     const sal_Int64 nReturn = SvxShape::getSomething( rId );
4269     if( nReturn )
4270         return nReturn;
4271 
4272     return SvxUnoTextBase::getSomething( rId );
4273 }
4274 
4275 //----------------------------------------------------------------------
4276 uno::Sequence< sal_Int8 > SAL_CALL SvxShapeText::getImplementationId()
4277     throw( uno::RuntimeException )
4278 {
4279     static ::cppu::OImplementationId* pID = NULL ;
4280 
4281     if ( pID == NULL )
4282     {
4283         // Ready for multithreading; get global mutex for first call of this method only! see before
4284         MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
4285 
4286         // Control these pointer again ... it can be, that another instance will be faster then these!
4287         if ( pID == NULL )
4288         {
4289             // Create a new static ID ...
4290             static ::cppu::OImplementationId aID( sal_False ) ;
4291             // ... and set his address to static pointer!
4292             pID = &aID ;
4293         }
4294     }
4295 
4296     return pID->getImplementationId() ;
4297 }
4298 
4299 //----------------------------------------------------------------------
4300 
4301 /** called from the XActionLockable interface methods on initial locking */
4302 void SvxShapeText::lock()
4303 {
4304     SvxTextEditSource* pEditSource = (SvxTextEditSource*)GetEditSource();
4305     if( pEditSource )
4306         pEditSource->lock();
4307 }
4308 
4309 //----------------------------------------------------------------------
4310 
4311 /** called from the XActionLockable interface methods on final unlock */
4312 void SvxShapeText::unlock()
4313 {
4314     SvxTextEditSource* pEditSource = (SvxTextEditSource*)GetEditSource();
4315     if( pEditSource )
4316         pEditSource->unlock();
4317 }
4318 
4319 // ::com::sun::star::text::XTextRange
4320 uno::Reference< text::XTextRange > SAL_CALL SvxShapeText::getStart() throw(uno::RuntimeException)
4321 {
4322     ::vos::OGuard aGuard( Application::GetSolarMutex() );
4323     SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL;
4324     if( pForwarder )
4325         ::GetSelection( maSelection, pForwarder );
4326     return SvxUnoTextBase::getStart();
4327 
4328 }
4329 
4330 uno::Reference< text::XTextRange > SAL_CALL SvxShapeText::getEnd() throw(uno::RuntimeException)
4331 {
4332     ::vos::OGuard aGuard( Application::GetSolarMutex() );
4333     SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL;
4334     if( pForwarder )
4335         ::GetSelection( maSelection, pForwarder );
4336     return SvxUnoTextBase::getEnd();
4337 }
4338 
4339 OUString SAL_CALL SvxShapeText::getString() throw(uno::RuntimeException)
4340 {
4341     ::vos::OGuard aGuard( Application::GetSolarMutex() );
4342     SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL;
4343     if( pForwarder )
4344         ::GetSelection( maSelection, pForwarder );
4345     return SvxUnoTextBase::getString();
4346 }
4347 
4348 
4349 void SAL_CALL SvxShapeText::setString( const OUString& aString ) throw(uno::RuntimeException)
4350 {
4351     ::vos::OGuard aGuard( Application::GetSolarMutex() );
4352     SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL;
4353     if( pForwarder )
4354         ::GetSelection( maSelection, pForwarder );
4355     SvxUnoTextBase::setString( aString );
4356 }
4357 
4358 // overide these for special property handling in subcasses. Return true if property is handled
4359 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)
4360 {
4361     // HACK-fix #99090#
4362     // since SdrTextObj::SetVerticalWriting exchanges
4363     // SDRATTR_TEXT_AUTOGROWWIDTH and SDRATTR_TEXT_AUTOGROWHEIGHT,
4364     // we have to set the textdirection here
4365 
4366     if( pProperty->nWID == SDRATTR_TEXTDIRECTION )
4367     {
4368         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObj.get() );
4369         if( pTextObj )
4370         {
4371             com::sun::star::text::WritingMode eMode;
4372             if( rValue >>= eMode )
4373             {
4374                 pTextObj->SetVerticalWriting( eMode == com::sun::star::text::WritingMode_TB_RL );
4375             }
4376         }
4377         return true;
4378     }
4379     return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
4380 }
4381 
4382 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)
4383 {
4384     if( pProperty->nWID == SDRATTR_TEXTDIRECTION )
4385     {
4386         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObj.get() );
4387         if( pTextObj && pTextObj->IsVerticalWriting() )
4388             rValue <<= com::sun::star::text::WritingMode_TB_RL;
4389         else
4390             rValue <<= com::sun::star::text::WritingMode_LR_TB;
4391         return true;
4392     }
4393 
4394     return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
4395 }
4396 
4397 bool SvxShapeText::getPropertyStateImpl( const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::beans::PropertyState& rState ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
4398 {
4399     return SvxShape::getPropertyStateImpl( pProperty, rState );
4400 }
4401 
4402 bool SvxShapeText::setPropertyToDefaultImpl( const SfxItemPropertySimpleEntry* pProperty ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
4403 {
4404     return SvxShape::setPropertyToDefaultImpl( pProperty );
4405 }
4406 
4407 /***********************************************************************
4408 * class SvxShapeRect                                                   *
4409 ***********************************************************************/
4410 DBG_NAME(SvxShapeRect)
4411 SvxShapeRect::SvxShapeRect( SdrObject* pObj ) throw()
4412 : SvxShapeText( pObj, aSvxMapProvider.GetMap(SVXMAP_SHAPE), aSvxMapProvider.GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool()))
4413 {
4414     DBG_CTOR(SvxShapeRect,NULL);
4415 }
4416 
4417 SvxShapeRect::~SvxShapeRect() throw()
4418 {
4419     DBG_DTOR(SvxShapeRect,NULL);
4420 }
4421 
4422 uno::Any SAL_CALL SvxShapeRect::queryInterface( const uno::Type & rType ) throw(uno::RuntimeException)
4423 {
4424     return SvxShapeText::queryInterface( rType );
4425 }
4426 
4427 uno::Any SAL_CALL SvxShapeRect::queryAggregation( const uno::Type & rType ) throw(uno::RuntimeException)
4428 {
4429     return SvxShapeText::queryAggregation( rType );
4430 }
4431 
4432 void SAL_CALL SvxShapeRect::acquire() throw()
4433 {
4434     OWeakAggObject::acquire();
4435 }
4436 
4437 void SAL_CALL SvxShapeRect::release() throw()
4438 {
4439     OWeakAggObject::release();
4440 }
4441 //----------------------------------------------------------------------
4442 // XServiceInfo
4443 //----------------------------------------------------------------------
4444 uno::Sequence< OUString > SvxShapeRect::getSupportedServiceNames(void) throw( uno::RuntimeException )
4445 {
4446     return SvxShape::getSupportedServiceNames();
4447 }
4448 
4449 /** returns a StarOffice API wrapper for the given SdrObject */
4450 uno::Reference< drawing::XShape > GetXShapeForSdrObject( SdrObject* pObj ) throw ()
4451 {
4452     uno::Reference< drawing::XShape > xShape( pObj->getUnoShape(), uno::UNO_QUERY );
4453     return xShape;
4454 }
4455 
4456 /** returns the SdrObject from the given StarOffice API wrapper */
4457 SdrObject* GetSdrObjectFromXShape( uno::Reference< drawing::XShape > xShape ) throw()
4458 {
4459     SvxShape* pShape = SvxShape::getImplementation( xShape );
4460     return pShape ? pShape->GetSdrObject() : 0;
4461 }
4462 
4463 //----------------------------------------------------------------------
4464 
4465 SdrObject* SdrObject::getSdrObjectFromXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInt )
4466 {
4467     SvxShape* pSvxShape = SvxShape::getImplementation( xInt );
4468     return pSvxShape ? pSvxShape->GetSdrObject() : 0;
4469 }
4470 
4471 uno::Any SvxItemPropertySet_getPropertyValue( const SvxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry* pMap, const SfxItemSet& rSet )
4472 {
4473     if(!pMap || !pMap->nWID)
4474         return uno::Any();
4475 
4476     // Check is for items that store either metric values if thei are positiv or percentage if thei are negativ.
4477     bool bDontConvertNegativeValues = ( pMap->nWID == XATTR_FILLBMP_SIZEX || pMap->nWID == XATTR_FILLBMP_SIZEY );
4478     return rPropSet.getPropertyValue( pMap, rSet, (pMap->nWID != SDRATTR_XMLATTRIBUTES), bDontConvertNegativeValues );
4479 }
4480 
4481 void SvxItemPropertySet_setPropertyValue( const SvxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry* pMap, const uno::Any& rVal, SfxItemSet& rSet )
4482 {
4483     if(!pMap || !pMap->nWID)
4484         return;
4485 
4486     bool bDontConvertNegativeValues = ( pMap->nWID == XATTR_FILLBMP_SIZEX || pMap->nWID == XATTR_FILLBMP_SIZEY );
4487     rPropSet.setPropertyValue( pMap, rVal, rSet, bDontConvertNegativeValues );
4488 }
4489