[Libreoffice-commits] core.git: Branch 'private/kohei/calc-sort-fix' - sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Mon Apr 21 18:52:18 PDT 2014


 sc/source/core/data/table3.cxx |   14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

New commits:
commit 84d9fcf751d4b4c9982c088e618779a1bbc4927b
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Mon Apr 21 21:50:44 2014 -0400

    Handle cell formats correctly during sort.
    
    Unfortunately sorting becomes noticeably slower when cell format is
    enabled.  Perhaps a future project.
    
    Change-Id: Ieb02b207b62df343d1f667a8075874b7688ee9a7

diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 88e693e..b1a40d0 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -229,8 +229,9 @@ public:
         const sc::CellTextAttr* mpAttr;
         const SvtBroadcaster* mpBroadcaster;
         const ScPostIt* mpNote;
+        const ScPatternAttr* mpPattern;
 
-        Cell() : mpAttr(NULL), mpBroadcaster(NULL), mpNote(NULL) {}
+        Cell() : mpAttr(NULL), mpBroadcaster(NULL), mpNote(NULL), mpPattern(NULL) {}
     };
 
     typedef std::vector<Cell> RowType;
@@ -361,6 +362,9 @@ ScSortInfoArray* ScTable::CreateSortInfoArray( SCCOLROW nInd1, SCCOLROW nInd2 )
                 rCell.mpAttr = rCol.GetCellTextAttr(aBlockPos, nRow);
                 rCell.mpBroadcaster = rCol.GetBroadcaster(aBlockPos, nRow);
                 rCell.mpNote = rCol.GetCellNote(aBlockPos, nRow);
+
+                if (aSortParam.bIncludePattern)
+                    rCell.mpPattern = rCol.GetPattern(nRow);
             }
         }
     }
@@ -471,6 +475,8 @@ void ScTable::SortReorder( ScSortInfoArray* pArray, ScProgress* pProgress )
             ScSortInfoArray::RowType* pRow = (*pRows)[i];
             for (size_t j = 0; j < pRow->size(); ++j)
             {
+                ScAddress aCellPos(aSortParam.nCol1 + j, nRow1 + i, nTab);
+
                 ScSortInfoArray::Cell& rCell = (*pRow)[j];
 
                 sc::CellStoreType& rCellStore = aSortedCols.at(j).maCells;
@@ -492,9 +498,9 @@ void ScTable::SortReorder( ScSortInfoArray* pArray, ScProgress* pProgress )
                     {
                         assert(rCell.mpAttr);
                         size_t n = rCellStore.size();
-                        ScAddress aCellPos(aSortParam.nCol1 + j, nRow1 + i, nTab);
                         sc::CellStoreType::iterator itBlk = rCellStore.push_back(rCell.maCell.mpFormula->Clone(aCellPos));
 
+                        // Join the formula cells as we fill the container.
                         size_t nOffset = n - itBlk->position;
                         sc::CellStoreType::position_type aPos(itBlk, nOffset);
                         sc::SharedFormulaUtil::joinFormulaCellAbove(aPos);
@@ -527,6 +533,10 @@ void ScTable::SortReorder( ScSortInfoArray* pArray, ScProgress* pProgress )
                     rNoteStore.push_back(const_cast<ScPostIt*>(rCell.mpNote));
                 else
                     rNoteStore.push_back_empty();
+
+                // Set formats to the document directly.
+                if (rCell.mpPattern)
+                    aCol[aCellPos.Col()].SetPattern(aCellPos.Row(), *rCell.mpPattern, true);
             }
 
             if (pProgress)


More information about the Libreoffice-commits mailing list