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