833 lines
30 KiB
C++
833 lines
30 KiB
C++
/*************************************************************************
|
|
*
|
|
* $RCSfile: fuinsert.cxx,v $
|
|
*
|
|
* $Revision: 1.6 $
|
|
*
|
|
* last change: $Author: jp $ $Date: 2001-03-08 20:58:40 $
|
|
*
|
|
* The Contents of this file are made available subject to the terms of
|
|
* either of the following licenses
|
|
*
|
|
* - GNU Lesser General Public License Version 2.1
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
*
|
|
* Sun Microsystems Inc., October, 2000
|
|
*
|
|
* GNU Lesser General Public License Version 2.1
|
|
* =============================================
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*
|
|
*
|
|
* Sun Industry Standards Source License Version 1.1
|
|
* =================================================
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
* Source License Version 1.1 (the "License"); You may not use this file
|
|
* except in compliance with the License. You may obtain a copy of the
|
|
* License at http://www.openoffice.org/license.html.
|
|
*
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
* See the License for the specific provisions governing your rights and
|
|
* obligations concerning the Software.
|
|
*
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
*
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
*
|
|
* All Rights Reserved.
|
|
*
|
|
* Contributor(s): _______________________________________
|
|
*
|
|
*
|
|
************************************************************************/
|
|
|
|
#include <tools/urlobj.hxx>
|
|
|
|
#ifndef SVTOOLS_URIHELPER_HXX
|
|
#include <svtools/urihelper.hxx>
|
|
#endif
|
|
|
|
#include <so3/plugin.hxx>
|
|
#include <svx/pfiledlg.hxx>
|
|
#include <svx/impgrf.hxx>
|
|
#include <svx/dialogs.hrc>
|
|
#include <svx/linkmgr.hxx>
|
|
#include <svx/svdetc.hxx>
|
|
#ifndef _UNOTOOLS_UCBSTREAMHELPER_HXX
|
|
#include <unotools/ucbstreamhelper.hxx>
|
|
#endif
|
|
#ifndef _SV_CLIP_HXX //autogen
|
|
#include <vcl/clip.hxx>
|
|
#endif
|
|
#ifndef _SO_CLSIDS_HXX
|
|
#include <so3/clsids.hxx>
|
|
#endif
|
|
#ifndef _PASTEDLG_HXX //autogen
|
|
#include <so3/pastedlg.hxx>
|
|
#endif
|
|
#ifndef _SFXECODE_HXX //autogen
|
|
#include <svtools/sfxecode.hxx>
|
|
#endif
|
|
#ifndef _INSDLG_HXX //autogen
|
|
#include <so3/insdlg.hxx>
|
|
#endif
|
|
#ifndef _SVDOBJ_HXX //autogen
|
|
#include <svx/svdobj.hxx>
|
|
#endif
|
|
#ifndef _SVDOGRAF_HXX //autogen
|
|
#include <svx/svdograf.hxx>
|
|
#endif
|
|
#ifndef _SVDOOLE2_HXX //autogen
|
|
#include <svx/svdoole2.hxx>
|
|
#endif
|
|
#ifndef _EDITENG_HXX //autogen
|
|
#include <svx/editeng.hxx>
|
|
#endif
|
|
#ifndef _SVSTOR_HXX //autogen
|
|
#include <so3/svstor.hxx>
|
|
#endif
|
|
#ifndef _SOT_FORMATS_HXX //autogen
|
|
#include <sot/formats.hxx>
|
|
#endif
|
|
#ifndef _SVDPAGV_HXX //autogen
|
|
#include <svx/svdpagv.hxx>
|
|
#endif
|
|
#ifndef _SCH_DLL_HXX //autogen
|
|
#include <sch/schdll.hxx>
|
|
#endif
|
|
#ifndef _FRAMEOBJ_HXX //autogen
|
|
#include <sfx2/frameobj.hxx>
|
|
#endif
|
|
#ifndef _MSGBOX_HXX //autogen
|
|
#include <vcl/msgbox.hxx>
|
|
#endif
|
|
|
|
#include "app.hrc"
|
|
#include "misc.hxx"
|
|
#include "sdresid.hxx"
|
|
#include "sdview.hxx"
|
|
#include "app.hxx"
|
|
#include "sdwindow.hxx"
|
|
#include "drawview.hxx"
|
|
#include "drviewsh.hxx"
|
|
#include "fuinsert.hxx"
|
|
#include "docshell.hxx"
|
|
#include "grdocsh.hxx"
|
|
#include "strings.hrc"
|
|
#include "graphpro.hxx"
|
|
#include "drawdoc.hxx"
|
|
#include "sdgrffilter.hxx"
|
|
#include "sdxfer.hxx"
|
|
|
|
#ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED
|
|
#define SO2_DECL_SVINPLACEOBJECT_DEFINED
|
|
SO2_DECL_REF(SvInPlaceObject)
|
|
#endif
|
|
#ifndef SO2_DECL_SVSTORAGE_DEFINED
|
|
#define SO2_DECL_SVSTORAGE_DEFINED
|
|
SO2_DECL_REF(SvStorage)
|
|
#endif
|
|
|
|
TYPEINIT1( FuInsertGraphic, FuPoor );
|
|
TYPEINIT1( FuInsertClipboard, FuPoor );
|
|
TYPEINIT1( FuInsertOLE, FuPoor );
|
|
TYPEINIT1( FuInsertTwain, FuPoor );
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* FuInsertGraphic::Konstruktor
|
|
|*
|
|
\************************************************************************/
|
|
|
|
#ifdef WNT
|
|
#pragma optimize ( "", off )
|
|
#endif
|
|
|
|
FuInsertGraphic::FuInsertGraphic(SdViewShell* pViewSh, SdWindow* pWin, SdView* pView,
|
|
SdDrawDocument* pDoc, SfxRequest& rReq)
|
|
: FuPoor(pViewSh, pWin, pView, pDoc, rReq)
|
|
{
|
|
SvxImportGraphicDialog* pDlg = new SvxImportGraphicDialog( NULL,
|
|
String( SdResId(STR_INSERTGRAPHIC) ),
|
|
ENABLE_STD_AND_LINK );
|
|
|
|
USHORT nResult = pDlg->Execute();
|
|
|
|
switch (nResult)
|
|
{
|
|
case RET_OK:
|
|
{
|
|
USHORT nError = 0;
|
|
Graphic aGraphic;
|
|
Graphic* pGraphic = pDlg->GetGraphic();
|
|
String aPath( pDlg->GetPath() );
|
|
|
|
if( pGraphic )
|
|
{
|
|
aGraphic = *pGraphic;
|
|
}
|
|
else
|
|
{
|
|
GraphicFilter& rFilter = pDlg->GetFilter();
|
|
FilterProgress aFilterProgress( &rFilter, pViewSh->GetDocSh() );
|
|
SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aPath, STREAM_READ | STREAM_SHARE_DENYNONE );
|
|
|
|
if( pIStm )
|
|
{
|
|
nError = rFilter.ImportGraphic( aGraphic, aPath, *pIStm );
|
|
delete pIStm;
|
|
}
|
|
}
|
|
|
|
if ( nError == 0 && pViewSh->ISA(SdDrawViewShell) )
|
|
{
|
|
sal_Int8 nAction = DND_ACTION_COPY;
|
|
SdrGrafObj* pEmptyGrafObj = NULL;
|
|
|
|
if ( pView->HasMarkedObj() )
|
|
{
|
|
/**********************************************************
|
|
* Ist ein leeres Graphik-Objekt vorhanden?
|
|
**********************************************************/
|
|
const SdrMarkList& rMarkList = pView->GetMarkList();
|
|
|
|
if (rMarkList.GetMarkCount() == 1)
|
|
{
|
|
SdrMark* pMark = rMarkList.GetMark(0);
|
|
SdrObject* pObj = pMark->GetObj();
|
|
|
|
if (pObj->GetObjInventor() == SdrInventor &&
|
|
pObj->GetObjIdentifier() == OBJ_GRAF)
|
|
{
|
|
nAction = DND_ACTION_LINK;
|
|
pEmptyGrafObj = (SdrGrafObj*) pObj;
|
|
}
|
|
}
|
|
}
|
|
|
|
Point aPos;
|
|
Rectangle aRect(aPos, pWindow->GetOutputSizePixel() );
|
|
aPos = aRect.Center();
|
|
aPos = pWindow->PixelToLogic(aPos);
|
|
SdrGrafObj* pGrafObj = pView->InsertGraphic(aGraphic, nAction, aPos, pEmptyGrafObj, NULL);
|
|
|
|
if (pGrafObj && pDlg->AsLink())
|
|
{
|
|
// Soll nur ein Link benutzt werden?
|
|
String aFltName = pDlg->GetCurFilter();
|
|
pGrafObj->SetGraphicLink(aPath, aFltName);
|
|
}
|
|
}
|
|
else if ( nError )
|
|
SdGRFFilter::HandleGraphicFilterError( nError, GetGrfFilter()->GetLastError().nStreamError );
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
delete pDlg;
|
|
}
|
|
|
|
#ifdef WNT
|
|
#pragma optimize ( "", on )
|
|
#endif
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* FuInsertGraphic::Destruktor
|
|
|*
|
|
\************************************************************************/
|
|
|
|
FuInsertGraphic::~FuInsertGraphic()
|
|
{
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* FuInsertClipboard::Konstruktor
|
|
|*
|
|
\************************************************************************/
|
|
|
|
FuInsertClipboard::FuInsertClipboard(SdViewShell* pViewSh, SdWindow* pWin, SdView* pView,
|
|
SdDrawDocument* pDoc, SfxRequest& rReq)
|
|
: FuPoor(pViewSh, pWin, pView, pDoc, rReq)
|
|
{
|
|
// !!!Clipboard: SvPasteObjectDialog() has to be redesigned
|
|
SvDataObjectRef aDataObj( SvDataObject::PasteClipboard() );
|
|
const String aEmptyStr;
|
|
SvPasteObjectDialog* pDlg = new SvPasteObjectDialog();
|
|
|
|
pDlg->Insert(SOT_FORMATSTR_ID_EMBED_SOURCE, aEmptyStr );
|
|
pDlg->Insert(SOT_FORMATSTR_ID_LINK_SOURCE, aEmptyStr );
|
|
pDlg->Insert( SOT_FORMATSTR_ID_DRAWING, Clipboard::GetFormatName(SOT_FORMATSTR_ID_DRAWING));
|
|
pDlg->Insert( SOT_FORMATSTR_ID_SVXB, Clipboard::GetFormatName(SOT_FORMATSTR_ID_SVXB));
|
|
pDlg->Insert( FORMAT_GDIMETAFILE, Clipboard::GetFormatName(FORMAT_GDIMETAFILE) );
|
|
pDlg->Insert( FORMAT_BITMAP, Clipboard::GetFormatName(FORMAT_BITMAP) );
|
|
pDlg->Insert( FORMAT_STRING, String( SdResId(STR_FORMAT_STRING) ) );
|
|
pDlg->Insert( SOT_FORMATSTR_ID_HTML, Clipboard::GetFormatName(SOT_FORMATSTR_ID_HTML) );
|
|
pDlg->Insert( FORMAT_RTF, String( SdResId(STR_FORMAT_RTF) ) );
|
|
pDlg->Insert( EditEngine::RegisterClipboardFormatName(), String() );
|
|
|
|
const ULONG nFormatId = pDlg->Execute(pWindow, aDataObj);
|
|
|
|
if( nFormatId )
|
|
{
|
|
TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard() );
|
|
|
|
if( aDataHelper.GetTransferable().is() )
|
|
{
|
|
sal_Int8 nAction = DND_ACTION_COPY;
|
|
|
|
pView->InsertData( aDataHelper.GetTransferable(),
|
|
pWindow->PixelToLogic( Rectangle( Point(), pWindow->GetOutputSizePixel() ).Center() ),
|
|
nAction, FALSE, nFormatId );
|
|
}
|
|
}
|
|
|
|
delete pDlg;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* FuInsertClipboard::Destruktor
|
|
|*
|
|
\************************************************************************/
|
|
|
|
FuInsertClipboard::~FuInsertClipboard()
|
|
{
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* FuInsertOLE::Konstruktor
|
|
|*
|
|
\************************************************************************/
|
|
|
|
FuInsertOLE::FuInsertOLE(SdViewShell* pViewSh, SdWindow* pWin, SdView* pView,
|
|
SdDrawDocument* pDoc, SfxRequest& rReq)
|
|
: FuPoor(pViewSh, pWin, pView, pDoc, rReq)
|
|
{
|
|
String aEmptyStr;
|
|
|
|
#ifdef STARIMAGE_AVAILABLE
|
|
if (nSlotId == SID_INSERT_IMAGE &&
|
|
(pView->HasMarkedObj() || pView->IsTextEdit()))
|
|
{
|
|
/**********************************************************************
|
|
* Ist ein Graphik-Objekt selektiert?
|
|
**********************************************************************/
|
|
if (pView->IsTextEdit())
|
|
{
|
|
pView->EndTextEdit();
|
|
}
|
|
|
|
const SdrMarkList& rMarkList = pView->GetMarkList();
|
|
|
|
if (rMarkList.GetMarkCount() == 1)
|
|
{
|
|
SdrMark* pMark = rMarkList.GetMark(0);
|
|
SdrObject* pObj = pMark->GetObj();
|
|
|
|
if( pObj->GetObjInventor() == SdrInventor &&
|
|
pObj->GetObjIdentifier() == OBJ_GRAF &&
|
|
((SdrGrafObj*) pObj)->GetGraphicType() == GRAPHIC_BITMAP )
|
|
{
|
|
// Graphik-Objekt wird bearbeitet
|
|
pViewSh->DoVerb(0);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if ( nSlotId == SID_ATTR_TABLE ||
|
|
nSlotId == SID_INSERT_DIAGRAM ||
|
|
#ifdef STARIMAGE_AVAILABLE
|
|
nSlotId == SID_INSERT_IMAGE ||
|
|
#endif
|
|
nSlotId == SID_INSERT_MATH )
|
|
{
|
|
/**********************************************************************
|
|
* Diagramm oder StarCalc-Tabelle einfuegen
|
|
**********************************************************************/
|
|
SvInPlaceObjectRef aIPObj;
|
|
SvStorageRef aStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
|
|
|
|
#ifndef SO3
|
|
if (nSlotId == SID_INSERT_DIAGRAM)
|
|
{
|
|
aIPObj = &SvInPlaceObject::ClassFactory()->CreateAndInit(
|
|
SvGlobalName(SO3_SCH_CLASSID_50), aStor);
|
|
}
|
|
else if (nSlotId == SID_ATTR_TABLE)
|
|
{
|
|
aIPObj = &SvInPlaceObject::ClassFactory()->CreateAndInit(
|
|
SvGlobalName(SO3_SC_CLASSID_50), aStor);
|
|
}
|
|
#ifdef STARIMAGE_AVAILABLE
|
|
else if (nSlotId == SID_INSERT_IMAGE)
|
|
{
|
|
aIPObj = &SvInPlaceObject::ClassFactory()->CreateAndInit(
|
|
SvGlobalName(SO3_SIM_CLASSID_50), aStor);
|
|
}
|
|
#endif
|
|
else if (nSlotId == SID_INSERT_MATH)
|
|
{
|
|
aIPObj = &SvInPlaceObject::ClassFactory()->CreateAndInit(
|
|
SvGlobalName(SO3_SM_CLASSID_50), aStor);
|
|
}
|
|
#else
|
|
if (nSlotId == SID_INSERT_DIAGRAM)
|
|
{
|
|
aIPObj = &((SvFactory*)SvInPlaceObject::ClassFactory())->CreateAndInit(
|
|
SvGlobalName(SO3_SCH_CLASSID_50), aStor);
|
|
}
|
|
else if (nSlotId == SID_ATTR_TABLE)
|
|
{
|
|
aIPObj = &((SvFactory*)SvInPlaceObject::ClassFactory())->CreateAndInit(
|
|
SvGlobalName(SO3_SC_CLASSID_50), aStor);
|
|
}
|
|
#ifdef STARIMAGE_AVAILABLE
|
|
else if (nSlotId == SID_INSERT_IMAGE)
|
|
{
|
|
aIPObj = &((SvFactory*)SvInPlaceObject::ClassFactory())->CreateAndInit(
|
|
SvGlobalName(SO3_SIM_CLASSID_50), aStor);
|
|
}
|
|
#endif
|
|
else if (nSlotId == SID_INSERT_MATH)
|
|
{
|
|
aIPObj = &((SvFactory*)SvInPlaceObject::ClassFactory())->CreateAndInit(
|
|
SvGlobalName(SO3_SM_CLASSID_50), aStor);
|
|
}
|
|
#endif
|
|
|
|
if ( aIPObj.Is() )
|
|
{
|
|
String aName = pViewShell->GetViewFrame()->GetObjectShell()->
|
|
InsertObject( aIPObj, aEmptyStr )->GetObjName();
|
|
|
|
Size aSize = aIPObj->GetVisArea().GetSize();
|
|
|
|
if (aSize.Height() == 0 || aSize.Width() == 0)
|
|
{
|
|
// Rechteck mit ausgewogenem Kantenverhaeltnis
|
|
aSize.Width() = 14100;
|
|
aSize.Height() = 10000;
|
|
aIPObj->SetVisAreaSize( OutputDevice::LogicToLogic(
|
|
aSize, MAP_100TH_MM, aIPObj->GetMapUnit() ) );
|
|
}
|
|
else
|
|
{
|
|
aSize = OutputDevice::LogicToLogic(aSize, aIPObj->GetMapUnit(),
|
|
MAP_100TH_MM);
|
|
}
|
|
|
|
Point aPos;
|
|
Rectangle aWinRect(aPos, pWin->GetOutputSizePixel() );
|
|
aPos = aWinRect.Center();
|
|
aPos = pWindow->PixelToLogic(aPos);
|
|
aPos.X() -= aSize.Width() / 2;
|
|
aPos.Y() -= aSize.Height() / 2;
|
|
Rectangle aRect (aPos, aSize);
|
|
SdrOle2Obj* pOleObj = new SdrOle2Obj(aIPObj, aName, aRect);
|
|
SdrPageView* pPV = pView->GetPageViewPvNum(0);
|
|
if( pView->InsertObject(pOleObj, *pPV, SDRINSERT_SETDEFLAYER) )
|
|
{
|
|
if (nSlotId == SID_INSERT_DIAGRAM)
|
|
{
|
|
pOleObj->SetProgName( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarChart" ) ) );
|
|
SchDLL::SetTransparentBackground( aIPObj, TRUE );
|
|
}
|
|
else if (nSlotId == SID_ATTR_TABLE)
|
|
{
|
|
pOleObj->SetProgName( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarCalc" ) ) );
|
|
}
|
|
#ifdef STARIMAGE_AVAILABLE
|
|
else if (nSlotId == SID_INSERT_IMAGE)
|
|
{
|
|
pOleObj->SetProgName( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarImage" ) ) );
|
|
}
|
|
#endif
|
|
else if (nSlotId == SID_INSERT_MATH)
|
|
{
|
|
pOleObj->SetProgName( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarMath" ) ) );
|
|
}
|
|
|
|
pView->HideMarkHdl(NULL);
|
|
pOleObj->SetLogicRect(aRect);
|
|
aIPObj->SetVisAreaSize( aRect.GetSize() );
|
|
pViewShell->ActivateObject(pOleObj, SVVERB_SHOW);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ErrorHandler::HandleError(* new StringErrorInfo(ERRCODE_SFX_OLEGENERAL,
|
|
aEmptyStr ) );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/**********************************************************************
|
|
* Objekt einfuegen
|
|
**********************************************************************/
|
|
SvInPlaceObjectRef aIPObj;
|
|
SvInsertOleObjectDialog* pOleDlg = NULL;
|
|
SvInsertPlugInDialog* pPlugInDlg = NULL;
|
|
SvInsertAppletDialog* pAppletDlg = NULL;
|
|
SfxInsertFloatingFrameDialog* pFrameDlg = NULL;
|
|
|
|
if (nSlotId == SID_INSERT_OBJECT)
|
|
{
|
|
pOleDlg = new SvInsertOleObjectDialog();
|
|
pOleDlg->SetHelpId(SID_INSERT_OBJECT);
|
|
|
|
// Die Liste ist eine Memberliste, und loescht selbst ihre Eintraege
|
|
SvObjectServerList aServerLst;
|
|
|
|
// Liste mit Servern fuellen
|
|
pOleDlg->FillObjectServerList(&aServerLst);
|
|
|
|
// Eigenen Eintrag loeschen
|
|
if (pDoc->GetDocumentType() == DOCUMENT_TYPE_DRAW)
|
|
{
|
|
aServerLst.Remove( *SdGraphicDocShell::ClassFactory() );
|
|
}
|
|
else
|
|
{
|
|
aServerLst.Remove( *SdDrawDocShell::ClassFactory() );
|
|
}
|
|
|
|
SvStorageRef aStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
|
|
aIPObj = pOleDlg->Execute(pWin, aStor, &aServerLst );
|
|
}
|
|
else if (nSlotId == SID_INSERT_PLUGIN)
|
|
{
|
|
pPlugInDlg = new SvInsertPlugInDialog();
|
|
pPlugInDlg->SetHelpId(SID_INSERT_PLUGIN);
|
|
|
|
SvStorageRef aStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
|
|
aIPObj = pPlugInDlg->Execute(pWin, aStor);
|
|
}
|
|
else if (nSlotId == SID_INSERT_SOUND || nSlotId == SID_INSERT_VIDEO)
|
|
{ // load sound- or video- plugin
|
|
|
|
// create special filedialog for plugins
|
|
SvxPluginFileDlg aPluginFileDialog (pWin, nSlotId);
|
|
|
|
// open filedlg
|
|
if (RET_OK == aPluginFileDialog.Execute ())
|
|
{
|
|
// get URL
|
|
String aStrURL(aPluginFileDialog.GetPath());
|
|
aStrURL = ::URIHelper::SmartRelToAbs( aStrURL, FALSE,
|
|
INetURLObject::WAS_ENCODED,
|
|
INetURLObject::DECODE_UNAMBIGUOUS );
|
|
|
|
INetURLObject aURL( aStrURL );
|
|
|
|
if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
|
|
{
|
|
// create plugin, initialize, etc.
|
|
SvFactory * pPlugIn = SvFactory::GetDefaultPlugInFactory();
|
|
SvStorageRef aStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
|
|
SvPlugInObjectRef xObj = &pPlugIn->CreateAndInit( *pPlugIn, aStor );
|
|
xObj->SetPlugInMode( (USHORT)PLUGIN_EMBEDED );
|
|
xObj->SetURL( aURL );
|
|
aIPObj = (SvInPlaceObject*)&xObj;
|
|
}
|
|
else
|
|
{
|
|
// PlugIn konnte nicht erzeugt werden
|
|
String aStrErr( ResId( STR_ERROR_OBJNOCREATE_PLUGIN , SOAPP->GetResMgr() ) );
|
|
String aMask;
|
|
aMask += sal_Unicode('%');
|
|
aStrErr.SearchAndReplace( aMask, aStrURL );
|
|
ErrorBox( pWin, WB_3DLOOK | WB_OK, aStrErr ).Execute();
|
|
}
|
|
}
|
|
}
|
|
else if (nSlotId == SID_INSERT_APPLET)
|
|
{
|
|
pAppletDlg = new SvInsertAppletDialog();
|
|
pAppletDlg->SetHelpId(SID_INSERT_APPLET);
|
|
|
|
SvStorageRef aStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
|
|
aIPObj = pAppletDlg->Execute(pWin, aStor);
|
|
}
|
|
else if (nSlotId == SID_INSERT_FLOATINGFRAME)
|
|
{
|
|
pFrameDlg = new SfxInsertFloatingFrameDialog( pWin );
|
|
// pFrameDlg->SetHelpId(SID_INSERT_FLOATINGFRAME);
|
|
|
|
SvStorageRef aStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
|
|
aIPObj = pFrameDlg->Execute(aStor);
|
|
}
|
|
|
|
if (aIPObj.Is())
|
|
{
|
|
BOOL bInsertNewObject = FALSE;
|
|
Size aSize;
|
|
String aName;
|
|
|
|
SvEmbeddedInfoObject* pInfoObj = pViewShell->GetViewFrame()
|
|
->GetObjectShell()->InsertObject( aIPObj, aEmptyStr );
|
|
|
|
if (pInfoObj)
|
|
{
|
|
bInsertNewObject = TRUE;
|
|
aName = pInfoObj->GetObjName();
|
|
|
|
aSize = aIPObj->GetVisArea().GetSize();
|
|
|
|
if (aSize.Height() == 0 || aSize.Width() == 0)
|
|
{
|
|
// Rechteck mit ausgewogenem Kantenverhaeltnis
|
|
aSize.Width() = 14100;
|
|
aSize.Height() = 10000;
|
|
aIPObj->SetVisAreaSize( OutputDevice::LogicToLogic(
|
|
aSize, MAP_100TH_MM, aIPObj->GetMapUnit() ) );
|
|
}
|
|
else
|
|
{
|
|
aSize = OutputDevice::LogicToLogic(aSize, aIPObj->GetMapUnit(),
|
|
MAP_100TH_MM);
|
|
}
|
|
|
|
if ( pView->HasMarkedObj() )
|
|
{
|
|
/**********************************************************
|
|
* Ist ein leeres OLE-Objekt vorhanden?
|
|
**********************************************************/
|
|
const SdrMarkList& rMarkList = pView->GetMarkList();
|
|
|
|
if (rMarkList.GetMarkCount() == 1)
|
|
{
|
|
SdrMark* pMark = rMarkList.GetMark(0);
|
|
SdrObject* pObj = pMark->GetObj();
|
|
|
|
if (pObj->GetObjInventor() == SdrInventor &&
|
|
pObj->GetObjIdentifier() == OBJ_OLE2)
|
|
{
|
|
SvInPlaceObjectRef aOldIPObj = ( (SdrOle2Obj*) pObj)->GetObjRef();
|
|
|
|
if ( !aOldIPObj.Is() )
|
|
{
|
|
/**************************************************
|
|
* Das leere OLE-Objekt bekommt ein neues IPObj
|
|
**************************************************/
|
|
bInsertNewObject = FALSE;
|
|
pObj->SetEmptyPresObj(FALSE);
|
|
( (SdrOle2Obj*) pObj)->SetOutlinerParaObject(NULL);
|
|
( (SdrOle2Obj*) pObj)->SetObjRef(aIPObj);
|
|
( (SdrOle2Obj*) pObj)->SetName(aName);
|
|
Rectangle aRect = ( (SdrOle2Obj*) pObj)->GetLogicRect();
|
|
|
|
pView->HideMarkHdl(NULL);
|
|
aIPObj->SetVisAreaSize( aRect.GetSize() );
|
|
|
|
if ( nSlotId == SID_ATTR_TABLE ||
|
|
nSlotId == SID_INSERT_DIAGRAM ||
|
|
#ifdef STARIMAGE_AVAILABLE
|
|
nSlotId == SID_INSERT_IMAGE ||
|
|
#endif
|
|
nSlotId == SID_INSERT_MATH )
|
|
{
|
|
if (nSlotId == SID_INSERT_DIAGRAM)
|
|
SchDLL::SetTransparentBackground( aIPObj, TRUE );
|
|
|
|
pViewShell->ActivateObject( (SdrOle2Obj*) pObj, SVVERB_SHOW);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bInsertNewObject)
|
|
{
|
|
/**************************************************************
|
|
* Ein neues OLE-Objekt wird erzeugt
|
|
**************************************************************/
|
|
SdrPageView* pPV = pView->GetPageViewPvNum(0);
|
|
Size aPageSize = pPV->GetPage()->GetSize();
|
|
Point aPnt ((aPageSize.Width() - aSize.Width()) / 2,
|
|
(aPageSize.Height() - aSize.Height()) / 2);
|
|
Rectangle aRect (aPnt, aSize);
|
|
|
|
SdrOle2Obj* pObj = new SdrOle2Obj(aIPObj, aName, aRect);
|
|
|
|
if( pView->InsertObject(pObj, *pPV, SDRINSERT_SETDEFLAYER) )
|
|
{
|
|
if (pOleDlg && pOleDlg->IsCreateNew())
|
|
{
|
|
pView->HideMarkHdl(NULL);
|
|
pViewShell->ActivateObject(pObj, SVVERB_SHOW);
|
|
}
|
|
|
|
Size aVisSizePixel = pWin->GetOutputSizePixel();
|
|
Rectangle aVisAreaWin = pWin->PixelToLogic( Rectangle( Point(0,0), aVisSizePixel) );
|
|
pViewShell->VisAreaChanged(aVisAreaWin);
|
|
pDocSh->SetVisArea(aVisAreaWin);
|
|
}
|
|
}
|
|
}
|
|
|
|
delete pOleDlg;
|
|
delete pPlugInDlg;
|
|
delete pAppletDlg;
|
|
delete pFrameDlg;
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* FuInsertOLE::Destruktor
|
|
|*
|
|
\************************************************************************/
|
|
|
|
FuInsertOLE::~FuInsertOLE()
|
|
{
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* FuInsertTwain::Ctor
|
|
|*
|
|
\************************************************************************/
|
|
|
|
FuInsertTwain::FuInsertTwain(SdViewShell* pViewSh, SdWindow* pWin, SdView* pView,
|
|
SdDrawDocument* pDoc, SfxRequest& rReq,
|
|
const Bitmap& rBmp )
|
|
: FuPoor(pViewSh, pWin, pView, pDoc, rReq)
|
|
{
|
|
|
|
if ( pViewSh->ISA(SdDrawViewShell) )
|
|
{
|
|
Size aSize;
|
|
Size aBmpSize( rBmp.GetPrefSize() );
|
|
|
|
if ( !aBmpSize.Width() || !aBmpSize.Height() )
|
|
aBmpSize = rBmp.GetSizePixel();
|
|
|
|
if ( rBmp.GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
|
|
{
|
|
const MapMode& rWinMap = pWin->GetMapMode();
|
|
const Fraction& rWinScaleX = rWinMap.GetScaleX();
|
|
const Fraction& rWinScaleY = rWinMap.GetScaleY();
|
|
|
|
aSize = pWin->PixelToLogic( aBmpSize );
|
|
aSize.Width() = ( aSize.Width() * rWinScaleX.GetNumerator() /
|
|
rWinScaleX.GetDenominator() );
|
|
aSize.Height() = ( aSize.Height() * rWinScaleY.GetNumerator() /
|
|
rWinScaleY.GetDenominator() );
|
|
}
|
|
else
|
|
aSize = OutputDevice::LogicToLogic( aBmpSize, rBmp.GetPrefMapMode(),
|
|
MapMode( MAP_100TH_MM ) );
|
|
|
|
// Groesse ggf. auf Seitengroesse begrenzen
|
|
SdrPage* pPage = pView->GetPageViewPvNum(0)->GetPage();
|
|
Size aPageSize = pPage->GetSize();
|
|
aPageSize.Width() -= pPage->GetLftBorder() + pPage->GetRgtBorder();
|
|
aPageSize.Height() -= pPage->GetUppBorder() + pPage->GetLwrBorder();
|
|
|
|
// Falls Grafik zu gross, wird die Grafik
|
|
// in die Seite eingepasst
|
|
if ((aSize.Height() > aPageSize.Height()) ||
|
|
(aSize.Width() > aPageSize.Width()) &&
|
|
aSize.Height() && aPageSize.Height())
|
|
{
|
|
float fGrfWH = (float)aSize.Width() /
|
|
(float)aSize.Height();
|
|
float fWinWH = (float)aPageSize.Width() /
|
|
(float)aPageSize.Height();
|
|
|
|
// Grafik an Pagesize anpassen (skaliert)
|
|
if ( fGrfWH < fWinWH )
|
|
{
|
|
aSize.Width() = (long)(aPageSize.Height() * fGrfWH);
|
|
aSize.Height()= aPageSize.Height();
|
|
}
|
|
else if ( fGrfWH > 0.F )
|
|
{
|
|
aSize.Width() = aPageSize.Width();
|
|
aSize.Height()= (long)(aPageSize.Width() / fGrfWH);
|
|
}
|
|
}
|
|
|
|
// Ausgaberechteck fuer Grafik setzen
|
|
Point aPnt ((aPageSize.Width() - aSize.Width()) / 2,
|
|
(aPageSize.Height() - aSize.Height()) / 2);
|
|
aPnt += Point(pPage->GetLftBorder(), pPage->GetUppBorder());
|
|
Rectangle aRect (aPnt, aSize);
|
|
|
|
SdrGrafObj* pGrafObj = NULL;
|
|
|
|
BOOL bInsertNewObject = TRUE;
|
|
|
|
if ( pView->HasMarkedObj() )
|
|
{
|
|
/**********************************************************
|
|
* Ist ein leeres Graphik-Objekt vorhanden?
|
|
**********************************************************/
|
|
const SdrMarkList& rMarkList = pView->GetMarkList();
|
|
|
|
if (rMarkList.GetMarkCount() == 1)
|
|
{
|
|
SdrMark* pMark = rMarkList.GetMark(0);
|
|
SdrObject* pObj = pMark->GetObj();
|
|
|
|
if (pObj->GetObjInventor() == SdrInventor &&
|
|
pObj->GetObjIdentifier() == OBJ_GRAF)
|
|
{
|
|
pGrafObj = (SdrGrafObj*) pObj;
|
|
|
|
if ( pGrafObj->IsEmptyPresObj() )
|
|
{
|
|
/**********************************************
|
|
* Das leere Graphik-Objekt bekommt eine neue
|
|
* Graphik
|
|
**********************************************/
|
|
bInsertNewObject = FALSE;
|
|
pGrafObj->SetEmptyPresObj(FALSE);
|
|
pGrafObj->SetOutlinerParaObject(NULL);
|
|
pGrafObj->SetGraphic( Graphic( rBmp ) );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bInsertNewObject)
|
|
{
|
|
pGrafObj = new SdrGrafObj( Graphic( rBmp ), aRect );
|
|
SdrPageView* pPV = pView->GetPageViewPvNum(0);
|
|
pView->InsertObject(pGrafObj, *pPV, SDRINSERT_SETDEFLAYER);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|