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