[Libreoffice-commits] .: 4 commits - oox/inc oox/source writerfilter/source

Miklos Vajna vmiklos at kemper.freedesktop.org
Wed Mar 28 01:28:45 PDT 2012


 oox/inc/oox/vml/vmlshape.hxx                        |   17 ++++++++
 oox/inc/oox/vml/vmlshapecontext.hxx                 |    4 +
 oox/source/vml/vmlshape.cxx                         |   42 +++++++++++++++++++-
 oox/source/vml/vmlshapecontext.cxx                  |   20 +++++++++
 writerfilter/source/Makefile                        |    4 -
 writerfilter/source/ooxml/gperffasttokenhandler.xsl |   13 ++----
 6 files changed, 89 insertions(+), 11 deletions(-)

New commits:
commit 4159a4e6ce38b333ced3ba5f75e28473605633e8
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Tue Mar 27 18:39:04 2012 +0200

    n#751117 oox: implement VML import of shape style 'flip'

diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx
index bde8823..c4ab2cd 100644
--- a/oox/inc/oox/vml/vmlshape.hxx
+++ b/oox/inc/oox/vml/vmlshape.hxx
@@ -81,6 +81,7 @@ struct ShapeTypeModel
     ::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.
     ::rtl::OUString     maRotation;             ///< Rotation of the shape, in degrees.
+    ::rtl::OUString     maFlip;                 ///< Rotation of the shape, in degrees.
     sal_Bool            mbAutoHeight;           ///< If true, the height value is a minimum value (mostly used for textboxes)
 
     StrokeModel         maStrokeModel;          ///< Border line formatting.
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index ad508c6..37e6431 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -367,7 +367,22 @@ SimpleShape::SimpleShape( Drawing& rDrawing, const OUString& rService ) :
 
 Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
 {
-    Reference< XShape > xShape = mrDrawing.createAndInsertXShape( maService, rxShapes, rShapeRect );
+    Rectangle aShapeRect(rShapeRect);
+    if (!maTypeModel.maFlip.isEmpty())
+    {
+        if (maTypeModel.maFlip.equalsAscii("x"))
+        {
+            aShapeRect.X += aShapeRect.Width;
+            aShapeRect.Width *= -1;
+        }
+        else if (maTypeModel.maFlip.equalsAscii("y"))
+        {
+            aShapeRect.Y += aShapeRect.Height;
+            aShapeRect.Height *= -1;
+        }
+    }
+
+    Reference< XShape > xShape = mrDrawing.createAndInsertXShape( maService, rxShapes, aShapeRect );
     convertShapeProperties( xShape );
 
     if ( maService.equalsAscii( "com.sun.star.text.TextFrame" ) )
diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx
index fb10331..57a85e9 100644
--- a/oox/source/vml/vmlshapecontext.cxx
+++ b/oox/source/vml/vmlshapecontext.cxx
@@ -350,6 +350,7 @@ void ShapeTypeContext::setStyle( const OUString& rStyle )
             else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "mso-position-vertical-relative" ) ) ) mrTypeModel.maPositionVerticalRelative = aValue;
             else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "mso-fit-shape-to-text" ) ) )          mrTypeModel.mbAutoHeight = sal_True;
             else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "rotation" ) ) )      mrTypeModel.maRotation = aValue;
+            else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "flip" ) ) )      mrTypeModel.maFlip = aValue;
         }
     }
 }
commit 559ecabbfc6d78df995c899ba996a470e241b76c
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Tue Mar 27 14:34:35 2012 +0200

    n#751117 oox: implement VML import of v:line token

diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx
index c00625c..bde8823 100644
--- a/oox/inc/oox/vml/vmlshape.hxx
+++ b/oox/inc/oox/vml/vmlshape.hxx
@@ -186,6 +186,8 @@ struct ShapeModel
     TextBoxPtr          mxTextBox;          /// Text contents and properties.
     ClientDataPtr       mxClientData;       /// Excel specific client data.
     ::rtl::OUString     maLegacyDiagramPath;/// Legacy Diagram Fragment Path
+    ::rtl::OUString     maFrom;             /// Start point for line shape.
+    ::rtl::OUString     maTo;               /// End point for line shape.
 
     explicit            ShapeModel();
                         ~ShapeModel();
@@ -312,6 +314,19 @@ protected:
                             const ::com::sun::star::awt::Rectangle& rShapeRect ) const;
 };
 
+/** A Line shape object. */
+class LineShape : public SimpleShape
+{
+public:
+    explicit            LineShape( Drawing& rDrawing );
+
+protected:
+    /** Creates the corresponding XShape and inserts it into the passed container. */
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >
+                        implConvertAndInsert(
+                            const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes,
+                            const ::com::sun::star::awt::Rectangle& rShapeRect ) const;
+};
 // ============================================================================
 
 /** A shape object with custom geometry. */
diff --git a/oox/inc/oox/vml/vmlshapecontext.hxx b/oox/inc/oox/vml/vmlshapecontext.hxx
index 08df6d3..13c77d3 100644
--- a/oox/inc/oox/vml/vmlshapecontext.hxx
+++ b/oox/inc/oox/vml/vmlshapecontext.hxx
@@ -139,6 +139,10 @@ public:
 private:
     /** Processes the 'points' attribute. */
     void                setPoints( const ::rtl::OUString& rPoints );
+    /** Processes the 'from' attribute. */
+    void                setFrom( const ::rtl::OUString& rPoints );
+    /** Processes the 'to' attribute. */
+    void                setTo( const ::rtl::OUString& rPoints );
 
 protected:
     ShapeBase&          mrShape;
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index 8c27d76..ad508c6 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -45,6 +45,7 @@
 #include <com/sun/star/text/TextContentAnchorType.hpp>
 #include <rtl/math.hxx>
 #include <rtl/ustrbuf.hxx>
+#include <rtl/oustringostreaminserter.hxx>
 #include "oox/drawingml/shapepropertymap.hxx"
 #include "oox/helper/graphichelper.hxx"
 #include "oox/helper/propertyset.hxx"
@@ -428,6 +429,26 @@ Reference< XShape > PolyLineShape::implConvertAndInsert( const Reference< XShape
     return xShape;
 }
 
+LineShape::LineShape(Drawing& rDrawing)
+    : SimpleShape(rDrawing, "com.sun.star.drawing.LineShape")
+{
+}
+
+Reference<XShape> LineShape::implConvertAndInsert(const Reference<XShapes>& rxShapes, const Rectangle& rShapeRect) const
+{
+    const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper();
+    Rectangle aShapeRect(rShapeRect);
+    sal_Int32 nIndex = 0;
+
+    aShapeRect.X = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maShapeModel.maFrom.getToken(0, ',', nIndex), 0, true, true);
+    aShapeRect.Y = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maShapeModel.maFrom.getToken(0, ',', nIndex), 0, true, true);
+    nIndex = 0;
+    aShapeRect.Width = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maShapeModel.maTo.getToken(0, ',', nIndex), 0, true, true) - aShapeRect.X;
+    aShapeRect.Height = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maShapeModel.maTo.getToken(0, ',', nIndex), 0, true, true) - aShapeRect.Y;
+
+    return SimpleShape::implConvertAndInsert(rxShapes, aShapeRect);
+}
+
 // ============================================================================
 
 CustomShape::CustomShape( Drawing& rDrawing ) :
diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx
index f6f6ac9..fb10331 100644
--- a/oox/source/vml/vmlshapecontext.cxx
+++ b/oox/source/vml/vmlshapecontext.cxx
@@ -234,11 +234,12 @@ ShapeContextBase::ShapeContextBase( ContextHandler2Helper& rParent ) :
             return new ShapeContext( rParent, rShapes.createShape< EllipseShape >(), rAttribs );
         case VML_TOKEN( polyline ):
             return new ShapeContext( rParent, rShapes.createShape< PolyLineShape >(), rAttribs );
+        case VML_TOKEN( line ):
+            return new ShapeContext( rParent, rShapes.createShape< LineShape >(), rAttribs );
 
         // TODO:
         case VML_TOKEN( arc ):
         case VML_TOKEN( curve ):
-        case VML_TOKEN( line ):
         case VML_TOKEN( diagram ):
         case VML_TOKEN( image ):
             return new ShapeContext( rParent, rShapes.createShape< ComplexShape >(), rAttribs );
@@ -364,6 +365,9 @@ ShapeContext::ShapeContext( ContextHandler2Helper& rParent, ShapeBase& rShape, c
     mrShapeModel.maType = rAttribs.getXString( XML_type, OUString() );
     // polyline path
     setPoints( rAttribs.getString( XML_points, OUString() ) );
+    // line start and end positions
+    setFrom(rAttribs.getString(XML_from, OUString()));
+    setTo(rAttribs.getString(XML_to, OUString()));
 }
 
 ContextHandlerRef ShapeContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
@@ -402,6 +406,18 @@ void ShapeContext::setPoints( const OUString& rPoints )
     }
 }
 
+void ShapeContext::setFrom( const OUString& rPoints )
+{
+    if (!rPoints.isEmpty())
+        mrShapeModel.maFrom = rPoints;
+}
+
+void ShapeContext::setTo( const OUString& rPoints )
+{
+    if (!rPoints.isEmpty())
+        mrShapeModel.maTo = rPoints;
+}
+
 // ============================================================================
 
 GroupShapeContext::GroupShapeContext( ContextHandler2Helper& rParent, GroupShape& rShape, const AttributeList& rAttribs ) :
commit 8b8fad38b2de3f037f628fea1f0f00fcb280be0d
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Tue Mar 27 11:32:19 2012 +0200

    n#751117 oox: implement VML import of shape style 'rotation'

diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx
index 946af36..c00625c 100644
--- a/oox/inc/oox/vml/vmlshape.hxx
+++ b/oox/inc/oox/vml/vmlshape.hxx
@@ -80,6 +80,7 @@ struct ShapeTypeModel
     ::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.
+    ::rtl::OUString     maRotation;             ///< Rotation of the shape, in degrees.
     sal_Bool            mbAutoHeight;           ///< If true, the height value is a minimum value (mostly used for textboxes)
 
     StrokeModel         maStrokeModel;          ///< Border line formatting.
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index ec34f0e..8c27d76 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -382,6 +382,10 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes
         if( xInStrm.is() )
             PropertySet( xShape ).setProperty( PROP_LegacyFragment, xInStrm );
     }
+
+    if (xShape.is() && !maTypeModel.maRotation.isEmpty())
+        PropertySet(xShape).setAnyProperty(PROP_RotateAngle, makeAny(maTypeModel.maRotation.toInt32() * 100));
+
     return xShape;
 }
 
diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx
index 12d2dc4..f6f6ac9 100644
--- a/oox/source/vml/vmlshapecontext.cxx
+++ b/oox/source/vml/vmlshapecontext.cxx
@@ -348,6 +348,7 @@ void ShapeTypeContext::setStyle( const OUString& rStyle )
             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;
             else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "mso-fit-shape-to-text" ) ) )          mrTypeModel.mbAutoHeight = sal_True;
+            else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "rotation" ) ) )      mrTypeModel.maRotation = aValue;
         }
     }
 }
commit b4f5c3fea2428fff9f470b6cde86b867787128d8
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Tue Mar 27 09:57:25 2012 +0200

    n#751117 writerfilter: include all oox tokens in gperffasttoken.hxx
    
    Without that, the following happens:
    
    1) ShapeTypeContext::onCreateContext() in oox calls rAttribs.getToken()
    2) FastAttributeList::getOptionalValueToken() in sax calls mxTokenHandler->getTokenFromUTF8()
    3) OOXMLFastTokenHandler::getTokenFromUTF8() won't find the oox token and return OOXML_FAST_TOKENS_END
    
    I verified that the new gperf input just adds tokens to the hash,
    doesn't remove any.

diff --git a/writerfilter/source/Makefile b/writerfilter/source/Makefile
index 240893c..2b10ae9 100644
--- a/writerfilter/source/Makefile
+++ b/writerfilter/source/Makefile
@@ -140,9 +140,9 @@ $(wf_GEN_ooxml_NamespaceIds_hxx) : $(wf_SRC_ooxml_NamespaceIds_xsl) $(wf_GEN_oox
 	$(call gb_Output_announce,$@,build,XSL,1)
 	$(call gb_Helper_abbreviate_dirs_native, $(gb_XSLTPROC) $(wf_SRC_ooxml_NamespaceIds_xsl) $(wf_GEN_ooxml_Model_processed)) > $@
 
-$(wf_GEN_ooxml_GperfFastToken_hxx) : $(wf_SRC_ooxml_GperfFastTokenHandler_xsl) $(wf_GEN_ooxml_Model_processed)
+$(wf_GEN_ooxml_GperfFastToken_hxx) : $(wf_SRC_ooxml_GperfFastTokenHandler_xsl) $(wf_GEN_ooxml_token_xml)
 	$(call gb_Output_announce,$@,build,GPF,1)
-	$(call gb_Helper_abbreviate_dirs_native, $(gb_XSLTPROC) $(wf_SRC_ooxml_GperfFastTokenHandler_xsl) $(wf_GEN_ooxml_Model_processed)) \
+	$(call gb_Helper_abbreviate_dirs_native, $(gb_XSLTPROC) $(wf_SRC_ooxml_GperfFastTokenHandler_xsl) $(wf_GEN_ooxml_token_xml)) \
 	| tr -d '\r' | $(GPERF) -I -t -E -S1 -c -G -LC++ > $@
 
 $(wf_GEN_ooxml_Model_analyzed): $(wf_SRC_ooxml_Analyze_model_xsl) $(wf_SRC_ooxml_Model)
diff --git a/writerfilter/source/ooxml/gperffasttokenhandler.xsl b/writerfilter/source/ooxml/gperffasttokenhandler.xsl
index d14db04..648342d 100644
--- a/writerfilter/source/ooxml/gperffasttokenhandler.xsl
+++ b/writerfilter/source/ooxml/gperffasttokenhandler.xsl
@@ -77,15 +77,14 @@ namespace writerfilter { namespace ooxml { namespace tokenmap {
 %}
 struct token { const char * name; Token_t nToken; };
 %%</xsl:text>
-    <xsl:for-each select=".//rng:element|.//rng:attribute">
-      <xsl:if test="generate-id(.) = generate-id(key('same-token-name', @localname)[1])">
-        <xsl:text>&#xa;</xsl:text>
-        <xsl:value-of select="@localname"/>
-        <xsl:text>, </xsl:text>
-        <xsl:call-template name="fastlocalname"/>
-      </xsl:if>
+    <xsl:for-each select="/model/fasttoken">
+      <xsl:text>&#xa;</xsl:text>
+      <xsl:value-of select="translate(., '-', '_')"/>
+      <xsl:text>, OOXML_</xsl:text>
+      <xsl:value-of select="translate(., '-', '_')"/>
     </xsl:for-each>
     <xsl:text>
+FAST_TOKENS_END, OOXML_FAST_TOKENS_END
 %%&#xa;</xsl:text>
 }}}&#xa;</xsl:template>
 


More information about the Libreoffice-commits mailing list