xref: /aoo42x/main/sd/source/ui/func/fuinsert.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 
31 #include "fuinsert.hxx"
32 
33 #include <comphelper/storagehelper.hxx>
34 #include <comphelper/processfactory.hxx>
35 #include <toolkit/helper/vclunohelper.hxx>
36 #include <svx/svxdlg.hxx>
37 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
38 #include <com/sun/star/embed/Aspects.hpp>
39 #include <com/sun/star/beans/XPropertySet.hpp>
40 #include <com/sun/star/chart2/XChartDocument.hpp>
41 #include <com/sun/star/drawing/FillStyle.hpp>
42 
43 #include <tools/urlobj.hxx>
44 #include <svl/urihelper.hxx>
45 #include <sfx2/msgpool.hxx>
46 #include <svtools/sores.hxx>
47 #include <svtools/insdlg.hxx>
48 #include <sfx2/request.hxx>
49 #include <svl/globalnameitem.hxx>
50 #include <unotools/pathoptions.hxx>
51 #include <svx/pfiledlg.hxx>
52 #include <svx/dialogs.hrc>
53 #include <sfx2/linkmgr.hxx>
54 #include <svx/svdetc.hxx>
55 #include <avmedia/mediawindow.hxx>
56 #ifndef _UNOTOOLS_UCBSTREAMHELPER_HXX
57 #include <unotools/ucbstreamhelper.hxx>
58 #endif
59 #include <sfx2/printer.hxx>
60 #include <sot/clsids.hxx>
61 #include <svtools/sfxecode.hxx>
62 #include <svtools/transfer.hxx>
63 #include <svl/urlbmk.hxx>
64 #include <svx/svdobj.hxx>
65 #include <svx/svdograf.hxx>
66 #include <svx/svdoole2.hxx>
67 #include <svx/svdomedia.hxx>
68 #ifndef _EDITENG_HXX //autogen
69 #include <editeng/editeng.hxx>
70 #endif
71 #include <sot/storage.hxx>
72 #include <sot/formats.hxx>
73 #include <svx/svdpagv.hxx>
74 #ifndef _MSGBOX_HXX //autogen
75 #include <vcl/msgbox.hxx>
76 #endif
77 #include <sfx2/opengrf.hxx>
78 
79 #include <sfx2/viewfrm.hxx>
80 
81 #include "app.hrc"
82 #include "misc.hxx"
83 #include "sdresid.hxx"
84 #include "View.hxx"
85 #include "app.hxx"
86 #include "Window.hxx"
87 #include "drawview.hxx"
88 #include "DrawViewShell.hxx"
89 #include "DrawDocShell.hxx"
90 #include "GraphicDocShell.hxx"
91 #include "strings.hrc"
92 #include "drawdoc.hxx"
93 #include "sdgrffilter.hxx"
94 #include "sdxfer.hxx"
95 #include <vcl/svapp.hxx>
96 #include "undo/undoobjects.hxx"
97 
98 using namespace com::sun::star;
99 
100 namespace sd {
101 
102 TYPEINIT1( FuInsertGraphic, FuPoor );
103 TYPEINIT1( FuInsertClipboard, FuPoor );
104 TYPEINIT1( FuInsertOLE, FuPoor );
105 TYPEINIT1( FuInsertAVMedia, FuPoor );
106 
107 /*************************************************************************
108 |*
109 |* FuInsertGraphic::Konstruktor
110 |*
111 \************************************************************************/
112 
113 FuInsertGraphic::FuInsertGraphic (
114     ViewShell* pViewSh,
115     ::sd::Window* pWin,
116     ::sd::View* pView,
117     SdDrawDocument* pDoc,
118     SfxRequest& rReq)
119     : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
120 {
121 }
122 
123 FunctionReference FuInsertGraphic::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
124 {
125 	FunctionReference xFunc( new FuInsertGraphic( pViewSh, pWin, pView, pDoc, rReq ) );
126 	xFunc->DoExecute(rReq);
127 	return xFunc;
128 }
129 
130 #ifdef _MSC_VER
131 #pragma optimize ( "", off )
132 #endif
133 
134 void FuInsertGraphic::DoExecute( SfxRequest&  )
135 {
136 	SvxOpenGraphicDialog	aDlg(SdResId(STR_INSERTGRAPHIC));
137 
138 	if( aDlg.Execute() == GRFILTER_OK )
139 	{
140 		Graphic		aGraphic;
141 		int nError = aDlg.GetGraphic(aGraphic);
142 		if( nError == GRFILTER_OK )
143 		{
144 			if( mpViewShell && mpViewShell->ISA(DrawViewShell))
145 			{
146 				sal_Int8	nAction = DND_ACTION_COPY;
147 				SdrObject* pPickObj = mpView->GetEmptyPresentationObject( PRESOBJ_GRAPHIC );
148 				if( pPickObj )
149 					nAction = DND_ACTION_LINK;
150 
151 				Point aPos;
152 				Rectangle aRect(aPos, mpWindow->GetOutputSizePixel() );
153 				aPos = aRect.Center();
154 				aPos = mpWindow->PixelToLogic(aPos);
155 				SdrGrafObj* pGrafObj = mpView->InsertGraphic(aGraphic, nAction, aPos, pPickObj, NULL);
156 
157 				if(pGrafObj && aDlg.IsAsLink())
158 				{
159 					// store link only?
160 					String aFltName(aDlg.GetCurrentFilter());
161 					String aPath(aDlg.GetPath());
162 					pGrafObj->SetGraphicLink(aPath, aFltName);
163 				}
164 			}
165 		}
166 		else
167 		{
168 			SdGRFFilter::HandleGraphicFilterError( (sal_uInt16)nError, GraphicFilter::GetGraphicFilter()->GetLastError().nStreamError );
169 		}
170 	}
171 }
172 
173 #ifdef _MSC_VER
174 #pragma optimize ( "", on )
175 #endif
176 
177 /*************************************************************************
178 |*
179 |* FuInsertClipboard::Konstruktor
180 |*
181 \************************************************************************/
182 
183 FuInsertClipboard::FuInsertClipboard (
184     ViewShell* pViewSh,
185     ::sd::Window* pWin,
186     ::sd::View* pView,
187     SdDrawDocument* pDoc,
188     SfxRequest& rReq)
189     : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
190 {
191 }
192 
193 FunctionReference FuInsertClipboard::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
194 {
195 	FunctionReference xFunc( new FuInsertClipboard( pViewSh, pWin, pView, pDoc, rReq ) );
196 	xFunc->DoExecute(rReq);
197 	return xFunc;
198 }
199 
200 void FuInsertClipboard::DoExecute( SfxRequest&  )
201 {
202 	TransferableDataHelper						aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpWindow ) );
203     sal_uLong                                       nFormatId;
204 
205     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
206     SfxAbstractPasteDialog* pDlg = pFact->CreatePasteDialog( mpViewShell->GetActiveWindow() );
207     if ( pDlg )
208     {
209         const String                                aEmptyString;
210         ::com::sun::star::datatransfer::DataFlavor  aFlavor;
211 
212         pDlg->Insert( SOT_FORMATSTR_ID_EMBED_SOURCE, aEmptyString );
213         pDlg->Insert( SOT_FORMATSTR_ID_LINK_SOURCE, aEmptyString );
214         pDlg->Insert( SOT_FORMATSTR_ID_DRAWING, aEmptyString );
215         pDlg->Insert( SOT_FORMATSTR_ID_SVXB, aEmptyString );
216         pDlg->Insert( FORMAT_GDIMETAFILE, aEmptyString );
217         pDlg->Insert( FORMAT_BITMAP, aEmptyString );
218         pDlg->Insert( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aEmptyString );
219         pDlg->Insert( FORMAT_STRING, aEmptyString );
220         pDlg->Insert( SOT_FORMATSTR_ID_HTML, aEmptyString );
221         pDlg->Insert( FORMAT_RTF, aEmptyString );
222         pDlg->Insert( SOT_FORMATSTR_ID_EDITENGINE, aEmptyString );
223 
224         //TODO/MBA: testing
225         nFormatId = pDlg->GetFormat( aDataHelper );
226         if( nFormatId && aDataHelper.GetTransferable().is() )
227         {
228             sal_Int8 nAction = DND_ACTION_COPY;
229 
230             if( !mpView->InsertData( aDataHelper,
231                                     mpWindow->PixelToLogic( Rectangle( Point(), mpWindow->GetOutputSizePixel() ).Center() ),
232                                     nAction, sal_False, nFormatId ) &&
233                 ( mpViewShell && mpViewShell->ISA( DrawViewShell ) ) )
234             {
235                 DrawViewShell* pDrViewSh = static_cast<DrawViewShell*>(mpViewShell);
236                 INetBookmark        aINetBookmark( aEmptyStr, aEmptyStr );
237 
238                 if( ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) &&
239                     aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) ||
240                     ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) &&
241                     aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR, aINetBookmark ) ) ||
242                     ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) &&
243                     aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR, aINetBookmark ) ) )
244                 {
245                     pDrViewSh->InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), aEmptyStr, NULL );
246                 }
247             }
248         }
249 
250         delete pDlg;
251     }
252 }
253 
254 
255 /*************************************************************************
256 |*
257 |* FuInsertOLE::Konstruktor
258 |*
259 \************************************************************************/
260 
261 FuInsertOLE::FuInsertOLE (
262     ViewShell* pViewSh,
263     ::sd::Window* pWin,
264     ::sd::View* pView,
265     SdDrawDocument* pDoc,
266     SfxRequest& rReq)
267 	: FuPoor(pViewSh, pWin, pView, pDoc, rReq)
268 {
269 }
270 
271 FunctionReference FuInsertOLE::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
272 {
273 	FunctionReference xFunc( new FuInsertOLE( pViewSh, pWin, pView, pDoc, rReq ) );
274 	xFunc->DoExecute(rReq);
275 	return xFunc;
276 }
277 
278 void FuInsertOLE::DoExecute( SfxRequest& rReq )
279 {
280 	if ( nSlotId == SID_ATTR_TABLE ||
281 		 nSlotId == SID_INSERT_DIAGRAM ||
282 		 nSlotId == SID_INSERT_MATH )
283 	{
284 		PresObjKind ePresObjKind = (nSlotId == SID_INSERT_DIAGRAM) ? PRESOBJ_CHART : PRESOBJ_OBJECT;
285 
286 		SdrObject* pPickObj = mpView->GetEmptyPresentationObject( ePresObjKind );
287 
288 		/**********************************************************************
289 		* Diagramm oder StarCalc-Tabelle einfuegen
290 		**********************************************************************/
291 
292         ::rtl::OUString aObjName;
293         SvGlobalName aName;
294 		if (nSlotId == SID_INSERT_DIAGRAM)
295             aName = SvGlobalName( SO3_SCH_CLASSID);
296         else if (nSlotId == SID_ATTR_TABLE)
297             aName = SvGlobalName(SO3_SC_CLASSID);
298         else if (nSlotId == SID_INSERT_MATH)
299             aName = SvGlobalName(SO3_SM_CLASSID);
300 
301         uno::Reference < embed::XEmbeddedObject > xObj = mpViewShell->GetViewFrame()->GetObjectShell()->
302                 GetEmbeddedObjectContainer().CreateEmbeddedObject( aName.GetByteSequence(), aObjName );
303         if ( xObj.is() )
304 		{
305             sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
306 
307 			MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
308 
309 			Rectangle aRect;
310 			if( pPickObj )
311 			{
312 				aRect = pPickObj->GetLogicRect();
313 
314         		awt::Size aSz;
315         		aSz.Width = aRect.GetWidth();
316         		aSz.Height = aRect.GetHeight();
317         		xObj->setVisualAreaSize( nAspect, aSz );
318 			}
319 			else
320 			{
321 				awt::Size aSz;
322 				try
323 				{
324 					aSz = xObj->getVisualAreaSize( nAspect );
325 				}
326 				catch ( embed::NoVisualAreaSizeException& )
327 				{
328 					// the default size will be set later
329 				}
330 
331 				Size aSize( aSz.Width, aSz.Height );
332 
333 				if (aSize.Height() == 0 || aSize.Width() == 0)
334 				{
335 					// Rechteck mit ausgewogenem Kantenverhaeltnis
336 					aSize.Width()  = 14100;
337 					aSize.Height() = 10000;
338 					Size aTmp = OutputDevice::LogicToLogic( aSize, MAP_100TH_MM, aUnit );
339 					aSz.Width = aTmp.Width();
340 					aSz.Height = aTmp.Height();
341 					xObj->setVisualAreaSize( nAspect, aSz );
342 				}
343 				else
344 				{
345 					aSize = OutputDevice::LogicToLogic(aSize, aUnit, MAP_100TH_MM);
346 				}
347 
348 				Point aPos;
349 				Rectangle aWinRect(aPos, mpWindow->GetOutputSizePixel() );
350 				aPos = aWinRect.Center();
351 				aPos = mpWindow->PixelToLogic(aPos);
352 				aPos.X() -= aSize.Width() / 2;
353 				aPos.Y() -= aSize.Height() / 2;
354 				aRect = Rectangle(aPos, aSize);
355 			}
356 
357             SdrOle2Obj* pOleObj = new SdrOle2Obj( svt::EmbeddedObjectRef( xObj, nAspect ), aObjName, aRect );
358 			SdrPageView* pPV = mpView->GetSdrPageView();
359 
360 			// if we have a pick obj we need to make this new ole a pres obj replacing the current pick obj
361 			if( pPickObj )
362 			{
363 				SdPage* pPage = static_cast< SdPage* >(pPickObj->GetPage());
364 				if(pPage && pPage->IsPresObj(pPickObj))
365 				{
366 					pPage->InsertPresObj( pOleObj, ePresObjKind );
367 					pOleObj->SetUserCall(pPickObj->GetUserCall());
368 				}
369 			}
370 
371 			bool bRet = true;
372 			if( pPickObj )
373 			    mpView->ReplaceObjectAtView(pPickObj, *pPV, pOleObj, sal_True );
374 			else
375 				bRet = mpView->InsertObjectAtView(pOleObj, *pPV, SDRINSERT_SETDEFLAYER);
376 
377 			if( bRet )
378 			{
379 				if (nSlotId == SID_INSERT_DIAGRAM)
380 				{
381 					pOleObj->SetProgName( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarChart" ) ) );
382 				}
383 				else if (nSlotId == SID_ATTR_TABLE)
384 				{
385 					pOleObj->SetProgName( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarCalc" ) ) );
386 				}
387 				else if (nSlotId == SID_INSERT_MATH)
388 				{
389 					pOleObj->SetProgName( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarMath" ) ) );
390 				}
391 
392 				//HMHmpView->HideMarkHdl();
393 				pOleObj->SetLogicRect(aRect);
394                 Size aTmp( OutputDevice::LogicToLogic( aRect.GetSize(), MAP_100TH_MM, aUnit ) );
395                 awt::Size aVisualSize;
396 				aVisualSize.Width = aTmp.Width();
397                 aVisualSize.Height = aTmp.Height();
398                 xObj->setVisualAreaSize( nAspect, aVisualSize );
399                 mpViewShell->ActivateObject(pOleObj, SVVERB_SHOW);
400 
401                 if (nSlotId == SID_INSERT_DIAGRAM)
402                 {
403                     // note, that this call modified the chart model which
404                     // results in a change notification.  So call this after
405                     // everything else is finished.
406                     mpViewShell->AdaptDefaultsForChart( xObj );
407                 }
408 			}
409 		}
410 		else
411 		{
412 			ErrorHandler::HandleError(* new StringErrorInfo(ERRCODE_SFX_OLEGENERAL,
413 										aEmptyStr ) );
414         }
415 	}
416 	else
417 	{
418 		/**********************************************************************
419 		* Objekt einfuegen
420 		**********************************************************************/
421         sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
422         sal_Bool bCreateNew = sal_False;
423         uno::Reference < embed::XEmbeddedObject > xObj;
424         uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage();
425         SvObjectServerList aServerLst;
426         ::rtl::OUString aName;
427 
428 		::rtl::OUString aIconMediaType;
429 		uno::Reference< io::XInputStream > xIconMetaFile;
430 
431         SFX_REQUEST_ARG( rReq, pNameItem, SfxGlobalNameItem, SID_INSERT_OBJECT, sal_False );
432         if ( nSlotId == SID_INSERT_OBJECT && pNameItem )
433         {
434             SvGlobalName aClassName = pNameItem->GetValue();
435             xObj =  mpViewShell->GetViewFrame()->GetObjectShell()->
436                     GetEmbeddedObjectContainer().CreateEmbeddedObject( aClassName.GetByteSequence(), aName );
437         }
438         else
439         {
440             switch ( nSlotId )
441             {
442                 case SID_INSERT_OBJECT :
443                 {
444                     aServerLst.FillInsertObjects();
445                     if (mpDoc->GetDocumentType() == DOCUMENT_TYPE_DRAW)
446                     {
447                         aServerLst.Remove( GraphicDocShell::Factory().GetClassId() );
448                     }
449                     else
450                     {
451                         aServerLst.Remove( DrawDocShell::Factory().GetClassId() );
452                     }
453 
454                     // intentionally no break!
455                 }
456                 case SID_INSERT_PLUGIN :
457                 case SID_INSERT_FLOATINGFRAME :
458                 {
459                     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
460                     SfxAbstractInsertObjectDialog* pDlg =
461                             pFact->CreateInsertObjectDialog( mpViewShell->GetActiveWindow(), SD_MOD()->GetSlotPool()->GetSlot(nSlotId)->GetCommandString(),
462                             xStorage, &aServerLst );
463                     if ( pDlg )
464                     {
465                         pDlg->Execute();
466                         bCreateNew = pDlg->IsCreateNew();
467                         xObj = pDlg->GetObject();
468 
469 						xIconMetaFile = pDlg->GetIconIfIconified( &aIconMediaType );
470 						if ( xIconMetaFile.is() )
471 							nAspect = embed::Aspects::MSOLE_ICON;
472 
473                         if ( xObj.is() )
474                             mpViewShell->GetObjectShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName );
475                         DELETEZ( pDlg );
476                     }
477 
478                     break;
479                 }
480                 case SID_INSERT_SOUND :
481                 case SID_INSERT_VIDEO :
482                 {
483                     // create special filedialog for plugins
484                     SvxPluginFileDlg aPluginFileDialog (mpWindow, nSlotId);
485                     if( ERRCODE_NONE == aPluginFileDialog.Execute () )
486                     {
487                         // get URL
488                         String aStrURL(aPluginFileDialog.GetPath());
489                         INetURLObject aURL( aStrURL, INET_PROT_FILE );
490                         if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
491                         {
492                             // create a plugin object
493                             xObj = mpViewShell->GetObjectShell()->GetEmbeddedObjectContainer().CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), aName );
494                         }
495 
496                         if ( xObj.is() && svt::EmbeddedObjectRef::TryRunningState( xObj ) )
497                         {
498                             // set properties from dialog
499                             uno::Reference < embed::XComponentSupplier > xSup( xObj, uno::UNO_QUERY );
500                             if ( xSup.is() )
501                             {
502                                 uno::Reference < beans::XPropertySet > xSet( xSup->getComponent(), uno::UNO_QUERY );
503                                 if ( xSet.is() )
504                                 {
505                                     xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginURL"),
506                                             uno::makeAny( ::rtl::OUString( aURL.GetMainURL( INetURLObject::NO_DECODE ) ) ) );
507                                 }
508                             }
509                         }
510                         else
511                         {
512                             // PlugIn konnte nicht erzeugt werden
513                             String aStrErr( SdResId( STR_ERROR_OBJNOCREATE_PLUGIN ) );
514                             String aMask;
515                             aMask += sal_Unicode('%');
516                             aStrErr.SearchAndReplace( aMask, aStrURL );
517                             ErrorBox( mpWindow, WB_3DLOOK | WB_OK, aStrErr ).Execute();
518                         }
519                     }
520                 }
521             }
522         }
523 
524         try
525         {
526             if (xObj.is())
527             {
528                 //TODO/LATER: needs status for RESIZEONPRINTERCHANGE
529                 //if( SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE & xObj->getStatus( nAspect ) )
530                 //    aIPObj->OnDocumentPrinterChanged( mpDocSh->GetPrinter(sal_False) );
531 
532                 sal_Bool bInsertNewObject = sal_True;
533 
534                 Size aSize;
535                 MapUnit aMapUnit = MAP_100TH_MM;
536                 if ( nAspect != embed::Aspects::MSOLE_ICON )
537                 {
538                     awt::Size aSz;
539                     try
540                     {
541                         aSz = xObj->getVisualAreaSize( nAspect );
542                     }
543                     catch( embed::NoVisualAreaSizeException& )
544                     {
545                         // the default size will be set later
546                     }
547 
548                     aSize =Size( aSz.Width, aSz.Height );
549 
550                     aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
551                     if (aSize.Height() == 0 || aSize.Width() == 0)
552                     {
553                         // Rechteck mit ausgewogenem Kantenverhaeltnis
554                         aSize.Width()  = 14100;
555                         aSize.Height() = 10000;
556                         Size aTmp = OutputDevice::LogicToLogic( aSize, MAP_100TH_MM, aMapUnit );
557                         aSz.Width = aTmp.Width();
558                         aSz.Height = aTmp.Height();
559                         xObj->setVisualAreaSize( nAspect, aSz );
560                     }
561                     else
562                     {
563                         aSize = OutputDevice::LogicToLogic(aSize, aMapUnit, MAP_100TH_MM);
564                     }
565                 }
566 
567                 if ( mpView->AreObjectsMarked() )
568                 {
569                     /**********************************************************
570                         * Ist ein leeres OLE-Objekt vorhanden?
571                         **********************************************************/
572                     const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
573 
574                     if (rMarkList.GetMarkCount() == 1)
575                     {
576                         SdrMark* pMark = rMarkList.GetMark(0);
577                         SdrObject* pObj = pMark->GetMarkedSdrObj();
578 
579                         if (pObj->GetObjInventor() == SdrInventor &&
580                         pObj->GetObjIdentifier() == OBJ_OLE2)
581                         {
582                             if ( !( (SdrOle2Obj*) pObj)->GetObjRef().is() )
583                             {
584                                 /**************************************************
585                                     * Das leere OLE-Objekt bekommt ein neues IPObj
586                                     **************************************************/
587                                 bInsertNewObject = sal_False;
588                                 pObj->SetEmptyPresObj(sal_False);
589                                 ( (SdrOle2Obj*) pObj)->SetOutlinerParaObject(NULL);
590                                 ( (SdrOle2Obj*) pObj)->SetObjRef(xObj);
591                                 ( (SdrOle2Obj*) pObj)->SetPersistName(aName);
592                                 ( (SdrOle2Obj*) pObj)->SetName(aName);
593                                 ( (SdrOle2Obj*) pObj)->SetAspect(nAspect);
594                                 Rectangle aRect = ( (SdrOle2Obj*) pObj)->GetLogicRect();
595 
596                                 //HMHmpView->HideMarkHdl();
597 
598                                 if ( nAspect == embed::Aspects::MSOLE_ICON )
599                                 {
600                                     if( xIconMetaFile.is() )
601                                         ( (SdrOle2Obj*) pObj)->SetGraphicToObj( xIconMetaFile, aIconMediaType );
602                                 }
603                                 else
604                                 {
605                                     Size aTmp = OutputDevice::LogicToLogic( aRect.GetSize(), MAP_100TH_MM, aMapUnit );
606                                     awt::Size aSz( aTmp.Width(), aTmp.Height() );
607                                     xObj->setVisualAreaSize( nAspect, aSz );
608                                 }
609                             }
610                         }
611                     }
612                 }
613 
614                 if (bInsertNewObject)
615                 {
616                     /**************************************************************
617                         * Ein neues OLE-Objekt wird erzeugt
618                         **************************************************************/
619                     SdrPageView* pPV = mpView->GetSdrPageView();
620                     Size aPageSize = pPV->GetPage()->GetSize();
621 
622                     // get the size from the iconified object
623                     ::svt::EmbeddedObjectRef aObjRef( xObj, nAspect );
624                     if ( nAspect == embed::Aspects::MSOLE_ICON )
625                     {
626                         aObjRef.SetGraphicStream( xIconMetaFile, aIconMediaType );
627                         MapMode aMapMode( MAP_100TH_MM );
628                         aSize = aObjRef.GetSize( &aMapMode );
629                     }
630 
631                     Point aPnt ((aPageSize.Width()  - aSize.Width())  / 2,
632                         (aPageSize.Height() - aSize.Height()) / 2);
633                     Rectangle aRect (aPnt, aSize);
634 
635                     SdrOle2Obj* pObj = new SdrOle2Obj( aObjRef, aName, aRect);
636 
637                     if( mpView->InsertObjectAtView(pObj, *pPV, SDRINSERT_SETDEFLAYER) )
638                     {
639                         //  #73279# Math objects change their object size during InsertObject.
640                         //  New size must be set in SdrObject, or a wrong scale will be set at
641                         //  ActivateObject.
642 
643                         if ( nAspect != embed::Aspects::MSOLE_ICON )
644                         {
645                             try
646                             {
647                                 awt::Size aSz = xObj->getVisualAreaSize( nAspect );
648 
649                                 Size aNewSize = Window::LogicToLogic( Size( aSz.Width, aSz.Height ),
650                                     MapMode( aMapUnit ), MapMode( MAP_100TH_MM ) );
651                                 if ( aNewSize != aSize )
652                                 {
653                                     aRect.SetSize( aNewSize );
654                                     pObj->SetLogicRect( aRect );
655                                 }
656                             }
657                             catch( embed::NoVisualAreaSizeException& )
658                             {}
659                         }
660 
661                         if (bCreateNew)
662                         {
663                             //HMHmpView->HideMarkHdl();
664                             pObj->SetLogicRect(aRect);
665 
666                             if ( nAspect != embed::Aspects::MSOLE_ICON )
667                             {
668                                 Size aTmp = OutputDevice::LogicToLogic( aRect.GetSize(), MAP_100TH_MM, aMapUnit );
669                                 awt::Size aSz( aTmp.Width(), aTmp.Height() );
670                                 xObj->setVisualAreaSize( nAspect, aSz );
671                             }
672 
673                             mpViewShell->ActivateObject(pObj, SVVERB_SHOW);
674                         }
675 
676                         Size aVisSizePixel = mpWindow->GetOutputSizePixel();
677                         Rectangle aVisAreaWin = mpWindow->PixelToLogic( Rectangle( Point(0,0), aVisSizePixel) );
678                         mpViewShell->VisAreaChanged(aVisAreaWin);
679                         mpDocSh->SetVisArea(aVisAreaWin);
680                     }
681                 }
682             }
683         }
684         catch (uno::Exception&)
685         {
686             // For some reason the object can not be inserted.  For example
687             // because it is password protected and is not properly unlocked.
688         }
689     }
690 }
691 
692 
693 /*************************************************************************
694 |*
695 |* FuInsertAVMedia::Konstruktor
696 |*
697 \************************************************************************/
698 
699 FuInsertAVMedia::FuInsertAVMedia(
700     ViewShell* pViewSh,
701     ::sd::Window* pWin,
702     ::sd::View* pView,
703     SdDrawDocument* pDoc,
704     SfxRequest& rReq)
705     : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
706 {
707 }
708 
709 FunctionReference FuInsertAVMedia::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
710 {
711 	FunctionReference xFunc( new FuInsertAVMedia( pViewSh, pWin, pView, pDoc, rReq ) );
712 	xFunc->DoExecute(rReq);
713 	return xFunc;
714 }
715 
716 void FuInsertAVMedia::DoExecute( SfxRequest& rReq )
717 {
718 	::rtl::OUString 	aURL;
719 	const SfxItemSet*	pReqArgs = rReq.GetArgs();
720 	bool				bAPI = false;
721 
722 	if( pReqArgs )
723 	{
724 		const SfxStringItem* pStringItem = PTR_CAST( SfxStringItem, &pReqArgs->Get( rReq.GetSlot() ) );
725 
726 		if( pStringItem )
727 		{
728 			aURL = pStringItem->GetValue();
729 			bAPI = aURL.getLength();
730 		}
731 	}
732 
733 	if( bAPI || ::avmedia::MediaWindow::executeMediaURLDialog( mpWindow, aURL ) )
734 	{
735 		Size aPrefSize;
736 
737 		if( mpWindow )
738 			mpWindow->EnterWait();
739 
740 		if( !::avmedia::MediaWindow::isMediaURL( aURL, true, &aPrefSize ) )
741 		{
742 			if( mpWindow )
743 				mpWindow->LeaveWait();
744 
745 			if( !bAPI )
746 				::avmedia::MediaWindow::executeFormatErrorBox( mpWindow );
747 		}
748 		else
749 		{
750 			Point	    aPos;
751 			Size	    aSize;
752 			sal_Int8    nAction = DND_ACTION_COPY;
753 
754 			if( aPrefSize.Width() && aPrefSize.Height() )
755 			{
756 				if( mpWindow )
757 					aSize = mpWindow->PixelToLogic( aPrefSize, MAP_100TH_MM );
758 				else
759 					aSize = Application::GetDefaultDevice()->PixelToLogic( aPrefSize, MAP_100TH_MM );
760 			}
761 			else
762 				aSize = Size( 5000, 5000 );
763 
764 			if( mpWindow )
765 			{
766 				aPos = mpWindow->PixelToLogic( Rectangle( aPos, mpWindow->GetOutputSizePixel() ).Center() );
767 				aPos.X() -= aSize.Width() >> 1;
768 				aPos.Y() -= aSize.Height() >> 1;
769 			}
770 
771 		    mpView->InsertMediaURL( aURL, nAction, aPos, aSize ) ;
772 
773 			if( mpWindow )
774 				mpWindow->LeaveWait();
775 		}
776 	}
777 }
778 
779 } // end of namespace sd
780