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