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 ///////////////////////////////////////////////////////////////////////
SvxOle2Shape(SdrObject * pObject)82 SvxOle2Shape::SvxOle2Shape( SdrObject* pObject ) throw()
83 : SvxShapeText( pObject, aSvxMapProvider.GetMap(SVXMAP_OLE2), aSvxMapProvider.GetPropertySet(SVXMAP_OLE2, SdrObject::GetGlobalDrawObjectItemPool()) )
84 {
85 }
86
SvxOle2Shape(SdrObject * pObject,const SfxItemPropertyMapEntry * pPropertyMap,const SvxItemPropertySet * pPropertySet)87 SvxOle2Shape::SvxOle2Shape( SdrObject* pObject, const SfxItemPropertyMapEntry* pPropertyMap, const SvxItemPropertySet* pPropertySet ) throw ()
88 : SvxShapeText( pObject, pPropertyMap, pPropertySet )
89 {
90 }
91
~SvxOle2Shape()92 SvxOle2Shape::~SvxOle2Shape() throw()
93 {
94 }
95
queryAggregation(const::com::sun::star::uno::Type & rType)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
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)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
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)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 // #119735# just use GetGDIMetaFile, it will create a bufferd version of contained bitmap now automatically
298 GDIMetaFile aMtf(pObj->GetGraphic()->GetGDIMetaFile());
299 SvMemoryStream aDestStrm( 65535, 65535 );
300 ConvertGDIMetaFileToWMF( aMtf, aDestStrm, NULL, sal_False );
301 const uno::Sequence<sal_Int8> aSeq(
302 static_cast< const sal_Int8* >(aDestStrm.GetData()),
303 aDestStrm.GetEndOfData());
304 rValue <<= aSeq;
305 }
306 }
307 }
308 else
309 {
310 rValue = GetBitmap( sal_True );
311 }
312 break;
313 }
314
315 case OWN_ATTR_OLE_VISAREA:
316 {
317 awt::Rectangle aVisArea;
318 if( mpObj->ISA(SdrOle2Obj))
319 {
320 MapMode aMapMode( MAP_100TH_MM ); // the API uses this map mode
321 Size aTmp = ((SdrOle2Obj*)mpObj.get())->GetOrigObjSize( &aMapMode ); // get the size in the requested map mode
322 aVisArea = awt::Rectangle( 0, 0, aTmp.Width(), aTmp.Height() );
323 }
324
325 rValue <<= aVisArea;
326 break;
327 }
328
329 case OWN_ATTR_OLESIZE:
330 {
331 Size aTmp( static_cast<SdrOle2Obj*>(mpObj.get())->GetOrigObjSize() );
332 rValue <<= awt::Size( aTmp.Width(), aTmp.Height() );
333 break;
334 }
335
336 case OWN_ATTR_OLE_ASPECT:
337 {
338 rValue <<= static_cast<SdrOle2Obj*>(mpObj.get())->GetAspect();
339 break;
340 }
341
342 case OWN_ATTR_OLEMODEL:
343 case OWN_ATTR_OLE_EMBEDDED_OBJECT:
344 case OWN_ATTR_OLE_EMBEDDED_OBJECT_NONEWCLIENT:
345 {
346 SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>( mpObj.get() );
347 if( pObj )
348 {
349 uno::Reference < embed::XEmbeddedObject > xObj( pObj->GetObjRef() );
350 if ( xObj.is()
351 && ( pProperty->nWID == OWN_ATTR_OLE_EMBEDDED_OBJECT || pProperty->nWID == OWN_ATTR_OLE_EMBEDDED_OBJECT_NONEWCLIENT || svt::EmbeddedObjectRef::TryRunningState( xObj ) ) )
352 {
353 // Discussed with CL fue to the before GetPaintingPageView
354 // usage. Removed it, former fallback is used now
355 if ( pProperty->nWID == OWN_ATTR_OLEMODEL || pProperty->nWID == OWN_ATTR_OLE_EMBEDDED_OBJECT )
356 {
357 #ifdef DBG_UTIL
358 const sal_Bool bSuccess(pObj->AddOwnLightClient());
359 OSL_ENSURE( bSuccess, "An object without client is provided!" );
360 #else
361 pObj->AddOwnLightClient();
362 #endif
363 }
364
365 if ( pProperty->nWID == OWN_ATTR_OLEMODEL )
366 rValue <<= pObj->GetObjRef()->getComponent();
367 else
368 rValue <<= xObj;
369 }
370 }
371 break;
372 }
373
374 case OWN_ATTR_VALUE_GRAPHIC:
375 {
376 uno::Reference< graphic::XGraphic > xGraphic;
377 Graphic* pGraphic = static_cast<SdrOle2Obj*>( mpObj.get() )->GetGraphic();
378 if( pGraphic )
379 xGraphic = pGraphic->GetXGraphic();
380 rValue <<= xGraphic;
381 break;
382 }
383
384 case OWN_ATTR_THUMBNAIL:
385 {
386 OUString aURL;
387 SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
388 if( pOle )
389 {
390 Graphic* pGraphic = pOle->GetGraphic();
391
392 // if there isn't already a preview graphic set, check if we need to generate
393 // one if model says so
394 if( pGraphic == NULL && !pOle->IsEmptyPresObj() && mpModel->IsSaveOLEPreview() )
395 pGraphic = pOle->GetGraphic();
396
397 if( pGraphic )
398 {
399 GraphicObject aObj( *pGraphic );
400 aURL = OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_NAME_GRAPHOBJ_URLPREFIX));
401 aURL += OUString::createFromAscii( aObj.GetUniqueID().GetBuffer() );
402 }
403 }
404 rValue <<= aURL;
405 break;
406 }
407 case OWN_ATTR_PERSISTNAME:
408 {
409 OUString aPersistName;
410 SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
411
412 if( pOle )
413 {
414 aPersistName = pOle->GetPersistName();
415 if( aPersistName.getLength() )
416 {
417 ::comphelper::IEmbeddedHelper *pPersist = mpObj->GetModel()->GetPersist();
418 if( (NULL == pPersist) || !pPersist->getEmbeddedObjectContainer().HasEmbeddedObject( pOle->GetPersistName() ) )
419 aPersistName = OUString();
420 }
421 }
422
423 rValue <<= aPersistName;
424 break;
425 }
426 case OWN_ATTR_OLE_LINKURL:
427 {
428 OUString aLinkURL;
429 SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
430
431 if( pOle )
432 {
433 uno::Reference< embed::XLinkageSupport > xLink( pOle->GetObjRef(), uno::UNO_QUERY );
434 if ( xLink.is() && xLink->isLink() )
435 aLinkURL = xLink->getLinkURL();
436 }
437
438 rValue <<= aLinkURL;
439 break;
440 }
441 default:
442 return SvxShapeText::getPropertyValueImpl( rName, pProperty, rValue );
443 }
444
445 return true;
446 }
447
createObject(const SvGlobalName & aClassName)448 sal_Bool SvxOle2Shape::createObject( const SvGlobalName &aClassName )
449 {
450 DBG_TESTSOLARMUTEX();
451
452 SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
453 if ( !pOle2Obj || !pOle2Obj->IsEmpty() )
454 return sal_False;
455
456 // create storage and inplace object
457 ::comphelper::IEmbeddedHelper* pPersist = mpModel->GetPersist();
458 ::rtl::OUString aPersistName;
459 OUString aTmpStr;
460 if( SvxShape::getPropertyValue( OUString::createFromAscii( UNO_NAME_OLE2_PERSISTNAME ) ) >>= aTmpStr )
461 aPersistName = aTmpStr;
462
463 //TODO/LATER: how to cope with creation failure?!
464 uno::Reference < embed::XEmbeddedObject > xObj( pPersist->getEmbeddedObjectContainer().CreateEmbeddedObject( aClassName.GetByteSequence(), aPersistName ) );
465 if( xObj.is() )
466 {
467 Rectangle aRect = pOle2Obj->GetLogicRect();
468 if ( aRect.GetWidth() == 100 && aRect.GetHeight() == 100 )
469 {
470 // TODO/LATER: is it possible that this method is used to create an iconified object?
471 // default size
472 try
473 {
474 awt::Size aSz = xObj->getVisualAreaSize( pOle2Obj->GetAspect() );
475 aRect.SetSize( Size( aSz.Width, aSz.Height ) );
476 }
477 catch( embed::NoVisualAreaSizeException& )
478 {}
479 pOle2Obj->SetLogicRect( aRect );
480 }
481 else
482 {
483 awt::Size aSz;
484 Size aSize = pOle2Obj->GetLogicRect().GetSize();
485 aSz.Width = aSize.Width();
486 aSz.Height = aSize.Height();
487 xObj->setVisualAreaSize( pOle2Obj->GetAspect(), aSz );
488 }
489
490 // connect the object after the visual area is set
491 SvxShape::setPropertyValue( OUString::createFromAscii( UNO_NAME_OLE2_PERSISTNAME ), Any( aTmpStr = aPersistName ) );
492
493 // the object is inserted during setting of PersistName property usually
494 if( pOle2Obj->IsEmpty() )
495 pOle2Obj->SetObjRef( xObj );
496 }
497
498 return xObj.is();
499 }
500
createLink(const::rtl::OUString & aLinkURL)501 sal_Bool SvxOle2Shape::createLink( const ::rtl::OUString& aLinkURL )
502 {
503 DBG_TESTSOLARMUTEX();
504
505 SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
506 if ( !pOle2Obj || !pOle2Obj->IsEmpty() )
507 return sal_False;
508
509 ::rtl::OUString aPersistName;
510
511 ::comphelper::IEmbeddedHelper* pPersist = mpModel->GetPersist();
512
513 uno::Sequence< beans::PropertyValue > aMediaDescr( 1 );
514 aMediaDescr[0].Name = ::rtl::OUString::createFromAscii( "URL" );
515 aMediaDescr[0].Value <<= aLinkURL;
516
517 uno::Reference< task::XInteractionHandler > xInteraction = pPersist->getInteractionHandler();
518 if ( xInteraction.is() )
519 {
520 aMediaDescr.realloc( 2 );
521 aMediaDescr[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InteractionHandler" ) );
522 aMediaDescr[1].Value <<= xInteraction;
523 }
524
525 //TODO/LATER: how to cope with creation failure?!
526 uno::Reference< embed::XEmbeddedObject > xObj =
527 pPersist->getEmbeddedObjectContainer().InsertEmbeddedLink( aMediaDescr , aPersistName );
528
529 if( xObj.is() )
530 {
531 Rectangle aRect = pOle2Obj->GetLogicRect();
532 if ( aRect.GetWidth() == 100 && aRect.GetHeight() == 100 )
533 {
534 // default size
535 try
536 {
537 awt::Size aSz = xObj->getVisualAreaSize( pOle2Obj->GetAspect() );
538 aRect.SetSize( Size( aSz.Width, aSz.Height ) );
539 }
540 catch( embed::NoVisualAreaSizeException& )
541 {}
542 pOle2Obj->SetLogicRect( aRect );
543 }
544 else
545 {
546 awt::Size aSz;
547 Size aSize = pOle2Obj->GetLogicRect().GetSize();
548 aSz.Width = aSize.Width();
549 aSz.Height = aSize.Height();
550 xObj->setVisualAreaSize( pOle2Obj->GetAspect(), aSz );
551 }
552
553 // connect the object after the visual area is set
554 SvxShape::setPropertyValue( OUString::createFromAscii( UNO_NAME_OLE2_PERSISTNAME ), uno::makeAny( aPersistName ) );
555
556 // the object is inserted during setting of PersistName property usually
557 if ( pOle2Obj->IsEmpty() )
558 pOle2Obj->SetObjRef( xObj );
559 }
560
561 return xObj.is();
562 }
563
resetModifiedState()564 void SvxOle2Shape::resetModifiedState()
565 {
566 ::comphelper::IEmbeddedHelper* pPersist = mpModel ? mpModel->GetPersist() : 0;
567 if( pPersist && !pPersist->isEnableSetModified() )
568 {
569 SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
570 if( pOle && !pOle->IsEmpty() )
571 {
572 uno::Reference < util::XModifiable > xMod( pOle->GetObjRef(), uno::UNO_QUERY );
573 if( xMod.is() )
574 // TODO/MBA: what's this?!
575 xMod->setModified( sal_False );
576 }
577 }
578 }
579
GetClassName_Impl(rtl::OUString & rHexCLSID)580 const SvGlobalName SvxOle2Shape::GetClassName_Impl(rtl::OUString& rHexCLSID)
581 {
582 DBG_TESTSOLARMUTEX();
583 SvGlobalName aClassName;
584 SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() );
585
586 if( pOle2Obj )
587 {
588 rHexCLSID = rtl::OUString();
589
590 if( pOle2Obj->IsEmpty() )
591 {
592 ::comphelper::IEmbeddedHelper* pPersist = mpModel->GetPersist();
593 if( pPersist )
594 {
595 uno::Reference < embed::XEmbeddedObject > xObj =
596 pPersist->getEmbeddedObjectContainer().GetEmbeddedObject( pOle2Obj->GetPersistName() );
597 if ( xObj.is() )
598 {
599 aClassName = SvGlobalName( xObj->getClassID() );
600 rHexCLSID = aClassName.GetHexName();
601 }
602 }
603 }
604
605 if (!rHexCLSID.getLength())
606 {
607 uno::Reference < embed::XEmbeddedObject > xObj( pOle2Obj->GetObjRef() );
608 if ( xObj.is() )
609 {
610 aClassName = SvGlobalName( xObj->getClassID() );
611 rHexCLSID = aClassName.GetHexName();
612 }
613 }
614 }
615
616 return aClassName;
617 }
618
619 ///////////////////////////////////////////////////////////////////////
620
SvxAppletShape(SdrObject * pObject)621 SvxAppletShape::SvxAppletShape( SdrObject* pObject ) throw()
622 : SvxOle2Shape( pObject, aSvxMapProvider.GetMap(SVXMAP_APPLET), aSvxMapProvider.GetPropertySet(SVXMAP_APPLET, SdrObject::GetGlobalDrawObjectItemPool()) )
623 {
624 SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.AppletShape" ) ) );
625 }
626
~SvxAppletShape()627 SvxAppletShape::~SvxAppletShape() throw()
628 {
629 }
630
Create(SdrObject * pNewObj,SvxDrawPage * pNewPage)631 void SvxAppletShape::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage )
632 {
633 SvxShape::Create( pNewObj, pNewPage );
634 const SvGlobalName aAppletClassId( SO3_APPLET_CLASSID );
635 createObject(aAppletClassId);
636 SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.AppletShape" ) ) );
637 }
638
setPropertyValue(const::rtl::OUString & aPropertyName,const::com::sun::star::uno::Any & rValue)639 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)
640 {
641 SvxShape::setPropertyValue( aPropertyName, rValue );
642 resetModifiedState();
643 }
644
setPropertyValues(const::com::sun::star::uno::Sequence<::rtl::OUString> & aPropertyNames,const::com::sun::star::uno::Sequence<::com::sun::star::uno::Any> & rValues)645 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)
646 {
647 SvxShape::setPropertyValues( aPropertyNames, rValues );
648 resetModifiedState();
649 }
650
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)651 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)
652 {
653 if( (pProperty->nWID >= OWN_ATTR_APPLET_DOCBASE) && (pProperty->nWID <= OWN_ATTR_APPLET_ISSCRIPT) )
654 {
655 if ( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
656 {
657 uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
658 if( xSet.is() )
659 {
660 // allow exceptions to pass through
661 xSet->setPropertyValue( rName, rValue );
662 }
663 }
664 return true;
665 }
666 else
667 {
668 return SvxOle2Shape::setPropertyValueImpl( rName, pProperty, rValue );
669 }
670 }
671
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)672 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)
673 {
674 if( (pProperty->nWID >= OWN_ATTR_APPLET_DOCBASE) && (pProperty->nWID <= OWN_ATTR_APPLET_ISSCRIPT) )
675 {
676 if ( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
677 {
678 uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
679 if( xSet.is() )
680 {
681 rValue = xSet->getPropertyValue( rName );
682 }
683 }
684 return true;
685 }
686 else
687 {
688 return SvxOle2Shape::getPropertyValueImpl( rName, pProperty, rValue );
689 }
690 }
691
692 ///////////////////////////////////////////////////////////////////////
693
SvxPluginShape(SdrObject * pObject)694 SvxPluginShape::SvxPluginShape( SdrObject* pObject ) throw()
695 : SvxOle2Shape( pObject, aSvxMapProvider.GetMap(SVXMAP_PLUGIN), aSvxMapProvider.GetPropertySet(SVXMAP_PLUGIN, SdrObject::GetGlobalDrawObjectItemPool()) )
696 {
697 SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.PluginShape" ) ) );
698 }
699
~SvxPluginShape()700 SvxPluginShape::~SvxPluginShape() throw()
701 {
702 }
703
Create(SdrObject * pNewObj,SvxDrawPage * pNewPage)704 void SvxPluginShape::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage )
705 {
706 SvxShape::Create( pNewObj, pNewPage );
707 const SvGlobalName aPluginClassId( SO3_PLUGIN_CLASSID );
708 createObject(aPluginClassId);
709 SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.PluginShape" ) ) );
710 }
711
setPropertyValue(const::rtl::OUString & aPropertyName,const::com::sun::star::uno::Any & rValue)712 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)
713 {
714 SvxShape::setPropertyValue( aPropertyName, rValue );
715 resetModifiedState();
716 }
717
setPropertyValues(const::com::sun::star::uno::Sequence<::rtl::OUString> & aPropertyNames,const::com::sun::star::uno::Sequence<::com::sun::star::uno::Any> & rValues)718 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)
719 {
720 SvxShape::setPropertyValues( aPropertyNames, rValues );
721 resetModifiedState();
722 }
723
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)724 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)
725 {
726 if( (pProperty->nWID >= OWN_ATTR_PLUGIN_MIMETYPE) && (pProperty->nWID <= OWN_ATTR_PLUGIN_COMMANDS) )
727 {
728 if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
729 {
730 uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
731 if( xSet.is() )
732 {
733 // allow exceptions to pass through
734 xSet->setPropertyValue( rName, rValue );
735 }
736 }
737 return true;
738 }
739 else
740 {
741 return SvxOle2Shape::setPropertyValueImpl( rName, pProperty, rValue );
742 }
743 }
744
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)745 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)
746 {
747 if( (pProperty->nWID >= OWN_ATTR_PLUGIN_MIMETYPE) && (pProperty->nWID <= OWN_ATTR_PLUGIN_COMMANDS) )
748 {
749 if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
750 {
751 uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
752 if( xSet.is() )
753 {
754 rValue <<= xSet->getPropertyValue( rName );
755 }
756 }
757 return true;
758 }
759 else
760 {
761 return SvxOle2Shape::getPropertyValueImpl( rName, pProperty, rValue );
762 }
763 }
764
765 ///////////////////////////////////////////////////////////////////////
766
SvxFrameShape(SdrObject * pObject)767 SvxFrameShape::SvxFrameShape( SdrObject* pObject ) throw()
768 : SvxOle2Shape( pObject, aSvxMapProvider.GetMap(SVXMAP_FRAME), aSvxMapProvider.GetPropertySet(SVXMAP_FRAME, SdrObject::GetGlobalDrawObjectItemPool()) )
769 {
770 SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.FrameShape" ) ) );
771 }
772
~SvxFrameShape()773 SvxFrameShape::~SvxFrameShape() throw()
774 {
775 }
776
Create(SdrObject * pNewObj,SvxDrawPage * pNewPage)777 void SvxFrameShape::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage ) throw ()
778 {
779 SvxShape::Create( pNewObj, pNewPage );
780 const SvGlobalName aIFrameClassId( SO3_IFRAME_CLASSID );
781 createObject(aIFrameClassId);
782 SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.FrameShape" ) ) );
783 }
784
setPropertyValue(const::rtl::OUString & aPropertyName,const::com::sun::star::uno::Any & rValue)785 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)
786 {
787 SvxShape::setPropertyValue( aPropertyName, rValue );
788 resetModifiedState();
789 }
790
setPropertyValues(const::com::sun::star::uno::Sequence<::rtl::OUString> & aPropertyNames,const::com::sun::star::uno::Sequence<::com::sun::star::uno::Any> & rValues)791 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)
792 {
793 SvxShape::setPropertyValues( aPropertyNames, rValues );
794 resetModifiedState();
795 }
796
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)797 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)
798 {
799 if( (pProperty->nWID >= OWN_ATTR_FRAME_URL) && (pProperty->nWID <= OWN_ATTR_FRAME_MARGIN_HEIGHT) )
800 {
801 if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
802 {
803 uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
804 if( xSet.is() )
805 {
806 // allow exceptions to pass through
807 xSet->setPropertyValue( rName, rValue );
808 }
809 }
810 return true;
811 }
812 else
813 {
814 return SvxOle2Shape::setPropertyValueImpl( rName, pProperty, rValue );
815 }
816 }
817
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)818 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)
819 {
820 if( (pProperty->nWID >= OWN_ATTR_FRAME_URL) && (pProperty->nWID <= OWN_ATTR_FRAME_MARGIN_HEIGHT) )
821 {
822 if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) )
823 {
824 uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY );
825 if( xSet.is() )
826 {
827 rValue <<= xSet->getPropertyValue( rName );
828 }
829 }
830 return true;
831 }
832 else
833 {
834 return SvxOle2Shape::getPropertyValueImpl( rName, pProperty, rValue );
835 }
836 }
837
838 /***********************************************************************
839 * *
840 ***********************************************************************/
841
SvxMediaShape(SdrObject * pObj)842 SvxMediaShape::SvxMediaShape( SdrObject* pObj ) throw()
843 : SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_MEDIA), aSvxMapProvider.GetPropertySet(SVXMAP_MEDIA, SdrObject::GetGlobalDrawObjectItemPool()) )
844 {
845 SetShapeType( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.MediaShape" ) ) );
846 }
847
848 //----------------------------------------------------------------------
~SvxMediaShape()849 SvxMediaShape::~SvxMediaShape() throw()
850 {
851 }
852
853 //----------------------------------------------------------------------
854
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)855 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)
856 {
857 if( (pProperty->nWID >= OWN_ATTR_MEDIA_URL) && (pProperty->nWID <= OWN_ATTR_MEDIA_ZOOM) )
858 {
859 SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( mpObj.get() );
860 ::avmedia::MediaItem aItem;
861 bool bOk = false;
862
863 switch( pProperty->nWID )
864 {
865 case OWN_ATTR_MEDIA_URL:
866 {
867 OUString aURL;
868 if( rValue >>= aURL )
869 {
870 bOk = true;
871 aItem.setURL( aURL );
872 }
873 }
874 break;
875
876 case( OWN_ATTR_MEDIA_LOOP ):
877 {
878 sal_Bool bLoop = sal_Bool();
879
880 if( rValue >>= bLoop )
881 {
882 bOk = true;
883 aItem.setLoop( bLoop );
884 }
885 }
886 break;
887
888 case( OWN_ATTR_MEDIA_MUTE ):
889 {
890 sal_Bool bMute = sal_Bool();
891
892 if( rValue >>= bMute )
893 {
894 bOk = true;
895 aItem.setMute( bMute );
896 }
897 }
898 break;
899
900 case( OWN_ATTR_MEDIA_VOLUMEDB ):
901 {
902 sal_Int16 nVolumeDB = sal_Int16();
903
904 if( rValue >>= nVolumeDB )
905 {
906 bOk = true;
907 aItem.setVolumeDB( nVolumeDB );
908 }
909 }
910 break;
911
912 case( OWN_ATTR_MEDIA_ZOOM ):
913 {
914 ::com::sun::star::media::ZoomLevel eLevel;
915
916 if( rValue >>= eLevel )
917 {
918 bOk = true;
919 aItem.setZoom( eLevel );
920 }
921 }
922 break;
923
924 default:
925 DBG_ERROR("SvxMediaShape::setPropertyValueImpl(), unknown argument!");
926 }
927
928 if( bOk )
929 {
930 pMedia->setMediaProperties( aItem );
931 return true;
932 }
933 }
934 else
935 {
936 return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
937 }
938
939 throw IllegalArgumentException();
940 }
941
942 //----------------------------------------------------------------------
943
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)944 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)
945 {
946 if( ( pProperty->nWID >= OWN_ATTR_MEDIA_URL ) && ( pProperty->nWID <= OWN_ATTR_MEDIA_ZOOM ) )
947 {
948 SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( mpObj.get() );
949 const ::avmedia::MediaItem aItem( pMedia->getMediaProperties() );
950
951 switch( pProperty->nWID )
952 {
953 case OWN_ATTR_MEDIA_URL:
954 rValue <<= aItem.getURL();
955 break;
956
957 case( OWN_ATTR_MEDIA_LOOP ):
958 rValue <<= (sal_Bool) aItem.isLoop();
959 break;
960
961 case( OWN_ATTR_MEDIA_MUTE ):
962 rValue <<= (sal_Bool) aItem.isMute();
963 break;
964
965 case( OWN_ATTR_MEDIA_VOLUMEDB ):
966 rValue <<= (sal_Int16) aItem.getVolumeDB();
967 break;
968
969 case( OWN_ATTR_MEDIA_ZOOM ):
970 rValue <<= aItem.getZoom();
971 break;
972
973 default:
974 DBG_ERROR("SvxMediaShape::getPropertyValueImpl(), unknown property!");
975 }
976 return true;
977 }
978 else
979 {
980 return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
981 }
982 }
983