xref: /AOO41X/main/sc/source/ui/undo/areasave.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 // -----------------------------------------------------------------------
28 
29 
30 
31 // INCLUDE ---------------------------------------------------------------
32 
33 #include <sfx2/linkmgr.hxx>
34 #include <tools/debug.hxx>
35 
36 #include "areasave.hxx"
37 #include "arealink.hxx"
38 #include "document.hxx"
39 
40 // -----------------------------------------------------------------------
41 
ScAreaLinkSaver(const ScAreaLink & rSource)42 ScAreaLinkSaver::ScAreaLinkSaver( const ScAreaLink& rSource ) :
43     aFileName   ( rSource.GetFile() ),
44     aFilterName ( rSource.GetFilter() ),
45     aOptions    ( rSource.GetOptions() ),
46     aSourceArea ( rSource.GetSource() ),
47     aDestArea   ( rSource.GetDestArea() ),
48     nRefresh    ( rSource.GetRefreshDelay() )       // seconds
49 {
50 }
51 
ScAreaLinkSaver(const ScAreaLinkSaver & rCopy)52 ScAreaLinkSaver::ScAreaLinkSaver( const ScAreaLinkSaver& rCopy ) :
53     ScDataObject(),
54     aFileName   ( rCopy.aFileName ),
55     aFilterName ( rCopy.aFilterName ),
56     aOptions    ( rCopy.aOptions ),
57     aSourceArea ( rCopy.aSourceArea ),
58     aDestArea   ( rCopy.aDestArea ),
59     nRefresh    ( rCopy.nRefresh )
60 {
61 }
62 
~ScAreaLinkSaver()63 ScAreaLinkSaver::~ScAreaLinkSaver()
64 {
65 }
66 
Clone() const67 ScDataObject*   ScAreaLinkSaver::Clone() const
68 {
69     return new ScAreaLinkSaver( *this );
70 }
71 
IsEqualSource(const ScAreaLink & rCompare) const72 sal_Bool ScAreaLinkSaver::IsEqualSource( const ScAreaLink& rCompare ) const
73 {
74     return ( aFileName   == rCompare.GetFile() &&
75              aFilterName == rCompare.GetFilter() &&
76              aOptions    == rCompare.GetOptions() &&
77              aSourceArea == rCompare.GetSource() &&
78              nRefresh    == rCompare.GetRefreshDelay() );
79 }
80 
IsEqual(const ScAreaLink & rCompare) const81 sal_Bool ScAreaLinkSaver::IsEqual( const ScAreaLink& rCompare ) const
82 {
83     return ( IsEqualSource( rCompare ) &&
84              aDestArea == rCompare.GetDestArea() );
85 }
86 
WriteToLink(ScAreaLink & rLink) const87 void ScAreaLinkSaver::WriteToLink( ScAreaLink& rLink ) const
88 {
89     rLink.SetDestArea( aDestArea );
90 }
91 
InsertNewLink(ScDocument * pDoc) const92 void ScAreaLinkSaver::InsertNewLink( ScDocument* pDoc ) const
93 {
94     // (see ScUndoRemoveAreaLink::Undo)
95 
96     sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
97     SfxObjectShell* pObjSh = pDoc->GetDocumentShell();
98 
99     if ( pLinkManager && pObjSh )
100     {
101         ScAreaLink* pLink = new ScAreaLink( pObjSh, aFileName, aFilterName, aOptions,
102                                             aSourceArea, aDestArea.aStart, nRefresh );
103         pLink->SetInCreate( sal_True );
104         pLink->SetDestArea( aDestArea );
105         pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, aFileName, &aFilterName, &aSourceArea );
106         pLink->Update();
107         pLink->SetInCreate( sal_False );
108     }
109 }
110 
111 // -----------------------------------------------------------------------
112 
ScAreaLinkSaveCollection()113 ScAreaLinkSaveCollection::ScAreaLinkSaveCollection()
114 {
115 }
116 
ScAreaLinkSaveCollection(const ScAreaLinkSaveCollection & rCopy)117 ScAreaLinkSaveCollection::ScAreaLinkSaveCollection( const ScAreaLinkSaveCollection& rCopy ) :
118     ScCollection( rCopy )
119 {
120 }
121 
~ScAreaLinkSaveCollection()122 ScAreaLinkSaveCollection::~ScAreaLinkSaveCollection()
123 {
124 }
125 
Clone() const126 ScDataObject*   ScAreaLinkSaveCollection::Clone() const
127 {
128     return new ScAreaLinkSaveCollection( *this );
129 }
130 
IsEqual(const ScDocument * pDoc) const131 sal_Bool ScAreaLinkSaveCollection::IsEqual( const ScDocument* pDoc ) const
132 {
133     // IsEqual can be checked in sequence.
134     // Neither ref-update nor removing links will change the order.
135 
136     sfx2::LinkManager* pLinkManager = const_cast<ScDocument*>(pDoc)->GetLinkManager();
137     if (pLinkManager)
138     {
139         sal_uInt16 nPos = 0;
140         const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
141         sal_uInt16 nLinkCount = rLinks.Count();
142         for (sal_uInt16 i=0; i<nLinkCount; i++)
143         {
144             ::sfx2::SvBaseLink* pBase = *rLinks[i];
145             if (pBase->ISA(ScAreaLink))
146             {
147                 if ( nPos >= GetCount() || !(*this)[nPos]->IsEqual( *(ScAreaLink*)pBase ) )
148                     return sal_False;
149 
150                 ++nPos;
151             }
152         }
153         if ( nPos < GetCount() )
154             return sal_False;           // fewer links in the document than in the save collection
155     }
156 
157     return sal_True;
158 }
159 
lcl_FindLink(const::sfx2::SvBaseLinks & rLinks,const ScAreaLinkSaver & rSaver)160 ScAreaLink* lcl_FindLink( const ::sfx2::SvBaseLinks& rLinks, const ScAreaLinkSaver& rSaver )
161 {
162     sal_uInt16 nLinkCount = rLinks.Count();
163     for (sal_uInt16 i=0; i<nLinkCount; i++)
164     {
165         ::sfx2::SvBaseLink* pBase = *rLinks[i];
166         if ( pBase->ISA(ScAreaLink) &&
167              rSaver.IsEqualSource( *static_cast<ScAreaLink*>(pBase) ) )
168         {
169             return static_cast<ScAreaLink*>(pBase);     // found
170         }
171     }
172     return NULL;    // not found
173 }
174 
Restore(ScDocument * pDoc) const175 void ScAreaLinkSaveCollection::Restore( ScDocument* pDoc ) const
176 {
177     // The save collection may contain additional entries that are not in the document.
178     // They must be inserted again.
179     // Entries from the save collection must be searched via source data, as the order
180     // of links changes if deleted entries are re-added to the link manager (always at the end).
181 
182     sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
183     if (pLinkManager)
184     {
185         const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
186         sal_uInt16 nSaveCount = GetCount();
187         for (sal_uInt16 nPos=0; nPos<nSaveCount; nPos++)
188         {
189             ScAreaLinkSaver* pSaver = (*this)[nPos];
190             ScAreaLink* pLink = lcl_FindLink( rLinks, *pSaver );
191             if ( pLink )
192                 pSaver->WriteToLink( *pLink );          // restore output position
193             else
194                 pSaver->InsertNewLink( pDoc );          // re-insert deleted link
195         }
196     }
197 }
198 
199 // static
CreateFromDoc(const ScDocument * pDoc)200 ScAreaLinkSaveCollection* ScAreaLinkSaveCollection::CreateFromDoc( const ScDocument* pDoc )
201 {
202     ScAreaLinkSaveCollection* pColl = NULL;
203 
204     sfx2::LinkManager* pLinkManager = const_cast<ScDocument*>(pDoc)->GetLinkManager();
205     if (pLinkManager)
206     {
207         const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
208         sal_uInt16 nLinkCount = rLinks.Count();
209         for (sal_uInt16 i=0; i<nLinkCount; i++)
210         {
211             ::sfx2::SvBaseLink* pBase = *rLinks[i];
212             if (pBase->ISA(ScAreaLink))
213             {
214                 if (!pColl)
215                     pColl = new ScAreaLinkSaveCollection;
216 
217                 ScAreaLinkSaver* pSaver = new ScAreaLinkSaver( *(ScAreaLink*)pBase );
218                 if (!pColl->Insert(pSaver))
219                     delete pSaver;
220             }
221         }
222     }
223 
224     return pColl;
225 }
226 
227