[Libreoffice-commits] core.git: Branch 'libreoffice-7-0' - sw/CppunitTest_sw_core_draw.mk sw/Module_sw.mk sw/qa sw/source

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Tue Sep 8 19:35:29 UTC 2020


 sw/CppunitTest_sw_core_draw.mk            |   73 ++++++++++++++++++++++++++++++
 sw/Module_sw.mk                           |    1 
 sw/qa/core/draw/data/as-char-textbox.docx |binary
 sw/qa/core/draw/draw.cxx                  |   51 ++++++++++++++++++++
 sw/qa/inc/swmodeltestbase.hxx             |   19 +++++++
 sw/source/core/draw/dview.cxx             |   15 +++---
 6 files changed, 152 insertions(+), 7 deletions(-)

New commits:
commit 821909ee711f7806d899900b739503f20e1879e5
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Mon Sep 7 21:23:07 2020 +0200
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Tue Sep 8 21:34:53 2020 +0200

    tdf#135149 sw: fix deleting textbox of as-char shapes
    
    Regression from 7596e26fd259ce5445212949403e7cd32303b2bd (Add
    SwTextBoxHelper::findShapes, 2014-06-24), the problem was that in case
    the shape is as-char anchored, then DeleteSelection() returns false, and
    so the textboxes of the deleted shapes are not deleted.
    
    There is no real reason why deletion should be conditional on the
    DeleteSelection() result, so just move it outside that block, so
    textboxes are always deleted.
    
    (cherry picked from commit da4f9b77a6cd39b1ae5babdd476d1575c8b9371c)
    
    Conflicts:
            sw/Module_sw.mk
    
    Change-Id: Ib3bd444e9e96f9de0f68a9162ab39255ec5a6807
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102220
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sw/CppunitTest_sw_core_draw.mk b/sw/CppunitTest_sw_core_draw.mk
new file mode 100644
index 000000000000..77e62dd876b6
--- /dev/null
+++ b/sw/CppunitTest_sw_core_draw.mk
@@ -0,0 +1,73 @@
+# -*- 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 \
+    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 e2fd9b5ed75a..be2e7e8d86c7 100644
--- a/sw/Module_sw.mk
+++ b/sw/Module_sw.mk
@@ -119,6 +119,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\
     CppunitTest_sw_core_unocore \
     CppunitTest_sw_core_crsr \
     CppunitTest_sw_core_undo \
+    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 <swmodeltestbase.hxx>
+
+#include <svx/svdpage.hxx>
+
+#include <IDocumentDrawModelAccess.hxx>
+#include <docsh.hxx>
+#include <drawdoc.hxx>
+#include <wrtsh.hxx>
+
+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<sal_Int32>(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<sal_Int32>(0), nActual);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/inc/swmodeltestbase.hxx b/sw/qa/inc/swmodeltestbase.hxx
index 8265801f36f8..8769e38992c2 100644
--- a/sw/qa/inc/swmodeltestbase.hxx
+++ b/sw/qa/inc/swmodeltestbase.hxx
@@ -1030,6 +1030,25 @@ protected:
         // reqif-xhtml
         xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("reqif-xhtml"), BAD_CAST("http://www.w3.org/1999/xhtml"));
     }
+
+    /**
+     * Creates a new document to be used with the internal sw/ API.
+     *
+     * Examples:
+     * SwDoc* pDoc = createSwDoc();
+     * SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "test.fodt");
+     */
+    SwDoc* createSwDoc(const OUString& rDataDirectory = OUString(), const char* pName = nullptr)
+    {
+        if (rDataDirectory.isEmpty() || !pName)
+            loadURL("private:factory/swriter", nullptr);
+        else
+            load(rDataDirectory, pName);
+
+        SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
+        CPPUNIT_ASSERT(pTextDoc);
+        return pTextDoc->GetDocShell()->GetDoc();
+    }
 };
 
 /**
diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx
index fd69be2ca96a..d02f57e9fa55 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();


More information about the Libreoffice-commits mailing list