[Libreoffice-commits] core.git: oox/source
Miklos Vajna
vmiklos at collabora.co.uk
Thu Nov 28 06:31:28 PST 2013
oox/source/shape/ShapeContextHandler.cxx | 19 +++++++++++++------
oox/source/shape/ShapeContextHandler.hxx | 5 +++--
oox/source/shape/WpsContext.cxx | 27 ++++++++++++++++++++++++---
oox/source/shape/WpsContext.hxx | 3 ++-
4 files changed, 42 insertions(+), 12 deletions(-)
New commits:
commit efcc8ddd213e7f7a341526bdcffcee75d8fef77f
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Thu Nov 28 15:01:39 2013 +0100
fdo#69636 DOCX drawingML shape import: handle vert=vert270 prop for sw frames
Change-Id: I95b4cfa0494c8115ebf23c76f4712b48d17bd463
diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx
index c12518d..5ac772c 100644
--- a/oox/source/shape/ShapeContextHandler.cxx
+++ b/oox/source/shape/ShapeContextHandler.cxx
@@ -117,17 +117,23 @@ uno::Reference<xml::sax::XFastContextHandler> ShapeContextHandler::getChartShape
return mxChartShapeContext;
}
-uno::Reference<xml::sax::XFastContextHandler> ShapeContextHandler::getWpsContext(sal_Int32 nElement)
+uno::Reference<xml::sax::XFastContextHandler> ShapeContextHandler::getWpsContext(sal_Int32 nStartElement, sal_Int32 nElement)
{
if (!mxWpsContext.is())
{
FragmentHandler2Ref rFragmentHandler(new ShapeFragmentHandler(*mxFilterBase, msRelationFragmentPath));
ShapePtr pMasterShape;
- switch (getBaseToken(nElement))
+ uno::Reference<drawing::XShape> xShape;
+ // No element happens in case of pretty-printed XML, bodyPr is the case when we are called again after <wps:txbx>.
+ if (!nElement || nElement == WPS_TOKEN(bodyPr))
+ // Assume that this is just a continuation of the previous shape.
+ xShape = mxSavedShape;
+
+ switch (getBaseToken(nStartElement))
{
case XML_wsp:
- mxWpsContext.set(new WpsContext(*rFragmentHandler));
+ mxWpsContext.set(new WpsContext(*rFragmentHandler, xShape));
break;
default:
break;
@@ -215,7 +221,7 @@ ShapeContextHandler::getDiagramShapeContext()
}
uno::Reference<xml::sax::XFastContextHandler>
-ShapeContextHandler::getContextHandler()
+ShapeContextHandler::getContextHandler(sal_Int32 nElement)
{
uno::Reference<xml::sax::XFastContextHandler> xResult;
@@ -235,7 +241,7 @@ ShapeContextHandler::getContextHandler()
xResult.set(getChartShapeContext(mnStartToken));
break;
case NMSP_wps:
- xResult.set(getWpsContext(mnStartToken));
+ xResult.set(getWpsContext(mnStartToken, nElement));
break;
case NMSP_wpg:
xResult.set(getWpgContext(mnStartToken));
@@ -336,7 +342,7 @@ ShapeContextHandler::createFastChildContext
throw (uno::RuntimeException, xml::sax::SAXException)
{
uno::Reference< xml::sax::XFastContextHandler > xResult;
- uno::Reference< xml::sax::XFastContextHandler > xContextHandler(getContextHandler());
+ uno::Reference< xml::sax::XFastContextHandler > xContextHandler(getContextHandler(Element));
if (xContextHandler.is())
xResult.set(xContextHandler->createFastChildContext
@@ -453,6 +459,7 @@ ShapeContextHandler::getShape() throw (uno::RuntimeException)
pShape->setPosition(maPosition);
pShape->addShape(*mxFilterBase, mpThemePtr.get(), xShapes, aMatrix, pShape->getFillProperties());
xResult = pShape->getXShape();
+ mxSavedShape = xResult;
mxWpsContext.clear();
}
}
diff --git a/oox/source/shape/ShapeContextHandler.hxx b/oox/source/shape/ShapeContextHandler.hxx
index 7a9b93c..bf27e16 100644
--- a/oox/source/shape/ShapeContextHandler.hxx
+++ b/oox/source/shape/ShapeContextHandler.hxx
@@ -155,6 +155,7 @@ private:
css::uno::Reference<XFastContextHandler> mxDiagramShapeContext;
css::uno::Reference<XFastContextHandler> mxLockedCanvasContext;
css::uno::Reference<XFastContextHandler> mxWpsContext;
+ css::uno::Reference<css::drawing::XShape> mxSavedShape;
css::uno::Reference<XFastContextHandler> mxWpgContext;
css::uno::Reference<XFastContextHandler> mxChartShapeContext;
@@ -169,9 +170,9 @@ private:
css::uno::Reference<XFastContextHandler> getDrawingShapeContext();
css::uno::Reference<XFastContextHandler> getDiagramShapeContext();
css::uno::Reference<XFastContextHandler> getLockedCanvasContext(sal_Int32 nElement);
- css::uno::Reference<XFastContextHandler> getWpsContext(sal_Int32 nElement);
+ css::uno::Reference<XFastContextHandler> getWpsContext(sal_Int32 nStartElement, sal_Int32 nElement);
css::uno::Reference<XFastContextHandler> getWpgContext(sal_Int32 nElement);
- css::uno::Reference<XFastContextHandler> getContextHandler();
+ css::uno::Reference<XFastContextHandler> getContextHandler(sal_Int32 nElement = 0);
};
}}
diff --git a/oox/source/shape/WpsContext.cxx b/oox/source/shape/WpsContext.cxx
index 6ecf320..5c2a145 100644
--- a/oox/source/shape/WpsContext.cxx
+++ b/oox/source/shape/WpsContext.cxx
@@ -10,13 +10,15 @@
#include "WpsContext.hxx"
#include <oox/drawingml/shapepropertiescontext.hxx>
#include <oox/drawingml/shapestylecontext.hxx>
+#include <com/sun/star/beans/XPropertyState.hpp>
using namespace com::sun::star;
namespace oox { namespace shape {
-WpsContext::WpsContext(ContextHandler2Helper& rParent)
-: ContextHandler2(rParent)
+WpsContext::WpsContext(ContextHandler2Helper& rParent, uno::Reference<drawing::XShape> xShape)
+ : ContextHandler2(rParent),
+ mxShape(xShape)
{
mpShape.reset(new oox::drawingml::Shape("com.sun.star.drawing.CustomShape"));
mpShape->setWps(true);
@@ -31,7 +33,7 @@ oox::drawingml::ShapePtr WpsContext::getShape()
return mpShape;
}
-oox::core::ContextHandlerRef WpsContext::onCreateContext(sal_Int32 nElementToken, const oox::AttributeList& /*rAttribs*/)
+oox::core::ContextHandlerRef WpsContext::onCreateContext(sal_Int32 nElementToken, const oox::AttributeList& rAttribs)
{
switch (getBaseToken(nElementToken))
{
@@ -48,6 +50,25 @@ oox::core::ContextHandlerRef WpsContext::onCreateContext(sal_Int32 nElementToken
return new oox::drawingml::ShapeStyleContext(*this, *mpShape);
break;
case XML_bodyPr:
+ if (mxShape.is())
+ {
+ OptValue<OUString> oVert = rAttribs.getString(XML_vert);
+ if (oVert.has() && oVert.get() == "vert270")
+ {
+ // No support for this in core, work around by char rotation, as we do so for table cells already.
+ uno::Reference<text::XText> xText(mxShape, uno::UNO_QUERY);
+ uno::Reference<text::XTextCursor> xTextCursor = xText->createTextCursor();
+ xTextCursor->gotoStart(false);
+ xTextCursor->gotoEnd(true);
+ uno::Reference<beans::XPropertyState> xPropertyState(xTextCursor, uno::UNO_QUERY);
+ beans::PropertyState aState = xPropertyState->getPropertyState("CharRotation");
+ if (aState == beans::PropertyState_DEFAULT_VALUE)
+ {
+ uno::Reference<beans::XPropertySet> xPropertySet(xTextCursor, uno::UNO_QUERY);
+ xPropertySet->setPropertyValue("CharRotation", uno::makeAny(sal_Int16(900)));
+ }
+ }
+ }
break;
case XML_txbx:
mpShape->setServiceName("com.sun.star.text.TextFrame");
diff --git a/oox/source/shape/WpsContext.hxx b/oox/source/shape/WpsContext.hxx
index cb05de8..b7f97f8 100644
--- a/oox/source/shape/WpsContext.hxx
+++ b/oox/source/shape/WpsContext.hxx
@@ -19,7 +19,7 @@ namespace oox { namespace shape {
class WpsContext : public oox::core::ContextHandler2
{
public:
- WpsContext(oox::core::ContextHandler2Helper& rParent);
+ WpsContext(oox::core::ContextHandler2Helper& rParent, css::uno::Reference<css::drawing::XShape> xShape);
virtual ~WpsContext();
virtual oox::core::ContextHandlerRef onCreateContext(sal_Int32 nElementToken, const oox::AttributeList& rAttribs) SAL_OVERRIDE;
@@ -28,6 +28,7 @@ public:
protected:
oox::drawingml::ShapePtr mpShape;
+ css::uno::Reference<css::drawing::XShape> mxShape;
};
More information about the Libreoffice-commits
mailing list