tdf#129516 DOCX import: fix incorrect z-order with textboxes

Commit 3272c1eb55 (related tdf#100074:
prepare group shapes text input via writerfilter, 2018-10-01) tweaked
the oox code, so that later it'll be able to call back to writerfilter
to parse group shape text. That makes sense, but it also removed the
reset of the group shape context, which means that two subsequent group
shapes are now imported as a single group shape with a merged child
list.

Reset the group shape context again when writerfilter asks for the
XShape from oox. If this causes a problem for the above scenario later,
then it could be considered to handle this in
ShapeContextHandler::endFastElement().

Change-Id: I14f7f0bab2c66c8430313d5b2daffe3160a58c27
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86712
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
This commit is contained in:
Miklos Vajna 2020-01-13 20:08:54 +01:00
parent e73b99b8dd
commit 5960c6f4ca
5 changed files with 131 additions and 0 deletions

View file

@ -0,0 +1,45 @@
# -*- 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,oox_shape))
$(eval $(call gb_CppunitTest_use_externals,oox_shape,\
boost_headers \
))
$(eval $(call gb_CppunitTest_add_exception_objects,oox_shape, \
oox/qa/unit/shape \
))
$(eval $(call gb_CppunitTest_use_libraries,oox_shape, \
comphelper \
cppu \
oox \
sal \
test \
unotest \
utl \
))
$(eval $(call gb_CppunitTest_use_sdk_api,oox_shape))
$(eval $(call gb_CppunitTest_use_ure,oox_shape))
$(eval $(call gb_CppunitTest_use_vcl,oox_shape))
$(eval $(call gb_CppunitTest_use_rdb,oox_shape,services))
$(eval $(call gb_CppunitTest_use_custom_headers,oox_shape,\
officecfg/registry \
))
$(eval $(call gb_CppunitTest_use_configuration,oox_shape))
# vim: set noet sw=4 ts=4:

View file

@ -28,6 +28,7 @@ $(eval $(call gb_Module_add_check_targets,oox,\
CppunitTest_oox_mathml \
CppunitTest_oox_drawingml \
CppunitTest_oox_vml \
CppunitTest_oox_shape \
))
# vim: set noet sw=4 ts=4:

Binary file not shown.

84
oox/qa/unit/shape.cxx Normal file
View file

@ -0,0 +1,84 @@
/* -*- 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 <test/bootstrapfixture.hxx>
#include <unotest/macros_test.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
#include <com/sun/star/embed/XStorage.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/frame/XStorable.hpp>
#include <com/sun/star/text/WritingMode2.hpp>
#include <comphelper/embeddedobjectcontainer.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/propertyvalue.hxx>
#include <comphelper/scopeguard.hxx>
#include <comphelper/storagehelper.hxx>
#include <unotools/mediadescriptor.hxx>
#include <unotools/tempfile.hxx>
using namespace ::com::sun::star;
char const DATA_DIRECTORY[] = "/oox/qa/unit/data/";
/// oox shape tests.
class OoxShapeTest : public test::BootstrapFixture, public unotest::MacrosTest
{
private:
uno::Reference<uno::XComponentContext> mxComponentContext;
uno::Reference<lang::XComponent> mxComponent;
public:
void setUp() override;
void tearDown() override;
uno::Reference<lang::XComponent>& getComponent() { return mxComponent; }
void load(const OUString& rURL);
};
void OoxShapeTest::setUp()
{
test::BootstrapFixture::setUp();
mxComponentContext.set(comphelper::getComponentContext(getMultiServiceFactory()));
mxDesktop.set(frame::Desktop::create(mxComponentContext));
}
void OoxShapeTest::tearDown()
{
if (mxComponent.is())
mxComponent->dispose();
test::BootstrapFixture::tearDown();
}
void OoxShapeTest::load(const OUString& rFileName)
{
OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + rFileName;
mxComponent = loadFromDesktop(aURL);
}
CPPUNIT_TEST_FIXTURE(OoxShapeTest, testMultipleGroupShapes)
{
load("multiple-group-shapes.docx");
uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY);
uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
uno::UNO_QUERY);
// Without the accompanying fix in place, this test would have failed with:
// - Expected: 2
// - Actual : 1
// i.e. the 2 group shapes from the document were imported as a single one.
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xDrawPage->getCount());
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View file

@ -498,6 +498,7 @@ ShapeContextHandler::getShape()
pShape->addShape(*mxFilterBase, mpThemePtr.get(), xShapes, aMatrix, pShape->getFillProperties());
xResult = pShape->getXShape();
mxSavedShape = xResult;
mxWpgContext.clear();
}
}
else if (mpShape.get() != nullptr)