summaryrefslogtreecommitdiff
path: root/sc/source/core
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-12-05 10:49:06 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-12-05 10:52:07 -0500
commitdd4dca78bf9016c3ef89bb27e869011eceb77313 (patch)
tree152d70c94575f04a0be57d1b2758e74dd7ebf089 /sc/source/core
parentfabdb9356fe2b4d04b7e3ae4f2bfbd92fc306d76 (diff)
Extract this code block into an own function.
This code block is sufficiently self-contained. Change-Id: I0eb2d3ee8175af60394ff4c408a9c245f77044d8
Diffstat (limited to 'sc/source/core')
-rw-r--r--sc/source/core/data/table3.cxx226
1 files changed, 126 insertions, 100 deletions
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 7e1d24af7d3d..bff310e46db9 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -595,6 +595,16 @@ struct SortedRowFlags
{
miPosFiltered = maRowsFiltered.insert(miPosFiltered, nRow, nRow+1, b).first;
}
+
+ void swap( SortedRowFlags& r )
+ {
+ maRowsHidden.swap(r.maRowsHidden);
+ maRowsFiltered.swap(r.maRowsFiltered);
+
+ // Just reset the position hints.
+ miPosHidden = maRowsHidden.begin();
+ miPosFiltered = maRowsFiltered.begin();
+ }
};
struct PatternSpan
@@ -698,6 +708,121 @@ public:
}
};
+void fillSortedColumnArray(
+ boost::ptr_vector<SortedColumn>& rSortedCols,
+ SortedRowFlags& rRowFlags,
+ ScSortInfoArray* pArray, SCTAB nTab, SCCOL nCol1, SCCOL nCol2, ScProgress* pProgress )
+{
+ SCROW nRow1 = pArray->GetStart();
+ SCROW nRow2 = pArray->GetLast();
+ ScSortInfoArray::RowsType* pRows = pArray->GetDataRows();
+
+ size_t nColCount = nCol2 - nCol1 + 1;
+ boost::ptr_vector<SortedColumn> aSortedCols; // storage for copied cells.
+ SortedRowFlags aRowFlags;
+ aSortedCols.reserve(nColCount);
+ for (size_t i = 0; i < nColCount; ++i)
+ {
+ // In the sorted column container, element positions and row
+ // positions must match, else formula cells may mis-behave during
+ // grouping.
+ aSortedCols.push_back(new SortedColumn(nRow1));
+ }
+
+ for (size_t i = 0; i < pRows->size(); ++i)
+ {
+ ScSortInfoArray::Row* pRow = (*pRows)[i];
+ for (size_t j = 0; j < pRow->maCells.size(); ++j)
+ {
+ ScAddress aCellPos(nCol1 + j, nRow1 + i, nTab);
+
+ ScSortInfoArray::Cell& rCell = pRow->maCells[j];
+
+ sc::CellStoreType& rCellStore = aSortedCols.at(j).maCells;
+ switch (rCell.maCell.meType)
+ {
+ case CELLTYPE_STRING:
+ assert(rCell.mpAttr);
+ rCellStore.push_back(*rCell.maCell.mpString);
+ break;
+ case CELLTYPE_VALUE:
+ assert(rCell.mpAttr);
+ rCellStore.push_back(rCell.maCell.mfValue);
+ break;
+ case CELLTYPE_EDIT:
+ assert(rCell.mpAttr);
+ rCellStore.push_back(rCell.maCell.mpEditText->Clone());
+ break;
+ case CELLTYPE_FORMULA:
+ {
+ assert(rCell.mpAttr);
+ ScAddress aOldPos = rCell.maCell.mpFormula->aPos;
+
+ ScFormulaCell* pNew = rCell.maCell.mpFormula->Clone( aCellPos, SC_CLONECELL_DEFAULT);
+ if (pArray->IsUpdateRefs())
+ {
+ pNew->CopyAllBroadcasters(*rCell.maCell.mpFormula);
+ pNew->GetCode()->AdjustReferenceOnMovedOrigin(aOldPos, aCellPos);
+ }
+ else
+ {
+ pNew->GetCode()->AdjustReferenceOnMovedOriginIfOtherSheet(aOldPos, aCellPos);
+ }
+
+ rCellStore.push_back(pNew);
+ }
+ break;
+ default:
+ assert(!rCell.mpAttr);
+ rCellStore.push_back_empty();
+ }
+
+ sc::CellTextAttrStoreType& rAttrStore = aSortedCols.at(j).maCellTextAttrs;
+ if (rCell.mpAttr)
+ rAttrStore.push_back(*rCell.mpAttr);
+ else
+ rAttrStore.push_back_empty();
+
+ if (pArray->IsUpdateRefs())
+ {
+ // At this point each broadcaster instance is managed by 2
+ // containers. We will release those in the original storage
+ // below before transferring them to the document.
+ sc::BroadcasterStoreType& rBCStore = aSortedCols.at(j).maBroadcasters;
+ if (rCell.mpBroadcaster)
+ // A const pointer would be implicitly converted to a bool type.
+ rBCStore.push_back(const_cast<SvtBroadcaster*>(rCell.mpBroadcaster));
+ else
+ rBCStore.push_back_empty();
+ }
+
+ // The same with cell note instances ...
+ sc::CellNoteStoreType& rNoteStore = aSortedCols.at(j).maCellNotes;
+ if (rCell.mpNote)
+ rNoteStore.push_back(const_cast<ScPostIt*>(rCell.mpNote));
+ else
+ rNoteStore.push_back_empty();
+
+ if (rCell.mpPattern)
+ aSortedCols.at(j).setPattern(aCellPos.Row(), rCell.mpPattern);
+ }
+
+ if (pArray->IsKeepQuery())
+ {
+ // Hidden and filtered flags are first converted to segments.
+ SCROW nRow = nRow1 + i;
+ aRowFlags.setRowHidden(nRow, pRow->mbHidden);
+ aRowFlags.setRowFiltered(nRow, pRow->mbFiltered);
+ }
+
+ if (pProgress)
+ pProgress->SetStateOnPercent(i);
+ }
+
+ rSortedCols.swap(aSortedCols);
+ rRowFlags.swap(aRowFlags);
+}
+
}
void ScTable::SortReorderByColumn(
@@ -891,108 +1016,9 @@ void ScTable::SortReorderByRow(
// Cells in the data rows only reference values in the document. Make
// a copy before updating the document.
-
- size_t nColCount = nCol2 - nCol1 + 1;
boost::ptr_vector<SortedColumn> aSortedCols; // storage for copied cells.
SortedRowFlags aRowFlags;
- aSortedCols.reserve(nColCount);
- for (size_t i = 0; i < nColCount; ++i)
- {
- // In the sorted column container, element positions and row
- // positions must match, else formula cells may mis-behave during
- // grouping.
- aSortedCols.push_back(new SortedColumn(nRow1));
- }
-
- for (size_t i = 0; i < pRows->size(); ++i)
- {
- ScSortInfoArray::Row* pRow = (*pRows)[i];
- for (size_t j = 0; j < pRow->maCells.size(); ++j)
- {
- ScAddress aCellPos(nCol1 + j, nRow1 + i, nTab);
-
- ScSortInfoArray::Cell& rCell = pRow->maCells[j];
-
- sc::CellStoreType& rCellStore = aSortedCols.at(j).maCells;
- switch (rCell.maCell.meType)
- {
- case CELLTYPE_STRING:
- assert(rCell.mpAttr);
- rCellStore.push_back(*rCell.maCell.mpString);
- break;
- case CELLTYPE_VALUE:
- assert(rCell.mpAttr);
- rCellStore.push_back(rCell.maCell.mfValue);
- break;
- case CELLTYPE_EDIT:
- assert(rCell.mpAttr);
- rCellStore.push_back(rCell.maCell.mpEditText->Clone());
- break;
- case CELLTYPE_FORMULA:
- {
- assert(rCell.mpAttr);
- ScAddress aOldPos = rCell.maCell.mpFormula->aPos;
-
- ScFormulaCell* pNew = rCell.maCell.mpFormula->Clone( aCellPos, SC_CLONECELL_DEFAULT);
- if (pArray->IsUpdateRefs())
- {
- pNew->CopyAllBroadcasters(*rCell.maCell.mpFormula);
- pNew->GetCode()->AdjustReferenceOnMovedOrigin(aOldPos, aCellPos);
- }
- else
- {
- pNew->GetCode()->AdjustReferenceOnMovedOriginIfOtherSheet(aOldPos, aCellPos);
- }
-
- rCellStore.push_back(pNew);
- }
- break;
- default:
- assert(!rCell.mpAttr);
- rCellStore.push_back_empty();
- }
-
- sc::CellTextAttrStoreType& rAttrStore = aSortedCols.at(j).maCellTextAttrs;
- if (rCell.mpAttr)
- rAttrStore.push_back(*rCell.mpAttr);
- else
- rAttrStore.push_back_empty();
-
- if (pArray->IsUpdateRefs())
- {
- // At this point each broadcaster instance is managed by 2
- // containers. We will release those in the original storage
- // below before transferring them to the document.
- sc::BroadcasterStoreType& rBCStore = aSortedCols.at(j).maBroadcasters;
- if (rCell.mpBroadcaster)
- // A const pointer would be implicitly converted to a bool type.
- rBCStore.push_back(const_cast<SvtBroadcaster*>(rCell.mpBroadcaster));
- else
- rBCStore.push_back_empty();
- }
-
- // The same with cell note instances ...
- sc::CellNoteStoreType& rNoteStore = aSortedCols.at(j).maCellNotes;
- if (rCell.mpNote)
- rNoteStore.push_back(const_cast<ScPostIt*>(rCell.mpNote));
- else
- rNoteStore.push_back_empty();
-
- if (rCell.mpPattern)
- aSortedCols.at(j).setPattern(aCellPos.Row(), rCell.mpPattern);
- }
-
- if (pArray->IsKeepQuery())
- {
- // Hidden and filtered flags are first converted to segments.
- SCROW nRow = nRow1 + i;
- aRowFlags.setRowHidden(nRow, pRow->mbHidden);
- aRowFlags.setRowFiltered(nRow, pRow->mbFiltered);
- }
-
- if (pProgress)
- pProgress->SetStateOnPercent(i);
- }
+ fillSortedColumnArray(aSortedCols, aRowFlags, pArray, nTab, nCol1, nCol2, pProgress);
for (size_t i = 0, n = aSortedCols.size(); i < n; ++i)
{