tdf#136059 OOXML export: fix shape wrap "Contour"
Custom shapes lost their contour setting, e.g. the text was wrapped around the bounding box of a diamond instead of the shape. Change-Id: Ic1e276b8957751aad95cc2624e9f54dcb853ddad Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108930 Tested-by: László Németh <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org>
This commit is contained in:
committed by
László Németh
parent
c96c386c5d
commit
ec33be1d13
BIN
sw/qa/extras/ooxmlexport/data/tdf136059.odt
Executable file
BIN
sw/qa/extras/ooxmlexport/data/tdf136059.odt
Executable file
Binary file not shown.
@@ -31,6 +31,13 @@ protected:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DECLARE_OOXMLEXPORT_TEST(testTdf136059, "tdf136059.odt")
|
||||||
|
{
|
||||||
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("Contour has not been exported!", true,
|
||||||
|
getProperty<bool>(getShape(1), "SurroundContour"));
|
||||||
|
// With the fix this shall pass, see tdf136059.
|
||||||
|
}
|
||||||
|
|
||||||
DECLARE_OOXMLEXPORT_TEST(testTdf138892_noNumbering, "tdf138892_noNumbering.docx")
|
DECLARE_OOXMLEXPORT_TEST(testTdf138892_noNumbering, "tdf138892_noNumbering.docx")
|
||||||
{
|
{
|
||||||
CPPUNIT_ASSERT_MESSAGE("Para1: Bullet point", !getProperty<OUString>(getParagraph(1), "NumberingStyleName").isEmpty());
|
CPPUNIT_ASSERT_MESSAGE("Para1: Bullet point", !getProperty<OUString>(getParagraph(1), "NumberingStyleName").isEmpty());
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
#include "docxsdrexport.hxx"
|
#include "docxsdrexport.hxx"
|
||||||
#include <com/sun/star/beans/XPropertySet.hpp>
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
||||||
#include <com/sun/star/drawing/PointSequenceSequence.hpp>
|
#include <com/sun/star/drawing/PointSequenceSequence.hpp>
|
||||||
|
#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
|
||||||
#include <editeng/lrspitem.hxx>
|
#include <editeng/lrspitem.hxx>
|
||||||
#include <editeng/ulspitem.hxx>
|
#include <editeng/ulspitem.hxx>
|
||||||
#include <editeng/shaditem.hxx>
|
#include <editeng/shaditem.hxx>
|
||||||
@@ -34,6 +35,8 @@
|
|||||||
#include <frmfmt.hxx>
|
#include <frmfmt.hxx>
|
||||||
#include <IDocumentDrawModelAccess.hxx>
|
#include <IDocumentDrawModelAccess.hxx>
|
||||||
|
|
||||||
|
#include <tools/diagnose_ex.h>
|
||||||
|
|
||||||
using namespace com::sun::star;
|
using namespace com::sun::star;
|
||||||
using namespace oox;
|
using namespace oox;
|
||||||
|
|
||||||
@@ -792,6 +795,77 @@ void DocxSdrExport::startDMLAnchorInline(const SwFrameFormat* pFrameFormat, cons
|
|||||||
m_pImpl->getSerializer()->endElementNS(XML_wp, nWrapToken);
|
m_pImpl->getSerializer()->endElementNS(XML_wp, nWrapToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// In this case we likely had an odt document to be exported to docx.
|
||||||
|
// There is no grab-bag or something else so for a workaround,
|
||||||
|
// let's export the geometry of the shape...
|
||||||
|
// First get the UNO-shape
|
||||||
|
uno::Reference<drawing::XShape> xShape(
|
||||||
|
const_cast<SdrObject*>(pFrameFormat->FindRealSdrObject())->getUnoShape(),
|
||||||
|
uno::UNO_QUERY);
|
||||||
|
|
||||||
|
if (xShape && xShape->getShapeType() == u"com.sun.star.drawing.CustomShape")
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Get the properties of the Xshape
|
||||||
|
uno::Reference<beans::XPropertySet> XProps(xShape, uno::UNO_QUERY);
|
||||||
|
// Get the "CustomShapeGeometry" property and from its Any() make a hashMap
|
||||||
|
comphelper::SequenceAsHashMap aCustomShapeGeometry(
|
||||||
|
XProps->getPropertyValue("CustomShapeGeometry"));
|
||||||
|
// Get the "Path" property and from its Any() make a hashMap
|
||||||
|
comphelper::SequenceAsHashMap aPath(aCustomShapeGeometry.getValue("Path"));
|
||||||
|
// From the Any() of the "Coordinates" property get the points
|
||||||
|
uno::Sequence<css::drawing::EnhancedCustomShapeParameterPair> aCoords
|
||||||
|
= aPath.getValue("Coordinates")
|
||||||
|
.get<uno::Sequence<css::drawing::EnhancedCustomShapeParameterPair>>();
|
||||||
|
|
||||||
|
// Check if only one side wrap allowed
|
||||||
|
OUString sWrapType;
|
||||||
|
switch (pFrameFormat->GetSurround().GetSurround())
|
||||||
|
{
|
||||||
|
case text::WrapTextMode_DYNAMIC:
|
||||||
|
sWrapType = OUString("largest");
|
||||||
|
break;
|
||||||
|
case text::WrapTextMode_LEFT:
|
||||||
|
sWrapType = OUString("left");
|
||||||
|
break;
|
||||||
|
case text::WrapTextMode_RIGHT:
|
||||||
|
sWrapType = OUString("right");
|
||||||
|
break;
|
||||||
|
case text::WrapTextMode_PARALLEL:
|
||||||
|
default:
|
||||||
|
sWrapType = OUString("bothSides");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// And export:
|
||||||
|
nWrapToken = XML_wrapTight;
|
||||||
|
m_pImpl->getSerializer()->startElementNS(XML_wp, nWrapToken, XML_wrapText,
|
||||||
|
sWrapType);
|
||||||
|
|
||||||
|
m_pImpl->getSerializer()->startElementNS(XML_wp, XML_wrapPolygon, XML_edited,
|
||||||
|
"0");
|
||||||
|
|
||||||
|
// There are the coordinates
|
||||||
|
for (sal_Int32 i = 0; i < aCoords.getLength(); i++)
|
||||||
|
m_pImpl->getSerializer()->singleElementNS(
|
||||||
|
XML_wp, (i == 0 ? XML_start : XML_lineTo), XML_x,
|
||||||
|
OString::number(aCoords[i].First.Value.get<double>()), XML_y,
|
||||||
|
OString::number(aCoords[i].Second.Value.get<double>()));
|
||||||
|
|
||||||
|
m_pImpl->getSerializer()->endElementNS(XML_wp, XML_wrapPolygon);
|
||||||
|
|
||||||
|
m_pImpl->getSerializer()->endElementNS(XML_wp, nWrapToken);
|
||||||
|
}
|
||||||
|
catch (uno::Exception& e)
|
||||||
|
{
|
||||||
|
TOOLS_WARN_EXCEPTION(
|
||||||
|
"sw.ww8", "DocxSdrExport::startDMLAnchorInline: exeption: " << e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// No? Then just approximate based on what we have.
|
// No? Then just approximate based on what we have.
|
||||||
|
Reference in New Issue
Block a user