xref: /aoo4110/main/sc/source/core/data/table2.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski // INCLUDE ---------------------------------------------------------------
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "scitems.hxx"
30*b1cdbd2cSJim Jagielski #include <editeng/boxitem.hxx>
31*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
32*b1cdbd2cSJim Jagielski #include <svl/poolcach.hxx>
33*b1cdbd2cSJim Jagielski #include <unotools/charclass.hxx>
34*b1cdbd2cSJim Jagielski #include <math.h>
35*b1cdbd2cSJim Jagielski #include <svl/PasswordHelper.hxx>
36*b1cdbd2cSJim Jagielski #include <unotools/transliterationwrapper.hxx>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include "patattr.hxx"
39*b1cdbd2cSJim Jagielski #include "docpool.hxx"
40*b1cdbd2cSJim Jagielski #include "cell.hxx"
41*b1cdbd2cSJim Jagielski #include "document.hxx"
42*b1cdbd2cSJim Jagielski #include "drwlayer.hxx"
43*b1cdbd2cSJim Jagielski #include "olinetab.hxx"
44*b1cdbd2cSJim Jagielski #include "rechead.hxx"
45*b1cdbd2cSJim Jagielski #include "stlpool.hxx"
46*b1cdbd2cSJim Jagielski #include "attarray.hxx"		// Iterator
47*b1cdbd2cSJim Jagielski #include "markdata.hxx"
48*b1cdbd2cSJim Jagielski #include "progress.hxx"
49*b1cdbd2cSJim Jagielski #include "dociter.hxx"
50*b1cdbd2cSJim Jagielski #include "conditio.hxx"
51*b1cdbd2cSJim Jagielski #include "chartlis.hxx"
52*b1cdbd2cSJim Jagielski #include "fillinfo.hxx"
53*b1cdbd2cSJim Jagielski #include "bcaslot.hxx"
54*b1cdbd2cSJim Jagielski #include "postit.hxx"
55*b1cdbd2cSJim Jagielski #include "sheetevents.hxx"
56*b1cdbd2cSJim Jagielski #include "globstr.hrc"
57*b1cdbd2cSJim Jagielski #include "segmenttree.hxx"
58*b1cdbd2cSJim Jagielski #include "dbcolect.hxx"
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #include <math.h>
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski // STATIC DATA -----------------------------------------------------------
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 
SetOutlineTable(const ScOutlineTable * pNewOutline)65*b1cdbd2cSJim Jagielski sal_Bool ScTable::SetOutlineTable( const ScOutlineTable* pNewOutline )
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski 	sal_uInt16 nOldSizeX = 0;
68*b1cdbd2cSJim Jagielski 	sal_uInt16 nOldSizeY = 0;
69*b1cdbd2cSJim Jagielski 	sal_uInt16 nNewSizeX = 0;
70*b1cdbd2cSJim Jagielski 	sal_uInt16 nNewSizeY = 0;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski 	if (pOutlineTable)
73*b1cdbd2cSJim Jagielski 	{
74*b1cdbd2cSJim Jagielski 		nOldSizeX = pOutlineTable->GetColArray()->GetDepth();
75*b1cdbd2cSJim Jagielski 		nOldSizeY = pOutlineTable->GetRowArray()->GetDepth();
76*b1cdbd2cSJim Jagielski 		delete pOutlineTable;
77*b1cdbd2cSJim Jagielski 	}
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 	if (pNewOutline)
80*b1cdbd2cSJim Jagielski 	{
81*b1cdbd2cSJim Jagielski 		pOutlineTable = new ScOutlineTable( *pNewOutline );
82*b1cdbd2cSJim Jagielski 		nNewSizeX = pOutlineTable->GetColArray()->GetDepth();
83*b1cdbd2cSJim Jagielski 		nNewSizeY = pOutlineTable->GetRowArray()->GetDepth();
84*b1cdbd2cSJim Jagielski 	}
85*b1cdbd2cSJim Jagielski 	else
86*b1cdbd2cSJim Jagielski 		pOutlineTable = NULL;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 	return ( nNewSizeX != nOldSizeX || nNewSizeY != nOldSizeY );		// Groesse geaendert ?
89*b1cdbd2cSJim Jagielski }
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 
StartOutlineTable()92*b1cdbd2cSJim Jagielski void ScTable::StartOutlineTable()
93*b1cdbd2cSJim Jagielski {
94*b1cdbd2cSJim Jagielski 	if (!pOutlineTable)
95*b1cdbd2cSJim Jagielski 		pOutlineTable = new ScOutlineTable;
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 
SetSheetEvents(const ScSheetEvents * pNew)99*b1cdbd2cSJim Jagielski void ScTable::SetSheetEvents( const ScSheetEvents* pNew )
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski     delete pSheetEvents;
102*b1cdbd2cSJim Jagielski     if (pNew)
103*b1cdbd2cSJim Jagielski         pSheetEvents = new ScSheetEvents(*pNew);
104*b1cdbd2cSJim Jagielski     else
105*b1cdbd2cSJim Jagielski         pSheetEvents = NULL;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski     SetCalcNotification( sal_False );       // discard notifications before the events were set
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski     if (IsStreamValid())
110*b1cdbd2cSJim Jagielski         SetStreamValid(sal_False);
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski 
SetCalcNotification(sal_Bool bSet)114*b1cdbd2cSJim Jagielski void ScTable::SetCalcNotification( sal_Bool bSet )
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski     bCalcNotification = bSet;
117*b1cdbd2cSJim Jagielski }
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 
TestInsertRow(SCCOL nStartCol,SCCOL nEndCol,SCSIZE nSize)120*b1cdbd2cSJim Jagielski sal_Bool ScTable::TestInsertRow( SCCOL nStartCol, SCCOL nEndCol, SCSIZE nSize )
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski 	sal_Bool bTest = sal_True;
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 	if ( nStartCol==0 && nEndCol==MAXCOL && pOutlineTable )
125*b1cdbd2cSJim Jagielski 		bTest = pOutlineTable->TestInsertRow(nSize);
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski 	for (SCCOL i=nStartCol; (i<=nEndCol) && bTest; i++)
128*b1cdbd2cSJim Jagielski 		bTest = aCol[i].TestInsertRow( nSize );
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	return bTest;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 
InsertRow(SCCOL nStartCol,SCCOL nEndCol,SCROW nStartRow,SCSIZE nSize)134*b1cdbd2cSJim Jagielski void ScTable::InsertRow( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCSIZE nSize )
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski 	IncRecalcLevel();
137*b1cdbd2cSJim Jagielski     InitializeNoteCaptions();
138*b1cdbd2cSJim Jagielski 	if (nStartCol==0 && nEndCol==MAXCOL)
139*b1cdbd2cSJim Jagielski 	{
140*b1cdbd2cSJim Jagielski         if (mpRowHeights && pRowFlags)
141*b1cdbd2cSJim Jagielski 		{
142*b1cdbd2cSJim Jagielski             mpRowHeights->insertSegment(nStartRow, nSize, false);
143*b1cdbd2cSJim Jagielski             sal_uInt8 nNewFlags = pRowFlags->Insert( nStartRow, nSize);
144*b1cdbd2cSJim Jagielski             // only copy manual size flag, clear all others
145*b1cdbd2cSJim Jagielski             if (nNewFlags && (nNewFlags != CR_MANUALSIZE))
146*b1cdbd2cSJim Jagielski                 pRowFlags->SetValue( nStartRow, nStartRow + nSize - 1,
147*b1cdbd2cSJim Jagielski                         nNewFlags & CR_MANUALSIZE);
148*b1cdbd2cSJim Jagielski 		}
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 		if (pOutlineTable)
151*b1cdbd2cSJim Jagielski 			pOutlineTable->InsertRow( nStartRow, nSize );
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski         mpFilteredRows->insertSegment(nStartRow, nSize, true);
154*b1cdbd2cSJim Jagielski         mpHiddenRows->insertSegment(nStartRow, nSize, true);
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski         if (!maRowManualBreaks.empty())
157*b1cdbd2cSJim Jagielski         {
158*b1cdbd2cSJim Jagielski             std::vector<SCROW> aUpdatedBreaks;
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski             while ( ! maRowManualBreaks.empty())
161*b1cdbd2cSJim Jagielski             {
162*b1cdbd2cSJim Jagielski                 std::set<SCROW>::iterator aLast (--maRowManualBreaks.end());
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski                 // Check if there are more entries that have to be processed.
165*b1cdbd2cSJim Jagielski                 if (*aLast < nStartRow)
166*b1cdbd2cSJim Jagielski                     break;
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski                 // Remember the updated break location and erase the entry.
169*b1cdbd2cSJim Jagielski                 aUpdatedBreaks.push_back(static_cast<SCROW>(*aLast + nSize));
170*b1cdbd2cSJim Jagielski                 maRowManualBreaks.erase(aLast);
171*b1cdbd2cSJim Jagielski             }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski             // Insert the updated break locations.
174*b1cdbd2cSJim Jagielski             if ( ! aUpdatedBreaks.empty())
175*b1cdbd2cSJim Jagielski                 maRowManualBreaks.insert(aUpdatedBreaks.begin(), aUpdatedBreaks.end());
176*b1cdbd2cSJim Jagielski         }
177*b1cdbd2cSJim Jagielski 	}
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 	for (SCCOL j=nStartCol; j<=nEndCol; j++)
180*b1cdbd2cSJim Jagielski 		aCol[j].InsertRow( nStartRow, nSize );
181*b1cdbd2cSJim Jagielski 	DecRecalcLevel( false );
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     InvalidatePageBreaks();
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 
DeleteRow(SCCOL nStartCol,SCCOL nEndCol,SCROW nStartRow,SCSIZE nSize,sal_Bool * pUndoOutline)187*b1cdbd2cSJim Jagielski void ScTable::DeleteRow( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCSIZE nSize,
188*b1cdbd2cSJim Jagielski 							sal_Bool* pUndoOutline )
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski 	IncRecalcLevel();
191*b1cdbd2cSJim Jagielski     InitializeNoteCaptions();
192*b1cdbd2cSJim Jagielski 	if (nStartCol==0 && nEndCol==MAXCOL)
193*b1cdbd2cSJim Jagielski 	{
194*b1cdbd2cSJim Jagielski         if (pRowFlags)
195*b1cdbd2cSJim Jagielski             pRowFlags->Remove( nStartRow, nSize);
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski         if (mpRowHeights)
198*b1cdbd2cSJim Jagielski             mpRowHeights->removeSegment(nStartRow, nStartRow+nSize);
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski 		if (pOutlineTable)
201*b1cdbd2cSJim Jagielski 			if (pOutlineTable->DeleteRow( nStartRow, nSize ))
202*b1cdbd2cSJim Jagielski 				if (pUndoOutline)
203*b1cdbd2cSJim Jagielski 					*pUndoOutline = sal_True;
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski         mpFilteredRows->removeSegment(nStartRow, nStartRow+nSize);
206*b1cdbd2cSJim Jagielski         mpHiddenRows->removeSegment(nStartRow, nStartRow+nSize);
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski         if (!maRowManualBreaks.empty())
209*b1cdbd2cSJim Jagielski         {
210*b1cdbd2cSJim Jagielski             std::set<SCROW>::iterator it = maRowManualBreaks.upper_bound( static_cast<SCROW>( nStartRow + nSize - 1));
211*b1cdbd2cSJim Jagielski             maRowManualBreaks.erase( maRowManualBreaks.lower_bound( nStartRow), it);
212*b1cdbd2cSJim Jagielski             while (it != maRowManualBreaks.end())
213*b1cdbd2cSJim Jagielski             {
214*b1cdbd2cSJim Jagielski                 SCROW nRow = *it;
215*b1cdbd2cSJim Jagielski                 maRowManualBreaks.erase( it++);
216*b1cdbd2cSJim Jagielski                 maRowManualBreaks.insert( static_cast<SCROW>( nRow - nSize));
217*b1cdbd2cSJim Jagielski             }
218*b1cdbd2cSJim Jagielski         }
219*b1cdbd2cSJim Jagielski 	}
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski     {   // scope for bulk broadcast
222*b1cdbd2cSJim Jagielski         ScBulkBroadcast aBulkBroadcast( pDocument->GetBASM());
223*b1cdbd2cSJim Jagielski         for (SCCOL j=nStartCol; j<=nEndCol; j++)
224*b1cdbd2cSJim Jagielski             aCol[j].DeleteRow( nStartRow, nSize );
225*b1cdbd2cSJim Jagielski     }
226*b1cdbd2cSJim Jagielski 	DecRecalcLevel();
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski     InvalidatePageBreaks();
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 
TestInsertCol(SCROW nStartRow,SCROW nEndRow,SCSIZE nSize)232*b1cdbd2cSJim Jagielski sal_Bool ScTable::TestInsertCol( SCROW nStartRow, SCROW nEndRow, SCSIZE nSize )
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski 	sal_Bool bTest = sal_True;
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 	if ( nStartRow==0 && nEndRow==MAXROW && pOutlineTable )
237*b1cdbd2cSJim Jagielski 		bTest = pOutlineTable->TestInsertCol(nSize);
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 	if ( nSize > static_cast<SCSIZE>(MAXCOL) )
240*b1cdbd2cSJim Jagielski 		bTest = sal_False;
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 	for (SCCOL i=MAXCOL; (i+static_cast<SCCOL>(nSize)>MAXCOL) && bTest; i--)
243*b1cdbd2cSJim Jagielski 		bTest = aCol[i].TestInsertCol(nStartRow, nEndRow);
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	return bTest;
246*b1cdbd2cSJim Jagielski }
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 
InsertCol(SCCOL nStartCol,SCROW nStartRow,SCROW nEndRow,SCSIZE nSize)249*b1cdbd2cSJim Jagielski void ScTable::InsertCol( SCCOL nStartCol, SCROW nStartRow, SCROW nEndRow, SCSIZE nSize )
250*b1cdbd2cSJim Jagielski {
251*b1cdbd2cSJim Jagielski 	IncRecalcLevel();
252*b1cdbd2cSJim Jagielski     InitializeNoteCaptions();
253*b1cdbd2cSJim Jagielski 	if (nStartRow==0 && nEndRow==MAXROW)
254*b1cdbd2cSJim Jagielski 	{
255*b1cdbd2cSJim Jagielski 		if (pColWidth && pColFlags)
256*b1cdbd2cSJim Jagielski         {
257*b1cdbd2cSJim Jagielski             memmove( &pColWidth[nStartCol+nSize], &pColWidth[nStartCol],
258*b1cdbd2cSJim Jagielski                     (MAXCOL - nStartCol + 1 - nSize) * sizeof(pColWidth[0]) );
259*b1cdbd2cSJim Jagielski             memmove( &pColFlags[nStartCol+nSize], &pColFlags[nStartCol],
260*b1cdbd2cSJim Jagielski                     (MAXCOL - nStartCol + 1 - nSize) * sizeof(pColFlags[0]) );
261*b1cdbd2cSJim Jagielski         }
262*b1cdbd2cSJim Jagielski 		if (pOutlineTable)
263*b1cdbd2cSJim Jagielski 			pOutlineTable->InsertCol( nStartCol, nSize );
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski         mpHiddenCols->insertSegment(nStartCol, static_cast<SCCOL>(nSize), true);
266*b1cdbd2cSJim Jagielski         mpFilteredCols->insertSegment(nStartCol, static_cast<SCCOL>(nSize), true);
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski         if (!maColManualBreaks.empty())
269*b1cdbd2cSJim Jagielski         {
270*b1cdbd2cSJim Jagielski             std::vector<SCCOL> aUpdatedBreaks;
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski             while ( ! maColManualBreaks.empty())
273*b1cdbd2cSJim Jagielski             {
274*b1cdbd2cSJim Jagielski                 std::set<SCCOL>::iterator aLast (--maColManualBreaks.end());
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski                 // Check if there are more entries that have to be processed.
277*b1cdbd2cSJim Jagielski                 if (*aLast < nStartRow)
278*b1cdbd2cSJim Jagielski                     break;
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski                 // Remember the updated break location and erase the entry.
281*b1cdbd2cSJim Jagielski                 aUpdatedBreaks.push_back(static_cast<SCCOL>(*aLast + nSize));
282*b1cdbd2cSJim Jagielski                 maColManualBreaks.erase(aLast);
283*b1cdbd2cSJim Jagielski             }
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski             // Insert the updated break locations.
286*b1cdbd2cSJim Jagielski             if ( ! aUpdatedBreaks.empty())
287*b1cdbd2cSJim Jagielski                 maColManualBreaks.insert(aUpdatedBreaks.begin(), aUpdatedBreaks.end());
288*b1cdbd2cSJim Jagielski         }
289*b1cdbd2cSJim Jagielski 	}
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 	if ((nStartRow == 0) && (nEndRow == MAXROW))
293*b1cdbd2cSJim Jagielski 	{
294*b1cdbd2cSJim Jagielski 		for (SCSIZE i=0; i < nSize; i++)
295*b1cdbd2cSJim Jagielski 			for (SCCOL nCol = MAXCOL; nCol > nStartCol; nCol--)
296*b1cdbd2cSJim Jagielski 				aCol[nCol].SwapCol(aCol[nCol-1]);
297*b1cdbd2cSJim Jagielski 	}
298*b1cdbd2cSJim Jagielski 	else
299*b1cdbd2cSJim Jagielski 	{
300*b1cdbd2cSJim Jagielski 		for (SCSIZE i=0; static_cast<SCCOL>(i+nSize)+nStartCol <= MAXCOL; i++)
301*b1cdbd2cSJim Jagielski 			aCol[MAXCOL - nSize - i].MoveTo(nStartRow, nEndRow, aCol[MAXCOL - i]);
302*b1cdbd2cSJim Jagielski 	}
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 	if (nStartCol>0)						// copy old attributes
305*b1cdbd2cSJim Jagielski 	{
306*b1cdbd2cSJim Jagielski 		sal_uInt16 nWhichArray[2];
307*b1cdbd2cSJim Jagielski 		nWhichArray[0] = ATTR_MERGE;
308*b1cdbd2cSJim Jagielski 		nWhichArray[1] = 0;
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski 		for (SCSIZE i=0; i<nSize; i++)
311*b1cdbd2cSJim Jagielski 		{
312*b1cdbd2cSJim Jagielski 			aCol[nStartCol-1].CopyToColumn( nStartRow, nEndRow, IDF_ATTRIB,
313*b1cdbd2cSJim Jagielski 												sal_False, aCol[nStartCol+i] );
314*b1cdbd2cSJim Jagielski 			aCol[nStartCol+i].RemoveFlags( nStartRow, nEndRow,
315*b1cdbd2cSJim Jagielski 												SC_MF_HOR | SC_MF_VER | SC_MF_AUTO );
316*b1cdbd2cSJim Jagielski 			aCol[nStartCol+i].ClearItems( nStartRow, nEndRow, nWhichArray );
317*b1cdbd2cSJim Jagielski 		}
318*b1cdbd2cSJim Jagielski 	}
319*b1cdbd2cSJim Jagielski 	DecRecalcLevel();
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski     InvalidatePageBreaks();
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 
DeleteCol(SCCOL nStartCol,SCROW nStartRow,SCROW nEndRow,SCSIZE nSize,sal_Bool * pUndoOutline)325*b1cdbd2cSJim Jagielski void ScTable::DeleteCol( SCCOL nStartCol, SCROW nStartRow, SCROW nEndRow, SCSIZE nSize,
326*b1cdbd2cSJim Jagielski 							sal_Bool* pUndoOutline )
327*b1cdbd2cSJim Jagielski {
328*b1cdbd2cSJim Jagielski 	IncRecalcLevel();
329*b1cdbd2cSJim Jagielski     InitializeNoteCaptions();
330*b1cdbd2cSJim Jagielski 	if (nStartRow==0 && nEndRow==MAXROW)
331*b1cdbd2cSJim Jagielski 	{
332*b1cdbd2cSJim Jagielski 		if (pColWidth && pColFlags)
333*b1cdbd2cSJim Jagielski         {
334*b1cdbd2cSJim Jagielski             memmove( &pColWidth[nStartCol], &pColWidth[nStartCol+nSize],
335*b1cdbd2cSJim Jagielski                     (MAXCOL - nStartCol + 1 - nSize) * sizeof(pColWidth[0]) );
336*b1cdbd2cSJim Jagielski             memmove( &pColFlags[nStartCol], &pColFlags[nStartCol+nSize],
337*b1cdbd2cSJim Jagielski                     (MAXCOL - nStartCol + 1 - nSize) * sizeof(pColFlags[0]) );
338*b1cdbd2cSJim Jagielski         }
339*b1cdbd2cSJim Jagielski 		if (pOutlineTable)
340*b1cdbd2cSJim Jagielski 			if (pOutlineTable->DeleteCol( nStartCol, nSize ))
341*b1cdbd2cSJim Jagielski 				if (pUndoOutline)
342*b1cdbd2cSJim Jagielski 					*pUndoOutline = sal_True;
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski         SCCOL nRmSize = nStartCol + static_cast<SCCOL>(nSize);
345*b1cdbd2cSJim Jagielski         mpHiddenCols->removeSegment(nStartCol, nRmSize);
346*b1cdbd2cSJim Jagielski         mpFilteredCols->removeSegment(nStartCol, nRmSize);
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski         if (!maColManualBreaks.empty())
349*b1cdbd2cSJim Jagielski         {
350*b1cdbd2cSJim Jagielski             std::set<SCCOL>::iterator it = maColManualBreaks.upper_bound( static_cast<SCCOL>( nStartCol + nSize - 1));
351*b1cdbd2cSJim Jagielski             maColManualBreaks.erase( maColManualBreaks.lower_bound( nStartCol), it);
352*b1cdbd2cSJim Jagielski             while (it != maColManualBreaks.end())
353*b1cdbd2cSJim Jagielski             {
354*b1cdbd2cSJim Jagielski                 SCCOL nCol = *it;
355*b1cdbd2cSJim Jagielski                 maColManualBreaks.erase( it++);
356*b1cdbd2cSJim Jagielski                 maColManualBreaks.insert( static_cast<SCCOL>( nCol - nSize));
357*b1cdbd2cSJim Jagielski             }
358*b1cdbd2cSJim Jagielski         }
359*b1cdbd2cSJim Jagielski 	}
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski     {   // scope for bulk broadcast
363*b1cdbd2cSJim Jagielski         ScBulkBroadcast aBulkBroadcast( pDocument->GetBASM());
364*b1cdbd2cSJim Jagielski         for (SCSIZE i = 0; i < nSize; i++)
365*b1cdbd2cSJim Jagielski             aCol[nStartCol + i].DeleteArea(nStartRow, nEndRow, IDF_ALL);
366*b1cdbd2cSJim Jagielski     }
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 	if ((nStartRow == 0) && (nEndRow == MAXROW))
369*b1cdbd2cSJim Jagielski 	{
370*b1cdbd2cSJim Jagielski 		for (SCSIZE i=0; i < nSize; i++)
371*b1cdbd2cSJim Jagielski 			for (SCCOL nCol = nStartCol; nCol < MAXCOL; nCol++)
372*b1cdbd2cSJim Jagielski 				aCol[nCol].SwapCol(aCol[nCol+1]);
373*b1cdbd2cSJim Jagielski 	}
374*b1cdbd2cSJim Jagielski 	else
375*b1cdbd2cSJim Jagielski 	{
376*b1cdbd2cSJim Jagielski 		for (SCSIZE i=0; static_cast<SCCOL>(i+nSize)+nStartCol <= MAXCOL; i++)
377*b1cdbd2cSJim Jagielski 			aCol[nStartCol + nSize + i].MoveTo(nStartRow, nEndRow, aCol[nStartCol + i]);
378*b1cdbd2cSJim Jagielski 	}
379*b1cdbd2cSJim Jagielski 	DecRecalcLevel();
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski     InvalidatePageBreaks();
382*b1cdbd2cSJim Jagielski }
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 
DeleteArea(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,sal_uInt16 nDelFlag)385*b1cdbd2cSJim Jagielski void ScTable::DeleteArea(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, sal_uInt16 nDelFlag)
386*b1cdbd2cSJim Jagielski {
387*b1cdbd2cSJim Jagielski 	if (nCol2 > MAXCOL) nCol2 = MAXCOL;
388*b1cdbd2cSJim Jagielski 	if (nRow2 > MAXROW) nRow2 = MAXROW;
389*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol1, nRow1) && ValidColRow(nCol2, nRow2))
390*b1cdbd2cSJim Jagielski 	{
391*b1cdbd2cSJim Jagielski //		IncRecalcLevel();
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski         {   // scope for bulk broadcast
394*b1cdbd2cSJim Jagielski             ScBulkBroadcast aBulkBroadcast( pDocument->GetBASM());
395*b1cdbd2cSJim Jagielski             for (SCCOL i = nCol1; i <= nCol2; i++)
396*b1cdbd2cSJim Jagielski                 aCol[i].DeleteArea(nRow1, nRow2, nDelFlag);
397*b1cdbd2cSJim Jagielski         }
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 			//
400*b1cdbd2cSJim Jagielski 			// Zellschutz auf geschuetzter Tabelle nicht setzen
401*b1cdbd2cSJim Jagielski 			//
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 		if ( IsProtected() && (nDelFlag & IDF_ATTRIB) )
404*b1cdbd2cSJim Jagielski 		{
405*b1cdbd2cSJim Jagielski 			ScPatternAttr aPattern(pDocument->GetPool());
406*b1cdbd2cSJim Jagielski 			aPattern.GetItemSet().Put( ScProtectionAttr( sal_False ) );
407*b1cdbd2cSJim Jagielski 			ApplyPatternArea( nCol1, nRow1, nCol2, nRow2, aPattern );
408*b1cdbd2cSJim Jagielski 		}
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski //		DecRecalcLevel();
411*b1cdbd2cSJim Jagielski 	}
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski 
DeleteSelection(sal_uInt16 nDelFlag,const ScMarkData & rMark)415*b1cdbd2cSJim Jagielski void ScTable::DeleteSelection( sal_uInt16 nDelFlag, const ScMarkData& rMark )
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski     {   // scope for bulk broadcast
418*b1cdbd2cSJim Jagielski         ScBulkBroadcast aBulkBroadcast( pDocument->GetBASM());
419*b1cdbd2cSJim Jagielski         for (SCCOL i=0; i<=MAXCOL; i++)
420*b1cdbd2cSJim Jagielski             aCol[i].DeleteSelection( nDelFlag, rMark );
421*b1cdbd2cSJim Jagielski     }
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski 		//
424*b1cdbd2cSJim Jagielski 		// Zellschutz auf geschuetzter Tabelle nicht setzen
425*b1cdbd2cSJim Jagielski 		//
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 	if ( IsProtected() && (nDelFlag & IDF_ATTRIB) )
428*b1cdbd2cSJim Jagielski 	{
429*b1cdbd2cSJim Jagielski 		ScDocumentPool* pPool = pDocument->GetPool();
430*b1cdbd2cSJim Jagielski 		SfxItemSet aSet( *pPool, ATTR_PATTERN_START, ATTR_PATTERN_END );
431*b1cdbd2cSJim Jagielski 		aSet.Put( ScProtectionAttr( sal_False ) );
432*b1cdbd2cSJim Jagielski 		SfxItemPoolCache aCache( pPool, &aSet );
433*b1cdbd2cSJim Jagielski 		ApplySelectionCache( &aCache, rMark );
434*b1cdbd2cSJim Jagielski 	}
435*b1cdbd2cSJim Jagielski }
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski //	pTable = Clipboard
CopyToClip(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,ScTable * pTable,sal_Bool bKeepScenarioFlags,sal_Bool bCloneNoteCaptions)439*b1cdbd2cSJim Jagielski void ScTable::CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
440*b1cdbd2cSJim Jagielski                         ScTable* pTable, sal_Bool bKeepScenarioFlags, sal_Bool bCloneNoteCaptions)
441*b1cdbd2cSJim Jagielski {
442*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol1, nRow1) && ValidColRow(nCol2, nRow2))
443*b1cdbd2cSJim Jagielski 	{
444*b1cdbd2cSJim Jagielski 		//	Inhalte kopieren
445*b1cdbd2cSJim Jagielski 		SCCOL i;
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski 		for ( i = nCol1; i <= nCol2; i++)
448*b1cdbd2cSJim Jagielski             aCol[i].CopyToClip(nRow1, nRow2, pTable->aCol[i], bKeepScenarioFlags, bCloneNoteCaptions);
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski 		//	copy widths/heights, and only "hidden", "filtered" and "manual" flags
451*b1cdbd2cSJim Jagielski 		//	also for all preceding columns/rows, to have valid positions for drawing objects
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 		if (pColWidth && pTable->pColWidth)
454*b1cdbd2cSJim Jagielski 			for (i=0; i<=nCol2; i++)
455*b1cdbd2cSJim Jagielski 				pTable->pColWidth[i] = pColWidth[i];
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski         pTable->CopyColHidden(*this, 0, nCol2);
458*b1cdbd2cSJim Jagielski         pTable->CopyColFiltered(*this, 0, nCol2);
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski         if (pRowFlags && pTable->pRowFlags && mpRowHeights && pTable->mpRowHeights)
461*b1cdbd2cSJim Jagielski         {
462*b1cdbd2cSJim Jagielski             pTable->pRowFlags->CopyFromAnded( *pRowFlags, 0, nRow2, CR_MANUALSIZE);
463*b1cdbd2cSJim Jagielski             pTable->CopyRowHeight(*this, 0, nRow2, 0);
464*b1cdbd2cSJim Jagielski         }
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski         pTable->CopyRowHidden(*this, 0, nRow2);
467*b1cdbd2cSJim Jagielski         pTable->CopyRowFiltered(*this, 0, nRow2);
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 		//	ggf. Formeln durch Werte ersetzen
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski 		if ( IsProtected() )
472*b1cdbd2cSJim Jagielski 			for (i = nCol1; i <= nCol2; i++)
473*b1cdbd2cSJim Jagielski 				pTable->aCol[i].RemoveProtected(nRow1, nRow2);
474*b1cdbd2cSJim Jagielski 	}
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski 
CopyToClip(const ScRangeList & rRanges,ScTable * pTable,bool bKeepScenarioFlags,bool bCloneNoteCaptions)477*b1cdbd2cSJim Jagielski void ScTable::CopyToClip(const ScRangeList& rRanges, ScTable* pTable,
478*b1cdbd2cSJim Jagielski                          bool bKeepScenarioFlags, bool bCloneNoteCaptions)
479*b1cdbd2cSJim Jagielski {
480*b1cdbd2cSJim Jagielski     ScRangeList aRanges(rRanges);
481*b1cdbd2cSJim Jagielski     for (ScRangePtr p = aRanges.First(); p; p = aRanges.Next())
482*b1cdbd2cSJim Jagielski     {
483*b1cdbd2cSJim Jagielski         CopyToClip(p->aStart.Col(), p->aStart.Row(), p->aEnd.Col(), p->aEnd.Row(),
484*b1cdbd2cSJim Jagielski                    pTable, bKeepScenarioFlags, bCloneNoteCaptions);
485*b1cdbd2cSJim Jagielski     }
486*b1cdbd2cSJim Jagielski }
487*b1cdbd2cSJim Jagielski 
CopyFromClip(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,SCsCOL nDx,SCsROW nDy,sal_uInt16 nInsFlag,sal_Bool bAsLink,sal_Bool bSkipAttrForEmpty,ScTable * pTable)488*b1cdbd2cSJim Jagielski void ScTable::CopyFromClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
489*b1cdbd2cSJim Jagielski 							SCsCOL nDx, SCsROW nDy, sal_uInt16 nInsFlag,
490*b1cdbd2cSJim Jagielski 							sal_Bool bAsLink, sal_Bool bSkipAttrForEmpty, ScTable* pTable)
491*b1cdbd2cSJim Jagielski {
492*b1cdbd2cSJim Jagielski 	SCCOL i;
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 	if (nCol2 > MAXCOL) nCol2 = MAXCOL;
495*b1cdbd2cSJim Jagielski 	if (nRow2 > MAXROW) nRow2 = MAXROW;
496*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol1, nRow1) && ValidColRow(nCol2, nRow2))
497*b1cdbd2cSJim Jagielski 	{
498*b1cdbd2cSJim Jagielski 		IncRecalcLevel();
499*b1cdbd2cSJim Jagielski 		for ( i = nCol1; i <= nCol2; i++)
500*b1cdbd2cSJim Jagielski 			aCol[i].CopyFromClip(nRow1, nRow2, nDy, nInsFlag, bAsLink, bSkipAttrForEmpty, pTable->aCol[i - nDx]);
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski 		if ((nInsFlag & IDF_ATTRIB) != 0)
503*b1cdbd2cSJim Jagielski 		{
504*b1cdbd2cSJim Jagielski 			if (nRow1==0 && nRow2==MAXROW && pColWidth && pTable->pColWidth)
505*b1cdbd2cSJim Jagielski 				for (i=nCol1; i<=nCol2; i++)
506*b1cdbd2cSJim Jagielski 					pColWidth[i] = pTable->pColWidth[i-nDx];
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski             if (nCol1==0 && nCol2==MAXCOL && mpRowHeights && pTable->mpRowHeights &&
509*b1cdbd2cSJim Jagielski 											 pRowFlags && pTable->pRowFlags)
510*b1cdbd2cSJim Jagielski             {
511*b1cdbd2cSJim Jagielski                 CopyRowHeight(*pTable, nRow1, nRow2, -nDy);
512*b1cdbd2cSJim Jagielski                 // Must copy CR_MANUALSIZE bit too, otherwise pRowHeight doesn't make sense
513*b1cdbd2cSJim Jagielski 				for (SCROW j=nRow1; j<=nRow2; j++)
514*b1cdbd2cSJim Jagielski 				{
515*b1cdbd2cSJim Jagielski 					if ( pTable->pRowFlags->GetValue(j-nDy) & CR_MANUALSIZE )
516*b1cdbd2cSJim Jagielski 						pRowFlags->OrValue( j, CR_MANUALSIZE);
517*b1cdbd2cSJim Jagielski 					else
518*b1cdbd2cSJim Jagielski                         pRowFlags->AndValue( j, sal::static_int_cast<sal_uInt8>(~CR_MANUALSIZE));
519*b1cdbd2cSJim Jagielski 				}
520*b1cdbd2cSJim Jagielski             }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski 				//
523*b1cdbd2cSJim Jagielski 				// Zellschutz auf geschuetzter Tabelle nicht setzen
524*b1cdbd2cSJim Jagielski 				//
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski 			if ( IsProtected() && (nInsFlag & IDF_ATTRIB) )
527*b1cdbd2cSJim Jagielski 			{
528*b1cdbd2cSJim Jagielski 				ScPatternAttr aPattern(pDocument->GetPool());
529*b1cdbd2cSJim Jagielski 				aPattern.GetItemSet().Put( ScProtectionAttr( sal_False ) );
530*b1cdbd2cSJim Jagielski 				ApplyPatternArea( nCol1, nRow1, nCol2, nRow2, aPattern );
531*b1cdbd2cSJim Jagielski 			}
532*b1cdbd2cSJim Jagielski 		}
533*b1cdbd2cSJim Jagielski 		DecRecalcLevel();
534*b1cdbd2cSJim Jagielski 	}
535*b1cdbd2cSJim Jagielski }
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski 
MixData(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,sal_uInt16 nFunction,sal_Bool bSkipEmpty,ScTable * pSrcTab)538*b1cdbd2cSJim Jagielski void ScTable::MixData( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
539*b1cdbd2cSJim Jagielski 							sal_uInt16 nFunction, sal_Bool bSkipEmpty, ScTable* pSrcTab )
540*b1cdbd2cSJim Jagielski {
541*b1cdbd2cSJim Jagielski 	for (SCCOL i=nCol1; i<=nCol2; i++)
542*b1cdbd2cSJim Jagielski 		aCol[i].MixData( nRow1, nRow2, nFunction, bSkipEmpty, pSrcTab->aCol[i] );
543*b1cdbd2cSJim Jagielski }
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 
546*b1cdbd2cSJim Jagielski //	Markierung von diesem Dokument
MixMarked(const ScMarkData & rMark,sal_uInt16 nFunction,sal_Bool bSkipEmpty,ScTable * pSrcTab)547*b1cdbd2cSJim Jagielski void ScTable::MixMarked( const ScMarkData& rMark, sal_uInt16 nFunction,
548*b1cdbd2cSJim Jagielski 						sal_Bool bSkipEmpty, ScTable* pSrcTab )
549*b1cdbd2cSJim Jagielski {
550*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
551*b1cdbd2cSJim Jagielski 		aCol[i].MixMarked( rMark, nFunction, bSkipEmpty, pSrcTab->aCol[i] );
552*b1cdbd2cSJim Jagielski }
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski 
TransposeClip(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,ScTable * pTransClip,sal_uInt16 nFlags,sal_Bool bAsLink)555*b1cdbd2cSJim Jagielski void ScTable::TransposeClip( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
556*b1cdbd2cSJim Jagielski 								ScTable* pTransClip, sal_uInt16 nFlags, sal_Bool bAsLink )
557*b1cdbd2cSJim Jagielski {
558*b1cdbd2cSJim Jagielski 	sal_Bool bWasCut = pDocument->IsCutMode();
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski 	ScDocument* pDestDoc = pTransClip->pDocument;
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski 	for (SCCOL nCol=nCol1; nCol<=nCol2; nCol++)
563*b1cdbd2cSJim Jagielski 	{
564*b1cdbd2cSJim Jagielski 		SCROW nRow;
565*b1cdbd2cSJim Jagielski 		ScBaseCell* pCell;
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski 		if ( bAsLink && nFlags == IDF_ALL )
568*b1cdbd2cSJim Jagielski 		{
569*b1cdbd2cSJim Jagielski 			//	#68989# with IDF_ALL, also create links (formulas) for empty cells
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski 			for ( nRow=nRow1; nRow<=nRow2; nRow++ )
572*b1cdbd2cSJim Jagielski 			{
573*b1cdbd2cSJim Jagielski 				//	create simple formula, as in ScColumn::CreateRefCell
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 				ScAddress aDestPos( static_cast<SCCOL>(nRow-nRow1), static_cast<SCROW>(nCol-nCol1), pTransClip->nTab );
576*b1cdbd2cSJim Jagielski 				ScSingleRefData aRef;
577*b1cdbd2cSJim Jagielski 				aRef.nCol = nCol;
578*b1cdbd2cSJim Jagielski 				aRef.nRow = nRow;
579*b1cdbd2cSJim Jagielski 				aRef.nTab = nTab;
580*b1cdbd2cSJim Jagielski 				aRef.InitFlags();							// -> all absolute
581*b1cdbd2cSJim Jagielski 				aRef.SetFlag3D(sal_True);
582*b1cdbd2cSJim Jagielski 				aRef.CalcRelFromAbs( aDestPos );
583*b1cdbd2cSJim Jagielski 				ScTokenArray aArr;
584*b1cdbd2cSJim Jagielski 				aArr.AddSingleReference( aRef );
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski 				ScBaseCell* pNew = new ScFormulaCell( pDestDoc, aDestPos, &aArr );
587*b1cdbd2cSJim Jagielski 				pTransClip->PutCell( static_cast<SCCOL>(nRow-nRow1), static_cast<SCROW>(nCol-nCol1), pNew );
588*b1cdbd2cSJim Jagielski 			}
589*b1cdbd2cSJim Jagielski 		}
590*b1cdbd2cSJim Jagielski 		else
591*b1cdbd2cSJim Jagielski 		{
592*b1cdbd2cSJim Jagielski 			ScColumnIterator aIter( &aCol[nCol], nRow1, nRow2 );
593*b1cdbd2cSJim Jagielski 			while (aIter.Next( nRow, pCell ))
594*b1cdbd2cSJim Jagielski 			{
595*b1cdbd2cSJim Jagielski                 ScAddress aDestPos( static_cast<SCCOL>(nRow-nRow1), static_cast<SCROW>(nCol-nCol1), pTransClip->nTab );
596*b1cdbd2cSJim Jagielski 				ScBaseCell* pNew;
597*b1cdbd2cSJim Jagielski 				if ( bAsLink )					// Referenz erzeugen ?
598*b1cdbd2cSJim Jagielski 				{
599*b1cdbd2cSJim Jagielski 					pNew = aCol[nCol].CreateRefCell( pDestDoc, aDestPos, aIter.GetIndex(), nFlags );
600*b1cdbd2cSJim Jagielski 				}
601*b1cdbd2cSJim Jagielski 				else							// kopieren
602*b1cdbd2cSJim Jagielski 				{
603*b1cdbd2cSJim Jagielski                     ScAddress aOwnPos( nCol, nRow, nTab );
604*b1cdbd2cSJim Jagielski 					if (pCell->GetCellType() == CELLTYPE_FORMULA)
605*b1cdbd2cSJim Jagielski 					{
606*b1cdbd2cSJim Jagielski                         pNew = pCell->CloneWithNote( aOwnPos, *pDestDoc, aDestPos, SC_CLONECELL_STARTLISTENING );
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski 						//	Referenzen drehen
609*b1cdbd2cSJim Jagielski 						//	bei Cut werden Referenzen spaeter per UpdateTranspose angepasst
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski 						if (!bWasCut)
612*b1cdbd2cSJim Jagielski 							((ScFormulaCell*)pNew)->TransposeReference();
613*b1cdbd2cSJim Jagielski 					}
614*b1cdbd2cSJim Jagielski 					else
615*b1cdbd2cSJim Jagielski                     {
616*b1cdbd2cSJim Jagielski                         pNew = pCell->CloneWithNote( aOwnPos, *pDestDoc, aDestPos );
617*b1cdbd2cSJim Jagielski                     }
618*b1cdbd2cSJim Jagielski 				}
619*b1cdbd2cSJim Jagielski 				pTransClip->PutCell( static_cast<SCCOL>(nRow-nRow1), static_cast<SCROW>(nCol-nCol1), pNew );
620*b1cdbd2cSJim Jagielski 			}
621*b1cdbd2cSJim Jagielski 		}
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski 		//	Attribute
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 		SCROW nAttrRow1;
626*b1cdbd2cSJim Jagielski 		SCROW nAttrRow2;
627*b1cdbd2cSJim Jagielski 		const ScPatternAttr* pPattern;
628*b1cdbd2cSJim Jagielski 		ScAttrIterator* pAttrIter = aCol[nCol].CreateAttrIterator( nRow1, nRow2 );
629*b1cdbd2cSJim Jagielski 		while ( (pPattern = pAttrIter->Next( nAttrRow1, nAttrRow2 )) != 0 )
630*b1cdbd2cSJim Jagielski 		{
631*b1cdbd2cSJim Jagielski 			if ( !IsDefaultItem( pPattern ) )
632*b1cdbd2cSJim Jagielski 			{
633*b1cdbd2cSJim Jagielski 				const SfxItemSet& rSet = pPattern->GetItemSet();
634*b1cdbd2cSJim Jagielski 				if ( rSet.GetItemState( ATTR_MERGE, sal_False ) == SFX_ITEM_DEFAULT &&
635*b1cdbd2cSJim Jagielski 					 rSet.GetItemState( ATTR_MERGE_FLAG, sal_False ) == SFX_ITEM_DEFAULT &&
636*b1cdbd2cSJim Jagielski 					 rSet.GetItemState( ATTR_BORDER, sal_False ) == SFX_ITEM_DEFAULT )
637*b1cdbd2cSJim Jagielski 				{
638*b1cdbd2cSJim Jagielski 					// no borders or merge items involved - use pattern as-is
639*b1cdbd2cSJim Jagielski 					for (nRow = nAttrRow1; nRow<=nAttrRow2; nRow++)
640*b1cdbd2cSJim Jagielski 						pTransClip->SetPattern( static_cast<SCCOL>(nRow-nRow1), static_cast<SCROW>(nCol-nCol1), *pPattern, sal_True );
641*b1cdbd2cSJim Jagielski 				}
642*b1cdbd2cSJim Jagielski 				else
643*b1cdbd2cSJim Jagielski 				{
644*b1cdbd2cSJim Jagielski 					// transpose borders and merge values, remove merge flags (refreshed after pasting)
645*b1cdbd2cSJim Jagielski 					ScPatternAttr aNewPattern( *pPattern );
646*b1cdbd2cSJim Jagielski 					SfxItemSet& rNewSet = aNewPattern.GetItemSet();
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski 					const SvxBoxItem& rOldBox = (const SvxBoxItem&)rSet.Get(ATTR_BORDER);
649*b1cdbd2cSJim Jagielski 					if ( rOldBox.GetTop() || rOldBox.GetBottom() || rOldBox.GetLeft() || rOldBox.GetRight() )
650*b1cdbd2cSJim Jagielski 					{
651*b1cdbd2cSJim Jagielski 						SvxBoxItem aNew( ATTR_BORDER );
652*b1cdbd2cSJim Jagielski 						aNew.SetLine( rOldBox.GetLine( BOX_LINE_TOP ), BOX_LINE_LEFT );
653*b1cdbd2cSJim Jagielski 						aNew.SetLine( rOldBox.GetLine( BOX_LINE_LEFT ), BOX_LINE_TOP );
654*b1cdbd2cSJim Jagielski 						aNew.SetLine( rOldBox.GetLine( BOX_LINE_BOTTOM ), BOX_LINE_RIGHT );
655*b1cdbd2cSJim Jagielski 						aNew.SetLine( rOldBox.GetLine( BOX_LINE_RIGHT ), BOX_LINE_BOTTOM );
656*b1cdbd2cSJim Jagielski 						aNew.SetDistance( rOldBox.GetDistance( BOX_LINE_TOP ), BOX_LINE_LEFT );
657*b1cdbd2cSJim Jagielski 						aNew.SetDistance( rOldBox.GetDistance( BOX_LINE_LEFT ), BOX_LINE_TOP );
658*b1cdbd2cSJim Jagielski 						aNew.SetDistance( rOldBox.GetDistance( BOX_LINE_BOTTOM ), BOX_LINE_RIGHT );
659*b1cdbd2cSJim Jagielski 						aNew.SetDistance( rOldBox.GetDistance( BOX_LINE_RIGHT ), BOX_LINE_BOTTOM );
660*b1cdbd2cSJim Jagielski 						rNewSet.Put( aNew );
661*b1cdbd2cSJim Jagielski 					}
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 					const ScMergeAttr& rOldMerge = (const ScMergeAttr&)rSet.Get(ATTR_MERGE);
664*b1cdbd2cSJim Jagielski 					if (rOldMerge.IsMerged())
665*b1cdbd2cSJim Jagielski                         rNewSet.Put( ScMergeAttr( Min(
666*b1cdbd2cSJim Jagielski                                         static_cast<SCsCOL>(rOldMerge.GetRowMerge()),
667*b1cdbd2cSJim Jagielski                                         static_cast<SCsCOL>(MAXCOL+1 - (nAttrRow2-nRow1))),
668*b1cdbd2cSJim Jagielski                                     Min(
669*b1cdbd2cSJim Jagielski                                         static_cast<SCsROW>(rOldMerge.GetColMerge()),
670*b1cdbd2cSJim Jagielski                                         static_cast<SCsROW>(MAXROW+1 - (nCol-nCol1)))));
671*b1cdbd2cSJim Jagielski 					const ScMergeFlagAttr& rOldFlag = (const ScMergeFlagAttr&)rSet.Get(ATTR_MERGE_FLAG);
672*b1cdbd2cSJim Jagielski 					if (rOldFlag.IsOverlapped())
673*b1cdbd2cSJim Jagielski 					{
674*b1cdbd2cSJim Jagielski 						sal_Int16 nNewFlags = rOldFlag.GetValue() & ~( SC_MF_HOR | SC_MF_VER );
675*b1cdbd2cSJim Jagielski 						if ( nNewFlags )
676*b1cdbd2cSJim Jagielski 							rNewSet.Put( ScMergeFlagAttr( nNewFlags ) );
677*b1cdbd2cSJim Jagielski 						else
678*b1cdbd2cSJim Jagielski 							rNewSet.ClearItem( ATTR_MERGE_FLAG );
679*b1cdbd2cSJim Jagielski 					}
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski 					for (nRow = nAttrRow1; nRow<=nAttrRow2; nRow++)
682*b1cdbd2cSJim Jagielski                         pTransClip->SetPattern( static_cast<SCCOL>(nRow-nRow1),
683*b1cdbd2cSJim Jagielski                                 static_cast<SCROW>(nCol-nCol1), aNewPattern, sal_True);
684*b1cdbd2cSJim Jagielski 				}
685*b1cdbd2cSJim Jagielski 			}
686*b1cdbd2cSJim Jagielski 		}
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski 		delete pAttrIter;
689*b1cdbd2cSJim Jagielski 	}
690*b1cdbd2cSJim Jagielski }
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski 
StartAllListeners()693*b1cdbd2cSJim Jagielski void ScTable::StartAllListeners()
694*b1cdbd2cSJim Jagielski {
695*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
696*b1cdbd2cSJim Jagielski 		aCol[i].StartAllListeners();
697*b1cdbd2cSJim Jagielski }
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski 
StartNeededListeners()700*b1cdbd2cSJim Jagielski void ScTable::StartNeededListeners()
701*b1cdbd2cSJim Jagielski {
702*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
703*b1cdbd2cSJim Jagielski         aCol[i].StartNeededListeners();
704*b1cdbd2cSJim Jagielski }
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski 
BroadcastInArea(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2)707*b1cdbd2cSJim Jagielski void ScTable::BroadcastInArea( SCCOL nCol1, SCROW nRow1,
708*b1cdbd2cSJim Jagielski 		SCCOL nCol2, SCROW nRow2 )
709*b1cdbd2cSJim Jagielski {
710*b1cdbd2cSJim Jagielski 	if (nCol2 > MAXCOL) nCol2 = MAXCOL;
711*b1cdbd2cSJim Jagielski 	if (nRow2 > MAXROW) nRow2 = MAXROW;
712*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol1, nRow1) && ValidColRow(nCol2, nRow2))
713*b1cdbd2cSJim Jagielski 		for (SCCOL i = nCol1; i <= nCol2; i++)
714*b1cdbd2cSJim Jagielski 			aCol[i].BroadcastInArea( nRow1, nRow2 );
715*b1cdbd2cSJim Jagielski }
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 
StartListeningInArea(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2)718*b1cdbd2cSJim Jagielski void ScTable::StartListeningInArea( SCCOL nCol1, SCROW nRow1,
719*b1cdbd2cSJim Jagielski 		SCCOL nCol2, SCROW nRow2 )
720*b1cdbd2cSJim Jagielski {
721*b1cdbd2cSJim Jagielski 	if (nCol2 > MAXCOL) nCol2 = MAXCOL;
722*b1cdbd2cSJim Jagielski 	if (nRow2 > MAXROW) nRow2 = MAXROW;
723*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol1, nRow1) && ValidColRow(nCol2, nRow2))
724*b1cdbd2cSJim Jagielski 		for (SCCOL i = nCol1; i <= nCol2; i++)
725*b1cdbd2cSJim Jagielski 			aCol[i].StartListeningInArea( nRow1, nRow2 );
726*b1cdbd2cSJim Jagielski }
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski 
CopyToTable(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,sal_uInt16 nFlags,sal_Bool bMarked,ScTable * pDestTab,const ScMarkData * pMarkData,sal_Bool bAsLink,sal_Bool bColRowFlags)729*b1cdbd2cSJim Jagielski void ScTable::CopyToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
730*b1cdbd2cSJim Jagielski 							sal_uInt16 nFlags, sal_Bool bMarked, ScTable* pDestTab,
731*b1cdbd2cSJim Jagielski 							const ScMarkData* pMarkData,
732*b1cdbd2cSJim Jagielski 							sal_Bool bAsLink, sal_Bool bColRowFlags)
733*b1cdbd2cSJim Jagielski {
734*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol1, nRow1) && ValidColRow(nCol2, nRow2))
735*b1cdbd2cSJim Jagielski 	{
736*b1cdbd2cSJim Jagielski 		if (nFlags)
737*b1cdbd2cSJim Jagielski 			for (SCCOL i = nCol1; i <= nCol2; i++)
738*b1cdbd2cSJim Jagielski 				aCol[i].CopyToColumn(nRow1, nRow2, nFlags, bMarked,
739*b1cdbd2cSJim Jagielski 								pDestTab->aCol[i], pMarkData, bAsLink);
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski 		if (bColRowFlags)		// Spaltenbreiten/Zeilenhoehen/Flags
742*b1cdbd2cSJim Jagielski 		{
743*b1cdbd2cSJim Jagielski 			//	Charts muessen beim Ein-/Ausblenden angepasst werden
744*b1cdbd2cSJim Jagielski 			ScChartListenerCollection* pCharts = pDestTab->pDocument->GetChartListenerCollection();
745*b1cdbd2cSJim Jagielski 
746*b1cdbd2cSJim Jagielski             bool bFlagChange = false;
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski 			sal_Bool bWidth  = (nRow1==0 && nRow2==MAXROW && pColWidth && pDestTab->pColWidth);
749*b1cdbd2cSJim Jagielski             sal_Bool bHeight = (nCol1==0 && nCol2==MAXCOL && mpRowHeights && pDestTab->mpRowHeights);
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski 			if (bWidth||bHeight)
752*b1cdbd2cSJim Jagielski 			{
753*b1cdbd2cSJim Jagielski 				pDestTab->IncRecalcLevel();
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski 				if (bWidth)
756*b1cdbd2cSJim Jagielski                 {
757*b1cdbd2cSJim Jagielski 					for (SCCOL i=nCol1; i<=nCol2; i++)
758*b1cdbd2cSJim Jagielski 					{
759*b1cdbd2cSJim Jagielski                         bool bThisHidden = ColHidden(i);
760*b1cdbd2cSJim Jagielski                         bool bHiddenChange = (pDestTab->ColHidden(i) != bThisHidden);
761*b1cdbd2cSJim Jagielski                         bool bChange = bHiddenChange || (pDestTab->pColWidth[i] != pColWidth[i]);
762*b1cdbd2cSJim Jagielski 						pDestTab->pColWidth[i] = pColWidth[i];
763*b1cdbd2cSJim Jagielski 						pDestTab->pColFlags[i] = pColFlags[i];
764*b1cdbd2cSJim Jagielski                         pDestTab->SetColHidden(i, i, bThisHidden);
765*b1cdbd2cSJim Jagielski 						//!	Aenderungen zusammenfassen?
766*b1cdbd2cSJim Jagielski                         if (bHiddenChange && pCharts)
767*b1cdbd2cSJim Jagielski                             pCharts->SetRangeDirty(ScRange( i, 0, nTab, i, MAXROW, nTab ));
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski                         if (bChange)
770*b1cdbd2cSJim Jagielski                             bFlagChange = true;
771*b1cdbd2cSJim Jagielski 					}
772*b1cdbd2cSJim Jagielski                     pDestTab->SetColManualBreaks( maColManualBreaks);
773*b1cdbd2cSJim Jagielski                 }
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 				if (bHeight)
776*b1cdbd2cSJim Jagielski 				{
777*b1cdbd2cSJim Jagielski                     bool bChange = pDestTab->GetRowHeight(nRow1, nRow2) != GetRowHeight(nRow1, nRow2);
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski                     if (bChange)
780*b1cdbd2cSJim Jagielski                         bFlagChange = true;
781*b1cdbd2cSJim Jagielski 
782*b1cdbd2cSJim Jagielski                     pDestTab->CopyRowHeight(*this, nRow1, nRow2, 0);
783*b1cdbd2cSJim Jagielski                     pDestTab->pRowFlags->CopyFrom(*pRowFlags, nRow1, nRow2);
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski                     // Hidden flags.
786*b1cdbd2cSJim Jagielski                     // #i116164# Collect information first, then apply the changes,
787*b1cdbd2cSJim Jagielski                     // so RowHidden doesn't rebuild the tree for each row range.
788*b1cdbd2cSJim Jagielski                     std::vector<ScShowRowsEntry> aEntries;
789*b1cdbd2cSJim Jagielski                     for (SCROW i = nRow1; i <= nRow2; ++i)
790*b1cdbd2cSJim Jagielski                     {
791*b1cdbd2cSJim Jagielski                         SCROW nThisLastRow, nDestLastRow;
792*b1cdbd2cSJim Jagielski                         bool bThisHidden = RowHidden(i, NULL, &nThisLastRow);
793*b1cdbd2cSJim Jagielski                         bool bDestHidden = pDestTab->RowHidden(i, NULL, &nDestLastRow);
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski                         // If the segment sizes differ, we take the shorter segment of the two.
796*b1cdbd2cSJim Jagielski                         SCROW nLastRow = ::std::min(nThisLastRow, nDestLastRow);
797*b1cdbd2cSJim Jagielski                         if (nLastRow >= nRow2)
798*b1cdbd2cSJim Jagielski                             // the last row shouldn't exceed the upper bound the caller specified.
799*b1cdbd2cSJim Jagielski                             nLastRow = nRow2;
800*b1cdbd2cSJim Jagielski 
801*b1cdbd2cSJim Jagielski                         //pDestTab->SetRowHidden(i, nLastRow, bThisHidden);
802*b1cdbd2cSJim Jagielski                         aEntries.push_back(ScShowRowsEntry(i, nLastRow, !bThisHidden));
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski                         bool bThisHiddenChange = (bThisHidden != bDestHidden);
805*b1cdbd2cSJim Jagielski                         if (bThisHiddenChange && pCharts)
806*b1cdbd2cSJim Jagielski                         {
807*b1cdbd2cSJim Jagielski                             // Hidden flags differ.
808*b1cdbd2cSJim Jagielski                             pCharts->SetRangeDirty(ScRange(0, i, nTab, MAXCOL, nLastRow, nTab));
809*b1cdbd2cSJim Jagielski                         }
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski                         if (bThisHiddenChange)
812*b1cdbd2cSJim Jagielski                             bFlagChange = true;
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski                         // Jump to the last row of the identical flag segment.
815*b1cdbd2cSJim Jagielski                         i = nLastRow;
816*b1cdbd2cSJim Jagielski 					}
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski                     std::vector<ScShowRowsEntry>::const_iterator aEnd = aEntries.end();
819*b1cdbd2cSJim Jagielski                     std::vector<ScShowRowsEntry>::const_iterator aIter = aEntries.begin();
820*b1cdbd2cSJim Jagielski                     if ( aIter != aEnd )
821*b1cdbd2cSJim Jagielski                     {
822*b1cdbd2cSJim Jagielski                         pDestTab->mpHiddenRows->setInsertFromBack(true);    // important for undo document
823*b1cdbd2cSJim Jagielski                         while (aIter != aEnd)
824*b1cdbd2cSJim Jagielski                         {
825*b1cdbd2cSJim Jagielski                             pDestTab->SetRowHidden(aIter->mnRow1, aIter->mnRow2, !aIter->mbShow);
826*b1cdbd2cSJim Jagielski                             ++aIter;
827*b1cdbd2cSJim Jagielski                         }
828*b1cdbd2cSJim Jagielski                         pDestTab->mpHiddenRows->setInsertFromBack(false);
829*b1cdbd2cSJim Jagielski                     }
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski                     // Filtered flags.
832*b1cdbd2cSJim Jagielski                     for (SCROW i = nRow1; i <= nRow2; ++i)
833*b1cdbd2cSJim Jagielski                     {
834*b1cdbd2cSJim Jagielski                         SCROW nLastRow;
835*b1cdbd2cSJim Jagielski                         bool bFiltered = RowFiltered(i, NULL, &nLastRow);
836*b1cdbd2cSJim Jagielski                         if (nLastRow >= nRow2)
837*b1cdbd2cSJim Jagielski                             // the last row shouldn't exceed the upper bound the caller specified.
838*b1cdbd2cSJim Jagielski                             nLastRow = nRow2;
839*b1cdbd2cSJim Jagielski                         pDestTab->SetRowFiltered(i, nLastRow, bFiltered);
840*b1cdbd2cSJim Jagielski                         i = nLastRow;
841*b1cdbd2cSJim Jagielski                     }
842*b1cdbd2cSJim Jagielski                     pDestTab->SetRowManualBreaks( maRowManualBreaks);
843*b1cdbd2cSJim Jagielski 				}
844*b1cdbd2cSJim Jagielski 				pDestTab->DecRecalcLevel();
845*b1cdbd2cSJim Jagielski 			}
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski             if (bFlagChange)
848*b1cdbd2cSJim Jagielski                 pDestTab->InvalidatePageBreaks();
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski 			pDestTab->SetOutlineTable( pOutlineTable );		// auch nur wenn bColRowFlags
851*b1cdbd2cSJim Jagielski 		}
852*b1cdbd2cSJim Jagielski 	}
853*b1cdbd2cSJim Jagielski }
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski 
UndoToTable(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,sal_uInt16 nFlags,sal_Bool bMarked,ScTable * pDestTab,const ScMarkData * pMarkData)856*b1cdbd2cSJim Jagielski void ScTable::UndoToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
857*b1cdbd2cSJim Jagielski 							sal_uInt16 nFlags, sal_Bool bMarked, ScTable* pDestTab,
858*b1cdbd2cSJim Jagielski 							const ScMarkData* pMarkData)
859*b1cdbd2cSJim Jagielski {
860*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol1, nRow1) && ValidColRow(nCol2, nRow2))
861*b1cdbd2cSJim Jagielski 	{
862*b1cdbd2cSJim Jagielski 		sal_Bool bWidth  = (nRow1==0 && nRow2==MAXROW && pColWidth && pDestTab->pColWidth);
863*b1cdbd2cSJim Jagielski         sal_Bool bHeight = (nCol1==0 && nCol2==MAXCOL && mpRowHeights && pDestTab->mpRowHeights);
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski 		if (bWidth||bHeight)
866*b1cdbd2cSJim Jagielski 			IncRecalcLevel();
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski 		for ( SCCOL i = 0; i <= MAXCOL; i++)
869*b1cdbd2cSJim Jagielski 		{
870*b1cdbd2cSJim Jagielski 			if ( i >= nCol1 && i <= nCol2 )
871*b1cdbd2cSJim Jagielski 				aCol[i].UndoToColumn(nRow1, nRow2, nFlags, bMarked, pDestTab->aCol[i],
872*b1cdbd2cSJim Jagielski 										pMarkData);
873*b1cdbd2cSJim Jagielski 			else
874*b1cdbd2cSJim Jagielski 				aCol[i].CopyToColumn(0, MAXROW, IDF_FORMULA, sal_False, pDestTab->aCol[i]);
875*b1cdbd2cSJim Jagielski 		}
876*b1cdbd2cSJim Jagielski 
877*b1cdbd2cSJim Jagielski 		if (bWidth||bHeight)
878*b1cdbd2cSJim Jagielski 		{
879*b1cdbd2cSJim Jagielski             if (bWidth)
880*b1cdbd2cSJim Jagielski             {
881*b1cdbd2cSJim Jagielski                 for (SCCOL i=nCol1; i<=nCol2; i++)
882*b1cdbd2cSJim Jagielski                     pDestTab->pColWidth[i] = pColWidth[i];
883*b1cdbd2cSJim Jagielski                 pDestTab->SetColManualBreaks( maColManualBreaks);
884*b1cdbd2cSJim Jagielski             }
885*b1cdbd2cSJim Jagielski             if (bHeight)
886*b1cdbd2cSJim Jagielski             {
887*b1cdbd2cSJim Jagielski                 pDestTab->CopyRowHeight(*this, nRow1, nRow2, 0);
888*b1cdbd2cSJim Jagielski                 pDestTab->SetRowManualBreaks( maRowManualBreaks);
889*b1cdbd2cSJim Jagielski             }
890*b1cdbd2cSJim Jagielski             DecRecalcLevel();
891*b1cdbd2cSJim Jagielski 		}
892*b1cdbd2cSJim Jagielski 	}
893*b1cdbd2cSJim Jagielski }
894*b1cdbd2cSJim Jagielski 
895*b1cdbd2cSJim Jagielski 
CopyUpdated(const ScTable * pPosTab,ScTable * pDestTab) const896*b1cdbd2cSJim Jagielski void ScTable::CopyUpdated( const ScTable* pPosTab, ScTable* pDestTab ) const
897*b1cdbd2cSJim Jagielski {
898*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
899*b1cdbd2cSJim Jagielski 		aCol[i].CopyUpdated( pPosTab->aCol[i], pDestTab->aCol[i] );
900*b1cdbd2cSJim Jagielski }
901*b1cdbd2cSJim Jagielski 
InvalidateTableArea()902*b1cdbd2cSJim Jagielski void ScTable::InvalidateTableArea()
903*b1cdbd2cSJim Jagielski {
904*b1cdbd2cSJim Jagielski     bTableAreaValid = sal_False;
905*b1cdbd2cSJim Jagielski }
906*b1cdbd2cSJim Jagielski 
InvalidatePageBreaks()907*b1cdbd2cSJim Jagielski void ScTable::InvalidatePageBreaks()
908*b1cdbd2cSJim Jagielski {
909*b1cdbd2cSJim Jagielski     mbPageBreaksValid = false;
910*b1cdbd2cSJim Jagielski }
911*b1cdbd2cSJim Jagielski 
CopyScenarioTo(ScTable * pDestTab) const912*b1cdbd2cSJim Jagielski void ScTable::CopyScenarioTo( ScTable* pDestTab ) const
913*b1cdbd2cSJim Jagielski {
914*b1cdbd2cSJim Jagielski 	DBG_ASSERT( bScenario, "bScenario == FALSE" );
915*b1cdbd2cSJim Jagielski 
916*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
917*b1cdbd2cSJim Jagielski 		aCol[i].CopyScenarioTo( pDestTab->aCol[i] );
918*b1cdbd2cSJim Jagielski }
919*b1cdbd2cSJim Jagielski 
CopyScenarioFrom(const ScTable * pSrcTab)920*b1cdbd2cSJim Jagielski void ScTable::CopyScenarioFrom( const ScTable* pSrcTab )
921*b1cdbd2cSJim Jagielski {
922*b1cdbd2cSJim Jagielski 	DBG_ASSERT( bScenario, "bScenario == FALSE" );
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
925*b1cdbd2cSJim Jagielski 		aCol[i].CopyScenarioFrom( pSrcTab->aCol[i] );
926*b1cdbd2cSJim Jagielski }
927*b1cdbd2cSJim Jagielski 
MarkScenarioIn(ScMarkData & rDestMark,sal_uInt16 nNeededBits) const928*b1cdbd2cSJim Jagielski void ScTable::MarkScenarioIn( ScMarkData& rDestMark, sal_uInt16 nNeededBits ) const
929*b1cdbd2cSJim Jagielski {
930*b1cdbd2cSJim Jagielski 	DBG_ASSERT( bScenario, "bScenario == FALSE" );
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski 	if ( ( nScenarioFlags & nNeededBits ) != nNeededBits )	// alle Bits gesetzt?
933*b1cdbd2cSJim Jagielski 		return;
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
936*b1cdbd2cSJim Jagielski 		aCol[i].MarkScenarioIn( rDestMark );
937*b1cdbd2cSJim Jagielski }
938*b1cdbd2cSJim Jagielski 
HasScenarioRange(const ScRange & rRange) const939*b1cdbd2cSJim Jagielski sal_Bool ScTable::HasScenarioRange( const ScRange& rRange ) const
940*b1cdbd2cSJim Jagielski {
941*b1cdbd2cSJim Jagielski 	DBG_ASSERT( bScenario, "bScenario == FALSE" );
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski //	ScMarkData aMark;
944*b1cdbd2cSJim Jagielski //	MarkScenarioIn( aMark, 0 );				//! Bits als Parameter von HasScenarioRange?
945*b1cdbd2cSJim Jagielski //	return aMark.IsAllMarked( rRange );
946*b1cdbd2cSJim Jagielski 
947*b1cdbd2cSJim Jagielski 	ScRange aTabRange = rRange;
948*b1cdbd2cSJim Jagielski 	aTabRange.aStart.SetTab( nTab );
949*b1cdbd2cSJim Jagielski 	aTabRange.aEnd.SetTab( nTab );
950*b1cdbd2cSJim Jagielski 
951*b1cdbd2cSJim Jagielski 	const ScRangeList* pList = GetScenarioRanges();
952*b1cdbd2cSJim Jagielski //	return ( pList && pList->Find( aTabRange ) );
953*b1cdbd2cSJim Jagielski 
954*b1cdbd2cSJim Jagielski 	if (pList)
955*b1cdbd2cSJim Jagielski 	{
956*b1cdbd2cSJim Jagielski 		sal_uLong nCount = pList->Count();
957*b1cdbd2cSJim Jagielski 		for ( sal_uLong j = 0; j < nCount; j++ )
958*b1cdbd2cSJim Jagielski 		{
959*b1cdbd2cSJim Jagielski 			ScRange* pR = pList->GetObject( j );
960*b1cdbd2cSJim Jagielski 			if ( pR->Intersects( aTabRange ) )
961*b1cdbd2cSJim Jagielski 				return sal_True;
962*b1cdbd2cSJim Jagielski 		}
963*b1cdbd2cSJim Jagielski 	}
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski 	return sal_False;
966*b1cdbd2cSJim Jagielski }
967*b1cdbd2cSJim Jagielski 
InvalidateScenarioRanges()968*b1cdbd2cSJim Jagielski void ScTable::InvalidateScenarioRanges()
969*b1cdbd2cSJim Jagielski {
970*b1cdbd2cSJim Jagielski 	delete pScenarioRanges;
971*b1cdbd2cSJim Jagielski 	pScenarioRanges = NULL;
972*b1cdbd2cSJim Jagielski }
973*b1cdbd2cSJim Jagielski 
GetScenarioRanges() const974*b1cdbd2cSJim Jagielski const ScRangeList* ScTable::GetScenarioRanges() const
975*b1cdbd2cSJim Jagielski {
976*b1cdbd2cSJim Jagielski 	DBG_ASSERT( bScenario, "bScenario == FALSE" );
977*b1cdbd2cSJim Jagielski 
978*b1cdbd2cSJim Jagielski 	if (!pScenarioRanges)
979*b1cdbd2cSJim Jagielski 	{
980*b1cdbd2cSJim Jagielski 		((ScTable*)this)->pScenarioRanges = new ScRangeList;
981*b1cdbd2cSJim Jagielski 		ScMarkData aMark;
982*b1cdbd2cSJim Jagielski 		MarkScenarioIn( aMark, 0 );		// immer
983*b1cdbd2cSJim Jagielski 		aMark.FillRangeListWithMarks( pScenarioRanges, sal_False );
984*b1cdbd2cSJim Jagielski 	}
985*b1cdbd2cSJim Jagielski 	return pScenarioRanges;
986*b1cdbd2cSJim Jagielski }
987*b1cdbd2cSJim Jagielski 
TestCopyScenarioTo(const ScTable * pDestTab) const988*b1cdbd2cSJim Jagielski sal_Bool ScTable::TestCopyScenarioTo( const ScTable* pDestTab ) const
989*b1cdbd2cSJim Jagielski {
990*b1cdbd2cSJim Jagielski 	DBG_ASSERT( bScenario, "bScenario == FALSE" );
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski 	if (!pDestTab->IsProtected())
993*b1cdbd2cSJim Jagielski 		return sal_True;
994*b1cdbd2cSJim Jagielski 
995*b1cdbd2cSJim Jagielski 	sal_Bool bOk = sal_True;
996*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL && bOk; i++)
997*b1cdbd2cSJim Jagielski 		bOk = aCol[i].TestCopyScenarioTo( pDestTab->aCol[i] );
998*b1cdbd2cSJim Jagielski 	return bOk;
999*b1cdbd2cSJim Jagielski }
1000*b1cdbd2cSJim Jagielski 
PutCell(SCCOL nCol,SCROW nRow,ScBaseCell * pCell)1001*b1cdbd2cSJim Jagielski void ScTable::PutCell( SCCOL nCol, SCROW nRow, ScBaseCell* pCell )
1002*b1cdbd2cSJim Jagielski {
1003*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1004*b1cdbd2cSJim Jagielski 	{
1005*b1cdbd2cSJim Jagielski 		if (pCell)
1006*b1cdbd2cSJim Jagielski 			aCol[nCol].Insert( nRow, pCell );
1007*b1cdbd2cSJim Jagielski 		else
1008*b1cdbd2cSJim Jagielski 			aCol[nCol].Delete( nRow );
1009*b1cdbd2cSJim Jagielski 	}
1010*b1cdbd2cSJim Jagielski }
1011*b1cdbd2cSJim Jagielski 
1012*b1cdbd2cSJim Jagielski 
PutCell(SCCOL nCol,SCROW nRow,sal_uLong nFormatIndex,ScBaseCell * pCell)1013*b1cdbd2cSJim Jagielski void ScTable::PutCell( SCCOL nCol, SCROW nRow, sal_uLong nFormatIndex, ScBaseCell* pCell )
1014*b1cdbd2cSJim Jagielski {
1015*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1016*b1cdbd2cSJim Jagielski 	{
1017*b1cdbd2cSJim Jagielski 		if (pCell)
1018*b1cdbd2cSJim Jagielski 			aCol[nCol].Insert( nRow, nFormatIndex, pCell );
1019*b1cdbd2cSJim Jagielski 		else
1020*b1cdbd2cSJim Jagielski 			aCol[nCol].Delete( nRow );
1021*b1cdbd2cSJim Jagielski 	}
1022*b1cdbd2cSJim Jagielski }
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski 
PutCell(const ScAddress & rPos,ScBaseCell * pCell)1025*b1cdbd2cSJim Jagielski void ScTable::PutCell( const ScAddress& rPos, ScBaseCell* pCell )
1026*b1cdbd2cSJim Jagielski {
1027*b1cdbd2cSJim Jagielski 	if (pCell)
1028*b1cdbd2cSJim Jagielski 		aCol[rPos.Col()].Insert( rPos.Row(), pCell );
1029*b1cdbd2cSJim Jagielski 	else
1030*b1cdbd2cSJim Jagielski 		aCol[rPos.Col()].Delete( rPos.Row() );
1031*b1cdbd2cSJim Jagielski }
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski //UNUSED2009-05 void ScTable::PutCell( const ScAddress& rPos, sal_uLong nFormatIndex, ScBaseCell* pCell )
1035*b1cdbd2cSJim Jagielski //UNUSED2009-05 {
1036*b1cdbd2cSJim Jagielski //UNUSED2009-05     if (pCell)
1037*b1cdbd2cSJim Jagielski //UNUSED2009-05         aCol[rPos.Col()].Insert( rPos.Row(), nFormatIndex, pCell );
1038*b1cdbd2cSJim Jagielski //UNUSED2009-05     else
1039*b1cdbd2cSJim Jagielski //UNUSED2009-05         aCol[rPos.Col()].Delete( rPos.Row() );
1040*b1cdbd2cSJim Jagielski //UNUSED2009-05 }
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski 
SetString(SCCOL nCol,SCROW nRow,SCTAB nTabP,const String & rString,SvNumberFormatter * pFormatter,bool bDetectNumberFormat)1043*b1cdbd2cSJim Jagielski sal_Bool ScTable::SetString( SCCOL nCol, SCROW nRow, SCTAB nTabP, const String& rString,
1044*b1cdbd2cSJim Jagielski                          SvNumberFormatter* pFormatter, bool bDetectNumberFormat )
1045*b1cdbd2cSJim Jagielski {
1046*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1047*b1cdbd2cSJim Jagielski         return aCol[nCol].SetString(
1048*b1cdbd2cSJim Jagielski             nRow, nTabP, rString, pDocument->GetAddressConvention(), pFormatter, bDetectNumberFormat );
1049*b1cdbd2cSJim Jagielski 	else
1050*b1cdbd2cSJim Jagielski 		return sal_False;
1051*b1cdbd2cSJim Jagielski }
1052*b1cdbd2cSJim Jagielski 
1053*b1cdbd2cSJim Jagielski 
SetValue(SCCOL nCol,SCROW nRow,const double & rVal)1054*b1cdbd2cSJim Jagielski void ScTable::SetValue( SCCOL nCol, SCROW nRow, const double& rVal )
1055*b1cdbd2cSJim Jagielski {
1056*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol, nRow))
1057*b1cdbd2cSJim Jagielski 		aCol[nCol].SetValue( nRow, rVal );
1058*b1cdbd2cSJim Jagielski }
1059*b1cdbd2cSJim Jagielski 
1060*b1cdbd2cSJim Jagielski 
GetString(SCCOL nCol,SCROW nRow,String & rString)1061*b1cdbd2cSJim Jagielski void ScTable::GetString( SCCOL nCol, SCROW nRow, String& rString )
1062*b1cdbd2cSJim Jagielski {
1063*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1064*b1cdbd2cSJim Jagielski 		aCol[nCol].GetString( nRow, rString );
1065*b1cdbd2cSJim Jagielski 	else
1066*b1cdbd2cSJim Jagielski 		rString.Erase();
1067*b1cdbd2cSJim Jagielski }
1068*b1cdbd2cSJim Jagielski 
FillDPCache(ScDPTableDataCache * pCache,SCCOL nStartCol,SCCOL nEndCol,SCROW nStartRow,SCROW nEndRow)1069*b1cdbd2cSJim Jagielski void  ScTable::FillDPCache( ScDPTableDataCache * pCache, SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow )
1070*b1cdbd2cSJim Jagielski {
1071*b1cdbd2cSJim Jagielski     for ( sal_uInt16 nCol = nStartCol; nCol <= nEndCol; nCol++ )
1072*b1cdbd2cSJim Jagielski         if( ValidCol( nCol ) )
1073*b1cdbd2cSJim Jagielski             aCol[nCol].FillDPCache( pCache, nCol - nStartCol, nStartRow, nEndRow );
1074*b1cdbd2cSJim Jagielski }
1075*b1cdbd2cSJim Jagielski 
1076*b1cdbd2cSJim Jagielski 
GetInputString(SCCOL nCol,SCROW nRow,String & rString)1077*b1cdbd2cSJim Jagielski void ScTable::GetInputString( SCCOL nCol, SCROW nRow, String& rString )
1078*b1cdbd2cSJim Jagielski {
1079*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1080*b1cdbd2cSJim Jagielski 		aCol[nCol].GetInputString( nRow, rString );
1081*b1cdbd2cSJim Jagielski 	else
1082*b1cdbd2cSJim Jagielski 		rString.Erase();
1083*b1cdbd2cSJim Jagielski }
1084*b1cdbd2cSJim Jagielski 
1085*b1cdbd2cSJim Jagielski 
GetValue(SCCOL nCol,SCROW nRow)1086*b1cdbd2cSJim Jagielski double ScTable::GetValue( SCCOL nCol, SCROW nRow )
1087*b1cdbd2cSJim Jagielski {
1088*b1cdbd2cSJim Jagielski 	if (ValidColRow( nCol, nRow ))
1089*b1cdbd2cSJim Jagielski 		return aCol[nCol].GetValue( nRow );
1090*b1cdbd2cSJim Jagielski 	return 0.0;
1091*b1cdbd2cSJim Jagielski }
1092*b1cdbd2cSJim Jagielski 
1093*b1cdbd2cSJim Jagielski 
GetFormula(SCCOL nCol,SCROW nRow,String & rFormula,sal_Bool bAsciiExport)1094*b1cdbd2cSJim Jagielski void ScTable::GetFormula( SCCOL nCol, SCROW nRow, String& rFormula,
1095*b1cdbd2cSJim Jagielski 						  sal_Bool bAsciiExport )
1096*b1cdbd2cSJim Jagielski {
1097*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1098*b1cdbd2cSJim Jagielski 		aCol[nCol].GetFormula( nRow, rFormula, bAsciiExport );
1099*b1cdbd2cSJim Jagielski 	else
1100*b1cdbd2cSJim Jagielski 		rFormula.Erase();
1101*b1cdbd2cSJim Jagielski }
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski 
GetNote(SCCOL nCol,SCROW nRow)1104*b1cdbd2cSJim Jagielski ScPostIt* ScTable::GetNote( SCCOL nCol, SCROW nRow )
1105*b1cdbd2cSJim Jagielski {
1106*b1cdbd2cSJim Jagielski 	return ValidColRow( nCol, nRow ) ? aCol[ nCol ].GetNote( nRow ) : 0;
1107*b1cdbd2cSJim Jagielski }
1108*b1cdbd2cSJim Jagielski 
1109*b1cdbd2cSJim Jagielski 
TakeNote(SCCOL nCol,SCROW nRow,ScPostIt * & rpNote)1110*b1cdbd2cSJim Jagielski void ScTable::TakeNote( SCCOL nCol, SCROW nRow, ScPostIt*& rpNote )
1111*b1cdbd2cSJim Jagielski {
1112*b1cdbd2cSJim Jagielski 	if( ValidColRow( nCol, nRow ) )
1113*b1cdbd2cSJim Jagielski     {
1114*b1cdbd2cSJim Jagielski         aCol[ nCol ].TakeNote( nRow, rpNote );
1115*b1cdbd2cSJim Jagielski         if( rpNote && rpNote->GetNoteData().mxInitData.get() )
1116*b1cdbd2cSJim Jagielski         {
1117*b1cdbd2cSJim Jagielski             if( !mxUninitNotes.get() )
1118*b1cdbd2cSJim Jagielski                 mxUninitNotes.reset( new ScAddress2DVec );
1119*b1cdbd2cSJim Jagielski             mxUninitNotes->push_back( ScAddress2D( nCol, nRow ) );
1120*b1cdbd2cSJim Jagielski         }
1121*b1cdbd2cSJim Jagielski     }
1122*b1cdbd2cSJim Jagielski     else
1123*b1cdbd2cSJim Jagielski         DELETEZ( rpNote );
1124*b1cdbd2cSJim Jagielski }
1125*b1cdbd2cSJim Jagielski 
1126*b1cdbd2cSJim Jagielski 
ReleaseNote(SCCOL nCol,SCROW nRow)1127*b1cdbd2cSJim Jagielski ScPostIt* ScTable::ReleaseNote( SCCOL nCol, SCROW nRow )
1128*b1cdbd2cSJim Jagielski {
1129*b1cdbd2cSJim Jagielski 	return ValidColRow( nCol, nRow ) ? aCol[ nCol ].ReleaseNote( nRow ) : 0;
1130*b1cdbd2cSJim Jagielski }
1131*b1cdbd2cSJim Jagielski 
1132*b1cdbd2cSJim Jagielski 
DeleteNote(SCCOL nCol,SCROW nRow)1133*b1cdbd2cSJim Jagielski void ScTable::DeleteNote( SCCOL nCol, SCROW nRow )
1134*b1cdbd2cSJim Jagielski {
1135*b1cdbd2cSJim Jagielski 	if( ValidColRow( nCol, nRow ) )
1136*b1cdbd2cSJim Jagielski         aCol[ nCol ].DeleteNote( nRow );
1137*b1cdbd2cSJim Jagielski }
1138*b1cdbd2cSJim Jagielski 
1139*b1cdbd2cSJim Jagielski 
InitializeNoteCaptions(bool bForced)1140*b1cdbd2cSJim Jagielski void ScTable::InitializeNoteCaptions( bool bForced )
1141*b1cdbd2cSJim Jagielski {
1142*b1cdbd2cSJim Jagielski     if( mxUninitNotes.get() && (bForced || pDocument->IsUndoEnabled()) )
1143*b1cdbd2cSJim Jagielski     {
1144*b1cdbd2cSJim Jagielski         for( ScAddress2DVec::iterator aIt = mxUninitNotes->begin(), aEnd = mxUninitNotes->end(); aIt != aEnd; ++aIt )
1145*b1cdbd2cSJim Jagielski             if( ScPostIt* pNote = GetNote( aIt->first, aIt->second ) )
1146*b1cdbd2cSJim Jagielski                 pNote->GetOrCreateCaption( ScAddress( aIt->first, aIt->second, nTab ) );
1147*b1cdbd2cSJim Jagielski         mxUninitNotes.reset();
1148*b1cdbd2cSJim Jagielski     }
1149*b1cdbd2cSJim Jagielski }
1150*b1cdbd2cSJim Jagielski 
GetCellType(SCCOL nCol,SCROW nRow) const1151*b1cdbd2cSJim Jagielski CellType ScTable::GetCellType( SCCOL nCol, SCROW nRow ) const
1152*b1cdbd2cSJim Jagielski {
1153*b1cdbd2cSJim Jagielski 	if (ValidColRow( nCol, nRow ))
1154*b1cdbd2cSJim Jagielski 		return aCol[nCol].GetCellType( nRow );
1155*b1cdbd2cSJim Jagielski 	return CELLTYPE_NONE;
1156*b1cdbd2cSJim Jagielski }
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski 
GetCell(SCCOL nCol,SCROW nRow) const1159*b1cdbd2cSJim Jagielski ScBaseCell* ScTable::GetCell( SCCOL nCol, SCROW nRow ) const
1160*b1cdbd2cSJim Jagielski {
1161*b1cdbd2cSJim Jagielski 	if (ValidColRow( nCol, nRow ))
1162*b1cdbd2cSJim Jagielski 		return aCol[nCol].GetCell( nRow );
1163*b1cdbd2cSJim Jagielski 
1164*b1cdbd2cSJim Jagielski 	DBG_ERROR("GetCell ausserhalb");
1165*b1cdbd2cSJim Jagielski 	return NULL;
1166*b1cdbd2cSJim Jagielski }
1167*b1cdbd2cSJim Jagielski 
GetFirstDataPos(SCCOL & rCol,SCROW & rRow) const1168*b1cdbd2cSJim Jagielski void ScTable::GetFirstDataPos(SCCOL& rCol, SCROW& rRow) const
1169*b1cdbd2cSJim Jagielski {
1170*b1cdbd2cSJim Jagielski     rCol = 0;
1171*b1cdbd2cSJim Jagielski     rRow = MAXROW+1;
1172*b1cdbd2cSJim Jagielski     while (aCol[rCol].IsEmptyData() && rCol < MAXCOL)
1173*b1cdbd2cSJim Jagielski         ++rCol;
1174*b1cdbd2cSJim Jagielski     SCCOL nCol = rCol;
1175*b1cdbd2cSJim Jagielski     while (nCol <= MAXCOL && rRow > 0)
1176*b1cdbd2cSJim Jagielski     {
1177*b1cdbd2cSJim Jagielski         if (!aCol[nCol].IsEmptyData())
1178*b1cdbd2cSJim Jagielski             rRow = ::std::min( rRow, aCol[nCol].GetFirstDataPos());
1179*b1cdbd2cSJim Jagielski         ++nCol;
1180*b1cdbd2cSJim Jagielski     }
1181*b1cdbd2cSJim Jagielski }
1182*b1cdbd2cSJim Jagielski 
GetLastDataPos(SCCOL & rCol,SCROW & rRow) const1183*b1cdbd2cSJim Jagielski void ScTable::GetLastDataPos(SCCOL& rCol, SCROW& rRow) const
1184*b1cdbd2cSJim Jagielski {
1185*b1cdbd2cSJim Jagielski     rCol = MAXCOL;
1186*b1cdbd2cSJim Jagielski     rRow = 0;
1187*b1cdbd2cSJim Jagielski     while (aCol[rCol].IsEmptyData() && (rCol > 0))
1188*b1cdbd2cSJim Jagielski         rCol--;
1189*b1cdbd2cSJim Jagielski     SCCOL nCol = rCol;
1190*b1cdbd2cSJim Jagielski     while (nCol >= 0 && rRow < MAXROW)
1191*b1cdbd2cSJim Jagielski         rRow = ::std::max( rRow, aCol[nCol--].GetLastDataPos());
1192*b1cdbd2cSJim Jagielski }
1193*b1cdbd2cSJim Jagielski 
1194*b1cdbd2cSJim Jagielski 
HasData(SCCOL nCol,SCROW nRow)1195*b1cdbd2cSJim Jagielski sal_Bool ScTable::HasData( SCCOL nCol, SCROW nRow )
1196*b1cdbd2cSJim Jagielski {
1197*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1198*b1cdbd2cSJim Jagielski 		return aCol[nCol].HasDataAt( nRow );
1199*b1cdbd2cSJim Jagielski 	else
1200*b1cdbd2cSJim Jagielski 		return sal_False;
1201*b1cdbd2cSJim Jagielski }
1202*b1cdbd2cSJim Jagielski 
1203*b1cdbd2cSJim Jagielski 
HasStringData(SCCOL nCol,SCROW nRow)1204*b1cdbd2cSJim Jagielski sal_Bool ScTable::HasStringData( SCCOL nCol, SCROW nRow )
1205*b1cdbd2cSJim Jagielski {
1206*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1207*b1cdbd2cSJim Jagielski 		return aCol[nCol].HasStringData( nRow );
1208*b1cdbd2cSJim Jagielski 	else
1209*b1cdbd2cSJim Jagielski 		return sal_False;
1210*b1cdbd2cSJim Jagielski }
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski 
HasValueData(SCCOL nCol,SCROW nRow)1213*b1cdbd2cSJim Jagielski sal_Bool ScTable::HasValueData( SCCOL nCol, SCROW nRow )
1214*b1cdbd2cSJim Jagielski {
1215*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1216*b1cdbd2cSJim Jagielski 		return aCol[nCol].HasValueData( nRow );
1217*b1cdbd2cSJim Jagielski 	else
1218*b1cdbd2cSJim Jagielski 		return sal_False;
1219*b1cdbd2cSJim Jagielski }
1220*b1cdbd2cSJim Jagielski 
1221*b1cdbd2cSJim Jagielski 
HasStringCells(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow) const1222*b1cdbd2cSJim Jagielski sal_Bool ScTable::HasStringCells( SCCOL nStartCol, SCROW nStartRow,
1223*b1cdbd2cSJim Jagielski 								SCCOL nEndCol, SCROW nEndRow ) const
1224*b1cdbd2cSJim Jagielski {
1225*b1cdbd2cSJim Jagielski 	if ( ValidCol(nEndCol) )
1226*b1cdbd2cSJim Jagielski 		for ( SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++ )
1227*b1cdbd2cSJim Jagielski 			if (aCol[nCol].HasStringCells(nStartRow, nEndRow))
1228*b1cdbd2cSJim Jagielski 				return sal_True;
1229*b1cdbd2cSJim Jagielski 
1230*b1cdbd2cSJim Jagielski 	return sal_False;
1231*b1cdbd2cSJim Jagielski }
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski 
1234*b1cdbd2cSJim Jagielski //UNUSED2008-05  sal_uInt16 ScTable::GetErrCode( SCCOL nCol, SCROW nRow ) const
1235*b1cdbd2cSJim Jagielski //UNUSED2008-05  {
1236*b1cdbd2cSJim Jagielski //UNUSED2008-05      if (ValidColRow( nCol, nRow ))
1237*b1cdbd2cSJim Jagielski //UNUSED2008-05          return aCol[nCol].GetErrCode( nRow );
1238*b1cdbd2cSJim Jagielski //UNUSED2008-05      return 0;
1239*b1cdbd2cSJim Jagielski //UNUSED2008-05  }
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski 
SetDirtyVar()1242*b1cdbd2cSJim Jagielski void ScTable::SetDirtyVar()
1243*b1cdbd2cSJim Jagielski {
1244*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
1245*b1cdbd2cSJim Jagielski 		aCol[i].SetDirtyVar();
1246*b1cdbd2cSJim Jagielski }
1247*b1cdbd2cSJim Jagielski 
1248*b1cdbd2cSJim Jagielski 
SetDirty()1249*b1cdbd2cSJim Jagielski void ScTable::SetDirty()
1250*b1cdbd2cSJim Jagielski {
1251*b1cdbd2cSJim Jagielski 	sal_Bool bOldAutoCalc = pDocument->GetAutoCalc();
1252*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( sal_False );	// Mehrfachberechnungen vermeiden
1253*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
1254*b1cdbd2cSJim Jagielski 		aCol[i].SetDirty();
1255*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( bOldAutoCalc );
1256*b1cdbd2cSJim Jagielski }
1257*b1cdbd2cSJim Jagielski 
1258*b1cdbd2cSJim Jagielski 
SetDirty(const ScRange & rRange)1259*b1cdbd2cSJim Jagielski void ScTable::SetDirty( const ScRange& rRange )
1260*b1cdbd2cSJim Jagielski {
1261*b1cdbd2cSJim Jagielski 	sal_Bool bOldAutoCalc = pDocument->GetAutoCalc();
1262*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( sal_False );	// Mehrfachberechnungen vermeiden
1263*b1cdbd2cSJim Jagielski 	SCCOL nCol2 = rRange.aEnd.Col();
1264*b1cdbd2cSJim Jagielski 	for (SCCOL i=rRange.aStart.Col(); i<=nCol2; i++)
1265*b1cdbd2cSJim Jagielski 		aCol[i].SetDirty( rRange );
1266*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( bOldAutoCalc );
1267*b1cdbd2cSJim Jagielski }
1268*b1cdbd2cSJim Jagielski 
1269*b1cdbd2cSJim Jagielski 
SetTableOpDirty(const ScRange & rRange)1270*b1cdbd2cSJim Jagielski void ScTable::SetTableOpDirty( const ScRange& rRange )
1271*b1cdbd2cSJim Jagielski {
1272*b1cdbd2cSJim Jagielski 	sal_Bool bOldAutoCalc = pDocument->GetAutoCalc();
1273*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( sal_False );	// no multiple recalculation
1274*b1cdbd2cSJim Jagielski 	SCCOL nCol2 = rRange.aEnd.Col();
1275*b1cdbd2cSJim Jagielski 	for (SCCOL i=rRange.aStart.Col(); i<=nCol2; i++)
1276*b1cdbd2cSJim Jagielski 		aCol[i].SetTableOpDirty( rRange );
1277*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( bOldAutoCalc );
1278*b1cdbd2cSJim Jagielski }
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski 
SetDirtyAfterLoad()1281*b1cdbd2cSJim Jagielski void ScTable::SetDirtyAfterLoad()
1282*b1cdbd2cSJim Jagielski {
1283*b1cdbd2cSJim Jagielski 	sal_Bool bOldAutoCalc = pDocument->GetAutoCalc();
1284*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( sal_False );	// Mehrfachberechnungen vermeiden
1285*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
1286*b1cdbd2cSJim Jagielski 		aCol[i].SetDirtyAfterLoad();
1287*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( bOldAutoCalc );
1288*b1cdbd2cSJim Jagielski }
1289*b1cdbd2cSJim Jagielski 
1290*b1cdbd2cSJim Jagielski 
SetRelNameDirty()1291*b1cdbd2cSJim Jagielski void ScTable::SetRelNameDirty()
1292*b1cdbd2cSJim Jagielski {
1293*b1cdbd2cSJim Jagielski 	sal_Bool bOldAutoCalc = pDocument->GetAutoCalc();
1294*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( sal_False );	// Mehrfachberechnungen vermeiden
1295*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
1296*b1cdbd2cSJim Jagielski 		aCol[i].SetRelNameDirty();
1297*b1cdbd2cSJim Jagielski 	pDocument->SetAutoCalc( bOldAutoCalc );
1298*b1cdbd2cSJim Jagielski }
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski 
SetLoadingMedium(bool bLoading)1301*b1cdbd2cSJim Jagielski void ScTable::SetLoadingMedium(bool bLoading)
1302*b1cdbd2cSJim Jagielski {
1303*b1cdbd2cSJim Jagielski     mpRowHeights->enableTreeSearch(!bLoading);
1304*b1cdbd2cSJim Jagielski 
1305*b1cdbd2cSJim Jagielski     // When loading a medium, prefer inserting row heights from the back
1306*b1cdbd2cSJim Jagielski     // position since the row heights are stored and read in ascending order
1307*b1cdbd2cSJim Jagielski     // during import.
1308*b1cdbd2cSJim Jagielski     mpRowHeights->setInsertFromBack(bLoading);
1309*b1cdbd2cSJim Jagielski }
1310*b1cdbd2cSJim Jagielski 
1311*b1cdbd2cSJim Jagielski 
CalcAll()1312*b1cdbd2cSJim Jagielski void ScTable::CalcAll()
1313*b1cdbd2cSJim Jagielski {
1314*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++) aCol[i].CalcAll();
1315*b1cdbd2cSJim Jagielski }
1316*b1cdbd2cSJim Jagielski 
1317*b1cdbd2cSJim Jagielski 
CompileAll()1318*b1cdbd2cSJim Jagielski void ScTable::CompileAll()
1319*b1cdbd2cSJim Jagielski {
1320*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i <= MAXCOL; i++) aCol[i].CompileAll();
1321*b1cdbd2cSJim Jagielski }
1322*b1cdbd2cSJim Jagielski 
1323*b1cdbd2cSJim Jagielski 
CompileXML(ScProgress & rProgress)1324*b1cdbd2cSJim Jagielski void ScTable::CompileXML( ScProgress& rProgress )
1325*b1cdbd2cSJim Jagielski {
1326*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i <= MAXCOL; i++)
1327*b1cdbd2cSJim Jagielski 	{
1328*b1cdbd2cSJim Jagielski 		aCol[i].CompileXML( rProgress );
1329*b1cdbd2cSJim Jagielski 	}
1330*b1cdbd2cSJim Jagielski }
1331*b1cdbd2cSJim Jagielski 
CalcAfterLoad()1332*b1cdbd2cSJim Jagielski void ScTable::CalcAfterLoad()
1333*b1cdbd2cSJim Jagielski {
1334*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i <= MAXCOL; i++) aCol[i].CalcAfterLoad();
1335*b1cdbd2cSJim Jagielski }
1336*b1cdbd2cSJim Jagielski 
1337*b1cdbd2cSJim Jagielski 
ResetChanged(const ScRange & rRange)1338*b1cdbd2cSJim Jagielski void ScTable::ResetChanged( const ScRange& rRange )
1339*b1cdbd2cSJim Jagielski {
1340*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
1341*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
1342*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
1343*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
1344*b1cdbd2cSJim Jagielski 
1345*b1cdbd2cSJim Jagielski 	for (SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++)
1346*b1cdbd2cSJim Jagielski 		aCol[nCol].ResetChanged(nStartRow, nEndRow);
1347*b1cdbd2cSJim Jagielski }
1348*b1cdbd2cSJim Jagielski 
1349*b1cdbd2cSJim Jagielski //	Attribute
1350*b1cdbd2cSJim Jagielski 
GetAttr(SCCOL nCol,SCROW nRow,sal_uInt16 nWhich) const1351*b1cdbd2cSJim Jagielski const SfxPoolItem* ScTable::GetAttr( SCCOL nCol, SCROW nRow, sal_uInt16 nWhich ) const
1352*b1cdbd2cSJim Jagielski {
1353*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1354*b1cdbd2cSJim Jagielski 		return aCol[nCol].GetAttr( nRow, nWhich );
1355*b1cdbd2cSJim Jagielski 	else
1356*b1cdbd2cSJim Jagielski 		return NULL;
1357*b1cdbd2cSJim Jagielski }
1358*b1cdbd2cSJim Jagielski 
1359*b1cdbd2cSJim Jagielski 
GetNumberFormat(SCCOL nCol,SCROW nRow) const1360*b1cdbd2cSJim Jagielski sal_uLong ScTable::GetNumberFormat( SCCOL nCol, SCROW nRow ) const
1361*b1cdbd2cSJim Jagielski {
1362*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1363*b1cdbd2cSJim Jagielski 		return aCol[nCol].GetNumberFormat( nRow );
1364*b1cdbd2cSJim Jagielski 	else
1365*b1cdbd2cSJim Jagielski 		return 0;
1366*b1cdbd2cSJim Jagielski }
1367*b1cdbd2cSJim Jagielski 
1368*b1cdbd2cSJim Jagielski 
GetPattern(SCCOL nCol,SCROW nRow) const1369*b1cdbd2cSJim Jagielski const ScPatternAttr* ScTable::GetPattern( SCCOL nCol, SCROW nRow ) const
1370*b1cdbd2cSJim Jagielski {
1371*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1372*b1cdbd2cSJim Jagielski 		return aCol[nCol].GetPattern( nRow );
1373*b1cdbd2cSJim Jagielski 	else
1374*b1cdbd2cSJim Jagielski     {
1375*b1cdbd2cSJim Jagielski         DBG_ERROR("wrong column or row");
1376*b1cdbd2cSJim Jagielski         return pDocument->GetDefPattern();      // for safety
1377*b1cdbd2cSJim Jagielski     }
1378*b1cdbd2cSJim Jagielski }
1379*b1cdbd2cSJim Jagielski 
1380*b1cdbd2cSJim Jagielski 
GetMostUsedPattern(SCCOL nCol,SCROW nStartRow,SCROW nEndRow) const1381*b1cdbd2cSJim Jagielski const ScPatternAttr* ScTable::GetMostUsedPattern( SCCOL nCol, SCROW nStartRow, SCROW nEndRow ) const
1382*b1cdbd2cSJim Jagielski {
1383*b1cdbd2cSJim Jagielski     if ( ValidColRow( nCol, nStartRow ) && ValidRow( nEndRow ) && (nStartRow <= nEndRow) )
1384*b1cdbd2cSJim Jagielski         return aCol[nCol].GetMostUsedPattern( nStartRow, nEndRow );
1385*b1cdbd2cSJim Jagielski     else
1386*b1cdbd2cSJim Jagielski         return NULL;
1387*b1cdbd2cSJim Jagielski }
1388*b1cdbd2cSJim Jagielski 
1389*b1cdbd2cSJim Jagielski 
HasAttrib(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,sal_uInt16 nMask) const1390*b1cdbd2cSJim Jagielski bool ScTable::HasAttrib( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, sal_uInt16 nMask ) const
1391*b1cdbd2cSJim Jagielski {
1392*b1cdbd2cSJim Jagielski 	bool bFound = false;
1393*b1cdbd2cSJim Jagielski 	for (SCCOL i=nCol1; i<=nCol2 && !bFound; i++)
1394*b1cdbd2cSJim Jagielski 		bFound |= aCol[i].HasAttrib( nRow1, nRow2, nMask );
1395*b1cdbd2cSJim Jagielski 	return bFound;
1396*b1cdbd2cSJim Jagielski }
1397*b1cdbd2cSJim Jagielski 
1398*b1cdbd2cSJim Jagielski 
1399*b1cdbd2cSJim Jagielski //UNUSED2009-05 sal_Bool ScTable::HasLines( const ScRange& rRange, Rectangle& rSizes ) const
1400*b1cdbd2cSJim Jagielski //UNUSED2009-05 {
1401*b1cdbd2cSJim Jagielski //UNUSED2009-05     SCCOL nCol1 = rRange.aStart.Col();
1402*b1cdbd2cSJim Jagielski //UNUSED2009-05     SCROW nRow1 = rRange.aStart.Row();
1403*b1cdbd2cSJim Jagielski //UNUSED2009-05     SCCOL nCol2 = rRange.aEnd.Col();
1404*b1cdbd2cSJim Jagielski //UNUSED2009-05     SCROW nRow2 = rRange.aEnd.Row();
1405*b1cdbd2cSJim Jagielski //UNUSED2009-05     PutInOrder( nCol1, nCol2 );
1406*b1cdbd2cSJim Jagielski //UNUSED2009-05     PutInOrder( nRow1, nRow2 );
1407*b1cdbd2cSJim Jagielski //UNUSED2009-05
1408*b1cdbd2cSJim Jagielski //UNUSED2009-05     sal_Bool bFound = sal_False;
1409*b1cdbd2cSJim Jagielski //UNUSED2009-05     for (SCCOL i=nCol1; i<=nCol2; i++)
1410*b1cdbd2cSJim Jagielski //UNUSED2009-05         if (aCol[i].HasLines( nRow1, nRow2, rSizes, (i==nCol1), (i==nCol2) ))
1411*b1cdbd2cSJim Jagielski //UNUSED2009-05             bFound = sal_True;
1412*b1cdbd2cSJim Jagielski //UNUSED2009-05
1413*b1cdbd2cSJim Jagielski //UNUSED2009-05     return bFound;
1414*b1cdbd2cSJim Jagielski //UNUSED2009-05 }
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski 
HasAttribSelection(const ScMarkData & rMark,sal_uInt16 nMask) const1417*b1cdbd2cSJim Jagielski sal_Bool ScTable::HasAttribSelection( const ScMarkData& rMark, sal_uInt16 nMask ) const
1418*b1cdbd2cSJim Jagielski {
1419*b1cdbd2cSJim Jagielski 	sal_Bool bFound=sal_False;
1420*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL && !bFound; i++)
1421*b1cdbd2cSJim Jagielski 		bFound |= aCol[i].HasAttribSelection( rMark, nMask );
1422*b1cdbd2cSJim Jagielski 	return bFound;
1423*b1cdbd2cSJim Jagielski }
1424*b1cdbd2cSJim Jagielski 
1425*b1cdbd2cSJim Jagielski 
ExtendMerge(SCCOL nStartCol,SCROW nStartRow,SCCOL & rEndCol,SCROW & rEndRow,sal_Bool bRefresh,sal_Bool bAttrs)1426*b1cdbd2cSJim Jagielski sal_Bool ScTable::ExtendMerge( SCCOL nStartCol, SCROW nStartRow,
1427*b1cdbd2cSJim Jagielski 						   SCCOL& rEndCol, SCROW& rEndRow,
1428*b1cdbd2cSJim Jagielski 						   sal_Bool bRefresh, sal_Bool bAttrs )
1429*b1cdbd2cSJim Jagielski {
1430*b1cdbd2cSJim Jagielski     if (!(ValidCol(nStartCol) && ValidCol(rEndCol)))
1431*b1cdbd2cSJim Jagielski     {
1432*b1cdbd2cSJim Jagielski         DBG_ERRORFILE("ScTable::ExtendMerge: invalid column number");
1433*b1cdbd2cSJim Jagielski         return sal_False;
1434*b1cdbd2cSJim Jagielski     }
1435*b1cdbd2cSJim Jagielski 	sal_Bool bFound=sal_False;
1436*b1cdbd2cSJim Jagielski 	SCCOL nOldEndX = rEndCol;
1437*b1cdbd2cSJim Jagielski 	SCROW nOldEndY = rEndRow;
1438*b1cdbd2cSJim Jagielski 	for (SCCOL i=nStartCol; i<=nOldEndX; i++)
1439*b1cdbd2cSJim Jagielski 		bFound |= aCol[i].ExtendMerge( i, nStartRow, nOldEndY, rEndCol, rEndRow, bRefresh, bAttrs );
1440*b1cdbd2cSJim Jagielski 	return bFound;
1441*b1cdbd2cSJim Jagielski }
1442*b1cdbd2cSJim Jagielski 
1443*b1cdbd2cSJim Jagielski 
IsBlockEmpty(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,bool bIgnoreNotes) const1444*b1cdbd2cSJim Jagielski sal_Bool ScTable::IsBlockEmpty( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, bool bIgnoreNotes ) const
1445*b1cdbd2cSJim Jagielski {
1446*b1cdbd2cSJim Jagielski     if (!(ValidCol(nCol1) && ValidCol(nCol2)))
1447*b1cdbd2cSJim Jagielski     {
1448*b1cdbd2cSJim Jagielski         DBG_ERRORFILE("ScTable::IsBlockEmpty: invalid column number");
1449*b1cdbd2cSJim Jagielski         return sal_False;
1450*b1cdbd2cSJim Jagielski     }
1451*b1cdbd2cSJim Jagielski 	sal_Bool bEmpty = sal_True;
1452*b1cdbd2cSJim Jagielski 	for (SCCOL i=nCol1; i<=nCol2 && bEmpty; i++)
1453*b1cdbd2cSJim Jagielski 		bEmpty = aCol[i].IsEmptyBlock( nRow1, nRow2, bIgnoreNotes );
1454*b1cdbd2cSJim Jagielski 	return bEmpty;
1455*b1cdbd2cSJim Jagielski }
1456*b1cdbd2cSJim Jagielski 
FillMaxRot(RowInfo * pRowInfo,SCSIZE nArrCount,SCCOL nX1,SCCOL nX2,SCCOL nCol,SCROW nAttrRow1,SCROW nAttrRow2,SCSIZE nArrY,const ScPatternAttr * pPattern,const SfxItemSet * pCondSet)1457*b1cdbd2cSJim Jagielski SCSIZE ScTable::FillMaxRot( RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nX1, SCCOL nX2,
1458*b1cdbd2cSJim Jagielski 							SCCOL nCol, SCROW nAttrRow1, SCROW nAttrRow2, SCSIZE nArrY,
1459*b1cdbd2cSJim Jagielski 							const ScPatternAttr* pPattern, const SfxItemSet* pCondSet )
1460*b1cdbd2cSJim Jagielski {
1461*b1cdbd2cSJim Jagielski 	//	Rueckgabe = neues nArrY
1462*b1cdbd2cSJim Jagielski 
1463*b1cdbd2cSJim Jagielski 	sal_uInt8 nRotDir = pPattern->GetRotateDir( pCondSet );
1464*b1cdbd2cSJim Jagielski 	if ( nRotDir != SC_ROTDIR_NONE )
1465*b1cdbd2cSJim Jagielski 	{
1466*b1cdbd2cSJim Jagielski 		sal_Bool bHit = sal_True;
1467*b1cdbd2cSJim Jagielski 		if ( nCol+1 < nX1 )								// column to the left
1468*b1cdbd2cSJim Jagielski 			bHit = ( nRotDir != SC_ROTDIR_LEFT );
1469*b1cdbd2cSJim Jagielski 		else if ( nCol > nX2+1 )						// column to the right
1470*b1cdbd2cSJim Jagielski 			bHit = ( nRotDir != SC_ROTDIR_RIGHT );		// SC_ROTDIR_STANDARD may now also be extended to the left
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski 		if ( bHit )
1473*b1cdbd2cSJim Jagielski 		{
1474*b1cdbd2cSJim Jagielski 			double nFactor = 0.0;
1475*b1cdbd2cSJim Jagielski 			if ( nCol > nX2+1 )
1476*b1cdbd2cSJim Jagielski 			{
1477*b1cdbd2cSJim Jagielski 				long nRotVal = ((const SfxInt32Item&) pPattern->
1478*b1cdbd2cSJim Jagielski 						GetItem( ATTR_ROTATE_VALUE, pCondSet )).GetValue();
1479*b1cdbd2cSJim Jagielski 				double nRealOrient = nRotVal * F_PI18000;	// 1/100 Grad
1480*b1cdbd2cSJim Jagielski 				double nCos = cos( nRealOrient );
1481*b1cdbd2cSJim Jagielski 				double nSin = sin( nRealOrient );
1482*b1cdbd2cSJim Jagielski 				//!	begrenzen !!!
1483*b1cdbd2cSJim Jagielski 				//!	zusaetzlich Faktor fuer unterschiedliche PPT X/Y !!!
1484*b1cdbd2cSJim Jagielski 
1485*b1cdbd2cSJim Jagielski 				//	bei SC_ROTDIR_LEFT kommt immer ein negativer Wert heraus,
1486*b1cdbd2cSJim Jagielski 				//	wenn der Modus beruecksichtigt wird
1487*b1cdbd2cSJim Jagielski 				nFactor = -fabs( nCos / nSin );
1488*b1cdbd2cSJim Jagielski 			}
1489*b1cdbd2cSJim Jagielski 
1490*b1cdbd2cSJim Jagielski 			for ( SCROW nRow = nAttrRow1; nRow <= nAttrRow2; nRow++ )
1491*b1cdbd2cSJim Jagielski 			{
1492*b1cdbd2cSJim Jagielski                 if (!RowHidden(nRow))
1493*b1cdbd2cSJim Jagielski 				{
1494*b1cdbd2cSJim Jagielski 					sal_Bool bHitOne = sal_True;
1495*b1cdbd2cSJim Jagielski 					if ( nCol > nX2+1 )
1496*b1cdbd2cSJim Jagielski 					{
1497*b1cdbd2cSJim Jagielski 						// reicht die gedrehte Zelle bis in den sichtbaren Bereich?
1498*b1cdbd2cSJim Jagielski 
1499*b1cdbd2cSJim Jagielski 						SCCOL nTouchedCol = nCol;
1500*b1cdbd2cSJim Jagielski                         long nWidth = static_cast<long>(mpRowHeights->getValue(nRow) * nFactor);
1501*b1cdbd2cSJim Jagielski 						DBG_ASSERT(nWidth <= 0, "Richtung falsch");
1502*b1cdbd2cSJim Jagielski 						while ( nWidth < 0 && nTouchedCol > 0 )
1503*b1cdbd2cSJim Jagielski 						{
1504*b1cdbd2cSJim Jagielski 							--nTouchedCol;
1505*b1cdbd2cSJim Jagielski 							nWidth += GetColWidth( nTouchedCol );
1506*b1cdbd2cSJim Jagielski 						}
1507*b1cdbd2cSJim Jagielski 						if ( nTouchedCol > nX2 )
1508*b1cdbd2cSJim Jagielski 							bHitOne = sal_False;
1509*b1cdbd2cSJim Jagielski 					}
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski 					if (bHitOne)
1512*b1cdbd2cSJim Jagielski 					{
1513*b1cdbd2cSJim Jagielski 						while ( nArrY<nArrCount && pRowInfo[nArrY].nRowNo < nRow )
1514*b1cdbd2cSJim Jagielski 							++nArrY;
1515*b1cdbd2cSJim Jagielski 						if ( nArrY<nArrCount && pRowInfo[nArrY].nRowNo == nRow )
1516*b1cdbd2cSJim Jagielski 							pRowInfo[nArrY].nRotMaxCol = nCol;
1517*b1cdbd2cSJim Jagielski 					}
1518*b1cdbd2cSJim Jagielski 				}
1519*b1cdbd2cSJim Jagielski 			}
1520*b1cdbd2cSJim Jagielski 		}
1521*b1cdbd2cSJim Jagielski 	}
1522*b1cdbd2cSJim Jagielski 
1523*b1cdbd2cSJim Jagielski 	return nArrY;
1524*b1cdbd2cSJim Jagielski }
1525*b1cdbd2cSJim Jagielski 
FindMaxRotCol(RowInfo * pRowInfo,SCSIZE nArrCount,SCCOL nX1,SCCOL nX2)1526*b1cdbd2cSJim Jagielski void ScTable::FindMaxRotCol( RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nX1, SCCOL nX2 )
1527*b1cdbd2cSJim Jagielski {
1528*b1cdbd2cSJim Jagielski     if ( !pColWidth || !mpRowHeights || !pColFlags || !pRowFlags )
1529*b1cdbd2cSJim Jagielski 	{
1530*b1cdbd2cSJim Jagielski 		DBG_ERROR( "Spalten-/Zeileninfo fehlt" );
1531*b1cdbd2cSJim Jagielski 		return;
1532*b1cdbd2cSJim Jagielski 	}
1533*b1cdbd2cSJim Jagielski 
1534*b1cdbd2cSJim Jagielski 	//	nRotMaxCol ist auf SC_ROTMAX_NONE initialisiert, nRowNo ist schon gesetzt
1535*b1cdbd2cSJim Jagielski 
1536*b1cdbd2cSJim Jagielski 	SCROW nY1 = pRowInfo[0].nRowNo;
1537*b1cdbd2cSJim Jagielski 	SCROW nY2 = pRowInfo[nArrCount-1].nRowNo;
1538*b1cdbd2cSJim Jagielski 
1539*b1cdbd2cSJim Jagielski 	for (SCCOL nCol=0; nCol<=MAXCOL; nCol++)
1540*b1cdbd2cSJim Jagielski 	{
1541*b1cdbd2cSJim Jagielski         if (!ColHidden(nCol))
1542*b1cdbd2cSJim Jagielski 		{
1543*b1cdbd2cSJim Jagielski 			SCSIZE nArrY = 0;
1544*b1cdbd2cSJim Jagielski 			ScDocAttrIterator aIter( pDocument, nTab, nCol, nY1, nCol, nY2 );
1545*b1cdbd2cSJim Jagielski 			SCCOL nAttrCol;
1546*b1cdbd2cSJim Jagielski             SCROW nAttrRow1, nAttrRow2;
1547*b1cdbd2cSJim Jagielski 			const ScPatternAttr* pPattern = aIter.GetNext( nAttrCol, nAttrRow1, nAttrRow2 );
1548*b1cdbd2cSJim Jagielski 			while ( pPattern )
1549*b1cdbd2cSJim Jagielski 			{
1550*b1cdbd2cSJim Jagielski 				const SfxPoolItem* pCondItem;
1551*b1cdbd2cSJim Jagielski 				if ( pPattern->GetItemSet().GetItemState( ATTR_CONDITIONAL, sal_True, &pCondItem )
1552*b1cdbd2cSJim Jagielski 						== SFX_ITEM_SET )
1553*b1cdbd2cSJim Jagielski 				{
1554*b1cdbd2cSJim Jagielski 					//	alle Formate durchgehen, damit die Zellen nicht einzeln
1555*b1cdbd2cSJim Jagielski 					//	angeschaut werden muessen
1556*b1cdbd2cSJim Jagielski 
1557*b1cdbd2cSJim Jagielski 					sal_uLong nIndex = ((const SfxUInt32Item*)pCondItem)->GetValue();
1558*b1cdbd2cSJim Jagielski 					ScConditionalFormatList* pList = pDocument->GetCondFormList();
1559*b1cdbd2cSJim Jagielski 					ScStyleSheetPool* pStylePool = pDocument->GetStyleSheetPool();
1560*b1cdbd2cSJim Jagielski 					if (pList && pStylePool && nIndex)
1561*b1cdbd2cSJim Jagielski 					{
1562*b1cdbd2cSJim Jagielski 						const ScConditionalFormat* pFormat = pList->GetFormat(nIndex);
1563*b1cdbd2cSJim Jagielski 						if ( pFormat )
1564*b1cdbd2cSJim Jagielski 						{
1565*b1cdbd2cSJim Jagielski 							sal_uInt16 nEntryCount = pFormat->Count();
1566*b1cdbd2cSJim Jagielski 							for (sal_uInt16 nEntry=0; nEntry<nEntryCount; nEntry++)
1567*b1cdbd2cSJim Jagielski 							{
1568*b1cdbd2cSJim Jagielski                                 String aStyleName = pFormat->GetEntry(nEntry)->GetStyle();
1569*b1cdbd2cSJim Jagielski                                 if (aStyleName.Len())
1570*b1cdbd2cSJim Jagielski 								{
1571*b1cdbd2cSJim Jagielski 									SfxStyleSheetBase* pStyleSheet =
1572*b1cdbd2cSJim Jagielski                                             pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PARA );
1573*b1cdbd2cSJim Jagielski 									if ( pStyleSheet )
1574*b1cdbd2cSJim Jagielski 									{
1575*b1cdbd2cSJim Jagielski 										FillMaxRot( pRowInfo, nArrCount, nX1, nX2,
1576*b1cdbd2cSJim Jagielski 													nCol, nAttrRow1, nAttrRow2,
1577*b1cdbd2cSJim Jagielski 													nArrY, pPattern, &pStyleSheet->GetItemSet() );
1578*b1cdbd2cSJim Jagielski 										//	nArrY nicht veraendern
1579*b1cdbd2cSJim Jagielski 									}
1580*b1cdbd2cSJim Jagielski 								}
1581*b1cdbd2cSJim Jagielski 							}
1582*b1cdbd2cSJim Jagielski 						}
1583*b1cdbd2cSJim Jagielski 					}
1584*b1cdbd2cSJim Jagielski 				}
1585*b1cdbd2cSJim Jagielski 
1586*b1cdbd2cSJim Jagielski 				nArrY = FillMaxRot( pRowInfo, nArrCount, nX1, nX2,
1587*b1cdbd2cSJim Jagielski 									nCol, nAttrRow1, nAttrRow2,
1588*b1cdbd2cSJim Jagielski 									nArrY, pPattern, NULL );
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski 				pPattern = aIter.GetNext( nAttrCol, nAttrRow1, nAttrRow2 );
1591*b1cdbd2cSJim Jagielski 			}
1592*b1cdbd2cSJim Jagielski 		}
1593*b1cdbd2cSJim Jagielski 	}
1594*b1cdbd2cSJim Jagielski }
1595*b1cdbd2cSJim Jagielski 
HasBlockMatrixFragment(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2) const1596*b1cdbd2cSJim Jagielski sal_Bool ScTable::HasBlockMatrixFragment( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const
1597*b1cdbd2cSJim Jagielski {
1598*b1cdbd2cSJim Jagielski 	// nix:0, mitte:1, unten:2, links:4, oben:8, rechts:16, offen:32
1599*b1cdbd2cSJim Jagielski 	sal_uInt16 nEdges;
1600*b1cdbd2cSJim Jagielski 
1601*b1cdbd2cSJim Jagielski 	if ( nCol1 == nCol2 )
1602*b1cdbd2cSJim Jagielski 	{	// linke und rechte Spalte
1603*b1cdbd2cSJim Jagielski 		const sal_uInt16 n = 4 | 16;
1604*b1cdbd2cSJim Jagielski 		nEdges = aCol[nCol1].GetBlockMatrixEdges( nRow1, nRow2, n );
1605*b1cdbd2cSJim Jagielski 		// nicht (4 und 16) oder 1 oder 32
1606*b1cdbd2cSJim Jagielski 		if ( nEdges && (((nEdges & n) != n) || (nEdges & 33)) )
1607*b1cdbd2cSJim Jagielski 			return sal_True;		// linke oder rechte Kante fehlt oder offen
1608*b1cdbd2cSJim Jagielski 	}
1609*b1cdbd2cSJim Jagielski 	else
1610*b1cdbd2cSJim Jagielski 	{	// linke Spalte
1611*b1cdbd2cSJim Jagielski 		nEdges = aCol[nCol1].GetBlockMatrixEdges( nRow1, nRow2, 4 );
1612*b1cdbd2cSJim Jagielski 		// nicht 4 oder 1 oder 32
1613*b1cdbd2cSJim Jagielski 		if ( nEdges && (((nEdges & 4) != 4) || (nEdges & 33)) )
1614*b1cdbd2cSJim Jagielski 			return sal_True;		// linke Kante fehlt oder offen
1615*b1cdbd2cSJim Jagielski 		// rechte Spalte
1616*b1cdbd2cSJim Jagielski 		nEdges = aCol[nCol2].GetBlockMatrixEdges( nRow1, nRow2, 16 );
1617*b1cdbd2cSJim Jagielski 		// nicht 16 oder 1 oder 32
1618*b1cdbd2cSJim Jagielski 		if ( nEdges && (((nEdges & 16) != 16) || (nEdges & 33)) )
1619*b1cdbd2cSJim Jagielski 			return sal_True;		// rechte Kante fehlt oder offen
1620*b1cdbd2cSJim Jagielski 	}
1621*b1cdbd2cSJim Jagielski 
1622*b1cdbd2cSJim Jagielski 	if ( nRow1 == nRow2 )
1623*b1cdbd2cSJim Jagielski 	{	// obere und untere Zeile
1624*b1cdbd2cSJim Jagielski 		sal_Bool bOpen = sal_False;
1625*b1cdbd2cSJim Jagielski 		const sal_uInt16 n = 2 | 8;
1626*b1cdbd2cSJim Jagielski 		for ( SCCOL i=nCol1; i<=nCol2; i++)
1627*b1cdbd2cSJim Jagielski 		{
1628*b1cdbd2cSJim Jagielski 			nEdges = aCol[i].GetBlockMatrixEdges( nRow1, nRow1, n );
1629*b1cdbd2cSJim Jagielski 			if ( nEdges )
1630*b1cdbd2cSJim Jagielski 			{
1631*b1cdbd2cSJim Jagielski 				if ( (nEdges & n) != n )
1632*b1cdbd2cSJim Jagielski 					return sal_True;		// obere oder untere Kante fehlt
1633*b1cdbd2cSJim Jagielski 				if ( nEdges & 4 )
1634*b1cdbd2cSJim Jagielski 					bOpen = sal_True;		// linke Kante oeffnet, weitersehen
1635*b1cdbd2cSJim Jagielski 				else if ( !bOpen )
1636*b1cdbd2cSJim Jagielski 					return sal_True;		// es gibt was, was nicht geoeffnet wurde
1637*b1cdbd2cSJim Jagielski 				if ( nEdges & 16 )
1638*b1cdbd2cSJim Jagielski 					bOpen = sal_False;		// rechte Kante schliesst
1639*b1cdbd2cSJim Jagielski 			}
1640*b1cdbd2cSJim Jagielski 		}
1641*b1cdbd2cSJim Jagielski 		if ( bOpen )
1642*b1cdbd2cSJim Jagielski 			return sal_True;				// es geht noch weiter
1643*b1cdbd2cSJim Jagielski 	}
1644*b1cdbd2cSJim Jagielski 	else
1645*b1cdbd2cSJim Jagielski 	{
1646*b1cdbd2cSJim Jagielski 		sal_uInt16 j, n;
1647*b1cdbd2cSJim Jagielski         SCROW nR;
1648*b1cdbd2cSJim Jagielski 		// erst obere Zeile, dann untere Zeile
1649*b1cdbd2cSJim Jagielski 		for ( j=0, nR=nRow1, n=8; j<2; j++, nR=nRow2, n=2 )
1650*b1cdbd2cSJim Jagielski 		{
1651*b1cdbd2cSJim Jagielski 			sal_Bool bOpen = sal_False;
1652*b1cdbd2cSJim Jagielski 			for ( SCCOL i=nCol1; i<=nCol2; i++)
1653*b1cdbd2cSJim Jagielski 			{
1654*b1cdbd2cSJim Jagielski 				nEdges = aCol[i].GetBlockMatrixEdges( nR, nR, n );
1655*b1cdbd2cSJim Jagielski 				if ( nEdges )
1656*b1cdbd2cSJim Jagielski 				{
1657*b1cdbd2cSJim Jagielski 					// in oberere Zeile keine obere Kante bzw.
1658*b1cdbd2cSJim Jagielski 					// in unterer Zeile keine untere Kante
1659*b1cdbd2cSJim Jagielski 					if ( (nEdges & n) != n )
1660*b1cdbd2cSJim Jagielski 						return sal_True;
1661*b1cdbd2cSJim Jagielski 					if ( nEdges & 4 )
1662*b1cdbd2cSJim Jagielski 						bOpen = sal_True;		// linke Kante oeffnet, weitersehen
1663*b1cdbd2cSJim Jagielski 					else if ( !bOpen )
1664*b1cdbd2cSJim Jagielski 						return sal_True;		// es gibt was, was nicht geoeffnet wurde
1665*b1cdbd2cSJim Jagielski 					if ( nEdges & 16 )
1666*b1cdbd2cSJim Jagielski 						bOpen = sal_False;		// rechte Kante schliesst
1667*b1cdbd2cSJim Jagielski 				}
1668*b1cdbd2cSJim Jagielski 			}
1669*b1cdbd2cSJim Jagielski 			if ( bOpen )
1670*b1cdbd2cSJim Jagielski 				return sal_True;				// es geht noch weiter
1671*b1cdbd2cSJim Jagielski 		}
1672*b1cdbd2cSJim Jagielski 	}
1673*b1cdbd2cSJim Jagielski 	return sal_False;
1674*b1cdbd2cSJim Jagielski }
1675*b1cdbd2cSJim Jagielski 
1676*b1cdbd2cSJim Jagielski 
HasSelectionMatrixFragment(const ScMarkData & rMark) const1677*b1cdbd2cSJim Jagielski sal_Bool ScTable::HasSelectionMatrixFragment( const ScMarkData& rMark ) const
1678*b1cdbd2cSJim Jagielski {
1679*b1cdbd2cSJim Jagielski 	sal_Bool bFound=sal_False;
1680*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL && !bFound; i++)
1681*b1cdbd2cSJim Jagielski 		bFound |= aCol[i].HasSelectionMatrixFragment(rMark);
1682*b1cdbd2cSJim Jagielski 	return bFound;
1683*b1cdbd2cSJim Jagielski }
1684*b1cdbd2cSJim Jagielski 
1685*b1cdbd2cSJim Jagielski 
IsBlockEditable(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,sal_Bool * pOnlyNotBecauseOfMatrix) const1686*b1cdbd2cSJim Jagielski sal_Bool ScTable::IsBlockEditable( SCCOL nCol1, SCROW nRow1, SCCOL nCol2,
1687*b1cdbd2cSJim Jagielski 			SCROW nRow2, sal_Bool* pOnlyNotBecauseOfMatrix /* = NULL */ ) const
1688*b1cdbd2cSJim Jagielski {
1689*b1cdbd2cSJim Jagielski     if ( !ValidColRow( nCol2, nRow2 ) )
1690*b1cdbd2cSJim Jagielski     {
1691*b1cdbd2cSJim Jagielski         DBG_ERRORFILE("IsBlockEditable: invalid column or row");
1692*b1cdbd2cSJim Jagielski         if (pOnlyNotBecauseOfMatrix)
1693*b1cdbd2cSJim Jagielski             *pOnlyNotBecauseOfMatrix = sal_False;
1694*b1cdbd2cSJim Jagielski         return sal_False;
1695*b1cdbd2cSJim Jagielski     }
1696*b1cdbd2cSJim Jagielski 
1697*b1cdbd2cSJim Jagielski 	sal_Bool bIsEditable = sal_True;
1698*b1cdbd2cSJim Jagielski 	if ( nLockCount )
1699*b1cdbd2cSJim Jagielski 		bIsEditable = sal_False;
1700*b1cdbd2cSJim Jagielski     else if ( IsProtected() && !pDocument->IsScenario(nTab) )
1701*b1cdbd2cSJim Jagielski     {
1702*b1cdbd2cSJim Jagielski         if((bIsEditable = !HasAttrib( nCol1, nRow1, nCol2, nRow2, HASATTR_PROTECTED )) != sal_False)
1703*b1cdbd2cSJim Jagielski         {
1704*b1cdbd2cSJim Jagielski             // If Sheet is protected and cells are not protected then
1705*b1cdbd2cSJim Jagielski             // check the active scenario protect flag if this range is
1706*b1cdbd2cSJim Jagielski             // on the active scenario range. Note the 'copy back' must also
1707*b1cdbd2cSJim Jagielski             // be set to apply protection.
1708*b1cdbd2cSJim Jagielski             sal_uInt16 nScenTab = nTab+1;
1709*b1cdbd2cSJim Jagielski             while(pDocument->IsScenario(nScenTab))
1710*b1cdbd2cSJim Jagielski             {
1711*b1cdbd2cSJim Jagielski                 ScRange aEditRange(nCol1, nRow1, nScenTab, nCol2, nRow2, nScenTab);
1712*b1cdbd2cSJim Jagielski                 if(pDocument->IsActiveScenario(nScenTab) && pDocument->HasScenarioRange(nScenTab, aEditRange))
1713*b1cdbd2cSJim Jagielski                 {
1714*b1cdbd2cSJim Jagielski                     sal_uInt16 nFlags;
1715*b1cdbd2cSJim Jagielski                     pDocument->GetScenarioFlags(nScenTab,nFlags);
1716*b1cdbd2cSJim Jagielski                     bIsEditable = !((nFlags & SC_SCENARIO_PROTECT) && (nFlags & SC_SCENARIO_TWOWAY));
1717*b1cdbd2cSJim Jagielski                     break;
1718*b1cdbd2cSJim Jagielski                 }
1719*b1cdbd2cSJim Jagielski                 nScenTab++;
1720*b1cdbd2cSJim Jagielski             }
1721*b1cdbd2cSJim Jagielski         }
1722*b1cdbd2cSJim Jagielski     }
1723*b1cdbd2cSJim Jagielski     else if (pDocument->IsScenario(nTab))
1724*b1cdbd2cSJim Jagielski     {
1725*b1cdbd2cSJim Jagielski         // Determine if the preceding sheet is protected
1726*b1cdbd2cSJim Jagielski         SCTAB nActualTab = nTab;
1727*b1cdbd2cSJim Jagielski         do
1728*b1cdbd2cSJim Jagielski         {
1729*b1cdbd2cSJim Jagielski             nActualTab--;
1730*b1cdbd2cSJim Jagielski         }
1731*b1cdbd2cSJim Jagielski         while(pDocument->IsScenario(nActualTab));
1732*b1cdbd2cSJim Jagielski 
1733*b1cdbd2cSJim Jagielski         if(pDocument->IsTabProtected(nActualTab))
1734*b1cdbd2cSJim Jagielski         {
1735*b1cdbd2cSJim Jagielski             ScRange aEditRange(nCol1, nRow1, nTab, nCol2, nRow2, nTab);
1736*b1cdbd2cSJim Jagielski             if(pDocument->HasScenarioRange(nTab, aEditRange))
1737*b1cdbd2cSJim Jagielski             {
1738*b1cdbd2cSJim Jagielski                 sal_uInt16 nFlags;
1739*b1cdbd2cSJim Jagielski                 pDocument->GetScenarioFlags(nTab,nFlags);
1740*b1cdbd2cSJim Jagielski                 bIsEditable = !(nFlags & SC_SCENARIO_PROTECT);
1741*b1cdbd2cSJim Jagielski             }
1742*b1cdbd2cSJim Jagielski         }
1743*b1cdbd2cSJim Jagielski     }
1744*b1cdbd2cSJim Jagielski 	if ( bIsEditable )
1745*b1cdbd2cSJim Jagielski 	{
1746*b1cdbd2cSJim Jagielski 		if ( HasBlockMatrixFragment( nCol1, nRow1, nCol2, nRow2 ) )
1747*b1cdbd2cSJim Jagielski 		{
1748*b1cdbd2cSJim Jagielski 			bIsEditable = sal_False;
1749*b1cdbd2cSJim Jagielski 			if ( pOnlyNotBecauseOfMatrix )
1750*b1cdbd2cSJim Jagielski 				*pOnlyNotBecauseOfMatrix = sal_True;
1751*b1cdbd2cSJim Jagielski 		}
1752*b1cdbd2cSJim Jagielski 		else if ( pOnlyNotBecauseOfMatrix )
1753*b1cdbd2cSJim Jagielski 			*pOnlyNotBecauseOfMatrix = sal_False;
1754*b1cdbd2cSJim Jagielski 	}
1755*b1cdbd2cSJim Jagielski 	else if ( pOnlyNotBecauseOfMatrix )
1756*b1cdbd2cSJim Jagielski 		*pOnlyNotBecauseOfMatrix = sal_False;
1757*b1cdbd2cSJim Jagielski 	return bIsEditable;
1758*b1cdbd2cSJim Jagielski }
1759*b1cdbd2cSJim Jagielski 
1760*b1cdbd2cSJim Jagielski 
IsSelectionEditable(const ScMarkData & rMark,sal_Bool * pOnlyNotBecauseOfMatrix) const1761*b1cdbd2cSJim Jagielski sal_Bool ScTable::IsSelectionEditable( const ScMarkData& rMark,
1762*b1cdbd2cSJim Jagielski 			sal_Bool* pOnlyNotBecauseOfMatrix /* = NULL */ ) const
1763*b1cdbd2cSJim Jagielski {
1764*b1cdbd2cSJim Jagielski 	sal_Bool bIsEditable = sal_True;
1765*b1cdbd2cSJim Jagielski 	if ( nLockCount )
1766*b1cdbd2cSJim Jagielski 		bIsEditable = sal_False;
1767*b1cdbd2cSJim Jagielski     else if ( IsProtected() && !pDocument->IsScenario(nTab) )
1768*b1cdbd2cSJim Jagielski     {
1769*b1cdbd2cSJim Jagielski         if((bIsEditable = !HasAttribSelection( rMark, HASATTR_PROTECTED )) != sal_False)
1770*b1cdbd2cSJim Jagielski         {
1771*b1cdbd2cSJim Jagielski             // If Sheet is protected and cells are not protected then
1772*b1cdbd2cSJim Jagielski             // check the active scenario protect flag if this area is
1773*b1cdbd2cSJim Jagielski             // in the active scenario range.
1774*b1cdbd2cSJim Jagielski             ScRangeList aRanges;
1775*b1cdbd2cSJim Jagielski             rMark.FillRangeListWithMarks( &aRanges, sal_False );
1776*b1cdbd2cSJim Jagielski             sal_uLong nRangeCount = aRanges.Count();
1777*b1cdbd2cSJim Jagielski             SCTAB nScenTab = nTab+1;
1778*b1cdbd2cSJim Jagielski             while(pDocument->IsScenario(nScenTab) && bIsEditable)
1779*b1cdbd2cSJim Jagielski             {
1780*b1cdbd2cSJim Jagielski                 if(pDocument->IsActiveScenario(nScenTab))
1781*b1cdbd2cSJim Jagielski                 {
1782*b1cdbd2cSJim Jagielski                     for (sal_uLong i=0; i<nRangeCount && bIsEditable; i++)
1783*b1cdbd2cSJim Jagielski                     {
1784*b1cdbd2cSJim Jagielski                         ScRange aRange = *aRanges.GetObject(i);
1785*b1cdbd2cSJim Jagielski                         if(pDocument->HasScenarioRange(nScenTab, aRange))
1786*b1cdbd2cSJim Jagielski                         {
1787*b1cdbd2cSJim Jagielski                             sal_uInt16 nFlags;
1788*b1cdbd2cSJim Jagielski                             pDocument->GetScenarioFlags(nScenTab,nFlags);
1789*b1cdbd2cSJim Jagielski                             bIsEditable = !((nFlags & SC_SCENARIO_PROTECT) && (nFlags & SC_SCENARIO_TWOWAY));
1790*b1cdbd2cSJim Jagielski                         }
1791*b1cdbd2cSJim Jagielski                     }
1792*b1cdbd2cSJim Jagielski                 }
1793*b1cdbd2cSJim Jagielski                 nScenTab++;
1794*b1cdbd2cSJim Jagielski             }
1795*b1cdbd2cSJim Jagielski         }
1796*b1cdbd2cSJim Jagielski     }
1797*b1cdbd2cSJim Jagielski     else if (pDocument->IsScenario(nTab))
1798*b1cdbd2cSJim Jagielski     {
1799*b1cdbd2cSJim Jagielski         // Determine if the preceding sheet is protected
1800*b1cdbd2cSJim Jagielski         SCTAB nActualTab = nTab;
1801*b1cdbd2cSJim Jagielski         do
1802*b1cdbd2cSJim Jagielski         {
1803*b1cdbd2cSJim Jagielski             nActualTab--;
1804*b1cdbd2cSJim Jagielski         }
1805*b1cdbd2cSJim Jagielski         while(pDocument->IsScenario(nActualTab));
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski         if(pDocument->IsTabProtected(nActualTab))
1808*b1cdbd2cSJim Jagielski         {
1809*b1cdbd2cSJim Jagielski             ScRangeList aRanges;
1810*b1cdbd2cSJim Jagielski             rMark.FillRangeListWithMarks( &aRanges, sal_False );
1811*b1cdbd2cSJim Jagielski             sal_uLong nRangeCount = aRanges.Count();
1812*b1cdbd2cSJim Jagielski             for (sal_uLong i=0; i<nRangeCount && bIsEditable; i++)
1813*b1cdbd2cSJim Jagielski             {
1814*b1cdbd2cSJim Jagielski                 ScRange aRange = *aRanges.GetObject(i);
1815*b1cdbd2cSJim Jagielski                 if(pDocument->HasScenarioRange(nTab, aRange))
1816*b1cdbd2cSJim Jagielski                 {
1817*b1cdbd2cSJim Jagielski                     sal_uInt16 nFlags;
1818*b1cdbd2cSJim Jagielski                     pDocument->GetScenarioFlags(nTab,nFlags);
1819*b1cdbd2cSJim Jagielski                     bIsEditable = !(nFlags & SC_SCENARIO_PROTECT);
1820*b1cdbd2cSJim Jagielski                 }
1821*b1cdbd2cSJim Jagielski             }
1822*b1cdbd2cSJim Jagielski         }
1823*b1cdbd2cSJim Jagielski     }
1824*b1cdbd2cSJim Jagielski 	if ( bIsEditable )
1825*b1cdbd2cSJim Jagielski 	{
1826*b1cdbd2cSJim Jagielski 		if ( HasSelectionMatrixFragment( rMark ) )
1827*b1cdbd2cSJim Jagielski 		{
1828*b1cdbd2cSJim Jagielski 			bIsEditable = sal_False;
1829*b1cdbd2cSJim Jagielski 			if ( pOnlyNotBecauseOfMatrix )
1830*b1cdbd2cSJim Jagielski 				*pOnlyNotBecauseOfMatrix = sal_True;
1831*b1cdbd2cSJim Jagielski 		}
1832*b1cdbd2cSJim Jagielski 		else if ( pOnlyNotBecauseOfMatrix )
1833*b1cdbd2cSJim Jagielski 			*pOnlyNotBecauseOfMatrix = sal_False;
1834*b1cdbd2cSJim Jagielski 	}
1835*b1cdbd2cSJim Jagielski 	else if ( pOnlyNotBecauseOfMatrix )
1836*b1cdbd2cSJim Jagielski 		*pOnlyNotBecauseOfMatrix = sal_False;
1837*b1cdbd2cSJim Jagielski 	return bIsEditable;
1838*b1cdbd2cSJim Jagielski }
1839*b1cdbd2cSJim Jagielski 
1840*b1cdbd2cSJim Jagielski 
1841*b1cdbd2cSJim Jagielski 
LockTable()1842*b1cdbd2cSJim Jagielski void ScTable::LockTable()
1843*b1cdbd2cSJim Jagielski {
1844*b1cdbd2cSJim Jagielski 	++nLockCount;
1845*b1cdbd2cSJim Jagielski }
1846*b1cdbd2cSJim Jagielski 
1847*b1cdbd2cSJim Jagielski 
UnlockTable()1848*b1cdbd2cSJim Jagielski void ScTable::UnlockTable()
1849*b1cdbd2cSJim Jagielski {
1850*b1cdbd2cSJim Jagielski 	if (nLockCount)
1851*b1cdbd2cSJim Jagielski 		--nLockCount;
1852*b1cdbd2cSJim Jagielski 	else
1853*b1cdbd2cSJim Jagielski 	{
1854*b1cdbd2cSJim Jagielski 		DBG_ERROR("UnlockTable ohne LockTable");
1855*b1cdbd2cSJim Jagielski 	}
1856*b1cdbd2cSJim Jagielski }
1857*b1cdbd2cSJim Jagielski 
1858*b1cdbd2cSJim Jagielski 
MergeSelectionPattern(ScMergePatternState & rState,const ScMarkData & rMark,sal_Bool bDeep) const1859*b1cdbd2cSJim Jagielski void ScTable::MergeSelectionPattern( ScMergePatternState& rState, const ScMarkData& rMark, sal_Bool bDeep ) const
1860*b1cdbd2cSJim Jagielski {
1861*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
1862*b1cdbd2cSJim Jagielski 		aCol[i].MergeSelectionPattern( rState, rMark, bDeep );
1863*b1cdbd2cSJim Jagielski }
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski 
MergePatternArea(ScMergePatternState & rState,SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,sal_Bool bDeep) const1866*b1cdbd2cSJim Jagielski void ScTable::MergePatternArea( ScMergePatternState& rState, SCCOL nCol1, SCROW nRow1,
1867*b1cdbd2cSJim Jagielski 													SCCOL nCol2, SCROW nRow2, sal_Bool bDeep ) const
1868*b1cdbd2cSJim Jagielski {
1869*b1cdbd2cSJim Jagielski 	for (SCCOL i=nCol1; i<=nCol2; i++)
1870*b1cdbd2cSJim Jagielski 		aCol[i].MergePatternArea( rState, nRow1, nRow2, bDeep );
1871*b1cdbd2cSJim Jagielski }
1872*b1cdbd2cSJim Jagielski 
1873*b1cdbd2cSJim Jagielski 
MergeBlockFrame(SvxBoxItem * pLineOuter,SvxBoxInfoItem * pLineInner,ScLineFlags & rFlags,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow) const1874*b1cdbd2cSJim Jagielski void ScTable::MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLineInner, ScLineFlags& rFlags,
1875*b1cdbd2cSJim Jagielski 					SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow ) const
1876*b1cdbd2cSJim Jagielski {
1877*b1cdbd2cSJim Jagielski 	if (ValidColRow(nStartCol, nStartRow) && ValidColRow(nEndCol, nEndRow))
1878*b1cdbd2cSJim Jagielski 	{
1879*b1cdbd2cSJim Jagielski 		PutInOrder(nStartCol, nEndCol);
1880*b1cdbd2cSJim Jagielski 		PutInOrder(nStartRow, nEndRow);
1881*b1cdbd2cSJim Jagielski 		for (SCCOL i=nStartCol; i<=nEndCol; i++)
1882*b1cdbd2cSJim Jagielski 			aCol[i].MergeBlockFrame( pLineOuter, pLineInner, rFlags,
1883*b1cdbd2cSJim Jagielski 									nStartRow, nEndRow, (i==nStartCol), nEndCol-i );
1884*b1cdbd2cSJim Jagielski 	}
1885*b1cdbd2cSJim Jagielski }
1886*b1cdbd2cSJim Jagielski 
1887*b1cdbd2cSJim Jagielski 
ApplyBlockFrame(const SvxBoxItem * pLineOuter,const SvxBoxInfoItem * pLineInner,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow)1888*b1cdbd2cSJim Jagielski void ScTable::ApplyBlockFrame( const SvxBoxItem* pLineOuter, const SvxBoxInfoItem* pLineInner,
1889*b1cdbd2cSJim Jagielski 					SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow )
1890*b1cdbd2cSJim Jagielski {
1891*b1cdbd2cSJim Jagielski 	if (ValidColRow(nStartCol, nStartRow) && ValidColRow(nEndCol, nEndRow))
1892*b1cdbd2cSJim Jagielski 	{
1893*b1cdbd2cSJim Jagielski 		PutInOrder(nStartCol, nEndCol);
1894*b1cdbd2cSJim Jagielski 		PutInOrder(nStartRow, nEndRow);
1895*b1cdbd2cSJim Jagielski 		for (SCCOL i=nStartCol; i<=nEndCol; i++)
1896*b1cdbd2cSJim Jagielski 			aCol[i].ApplyBlockFrame( pLineOuter, pLineInner,
1897*b1cdbd2cSJim Jagielski 									nStartRow, nEndRow, (i==nStartCol), nEndCol-i );
1898*b1cdbd2cSJim Jagielski 	}
1899*b1cdbd2cSJim Jagielski }
1900*b1cdbd2cSJim Jagielski 
1901*b1cdbd2cSJim Jagielski 
ApplyPattern(SCCOL nCol,SCROW nRow,const ScPatternAttr & rAttr)1902*b1cdbd2cSJim Jagielski void ScTable::ApplyPattern( SCCOL nCol, SCROW nRow, const ScPatternAttr& rAttr )
1903*b1cdbd2cSJim Jagielski {
1904*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1905*b1cdbd2cSJim Jagielski 		aCol[nCol].ApplyPattern( nRow, rAttr );
1906*b1cdbd2cSJim Jagielski }
1907*b1cdbd2cSJim Jagielski 
1908*b1cdbd2cSJim Jagielski 
ApplyPatternArea(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,const ScPatternAttr & rAttr)1909*b1cdbd2cSJim Jagielski void ScTable::ApplyPatternArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
1910*b1cdbd2cSJim Jagielski 									 const ScPatternAttr& rAttr )
1911*b1cdbd2cSJim Jagielski {
1912*b1cdbd2cSJim Jagielski 	if (ValidColRow(nStartCol, nStartRow) && ValidColRow(nEndCol, nEndRow))
1913*b1cdbd2cSJim Jagielski 	{
1914*b1cdbd2cSJim Jagielski 		PutInOrder(nStartCol, nEndCol);
1915*b1cdbd2cSJim Jagielski 		PutInOrder(nStartRow, nEndRow);
1916*b1cdbd2cSJim Jagielski 		for (SCCOL i = nStartCol; i <= nEndCol; i++)
1917*b1cdbd2cSJim Jagielski 			aCol[i].ApplyPatternArea(nStartRow, nEndRow, rAttr);
1918*b1cdbd2cSJim Jagielski 	}
1919*b1cdbd2cSJim Jagielski }
1920*b1cdbd2cSJim Jagielski 
ApplyPooledPatternArea(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,const ScPatternAttr & rPooledAttr,const ScPatternAttr & rAttr)1921*b1cdbd2cSJim Jagielski void ScTable::ApplyPooledPatternArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
1922*b1cdbd2cSJim Jagielski 									 const ScPatternAttr& rPooledAttr, const ScPatternAttr& rAttr )
1923*b1cdbd2cSJim Jagielski {
1924*b1cdbd2cSJim Jagielski 	if (ValidColRow(nStartCol, nStartRow) && ValidColRow(nEndCol, nEndRow))
1925*b1cdbd2cSJim Jagielski 	{
1926*b1cdbd2cSJim Jagielski 		PutInOrder(nStartCol, nEndCol);
1927*b1cdbd2cSJim Jagielski 		PutInOrder(nStartRow, nEndRow);
1928*b1cdbd2cSJim Jagielski 		for (SCCOL i = nStartCol; i <= nEndCol; i++)
1929*b1cdbd2cSJim Jagielski 		{
1930*b1cdbd2cSJim Jagielski 			sal_Bool bSet = sal_True;
1931*b1cdbd2cSJim Jagielski 			SCROW nStar, nEnd;
1932*b1cdbd2cSJim Jagielski 			const ScPatternAttr* pAttr = aCol[i].GetPatternRange(nStar, nEnd, nStartRow);
1933*b1cdbd2cSJim Jagielski 			if (nStar >nStartRow || nEnd < nEndRow || pAttr!=pDocument->GetDefPattern())
1934*b1cdbd2cSJim Jagielski 				bSet = sal_False;
1935*b1cdbd2cSJim Jagielski 
1936*b1cdbd2cSJim Jagielski 			if (bSet)
1937*b1cdbd2cSJim Jagielski 				aCol[i].SetPatternArea(nStartRow, nEndRow, rPooledAttr);
1938*b1cdbd2cSJim Jagielski 			else
1939*b1cdbd2cSJim Jagielski 				aCol[i].ApplyPatternArea(nStartRow, nEndRow, rAttr);
1940*b1cdbd2cSJim Jagielski 		}
1941*b1cdbd2cSJim Jagielski 	}
1942*b1cdbd2cSJim Jagielski }
1943*b1cdbd2cSJim Jagielski 
ApplyPatternIfNumberformatIncompatible(const ScRange & rRange,const ScPatternAttr & rPattern,short nNewType)1944*b1cdbd2cSJim Jagielski void ScTable::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
1945*b1cdbd2cSJim Jagielski 		const ScPatternAttr& rPattern, short nNewType )
1946*b1cdbd2cSJim Jagielski {
1947*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
1948*b1cdbd2cSJim Jagielski 	for ( SCCOL nCol = rRange.aStart.Col(); nCol <= nEndCol; nCol++ )
1949*b1cdbd2cSJim Jagielski 	{
1950*b1cdbd2cSJim Jagielski 		aCol[nCol].ApplyPatternIfNumberformatIncompatible( rRange, rPattern, nNewType );
1951*b1cdbd2cSJim Jagielski 	}
1952*b1cdbd2cSJim Jagielski }
1953*b1cdbd2cSJim Jagielski 
1954*b1cdbd2cSJim Jagielski 
1955*b1cdbd2cSJim Jagielski 
ApplyStyle(SCCOL nCol,SCROW nRow,const ScStyleSheet & rStyle)1956*b1cdbd2cSJim Jagielski void ScTable::ApplyStyle( SCCOL nCol, SCROW nRow, const ScStyleSheet& rStyle )
1957*b1cdbd2cSJim Jagielski {
1958*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
1959*b1cdbd2cSJim Jagielski 		aCol[nCol].ApplyStyle( nRow, rStyle );
1960*b1cdbd2cSJim Jagielski }
1961*b1cdbd2cSJim Jagielski 
1962*b1cdbd2cSJim Jagielski 
ApplyStyleArea(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,const ScStyleSheet & rStyle)1963*b1cdbd2cSJim Jagielski void ScTable::ApplyStyleArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const ScStyleSheet& rStyle )
1964*b1cdbd2cSJim Jagielski {
1965*b1cdbd2cSJim Jagielski 	if (ValidColRow(nStartCol, nStartRow) && ValidColRow(nEndCol, nEndRow))
1966*b1cdbd2cSJim Jagielski 	{
1967*b1cdbd2cSJim Jagielski 		PutInOrder(nStartCol, nEndCol);
1968*b1cdbd2cSJim Jagielski 		PutInOrder(nStartRow, nEndRow);
1969*b1cdbd2cSJim Jagielski 		for (SCCOL i = nStartCol; i <= nEndCol; i++)
1970*b1cdbd2cSJim Jagielski 			aCol[i].ApplyStyleArea(nStartRow, nEndRow, rStyle);
1971*b1cdbd2cSJim Jagielski 	}
1972*b1cdbd2cSJim Jagielski }
1973*b1cdbd2cSJim Jagielski 
1974*b1cdbd2cSJim Jagielski 
ApplySelectionStyle(const ScStyleSheet & rStyle,const ScMarkData & rMark)1975*b1cdbd2cSJim Jagielski void ScTable::ApplySelectionStyle(const ScStyleSheet& rStyle, const ScMarkData& rMark)
1976*b1cdbd2cSJim Jagielski {
1977*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
1978*b1cdbd2cSJim Jagielski 		aCol[i].ApplySelectionStyle( rStyle, rMark );
1979*b1cdbd2cSJim Jagielski }
1980*b1cdbd2cSJim Jagielski 
1981*b1cdbd2cSJim Jagielski 
ApplySelectionLineStyle(const ScMarkData & rMark,const SvxBorderLine * pLine,sal_Bool bColorOnly)1982*b1cdbd2cSJim Jagielski void ScTable::ApplySelectionLineStyle( const ScMarkData& rMark,
1983*b1cdbd2cSJim Jagielski 							const SvxBorderLine* pLine, sal_Bool bColorOnly )
1984*b1cdbd2cSJim Jagielski {
1985*b1cdbd2cSJim Jagielski 	if ( bColorOnly && !pLine )
1986*b1cdbd2cSJim Jagielski 		return;
1987*b1cdbd2cSJim Jagielski 
1988*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
1989*b1cdbd2cSJim Jagielski 		aCol[i].ApplySelectionLineStyle( rMark, pLine, bColorOnly );
1990*b1cdbd2cSJim Jagielski }
1991*b1cdbd2cSJim Jagielski 
1992*b1cdbd2cSJim Jagielski 
GetStyle(SCCOL nCol,SCROW nRow) const1993*b1cdbd2cSJim Jagielski const ScStyleSheet* ScTable::GetStyle( SCCOL nCol, SCROW nRow ) const
1994*b1cdbd2cSJim Jagielski {
1995*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol, nRow))
1996*b1cdbd2cSJim Jagielski 		return aCol[nCol].GetStyle(nRow);
1997*b1cdbd2cSJim Jagielski 	else
1998*b1cdbd2cSJim Jagielski 		return NULL;
1999*b1cdbd2cSJim Jagielski }
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski 
GetSelectionStyle(const ScMarkData & rMark,sal_Bool & rFound) const2002*b1cdbd2cSJim Jagielski const ScStyleSheet* ScTable::GetSelectionStyle( const ScMarkData& rMark, sal_Bool& rFound ) const
2003*b1cdbd2cSJim Jagielski {
2004*b1cdbd2cSJim Jagielski 	rFound = sal_False;
2005*b1cdbd2cSJim Jagielski 
2006*b1cdbd2cSJim Jagielski 	sal_Bool	bEqual = sal_True;
2007*b1cdbd2cSJim Jagielski 	sal_Bool	bColFound;
2008*b1cdbd2cSJim Jagielski 
2009*b1cdbd2cSJim Jagielski 	const ScStyleSheet* pStyle = NULL;
2010*b1cdbd2cSJim Jagielski 	const ScStyleSheet* pNewStyle;
2011*b1cdbd2cSJim Jagielski 
2012*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL && bEqual; i++)
2013*b1cdbd2cSJim Jagielski 		if (rMark.HasMultiMarks(i))
2014*b1cdbd2cSJim Jagielski 		{
2015*b1cdbd2cSJim Jagielski 			pNewStyle = aCol[i].GetSelectionStyle( rMark, bColFound );
2016*b1cdbd2cSJim Jagielski 			if (bColFound)
2017*b1cdbd2cSJim Jagielski 			{
2018*b1cdbd2cSJim Jagielski 				rFound = sal_True;
2019*b1cdbd2cSJim Jagielski 				if ( !pNewStyle || ( pStyle && pNewStyle != pStyle ) )
2020*b1cdbd2cSJim Jagielski 					bEqual = sal_False;												// unterschiedliche
2021*b1cdbd2cSJim Jagielski 				pStyle = pNewStyle;
2022*b1cdbd2cSJim Jagielski 			}
2023*b1cdbd2cSJim Jagielski 		}
2024*b1cdbd2cSJim Jagielski 
2025*b1cdbd2cSJim Jagielski 	return bEqual ? pStyle : NULL;
2026*b1cdbd2cSJim Jagielski }
2027*b1cdbd2cSJim Jagielski 
2028*b1cdbd2cSJim Jagielski 
GetAreaStyle(sal_Bool & rFound,SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2) const2029*b1cdbd2cSJim Jagielski const ScStyleSheet*	ScTable::GetAreaStyle( sal_Bool& rFound, SCCOL nCol1, SCROW nRow1,
2030*b1cdbd2cSJim Jagielski 													SCCOL nCol2, SCROW nRow2 ) const
2031*b1cdbd2cSJim Jagielski {
2032*b1cdbd2cSJim Jagielski 	rFound = sal_False;
2033*b1cdbd2cSJim Jagielski 
2034*b1cdbd2cSJim Jagielski 	sal_Bool	bEqual = sal_True;
2035*b1cdbd2cSJim Jagielski 	sal_Bool	bColFound;
2036*b1cdbd2cSJim Jagielski 
2037*b1cdbd2cSJim Jagielski 	const ScStyleSheet* pStyle = NULL;
2038*b1cdbd2cSJim Jagielski 	const ScStyleSheet* pNewStyle;
2039*b1cdbd2cSJim Jagielski 
2040*b1cdbd2cSJim Jagielski 	for (SCCOL i=nCol1; i<=nCol2 && bEqual; i++)
2041*b1cdbd2cSJim Jagielski 	{
2042*b1cdbd2cSJim Jagielski 		pNewStyle = aCol[i].GetAreaStyle(bColFound, nRow1, nRow2);
2043*b1cdbd2cSJim Jagielski 		if (bColFound)
2044*b1cdbd2cSJim Jagielski 		{
2045*b1cdbd2cSJim Jagielski 			rFound = sal_True;
2046*b1cdbd2cSJim Jagielski 			if ( !pNewStyle || ( pStyle && pNewStyle != pStyle ) )
2047*b1cdbd2cSJim Jagielski 				bEqual = sal_False;												// unterschiedliche
2048*b1cdbd2cSJim Jagielski 			pStyle = pNewStyle;
2049*b1cdbd2cSJim Jagielski 		}
2050*b1cdbd2cSJim Jagielski 	}
2051*b1cdbd2cSJim Jagielski 
2052*b1cdbd2cSJim Jagielski 	return bEqual ? pStyle : NULL;
2053*b1cdbd2cSJim Jagielski }
2054*b1cdbd2cSJim Jagielski 
2055*b1cdbd2cSJim Jagielski 
IsStyleSheetUsed(const ScStyleSheet & rStyle,sal_Bool bGatherAllStyles) const2056*b1cdbd2cSJim Jagielski sal_Bool ScTable::IsStyleSheetUsed( const ScStyleSheet& rStyle, sal_Bool bGatherAllStyles ) const
2057*b1cdbd2cSJim Jagielski {
2058*b1cdbd2cSJim Jagielski 	sal_Bool bIsUsed = sal_False;
2059*b1cdbd2cSJim Jagielski 
2060*b1cdbd2cSJim Jagielski 	for ( SCCOL i=0; i<=MAXCOL; i++ )
2061*b1cdbd2cSJim Jagielski     {
2062*b1cdbd2cSJim Jagielski 		if ( aCol[i].IsStyleSheetUsed( rStyle, bGatherAllStyles ) )
2063*b1cdbd2cSJim Jagielski         {
2064*b1cdbd2cSJim Jagielski             if ( !bGatherAllStyles )
2065*b1cdbd2cSJim Jagielski                 return sal_True;
2066*b1cdbd2cSJim Jagielski             bIsUsed = sal_True;
2067*b1cdbd2cSJim Jagielski         }
2068*b1cdbd2cSJim Jagielski     }
2069*b1cdbd2cSJim Jagielski 
2070*b1cdbd2cSJim Jagielski 	return bIsUsed;
2071*b1cdbd2cSJim Jagielski }
2072*b1cdbd2cSJim Jagielski 
2073*b1cdbd2cSJim Jagielski 
StyleSheetChanged(const SfxStyleSheetBase * pStyleSheet,sal_Bool bRemoved,OutputDevice * pDev,double nPPTX,double nPPTY,const Fraction & rZoomX,const Fraction & rZoomY)2074*b1cdbd2cSJim Jagielski void ScTable::StyleSheetChanged( const SfxStyleSheetBase* pStyleSheet, sal_Bool bRemoved,
2075*b1cdbd2cSJim Jagielski 								OutputDevice* pDev,
2076*b1cdbd2cSJim Jagielski 								double nPPTX, double nPPTY,
2077*b1cdbd2cSJim Jagielski 								const Fraction& rZoomX, const Fraction& rZoomY )
2078*b1cdbd2cSJim Jagielski {
2079*b1cdbd2cSJim Jagielski     ScFlatBoolRowSegments aUsedRows;
2080*b1cdbd2cSJim Jagielski     for (SCCOL i = 0; i <= MAXCOL; ++i)
2081*b1cdbd2cSJim Jagielski         aCol[i].FindStyleSheet(pStyleSheet, aUsedRows, bRemoved);
2082*b1cdbd2cSJim Jagielski 
2083*b1cdbd2cSJim Jagielski     SCROW nRow = 0;
2084*b1cdbd2cSJim Jagielski     while (nRow <= MAXROW)
2085*b1cdbd2cSJim Jagielski     {
2086*b1cdbd2cSJim Jagielski         ScFlatBoolRowSegments::RangeData aData;
2087*b1cdbd2cSJim Jagielski         if (!aUsedRows.getRangeData(nRow, aData))
2088*b1cdbd2cSJim Jagielski             // search failed!
2089*b1cdbd2cSJim Jagielski             return;
2090*b1cdbd2cSJim Jagielski 
2091*b1cdbd2cSJim Jagielski         SCROW nEndRow = aData.mnRow2;
2092*b1cdbd2cSJim Jagielski         if (aData.mbValue)
2093*b1cdbd2cSJim Jagielski             SetOptimalHeight(nRow, nEndRow, 0, pDev, nPPTX, nPPTY, rZoomX, rZoomY, sal_False);
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski         nRow = nEndRow + 1;
2096*b1cdbd2cSJim Jagielski     }
2097*b1cdbd2cSJim Jagielski }
2098*b1cdbd2cSJim Jagielski 
2099*b1cdbd2cSJim Jagielski 
ApplyFlags(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,sal_Int16 nFlags)2100*b1cdbd2cSJim Jagielski sal_Bool ScTable::ApplyFlags( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
2101*b1cdbd2cSJim Jagielski 									sal_Int16 nFlags )
2102*b1cdbd2cSJim Jagielski {
2103*b1cdbd2cSJim Jagielski 	sal_Bool bChanged = sal_False;
2104*b1cdbd2cSJim Jagielski 	if (ValidColRow(nStartCol, nStartRow) && ValidColRow(nEndCol, nEndRow))
2105*b1cdbd2cSJim Jagielski 		for (SCCOL i = nStartCol; i <= nEndCol; i++)
2106*b1cdbd2cSJim Jagielski 			bChanged |= aCol[i].ApplyFlags(nStartRow, nEndRow, nFlags);
2107*b1cdbd2cSJim Jagielski 	return bChanged;
2108*b1cdbd2cSJim Jagielski }
2109*b1cdbd2cSJim Jagielski 
2110*b1cdbd2cSJim Jagielski 
RemoveFlags(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,sal_Int16 nFlags)2111*b1cdbd2cSJim Jagielski sal_Bool ScTable::RemoveFlags( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
2112*b1cdbd2cSJim Jagielski 									sal_Int16 nFlags )
2113*b1cdbd2cSJim Jagielski {
2114*b1cdbd2cSJim Jagielski 	sal_Bool bChanged = sal_False;
2115*b1cdbd2cSJim Jagielski 	if (ValidColRow(nStartCol, nStartRow) && ValidColRow(nEndCol, nEndRow))
2116*b1cdbd2cSJim Jagielski 		for (SCCOL i = nStartCol; i <= nEndCol; i++)
2117*b1cdbd2cSJim Jagielski 			bChanged |= aCol[i].RemoveFlags(nStartRow, nEndRow, nFlags);
2118*b1cdbd2cSJim Jagielski 	return bChanged;
2119*b1cdbd2cSJim Jagielski }
2120*b1cdbd2cSJim Jagielski 
2121*b1cdbd2cSJim Jagielski 
SetPattern(SCCOL nCol,SCROW nRow,const ScPatternAttr & rAttr,sal_Bool bPutToPool)2122*b1cdbd2cSJim Jagielski void ScTable::SetPattern( SCCOL nCol, SCROW nRow, const ScPatternAttr& rAttr, sal_Bool bPutToPool )
2123*b1cdbd2cSJim Jagielski {
2124*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
2125*b1cdbd2cSJim Jagielski 		aCol[nCol].SetPattern( nRow, rAttr, bPutToPool );
2126*b1cdbd2cSJim Jagielski }
2127*b1cdbd2cSJim Jagielski 
2128*b1cdbd2cSJim Jagielski 
ApplyAttr(SCCOL nCol,SCROW nRow,const SfxPoolItem & rAttr)2129*b1cdbd2cSJim Jagielski void ScTable::ApplyAttr( SCCOL nCol, SCROW nRow, const SfxPoolItem& rAttr )
2130*b1cdbd2cSJim Jagielski {
2131*b1cdbd2cSJim Jagielski 	if (ValidColRow(nCol,nRow))
2132*b1cdbd2cSJim Jagielski 		aCol[nCol].ApplyAttr( nRow, rAttr );
2133*b1cdbd2cSJim Jagielski }
2134*b1cdbd2cSJim Jagielski 
2135*b1cdbd2cSJim Jagielski 
ApplySelectionCache(SfxItemPoolCache * pCache,const ScMarkData & rMark)2136*b1cdbd2cSJim Jagielski void ScTable::ApplySelectionCache( SfxItemPoolCache* pCache, const ScMarkData& rMark )
2137*b1cdbd2cSJim Jagielski {
2138*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
2139*b1cdbd2cSJim Jagielski 		aCol[i].ApplySelectionCache( pCache, rMark );
2140*b1cdbd2cSJim Jagielski }
2141*b1cdbd2cSJim Jagielski 
2142*b1cdbd2cSJim Jagielski 
ChangeSelectionIndent(sal_Bool bIncrement,const ScMarkData & rMark)2143*b1cdbd2cSJim Jagielski void ScTable::ChangeSelectionIndent( sal_Bool bIncrement, const ScMarkData& rMark )
2144*b1cdbd2cSJim Jagielski {
2145*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
2146*b1cdbd2cSJim Jagielski 		aCol[i].ChangeSelectionIndent( bIncrement, rMark );
2147*b1cdbd2cSJim Jagielski }
2148*b1cdbd2cSJim Jagielski 
2149*b1cdbd2cSJim Jagielski 
ClearSelectionItems(const sal_uInt16 * pWhich,const ScMarkData & rMark)2150*b1cdbd2cSJim Jagielski void ScTable::ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData& rMark )
2151*b1cdbd2cSJim Jagielski {
2152*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<=MAXCOL; i++)
2153*b1cdbd2cSJim Jagielski 		aCol[i].ClearSelectionItems( pWhich, rMark );
2154*b1cdbd2cSJim Jagielski }
2155*b1cdbd2cSJim Jagielski 
2156*b1cdbd2cSJim Jagielski 
2157*b1cdbd2cSJim Jagielski //	Spaltenbreiten / Zeilenhoehen
2158*b1cdbd2cSJim Jagielski 
SetColWidth(SCCOL nCol,sal_uInt16 nNewWidth)2159*b1cdbd2cSJim Jagielski void ScTable::SetColWidth( SCCOL nCol, sal_uInt16 nNewWidth )
2160*b1cdbd2cSJim Jagielski {
2161*b1cdbd2cSJim Jagielski 	if (VALIDCOL(nCol) && pColWidth)
2162*b1cdbd2cSJim Jagielski 	{
2163*b1cdbd2cSJim Jagielski 		if (!nNewWidth)
2164*b1cdbd2cSJim Jagielski 		{
2165*b1cdbd2cSJim Jagielski //			DBG_ERROR("Spaltenbreite 0 in SetColWidth");
2166*b1cdbd2cSJim Jagielski 			nNewWidth = STD_COL_WIDTH;
2167*b1cdbd2cSJim Jagielski 		}
2168*b1cdbd2cSJim Jagielski 
2169*b1cdbd2cSJim Jagielski 		if ( nNewWidth != pColWidth[nCol] )
2170*b1cdbd2cSJim Jagielski 		{
2171*b1cdbd2cSJim Jagielski 			IncRecalcLevel();
2172*b1cdbd2cSJim Jagielski             InitializeNoteCaptions();
2173*b1cdbd2cSJim Jagielski 			ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
2174*b1cdbd2cSJim Jagielski 			if (pDrawLayer)
2175*b1cdbd2cSJim Jagielski 				pDrawLayer->WidthChanged( nTab, nCol, ((long) nNewWidth) - (long) pColWidth[nCol] );
2176*b1cdbd2cSJim Jagielski 			pColWidth[nCol] = nNewWidth;
2177*b1cdbd2cSJim Jagielski 			DecRecalcLevel();
2178*b1cdbd2cSJim Jagielski 
2179*b1cdbd2cSJim Jagielski             InvalidatePageBreaks();
2180*b1cdbd2cSJim Jagielski 		}
2181*b1cdbd2cSJim Jagielski 	}
2182*b1cdbd2cSJim Jagielski 	else
2183*b1cdbd2cSJim Jagielski 	{
2184*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Spaltennummer oder keine Breiten");
2185*b1cdbd2cSJim Jagielski 	}
2186*b1cdbd2cSJim Jagielski }
2187*b1cdbd2cSJim Jagielski 
2188*b1cdbd2cSJim Jagielski 
SetRowHeight(SCROW nRow,sal_uInt16 nNewHeight)2189*b1cdbd2cSJim Jagielski void ScTable::SetRowHeight( SCROW nRow, sal_uInt16 nNewHeight )
2190*b1cdbd2cSJim Jagielski {
2191*b1cdbd2cSJim Jagielski     if (VALIDROW(nRow) && mpRowHeights)
2192*b1cdbd2cSJim Jagielski 	{
2193*b1cdbd2cSJim Jagielski 		if (!nNewHeight)
2194*b1cdbd2cSJim Jagielski 		{
2195*b1cdbd2cSJim Jagielski 			DBG_ERROR("Zeilenhoehe 0 in SetRowHeight");
2196*b1cdbd2cSJim Jagielski 			nNewHeight = ScGlobal::nStdRowHeight;
2197*b1cdbd2cSJim Jagielski 		}
2198*b1cdbd2cSJim Jagielski 
2199*b1cdbd2cSJim Jagielski         sal_uInt16 nOldHeight = mpRowHeights->getValue(nRow);
2200*b1cdbd2cSJim Jagielski 		if ( nNewHeight != nOldHeight )
2201*b1cdbd2cSJim Jagielski 		{
2202*b1cdbd2cSJim Jagielski 			IncRecalcLevel();
2203*b1cdbd2cSJim Jagielski             InitializeNoteCaptions();
2204*b1cdbd2cSJim Jagielski 			ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
2205*b1cdbd2cSJim Jagielski 			if (pDrawLayer)
2206*b1cdbd2cSJim Jagielski 				pDrawLayer->HeightChanged( nTab, nRow, ((long) nNewHeight) - (long) nOldHeight );
2207*b1cdbd2cSJim Jagielski             mpRowHeights->setValue(nRow, nRow, nNewHeight);
2208*b1cdbd2cSJim Jagielski 			DecRecalcLevel();
2209*b1cdbd2cSJim Jagielski 
2210*b1cdbd2cSJim Jagielski             InvalidatePageBreaks();
2211*b1cdbd2cSJim Jagielski 		}
2212*b1cdbd2cSJim Jagielski 	}
2213*b1cdbd2cSJim Jagielski 	else
2214*b1cdbd2cSJim Jagielski 	{
2215*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Zeilennummer oder keine Hoehen");
2216*b1cdbd2cSJim Jagielski 	}
2217*b1cdbd2cSJim Jagielski }
2218*b1cdbd2cSJim Jagielski 
2219*b1cdbd2cSJim Jagielski namespace {
2220*b1cdbd2cSJim Jagielski 
2221*b1cdbd2cSJim Jagielski /**
2222*b1cdbd2cSJim Jagielski  * Check if the new pixel size is different from the old size between
2223*b1cdbd2cSJim Jagielski  * specified ranges.
2224*b1cdbd2cSJim Jagielski  */
lcl_pixelSizeChanged(ScFlatUInt16RowSegments & rRowHeights,SCROW nStartRow,SCROW nEndRow,sal_uInt16 nNewHeight,double nPPTY)2225*b1cdbd2cSJim Jagielski bool lcl_pixelSizeChanged(
2226*b1cdbd2cSJim Jagielski     ScFlatUInt16RowSegments& rRowHeights, SCROW nStartRow, SCROW nEndRow,
2227*b1cdbd2cSJim Jagielski     sal_uInt16 nNewHeight, double nPPTY)
2228*b1cdbd2cSJim Jagielski {
2229*b1cdbd2cSJim Jagielski     long nNewPix = static_cast<long>(nNewHeight * nPPTY);
2230*b1cdbd2cSJim Jagielski 
2231*b1cdbd2cSJim Jagielski     ScFlatUInt16RowSegments::ForwardIterator aFwdIter(rRowHeights);
2232*b1cdbd2cSJim Jagielski     for (SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
2233*b1cdbd2cSJim Jagielski     {
2234*b1cdbd2cSJim Jagielski         sal_uInt16 nHeight;
2235*b1cdbd2cSJim Jagielski         if (!aFwdIter.getValue(nRow, nHeight))
2236*b1cdbd2cSJim Jagielski             break;
2237*b1cdbd2cSJim Jagielski 
2238*b1cdbd2cSJim Jagielski         if (nHeight != nNewHeight)
2239*b1cdbd2cSJim Jagielski         {
2240*b1cdbd2cSJim Jagielski             bool bChanged = (nNewPix != static_cast<long>(nHeight * nPPTY));
2241*b1cdbd2cSJim Jagielski             if (bChanged)
2242*b1cdbd2cSJim Jagielski                 return true;
2243*b1cdbd2cSJim Jagielski         }
2244*b1cdbd2cSJim Jagielski 
2245*b1cdbd2cSJim Jagielski         // Skip ahead to the last position of the current range.
2246*b1cdbd2cSJim Jagielski         nRow = aFwdIter.getLastPos();
2247*b1cdbd2cSJim Jagielski     }
2248*b1cdbd2cSJim Jagielski     return false;
2249*b1cdbd2cSJim Jagielski }
2250*b1cdbd2cSJim Jagielski 
2251*b1cdbd2cSJim Jagielski }
2252*b1cdbd2cSJim Jagielski 
SetRowHeightRange(SCROW nStartRow,SCROW nEndRow,sal_uInt16 nNewHeight,double,double nPPTY)2253*b1cdbd2cSJim Jagielski sal_Bool ScTable::SetRowHeightRange( SCROW nStartRow, SCROW nEndRow, sal_uInt16 nNewHeight,
2254*b1cdbd2cSJim Jagielski                                     double /* nPPTX */, double nPPTY )
2255*b1cdbd2cSJim Jagielski {
2256*b1cdbd2cSJim Jagielski 	sal_Bool bChanged = sal_False;
2257*b1cdbd2cSJim Jagielski     if (VALIDROW(nStartRow) && VALIDROW(nEndRow) && mpRowHeights)
2258*b1cdbd2cSJim Jagielski 	{
2259*b1cdbd2cSJim Jagielski 		IncRecalcLevel();
2260*b1cdbd2cSJim Jagielski         InitializeNoteCaptions();
2261*b1cdbd2cSJim Jagielski 		if (!nNewHeight)
2262*b1cdbd2cSJim Jagielski 		{
2263*b1cdbd2cSJim Jagielski 			DBG_ERROR("Zeilenhoehe 0 in SetRowHeight");
2264*b1cdbd2cSJim Jagielski 			nNewHeight = ScGlobal::nStdRowHeight;
2265*b1cdbd2cSJim Jagielski 		}
2266*b1cdbd2cSJim Jagielski 
2267*b1cdbd2cSJim Jagielski         sal_Bool bSingle = sal_False;   // sal_True = process every row for its own
2268*b1cdbd2cSJim Jagielski 		ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
2269*b1cdbd2cSJim Jagielski 		if (pDrawLayer)
2270*b1cdbd2cSJim Jagielski 			if (pDrawLayer->HasObjectsInRows( nTab, nStartRow, nEndRow ))
2271*b1cdbd2cSJim Jagielski 				bSingle = sal_True;
2272*b1cdbd2cSJim Jagielski 
2273*b1cdbd2cSJim Jagielski 		if (bSingle)
2274*b1cdbd2cSJim Jagielski 		{
2275*b1cdbd2cSJim Jagielski             ScFlatUInt16RowSegments::RangeData aData;
2276*b1cdbd2cSJim Jagielski             mpRowHeights->getRangeData(nStartRow, aData);
2277*b1cdbd2cSJim Jagielski             if (nNewHeight == aData.mnValue && nEndRow <= aData.mnRow2)
2278*b1cdbd2cSJim Jagielski                 bSingle = sal_False;    // no difference in this range
2279*b1cdbd2cSJim Jagielski 		}
2280*b1cdbd2cSJim Jagielski 		if (bSingle)
2281*b1cdbd2cSJim Jagielski 		{
2282*b1cdbd2cSJim Jagielski 			if (nEndRow-nStartRow < 20)
2283*b1cdbd2cSJim Jagielski             {
2284*b1cdbd2cSJim Jagielski                 if (!bChanged)
2285*b1cdbd2cSJim Jagielski                     bChanged = lcl_pixelSizeChanged(*mpRowHeights, nStartRow, nEndRow, nNewHeight, nPPTY);
2286*b1cdbd2cSJim Jagielski 
2287*b1cdbd2cSJim Jagielski                 /*  #i94028# #i94991# If drawing objects are involved, each row
2288*b1cdbd2cSJim Jagielski                     has to be changed for its own, because each call to
2289*b1cdbd2cSJim Jagielski                     ScDrawLayer::HeightChanged expects correct row heights
2290*b1cdbd2cSJim Jagielski                     above passed row in the document. Cannot use array iterator
2291*b1cdbd2cSJim Jagielski                     because array changes in every cycle. */
2292*b1cdbd2cSJim Jagielski                 if( pDrawLayer )
2293*b1cdbd2cSJim Jagielski                 {
2294*b1cdbd2cSJim Jagielski                     for( SCROW nRow = nStartRow; nRow <= nEndRow ; ++nRow )
2295*b1cdbd2cSJim Jagielski                     {
2296*b1cdbd2cSJim Jagielski                         pDrawLayer->HeightChanged( nTab, nRow,
2297*b1cdbd2cSJim Jagielski                              static_cast<long>(nNewHeight) - static_cast<long>(mpRowHeights->getValue(nRow)));
2298*b1cdbd2cSJim Jagielski                         mpRowHeights->setValue(nRow, nRow, nNewHeight);
2299*b1cdbd2cSJim Jagielski                     }
2300*b1cdbd2cSJim Jagielski                 }
2301*b1cdbd2cSJim Jagielski                 else
2302*b1cdbd2cSJim Jagielski                     mpRowHeights->setValue(nStartRow, nEndRow, nNewHeight);
2303*b1cdbd2cSJim Jagielski             }
2304*b1cdbd2cSJim Jagielski 			else
2305*b1cdbd2cSJim Jagielski 			{
2306*b1cdbd2cSJim Jagielski 				SCROW nMid = (nStartRow+nEndRow) / 2;
2307*b1cdbd2cSJim Jagielski 				if (SetRowHeightRange( nStartRow, nMid, nNewHeight, 1.0, 1.0 ))
2308*b1cdbd2cSJim Jagielski 					bChanged = sal_True;
2309*b1cdbd2cSJim Jagielski 				if (SetRowHeightRange( nMid+1, nEndRow, nNewHeight, 1.0, 1.0 ))
2310*b1cdbd2cSJim Jagielski 					bChanged = sal_True;
2311*b1cdbd2cSJim Jagielski 			}
2312*b1cdbd2cSJim Jagielski 		}
2313*b1cdbd2cSJim Jagielski 		else
2314*b1cdbd2cSJim Jagielski 		{
2315*b1cdbd2cSJim Jagielski 			if (pDrawLayer)
2316*b1cdbd2cSJim Jagielski 			{
2317*b1cdbd2cSJim Jagielski                 // #i115025# When comparing to nNewHeight for the whole range, the height
2318*b1cdbd2cSJim Jagielski                 // including hidden rows has to be used (same behavior as 3.2).
2319*b1cdbd2cSJim Jagielski                 unsigned long nOldHeights = mpRowHeights->getSumValue(nStartRow, nEndRow);
2320*b1cdbd2cSJim Jagielski                 // FIXME: should we test for overflows?
2321*b1cdbd2cSJim Jagielski 				long nHeightDif = (long) (unsigned long) nNewHeight *
2322*b1cdbd2cSJim Jagielski                     (nEndRow - nStartRow + 1) - nOldHeights;
2323*b1cdbd2cSJim Jagielski 				pDrawLayer->HeightChanged( nTab, nEndRow, nHeightDif );
2324*b1cdbd2cSJim Jagielski 			}
2325*b1cdbd2cSJim Jagielski 
2326*b1cdbd2cSJim Jagielski             if (!bChanged)
2327*b1cdbd2cSJim Jagielski                 bChanged = lcl_pixelSizeChanged(*mpRowHeights, nStartRow, nEndRow, nNewHeight, nPPTY);
2328*b1cdbd2cSJim Jagielski 
2329*b1cdbd2cSJim Jagielski             mpRowHeights->setValue(nStartRow, nEndRow, nNewHeight);
2330*b1cdbd2cSJim Jagielski 		}
2331*b1cdbd2cSJim Jagielski 		DecRecalcLevel();
2332*b1cdbd2cSJim Jagielski 
2333*b1cdbd2cSJim Jagielski         if (bChanged)
2334*b1cdbd2cSJim Jagielski             InvalidatePageBreaks();
2335*b1cdbd2cSJim Jagielski 	}
2336*b1cdbd2cSJim Jagielski 	else
2337*b1cdbd2cSJim Jagielski 	{
2338*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Zeilennummer oder keine Hoehen");
2339*b1cdbd2cSJim Jagielski 	}
2340*b1cdbd2cSJim Jagielski 
2341*b1cdbd2cSJim Jagielski 	return bChanged;
2342*b1cdbd2cSJim Jagielski }
2343*b1cdbd2cSJim Jagielski 
SetRowHeightOnly(SCROW nStartRow,SCROW nEndRow,sal_uInt16 nNewHeight)2344*b1cdbd2cSJim Jagielski void ScTable::SetRowHeightOnly( SCROW nStartRow, SCROW nEndRow, sal_uInt16 nNewHeight )
2345*b1cdbd2cSJim Jagielski {
2346*b1cdbd2cSJim Jagielski     if (!ValidRow(nStartRow) || !ValidRow(nEndRow) || !mpRowHeights)
2347*b1cdbd2cSJim Jagielski         return;
2348*b1cdbd2cSJim Jagielski 
2349*b1cdbd2cSJim Jagielski     if (!nNewHeight)
2350*b1cdbd2cSJim Jagielski         nNewHeight = ScGlobal::nStdRowHeight;
2351*b1cdbd2cSJim Jagielski 
2352*b1cdbd2cSJim Jagielski     mpRowHeights->setValue(nStartRow, nEndRow, nNewHeight);
2353*b1cdbd2cSJim Jagielski }
2354*b1cdbd2cSJim Jagielski 
SetColWidthOnly(SCCOL nCol,sal_uInt16 nNewWidth)2355*b1cdbd2cSJim Jagielski void ScTable::SetColWidthOnly( SCCOL nCol, sal_uInt16 nNewWidth )
2356*b1cdbd2cSJim Jagielski {
2357*b1cdbd2cSJim Jagielski 	if (!VALIDCOL(nCol) || !pColWidth)
2358*b1cdbd2cSJim Jagielski         return;
2359*b1cdbd2cSJim Jagielski 
2360*b1cdbd2cSJim Jagielski     if (!nNewWidth)
2361*b1cdbd2cSJim Jagielski         nNewWidth = STD_COL_WIDTH;
2362*b1cdbd2cSJim Jagielski 
2363*b1cdbd2cSJim Jagielski     pColWidth[nCol] = nNewWidth;
2364*b1cdbd2cSJim Jagielski }
SetManualHeight(SCROW nStartRow,SCROW nEndRow,sal_Bool bManual)2365*b1cdbd2cSJim Jagielski void ScTable::SetManualHeight( SCROW nStartRow, SCROW nEndRow, sal_Bool bManual )
2366*b1cdbd2cSJim Jagielski {
2367*b1cdbd2cSJim Jagielski 	if (VALIDROW(nStartRow) && VALIDROW(nEndRow) && pRowFlags)
2368*b1cdbd2cSJim Jagielski 	{
2369*b1cdbd2cSJim Jagielski 		if (bManual)
2370*b1cdbd2cSJim Jagielski             pRowFlags->OrValue( nStartRow, nEndRow, CR_MANUALSIZE);
2371*b1cdbd2cSJim Jagielski 		else
2372*b1cdbd2cSJim Jagielski             pRowFlags->AndValue( nStartRow, nEndRow, sal::static_int_cast<sal_uInt8>(~CR_MANUALSIZE));
2373*b1cdbd2cSJim Jagielski 	}
2374*b1cdbd2cSJim Jagielski 	else
2375*b1cdbd2cSJim Jagielski 	{
2376*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Zeilennummer oder keine Zeilenflags");
2377*b1cdbd2cSJim Jagielski 	}
2378*b1cdbd2cSJim Jagielski }
2379*b1cdbd2cSJim Jagielski 
2380*b1cdbd2cSJim Jagielski 
GetColWidth(SCCOL nCol) const2381*b1cdbd2cSJim Jagielski sal_uInt16 ScTable::GetColWidth( SCCOL nCol ) const
2382*b1cdbd2cSJim Jagielski {
2383*b1cdbd2cSJim Jagielski 	DBG_ASSERT(VALIDCOL(nCol),"Falsche Spaltennummer");
2384*b1cdbd2cSJim Jagielski 
2385*b1cdbd2cSJim Jagielski 	if (VALIDCOL(nCol) && pColFlags && pColWidth)
2386*b1cdbd2cSJim Jagielski 	{
2387*b1cdbd2cSJim Jagielski         if (ColHidden(nCol))
2388*b1cdbd2cSJim Jagielski 			return 0;
2389*b1cdbd2cSJim Jagielski 		else
2390*b1cdbd2cSJim Jagielski 			return pColWidth[nCol];
2391*b1cdbd2cSJim Jagielski 	}
2392*b1cdbd2cSJim Jagielski 	else
2393*b1cdbd2cSJim Jagielski 		return (sal_uInt16) STD_COL_WIDTH;
2394*b1cdbd2cSJim Jagielski }
2395*b1cdbd2cSJim Jagielski 
2396*b1cdbd2cSJim Jagielski 
GetOriginalWidth(SCCOL nCol) const2397*b1cdbd2cSJim Jagielski sal_uInt16 ScTable::GetOriginalWidth( SCCOL nCol ) const		// immer die eingestellte
2398*b1cdbd2cSJim Jagielski {
2399*b1cdbd2cSJim Jagielski 	DBG_ASSERT(VALIDCOL(nCol),"Falsche Spaltennummer");
2400*b1cdbd2cSJim Jagielski 
2401*b1cdbd2cSJim Jagielski 	if (VALIDCOL(nCol) && pColWidth)
2402*b1cdbd2cSJim Jagielski 		return pColWidth[nCol];
2403*b1cdbd2cSJim Jagielski 	else
2404*b1cdbd2cSJim Jagielski 		return (sal_uInt16) STD_COL_WIDTH;
2405*b1cdbd2cSJim Jagielski }
2406*b1cdbd2cSJim Jagielski 
2407*b1cdbd2cSJim Jagielski 
GetCommonWidth(SCCOL nEndCol)2408*b1cdbd2cSJim Jagielski sal_uInt16 ScTable::GetCommonWidth( SCCOL nEndCol )
2409*b1cdbd2cSJim Jagielski {
2410*b1cdbd2cSJim Jagielski 	//	get the width that is used in the largest continuous column range (up to nEndCol)
2411*b1cdbd2cSJim Jagielski 
2412*b1cdbd2cSJim Jagielski 	if ( !ValidCol(nEndCol) )
2413*b1cdbd2cSJim Jagielski 	{
2414*b1cdbd2cSJim Jagielski 		DBG_ERROR("wrong column");
2415*b1cdbd2cSJim Jagielski 		nEndCol = MAXCOL;
2416*b1cdbd2cSJim Jagielski 	}
2417*b1cdbd2cSJim Jagielski 
2418*b1cdbd2cSJim Jagielski 	sal_uInt16 nMaxWidth = 0;
2419*b1cdbd2cSJim Jagielski 	sal_uInt16 nMaxCount = 0;
2420*b1cdbd2cSJim Jagielski 	SCCOL nRangeStart = 0;
2421*b1cdbd2cSJim Jagielski 	while ( nRangeStart <= nEndCol )
2422*b1cdbd2cSJim Jagielski 	{
2423*b1cdbd2cSJim Jagielski 		//	skip hidden columns
2424*b1cdbd2cSJim Jagielski 		while ( nRangeStart <= nEndCol && ColHidden(nRangeStart) )
2425*b1cdbd2cSJim Jagielski 			++nRangeStart;
2426*b1cdbd2cSJim Jagielski 		if ( nRangeStart <= nEndCol )
2427*b1cdbd2cSJim Jagielski 		{
2428*b1cdbd2cSJim Jagielski 			sal_uInt16 nThisCount = 0;
2429*b1cdbd2cSJim Jagielski 			sal_uInt16 nThisWidth = pColWidth[nRangeStart];
2430*b1cdbd2cSJim Jagielski 			SCCOL nRangeEnd = nRangeStart;
2431*b1cdbd2cSJim Jagielski 			while ( nRangeEnd <= nEndCol && pColWidth[nRangeEnd] == nThisWidth )
2432*b1cdbd2cSJim Jagielski 			{
2433*b1cdbd2cSJim Jagielski 				++nThisCount;
2434*b1cdbd2cSJim Jagielski 				++nRangeEnd;
2435*b1cdbd2cSJim Jagielski 
2436*b1cdbd2cSJim Jagielski 				//	skip hidden columns
2437*b1cdbd2cSJim Jagielski 				while ( nRangeEnd <= nEndCol && ColHidden(nRangeEnd) )
2438*b1cdbd2cSJim Jagielski 					++nRangeEnd;
2439*b1cdbd2cSJim Jagielski 			}
2440*b1cdbd2cSJim Jagielski 
2441*b1cdbd2cSJim Jagielski 			if ( nThisCount > nMaxCount )
2442*b1cdbd2cSJim Jagielski 			{
2443*b1cdbd2cSJim Jagielski 				nMaxCount = nThisCount;
2444*b1cdbd2cSJim Jagielski 				nMaxWidth = nThisWidth;
2445*b1cdbd2cSJim Jagielski 			}
2446*b1cdbd2cSJim Jagielski 
2447*b1cdbd2cSJim Jagielski 			nRangeStart = nRangeEnd;		// next range
2448*b1cdbd2cSJim Jagielski 		}
2449*b1cdbd2cSJim Jagielski 	}
2450*b1cdbd2cSJim Jagielski 
2451*b1cdbd2cSJim Jagielski 	return nMaxWidth;
2452*b1cdbd2cSJim Jagielski }
2453*b1cdbd2cSJim Jagielski 
2454*b1cdbd2cSJim Jagielski 
GetRowHeight(SCROW nRow,SCROW * pStartRow,SCROW * pEndRow,bool bHiddenAsZero) const2455*b1cdbd2cSJim Jagielski sal_uInt16 ScTable::GetRowHeight( SCROW nRow, SCROW* pStartRow, SCROW* pEndRow, bool bHiddenAsZero ) const
2456*b1cdbd2cSJim Jagielski {
2457*b1cdbd2cSJim Jagielski     DBG_ASSERT(VALIDROW(nRow),"Invalid row number");
2458*b1cdbd2cSJim Jagielski 
2459*b1cdbd2cSJim Jagielski     if (VALIDROW(nRow) && mpRowHeights)
2460*b1cdbd2cSJim Jagielski     {
2461*b1cdbd2cSJim Jagielski         if (bHiddenAsZero && RowHidden( nRow, pStartRow, pEndRow))
2462*b1cdbd2cSJim Jagielski             return 0;
2463*b1cdbd2cSJim Jagielski         else
2464*b1cdbd2cSJim Jagielski         {
2465*b1cdbd2cSJim Jagielski             ScFlatUInt16RowSegments::RangeData aData;
2466*b1cdbd2cSJim Jagielski             if (!mpRowHeights->getRangeData(nRow, aData))
2467*b1cdbd2cSJim Jagielski             {
2468*b1cdbd2cSJim Jagielski                 if (pStartRow)
2469*b1cdbd2cSJim Jagielski                     *pStartRow = nRow;
2470*b1cdbd2cSJim Jagielski                 if (pEndRow)
2471*b1cdbd2cSJim Jagielski                     *pEndRow = nRow;
2472*b1cdbd2cSJim Jagielski                 // TODO: What should we return in case the search fails?
2473*b1cdbd2cSJim Jagielski                 return 0;
2474*b1cdbd2cSJim Jagielski             }
2475*b1cdbd2cSJim Jagielski 
2476*b1cdbd2cSJim Jagielski             // If bHiddenAsZero, pStartRow and pEndRow were initialized to
2477*b1cdbd2cSJim Jagielski             // boundaries of a non-hidden segment. Assume that the previous and
2478*b1cdbd2cSJim Jagielski             // next segment are hidden then and limit the current height
2479*b1cdbd2cSJim Jagielski             // segment.
2480*b1cdbd2cSJim Jagielski             if (pStartRow)
2481*b1cdbd2cSJim Jagielski                 *pStartRow = (bHiddenAsZero ? std::max( *pStartRow, aData.mnRow1) : aData.mnRow1);
2482*b1cdbd2cSJim Jagielski             if (pEndRow)
2483*b1cdbd2cSJim Jagielski                 *pEndRow = (bHiddenAsZero ? std::min( *pEndRow, aData.mnRow2) : aData.mnRow2);
2484*b1cdbd2cSJim Jagielski             return aData.mnValue;
2485*b1cdbd2cSJim Jagielski         }
2486*b1cdbd2cSJim Jagielski     }
2487*b1cdbd2cSJim Jagielski     else
2488*b1cdbd2cSJim Jagielski     {
2489*b1cdbd2cSJim Jagielski         if (pStartRow)
2490*b1cdbd2cSJim Jagielski             *pStartRow = nRow;
2491*b1cdbd2cSJim Jagielski         if (pEndRow)
2492*b1cdbd2cSJim Jagielski             *pEndRow = nRow;
2493*b1cdbd2cSJim Jagielski         return (sal_uInt16) ScGlobal::nStdRowHeight;
2494*b1cdbd2cSJim Jagielski     }
2495*b1cdbd2cSJim Jagielski }
2496*b1cdbd2cSJim Jagielski 
2497*b1cdbd2cSJim Jagielski 
GetRowHeight(SCROW nStartRow,SCROW nEndRow) const2498*b1cdbd2cSJim Jagielski sal_uLong ScTable::GetRowHeight( SCROW nStartRow, SCROW nEndRow ) const
2499*b1cdbd2cSJim Jagielski {
2500*b1cdbd2cSJim Jagielski 	DBG_ASSERT(VALIDROW(nStartRow) && VALIDROW(nEndRow),"Falsche Zeilennummer");
2501*b1cdbd2cSJim Jagielski 
2502*b1cdbd2cSJim Jagielski 	if (VALIDROW(nStartRow) && VALIDROW(nEndRow) && mpRowHeights)
2503*b1cdbd2cSJim Jagielski 	{
2504*b1cdbd2cSJim Jagielski         sal_uLong nHeight = 0;
2505*b1cdbd2cSJim Jagielski         SCROW nRow = nStartRow;
2506*b1cdbd2cSJim Jagielski         while (nRow <= nEndRow)
2507*b1cdbd2cSJim Jagielski         {
2508*b1cdbd2cSJim Jagielski             SCROW nLastRow = -1;
2509*b1cdbd2cSJim Jagielski             if (!RowHidden(nRow, nLastRow))
2510*b1cdbd2cSJim Jagielski             {
2511*b1cdbd2cSJim Jagielski                 if (nLastRow > nEndRow)
2512*b1cdbd2cSJim Jagielski                     nLastRow = nEndRow;
2513*b1cdbd2cSJim Jagielski                 nHeight += mpRowHeights->getSumValue(nRow, nLastRow);
2514*b1cdbd2cSJim Jagielski             }
2515*b1cdbd2cSJim Jagielski             nRow = nLastRow + 1;
2516*b1cdbd2cSJim Jagielski         }
2517*b1cdbd2cSJim Jagielski         return nHeight;
2518*b1cdbd2cSJim Jagielski 	}
2519*b1cdbd2cSJim Jagielski 	else
2520*b1cdbd2cSJim Jagielski 		return (sal_uLong) ((nEndRow - nStartRow + 1) * ScGlobal::nStdRowHeight);
2521*b1cdbd2cSJim Jagielski }
2522*b1cdbd2cSJim Jagielski 
2523*b1cdbd2cSJim Jagielski 
GetScaledRowHeight(SCROW nStartRow,SCROW nEndRow,double fScale) const2524*b1cdbd2cSJim Jagielski sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale ) const
2525*b1cdbd2cSJim Jagielski {
2526*b1cdbd2cSJim Jagielski 	DBG_ASSERT(VALIDROW(nStartRow) && VALIDROW(nEndRow),"Falsche Zeilennummer");
2527*b1cdbd2cSJim Jagielski 
2528*b1cdbd2cSJim Jagielski 	if (VALIDROW(nStartRow) && VALIDROW(nEndRow) && mpRowHeights)
2529*b1cdbd2cSJim Jagielski 	{
2530*b1cdbd2cSJim Jagielski         sal_uLong nHeight = 0;
2531*b1cdbd2cSJim Jagielski         SCROW nRow = nStartRow;
2532*b1cdbd2cSJim Jagielski         while (nRow <= nEndRow)
2533*b1cdbd2cSJim Jagielski         {
2534*b1cdbd2cSJim Jagielski             SCROW nLastRow = -1;
2535*b1cdbd2cSJim Jagielski             if (!RowHidden(nRow, nLastRow))
2536*b1cdbd2cSJim Jagielski             {
2537*b1cdbd2cSJim Jagielski                 if (nLastRow > nEndRow)
2538*b1cdbd2cSJim Jagielski                     nLastRow = nEndRow;
2539*b1cdbd2cSJim Jagielski 
2540*b1cdbd2cSJim Jagielski                 // #i117315# can't use getSumValue, because individual values must be rounded
2541*b1cdbd2cSJim Jagielski                 while (nRow <= nLastRow)
2542*b1cdbd2cSJim Jagielski                 {
2543*b1cdbd2cSJim Jagielski                     ScFlatUInt16RowSegments::RangeData aData;
2544*b1cdbd2cSJim Jagielski                     if (!mpRowHeights->getRangeData(nRow, aData))
2545*b1cdbd2cSJim Jagielski                         return nHeight;   // shouldn't happen
2546*b1cdbd2cSJim Jagielski 
2547*b1cdbd2cSJim Jagielski                     SCROW nSegmentEnd = std::min( nLastRow, aData.mnRow2 );
2548*b1cdbd2cSJim Jagielski 
2549*b1cdbd2cSJim Jagielski                     // round-down a single height value, multiply resulting (pixel) values
2550*b1cdbd2cSJim Jagielski                     sal_uLong nOneHeight = static_cast<sal_uLong>( aData.mnValue * fScale );
2551*b1cdbd2cSJim Jagielski                     nHeight += nOneHeight * ( nSegmentEnd + 1 - nRow );
2552*b1cdbd2cSJim Jagielski 
2553*b1cdbd2cSJim Jagielski                     nRow = nSegmentEnd + 1;
2554*b1cdbd2cSJim Jagielski                 }
2555*b1cdbd2cSJim Jagielski             }
2556*b1cdbd2cSJim Jagielski             nRow = nLastRow + 1;
2557*b1cdbd2cSJim Jagielski         }
2558*b1cdbd2cSJim Jagielski         return nHeight;
2559*b1cdbd2cSJim Jagielski 	}
2560*b1cdbd2cSJim Jagielski 	else
2561*b1cdbd2cSJim Jagielski 		return (sal_uLong) ((nEndRow - nStartRow + 1) * ScGlobal::nStdRowHeight * fScale);
2562*b1cdbd2cSJim Jagielski }
2563*b1cdbd2cSJim Jagielski 
2564*b1cdbd2cSJim Jagielski 
GetOriginalHeight(SCROW nRow) const2565*b1cdbd2cSJim Jagielski sal_uInt16 ScTable::GetOriginalHeight( SCROW nRow ) const		// non-0 even if hidden
2566*b1cdbd2cSJim Jagielski {
2567*b1cdbd2cSJim Jagielski 	DBG_ASSERT(VALIDROW(nRow),"wrong row number");
2568*b1cdbd2cSJim Jagielski 
2569*b1cdbd2cSJim Jagielski     if (VALIDROW(nRow) && mpRowHeights)
2570*b1cdbd2cSJim Jagielski         return mpRowHeights->getValue(nRow);
2571*b1cdbd2cSJim Jagielski 	else
2572*b1cdbd2cSJim Jagielski 		return (sal_uInt16) ScGlobal::nStdRowHeight;
2573*b1cdbd2cSJim Jagielski }
2574*b1cdbd2cSJim Jagielski 
2575*b1cdbd2cSJim Jagielski 
2576*b1cdbd2cSJim Jagielski //	Spalten-/Zeilen-Flags
2577*b1cdbd2cSJim Jagielski 
2578*b1cdbd2cSJim Jagielski 
GetHiddenRowCount(SCROW nRow)2579*b1cdbd2cSJim Jagielski SCROW ScTable::GetHiddenRowCount( SCROW nRow )
2580*b1cdbd2cSJim Jagielski {
2581*b1cdbd2cSJim Jagielski     if (!ValidRow(nRow))
2582*b1cdbd2cSJim Jagielski         return 0;
2583*b1cdbd2cSJim Jagielski 
2584*b1cdbd2cSJim Jagielski     SCROW nLastRow = -1;
2585*b1cdbd2cSJim Jagielski     if (!RowHidden(nRow, nLastRow) || !ValidRow(nLastRow))
2586*b1cdbd2cSJim Jagielski         return 0;
2587*b1cdbd2cSJim Jagielski 
2588*b1cdbd2cSJim Jagielski     return nLastRow - nRow + 1;
2589*b1cdbd2cSJim Jagielski }
2590*b1cdbd2cSJim Jagielski 
2591*b1cdbd2cSJim Jagielski 
2592*b1cdbd2cSJim Jagielski //!		ShowRows / DBShowRows zusammenfassen
2593*b1cdbd2cSJim Jagielski 
ShowCol(SCCOL nCol,bool bShow)2594*b1cdbd2cSJim Jagielski void ScTable::ShowCol(SCCOL nCol, bool bShow)
2595*b1cdbd2cSJim Jagielski {
2596*b1cdbd2cSJim Jagielski 	if (VALIDCOL(nCol))
2597*b1cdbd2cSJim Jagielski 	{
2598*b1cdbd2cSJim Jagielski         bool bWasVis = !ColHidden(nCol);
2599*b1cdbd2cSJim Jagielski 		if (bWasVis != bShow)
2600*b1cdbd2cSJim Jagielski 		{
2601*b1cdbd2cSJim Jagielski 			IncRecalcLevel();
2602*b1cdbd2cSJim Jagielski             InitializeNoteCaptions();
2603*b1cdbd2cSJim Jagielski 			ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
2604*b1cdbd2cSJim Jagielski 			if (pDrawLayer)
2605*b1cdbd2cSJim Jagielski 			{
2606*b1cdbd2cSJim Jagielski 				if (bShow)
2607*b1cdbd2cSJim Jagielski 					pDrawLayer->WidthChanged( nTab, nCol, (long) pColWidth[nCol] );
2608*b1cdbd2cSJim Jagielski 				else
2609*b1cdbd2cSJim Jagielski 					pDrawLayer->WidthChanged( nTab, nCol, -(long) pColWidth[nCol] );
2610*b1cdbd2cSJim Jagielski 			}
2611*b1cdbd2cSJim Jagielski 
2612*b1cdbd2cSJim Jagielski             SetColHidden(nCol, nCol, !bShow);
2613*b1cdbd2cSJim Jagielski 	    DecRecalcLevel();
2614*b1cdbd2cSJim Jagielski 
2615*b1cdbd2cSJim Jagielski 			ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection();
2616*b1cdbd2cSJim Jagielski 			if ( pCharts )
2617*b1cdbd2cSJim Jagielski 				pCharts->SetRangeDirty(ScRange( nCol, 0, nTab, nCol, MAXROW, nTab ));
2618*b1cdbd2cSJim Jagielski 		}
2619*b1cdbd2cSJim Jagielski 	}
2620*b1cdbd2cSJim Jagielski 	else
2621*b1cdbd2cSJim Jagielski 	{
2622*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Spaltennummer oder keine Flags");
2623*b1cdbd2cSJim Jagielski 	}
2624*b1cdbd2cSJim Jagielski }
2625*b1cdbd2cSJim Jagielski 
2626*b1cdbd2cSJim Jagielski 
ShowRow(SCROW nRow,bool bShow)2627*b1cdbd2cSJim Jagielski void ScTable::ShowRow(SCROW nRow, bool bShow)
2628*b1cdbd2cSJim Jagielski {
2629*b1cdbd2cSJim Jagielski 	if (VALIDROW(nRow) && pRowFlags)
2630*b1cdbd2cSJim Jagielski 	{
2631*b1cdbd2cSJim Jagielski         bool bWasVis = !RowHidden(nRow);
2632*b1cdbd2cSJim Jagielski 		if (bWasVis != bShow)
2633*b1cdbd2cSJim Jagielski 		{
2634*b1cdbd2cSJim Jagielski 			IncRecalcLevel();
2635*b1cdbd2cSJim Jagielski             InitializeNoteCaptions();
2636*b1cdbd2cSJim Jagielski 			ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
2637*b1cdbd2cSJim Jagielski 			if (pDrawLayer)
2638*b1cdbd2cSJim Jagielski 			{
2639*b1cdbd2cSJim Jagielski 				if (bShow)
2640*b1cdbd2cSJim Jagielski                     pDrawLayer->HeightChanged(
2641*b1cdbd2cSJim Jagielski                         nTab, nRow, static_cast<long>(mpRowHeights->getValue(nRow)));
2642*b1cdbd2cSJim Jagielski 				else
2643*b1cdbd2cSJim Jagielski                     pDrawLayer->HeightChanged(
2644*b1cdbd2cSJim Jagielski                         nTab, nRow, -static_cast<long>(mpRowHeights->getValue(nRow)));
2645*b1cdbd2cSJim Jagielski 			}
2646*b1cdbd2cSJim Jagielski 
2647*b1cdbd2cSJim Jagielski             SetRowHidden(nRow, nRow, !bShow);
2648*b1cdbd2cSJim Jagielski 			if (bShow)
2649*b1cdbd2cSJim Jagielski                 SetRowFiltered(nRow, nRow, false);
2650*b1cdbd2cSJim Jagielski 		DecRecalcLevel();
2651*b1cdbd2cSJim Jagielski 
2652*b1cdbd2cSJim Jagielski 			ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection();
2653*b1cdbd2cSJim Jagielski 			if ( pCharts )
2654*b1cdbd2cSJim Jagielski 				pCharts->SetRangeDirty(ScRange( 0, nRow, nTab, MAXCOL, nRow, nTab ));
2655*b1cdbd2cSJim Jagielski 
2656*b1cdbd2cSJim Jagielski             InvalidatePageBreaks();
2657*b1cdbd2cSJim Jagielski 		}
2658*b1cdbd2cSJim Jagielski 	}
2659*b1cdbd2cSJim Jagielski 	else
2660*b1cdbd2cSJim Jagielski 	{
2661*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Zeilennummer oder keine Flags");
2662*b1cdbd2cSJim Jagielski 	}
2663*b1cdbd2cSJim Jagielski }
2664*b1cdbd2cSJim Jagielski 
2665*b1cdbd2cSJim Jagielski 
DBShowRow(SCROW nRow,bool bShow)2666*b1cdbd2cSJim Jagielski void ScTable::DBShowRow(SCROW nRow, bool bShow)
2667*b1cdbd2cSJim Jagielski {
2668*b1cdbd2cSJim Jagielski 	if (VALIDROW(nRow) && pRowFlags)
2669*b1cdbd2cSJim Jagielski 	{
2670*b1cdbd2cSJim Jagielski         bool bWasVis = !RowHidden(nRow);
2671*b1cdbd2cSJim Jagielski 		IncRecalcLevel();
2672*b1cdbd2cSJim Jagielski         InitializeNoteCaptions();
2673*b1cdbd2cSJim Jagielski 		if (bWasVis != bShow)
2674*b1cdbd2cSJim Jagielski 		{
2675*b1cdbd2cSJim Jagielski 			ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
2676*b1cdbd2cSJim Jagielski 			if (pDrawLayer)
2677*b1cdbd2cSJim Jagielski 			{
2678*b1cdbd2cSJim Jagielski 				if (bShow)
2679*b1cdbd2cSJim Jagielski                     pDrawLayer->HeightChanged(
2680*b1cdbd2cSJim Jagielski                         nTab, nRow, static_cast<long>(mpRowHeights->getValue(nRow)));
2681*b1cdbd2cSJim Jagielski 				else
2682*b1cdbd2cSJim Jagielski                     pDrawLayer->HeightChanged(
2683*b1cdbd2cSJim Jagielski                         nTab, nRow, -static_cast<long>(mpRowHeights->getValue(nRow)));
2684*b1cdbd2cSJim Jagielski 			}
2685*b1cdbd2cSJim Jagielski 		}
2686*b1cdbd2cSJim Jagielski 
2687*b1cdbd2cSJim Jagielski 		//	Filter-Flag immer setzen, auch wenn Hidden unveraendert
2688*b1cdbd2cSJim Jagielski         SetRowHidden(nRow, nRow, !bShow);
2689*b1cdbd2cSJim Jagielski         SetRowFiltered(nRow, nRow, !bShow);
2690*b1cdbd2cSJim Jagielski 	DecRecalcLevel();
2691*b1cdbd2cSJim Jagielski 
2692*b1cdbd2cSJim Jagielski 		if (bWasVis != bShow)
2693*b1cdbd2cSJim Jagielski 		{
2694*b1cdbd2cSJim Jagielski 			ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection();
2695*b1cdbd2cSJim Jagielski 			if ( pCharts )
2696*b1cdbd2cSJim Jagielski 				pCharts->SetRangeDirty(ScRange( 0, nRow, nTab, MAXCOL, nRow, nTab ));
2697*b1cdbd2cSJim Jagielski 
2698*b1cdbd2cSJim Jagielski 			if (pOutlineTable)
2699*b1cdbd2cSJim Jagielski 				UpdateOutlineRow( nRow, nRow, bShow );
2700*b1cdbd2cSJim Jagielski 
2701*b1cdbd2cSJim Jagielski             InvalidatePageBreaks();
2702*b1cdbd2cSJim Jagielski 		}
2703*b1cdbd2cSJim Jagielski 	}
2704*b1cdbd2cSJim Jagielski 	else
2705*b1cdbd2cSJim Jagielski 	{
2706*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Zeilennummer oder keine Flags");
2707*b1cdbd2cSJim Jagielski 	}
2708*b1cdbd2cSJim Jagielski }
2709*b1cdbd2cSJim Jagielski 
2710*b1cdbd2cSJim Jagielski 
DBShowRows(SCROW nRow1,SCROW nRow2,bool bShow,bool bSetFlags)2711*b1cdbd2cSJim Jagielski void ScTable::DBShowRows(SCROW nRow1, SCROW nRow2, bool bShow, bool bSetFlags)
2712*b1cdbd2cSJim Jagielski {
2713*b1cdbd2cSJim Jagielski     // #i116164# IncRecalcLevel/DecRecalcLevel is in ScTable::Query
2714*b1cdbd2cSJim Jagielski 	SCROW nStartRow = nRow1;
2715*b1cdbd2cSJim Jagielski     InitializeNoteCaptions();
2716*b1cdbd2cSJim Jagielski 	while (nStartRow <= nRow2)
2717*b1cdbd2cSJim Jagielski 	{
2718*b1cdbd2cSJim Jagielski         SCROW nEndRow = -1;
2719*b1cdbd2cSJim Jagielski         bool bWasVis = !RowHidden(nStartRow, nEndRow);
2720*b1cdbd2cSJim Jagielski         if (nEndRow > nRow2)
2721*b1cdbd2cSJim Jagielski             nEndRow = nRow2;
2722*b1cdbd2cSJim Jagielski 
2723*b1cdbd2cSJim Jagielski 		sal_Bool bChanged = ( bWasVis != bShow );
2724*b1cdbd2cSJim Jagielski 		if ( bChanged && bSetFlags )
2725*b1cdbd2cSJim Jagielski 		{
2726*b1cdbd2cSJim Jagielski 			ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
2727*b1cdbd2cSJim Jagielski 			if (pDrawLayer)
2728*b1cdbd2cSJim Jagielski 			{
2729*b1cdbd2cSJim Jagielski                 long nHeight = static_cast<long>(mpRowHeights->getSumValue(nStartRow, nEndRow));
2730*b1cdbd2cSJim Jagielski 				if (bShow)
2731*b1cdbd2cSJim Jagielski 					pDrawLayer->HeightChanged( nTab, nStartRow, nHeight );
2732*b1cdbd2cSJim Jagielski 				else
2733*b1cdbd2cSJim Jagielski 					pDrawLayer->HeightChanged( nTab, nStartRow, -nHeight );
2734*b1cdbd2cSJim Jagielski 			}
2735*b1cdbd2cSJim Jagielski 		}
2736*b1cdbd2cSJim Jagielski 
2737*b1cdbd2cSJim Jagielski         // #i116164# Directly modify the flags only if there are drawing objects within the area.
2738*b1cdbd2cSJim Jagielski         // Otherwise, all modifications are made together in ScTable::Query, so the tree isn't constantly rebuilt.
2739*b1cdbd2cSJim Jagielski         if ( bSetFlags )
2740*b1cdbd2cSJim Jagielski         {
2741*b1cdbd2cSJim Jagielski             SetRowHidden(nStartRow, nEndRow, !bShow);
2742*b1cdbd2cSJim Jagielski             SetRowFiltered(nStartRow, nEndRow, !bShow);
2743*b1cdbd2cSJim Jagielski         }
2744*b1cdbd2cSJim Jagielski 
2745*b1cdbd2cSJim Jagielski 		if ( bChanged )
2746*b1cdbd2cSJim Jagielski 		{
2747*b1cdbd2cSJim Jagielski 			ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection();
2748*b1cdbd2cSJim Jagielski 			if ( pCharts )
2749*b1cdbd2cSJim Jagielski 				pCharts->SetRangeDirty(ScRange( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab ));
2750*b1cdbd2cSJim Jagielski 		}
2751*b1cdbd2cSJim Jagielski 
2752*b1cdbd2cSJim Jagielski 		nStartRow = nEndRow + 1;
2753*b1cdbd2cSJim Jagielski 	}
2754*b1cdbd2cSJim Jagielski 
2755*b1cdbd2cSJim Jagielski 	//	#i12341# For Show/Hide rows, the outlines are updated separately from the outside.
2756*b1cdbd2cSJim Jagielski 	//	For filtering, the changes aren't visible to the caller, so UpdateOutlineRow has
2757*b1cdbd2cSJim Jagielski 	//	to be done here.
2758*b1cdbd2cSJim Jagielski 	if (pOutlineTable)
2759*b1cdbd2cSJim Jagielski 		UpdateOutlineRow( nRow1, nRow2, bShow );
2760*b1cdbd2cSJim Jagielski }
2761*b1cdbd2cSJim Jagielski 
2762*b1cdbd2cSJim Jagielski 
ShowRows(SCROW nRow1,SCROW nRow2,bool bShow)2763*b1cdbd2cSJim Jagielski void ScTable::ShowRows(SCROW nRow1, SCROW nRow2, bool bShow)
2764*b1cdbd2cSJim Jagielski {
2765*b1cdbd2cSJim Jagielski 	SCROW nStartRow = nRow1;
2766*b1cdbd2cSJim Jagielski 	IncRecalcLevel();
2767*b1cdbd2cSJim Jagielski     InitializeNoteCaptions();
2768*b1cdbd2cSJim Jagielski 
2769*b1cdbd2cSJim Jagielski     // #i116164# if there are no drawing objects within the row range, a single HeightChanged call is enough
2770*b1cdbd2cSJim Jagielski     ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
2771*b1cdbd2cSJim Jagielski     bool bHasObjects = pDrawLayer && pDrawLayer->HasObjectsInRows( nTab, nRow1, nRow2, false );
2772*b1cdbd2cSJim Jagielski     long nOldHeight = 0;
2773*b1cdbd2cSJim Jagielski     if ( pDrawLayer && !bHasObjects )
2774*b1cdbd2cSJim Jagielski         nOldHeight = static_cast<long>(GetRowHeight(nRow1, nRow2));
2775*b1cdbd2cSJim Jagielski 
2776*b1cdbd2cSJim Jagielski 	while (nStartRow <= nRow2)
2777*b1cdbd2cSJim Jagielski 	{
2778*b1cdbd2cSJim Jagielski         SCROW nEndRow = -1;
2779*b1cdbd2cSJim Jagielski         bool bWasVis = !RowHidden(nStartRow, nEndRow);
2780*b1cdbd2cSJim Jagielski         if (nEndRow > nRow2)
2781*b1cdbd2cSJim Jagielski             nEndRow = nRow2;
2782*b1cdbd2cSJim Jagielski 
2783*b1cdbd2cSJim Jagielski 		sal_Bool bChanged = ( bWasVis != bShow );
2784*b1cdbd2cSJim Jagielski         if ( bChanged && bHasObjects )
2785*b1cdbd2cSJim Jagielski 		{
2786*b1cdbd2cSJim Jagielski 			if (pDrawLayer)
2787*b1cdbd2cSJim Jagielski 			{
2788*b1cdbd2cSJim Jagielski                 long nHeight = static_cast<long>(mpRowHeights->getSumValue(nStartRow, nEndRow));
2789*b1cdbd2cSJim Jagielski 				if (bShow)
2790*b1cdbd2cSJim Jagielski 					pDrawLayer->HeightChanged( nTab, nStartRow, nHeight );
2791*b1cdbd2cSJim Jagielski 				else
2792*b1cdbd2cSJim Jagielski 					pDrawLayer->HeightChanged( nTab, nStartRow, -nHeight );
2793*b1cdbd2cSJim Jagielski 			}
2794*b1cdbd2cSJim Jagielski 		}
2795*b1cdbd2cSJim Jagielski 
2796*b1cdbd2cSJim Jagielski         // #i116164# Directly modify the flags only if there are drawing objects within the area.
2797*b1cdbd2cSJim Jagielski         // Otherwise, all rows are modified together after the loop, so the tree isn't constantly rebuilt.
2798*b1cdbd2cSJim Jagielski         if ( bHasObjects )
2799*b1cdbd2cSJim Jagielski         {
2800*b1cdbd2cSJim Jagielski             SetRowHidden(nStartRow, nEndRow, !bShow);
2801*b1cdbd2cSJim Jagielski             if (bShow)
2802*b1cdbd2cSJim Jagielski                 SetRowFiltered(nStartRow, nEndRow, false);
2803*b1cdbd2cSJim Jagielski         }
2804*b1cdbd2cSJim Jagielski 
2805*b1cdbd2cSJim Jagielski 		if ( bChanged )
2806*b1cdbd2cSJim Jagielski 		{
2807*b1cdbd2cSJim Jagielski 			ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection();
2808*b1cdbd2cSJim Jagielski 			if ( pCharts )
2809*b1cdbd2cSJim Jagielski 				pCharts->SetRangeDirty(ScRange( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab ));
2810*b1cdbd2cSJim Jagielski 
2811*b1cdbd2cSJim Jagielski             InvalidatePageBreaks();
2812*b1cdbd2cSJim Jagielski 		}
2813*b1cdbd2cSJim Jagielski 
2814*b1cdbd2cSJim Jagielski 		nStartRow = nEndRow + 1;
2815*b1cdbd2cSJim Jagielski 	}
2816*b1cdbd2cSJim Jagielski 
2817*b1cdbd2cSJim Jagielski     if ( !bHasObjects )
2818*b1cdbd2cSJim Jagielski     {
2819*b1cdbd2cSJim Jagielski         // #i116164# set the flags for the whole range at once
2820*b1cdbd2cSJim Jagielski         SetRowHidden(nRow1, nRow2, !bShow);
2821*b1cdbd2cSJim Jagielski         if (bShow)
2822*b1cdbd2cSJim Jagielski             SetRowFiltered(nRow1, nRow2, false);
2823*b1cdbd2cSJim Jagielski 
2824*b1cdbd2cSJim Jagielski         if ( pDrawLayer )
2825*b1cdbd2cSJim Jagielski         {
2826*b1cdbd2cSJim Jagielski             // if there are no objects in the range, a single HeightChanged call is enough
2827*b1cdbd2cSJim Jagielski             long nNewHeight = 0;
2828*b1cdbd2cSJim Jagielski             if ( bShow )
2829*b1cdbd2cSJim Jagielski                 nNewHeight = static_cast<long>(GetRowHeight(nRow1, nRow2));
2830*b1cdbd2cSJim Jagielski             if ( nNewHeight != nOldHeight )
2831*b1cdbd2cSJim Jagielski                 pDrawLayer->HeightChanged( nTab, nRow1, nNewHeight - nOldHeight );
2832*b1cdbd2cSJim Jagielski         }
2833*b1cdbd2cSJim Jagielski     }
2834*b1cdbd2cSJim Jagielski 
2835*b1cdbd2cSJim Jagielski 	DecRecalcLevel();
2836*b1cdbd2cSJim Jagielski }
2837*b1cdbd2cSJim Jagielski 
IsDataFiltered() const2838*b1cdbd2cSJim Jagielski sal_Bool ScTable::IsDataFiltered() const
2839*b1cdbd2cSJim Jagielski {
2840*b1cdbd2cSJim Jagielski 	sal_Bool bAnyQuery = sal_False;
2841*b1cdbd2cSJim Jagielski 	ScDBData* pDBData = pDocument->GetFilterDBAtTable(nTab);
2842*b1cdbd2cSJim Jagielski 	if ( pDBData )
2843*b1cdbd2cSJim Jagielski 	{
2844*b1cdbd2cSJim Jagielski 		ScQueryParam aParam;
2845*b1cdbd2cSJim Jagielski 		pDBData->GetQueryParam( aParam );
2846*b1cdbd2cSJim Jagielski 		if ( aParam.GetEntry(0).bDoQuery )
2847*b1cdbd2cSJim Jagielski 			bAnyQuery = sal_True;
2848*b1cdbd2cSJim Jagielski 	}
2849*b1cdbd2cSJim Jagielski 	return bAnyQuery;
2850*b1cdbd2cSJim Jagielski }
2851*b1cdbd2cSJim Jagielski 
SetColFlags(SCCOL nCol,sal_uInt8 nNewFlags)2852*b1cdbd2cSJim Jagielski void ScTable::SetColFlags( SCCOL nCol, sal_uInt8 nNewFlags )
2853*b1cdbd2cSJim Jagielski {
2854*b1cdbd2cSJim Jagielski 	if (VALIDCOL(nCol) && pColFlags)
2855*b1cdbd2cSJim Jagielski 		pColFlags[nCol] = nNewFlags;
2856*b1cdbd2cSJim Jagielski 	else
2857*b1cdbd2cSJim Jagielski 	{
2858*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Spaltennummer oder keine Flags");
2859*b1cdbd2cSJim Jagielski 	}
2860*b1cdbd2cSJim Jagielski }
2861*b1cdbd2cSJim Jagielski 
2862*b1cdbd2cSJim Jagielski 
SetRowFlags(SCROW nRow,sal_uInt8 nNewFlags)2863*b1cdbd2cSJim Jagielski void ScTable::SetRowFlags( SCROW nRow, sal_uInt8 nNewFlags )
2864*b1cdbd2cSJim Jagielski {
2865*b1cdbd2cSJim Jagielski 	if (VALIDROW(nRow) && pRowFlags)
2866*b1cdbd2cSJim Jagielski 		pRowFlags->SetValue( nRow, nNewFlags);
2867*b1cdbd2cSJim Jagielski 	else
2868*b1cdbd2cSJim Jagielski 	{
2869*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Zeilennummer oder keine Flags");
2870*b1cdbd2cSJim Jagielski 	}
2871*b1cdbd2cSJim Jagielski }
2872*b1cdbd2cSJim Jagielski 
2873*b1cdbd2cSJim Jagielski 
SetRowFlags(SCROW nStartRow,SCROW nEndRow,sal_uInt8 nNewFlags)2874*b1cdbd2cSJim Jagielski void ScTable::SetRowFlags( SCROW nStartRow, SCROW nEndRow, sal_uInt8 nNewFlags )
2875*b1cdbd2cSJim Jagielski {
2876*b1cdbd2cSJim Jagielski 	if (VALIDROW(nStartRow) && VALIDROW(nEndRow) && pRowFlags)
2877*b1cdbd2cSJim Jagielski 		pRowFlags->SetValue( nStartRow, nEndRow, nNewFlags);
2878*b1cdbd2cSJim Jagielski 	else
2879*b1cdbd2cSJim Jagielski 	{
2880*b1cdbd2cSJim Jagielski 		DBG_ERROR("Falsche Zeilennummer(n) oder keine Flags");
2881*b1cdbd2cSJim Jagielski 	}
2882*b1cdbd2cSJim Jagielski }
2883*b1cdbd2cSJim Jagielski 
2884*b1cdbd2cSJim Jagielski 
GetColFlags(SCCOL nCol) const2885*b1cdbd2cSJim Jagielski sal_uInt8 ScTable::GetColFlags( SCCOL nCol ) const
2886*b1cdbd2cSJim Jagielski {
2887*b1cdbd2cSJim Jagielski 	if (VALIDCOL(nCol) && pColFlags)
2888*b1cdbd2cSJim Jagielski 		return pColFlags[nCol];
2889*b1cdbd2cSJim Jagielski 	else
2890*b1cdbd2cSJim Jagielski 		return 0;
2891*b1cdbd2cSJim Jagielski }
2892*b1cdbd2cSJim Jagielski 
2893*b1cdbd2cSJim Jagielski 
GetRowFlags(SCROW nRow) const2894*b1cdbd2cSJim Jagielski sal_uInt8 ScTable::GetRowFlags( SCROW nRow ) const
2895*b1cdbd2cSJim Jagielski {
2896*b1cdbd2cSJim Jagielski 	if (VALIDROW(nRow) && pRowFlags)
2897*b1cdbd2cSJim Jagielski 		return pRowFlags->GetValue(nRow);
2898*b1cdbd2cSJim Jagielski 	else
2899*b1cdbd2cSJim Jagielski 		return 0;
2900*b1cdbd2cSJim Jagielski }
2901*b1cdbd2cSJim Jagielski 
2902*b1cdbd2cSJim Jagielski 
GetLastFlaggedRow() const2903*b1cdbd2cSJim Jagielski SCROW ScTable::GetLastFlaggedRow() const
2904*b1cdbd2cSJim Jagielski {
2905*b1cdbd2cSJim Jagielski     SCROW nLastFound = 0;
2906*b1cdbd2cSJim Jagielski     if (pRowFlags)
2907*b1cdbd2cSJim Jagielski     {
2908*b1cdbd2cSJim Jagielski         SCROW nRow = pRowFlags->GetLastAnyBitAccess( 0, sal::static_int_cast<sal_uInt8>(CR_ALL) );
2909*b1cdbd2cSJim Jagielski         if (ValidRow(nRow))
2910*b1cdbd2cSJim Jagielski             nLastFound = nRow;
2911*b1cdbd2cSJim Jagielski     }
2912*b1cdbd2cSJim Jagielski 
2913*b1cdbd2cSJim Jagielski     if (!maRowManualBreaks.empty())
2914*b1cdbd2cSJim Jagielski         nLastFound = ::std::max(nLastFound, *maRowManualBreaks.rbegin());
2915*b1cdbd2cSJim Jagielski 
2916*b1cdbd2cSJim Jagielski     if (mpHiddenRows)
2917*b1cdbd2cSJim Jagielski     {
2918*b1cdbd2cSJim Jagielski         SCROW nRow = mpHiddenRows->findLastNotOf(false);
2919*b1cdbd2cSJim Jagielski         if (ValidRow(nRow))
2920*b1cdbd2cSJim Jagielski             nLastFound = ::std::max(nLastFound, nRow);
2921*b1cdbd2cSJim Jagielski     }
2922*b1cdbd2cSJim Jagielski 
2923*b1cdbd2cSJim Jagielski     if (mpFilteredRows)
2924*b1cdbd2cSJim Jagielski     {
2925*b1cdbd2cSJim Jagielski         SCROW nRow = mpFilteredRows->findLastNotOf(false);
2926*b1cdbd2cSJim Jagielski         if (ValidRow(nRow))
2927*b1cdbd2cSJim Jagielski             nLastFound = ::std::max(nLastFound, nRow);
2928*b1cdbd2cSJim Jagielski     }
2929*b1cdbd2cSJim Jagielski 
2930*b1cdbd2cSJim Jagielski     return nLastFound;
2931*b1cdbd2cSJim Jagielski }
2932*b1cdbd2cSJim Jagielski 
2933*b1cdbd2cSJim Jagielski 
GetLastChangedCol() const2934*b1cdbd2cSJim Jagielski SCCOL ScTable::GetLastChangedCol() const
2935*b1cdbd2cSJim Jagielski {
2936*b1cdbd2cSJim Jagielski 	if ( !pColFlags )
2937*b1cdbd2cSJim Jagielski 		return 0;
2938*b1cdbd2cSJim Jagielski 
2939*b1cdbd2cSJim Jagielski 	SCCOL nLastFound = 0;
2940*b1cdbd2cSJim Jagielski 	for (SCCOL nCol = 1; nCol <= MAXCOL; nCol++)
2941*b1cdbd2cSJim Jagielski         if ((pColFlags[nCol] & CR_ALL) || (pColWidth[nCol] != STD_COL_WIDTH))
2942*b1cdbd2cSJim Jagielski 			nLastFound = nCol;
2943*b1cdbd2cSJim Jagielski 
2944*b1cdbd2cSJim Jagielski 	return nLastFound;
2945*b1cdbd2cSJim Jagielski }
2946*b1cdbd2cSJim Jagielski 
2947*b1cdbd2cSJim Jagielski 
GetLastChangedRow() const2948*b1cdbd2cSJim Jagielski SCROW ScTable::GetLastChangedRow() const
2949*b1cdbd2cSJim Jagielski {
2950*b1cdbd2cSJim Jagielski 	if ( !pRowFlags )
2951*b1cdbd2cSJim Jagielski 		return 0;
2952*b1cdbd2cSJim Jagielski 
2953*b1cdbd2cSJim Jagielski     SCROW nLastFlags = GetLastFlaggedRow();
2954*b1cdbd2cSJim Jagielski 
2955*b1cdbd2cSJim Jagielski     // Find the last row position where the height is NOT the standard row
2956*b1cdbd2cSJim Jagielski     // height.
2957*b1cdbd2cSJim Jagielski     // KOHEI: Test this to make sure it does what it's supposed to.
2958*b1cdbd2cSJim Jagielski     SCROW nLastHeight = mpRowHeights->findLastNotOf(ScGlobal::nStdRowHeight);
2959*b1cdbd2cSJim Jagielski     if (!ValidRow(nLastHeight))
2960*b1cdbd2cSJim Jagielski         nLastHeight = 0;
2961*b1cdbd2cSJim Jagielski 
2962*b1cdbd2cSJim Jagielski 	return std::max( nLastFlags, nLastHeight);
2963*b1cdbd2cSJim Jagielski }
2964*b1cdbd2cSJim Jagielski 
2965*b1cdbd2cSJim Jagielski 
UpdateOutlineCol(SCCOL nStartCol,SCCOL nEndCol,sal_Bool bShow)2966*b1cdbd2cSJim Jagielski sal_Bool ScTable::UpdateOutlineCol( SCCOL nStartCol, SCCOL nEndCol, sal_Bool bShow )
2967*b1cdbd2cSJim Jagielski {
2968*b1cdbd2cSJim Jagielski 	if (pOutlineTable && pColFlags)
2969*b1cdbd2cSJim Jagielski     {
2970*b1cdbd2cSJim Jagielski         ScBitMaskCompressedArray< SCCOLROW, sal_uInt8> aArray( MAXCOL, pColFlags, MAXCOLCOUNT);
2971*b1cdbd2cSJim Jagielski 		return pOutlineTable->GetColArray()->ManualAction( nStartCol, nEndCol, bShow, *this, true );
2972*b1cdbd2cSJim Jagielski     }
2973*b1cdbd2cSJim Jagielski 	else
2974*b1cdbd2cSJim Jagielski 		return sal_False;
2975*b1cdbd2cSJim Jagielski }
2976*b1cdbd2cSJim Jagielski 
2977*b1cdbd2cSJim Jagielski 
UpdateOutlineRow(SCROW nStartRow,SCROW nEndRow,sal_Bool bShow)2978*b1cdbd2cSJim Jagielski sal_Bool ScTable::UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, sal_Bool bShow )
2979*b1cdbd2cSJim Jagielski {
2980*b1cdbd2cSJim Jagielski 	if (pOutlineTable && pRowFlags)
2981*b1cdbd2cSJim Jagielski 		return pOutlineTable->GetRowArray()->ManualAction( nStartRow, nEndRow, bShow, *this, false );
2982*b1cdbd2cSJim Jagielski 	else
2983*b1cdbd2cSJim Jagielski 		return sal_False;
2984*b1cdbd2cSJim Jagielski }
2985*b1cdbd2cSJim Jagielski 
2986*b1cdbd2cSJim Jagielski 
ExtendHidden(SCCOL & rX1,SCROW & rY1,SCCOL & rX2,SCROW & rY2)2987*b1cdbd2cSJim Jagielski void ScTable::ExtendHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 )
2988*b1cdbd2cSJim Jagielski {
2989*b1cdbd2cSJim Jagielski     // Column-wise expansion
2990*b1cdbd2cSJim Jagielski 
2991*b1cdbd2cSJim Jagielski     while (rX1 > 0 && ColHidden(rX1-1))
2992*b1cdbd2cSJim Jagielski         --rX1;
2993*b1cdbd2cSJim Jagielski 
2994*b1cdbd2cSJim Jagielski     while (rX2 < MAXCOL && ColHidden(rX2+1))
2995*b1cdbd2cSJim Jagielski         ++rX2;
2996*b1cdbd2cSJim Jagielski 
2997*b1cdbd2cSJim Jagielski     // Row-wise expansion
2998*b1cdbd2cSJim Jagielski 
2999*b1cdbd2cSJim Jagielski     if (rY1 > 0)
3000*b1cdbd2cSJim Jagielski 	{
3001*b1cdbd2cSJim Jagielski         ScFlatBoolRowSegments::RangeData aData;
3002*b1cdbd2cSJim Jagielski         if (mpHiddenRows->getRangeData(rY1-1, aData) && aData.mbValue)
3003*b1cdbd2cSJim Jagielski         {
3004*b1cdbd2cSJim Jagielski             SCROW nStartRow = aData.mnRow1;
3005*b1cdbd2cSJim Jagielski             if (ValidRow(nStartRow))
3006*b1cdbd2cSJim Jagielski                 rY1 = nStartRow;
3007*b1cdbd2cSJim Jagielski         }
3008*b1cdbd2cSJim Jagielski     }
3009*b1cdbd2cSJim Jagielski     if (rY2 < MAXROW)
3010*b1cdbd2cSJim Jagielski     {
3011*b1cdbd2cSJim Jagielski         SCROW nEndRow = -1;
3012*b1cdbd2cSJim Jagielski         if (RowHidden(rY2+1, nEndRow) && ValidRow(nEndRow))
3013*b1cdbd2cSJim Jagielski             rY2 = nEndRow;
3014*b1cdbd2cSJim Jagielski 	}
3015*b1cdbd2cSJim Jagielski }
3016*b1cdbd2cSJim Jagielski 
3017*b1cdbd2cSJim Jagielski 
StripHidden(SCCOL & rX1,SCROW & rY1,SCCOL & rX2,SCROW & rY2)3018*b1cdbd2cSJim Jagielski void ScTable::StripHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 )
3019*b1cdbd2cSJim Jagielski {
3020*b1cdbd2cSJim Jagielski     while ( rX2>rX1 && ColHidden(rX2) )
3021*b1cdbd2cSJim Jagielski         --rX2;
3022*b1cdbd2cSJim Jagielski     while ( rX2>rX1 && ColHidden(rX1) )
3023*b1cdbd2cSJim Jagielski         ++rX1;
3024*b1cdbd2cSJim Jagielski 
3025*b1cdbd2cSJim Jagielski     if (rY1 < rY2)
3026*b1cdbd2cSJim Jagielski 	{
3027*b1cdbd2cSJim Jagielski         ScFlatBoolRowSegments::RangeData aData;
3028*b1cdbd2cSJim Jagielski         if (mpHiddenRows->getRangeData(rY2, aData) && aData.mbValue)
3029*b1cdbd2cSJim Jagielski         {
3030*b1cdbd2cSJim Jagielski             SCROW nStartRow = aData.mnRow1;
3031*b1cdbd2cSJim Jagielski             if (ValidRow(nStartRow) && nStartRow >= rY1)
3032*b1cdbd2cSJim Jagielski                 rY2 = nStartRow;
3033*b1cdbd2cSJim Jagielski         }
3034*b1cdbd2cSJim Jagielski     }
3035*b1cdbd2cSJim Jagielski 
3036*b1cdbd2cSJim Jagielski     if (rY1 < rY2)
3037*b1cdbd2cSJim Jagielski     {
3038*b1cdbd2cSJim Jagielski         SCROW nEndRow = -1;
3039*b1cdbd2cSJim Jagielski         if (RowHidden(rY1, nEndRow) && ValidRow(nEndRow) && nEndRow <= rY2)
3040*b1cdbd2cSJim Jagielski             rY1 = nEndRow;
3041*b1cdbd2cSJim Jagielski 	}
3042*b1cdbd2cSJim Jagielski }
3043*b1cdbd2cSJim Jagielski 
3044*b1cdbd2cSJim Jagielski 
3045*b1cdbd2cSJim Jagielski //	Auto-Outline
3046*b1cdbd2cSJim Jagielski 
3047*b1cdbd2cSJim Jagielski template< typename T >
DiffSign(T a,T b)3048*b1cdbd2cSJim Jagielski short DiffSign( T a, T b )
3049*b1cdbd2cSJim Jagielski {
3050*b1cdbd2cSJim Jagielski 	return (a<b) ? -1 :
3051*b1cdbd2cSJim Jagielski 			(a>b) ? 1 : 0;
3052*b1cdbd2cSJim Jagielski }
3053*b1cdbd2cSJim Jagielski 
3054*b1cdbd2cSJim Jagielski 
DoAutoOutline(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow)3055*b1cdbd2cSJim Jagielski void ScTable::DoAutoOutline( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow )
3056*b1cdbd2cSJim Jagielski {
3057*b1cdbd2cSJim Jagielski 	sal_Bool bSizeChanged = sal_False;
3058*b1cdbd2cSJim Jagielski 	sal_Bool bMissed	  = sal_False;
3059*b1cdbd2cSJim Jagielski 
3060*b1cdbd2cSJim Jagielski 	SCCOL nCol;
3061*b1cdbd2cSJim Jagielski 	SCROW nRow;
3062*b1cdbd2cSJim Jagielski 	SCROW i;
3063*b1cdbd2cSJim Jagielski 	sal_Bool bFound;
3064*b1cdbd2cSJim Jagielski 	ScOutlineArray* pArray;
3065*b1cdbd2cSJim Jagielski 	ScBaseCell* pCell;
3066*b1cdbd2cSJim Jagielski 	ScRange aRef;
3067*b1cdbd2cSJim Jagielski /*	ScPatternAttr aBoldPattern( pDocument->GetPool() );				//!	spezielle Format-Vorlage
3068*b1cdbd2cSJim Jagielski 	aBoldPattern.GetItemSet().Put( SvxWeightItem( WEIGHT_BOLD ) );
3069*b1cdbd2cSJim Jagielski */
3070*b1cdbd2cSJim Jagielski 
3071*b1cdbd2cSJim Jagielski 	StartOutlineTable();
3072*b1cdbd2cSJim Jagielski 
3073*b1cdbd2cSJim Jagielski 							// Zeilen
3074*b1cdbd2cSJim Jagielski 
3075*b1cdbd2cSJim Jagielski 	SCROW	nCount = nEndRow-nStartRow+1;
3076*b1cdbd2cSJim Jagielski 	sal_Bool*	pUsed = new sal_Bool[nCount];
3077*b1cdbd2cSJim Jagielski 	for (i=0; i<nCount; i++)
3078*b1cdbd2cSJim Jagielski 		pUsed[i] = sal_False;
3079*b1cdbd2cSJim Jagielski 	for (nCol=nStartCol; nCol<=nEndCol; nCol++)
3080*b1cdbd2cSJim Jagielski 		if (!aCol[nCol].IsEmptyData())
3081*b1cdbd2cSJim Jagielski 			aCol[nCol].FindUsed( nStartRow, nEndRow, pUsed );
3082*b1cdbd2cSJim Jagielski 
3083*b1cdbd2cSJim Jagielski 	pArray = pOutlineTable->GetRowArray();
3084*b1cdbd2cSJim Jagielski 	for (nRow=nStartRow; nRow<=nEndRow; nRow++)
3085*b1cdbd2cSJim Jagielski 		if (pUsed[nRow-nStartRow])
3086*b1cdbd2cSJim Jagielski 		{
3087*b1cdbd2cSJim Jagielski 			bFound = sal_False;
3088*b1cdbd2cSJim Jagielski 			for (nCol=nStartCol; nCol<=nEndCol && !bFound; nCol++)
3089*b1cdbd2cSJim Jagielski 				if (!aCol[nCol].IsEmptyData())
3090*b1cdbd2cSJim Jagielski 				{
3091*b1cdbd2cSJim Jagielski 					pCell = aCol[nCol].GetCell( nRow );
3092*b1cdbd2cSJim Jagielski 					if (pCell)
3093*b1cdbd2cSJim Jagielski 						if ( pCell->GetCellType() == CELLTYPE_FORMULA )
3094*b1cdbd2cSJim Jagielski 							if (((ScFormulaCell*)pCell)->HasRefListExpressibleAsOneReference( aRef ))
3095*b1cdbd2cSJim Jagielski 								if ( aRef.aStart.Col() == nCol && aRef.aEnd.Col() == nCol &&
3096*b1cdbd2cSJim Jagielski 									 aRef.aStart.Tab() == nTab && aRef.aEnd.Tab() == nTab &&
3097*b1cdbd2cSJim Jagielski 									 DiffSign( aRef.aStart.Row(), nRow ) ==
3098*b1cdbd2cSJim Jagielski 										DiffSign( aRef.aEnd.Row(), nRow ) )
3099*b1cdbd2cSJim Jagielski 								{
3100*b1cdbd2cSJim Jagielski 									if (pArray->Insert( aRef.aStart.Row(), aRef.aEnd.Row(), bSizeChanged ))
3101*b1cdbd2cSJim Jagielski 									{
3102*b1cdbd2cSJim Jagielski //										ApplyPatternArea( nStartCol, nRow, nEndCol, nRow, aBoldPattern );
3103*b1cdbd2cSJim Jagielski 										bFound = sal_True;
3104*b1cdbd2cSJim Jagielski 									}
3105*b1cdbd2cSJim Jagielski 									else
3106*b1cdbd2cSJim Jagielski 										bMissed = sal_True;
3107*b1cdbd2cSJim Jagielski 								}
3108*b1cdbd2cSJim Jagielski 				}
3109*b1cdbd2cSJim Jagielski 		}
3110*b1cdbd2cSJim Jagielski 
3111*b1cdbd2cSJim Jagielski 	delete[] pUsed;
3112*b1cdbd2cSJim Jagielski 
3113*b1cdbd2cSJim Jagielski 							// Spalten
3114*b1cdbd2cSJim Jagielski 
3115*b1cdbd2cSJim Jagielski 	pArray = pOutlineTable->GetColArray();
3116*b1cdbd2cSJim Jagielski 	for (nCol=nStartCol; nCol<=nEndCol; nCol++)
3117*b1cdbd2cSJim Jagielski 	{
3118*b1cdbd2cSJim Jagielski 		if (!aCol[nCol].IsEmptyData())
3119*b1cdbd2cSJim Jagielski 		{
3120*b1cdbd2cSJim Jagielski 			bFound = sal_False;
3121*b1cdbd2cSJim Jagielski 			ScColumnIterator aIter( &aCol[nCol], nStartRow, nEndRow );
3122*b1cdbd2cSJim Jagielski 			while ( aIter.Next( nRow, pCell ) && !bFound )
3123*b1cdbd2cSJim Jagielski 			{
3124*b1cdbd2cSJim Jagielski 				if ( pCell->GetCellType() == CELLTYPE_FORMULA )
3125*b1cdbd2cSJim Jagielski 					if (((ScFormulaCell*)pCell)->HasRefListExpressibleAsOneReference( aRef ))
3126*b1cdbd2cSJim Jagielski 						if ( aRef.aStart.Row() == nRow && aRef.aEnd.Row() == nRow &&
3127*b1cdbd2cSJim Jagielski 							 aRef.aStart.Tab() == nTab && aRef.aEnd.Tab() == nTab &&
3128*b1cdbd2cSJim Jagielski 							 DiffSign( aRef.aStart.Col(), nCol ) ==
3129*b1cdbd2cSJim Jagielski 								DiffSign( aRef.aEnd.Col(), nCol ) )
3130*b1cdbd2cSJim Jagielski 						{
3131*b1cdbd2cSJim Jagielski 							if (pArray->Insert( aRef.aStart.Col(), aRef.aEnd.Col(), bSizeChanged ))
3132*b1cdbd2cSJim Jagielski 							{
3133*b1cdbd2cSJim Jagielski //								ApplyPatternArea( nCol, nStartRow, nCol, nEndRow, aBoldPattern );
3134*b1cdbd2cSJim Jagielski 								bFound = sal_True;
3135*b1cdbd2cSJim Jagielski 							}
3136*b1cdbd2cSJim Jagielski 							else
3137*b1cdbd2cSJim Jagielski 								bMissed = sal_True;
3138*b1cdbd2cSJim Jagielski 						}
3139*b1cdbd2cSJim Jagielski 			}
3140*b1cdbd2cSJim Jagielski 		}
3141*b1cdbd2cSJim Jagielski 	}
3142*b1cdbd2cSJim Jagielski }
3143*b1cdbd2cSJim Jagielski 
3144*b1cdbd2cSJim Jagielski 									//	CopyData - fuer Query in anderen Bereich
3145*b1cdbd2cSJim Jagielski 
CopyData(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,SCCOL nDestCol,SCROW nDestRow,SCTAB nDestTab)3146*b1cdbd2cSJim Jagielski void ScTable::CopyData( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
3147*b1cdbd2cSJim Jagielski 							SCCOL nDestCol, SCROW nDestRow, SCTAB nDestTab )
3148*b1cdbd2cSJim Jagielski {
3149*b1cdbd2cSJim Jagielski 	//!		wenn fuer mehrere Zeilen benutzt, nach Spalten optimieren!
3150*b1cdbd2cSJim Jagielski 
3151*b1cdbd2cSJim Jagielski 	ScAddress aSrc( nStartCol, nStartRow, nTab );
3152*b1cdbd2cSJim Jagielski 	ScAddress aDest( nDestCol, nDestRow, nDestTab );
3153*b1cdbd2cSJim Jagielski 	ScRange aRange( aSrc, aDest );
3154*b1cdbd2cSJim Jagielski 	sal_Bool bThisTab = ( nDestTab == nTab );
3155*b1cdbd2cSJim Jagielski 	SCROW nDestY = nDestRow;
3156*b1cdbd2cSJim Jagielski 	for (SCROW nRow=nStartRow; nRow<=nEndRow; nRow++)
3157*b1cdbd2cSJim Jagielski 	{
3158*b1cdbd2cSJim Jagielski 		aSrc.SetRow( nRow );
3159*b1cdbd2cSJim Jagielski 		aDest.SetRow( nDestY );
3160*b1cdbd2cSJim Jagielski 		SCCOL nDestX = nDestCol;
3161*b1cdbd2cSJim Jagielski 		for (SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++)
3162*b1cdbd2cSJim Jagielski 		{
3163*b1cdbd2cSJim Jagielski 			aSrc.SetCol( nCol );
3164*b1cdbd2cSJim Jagielski 			aDest.SetCol( nDestX );
3165*b1cdbd2cSJim Jagielski 			ScBaseCell* pCell = GetCell( nCol, nRow );
3166*b1cdbd2cSJim Jagielski 			if (pCell)
3167*b1cdbd2cSJim Jagielski 			{
3168*b1cdbd2cSJim Jagielski                 pCell = pCell->CloneWithoutNote( *pDocument );
3169*b1cdbd2cSJim Jagielski 				if (pCell->GetCellType() == CELLTYPE_FORMULA)
3170*b1cdbd2cSJim Jagielski 				{
3171*b1cdbd2cSJim Jagielski 					((ScFormulaCell*)pCell)->UpdateReference( URM_COPY, aRange,
3172*b1cdbd2cSJim Jagielski 									((SCsCOL) nDestCol) - ((SCsCOL) nStartCol),
3173*b1cdbd2cSJim Jagielski 									((SCsROW) nDestRow) - ((SCsROW) nStartRow),
3174*b1cdbd2cSJim Jagielski 									((SCsTAB) nDestTab) - ((SCsTAB) nTab) );
3175*b1cdbd2cSJim Jagielski 					((ScFormulaCell*)pCell)->aPos = aDest;
3176*b1cdbd2cSJim Jagielski 				}
3177*b1cdbd2cSJim Jagielski 			}
3178*b1cdbd2cSJim Jagielski 			if (bThisTab)
3179*b1cdbd2cSJim Jagielski 			{
3180*b1cdbd2cSJim Jagielski 				PutCell( nDestX, nDestY, pCell );
3181*b1cdbd2cSJim Jagielski 				SetPattern( nDestX, nDestY, *GetPattern( nCol, nRow ), sal_True );
3182*b1cdbd2cSJim Jagielski 			}
3183*b1cdbd2cSJim Jagielski 			else
3184*b1cdbd2cSJim Jagielski 			{
3185*b1cdbd2cSJim Jagielski 				pDocument->PutCell( aDest, pCell );
3186*b1cdbd2cSJim Jagielski 				pDocument->SetPattern( aDest, *GetPattern( nCol, nRow ), sal_True );
3187*b1cdbd2cSJim Jagielski 			}
3188*b1cdbd2cSJim Jagielski 
3189*b1cdbd2cSJim Jagielski 			++nDestX;
3190*b1cdbd2cSJim Jagielski 		}
3191*b1cdbd2cSJim Jagielski 		++nDestY;
3192*b1cdbd2cSJim Jagielski 	}
3193*b1cdbd2cSJim Jagielski }
3194*b1cdbd2cSJim Jagielski 
3195*b1cdbd2cSJim Jagielski 
RefVisible(ScFormulaCell * pCell)3196*b1cdbd2cSJim Jagielski sal_Bool ScTable::RefVisible(ScFormulaCell* pCell)
3197*b1cdbd2cSJim Jagielski {
3198*b1cdbd2cSJim Jagielski 	ScRange aRef;
3199*b1cdbd2cSJim Jagielski 
3200*b1cdbd2cSJim Jagielski 	if (pCell->HasOneReference(aRef))
3201*b1cdbd2cSJim Jagielski 	{
3202*b1cdbd2cSJim Jagielski 		if (aRef.aStart.Col()==aRef.aEnd.Col() && aRef.aStart.Tab()==aRef.aEnd.Tab())
3203*b1cdbd2cSJim Jagielski 		{
3204*b1cdbd2cSJim Jagielski             SCROW nEndRow;
3205*b1cdbd2cSJim Jagielski             if (!RowFiltered(aRef.aStart.Row(), NULL, &nEndRow))
3206*b1cdbd2cSJim Jagielski                 // row not filtered.
3207*b1cdbd2cSJim Jagielski                 nEndRow = ::std::numeric_limits<SCROW>::max();
3208*b1cdbd2cSJim Jagielski 
3209*b1cdbd2cSJim Jagielski             if (!ValidRow(nEndRow) || nEndRow < aRef.aEnd.Row())
3210*b1cdbd2cSJim Jagielski                 return sal_True;    // at least partly visible
3211*b1cdbd2cSJim Jagielski             return sal_False;       // completely invisible
3212*b1cdbd2cSJim Jagielski 		}
3213*b1cdbd2cSJim Jagielski 	}
3214*b1cdbd2cSJim Jagielski 
3215*b1cdbd2cSJim Jagielski 	return sal_True;						// irgendwie anders
3216*b1cdbd2cSJim Jagielski }
3217*b1cdbd2cSJim Jagielski 
3218*b1cdbd2cSJim Jagielski 
GetUpperCellString(SCCOL nCol,SCROW nRow,String & rStr)3219*b1cdbd2cSJim Jagielski void ScTable::GetUpperCellString(SCCOL nCol, SCROW nRow, String& rStr)
3220*b1cdbd2cSJim Jagielski {
3221*b1cdbd2cSJim Jagielski 	GetInputString(nCol, nRow, rStr);
3222*b1cdbd2cSJim Jagielski 	rStr.EraseTrailingChars();
3223*b1cdbd2cSJim Jagielski 	rStr.EraseLeadingChars();
3224*b1cdbd2cSJim Jagielski 	ScGlobal::pCharClass->toUpper(rStr);
3225*b1cdbd2cSJim Jagielski }
3226*b1cdbd2cSJim Jagielski 
3227*b1cdbd2cSJim Jagielski 
3228*b1cdbd2cSJim Jagielski // Berechnen der Groesse der Tabelle und setzen der Groesse an der DrawPage
3229*b1cdbd2cSJim Jagielski 
SetDrawPageSize(bool bResetStreamValid,bool bUpdateNoteCaptionPos)3230*b1cdbd2cSJim Jagielski void ScTable::SetDrawPageSize(bool bResetStreamValid, bool bUpdateNoteCaptionPos)
3231*b1cdbd2cSJim Jagielski {
3232*b1cdbd2cSJim Jagielski 	ScDrawLayer* pDrawLayer = pDocument->GetDrawLayer();
3233*b1cdbd2cSJim Jagielski 	if( pDrawLayer )
3234*b1cdbd2cSJim Jagielski 	{
3235*b1cdbd2cSJim Jagielski         double fValX = GetColOffset( MAXCOL + 1 ) * HMM_PER_TWIPS;
3236*b1cdbd2cSJim Jagielski         double fValY = GetRowOffset( MAXROW + 1 ) * HMM_PER_TWIPS;
3237*b1cdbd2cSJim Jagielski         const long nMax = ::std::numeric_limits<long>::max();
3238*b1cdbd2cSJim Jagielski         // #i113884# Avoid int32 overflow with possible negative results than can cause bad effects.
3239*b1cdbd2cSJim Jagielski         // If the draw page size is smaller than all rows, only the bottom of the sheet is affected.
3240*b1cdbd2cSJim Jagielski         long x = ( fValX > (double)nMax ) ? nMax : (long) fValX;
3241*b1cdbd2cSJim Jagielski         long y = ( fValY > (double)nMax ) ? nMax : (long) fValY;
3242*b1cdbd2cSJim Jagielski 
3243*b1cdbd2cSJim Jagielski 		if ( IsLayoutRTL() )		// IsNegativePage
3244*b1cdbd2cSJim Jagielski 			x = -x;
3245*b1cdbd2cSJim Jagielski 
3246*b1cdbd2cSJim Jagielski 		pDrawLayer->SetPageSize( static_cast<sal_uInt16>(nTab), Size( x, y ), bUpdateNoteCaptionPos );
3247*b1cdbd2cSJim Jagielski 	}
3248*b1cdbd2cSJim Jagielski 
3249*b1cdbd2cSJim Jagielski     // #i102616# actions that modify the draw page size count as sheet modification
3250*b1cdbd2cSJim Jagielski     // (exception: InitDrawLayer)
3251*b1cdbd2cSJim Jagielski     if (bResetStreamValid && IsStreamValid())
3252*b1cdbd2cSJim Jagielski         SetStreamValid(sal_False);
3253*b1cdbd2cSJim Jagielski }
3254*b1cdbd2cSJim Jagielski 
3255*b1cdbd2cSJim Jagielski 
GetRowOffset(SCROW nRow) const3256*b1cdbd2cSJim Jagielski sal_uLong ScTable::GetRowOffset( SCROW nRow ) const
3257*b1cdbd2cSJim Jagielski {
3258*b1cdbd2cSJim Jagielski 	sal_uLong n = 0;
3259*b1cdbd2cSJim Jagielski     if ( mpHiddenRows && mpRowHeights )
3260*b1cdbd2cSJim Jagielski 	{
3261*b1cdbd2cSJim Jagielski         if (nRow == 0)
3262*b1cdbd2cSJim Jagielski             return 0;
3263*b1cdbd2cSJim Jagielski         else if (nRow == 1)
3264*b1cdbd2cSJim Jagielski             return GetRowHeight(0);
3265*b1cdbd2cSJim Jagielski 
3266*b1cdbd2cSJim Jagielski         n = GetTotalRowHeight(0, nRow-1);
3267*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
3268*b1cdbd2cSJim Jagielski         if (n == ::std::numeric_limits<unsigned long>::max())
3269*b1cdbd2cSJim Jagielski             DBG_ERRORFILE("ScTable::GetRowOffset: row heights overflow");
3270*b1cdbd2cSJim Jagielski #endif
3271*b1cdbd2cSJim Jagielski 	}
3272*b1cdbd2cSJim Jagielski 	else
3273*b1cdbd2cSJim Jagielski 	{
3274*b1cdbd2cSJim Jagielski 		DBG_ERROR("GetRowOffset: Daten fehlen");
3275*b1cdbd2cSJim Jagielski 	}
3276*b1cdbd2cSJim Jagielski 	return n;
3277*b1cdbd2cSJim Jagielski }
3278*b1cdbd2cSJim Jagielski 
GetRowForHeight(sal_uLong nHeight) const3279*b1cdbd2cSJim Jagielski SCROW ScTable::GetRowForHeight(sal_uLong nHeight) const
3280*b1cdbd2cSJim Jagielski {
3281*b1cdbd2cSJim Jagielski     sal_uInt32 nSum = 0;
3282*b1cdbd2cSJim Jagielski 
3283*b1cdbd2cSJim Jagielski     ScFlatBoolRowSegments::RangeData aData;
3284*b1cdbd2cSJim Jagielski     for (SCROW nRow = 0; nRow <= MAXROW; ++nRow)
3285*b1cdbd2cSJim Jagielski     {
3286*b1cdbd2cSJim Jagielski         if (!mpHiddenRows->getRangeData(nRow, aData))
3287*b1cdbd2cSJim Jagielski             break;
3288*b1cdbd2cSJim Jagielski 
3289*b1cdbd2cSJim Jagielski         if (aData.mbValue)
3290*b1cdbd2cSJim Jagielski         {
3291*b1cdbd2cSJim Jagielski             nRow = aData.mnRow2;
3292*b1cdbd2cSJim Jagielski             continue;
3293*b1cdbd2cSJim Jagielski         }
3294*b1cdbd2cSJim Jagielski 
3295*b1cdbd2cSJim Jagielski         sal_uInt32 nNew = mpRowHeights->getValue(nRow);
3296*b1cdbd2cSJim Jagielski         nSum += nNew;
3297*b1cdbd2cSJim Jagielski         if (nSum > nHeight)
3298*b1cdbd2cSJim Jagielski         {
3299*b1cdbd2cSJim Jagielski             return nRow < MAXROW ? nRow + 1 : MAXROW;
3300*b1cdbd2cSJim Jagielski         }
3301*b1cdbd2cSJim Jagielski     }
3302*b1cdbd2cSJim Jagielski     return -1;
3303*b1cdbd2cSJim Jagielski }
3304*b1cdbd2cSJim Jagielski 
3305*b1cdbd2cSJim Jagielski 
GetColOffset(SCCOL nCol) const3306*b1cdbd2cSJim Jagielski sal_uLong ScTable::GetColOffset( SCCOL nCol ) const
3307*b1cdbd2cSJim Jagielski {
3308*b1cdbd2cSJim Jagielski 	sal_uLong n = 0;
3309*b1cdbd2cSJim Jagielski 	if ( pColWidth )
3310*b1cdbd2cSJim Jagielski 	{
3311*b1cdbd2cSJim Jagielski 		SCCOL i;
3312*b1cdbd2cSJim Jagielski 		for( i = 0; i < nCol; i++ )
3313*b1cdbd2cSJim Jagielski             if (!ColHidden(i))
3314*b1cdbd2cSJim Jagielski 				n += pColWidth[i];
3315*b1cdbd2cSJim Jagielski 	}
3316*b1cdbd2cSJim Jagielski 	else
3317*b1cdbd2cSJim Jagielski 	{
3318*b1cdbd2cSJim Jagielski 		DBG_ERROR("GetColumnOffset: Daten fehlen");
3319*b1cdbd2cSJim Jagielski 	}
3320*b1cdbd2cSJim Jagielski 	return n;
3321*b1cdbd2cSJim Jagielski }
3322*b1cdbd2cSJim Jagielski 
GetColumnByIndex(sal_Int32 index)3323*b1cdbd2cSJim Jagielski ScColumn* ScTable::GetColumnByIndex(sal_Int32 index)
3324*b1cdbd2cSJim Jagielski {
3325*b1cdbd2cSJim Jagielski 	if( index <= MAXCOL && index >= 0 )
3326*b1cdbd2cSJim Jagielski 	{
3327*b1cdbd2cSJim Jagielski 		return &(aCol[index]);
3328*b1cdbd2cSJim Jagielski 	}
3329*b1cdbd2cSJim Jagielski 	return NULL;
3330*b1cdbd2cSJim Jagielski }
3331*b1cdbd2cSJim Jagielski 
3332