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