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:
parent
dfcb70e5ae
commit
a01047f0e6
149
bsc1181644.diff
Normal file
149
bsc1181644.diff
Normal 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
|
||||
|
@ -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>
|
||||
|
||||
|
@ -105,6 +105,8 @@ Patch4: use-comphelper.patch
|
||||
Patch10: bsc1177955.diff
|
||||
# Bug 1174465 - LO-L3: Impress in TW (7.0.0.0-beta2) messes up bullet points
|
||||
Patch11: bsc1174465.diff
|
||||
# Bug 1181644 - LO-L3: Text changes are reproducibly lost (PPTX, SmartArt)
|
||||
Patch12: bsc1181644.diff
|
||||
# try to save space by using hardlinks
|
||||
Patch990: install-with-hardlinks.diff
|
||||
# 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
|
||||
%patch10 -p1
|
||||
%patch11 -p1
|
||||
%patch12 -p1
|
||||
%patch990 -p1
|
||||
%patch991 -p1
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user