tdf#130120 DOCX EXPORT: Fix unhandled o:allowincell attribute on export

The objects in table has the attribute o:allowincell depending on
if they are in a tablecell or not. This was not handled, but now
it exported too, keeping the right position of objects.

Change-Id: If883511b6114e8f60d673ecbd3a11095fcafddc5
diff --git a/sw/qa/extras/ooxmlexport/data/tdf130120.docx b/sw/qa/extras/ooxmlexport/data/tdf130120.docx
new file mode 100644
index 0000000..5ca2adc7
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf130120.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
old mode 100644
new mode 100755
index c4e12c9..52e4d36
--- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
@@ -85,6 +85,15 @@ DECLARE_OOXMLIMPORT_TEST(testTdf129888dml, "tdf129888dml.docx")
                                 text::RelOrientation::PAGE_FRAME, nValue);
}

DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf130120, "tdf130120.docx")
{
   //Text for exporting the allowincell attribute:
    xmlDocPtr p_XmlDoc = parseExport("word/document.xml");
    assertXPath(p_XmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r/mc:AlternateContent/"
                          "mc:Choice/w:drawing/wp:anchor","layoutInCell","0");
}


DECLARE_OOXMLEXPORT_TEST(testTdf87569v, "tdf87569_vml.docx")
{
    //the original tdf87569 sample has vml shapes...
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx
index 8ab399a4..ae3bfe3 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -31,8 +31,9 @@
#include <comphelper/sequence.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <sal/log.hxx>

#include <frmfmt.hxx>
#include <IDocumentDrawModelAccess.hxx>
#include <comphelper/propertysequence.hxx>

using namespace com::sun::star;
using namespace oox;
@@ -465,7 +466,25 @@ void DocxSdrExport::startDMLAnchorInline(const SwFrameFormat* pFrameFormat, cons
        attrList->add(XML_distR, OString::number(nDistR).getStr());
        attrList->add(XML_simplePos, "0");
        attrList->add(XML_locked, "0");
        attrList->add(XML_layoutInCell, "1");
        bool bLclInTabCell = true;
        if (pObj)
        {
            uno::Reference<drawing::XShape> xShape((const_cast<SdrObject*>(pObj)->getUnoShape()),
                                               uno::UNO_QUERY);
            uno::Sequence<beans::PropertyValue> propList = lclGetProperty(xShape, "InteropGrabBag");
            if (propList.hasElements())
            {
                for (int i = 0; i < propList.getLength(); i++)
                {
                    if (propList[i].Name == "LayoutInCell")
                        propList[i].Value >>= bLclInTabCell;
                }
            }
        }
        if (bLclInTabCell)
            attrList->add(XML_layoutInCell, "1");
        else
            attrList->add(XML_layoutInCell, "0");
        bool bAllowOverlap = pFrameFormat->GetWrapInfluenceOnObjPos().GetAllowOverlap();
        attrList->add(XML_allowOverlap, bAllowOverlap ? "1" : "0");
        if (pObj != nullptr)
diff --git a/sw/source/filter/ww8/ww8graf.cxx b/sw/source/filter/ww8/ww8graf.cxx
index 9e93aef..8bd5b6f 100644
--- a/sw/source/filter/ww8/ww8graf.cxx
+++ b/sw/source/filter/ww8/ww8graf.cxx
@@ -2684,7 +2684,6 @@ SwFrameFormat* SwWW8ImplReader::Read_GrafLayer( long nGrafAnchorCp )
        SdrObject::Free(pObject);
        return nullptr;
    }

    const bool bLayoutInTableCell =
        m_nInTable && IsObjectLayoutInTableCell( pRecord->nLayoutInTableCell );

diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx
index 560d5c8..3e48136 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -67,6 +67,8 @@
#include "WrapPolygonHandler.hxx"
#include "util.hxx"

#include <comphelper/propertysequence.hxx>

using namespace css;

namespace
@@ -876,6 +878,18 @@ 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 (xShapeProps)
                        {
                            uno::Sequence<beans::PropertyValue> aShapeGrabBag;
                            xShapeProps->getPropertyValue("InteropGrabBag") >>= aShapeGrabBag;
                            beans::PropertyValue aLayInCell;
                            aLayInCell.Name = "LayoutInCell";
                            aLayInCell.Value = uno::Any(m_pImpl->bLayoutInCell);
                            aShapeGrabBag.realloc((1 + aShapeGrabBag.size()));
                            aShapeGrabBag[aShapeGrabBag.size() - 1] = aLayInCell;
                            xShapeProps->setPropertyValue("InteropGrabBag",
                                                            uno::makeAny(aShapeGrabBag));
                        }
                        if (m_pImpl->rDomainMapper.IsInTable() && m_pImpl->bLayoutInCell &&
                            m_pImpl->nHoriRelation == text::RelOrientation::PAGE_FRAME && IsGraphic())
                        {
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 14f40a0..05b7af7 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -34,6 +34,9 @@
#include "OOXMLFastContextHandler.hxx"
#include "OOXMLFactory.hxx"
#include "Handler.hxx"
#include <dmapper/PropertyIds.hxx>
#include <comphelper/propertysequence.hxx>
#include <comphelper/sequenceashashmap.hxx>

static const sal_Unicode uCR = 0xd;
static const sal_Unicode uFtnEdnRef = 0x2;
@@ -1670,15 +1673,28 @@ void OOXMLFastContextHandlerShape::sendShape( Token_t Element )
            //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)
            uno::Reference<beans::XPropertySet> xShapePropSet(xShape, uno::UNO_QUERY);
            if(xShapePropSet && bIsPicture) //TODO make grabbag for textboxes as well
            {
                uno::Sequence<beans::PropertyValue> aShapeGrabBag;
                xShapePropSet->getPropertyValue("InteropGrabBag") >>= aShapeGrabBag;
                beans::PropertyValue aLayInCell;
                aLayInCell.Name = "LayoutInCell";
                aLayInCell.Value = uno::Any(mbLayoutInCell);
                aShapeGrabBag.realloc((1+aShapeGrabBag.size()));
                aShapeGrabBag[aShapeGrabBag.size() -1] = aLayInCell;
                xShapePropSet->setPropertyValue("InteropGrabBag", uno::makeAny(aShapeGrabBag));
            }
            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
@@ -1754,6 +1770,7 @@ OOXMLFastContextHandlerShape::lcl_createFastChildContext
                                                           this);

                    //tdf129888 store allowincell attribute of the VML shape
                    mbLayoutInCell = true;
                    if (Attribs->hasAttribute(NMSP_vmlOffice | XML_allowincell))
                        mbLayoutInCell
                            = !(Attribs->getValue(NMSP_vmlOffice | XML_allowincell) == "f");