LibreOffice Module sc (master)  1
areasave.cxx
Go to the documentation of this file.
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/linkmgr.hxx>
21 
22 #include <areasave.hxx>
23 #include <arealink.hxx>
24 #include <document.hxx>
25 #include <documentlinkmgr.hxx>
26 
28  aFileName ( rSource.GetFile() ),
29  aFilterName ( rSource.GetFilter() ),
30  aOptions ( rSource.GetOptions() ),
31  aSourceArea ( rSource.GetSource() ),
32  aDestArea ( rSource.GetDestArea() ),
33  nRefresh ( rSource.GetRefreshDelay() ) // seconds
34 {
35 }
36 
37 bool ScAreaLinkSaver::IsEqualSource( const ScAreaLink& rCompare ) const
38 {
39  return ( aFileName == rCompare.GetFile() &&
40  aFilterName == rCompare.GetFilter() &&
41  aOptions == rCompare.GetOptions() &&
42  aSourceArea == rCompare.GetSource() &&
43  nRefresh == rCompare.GetRefreshDelay() );
44 }
45 
46 bool ScAreaLinkSaver::IsEqual( const ScAreaLink& rCompare ) const
47 {
48  return ( IsEqualSource( rCompare ) &&
49  aDestArea == rCompare.GetDestArea() );
50 }
51 
53 {
54  rLink.SetDestArea( aDestArea );
55 }
56 
58 {
59  // (see ScUndoRemoveAreaLink::Undo)
60 
61  sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
62  SfxObjectShell* pObjSh = pDoc->GetDocumentShell();
63 
64  if ( pLinkManager && pObjSh )
65  {
68  pLink->SetInCreate( true );
69  pLink->SetDestArea( aDestArea );
70  OUString aTmp1(aFilterName), aTmp2(aSourceArea);
71  pLinkManager->InsertFileLink( *pLink, sfx2::SvBaseLinkObjectType::ClientFile, aFileName, &aTmp1, &aTmp2 );
72  pLink->Update();
73  pLink->SetInCreate( false );
74  }
75 }
76 
78 
80 
82 {
83  // IsEqual can be checked in sequence.
84  // Neither ref-update nor removing links will change the order.
85 
86  const sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
87  if (pLinkManager)
88  {
89  size_t nPos = 0;
90  const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
91  sal_uInt16 nLinkCount = rLinks.size();
92  for (sal_uInt16 i=0; i<nLinkCount; i++)
93  {
94  ::sfx2::SvBaseLink* pBase = rLinks[i].get();
95  if (auto pAreaLink = dynamic_cast<ScAreaLink*>( pBase))
96  {
97  if ( nPos >= size() || !(*this)[nPos].IsEqual( *pAreaLink ) )
98  return false;
99 
100  ++nPos;
101  }
102  }
103  if ( nPos < size() )
104  return false; // fewer links in the document than in the save collection
105  }
106 
107  return true;
108 }
109 
110 static ScAreaLink* lcl_FindLink( const ::sfx2::SvBaseLinks& rLinks, const ScAreaLinkSaver& rSaver )
111 {
112  sal_uInt16 nLinkCount = rLinks.size();
113  for (sal_uInt16 i=0; i<nLinkCount; i++)
114  {
115  ::sfx2::SvBaseLink* pBase = rLinks[i].get();
116  if ( auto pAreaLink = dynamic_cast<ScAreaLink*>( pBase) )
117  if ( rSaver.IsEqualSource( *pAreaLink ) )
118  return pAreaLink; // found
119  }
120  return nullptr; // not found
121 }
122 
124 {
125  // The save collection may contain additional entries that are not in the document.
126  // They must be inserted again.
127  // Entries from the save collection must be searched via source data, as the order
128  // of links changes if deleted entries are re-added to the link manager (always at the end).
129 
130  sfx2::LinkManager* pLinkManager = pDoc->GetDocLinkManager().getLinkManager(false);
131  if (!pLinkManager)
132  return;
133 
134  const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
135  size_t nSaveCount = size();
136  for (size_t nPos=0; nPos<nSaveCount; ++nPos)
137  {
138  ScAreaLinkSaver& rSaver = (*this)[nPos];
139  ScAreaLink* pLink = lcl_FindLink( rLinks, rSaver );
140  if ( pLink )
141  rSaver.WriteToLink( *pLink ); // restore output position
142  else
143  rSaver.InsertNewLink( pDoc ); // re-insert deleted link
144  }
145 }
146 
147 std::unique_ptr<ScAreaLinkSaveCollection> ScAreaLinkSaveCollection::CreateFromDoc( const ScDocument* pDoc )
148 {
149  std::unique_ptr<ScAreaLinkSaveCollection> pColl;
150 
151  sfx2::LinkManager* pLinkManager = const_cast<ScDocument*>(pDoc)->GetLinkManager();
152  if (pLinkManager)
153  {
154  const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
155  sal_uInt16 nLinkCount = rLinks.size();
156  for (sal_uInt16 i=0; i<nLinkCount; i++)
157  {
158  ::sfx2::SvBaseLink* pBase = rLinks[i].get();
159  if (dynamic_cast<const ScAreaLink*>( pBase) != nullptr)
160  {
161  if (!pColl)
162  pColl.reset(new ScAreaLinkSaveCollection);
163 
164  pColl->push_back( ScAreaLinkSaver( *static_cast<ScAreaLink*>(pBase ) ) );
165  }
166  }
167  }
168 
169  return pColl;
170 }
171 
173 {
174  return maData[nIndex];
175 }
176 
178 {
179  return maData[nIndex];
180 }
181 
183 {
184  return maData.size();
185 }
186 
188 {
189  maData.push_back(p);
190 }
191 
192 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
size_t size() const
Definition: areasave.cxx:182
ScAreaLinkSaver & operator[](size_t nIndex)
Definition: areasave.cxx:172
ScAddress aStart
Definition: address.hxx:500
void push_back(const ScAreaLinkSaver &)
Definition: areasave.cxx:187
void InsertNewLink(ScDocument *pDoc)
Definition: areasave.cxx:57
sc::DocumentLinkManager & GetDocLinkManager()
Definition: documen2.cxx:225
sfx2::LinkManager * getLinkManager(bool bCreate=true)
void Restore(ScDocument *pDoc)
Definition: areasave.cxx:123
OUString aSourceArea
Definition: areasave.hxx:37
sal_uLong nRefresh
Definition: areasave.hxx:39
OUString aOptions
Definition: areasave.hxx:36
void InsertFileLink(sfx2::SvBaseLink &, SvBaseLinkObjectType nFileType, const OUString &rFileNm, const OUString *pFilterNm=nullptr, const OUString *pRange=nullptr)
const SvBaseLinks & GetLinks() const
int i
bool IsEqualSource(const ScAreaLink &rCompare) const
Definition: areasave.cxx:37
static std::unique_ptr< ScAreaLinkSaveCollection > CreateFromDoc(const ScDocument *pDoc)
Definition: areasave.cxx:147
bool IsEqual(const ScAreaLink &rCompare) const
Definition: areasave.cxx:46
SvBaseLink * pLink
ScRange aDestArea
Definition: areasave.hxx:38
OUString aFileName
Definition: areasave.hxx:34
SfxObjectShell * GetDocumentShell() const
Definition: document.hxx:1058
SC_DLLPUBLIC sfx2::LinkManager * GetLinkManager()
Definition: documen2.cxx:215
ScAreaLinkSaver(const ScAreaLink &rSource)
Definition: areasave.cxx:27
static ScAreaLink * lcl_FindLink(const ::sfx2::SvBaseLinks &rLinks, const ScAreaLinkSaver &rSaver)
Definition: areasave.cxx:110
sal_uLong GetRefreshDelay() const
OUString aFilterName
Definition: areasave.hxx:35
sal_uInt16 nPos
void WriteToLink(ScAreaLink &rLink) const
Definition: areasave.cxx:52
bool IsEqual(const ScDocument *pDoc) const
Definition: areasave.cxx:81