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