Kaydet (Commit) e756b6f3 authored tarafından Samuel Mehrbrodt's avatar Samuel Mehrbrodt

tdf#122982 Remove image from cell when cutting the cell

Change-Id: Idd73dcc88a8cd76eb4011bb26efdd5c712d16e5e
Reviewed-on: https://gerrit.libreoffice.org/67844
Tested-by: Jenkins
Reviewed-by: 's avatarSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
üst 954397df
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <svx/svdocirc.hxx> #include <svx/svdocirc.hxx>
#include <scitems.hxx> #include <scitems.hxx>
#include <drwlayer.hxx> #include <drwlayer.hxx>
#include <cliputil.hxx>
#include <sc.hrc> #include <sc.hrc>
...@@ -41,12 +42,14 @@ public: ...@@ -41,12 +42,14 @@ public:
void testTdf76183(); void testTdf76183();
void testODFAnchorTypes(); void testODFAnchorTypes();
void testCopyColumnWithImages(); void testCopyColumnWithImages();
void testCutWithImages();
CPPUNIT_TEST_SUITE(ScAnchorTest); CPPUNIT_TEST_SUITE(ScAnchorTest);
CPPUNIT_TEST(testUndoAnchor); CPPUNIT_TEST(testUndoAnchor);
CPPUNIT_TEST(testTdf76183); CPPUNIT_TEST(testTdf76183);
CPPUNIT_TEST(testODFAnchorTypes); CPPUNIT_TEST(testODFAnchorTypes);
CPPUNIT_TEST(testCopyColumnWithImages); CPPUNIT_TEST(testCopyColumnWithImages);
CPPUNIT_TEST(testCutWithImages);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
private: private:
...@@ -308,6 +311,65 @@ void ScAnchorTest::testCopyColumnWithImages() ...@@ -308,6 +311,65 @@ void ScAnchorTest::testCopyColumnWithImages()
pDocSh->DoClose(); pDocSh->DoClose();
} }
void ScAnchorTest::testCutWithImages()
{
OUString aFileURL;
createFileURL("3AnchorTypes.ods", aFileURL);
// open the document with graphic included
uno::Reference<css::lang::XComponent> xComponent = loadFromDesktop(aFileURL);
CPPUNIT_ASSERT(xComponent.is());
// Get the document model
SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(xComponent);
CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell);
ScDocShell* pDocSh = dynamic_cast<ScDocShell*>(pFoundShell);
CPPUNIT_ASSERT(pDocSh);
ScDocument* pDoc = &(pDocSh->GetDocument());
ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
CPPUNIT_ASSERT(pDrawLayer);
// Get the document controller
ScTabViewShell* pViewShell = pDocSh->GetBestViewShell(false);
CPPUNIT_ASSERT(pViewShell != nullptr);
// Cut whole column
{
// Cut source range
ScRange aSrcRange;
aSrcRange.Parse("A1:A11", pDoc, pDoc->GetAddressConvention());
pViewShell->GetViewData().GetMarkData().SetMarkArea(aSrcRange);
pViewShell->GetViewData().GetView()->CutToClip();
std::map<SCROW, std::vector<SdrObject*>> aRowObjects
= pDrawLayer->GetObjectsAnchoredToRange(0, 0, 0, 11);
// Images should have been removed from the cells
CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be no image anchored to A3", 0,
static_cast<int>(aRowObjects[2].size()));
CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be no image anchored to A11", 0,
static_cast<int>(aRowObjects[10].size()));
}
// Cut individual cells
{
// Cut source cells
ScRange aSrcRange;
aSrcRange.Parse("A3:B3", pDoc, pDoc->GetAddressConvention());
pViewShell->GetViewData().GetMarkData().SetMarkArea(aSrcRange);
pViewShell->GetViewData().GetView()->CutToClip();
// Image should have been removed from the cell
std::map<SCROW, std::vector<SdrObject*>> aRowObjects
= pDrawLayer->GetObjectsAnchoredToRange(0, 0, 2, 2);
CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be no image anchored to A3", 0,
static_cast<int>(aRowObjects[2].size()));
}
pDocSh->DoClose();
}
void ScAnchorTest::tearDown() void ScAnchorTest::tearDown()
{ {
if (mxComponent.is()) if (mxComponent.is())
......
...@@ -1446,11 +1446,18 @@ void ScDrawLayer::DeleteObjectsInSelection( const ScMarkData& rMark ) ...@@ -1446,11 +1446,18 @@ void ScDrawLayer::DeleteObjectsInSelection( const ScMarkData& rMark )
if (!IsNoteCaption( pObject )) if (!IsNoteCaption( pObject ))
{ {
tools::Rectangle aObjRect = pObject->GetCurrentBoundRect(); tools::Rectangle aObjRect = pObject->GetCurrentBoundRect();
if ( aMarkBound.IsInside( aObjRect ) ) ScRange aRange = pDoc->GetRange(nTab, aObjRect);
bool bObjectInMarkArea
= aMarkBound.IsInside(aObjRect) && rMark.IsAllMarked(aRange);
const ScDrawObjData* pObjData = ScDrawLayer::GetObjData(pObject);
ScAnchorType aAnchorType = ScDrawLayer::GetAnchorType(*pObject);
bool bObjectAnchoredToMarkedCell
= ((aAnchorType == SCA_CELL || aAnchorType == SCA_CELL_RESIZE)
&& rMark.IsCellMarked(pObjData->maStart.Col(),
pObjData->maStart.Row()));
if (bObjectInMarkArea || bObjectAnchoredToMarkedCell)
{ {
ScRange aRange = pDoc->GetRange( nTab, aObjRect ); ppObj[nDelCount++] = pObject;
if (rMark.IsAllMarked(aRange))
ppObj[nDelCount++] = pObject;
} }
} }
......
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