    /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
    /*
     * This file is part of the LibreOffice project.
     *
     * This Source Code Form is subject to the terms of the Mozilla Public
     * License, v. 2.0. If a copy of the MPL was not distributed with this
     * file, You can obtain one at http://mozilla.org/MPL/2.0/.
     */
    #include "TablePositionHandler.hxx"
    #include "ConversionHelper.hxx"
    #include <ooxml/resourceids.hxx>
    #include <com/sun/star/text/HoriOrientation.hpp>
    #include <com/sun/star/text/VertOrientation.hpp>
    #include <com/sun/star/text/RelOrientation.hpp>
    #include <comphelper/sequenceashashmap.hxx>

    namespace writerfilter
    {
    namespace dmapper
    {

    using namespace ::com::sun::star;

    TablePositionHandler::TablePositionHandler() :
        LoggedProperties("TablePositionHandler"),
        m_aVertAnchor("margin"),
        m_aHorzAnchor("text")
    {
    }

    TablePositionHandler::~TablePositionHandler() = default;

    void TablePositionHandler::lcl_attribute(Id nId, Value& rVal)
    {
        switch (nId)
        {
        case NS_ooxml::LN_CT_TblPPr_vertAnchor:
            m_aVertAnchor = rVal.getString();
            break;
        case NS_ooxml::LN_CT_TblPPr_tblpYSpec:
            m_aYSpec = rVal.getString();
            break;
        case NS_ooxml::LN_CT_TblPPr_horzAnchor:
            m_aHorzAnchor = rVal.getString();
            break;
        case NS_ooxml::LN_CT_TblPPr_tblpXSpec:
            m_aXSpec = rVal.getString();
            break;
        case NS_ooxml::LN_CT_TblPPr_tblpY:
            m_nY = rVal.getInt();
            break;
        case NS_ooxml::LN_CT_TblPPr_tblpX:
            m_nX = rVal.getInt();
            break;
        case NS_ooxml::LN_CT_TblPPr_leftFromText:
            m_nLeftFromText = rVal.getInt();
            break;
        case NS_ooxml::LN_CT_TblPPr_rightFromText:
            m_nRightFromText = rVal.getInt();
            break;
        case NS_ooxml::LN_CT_TblPPr_topFromText:
            m_nTopFromText = rVal.getInt();
            break;
        case NS_ooxml::LN_CT_TblPPr_bottomFromText:
            m_nBottomFromText = rVal.getInt();
            break;
        default:
    #ifdef DEBUG_WRITERFILTER
            TagLogger::getInstance().element("unhandled");
    #endif
            break;
        }
    }

    void TablePositionHandler::lcl_sprm(Sprm& /*rSprm*/)
    {
    }

    uno::Sequence<beans::PropertyValue> TablePositionHandler::getTablePosition() const
    {
        comphelper::SequenceAsHashMap aFrameProperties;

        aFrameProperties["LeftBorderDistance"] <<= sal_Int32(0);
        aFrameProperties["RightBorderDistance"] <<= sal_Int32(0);
        aFrameProperties["TopBorderDistance"] <<= sal_Int32(0);
        aFrameProperties["BottomBorderDistance"] <<= sal_Int32(0);

        aFrameProperties["LeftMargin"] <<= ConversionHelper::convertTwipToMM100(m_nLeftFromText);
        aFrameProperties["RightMargin"] <<= ConversionHelper::convertTwipToMM100(m_nRightFromText);
        aFrameProperties["TopMargin"] <<= ConversionHelper::convertTwipToMM100(m_nTopFromText);
        aFrameProperties["BottomMargin"] <<= ConversionHelper::convertTwipToMM100(m_nBottomFromText);

        table::BorderLine2 aEmptyBorder;
        aFrameProperties["TopBorder"] <<= aEmptyBorder;
        aFrameProperties["BottomBorder"] <<= aEmptyBorder;
        aFrameProperties["LeftBorder"] <<= aEmptyBorder;
        aFrameProperties["RightBorder"] <<= aEmptyBorder;

        // Horizontal positioning
        sal_Int16 nHoriOrient = text::HoriOrientation::NONE;
        if (m_aXSpec == "center")
            nHoriOrient = text::HoriOrientation::CENTER;
        else if (m_aXSpec == "inside")
            nHoriOrient = text::HoriOrientation::INSIDE;
        else if (m_aXSpec == "left")
            nHoriOrient = text::HoriOrientation::LEFT;
        else if (m_aXSpec == "outside")
            nHoriOrient = text::HoriOrientation::OUTSIDE;
        else if (m_aXSpec == "right")
            nHoriOrient = text::HoriOrientation::RIGHT;

        sal_Int16 nHoriOrientRelation;
        if (m_aHorzAnchor == "margin")
            nHoriOrientRelation = text::RelOrientation::PAGE_PRINT_AREA;
        else if (m_aHorzAnchor == "page")
            nHoriOrientRelation = text::RelOrientation::PAGE_FRAME;
        else if (m_aHorzAnchor == "text")
            nHoriOrientRelation = text::RelOrientation::FRAME;

        aFrameProperties["HoriOrient"] <<= nHoriOrient;
        aFrameProperties["HoriOrientRelation"] <<= nHoriOrientRelation;
        aFrameProperties["HoriOrientPosition"] <<= ConversionHelper::convertTwipToMM100(m_nX);

        // Vertical positioning
        sal_Int16 nVertOrient = text::VertOrientation::NONE;
        if (m_aYSpec == "bottom")
            nVertOrient = text::VertOrientation::BOTTOM;
        else if (m_aYSpec == "center")
            nVertOrient = text::VertOrientation::CENTER;
        else if (m_aYSpec == "top")
            nVertOrient = text::VertOrientation::TOP;
        // TODO There are a few cases we can't map ATM.

        sal_Int16 nVertOrientRelation;
        if (m_aVertAnchor == "margin")
            nVertOrientRelation = text::RelOrientation::PAGE_PRINT_AREA;
        else if (m_aVertAnchor == "page")
            nVertOrientRelation = text::RelOrientation::PAGE_FRAME;
        else if (m_aVertAnchor == "text")
            nVertOrientRelation = text::RelOrientation::FRAME;

        aFrameProperties["VertOrient"] <<= nVertOrient;
        aFrameProperties["VertOrientRelation"] <<= nVertOrientRelation;
        aFrameProperties["VertOrientPosition"] <<= ConversionHelper::convertTwipToMM100(m_nY);
        aFrameProperties["FillTransparence"] <<= sal_Int32(100);

        return aFrameProperties.getAsConstPropertyValueList();
    }

    bool TablePositionHandler::operator== (const TablePositionHandler& rHandler) const
    {
        return m_aVertAnchor == rHandler.m_aVertAnchor &&
               m_aYSpec == rHandler.m_aYSpec &&
               m_aHorzAnchor == rHandler.m_aHorzAnchor &&
               m_aXSpec == rHandler.m_aXSpec &&
               m_nY == rHandler.m_nY &&
               m_nX == rHandler.m_nX;
    }

    } // namespace dmapper
    } // namespace writerfilter

    /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

↑ V614 Potentially uninitialized variable 'nVertOrientRelation' used.

↑ V614 Potentially uninitialized variable 'nHoriOrientRelation' used.