[Libreoffice-commits] core.git: sw/qa writerfilter/source

Bakos Attila (via logerrit) logerrit at kemper.freedesktop.org
Fri Jan 17 11:52:27 UTC 2020


 sw/qa/extras/ooxmlexport/data/tdf129888dml.docx       |binary
 sw/qa/extras/ooxmlexport/data/tdf129888vml.docx       |binary
 sw/qa/extras/ooxmlexport/ooxmlexport14.cxx            |   28 ++++++++++++++++++
 writerfilter/source/dmapper/DomainMapper.cxx          |   14 ---------
 writerfilter/source/dmapper/GraphicImport.cxx         |    2 -
 writerfilter/source/ooxml/OOXMLFastContextHandler.cxx |   24 +++++++++++++++
 writerfilter/source/ooxml/OOXMLFastContextHandler.hxx |    1 
 7 files changed, 54 insertions(+), 15 deletions(-)

New commits:
commit 14ad64270e4fbca3c24da6f55f260b1fb229556a
Author:     Bakos Attila <bakos.attilakaroly at nisz.hu>
AuthorDate: Thu Jan 16 13:45:47 2020 +0100
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Fri Jan 17 12:51:52 2020 +0100

    tdf#129888 DOCX shape import: handle o:allowincell
    
    (VML) and layoutInCell (DrawingML) attributes to fix
    regressions caused by commit 10f29d8bf05d44ca8bc11d34d1294ec17f8ac0f1
    (tdf#87569 tdf#109411 DOCX import: fix shape anchor in tables).
    
    Position of shapes anchored to tables is calculated from
    the cell margin only if the previous attributes allow that.
    
    Change-Id: Ifcfcb7f4959aea522dd45dff00cefd1bb9f4edda
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86922
    Tested-by: Jenkins
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf129888dml.docx b/sw/qa/extras/ooxmlexport/data/tdf129888dml.docx
new file mode 100644
index 000000000000..1f6b03034fda
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129888dml.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf129888vml.docx b/sw/qa/extras/ooxmlexport/data/tdf129888vml.docx
new file mode 100644
index 000000000000..ee7c60f8a8dc
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129888vml.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
index 61f3a2ab60a7..a94263f05c41 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
@@ -43,6 +43,34 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf128207, "tdf128207.docx")
     assertXPathContent(p_XmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:drawing/wp:anchor/wp:positionH/wp:posOffset", "4445");
 }
 
+DECLARE_OOXMLIMPORT_TEST(testTdf129888vml, "tdf129888vml.docx")
+{
+    //the line shape has anchor in the first cell however it has to
+    //be positioned to an another cell. To reach this we must handle
+    //the o:allowincell attribute of the shape, and its position has
+    //to be calculated from the page frame instead of the table:
+
+    uno::Reference<beans::XPropertySet> xShapeProperties(getShape(1), uno::UNO_QUERY);
+    sal_Int16 nValue;
+    xShapeProperties->getPropertyValue("HoriOrientRelation") >>= nValue;
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("tdf129888vml The line shape has bad place!",
+                                 text::RelOrientation::PAGE_FRAME, nValue);
+}
+
+DECLARE_OOXMLIMPORT_TEST(testTdf129888dml, "tdf129888dml.docx")
+{
+    //the shape has anchor in the first cell however it has to
+    //be positioned to the right side of the page. To reach this we must handle
+    //the layoutInCell attribute of the shape, and its position has
+    //to be calculated from the page frame instead of the table:
+
+    uno::Reference<beans::XPropertySet> xShapeProperties(getShape(1), uno::UNO_QUERY);
+    sal_Int16 nValue;
+    xShapeProperties->getPropertyValue("HoriOrientRelation") >>= nValue;
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("tdf129888dml The shape has bad place!",
+                                 text::RelOrientation::PAGE_FRAME, nValue);
+}
+
 DECLARE_OOXMLEXPORT_TEST(testTdf87569v, "tdf87569_vml.docx")
 {
     //the original tdf87569 sample has vml shapes...
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 8a62a2ebda83..0da610f7ab53 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3043,20 +3043,6 @@ void DomainMapper::lcl_startShape(uno::Reference<drawing::XShape> const& xShape)
 
     m_pImpl->SetIsFirstParagraphInShape(true);
 
-    //tdf#87569: Fix table layout with correcting anchoring
-    //If anchored object is in table, Word calculates its position from cell border
-    //instead of page (what is set in the sample document)
-    if (m_pImpl->m_nTableDepth > 0) //if we had a table
-    {
-        uno::Reference<beans::XPropertySet> xShapePropSet(xShape, uno::UNO_QUERY);
-        sal_Int16 nCurrentHorOriRel; //A temp variable to store the current setting
-        xShapePropSet->getPropertyValue("HoriOrientRelation") >>= nCurrentHorOriRel;
-        //and the correction:
-        if (nCurrentHorOriRel == text::RelOrientation::PAGE_FRAME)
-            xShapePropSet->setPropertyValue("HoriOrientRelation",
-                                            uno::makeAny(text::RelOrientation::FRAME));
-    }
-
 }
 
 void DomainMapper::lcl_endShape( )
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx
index 6c2b7ba81511..b730d5eff1bd 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -875,7 +875,7 @@ void GraphicImport::lcl_attribute(Id nName, Value& rValue)
 
                         //tdf#109411 If anchored object is in table, Word calculates its position from cell border
                         //instead of page (what is set in the sample document)
-                        if (m_pImpl->rDomainMapper.IsInTable() &&
+                        if (m_pImpl->rDomainMapper.IsInTable() && m_pImpl->bLayoutInCell &&
                             m_pImpl->nHoriRelation == text::RelOrientation::PAGE_FRAME && IsGraphic())
                         {
                             m_pImpl->nHoriRelation = text::RelOrientation::FRAME;
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 6f7839d0512b..19dc3bb917e0 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -17,6 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/text/RelOrientation.hpp>
 #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/xml/sax/FastShapeContextHandler.hpp>
@@ -65,6 +67,7 @@ OOXMLFastContextHandler::OOXMLFastContextHandler
   mpStream(nullptr),
   mnTableDepth(0),
   inPositionV(false),
+  mbLayoutInCell(true),
   m_xContext(context),
   m_bDiscardChildren(false),
   m_bTookChoice(false)
@@ -85,6 +88,7 @@ OOXMLFastContextHandler::OOXMLFastContextHandler(OOXMLFastContextHandler * pCont
   mpParserState(pContext->mpParserState),
   mnTableDepth(pContext->mnTableDepth),
   inPositionV(pContext->inPositionV),
+  mbLayoutInCell(pContext->mbLayoutInCell),
   m_xContext(pContext->m_xContext),
   m_bDiscardChildren(pContext->m_bDiscardChildren),
   m_bTookChoice(pContext->m_bTookChoice)
@@ -1663,6 +1667,21 @@ void OOXMLFastContextHandlerShape::sendShape( Token_t Element )
 
             bool bIsPicture = Element == ( NMSP_dmlPicture | XML_pic );
 
+
+            //tdf#87569: Fix table layout with correcting anchoring
+            //If anchored object is in table, Word calculates its position from cell border
+            //instead of page (what is set in the sample document)
+            if (mnTableDepth > 0 && mbLayoutInCell) //if we had a table
+            {
+                uno::Reference<beans::XPropertySet> xShapePropSet(xShape, uno::UNO_QUERY);
+                sal_Int16 nCurrentHorOriRel; //A temp variable for storaging the current setting
+                xShapePropSet->getPropertyValue("HoriOrientRelation") >>= nCurrentHorOriRel;
+                //and the correction:
+                if (nCurrentHorOriRel == com::sun::star::text::RelOrientation::PAGE_FRAME)
+                    xShapePropSet->setPropertyValue("HoriOrientRelation",
+                                                    uno::makeAny(text::RelOrientation::FRAME));
+            }
+
             // Notify the dmapper that the shape is ready to use
             if ( !bIsPicture )
             {
@@ -1735,6 +1754,11 @@ OOXMLFastContextHandlerShape::lcl_createFastChildContext
                                                            pChildContext,
                                                            this);
 
+                    //tdf129888 store allowincell attribute of the VML shape
+                    if (Attribs->hasAttribute(NMSP_vmlOffice | XML_allowincell))
+                        mbLayoutInCell
+                            = !(Attribs->getValue(NMSP_vmlOffice | XML_allowincell) == "f");
+
                     if (!bGroupShape)
                     {
                         pWrapper->addNamespace(NMSP_doc);
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
index d5de5a778ee0..0cc3fb1791a9 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
@@ -226,6 +226,7 @@ protected:
     const css::uno::Reference< css::uno::XComponentContext >& getComponentContext() const { return m_xContext;}
 
     bool inPositionV;
+    bool mbLayoutInCell; // o:allowincell
     OOXMLValue::Pointer_t mpGridAfter;
 
 private:


More information about the Libreoffice-commits mailing list