1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*b3f79822SAndrew Rist * distributed with this work for additional information
6*b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist * KIND, either express or implied. See the License for the
17*b3f79822SAndrew Rist * specific language governing permissions and limitations
18*b3f79822SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*b3f79822SAndrew Rist *************************************************************/
21*b3f79822SAndrew Rist
22*b3f79822SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include <tools/debug.hxx>
30cdf0e10cSrcweir
31cdf0e10cSrcweir #include "refupdat.hxx"
32cdf0e10cSrcweir #include "document.hxx"
33cdf0e10cSrcweir #include "compiler.hxx"
34cdf0e10cSrcweir #include "bigrange.hxx"
35cdf0e10cSrcweir #include "chgtrack.hxx"
36cdf0e10cSrcweir
37cdf0e10cSrcweir //------------------------------------------------------------------------
38cdf0e10cSrcweir
39cdf0e10cSrcweir template< typename R, typename S, typename U >
lcl_MoveStart(R & rRef,U nStart,S nDelta,U nMask)40cdf0e10cSrcweir sal_Bool lcl_MoveStart( R& rRef, U nStart, S nDelta, U nMask )
41cdf0e10cSrcweir {
42cdf0e10cSrcweir sal_Bool bCut = sal_False;
43cdf0e10cSrcweir if ( rRef >= nStart )
44cdf0e10cSrcweir rRef = sal::static_int_cast<R>( rRef + nDelta );
45cdf0e10cSrcweir else if ( nDelta < 0 && rRef >= nStart + nDelta )
46cdf0e10cSrcweir rRef = nStart + nDelta; //! begrenzen ???
47cdf0e10cSrcweir if ( rRef < 0 )
48cdf0e10cSrcweir {
49cdf0e10cSrcweir rRef = 0;
50cdf0e10cSrcweir bCut = sal_True;
51cdf0e10cSrcweir }
52cdf0e10cSrcweir else if ( rRef > nMask )
53cdf0e10cSrcweir {
54cdf0e10cSrcweir rRef = nMask;
55cdf0e10cSrcweir bCut = sal_True;
56cdf0e10cSrcweir }
57cdf0e10cSrcweir return bCut;
58cdf0e10cSrcweir }
59cdf0e10cSrcweir
60cdf0e10cSrcweir template< typename R, typename S, typename U >
lcl_MoveEnd(R & rRef,U nStart,S nDelta,U nMask)61cdf0e10cSrcweir sal_Bool lcl_MoveEnd( R& rRef, U nStart, S nDelta, U nMask )
62cdf0e10cSrcweir {
63cdf0e10cSrcweir sal_Bool bCut = sal_False;
64cdf0e10cSrcweir if ( rRef >= nStart )
65cdf0e10cSrcweir rRef = sal::static_int_cast<R>( rRef + nDelta );
66cdf0e10cSrcweir else if ( nDelta < 0 && rRef >= nStart + nDelta )
67cdf0e10cSrcweir rRef = nStart + nDelta - 1; //! begrenzen ???
68cdf0e10cSrcweir if ( rRef < 0 )
69cdf0e10cSrcweir {
70cdf0e10cSrcweir rRef = 0;
71cdf0e10cSrcweir bCut = sal_True;
72cdf0e10cSrcweir }
73cdf0e10cSrcweir else if ( rRef > nMask )
74cdf0e10cSrcweir {
75cdf0e10cSrcweir rRef = nMask;
76cdf0e10cSrcweir bCut = sal_True;
77cdf0e10cSrcweir }
78cdf0e10cSrcweir return bCut;
79cdf0e10cSrcweir }
80cdf0e10cSrcweir
81cdf0e10cSrcweir template< typename R, typename S, typename U >
lcl_MoveReorder(R & rRef,U nStart,U nEnd,S nDelta)82cdf0e10cSrcweir sal_Bool lcl_MoveReorder( R& rRef, U nStart, U nEnd, S nDelta )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir if ( rRef >= nStart && rRef <= nEnd )
85cdf0e10cSrcweir {
86cdf0e10cSrcweir rRef = sal::static_int_cast<R>( rRef + nDelta );
87cdf0e10cSrcweir return sal_True;
88cdf0e10cSrcweir }
89cdf0e10cSrcweir
90cdf0e10cSrcweir if ( nDelta > 0 ) // nach hinten schieben
91cdf0e10cSrcweir {
92cdf0e10cSrcweir if ( rRef >= nStart && rRef <= nEnd + nDelta )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir if ( rRef <= nEnd )
95cdf0e10cSrcweir rRef = sal::static_int_cast<R>( rRef + nDelta ); // in the moved range
96cdf0e10cSrcweir else
97cdf0e10cSrcweir rRef -= nEnd - nStart + 1; // nachruecken
98cdf0e10cSrcweir return sal_True;
99cdf0e10cSrcweir }
100cdf0e10cSrcweir }
101cdf0e10cSrcweir else // nach vorne schieben
102cdf0e10cSrcweir {
103cdf0e10cSrcweir if ( rRef >= nStart + nDelta && rRef <= nEnd )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir if ( rRef >= nStart )
106cdf0e10cSrcweir rRef = sal::static_int_cast<R>( rRef + nDelta ); // in the moved range
107cdf0e10cSrcweir else
108cdf0e10cSrcweir rRef += nEnd - nStart + 1; // nachruecken
109cdf0e10cSrcweir return sal_True;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir }
112cdf0e10cSrcweir
113cdf0e10cSrcweir return sal_False;
114cdf0e10cSrcweir }
115cdf0e10cSrcweir
116cdf0e10cSrcweir template< typename R, typename S, typename U >
lcl_MoveItCut(R & rRef,S nDelta,U nMask)117cdf0e10cSrcweir sal_Bool lcl_MoveItCut( R& rRef, S nDelta, U nMask )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir sal_Bool bCut = sal_False;
120cdf0e10cSrcweir rRef = sal::static_int_cast<R>( rRef + nDelta );
121cdf0e10cSrcweir if ( rRef < 0 )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir rRef = 0;
124cdf0e10cSrcweir bCut = sal_True;
125cdf0e10cSrcweir }
126cdf0e10cSrcweir else if ( rRef > nMask )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir rRef = nMask;
129cdf0e10cSrcweir bCut = sal_True;
130cdf0e10cSrcweir }
131cdf0e10cSrcweir return bCut;
132cdf0e10cSrcweir }
133cdf0e10cSrcweir
134cdf0e10cSrcweir template< typename R, typename S, typename U >
lcl_MoveItWrap(R & rRef,S nDelta,U nMask)135cdf0e10cSrcweir void lcl_MoveItWrap( R& rRef, S nDelta, U nMask )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir rRef = sal::static_int_cast<R>( rRef + nDelta );
138cdf0e10cSrcweir if ( rRef < 0 )
139cdf0e10cSrcweir rRef += nMask+1;
140cdf0e10cSrcweir else if ( rRef > nMask )
141cdf0e10cSrcweir rRef -= nMask+1;
142cdf0e10cSrcweir }
143cdf0e10cSrcweir
144cdf0e10cSrcweir template< typename R, typename S, typename U >
lcl_MoveRefPart(R & rRef1Val,sal_Bool & rRef1Del,sal_Bool bDo1,R & rRef2Val,sal_Bool & rRef2Del,sal_Bool bDo2,U nStart,U nEnd,S nDelta,U nMask)145cdf0e10cSrcweir sal_Bool lcl_MoveRefPart( R& rRef1Val, sal_Bool& rRef1Del, sal_Bool bDo1,
146cdf0e10cSrcweir R& rRef2Val, sal_Bool& rRef2Del, sal_Bool bDo2,
147cdf0e10cSrcweir U nStart, U nEnd, S nDelta, U nMask )
148cdf0e10cSrcweir {
149cdf0e10cSrcweir if ( nDelta )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir sal_Bool bDel, bCut1, bCut2;
152cdf0e10cSrcweir bDel = bCut1 = bCut2 = sal_False;
153cdf0e10cSrcweir S n;
154cdf0e10cSrcweir if (bDo1 && bDo2)
155cdf0e10cSrcweir {
156cdf0e10cSrcweir if ( nDelta < 0 )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir n = nStart + nDelta;
159cdf0e10cSrcweir if ( n <= rRef1Val && rRef1Val < nStart
160cdf0e10cSrcweir && n <= rRef2Val && rRef2Val < nStart )
161cdf0e10cSrcweir bDel = sal_True;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir else
164cdf0e10cSrcweir {
165cdf0e10cSrcweir n = nEnd + nDelta;
166cdf0e10cSrcweir if ( nEnd < rRef1Val && rRef1Val <= n
167cdf0e10cSrcweir && nEnd < rRef2Val && rRef2Val <= n )
168cdf0e10cSrcweir bDel = sal_True;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir }
171cdf0e10cSrcweir if ( bDel )
172cdf0e10cSrcweir { // move deleted along
173cdf0e10cSrcweir rRef1Val = sal::static_int_cast<R>( rRef1Val + nDelta );
174cdf0e10cSrcweir rRef2Val = sal::static_int_cast<R>( rRef2Val + nDelta );
175cdf0e10cSrcweir }
176cdf0e10cSrcweir else
177cdf0e10cSrcweir {
178cdf0e10cSrcweir if (bDo1)
179cdf0e10cSrcweir {
180cdf0e10cSrcweir if ( rRef1Del )
181cdf0e10cSrcweir rRef1Val = sal::static_int_cast<R>( rRef1Val + nDelta );
182cdf0e10cSrcweir else
183cdf0e10cSrcweir bCut1 = lcl_MoveStart( rRef1Val, nStart, nDelta, nMask );
184cdf0e10cSrcweir }
185cdf0e10cSrcweir if (bDo2)
186cdf0e10cSrcweir {
187cdf0e10cSrcweir if ( rRef2Del )
188cdf0e10cSrcweir rRef2Val = sal::static_int_cast<R>( rRef2Val + nDelta );
189cdf0e10cSrcweir else
190cdf0e10cSrcweir bCut2 = lcl_MoveEnd( rRef2Val, nStart, nDelta, nMask );
191cdf0e10cSrcweir }
192cdf0e10cSrcweir }
193cdf0e10cSrcweir if ( bDel || (bCut1 && bCut2) )
194cdf0e10cSrcweir rRef1Del = rRef2Del = sal_True;
195cdf0e10cSrcweir return bDel || bCut1 || bCut2 || rRef1Del || rRef2Del;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir else
198cdf0e10cSrcweir return sal_False;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
201cdf0e10cSrcweir template< typename R, typename S, typename U >
IsExpand(R n1,R n2,U nStart,S nD)202cdf0e10cSrcweir sal_Bool IsExpand( R n1, R n2, U nStart, S nD )
203cdf0e10cSrcweir { //! vor normalem Move...
204cdf0e10cSrcweir return
205cdf0e10cSrcweir nD > 0 // Insert
206cdf0e10cSrcweir && n1 < n2 // mindestens zwei Cols/Rows/Tabs in Ref
207cdf0e10cSrcweir && (
208cdf0e10cSrcweir (nStart <= n1 && n1 < nStart + nD) // n1 innerhalb des Insert
209cdf0e10cSrcweir || (n2 + 1 == nStart) // n2 direkt vor Insert
210cdf0e10cSrcweir ); // n1 < nStart <= n2 wird sowieso expanded!
211cdf0e10cSrcweir }
212cdf0e10cSrcweir
213cdf0e10cSrcweir
214cdf0e10cSrcweir template< typename R, typename S, typename U >
Expand(R & n1,R & n2,U nStart,S nD)215cdf0e10cSrcweir void Expand( R& n1, R& n2, U nStart, S nD )
216cdf0e10cSrcweir { //! nach normalem Move..., nur wenn IsExpand vorher sal_True war!
217cdf0e10cSrcweir //! erst das Ende
218cdf0e10cSrcweir if ( n2 + 1 == nStart )
219cdf0e10cSrcweir { // am Ende
220cdf0e10cSrcweir n2 = sal::static_int_cast<R>( n2 + nD );
221cdf0e10cSrcweir return;
222cdf0e10cSrcweir }
223cdf0e10cSrcweir // am Anfang
224cdf0e10cSrcweir n1 = sal::static_int_cast<R>( n1 - nD );
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
227cdf0e10cSrcweir
lcl_IsWrapBig(sal_Int32 nRef,sal_Int32 nDelta)228cdf0e10cSrcweir sal_Bool lcl_IsWrapBig( sal_Int32 nRef, sal_Int32 nDelta )
229cdf0e10cSrcweir {
230cdf0e10cSrcweir if ( nRef > 0 && nDelta > 0 )
231cdf0e10cSrcweir return nRef + nDelta <= 0;
232cdf0e10cSrcweir else if ( nRef < 0 && nDelta < 0 )
233cdf0e10cSrcweir return nRef + nDelta >= 0;
234cdf0e10cSrcweir return sal_False;
235cdf0e10cSrcweir }
236cdf0e10cSrcweir
237cdf0e10cSrcweir
lcl_MoveBig(sal_Int32 & rRef,sal_Int32 nStart,sal_Int32 nDelta)238cdf0e10cSrcweir sal_Bool lcl_MoveBig( sal_Int32& rRef, sal_Int32 nStart, sal_Int32 nDelta )
239cdf0e10cSrcweir {
240cdf0e10cSrcweir sal_Bool bCut = sal_False;
241cdf0e10cSrcweir if ( rRef >= nStart )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir if ( nDelta > 0 )
244cdf0e10cSrcweir bCut = lcl_IsWrapBig( rRef, nDelta );
245cdf0e10cSrcweir if ( bCut )
246cdf0e10cSrcweir rRef = nInt32Max;
247cdf0e10cSrcweir else
248cdf0e10cSrcweir rRef += nDelta;
249cdf0e10cSrcweir }
250cdf0e10cSrcweir return bCut;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir
lcl_MoveItCutBig(sal_Int32 & rRef,sal_Int32 nDelta)253cdf0e10cSrcweir sal_Bool lcl_MoveItCutBig( sal_Int32& rRef, sal_Int32 nDelta )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir sal_Bool bCut = lcl_IsWrapBig( rRef, nDelta );
256cdf0e10cSrcweir rRef += nDelta;
257cdf0e10cSrcweir return bCut;
258cdf0e10cSrcweir }
259cdf0e10cSrcweir
260cdf0e10cSrcweir
Update(ScDocument * pDoc,UpdateRefMode eUpdateRefMode,SCCOL nCol1,SCROW nRow1,SCTAB nTab1,SCCOL nCol2,SCROW nRow2,SCTAB nTab2,SCsCOL nDx,SCsROW nDy,SCsTAB nDz,SCCOL & theCol1,SCROW & theRow1,SCTAB & theTab1,SCCOL & theCol2,SCROW & theRow2,SCTAB & theTab2)261cdf0e10cSrcweir ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eUpdateRefMode,
262cdf0e10cSrcweir SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
263cdf0e10cSrcweir SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
264cdf0e10cSrcweir SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
265cdf0e10cSrcweir SCCOL& theCol1, SCROW& theRow1, SCTAB& theTab1,
266cdf0e10cSrcweir SCCOL& theCol2, SCROW& theRow2, SCTAB& theTab2 )
267cdf0e10cSrcweir {
268cdf0e10cSrcweir ScRefUpdateRes eRet = UR_NOTHING;
269cdf0e10cSrcweir
270cdf0e10cSrcweir SCCOL oldCol1 = theCol1;
271cdf0e10cSrcweir SCROW oldRow1 = theRow1;
272cdf0e10cSrcweir SCTAB oldTab1 = theTab1;
273cdf0e10cSrcweir SCCOL oldCol2 = theCol2;
274cdf0e10cSrcweir SCROW oldRow2 = theRow2;
275cdf0e10cSrcweir SCTAB oldTab2 = theTab2;
276cdf0e10cSrcweir
277cdf0e10cSrcweir sal_Bool bCut1, bCut2;
278cdf0e10cSrcweir
279cdf0e10cSrcweir if (eUpdateRefMode == URM_INSDEL)
280cdf0e10cSrcweir {
281cdf0e10cSrcweir sal_Bool bExpand = pDoc->IsExpandRefs();
282cdf0e10cSrcweir if ( nDx && (theRow1 >= nRow1) && (theRow2 <= nRow2) &&
283cdf0e10cSrcweir (theTab1 >= nTab1) && (theTab2 <= nTab2) )
284cdf0e10cSrcweir {
285cdf0e10cSrcweir sal_Bool bExp = (bExpand && IsExpand( theCol1, theCol2, nCol1, nDx ));
286cdf0e10cSrcweir bCut1 = lcl_MoveStart( theCol1, nCol1, nDx, MAXCOL );
287cdf0e10cSrcweir bCut2 = lcl_MoveEnd( theCol2, nCol1, nDx, MAXCOL );
288cdf0e10cSrcweir if ( theCol2 < theCol1 )
289cdf0e10cSrcweir {
290cdf0e10cSrcweir eRet = UR_INVALID;
291cdf0e10cSrcweir theCol2 = theCol1;
292cdf0e10cSrcweir }
293cdf0e10cSrcweir else if ( bCut1 || bCut2 )
294cdf0e10cSrcweir eRet = UR_UPDATED;
295cdf0e10cSrcweir if ( bExp )
296cdf0e10cSrcweir {
297cdf0e10cSrcweir Expand( theCol1, theCol2, nCol1, nDx );
298cdf0e10cSrcweir eRet = UR_UPDATED;
299cdf0e10cSrcweir }
300cdf0e10cSrcweir }
301cdf0e10cSrcweir if ( nDy && (theCol1 >= nCol1) && (theCol2 <= nCol2) &&
302cdf0e10cSrcweir (theTab1 >= nTab1) && (theTab2 <= nTab2) )
303cdf0e10cSrcweir {
304cdf0e10cSrcweir sal_Bool bExp = (bExpand && IsExpand( theRow1, theRow2, nRow1, nDy ));
305cdf0e10cSrcweir bCut1 = lcl_MoveStart( theRow1, nRow1, nDy, MAXROW );
306cdf0e10cSrcweir bCut2 = lcl_MoveEnd( theRow2, nRow1, nDy, MAXROW );
307cdf0e10cSrcweir if ( theRow2 < theRow1 )
308cdf0e10cSrcweir {
309cdf0e10cSrcweir eRet = UR_INVALID;
310cdf0e10cSrcweir theRow2 = theRow1;
311cdf0e10cSrcweir }
312cdf0e10cSrcweir else if ( bCut1 || bCut2 )
313cdf0e10cSrcweir eRet = UR_UPDATED;
314cdf0e10cSrcweir if ( bExp )
315cdf0e10cSrcweir {
316cdf0e10cSrcweir Expand( theRow1, theRow2, nRow1, nDy );
317cdf0e10cSrcweir eRet = UR_UPDATED;
318cdf0e10cSrcweir }
319cdf0e10cSrcweir }
320cdf0e10cSrcweir if ( nDz && (theCol1 >= nCol1) && (theCol2 <= nCol2) &&
321cdf0e10cSrcweir (theRow1 >= nRow1) && (theRow2 <= nRow2) )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir SCsTAB nMaxTab = pDoc->GetTableCount() - 1;
324cdf0e10cSrcweir nMaxTab = sal::static_int_cast<SCsTAB>(nMaxTab + nDz); // adjust to new count
325cdf0e10cSrcweir sal_Bool bExp = (bExpand && IsExpand( theTab1, theTab2, nTab1, nDz ));
326cdf0e10cSrcweir bCut1 = lcl_MoveStart( theTab1, nTab1, nDz, static_cast<SCTAB>(nMaxTab) );
327cdf0e10cSrcweir bCut2 = lcl_MoveEnd( theTab2, nTab1, nDz, static_cast<SCTAB>(nMaxTab) );
328cdf0e10cSrcweir if ( theTab2 < theTab1 )
329cdf0e10cSrcweir {
330cdf0e10cSrcweir eRet = UR_INVALID;
331cdf0e10cSrcweir theTab2 = theTab1;
332cdf0e10cSrcweir }
333cdf0e10cSrcweir else if ( bCut1 || bCut2 )
334cdf0e10cSrcweir eRet = UR_UPDATED;
335cdf0e10cSrcweir if ( bExp )
336cdf0e10cSrcweir {
337cdf0e10cSrcweir Expand( theTab1, theTab2, nTab1, nDz );
338cdf0e10cSrcweir eRet = UR_UPDATED;
339cdf0e10cSrcweir }
340cdf0e10cSrcweir }
341cdf0e10cSrcweir }
342cdf0e10cSrcweir else if (eUpdateRefMode == URM_MOVE)
343cdf0e10cSrcweir {
344cdf0e10cSrcweir if ((theCol1 >= nCol1-nDx) && (theRow1 >= nRow1-nDy) && (theTab1 >= nTab1-nDz) &&
345cdf0e10cSrcweir (theCol2 <= nCol2-nDx) && (theRow2 <= nRow2-nDy) && (theTab2 <= nTab2-nDz))
346cdf0e10cSrcweir {
347cdf0e10cSrcweir if ( nDx )
348cdf0e10cSrcweir {
349cdf0e10cSrcweir bCut1 = lcl_MoveItCut( theCol1, nDx, MAXCOL );
350cdf0e10cSrcweir bCut2 = lcl_MoveItCut( theCol2, nDx, MAXCOL );
351cdf0e10cSrcweir if ( bCut1 || bCut2 )
352cdf0e10cSrcweir eRet = UR_UPDATED;
353cdf0e10cSrcweir }
354cdf0e10cSrcweir if ( nDy )
355cdf0e10cSrcweir {
356cdf0e10cSrcweir bCut1 = lcl_MoveItCut( theRow1, nDy, MAXROW );
357cdf0e10cSrcweir bCut2 = lcl_MoveItCut( theRow2, nDy, MAXROW );
358cdf0e10cSrcweir if ( bCut1 || bCut2 )
359cdf0e10cSrcweir eRet = UR_UPDATED;
360cdf0e10cSrcweir }
361cdf0e10cSrcweir if ( nDz )
362cdf0e10cSrcweir {
363cdf0e10cSrcweir SCsTAB nMaxTab = (SCsTAB) pDoc->GetTableCount() - 1;
364cdf0e10cSrcweir bCut1 = lcl_MoveItCut( theTab1, nDz, static_cast<SCTAB>(nMaxTab) );
365cdf0e10cSrcweir bCut2 = lcl_MoveItCut( theTab2, nDz, static_cast<SCTAB>(nMaxTab) );
366cdf0e10cSrcweir if ( bCut1 || bCut2 )
367cdf0e10cSrcweir eRet = UR_UPDATED;
368cdf0e10cSrcweir }
369cdf0e10cSrcweir }
370cdf0e10cSrcweir }
371cdf0e10cSrcweir else if (eUpdateRefMode == URM_REORDER)
372cdf0e10cSrcweir {
373cdf0e10cSrcweir // bisher nur fuer nDz (MoveTab)
374cdf0e10cSrcweir DBG_ASSERT ( !nDx && !nDy, "URM_REORDER fuer x und y noch nicht implementiert" );
375cdf0e10cSrcweir
376cdf0e10cSrcweir if ( nDz && (theCol1 >= nCol1) && (theCol2 <= nCol2) &&
377cdf0e10cSrcweir (theRow1 >= nRow1) && (theRow2 <= nRow2) )
378cdf0e10cSrcweir {
379cdf0e10cSrcweir bCut1 = lcl_MoveReorder( theTab1, nTab1, nTab2, nDz );
380cdf0e10cSrcweir bCut2 = lcl_MoveReorder( theTab2, nTab1, nTab2, nDz );
381cdf0e10cSrcweir if ( bCut1 || bCut2 )
382cdf0e10cSrcweir eRet = UR_UPDATED;
383cdf0e10cSrcweir }
384cdf0e10cSrcweir }
385cdf0e10cSrcweir
386cdf0e10cSrcweir if ( eRet == UR_NOTHING )
387cdf0e10cSrcweir {
388cdf0e10cSrcweir if (oldCol1 != theCol1
389cdf0e10cSrcweir || oldRow1 != theRow1
390cdf0e10cSrcweir || oldTab1 != theTab1
391cdf0e10cSrcweir || oldCol2 != theCol2
392cdf0e10cSrcweir || oldRow2 != theRow2
393cdf0e10cSrcweir || oldTab2 != theTab2
394cdf0e10cSrcweir )
395cdf0e10cSrcweir eRet = UR_UPDATED;
396cdf0e10cSrcweir }
397cdf0e10cSrcweir return eRet;
398cdf0e10cSrcweir }
399cdf0e10cSrcweir
400cdf0e10cSrcweir
401cdf0e10cSrcweir // simples UpdateReference fuer ScBigRange (ScChangeAction/ScChangeTrack)
402cdf0e10cSrcweir // Referenzen koennen auch ausserhalb des Dokuments liegen!
403cdf0e10cSrcweir // Ganze Spalten/Zeilen (nInt32Min..nInt32Max) bleiben immer solche!
Update(UpdateRefMode eUpdateRefMode,const ScBigRange & rWhere,sal_Int32 nDx,sal_Int32 nDy,sal_Int32 nDz,ScBigRange & rWhat)404cdf0e10cSrcweir ScRefUpdateRes ScRefUpdate::Update( UpdateRefMode eUpdateRefMode,
405cdf0e10cSrcweir const ScBigRange& rWhere, sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz,
406cdf0e10cSrcweir ScBigRange& rWhat )
407cdf0e10cSrcweir {
408cdf0e10cSrcweir ScRefUpdateRes eRet = UR_NOTHING;
409cdf0e10cSrcweir const ScBigRange aOldRange( rWhat );
410cdf0e10cSrcweir
411cdf0e10cSrcweir sal_Int32 nCol1, nRow1, nTab1, nCol2, nRow2, nTab2;
412cdf0e10cSrcweir sal_Int32 theCol1, theRow1, theTab1, theCol2, theRow2, theTab2;
413cdf0e10cSrcweir rWhere.GetVars( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 );
414cdf0e10cSrcweir rWhat.GetVars( theCol1, theRow1, theTab1, theCol2, theRow2, theTab2 );
415cdf0e10cSrcweir
416cdf0e10cSrcweir sal_Bool bCut1, bCut2;
417cdf0e10cSrcweir
418cdf0e10cSrcweir if (eUpdateRefMode == URM_INSDEL)
419cdf0e10cSrcweir {
420cdf0e10cSrcweir if ( nDx && (theRow1 >= nRow1) && (theRow2 <= nRow2) &&
421cdf0e10cSrcweir (theTab1 >= nTab1) && (theTab2 <= nTab2) &&
422cdf0e10cSrcweir !(theCol1 == nInt32Min && theCol2 == nInt32Max) )
423cdf0e10cSrcweir {
424cdf0e10cSrcweir bCut1 = lcl_MoveBig( theCol1, nCol1, nDx );
425cdf0e10cSrcweir bCut2 = lcl_MoveBig( theCol2, nCol1, nDx );
426cdf0e10cSrcweir if ( bCut1 || bCut2 )
427cdf0e10cSrcweir eRet = UR_UPDATED;
428cdf0e10cSrcweir rWhat.aStart.SetCol( theCol1 );
429cdf0e10cSrcweir rWhat.aEnd.SetCol( theCol2 );
430cdf0e10cSrcweir }
431cdf0e10cSrcweir if ( nDy && (theCol1 >= nCol1) && (theCol2 <= nCol2) &&
432cdf0e10cSrcweir (theTab1 >= nTab1) && (theTab2 <= nTab2) &&
433cdf0e10cSrcweir !(theRow1 == nInt32Min && theRow2 == nInt32Max) )
434cdf0e10cSrcweir {
435cdf0e10cSrcweir bCut1 = lcl_MoveBig( theRow1, nRow1, nDy );
436cdf0e10cSrcweir bCut2 = lcl_MoveBig( theRow2, nRow1, nDy );
437cdf0e10cSrcweir if ( bCut1 || bCut2 )
438cdf0e10cSrcweir eRet = UR_UPDATED;
439cdf0e10cSrcweir rWhat.aStart.SetRow( theRow1 );
440cdf0e10cSrcweir rWhat.aEnd.SetRow( theRow2 );
441cdf0e10cSrcweir }
442cdf0e10cSrcweir if ( nDz && (theCol1 >= nCol1) && (theCol2 <= nCol2) &&
443cdf0e10cSrcweir (theRow1 >= nRow1) && (theRow2 <= nRow2) &&
444cdf0e10cSrcweir !(theTab1 == nInt32Min && theTab2 == nInt32Max) )
445cdf0e10cSrcweir {
446cdf0e10cSrcweir bCut1 = lcl_MoveBig( theTab1, nTab1, nDz );
447cdf0e10cSrcweir bCut2 = lcl_MoveBig( theTab2, nTab1, nDz );
448cdf0e10cSrcweir if ( bCut1 || bCut2 )
449cdf0e10cSrcweir eRet = UR_UPDATED;
450cdf0e10cSrcweir rWhat.aStart.SetTab( theTab1 );
451cdf0e10cSrcweir rWhat.aEnd.SetTab( theTab2 );
452cdf0e10cSrcweir }
453cdf0e10cSrcweir }
454cdf0e10cSrcweir else if (eUpdateRefMode == URM_MOVE)
455cdf0e10cSrcweir {
456cdf0e10cSrcweir if ( rWhere.In( rWhat ) )
457cdf0e10cSrcweir {
458cdf0e10cSrcweir if ( nDx && !(theCol1 == nInt32Min && theCol2 == nInt32Max) )
459cdf0e10cSrcweir {
460cdf0e10cSrcweir bCut1 = lcl_MoveItCutBig( theCol1, nDx );
461cdf0e10cSrcweir bCut2 = lcl_MoveItCutBig( theCol2, nDx );
462cdf0e10cSrcweir if ( bCut1 || bCut2 )
463cdf0e10cSrcweir eRet = UR_UPDATED;
464cdf0e10cSrcweir rWhat.aStart.SetCol( theCol1 );
465cdf0e10cSrcweir rWhat.aEnd.SetCol( theCol2 );
466cdf0e10cSrcweir }
467cdf0e10cSrcweir if ( nDy && !(theRow1 == nInt32Min && theRow2 == nInt32Max) )
468cdf0e10cSrcweir {
469cdf0e10cSrcweir bCut1 = lcl_MoveItCutBig( theRow1, nDy );
470cdf0e10cSrcweir bCut2 = lcl_MoveItCutBig( theRow2, nDy );
471cdf0e10cSrcweir if ( bCut1 || bCut2 )
472cdf0e10cSrcweir eRet = UR_UPDATED;
473cdf0e10cSrcweir rWhat.aStart.SetRow( theRow1 );
474cdf0e10cSrcweir rWhat.aEnd.SetRow( theRow2 );
475cdf0e10cSrcweir }
476cdf0e10cSrcweir if ( nDz && !(theTab1 == nInt32Min && theTab2 == nInt32Max) )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir bCut1 = lcl_MoveItCutBig( theTab1, nDz );
479cdf0e10cSrcweir bCut2 = lcl_MoveItCutBig( theTab2, nDz );
480cdf0e10cSrcweir if ( bCut1 || bCut2 )
481cdf0e10cSrcweir eRet = UR_UPDATED;
482cdf0e10cSrcweir rWhat.aStart.SetTab( theTab1 );
483cdf0e10cSrcweir rWhat.aEnd.SetTab( theTab2 );
484cdf0e10cSrcweir }
485cdf0e10cSrcweir }
486cdf0e10cSrcweir }
487cdf0e10cSrcweir
488cdf0e10cSrcweir if ( eRet == UR_NOTHING && rWhat != aOldRange )
489cdf0e10cSrcweir eRet = UR_UPDATED;
490cdf0e10cSrcweir
491cdf0e10cSrcweir return eRet;
492cdf0e10cSrcweir }
493cdf0e10cSrcweir
494cdf0e10cSrcweir
Update(ScDocument * pDoc,UpdateRefMode eMode,const ScAddress & rPos,const ScRange & r,SCsCOL nDx,SCsROW nDy,SCsTAB nDz,ScComplexRefData & rRef,WhatType eWhat)495cdf0e10cSrcweir ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
496cdf0e10cSrcweir const ScAddress& rPos, const ScRange& r,
497cdf0e10cSrcweir SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
498cdf0e10cSrcweir ScComplexRefData& rRef, WhatType eWhat )
499cdf0e10cSrcweir {
500cdf0e10cSrcweir ScRefUpdateRes eRet = UR_NOTHING;
501cdf0e10cSrcweir
502cdf0e10cSrcweir SCCOL nCol1 = r.aStart.Col();
503cdf0e10cSrcweir SCROW nRow1 = r.aStart.Row();
504cdf0e10cSrcweir SCTAB nTab1 = r.aStart.Tab();
505cdf0e10cSrcweir SCCOL nCol2 = r.aEnd.Col();
506cdf0e10cSrcweir SCROW nRow2 = r.aEnd.Row();
507cdf0e10cSrcweir SCTAB nTab2 = r.aEnd.Tab();
508cdf0e10cSrcweir
509cdf0e10cSrcweir if( eMode == URM_INSDEL )
510cdf0e10cSrcweir {
511cdf0e10cSrcweir sal_Bool bExpand = pDoc->IsExpandRefs();
512cdf0e10cSrcweir
513cdf0e10cSrcweir const ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
514cdf0e10cSrcweir sal_Bool bInDeleteUndo =
515cdf0e10cSrcweir ( pChangeTrack ? pChangeTrack->IsInDeleteUndo() : sal_False );
516cdf0e10cSrcweir
517cdf0e10cSrcweir SCCOL oldCol1 = rRef.Ref1.nCol;
518cdf0e10cSrcweir SCROW oldRow1 = rRef.Ref1.nRow;
519cdf0e10cSrcweir SCTAB oldTab1 = rRef.Ref1.nTab;
520cdf0e10cSrcweir SCCOL oldCol2 = rRef.Ref2.nCol;
521cdf0e10cSrcweir SCROW oldRow2 = rRef.Ref2.nRow;
522cdf0e10cSrcweir SCTAB oldTab2 = rRef.Ref2.nTab;
523cdf0e10cSrcweir
524cdf0e10cSrcweir sal_Bool bRef1ColDel = rRef.Ref1.IsColDeleted();
525cdf0e10cSrcweir sal_Bool bRef2ColDel = rRef.Ref2.IsColDeleted();
526cdf0e10cSrcweir sal_Bool bRef1RowDel = rRef.Ref1.IsRowDeleted();
527cdf0e10cSrcweir sal_Bool bRef2RowDel = rRef.Ref2.IsRowDeleted();
528cdf0e10cSrcweir sal_Bool bRef1TabDel = rRef.Ref1.IsTabDeleted();
529cdf0e10cSrcweir sal_Bool bRef2TabDel = rRef.Ref2.IsTabDeleted();
530cdf0e10cSrcweir
531cdf0e10cSrcweir if( nDx &&
532cdf0e10cSrcweir ((rRef.Ref1.nRow >= nRow1
533cdf0e10cSrcweir && rRef.Ref2.nRow <= nRow2) || (bRef1RowDel || bRef2RowDel))
534cdf0e10cSrcweir &&
535cdf0e10cSrcweir ((rRef.Ref1.nTab >= nTab1
536cdf0e10cSrcweir && rRef.Ref2.nTab <= nTab2) || (bRef1TabDel || bRef2TabDel))
537cdf0e10cSrcweir )
538cdf0e10cSrcweir {
539cdf0e10cSrcweir sal_Bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nCol,
540cdf0e10cSrcweir rRef.Ref2.nCol, nCol1, nDx ));
541cdf0e10cSrcweir sal_Bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
542cdf0e10cSrcweir ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsColRel()));
543cdf0e10cSrcweir sal_Bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
544cdf0e10cSrcweir ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsColRel()));
545cdf0e10cSrcweir if ( lcl_MoveRefPart( rRef.Ref1.nCol, bRef1ColDel, bDo1,
546cdf0e10cSrcweir rRef.Ref2.nCol, bRef2ColDel, bDo2,
547cdf0e10cSrcweir nCol1, nCol2, nDx, MAXCOL ) )
548cdf0e10cSrcweir {
549cdf0e10cSrcweir eRet = UR_UPDATED;
550cdf0e10cSrcweir if ( bInDeleteUndo && (bRef1ColDel || bRef2ColDel) )
551cdf0e10cSrcweir {
552cdf0e10cSrcweir if ( bRef1ColDel && nCol1 <= rRef.Ref1.nCol &&
553cdf0e10cSrcweir rRef.Ref1.nCol <= nCol1 + nDx )
554cdf0e10cSrcweir rRef.Ref1.SetColDeleted( sal_False );
555cdf0e10cSrcweir if ( bRef2ColDel && nCol1 <= rRef.Ref2.nCol &&
556cdf0e10cSrcweir rRef.Ref2.nCol <= nCol1 + nDx )
557cdf0e10cSrcweir rRef.Ref2.SetColDeleted( sal_False );
558cdf0e10cSrcweir }
559cdf0e10cSrcweir else
560cdf0e10cSrcweir {
561cdf0e10cSrcweir if ( bRef1ColDel )
562cdf0e10cSrcweir rRef.Ref1.SetColDeleted( sal_True );
563cdf0e10cSrcweir if ( bRef2ColDel )
564cdf0e10cSrcweir rRef.Ref2.SetColDeleted( sal_True );
565cdf0e10cSrcweir }
566cdf0e10cSrcweir }
567cdf0e10cSrcweir if ( bExp )
568cdf0e10cSrcweir {
569cdf0e10cSrcweir Expand( rRef.Ref1.nCol, rRef.Ref2.nCol, nCol1, nDx );
570cdf0e10cSrcweir eRet = UR_UPDATED;
571cdf0e10cSrcweir }
572cdf0e10cSrcweir }
573cdf0e10cSrcweir if( nDy &&
574cdf0e10cSrcweir ((rRef.Ref1.nCol >= nCol1
575cdf0e10cSrcweir && rRef.Ref2.nCol <= nCol2) || (bRef1ColDel || bRef2ColDel))
576cdf0e10cSrcweir &&
577cdf0e10cSrcweir ((rRef.Ref1.nTab >= nTab1
578cdf0e10cSrcweir && rRef.Ref2.nTab <= nTab2) || (bRef1TabDel || bRef2TabDel))
579cdf0e10cSrcweir )
580cdf0e10cSrcweir {
581cdf0e10cSrcweir sal_Bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nRow,
582cdf0e10cSrcweir rRef.Ref2.nRow, nRow1, nDy ));
583cdf0e10cSrcweir sal_Bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
584cdf0e10cSrcweir ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsRowRel()));
585cdf0e10cSrcweir sal_Bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
586cdf0e10cSrcweir ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsRowRel()));
587cdf0e10cSrcweir if ( lcl_MoveRefPart( rRef.Ref1.nRow, bRef1RowDel, bDo1,
588cdf0e10cSrcweir rRef.Ref2.nRow, bRef2RowDel, bDo2,
589cdf0e10cSrcweir nRow1, nRow2, nDy, MAXROW ) )
590cdf0e10cSrcweir {
591cdf0e10cSrcweir eRet = UR_UPDATED;
592cdf0e10cSrcweir if ( bInDeleteUndo && (bRef1RowDel || bRef2RowDel) )
593cdf0e10cSrcweir {
594cdf0e10cSrcweir if ( bRef1RowDel && nRow1 <= rRef.Ref1.nRow &&
595cdf0e10cSrcweir rRef.Ref1.nRow <= nRow1 + nDy )
596cdf0e10cSrcweir rRef.Ref1.SetRowDeleted( sal_False );
597cdf0e10cSrcweir if ( bRef2RowDel && nRow1 <= rRef.Ref2.nRow &&
598cdf0e10cSrcweir rRef.Ref2.nRow <= nRow1 + nDy )
599cdf0e10cSrcweir rRef.Ref2.SetRowDeleted( sal_False );
600cdf0e10cSrcweir }
601cdf0e10cSrcweir else
602cdf0e10cSrcweir {
603cdf0e10cSrcweir if ( bRef1RowDel )
604cdf0e10cSrcweir rRef.Ref1.SetRowDeleted( sal_True );
605cdf0e10cSrcweir if ( bRef2RowDel )
606cdf0e10cSrcweir rRef.Ref2.SetRowDeleted( sal_True );
607cdf0e10cSrcweir }
608cdf0e10cSrcweir }
609cdf0e10cSrcweir if ( bExp )
610cdf0e10cSrcweir {
611cdf0e10cSrcweir Expand( rRef.Ref1.nRow, rRef.Ref2.nRow, nRow1, nDy );
612cdf0e10cSrcweir eRet = UR_UPDATED;
613cdf0e10cSrcweir }
614cdf0e10cSrcweir }
615cdf0e10cSrcweir if( nDz &&
616cdf0e10cSrcweir ((rRef.Ref1.nCol >= nCol1
617cdf0e10cSrcweir && rRef.Ref2.nCol <= nCol2) || (bRef1ColDel || bRef2ColDel))
618cdf0e10cSrcweir &&
619cdf0e10cSrcweir ((rRef.Ref1.nRow >= nRow1
620cdf0e10cSrcweir && rRef.Ref2.nRow <= nRow2) || (bRef1RowDel || bRef2RowDel))
621cdf0e10cSrcweir )
622cdf0e10cSrcweir {
623cdf0e10cSrcweir sal_Bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nTab,
624cdf0e10cSrcweir rRef.Ref2.nTab, nTab1, nDz ));
625cdf0e10cSrcweir SCTAB nMaxTab = pDoc->GetTableCount() - 1;
626cdf0e10cSrcweir sal_Bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
627cdf0e10cSrcweir ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsTabRel()));
628cdf0e10cSrcweir sal_Bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
629cdf0e10cSrcweir ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsTabRel()));
630cdf0e10cSrcweir if ( lcl_MoveRefPart( rRef.Ref1.nTab, bRef1TabDel, bDo1,
631cdf0e10cSrcweir rRef.Ref2.nTab, bRef2TabDel, bDo2,
632cdf0e10cSrcweir nTab1, nTab2, nDz, nMaxTab ) )
633cdf0e10cSrcweir {
634cdf0e10cSrcweir eRet = UR_UPDATED;
635cdf0e10cSrcweir if ( bInDeleteUndo && (bRef1TabDel || bRef2TabDel) )
636cdf0e10cSrcweir {
637cdf0e10cSrcweir if ( bRef1TabDel && nTab1 <= rRef.Ref1.nTab &&
638cdf0e10cSrcweir rRef.Ref1.nTab <= nTab1 + nDz )
639cdf0e10cSrcweir rRef.Ref1.SetTabDeleted( sal_False );
640cdf0e10cSrcweir if ( bRef2TabDel && nTab1 <= rRef.Ref2.nTab &&
641cdf0e10cSrcweir rRef.Ref2.nTab <= nTab1 + nDz )
642cdf0e10cSrcweir rRef.Ref2.SetTabDeleted( sal_False );
643cdf0e10cSrcweir }
644cdf0e10cSrcweir else
645cdf0e10cSrcweir {
646cdf0e10cSrcweir if ( bRef1TabDel )
647cdf0e10cSrcweir rRef.Ref1.SetTabDeleted( sal_True );
648cdf0e10cSrcweir if ( bRef2TabDel )
649cdf0e10cSrcweir rRef.Ref2.SetTabDeleted( sal_True );
650cdf0e10cSrcweir }
651cdf0e10cSrcweir }
652cdf0e10cSrcweir if ( bExp )
653cdf0e10cSrcweir {
654cdf0e10cSrcweir Expand( rRef.Ref1.nTab, rRef.Ref2.nTab, nTab1, nDz );
655cdf0e10cSrcweir eRet = UR_UPDATED;
656cdf0e10cSrcweir }
657cdf0e10cSrcweir }
658cdf0e10cSrcweir if ( eRet == UR_NOTHING )
659cdf0e10cSrcweir {
660cdf0e10cSrcweir if (oldCol1 != rRef.Ref1.nCol
661cdf0e10cSrcweir || oldRow1 != rRef.Ref1.nRow
662cdf0e10cSrcweir || oldTab1 != rRef.Ref1.nTab
663cdf0e10cSrcweir || oldCol2 != rRef.Ref2.nCol
664cdf0e10cSrcweir || oldRow2 != rRef.Ref2.nRow
665cdf0e10cSrcweir || oldTab2 != rRef.Ref2.nTab
666cdf0e10cSrcweir )
667cdf0e10cSrcweir eRet = UR_UPDATED;
668cdf0e10cSrcweir }
669cdf0e10cSrcweir if (eWhat != ScRefUpdate::ABSOLUTE)
670cdf0e10cSrcweir rRef.CalcRelFromAbs( rPos );
671cdf0e10cSrcweir }
672cdf0e10cSrcweir else
673cdf0e10cSrcweir {
674cdf0e10cSrcweir if( eMode == URM_MOVE )
675cdf0e10cSrcweir {
676cdf0e10cSrcweir if ( rRef.Ref1.nCol >= nCol1-nDx
677cdf0e10cSrcweir && rRef.Ref1.nRow >= nRow1-nDy
678cdf0e10cSrcweir && rRef.Ref1.nTab >= nTab1-nDz
679cdf0e10cSrcweir && rRef.Ref2.nCol <= nCol2-nDx
680cdf0e10cSrcweir && rRef.Ref2.nRow <= nRow2-nDy
681cdf0e10cSrcweir && rRef.Ref2.nTab <= nTab2-nDz )
682cdf0e10cSrcweir {
683cdf0e10cSrcweir eRet = Move( pDoc, rPos, nDx, nDy, nDz, rRef, sal_False, sal_True ); // immer verschieben
684cdf0e10cSrcweir }
685cdf0e10cSrcweir else if ( nDz && r.In( rPos ) )
686cdf0e10cSrcweir {
687cdf0e10cSrcweir rRef.Ref1.SetFlag3D( sal_True );
688cdf0e10cSrcweir rRef.Ref2.SetFlag3D( sal_True );
689cdf0e10cSrcweir eRet = UR_UPDATED;
690cdf0e10cSrcweir if (eWhat != ScRefUpdate::ABSOLUTE)
691cdf0e10cSrcweir rRef.CalcRelFromAbs( rPos );
692cdf0e10cSrcweir }
693cdf0e10cSrcweir else if (eWhat != ScRefUpdate::ABSOLUTE)
694cdf0e10cSrcweir rRef.CalcRelFromAbs( rPos );
695cdf0e10cSrcweir }
696cdf0e10cSrcweir else if( eMode == URM_COPY && r.In( rPos ) )
697cdf0e10cSrcweir eRet = Move( pDoc, rPos, nDx, nDy, nDz, rRef, sal_False, sal_False ); // nur relative
698cdf0e10cSrcweir // sollte nicht mehr verwendet werden muessen
699cdf0e10cSrcweir else if (eWhat != ScRefUpdate::ABSOLUTE)
700cdf0e10cSrcweir rRef.CalcRelFromAbs( rPos );
701cdf0e10cSrcweir }
702cdf0e10cSrcweir return eRet;
703cdf0e10cSrcweir }
704cdf0e10cSrcweir
705cdf0e10cSrcweir
Move(ScDocument * pDoc,const ScAddress & rPos,SCsCOL nDx,SCsROW nDy,SCsTAB nDz,ScComplexRefData & rRef,sal_Bool bWrap,sal_Bool bAbsolute)706cdf0e10cSrcweir ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
707cdf0e10cSrcweir SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
708cdf0e10cSrcweir ScComplexRefData& rRef, sal_Bool bWrap, sal_Bool bAbsolute )
709cdf0e10cSrcweir {
710cdf0e10cSrcweir ScRefUpdateRes eRet = UR_NOTHING;
711cdf0e10cSrcweir
712cdf0e10cSrcweir SCCOL oldCol1 = rRef.Ref1.nCol;
713cdf0e10cSrcweir SCROW oldRow1 = rRef.Ref1.nRow;
714cdf0e10cSrcweir SCTAB oldTab1 = rRef.Ref1.nTab;
715cdf0e10cSrcweir SCCOL oldCol2 = rRef.Ref2.nCol;
716cdf0e10cSrcweir SCROW oldRow2 = rRef.Ref2.nRow;
717cdf0e10cSrcweir SCTAB oldTab2 = rRef.Ref2.nTab;
718cdf0e10cSrcweir
719cdf0e10cSrcweir sal_Bool bCut1, bCut2;
720cdf0e10cSrcweir if ( nDx )
721cdf0e10cSrcweir {
722cdf0e10cSrcweir bCut1 = bCut2 = sal_False;
723cdf0e10cSrcweir if( bAbsolute || rRef.Ref1.IsColRel() )
724cdf0e10cSrcweir {
725cdf0e10cSrcweir if( bWrap )
726cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref1.nCol, nDx, MAXCOL );
727cdf0e10cSrcweir else
728cdf0e10cSrcweir bCut1 = lcl_MoveItCut( rRef.Ref1.nCol, nDx, MAXCOL );
729cdf0e10cSrcweir }
730cdf0e10cSrcweir if( bAbsolute || rRef.Ref2.IsColRel() )
731cdf0e10cSrcweir {
732cdf0e10cSrcweir if( bWrap )
733cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref2.nCol, nDx, MAXCOL );
734cdf0e10cSrcweir else
735cdf0e10cSrcweir bCut2 = lcl_MoveItCut( rRef.Ref2.nCol, nDx, MAXCOL );
736cdf0e10cSrcweir }
737cdf0e10cSrcweir if ( bCut1 || bCut2 )
738cdf0e10cSrcweir eRet = UR_UPDATED;
739cdf0e10cSrcweir if ( bCut1 && bCut2 )
740cdf0e10cSrcweir {
741cdf0e10cSrcweir rRef.Ref1.SetColDeleted( sal_True );
742cdf0e10cSrcweir rRef.Ref2.SetColDeleted( sal_True );
743cdf0e10cSrcweir }
744cdf0e10cSrcweir }
745cdf0e10cSrcweir if ( nDy )
746cdf0e10cSrcweir {
747cdf0e10cSrcweir bCut1 = bCut2 = sal_False;
748cdf0e10cSrcweir if( bAbsolute || rRef.Ref1.IsRowRel() )
749cdf0e10cSrcweir {
750cdf0e10cSrcweir if( bWrap )
751cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref1.nRow, nDy, MAXROW );
752cdf0e10cSrcweir else
753cdf0e10cSrcweir bCut1 = lcl_MoveItCut( rRef.Ref1.nRow, nDy, MAXROW );
754cdf0e10cSrcweir }
755cdf0e10cSrcweir if( bAbsolute || rRef.Ref2.IsRowRel() )
756cdf0e10cSrcweir {
757cdf0e10cSrcweir if( bWrap )
758cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref2.nRow, nDy, MAXROW );
759cdf0e10cSrcweir else
760cdf0e10cSrcweir bCut2 = lcl_MoveItCut( rRef.Ref2.nRow, nDy, MAXROW );
761cdf0e10cSrcweir }
762cdf0e10cSrcweir if ( bCut1 || bCut2 )
763cdf0e10cSrcweir eRet = UR_UPDATED;
764cdf0e10cSrcweir if ( bCut1 && bCut2 )
765cdf0e10cSrcweir {
766cdf0e10cSrcweir rRef.Ref1.SetRowDeleted( sal_True );
767cdf0e10cSrcweir rRef.Ref2.SetRowDeleted( sal_True );
768cdf0e10cSrcweir }
769cdf0e10cSrcweir }
770cdf0e10cSrcweir if ( nDz )
771cdf0e10cSrcweir {
772cdf0e10cSrcweir bCut1 = bCut2 = sal_False;
773cdf0e10cSrcweir SCsTAB nMaxTab = (SCsTAB) pDoc->GetTableCount() - 1;
774cdf0e10cSrcweir if( bAbsolute || rRef.Ref1.IsTabRel() )
775cdf0e10cSrcweir {
776cdf0e10cSrcweir if( bWrap )
777cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref1.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
778cdf0e10cSrcweir else
779cdf0e10cSrcweir bCut1 = lcl_MoveItCut( rRef.Ref1.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
780cdf0e10cSrcweir rRef.Ref1.SetFlag3D( rPos.Tab() != rRef.Ref1.nTab );
781cdf0e10cSrcweir }
782cdf0e10cSrcweir if( bAbsolute || rRef.Ref2.IsTabRel() )
783cdf0e10cSrcweir {
784cdf0e10cSrcweir if( bWrap )
785cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref2.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
786cdf0e10cSrcweir else
787cdf0e10cSrcweir bCut2 = lcl_MoveItCut( rRef.Ref2.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
788cdf0e10cSrcweir rRef.Ref2.SetFlag3D( rPos.Tab() != rRef.Ref2.nTab );
789cdf0e10cSrcweir }
790cdf0e10cSrcweir if ( bCut1 || bCut2 )
791cdf0e10cSrcweir eRet = UR_UPDATED;
792cdf0e10cSrcweir if ( bCut1 && bCut2 )
793cdf0e10cSrcweir {
794cdf0e10cSrcweir rRef.Ref1.SetTabDeleted( sal_True );
795cdf0e10cSrcweir rRef.Ref2.SetTabDeleted( sal_True );
796cdf0e10cSrcweir }
797cdf0e10cSrcweir }
798cdf0e10cSrcweir
799cdf0e10cSrcweir if ( eRet == UR_NOTHING )
800cdf0e10cSrcweir {
801cdf0e10cSrcweir if (oldCol1 != rRef.Ref1.nCol
802cdf0e10cSrcweir || oldRow1 != rRef.Ref1.nRow
803cdf0e10cSrcweir || oldTab1 != rRef.Ref1.nTab
804cdf0e10cSrcweir || oldCol2 != rRef.Ref2.nCol
805cdf0e10cSrcweir || oldRow2 != rRef.Ref2.nRow
806cdf0e10cSrcweir || oldTab2 != rRef.Ref2.nTab
807cdf0e10cSrcweir )
808cdf0e10cSrcweir eRet = UR_UPDATED;
809cdf0e10cSrcweir }
810cdf0e10cSrcweir if ( bWrap && eRet != UR_NOTHING )
811cdf0e10cSrcweir rRef.PutInOrder();
812cdf0e10cSrcweir rRef.CalcRelFromAbs( rPos );
813cdf0e10cSrcweir return eRet;
814cdf0e10cSrcweir }
815cdf0e10cSrcweir
MoveRelWrap(ScDocument * pDoc,const ScAddress & rPos,SCCOL nMaxCol,SCROW nMaxRow,ScComplexRefData & rRef)816cdf0e10cSrcweir void ScRefUpdate::MoveRelWrap( ScDocument* pDoc, const ScAddress& rPos,
817cdf0e10cSrcweir SCCOL nMaxCol, SCROW nMaxRow, ScComplexRefData& rRef )
818cdf0e10cSrcweir {
819cdf0e10cSrcweir if( rRef.Ref1.IsColRel() )
820cdf0e10cSrcweir {
821cdf0e10cSrcweir rRef.Ref1.nCol = rRef.Ref1.nRelCol + rPos.Col();
822cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref1.nCol, static_cast<SCsCOL>(0), nMaxCol );
823cdf0e10cSrcweir }
824cdf0e10cSrcweir if( rRef.Ref2.IsColRel() )
825cdf0e10cSrcweir {
826cdf0e10cSrcweir rRef.Ref2.nCol = rRef.Ref2.nRelCol + rPos.Col();
827cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref2.nCol, static_cast<SCsCOL>(0), nMaxCol );
828cdf0e10cSrcweir }
829cdf0e10cSrcweir if( rRef.Ref1.IsRowRel() )
830cdf0e10cSrcweir {
831cdf0e10cSrcweir rRef.Ref1.nRow = rRef.Ref1.nRelRow + rPos.Row();
832cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref1.nRow, static_cast<SCsROW>(0), nMaxRow );
833cdf0e10cSrcweir }
834cdf0e10cSrcweir if( rRef.Ref2.IsRowRel() )
835cdf0e10cSrcweir {
836cdf0e10cSrcweir rRef.Ref2.nRow = rRef.Ref2.nRelRow + rPos.Row();
837cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref2.nRow, static_cast<SCsROW>(0), nMaxRow );
838cdf0e10cSrcweir }
839cdf0e10cSrcweir SCsTAB nMaxTab = (SCsTAB) pDoc->GetTableCount() - 1;
840cdf0e10cSrcweir if( rRef.Ref1.IsTabRel() )
841cdf0e10cSrcweir {
842cdf0e10cSrcweir rRef.Ref1.nTab = rRef.Ref1.nRelTab + rPos.Tab();
843cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref1.nTab, static_cast<SCsTAB>(0), static_cast<SCTAB>(nMaxTab) );
844cdf0e10cSrcweir }
845cdf0e10cSrcweir if( rRef.Ref2.IsTabRel() )
846cdf0e10cSrcweir {
847cdf0e10cSrcweir rRef.Ref2.nTab = rRef.Ref2.nRelTab + rPos.Tab();
848cdf0e10cSrcweir lcl_MoveItWrap( rRef.Ref2.nTab, static_cast<SCsTAB>(0), static_cast<SCTAB>(nMaxTab) );
849cdf0e10cSrcweir }
850cdf0e10cSrcweir rRef.PutInOrder();
851cdf0e10cSrcweir rRef.CalcRelFromAbs( rPos );
852cdf0e10cSrcweir }
853cdf0e10cSrcweir
854cdf0e10cSrcweir //------------------------------------------------------------------
855cdf0e10cSrcweir
DoTranspose(SCsCOL & rCol,SCsROW & rRow,SCsTAB & rTab,ScDocument * pDoc,const ScRange & rSource,const ScAddress & rDest)856cdf0e10cSrcweir void ScRefUpdate::DoTranspose( SCsCOL& rCol, SCsROW& rRow, SCsTAB& rTab,
857cdf0e10cSrcweir ScDocument* pDoc, const ScRange& rSource, const ScAddress& rDest )
858cdf0e10cSrcweir {
859cdf0e10cSrcweir SCsTAB nDz = ((SCsTAB)rDest.Tab())-(SCsTAB)rSource.aStart.Tab();
860cdf0e10cSrcweir if (nDz)
861cdf0e10cSrcweir {
862cdf0e10cSrcweir SCsTAB nNewTab = rTab+nDz;
863cdf0e10cSrcweir SCsTAB nCount = pDoc->GetTableCount();
864cdf0e10cSrcweir while (nNewTab<0) nNewTab = sal::static_int_cast<SCsTAB>( nNewTab + nCount );
865cdf0e10cSrcweir while (nNewTab>=nCount) nNewTab = sal::static_int_cast<SCsTAB>( nNewTab - nCount );
866cdf0e10cSrcweir rTab = nNewTab;
867cdf0e10cSrcweir }
868cdf0e10cSrcweir DBG_ASSERT( rCol>=rSource.aStart.Col() && rRow>=rSource.aStart.Row(),
869cdf0e10cSrcweir "UpdateTranspose: Pos. falsch" );
870cdf0e10cSrcweir
871cdf0e10cSrcweir SCsCOL nRelX = rCol - (SCsCOL)rSource.aStart.Col();
872cdf0e10cSrcweir SCsROW nRelY = rRow - (SCsROW)rSource.aStart.Row();
873cdf0e10cSrcweir
874cdf0e10cSrcweir rCol = static_cast<SCsCOL>(static_cast<SCsCOLROW>(rDest.Col()) +
875cdf0e10cSrcweir static_cast<SCsCOLROW>(nRelY));
876cdf0e10cSrcweir rRow = static_cast<SCsROW>(static_cast<SCsCOLROW>(rDest.Row()) +
877cdf0e10cSrcweir static_cast<SCsCOLROW>(nRelX));
878cdf0e10cSrcweir }
879cdf0e10cSrcweir
880cdf0e10cSrcweir
UpdateTranspose(ScDocument * pDoc,const ScRange & rSource,const ScAddress & rDest,ScComplexRefData & rRef)881cdf0e10cSrcweir ScRefUpdateRes ScRefUpdate::UpdateTranspose( ScDocument* pDoc,
882cdf0e10cSrcweir const ScRange& rSource, const ScAddress& rDest,
883cdf0e10cSrcweir ScComplexRefData& rRef )
884cdf0e10cSrcweir {
885cdf0e10cSrcweir ScRefUpdateRes eRet = UR_NOTHING;
886cdf0e10cSrcweir if ( rRef.Ref1.nCol >= rSource.aStart.Col() && rRef.Ref2.nCol <= rSource.aEnd.Col() &&
887cdf0e10cSrcweir rRef.Ref1.nRow >= rSource.aStart.Row() && rRef.Ref2.nRow <= rSource.aEnd.Row() &&
888cdf0e10cSrcweir rRef.Ref1.nTab >= rSource.aStart.Tab() && rRef.Ref2.nTab <= rSource.aEnd.Tab() )
889cdf0e10cSrcweir {
890cdf0e10cSrcweir DoTranspose( rRef.Ref1.nCol, rRef.Ref1.nRow, rRef.Ref1.nTab, pDoc, rSource, rDest );
891cdf0e10cSrcweir DoTranspose( rRef.Ref2.nCol, rRef.Ref2.nRow, rRef.Ref2.nTab, pDoc, rSource, rDest );
892cdf0e10cSrcweir eRet = UR_UPDATED;
893cdf0e10cSrcweir }
894cdf0e10cSrcweir return eRet;
895cdf0e10cSrcweir }
896cdf0e10cSrcweir
897cdf0e10cSrcweir //------------------------------------------------------------------
898cdf0e10cSrcweir
899cdf0e10cSrcweir // UpdateGrow - erweitert Referenzen, die genau auf den Bereich zeigen
900cdf0e10cSrcweir // kommt ohne Dokument aus
901cdf0e10cSrcweir
902cdf0e10cSrcweir
UpdateGrow(const ScRange & rArea,SCCOL nGrowX,SCROW nGrowY,ScComplexRefData & rRef)903cdf0e10cSrcweir ScRefUpdateRes ScRefUpdate::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY,
904cdf0e10cSrcweir ScComplexRefData& rRef )
905cdf0e10cSrcweir {
906cdf0e10cSrcweir ScRefUpdateRes eRet = UR_NOTHING;
907cdf0e10cSrcweir
908cdf0e10cSrcweir // in Y-Richtung darf die Ref auch eine Zeile weiter unten anfangen,
909cdf0e10cSrcweir // falls ein Bereich Spaltenkoepfe enthaelt
910cdf0e10cSrcweir
911cdf0e10cSrcweir sal_Bool bUpdateX = ( nGrowX &&
912cdf0e10cSrcweir rRef.Ref1.nCol == rArea.aStart.Col() && rRef.Ref2.nCol == rArea.aEnd.Col() &&
913cdf0e10cSrcweir rRef.Ref1.nRow >= rArea.aStart.Row() && rRef.Ref2.nRow <= rArea.aEnd.Row() &&
914cdf0e10cSrcweir rRef.Ref1.nTab >= rArea.aStart.Tab() && rRef.Ref2.nTab <= rArea.aEnd.Tab() );
915cdf0e10cSrcweir sal_Bool bUpdateY = ( nGrowY &&
916cdf0e10cSrcweir rRef.Ref1.nCol >= rArea.aStart.Col() && rRef.Ref2.nCol <= rArea.aEnd.Col() &&
917cdf0e10cSrcweir ( rRef.Ref1.nRow == rArea.aStart.Row() || rRef.Ref1.nRow == rArea.aStart.Row()+1 ) &&
918cdf0e10cSrcweir rRef.Ref2.nRow == rArea.aEnd.Row() &&
919cdf0e10cSrcweir rRef.Ref1.nTab >= rArea.aStart.Tab() && rRef.Ref2.nTab <= rArea.aEnd.Tab() );
920cdf0e10cSrcweir
921cdf0e10cSrcweir if ( bUpdateX )
922cdf0e10cSrcweir {
923cdf0e10cSrcweir rRef.Ref2.nCol = sal::static_int_cast<SCsCOL>( rRef.Ref2.nCol + nGrowX );
924cdf0e10cSrcweir eRet = UR_UPDATED;
925cdf0e10cSrcweir }
926cdf0e10cSrcweir if ( bUpdateY )
927cdf0e10cSrcweir {
928cdf0e10cSrcweir rRef.Ref2.nRow = sal::static_int_cast<SCsROW>( rRef.Ref2.nRow + nGrowY );
929cdf0e10cSrcweir eRet = UR_UPDATED;
930cdf0e10cSrcweir }
931cdf0e10cSrcweir
932cdf0e10cSrcweir return eRet;
933cdf0e10cSrcweir }
934cdf0e10cSrcweir
935cdf0e10cSrcweir
936