sc/inc/sortparam.hxx | 2 - sc/source/core/data/sortparam.cxx | 6 ++-- sc/source/core/data/table3.cxx | 57 ++++++++++++++++++++++++-------------- 3 files changed, 40 insertions(+), 25 deletions(-)
New commits: commit cf6e1071795e61419f8d1a28e4ce5d9c04226cef Author: Kohei Yoshida <[email protected]> Date: Sun Jul 13 16:12:39 2014 -0400 Implement reorder by column. Now undo of column sorting is working too. Change-Id: I2b98610f6b774400ecfaffe2905201c27fcab33f diff --git a/sc/inc/sortparam.hxx b/sc/inc/sortparam.hxx index 7bf0664..ab26d10 100644 --- a/sc/inc/sortparam.hxx +++ b/sc/inc/sortparam.hxx @@ -92,7 +92,7 @@ struct SC_DLLPUBLIC ReorderParam /** * List of original column / row positions after reordering. */ - std::vector<SCCOLROW> maPosIndices; + std::vector<SCCOLROW> maOrderIndices; bool mbByRow; bool mbPattern; bool mbHiddenFiltered; diff --git a/sc/source/core/data/sortparam.cxx b/sc/source/core/data/sortparam.cxx index ad7653f..1e265b3 100644 --- a/sc/source/core/data/sortparam.cxx +++ b/sc/source/core/data/sortparam.cxx @@ -265,13 +265,13 @@ void ReorderParam::reverse() else nStart = maSortRange.aStart.Col(); - size_t n = maPosIndices.size(); + size_t n = maOrderIndices.size(); std::vector<ReorderIndex> aBucket; aBucket.reserve(n); for (size_t i = 0; i < n; ++i) { SCCOLROW nPos1 = i + nStart; - SCCOLROW nPos2 = maPosIndices[i]; + SCCOLROW nPos2 = maOrderIndices[i]; aBucket.push_back(ReorderIndex(nPos1, nPos2)); } @@ -281,7 +281,7 @@ void ReorderParam::reverse() for (size_t i = 0; i < n; ++i) aNew.push_back(aBucket[i].mnPos1); - maPosIndices.swap(aNew); + maOrderIndices.swap(aNew); } } diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index 844db24..64f0ef5 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -350,6 +350,11 @@ public: } } + void SetOrderIndices( const std::vector<SCCOLROW>& rIndices ) + { + maOrderIndices = rIndices; + } + /** * @param rIndices indices are actual row positions on the sheet, not an * offset from the top row. @@ -471,6 +476,11 @@ ScSortInfoArray* ScTable::CreateSortInfoArray( const sc::ReorderParam& rParam ) } else { + SCCOLROW nCol1 = rParam.maSortRange.aStart.Col(); + SCCOLROW nCol2 = rParam.maSortRange.aEnd.Col(); + + pArray = new ScSortInfoArray(0, nCol1, nCol2); + pArray->SetKeepQuery(rParam.mbHiddenFiltered); } return pArray; @@ -1228,7 +1238,7 @@ void ScTable::Sort( if (pUndo) { pUndo->maSortRange = ScRange(rSortParam.nCol1, nRow1, nTab, rSortParam.nCol2, nLastRow, nTab); - pUndo->maPosIndices = pArray->GetOrderIndices(); + pUndo->maOrderIndices = pArray->GetOrderIndices(); } } } @@ -1254,7 +1264,7 @@ void ScTable::Sort( if (pUndo) { pUndo->maSortRange = ScRange(nCol1, aSortParam.nRow1, nTab, nLastCol, aSortParam.nRow2, nTab); - pUndo->maPosIndices = pArray->GetOrderIndices(); + pUndo->maOrderIndices = pArray->GetOrderIndices(); } } } @@ -1263,7 +1273,7 @@ void ScTable::Sort( void ScTable::Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress ) { - if (rParam.maPosIndices.empty()) + if (rParam.maOrderIndices.empty()) return; boost::scoped_ptr<ScSortInfoArray> pArray(CreateSortInfoArray(rParam)); @@ -1273,14 +1283,18 @@ void ScTable::Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress ) if (rParam.mbByRow) { // Re-play sorting from the known sort indices. - pArray->ReorderByRow(rParam.maPosIndices); + pArray->ReorderByRow(rParam.maOrderIndices); SortReorderByRow( pArray.get(), rParam.maSortRange.aStart.Col(), rParam.maSortRange.aEnd.Col(), pProgress); } else { - + // Ordering by column is much simpler. Just set the order indices and we are done. + pArray->SetOrderIndices(rParam.maOrderIndices); + SortReorderByColumn( + pArray.get(), rParam.maSortRange.aStart.Row(), rParam.maSortRange.aEnd.Row(), + rParam.mbPattern, pProgress); } } commit 6b2e9a84920da68e9965c613302a36bda39a780e Author: Kohei Yoshida <[email protected]> Date: Sun Jul 13 16:01:58 2014 -0400 Some renaming. The name "old indices" is not very representative. Change-Id: Idbb462e3b366d6fcc3fbbade6ee1310b9941423d diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index 4e9dd6d..844db24 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -257,7 +257,7 @@ private: SCCOLROW mnLastIndex; /// index of last non-empty cell position. sal_uInt16 nUsedSorts; - std::vector<SCCOLROW> maOldIndices; + std::vector<SCCOLROW> maOrderIndices; bool mbKeepQuery; public: @@ -281,7 +281,7 @@ public: } for (size_t i = 0; i < nCount; ++i) - maOldIndices.push_back(i+nStart); + maOrderIndices.push_back(i+nStart); } ~ScSortInfoArray() @@ -340,7 +340,7 @@ public: ppInfo[n2] = pTmp; } - std::swap(maOldIndices[n1], maOldIndices[n2]); + std::swap(maOrderIndices[n1], maOrderIndices[n2]); if (mpRows) { @@ -354,15 +354,15 @@ public: * @param rIndices indices are actual row positions on the sheet, not an * offset from the top row. */ - void ReorderDataRows( const std::vector<SCCOLROW>& rIndices ) + void ReorderByRow( const std::vector<SCCOLROW>& rIndices ) { if (!mpRows) return; RowsType& rRows = *mpRows; - std::vector<SCCOLROW> aOldIndices2; - aOldIndices2.reserve(rIndices.size()); + std::vector<SCCOLROW> aOrderIndices2; + aOrderIndices2.reserve(rIndices.size()); RowsType aRows2; aRows2.reserve(rRows.size()); @@ -372,11 +372,11 @@ public: { size_t nPos = *it - nStart; // switch to an offset to top row. aRows2.push_back(rRows[nPos]); - aOldIndices2.push_back(maOldIndices[nPos]); + aOrderIndices2.push_back(maOrderIndices[nPos]); } rRows.swap(aRows2); - maOldIndices.swap(aOldIndices2); + maOrderIndices.swap(aOrderIndices2); } sal_uInt16 GetUsedSorts() const { return nUsedSorts; } @@ -385,7 +385,7 @@ public: SCCOLROW GetLast() const { return mnLastIndex; } SCSIZE GetCount() const { return nCount; } - const std::vector<SCCOLROW>& GetOldIndices() const { return maOldIndices; } + const std::vector<SCCOLROW>& GetOrderIndices() const { return maOrderIndices; } RowsType& InitDataRows( size_t nRowSize, size_t nColSize ) { @@ -661,7 +661,7 @@ void ScTable::SortReorderByColumn( SCCOLROW nStart = pArray->GetStart(); SCCOLROW nLast = pArray->GetLast(); - std::vector<SCCOLROW> aIndices = pArray->GetOldIndices(); + std::vector<SCCOLROW> aIndices = pArray->GetOrderIndices(); size_t nCount = aIndices.size(); // Cut formula grouping at row and reference boundaries before the reordering. @@ -698,7 +698,7 @@ void ScTable::SortReorderByColumn( // Set up column reorder map (for later broadcasting of reference updates). sc::ColRowReorderMapType aColMap; - const std::vector<SCCOLROW>& rOldIndices = pArray->GetOldIndices(); + const std::vector<SCCOLROW>& rOldIndices = pArray->GetOrderIndices(); for (size_t i = 0, n = rOldIndices.size(); i < n; ++i) { SCCOL nNew = i + nStart; @@ -917,7 +917,7 @@ void ScTable::SortReorderByRow( // Set up row reorder map (for later broadcasting of reference updates). sc::ColRowReorderMapType aRowMap; - const std::vector<SCCOLROW>& rOldIndices = pArray->GetOldIndices(); + const std::vector<SCCOLROW>& rOldIndices = pArray->GetOrderIndices(); for (size_t i = 0, n = rOldIndices.size(); i < n; ++i) { SCROW nNew = i + nRow1; @@ -1228,7 +1228,7 @@ void ScTable::Sort( if (pUndo) { pUndo->maSortRange = ScRange(rSortParam.nCol1, nRow1, nTab, rSortParam.nCol2, nLastRow, nTab); - pUndo->maPosIndices = pArray->GetOldIndices(); + pUndo->maPosIndices = pArray->GetOrderIndices(); } } } @@ -1254,7 +1254,7 @@ void ScTable::Sort( if (pUndo) { pUndo->maSortRange = ScRange(nCol1, aSortParam.nRow1, nTab, nLastCol, aSortParam.nRow2, nTab); - pUndo->maPosIndices = pArray->GetOldIndices(); + pUndo->maPosIndices = pArray->GetOrderIndices(); } } } @@ -1266,19 +1266,21 @@ void ScTable::Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress ) if (rParam.maPosIndices.empty()) return; + boost::scoped_ptr<ScSortInfoArray> pArray(CreateSortInfoArray(rParam)); + if (!pArray) + return; + if (rParam.mbByRow) { - boost::scoped_ptr<ScSortInfoArray> pArray(CreateSortInfoArray(rParam)); - // Re-play sorting from the known sort indices. - pArray->ReorderDataRows(rParam.maPosIndices); + pArray->ReorderByRow(rParam.maPosIndices); SortReorderByRow( pArray.get(), rParam.maSortRange.aStart.Col(), rParam.maSortRange.aEnd.Col(), pProgress); } else { - // TODO : Implement this. + } } commit 8bc9a54e435b0d843a226f4ac55818e6a2d8d0ef Author: Kohei Yoshida <[email protected]> Date: Sun Jul 13 15:52:02 2014 -0400 No need to copy it here anymore. Change-Id: Ie636149e0ed71bbc5c6675c4e1481d62c66ab68e diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index 008e883..4e9dd6d 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -1268,14 +1268,13 @@ void ScTable::Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress ) if (rParam.mbByRow) { - sc::ReorderParam aParam = rParam; // copy boost::scoped_ptr<ScSortInfoArray> pArray(CreateSortInfoArray(rParam)); // Re-play sorting from the known sort indices. - pArray->ReorderDataRows(aParam.maPosIndices); + pArray->ReorderDataRows(rParam.maPosIndices); SortReorderByRow( - pArray.get(), aParam.maSortRange.aStart.Col(), aParam.maSortRange.aEnd.Col(), pProgress); + pArray.get(), rParam.maSortRange.aStart.Col(), rParam.maSortRange.aEnd.Col(), pProgress); } else { _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
