LCOV - code coverage report
Current view: top level - sc/source/ui/docshell - tablink.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 281 0.0 %
Date: 2014-04-14 Functions: 0 31 0.0 %
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             : struct TableLink_Impl
      49             : {
      50             :     ScDocShell* m_pDocSh;
      51             :     Window*     m_pOldParent;
      52             :     Link        m_aEndEditLink;
      53             : 
      54           0 :     TableLink_Impl() : m_pDocSh( NULL ), m_pOldParent( NULL ) {}
      55             : };
      56             : 
      57           0 : TYPEINIT1(ScTableLink, ::sfx2::SvBaseLink);
      58             : 
      59           0 : ScTableLink::ScTableLink(ScDocShell* pDocSh, const OUString& rFile,
      60             :                             const OUString& rFilter, const OUString& rOpt,
      61             :                             sal_uLong nRefresh ):
      62             :     ::sfx2::SvBaseLink(sfx2::LINKUPDATE_ONCALL,FORMAT_FILE),
      63             :     ScRefreshTimer( nRefresh ),
      64           0 :     pImpl( new TableLink_Impl ),
      65             :     aFileName(rFile),
      66             :     aFilterName(rFilter),
      67             :     aOptions(rOpt),
      68             :     bInCreate( false ),
      69             :     bInEdit( false ),
      70             :     bAddUndo( true ),
      71           0 :     bDoPaint( true )
      72             : {
      73           0 :     pImpl->m_pDocSh = pDocSh;
      74           0 : }
      75             : 
      76           0 : ScTableLink::ScTableLink(SfxObjectShell* pShell, const OUString& rFile,
      77             :                             const OUString& rFilter, const OUString& rOpt,
      78             :                             sal_uLong nRefresh ):
      79             :     ::sfx2::SvBaseLink(sfx2::LINKUPDATE_ONCALL,FORMAT_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           0 : ScTableLink::~ScTableLink()
      96             : {
      97             :     // Verbindung aufheben
      98             : 
      99           0 :     StopRefreshTimer();
     100           0 :     OUString aEmpty;
     101           0 :     ScDocument* pDoc = pImpl->m_pDocSh->GetDocument();
     102           0 :     SCTAB nCount = pDoc->GetTableCount();
     103           0 :     for (SCTAB nTab=0; nTab<nCount; nTab++)
     104           0 :         if (pDoc->IsLinked(nTab) && aFileName.equals(pDoc->GetLinkDoc(nTab)))
     105           0 :             pDoc->SetLink( nTab, SC_LINK_NONE, aEmpty, aEmpty, aEmpty, aEmpty, 0 );
     106           0 :     delete pImpl;
     107           0 : }
     108             : 
     109           0 : void ScTableLink::Edit( 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           0 : ::sfx2::SvBaseLink::UpdateResult ScTableLink::DataChanged(
     124             :     const OUString&, const ::com::sun::star::uno::Any& )
     125             : {
     126           0 :     sfx2::LinkManager* pLinkManager=pImpl->m_pDocSh->GetDocument()->GetLinkManager();
     127           0 :     if (pLinkManager!=NULL)
     128             :     {
     129           0 :         OUString aFile, aFilter;
     130           0 :         pLinkManager->GetDisplayNames(this, 0, &aFile, NULL, &aFilter);
     131             : 
     132             :         //  the file dialog returns the filter name with the application prefix
     133             :         //  -> remove prefix
     134           0 :         ScDocumentLoader::RemoveAppPrefix( aFilter );
     135             : 
     136           0 :         if (!bInCreate)
     137           0 :             Refresh( aFile, aFilter, NULL, GetRefreshDelay() ); // don't load twice
     138             :     }
     139           0 :     return SUCCESS;
     140             : }
     141             : 
     142           0 : void ScTableLink::Closed()
     143             : {
     144             :     // Verknuepfung loeschen: Undo
     145           0 :     ScDocument* pDoc = pImpl->m_pDocSh->GetDocument();
     146           0 :     sal_Bool bUndo (pDoc->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           0 : bool ScTableLink::Refresh(const OUString& rNewFile, const OUString& rNewFilter,
     167             :                             const OUString* pNewOptions, sal_uLong nNewRefresh )
     168             : {
     169             :     //  Dokument laden
     170             : 
     171           0 :     if (rNewFile.isEmpty() || rNewFilter.isEmpty())
     172           0 :         return false;
     173             : 
     174           0 :     OUString aNewUrl = ScGlobal::GetAbsDocName(rNewFile, pImpl->m_pDocSh);
     175           0 :     bool bNewUrlName = !aFileName.equals(aNewUrl);
     176             : 
     177           0 :     const SfxFilter* pFilter = pImpl->m_pDocSh->GetFactory().GetFilterContainer()->GetFilter4FilterName(rNewFilter);
     178           0 :     if (!pFilter)
     179           0 :         return false;
     180             : 
     181           0 :     ScDocument* pDoc = pImpl->m_pDocSh->GetDocument();
     182           0 :     pDoc->SetInLinkUpdate( true );
     183             : 
     184           0 :     sal_Bool bUndo(pDoc->IsUndoEnabled());
     185             : 
     186             :     //  wenn neuer Filter ausgewaehlt wurde, Optionen vergessen
     187           0 :     if (!aFilterName.equals(rNewFilter))
     188           0 :         aOptions = OUString();
     189           0 :     if ( pNewOptions )                  // Optionen hart angegeben?
     190           0 :         aOptions = *pNewOptions;
     191             : 
     192             :     //  ItemSet immer anlegen, damit die DocShell die Optionen setzen kann
     193           0 :     SfxItemSet* pSet = new SfxAllItemSet( SFX_APP()->GetPool() );
     194           0 :     if (!aOptions.isEmpty())
     195           0 :         pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, aOptions ) );
     196             : 
     197           0 :     SfxMedium* pMed = new SfxMedium(aNewUrl, STREAM_STD_READ, pFilter, pSet);
     198             : 
     199           0 :     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           0 :     ScDocShell* pSrcShell = new ScDocShell(SFX_CREATE_MODE_INTERNAL);
     204           0 :     SfxObjectShellLock aRef = pSrcShell;
     205           0 :     pSrcShell->DoLoad(pMed);
     206             : 
     207             :     // Optionen koennten gesetzt worden sein
     208           0 :     OUString aNewOpt = ScDocumentLoader::GetOptions(*pMed);
     209           0 :     if (aNewOpt.isEmpty())
     210           0 :         aNewOpt = aOptions;
     211             : 
     212             :     //  Undo...
     213             : 
     214           0 :     ScDocument* pUndoDoc = NULL;
     215           0 :     sal_Bool bFirst = true;
     216           0 :     if (bAddUndo && bUndo)
     217           0 :         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     218             : 
     219             :     //  Tabellen kopieren
     220             : 
     221           0 :     ScDocShellModificator aModificator( *pImpl->m_pDocSh );
     222             : 
     223           0 :     sal_Bool bNotFound = false;
     224           0 :     ScDocument* pSrcDoc = 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           0 :     sal_Bool bAutoTab = (pSrcDoc->GetTableCount() == 1) &&
     229           0 :                     ScDocShell::HasAutomaticTableName( rNewFilter );
     230             : 
     231           0 :     SCTAB nCount = pDoc->GetTableCount();
     232           0 :     for (SCTAB nTab=0; nTab<nCount; nTab++)
     233             :     {
     234           0 :         sal_uInt8 nMode = pDoc->GetLinkMode(nTab);
     235           0 :         if (nMode && aFileName.equals(pDoc->GetLinkDoc(nTab)))
     236             :         {
     237           0 :             OUString aTabName = pDoc->GetLinkTab(nTab);
     238             : 
     239             :             //  Undo
     240             : 
     241           0 :             if (bAddUndo && bUndo)
     242             :             {
     243           0 :                 if (bFirst)
     244           0 :                     pUndoDoc->InitUndo( pDoc, nTab, nTab, true, true );
     245             :                 else
     246           0 :                     pUndoDoc->AddUndoTab( nTab, nTab, true, true );
     247           0 :                 bFirst = false;
     248           0 :                 ScRange aRange(0,0,nTab,MAXCOL,MAXROW,nTab);
     249           0 :                 pDoc->CopyToDocument(aRange, IDF_ALL, false, pUndoDoc);
     250           0 :                 pUndoDoc->TransferDrawPage( pDoc, nTab, nTab );
     251             :                 pUndoDoc->SetLink( nTab, nMode, aFileName, aFilterName,
     252           0 :                                    aOptions, aTabName, GetRefreshDelay() );
     253           0 :                                 pUndoDoc->SetTabBgColor( nTab, pDoc->GetTabBgColor(nTab) );
     254             :             }
     255             : 
     256             :             //  Tabellenname einer ExtDocRef anpassen
     257             : 
     258           0 :             if ( bNewUrlName && nMode == SC_LINK_VALUE )
     259             :             {
     260           0 :                 OUString aName;
     261           0 :                 pDoc->GetName( nTab, aName );
     262           0 :                 if ( ScGlobal::GetpTransliteration()->isEqual(
     263           0 :                         ScGlobal::GetDocTabName( aFileName, aTabName ), aName ) )
     264             :                 {
     265             :                     pDoc->RenameTab( nTab,
     266             :                         ScGlobal::GetDocTabName( aNewUrl, aTabName ),
     267           0 :                         false, true );  // kein RefUpdate, kein ValidTabName
     268           0 :                 }
     269             :             }
     270             : 
     271             :             //  kopieren
     272             : 
     273           0 :             SCTAB nSrcTab = 0;
     274           0 :             bool bFound = false;
     275             :             /*  #i71497# check if external document is loaded successfully,
     276             :                 otherwise we may find the empty default sheet "Sheet1" in
     277             :                 pSrcDoc, even if the document does not exist. */
     278           0 :             if( pMed->GetError() == 0 )
     279             :             {
     280             :                 // no sheet name -> use first sheet
     281           0 :                 if ( !aTabName.isEmpty() && !bAutoTab )
     282           0 :                     bFound = pSrcDoc->GetTable( aTabName, nSrcTab );
     283             :                 else
     284           0 :                     bFound = true;
     285             :             }
     286             : 
     287           0 :             if (bFound)
     288             :                 pDoc->TransferTab( pSrcDoc, nSrcTab, nTab, false,       // nicht neu einfuegen
     289           0 :                                         (nMode == SC_LINK_VALUE) );     // nur Werte?
     290             :             else
     291             :             {
     292           0 :                 pDoc->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(pDoc, 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 :                                     pDoc->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 :                     pDoc->SetString( 0,0,nTab, ScGlobal::GetRscString(STR_LINKERROR) );
     356           0 :                     pDoc->SetString( 0,1,nTab, ScGlobal::GetRscString(STR_LINKERRORFILE) );
     357           0 :                     pDoc->SetString( 1,1,nTab, aNewUrl );
     358           0 :                     pDoc->SetString( 0,2,nTab, ScGlobal::GetRscString(STR_LINKERRORTAB) );
     359           0 :                     pDoc->SetString( 1,2,nTab, aTabName );
     360             :                 }
     361             : 
     362           0 :                 bNotFound = true;
     363             :             }
     364             : 
     365           0 :             if ( bNewUrlName || !aFilterName.equals(rNewFilter) ||
     366           0 :                     !aOptions.equals(aNewOpt) || pNewOptions ||
     367           0 :                     nNewRefresh != GetRefreshDelay() )
     368             :                 pDoc->SetLink( nTab, nMode, aNewUrl, rNewFilter, aNewOpt,
     369           0 :                     aTabName, nNewRefresh );
     370             :         }
     371             :     }
     372             : 
     373             :     //  neue Einstellungen merken
     374             : 
     375           0 :     if ( bNewUrlName )
     376           0 :         aFileName = aNewUrl;
     377           0 :     if (!aFilterName.equals(rNewFilter))
     378           0 :         aFilterName = rNewFilter;
     379           0 :     if (!aOptions.equals(aNewOpt))
     380           0 :         aOptions = aNewOpt;
     381             : 
     382             :     //  aufraeumen
     383             : 
     384           0 :     aRef->DoClose();
     385             : 
     386             :     //  Undo
     387             : 
     388           0 :     if (bAddUndo && bUndo)
     389           0 :         pImpl->m_pDocSh->GetUndoManager()->AddUndoAction(
     390           0 :                     new ScUndoRefreshLink( pImpl->m_pDocSh, pUndoDoc ) );
     391             : 
     392             :     //  Paint (koennen mehrere Tabellen sein)
     393             : 
     394           0 :     if (bDoPaint)
     395             :     {
     396             :         pImpl->m_pDocSh->PostPaint( ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB),
     397           0 :                                     PAINT_GRID | PAINT_TOP | PAINT_LEFT | PAINT_EXTRAS );
     398           0 :         aModificator.SetDocumentModified();
     399             :     }
     400             : 
     401             :     if (bNotFound)
     402             :     {
     403             :         //! Fehler ausgeben ?
     404             :     }
     405             : 
     406           0 :     pDoc->SetInLinkUpdate( false );
     407             : 
     408             :     //  notify Uno objects (for XRefreshListener)
     409             :     //! also notify Uno objects if file name was changed!
     410           0 :     ScLinkRefreshedHint aHint;
     411           0 :     aHint.SetSheetLink( aFileName );
     412           0 :     pDoc->BroadcastUno( aHint );
     413             : 
     414           0 :     return true;
     415             : }
     416             : 
     417           0 : IMPL_LINK_NOARG(ScTableLink, RefreshHdl)
     418             : {
     419           0 :     return long(Refresh( aFileName, aFilterName, NULL, GetRefreshDelay() ));
     420             : }
     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           0 : OUString ScDocumentLoader::GetOptions( SfxMedium& rMedium )
     434             : {
     435           0 :     SfxItemSet* pSet = rMedium.GetItemSet();
     436             :     const SfxPoolItem* pItem;
     437           0 :     if ( pSet && SFX_ITEM_SET == pSet->GetItemState( SID_FILE_FILTEROPTIONS, true, &pItem ) )
     438           0 :         return ((const SfxStringItem*)pItem)->GetValue();
     439             : 
     440           0 :     return EMPTY_OUSTRING;
     441             : }
     442             : 
     443           0 : bool ScDocumentLoader::GetFilterName( const OUString& rFileName,
     444             :                                       OUString& rFilter, OUString& rOptions,
     445             :                                       bool bWithContent, bool bWithInteraction )
     446             : {
     447           0 :     TypeId aScType = TYPE(ScDocShell);
     448           0 :     SfxObjectShell* pDocSh = SfxObjectShell::GetFirst( &aScType );
     449           0 :     while ( pDocSh )
     450             :     {
     451           0 :         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           0 :         pDocSh = SfxObjectShell::GetNext( *pDocSh, &aScType );
     462             :     }
     463             : 
     464           0 :     INetURLObject aUrl( rFileName );
     465           0 :     INetProtocol eProt = aUrl.GetProtocol();
     466           0 :     if ( eProt == INET_PROT_NOT_VALID )         // invalid URL?
     467           0 :         return false;                           // abort without creating a medium
     468             : 
     469             :     //  Filter-Detection
     470             : 
     471           0 :     const SfxFilter* pSfxFilter = NULL;
     472           0 :     SfxMedium* pMedium = new SfxMedium( rFileName, STREAM_STD_READ );
     473           0 :     if ( pMedium->GetError() == ERRCODE_NONE )
     474             :     {
     475           0 :         if ( bWithInteraction )
     476           0 :             pMedium->UseInteractionHandler(true);   // #i73992# no longer called from GuessFilter
     477             : 
     478           0 :         SfxFilterMatcher aMatcher("scalc");
     479           0 :         if( bWithContent )
     480           0 :             aMatcher.GuessFilter( *pMedium, &pSfxFilter );
     481             :         else
     482           0 :             aMatcher.GuessFilterIgnoringContent( *pMedium, &pSfxFilter );
     483             :     }
     484             : 
     485           0 :     sal_Bool bOK = false;
     486           0 :     if ( pMedium->GetError() == ERRCODE_NONE )
     487             :     {
     488           0 :         if ( pSfxFilter )
     489           0 :             rFilter = pSfxFilter->GetFilterName();
     490             :         else
     491           0 :             rFilter = ScDocShell::GetOwnFilterName();       //  sonst Calc-Datei
     492           0 :         bOK = !rFilter.isEmpty();
     493             :     }
     494             : 
     495           0 :     delete pMedium;
     496           0 :     return bOK;
     497             : }
     498             : 
     499           0 : void ScDocumentLoader::RemoveAppPrefix( OUString& rFilterName )
     500             : {
     501           0 :     OUString aAppPrefix( STRING_SCAPP ": ");
     502           0 :     if (rFilterName.startsWith( aAppPrefix))
     503           0 :         rFilterName = rFilterName.copy( aAppPrefix.getLength());
     504           0 : }
     505             : 
     506           0 : SfxMedium* ScDocumentLoader::CreateMedium( const OUString& rFileName, const SfxFilter* pFilter,
     507             :         const OUString& rOptions )
     508             : {
     509             :     // Always create SfxItemSet so ScDocShell can set options.
     510           0 :     SfxItemSet* pSet = new SfxAllItemSet( SFX_APP()->GetPool() );
     511           0 :     if ( !rOptions.isEmpty() )
     512           0 :         pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, rOptions ) );
     513             : 
     514           0 :     return new SfxMedium( rFileName, STREAM_STD_READ, pFilter, pSet );
     515             : }
     516             : 
     517           0 : ScDocumentLoader::ScDocumentLoader( const OUString& rFileName,
     518             :                                     OUString& rFilterName, OUString& rOptions,
     519             :                                     sal_uInt32 nRekCnt, bool bWithInteraction ) :
     520             :         pDocShell(0),
     521           0 :         pMedium(0)
     522             : {
     523           0 :     if ( rFilterName.isEmpty() )
     524           0 :         GetFilterName( rFileName, rFilterName, rOptions, true, bWithInteraction );
     525             : 
     526           0 :     const SfxFilter* pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( rFilterName );
     527             : 
     528           0 :     pMedium = CreateMedium( rFileName, pFilter, rOptions);
     529           0 :     if ( pMedium->GetError() != ERRCODE_NONE )
     530           0 :         return ;
     531             : 
     532           0 :     if ( bWithInteraction )
     533           0 :         pMedium->UseInteractionHandler( true ); // to enable the filter options dialog
     534             : 
     535           0 :     pDocShell = new ScDocShell( SFX_CREATE_MODE_INTERNAL );
     536           0 :     aRef = pDocShell;
     537             : 
     538           0 :     ScDocument* pDoc = pDocShell->GetDocument();
     539           0 :     if( pDoc )
     540             :     {
     541           0 :         ScExtDocOptions*    pExtDocOpt = pDoc->GetExtDocOptions();
     542           0 :         if( !pExtDocOpt )
     543             :         {
     544           0 :             pExtDocOpt = new ScExtDocOptions;
     545           0 :             pDoc->SetExtDocOptions( pExtDocOpt );
     546             :         }
     547           0 :         pExtDocOpt->GetDocSettings().mnLinkCnt = nRekCnt;
     548             :     }
     549             : 
     550           0 :     pDocShell->DoLoad( pMedium );
     551             : 
     552           0 :     OUString aNew = GetOptions(*pMedium);         // Optionen werden beim Laden per Dialog gesetzt
     553           0 :     if (!aNew.isEmpty() && aNew != rOptions)
     554           0 :         rOptions = aNew;
     555             : }
     556             : 
     557           0 : ScDocumentLoader::~ScDocumentLoader()
     558             : {
     559           0 :     if ( aRef.Is() )
     560           0 :         aRef->DoClose();
     561           0 :     else if ( pMedium )
     562           0 :         delete pMedium;
     563           0 : }
     564             : 
     565           0 : void ScDocumentLoader::ReleaseDocRef()
     566             : {
     567           0 :     if ( aRef.Is() )
     568             :     {
     569             :         //  release reference without calling DoClose - caller must
     570             :         //  have another reference to the doc and call DoClose later
     571             : 
     572           0 :         pDocShell = NULL;
     573           0 :         pMedium = NULL;
     574           0 :         aRef.Clear();
     575             :     }
     576           0 : }
     577             : 
     578           0 : ScDocument* ScDocumentLoader::GetDocument()
     579             : {
     580           0 :     return pDocShell ? pDocShell->GetDocument() : 0;
     581             : }
     582             : 
     583           0 : bool ScDocumentLoader::IsError() const
     584             : {
     585           0 :     if ( pDocShell && pMedium )
     586           0 :         return pMedium->GetError() != ERRCODE_NONE;
     587             :     else
     588           0 :         return true;
     589             : }
     590             : 
     591           0 : OUString ScDocumentLoader::GetTitle() const
     592             : {
     593           0 :     if ( pDocShell )
     594           0 :         return pDocShell->GetTitle();
     595             :     else
     596           0 :         return EMPTY_OUSTRING;
     597           0 : }
     598             : 
     599             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10