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