update ooo310-m15
[ooovba.git] / applied_patches / 0174-sc-dbrange-dynamic-resize.diff
blob8614030597ed348721472266129f4281f5f11120
1 diff --git sc/inc/dbcolect.hxx sc/inc/dbcolect.hxx
2 index 73b4c3e..021a1e0 100644
3 --- sc/inc/dbcolect.hxx
4 +++ sc/inc/dbcolect.hxx
5 @@ -96,6 +96,7 @@ private:
6 ScQueryConnect eQueryConnect[MAXQUERY];
7 BOOL bIsAdvanced; // TRUE if created by advanced filter
8 ScRange aAdvSource; // source range
9 + SCROW nDynamicEndRow;
10 // SubTotalParam
11 BOOL bSubRemoveOnly;
12 BOOL bSubReplace;
13 @@ -143,9 +144,10 @@ public:
14 const String& GetName() const { return aName; }
15 void GetName(String& rName) const { rName = aName; }
16 void SetName(const String& rName) { aName = rName; }
17 - void GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2) const;
18 - SC_DLLPUBLIC void GetArea(ScRange& rRange) const;
19 + void GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2, bool bUseDynamicRange = false) const;
20 + SC_DLLPUBLIC void GetArea(ScRange& rRange, bool bUseDynamicRange = false) const;
21 void SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
22 + void SetDynamicEndRow(SCROW nRow);
23 void MoveTo(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
24 BOOL IsByRow() const { return bByRow; }
25 void SetByRow(BOOL bByR) { bByRow = bByR; }
26 diff --git sc/inc/document.hxx sc/inc/document.hxx
27 index 3675b1b..14c1ddc 100644
28 --- sc/inc/document.hxx
29 +++ sc/inc/document.hxx
30 @@ -858,7 +858,7 @@ public:
31 USHORT GetErrCode( const ScAddress& ) const;
33 void GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow,
34 - SCCOL& rEndCol, SCROW& rEndRow, BOOL bIncludeOld );
35 + SCCOL& rEndCol, SCROW& rEndRow, BOOL bIncludeOld ) const;
36 SC_DLLPUBLIC BOOL GetCellArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const;
37 SC_DLLPUBLIC BOOL GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const;
38 SC_DLLPUBLIC BOOL GetPrintArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow,
39 @@ -1377,6 +1377,9 @@ public:
40 SCTAB nTab, ScQueryParam& rQueryParam );
41 void GetUpperCellString(SCCOL nCol, SCROW nRow, SCTAB nTab, String& rStr);
43 + /** Update the dynamic end row position of a current data area. */
44 + void UpdateDynamicEndRow(ScDBData& rDBData) const;
46 BOOL GetFilterEntries( SCCOL nCol, SCROW nRow, SCTAB nTab,
47 bool bFilter, TypedScStrCollection& rStrings, bool& rHasDates);
48 SC_DLLPUBLIC BOOL GetFilterEntriesArea( SCCOL nCol, SCROW nStartRow, SCROW nEndRow,
49 diff --git sc/inc/global.hxx sc/inc/global.hxx
50 index 4892a3e..05fbc13 100644
51 --- sc/inc/global.hxx
52 +++ sc/inc/global.hxx
53 @@ -837,6 +837,8 @@ struct SC_DLLPUBLIC ScQueryParam
54 SCTAB nDestTab;
55 SCCOL nDestCol;
56 SCROW nDestRow;
57 + SCROW nDynamicEndRow;
58 + bool bUseDynamicRange;
60 private:
61 SCSIZE nEntryCount;
62 diff --git sc/inc/table.hxx sc/inc/table.hxx
63 index 2b4017b..d754363 100644
64 --- sc/inc/table.hxx
65 +++ sc/inc/table.hxx
66 @@ -347,11 +347,10 @@ public:
67 SCCOL nStartCol, SCROW nStartRow, SCCOL& rEndCol, SCROW nEndRow );
69 void GetDataArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow,
70 - BOOL bIncludeOld );
71 + BOOL bIncludeOld ) const;
73 SCSIZE GetEmptyLinesInBlock( SCCOL nStartCol, SCROW nStartRow,
74 SCCOL nEndCol, SCROW nEndRow, ScDirection eDir );
76 void FindAreaPos( SCCOL& rCol, SCROW& rRow, SCsCOL nMovX, SCsROW nMovY );
77 void GetNextPos( SCCOL& rCol, SCROW& rRow, SCsCOL nMovX, SCsROW nMovY,
78 BOOL bMarked, BOOL bUnprotected, const ScMarkData& rMark );
79 diff --git sc/source/core/data/documen3.cxx sc/source/core/data/documen3.cxx
80 index 5db1f9a..411d542 100644
81 --- sc/source/core/data/documen3.cxx
82 +++ sc/source/core/data/documen3.cxx
83 @@ -1290,14 +1290,24 @@ BOOL ScDocument::HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol,
84 //if (VALIDTAB(nTab))
85 // if (pTab[nTab])
86 // return pTab[nTab]->HasRowHeader( nStartCol, nStartRow, nEndCol, nEndRow );
88 //return FALSE;
91 +void ScDocument::UpdateDynamicEndRow(ScDBData& rDBData) const
93 + SCCOL nCol1, nCol2;
94 + SCROW nRow1, nRow2;
95 + SCTAB nTab;
96 + rDBData.GetArea(nTab, nCol1, nRow1, nCol2, nRow2);
97 + SCCOL nCol1a = nCol1, nCol2a = nCol2;
98 + SCROW nRow1a = nRow1, nRow2a = nRow2;
99 + GetDataArea(nTab, nCol1a, nRow1a, nCol2a, nRow2a, false);
100 + rDBData.SetDynamicEndRow(nRow2a);
104 // GetFilterEntries - Eintraege fuer AutoFilter-Listbox
107 BOOL ScDocument::GetFilterEntries(
108 SCCOL nCol, SCROW nRow, SCTAB nTab, bool bFilter, TypedScStrCollection& rStrings, bool& rHasDates)
110 @@ -1306,6 +1316,7 @@ BOOL ScDocument::GetFilterEntries(
111 ScDBData* pDBData = pDBCollection->GetDBAtCursor(nCol, nRow, nTab, FALSE); //!??
112 if (pDBData)
114 + UpdateDynamicEndRow(*pDBData);
115 SCTAB nAreaTab;
116 SCCOL nStartCol;
117 SCROW nStartRow;
118 @@ -1317,6 +1328,7 @@ BOOL ScDocument::GetFilterEntries(
120 ScQueryParam aParam;
121 pDBData->GetQueryParam( aParam );
122 + nEndRow = aParam.nDynamicEndRow;
123 rStrings.SetCaseSensitive( aParam.bCaseSens );
125 // return all filter entries, if a filter condition is connected with a boolean OR
126 diff --git sc/source/core/data/document.cxx sc/source/core/data/document.cxx
127 index d08a3c0..f43ec20 100644
128 --- sc/source/core/data/document.cxx
129 +++ sc/source/core/data/document.cxx
130 @@ -601,7 +601,7 @@ BOOL ScDocument::GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) cons
131 // zusammenhaengender Bereich
133 void ScDocument::GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow,
134 - SCCOL& rEndCol, SCROW& rEndRow, BOOL bIncludeOld )
135 + SCCOL& rEndCol, SCROW& rEndRow, BOOL bIncludeOld ) const
137 if (VALIDTAB(nTab))
138 if (pTab[nTab])
139 diff --git sc/source/core/data/global2.cxx sc/source/core/data/global2.cxx
140 index 3b0d0f6..43740e8 100644
141 --- sc/source/core/data/global2.cxx
142 +++ sc/source/core/data/global2.cxx
143 @@ -261,7 +261,8 @@ ScQueryParam::ScQueryParam( const ScQueryParam& r ) :
144 bHasHeader(r.bHasHeader), bByRow(r.bByRow), bInplace(r.bInplace), bCaseSens(r.bCaseSens),
145 bRegExp(r.bRegExp), bMixedComparison(r.bMixedComparison),
146 bDuplicate(r.bDuplicate), bDestPers(r.bDestPers),
147 - nDestTab(r.nDestTab), nDestCol(r.nDestCol), nDestRow(r.nDestRow)
148 + nDestTab(r.nDestTab), nDestCol(r.nDestCol), nDestRow(r.nDestRow),
149 + nDynamicEndRow(r.nDynamicEndRow), bUseDynamicRange(r.bUseDynamicRange)
151 nEntryCount = 0;
153 @@ -287,6 +288,8 @@ void ScQueryParam::Clear()
154 nTab = SCTAB_MAX;
155 bHasHeader = bCaseSens = bRegExp = bMixedComparison = FALSE;
156 bInplace = bByRow = bDuplicate = bDestPers = TRUE;
157 + nDynamicEndRow = 0;
158 + bUseDynamicRange = false;
160 Resize( MAXQUERY );
161 for (USHORT i=0; i<MAXQUERY; i++)
162 @@ -313,6 +316,8 @@ ScQueryParam& ScQueryParam::operator=( const ScQueryParam& r )
163 bDuplicate = r.bDuplicate;
164 bByRow = r.bByRow;
165 bDestPers = r.bDestPers;
166 + nDynamicEndRow = r.nDynamicEndRow;
167 + bUseDynamicRange = r.bUseDynamicRange;
169 Resize( r.nEntryCount );
170 for (USHORT i=0; i<nEntryCount; i++)
171 @@ -350,7 +355,9 @@ BOOL ScQueryParam::operator==( const ScQueryParam& rOther ) const
172 && (bDestPers == rOther.bDestPers)
173 && (nDestTab == rOther.nDestTab)
174 && (nDestCol == rOther.nDestCol)
175 - && (nDestRow == rOther.nDestRow) )
176 + && (nDestRow == rOther.nDestRow)
177 + && (nDynamicEndRow == rOther.nDynamicEndRow)
178 + && (bUseDynamicRange == rOther.bUseDynamicRange) )
180 bEqual = TRUE;
181 for ( USHORT i=0; i<nUsed && bEqual; i++ )
182 @@ -412,6 +419,7 @@ void ScQueryParam::MoveToDest()
183 nCol2 = sal::static_int_cast<SCCOL>( nCol2 + nDifX );
184 nRow2 = sal::static_int_cast<SCROW>( nRow2 + nDifY );
185 nTab = sal::static_int_cast<SCTAB>( nTab + nDifZ );
186 + nDynamicEndRow = sal::static_int_cast<SCROW>( nDynamicEndRow + nDifY );
187 for (USHORT i=0; i<nEntryCount; i++)
188 pEntries[i].nField += nDifX;
190 diff --git sc/source/core/data/table1.cxx sc/source/core/data/table1.cxx
191 index fa6efb6..e0c3ff2 100644
192 --- sc/source/core/data/table1.cxx
193 +++ sc/source/core/data/table1.cxx
194 @@ -664,7 +664,7 @@ BOOL ScTable::GetDataStart( SCCOL& rStartCol, SCROW& rStartRow ) const
197 void ScTable::GetDataArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow,
198 - BOOL bIncludeOld )
199 + BOOL bIncludeOld ) const
201 BOOL bLeft = FALSE;
202 BOOL bRight = FALSE;
203 diff --git sc/source/core/data/table3.cxx sc/source/core/data/table3.cxx
204 index fc5a6da..6f41234 100644
205 --- sc/source/core/data/table3.cxx
206 +++ sc/source/core/data/table3.cxx
207 @@ -1574,6 +1574,7 @@ SCSIZE ScTable::Query(ScQueryParam& rParamOrg, BOOL bKeepSub)
208 BOOL* pSpecial = new BOOL[nEntryCount];
209 lcl_PrepareQuery( pDocument, this, aParam, pSpecial );
211 + SCROW nEndRow = aParam.bUseDynamicRange ? aParam.nDynamicEndRow : aParam.nRow2;
212 if (!aParam.bInplace)
214 nOutRow = aParam.nDestRow + nHeader;
215 @@ -1582,7 +1583,7 @@ SCSIZE ScTable::Query(ScQueryParam& rParamOrg, BOOL bKeepSub)
216 aParam.nDestCol, aParam.nDestRow, aParam.nDestTab );
219 - for (SCROW j=aParam.nRow1 + nHeader; j<=aParam.nRow2; j++)
220 + for (SCROW j=aParam.nRow1 + nHeader; j<=nEndRow; j++)
222 BOOL bResult; // Filterergebnis
223 BOOL bValid = ValidQuery(j, aParam, pSpecial);
224 diff --git sc/source/core/tool/dbcolect.cxx sc/source/core/tool/dbcolect.cxx
225 index 1304c49..2627d87 100644
226 --- sc/source/core/tool/dbcolect.cxx
227 +++ sc/source/core/tool/dbcolect.cxx
228 @@ -380,18 +380,20 @@ String ScDBData::GetOperations() const
229 return aVal;
232 -void ScDBData::GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2) const
233 +void ScDBData::GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2,
234 + bool bUseDynamicRange) const
236 rTab = nTable;
237 rCol1 = nStartCol;
238 rRow1 = nStartRow;
239 rCol2 = nEndCol;
240 - rRow2 = nEndRow;
241 + rRow2 = bUseDynamicRange ? nDynamicEndRow : nEndRow;
244 -void ScDBData::GetArea(ScRange& rRange) const
245 +void ScDBData::GetArea(ScRange& rRange, bool bUseDynamicRange) const
247 - rRange = ScRange( nStartCol,nStartRow,nTable, nEndCol,nEndRow,nTable );
248 + SCROW nNewEndRow = bUseDynamicRange ? nDynamicEndRow : nEndRow;
249 + rRange = ScRange( nStartCol, nStartRow, nTable, nEndCol, nNewEndRow, nTable );
252 void ScDBData::SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
253 @@ -403,6 +405,11 @@ void ScDBData::SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW
254 nEndRow = nRow2;
257 +void ScDBData::SetDynamicEndRow(SCROW nRow)
259 + nDynamicEndRow = nRow;
262 void ScDBData::MoveTo(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
264 USHORT i;
265 @@ -510,6 +517,7 @@ void ScDBData::GetQueryParam( ScQueryParam& rQueryParam ) const
266 rQueryParam.nDestTab = nQueryDestTab;
267 rQueryParam.nDestCol = nQueryDestCol;
268 rQueryParam.nDestRow = nQueryDestRow;
269 + rQueryParam.nDynamicEndRow = nDynamicEndRow;
271 rQueryParam.Resize( MAXQUERY );
272 for (SCSIZE i=0; i<MAXQUERY; i++)
273 diff --git sc/source/ui/dbgui/filtdlg.cxx sc/source/ui/dbgui/filtdlg.cxx
274 index 846cbad..369785e 100644
275 --- sc/source/ui/dbgui/filtdlg.cxx
276 +++ sc/source/ui/dbgui/filtdlg.cxx
277 @@ -390,7 +390,7 @@ void ScFilterDlg::UpdateValueList( USHORT nList )
279 SCTAB nTab = nSrcTab;
280 SCROW nFirstRow = theQueryData.nRow1;
281 - SCROW nLastRow = theQueryData.nRow2;
282 + SCROW nLastRow = theQueryData.bUseDynamicRange ? theQueryData.nDynamicEndRow : theQueryData.nRow2;
283 mbHasDates[nList-1] = false;
285 // erstmal ohne die erste Zeile
286 diff --git sc/source/ui/inc/dbfunc.hxx sc/source/ui/inc/dbfunc.hxx
287 index 814fc5f..f5e9ae4 100644
288 --- sc/source/ui/inc/dbfunc.hxx
289 +++ sc/source/ui/inc/dbfunc.hxx
290 @@ -80,7 +80,7 @@ public:
291 void GotoDBArea( const String& rDBName );
293 // DB-Bereich vom Cursor
294 - ScDBData* GetDBData( BOOL bMarkArea = TRUE, ScGetDBMode eMode = SC_DB_MAKE );
295 + ScDBData* GetDBData( bool bMarkArea = true, ScGetDBMode eMode = SC_DB_MAKE, bool bExpandRows = false );
297 void NotifyCloseDbNameDlg( const ScDBCollection& rNewColl, const List& rDelAreaList );
299 diff --git sc/source/ui/view/dbfunc.cxx sc/source/ui/view/dbfunc.cxx
300 index ed25c8e..9a96e42 100644
301 --- sc/source/ui/view/dbfunc.cxx
302 +++ sc/source/ui/view/dbfunc.cxx
303 @@ -105,9 +105,10 @@ void ScDBFunc::GotoDBArea( const String& rDBName )
308 // aktuellen Datenbereich fuer Sortieren / Filtern suchen
310 -ScDBData* ScDBFunc::GetDBData( BOOL bMark, ScGetDBMode eMode )
311 +ScDBData* ScDBFunc::GetDBData( bool bMark, ScGetDBMode eMode, bool bExpandRows )
313 ScDocShell* pDocSh = GetViewData()->GetDocShell();
314 ScDBData* pData = NULL;
315 @@ -119,11 +120,20 @@ ScDBData* ScDBFunc::GetDBData( BOOL bMark, ScGetDBMode eMode )
316 ScRange( GetViewData()->GetCurX(), GetViewData()->GetCurY(),
317 GetViewData()->GetTabNo() ),
318 eMode, FALSE );
319 + if (!pData)
320 + return NULL;
322 + if (bExpandRows)
324 + // Dynamically expand rows to include any new data rows that are
325 + // immediately below the original range.
326 + GetViewData()->GetDocument()->UpdateDynamicEndRow(*pData);
329 - if ( pData && bMark )
330 + if (bMark)
332 ScRange aFound;
333 - pData->GetArea(aFound);
334 + pData->GetArea(aFound, bExpandRows);
335 MarkRange( aFound, FALSE );
337 return pData;
338 diff --git sc/source/ui/view/gridwin.cxx sc/source/ui/view/gridwin.cxx
339 index 439f98d..b56189d 100644
340 --- sc/source/ui/view/gridwin.cxx
341 +++ sc/source/ui/view/gridwin.cxx
342 @@ -1198,6 +1198,7 @@ void ScGridWindow::ExecFilter( ULONG nSel,
343 pViewData->GetViewShell()->UpdateInputHandler();
346 + aParam.bUseDynamicRange = true;
347 pViewData->GetView()->Query( aParam, NULL, TRUE );
348 pDBData->SetQueryParam( aParam ); // speichern
350 diff --git sc/source/ui/view/tabvwshc.cxx sc/source/ui/view/tabvwshc.cxx
351 index 5e61e4e..0312ded 100644
352 --- sc/source/ui/view/tabvwshc.cxx
353 +++ sc/source/ui/view/tabvwshc.cxx
354 @@ -178,8 +178,9 @@ SfxModelessDialog* ScTabViewShell::CreateRefDialog(
355 SCITEM_QUERYDATA,
356 SCITEM_QUERYDATA );
358 - ScDBData* pDBData = GetDBData();
359 + ScDBData* pDBData = GetDBData(true, SC_DB_MAKE, true);
360 pDBData->GetQueryParam( aQueryParam );
361 + aQueryParam.bUseDynamicRange = true;
363 ScQueryItem aItem( SCITEM_QUERYDATA, GetViewData(), &aQueryParam );
364 ScRange aAdvSource;
365 @@ -203,8 +204,9 @@ SfxModelessDialog* ScTabViewShell::CreateRefDialog(
366 SCITEM_QUERYDATA,
367 SCITEM_QUERYDATA );
369 - ScDBData* pDBData = GetDBData();
370 + ScDBData* pDBData = GetDBData(true, SC_DB_MAKE, true);
371 pDBData->GetQueryParam( aQueryParam );
372 + aQueryParam.bUseDynamicRange = true;
374 aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA,
375 GetViewData(),