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 "refdata.hxx"
21 :
22 0 : void ScSingleRefData::InitAddress( const ScAddress& rAdr )
23 : {
24 0 : InitAddress( rAdr.Col(), rAdr.Row(), rAdr.Tab());
25 0 : }
26 :
27 0 : void ScSingleRefData::InitAddress( SCCOL nColP, SCROW nRowP, SCTAB nTabP )
28 : {
29 0 : InitFlags();
30 0 : mnCol = nColP;
31 0 : mnRow = nRowP;
32 0 : mnTab = nTabP;
33 0 : }
34 :
35 0 : void ScSingleRefData::InitAddressRel( const ScAddress& rAdr, const ScAddress& rPos )
36 : {
37 0 : InitFlags();
38 0 : SetColRel(true);
39 0 : SetRowRel(true);
40 0 : SetTabRel(true);
41 0 : SetAddress(rAdr, rPos);
42 0 : }
43 :
44 0 : sal_uInt8 ScSingleRefData::FlagValue() const
45 : {
46 0 : return mnFlagValue;
47 : }
48 :
49 0 : void ScSingleRefData::SetAbsCol( SCCOL nVal )
50 : {
51 0 : Flags.bColRel = false;
52 0 : mnCol = nVal;
53 0 : }
54 :
55 0 : void ScSingleRefData::SetRelCol( SCCOL nVal )
56 : {
57 0 : Flags.bColRel = true;
58 0 : mnCol = nVal;
59 0 : }
60 :
61 0 : void ScSingleRefData::IncCol( SCCOL nInc )
62 : {
63 0 : mnCol += nInc;
64 0 : }
65 :
66 0 : void ScSingleRefData::SetAbsRow( SCROW nVal )
67 : {
68 0 : Flags.bRowRel = false;
69 0 : mnRow = nVal;
70 0 : }
71 :
72 0 : void ScSingleRefData::SetRelRow( SCROW nVal )
73 : {
74 0 : Flags.bRowRel = true;
75 0 : mnRow = nVal;
76 0 : }
77 :
78 0 : void ScSingleRefData::IncRow( SCROW nInc )
79 : {
80 0 : mnRow += nInc;
81 0 : }
82 :
83 0 : void ScSingleRefData::SetAbsTab( SCTAB nVal )
84 : {
85 0 : Flags.bTabRel = false;
86 0 : mnTab = nVal;
87 0 : }
88 :
89 0 : void ScSingleRefData::SetRelTab( SCTAB nVal )
90 : {
91 0 : Flags.bTabRel = true;
92 0 : mnTab = nVal;
93 0 : }
94 :
95 0 : void ScSingleRefData::IncTab( SCTAB nInc )
96 : {
97 0 : mnTab += nInc;
98 0 : }
99 :
100 0 : void ScSingleRefData::SetColDeleted( bool bVal )
101 : {
102 0 : Flags.bColDeleted = bVal;
103 0 : }
104 :
105 0 : bool ScSingleRefData::IsColDeleted() const
106 : {
107 0 : return Flags.bColDeleted;
108 : }
109 :
110 0 : void ScSingleRefData::SetRowDeleted( bool bVal )
111 : {
112 0 : Flags.bRowDeleted = bVal;
113 0 : }
114 :
115 0 : bool ScSingleRefData::IsRowDeleted() const
116 : {
117 0 : return Flags.bRowDeleted;
118 : }
119 :
120 0 : void ScSingleRefData::SetTabDeleted( bool bVal )
121 : {
122 0 : Flags.bTabDeleted = bVal;
123 0 : }
124 :
125 0 : bool ScSingleRefData::IsTabDeleted() const
126 : {
127 0 : return Flags.bTabDeleted;
128 : }
129 :
130 0 : bool ScSingleRefData::IsDeleted() const
131 : {
132 0 : return IsColDeleted() || IsRowDeleted() || IsTabDeleted();
133 : }
134 :
135 0 : bool ScSingleRefData::Valid() const
136 : {
137 0 : return ColValid() && RowValid() && TabValid();
138 : }
139 :
140 0 : bool ScSingleRefData::ColValid() const
141 : {
142 0 : if (Flags.bColRel)
143 : {
144 0 : if (mnCol < -MAXCOL || MAXCOL < mnCol)
145 0 : return false;
146 : }
147 : else
148 : {
149 0 : if (mnCol < 0 || MAXCOL < mnCol)
150 0 : return false;
151 : }
152 :
153 0 : return true;
154 : }
155 :
156 0 : bool ScSingleRefData::RowValid() const
157 : {
158 0 : if (Flags.bRowRel)
159 : {
160 0 : if (mnRow < -MAXROW || MAXROW < mnRow)
161 0 : return false;
162 : }
163 : else
164 : {
165 0 : if (mnRow < 0 || MAXROW < mnRow)
166 0 : return false;
167 : }
168 :
169 0 : return true;
170 : }
171 :
172 0 : bool ScSingleRefData::TabValid() const
173 : {
174 0 : if (Flags.bTabRel)
175 : {
176 0 : if (mnTab < -MAXTAB || MAXTAB < mnTab)
177 0 : return false;
178 : }
179 : else
180 : {
181 0 : if (mnTab < 0 || MAXTAB < mnTab)
182 0 : return false;
183 : }
184 :
185 0 : return true;
186 : }
187 :
188 0 : bool ScSingleRefData::ValidExternal() const
189 : {
190 0 : return ColValid() && RowValid() && mnTab == -1;
191 : }
192 :
193 0 : ScAddress ScSingleRefData::toAbs( const ScAddress& rPos ) const
194 : {
195 0 : SCCOL nRetCol = Flags.bColRel ? mnCol + rPos.Col() : mnCol;
196 0 : SCROW nRetRow = Flags.bRowRel ? mnRow + rPos.Row() : mnRow;
197 0 : SCTAB nRetTab = Flags.bTabRel ? mnTab + rPos.Tab() : mnTab;
198 :
199 0 : ScAddress aAbs(ScAddress::INITIALIZE_INVALID);
200 :
201 0 : if (ValidCol(nRetCol))
202 0 : aAbs.SetCol(nRetCol);
203 :
204 0 : if (ValidRow(nRetRow))
205 0 : aAbs.SetRow(nRetRow);
206 :
207 0 : if (ValidTab(nRetTab))
208 0 : aAbs.SetTab(nRetTab);
209 :
210 0 : return aAbs;
211 : }
212 :
213 0 : void ScSingleRefData::SetAddress( const ScAddress& rAddr, const ScAddress& rPos )
214 : {
215 0 : if (Flags.bColRel)
216 0 : mnCol = rAddr.Col() - rPos.Col();
217 : else
218 0 : mnCol = rAddr.Col();
219 :
220 0 : if (Flags.bRowRel)
221 0 : mnRow = rAddr.Row() - rPos.Row();
222 : else
223 0 : mnRow = rAddr.Row();
224 :
225 0 : if (Flags.bTabRel)
226 0 : mnTab = rAddr.Tab() - rPos.Tab();
227 : else
228 0 : mnTab = rAddr.Tab();
229 0 : }
230 :
231 0 : SCROW ScSingleRefData::Row() const
232 : {
233 0 : if (Flags.bRowDeleted)
234 0 : return -1;
235 0 : return mnRow;
236 : }
237 :
238 0 : SCCOL ScSingleRefData::Col() const
239 : {
240 0 : if (Flags.bColDeleted)
241 0 : return -1;
242 0 : return mnCol;
243 : }
244 :
245 0 : SCTAB ScSingleRefData::Tab() const
246 : {
247 0 : if (Flags.bTabDeleted)
248 0 : return -1;
249 0 : return mnTab;
250 : }
251 :
252 0 : bool ScSingleRefData::operator==( const ScSingleRefData& r ) const
253 : {
254 0 : return mnFlagValue == r.mnFlagValue && mnCol == r.mnCol && mnRow == r.mnRow && mnTab == r.mnTab;
255 : }
256 :
257 0 : bool ScSingleRefData::operator!=( const ScSingleRefData& r ) const
258 : {
259 0 : return !operator==(r);
260 : }
261 :
262 : #if DEBUG_FORMULA_COMPILER
263 : void ScSingleRefData::Dump( int nIndent ) const
264 : {
265 : std::string aIndent;
266 : for (int i = 0; i < nIndent; ++i)
267 : aIndent += " ";
268 :
269 : cout << aIndent << "address type column: " << (IsColRel()?"relative":"absolute")
270 : << " row : " << (IsRowRel()?"relative":"absolute") << " sheet: "
271 : << (IsTabRel()?"relative":"absolute") << endl;
272 : cout << aIndent << "deleted column: " << (IsColDeleted()?"yes":"no")
273 : << " row : " << (IsRowDeleted()?"yes":"no") << " sheet: "
274 : << (IsTabDeleted()?"yes":"no") << endl;
275 : cout << aIndent << "column: " << mnCol << " row: " << mnRow << " sheet: " << mnTab << endl;
276 : cout << aIndent << "3d ref: " << (IsFlag3D()?"yes":"no") << endl;
277 : }
278 : #endif
279 :
280 0 : ScComplexRefData& ScComplexRefData::Extend( const ScSingleRefData & rRef, const ScAddress & rPos )
281 : {
282 0 : ScRange aAbsRange = toAbs(rPos);
283 0 : ScAddress aAbs = rRef.toAbs(rPos);
284 :
285 0 : if (aAbs.Col() < aAbsRange.aStart.Col())
286 0 : aAbsRange.aStart.SetCol(aAbs.Col());
287 :
288 0 : if (aAbs.Row() < aAbsRange.aStart.Row())
289 0 : aAbsRange.aStart.SetRow(aAbs.Row());
290 :
291 0 : if (aAbs.Tab() < aAbsRange.aStart.Tab())
292 0 : aAbsRange.aStart.SetTab(aAbs.Tab());
293 :
294 0 : if (aAbsRange.aEnd.Col() < aAbs.Col())
295 0 : aAbsRange.aEnd.SetCol(aAbs.Col());
296 :
297 0 : if (aAbsRange.aEnd.Row() < aAbs.Row())
298 0 : aAbsRange.aEnd.SetRow(aAbs.Row());
299 :
300 0 : if (aAbsRange.aEnd.Tab() < aAbs.Tab())
301 0 : aAbsRange.aEnd.SetTab(aAbs.Tab());
302 :
303 0 : SetRange(aAbsRange, rPos);
304 :
305 0 : return *this;
306 : }
307 :
308 :
309 0 : ScComplexRefData& ScComplexRefData::Extend( const ScComplexRefData & rRef, const ScAddress & rPos )
310 : {
311 0 : return Extend( rRef.Ref1, rPos).Extend( rRef.Ref2, rPos);
312 : }
313 :
314 0 : bool ScComplexRefData::Valid() const
315 : {
316 0 : return Ref1.Valid() && Ref2.Valid();
317 : }
318 :
319 0 : bool ScComplexRefData::ValidExternal() const
320 : {
321 0 : return Ref1.ValidExternal() && Ref2.ColValid() && Ref2.RowValid() && Ref1.Tab() <= Ref2.Tab();
322 : }
323 :
324 0 : ScRange ScComplexRefData::toAbs( const ScAddress& rPos ) const
325 : {
326 0 : return ScRange(Ref1.toAbs(rPos), Ref2.toAbs(rPos));
327 : }
328 :
329 0 : void ScComplexRefData::SetRange( const ScRange& rRange, const ScAddress& rPos )
330 : {
331 0 : Ref1.SetAddress(rRange.aStart, rPos);
332 0 : Ref2.SetAddress(rRange.aEnd, rPos);
333 0 : }
334 :
335 : #if DEBUG_FORMULA_COMPILER
336 : void ScComplexRefData::Dump( int nIndent ) const
337 : {
338 : std::string aIndent;
339 : for (int i = 0; i < nIndent; ++i)
340 : aIndent += " ";
341 :
342 : cout << aIndent << "ref 1" << endl;
343 : Ref1.Dump(nIndent+1);
344 : cout << aIndent << "ref 2" << endl;
345 : Ref2.Dump(nIndent+1);
346 : }
347 : #endif
348 :
349 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|