diff options
Diffstat (limited to 'sd/source/ui/func/fuinsfil.cxx')
-rw-r--r-- | sd/source/ui/func/fuinsfil.cxx | 824 |
1 files changed, 824 insertions, 0 deletions
diff --git a/sd/source/ui/func/fuinsfil.cxx b/sd/source/ui/func/fuinsfil.cxx new file mode 100644 index 000000000000..d14a5859d47b --- /dev/null +++ b/sd/source/ui/func/fuinsfil.cxx @@ -0,0 +1,824 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sd.hxx" + +#include "fuinsfil.hxx" +#include <vcl/wrkwin.hxx> +#include <sfx2/progress.hxx> +#include <editeng/outliner.hxx> +#ifndef _EDITENG_HXX +#include <editeng/editeng.hxx> +#endif +#include <svl/stritem.hxx> +#include <sfx2/request.hxx> +#include <sfx2/app.hxx> +#include <vcl/msgbox.hxx> +#include <sfx2/printer.hxx> +#include <svx/svdorect.hxx> +#include <svx/svdundo.hxx> +#include <svx/svdoutl.hxx> +#include <sfx2/filedlghelper.hxx> +#include <sot/formats.hxx> +#include <svl/urihelper.hxx> +#include <editeng/forbiddencharacterstable.hxx> +#include <tools/urlobj.hxx> +#include <sfx2/docfile.hxx> +#include <sfx2/docfilt.hxx> +#include <sfx2/fcontnr.hxx> +#include <svx/svdpagv.hxx> +#include <svx/dialogs.hrc> +#include <com/sun/star/ui/dialogs/XFilterManager.hpp> +#include <com/sun/star/ui/dialogs/XFilePicker.hpp> +#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp> + +#include "sdresid.hxx" +#include "drawdoc.hxx" +#include "Window.hxx" +#include "View.hxx" +#include "strings.hrc" +#include "stlpool.hxx" +#include "glob.hrc" +#include "sdpage.hxx" +#include "strmname.h" +#include "strings.hrc" +#include "DrawViewShell.hxx" +#include "OutlineViewShell.hxx" +#include "DrawDocShell.hxx" +#include "GraphicDocShell.hxx" +#include "app.hrc" +#include "unmovss.hxx" +#include "Outliner.hxx" +#include "sdabstdlg.hxx" + +using ::rtl::OUString; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::ui::dialogs; +using namespace ::com::sun::star; + +namespace sd { + +TYPEINIT1( FuInsertFile, FuPoor ); + +#define POOL_BUFFER_SIZE (USHORT)32768 +#define BASIC_BUFFER_SIZE (USHORT)8192 +#define DOCUMENT_BUFFER_SIZE (USHORT)32768 + +/************************************************************************* +|* +|* Konstruktor +|* +\************************************************************************/ + +FuInsertFile::FuInsertFile ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +FunctionReference FuInsertFile::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + FunctionReference xFunc( new FuInsertFile( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuInsertFile::DoExecute( SfxRequest& rReq ) +{ + SfxFilterMatcher& rMatcher = SFX_APP()->GetFilterMatcher(); + ::std::vector< String > aFilterVector; + const SfxItemSet* pArgs = rReq.GetArgs (); + + FuInsertFile::GetSupportedFilterVector( aFilterVector ); + + if (!pArgs) + { + sfx2::FileDialogHelper aFileDialog( WB_OPEN | SFXWB_INSERT | WB_STDMODAL ); + Reference< XFilePicker > xFilePicker( aFileDialog.GetFilePicker(), UNO_QUERY ); + Reference< XFilterManager > xFilterManager( xFilePicker, UNO_QUERY ); + String aOwnCont; + String aOtherCont; + const SfxFilter* pFilter = NULL; + + aFileDialog.SetTitle( String( SdResId(STR_DLG_INSERT_PAGES_FROM_FILE ) ) ); + + if( mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS ) + { + aOwnCont = String( RTL_CONSTASCII_USTRINGPARAM( "simpress" ) ); + aOtherCont = String( RTL_CONSTASCII_USTRINGPARAM( "sdraw" ) ) ; + } + else + { + aOtherCont = String( RTL_CONSTASCII_USTRINGPARAM( "simpress" ) ); + aOwnCont = String( RTL_CONSTASCII_USTRINGPARAM( "sdraw" ) ) ; + } + + SfxFilterMatcher aMatch( aOwnCont ); + + if( xFilterManager.is() ) + { + // Get filter for current format + try + { + String aExt; + String aAllSpec( SdResId( STR_ALL_FILES ) ); + + xFilterManager->appendFilter( aAllSpec, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.*" ) ) ); + xFilterManager->setCurrentFilter( aAllSpec ); // set default-filter (<All>) + + // Get main filter + pFilter = SfxFilter::GetDefaultFilterFromFactory( aOwnCont ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + // get cross filter + pFilter = SfxFilter::GetDefaultFilterFromFactory( aOtherCont ); + if( pFilter ) + { + pFilter = aMatch.GetFilter4Extension( pFilter->GetDefaultExtension() ); + if ( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + } + + // get femplate filter + if( mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS ) + pFilter = DrawDocShell::Factory().GetTemplateFilter(); + else + pFilter = GraphicDocShell::Factory().GetTemplateFilter(); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + // get Powerpoint filter + aExt = UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( ".ppt" ) ); + pFilter = aMatch.GetFilter4Extension( aExt ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + // Get other draw/impress filters + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARIMPRESS_60, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARIMPRESS_60, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_60, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_60, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARIMPRESS_50, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARIMPRESS_50, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_50, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_50, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_40, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_40, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW, SFX_FILTER_TEMPLATEPATH ); + if( pFilter ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + // add additional supported filters + ::std::vector< String >::const_iterator aIter( aFilterVector.begin() ); + + while( aIter != aFilterVector.end() ) + { + if( ( pFilter = rMatcher.GetFilter4Mime( *aIter ) ) != NULL ) + xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + + ++aIter; + } + } + catch(IllegalArgumentException) + { + } + } + + if( aFileDialog.Execute() != ERRCODE_NONE ) + return; + else + { + aFilterName = aFileDialog.GetCurrentFilter(); + aFile = aFileDialog.GetPath(); + } + } + else + { + SFX_REQUEST_ARG (rReq, pFileName, SfxStringItem, ID_VAL_DUMMY0, FALSE); + SFX_REQUEST_ARG (rReq, pFilterName, SfxStringItem, ID_VAL_DUMMY1, FALSE); + + aFile = pFileName->GetValue (); + + if( pFilterName ) + aFilterName = pFilterName->GetValue (); + } + + mpDocSh->SetWaitCursor( TRUE ); + + SfxMedium* pMedium = new SfxMedium( aFile, STREAM_READ | STREAM_NOCREATE, FALSE ); + const SfxFilter* pFilter = NULL; + + SFX_APP()->GetFilterMatcher().GuessFilter( *pMedium, &pFilter, SFX_FILTER_IMPORT, SFX_FILTER_NOTINSTALLED | SFX_FILTER_EXECUTABLE ); + + BOOL bDrawMode = mpViewShell && mpViewShell->ISA(DrawViewShell); + BOOL bInserted = FALSE; + + if( pFilter ) + { + pMedium->SetFilter( pFilter ); + aFilterName = pFilter->GetFilterName(); + + if( pMedium->IsStorage() || ( pMedium->GetInStream() && SotStorage::IsStorageFile( pMedium->GetInStream() ) ) ) + { + if ( pFilter->GetServiceName().EqualsAscii( "com.sun.star.presentation.PresentationDocument" ) || + pFilter->GetServiceName().EqualsAscii( "com.sun.star.drawing.DrawingDocument" ) ) + { + // Draw, Impress or PowerPoint document + // the ownership of the Medium is transferred + if( bDrawMode ) + InsSDDinDrMode( pMedium ); + else + InsSDDinOlMode( pMedium ); + + // don't delete Medium here, ownership of pMedium has changed in this case + bInserted = TRUE; + } + } + else + { + BOOL bFound = ( ::std::find( aFilterVector.begin(), aFilterVector.end(), pFilter->GetMimeType() ) != aFilterVector.end() ); + if( !bFound && + ( aFilterName.SearchAscii( "Text" ) != STRING_NOTFOUND || + aFilterName.SearchAscii( "Rich" ) != STRING_NOTFOUND || + aFilterName.SearchAscii( "RTF" ) != STRING_NOTFOUND || + aFilterName.SearchAscii( "HTML" ) != STRING_NOTFOUND ) ) + { + bFound = TRUE; + } + + if( bFound ) + { + if( bDrawMode ) + InsTextOrRTFinDrMode(pMedium); + else + InsTextOrRTFinOlMode(pMedium); + + bInserted = TRUE; + delete pMedium; + } + } + } + + mpDocSh->SetWaitCursor( FALSE ); + + if( !bInserted ) + { + ErrorBox aErrorBox( mpWindow, WB_OK, String( SdResId( STR_READ_DATA_ERROR ) ) ); + aErrorBox.Execute(); + delete pMedium; + } +} + +// ----------------------------------------------------------------------------- + +BOOL FuInsertFile::InsSDDinDrMode(SfxMedium* pMedium) +{ + BOOL bOK = FALSE; + + // Liste mit Seitennamen (wenn NULL, dann alle Seiten) + List* pBookmarkList = NULL; + + mpDocSh->SetWaitCursor( FALSE ); + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + AbstractSdInsertPagesObjsDlg* pDlg = pFact ? pFact->CreateSdInsertPagesObjsDlg( NULL, mpDoc, pMedium, aFile ) : 0; + + if( !pDlg ) + return FALSE; + + // Ev. wird eine QueryBox geoeffnet ("Links aktualisieren?"), + // daher wird der Dialog der aktuelle DefModalDialogParent + ::Window* pDefParent = GetpApp()->GetDefDialogParent(); + GetpApp()->SetDefDialogParent(pDlg->GetWindow()); + + USHORT nRet = pDlg->Execute(); + + GetpApp()->SetDefDialogParent(pDefParent); + + mpDocSh->SetWaitCursor( TRUE ); + + if( nRet == RET_OK ) + { + // Zuerst Seiten einfuegen + pBookmarkList = pDlg->GetList( 1 ); // Seiten + BOOL bLink = pDlg->IsLink(); + BOOL bReplace = FALSE; + SdPage* pPage = NULL; + ::sd::View* pView = mpViewShell->GetView(); + + if (pView->ISA(OutlineView)) + { + pPage = static_cast<OutlineView*>(pView)->GetActualPage(); + } + else + { + pPage = static_cast<SdPage*>(pView->GetSdrPageView()->GetPage()); + } + + USHORT nPos = 0xFFFF; + + if (pPage && !pPage->IsMasterPage()) + { + if (pPage->GetPageKind() == PK_STANDARD) + { + nPos = pPage->GetPageNum() + 2; + } + else if (pPage->GetPageKind() == PK_NOTES) + { + nPos = pPage->GetPageNum() + 1; + } + } + + BOOL bNameOK; + List* pObjectBookmarkList = pDlg->GetList( 2 ); // Objekte + List* pExchangeList = NULL; + + // Es werden ausgewaehlte Seiten und/oder ausgewaehlte Objekte oder + // alles eingefuegt, wenn pBookmarkList NULL ist! + if( pBookmarkList || !pObjectBookmarkList ) + { + // Um zu gewaehrleisten, dass alle Seitennamen eindeutig sind, werden + // die einzufuegenden geprueft und gegebenenfalls in einer Ersatzliste + // aufgenommen + // bNameOK == FALSE -> Benutzer hat abgebrochen + bNameOK = mpView->GetExchangeList( pExchangeList, pBookmarkList, 0 ); + + if( bNameOK ) + bOK = mpDoc->InsertBookmarkAsPage( pBookmarkList, pExchangeList, + bLink, bReplace, nPos, + FALSE, NULL, TRUE, TRUE, FALSE ); + + // Loeschen der BookmarkList + if( pBookmarkList ) + { + String* pString = (String*) pBookmarkList->First(); + while( pString ) + { + delete pString; + pString = (String*) pBookmarkList->Next(); + } + delete pBookmarkList; + pBookmarkList = NULL; + } + // Loeschen der ExchangeList + if( pExchangeList ) + { + String* pString = (String*) pExchangeList->First(); + while( pString ) + { + delete pString; + pString = (String*) pExchangeList->Next(); + } + delete pExchangeList; + pExchangeList = NULL; + } + } + // Dann Objekte einfuegen + //pBookmarkList = pDlg->GetList( 2 ); // Objekte + pBookmarkList = pObjectBookmarkList; + + // Um zu gewaehrleisten... (s.o.) + bNameOK = mpView->GetExchangeList( pExchangeList, pBookmarkList, 1 ); + + if( bNameOK ) + bOK = mpDoc->InsertBookmarkAsObject( pBookmarkList, pExchangeList, + bLink, NULL, NULL); + + // Loeschen der BookmarkList + if( pBookmarkList ) + { + String* pString = (String*) pBookmarkList->First(); + while( pString ) + { + delete pString; + pString = (String*) pBookmarkList->Next(); + } + delete pBookmarkList; + pBookmarkList = NULL; + } + // Loeschen der ExchangeList + if( pExchangeList ) + { + String* pString = (String*) pExchangeList->First(); + while( pString ) + { + delete pString; + pString = (String*) pExchangeList->Next(); + } + delete pExchangeList; + pExchangeList = NULL; + } + + if( pDlg->IsRemoveUnnessesaryMasterPages() ) + mpDoc->RemoveUnnecessaryMasterPages(); + } + + delete pDlg; + + return (bOK); +} + +// ----------------------------------------------------------------------------- + +void FuInsertFile::InsTextOrRTFinDrMode(SfxMedium* pMedium) +{ + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + AbstractSdInsertPagesObjsDlg* pDlg = pFact ? pFact->CreateSdInsertPagesObjsDlg(NULL, mpDoc, NULL, aFile ) : 0; + if( !pDlg ) + return; + + mpDocSh->SetWaitCursor( FALSE ); + + USHORT nRet = pDlg->Execute(); + mpDocSh->SetWaitCursor( TRUE ); + + if( nRet == RET_OK ) + { + // gewaehltes Dateiformat: Text oder RTF oder HTML (Default ist Text) + USHORT nFormat = EE_FORMAT_TEXT; + + if( aFilterName.SearchAscii( "Rich") != STRING_NOTFOUND ) + nFormat = EE_FORMAT_RTF; + else if( aFilterName.SearchAscii( "HTML" ) != STRING_NOTFOUND ) + nFormat = EE_FORMAT_HTML; + + // einen eigenen Outliner erzeugen, denn: + // der Dokument-Outliner koennte gerade vom Gliederungsmodus + // benutzt werden; + // der Draw-Outliner der Drawing Engine koennte zwischendurch + // was zeichnen muessen; + // der globale Outliner koennte in SdPage::CreatePresObj + // benutzt werden +// SfxItemPool* pPool = mpDoc->GetDrawOutliner().GetEmptyItemSet().GetPool(); + SdrOutliner* pOutliner = new ::sd::Outliner( mpDoc, OUTLINERMODE_TEXTOBJECT ); +// pOutliner->SetStyleSheetPool((SfxStyleSheetPool*)mpDoc->GetStyleSheetPool()); +// pOutliner->SetEditTextObjectPool(pPool); +// pOutliner->SetForbiddenCharsTable( mpDoc->GetForbiddenCharsTable() ); + + // Referenz-Device setzen + pOutliner->SetRefDevice( SD_MOD()->GetRefDevice( *mpDocSh ) ); + + SdPage* pPage = static_cast<DrawViewShell*>(mpViewShell)->GetActualPage(); + aLayoutName = pPage->GetLayoutName(); + aLayoutName.Erase(aLayoutName.SearchAscii(SD_LT_SEPARATOR)); + + pOutliner->SetPaperSize(pPage->GetSize()); + + SvStream* pStream = pMedium->GetInStream(); + DBG_ASSERT( pStream, "Kein InStream!" ); + pStream->Seek( 0 ); + + ULONG nErr = pOutliner->Read( *pStream, pMedium->GetBaseURL(), nFormat, mpDocSh->GetHeaderAttributes() ); + + if (nErr || !pOutliner->GetEditEngine().GetText().Len()) + { + ErrorBox aErrorBox( mpWindow, (WinBits)WB_OK, + String(SdResId(STR_READ_DATA_ERROR))); + aErrorBox.Execute(); + } + else + { + // ist es eine Masterpage? + if (static_cast<DrawViewShell*>(mpViewShell)->GetEditMode() == EM_MASTERPAGE && + !pPage->IsMasterPage()) + { + pPage = (SdPage*)(&(pPage->TRG_GetMasterPage())); + } + + DBG_ASSERT(pPage, "Seite nicht gefunden"); + + // wenn gerade editiert wird, in dieses Textobjekt einfliessen lassen + OutlinerView* pOutlinerView = mpView->GetTextEditOutlinerView(); + if( pOutlinerView ) + { + SdrObject* pObj = mpView->GetTextEditObject(); + if( pObj && + pObj->GetObjInventor() == SdrInventor && + pObj->GetObjIdentifier() == OBJ_TITLETEXT && + pOutliner->GetParagraphCount() > 1 ) + { + // In Titelobjekten darf nur ein Absatz vorhanden sein + while ( pOutliner->GetParagraphCount() > 1 ) + { + Paragraph* pPara = pOutliner->GetParagraph( 0 ); + ULONG nLen = pOutliner->GetText( pPara, 1 ).Len(); + pOutliner->QuickDelete( ESelection( 0, (USHORT) nLen, 1, 0 ) ); + pOutliner->QuickInsertLineBreak( ESelection( 0, (USHORT) nLen, 0, (USHORT) nLen ) ); + } + } + } + + OutlinerParaObject* pOPO = pOutliner->CreateParaObject(); + + if (pOutlinerView) + { + pOutlinerView->InsertText(*pOPO); + } + else + { + SdrRectObj* pTO = new SdrRectObj(OBJ_TEXT); + pTO->SetOutlinerParaObject(pOPO); + + const bool bUndo = mpView->IsUndoEnabled(); + if( bUndo ) + mpView->BegUndo(String(SdResId(STR_UNDO_INSERT_TEXTFRAME))); + pPage->InsertObject(pTO); + + // koennte groesser sein als die max. erlaubte Groesse: + // falls noetig, die Objektgroesse begrenzen + Size aSize(pOutliner->CalcTextSize()); + Size aMaxSize = mpDoc->GetMaxObjSize(); + aSize.Height() = Min(aSize.Height(), aMaxSize.Height()); + aSize.Width() = Min(aSize.Width(), aMaxSize.Width()); + aSize = mpWindow->LogicToPixel(aSize); + + // in der Mitte des Fensters absetzen + Size aTemp(mpWindow->GetOutputSizePixel()); + Point aPos(aTemp.Width() / 2, aTemp.Height() / 2); + aPos.X() -= aSize.Width() / 2; + aPos.Y() -= aSize.Height() / 2; + aSize = mpWindow->PixelToLogic(aSize); + aPos = mpWindow->PixelToLogic(aPos); + pTO->SetLogicRect(Rectangle(aPos, aSize)); + + if (pDlg->IsLink()) + { + pTO->SetTextLink(aFile, aFilterName, gsl_getSystemTextEncoding() ); + } + + if( bUndo ) + { + mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoInsertObject(*pTO)); + mpView->EndUndo(); + } + } + } + delete pOutliner; + } + + delete pDlg; +} + +// ----------------------------------------------------------------------------- + +void FuInsertFile::InsTextOrRTFinOlMode(SfxMedium* pMedium) +{ + // gewaehltes Dateiformat: Text oder RTF oder HTML (Default ist Text) + USHORT nFormat = EE_FORMAT_TEXT; + + if( aFilterName.SearchAscii( "Rich") != STRING_NOTFOUND ) + nFormat = EE_FORMAT_RTF; + else if( aFilterName.SearchAscii( "HTML" ) != STRING_NOTFOUND ) + nFormat = EE_FORMAT_HTML; + + ::Outliner* pDocliner = static_cast<OutlineView*>(mpView)->GetOutliner(); + List* pList = pDocliner->GetView(0)->CreateSelectionList(); + Paragraph* pPara = (Paragraph*)pList->First(); + + // wo soll eingefuegt werden? + while( !pDocliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) ) + { + pPara = pDocliner->GetParent(pPara); + } + ULONG nTargetPos = pDocliner->GetAbsPos(pPara) + 1; + + // Layout der Vorgaengerseite uebernehmen + USHORT nPage = 0; + pPara = pDocliner->GetParagraph( pDocliner->GetAbsPos( pPara ) - 1 ); + while (pPara) + { + ULONG nPos = pDocliner->GetAbsPos( pPara ); + if ( pDocliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) ) + nPage++; + pPara = pDocliner->GetParagraph( nPos - 1 ); + } + SdPage* pPage = mpDoc->GetSdPage(nPage, PK_STANDARD); + aLayoutName = pPage->GetLayoutName(); + aLayoutName.Erase(aLayoutName.SearchAscii(SD_LT_SEPARATOR)); + + // einen eigenen Outliner erzeugen, denn: + // der Dokument-Outliner koennte gerade vom Gliederungsmodus + // benutzt werden; + // der Draw-Outliner der Drawing Engine koennte zwischendurch + // was zeichnen muessen; + // der globale Outliner koennte in SdPage::CreatePresObj + // benutzt werden + ::Outliner* pOutliner = new ::Outliner( &mpDoc->GetItemPool(), OUTLINERMODE_OUTLINEOBJECT ); + pOutliner->SetStyleSheetPool((SfxStyleSheetPool*)mpDoc->GetStyleSheetPool()); + + // Referenz-Device setzen + pOutliner->SetRefDevice(SD_MOD()->GetRefDevice( *mpDocSh )); + pOutliner->SetPaperSize(Size(0x7fffffff, 0x7fffffff)); + + SvStream* pStream = pMedium->GetInStream(); + DBG_ASSERT( pStream, "Kein InStream!" ); + pStream->Seek( 0 ); + + ULONG nErr = pOutliner->Read(*pStream, pMedium->GetBaseURL(), nFormat, mpDocSh->GetHeaderAttributes()); + + if (nErr || !pOutliner->GetEditEngine().GetText().Len()) + { + ErrorBox aErrorBox( mpWindow, (WinBits)WB_OK, + String(SdResId(STR_READ_DATA_ERROR))); + aErrorBox.Execute(); + } + else + { + ULONG nParaCount = pOutliner->GetParagraphCount(); + + // fuer Fortschrittsanzeige: Anzahl der Ebene-0-Absaetze + USHORT nNewPages = 0; + pPara = pOutliner->GetParagraph( 0 ); + while (pPara) + { + ULONG nPos = pOutliner->GetAbsPos( pPara ); + if( pOutliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) ) + nNewPages++; + pPara = pOutliner->GetParagraph( ++nPos ); + } + + mpDocSh->SetWaitCursor( FALSE ); + + SfxProgress* pProgress = new SfxProgress( mpDocSh, String( SdResId(STR_CREATE_PAGES)), nNewPages); + if( pProgress ) + pProgress->SetState( 0, 100 ); + + nNewPages = 0; + + pDocliner->GetUndoManager().EnterListAction( + String(SdResId(STR_UNDO_INSERT_FILE)), String() ); + + ULONG nSourcePos = 0; + SfxStyleSheet* pStyleSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE ); + Paragraph* pSourcePara = pOutliner->GetParagraph( 0 ); + while (pSourcePara) + { + ULONG nPos = pOutliner->GetAbsPos( pSourcePara ); + sal_Int16 nDepth = pOutliner->GetDepth( (USHORT) nPos ); + + // den letzte Absatz nur uebernehmen, wenn er gefuellt ist + if (nSourcePos < nParaCount - 1 || + pOutliner->GetText(pSourcePara).Len() > 0) + { + pDocliner->Insert( pOutliner->GetText(pSourcePara), nTargetPos, nDepth ); + String aStyleSheetName( pStyleSheet->GetName() ); + aStyleSheetName.Erase( aStyleSheetName.Len()-1, 1 ); + aStyleSheetName += String::CreateFromInt32( nDepth <= 0 ? 1 : nDepth+1 ); + SfxStyleSheetBasePool* pStylePool = mpDoc->GetStyleSheetPool(); + SfxStyleSheet* pOutlStyle = (SfxStyleSheet*) pStylePool->Find( aStyleSheetName, pStyleSheet->GetFamily() ); + pDocliner->SetStyleSheet( nTargetPos, pOutlStyle ); + } + + if( pDocliner->HasParaFlag( pSourcePara, PARAFLAG_ISPAGE ) ) + { + nNewPages++; + if( pProgress ) + pProgress->SetState( nNewPages ); + } + + pSourcePara = pOutliner->GetParagraph( ++nPos ); + nTargetPos++; + nSourcePos++; + } + + pDocliner->GetUndoManager().LeaveListAction(); + + if( pProgress ) + delete pProgress; + + mpDocSh->SetWaitCursor( TRUE ); + } + + delete pOutliner; +} + +// ----------------------------------------------------------------------------- + +BOOL FuInsertFile::InsSDDinOlMode(SfxMedium* pMedium) +{ + OutlineView* pOlView = static_cast<OutlineView*>(mpView); + + // Outliner-Inhalte ins SdDrawDocument uebertragen + pOlView->PrepareClose(); + + // einlesen wie im Zeichenmodus + if (InsSDDinDrMode(pMedium)) + { + ::Outliner* pOutliner = pOlView->GetViewByWindow(mpWindow)->GetOutliner(); + + // Benachrichtigungs-Links temporaer trennen + Link aOldParagraphInsertedHdl = pOutliner->GetParaInsertedHdl(); + pOutliner->SetParaInsertedHdl( Link(NULL, NULL)); + Link aOldParagraphRemovingHdl = pOutliner->GetParaRemovingHdl(); + pOutliner->SetParaRemovingHdl( Link(NULL, NULL)); + Link aOldDepthChangedHdl = pOutliner->GetDepthChangedHdl(); + pOutliner->SetDepthChangedHdl( Link(NULL, NULL)); + Link aOldBeginMovingHdl = pOutliner->GetBeginMovingHdl(); + pOutliner->SetBeginMovingHdl( Link(NULL, NULL)); + Link aOldEndMovingHdl = pOutliner->GetEndMovingHdl(); + pOutliner->SetEndMovingHdl( Link(NULL, NULL)); + + Link aOldStatusEventHdl = pOutliner->GetStatusEventHdl(); + pOutliner->SetStatusEventHdl(Link(NULL, NULL)); + + pOutliner->Clear(); + pOlView->FillOutliner(); + + // Links wieder setzen + pOutliner->SetParaInsertedHdl(aOldParagraphInsertedHdl); + pOutliner->SetParaRemovingHdl(aOldParagraphRemovingHdl); + pOutliner->SetDepthChangedHdl(aOldDepthChangedHdl); + pOutliner->SetBeginMovingHdl(aOldBeginMovingHdl); + pOutliner->SetEndMovingHdl(aOldEndMovingHdl); + pOutliner->SetStatusEventHdl(aOldStatusEventHdl); + + return TRUE; + } + else + return FALSE; +} + +// ----------------------------------------------------------------------------- + +void FuInsertFile::GetSupportedFilterVector( ::std::vector< String >& rFilterVector ) +{ + SfxFilterMatcher& rMatcher = SFX_APP()->GetFilterMatcher(); + const SfxFilter* pSearchFilter = NULL; + + rFilterVector.clear(); + + if( ( pSearchFilter = rMatcher.GetFilter4Mime( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "text/plain" ) ) ) ) != NULL ) + rFilterVector.push_back( pSearchFilter->GetMimeType() ); + + if( ( pSearchFilter = rMatcher.GetFilter4Mime( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "application/rtf" ) ) ) ) != NULL ) + rFilterVector.push_back( pSearchFilter->GetMimeType() ); + + if( ( pSearchFilter = rMatcher.GetFilter4Mime( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "text/html" ) ) ) ) != NULL ) + rFilterVector.push_back( pSearchFilter->GetMimeType() ); +} + +} // end of namespace sd |