[Libreoffice-commits] core.git: Branch 'private/kohei/sort-ref-update' - 4 commits - sc/inc sc/qa sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Sat Jul 12 19:14:30 PDT 2014


 sc/inc/table.hxx                   |    2 -
 sc/qa/unit/ucalc.cxx               |   68 +++++++++++++++++++++++++++++++++++++
 sc/qa/unit/ucalc.hxx               |    2 +
 sc/source/core/data/table3.cxx     |   23 +++++-------
 sc/source/ui/docshell/dbdocfun.cxx |    4 +-
 5 files changed, 84 insertions(+), 15 deletions(-)

New commits:
commit bda3a2375f8ef581d12da54a4905392d1504b2f0
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Sat Jul 12 22:09:10 2014 -0400

    Add another test case.
    
    Change-Id: I1664bc3faf44abc978391d0f97820c468f4419b0

diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index c834766..8e88ee4 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -5059,6 +5059,38 @@ void Test::testSortSingleRow()
     bool bSorted = aFunc.Sort(0, aSortData, true, true, true);
     CPPUNIT_ASSERT(bSorted);
 
+    // Another test case - single row horizontal sort with header column.
+    clearSheet(m_pDoc, 0);
+
+    // A1:G1
+    m_pDoc->SetString(ScAddress(0,0,0), "Header");
+    m_pDoc->SetValue(ScAddress(1,0,0),  1.0);
+    m_pDoc->SetValue(ScAddress(2,0,0), 10.0);
+    m_pDoc->SetValue(ScAddress(3,0,0),  3.0);
+    m_pDoc->SetValue(ScAddress(4,0,0),  9.0);
+    m_pDoc->SetValue(ScAddress(5,0,0), 12.0);
+    m_pDoc->SetValue(ScAddress(6,0,0),  2.0);
+
+    // Define A1:G1 as sheet-local anonymous database range.
+    m_pDoc->SetAnonymousDBData(
+        0, new ScDBData(STR_DB_LOCAL_NONAME, 0, 0, 0, 6, 0, false, true));
+
+    // Update the sort data.
+    aSortData.nCol1 = 0;
+    aSortData.nCol2 = 6;
+    aSortData.bByRow = false;
+    bSorted = aFunc.Sort(0, aSortData, true, true, true);
+    CPPUNIT_ASSERT(bSorted);
+
+    // Check the result.
+    CPPUNIT_ASSERT_EQUAL(OUString("Header"), m_pDoc->GetString(ScAddress(0,0,0)));
+    CPPUNIT_ASSERT_EQUAL( 1.0, m_pDoc->GetValue(ScAddress(1,0,0)));
+    CPPUNIT_ASSERT_EQUAL( 2.0, m_pDoc->GetValue(ScAddress(2,0,0)));
+    CPPUNIT_ASSERT_EQUAL( 3.0, m_pDoc->GetValue(ScAddress(3,0,0)));
+    CPPUNIT_ASSERT_EQUAL( 9.0, m_pDoc->GetValue(ScAddress(4,0,0)));
+    CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(ScAddress(5,0,0)));
+    CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(ScAddress(6,0,0)));
+
     m_pDoc->DeleteTab(0);
 }
 
commit f565bd8e0597ccbc2b525c03ea430bcc1abce9ee
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Sat Jul 12 21:55:59 2014 -0400

    fdo#80462: Write test for this.
    
    Change-Id: Icdc83c0264fd76239e8c8772c207cc22ce969a76

diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index ac66506..c834766 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -5026,6 +5026,42 @@ void Test::testSortHorizontal()
     m_pDoc->DeleteTab(0);
 }
 
+void Test::testSortSingleRow()
+{
+    // This test case is from fdo#80462.
+
+    m_pDoc->InsertTab(0, "Test");
+
+    // Sort range consists of only one row.
+    m_pDoc->SetString(ScAddress(0,0,0), "X");
+    m_pDoc->SetString(ScAddress(1,0,0), "Y");
+
+    // Define A1:B1 as sheet-local anonymous database range.
+    m_pDoc->SetAnonymousDBData(
+        0, new ScDBData(STR_DB_LOCAL_NONAME, 0, 0, 0, 1, 0));
+
+    // Sort A1:B1 horizontally, ascending by row 1.
+    ScDBDocFunc aFunc(getDocShell());
+
+    ScSortParam aSortData;
+    aSortData.nCol1 = 0;
+    aSortData.nCol2 = 1;
+    aSortData.nRow1 = 0;
+    aSortData.nRow2 = 0;
+    aSortData.bHasHeader = true;
+    aSortData.bByRow = true;
+    aSortData.bIncludePattern = true;
+    aSortData.maKeyState[0].bDoSort = true;
+    aSortData.maKeyState[0].nField = 0;
+    aSortData.maKeyState[0].bAscending = true;
+
+    // Do the sorting.  This should not crash.
+    bool bSorted = aFunc.Sort(0, aSortData, true, true, true);
+    CPPUNIT_ASSERT(bSorted);
+
+    m_pDoc->DeleteTab(0);
+}
+
 void Test::testSortInFormulaGroup()
 {
     static struct {
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index 2df47c0..c592e69 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -341,6 +341,7 @@ public:
     void testFindAreaPosColRight();
     void testSort();
     void testSortHorizontal();
+    void testSortSingleRow();
     void testSortWithFormulaRefs();
     void testSortWithStrings();
     void testSortInFormulaGroup();
@@ -509,6 +510,7 @@ public:
     CPPUNIT_TEST(testFindAreaPosColRight);
     CPPUNIT_TEST(testSort);
     CPPUNIT_TEST(testSortHorizontal);
+    CPPUNIT_TEST(testSortSingleRow);
     CPPUNIT_TEST(testSortWithFormulaRefs);
     CPPUNIT_TEST(testSortWithStrings);
     CPPUNIT_TEST(testSortInFormulaGroup);
commit 6fb4cbb860652c780dbb56cec92fc93e769e97a5
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Sat Jul 12 21:46:13 2014 -0400

    fdo#80462: Don't always increment the start row position.
    
    Sometimes someone might attempt to sort only a single row.
    
    Change-Id: Ie29d4cf7ec0bd3a5c945997083368b6ef6074268

diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 5398042..187621d 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -485,7 +485,9 @@ bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& rSortParam,
 
     WaitObject aWait( rDocShell.GetActiveDialogParent() );
 
-    SCROW nStartRow = aLocalParam.nRow1 + (aLocalParam.bHasHeader ? 1 : 0);
+    SCROW nStartRow = aLocalParam.nRow1;
+    if (aLocalParam.bByRow && aLocalParam.bHasHeader && nStartRow < aLocalParam.nRow2)
+        ++nStartRow;
 
     // Calculate the script types for all cells in the sort range beforehand.
     // This will speed up the row height adjustment that takes place after the
commit d257651526ccdbfb3e821dc3f7d18d77f3b0c7c6
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Sat Jul 12 18:08:44 2014 -0400

    SortReorderByColumn() to not access aSortParam member.
    
    Change-Id: I9b66f42e49873b732caba727432a472a07fb43f4

diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 452e171..44c4951 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -1024,7 +1024,7 @@ private:
     ScSortInfoArray* CreateSortInfoArray( const sc::ReorderParam& rParam );
     ScSortInfoArray* CreateSortInfoArray( const ScSortParam& rSortParam, SCCOLROW nInd1, SCCOLROW nInd2, bool bKeepQuery );
     void        QuickSort( ScSortInfoArray*, SCsCOLROW nLo, SCsCOLROW nHi);
-    void SortReorderByColumn( ScSortInfoArray* pArray, ScProgress* pProgress );
+    void SortReorderByColumn( ScSortInfoArray* pArray, SCROW nRow1, SCROW nRow2, bool bPattern, ScProgress* pProgress );
     void SortReorderByRow( ScSortInfoArray* pArray, SCCOL nCol1, SCCOL nCol2, ScProgress* pProgress );
 
     bool        CreateExcelQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScQueryParam& rQueryParam);
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index e15f1b9..061dd56 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -654,7 +654,8 @@ public:
 
 }
 
-void ScTable::SortReorderByColumn( ScSortInfoArray* pArray, ScProgress* pProgress )
+void ScTable::SortReorderByColumn(
+    ScSortInfoArray* pArray, SCROW nRow1, SCROW nRow2, bool bPattern, ScProgress* pProgress )
 {
     size_t nCount = pArray->GetCount();
     SCCOLROW nStart = pArray->GetStart();
@@ -668,7 +669,7 @@ void ScTable::SortReorderByColumn( ScSortInfoArray* pArray, ScProgress* pProgres
         aTable[ppInfo[nPos]->nOrg - nStart] = ppInfo[nPos];
 
     // Cut formula grouping at row and reference boundaries before the reordering.
-    ScRange aSortRange(nStart, aSortParam.nRow1, nTab, nLast, aSortParam.nRow2, nTab);
+    ScRange aSortRange(nStart, nRow1, nTab, nLast, nRow2, nTab);
     for (SCCOL nCol = nStart; nCol <= nLast; ++nCol)
         aCol[nCol].SplitFormulaGroupByRelativeRef(aSortRange);
 
@@ -678,7 +679,7 @@ void ScTable::SortReorderByColumn( ScSortInfoArray* pArray, ScProgress* pProgres
         SCCOLROW nOrg = ppInfo[nPos]->nOrg;
         if ( nDest != nOrg )
         {
-            aCol[nDest].Swap(aCol[nOrg], aSortParam.nRow1, aSortParam.nRow2, aSortParam.bIncludePattern);
+            aCol[nDest].Swap(aCol[nOrg], nRow1, nRow2, bPattern);
 
             // neue Position des weggeswapten eintragen
             ScSortInfo* p = ppInfo[nPos];
@@ -694,7 +695,7 @@ void ScTable::SortReorderByColumn( ScSortInfoArray* pArray, ScProgress* pProgres
 
     // Reset formula cell positions which became out-of-sync after column reordering.
     for (SCCOL nCol = nStart; nCol <= nLast; ++nCol)
-        aCol[nCol].ResetFormulaCellPositions(aSortParam.nRow1, aSortParam.nRow2);
+        aCol[nCol].ResetFormulaCellPositions(nRow1, nRow2);
 
     // Set up column reorder map (for later broadcasting of reference updates).
     sc::ColRowReorderMapType aColMap;
@@ -709,14 +710,14 @@ void ScTable::SortReorderByColumn( ScSortInfoArray* pArray, ScProgress* pProgres
     // Collect all listeners within sorted range ahead of time.
     std::vector<SvtListener*> aListeners;
     for (SCCOL nCol = nStart; nCol <= nLast; ++nCol)
-        aCol[nCol].CollectListeners(aListeners, aSortParam.nRow1, aSortParam.nRow2);
+        aCol[nCol].CollectListeners(aListeners, nRow1, nRow2);
 
     // Remove any duplicate listener entries and notify all listeners
     // afterward.  We must ensure that we notify each unique listener only
     // once.
     std::sort(aListeners.begin(), aListeners.end());
     aListeners.erase(std::unique(aListeners.begin(), aListeners.end()), aListeners.end());
-    ColReorderNotifier aFunc(aColMap, nTab, aSortParam.nRow1, aSortParam.nRow2);
+    ColReorderNotifier aFunc(aColMap, nTab, nRow1, nRow2);
     std::for_each(aListeners.begin(), aListeners.end(), aFunc);
 
     // Re-join formulas at row boundaries now that all the references have
@@ -724,9 +725,9 @@ void ScTable::SortReorderByColumn( ScSortInfoArray* pArray, ScProgress* pProgres
     for (SCCOL nCol = nStart; nCol <= nLast; ++nCol)
     {
         sc::CellStoreType& rCells = aCol[nCol].maCells;
-        sc::CellStoreType::position_type aPos = rCells.position(aSortParam.nRow1);
+        sc::CellStoreType::position_type aPos = rCells.position(nRow1);
         sc::SharedFormulaUtil::joinFormulaCellAbove(aPos);
-        aPos = rCells.position(aPos.first, aSortParam.nRow2+1);
+        aPos = rCells.position(aPos.first, nRow2+1);
         sc::SharedFormulaUtil::joinFormulaCellAbove(aPos);
     }
 }
@@ -1230,8 +1231,6 @@ void ScTable::Sort(
                 pUndo->maSortRange = ScRange(rSortParam.nCol1, nRow1, nTab, rSortParam.nCol2, nLastRow, nTab);
                 pUndo->maPosIndices = pArray->GetOldIndices();
             }
-
-            // #i59745# update position of caption objects of cell notes --> reported at (SortReorder) ScColumn::SwapCellNotes level
         }
     }
     else
@@ -1251,15 +1250,13 @@ void ScTable::Sort(
             boost::scoped_ptr<ScSortInfoArray> pArray(CreateSortInfoArray(aSortParam, nCol1, nLastCol, bKeepQuery));
 
             QuickSort(pArray.get(), nCol1, nLastCol);
-            SortReorderByColumn(pArray.get(), pProgress);
+            SortReorderByColumn(pArray.get(), aSortParam.nRow1, aSortParam.nRow2, aSortParam.bIncludePattern, pProgress);
 
             if (pUndo)
             {
                 pUndo->maSortRange = ScRange(nCol1, aSortParam.nRow1, nTab, nLastCol, aSortParam.nRow2, nTab);
                 pUndo->maPosIndices = pArray->GetOldIndices();
             }
-
-            // #i59745# update position of caption objects of cell notes --> reported at (SortReorder) ScColumn::SwapCellNotes level
         }
     }
     DestroySortCollator();


More information about the Libreoffice-commits mailing list