Update to m13
[ooovba.git] / applied_patches / 0175-sc-dbrange-dynamic-resize.diff
blobb8aa01fc6a53c3328b77a87b5feab353e82fa0d9
1 diff --git sc/inc/dbcolect.hxx sc/inc/dbcolect.hxx
2 index 13db55d..feeec81 100644
3 --- sc/inc/dbcolect.hxx
4 +++ sc/inc/dbcolect.hxx
5 @@ -95,6 +95,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 @@ -142,9 +143,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 fe8ebe1..b4844a1 100644
28 --- sc/inc/document.hxx
29 +++ sc/inc/document.hxx
30 @@ -844,7 +844,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 @@ -1350,6 +1350,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 TypedScStrCollection& rStrings, bool bFilter = false );
48 SC_DLLPUBLIC BOOL GetFilterEntriesArea( SCCOL nCol, SCROW nStartRow, SCROW nEndRow,
49 diff --git sc/inc/global.hxx sc/inc/global.hxx
50 index f94ed38..7d48689 100644
51 --- sc/inc/global.hxx
52 +++ sc/inc/global.hxx
53 @@ -831,6 +831,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 931e8ac..2378728 100644
64 --- sc/inc/table.hxx
65 +++ sc/inc/table.hxx
66 @@ -337,7 +337,7 @@ 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 );
75 diff --git sc/source/core/data/documen3.cxx sc/source/core/data/documen3.cxx
76 index 7ad994d..ec6c46c 100644
77 --- sc/source/core/data/documen3.cxx
78 +++ sc/source/core/data/documen3.cxx
79 @@ -1269,6 +1269,18 @@ BOOL ScDocument::HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol,
80 //return FALSE;
83 +void ScDocument::UpdateDynamicEndRow(ScDBData& rDBData) const
85 + SCCOL nCol1, nCol2;
86 + SCROW nRow1, nRow2;
87 + SCTAB nTab;
88 + rDBData.GetArea(nTab, nCol1, nRow1, nCol2, nRow2);
89 + SCCOL nCol1a = nCol1, nCol2a = nCol2;
90 + SCROW nRow1a = nRow1, nRow2a = nRow2;
91 + GetDataArea(nTab, nCol1a, nRow1a, nCol2a, nRow2a, false);
92 + rDBData.SetDynamicEndRow(nRow2a);
96 // GetFilterEntries - Eintraege fuer AutoFilter-Listbox
98 @@ -1280,6 +1292,7 @@ BOOL ScDocument::GetFilterEntries( SCCOL nCol, SCROW nRow, SCTAB nTab, TypedScSt
99 ScDBData* pDBData = pDBCollection->GetDBAtCursor(nCol, nRow, nTab, FALSE); //!??
100 if (pDBData)
102 + UpdateDynamicEndRow(*pDBData);
103 SCTAB nAreaTab;
104 SCCOL nStartCol;
105 SCROW nStartRow;
106 @@ -1291,6 +1304,7 @@ BOOL ScDocument::GetFilterEntries( SCCOL nCol, SCROW nRow, SCTAB nTab, TypedScSt
108 ScQueryParam aParam;
109 pDBData->GetQueryParam( aParam );
110 + nEndRow = aParam.nDynamicEndRow;
111 rStrings.SetCaseSensitive( aParam.bCaseSens );
113 // return all filter entries, if a filter condition is connected with a boolean OR
114 diff --git sc/source/core/data/document.cxx sc/source/core/data/document.cxx
115 index fa98376..5844fa0 100644
116 --- sc/source/core/data/document.cxx
117 +++ sc/source/core/data/document.cxx
118 @@ -598,7 +598,7 @@ BOOL ScDocument::GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) cons
119 // zusammenhaengender Bereich
121 void ScDocument::GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow,
122 - SCCOL& rEndCol, SCROW& rEndRow, BOOL bIncludeOld )
123 + SCCOL& rEndCol, SCROW& rEndRow, BOOL bIncludeOld ) const
125 if (VALIDTAB(nTab))
126 if (pTab[nTab])
127 diff --git sc/source/core/data/global2.cxx sc/source/core/data/global2.cxx
128 index 6d3169f..58b43e2 100644
129 --- sc/source/core/data/global2.cxx
130 +++ sc/source/core/data/global2.cxx
131 @@ -256,7 +256,8 @@ ScQueryParam::ScQueryParam( const ScQueryParam& r ) :
132 bHasHeader(r.bHasHeader), bByRow(r.bByRow), bInplace(r.bInplace), bCaseSens(r.bCaseSens),
133 bRegExp(r.bRegExp), bMixedComparison(r.bMixedComparison),
134 bDuplicate(r.bDuplicate), bDestPers(r.bDestPers),
135 - nDestTab(r.nDestTab), nDestCol(r.nDestCol), nDestRow(r.nDestRow)
136 + nDestTab(r.nDestTab), nDestCol(r.nDestCol), nDestRow(r.nDestRow),
137 + nDynamicEndRow(r.nDynamicEndRow), bUseDynamicRange(r.bUseDynamicRange)
139 nEntryCount = 0;
141 @@ -282,6 +283,8 @@ void ScQueryParam::Clear()
142 nTab = SCTAB_MAX;
143 bHasHeader = bCaseSens = bRegExp = bMixedComparison = FALSE;
144 bInplace = bByRow = bDuplicate = bDestPers = TRUE;
145 + nDynamicEndRow = 0;
146 + bUseDynamicRange = false;
148 Resize( MAXQUERY );
149 for (USHORT i=0; i<MAXQUERY; i++)
150 @@ -308,6 +311,8 @@ ScQueryParam& ScQueryParam::operator=( const ScQueryParam& r )
151 bDuplicate = r.bDuplicate;
152 bByRow = r.bByRow;
153 bDestPers = r.bDestPers;
154 + nDynamicEndRow = r.nDynamicEndRow;
155 + bUseDynamicRange = r.bUseDynamicRange;
157 Resize( r.nEntryCount );
158 for (USHORT i=0; i<nEntryCount; i++)
159 @@ -345,7 +350,9 @@ BOOL ScQueryParam::operator==( const ScQueryParam& rOther ) const
160 && (bDestPers == rOther.bDestPers)
161 && (nDestTab == rOther.nDestTab)
162 && (nDestCol == rOther.nDestCol)
163 - && (nDestRow == rOther.nDestRow) )
164 + && (nDestRow == rOther.nDestRow)
165 + && (nDynamicEndRow == rOther.nDynamicEndRow)
166 + && (bUseDynamicRange == rOther.bUseDynamicRange) )
168 bEqual = TRUE;
169 for ( USHORT i=0; i<nUsed && bEqual; i++ )
170 @@ -407,6 +414,7 @@ void ScQueryParam::MoveToDest()
171 nCol2 = sal::static_int_cast<SCCOL>( nCol2 + nDifX );
172 nRow2 = sal::static_int_cast<SCROW>( nRow2 + nDifY );
173 nTab = sal::static_int_cast<SCTAB>( nTab + nDifZ );
174 + nDynamicEndRow = sal::static_int_cast<SCROW>( nDynamicEndRow + nDifY );
175 for (USHORT i=0; i<nEntryCount; i++)
176 pEntries[i].nField += nDifX;
178 diff --git sc/source/core/data/table1.cxx sc/source/core/data/table1.cxx
179 index c831b0b..92442ff 100644
180 --- sc/source/core/data/table1.cxx
181 +++ sc/source/core/data/table1.cxx
182 @@ -664,7 +664,7 @@ BOOL ScTable::GetDataStart( SCCOL& rStartCol, SCROW& rStartRow ) const
185 void ScTable::GetDataArea( SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow,
186 - BOOL bIncludeOld )
187 + BOOL bIncludeOld ) const
189 BOOL bLeft = FALSE;
190 BOOL bRight = FALSE;
191 diff --git sc/source/core/data/table3.cxx sc/source/core/data/table3.cxx
192 index f840689..f17fcef 100644
193 --- sc/source/core/data/table3.cxx
194 +++ sc/source/core/data/table3.cxx
195 @@ -1558,6 +1558,7 @@ SCSIZE ScTable::Query(ScQueryParam& rParamOrg, BOOL bKeepSub)
196 BOOL* pSpecial = new BOOL[nEntryCount];
197 lcl_PrepareQuery( pDocument, this, aParam, pSpecial );
199 + SCROW nEndRow = aParam.bUseDynamicRange ? aParam.nDynamicEndRow : aParam.nRow2;
200 if (!aParam.bInplace)
202 nOutRow = aParam.nDestRow + nHeader;
203 @@ -1566,7 +1567,7 @@ SCSIZE ScTable::Query(ScQueryParam& rParamOrg, BOOL bKeepSub)
204 aParam.nDestCol, aParam.nDestRow, aParam.nDestTab );
207 - for (SCROW j=aParam.nRow1 + nHeader; j<=aParam.nRow2; j++)
208 + for (SCROW j=aParam.nRow1 + nHeader; j<=nEndRow; j++)
210 BOOL bResult; // Filterergebnis
211 BOOL bValid = ValidQuery(j, aParam, pSpecial);
212 diff --git sc/source/core/tool/dbcolect.cxx sc/source/core/tool/dbcolect.cxx
213 index 74fae17..419e7e8 100644
214 --- sc/source/core/tool/dbcolect.cxx
215 +++ sc/source/core/tool/dbcolect.cxx
216 @@ -378,18 +378,20 @@ String ScDBData::GetOperations() const
217 return aVal;
220 -void ScDBData::GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2) const
221 +void ScDBData::GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2,
222 + bool bUseDynamicRange) const
224 rTab = nTable;
225 rCol1 = nStartCol;
226 rRow1 = nStartRow;
227 rCol2 = nEndCol;
228 - rRow2 = nEndRow;
229 + rRow2 = bUseDynamicRange ? nDynamicEndRow : nEndRow;
232 -void ScDBData::GetArea(ScRange& rRange) const
233 +void ScDBData::GetArea(ScRange& rRange, bool bUseDynamicRange) const
235 - rRange = ScRange( nStartCol,nStartRow,nTable, nEndCol,nEndRow,nTable );
236 + SCROW nNewEndRow = bUseDynamicRange ? nDynamicEndRow : nEndRow;
237 + rRange = ScRange( nStartCol, nStartRow, nTable, nEndCol, nNewEndRow, nTable );
240 void ScDBData::SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
241 @@ -401,6 +403,11 @@ void ScDBData::SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW
242 nEndRow = nRow2;
245 +void ScDBData::SetDynamicEndRow(SCROW nRow)
247 + nDynamicEndRow = nRow;
250 void ScDBData::MoveTo(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
252 USHORT i;
253 @@ -508,6 +515,7 @@ void ScDBData::GetQueryParam( ScQueryParam& rQueryParam ) const
254 rQueryParam.nDestTab = nQueryDestTab;
255 rQueryParam.nDestCol = nQueryDestCol;
256 rQueryParam.nDestRow = nQueryDestRow;
257 + rQueryParam.nDynamicEndRow = nDynamicEndRow;
259 rQueryParam.Resize( MAXQUERY );
260 for (SCSIZE i=0; i<MAXQUERY; i++)
261 diff --git sc/source/ui/dbgui/filtdlg.cxx sc/source/ui/dbgui/filtdlg.cxx
262 index 2654ef9..dc4fb13 100644
263 --- sc/source/ui/dbgui/filtdlg.cxx
264 +++ sc/source/ui/dbgui/filtdlg.cxx
265 @@ -390,7 +390,7 @@ void ScFilterDlg::UpdateValueList( USHORT nList )
267 SCTAB nTab = nSrcTab;
268 SCROW nFirstRow = theQueryData.nRow1;
269 - SCROW nLastRow = theQueryData.nRow2;
270 + SCROW nLastRow = theQueryData.bUseDynamicRange ? theQueryData.nDynamicEndRow : theQueryData.nRow2;
272 // erstmal ohne die erste Zeile
274 diff --git sc/source/ui/inc/dbfunc.hxx sc/source/ui/inc/dbfunc.hxx
275 index cb4797c..8556472 100644
276 --- sc/source/ui/inc/dbfunc.hxx
277 +++ sc/source/ui/inc/dbfunc.hxx
278 @@ -80,7 +80,7 @@ public:
279 void GotoDBArea( const String& rDBName );
281 // DB-Bereich vom Cursor
282 - ScDBData* GetDBData( BOOL bMarkArea = TRUE, ScGetDBMode eMode = SC_DB_MAKE );
283 + ScDBData* GetDBData( bool bMarkArea = true, ScGetDBMode eMode = SC_DB_MAKE, bool bExpandRows = false );
285 void NotifyCloseDbNameDlg( const ScDBCollection& rNewColl, const List& rDelAreaList );
287 diff --git sc/source/ui/view/dbfunc.cxx sc/source/ui/view/dbfunc.cxx
288 index ee42e57..3bb5742 100644
289 --- sc/source/ui/view/dbfunc.cxx
290 +++ sc/source/ui/view/dbfunc.cxx
291 @@ -107,7 +107,7 @@ void ScDBFunc::GotoDBArea( const String& rDBName )
293 // aktuellen Datenbereich fuer Sortieren / Filtern suchen
295 -ScDBData* ScDBFunc::GetDBData( BOOL bMark, ScGetDBMode eMode )
296 +ScDBData* ScDBFunc::GetDBData( bool bMark, ScGetDBMode eMode, bool bExpandRows )
298 ScDocShell* pDocSh = GetViewData()->GetDocShell();
299 ScDBData* pData = NULL;
300 @@ -119,11 +119,20 @@ ScDBData* ScDBFunc::GetDBData( BOOL bMark, ScGetDBMode eMode )
301 ScRange( GetViewData()->GetCurX(), GetViewData()->GetCurY(),
302 GetViewData()->GetTabNo() ),
303 eMode, FALSE );
304 + if (!pData)
305 + return NULL;
307 - if ( pData && bMark )
308 + if (bExpandRows)
310 + // Dynamically expand rows to include any new data rows that are
311 + // immediately below the original range.
312 + GetViewData()->GetDocument()->UpdateDynamicEndRow(*pData);
315 + if (bMark)
317 ScRange aFound;
318 - pData->GetArea(aFound);
319 + pData->GetArea(aFound, bExpandRows);
320 MarkRange( aFound, FALSE );
322 return pData;
323 diff --git sc/source/ui/view/gridwin.cxx sc/source/ui/view/gridwin.cxx
324 index 0dd7b47..63a1785 100644
325 --- sc/source/ui/view/gridwin.cxx
326 +++ sc/source/ui/view/gridwin.cxx
327 @@ -1235,6 +1235,7 @@ void ScGridWindow::ExecFilter( ULONG nSel,
328 pViewData->GetViewShell()->UpdateInputHandler();
331 + aParam.bUseDynamicRange = true;
332 pViewData->GetView()->Query( aParam, NULL, TRUE );
333 pDBData->SetQueryParam( aParam ); // speichern
335 diff --git sc/source/ui/view/tabvwshc.cxx sc/source/ui/view/tabvwshc.cxx
336 index 9c17453..aa38b7a 100644
337 --- sc/source/ui/view/tabvwshc.cxx
338 +++ sc/source/ui/view/tabvwshc.cxx
339 @@ -178,8 +178,9 @@ SfxModelessDialog* ScTabViewShell::CreateRefDialog(
340 SCITEM_QUERYDATA,
341 SCITEM_QUERYDATA );
343 - ScDBData* pDBData = GetDBData();
344 + ScDBData* pDBData = GetDBData(true, SC_DB_MAKE, true);
345 pDBData->GetQueryParam( aQueryParam );
346 + aQueryParam.bUseDynamicRange = true;
348 ScQueryItem aItem( SCITEM_QUERYDATA, GetViewData(), &aQueryParam );
349 ScRange aAdvSource;
350 @@ -203,8 +204,9 @@ SfxModelessDialog* ScTabViewShell::CreateRefDialog(
351 SCITEM_QUERYDATA,
352 SCITEM_QUERYDATA );
354 - ScDBData* pDBData = GetDBData();
355 + ScDBData* pDBData = GetDBData(true, SC_DB_MAKE, true);
356 pDBData->GetQueryParam( aQueryParam );
357 + aQueryParam.bUseDynamicRange = true;
359 aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA,
360 GetViewData(),