| /************************************************************** |
| * |
| * 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; |
| } |
| |