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