Kaydet (Commit) 37b5f1ed authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#78902 VML import: workaround for extreme top margin

Regression from commit 2b78f2cd (rhbz#988516:
DOCX import: fix context stack when importing header/footer, 2014-03-05),
though that just made an existing Writer layout problem visible.

RTF/WW8/newer (drawingML) DOCX import doesn't have this problem, as those
import pictures as sw graphics, not draw ones.

<w10:wrap type="through"/> is normally mapped to our page wrap (as it uses
"through" in the "not only wrap around, but also in the holes of the shape, if
it has any" context, not in our "text should go through it, so no wrapping"
one), but for some reason in this case (most probably due to the extreme large
negative margins) Word handles the situation as our through, i.e. the text
should not go to the second page, as it would normally happen with a "Word
through" wrapping.

Work around the strange situation by ignoring the wrapping request for extreme
top margin values.

Change-Id: I20555b1fa7a769e20c40a3a5ff3873807403e937
üst dd351dd7
...@@ -530,11 +530,18 @@ SimpleShape::SimpleShape( Drawing& rDrawing, const OUString& rService ) : ...@@ -530,11 +530,18 @@ SimpleShape::SimpleShape( Drawing& rDrawing, const OUString& rService ) :
{ {
} }
void lcl_setSurround(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel) void lcl_setSurround(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel, const GraphicHelper& rGraphicHelper)
{ {
OUString aWrapType = rTypeModel.moWrapType.get();
// Extreme negative top margin? Then the shape will end up at the top of the page, it's pointless to perform any kind of wrapping.
sal_Int32 nMarginTop = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, rTypeModel.maMarginTop, 0, false, true);
if (nMarginTop < -35277) // Less than 1000 points.
aWrapType.clear();
sal_Int32 nSurround = css::text::WrapTextMode_THROUGHT; sal_Int32 nSurround = css::text::WrapTextMode_THROUGHT;
if ( rTypeModel.moWrapType.get() == "square" || rTypeModel.moWrapType .get()== "tight" || if ( aWrapType == "square" || aWrapType == "tight" ||
rTypeModel.moWrapType.get() == "through" ) aWrapType == "through" )
{ {
nSurround = css::text::WrapTextMode_PARALLEL; nSurround = css::text::WrapTextMode_PARALLEL;
if ( rTypeModel.moWrapSide.get() == "left" ) if ( rTypeModel.moWrapSide.get() == "left" )
...@@ -542,13 +549,13 @@ void lcl_setSurround(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel) ...@@ -542,13 +549,13 @@ void lcl_setSurround(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
else if ( rTypeModel.moWrapSide.get() == "right" ) else if ( rTypeModel.moWrapSide.get() == "right" )
nSurround = css::text::WrapTextMode_RIGHT; nSurround = css::text::WrapTextMode_RIGHT;
} }
else if ( rTypeModel.moWrapType.get() == "topAndBottom" ) else if ( aWrapType == "topAndBottom" )
nSurround = css::text::WrapTextMode_NONE; nSurround = css::text::WrapTextMode_NONE;
rPropSet.setProperty(PROP_Surround, nSurround); rPropSet.setProperty(PROP_Surround, nSurround);
} }
void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel) void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel, const GraphicHelper& rGraphicHelper)
{ {
if ( rTypeModel.maPositionHorizontal == "center" ) if ( rTypeModel.maPositionHorizontal == "center" )
rPropSet.setAnyProperty(PROP_HoriOrient, makeAny(text::HoriOrientation::CENTER)); rPropSet.setAnyProperty(PROP_HoriOrient, makeAny(text::HoriOrientation::CENTER));
...@@ -611,7 +618,7 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel) ...@@ -611,7 +618,7 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
{ {
rPropSet.setProperty(PROP_AnchorType, text::TextContentAnchorType_AS_CHARACTER); rPropSet.setProperty(PROP_AnchorType, text::TextContentAnchorType_AS_CHARACTER);
} }
lcl_setSurround( rPropSet, rTypeModel ); lcl_setSurround( rPropSet, rTypeModel, rGraphicHelper );
} }
void lcl_SetRotation(PropertySet& rPropSet, const sal_Int32 nRotation) void lcl_SetRotation(PropertySet& rPropSet, const sal_Int32 nRotation)
...@@ -813,7 +820,7 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes ...@@ -813,7 +820,7 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes
} }
} }
lcl_SetAnchorType(aPropertySet, maTypeModel); lcl_SetAnchorType(aPropertySet, maTypeModel, rGraphicHelper );
return xShape; return xShape;
} }
...@@ -842,7 +849,8 @@ Reference< XShape > SimpleShape::createPictureObject( const Reference< XShapes > ...@@ -842,7 +849,8 @@ Reference< XShape > SimpleShape::createPictureObject( const Reference< XShapes >
if ( !maTypeModel.maRotation.isEmpty() ) if ( !maTypeModel.maRotation.isEmpty() )
lcl_SetRotation( aPropSet, maTypeModel.maRotation.toInt32() ); lcl_SetRotation( aPropSet, maTypeModel.maRotation.toInt32() );
lcl_SetAnchorType(aPropSet, maTypeModel); const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper();
lcl_SetAnchorType(aPropSet, maTypeModel, rGraphicHelper);
} }
return xShape; return xShape;
} }
...@@ -1231,7 +1239,8 @@ Reference< XShape > GroupShape::implConvertAndInsert( const Reference< XShapes > ...@@ -1231,7 +1239,8 @@ Reference< XShape > GroupShape::implConvertAndInsert( const Reference< XShapes >
} }
// Make sure group shapes are inline as well, unless there is an explicit different style. // Make sure group shapes are inline as well, unless there is an explicit different style.
PropertySet aPropertySet(xGroupShape); PropertySet aPropertySet(xGroupShape);
lcl_SetAnchorType(aPropertySet, maTypeModel); const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper();
lcl_SetAnchorType(aPropertySet, maTypeModel, rGraphicHelper);
if (!maTypeModel.maRotation.isEmpty()) if (!maTypeModel.maRotation.isEmpty())
lcl_SetRotation(aPropertySet, maTypeModel.maRotation.toInt32()); lcl_SetRotation(aPropertySet, maTypeModel.maRotation.toInt32());
return xGroupShape; return xGroupShape;
......
...@@ -2926,6 +2926,12 @@ DECLARE_OOXMLIMPORT_TEST(testTdf85232, "tdf85232.docx") ...@@ -2926,6 +2926,12 @@ DECLARE_OOXMLIMPORT_TEST(testTdf85232, "tdf85232.docx")
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2267), xShape->getPosition().X); CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2267), xShape->getPosition().X);
} }
DECLARE_OOXMLIMPORT_TEST(testTdf78902, "tdf78902.docx")
{
// This hung in layout.
CPPUNIT_ASSERT_EQUAL(2, getPages());
}
DECLARE_OOXMLIMPORT_TEST(testTdf95775, "tdf95775.docx") DECLARE_OOXMLIMPORT_TEST(testTdf95775, "tdf95775.docx")
{ {
// This must not fail in layout // This must not fail in layout
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment