[Libreoffice-commits] core.git: sc/inc sc/source
Eike Rathke
erack at redhat.com
Fri Dec 5 12:40:52 PST 2014
sc/inc/document.hxx | 6 +++++-
sc/inc/table.hxx | 6 +++++-
sc/source/core/data/documen3.cxx | 2 +-
sc/source/core/data/table3.cxx | 23 ++++++++++++-----------
sc/source/ui/docshell/dbdocfun.cxx | 1 +
5 files changed, 24 insertions(+), 14 deletions(-)
New commits:
commit 9a568c41ccd1ccf6073758973da5914a44f629d2
Author: Eike Rathke <erack at redhat.com>
Date: Fri Dec 5 21:32:06 2014 +0100
Ctrl+A and Data Sort took ages to broadcast ALL cells
... now that also empty cells are to be broadcasted.
Set dirty and broadcast only the effective data range as determined by Sort.
This is more a workaround, a cleaner solution would be to refactor the
SetDirty() algorithm to iterate only through broadcasters and use
AreaBroadcast() to notify area listeners.
However, this can also be easily backported to 4-3.
Change-Id: I6d68ca0088cec6a8328a3e93364ac928ef69babe
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 41e1093..c135508 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1683,8 +1683,12 @@ public:
SC_DLLPUBLIC SvNumberFormatter* GetFormatTable() const;
SC_DLLPUBLIC SvNumberFormatter* CreateFormatTable() const;
+ /** Sort a range of data.
+ @param rSortParam may get adjusted to the actual range used if it did
+ encompass leading or trailing empty blocks
+ */
void Sort(
- SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
+ SCTAB nTab, ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
ScProgress* pProgress, sc::ReorderParam* pUndo );
void Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress );
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index ba5529d..73c453e 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -834,8 +834,12 @@ public:
void StripHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 );
void ExtendHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 );
+ /** Sort a range of data.
+ @param rSortParam may get adjusted to the actual range used if it did
+ encompass leading or trailing empty blocks
+ */
void Sort(
- const ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
+ ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
ScProgress* pProgress, sc::ReorderParam* pUndo );
void Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress );
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index b0b0d82..f35d941 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -1342,7 +1342,7 @@ bool ScDocument::UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, b
}
void ScDocument::Sort(
- SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
+ SCTAB nTab, ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
ScProgress* pProgress, sc::ReorderParam* pUndo )
{
if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 9a7de8f8..a715194 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -1525,10 +1525,9 @@ void ScTable::DecoladeRow( ScSortInfoArray* pArray, SCROW nRow1, SCROW nRow2 )
}
void ScTable::Sort(
- const ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
+ ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
ScProgress* pProgress, sc::ReorderParam* pUndo )
{
- aSortParam = rSortParam;
InitSortCollator( rSortParam );
bGlobalKeepQuery = bKeepQuery;
@@ -1542,19 +1541,20 @@ void ScTable::Sort(
}
// Trim empty leading and trailing column ranges.
- while (aSortParam.nCol1 < aSortParam.nCol2 && aCol[aSortParam.nCol1].IsEmptyBlock(aSortParam.nRow1, aSortParam.nRow2))
- ++aSortParam.nCol1;
- while (aSortParam.nCol1 < aSortParam.nCol2 && aCol[aSortParam.nCol2].IsEmptyBlock(aSortParam.nRow1, aSortParam.nRow2))
- --aSortParam.nCol2;
+ while (rSortParam.nCol1 < rSortParam.nCol2 && aCol[rSortParam.nCol1].IsEmptyBlock(rSortParam.nRow1, rSortParam.nRow2))
+ ++rSortParam.nCol1;
+ while (rSortParam.nCol1 < rSortParam.nCol2 && aCol[rSortParam.nCol2].IsEmptyBlock(rSortParam.nRow1, rSortParam.nRow2))
+ --rSortParam.nCol2;
if (rSortParam.bByRow)
{
SCROW nLastRow = 0;
- for (SCCOL nCol = aSortParam.nCol1; nCol <= aSortParam.nCol2; nCol++)
+ for (SCCOL nCol = rSortParam.nCol1; nCol <= rSortParam.nCol2; nCol++)
nLastRow = std::max(nLastRow, aCol[nCol].GetLastDataPos());
- nLastRow = std::min(nLastRow, aSortParam.nRow2);
+ rSortParam.nRow2 = nLastRow = std::min(nLastRow, rSortParam.nRow2);
SCROW nRow1 = (rSortParam.bHasHeader ?
- aSortParam.nRow1 + 1 : aSortParam.nRow1);
+ rSortParam.nRow1 + 1 : rSortParam.nRow1);
+ aSortParam = rSortParam; // must be assigned before calling IsSorted()
if (!IsSorted(nRow1, nLastRow))
{
if(pProgress)
@@ -1580,9 +1580,10 @@ void ScTable::Sort(
}
else
{
- SCCOL nLastCol = aSortParam.nCol2;
+ SCCOL nLastCol = rSortParam.nCol2;
SCCOL nCol1 = (rSortParam.bHasHeader ?
- aSortParam.nCol1 + 1 : aSortParam.nCol1);
+ rSortParam.nCol1 + 1 : rSortParam.nCol1);
+ aSortParam = rSortParam; // must be assigned before calling IsSorted()
if (!IsSorted(nCol1, nLastCol))
{
if(pProgress)
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index fe254a2..bb97463 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -556,6 +556,7 @@ bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& rSortParam,
ScInputOptions aInputOption = SC_MOD()->GetInputOptions();
bool bUpdateRefs = aInputOption.GetSortRefUpdate();
ScProgress aProgress(&rDocShell, ScGlobal::GetRscString(STR_PROGRESS_SORTING), 0);
+ // aLocalParam range now may get adapted to exclude empty edges
rDoc.Sort(nTab, aLocalParam, bRepeatQuery, bUpdateRefs, &aProgress, &aUndoParam);
}
More information about the Libreoffice-commits
mailing list