xref: /trunk/main/svx/source/unodraw/unoshap4.cxx (revision 25b1114295101a2e8c55dab9e4c2ddcafdffc2eb)
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 : SvxShapeText( 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 : SvxShapeText( 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 SvxShapeText::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 SvxShapeText::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 SvxShapeText::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     SvxShape::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     SvxShape::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