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>
|
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
|
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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user