Listening when grouping in ScColumn::AttachNewFormulaCells(), (tdf#123736)
Not directly related to tdf#123736 but similar approach.
Setting a vector with ScColumn::SetFormulaCells() is currently
only done for Undo documents, but implementation provided
listening as only single cell listening for not-undo/clip
documents, which wouldn't work if actually used in grouping
context. The upcoming unit tests will use SetFormulaCells() for
checks.
Change-Id: I990e6a5d6e1efcf70a2661b3a9a39c37d9e4c2e6
Reviewed-on: https://gerrit.libreoffice.org/69371
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index da63528..b8b4db6 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -717,7 +717,7 @@ private:
bool bJoin = true, sc::StartListeningType eListenType = sc::SingleCellListening );
void AttachNewFormulaCells( const sc::CellStoreType::position_type& aPos, size_t nLength,
const std::vector<SCROW>& rNewSharedRows );
std::vector<SCROW>& rNewSharedRows );
void BroadcastNewCell( SCROW nRow );
bool UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow, sc::CellStoreType::iterator& itr );
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index fe78809..d46bf46 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -625,7 +625,7 @@ void ScColumn::AttachNewFormulaCell(
}
void ScColumn::AttachNewFormulaCells( const sc::CellStoreType::position_type& aPos, size_t nLength,
const std::vector<SCROW>& rNewSharedRows )
std::vector<SCROW>& rNewSharedRows )
{
// Make sure the whole length consists of formula cells.
if (aPos.first->type != sc::element_type_formula)
@@ -636,17 +636,50 @@ void ScColumn::AttachNewFormulaCells( const sc::CellStoreType::position_type& aP
return;
// Join the top and bottom cells only.
ScFormulaCell* pCell = sc::formula_block::at(*aPos.first->data, aPos.second);
JoinNewFormulaCell(aPos, *pCell);
ScFormulaCell* pCell1 = sc::formula_block::at(*aPos.first->data, aPos.second);
JoinNewFormulaCell(aPos, *pCell1);
sc::CellStoreType::position_type aPosLast = aPos;
aPosLast.second += nLength - 1;
pCell = sc::formula_block::at(*aPosLast.first->data, aPosLast.second);
JoinNewFormulaCell(aPosLast, *pCell);
ScFormulaCell* pCell2 = sc::formula_block::at(*aPosLast.first->data, aPosLast.second);
JoinNewFormulaCell(aPosLast, *pCell2);
ScDocument* pDocument = GetDoc();
if (!pDocument->IsClipOrUndo() && !pDocument->IsInsertingFromOtherDoc())
{
const bool bShared = pCell1->IsShared() || pCell2->IsShared();
if (bShared)
{
const SCROW nTopRow = (pCell1->IsShared() ? pCell1->GetSharedTopRow() : pCell1->aPos.Row());
const SCROW nBotRow = (pCell2->IsShared() ?
pCell2->GetSharedTopRow() + pCell2->GetSharedLength() - 1 : pCell2->aPos.Row());
if (rNewSharedRows.empty())
{
rNewSharedRows.push_back( nTopRow);
rNewSharedRows.push_back( nBotRow);
}
else if (rNewSharedRows.size() == 2)
{
// Combine into one span.
if (rNewSharedRows[0] > nTopRow)
rNewSharedRows[0] = nTopRow;
if (rNewSharedRows[1] < nBotRow)
rNewSharedRows[1] = nBotRow;
}
else if (rNewSharedRows.size() == 4)
{
// Merge into one span.
// The original two spans are ordered from top to bottom.
std::vector<SCROW> aRows(2);
aRows[0] = std::min( rNewSharedRows[0], nTopRow);
aRows[1] = std::max( rNewSharedRows[3], nBotRow);
rNewSharedRows.swap( aRows);
}
else
{
assert(!"rNewSharedRows?");
}
}
StartListeningUnshared( rNewSharedRows);
sc::StartListeningContext aCxt(*pDocument);
@@ -654,10 +687,10 @@ void ScColumn::AttachNewFormulaCells( const sc::CellStoreType::position_type& aP
ScFormulaCell** ppEnd = pp + nLength;
for (; pp != ppEnd; ++pp)
{
pCell = *pp;
pCell->StartListeningTo(aCxt);
if (!bShared)
(*pp)->StartListeningTo(aCxt);
if (!pDocument->IsCalcingAfterLoad())
pCell->SetDirty();
(*pp)->SetDirty();
}
}
}