Kaydet (Commit) d2fa9c0d authored tarafından Ilhan Yesil's avatar Ilhan Yesil Kaydeden (comit) Eike Rathke

tdf#123762 Cell anchored object is deleted if cell is deleted

If an object is anchored to a cell, then it is expected that
this object belongs to this cell and it's survive after a
deletion of the cell makes no sense. So the anchored object
will be deleted together with the cell. Objects anchored to
the page are not affected.

Change-Id: I91f24bf92ab5329aba1d053b3cf5fba77bf16e4f
Reviewed-on: https://gerrit.libreoffice.org/69390
Tested-by: Jenkins
Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
üst c9b31caf
......@@ -1512,7 +1512,7 @@ public:
bool HasOLEObjectsInArea( const ScRange& rRange, const ScMarkData* pTabMark = nullptr );
void DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
const ScMarkData& rMark );
const ScMarkData& rMark, bool bAnchored = false );
void DeleteObjectsInSelection( const ScMarkData& rMark );
void DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const ScMarkData& rMark,
......
......@@ -143,7 +143,7 @@ public:
bool HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndRow );
void DeleteObjectsInArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1,
SCCOL nCol2,SCROW nRow2 );
SCCOL nCol2,SCROW nRow2, bool bAnchored = false );
void DeleteObjectsInSelection( const ScMarkData& rMark );
void CopyToClip( ScDocument* pClipDoc, SCTAB nTab, const tools::Rectangle& rRange );
......
......@@ -248,7 +248,7 @@ bool ScDocument::DrawGetPrintArea( ScRange& rRange, bool bSetHor, bool bSetVer )
}
void ScDocument::DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
const ScMarkData& rMark )
const ScMarkData& rMark, bool bAnchored)
{
if (!mpDrawLayer)
return;
......@@ -259,7 +259,7 @@ void ScDocument::DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCR
if (rTab >= nTabCount)
break;
if (maTabs[rTab])
mpDrawLayer->DeleteObjectsInArea( rTab, nCol1, nRow1, nCol2, nRow2 );
mpDrawLayer->DeleteObjectsInArea( rTab, nCol1, nRow1, nCol2, nRow2, bAnchored);
}
}
......
......@@ -1360,7 +1360,7 @@ bool ScDrawLayer::HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndRow )
}
void ScDrawLayer::DeleteObjectsInArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1,
SCCOL nCol2,SCROW nRow2 )
SCCOL nCol2,SCROW nRow2, bool bAnchored )
{
OSL_ENSURE( pDoc, "ScDrawLayer::DeleteObjectsInArea without document" );
if ( !pDoc )
......@@ -1390,8 +1390,17 @@ void ScDrawLayer::DeleteObjectsInArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1,
if (!IsNoteCaption( pObject ))
{
tools::Rectangle aObjRect = pObject->GetCurrentBoundRect();
if ( aDelRect.IsInside( aObjRect ) )
ppObj[nDelCount++] = pObject;
if (aDelRect.IsInside(aObjRect))
{
if (bAnchored)
{
ScAnchorType aAnchorType = ScDrawLayer::GetAnchorType(*pObject);
if(aAnchorType == SCA_CELL || aAnchorType == SCA_CELL_RESIZE)
ppObj[nDelCount++] = pObject;
}
else
ppObj[nDelCount++] = pObject;
}
}
pObject = aIter.Next();
......@@ -1449,8 +1458,8 @@ void ScDrawLayer::DeleteObjectsInSelection( const ScMarkData& rMark )
{
tools::Rectangle aObjRect = pObject->GetCurrentBoundRect();
ScRange aRange = pDoc->GetRange(nTab, aObjRect);
bool bObjectInMarkArea
= aMarkBound.IsInside(aObjRect) && rMark.IsAllMarked(aRange);
bool bObjectInMarkArea =
aMarkBound.IsInside(aObjRect) && rMark.IsAllMarked(aRange);
const ScDrawObjData* pObjData = ScDrawLayer::GetObjData(pObject);
ScAnchorType aAnchorType = ScDrawLayer::GetAnchorType(*pObject);
bool bObjectAnchoredToMarkedCell
......
......@@ -2492,6 +2492,23 @@ bool ScDocFunc::DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark,
rDocShell.UpdatePaintExt( nExtFlags, nStartCol, nStartRow, rTab, nEndCol, nEndRow, rTab );
}
switch (eCmd)
{
case DelCellCmd::CellsUp:
case DelCellCmd::CellsLeft:
rDoc.DeleteObjectsInArea(nStartCol, nStartRow, nEndCol, nEndRow, aMark, true);
break;
case DelCellCmd::Rows:
rDoc.DeleteObjectsInArea(0, nStartRow, MAXCOL, nEndRow, aMark, true);
break;
case DelCellCmd::Cols:
rDoc.DeleteObjectsInArea(nStartCol, 0, nEndCol, MAXROW, aMark, true);
break;
default:
break;
}
bool bUndoOutline = false;
switch (eCmd)
{
......
......@@ -1838,15 +1838,22 @@ void ScViewFunc::DeleteMulti( bool bRows )
}
std::vector<sc::ColRowSpan>::const_reverse_iterator ri = aSpans.rbegin(), riEnd = aSpans.rend();
aFuncMark.SelectOneTable(nTab);
for (; ri != riEnd; ++ri)
{
SCCOLROW nEnd = ri->mnEnd;
SCCOLROW nStart = ri->mnStart;
if (bRows)
rDoc.DeleteRow( 0,nTab, MAXCOL,nTab, nStart, static_cast<SCSIZE>(nEnd-nStart+1) );
{
rDoc.DeleteObjectsInArea(0, nStart, MAXCOL, nEnd, aFuncMark, true);
rDoc.DeleteRow(0, nTab, MAXCOL, nTab, nStart, static_cast<SCSIZE>(nEnd - nStart + 1));
}
else
rDoc.DeleteCol( 0,nTab, MAXROW,nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd-nStart+1) );
{
rDoc.DeleteObjectsInArea(nStart, 0, nEnd, MAXROW, aFuncMark, true);
rDoc.DeleteCol(0, nTab, MAXROW, nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd - nStart + 1));
}
}
if (bNeedRefresh)
......
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