sc/inc/document.hxx                |   14 ++++++++------
 sc/inc/table.hxx                   |   10 ++++------
 sc/source/core/data/documen3.cxx   |    2 +-
 sc/source/core/data/document.cxx   |    6 ++++--
 sc/source/core/data/table1.cxx     |   19 +++++++++++--------
 sc/source/core/data/table3.cxx     |   19 +++++--------------
 sc/source/ui/docshell/dbdocfun.cxx |    8 +++++++-
 7 files changed, 40 insertions(+), 38 deletions(-)

New commits:
commit 1aa43709f1eafe76bb5b2c658bf88c16bb73ea4f
Author: Eike Rathke <er...@redhat.com>
Date:   Mon May 4 23:45:15 2015 +0200

    rework Sort trim data area logic
    
    Determine the effective data area before all operations, so obtaining
    uniform row heights, the actual sort and setting dirty and setting row
    heights after sort is done only on the trimmed area.
    
    Also make sorting leading empty columns to the end work again if no row
    headers were given.
    
    Change-Id: If2b6a15ca69e0db2ca71a888a134f7441b04cc27

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 8f2e65f..e5e6a5b 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1096,12 +1096,17 @@ public:
 
                         @param o_bShrunk
                                Out parameter, true if area was shrunk, false 
if not.
+                        @param  bStickyTopRow
+                                If TRUE, do not adjust the top row.
+                        @param  bStickyLeftCol
+                                If TRUE, do not adjust the left column.
 
                         @returns true if there is any data, false if not.
                      */
     bool            ShrinkToUsedDataArea( bool& o_bShrunk,
                                           SCTAB nTab, SCCOL& rStartCol, SCROW& 
rStartRow,
-                                          SCCOL& rEndCol, SCROW& rEndRow, bool 
bColumnsOnly ) const;
+                                          SCCOL& rEndCol, SCROW& rEndRow, bool 
bColumnsOnly,
+                                          bool bStickyTopRow = false, bool 
bStickyLeftCol = false ) const;
 
     /**
      * Return the last non-empty row position in given columns that's no
@@ -1718,12 +1723,9 @@ 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
-     */
+    /** Sort a range of data. */
     void Sort(
-        SCTAB nTab, ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
+        SCTAB nTab, const 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 d50bd5b..2b37a28 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -505,7 +505,8 @@ public:
                              bool bIncludeOld, bool bOnlyDown ) const;
 
     bool        ShrinkToUsedDataArea( bool& o_bShrunk, SCCOL& rStartCol, 
SCROW& rStartRow,
-                                      SCCOL& rEndCol, SCROW& rEndRow, bool 
bColumnsOnly ) const;
+                                      SCCOL& rEndCol, SCROW& rEndRow, bool 
bColumnsOnly,
+                                      bool bStickyTopRow, bool bStickyLeftCol 
) const;
 
     SCROW GetLastDataRow( SCCOL nCol1, SCCOL nCol2, SCROW nLastRow ) const;
 
@@ -844,12 +845,9 @@ 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
-     */
+    /** Sort a range of data. */
     void Sort(
-        ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
+        const 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 57a20e1..bf359ef 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, ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
+    SCTAB nTab, const 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/document.cxx b/sc/source/core/data/document.cxx
index 9293b87..973a623 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -1026,14 +1026,16 @@ bool ScDocument::ShrinkToDataArea(SCTAB nTab, SCCOL& 
rStartCol, SCROW& rStartRow
 }
 
 bool ScDocument::ShrinkToUsedDataArea( bool& o_bShrunk, SCTAB nTab, SCCOL& 
rStartCol,
-        SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly ) 
const
+        SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly,
+        bool bStickyTopRow, bool bStickyLeftCol ) const
 {
     if (!ValidTab(nTab) || nTab >= static_cast<SCTAB> (maTabs.size()) || 
!maTabs[nTab])
     {
         o_bShrunk = false;
         return false;
     }
-    return maTabs[nTab]->ShrinkToUsedDataArea( o_bShrunk, rStartCol, 
rStartRow, rEndCol, rEndRow, bColumnsOnly);
+    return maTabs[nTab]->ShrinkToUsedDataArea( o_bShrunk, rStartCol, 
rStartRow, rEndCol, rEndRow,
+            bColumnsOnly, bStickyTopRow, bStickyLeftCol);
 }
 
 SCROW ScDocument::GetLastDataRow( SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCROW 
nLastRow ) const
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index e2beed5..b665e9f 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -912,7 +912,7 @@ void ScTable::GetDataArea( SCCOL& rStartCol, SCROW& 
rStartRow, SCCOL& rEndCol, S
 }
 
 bool ScTable::ShrinkToUsedDataArea( bool& o_bShrunk, SCCOL& rStartCol, SCROW& 
rStartRow,
-        SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly ) const
+        SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly, bool bStickyTopRow, 
bool bStickyLeftCol ) const
 {
     o_bShrunk = false;
 
@@ -943,20 +943,23 @@ bool ScTable::ShrinkToUsedDataArea( bool& o_bShrunk, 
SCCOL& rStartCol, SCROW& rS
                 break;  // while
         }
 
-        while (rStartCol < rEndCol)
+        if (!bStickyLeftCol)
         {
-            if (aCol[rStartCol].IsEmptyBlock( rStartRow, rEndRow))
+            while (rStartCol < rEndCol)
             {
-                ++rStartCol;
-                bChanged = true;
+                if (aCol[rStartCol].IsEmptyBlock( rStartRow, rEndRow))
+                {
+                    ++rStartCol;
+                    bChanged = true;
+                }
+                else
+                    break;  // while
             }
-            else
-                break;  // while
         }
 
         if (!bColumnsOnly)
         {
-            if (rStartRow < rEndRow)
+            if (!bStickyTopRow && rStartRow < rEndRow)
             {
                 bool bFound = false;
                 for (SCCOL i=rStartCol; i<=rEndCol && !bFound; i++)
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 49ecc0f..aab8e59 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -1677,7 +1677,7 @@ void ScTable::DecoladeRow( ScSortInfoArray* pArray, SCROW 
nRow1, SCROW nRow2 )
 }
 
 void ScTable::Sort(
-    ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
+    const ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs,
     ScProgress* pProgress, sc::ReorderParam* pUndo )
 {
     InitSortCollator( rSortParam );
@@ -1693,20 +1693,13 @@ void ScTable::Sort(
         pUndo->mbHasHeaders = rSortParam.bHasHeader;
     }
 
-    // Trim empty leading and trailing column ranges.
-    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;
+    // It is assumed that the data area has already been trimmed as necessary.
 
+    aSortParam = rSortParam;    // must be assigned before calling IsSorted()
     if (rSortParam.bByRow)
     {
-        SCROW nLastRow = 0;
-        for (SCCOL nCol = rSortParam.nCol1; nCol <= rSortParam.nCol2; nCol++)
-            nLastRow = std::max(nLastRow, aCol[nCol].GetLastDataPos());
-        rSortParam.nRow2 = nLastRow = std::max( std::min(nLastRow, 
rSortParam.nRow2), rSortParam.nRow1);
+        SCROW nLastRow = rSortParam.nRow2;
         SCROW nRow1 = (rSortParam.bHasHeader ? rSortParam.nRow1 + 1 : 
rSortParam.nRow1);
-        aSortParam = rSortParam;    // must be assigned before calling 
IsSorted()
         if (nRow1 < nLastRow && !IsSorted(nRow1, nLastRow))
         {
             if(pProgress)
@@ -1733,9 +1726,7 @@ void ScTable::Sort(
     else
     {
         SCCOL nLastCol = rSortParam.nCol2;
-        SCCOL nCol1 = (rSortParam.bHasHeader ?
-            rSortParam.nCol1 + 1 : rSortParam.nCol1);
-        aSortParam = rSortParam;    // must be assigned before calling 
IsSorted()
+        SCCOL nCol1 = (rSortParam.bHasHeader ? rSortParam.nCol1 + 1 : 
rSortParam.nCol1);
         if (nCol1 < nLastCol && !IsSorted(nCol1, nLastCol))
         {
             if(pProgress)
diff --git a/sc/source/ui/docshell/dbdocfun.cxx 
b/sc/source/ui/docshell/dbdocfun.cxx
index 170a76e..17b6132 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -526,6 +526,13 @@ bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& 
rSortParam,
 
     WaitObject aWait( rDocShell.GetActiveDialogParent() );
 
+    // Adjust aLocalParam cols/rows to used data area. Keep sticky top row or
+    // column (depending on direction) in any case, not just if it has headers,
+    // so empty leading cells will be sorted to the end.
+    bool bShrunk = false;
+    rDoc.ShrinkToUsedDataArea( bShrunk, nTab, aLocalParam.nCol1, 
aLocalParam.nRow1,
+            aLocalParam.nCol2, aLocalParam.nRow2, false, aLocalParam.bByRow, 
!aLocalParam.bByRow);
+
     SCROW nStartRow = aLocalParam.nRow1;
     if (aLocalParam.bByRow && aLocalParam.bHasHeader && nStartRow < 
aLocalParam.nRow2)
         ++nStartRow;
@@ -556,7 +563,6 @@ 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);
     }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to