[Libreoffice-commits] .: oox/inc oox/source sw/qa

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Jan 30 08:19:50 PST 2013


 oox/inc/oox/vml/vmlshape.hxx                       |   15 +++------
 oox/source/vml/vmlshape.cxx                        |   23 +++++++++++---
 sw/qa/extras/ooxmlimport/data/groupshape-line.docx |binary
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx           |   33 +++++++++++++++++++++
 4 files changed, 57 insertions(+), 14 deletions(-)

New commits:
commit 7877638814de86202d33b5653a0f91d63341e98c
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Wed Jan 30 16:43:35 2013 +0100

    n#792778 oox: implement import of v:line inside v:group
    
    The problem was that in ShapeBase::convertAndInsert(), the rectangle
    calculated for a line was zero, that's why it wasn't imported. Fix this
    by overriding the get*Rectangle() methods in LineShape, instead of doing
    so with implConvertAndInsert().
    
    Change-Id: Ie4bb2f7964b438cb56e4f5ee7a4ebe9f8f8eb734

diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx
index 1ef3058..8373d4f 100644
--- a/oox/inc/oox/vml/vmlshape.hxx
+++ b/oox/inc/oox/vml/vmlshape.hxx
@@ -128,12 +128,10 @@ protected:
     ::com::sun::star::awt::Rectangle getCoordSystem() const;
     /** Returns the absolute shape rectangle according to the passed anchor. */
     ::com::sun::star::awt::Rectangle getRectangle( const ShapeParentAnchor* pParentAnchor ) const;
-
-private:
     /** Returns the absolute shape rectangle. */
-    ::com::sun::star::awt::Rectangle getAbsRectangle() const;
+    virtual ::com::sun::star::awt::Rectangle getAbsRectangle() const;
     /** Returns the rectangle relative to the parent coordinate system. */
-    ::com::sun::star::awt::Rectangle getRelRectangle() const;
+    virtual ::com::sun::star::awt::Rectangle getRelRectangle() const;
 
 protected:
     Drawing&            mrDrawing;          ///< The VML drawing page that contains this shape.
@@ -341,11 +339,10 @@ 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;
+    /** Returns the absolute shape rectangle. */
+    virtual ::com::sun::star::awt::Rectangle getAbsRectangle() const;
+    /** Returns the rectangle relative to the parent coordinate system. */
+    virtual ::com::sun::star::awt::Rectangle getRelRectangle() const;
 };
 
 /** Bezier shape object that supports to, from, control1 and control2
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index 8341f19..b7b1c5c 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -297,7 +297,6 @@ Reference< XShape > ShapeBase::convertAndInsert( const Reference< XShapes >& rxS
             according to some imported shape client data (e.g. Excel cell anchor). */
         awt::Rectangle aShapeRect = calcShapeRectangle( pParentAnchor );
 
-        // convert the shape, if the calculated rectangle is not empty
         if( ((aShapeRect.Width > 0) || (aShapeRect.Height > 0)) && rxShapes.is() )
         {
             xShape = implConvertAndInsert( rxShapes, aShapeRect );
@@ -320,6 +319,8 @@ Reference< XShape > ShapeBase::convertAndInsert( const Reference< XShapes >& rxS
                 mrDrawing.notifyXShapeInserted( xShape, aShapeRect, *this, bGroupChild );
             }
         }
+        else
+            SAL_WARN("oox", "not converting shape, as calculated rectangle is empty");
     }
     return xShape;
 }
@@ -637,10 +638,10 @@ LineShape::LineShape(Drawing& rDrawing)
 {
 }
 
-Reference<XShape> LineShape::implConvertAndInsert(const Reference<XShapes>& rxShapes, const awt::Rectangle& rShapeRect) const
+awt::Rectangle LineShape::getAbsRectangle() const
 {
     const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper();
-    awt::Rectangle aShapeRect(rShapeRect);
+    awt::Rectangle aShapeRect;
     sal_Int32 nIndex = 0;
 
     aShapeRect.X = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maShapeModel.maFrom.getToken(0, ',', nIndex), 0, true, true);
@@ -648,8 +649,20 @@ Reference<XShape> LineShape::implConvertAndInsert(const Reference<XShapes>& rxSh
     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, false, true) - aShapeRect.Y;
+    return aShapeRect;
+}
 
-    return SimpleShape::implConvertAndInsert(rxShapes, aShapeRect);
+awt::Rectangle LineShape::getRelRectangle() const
+{
+    awt::Rectangle aShapeRect;
+    sal_Int32 nIndex = 0;
+
+    aShapeRect.X = maShapeModel.maFrom.getToken(0, ',', nIndex).toInt32();
+    aShapeRect.Y = maShapeModel.maFrom.getToken(0, ',', nIndex).toInt32();
+    nIndex = 0;
+    aShapeRect.Width = maShapeModel.maTo.getToken(0, ',', nIndex).toInt32() - aShapeRect.X;
+    aShapeRect.Height = maShapeModel.maTo.getToken(0, ',', nIndex).toInt32() - aShapeRect.Y;
+    return aShapeRect;
 }
 
 // ============================================================================
@@ -887,9 +900,9 @@ Reference< XShape > GroupShape::implConvertAndInsert( const Reference< XShapes >
         xGroupShape = mrDrawing.createAndInsertXShape( "com.sun.star.drawing.GroupShape", rxShapes, rShapeRect );
         Reference< XShapes > xChildShapes( xGroupShape, UNO_QUERY_THROW );
         mxChildren->convertAndInsert( xChildShapes, &aParentAnchor );
-        // no child shape has been created - delete the group shape
         if( !xChildShapes->hasElements() )
         {
+            SAL_WARN("oox", "no child shape has been created - deleting the group shape");
             rxShapes->remove( xGroupShape );
             xGroupShape.clear();
         }
diff --git a/sw/qa/extras/ooxmlimport/data/groupshape-line.docx b/sw/qa/extras/ooxmlimport/data/groupshape-line.docx
new file mode 100644
index 0000000..5ee2dca
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/groupshape-line.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 28db45e..3abfa6d 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -113,6 +113,7 @@ public:
     void testN792778();
     void testN793262();
     void testN793998();
+    void testGroupshapeLine();
 
     CPPUNIT_TEST_SUITE(Test);
 #if !defined(MACOSX) && !defined(WNT)
@@ -178,6 +179,7 @@ void Test::run()
         {"n792778.docx", &Test::testN792778},
         {"n793262.docx", &Test::testN793262},
         {"n793998.docx", &Test::testN793998},
+        {"groupshape-line.docx", &Test::testGroupshapeLine},
     };
     header();
     for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
@@ -1101,6 +1103,37 @@ void Test::testN792778()
     CPPUNIT_ASSERT_EQUAL(sal_Int32(11684), xInnerShape->getPosition().Y);
 }
 
+void Test::testGroupshapeLine()
+{
+    /*
+     * Another fallout from n#792778, this time first the lines inside a
+     * groupshape wasn't imported, then the fix broke the size/position of
+     * non-groupshape lines. Test both here.
+     *
+     * xray ThisComponent.DrawPage.Count ' 2 shapes
+     * xray ThisComponent.DrawPage(0).Position 'x: 2656, y: 339
+     * xray ThisComponent.DrawPage(0).Size ' width: 3270, height: 1392
+     * xray ThisComponent.DrawPage(1).getByIndex(0).Position 'x: 1272, y: 2286
+     * xray ThisComponent.DrawPage(1).getByIndex(0).Size 'width: 10160, height: 0
+     */
+    uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xDrawPage(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xDrawPage->getCount());
+
+    uno::Reference<drawing::XShape> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(2656), xShape->getPosition().X);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(339), xShape->getPosition().Y);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3270), xShape->getSize().Width);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1392), xShape->getSize().Height);
+
+    uno::Reference<drawing::XShapes> xGroupShape(xDrawPage->getByIndex(1), uno::UNO_QUERY);
+    xShape.set(xGroupShape->getByIndex(0), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1272), xShape->getPosition().X);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(2286), xShape->getPosition().Y);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(10160), xShape->getSize().Width);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xShape->getSize().Height);
+}
+
 void Test::testN793262()
 {
     uno::Reference<container::XEnumerationAccess> xHeaderText = getProperty< uno::Reference<container::XEnumerationAccess> >(getStyles("PageStyles")->getByName(DEFAULT_STYLE), "HeaderText");


More information about the Libreoffice-commits mailing list