xref: /AOO41X/main/sc/source/core/tool/refupdat.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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