Kaydet (Commit) a49b8af4 authored tarafından Eike Rathke's avatar Eike Rathke

end/restart group listening in DeleteSelection(), similar to DeleteArea()

Reproducer:
* in A1 enter =SUM(B1:C4)
* copy A1 to clipboard
* paste to A2 and A3
* formula in A2 is =SUM(B2:C5)  A3 is =SUM(B3:C6)
* select A2:A3
* hit Del key to delete the two cells
* enter any numeric value in B2
  => formula result in A1 is not updated
  Shift+Ctrl+F9 hard recalc updates

Change-Id: I55e55b8cfe69e9273170ceaea4e6c046b3d4f7b7
üst d48353f3
...@@ -5647,18 +5647,81 @@ void ScDocument::ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData ...@@ -5647,18 +5647,81 @@ void ScDocument::ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData
void ScDocument::DeleteSelection( InsertDeleteFlags nDelFlag, const ScMarkData& rMark, bool bBroadcast ) void ScDocument::DeleteSelection( InsertDeleteFlags nDelFlag, const ScMarkData& rMark, bool bBroadcast )
{ {
sc::AutoCalcSwitch aACSwitch(*this, false);
std::vector<ScAddress> aGroupPos;
// Destroy and reconstruct listeners only if content is affected.
bool bDelContent = ((nDelFlag & ~IDF_CONTENTS) != nDelFlag);
if (bDelContent)
{
// Record the positions of top and/or bottom formula groups that
// intersect the area borders.
sc::EndListeningContext aCxt(*this);
ScRangeList aRangeList;
rMark.FillRangeListWithMarks( &aRangeList, false);
for (size_t i = 0; i < aRangeList.size(); ++i)
{
const ScRange* pRange = aRangeList[i];
if (pRange)
EndListeningIntersectedGroups( aCxt, *pRange, &aGroupPos);
}
aCxt.purgeEmptyBroadcasters();
}
SCTAB nMax = static_cast<SCTAB>(maTabs.size()); SCTAB nMax = static_cast<SCTAB>(maTabs.size());
ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end(); ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd && *itr < nMax; ++itr) for (; itr != itrEnd && *itr < nMax; ++itr)
if (maTabs[*itr]) if (maTabs[*itr])
maTabs[*itr]->DeleteSelection(nDelFlag, rMark, bBroadcast); maTabs[*itr]->DeleteSelection(nDelFlag, rMark, bBroadcast);
if (bDelContent)
{
// Re-start listeners on those top bottom groups that have been split.
SetNeedsListeningGroups(aGroupPos);
StartNeededListeners();
}
} }
void ScDocument::DeleteSelectionTab( void ScDocument::DeleteSelectionTab(
SCTAB nTab, InsertDeleteFlags nDelFlag, const ScMarkData& rMark, bool bBroadcast ) SCTAB nTab, InsertDeleteFlags nDelFlag, const ScMarkData& rMark, bool bBroadcast )
{ {
if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
{
sc::AutoCalcSwitch aACSwitch(*this, false);
std::vector<ScAddress> aGroupPos;
// Destroy and reconstruct listeners only if content is affected.
bool bDelContent = ((nDelFlag & ~IDF_CONTENTS) != nDelFlag);
if (bDelContent)
{
// Record the positions of top and/or bottom formula groups that
// intersect the area borders.
sc::EndListeningContext aCxt(*this);
ScRangeList aRangeList;
rMark.FillRangeListWithMarks( &aRangeList, false);
for (size_t i = 0; i < aRangeList.size(); ++i)
{
const ScRange* pRange = aRangeList[i];
if (pRange && pRange->aStart.Tab() <= nTab && nTab <= pRange->aEnd.Tab())
{
ScRange aRange( *pRange);
aRange.aStart.SetTab( nTab);
aRange.aEnd.SetTab( nTab);
EndListeningIntersectedGroups( aCxt, aRange, &aGroupPos);
}
}
aCxt.purgeEmptyBroadcasters();
}
maTabs[nTab]->DeleteSelection(nDelFlag, rMark, bBroadcast); maTabs[nTab]->DeleteSelection(nDelFlag, rMark, bBroadcast);
if (bDelContent)
{
// Re-start listeners on those top bottom groups that have been split.
SetNeedsListeningGroups(aGroupPos);
StartNeededListeners();
}
}
else else
{ {
OSL_FAIL("wrong table"); OSL_FAIL("wrong table");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment