n#751054 fix VML import of absolutely positioned pictures

There were multiple issues here:

- convertEmuToHmm() not handling negative values
- position:absolute style property being ignored
- mso-position-vertical-relative is not converted to
  text::RelOrientation
- SwAnchoredDrawObject::_SetPositioningAttr() re-positioning already
  positioned objects
- DomainMapper_Impl::PushShapeContext() inserting positioned objects as
  character
This commit is contained in:
Miklos Vajna
2012-03-22 10:34:24 +01:00
parent a75fd2d50e
commit 51cfbf0cfa
7 changed files with 29 additions and 4 deletions

View File

@@ -156,7 +156,7 @@ inline sal_Int64 convertHmmToEmu( sal_Int32 nValue )
/** Converts the passed 64-bit integer value from EMUs to 1/100 mm. */
inline sal_Int32 convertEmuToHmm( sal_Int64 nValue )
{
return getLimitedValue< sal_Int32, sal_Int64 >( (nValue + EMU_PER_HMM / 2) / EMU_PER_HMM, 0, SAL_MAX_INT32 );
return getLimitedValue< sal_Int32, sal_Int64 >( (nValue + EMU_PER_HMM / 2) / EMU_PER_HMM, SAL_MIN_INT32, SAL_MAX_INT32 );
}
// ============================================================================

View File

@@ -79,6 +79,7 @@ struct ShapeTypeModel
::rtl::OUString maHeight; /// Height of the shape bounding box (number with unit).
::rtl::OUString maMarginLeft; /// X position of the shape bounding box to shape anchor (number with unit).
::rtl::OUString maMarginTop; /// Y position of the shape bounding box to shape anchor (number with unit).
::rtl::OUString maPositionVerticalRelative; /// The Y position is relative to this.
StrokeModel maStrokeModel; /// Border line formatting.
FillModel maFillModel; /// Shape fill formatting.

View File

@@ -498,6 +498,7 @@ VerticalAlign
VerticalSplitMode
VerticalSplitPositionTwips
VertOrientPosition
VertOrientRelation
ViewBox
Visible
VisibleFlag

View File

@@ -42,6 +42,7 @@
#include <com/sun/star/text/XTextContent.hpp>
#include <com/sun/star/text/XTextDocument.hpp>
#include <com/sun/star/text/XTextFrame.hpp>
#include <com/sun/star/text/TextContentAnchorType.hpp>
#include <rtl/math.hxx>
#include <rtl/ustrbuf.hxx>
#include "oox/drawingml/shapepropertymap.hxx"
@@ -59,6 +60,7 @@
using ::com::sun::star::beans::XPropertySet;
using ::com::sun::star::uno::Any;
using namespace ::com::sun::star;
using namespace ::com::sun::star::text;
namespace oox {
@@ -524,11 +526,21 @@ Reference< XShape > ComplexShape::implConvertAndInsert( const Reference< XShapes
if( xShape.is() )
{
OUString aGraphicUrl = rFilter.getGraphicHelper().importEmbeddedGraphicObject( aGraphicPath );
PropertySet aPropSet( xShape );
if( !aGraphicUrl.isEmpty() )
{
PropertySet aPropSet( xShape );
aPropSet.setProperty( PROP_GraphicURL, aGraphicUrl );
}
// If the shape has an absolute position, set the properties accordingly.
if (maTypeModel.maPosition.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("absolute")))
{
aPropSet.setProperty(PROP_HoriOrientPosition, rShapeRect.X);
aPropSet.setProperty(PROP_VertOrientPosition, rShapeRect.Y);
}
if (maTypeModel.maPositionVerticalRelative.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("page")))
{
aPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::PAGE_FRAME);
}
}
return xShape;
}

View File

@@ -346,6 +346,7 @@ void ShapeTypeContext::setStyle( const OUString& rStyle )
else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "height" ) ) ) mrTypeModel.maHeight = aValue;
else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "margin-left" ) ) ) mrTypeModel.maMarginLeft = aValue;
else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "margin-top" ) ) ) mrTypeModel.maMarginTop = aValue;
else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "mso-position-vertical-relative" ) ) ) mrTypeModel.maPositionVerticalRelative = aValue;
}
}
}

View File

@@ -798,12 +798,15 @@ void SwAnchoredDrawObject::_SetPositioningAttr()
// --> #i71182#
// only change position - do not lose other attributes
SwFmtHoriOrient aHori( GetFrmFmt().GetHoriOrient() );
aHori.SetPos( nHoriPos );
// If the object is already positioned, leave it alone.
if (!aHori.GetPos())
aHori.SetPos( nHoriPos );
GetFrmFmt().SetFmtAttr( aHori );
SwFmtVertOrient aVert( GetFrmFmt().GetVertOrient() );
aVert.SetPos( nVertPos );
if (!aVert.GetPos())
aVert.SetPos( nVertPos );
GetFrmFmt().SetFmtAttr( aVert );
// --> #i36010# - set layout direction of the position

View File

@@ -1513,6 +1513,13 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
uno::Reference< lang::XServiceInfo > xSInfo( xShape, uno::UNO_QUERY_THROW );
bool bIsGraphic = xSInfo->supportsService( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.GraphicObjectShape" ) ) );
// If there are position properties, the shape should not be inserted "as character".
sal_Int32 nHoriPosition = 0, nVertPosition = 0;
xProps->getPropertyValue(rPropNameSupplier.GetName(PROP_HORI_ORIENT_POSITION)) >>= nHoriPosition;
xProps->getPropertyValue(rPropNameSupplier.GetName(PROP_VERT_ORIENT_POSITION)) >>= nVertPosition;
if (nHoriPosition != 0 || nVertPosition != 0)
bIsGraphic = false;
xProps->setPropertyValue(
rPropNameSupplier.GetName( PROP_OPAQUE ),
uno::makeAny( true ) );