blob: fedcae3a141a6a799b38bf09e5f1d6294830d655 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
// -----------------------------------------------------------------------
// INCLUDE ---------------------------------------------------------------
#include <sfx2/linkmgr.hxx>
#include <tools/debug.hxx>
#include "areasave.hxx"
#include "arealink.hxx"
#include "document.hxx"
// -----------------------------------------------------------------------
ScAreaLinkSaver::ScAreaLinkSaver( const ScAreaLink& rSource ) :
aFileName ( rSource.GetFile() ),
aFilterName ( rSource.GetFilter() ),
aOptions ( rSource.GetOptions() ),
aSourceArea ( rSource.GetSource() ),
aDestArea ( rSource.GetDestArea() ),
nRefresh ( rSource.GetRefreshDelay() ) // seconds
{
}
ScAreaLinkSaver::ScAreaLinkSaver( const ScAreaLinkSaver& rCopy ) :
ScDataObject(),
aFileName ( rCopy.aFileName ),
aFilterName ( rCopy.aFilterName ),
aOptions ( rCopy.aOptions ),
aSourceArea ( rCopy.aSourceArea ),
aDestArea ( rCopy.aDestArea ),
nRefresh ( rCopy.nRefresh )
{
}
ScAreaLinkSaver::~ScAreaLinkSaver()
{
}
ScDataObject* ScAreaLinkSaver::Clone() const
{
return new ScAreaLinkSaver( *this );
}
sal_Bool ScAreaLinkSaver::IsEqualSource( const ScAreaLink& rCompare ) const
{
return ( aFileName == rCompare.GetFile() &&
aFilterName == rCompare.GetFilter() &&
aOptions == rCompare.GetOptions() &&
aSourceArea == rCompare.GetSource() &&
nRefresh == rCompare.GetRefreshDelay() );
}
sal_Bool ScAreaLinkSaver::IsEqual( const ScAreaLink& rCompare ) const
{
return ( IsEqualSource( rCompare ) &&
aDestArea == rCompare.GetDestArea() );
}
void ScAreaLinkSaver::WriteToLink( ScAreaLink& rLink ) const
{
rLink.SetDestArea( aDestArea );
}
void ScAreaLinkSaver::InsertNewLink( ScDocument* pDoc ) const
{
// (see ScUndoRemoveAreaLink::Undo)
sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
SfxObjectShell* pObjSh = pDoc->GetDocumentShell();
if ( pLinkManager && pObjSh )
{
ScAreaLink* pLink = new ScAreaLink( pObjSh, aFileName, aFilterName, aOptions,
aSourceArea, aDestArea.aStart, nRefresh );
pLink->SetInCreate( sal_True );
pLink->SetDestArea( aDestArea );
pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, aFileName, &aFilterName, &aSourceArea );
pLink->Update();
pLink->SetInCreate( sal_False );
}
}
// -----------------------------------------------------------------------
ScAreaLinkSaveCollection::ScAreaLinkSaveCollection()
{
}
ScAreaLinkSaveCollection::ScAreaLinkSaveCollection( const ScAreaLinkSaveCollection& rCopy ) :
ScCollection( rCopy )
{
}
ScAreaLinkSaveCollection::~ScAreaLinkSaveCollection()
{
}
ScDataObject* ScAreaLinkSaveCollection::Clone() const
{
return new ScAreaLinkSaveCollection( *this );
}
sal_Bool ScAreaLinkSaveCollection::IsEqual( const ScDocument* pDoc ) const
{
// IsEqual can be checked in sequence.
// Neither ref-update nor removing links will change the order.
sfx2::LinkManager* pLinkManager = const_cast<ScDocument*>(pDoc)->GetLinkManager();
if (pLinkManager)
{
sal_uInt16 nPos = 0;
const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
sal_uInt16 nLinkCount = rLinks.Count();
for (sal_uInt16 i=0; i<nLinkCount; i++)
{
::sfx2::SvBaseLink* pBase = *rLinks[i];
if (pBase->ISA(ScAreaLink))
{
if ( nPos >= GetCount() || !(*this)[nPos]->IsEqual( *(ScAreaLink*)pBase ) )
return sal_False;
++nPos;
}
}
if ( nPos < GetCount() )
return sal_False; // fewer links in the document than in the save collection
}
return sal_True;
}
ScAreaLink* lcl_FindLink( const ::sfx2::SvBaseLinks& rLinks, const ScAreaLinkSaver& rSaver )
{
sal_uInt16 nLinkCount = rLinks.Count();
for (sal_uInt16 i=0; i<nLinkCount; i++)
{
::sfx2::SvBaseLink* pBase = *rLinks[i];
if ( pBase->ISA(ScAreaLink) &&
rSaver.IsEqualSource( *static_cast<ScAreaLink*>(pBase) ) )
{
return static_cast<ScAreaLink*>(pBase); // found
}
}
return NULL; // not found
}
void ScAreaLinkSaveCollection::Restore( ScDocument* pDoc ) const
{
// The save collection may contain additional entries that are not in the document.
// They must be inserted again.
// Entries from the save collection must be searched via source data, as the order
// of links changes if deleted entries are re-added to the link manager (always at the end).
sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
if (pLinkManager)
{
const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
sal_uInt16 nSaveCount = GetCount();
for (sal_uInt16 nPos=0; nPos<nSaveCount; nPos++)
{
ScAreaLinkSaver* pSaver = (*this)[nPos];
ScAreaLink* pLink = lcl_FindLink( rLinks, *pSaver );
if ( pLink )
pSaver->WriteToLink( *pLink ); // restore output position
else
pSaver->InsertNewLink( pDoc ); // re-insert deleted link
}
}
}
// static
ScAreaLinkSaveCollection* ScAreaLinkSaveCollection::CreateFromDoc( const ScDocument* pDoc )
{
ScAreaLinkSaveCollection* pColl = NULL;
sfx2::LinkManager* pLinkManager = const_cast<ScDocument*>(pDoc)->GetLinkManager();
if (pLinkManager)
{
const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
sal_uInt16 nLinkCount = rLinks.Count();
for (sal_uInt16 i=0; i<nLinkCount; i++)
{
::sfx2::SvBaseLink* pBase = *rLinks[i];
if (pBase->ISA(ScAreaLink))
{
if (!pColl)
pColl = new ScAreaLinkSaveCollection;
ScAreaLinkSaver* pSaver = new ScAreaLinkSaver( *(ScAreaLink*)pBase );
if (!pColl->Insert(pSaver))
delete pSaver;
}
}
}
return pColl;
}