[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - 7 commits - include/oox oox/source sw/qa writerfilter/source
Miklos Vajna
vmiklos at suse.cz
Thu May 30 05:03:54 PDT 2013
include/oox/vml/vmlformatting.hxx | 12 +++
include/oox/vml/vmlshape.hxx | 1
oox/source/vml/vmlformatting.cxx | 55 ++++++++++++++++++
oox/source/vml/vmlshape.cxx | 18 +++++
oox/source/vml/vmlshapecontext.cxx | 3
sw/qa/extras/ooxmlimport/data/page-border-shadow.docx |binary
sw/qa/extras/ooxmlimport/data/watermark.docx |binary
sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 38 ++++++++++++
writerfilter/source/dmapper/BorderHandler.cxx | 9 ++
writerfilter/source/dmapper/BorderHandler.hxx | 2
writerfilter/source/dmapper/DomainMapper.cxx | 2
writerfilter/source/dmapper/DomainMapper_Impl.cxx | 5 +
writerfilter/source/dmapper/PageBordersHandler.cxx | 6 +
writerfilter/source/dmapper/PageBordersHandler.hxx | 1
writerfilter/source/dmapper/PropertyMap.cxx | 23 +++++++
writerfilter/source/dmapper/PropertyMap.hxx | 3
16 files changed, 169 insertions(+), 9 deletions(-)
New commits:
commit e76d566da7abe95f90fd9911b12912614aee92a9
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Thu May 30 12:18:30 2013 +0200
bnc#817956 page border shadow testcase
Change-Id: I1ded79d89dcceb3bae5926a2f217cde8bf6aa830
(cherry picked from commit 300ba1a171a37da08d72e278cf38988f1225cc83)
diff --git a/sw/qa/extras/ooxmlimport/data/page-border-shadow.docx b/sw/qa/extras/ooxmlimport/data/page-border-shadow.docx
new file mode 100755
index 0000000..65a2273
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/page-border-shadow.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 51c887b..b38f7cb 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -115,6 +115,7 @@ public:
void testIndentation();
void testPageBackground();
void testWatermark();
+ void testPageBorderShadow();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -198,6 +199,7 @@ void Test::run()
{"indentation.docx", &Test::testIndentation},
{"page-background.docx", &Test::testPageBackground},
{"watermark.docx", &Test::testWatermark},
+ {"page-border-shadow.docx", &Test::testPageBorderShadow},
};
header();
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
@@ -1414,6 +1416,16 @@ void Test::testWatermark()
CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_PRINT_AREA, getProperty<sal_Int16>(xShape, "VertOrientRelation"));
}
+void Test::testPageBorderShadow()
+{
+ // The problem was that in w:pgBorders, child elements had a w:shadow attribute, but that was ignored.
+ table::ShadowFormat aShadow = getProperty<table::ShadowFormat>(getStyles("PageStyles")->getByName(DEFAULT_STYLE), "ShadowFormat");
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, sal_uInt32(aShadow.Color));
+ CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location);
+ // w:sz="48" is in eights of a point, 1 pt is 20 twips.
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(TWIP_TO_MM100(48/8*20)), aShadow.ShadowWidth);
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();
commit 5d4da0117ae220e0524326cfb668f2b70a007fe0
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Thu May 30 11:55:37 2013 +0200
bnc#817956 DOCX import of page border shadow
See the comment in SectionPropertyMap::ApplyBorderToPageStyles() on what and
how is mapped. The control flow is like this: BorderHandler::lcl_attribute()
notices w:shadow, then PageBordersHandler::lcl_sprm() gets it, passes it to
SectionPropertyMap::SetBorder(), finally
SectionPropertyMap::ApplyBorderToPageStyles() uses the UNO API.
Change-Id: Ib0aef3245f58c62655769357f1f4dd07eef77f62
(cherry picked from commit f0aa209390aea68f4c23cf16df9d1577aaea91b5)
diff --git a/writerfilter/source/dmapper/BorderHandler.cxx b/writerfilter/source/dmapper/BorderHandler.cxx
index 068c210..c219d39 100644
--- a/writerfilter/source/dmapper/BorderHandler.cxx
+++ b/writerfilter/source/dmapper/BorderHandler.cxx
@@ -39,6 +39,7 @@ m_nLineWidth(15), // Word default, in twips
m_nLineType(0),
m_nLineColor(0),
m_nLineDistance(0),
+m_bShadow(false),
m_bOOXML( bOOXML )
{
const int nBorderCount(BORDER_COUNT);
@@ -83,7 +84,8 @@ void BorderHandler::lcl_attribute(Id rName, Value & rVal)
m_nLineDistance = ConversionHelper::convertTwipToMM100( nIntValue * 20 );
break;
case NS_rtf::LN_FSHADOW: // 0x2875
- //if 1 then line has shadow - unsupported
+ m_bShadow = nIntValue;
+ break;
case NS_rtf::LN_FFRAME: // 0x2876
case NS_rtf::LN_UNUSED2_15: // 0x2877
// ignored
@@ -173,6 +175,11 @@ table::BorderLine2 BorderHandler::getBorderLine()
return aBorderLine;
}
+bool BorderHandler::getShadow()
+{
+ return m_bShadow;
+}
+
} //namespace dmapper
} //namespace writerfilter
diff --git a/writerfilter/source/dmapper/BorderHandler.hxx b/writerfilter/source/dmapper/BorderHandler.hxx
index 7a6eec9..3d43c4a 100644
--- a/writerfilter/source/dmapper/BorderHandler.hxx
+++ b/writerfilter/source/dmapper/BorderHandler.hxx
@@ -50,6 +50,7 @@ private:
sal_Int32 m_nLineType;
sal_Int32 m_nLineColor;
sal_Int32 m_nLineDistance;
+ bool m_bShadow;
bool m_bOOXML;
bool m_aFilledLines[BORDER_COUNT];
@@ -66,6 +67,7 @@ public:
::boost::shared_ptr<PropertyMap> getProperties();
::com::sun::star::table::BorderLine2 getBorderLine();
sal_Int32 getLineDistance() const { return m_nLineDistance;}
+ bool getShadow();
};
typedef boost::shared_ptr< BorderHandler > BorderHandlerPtr;
}}
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 7768ddb..e119189 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2674,7 +2674,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType
BORDER_BOTTOM,
BORDER_RIGHT
};
- pSectionContext->SetBorder( aPositions[nSprmId - NS_sprm::LN_SBrcTop], nLineDistance, aBorderLine );
+ pSectionContext->SetBorder( aPositions[nSprmId - NS_sprm::LN_SBrcTop], nLineDistance, aBorderLine, /*bShadow =*/ false );
}
}
break;
diff --git a/writerfilter/source/dmapper/PageBordersHandler.cxx b/writerfilter/source/dmapper/PageBordersHandler.cxx
index 9ce4269..471a85a 100644
--- a/writerfilter/source/dmapper/PageBordersHandler.cxx
+++ b/writerfilter/source/dmapper/PageBordersHandler.cxx
@@ -28,7 +28,8 @@ namespace dmapper {
_PgBorder::_PgBorder( ) :
m_nDistance( 0 ),
- m_ePos( BORDER_RIGHT )
+ m_ePos( BORDER_RIGHT ),
+ m_bShadow(false)
{
}
@@ -123,6 +124,7 @@ void PageBordersHandler::lcl_sprm( Sprm& rSprm )
aPgBorder.m_rLine = pBorderHandler->getBorderLine( );
aPgBorder.m_nDistance = pBorderHandler->getLineDistance( );
aPgBorder.m_ePos = ePos;
+ aPgBorder.m_bShadow = pBorderHandler->getShadow();
m_aBorders.push_back( aPgBorder );
}
}
@@ -136,7 +138,7 @@ void PageBordersHandler::SetBorders( SectionPropertyMap* pSectContext )
for ( int i = 0, length = m_aBorders.size( ); i < length; i++ )
{
_PgBorder aBorder = m_aBorders[i];
- pSectContext->SetBorder( aBorder.m_ePos, aBorder.m_nDistance, aBorder.m_rLine );
+ pSectContext->SetBorder( aBorder.m_ePos, aBorder.m_nDistance, aBorder.m_rLine, aBorder.m_bShadow );
}
}
diff --git a/writerfilter/source/dmapper/PageBordersHandler.hxx b/writerfilter/source/dmapper/PageBordersHandler.hxx
index 7d5af39..b6aebf5 100644
--- a/writerfilter/source/dmapper/PageBordersHandler.hxx
+++ b/writerfilter/source/dmapper/PageBordersHandler.hxx
@@ -40,6 +40,7 @@ public:
com::sun::star::table::BorderLine2 m_rLine;
sal_Int32 m_nDistance;
BorderPosition m_ePos;
+ bool m_bShadow;
_PgBorder( );
~_PgBorder( );
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index 2ab0ff5..9de69fc 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -31,6 +31,7 @@
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/style/BreakType.hpp>
#include <com/sun/star/style/PageStyleLayout.hpp>
+#include <com/sun/star/table/ShadowFormat.hpp>
#include <com/sun/star/text/RelOrientation.hpp>
#include <com/sun/star/text/WritingMode.hpp>
#include <com/sun/star/text/XTextColumns.hpp>
@@ -285,7 +286,10 @@ SectionPropertyMap::SectionPropertyMap(bool bIsFirstSection) :
nSectionNumber = nNumber++;
memset(&m_pBorderLines, 0x00, sizeof(m_pBorderLines));
for( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder )
+ {
m_nBorderDistances[ nBorder ] = -1;
+ m_bBorderShadows[nBorder] = false;
+ }
//todo: set defaults in ApplyPropertiesToPageStyles
//initialize defaults
PaperInfo aLetter(PAPER_LETTER);
@@ -405,11 +409,12 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle(
}
-void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const table::BorderLine2& rBorderLine )
+void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const table::BorderLine2& rBorderLine, bool bShadow )
{
delete m_pBorderLines[ePos];
m_pBorderLines[ePos] = new table::BorderLine2( rBorderLine );
m_nBorderDistances[ePos] = nLineDistance;
+ m_bBorderShadows[ePos] = bShadow;
}
@@ -502,6 +507,22 @@ void SectionPropertyMap::ApplyBorderToPageStyles(
m_nBorderDistances[nBorder], nOffsetFrom, nLineWidth );
}
}
+
+ if (m_bBorderShadows[BORDER_RIGHT])
+ {
+ // In Word UI, shadow is a boolean property, in OOXML, it's a boolean
+ // property of each 4 border type, finally in Writer the border is a
+ // property of the page style, with shadow location, distance and
+ // color. See SwWW8ImplReader::SetShadow().
+ table::ShadowFormat aFormat;
+ aFormat.Color = COL_BLACK;
+ aFormat.Location = table::ShadowLocation_BOTTOM_RIGHT;
+ aFormat.ShadowWidth = m_pBorderLines[BORDER_RIGHT]->LineWidth;
+ if (xFirst.is())
+ xFirst->setPropertyValue(rPropNameSupplier.GetName(PROP_SHADOW_FORMAT), uno::makeAny(aFormat));
+ if (xSecond.is())
+ xSecond->setPropertyValue(rPropNameSupplier.GetName(PROP_SHADOW_FORMAT), uno::makeAny(aFormat));
+ }
}
void SectionPropertyMap::SetBorderDistance( uno::Reference< beans::XPropertySet > xStyle,
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx
index cc2821f..e48c5c5 100644
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ b/writerfilter/source/dmapper/PropertyMap.hxx
@@ -149,6 +149,7 @@ class SectionPropertyMap : public PropertyMap
::com::sun::star::table::BorderLine2* m_pBorderLines[4];
sal_Int32 m_nBorderDistances[4];
sal_Int32 m_nBorderParams;
+ bool m_bBorderShadows[4];
bool m_bTitlePage;
sal_Int16 m_nColumnCount;
@@ -219,7 +220,7 @@ public:
const ::com::sun::star::uno::Reference < ::com::sun::star::lang::XMultiServiceFactory >& xTextFactory,
bool bFirst );
- void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const ::com::sun::star::table::BorderLine2& rBorderLine );
+ void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const ::com::sun::star::table::BorderLine2& rBorderLine, bool bShadow );
void SetBorderParams( sal_Int32 nSet ) { m_nBorderParams = nSet; }
void SetColumnCount( sal_Int16 nCount ) { m_nColumnCount = nCount; }
commit 18a2b6fd785e30dde4aee2c0489f2eed92478193
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Wed May 29 15:22:14 2013 +0200
bnc#817956 v:textpath VML import testcase
Change-Id: I4c4c3a84e8d9d048262e6570a8bed0106e8d184f
(cherry picked from commit 8931c8f3c58afe35b5b7c98e136825aff04291e3)
diff --git a/sw/qa/extras/ooxmlimport/data/watermark.docx b/sw/qa/extras/ooxmlimport/data/watermark.docx
new file mode 100755
index 0000000..8e279e3
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/watermark.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index adbe872..51c887b 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -114,6 +114,7 @@ public:
void testN779630();
void testIndentation();
void testPageBackground();
+ void testWatermark();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -196,6 +197,7 @@ void Test::run()
{"n779630.docx", &Test::testN779630},
{"indentation.docx", &Test::testIndentation},
{"page-background.docx", &Test::testPageBackground},
+ {"watermark.docx", &Test::testWatermark},
};
header();
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
@@ -1388,6 +1390,30 @@ void Test::testPageBackground()
CPPUNIT_ASSERT_EQUAL(sal_Int32(0x92D050), getProperty<sal_Int32>(xPageStyle, "BackColor"));
}
+void Test::testWatermark()
+{
+ uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xDraws->getByIndex(0), uno::UNO_QUERY);
+ // 1st problem: last character was missing
+ CPPUNIT_ASSERT_EQUAL(OUString("SAMPLE"), xShape->getString());
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
+ uno::Sequence<beans::PropertyValue> aProps = getProperty< uno::Sequence<beans::PropertyValue> >(xShape, "CustomShapeGeometry");
+ bool bFound = false;
+ for (int i = 0; i < aProps.getLength(); ++i)
+ if (aProps[i].Name == "TextPath")
+ bFound = true;
+ // 2nd problem: v:textpath wasn't imported
+ CPPUNIT_ASSERT_EQUAL(true, bFound);
+
+ // 3rd problem: rotation angle was 315, not 45.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(45 * 100), getProperty<sal_Int32>(xShape, "RotateAngle"));
+
+ // 4th problem: mso-position-vertical-relative:margin was ignored, VertOrientRelation was text::RelOrientation::FRAME.
+ CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_PRINT_AREA, getProperty<sal_Int16>(xShape, "VertOrientRelation"));
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();
commit 875737ee9dc44771fe0ebf4f2cba705e13555f7d
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Wed May 29 14:47:54 2013 +0200
bnc#817956 VML import of mso-position-vertical-relative:margin
Change-Id: I86464c44022ef8c8a8037d4228bb2a6409fc77af
(cherry picked from commit f2720b87093968670e3fb47d24d4952f1631a654)
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index b4b3e9e..1ec5c24 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -457,6 +457,10 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
{
rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::PAGE_FRAME);
}
+ else if ( rTypeModel.maPositionVerticalRelative == "margin" )
+ {
+ rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::PAGE_PRINT_AREA);
+ }
else
{
// Vertical placement relative to margin, because parent style must not modify vertical position
commit 6fb91a8fc2ded5c363dbc7115e9281453d7611b8
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Wed May 29 11:17:44 2013 +0200
bnc#817956 fix VML import of rotation
In VML, positive rotation angles are clockwise, we have them as
counter-clockwise. This wasn't noticed earlier, as the n751117.docx
testcase also had flip:x. (For example, rotation with angle 90 + flip:x
is presented as 270 by the UI.)
Fix this, and also mirror the angle when flip:x is present.
Change-Id: I591ec3369a5bdca53f9684006a459d11e37fbc33
(cherry picked from commit b2c16f6c1b8bd3c96e0549eb3036c820094a795f)
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index 8e5e2a9..b4b3e9e 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -43,6 +43,7 @@
#include <com/sun/star/text/TextContentAnchorType.hpp>
#include <rtl/math.hxx>
#include <rtl/ustrbuf.hxx>
+#include <svx/svdtrans.hxx>
#include "oox/drawingml/shapepropertymap.hxx"
#include "oox/helper/graphichelper.hxx"
#include "oox/helper/propertyset.hxx"
@@ -476,12 +477,17 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect ) const
{
awt::Rectangle aShapeRect(rShapeRect);
+ boost::optional<sal_Int32> oRotation;
+ if (!maTypeModel.maRotation.isEmpty())
+ oRotation.reset(maTypeModel.maRotation.toInt32());
if (!maTypeModel.maFlip.isEmpty())
{
if (maTypeModel.maFlip.equalsAscii("x"))
{
aShapeRect.X += aShapeRect.Width;
aShapeRect.Width *= -1;
+ if (oRotation)
+ oRotation.reset(360 - *oRotation);
}
else if (maTypeModel.maFlip.equalsAscii("y"))
{
@@ -548,9 +554,11 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes
}
PropertySet aPropertySet(xShape);
- if (xShape.is() && !maTypeModel.maRotation.isEmpty())
+ if (xShape.is() && oRotation)
{
- aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny(maTypeModel.maRotation.toInt32() * 100));
+ // See DffPropertyReader::Fix16ToAngle(): in VML, positive rotation angles are clockwise, we have them as counter-clockwise.
+ // Additionally, VML type is 0..360, our is 0.36000.
+ aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny(sal_Int32(NormAngle360((*oRotation) * -100))));
// If rotation is used, simple setPosition() is not enough.
aPropertySet.setAnyProperty(PROP_HoriOrientPosition, makeAny( aShapeRect.X ) );
aPropertySet.setAnyProperty(PROP_VertOrientPosition, makeAny( aShapeRect.Y ) );
commit f1a46eea6e5ae66289b0e126f4e51edb6b5b8d73
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Tue May 28 17:44:25 2013 +0200
bnc#817956 VML import of v:textpath
Word exposes this as Watermark in its UI.
Change-Id: I23d9b2aab2dab60a98c7f456b0592c2b74bcaf81
(cherry picked from commit 290695c785ef831abb6e78cd3675bc071f05f643)
diff --git a/include/oox/vml/vmlformatting.hxx b/include/oox/vml/vmlformatting.hxx
index 79fa380..81b83ee 100644
--- a/include/oox/vml/vmlformatting.hxx
+++ b/include/oox/vml/vmlformatting.hxx
@@ -24,6 +24,7 @@
#include "oox/dllapi.h"
#include <com/sun/star/awt/Point.hpp>
#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
#include <vector>
@@ -240,6 +241,17 @@ struct OOX_DLLPUBLIC ShadowModel
void pushToPropMap(oox::drawingml::ShapePropertyMap& rPropMap, const GraphicHelper& rGraphicHelper) const;
};
+/** The shadow model structure contains all shape textpath properties. */
+struct OOX_DLLPUBLIC TextpathModel
+{
+ OptValue<OUString> moString; ///< Specifies the string of the textpath.
+
+ TextpathModel();
+
+ /** Writes the properties to the passed property map. */
+ void pushToPropMap(oox::drawingml::ShapePropertyMap& rPropMap, com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xShape) const;
+};
+
} // namespace vml
} // namespace oox
diff --git a/include/oox/vml/vmlshape.hxx b/include/oox/vml/vmlshape.hxx
index e16fe90..ca815ec 100644
--- a/include/oox/vml/vmlshape.hxx
+++ b/include/oox/vml/vmlshape.hxx
@@ -88,6 +88,7 @@ struct OOX_DLLPUBLIC ShapeTypeModel
StrokeModel maStrokeModel; ///< Border line formatting.
FillModel maFillModel; ///< Shape fill formatting.
ShadowModel maShadowModel; ///< Shape shadow formatting.
+ TextpathModel maTextpathModel; ///< Shape textpath formatting.
OptValue< OUString > moGraphicPath; ///< Path to a graphic for this shape.
OptValue< OUString > moGraphicTitle; ///< Title of the graphic.
diff --git a/oox/source/vml/vmlformatting.cxx b/oox/source/vml/vmlformatting.cxx
index 7932acd..9be2c68 100644
--- a/oox/source/vml/vmlformatting.cxx
+++ b/oox/source/vml/vmlformatting.cxx
@@ -18,7 +18,11 @@
*/
#include "oox/vml/vmlformatting.hxx"
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp>
#include <com/sun/star/table/ShadowFormat.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
#include <rtl/strbuf.hxx>
#include "oox/drawingml/color.hxx"
#include "oox/drawingml/drawingmltypes.hxx"
@@ -828,6 +832,57 @@ void ShadowModel::pushToPropMap(ShapePropertyMap& rPropMap, const GraphicHelper&
rPropMap.setProperty(PROP_ShadowFormat, uno::makeAny(aFormat));
}
+TextpathModel::TextpathModel()
+{
+}
+
+beans::PropertyValue lcl_createTextpathProps()
+{
+ uno::Sequence<beans::PropertyValue> aTextpathPropSeq(4);
+ aTextpathPropSeq[0].Name = "TextPath";
+ aTextpathPropSeq[0].Value <<= sal_True;
+ aTextpathPropSeq[1].Name = "TextPathMode";
+ aTextpathPropSeq[1].Value <<= drawing::EnhancedCustomShapeTextPathMode_SHAPE;
+ aTextpathPropSeq[2].Name = "ScaleX";
+ aTextpathPropSeq[2].Value <<= sal_False;
+ aTextpathPropSeq[3].Name = "SameLetterHeights";
+ aTextpathPropSeq[3].Value <<= sal_False;
+
+ beans::PropertyValue aRet;
+ aRet.Name = "TextPath";
+ aRet.Value <<= aTextpathPropSeq;
+ return aRet;
+}
+
+void TextpathModel::pushToPropMap(ShapePropertyMap& rPropMap, uno::Reference<drawing::XShape> xShape) const
+{
+ if (moString.has())
+ {
+ uno::Reference<text::XTextRange> xTextRange(xShape, uno::UNO_QUERY);
+ xTextRange->setString(moString.get());
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
+ uno::Sequence<beans::PropertyValue> aGeomPropSeq = xPropertySet->getPropertyValue("CustomShapeGeometry").get< uno::Sequence<beans::PropertyValue> >();
+ bool bFound = false;
+ for (int i = 0; i < aGeomPropSeq.getLength(); ++i)
+ {
+ beans::PropertyValue& rProp = aGeomPropSeq[i];
+ if (rProp.Name == "TextPath")
+ {
+ bFound = true;
+ rProp = lcl_createTextpathProps();
+ }
+ }
+ if (!bFound)
+ {
+ sal_Int32 nSize = aGeomPropSeq.getLength();
+ aGeomPropSeq.realloc(nSize+1);
+ aGeomPropSeq[nSize] = lcl_createTextpathProps();
+ }
+ rPropMap.setAnyProperty(PROP_CustomShapeGeometry, uno::makeAny(aGeomPropSeq));
+ }
+}
+
} // namespace vml
} // namespace oox
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index 2aa3bac..8e5e2a9 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -394,6 +394,8 @@ void ShapeBase::convertShapeProperties( const Reference< XShape >& rxShape ) con
aPropMap.erase(PROP_LineColor);
}
}
+ else if (xSInfo->supportsService("com.sun.star.drawing.CustomShape"))
+ maTypeModel.maTextpathModel.pushToPropMap(aPropMap, rxShape);
PropertySet( rxShape ).setProperties( aPropMap );
}
diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx
index 658215a..efa6e38 100644
--- a/oox/source/vml/vmlshapecontext.cxx
+++ b/oox/source/vml/vmlshapecontext.cxx
@@ -372,6 +372,9 @@ ContextHandlerRef ShapeTypeContext::onCreateContext( sal_Int32 nElement, const A
mrTypeModel.maShadowModel.moOpacity = lclDecodePercent(rAttribs, XML_opacity, 1.0);
}
break;
+ case VML_TOKEN( textpath ):
+ mrTypeModel.maTextpathModel.moString.assignIfUsed(rAttribs.getString(XML_string));
+ break;
}
return 0;
}
commit 0e924f3ef6b6a1ece341774ab5a68dddbc9d70c1
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Tue May 28 16:11:38 2013 +0200
bnc#817956 DOCX import: missing last character of shape text
Make sure writerfilter only removes the last character of the text if
it's a newline.
Change-Id: I96980e2d148ced93363b3147545afdd0dd070e5d
(cherry picked from commit 4eaabc45f76aefe82558b283975ab9df3aea7fce)
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index fa6b36d..adf5870 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -305,7 +305,10 @@ void DomainMapper_Impl::RemoveLastParagraph( )
else
{
xCursor->goLeft( 1, true );
- xCursor->setString(OUString());
+ // If this is a text on a shape, possibly the text has the trailing
+ // newline removed already.
+ if (xCursor->getString() == "\n")
+ xCursor->setString(OUString());
}
}
catch( const uno::Exception& )
More information about the Libreoffice-commits
mailing list