Accepting request 875443 from LibreOffice:7.1

- Fix bsc#1181644 - LO-L3: Text changes are reproducibly lost (PPTX, SmartArt)
  * bsc1181644.diff

OBS-URL: https://build.opensuse.org/request/show/875443
OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=948
This commit is contained in:
Markéta Machová 2021-03-01 09:36:19 +00:00 committed by Git OBS Bridge
parent dfcb70e5ae
commit a01047f0e6
3 changed files with 158 additions and 0 deletions

149
bsc1181644.diff Normal file
View File

@ -0,0 +1,149 @@
From 54ad2128db5d324f530cb15ee56e6512d9093872 Mon Sep 17 00:00:00 2001
From: Miklos Vajna <vmiklos@collabora.com>
Date: Thu, 25 Feb 2021 18:04:19 +0100
Subject: [PATCH] tdf#132368 svx: empty the interop grab-bag on ending text
edit
Regression from commit aafaf1f55fa413ad49d4556cf7c0a713dd206ae4 (PPTX
export: save SmartArt as diagram instead of group of shapes,
2019-03-13), the idea of interop grab-bag was to carry additional
information around as long as the object is not changed.
However, actual clearing of the grab-bag was never implemented, do this
when editing shape text.
An alternative would be to do this in SdrObject::SetChanged(), but
Writer sets the layer of SdrObjects during layout (when the import
filter is already finished and undo is enabled), so that would mean loss
of the smartart metadata for DOCX.
Change-Id: I9ab205b4ef84169f4b5a16b86fe9a152e3370a6c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111560
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org>
---
svx/CppunitTest_svx_unit.mk | 1 +
svx/qa/unit/svdraw.cxx | 55 ++++++++++++++++++++++++++++++++++++
svx/source/svdraw/svdobj.cxx | 20 +++++++++++++
3 files changed, 76 insertions(+)
diff --git a/svx/CppunitTest_svx_unit.mk b/svx/CppunitTest_svx_unit.mk
index ac9f3e4531ad..892490265261 100644
--- a/svx/CppunitTest_svx_unit.mk
+++ b/svx/CppunitTest_svx_unit.mk
@@ -36,6 +36,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,svx_unit, \
$(eval $(call gb_CppunitTest_use_libraries,svx_unit, \
basegfx \
drawinglayer \
+ editeng \
sal \
sfx \
svxcore \
diff --git a/svx/qa/unit/svdraw.cxx b/svx/qa/unit/svdraw.cxx
index c96ccbb7aa97..783420d56fea 100644
--- a/svx/qa/unit/svdraw.cxx
+++ b/svx/qa/unit/svdraw.cxx
@@ -25,6 +25,12 @@
#include <svx/svdpage.hxx>
#include <svx/unopage.hxx>
#include <vcl/virdev.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <sfx2/viewsh.hxx>
+#include <svx/svdview.hxx>
+#include <svx/unoapi.hxx>
+#include <sal/log.hxx>
+
#include <sdr/contact/objectcontactofobjlistpainter.hxx>
using namespace ::com::sun::star;
@@ -105,6 +111,55 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testSemiTransparentText)
CPPUNIT_ASSERT_EQUAL(nTransparence,
static_cast<sal_Int16>(basegfx::fround(fTransparence * 100)));
}
+
+CPPUNIT_TEST_FIXTURE(SvdrawTest, testTextEditEmptyGrabBag)
+{
+ // Given a document with a groupshape, which has 2 children.
+ getComponent() = loadFromDesktop("private:factory/sdraw");
+ uno::Reference<lang::XMultiServiceFactory> xFactory(getComponent(), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xRect1(
+ xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY);
+ xRect1->setPosition(awt::Point(1000, 1000));
+ xRect1->setSize(awt::Size(10000, 10000));
+ uno::Reference<drawing::XShape> xRect2(
+ xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY);
+ xRect2->setPosition(awt::Point(1000, 1000));
+ xRect2->setSize(awt::Size(10000, 10000));
+ uno::Reference<drawing::XShapes> xGroup(
+ xFactory->createInstance("com.sun.star.drawing.GroupShape"), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xGroupShape(xGroup, uno::UNO_QUERY);
+ xDrawPage->add(xGroupShape);
+ xGroup->add(xRect1);
+ xGroup->add(xRect2);
+ uno::Reference<text::XTextRange> xRect2Text(xRect2, uno::UNO_QUERY);
+ xRect2Text->setString("x");
+ uno::Sequence<beans::PropertyValue> aGrabBag = {
+ comphelper::makePropertyValue("OOXLayout", true),
+ };
+ uno::Reference<beans::XPropertySet> xGroupProps(xGroup, uno::UNO_QUERY);
+ xGroupProps->setPropertyValue("InteropGrabBag", uno::makeAny(aGrabBag));
+
+ // When editing the shape text of the 2nd rectangle (insert a char at the start).
+ SfxViewShell* pViewShell = SfxViewShell::Current();
+ SdrView* pSdrView = pViewShell->GetDrawView();
+ SdrObject* pObject = GetSdrObjectFromXShape(xRect2);
+ pSdrView->SdrBeginTextEdit(pObject);
+ EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView();
+ rEditView.InsertText("y");
+ pSdrView->SdrEndTextEdit();
+
+ // Then make sure that grab-bag is empty to avoid loosing the new text.
+ xGroupProps->getPropertyValue("InteropGrabBag") >>= aGrabBag;
+ // Without the accompanying fix in place, this test would have failed with:
+ // assertion failed
+ // - Expression: !aGrabBag.hasElements()
+ // i.e. the grab-bag was still around after modifying the shape, and that grab-bag contained the
+ // old text.
+ CPPUNIT_ASSERT(!aGrabBag.hasElements());
+}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index 638c590a52cd..5480ac1d86ce 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -1740,6 +1740,26 @@ void SdrObject::SetOutlinerParaObject(std::unique_ptr<OutlinerParaObject> pTextO
if (GetCurrentBoundRect()!=aBoundRect0) {
SendUserCall(SdrUserCallType::Resize,aBoundRect0);
}
+
+ if (getSdrModelFromSdrObject().IsUndoEnabled())
+ {
+ // Don't do this during import.
+ SdrObject* pTopGroupObj = nullptr;
+ if (getParentSdrObjectFromSdrObject())
+ {
+ pTopGroupObj = getParentSdrObjectFromSdrObject();
+ while (pTopGroupObj->getParentSdrObjectFromSdrObject())
+ {
+ pTopGroupObj = pTopGroupObj->getParentSdrObjectFromSdrObject();
+ }
+ }
+ if (pTopGroupObj)
+ {
+ // A shape was modified, which is in a group shape. Empty the group shape's grab-bag,
+ // which potentially contains the old text of the shapes in case of diagrams.
+ pTopGroupObj->SetGrabBagItem(uno::makeAny(uno::Sequence<beans::PropertyValue>()));
+ }
+ }
}
void SdrObject::NbcSetOutlinerParaObject(std::unique_ptr<OutlinerParaObject> /*pTextObject*/)
--
2.26.2

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Fri Feb 26 15:00:29 UTC 2021 - Andras Timar <andras.timar@collabora.com>
- Fix bsc#1181644 - LO-L3: Text changes are reproducibly lost (PPTX, SmartArt)
* bsc1181644.diff
------------------------------------------------------------------- -------------------------------------------------------------------
Fri Feb 19 13:35:18 UTC 2021 - Andras Timar <andras.timar@collabora.com> Fri Feb 19 13:35:18 UTC 2021 - Andras Timar <andras.timar@collabora.com>

View File

@ -105,6 +105,8 @@ Patch4: use-comphelper.patch
Patch10: bsc1177955.diff Patch10: bsc1177955.diff
# Bug 1174465 - LO-L3: Impress in TW (7.0.0.0-beta2) messes up bullet points # Bug 1174465 - LO-L3: Impress in TW (7.0.0.0-beta2) messes up bullet points
Patch11: bsc1174465.diff Patch11: bsc1174465.diff
# Bug 1181644 - LO-L3: Text changes are reproducibly lost (PPTX, SmartArt)
Patch12: bsc1181644.diff
# try to save space by using hardlinks # try to save space by using hardlinks
Patch990: install-with-hardlinks.diff Patch990: install-with-hardlinks.diff
# save time by relying on rpm check rather than doing stupid find+grep # save time by relying on rpm check rather than doing stupid find+grep
@ -966,6 +968,7 @@ Provides %{langname} translations and additional resources (help files, etc.) fo
%patch4 -p1 %patch4 -p1
%patch10 -p1 %patch10 -p1
%patch11 -p1 %patch11 -p1
%patch12 -p1
%patch990 -p1 %patch990 -p1
%patch991 -p1 %patch991 -p1