Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "refdata.hxx"
30 : :
31 : :
32 : 7703 : void ScSingleRefData::CalcRelFromAbs( const ScAddress& rPos )
33 : : {
34 : 7703 : nRelCol = nCol - rPos.Col();
35 : 7703 : nRelRow = nRow - rPos.Row();
36 : 7703 : nRelTab = nTab - rPos.Tab();
37 : 7703 : }
38 : :
39 : :
40 : 32 : void ScSingleRefData::SmartRelAbs( const ScAddress& rPos )
41 : : {
42 [ + - ]: 32 : if ( Flags.bColRel )
43 : 32 : nCol = nRelCol + rPos.Col();
44 : : else
45 : 0 : nRelCol = nCol - rPos.Col();
46 : :
47 [ + - ]: 32 : if ( Flags.bRowRel )
48 : 32 : nRow = nRelRow + rPos.Row();
49 : : else
50 : 0 : nRelRow = nRow - rPos.Row();
51 : :
52 [ + - ]: 32 : if ( Flags.bTabRel )
53 : 32 : nTab = nRelTab + rPos.Tab();
54 : : else
55 : 0 : nRelTab = nTab - rPos.Tab();
56 : 32 : }
57 : :
58 : :
59 : 66758 : void ScSingleRefData::CalcAbsIfRel( const ScAddress& rPos )
60 : : {
61 [ + + ]: 66758 : if ( Flags.bColRel )
62 : : {
63 : 27929 : nCol = nRelCol + rPos.Col();
64 [ - + ]: 27929 : if ( !VALIDCOL( nCol ) )
65 : 0 : Flags.bColDeleted = sal_True;
66 : : }
67 [ + + ]: 66758 : if ( Flags.bRowRel )
68 : : {
69 : 27774 : nRow = nRelRow + rPos.Row();
70 [ - + ]: 27774 : if ( !VALIDROW( nRow ) )
71 : 0 : Flags.bRowDeleted = sal_True;
72 : : }
73 [ + + ]: 66758 : if ( Flags.bTabRel )
74 : : {
75 : 19566 : nTab = nRelTab + rPos.Tab();
76 [ + + ]: 19566 : if ( !VALIDTAB( nTab ) )
77 : 10 : Flags.bTabDeleted = sal_True;
78 : : }
79 : 66758 : }
80 : :
81 : :
82 : :
83 : 14 : sal_Bool ScSingleRefData::operator==( const ScSingleRefData& r ) const
84 : : {
85 : : return bFlags == r.bFlags &&
86 : : (Flags.bColRel ? nRelCol == r.nRelCol : nCol == r.nCol) &&
87 : : (Flags.bRowRel ? nRelRow == r.nRelRow : nRow == r.nRow) &&
88 [ + - ][ - + ]: 14 : (Flags.bTabRel ? nRelTab == r.nRelTab : nTab == r.nTab);
[ # # ][ + - ]
[ - + ][ # # ]
[ + - ][ - + ]
[ # # ][ + + ]
89 : : }
90 : :
91 : 0 : bool ScSingleRefData::operator!=( const ScSingleRefData& r ) const
92 : : {
93 : 0 : return !operator==(r);
94 : : }
95 : :
96 : 345 : static void lcl_putInOrder( ScSingleRefData & rRef1, ScSingleRefData & rRef2 )
97 : : {
98 : : SCCOL nCol1, nCol2;
99 : : SCROW nRow1, nRow2;
100 : : SCTAB nTab1, nTab2;
101 : : sal_Bool bTmp;
102 : : sal_uInt8 nRelState1, nRelState2;
103 [ + + ]: 345 : if ( rRef1.Flags.bRelName )
104 : : nRelState1 =
105 : : ((rRef1.Flags.bTabRel & 0x01) << 2)
106 : : | ((rRef1.Flags.bRowRel & 0x01) << 1)
107 : 35 : | ((rRef1.Flags.bColRel & 0x01));
108 : : else
109 : 310 : nRelState1 = 0;
110 [ + + ]: 345 : if ( rRef2.Flags.bRelName )
111 : : nRelState2 =
112 : : ((rRef2.Flags.bTabRel & 0x01) << 2)
113 : : | ((rRef2.Flags.bRowRel & 0x01) << 1)
114 : 35 : | ((rRef2.Flags.bColRel & 0x01));
115 : : else
116 : 310 : nRelState2 = 0;
117 [ - + ]: 345 : if ( (nCol1 = rRef1.nCol) > (nCol2 = rRef2.nCol) )
118 : : {
119 : 0 : rRef1.nCol = nCol2;
120 : 0 : rRef2.nCol = nCol1;
121 : 0 : nCol1 = rRef1.nRelCol;
122 : 0 : rRef1.nRelCol = rRef2.nRelCol;
123 : 0 : rRef2.nRelCol = nCol1;
124 [ # # ][ # # ]: 0 : if ( rRef1.Flags.bRelName && rRef1.Flags.bColRel )
125 : 0 : nRelState2 |= 1;
126 : : else
127 : 0 : nRelState2 &= ~1;
128 [ # # ][ # # ]: 0 : if ( rRef2.Flags.bRelName && rRef2.Flags.bColRel )
129 : 0 : nRelState1 |= 1;
130 : : else
131 : 0 : nRelState1 &= ~1;
132 : 0 : bTmp = rRef1.Flags.bColRel;
133 : 0 : rRef1.Flags.bColRel = rRef2.Flags.bColRel;
134 : 0 : rRef2.Flags.bColRel = bTmp;
135 : 0 : bTmp = rRef1.Flags.bColDeleted;
136 : 0 : rRef1.Flags.bColDeleted = rRef2.Flags.bColDeleted;
137 : 0 : rRef2.Flags.bColDeleted = bTmp;
138 : : }
139 [ - + ]: 345 : if ( (nRow1 = rRef1.nRow) > (nRow2 = rRef2.nRow) )
140 : : {
141 : 0 : rRef1.nRow = nRow2;
142 : 0 : rRef2.nRow = nRow1;
143 : 0 : nRow1 = rRef1.nRelRow;
144 : 0 : rRef1.nRelRow = rRef2.nRelRow;
145 : 0 : rRef2.nRelRow = nRow1;
146 [ # # ][ # # ]: 0 : if ( rRef1.Flags.bRelName && rRef1.Flags.bRowRel )
147 : 0 : nRelState2 |= 2;
148 : : else
149 : 0 : nRelState2 &= ~2;
150 [ # # ][ # # ]: 0 : if ( rRef2.Flags.bRelName && rRef2.Flags.bRowRel )
151 : 0 : nRelState1 |= 2;
152 : : else
153 : 0 : nRelState1 &= ~2;
154 : 0 : bTmp = rRef1.Flags.bRowRel;
155 : 0 : rRef1.Flags.bRowRel = rRef2.Flags.bRowRel;
156 : 0 : rRef2.Flags.bRowRel = bTmp;
157 : 0 : bTmp = rRef1.Flags.bRowDeleted;
158 : 0 : rRef1.Flags.bRowDeleted = rRef2.Flags.bRowDeleted;
159 : 0 : rRef2.Flags.bRowDeleted = bTmp;
160 : : }
161 [ - + ]: 345 : if ( (nTab1 = rRef1.nTab) > (nTab2 = rRef2.nTab) )
162 : : {
163 : 0 : rRef1.nTab = nTab2;
164 : 0 : rRef2.nTab = nTab1;
165 : 0 : nTab1 = rRef1.nRelTab;
166 : 0 : rRef1.nRelTab = rRef2.nRelTab;
167 : 0 : rRef2.nRelTab = nTab1;
168 [ # # ][ # # ]: 0 : if ( rRef1.Flags.bRelName && rRef1.Flags.bTabRel )
169 : 0 : nRelState2 |= 4;
170 : : else
171 : 0 : nRelState2 &= ~4;
172 [ # # ][ # # ]: 0 : if ( rRef2.Flags.bRelName && rRef2.Flags.bTabRel )
173 : 0 : nRelState1 |= 4;
174 : : else
175 : 0 : nRelState1 &= ~4;
176 : 0 : bTmp = rRef1.Flags.bTabRel;
177 : 0 : rRef1.Flags.bTabRel = rRef2.Flags.bTabRel;
178 : 0 : rRef2.Flags.bTabRel = bTmp;
179 : 0 : bTmp = rRef1.Flags.bTabDeleted;
180 : 0 : rRef1.Flags.bTabDeleted = rRef2.Flags.bTabDeleted;
181 : 0 : rRef2.Flags.bTabDeleted = bTmp;
182 : : }
183 [ + + ]: 345 : rRef1.Flags.bRelName = ( nRelState1 ? sal_True : false );
184 [ + + ]: 345 : rRef2.Flags.bRelName = ( nRelState2 ? sal_True : false );
185 : 345 : }
186 : :
187 : :
188 : 345 : void ScComplexRefData::PutInOrder()
189 : : {
190 : 345 : lcl_putInOrder( Ref1, Ref2);
191 : 345 : }
192 : :
193 : :
194 : 0 : static void lcl_adjustInOrder( ScSingleRefData & rRef1, ScSingleRefData & rRef2, bool bFirstLeader )
195 : : {
196 : : // a1:a2:a3, bFirstLeader: rRef1==a1==r1, rRef2==a3==r2
197 : : // else: rRef1==a3==r2, rRef2==a2==r1
198 [ # # ]: 0 : ScSingleRefData& r1 = (bFirstLeader ? rRef1 : rRef2);
199 [ # # ]: 0 : ScSingleRefData& r2 = (bFirstLeader ? rRef2 : rRef1);
200 [ # # ][ # # ]: 0 : if (r1.Flags.bFlag3D && !r2.Flags.bFlag3D)
201 : : {
202 : : // [$]Sheet1.A5:A6 on Sheet2 do still refer only Sheet1.
203 : 0 : r2.nTab = r1.nTab;
204 : 0 : r2.nRelTab = r1.nRelTab;
205 : 0 : r2.Flags.bTabRel = r1.Flags.bTabRel;
206 : : }
207 : 0 : lcl_putInOrder( rRef1, rRef2);
208 : 0 : }
209 : :
210 : :
211 : 0 : ScComplexRefData& ScComplexRefData::Extend( const ScSingleRefData & rRef, const ScAddress & rPos )
212 : : {
213 [ # # ]: 0 : CalcAbsIfRel( rPos);
214 : 0 : ScSingleRefData aRef = rRef;
215 [ # # ]: 0 : aRef.CalcAbsIfRel( rPos);
216 [ # # ][ # # ]: 0 : bool bInherit3D = Ref1.IsFlag3D() && !Ref2.IsFlag3D();
217 [ # # ][ # # ]: 0 : bool bInherit3Dtemp = bInherit3D && !rRef.IsFlag3D();
218 [ # # ][ # # ]: 0 : if (aRef.nCol < Ref1.nCol || aRef.nRow < Ref1.nRow || aRef.nTab < Ref1.nTab)
[ # # ]
219 : : {
220 : 0 : lcl_adjustInOrder( Ref1, aRef, true);
221 : 0 : aRef = rRef;
222 [ # # ]: 0 : aRef.CalcAbsIfRel( rPos);
223 : : }
224 [ # # ][ # # ]: 0 : if (aRef.nCol > Ref2.nCol || aRef.nRow > Ref2.nRow || aRef.nTab > Ref2.nTab)
[ # # ]
225 : : {
226 [ # # ]: 0 : if (bInherit3D)
227 : 0 : Ref2.SetFlag3D( true);
228 : 0 : lcl_adjustInOrder( aRef, Ref2, false);
229 [ # # ]: 0 : if (bInherit3Dtemp)
230 : 0 : Ref2.SetFlag3D( false);
231 : 0 : aRef = rRef;
232 [ # # ]: 0 : aRef.CalcAbsIfRel( rPos);
233 : : }
234 : : // In Ref2 use absolute/relative addressing from non-extended parts if
235 : : // equal and therefor not adjusted.
236 : : // A$5:A5 => A$5:A$5:A5 => A$5:A5, and not A$5:A$5
237 : : // A$6:$A5 => A$6:A$6:$A5 => A5:$A$6
238 [ # # ]: 0 : if (Ref2.nCol == aRef.nCol)
239 : 0 : Ref2.SetColRel( aRef.IsColRel());
240 [ # # ]: 0 : if (Ref2.nRow == aRef.nRow)
241 : 0 : Ref2.SetRowRel( aRef.IsRowRel());
242 : : // $Sheet1.$A$5:$A$6 => $Sheet1.$A$5:$A$5:$A$6 => $Sheet1.$A$5:$A$6, and
243 : : // not $Sheet1.$A$5:Sheet1.$A$6 (with invisible second 3D, but relative).
244 [ # # ]: 0 : if (Ref2.nTab == aRef.nTab)
245 [ # # ]: 0 : Ref2.SetTabRel( bInherit3Dtemp ? Ref1.IsTabRel() : aRef.IsTabRel());
246 [ # # ]: 0 : Ref2.CalcRelFromAbs( rPos);
247 : : // Force 3D if necessary. References to other sheets always.
248 [ # # ]: 0 : if (Ref1.nTab != rPos.Tab())
249 : 0 : Ref1.SetFlag3D( true);
250 : : // In the second part only if different sheet thus not inherited.
251 [ # # ]: 0 : if (Ref2.nTab != Ref1.nTab)
252 : 0 : Ref2.SetFlag3D( true);
253 : : // Merge Flag3D to Ref2 in case there was nothing to inherit and/or range
254 : : // wasn't extended as in A5:A5:Sheet1.A5 if on Sheet1.
255 [ # # ]: 0 : if (rRef.IsFlag3D())
256 : 0 : Ref2.SetFlag3D( true);
257 : 0 : return *this;
258 : : }
259 : :
260 : :
261 : 0 : ScComplexRefData& ScComplexRefData::Extend( const ScComplexRefData & rRef, const ScAddress & rPos )
262 : : {
263 : 0 : return Extend( rRef.Ref1, rPos).Extend( rRef.Ref2, rPos);
264 : : }
265 : :
266 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|