xref: /aoo42x/main/svx/source/unodraw/unoshap4.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 #include <com/sun/star/util/XModifiable.hpp>
31 #include <com/sun/star/embed/XLinkageSupport.hpp>
32 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
33 #include <com/sun/star/task/XInteractionHandler.hpp>
34 
35 #define _SVX_USE_UNOGLOBALS_
36 
37 #include <vcl/virdev.hxx>
38 #include <svx/svdoole2.hxx>
39 #include <svx/svdomedia.hxx>
40 #include <svx/svdpool.hxx>
41 #ifndef SVX_LIGHT
42 #ifndef _SOT_CLSIDS_HXX
43 #include <sot/clsids.hxx>
44 #endif
45 #include <sfx2/frmdescr.hxx>
46 #endif
47 #include <vcl/svapp.hxx>
48 #include <vos/mutex.hxx>
49 
50 #include <toolkit/helper/vclunohelper.hxx>
51 #include <sfx2/objsh.hxx>
52 #include <sfx2/docfile.hxx>
53 
54 #include <sot/storage.hxx>
55 #include <sot/exchange.hxx>
56 #include <svtools/FilterConfigItem.hxx>
57 
58 #include <svx/svdmodel.hxx>
59 #include "shapeimpl.hxx"
60 
61 #include <svx/unoshprp.hxx>
62 
63 #include "svx/unoapi.hxx"
64 #include "svx/svdpagv.hxx"
65 #include "svx/svdview.hxx"
66 #include "svx/svdglob.hxx"
67 #include "svx/svdstr.hrc"
68 
69 ///////////////////////////////////////////////////////////////////////
70 
71 extern sal_Bool ConvertGDIMetaFileToWMF( const GDIMetaFile & rMTF, SvStream & rTargetStream, FilterConfigItem* pFilterConfigItem = NULL, sal_Bool bPlaceable = sal_True );
72 
73 ///////////////////////////////////////////////////////////////////////
74 
75 using namespace ::osl;
76 using namespace ::vos;
77 using namespace ::rtl;
78 using namespace ::cppu;
79 using namespace ::com::sun::star;
80 using namespace ::com::sun::star::uno;
81 using namespace ::com::sun::star::lang;
82 using namespace ::com::sun::star::container;
83 using namespace ::com::sun::star::beans;
84 
85 ///////////////////////////////////////////////////////////////////////
86 SvxOle2Shape::SvxOle2Shape( SdrObject* pObject ) throw()
87 : SvxShape( pObject, aSvxMapProvider.GetMap(SVXMAP_OLE2), aSvxMapProvider.GetPropertySet(SVXMAP_OLE2, SdrObject::GetGlobalDrawObjectItemPool())  )
88 {
89 }
90 
91 SvxOle2Shape::SvxOle2Shape( SdrObject* pObject, const SfxItemPropertyMapEntry* pPropertyMap, const SvxItemPropertySet* pPropertySet ) throw ()
92 : SvxShape( pObject, pPropertyMap, pPropertySet  )
93 {
94 }
95 
96 SvxOle2Shape::~SvxOle2Shape() throw()
97 {
98 }
99 
100 ::com::sun::star::uno::Any SAL_CALL SvxOle2Shape::queryAggregation( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
101 {
102 	return SvxShape::queryAggregation( rType );
103 }
104 
105 //XPropertySet
106 bool SvxOle2Shape::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)
107 {
108 	switch( pProperty->nWID )
109 	{
110 /*
111 	case OWN_ATTR_CLSID:
112 	{
113 		OUString aCLSID;
114 		if( rValue >>= aCLSID )
115 		{
116             // init an ole object with a global name
117 			SdrOle2Obj* pOle2 = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
118 			if( pOle2 )
119 			{
120                 uno::Reference < embed::XEmbeddedObject > xObj = pOle2->GetObjRef();
121                 if ( !xObj.is() )
122                 {
123 					SvGlobalName aClassName;
124 					if( aClassName.MakeId( aCLSID ) )
125 					{
126                         SfxObjectShell* pPersist = mpModel->GetPersist();
127                         ::rtl::OUString aPersistName;
128                         Any aAny( getPropertyValue( OUString::createFromAscii( UNO_NAME_OLE2_PERSISTNAME ) ) );
129                         aAny >>= aPersistName;
130 
131                         //TODO/LATER: how to cope with creation failure?!
132                         xObj = pPersist->GetEmbeddedObjectContainer().CreateEmbeddedObject( aClassName.GetByteSequence(), aPersistName );
133                         if( xObj.is() )
134                         {
135                             aAny <<= aPersistName;
136                             setPropertyValue( OUString::createFromAscii( UNO_NAME_OLE2_PERSISTNAME ), aAny );
137                             pOle2->SetObjRef( xObj );
138 
139                             Rectangle aRect = pOle2->GetLogicRect();
140                             awt::Size aSz;
141                             Size aSize( pOle2->GetLogicRect().GetSize() );
142                             aSz.Width = aSize.Width();
143                             aSz.Height = aSize.Height();
144                             xObj->setVisualAreaSize( pOle2->GetAspect(), aSz );
145 						}
146 					}
147                 }
148 			}
149 			return true;
150 		}
151 		break;
152 	}
153 */
154 	case OWN_ATTR_OLE_VISAREA:
155 	{
156 		// TODO/LATER: seems to make no sence for iconified object
157 
158 		awt::Rectangle aVisArea;
159 		if( (rValue >>= aVisArea) && mpObj->ISA(SdrOle2Obj))
160 		{
161 			Size aTmp( aVisArea.X + aVisArea.Width, aVisArea.Y + aVisArea.Height );
162             uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)mpObj.get())->GetObjRef();
163             if( xObj.is() )
164 			{
165 				try
166 				{
167 					MapUnit aMapUnit( MAP_100TH_MM ); // the API handles with MAP_100TH_MM map mode
168 					MapUnit aObjUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( embed::Aspects::MSOLE_CONTENT ) );
169 					aTmp = OutputDevice::LogicToLogic( aTmp, aMapUnit, aObjUnit );
170 					xObj->setVisualAreaSize( embed::Aspects::MSOLE_CONTENT, awt::Size( aTmp.Width(), aTmp.Height() ) );
171 				}
172 				catch( uno::Exception& )
173 				{
174 					OSL_ENSURE( sal_False, "Couldn't set the visual area for the object!\n" );
175 				}
176 			}
177 
178 			return true;
179 		}
180 		break;
181 	}
182 	case OWN_ATTR_OLE_ASPECT:
183 	{
184 		sal_Int64 nAspect = 0;
185 		if( rValue >>= nAspect )
186 		{
187 			static_cast<SdrOle2Obj*>(mpObj.get())->SetAspect( nAspect );
188 			return true;
189 		}
190 		break;
191 	}
192 	case OWN_ATTR_CLSID:
193 	{
194 		OUString aCLSID;
195 		if( rValue >>= aCLSID )
196 		{
197 			// init a ole object with a global name
198 			SvGlobalName aClassName;
199 			if( aClassName.MakeId( aCLSID ) )
200 			{
201 				if( createObject( aClassName ) )
202 					return true;
203 			}
204 		}
205 		break;
206 	}
207 	case OWN_ATTR_THUMBNAIL:
208 	{
209 		OUString aURL;
210 		if( rValue >>= aURL )
211 		{
212 			GraphicObject aGrafObj( GraphicObject::CreateGraphicObjectFromURL( aURL ) );
213 			static_cast<SdrOle2Obj*>(mpObj.get())->SetGraphic( &aGrafObj.GetGraphic() );
214 			return true;
215 		}
216 		break;
217 	}
218 	case OWN_ATTR_VALUE_GRAPHIC:
219 	{
220 		uno::Reference< graphic::XGraphic > xGraphic( rValue, uno::UNO_QUERY );
221 		if( xGraphic.is() )
222 		{
223 			SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
224 			if( pOle )
225 			{
226 				GraphicObject aGrafObj( xGraphic );
227 				const Graphic aGraphic( aGrafObj.GetGraphic() );
228 				pOle->SetGraphicToObj( aGraphic, rtl::OUString() );
229 			}
230 			return true;
231 		}
232 		break;
233 	}
234 	case OWN_ATTR_PERSISTNAME:
235     {
236 		OUString aPersistName;
237         if( rValue >>= aPersistName )
238 		{
239 			static_cast<SdrOle2Obj*>(mpObj.get())->SetPersistName( aPersistName );
240             return true;
241 		}
242 		break;
243     }
244 	case OWN_ATTR_OLE_LINKURL:
245 	{
246 		OUString aLinkURL;
247 		if( rValue >>= aLinkURL )
248 		{
249 			createLink( aLinkURL );
250 			return true;
251 		}
252 		break;
253 	}
254 	default:
255         return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
256 	}
257 
258 	throw IllegalArgumentException();
259 }
260 
261 bool SvxOle2Shape::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)
262 {
263 	switch( pProperty->nWID )
264 	{
265 	case OWN_ATTR_CLSID:
266 	{
267 		OUString aCLSID;
268 		SvGlobalName aClassName = GetClassName_Impl(aCLSID);
269 		rValue <<= aCLSID;
270 		break;
271 	}
272 
273 	case OWN_ATTR_INTERNAL_OLE:
274 	{
275 		rtl::OUString sCLSID;
276 		rValue <<= SotExchange::IsInternal( GetClassName_Impl(sCLSID) );
277 		break;
278 	}
279 
280 	case OWN_ATTR_METAFILE:
281 	{
282 		SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>(mpObj.get());
283 		if( pObj )
284 		{
285 			Graphic* pGraphic = pObj->GetGraphic();
286 			if( pGraphic )
287 			{
288 				sal_Bool bIsWMF = sal_False;
289 				if ( pGraphic->IsLink() )
290 				{
291 					GfxLink aLnk = pGraphic->GetLink();
292 					if ( aLnk.GetType() == GFX_LINK_TYPE_NATIVE_WMF )
293 					{
294 						bIsWMF = sal_True;
295 						uno::Sequence<sal_Int8> aSeq((sal_Int8*)aLnk.GetData(), (sal_Int32) aLnk.GetDataSize());
296 						rValue <<= aSeq;
297 					}
298 				}
299 				if ( !bIsWMF )
300 				{
301 					GDIMetaFile aMtf;
302 					if ( pGraphic->GetType() != GRAPHIC_BITMAP )
303 						aMtf = pObj->GetGraphic()->GetGDIMetaFile();
304 					else
305 					{
306 						VirtualDevice aVirDev;
307 						aMtf.Record( &aVirDev );
308 						pGraphic->Draw( &aVirDev, Point(),  pGraphic->GetPrefSize() );
309 						aMtf.Stop();
310 						aMtf.SetPrefSize( pGraphic->GetPrefSize() );
311 						aMtf.SetPrefMapMode( pGraphic->GetPrefMapMode() );
312 					}
313 					SvMemoryStream aDestStrm( 65535, 65535 );
314 					ConvertGDIMetaFileToWMF( aMtf, aDestStrm, NULL, sal_False );
315                     const uno::Sequence<sal_Int8> aSeq(
316                         static_cast< const sal_Int8* >(aDestStrm.GetData()),
317                         aDestStrm.GetEndOfData());
318 					rValue <<= aSeq;
319 				}
320 			}
321 		}
322 		else
323 		{
324 			rValue = GetBitmap( sal_True );
325 		}
326 		break;
327 	}
328 
329 	case OWN_ATTR_OLE_VISAREA:
330 	{
331 		awt::Rectangle aVisArea;
332 		if( mpObj->ISA(SdrOle2Obj))
333 		{
334 			MapMode aMapMode( MAP_100TH_MM ); // the API uses this map mode
335 			Size aTmp = ((SdrOle2Obj*)mpObj.get())->GetOrigObjSize( &aMapMode ); // get the size in the requested map mode
336 			aVisArea = awt::Rectangle( 0, 0, aTmp.Width(), aTmp.Height() );
337 		}
338 
339 		rValue <<= aVisArea;
340 		break;
341 	}
342 
343 	case OWN_ATTR_OLESIZE:
344 	{
345 		Size aTmp( static_cast<SdrOle2Obj*>(mpObj.get())->GetOrigObjSize() );
346 		rValue <<= awt::Size( aTmp.Width(), aTmp.Height() );
347 		break;
348 	}
349 
350 	case OWN_ATTR_OLE_ASPECT:
351 	{
352 		rValue <<= static_cast<SdrOle2Obj*>(mpObj.get())->GetAspect();
353 		break;
354 	}
355 
356 	case OWN_ATTR_OLEMODEL:
357 	case OWN_ATTR_OLE_EMBEDDED_OBJECT:
358 	case OWN_ATTR_OLE_EMBEDDED_OBJECT_NONEWCLIENT:
359 	{
360 		SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>( mpObj.get() );
361 		if( pObj )
362 		{
363             uno::Reference < embed::XEmbeddedObject > xObj( pObj->GetObjRef() );
364             if ( xObj.is()
365 			  && ( pProperty->nWID == OWN_ATTR_OLE_EMBEDDED_OBJECT || pProperty->nWID == OWN_ATTR_OLE_EMBEDDED_OBJECT_NONEWCLIENT || svt::EmbeddedObjectRef::TryRunningState( xObj ) ) )
366 			{
367 				// Discussed with CL fue to the before GetPaintingPageView
368 				// usage. Removed it, former fallback is used now
369                 if ( pProperty->nWID == OWN_ATTR_OLEMODEL || pProperty->nWID == OWN_ATTR_OLE_EMBEDDED_OBJECT )
370                 {
371 #ifdef DBG_UTIL
372 				    const sal_Bool bSuccess(pObj->AddOwnLightClient());
373 				    OSL_ENSURE( bSuccess, "An object without client is provided!" );
374 #else
375 				    pObj->AddOwnLightClient();
376 #endif
377                 }
378 
379 				if ( pProperty->nWID == OWN_ATTR_OLEMODEL )
380 					rValue <<= pObj->GetObjRef()->getComponent();
381 				else
382 					rValue <<= xObj;
383 			}
384 		}
385 		break;
386 	}
387 
388 	case OWN_ATTR_VALUE_GRAPHIC:
389 	{
390 		uno::Reference< graphic::XGraphic > xGraphic;
391 		Graphic* pGraphic = static_cast<SdrOle2Obj*>( mpObj.get() )->GetGraphic();
392 		if( pGraphic )
393 			xGraphic = pGraphic->GetXGraphic();
394 		rValue <<= xGraphic;
395 		break;
396 	}
397 
398 	case OWN_ATTR_THUMBNAIL:
399 	{
400 		OUString    aURL;
401 		SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
402         if( pOle )
403 		{
404 			Graphic* pGraphic = pOle->GetGraphic();
405 
406 			// if there isn't already a preview graphic set, check if we need to generate
407 			// one if model says so
408 			if( pGraphic == NULL && !pOle->IsEmptyPresObj() && mpModel->IsSaveOLEPreview() )
409                 pGraphic = pOle->GetGraphic();
410 
411 			if( pGraphic )
412 			{
413 				GraphicObject aObj( *pGraphic );
414 				aURL = OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_NAME_GRAPHOBJ_URLPREFIX));
415 				aURL += OUString::createFromAscii( aObj.GetUniqueID().GetBuffer() );
416 			}
417 		}
418 		rValue <<= aURL;
419 		break;
420 	}
421 	case OWN_ATTR_PERSISTNAME:
422     {
423 		OUString    aPersistName;
424 		SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
425 
426         if( pOle )
427 		{
428             aPersistName = pOle->GetPersistName();
429 			if( aPersistName.getLength() )
430 			{
431                 ::comphelper::IEmbeddedHelper *pPersist = mpObj->GetModel()->GetPersist();
432                 if( (NULL == pPersist) || !pPersist->getEmbeddedObjectContainer().HasEmbeddedObject( pOle->GetPersistName() ) )
433 					aPersistName = OUString();
434 			}
435 		}
436 
437 		rValue <<= aPersistName;
438 		break;
439     }
440 	case OWN_ATTR_OLE_LINKURL:
441 	{
442 		OUString    aLinkURL;
443 		SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
444 
445         if( pOle )
446 		{
447 			uno::Reference< embed::XLinkageSupport > xLink( pOle->GetObjRef(), uno::UNO_QUERY );
448 			if ( xLink.is() && xLink->isLink() )
449 				aLinkURL = xLink->getLinkURL();
450 		}
451 
452 		rValue <<= aLinkURL;
453 		break;
454 	}
455 	default:
456         return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
457 	}
458 
459 	return true;
460 }
461 
462 sal_Bool SvxOle2Shape::createObject( const SvGlobalName &aClassName )
463 {
464     DBG_TESTSOLARMUTEX();
465 
466 	SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
467     if ( !pOle2Obj || !pOle2Obj->IsEmpty() )
468 		return sal_False;
469 
470 	// create storage and inplace object
471     ::comphelper::IEmbeddedHelper*     pPersist = mpModel->GetPersist();
472     ::rtl::OUString              aPersistName;
473     OUString            aTmpStr;
474 	if( getPropertyValue( OUString::createFromAscii( UNO_NAME_OLE2_PERSISTNAME ) ) >>= aTmpStr )
475         aPersistName = aTmpStr;
476 
477     //TODO/LATER: how to cope with creation failure?!
478     uno::Reference < embed::XEmbeddedObject > xObj( pPersist->getEmbeddedObjectContainer().CreateEmbeddedObject( aClassName.GetByteSequence(), aPersistName ) );
479     if( xObj.is() )
480     {
481         Rectangle aRect = pOle2Obj->GetLogicRect();
482         if ( aRect.GetWidth() == 100 && aRect.GetHeight() == 100 )
483         {
484 			// TODO/LATER: is it possible that this method is used to create an iconified object?
485             // default size
486 			try
487 			{
488             	awt::Size aSz = xObj->getVisualAreaSize( pOle2Obj->GetAspect() );
489             	aRect.SetSize( Size( aSz.Width, aSz.Height ) );
490 			}
491 			catch( embed::NoVisualAreaSizeException& )
492 			{}
493             pOle2Obj->SetLogicRect( aRect );
494         }
495         else
496         {
497             awt::Size aSz;
498             Size aSize = pOle2Obj->GetLogicRect().GetSize();
499             aSz.Width = aSize.Width();
500             aSz.Height = aSize.Height();
501 			xObj->setVisualAreaSize(  pOle2Obj->GetAspect(), aSz );
502         }
503 
504 		// connect the object after the visual area is set
505         setPropertyValue( OUString::createFromAscii( UNO_NAME_OLE2_PERSISTNAME ), Any( aTmpStr = aPersistName ) );
506 
507 		// the object is inserted during setting of PersistName property usually
508 		if( pOle2Obj->IsEmpty() )
509 			pOle2Obj->SetObjRef( xObj );
510     }
511 
512     return xObj.is();
513 }
514 
515 sal_Bool SvxOle2Shape::createLink( const ::rtl::OUString& aLinkURL )
516 {
517     DBG_TESTSOLARMUTEX();
518 
519 	SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
520     if ( !pOle2Obj || !pOle2Obj->IsEmpty() )
521 		return sal_False;
522 
523     ::rtl::OUString aPersistName;
524 
525     ::comphelper::IEmbeddedHelper* pPersist = mpModel->GetPersist();
526 
527 	uno::Sequence< beans::PropertyValue > aMediaDescr( 1 );
528 	aMediaDescr[0].Name = ::rtl::OUString::createFromAscii( "URL" );
529 	aMediaDescr[0].Value <<= aLinkURL;
530 
531 	uno::Reference< task::XInteractionHandler > xInteraction = pPersist->getInteractionHandler();
532 	if ( xInteraction.is() )
533 	{
534 		aMediaDescr.realloc( 2 );
535 		aMediaDescr[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InteractionHandler" ) );
536 		aMediaDescr[1].Value <<= xInteraction;
537 	}
538 
539     //TODO/LATER: how to cope with creation failure?!
540 	uno::Reference< embed::XEmbeddedObject > xObj =
541 			pPersist->getEmbeddedObjectContainer().InsertEmbeddedLink( aMediaDescr , aPersistName );
542 
543     if( xObj.is() )
544     {
545         Rectangle aRect = pOle2Obj->GetLogicRect();
546         if ( aRect.GetWidth() == 100 && aRect.GetHeight() == 100 )
547         {
548             // default size
549 			try
550 			{
551             	awt::Size aSz = xObj->getVisualAreaSize( pOle2Obj->GetAspect() );
552             	aRect.SetSize( Size( aSz.Width, aSz.Height ) );
553 			}
554 			catch( embed::NoVisualAreaSizeException& )
555 			{}
556 			pOle2Obj->SetLogicRect( aRect );
557         }
558         else
559         {
560             awt::Size aSz;
561             Size aSize = pOle2Obj->GetLogicRect().GetSize();
562             aSz.Width = aSize.Width();
563             aSz.Height = aSize.Height();
564             xObj->setVisualAreaSize(  pOle2Obj->GetAspect(), aSz );
565         }
566 
567 		// connect the object after the visual area is set
568         setPropertyValue( OUString::createFromAscii( UNO_NAME_OLE2_PERSISTNAME ), uno::makeAny( aPersistName ) );
569 
570 		// the object is inserted during setting of PersistName property usually
571 		if ( pOle2Obj->IsEmpty() )
572 			pOle2Obj->SetObjRef( xObj );
573     }
574 
575     return xObj.is();
576 }
577 
578 void SvxOle2Shape::resetModifiedState()
579 {
580 	::comphelper::IEmbeddedHelper* pPersist = mpModel ? mpModel->GetPersist() : 0;
581 	if( pPersist && !pPersist->isEnableSetModified() )
582 	{
583 		SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
584         if( pOle && !pOle->IsEmpty() )
585 		{
586             uno::Reference < util::XModifiable > xMod( pOle->GetObjRef(), uno::UNO_QUERY );
587             if( xMod.is() )
588                 // TODO/MBA: what's this?!
589                 xMod->setModified( sal_False );
590 		}
591 	}
592 }
593 
594 const SvGlobalName SvxOle2Shape::GetClassName_Impl(rtl::OUString& rHexCLSID)
595 {
596     DBG_TESTSOLARMUTEX();
597 	SvGlobalName aClassName;
598 	SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
599 
600 	if( pOle2Obj )
601 	{
602 		rHexCLSID = rtl::OUString();
603 
604 		if( pOle2Obj->IsEmpty() )
605 		{
606             ::comphelper::IEmbeddedHelper* pPersist = mpModel->GetPersist();
607             if( pPersist )
608 			{
609                 uno::Reference < embed::XEmbeddedObject > xObj =
610                         pPersist->getEmbeddedObjectContainer().GetEmbeddedObject( pOle2Obj->GetPersistName() );
611                 if ( xObj.is() )
612 				{
613                     aClassName = SvGlobalName( xObj->getClassID() );
614 					rHexCLSID = aClassName.GetHexName();
615 				}
616             }
617 		}
618 
619         if (!rHexCLSID.getLength())
620 		{
621             uno::Reference < embed::XEmbeddedObject > xObj( pOle2Obj->GetObjRef() );
622             if ( xObj.is() )
623 			{
624                 aClassName = SvGlobalName( xObj->getClassID() );
625 				rHexCLSID = aClassName.GetHexName();
626             }
627 		}
628 	}
629 
630     return aClassName;
631 }
632 
633 ///////////////////////////////////////////////////////////////////////
634 
635 SvxAppletShape::SvxAppletShape( SdrObject* pObject ) throw()
636 : SvxOle2Shape( pObject, aSvxMapProvider.GetMap(SVXMAP_APPLET), aSvxMapProvider.GetPropertySet(SVXMAP_APPLET, SdrObject::GetGlobalDrawObjectItemPool())  )
637 {
638 	SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.AppletShape" ) ) );
639 }
640 
641 SvxAppletShape::~SvxAppletShape() throw()
642 {
643 }
644 
645 void SvxAppletShape::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage )
646 {
647 	SvxShape::Create( pNewObj, pNewPage );
648 	const SvGlobalName aAppletClassId( SO3_APPLET_CLASSID );
649 	createObject(aAppletClassId);
650 	SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.AppletShape" ) ) );
651 }
652 
653 void SAL_CALL SvxAppletShape::setPropertyValue( const ::rtl::OUString& aPropertyName, 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)
654 {
655 	SvxShape::setPropertyValue( aPropertyName, rValue );
656 	resetModifiedState();
657 }
658 
659 void SAL_CALL SvxAppletShape::setPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rValues ) throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
660 {
661 	SvxShape::setPropertyValues( aPropertyNames, rValues );
662 	resetModifiedState();
663 }
664 
665 bool SvxAppletShape::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)
666 {
667 	if( (pProperty->nWID >= OWN_ATTR_APPLET_DOCBASE) && (pProperty->nWID <= OWN_ATTR_APPLET_ISSCRIPT) )
668 	{
669         if ( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
670 		{
671 	        uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
672 		    if( xSet.is() )
673 			{
674 				// allow exceptions to pass through
675                 xSet->setPropertyValue( rName, rValue );
676 			}
677 		}
678 		return true;
679 	}
680 	else
681 	{
682         return SvxOle2Shape::setPropertyValueImpl( rName, pProperty, rValue );
683 	}
684 }
685 
686 bool SvxAppletShape::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)
687 {
688     if( (pProperty->nWID >= OWN_ATTR_APPLET_DOCBASE) && (pProperty->nWID <= OWN_ATTR_APPLET_ISSCRIPT) )
689 	{
690         if ( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
691 		{
692 			uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
693 			if( xSet.is() )
694 			{
695                 rValue = xSet->getPropertyValue( rName );
696 			}
697         }
698 		return true;
699 	}
700 	else
701 	{
702         return SvxOle2Shape::getPropertyValueImpl( rName, pProperty, rValue );
703 	}
704 }
705 
706 ///////////////////////////////////////////////////////////////////////
707 
708 SvxPluginShape::SvxPluginShape( SdrObject* pObject ) throw()
709 : SvxOle2Shape( pObject, aSvxMapProvider.GetMap(SVXMAP_PLUGIN), aSvxMapProvider.GetPropertySet(SVXMAP_PLUGIN, SdrObject::GetGlobalDrawObjectItemPool()) )
710 {
711 	SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.PluginShape" ) ) );
712 }
713 
714 SvxPluginShape::~SvxPluginShape() throw()
715 {
716 }
717 
718 void SvxPluginShape::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage )
719 {
720 	SvxShape::Create( pNewObj, pNewPage );
721 	const SvGlobalName aPluginClassId( SO3_PLUGIN_CLASSID );
722 	createObject(aPluginClassId);
723 	SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.PluginShape" ) ) );
724 }
725 
726 void SAL_CALL SvxPluginShape::setPropertyValue( const ::rtl::OUString& aPropertyName, 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)
727 {
728 	SvxShape::setPropertyValue( aPropertyName, rValue );
729 	resetModifiedState();
730 }
731 
732 void SAL_CALL SvxPluginShape::setPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rValues ) throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
733 {
734 	SvxOle2Shape::setPropertyValues( aPropertyNames, rValues );
735 	resetModifiedState();
736 }
737 
738 bool SvxPluginShape::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)
739 {
740 	if( (pProperty->nWID >= OWN_ATTR_PLUGIN_MIMETYPE) && (pProperty->nWID <= OWN_ATTR_PLUGIN_COMMANDS) )
741 	{
742         if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
743 		{
744 	        uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
745 			if( xSet.is() )
746 			{
747                 // allow exceptions to pass through
748                 xSet->setPropertyValue( rName, rValue );
749 			}
750 		}
751 		return true;
752 	}
753 	else
754 	{
755         return SvxOle2Shape::setPropertyValueImpl( rName, pProperty, rValue );
756 	}
757 }
758 
759 bool SvxPluginShape::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)
760 {
761 	if( (pProperty->nWID >= OWN_ATTR_PLUGIN_MIMETYPE) && (pProperty->nWID <= OWN_ATTR_PLUGIN_COMMANDS) )
762 	{
763 		if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
764 		{
765 			uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
766 			if( xSet.is() )
767 			{
768                 rValue <<= xSet->getPropertyValue( rName );
769             }
770 		}
771 		return true;
772 	}
773 	else
774 	{
775         return SvxOle2Shape::getPropertyValueImpl( rName, pProperty, rValue );
776 	}
777 }
778 
779 ///////////////////////////////////////////////////////////////////////
780 
781 SvxFrameShape::SvxFrameShape( SdrObject* pObject ) throw()
782 : SvxOle2Shape( pObject, aSvxMapProvider.GetMap(SVXMAP_FRAME), aSvxMapProvider.GetPropertySet(SVXMAP_FRAME, SdrObject::GetGlobalDrawObjectItemPool())  )
783 {
784 	SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.FrameShape" ) ) );
785 }
786 
787 SvxFrameShape::~SvxFrameShape() throw()
788 {
789 }
790 
791 void SvxFrameShape::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage ) throw ()
792 {
793 	SvxShape::Create( pNewObj, pNewPage );
794 	const SvGlobalName aIFrameClassId( SO3_IFRAME_CLASSID );
795 	createObject(aIFrameClassId);
796 	SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.FrameShape" ) ) );
797 }
798 
799 void SAL_CALL SvxFrameShape::setPropertyValue( const ::rtl::OUString& aPropertyName, 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)
800 {
801 	SvxShape::setPropertyValue( aPropertyName, rValue );
802 	resetModifiedState();
803 }
804 
805 void SAL_CALL SvxFrameShape::setPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rValues ) throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
806 {
807 	SvxOle2Shape::setPropertyValues( aPropertyNames, rValues );
808 	resetModifiedState();
809 }
810 
811 bool SvxFrameShape::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)
812 {
813 	if( (pProperty->nWID >= OWN_ATTR_FRAME_URL) && (pProperty->nWID <= OWN_ATTR_FRAME_MARGIN_HEIGHT) )
814 	{
815 		if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
816 		{
817 			uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
818 			if( xSet.is() )
819 			{
820 				// allow exceptions to pass through
821                 xSet->setPropertyValue( rName, rValue );
822 			}
823 		}
824 		return true;
825 	}
826 	else
827 	{
828         return SvxOle2Shape::setPropertyValueImpl( rName, pProperty, rValue );
829 	}
830 }
831 
832 bool SvxFrameShape::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)
833 {
834 	if( (pProperty->nWID >= OWN_ATTR_FRAME_URL) && (pProperty->nWID <= OWN_ATTR_FRAME_MARGIN_HEIGHT) )
835 	{
836 		if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
837 		{
838 			uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
839 			if( xSet.is() )
840 			{
841                 rValue <<= xSet->getPropertyValue( rName );
842 			}
843 		}
844 		return true;
845 	}
846 	else
847 	{
848         return SvxOle2Shape::getPropertyValueImpl( rName, pProperty, rValue );
849 	}
850 }
851 
852 /***********************************************************************
853 *                                                                      *
854 ***********************************************************************/
855 
856 SvxMediaShape::SvxMediaShape( SdrObject* pObj ) throw()
857 :	SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_MEDIA), aSvxMapProvider.GetPropertySet(SVXMAP_MEDIA, SdrObject::GetGlobalDrawObjectItemPool()) )
858 {
859 	SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.MediaShape" ) ) );
860 }
861 
862 //----------------------------------------------------------------------
863 SvxMediaShape::~SvxMediaShape() throw()
864 {
865 }
866 
867 //----------------------------------------------------------------------
868 
869 bool SvxMediaShape::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)
870 {
871 	if( (pProperty->nWID >= OWN_ATTR_MEDIA_URL) && (pProperty->nWID <= OWN_ATTR_MEDIA_ZOOM) )
872 	{
873 		SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( mpObj.get() );
874 		::avmedia::MediaItem aItem;
875 		bool bOk = false;
876 
877 		switch( pProperty->nWID )
878 		{
879 		case OWN_ATTR_MEDIA_URL:
880 		{
881 			OUString aURL;
882 			if( rValue >>= aURL )
883 			{
884 				bOk = true;
885 				aItem.setURL( aURL );
886 			}
887 		}
888 		break;
889 
890 		case( OWN_ATTR_MEDIA_LOOP ):
891 		{
892 			sal_Bool bLoop = sal_Bool();
893 
894 			if( rValue >>= bLoop )
895 			{
896 				bOk = true;
897 				aItem.setLoop( bLoop );
898 			}
899 		}
900 		break;
901 
902 		case( OWN_ATTR_MEDIA_MUTE ):
903 		{
904 			sal_Bool bMute = sal_Bool();
905 
906 			if( rValue >>= bMute )
907 			{
908 				bOk = true;
909 				aItem.setMute( bMute );
910 			}
911 		}
912 		break;
913 
914 		case( OWN_ATTR_MEDIA_VOLUMEDB ):
915 		{
916 			sal_Int16 nVolumeDB = sal_Int16();
917 
918 			if( rValue >>= nVolumeDB )
919 			{
920 				bOk = true;
921 				aItem.setVolumeDB( nVolumeDB );
922 			}
923 		}
924 		break;
925 
926 		case( OWN_ATTR_MEDIA_ZOOM ):
927 		{
928 			::com::sun::star::media::ZoomLevel eLevel;
929 
930 			if( rValue >>= eLevel )
931 			{
932 				bOk = true;
933 				aItem.setZoom( eLevel );
934 			}
935 		}
936 		break;
937 
938 		default:
939 			DBG_ERROR("SvxMediaShape::setPropertyValueImpl(), unknown argument!");
940 		}
941 
942 		if( bOk )
943 		{
944 			pMedia->setMediaProperties( aItem );
945 			return true;
946 		}
947 	}
948 	else
949 	{
950         return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
951 	}
952 
953 	throw IllegalArgumentException();
954 }
955 
956 //----------------------------------------------------------------------
957 
958 bool SvxMediaShape::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)
959 {
960 	if( ( pProperty->nWID >= OWN_ATTR_MEDIA_URL ) && ( pProperty->nWID <= OWN_ATTR_MEDIA_ZOOM ) )
961 	{
962 		SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( mpObj.get() );
963 		const ::avmedia::MediaItem aItem( pMedia->getMediaProperties() );
964 
965 		switch( pProperty->nWID )
966 		{
967 			case OWN_ATTR_MEDIA_URL:
968 				rValue <<= aItem.getURL();
969 				break;
970 
971 			case( OWN_ATTR_MEDIA_LOOP ):
972 				rValue <<= (sal_Bool) aItem.isLoop();
973 				break;
974 
975 			case( OWN_ATTR_MEDIA_MUTE ):
976 				rValue <<= (sal_Bool) aItem.isMute();
977 				break;
978 
979 			case( OWN_ATTR_MEDIA_VOLUMEDB ):
980 				rValue <<= (sal_Int16) aItem.getVolumeDB();
981 				break;
982 
983 			case( OWN_ATTR_MEDIA_ZOOM ):
984 				rValue <<= aItem.getZoom();
985 				break;
986 
987 			default:
988 				DBG_ERROR("SvxMediaShape::getPropertyValueImpl(), unknown property!");
989 		}
990 		return true;
991 	}
992 	else
993 	{
994         return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
995 	}
996 }
997