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