LCOV - code coverage report
Current view: top level - sc/source/ui/docshell - tablink.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 156 282 55.3 %
Date: 2015-06-13 12:38:46 Functions: 18 32 56.2 %
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             : #include <sfx2/sfxsids.hrc>
      21             : #include <sfx2/app.hxx>
      22             : #include <svl/itemset.hxx>
      23             : #include <svl/stritem.hxx>
      24             : #include <sfx2/docfile.hxx>
      25             : #include <sfx2/docfilt.hxx>
      26             : #include <sfx2/fcontnr.hxx>
      27             : #include <sfx2/linkmgr.hxx>
      28             : #include <tools/urlobj.hxx>
      29             : #include <unotools/transliterationwrapper.hxx>
      30             : 
      31             : #include "tablink.hxx"
      32             : 
      33             : #include "scextopt.hxx"
      34             : #include "table.hxx"
      35             : #include "document.hxx"
      36             : #include "docsh.hxx"
      37             : #include "globstr.hrc"
      38             : #include "undoblk.hxx"
      39             : #include "undotab.hxx"
      40             : #include "global.hxx"
      41             : #include "hints.hxx"
      42             : #include "dociter.hxx"
      43             : #include <formula/opcode.hxx>
      44             : #include "formulacell.hxx"
      45             : #include "formulaiter.hxx"
      46             : #include "tokenarray.hxx"
      47             : 
      48           2 : struct TableLink_Impl
      49             : {
      50             :     ScDocShell*          m_pDocSh;
      51             :     VclPtr<vcl::Window>  m_pOldParent;
      52             :     Link<>               m_aEndEditLink;
      53             : 
      54           2 :     TableLink_Impl() : m_pDocSh( NULL ), m_pOldParent( NULL ) {}
      55             : };
      56             : 
      57          20 : TYPEINIT1(ScTableLink, ::sfx2::SvBaseLink);
      58             : 
      59           2 : ScTableLink::ScTableLink(ScDocShell* pDocSh, const OUString& rFile,
      60             :                             const OUString& rFilter, const OUString& rOpt,
      61             :                             sal_uLong nRefresh ):
      62             :     ::sfx2::SvBaseLink(SfxLinkUpdateMode::ONCALL,SotClipboardFormatId::SIMPLE_FILE),
      63             :     ScRefreshTimer( nRefresh ),
      64           2 :     pImpl( new TableLink_Impl ),
      65             :     aFileName(rFile),
      66             :     aFilterName(rFilter),
      67             :     aOptions(rOpt),
      68             :     bInCreate( false ),
      69             :     bInEdit( false ),
      70             :     bAddUndo( true ),
      71           4 :     bDoPaint( true )
      72             : {
      73           2 :     pImpl->m_pDocSh = pDocSh;
      74           2 : }
      75             : 
      76           0 : ScTableLink::ScTableLink(SfxObjectShell* pShell, const OUString& rFile,
      77             :                             const OUString& rFilter, const OUString& rOpt,
      78             :                             sal_uLong nRefresh ):
      79             :     ::sfx2::SvBaseLink(SfxLinkUpdateMode::ONCALL,SotClipboardFormatId::SIMPLE_FILE),
      80             :     ScRefreshTimer( nRefresh ),
      81           0 :     pImpl( new TableLink_Impl ),
      82             :     aFileName(rFile),
      83             :     aFilterName(rFilter),
      84             :     aOptions(rOpt),
      85             :     bInCreate( false ),
      86             :     bInEdit( false ),
      87             :     bAddUndo( true ),
      88           0 :     bDoPaint( true )
      89             : {
      90           0 :     pImpl->m_pDocSh = static_cast< ScDocShell* >( pShell );
      91           0 :     SetRefreshHandler( LINK( this, ScTableLink, RefreshHdl ) );
      92           0 :     SetRefreshControl( &pImpl->m_pDocSh->GetDocument().GetRefreshTimerControlAddress() );
      93           0 : }
      94             : 
      95           6 : ScTableLink::~ScTableLink()
      96             : {
      97             :     // Verbindung aufheben
      98             : 
      99           2 :     StopRefreshTimer();
     100           2 :     OUString aEmpty;
     101           2 :     ScDocument& rDoc = pImpl->m_pDocSh->GetDocument();
     102           2 :     SCTAB nCount = rDoc.GetTableCount();
     103           2 :     for (SCTAB nTab=0; nTab<nCount; nTab++)
     104           0 :         if (rDoc.IsLinked(nTab) && aFileName.equals(rDoc.GetLinkDoc(nTab)))
     105           0 :             rDoc.SetLink( nTab, SC_LINK_NONE, aEmpty, aEmpty, aEmpty, aEmpty, 0 );
     106           2 :     delete pImpl;
     107           4 : }
     108             : 
     109           0 : void ScTableLink::Edit( vcl::Window* pParent, const Link<>& rEndEditHdl )
     110             : {
     111             :     //  DefModalDialogParent setzen, weil evtl. aus der DocShell beim ConvertFrom
     112             :     //  ein Optionen-Dialog kommt...
     113             : 
     114           0 :     pImpl->m_aEndEditLink = rEndEditHdl;
     115           0 :     pImpl->m_pOldParent = Application::GetDefDialogParent();
     116           0 :     if (pParent)
     117           0 :         Application::SetDefDialogParent(pParent);
     118             : 
     119           0 :     bInEdit = true;
     120           0 :     SvBaseLink::Edit( pParent, LINK( this, ScTableLink, TableEndEditHdl ) );
     121           0 : }
     122             : 
     123           4 : ::sfx2::SvBaseLink::UpdateResult ScTableLink::DataChanged(
     124             :     const OUString&, const ::com::sun::star::uno::Any& )
     125             : {
     126           4 :     sfx2::LinkManager* pLinkManager=pImpl->m_pDocSh->GetDocument().GetLinkManager();
     127           4 :     if (pLinkManager!=NULL)
     128             :     {
     129           8 :         OUString aFile, aFilter;
     130           4 :         sfx2::LinkManager::GetDisplayNames(this, 0, &aFile, NULL, &aFilter);
     131             : 
     132             :         //  the file dialog returns the filter name with the application prefix
     133             :         //  -> remove prefix
     134           4 :         ScDocumentLoader::RemoveAppPrefix( aFilter );
     135             : 
     136           4 :         if (!bInCreate)
     137           6 :             Refresh( aFile, aFilter, NULL, GetRefreshDelay() ); // don't load twice
     138             :     }
     139           4 :     return SUCCESS;
     140             : }
     141             : 
     142           0 : void ScTableLink::Closed()
     143             : {
     144             :     // Verknuepfung loeschen: Undo
     145           0 :     ScDocument& rDoc = pImpl->m_pDocSh->GetDocument();
     146           0 :     bool bUndo (rDoc.IsUndoEnabled());
     147             : 
     148           0 :     if (bAddUndo && bUndo)
     149             :     {
     150           0 :         pImpl->m_pDocSh->GetUndoManager()->AddUndoAction(
     151           0 :                 new ScUndoRemoveLink( pImpl->m_pDocSh, aFileName ) );
     152             : 
     153           0 :         bAddUndo = false;   // nur einmal
     154             :     }
     155             : 
     156             :     // Verbindung wird im dtor aufgehoben
     157             : 
     158           0 :     SvBaseLink::Closed();
     159           0 : }
     160             : 
     161           0 : bool ScTableLink::IsUsed() const
     162             : {
     163           0 :     return pImpl->m_pDocSh->GetDocument().HasLink( aFileName, aFilterName, aOptions );
     164             : }
     165             : 
     166           2 : bool ScTableLink::Refresh(const OUString& rNewFile, const OUString& rNewFilter,
     167             :                             const OUString* pNewOptions, sal_uLong nNewRefresh )
     168             : {
     169             :     //  Dokument laden
     170             : 
     171           2 :     if (rNewFile.isEmpty() || rNewFilter.isEmpty())
     172           0 :         return false;
     173             : 
     174           2 :     OUString aNewUrl = ScGlobal::GetAbsDocName(rNewFile, pImpl->m_pDocSh);
     175           2 :     bool bNewUrlName = !aFileName.equals(aNewUrl);
     176             : 
     177           2 :     const SfxFilter* pFilter = pImpl->m_pDocSh->GetFactory().GetFilterContainer()->GetFilter4FilterName(rNewFilter);
     178           2 :     if (!pFilter)
     179           0 :         return false;
     180             : 
     181           2 :     ScDocument& rDoc = pImpl->m_pDocSh->GetDocument();
     182           2 :     rDoc.SetInLinkUpdate( true );
     183             : 
     184           2 :     bool bUndo(rDoc.IsUndoEnabled());
     185             : 
     186             :     //  wenn neuer Filter ausgewaehlt wurde, Optionen vergessen
     187           2 :     if (!aFilterName.equals(rNewFilter))
     188           0 :         aOptions.clear();
     189           2 :     if ( pNewOptions )                  // Optionen hart angegeben?
     190           0 :         aOptions = *pNewOptions;
     191             : 
     192             :     //  ItemSet immer anlegen, damit die DocShell die Optionen setzen kann
     193           2 :     SfxItemSet* pSet = new SfxAllItemSet( SfxGetpApp()->GetPool() );
     194           2 :     if (!aOptions.isEmpty())
     195           0 :         pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, aOptions ) );
     196             : 
     197           2 :     SfxMedium* pMed = new SfxMedium(aNewUrl, STREAM_STD_READ, pFilter, pSet);
     198             : 
     199           2 :     if ( bInEdit )                              // only if using the edit dialog,
     200           0 :         pMed->UseInteractionHandler(true);    // enable the filter options dialog
     201             : 
     202             :     // aRef->DoClose() will be called explicitly, but it is still more safe to use SfxObjectShellLock here
     203           2 :     ScDocShell* pSrcShell = new ScDocShell(SfxModelFlags::EMBEDDED_OBJECT | SfxModelFlags::DISABLE_EMBEDDED_SCRIPTS);
     204           4 :     SfxObjectShellLock aRef = pSrcShell;
     205           2 :     pSrcShell->DoLoad(pMed);
     206             : 
     207             :     // Optionen koennten gesetzt worden sein
     208           4 :     OUString aNewOpt = ScDocumentLoader::GetOptions(*pMed);
     209           2 :     if (aNewOpt.isEmpty())
     210           2 :         aNewOpt = aOptions;
     211             : 
     212             :     //  Undo...
     213             : 
     214           2 :     ScDocument* pUndoDoc = NULL;
     215           2 :     bool bFirst = true;
     216           2 :     if (bAddUndo && bUndo)
     217           2 :         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     218             : 
     219             :     //  Tabellen kopieren
     220             : 
     221           4 :     ScDocShellModificator aModificator( *pImpl->m_pDocSh );
     222             : 
     223           2 :     bool bNotFound = false;
     224           2 :     ScDocument& rSrcDoc = pSrcShell->GetDocument();
     225             : 
     226             :     //  from text filters that don't set the table name,
     227             :     //  use the one table regardless of link table name
     228           2 :     bool bAutoTab = (rSrcDoc.GetTableCount() == 1) &&
     229           2 :                     ScDocShell::HasAutomaticTableName( rNewFilter );
     230             : 
     231           2 :     SCTAB nCount = rDoc.GetTableCount();
     232           4 :     for (SCTAB nTab=0; nTab<nCount; nTab++)
     233             :     {
     234           2 :         sal_uInt8 nMode = rDoc.GetLinkMode(nTab);
     235           2 :         if (nMode && aFileName.equals(rDoc.GetLinkDoc(nTab)))
     236             :         {
     237           2 :             OUString aTabName = rDoc.GetLinkTab(nTab);
     238             : 
     239             :             //  Undo
     240             : 
     241           2 :             if (bAddUndo && bUndo)
     242             :             {
     243           2 :                 if (bFirst)
     244           2 :                     pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, true );
     245             :                 else
     246           0 :                     pUndoDoc->AddUndoTab( nTab, nTab, true, true );
     247           2 :                 bFirst = false;
     248           2 :                 ScRange aRange(0,0,nTab,MAXCOL,MAXROW,nTab);
     249           2 :                 rDoc.CopyToDocument(aRange, IDF_ALL, false, pUndoDoc);
     250           2 :                 pUndoDoc->TransferDrawPage( &rDoc, nTab, nTab );
     251             :                 pUndoDoc->SetLink( nTab, nMode, aFileName, aFilterName,
     252           2 :                                    aOptions, aTabName, GetRefreshDelay() );
     253           2 :                 pUndoDoc->SetTabBgColor( nTab, rDoc.GetTabBgColor(nTab) );
     254             :             }
     255             : 
     256             :             //  Tabellenname einer ExtDocRef anpassen
     257             : 
     258           2 :             if ( bNewUrlName && nMode == SC_LINK_VALUE )
     259             :             {
     260           0 :                 OUString aName;
     261           0 :                 rDoc.GetName( nTab, aName );
     262           0 :                 if ( ScGlobal::GetpTransliteration()->isEqual(
     263           0 :                         ScGlobal::GetDocTabName( aFileName, aTabName ), aName ) )
     264             :                 {
     265             :                     rDoc.RenameTab( nTab,
     266             :                         ScGlobal::GetDocTabName( aNewUrl, aTabName ),
     267           0 :                         false, true );  // kein RefUpdate, kein ValidTabName
     268           0 :                 }
     269             :             }
     270             : 
     271             :             //  kopieren
     272             : 
     273           2 :             SCTAB nSrcTab = 0;
     274           2 :             bool bFound = false;
     275             :             /*  #i71497# check if external document is loaded successfully,
     276             :                 otherwise we may find the empty default sheet "Sheet1" in
     277             :                 rSrcDoc, even if the document does not exist. */
     278           2 :             if( pMed->GetError() == 0 )
     279             :             {
     280             :                 // no sheet name -> use first sheet
     281           2 :                 if ( !aTabName.isEmpty() && !bAutoTab )
     282           2 :                     bFound = rSrcDoc.GetTable( aTabName, nSrcTab );
     283             :                 else
     284           0 :                     bFound = true;
     285             :             }
     286             : 
     287           2 :             if (bFound)
     288             :                 rDoc.TransferTab( &rSrcDoc, nSrcTab, nTab, false,       // nicht neu einfuegen
     289           2 :                                         (nMode == SC_LINK_VALUE) );     // nur Werte?
     290             :             else
     291             :             {
     292           0 :                 rDoc.DeleteAreaTab( 0,0,MAXCOL,MAXROW, nTab, IDF_ALL );
     293             : 
     294           0 :                 bool bShowError = true;
     295           0 :                 if ( nMode == SC_LINK_VALUE )
     296             :                 {
     297             :                     //  Value link (used with external references in formulas):
     298             :                     //  Look for formulas that reference the sheet, and put errors in the referenced cells.
     299             : 
     300           0 :                     ScRangeList aErrorCells;        // cells on the linked sheets that need error values
     301             : 
     302           0 :                     ScCellIterator aIter(&rDoc, ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB));          // all sheets
     303           0 :                     for (bool bHas = aIter.first(); bHas; bHas = aIter.next())
     304             :                     {
     305           0 :                         if (aIter.getType() != CELLTYPE_FORMULA)
     306           0 :                             continue;
     307             : 
     308           0 :                         ScFormulaCell* pCell = aIter.getFormulaCell();
     309           0 :                         ScDetectiveRefIter aRefIter(pCell);
     310           0 :                         ScRange aRefRange;
     311           0 :                         while ( aRefIter.GetNextRef( aRefRange ) )
     312             :                         {
     313           0 :                             if ( aRefRange.aStart.Tab() <= nTab && aRefRange.aEnd.Tab() >= nTab )
     314             :                             {
     315             :                                 // use first cell of range references (don't fill potentially large ranges)
     316             : 
     317           0 :                                 aErrorCells.Join( ScRange( aRefRange.aStart ) );
     318             :                             }
     319             :                         }
     320             :                     }
     321             : 
     322           0 :                     size_t nRanges = aErrorCells.size();
     323           0 :                     if ( nRanges )                          // found any?
     324             :                     {
     325           0 :                         ScTokenArray aTokenArr;
     326           0 :                         aTokenArr.AddOpCode( ocNotAvail );
     327           0 :                         aTokenArr.AddOpCode( ocOpen );
     328           0 :                         aTokenArr.AddOpCode( ocClose );
     329           0 :                         aTokenArr.AddOpCode( ocStop );
     330             : 
     331           0 :                         for (size_t nPos=0; nPos < nRanges; nPos++)
     332             :                         {
     333           0 :                             const ScRange* pRange = aErrorCells[ nPos ];
     334           0 :                             SCCOL nStartCol = pRange->aStart.Col();
     335           0 :                             SCROW nStartRow = pRange->aStart.Row();
     336           0 :                             SCCOL nEndCol = pRange->aEnd.Col();
     337           0 :                             SCROW nEndRow = pRange->aEnd.Row();
     338           0 :                             for (SCROW nRow=nStartRow; nRow<=nEndRow; nRow++)
     339           0 :                                 for (SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++)
     340             :                                 {
     341           0 :                                     ScAddress aDestPos( nCol, nRow, nTab );
     342           0 :                                     rDoc.SetFormula(aDestPos, aTokenArr);
     343             :                                 }
     344             :                         }
     345             : 
     346           0 :                         bShowError = false;
     347           0 :                     }
     348             :                     // if no references were found, insert error message (don't leave the sheet empty)
     349             :                 }
     350             : 
     351           0 :                 if ( bShowError )
     352             :                 {
     353             :                     //  Normal link or no references: put error message on sheet.
     354             : 
     355           0 :                     rDoc.SetString( 0,0,nTab, ScGlobal::GetRscString(STR_LINKERROR) );
     356           0 :                     rDoc.SetString( 0,1,nTab, ScGlobal::GetRscString(STR_LINKERRORFILE) );
     357           0 :                     rDoc.SetString( 1,1,nTab, aNewUrl );
     358           0 :                     rDoc.SetString( 0,2,nTab, ScGlobal::GetRscString(STR_LINKERRORTAB) );
     359           0 :                     rDoc.SetString( 1,2,nTab, aTabName );
     360             :                 }
     361             : 
     362           0 :                 bNotFound = true;
     363             :             }
     364             : 
     365           6 :             if ( bNewUrlName || !aFilterName.equals(rNewFilter) ||
     366           8 :                     !aOptions.equals(aNewOpt) || pNewOptions ||
     367           2 :                     nNewRefresh != GetRefreshDelay() )
     368             :                 rDoc.SetLink( nTab, nMode, aNewUrl, rNewFilter, aNewOpt,
     369           0 :                     aTabName, nNewRefresh );
     370             :         }
     371             :     }
     372             : 
     373             :     //  neue Einstellungen merken
     374             : 
     375           2 :     if ( bNewUrlName )
     376           0 :         aFileName = aNewUrl;
     377           2 :     if (!aFilterName.equals(rNewFilter))
     378           0 :         aFilterName = rNewFilter;
     379           2 :     if (!aOptions.equals(aNewOpt))
     380           0 :         aOptions = aNewOpt;
     381             : 
     382             :     //  aufraeumen
     383             : 
     384           2 :     aRef->DoClose();
     385             : 
     386             :     //  Undo
     387             : 
     388           2 :     if (bAddUndo && bUndo)
     389           2 :         pImpl->m_pDocSh->GetUndoManager()->AddUndoAction(
     390           2 :                     new ScUndoRefreshLink( pImpl->m_pDocSh, pUndoDoc ) );
     391             : 
     392             :     //  Paint (koennen mehrere Tabellen sein)
     393             : 
     394           2 :     if (bDoPaint)
     395             :     {
     396             :         pImpl->m_pDocSh->PostPaint( ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB),
     397           2 :                                     PAINT_GRID | PAINT_TOP | PAINT_LEFT | PAINT_EXTRAS );
     398           2 :         aModificator.SetDocumentModified();
     399             :     }
     400             : 
     401             :     if (bNotFound)
     402             :     {
     403             :         //! Fehler ausgeben ?
     404             :     }
     405             : 
     406           2 :     rDoc.SetInLinkUpdate( false );
     407             : 
     408             :     //  notify Uno objects (for XRefreshListener)
     409             :     //! also notify Uno objects if file name was changed!
     410           4 :     ScLinkRefreshedHint aHint;
     411           2 :     aHint.SetSheetLink( aFileName );
     412           2 :     rDoc.BroadcastUno( aHint );
     413             : 
     414           4 :     return true;
     415             : }
     416             : 
     417           0 : IMPL_LINK_NOARG_TYPED(ScTableLink, RefreshHdl, Timer *, void)
     418             : {
     419           0 :     Refresh( aFileName, aFilterName, NULL, GetRefreshDelay() );
     420           0 : }
     421             : 
     422           0 : IMPL_LINK( ScTableLink, TableEndEditHdl, ::sfx2::SvBaseLink*, pLink )
     423             : {
     424           0 :     if ( pImpl->m_aEndEditLink.IsSet() )
     425           0 :         pImpl->m_aEndEditLink.Call( pLink );
     426           0 :     bInEdit = false;
     427           0 :     Application::SetDefDialogParent( pImpl->m_pOldParent );
     428           0 :     return 0;
     429             : }
     430             : 
     431             : // === ScDocumentLoader ==================================================
     432             : 
     433           7 : OUString ScDocumentLoader::GetOptions( SfxMedium& rMedium )
     434             : {
     435           7 :     SfxItemSet* pSet = rMedium.GetItemSet();
     436             :     const SfxPoolItem* pItem;
     437           7 :     if ( pSet && SfxItemState::SET == pSet->GetItemState( SID_FILE_FILTEROPTIONS, true, &pItem ) )
     438           0 :         return static_cast<const SfxStringItem*>(pItem)->GetValue();
     439             : 
     440           7 :     return EMPTY_OUSTRING;
     441             : }
     442             : 
     443          11 : bool ScDocumentLoader::GetFilterName( const OUString& rFileName,
     444             :                                       OUString& rFilter, OUString& rOptions,
     445             :                                       bool bWithContent, bool bWithInteraction )
     446             : {
     447          11 :     TypeId aScType = TYPE(ScDocShell);
     448          11 :     SfxObjectShell* pDocSh = SfxObjectShell::GetFirst( &aScType );
     449          28 :     while ( pDocSh )
     450             :     {
     451           6 :         if ( pDocSh->HasName() )
     452             :         {
     453           0 :             SfxMedium* pMed = pDocSh->GetMedium();
     454           0 :             if ( pMed->GetName().equals(rFileName) )
     455             :             {
     456           0 :                 rFilter = pMed->GetFilter()->GetFilterName();
     457           0 :                 rOptions = GetOptions(*pMed);
     458           0 :                 return true;
     459             :             }
     460             :         }
     461           6 :         pDocSh = SfxObjectShell::GetNext( *pDocSh, &aScType );
     462             :     }
     463             : 
     464          11 :     INetURLObject aUrl( rFileName );
     465          11 :     INetProtocol eProt = aUrl.GetProtocol();
     466          11 :     if ( eProt == INetProtocol::NotValid )         // invalid URL?
     467           0 :         return false;                           // abort without creating a medium
     468             : 
     469             :     //  Filter-Detection
     470             : 
     471          11 :     const SfxFilter* pSfxFilter = NULL;
     472          11 :     SfxMedium* pMedium = new SfxMedium( rFileName, STREAM_STD_READ );
     473          11 :     if ( pMedium->GetError() == ERRCODE_NONE )
     474             :     {
     475          11 :         if ( bWithInteraction )
     476           0 :             pMedium->UseInteractionHandler(true);   // #i73992# no longer called from GuessFilter
     477             : 
     478          11 :         SfxFilterMatcher aMatcher("scalc");
     479          11 :         if( bWithContent )
     480          11 :             aMatcher.GuessFilter( *pMedium, &pSfxFilter );
     481             :         else
     482           0 :             aMatcher.GuessFilterIgnoringContent( *pMedium, &pSfxFilter );
     483             :     }
     484             : 
     485          11 :     bool bOK = false;
     486          11 :     if ( pMedium->GetError() == ERRCODE_NONE )
     487             :     {
     488           9 :         if ( pSfxFilter )
     489           6 :             rFilter = pSfxFilter->GetFilterName();
     490             :         else
     491           3 :             rFilter = ScDocShell::GetOwnFilterName();       //  sonst Calc-Datei
     492           9 :         bOK = !rFilter.isEmpty();
     493             :     }
     494             : 
     495          11 :     delete pMedium;
     496          11 :     return bOK;
     497             : }
     498             : 
     499          38 : void ScDocumentLoader::RemoveAppPrefix( OUString& rFilterName )
     500             : {
     501          38 :     OUString aAppPrefix( STRING_SCAPP ": ");
     502          38 :     if (rFilterName.startsWith( aAppPrefix))
     503           0 :         rFilterName = rFilterName.copy( aAppPrefix.getLength());
     504          38 : }
     505             : 
     506           5 : SfxMedium* ScDocumentLoader::CreateMedium( const OUString& rFileName, const SfxFilter* pFilter,
     507             :         const OUString& rOptions )
     508             : {
     509             :     // Always create SfxItemSet so ScDocShell can set options.
     510           5 :     SfxItemSet* pSet = new SfxAllItemSet( SfxGetpApp()->GetPool() );
     511           5 :     if ( !rOptions.isEmpty() )
     512           0 :         pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, rOptions ) );
     513             : 
     514           5 :     return new SfxMedium( rFileName, STREAM_STD_READ, pFilter, pSet );
     515             : }
     516             : 
     517           1 : ScDocumentLoader::ScDocumentLoader( const OUString& rFileName,
     518             :                                     OUString& rFilterName, OUString& rOptions,
     519             :                                     sal_uInt32 nRekCnt, bool bWithInteraction ) :
     520             :         pDocShell(0),
     521           1 :         pMedium(0)
     522             : {
     523           1 :     if ( rFilterName.isEmpty() )
     524           1 :         GetFilterName( rFileName, rFilterName, rOptions, true, bWithInteraction );
     525             : 
     526           1 :     const SfxFilter* pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( rFilterName );
     527             : 
     528           1 :     pMedium = CreateMedium( rFileName, pFilter, rOptions);
     529           1 :     if ( pMedium->GetError() != ERRCODE_NONE )
     530           1 :         return ;
     531             : 
     532           1 :     if ( bWithInteraction )
     533           0 :         pMedium->UseInteractionHandler( true ); // to enable the filter options dialog
     534             : 
     535           1 :     pDocShell = new ScDocShell( SfxModelFlags::EMBEDDED_OBJECT | SfxModelFlags::DISABLE_EMBEDDED_SCRIPTS );
     536           1 :     aRef = pDocShell;
     537             : 
     538           1 :     ScDocument& rDoc = pDocShell->GetDocument();
     539           1 :     ScExtDocOptions*    pExtDocOpt = rDoc.GetExtDocOptions();
     540           1 :     if( !pExtDocOpt )
     541             :     {
     542           1 :         pExtDocOpt = new ScExtDocOptions;
     543           1 :         rDoc.SetExtDocOptions( pExtDocOpt );
     544             :     }
     545           1 :     pExtDocOpt->GetDocSettings().mnLinkCnt = nRekCnt;
     546             : 
     547           1 :     pDocShell->DoLoad( pMedium );
     548             : 
     549           1 :     OUString aNew = GetOptions(*pMedium);         // Optionen werden beim Laden per Dialog gesetzt
     550           1 :     if (!aNew.isEmpty() && aNew != rOptions)
     551           0 :         rOptions = aNew;
     552             : }
     553             : 
     554           2 : ScDocumentLoader::~ScDocumentLoader()
     555             : {
     556           1 :     if ( aRef.Is() )
     557           1 :         aRef->DoClose();
     558           0 :     else if ( pMedium )
     559           0 :         delete pMedium;
     560           1 : }
     561             : 
     562           0 : void ScDocumentLoader::ReleaseDocRef()
     563             : {
     564           0 :     if ( aRef.Is() )
     565             :     {
     566             :         //  release reference without calling DoClose - caller must
     567             :         //  have another reference to the doc and call DoClose later
     568             : 
     569           0 :         pDocShell = NULL;
     570           0 :         pMedium = NULL;
     571           0 :         aRef.Clear();
     572             :     }
     573           0 : }
     574             : 
     575           0 : ScDocument* ScDocumentLoader::GetDocument()
     576             : {
     577           0 :     return pDocShell ? &pDocShell->GetDocument() : 0;
     578             : }
     579             : 
     580           0 : bool ScDocumentLoader::IsError() const
     581             : {
     582           0 :     if ( pDocShell && pMedium )
     583           0 :         return pMedium->GetError() != ERRCODE_NONE;
     584             :     else
     585           0 :         return true;
     586             : }
     587             : 
     588           0 : OUString ScDocumentLoader::GetTitle() const
     589             : {
     590           0 :     if ( pDocShell )
     591           0 :         return pDocShell->GetTitle();
     592             :     else
     593           0 :         return EMPTY_OUSTRING;
     594         156 : }
     595             : 
     596             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11