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

n#758883 oox: anchor vml shapes without anchor info as at-character

w10:wrap was originally arrived to
writerfilter::dmapper::WrapHandler::lcl_attribute(), but
writerfilter::dmapper::DomainMapper_Impl::PushShapeContext() was called
already and set the anchor type. Fix this, then we can set a a suitable
anchor type in lcl_SetAnchorType() based on the type model.

Change-Id: Ib411450b10f29f814bc13d81eaec434971b2e52a
üst e7bbaefa
......@@ -92,6 +92,8 @@ struct ShapeTypeModel
OptValue< ::rtl::OUString > moGraphicPath; ///< Path to a graphic for this shape.
OptValue< ::rtl::OUString > moGraphicTitle; ///< Title of the graphic.
OptValue< ::rtl::OUString > moWrapAnchorX; ///< The base object from which our horizontal positioning should be calculated.
OptValue< ::rtl::OUString > moWrapAnchorY; ///< The base object from which our vertical positioning should be calculated.
explicit ShapeTypeModel();
......
......@@ -385,10 +385,16 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
{
if ( rTypeModel.maPosition == "absolute" )
{
// I'm not sure if AT_PAGE is always correct here (not sure what the parent that
// the spec talks about can be), but with Writer SwXDrawPage::add()
// always in practice uses this because of pDoc->GetCurrentLayout() being NULL at this point.
rPropSet.setProperty(PROP_AnchorType, text::TextContentAnchorType_AT_PAGE);
if (rTypeModel.moWrapAnchorX.get() == "page" && rTypeModel.moWrapAnchorY.get() == "page")
{
// I'm not sure if AT_PAGE is always correct here (not sure what the parent that
// the spec talks about can be), but with Writer SwXDrawPage::add()
// always in practice uses this because of pDoc->GetCurrentLayout() being NULL at this point.
rPropSet.setProperty(PROP_AnchorType, text::TextContentAnchorType_AT_PAGE);
}
else
// Map to as-character by default, that fixes vertical position of some textframes.
rPropSet.setProperty(PROP_AnchorType, text::TextContentAnchorType_AT_CHARACTER);
}
else if( rTypeModel.maPosition == "relative" )
{ // I'm not very sure this is correct either.
......
......@@ -322,11 +322,18 @@ ContextHandlerRef ShapeTypeContext::onCreateContext( sal_Int32 nElement, const A
mrTypeModel.maFillModel.moRotate = lclDecodeBool( rAttribs, XML_rotate );
break;
case VML_TOKEN( imagedata ):
{
// shapes in docx use r:id for the relationship id
// in xlsx it they use o:relid
bool bHasORelId = rAttribs.hasAttribute( O_TOKEN( relid ) );
mrTypeModel.moGraphicPath = decodeFragmentPath( rAttribs, bHasORelId ? O_TOKEN( relid ) : R_TOKEN( id ) );
mrTypeModel.moGraphicTitle = rAttribs.getString( O_TOKEN( title ) );
}
break;
case NMSP_vmlWord | XML_wrap:
mrTypeModel.moWrapAnchorX = rAttribs.getString(XML_anchorx);
mrTypeModel.moWrapAnchorY = rAttribs.getString(XML_anchory);
break;
break;
}
return 0;
......
......@@ -2241,7 +2241,12 @@ OOXMLFastContextHandlerWrapper::lcl_createFastChildContext
bool bInNamespaces = mMyNamespaces.find(nNameSpace) != mMyNamespaces.end();
bool bInTokens = mMyTokens.find( Element ) != mMyTokens.end( );
if ( bInNamespaces )
// We have methods to _add_ individual tokens or whole namespaces to be
// processed by writerfilter (instead of oox), but we have no method to
// filter out a single token. Just hardwire the wrap token here till we
// need a more generic solution.
if ( bInNamespaces && Element != static_cast<sal_Int32>(NS_vml_wordprocessingDrawing | OOXML_wrap) )
xResult.set(OOXMLFactory::getInstance()->createFastChildContextFromStart(this, Element));
else if (mxContext.is())
{
......
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