diff --git a/sw/CppunitTest_sw_core_draw.mk b/sw/CppunitTest_sw_core_draw.mk new file mode 100644 index 000000000000..7e38fbce1386 --- /dev/null +++ b/sw/CppunitTest_sw_core_draw.mk @@ -0,0 +1,74 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sw_core_draw)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sw_core_draw)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sw_core_draw, \ + sw/qa/core/draw/draw \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sw_core_draw, \ + comphelper \ + cppu \ + cppuhelper \ + sal \ + sfx \ + svxcore \ + sw \ + swqahelper \ + test \ + unotest \ + utl \ + vcl \ + svt \ + tl \ + svl \ +)) + +$(eval $(call gb_CppunitTest_use_externals,sw_core_draw,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sw_core_draw,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + -I$(SRCDIR)/sw/source/uibase/inc \ + -I$(SRCDIR)/sw/qa/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_api,sw_core_draw,\ + udkapi \ + offapi \ + oovbaapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,sw_core_draw)) +$(eval $(call gb_CppunitTest_use_vcl,sw_core_draw)) + +$(eval $(call gb_CppunitTest_use_rdb,sw_core_draw,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sw_core_draw,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sw_core_draw)) + +$(eval $(call gb_CppunitTest_use_uiconfigs,sw_core_draw, \ + modules/swriter \ +)) + +$(eval $(call gb_CppunitTest_use_more_fonts,sw_core_draw)) + +# vim: set noet sw=4 ts=4: diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk index 21930dc487b4..12610ebb6c49 100644 --- a/sw/Module_sw.mk +++ b/sw/Module_sw.mk @@ -121,6 +121,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\ CppunitTest_sw_core_crsr \ CppunitTest_sw_core_undo \ CppunitTest_sw_updateall_object_replacements \ + CppunitTest_sw_core_draw \ )) ifneq ($(DISABLE_GUI),TRUE) diff --git a/sw/qa/core/draw/data/as-char-textbox.docx b/sw/qa/core/draw/data/as-char-textbox.docx new file mode 100644 index 000000000000..3edf7c632246 Binary files /dev/null and b/sw/qa/core/draw/data/as-char-textbox.docx differ diff --git a/sw/qa/core/draw/draw.cxx b/sw/qa/core/draw/draw.cxx new file mode 100644 index 000000000000..162bf237d154 --- /dev/null +++ b/sw/qa/core/draw/draw.cxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include + +#include +#include +#include +#include + +char const DATA_DIRECTORY[] = "/sw/qa/core/draw/data/"; + +/// Covers sw/source/core/draw/ fixes. +class SwCoreDrawTest : public SwModelTestBase +{ +}; + +CPPUNIT_TEST_FIXTURE(SwCoreDrawTest, testTextboxDeleteAsChar) +{ + // Load a document with an as-char shape in it that has a textbox and an image in it. + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "as-char-textbox.docx"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + sal_Int32 nActual = pPage->GetObjCount(); + // 3 objects on the draw page: a shape + fly frame pair and a Writer image. + CPPUNIT_ASSERT_EQUAL(static_cast(3), nActual); + + // Select the shape of the textbox and delete it. + SdrObject* pObject = pPage->GetObj(0); + pWrtShell->SelectObj(Point(), 0, pObject); + pWrtShell->DelSelectedObj(); + nActual = pPage->GetObjCount(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 2 + // i.e. the fly frame of the shape and the inner Writer image was not deleted. + CPPUNIT_ASSERT_EQUAL(static_cast(0), nActual); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx index f3f92be2b3f0..2dcda1dc1df3 100644 --- a/sw/source/core/draw/dview.cxx +++ b/sw/source/core/draw/dview.cxx @@ -972,15 +972,16 @@ void SwDrawView::DeleteMarked() { FmFormView::DeleteMarked(); ::FrameNotify( Imp().GetShell(), FLY_DRAG_END ); - - // Only delete these now: earlier deletion would clear the mark list as well. - // Delete in reverse order, assuming that the container is sorted by anchor positions. - for (int i = aTextBoxesToDelete.size() - 1; i >= 0; --i) - { - SwFrameFormat*& rpTextBox = aTextBoxesToDelete[i]; - pDoc->getIDocumentLayoutAccess().DelLayoutFormat(rpTextBox); - } } + + // Only delete these now: earlier deletion would clear the mark list as well. + // Delete in reverse order, assuming that the container is sorted by anchor positions. + for (int i = aTextBoxesToDelete.size() - 1; i >= 0; --i) + { + SwFrameFormat*& rpTextBox = aTextBoxesToDelete[i]; + pDoc->getIDocumentLayoutAccess().DelLayoutFormat(rpTextBox); + } + pDoc->GetIDocumentUndoRedo().EndUndo(SwUndoId::EMPTY, nullptr); if( pTmpRoot ) pTmpRoot->EndAllAction();