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