LCOV - code coverage report
Current view: top level - libreoffice/sd/source/ui/func - fuinsfil.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 363 0.3 %
Date: 2012-12-27 Functions: 2 15 13.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include "fuinsfil.hxx"
      22             : #include <vcl/wrkwin.hxx>
      23             : #include <sfx2/progress.hxx>
      24             : #include <editeng/outliner.hxx>
      25             : #include <editeng/editeng.hxx>
      26             : #include <svl/stritem.hxx>
      27             : #include <sfx2/request.hxx>
      28             : #include <sfx2/app.hxx>
      29             : #include <vcl/msgbox.hxx>
      30             : #include <sfx2/printer.hxx>
      31             : #include <svx/svdorect.hxx>
      32             : #include <svx/svdundo.hxx>
      33             : #include <svx/svdoutl.hxx>
      34             : #include <sfx2/filedlghelper.hxx>
      35             : #include <sot/formats.hxx>
      36             : #include <svl/urihelper.hxx>
      37             : #include <editeng/forbiddencharacterstable.hxx>
      38             : #include <sfx2/docfile.hxx>
      39             : #include <sfx2/docfilt.hxx>
      40             : #include <sfx2/fcontnr.hxx>
      41             : #include <svx/svdpagv.hxx>
      42             : #include <svx/dialogs.hrc>
      43             : #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
      44             : #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
      45             : #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
      46             : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
      47             : 
      48             : #include "sdresid.hxx"
      49             : #include "drawdoc.hxx"
      50             : #include "Window.hxx"
      51             : #include "View.hxx"
      52             : #include "strings.hrc"
      53             : #include "stlpool.hxx"
      54             : #include "glob.hrc"
      55             : #include "sdpage.hxx"
      56             : #include "strmname.h"
      57             : #include "DrawViewShell.hxx"
      58             : #include "OutlineViewShell.hxx"
      59             : #include "DrawDocShell.hxx"
      60             : #include "GraphicDocShell.hxx"
      61             : #include "app.hrc"
      62             : #include "unmovss.hxx"
      63             : #include "Outliner.hxx"
      64             : #include "sdabstdlg.hxx"
      65             : 
      66             : using ::rtl::OUString;
      67             : using namespace ::com::sun::star::lang;
      68             : using namespace ::com::sun::star::uno;
      69             : using namespace ::com::sun::star::ui::dialogs;
      70             : using namespace ::com::sun::star;
      71             : 
      72             : namespace sd {
      73             : 
      74           0 : TYPEINIT1( FuInsertFile, FuPoor );
      75             : 
      76             : /*************************************************************************
      77             : |*
      78             : |* Konstruktor
      79             : |*
      80             : \************************************************************************/
      81             : 
      82           0 : FuInsertFile::FuInsertFile (
      83             :     ViewShell*    pViewSh,
      84             :     ::sd::Window*      pWin,
      85             :     ::sd::View*        pView,
      86             :     SdDrawDocument* pDoc,
      87             :     SfxRequest&    rReq)
      88           0 :     : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
      89             : {
      90           0 : }
      91             : 
      92           0 : FunctionReference FuInsertFile::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
      93             : {
      94           0 :     FunctionReference xFunc( new FuInsertFile( pViewSh, pWin, pView, pDoc, rReq ) );
      95           0 :     xFunc->DoExecute(rReq);
      96           0 :     return xFunc;
      97             : }
      98             : 
      99           0 : void FuInsertFile::DoExecute( SfxRequest& rReq )
     100             : {
     101           0 :     SfxFilterMatcher&       rMatcher = SFX_APP()->GetFilterMatcher();
     102           0 :     ::std::vector< OUString > aFilterVector;
     103           0 :     const SfxItemSet*       pArgs = rReq.GetArgs ();
     104             : 
     105           0 :     FuInsertFile::GetSupportedFilterVector( aFilterVector );
     106             : 
     107           0 :     if (!pArgs)
     108             :     {
     109             :         sfx2::FileDialogHelper      aFileDialog(
     110             :                 ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
     111           0 :                 SFXWB_INSERT );
     112           0 :         Reference< XFilePicker >    xFilePicker( aFileDialog.GetFilePicker(), UNO_QUERY );
     113           0 :         Reference< XFilterManager > xFilterManager( xFilePicker, UNO_QUERY );
     114           0 :         rtl::OUString aOwnCont;
     115           0 :         rtl::OUString aOtherCont;
     116           0 :         const SfxFilter*            pFilter = NULL;
     117             : 
     118           0 :         aFileDialog.SetTitle( String( SdResId(STR_DLG_INSERT_PAGES_FROM_FILE ) ) );
     119             : 
     120           0 :         if( mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS )
     121             :         {
     122           0 :             aOwnCont = "simpress";
     123           0 :             aOtherCont = "sdraw";
     124             :         }
     125             :         else
     126             :         {
     127           0 :             aOtherCont = "simpress";
     128           0 :             aOwnCont = "sdraw" ;
     129             :         }
     130             : 
     131           0 :         SfxFilterMatcher aMatch( aOwnCont );
     132             : 
     133           0 :         if( xFilterManager.is() )
     134             :         {
     135             :             // Get filter for current format
     136             :             try
     137             :             {
     138           0 :                 String  aExt;
     139           0 :                 String  aAllSpec( SdResId( STR_ALL_FILES ) );
     140             : 
     141           0 :                 xFilterManager->appendFilter( aAllSpec, rtl::OUString("*.*") );
     142           0 :                 xFilterManager->setCurrentFilter( aAllSpec ); // set default-filter (<All>)
     143             : 
     144             :                 // Get main filter
     145           0 :                 pFilter = SfxFilter::GetDefaultFilterFromFactory( aOwnCont );
     146           0 :                 if( pFilter )
     147           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     148             : 
     149             :                 // get cross filter
     150           0 :                 pFilter = SfxFilter::GetDefaultFilterFromFactory( aOtherCont );
     151           0 :                 if( pFilter )
     152             :                 {
     153           0 :                     pFilter = aMatch.GetFilter4Extension( pFilter->GetDefaultExtension() );
     154           0 :                     if ( pFilter )
     155           0 :                         xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     156             :                 }
     157             : 
     158             :                 // get femplate filter
     159           0 :                 if( mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS )
     160           0 :                     pFilter = DrawDocShell::Factory().GetTemplateFilter();
     161             :                 else
     162           0 :                     pFilter = GraphicDocShell::Factory().GetTemplateFilter();
     163           0 :                 if( pFilter )
     164           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     165             : 
     166             :                 // get Powerpoint filter
     167           0 :                 aExt = rtl::OUString(".ppt");
     168           0 :                 pFilter = aMatch.GetFilter4Extension( aExt );
     169           0 :                 if( pFilter )
     170           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     171             : 
     172             :                 // Get other draw/impress filters
     173           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARIMPRESS_60, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH );
     174           0 :                 if( pFilter )
     175           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     176             : 
     177           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARIMPRESS_60, SFX_FILTER_TEMPLATEPATH );
     178           0 :                 if( pFilter )
     179           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     180             : 
     181           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_60, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH  );
     182           0 :                 if( pFilter )
     183           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     184             : 
     185           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_60, SFX_FILTER_TEMPLATEPATH  );
     186           0 :                 if( pFilter )
     187           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     188             : 
     189           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARIMPRESS_50, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH  );
     190           0 :                 if( pFilter )
     191           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     192             : 
     193           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARIMPRESS_50, SFX_FILTER_TEMPLATEPATH );
     194           0 :                 if( pFilter )
     195           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     196             : 
     197           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_50, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH  );
     198           0 :                 if( pFilter )
     199           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     200             : 
     201           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_50, SFX_FILTER_TEMPLATEPATH  );
     202           0 :                 if( pFilter )
     203           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     204             : 
     205           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_40, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH  );
     206           0 :                 if( pFilter )
     207           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     208             : 
     209           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW_40, SFX_FILTER_TEMPLATEPATH  );
     210           0 :                 if( pFilter )
     211           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     212             : 
     213           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW, SFX_FILTER_IMPORT, SFX_FILTER_TEMPLATEPATH  );
     214           0 :                 if( pFilter )
     215           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     216             : 
     217           0 :                 pFilter = aMatch.GetFilter4ClipBoardId( SOT_FORMATSTR_ID_STARDRAW, SFX_FILTER_TEMPLATEPATH  );
     218           0 :                 if( pFilter )
     219           0 :                     xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     220             : 
     221             :                 // add additional supported filters
     222           0 :                 ::std::vector< OUString >::const_iterator aIter( aFilterVector.begin() );
     223             : 
     224           0 :                 while( aIter != aFilterVector.end() )
     225             :                 {
     226           0 :                     if( ( pFilter = rMatcher.GetFilter4Mime( *aIter ) ) != NULL )
     227           0 :                         xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
     228             : 
     229           0 :                     ++aIter;
     230           0 :                 }
     231             :             }
     232           0 :             catch (const IllegalArgumentException&)
     233             :             {
     234             :             }
     235             :         }
     236             : 
     237           0 :         if( aFileDialog.Execute() != ERRCODE_NONE )
     238           0 :             return;
     239             :         else
     240             :         {
     241           0 :             aFilterName = aFileDialog.GetCurrentFilter();
     242           0 :             aFile = aFileDialog.GetPath();
     243           0 :         }
     244             :     }
     245             :     else
     246             :     {
     247           0 :         SFX_REQUEST_ARG (rReq, pFileName, SfxStringItem, ID_VAL_DUMMY0, sal_False);
     248           0 :         SFX_REQUEST_ARG (rReq, pFilterName, SfxStringItem, ID_VAL_DUMMY1, sal_False);
     249             : 
     250           0 :         aFile = pFileName->GetValue ();
     251             : 
     252           0 :         if( pFilterName )
     253           0 :             aFilterName = pFilterName->GetValue ();
     254             :     }
     255             : 
     256           0 :     mpDocSh->SetWaitCursor( sal_True );
     257             : 
     258           0 :     SfxMedium*          pMedium = new SfxMedium( aFile, STREAM_READ | STREAM_NOCREATE );
     259           0 :     const SfxFilter*    pFilter = NULL;
     260             : 
     261           0 :     SFX_APP()->GetFilterMatcher().GuessFilter( *pMedium, &pFilter, SFX_FILTER_IMPORT, SFX_FILTER_NOTINSTALLED | SFX_FILTER_EXECUTABLE );
     262             : 
     263           0 :     sal_Bool                bDrawMode = mpViewShell && mpViewShell->ISA(DrawViewShell);
     264           0 :     sal_Bool                bInserted = sal_False;
     265             : 
     266           0 :     if( pFilter )
     267             :     {
     268           0 :         pMedium->SetFilter( pFilter );
     269           0 :         aFilterName = pFilter->GetFilterName();
     270             : 
     271           0 :         if( pMedium->IsStorage() || ( pMedium->GetInStream() && SotStorage::IsStorageFile( pMedium->GetInStream() ) ) )
     272             :         {
     273           0 :             if ( pFilter->GetServiceName() == "com.sun.star.presentation.PresentationDocument" ||
     274           0 :                  pFilter->GetServiceName() == "com.sun.star.drawing.DrawingDocument" )
     275             :             {
     276             :                 // Draw, Impress or PowerPoint document
     277             :                 // the ownership of the Medium is transferred
     278           0 :                 if( bDrawMode )
     279           0 :                     InsSDDinDrMode( pMedium );
     280             :                 else
     281           0 :                     InsSDDinOlMode( pMedium );
     282             : 
     283             :                 // don't delete Medium here, ownership of pMedium has changed in this case
     284           0 :                 bInserted = sal_True;
     285             :             }
     286             :         }
     287             :         else
     288             :         {
     289           0 :             sal_Bool bFound = ( ::std::find( aFilterVector.begin(), aFilterVector.end(), pFilter->GetMimeType() ) != aFilterVector.end() );
     290           0 :             if( !bFound &&
     291           0 :                 ( aFilterName.SearchAscii( "Text" ) != STRING_NOTFOUND ||
     292           0 :                 aFilterName.SearchAscii( "Rich" ) != STRING_NOTFOUND ||
     293           0 :                 aFilterName.SearchAscii( "RTF" )  != STRING_NOTFOUND ||
     294           0 :                 aFilterName.SearchAscii( "HTML" ) != STRING_NOTFOUND ) )
     295             :             {
     296           0 :                 bFound = sal_True;
     297             :             }
     298             : 
     299           0 :             if( bFound )
     300             :             {
     301           0 :                 if( bDrawMode )
     302           0 :                     InsTextOrRTFinDrMode(pMedium);
     303             :                 else
     304           0 :                     InsTextOrRTFinOlMode(pMedium);
     305             : 
     306           0 :                 bInserted = sal_True;
     307           0 :                 delete pMedium;
     308             :             }
     309             :         }
     310             :     }
     311             : 
     312           0 :     mpDocSh->SetWaitCursor( sal_False );
     313             : 
     314           0 :     if( !bInserted )
     315             :     {
     316           0 :         ErrorBox aErrorBox( mpWindow, WB_OK, String( SdResId( STR_READ_DATA_ERROR ) ) );
     317           0 :         aErrorBox.Execute();
     318           0 :         delete pMedium;
     319           0 :     }
     320             : }
     321             : 
     322             : // -----------------------------------------------------------------------------
     323             : 
     324           0 : sal_Bool FuInsertFile::InsSDDinDrMode(SfxMedium* pMedium)
     325             : {
     326           0 :     sal_Bool bOK = sal_False;
     327             : 
     328           0 :     mpDocSh->SetWaitCursor( sal_False );
     329           0 :     SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
     330           0 :     AbstractSdInsertPagesObjsDlg* pDlg = pFact ? pFact->CreateSdInsertPagesObjsDlg( NULL, mpDoc, pMedium, aFile ) : 0;
     331             : 
     332           0 :     if( !pDlg )
     333           0 :         return sal_False;
     334             : 
     335             :     // Ev. wird eine QueryBox geoeffnet ("Links aktualisieren?"),
     336             :     // daher wird der Dialog der aktuelle DefModalDialogParent
     337           0 :     ::Window* pDefParent = GetpApp()->GetDefDialogParent();
     338           0 :     GetpApp()->SetDefDialogParent(pDlg->GetWindow());
     339             : 
     340           0 :     sal_uInt16 nRet = pDlg->Execute();
     341             : 
     342           0 :     GetpApp()->SetDefDialogParent(pDefParent);
     343             : 
     344           0 :     mpDocSh->SetWaitCursor( sal_True );
     345             : 
     346           0 :     if( nRet == RET_OK )
     347             :     {
     348             :         // Liste mit Seitennamen (wenn NULL, dann alle Seiten)
     349             :         // Zuerst Seiten einfuegen
     350           0 :         std::vector<rtl::OUString> aBookmarkList = pDlg->GetList( 1 ); // Seiten
     351           0 :         sal_Bool bLink = pDlg->IsLink();
     352           0 :         sal_Bool bReplace = sal_False;
     353           0 :         SdPage* pPage = NULL;
     354           0 :         ::sd::View* pView = mpViewShell->GetView();
     355             : 
     356           0 :         if (pView->ISA(OutlineView))
     357             :         {
     358           0 :             pPage = static_cast<OutlineView*>(pView)->GetActualPage();
     359             :         }
     360             :         else
     361             :         {
     362           0 :             pPage = static_cast<SdPage*>(pView->GetSdrPageView()->GetPage());
     363             :         }
     364             : 
     365           0 :         sal_uInt16 nPos = 0xFFFF;
     366             : 
     367           0 :         if (pPage && !pPage->IsMasterPage())
     368             :         {
     369           0 :             if (pPage->GetPageKind() == PK_STANDARD)
     370             :             {
     371           0 :                 nPos = pPage->GetPageNum() + 2;
     372             :             }
     373           0 :             else if (pPage->GetPageKind() == PK_NOTES)
     374             :             {
     375           0 :                 nPos = pPage->GetPageNum() + 1;
     376             :             }
     377             :         }
     378             : 
     379             :         sal_Bool  bNameOK;
     380           0 :         std::vector<rtl::OUString> aExchangeList;
     381           0 :         std::vector<rtl::OUString> aObjectBookmarkList = pDlg->GetList( 2 ); // Objekte
     382             : 
     383             :         // Es werden ausgewaehlte Seiten und/oder ausgewaehlte Objekte oder
     384             :         // alles eingefuegt, wenn pBookmarkList NULL ist!
     385           0 :         if( !aBookmarkList.empty() || aObjectBookmarkList.empty() )
     386             :         {
     387             :             // Um zu gewaehrleisten, dass alle Seitennamen eindeutig sind, werden
     388             :             // die einzufuegenden geprueft und gegebenenfalls in einer Ersatzliste
     389             :             // aufgenommen
     390             :             // bNameOK == sal_False -> Benutzer hat abgebrochen
     391           0 :             bNameOK = mpView->GetExchangeList( aExchangeList, aBookmarkList, 0 );
     392             : 
     393           0 :             if( bNameOK )
     394             :                 bOK = mpDoc->InsertBookmarkAsPage( aBookmarkList, &aExchangeList,
     395             :                                     bLink, bReplace, nPos,
     396           0 :                                     sal_False, NULL, sal_True, sal_True, sal_False );
     397             : 
     398           0 :             aBookmarkList.clear();
     399           0 :             aExchangeList.clear();
     400             :         }
     401             : 
     402             :         // Um zu gewaehrleisten... (s.o.)
     403           0 :         bNameOK = mpView->GetExchangeList( aExchangeList, aObjectBookmarkList, 1 );
     404             : 
     405           0 :         if( bNameOK )
     406             :             bOK = mpDoc->InsertBookmarkAsObject( aObjectBookmarkList, aExchangeList,
     407           0 :                                 bLink, NULL, NULL);
     408             : 
     409           0 :         if( pDlg->IsRemoveUnnessesaryMasterPages() )
     410           0 :             mpDoc->RemoveUnnecessaryMasterPages();
     411             :     }
     412             : 
     413           0 :     delete pDlg;
     414             : 
     415           0 :     return (bOK);
     416             : }
     417             : 
     418             : // -----------------------------------------------------------------------------
     419             : 
     420           0 : void FuInsertFile::InsTextOrRTFinDrMode(SfxMedium* pMedium)
     421             : {
     422           0 :     SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
     423           0 :     AbstractSdInsertPagesObjsDlg* pDlg = pFact ? pFact->CreateSdInsertPagesObjsDlg(NULL, mpDoc, NULL, aFile ) : 0;
     424           0 :     if( !pDlg )
     425           0 :         return;
     426             : 
     427           0 :     mpDocSh->SetWaitCursor( sal_False );
     428             : 
     429           0 :     sal_uInt16 nRet = pDlg->Execute();
     430           0 :     mpDocSh->SetWaitCursor( sal_True );
     431             : 
     432           0 :     if( nRet == RET_OK )
     433             :     {
     434             :         // gewaehltes Dateiformat: Text oder RTF oder HTML (Default ist Text)
     435           0 :         sal_uInt16 nFormat = EE_FORMAT_TEXT;
     436             : 
     437           0 :         if( aFilterName.SearchAscii( "Rich") != STRING_NOTFOUND )
     438           0 :             nFormat = EE_FORMAT_RTF;
     439           0 :         else if( aFilterName.SearchAscii( "HTML" ) != STRING_NOTFOUND )
     440           0 :             nFormat = EE_FORMAT_HTML;
     441             : 
     442             :         // einen eigenen Outliner erzeugen, denn:
     443             :         // der Dokument-Outliner koennte gerade vom Gliederungsmodus
     444             :         // benutzt werden;
     445             :         // der Draw-Outliner der Drawing Engine koennte zwischendurch
     446             :         // was zeichnen muessen;
     447             :         // der globale Outliner koennte in SdPage::CreatePresObj
     448             :         // benutzt werden
     449           0 :         SdrOutliner* pOutliner = new ::sd::Outliner( mpDoc, OUTLINERMODE_TEXTOBJECT );
     450             : 
     451             :         // Referenz-Device setzen
     452           0 :         pOutliner->SetRefDevice( SD_MOD()->GetRefDevice( *mpDocSh ) );
     453             : 
     454           0 :         SdPage* pPage = static_cast<DrawViewShell*>(mpViewShell)->GetActualPage();
     455           0 :         aLayoutName = pPage->GetLayoutName();
     456           0 :         aLayoutName.Erase(aLayoutName.SearchAscii(SD_LT_SEPARATOR));
     457             : 
     458           0 :         pOutliner->SetPaperSize(pPage->GetSize());
     459             : 
     460           0 :         SvStream* pStream = pMedium->GetInStream();
     461             :         DBG_ASSERT( pStream, "Kein InStream!" );
     462           0 :         pStream->Seek( 0 );
     463             : 
     464           0 :         sal_uLong nErr = pOutliner->Read( *pStream, pMedium->GetBaseURL(), nFormat, mpDocSh->GetHeaderAttributes() );
     465             : 
     466           0 :         if (nErr || !pOutliner->GetEditEngine().GetText().Len())
     467             :         {
     468             :             ErrorBox aErrorBox( mpWindow, (WinBits)WB_OK,
     469           0 :                       String(SdResId(STR_READ_DATA_ERROR)));
     470           0 :             aErrorBox.Execute();
     471             :         }
     472             :         else
     473             :         {
     474             :             // ist es eine Masterpage?
     475           0 :             if (static_cast<DrawViewShell*>(mpViewShell)->GetEditMode() == EM_MASTERPAGE &&
     476           0 :                 !pPage->IsMasterPage())
     477             :             {
     478           0 :                 pPage = (SdPage*)(&(pPage->TRG_GetMasterPage()));
     479             :             }
     480             : 
     481             :             DBG_ASSERT(pPage, "Seite nicht gefunden");
     482             : 
     483             :             // wenn gerade editiert wird, in dieses Textobjekt einfliessen lassen
     484           0 :             OutlinerView* pOutlinerView = mpView->GetTextEditOutlinerView();
     485           0 :             if( pOutlinerView )
     486             :             {
     487           0 :                 SdrObject* pObj = mpView->GetTextEditObject();
     488           0 :                 if( pObj &&
     489           0 :                     pObj->GetObjInventor()   == SdrInventor &&
     490           0 :                     pObj->GetObjIdentifier() == OBJ_TITLETEXT &&
     491           0 :                     pOutliner->GetParagraphCount() > 1 )
     492             :                 {
     493             :                     // In Titelobjekten darf nur ein Absatz vorhanden sein
     494           0 :                     while ( pOutliner->GetParagraphCount() > 1 )
     495             :                     {
     496           0 :                         Paragraph* pPara = pOutliner->GetParagraph( 0 );
     497           0 :                         sal_uLong nLen = pOutliner->GetText( pPara, 1 ).Len();
     498           0 :                         pOutliner->QuickDelete( ESelection( 0, (sal_uInt16) nLen, 1, 0 ) );
     499           0 :                         pOutliner->QuickInsertLineBreak( ESelection( 0, (sal_uInt16) nLen, 0, (sal_uInt16) nLen ) );
     500             :                     }
     501             :                 }
     502             :             }
     503             : 
     504           0 :             OutlinerParaObject* pOPO = pOutliner->CreateParaObject();
     505             : 
     506           0 :             if (pOutlinerView)
     507             :             {
     508           0 :                 pOutlinerView->InsertText(*pOPO);
     509             :             }
     510             :             else
     511             :             {
     512           0 :                 SdrRectObj* pTO = new SdrRectObj(OBJ_TEXT);
     513           0 :                 pTO->SetOutlinerParaObject(pOPO);
     514             : 
     515           0 :                 const bool bUndo = mpView->IsUndoEnabled();
     516           0 :                 if( bUndo )
     517           0 :                     mpView->BegUndo(String(SdResId(STR_UNDO_INSERT_TEXTFRAME)));
     518           0 :                 pPage->InsertObject(pTO);
     519             : 
     520             :                 // koennte groesser sein als die max. erlaubte Groesse:
     521             :                 // falls noetig, die Objektgroesse begrenzen
     522           0 :                 Size aSize(pOutliner->CalcTextSize());
     523           0 :                 Size aMaxSize = mpDoc->GetMaxObjSize();
     524           0 :                 aSize.Height() = Min(aSize.Height(), aMaxSize.Height());
     525           0 :                 aSize.Width()  = Min(aSize.Width(), aMaxSize.Width());
     526           0 :                 aSize = mpWindow->LogicToPixel(aSize);
     527             : 
     528             :                 // in der Mitte des Fensters absetzen
     529           0 :                 Size aTemp(mpWindow->GetOutputSizePixel());
     530           0 :                 Point aPos(aTemp.Width() / 2, aTemp.Height() / 2);
     531           0 :                 aPos.X() -= aSize.Width() / 2;
     532           0 :                 aPos.Y() -= aSize.Height() / 2;
     533           0 :                 aSize = mpWindow->PixelToLogic(aSize);
     534           0 :                 aPos = mpWindow->PixelToLogic(aPos);
     535           0 :                 pTO->SetLogicRect(Rectangle(aPos, aSize));
     536             : 
     537           0 :                 if (pDlg->IsLink())
     538             :                 {
     539           0 :                     pTO->SetTextLink(aFile, aFilterName, osl_getThreadTextEncoding() );
     540             :                 }
     541             : 
     542           0 :                 if( bUndo )
     543             :                 {
     544           0 :                     mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoInsertObject(*pTO));
     545           0 :                     mpView->EndUndo();
     546             :                 }
     547             :             }
     548             :         }
     549           0 :         delete pOutliner;
     550             :     }
     551             : 
     552           0 :     delete pDlg;
     553             : }
     554             : 
     555             : // -----------------------------------------------------------------------------
     556             : 
     557           0 : void FuInsertFile::InsTextOrRTFinOlMode(SfxMedium* pMedium)
     558             : {
     559             :     // gewaehltes Dateiformat: Text oder RTF oder HTML (Default ist Text)
     560           0 :     sal_uInt16 nFormat = EE_FORMAT_TEXT;
     561             : 
     562           0 :     if( aFilterName.SearchAscii( "Rich") != STRING_NOTFOUND )
     563           0 :         nFormat = EE_FORMAT_RTF;
     564           0 :     else if( aFilterName.SearchAscii( "HTML" ) != STRING_NOTFOUND )
     565           0 :         nFormat = EE_FORMAT_HTML;
     566             : 
     567           0 :     ::Outliner*    pDocliner = static_cast<OutlineView*>(mpView)->GetOutliner();
     568             : 
     569           0 :     std::vector<Paragraph*> aSelList;
     570           0 :     pDocliner->GetView(0)->CreateSelectionList(aSelList);
     571             : 
     572           0 :     Paragraph* pPara = aSelList.empty() ? NULL : *(aSelList.begin());
     573             : 
     574             :     // wo soll eingefuegt werden?
     575           0 :     while( !pDocliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) )
     576           0 :         pPara = pDocliner->GetParent(pPara);
     577             : 
     578           0 :     sal_uLong nTargetPos = pDocliner->GetAbsPos(pPara) + 1;
     579             : 
     580             :     // Layout der Vorgaengerseite uebernehmen
     581           0 :     sal_uInt16 nPage = 0;
     582           0 :     pPara = pDocliner->GetParagraph( pDocliner->GetAbsPos( pPara ) - 1 );
     583           0 :     while (pPara)
     584             :     {
     585           0 :         sal_uLong nPos = pDocliner->GetAbsPos( pPara );
     586           0 :         if ( pDocliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) )
     587           0 :             nPage++;
     588           0 :         pPara = pDocliner->GetParagraph( nPos - 1 );
     589             :     }
     590           0 :     SdPage* pPage = mpDoc->GetSdPage(nPage, PK_STANDARD);
     591           0 :     aLayoutName = pPage->GetLayoutName();
     592           0 :     aLayoutName.Erase(aLayoutName.SearchAscii(SD_LT_SEPARATOR));
     593             : 
     594             :     // einen eigenen Outliner erzeugen, denn:
     595             :     // der Dokument-Outliner koennte gerade vom Gliederungsmodus
     596             :     // benutzt werden;
     597             :     // der Draw-Outliner der Drawing Engine koennte zwischendurch
     598             :     // was zeichnen muessen;
     599             :     // der globale Outliner koennte in SdPage::CreatePresObj
     600             :     // benutzt werden
     601           0 :     ::Outliner* pOutliner = new ::Outliner( &mpDoc->GetItemPool(), OUTLINERMODE_OUTLINEOBJECT );
     602           0 :     pOutliner->SetStyleSheetPool((SfxStyleSheetPool*)mpDoc->GetStyleSheetPool());
     603             : 
     604             :     // Referenz-Device setzen
     605           0 :     pOutliner->SetRefDevice(SD_MOD()->GetRefDevice( *mpDocSh ));
     606           0 :     pOutliner->SetPaperSize(Size(0x7fffffff, 0x7fffffff));
     607             : 
     608           0 :     SvStream* pStream = pMedium->GetInStream();
     609             :     DBG_ASSERT( pStream, "Kein InStream!" );
     610           0 :     pStream->Seek( 0 );
     611             : 
     612           0 :     sal_uLong nErr = pOutliner->Read(*pStream, pMedium->GetBaseURL(), nFormat, mpDocSh->GetHeaderAttributes());
     613             : 
     614           0 :     if (nErr || !pOutliner->GetEditEngine().GetText().Len())
     615             :     {
     616             :         ErrorBox aErrorBox( mpWindow, (WinBits)WB_OK,
     617           0 :                   String(SdResId(STR_READ_DATA_ERROR)));
     618           0 :         aErrorBox.Execute();
     619             :     }
     620             :     else
     621             :     {
     622           0 :         sal_uLong nParaCount = pOutliner->GetParagraphCount();
     623             : 
     624             :         // fuer Fortschrittsanzeige: Anzahl der Ebene-0-Absaetze
     625           0 :         sal_uInt16 nNewPages = 0;
     626           0 :         pPara = pOutliner->GetParagraph( 0 );
     627           0 :         while (pPara)
     628             :         {
     629           0 :             sal_uLong nPos = pOutliner->GetAbsPos( pPara );
     630           0 :             if( pOutliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) )
     631           0 :                 nNewPages++;
     632           0 :             pPara = pOutliner->GetParagraph( ++nPos );
     633             :         }
     634             : 
     635           0 :         mpDocSh->SetWaitCursor( sal_False );
     636             : 
     637           0 :         SfxProgress* pProgress = new SfxProgress( mpDocSh, String( SdResId(STR_CREATE_PAGES)), nNewPages);
     638           0 :         if( pProgress )
     639           0 :             pProgress->SetState( 0, 100 );
     640             : 
     641           0 :         nNewPages = 0;
     642             : 
     643           0 :         pDocliner->GetUndoManager().EnterListAction(
     644           0 :                                     String(SdResId(STR_UNDO_INSERT_FILE)), String() );
     645             : 
     646           0 :         sal_uLong nSourcePos = 0;
     647           0 :         SfxStyleSheet* pStyleSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE );
     648           0 :         Paragraph* pSourcePara = pOutliner->GetParagraph( 0 );
     649           0 :         while (pSourcePara)
     650             :         {
     651           0 :             sal_uLong nPos = pOutliner->GetAbsPos( pSourcePara );
     652           0 :             sal_Int16 nDepth = pOutliner->GetDepth( (sal_uInt16) nPos );
     653             : 
     654             :             // den letzte Absatz nur uebernehmen, wenn er gefuellt ist
     655           0 :             if (nSourcePos < nParaCount - 1 ||
     656           0 :                 pOutliner->GetText(pSourcePara).Len() > 0)
     657             :             {
     658           0 :                 pDocliner->Insert( pOutliner->GetText(pSourcePara), nTargetPos, nDepth );
     659           0 :                 String aStyleSheetName( pStyleSheet->GetName() );
     660           0 :                 aStyleSheetName.Erase( aStyleSheetName.Len()-1, 1 );
     661           0 :                 aStyleSheetName += String::CreateFromInt32( nDepth <= 0 ? 1 : nDepth+1 );
     662           0 :                 SfxStyleSheetBasePool* pStylePool = mpDoc->GetStyleSheetPool();
     663           0 :                 SfxStyleSheet* pOutlStyle = (SfxStyleSheet*) pStylePool->Find( aStyleSheetName, pStyleSheet->GetFamily() );
     664           0 :                 pDocliner->SetStyleSheet( nTargetPos, pOutlStyle );
     665             :             }
     666             : 
     667           0 :             if( pDocliner->HasParaFlag( pSourcePara, PARAFLAG_ISPAGE ) )
     668             :             {
     669           0 :                 nNewPages++;
     670           0 :                 if( pProgress )
     671           0 :                     pProgress->SetState( nNewPages );
     672             :             }
     673             : 
     674           0 :             pSourcePara = pOutliner->GetParagraph( ++nPos );
     675           0 :             nTargetPos++;
     676           0 :             nSourcePos++;
     677             :         }
     678             : 
     679           0 :         pDocliner->GetUndoManager().LeaveListAction();
     680             : 
     681           0 :         if( pProgress )
     682           0 :             delete pProgress;
     683             : 
     684           0 :         mpDocSh->SetWaitCursor( sal_True );
     685             :     }
     686             : 
     687           0 :     delete pOutliner;
     688           0 : }
     689             : 
     690             : // -----------------------------------------------------------------------------
     691             : 
     692           0 : sal_Bool FuInsertFile::InsSDDinOlMode(SfxMedium* pMedium)
     693             : {
     694           0 :     OutlineView* pOlView = static_cast<OutlineView*>(mpView);
     695             : 
     696             :     // Outliner-Inhalte ins SdDrawDocument uebertragen
     697           0 :     pOlView->PrepareClose();
     698             : 
     699             :     // einlesen wie im Zeichenmodus
     700           0 :     if (InsSDDinDrMode(pMedium))
     701             :     {
     702           0 :         ::Outliner* pOutliner = pOlView->GetViewByWindow(mpWindow)->GetOutliner();
     703             : 
     704             :         // Benachrichtigungs-Links temporaer trennen
     705           0 :         Link aOldParagraphInsertedHdl = pOutliner->GetParaInsertedHdl();
     706           0 :         pOutliner->SetParaInsertedHdl( Link(NULL, NULL));
     707           0 :         Link aOldParagraphRemovingHdl = pOutliner->GetParaRemovingHdl();
     708           0 :         pOutliner->SetParaRemovingHdl( Link(NULL, NULL));
     709           0 :         Link aOldDepthChangedHdl      = pOutliner->GetDepthChangedHdl();
     710           0 :         pOutliner->SetDepthChangedHdl( Link(NULL, NULL));
     711           0 :         Link aOldBeginMovingHdl       = pOutliner->GetBeginMovingHdl();
     712           0 :         pOutliner->SetBeginMovingHdl( Link(NULL, NULL));
     713           0 :         Link aOldEndMovingHdl         = pOutliner->GetEndMovingHdl();
     714           0 :         pOutliner->SetEndMovingHdl( Link(NULL, NULL));
     715             : 
     716           0 :         Link aOldStatusEventHdl       = pOutliner->GetStatusEventHdl();
     717           0 :         pOutliner->SetStatusEventHdl(Link(NULL, NULL));
     718             : 
     719           0 :         pOutliner->Clear();
     720           0 :         pOlView->FillOutliner();
     721             : 
     722             :         // Links wieder setzen
     723           0 :         pOutliner->SetParaInsertedHdl(aOldParagraphInsertedHdl);
     724           0 :         pOutliner->SetParaRemovingHdl(aOldParagraphRemovingHdl);
     725           0 :         pOutliner->SetDepthChangedHdl(aOldDepthChangedHdl);
     726           0 :         pOutliner->SetBeginMovingHdl(aOldBeginMovingHdl);
     727           0 :         pOutliner->SetEndMovingHdl(aOldEndMovingHdl);
     728           0 :         pOutliner->SetStatusEventHdl(aOldStatusEventHdl);
     729             : 
     730           0 :         return sal_True;
     731             :     }
     732             :     else
     733           0 :         return sal_False;
     734             : }
     735             : 
     736             : // -----------------------------------------------------------------------------
     737             : 
     738           0 : void FuInsertFile::GetSupportedFilterVector( ::std::vector< OUString >& rFilterVector )
     739             : {
     740           0 :     SfxFilterMatcher&   rMatcher = SFX_APP()->GetFilterMatcher();
     741           0 :     const SfxFilter*    pSearchFilter = NULL;
     742             : 
     743           0 :     rFilterVector.clear();
     744             : 
     745           0 :     if( ( pSearchFilter = rMatcher.GetFilter4Mime( "text/plain" )) != NULL )
     746           0 :         rFilterVector.push_back( pSearchFilter->GetMimeType() );
     747             : 
     748           0 :     if( ( pSearchFilter = rMatcher.GetFilter4Mime( "application/rtf" ) ) != NULL )
     749           0 :         rFilterVector.push_back( pSearchFilter->GetMimeType() );
     750             : 
     751           0 :     if( ( pSearchFilter = rMatcher.GetFilter4Mime( "text/html" ) ) != NULL )
     752           0 :         rFilterVector.push_back( pSearchFilter->GetMimeType() );
     753           0 : }
     754             : 
     755           9 : } // end of namespace sd
     756             : 
     757             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10