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