tdf#114163 Chart: fix order of legend names

Respecting the axis direction in case of
normal/stacked/percent stacked Bar chart and
the legend names will be in the right order.

Change-Id: If782393a33e48dae32f919d137e1d1148a85b0b0
Reviewed-on: https://gerrit.libreoffice.org/64632
Tested-by: Jenkins
Reviewed-by: Bartosz Kosiorek <gang65@poczta.onet.pl>
(cherry picked from commit 40144617ce05d7eff86eeb8a412c6991fe0b819e)
Reviewed-on: https://gerrit.libreoffice.org/64835
Reviewed-by: Balazs Varga <balazs.varga991@gmail.com>
diff --git a/chart2/source/view/charttypes/VSeriesPlotter.cxx b/chart2/source/view/charttypes/VSeriesPlotter.cxx
index 27f5798..7a45aa8 100644
--- a/chart2/source/view/charttypes/VSeriesPlotter.cxx
+++ b/chart2/source/view/charttypes/VSeriesPlotter.cxx
@@ -43,6 +43,7 @@
#include <DateHelper.hxx>
#include <DiagramHelper.hxx>
#include <defines.hxx>
#include <ChartModel.hxx>

//only for creation: @todo remove if all plotter are uno components and instantiated via servicefactory
#include "BarChart.hxx"
@@ -69,6 +70,7 @@
#include <basegfx/vector/b2dvector.hxx>
#include <com/sun/star/drawing/LineStyle.hpp>
#include <com/sun/star/util/XCloneable.hpp>
#include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>

#include <com/sun/star/container/XEnumerationAccess.hpp>
#include <com/sun/star/container/XEnumeration.hpp>
@@ -2200,12 +2202,26 @@
            , const Reference< drawing::XShapes >& xTarget
            , const Reference< lang::XMultiServiceFactory >& xShapeFactory
            , const Reference< uno::XComponentContext >& xContext
            , ChartModel& rModel
            )
{
    std::vector< ViewLegendEntry > aResult;

    if( xTarget.is() )
    {
        uno::Reference< XCoordinateSystemContainer > xCooSysCnt( rModel.getFirstDiagram(), uno::UNO_QUERY );
        Reference< chart2::XCoordinateSystem > xCooSys(xCooSysCnt->getCoordinateSystems()[0]);
        Reference< beans::XPropertySet > xProp( xCooSys, uno::UNO_QUERY );
        bool bSwapXAndY = false;

        if( xProp.is()) try
        {
            xProp->getPropertyValue( "SwapXAndYAxis" ) >>= bSwapXAndY;
        }
        catch( const uno::Exception& )
        {
        }

        //iterate through all series
        bool bBreak = false;
        bool bFirstSeries = true;
@@ -2241,7 +2257,10 @@
                        StackingDirection eStackingDirection( pSeries->getStackingDirection() );
                        bReverse = ( eStackingDirection == StackingDirection_Y_STACKING );

                        //todo: respect direction of axis in future
                        if( bSwapXAndY )
                        {
                            bReverse = !bReverse;
                        }
                    }

                    if (bReverse)
diff --git a/chart2/source/view/inc/LegendEntryProvider.hxx b/chart2/source/view/inc/LegendEntryProvider.hxx
index 3ad8a94..aff7a5d 100644
--- a/chart2/source/view/inc/LegendEntryProvider.hxx
+++ b/chart2/source/view/inc/LegendEntryProvider.hxx
@@ -25,6 +25,7 @@
#include <com/sun/star/uno/Sequence.h>
#include <vector>

namespace chart { class ChartModel; }
namespace com { namespace sun { namespace star { namespace beans { class XPropertySet; } } } }
namespace com { namespace sun { namespace star { namespace chart2 { class XFormattedString2; } } } }
namespace com { namespace sun { namespace star { namespace drawing { class XShape; } } } }
@@ -75,7 +76,8 @@
            const css::uno::Reference< css::beans::XPropertySet >& xTextProperties,
            const css::uno::Reference< css::drawing::XShapes >& xTarget,
            const css::uno::Reference< css::lang::XMultiServiceFactory >& xShapeFactory,
            const css::uno::Reference< css::uno::XComponentContext >& xContext
            const css::uno::Reference< css::uno::XComponentContext >& xContext,
            ChartModel& rModel
                ) = 0;

protected:
diff --git a/chart2/source/view/inc/VSeriesPlotter.hxx b/chart2/source/view/inc/VSeriesPlotter.hxx
index e181c75..4454115 100644
--- a/chart2/source/view/inc/VSeriesPlotter.hxx
+++ b/chart2/source/view/inc/VSeriesPlotter.hxx
@@ -33,6 +33,7 @@

namespace chart { class ExplicitCategoriesProvider; }
namespace chart { struct ExplicitScaleData; }
namespace chart { class ChartModel; }

namespace com { namespace sun { namespace star {
    namespace util {
@@ -197,7 +198,8 @@
            const css::uno::Reference< css::beans::XPropertySet >& xTextProperties,
            const css::uno::Reference< css::drawing::XShapes >& xTarget,
            const css::uno::Reference< css::lang::XMultiServiceFactory >& xShapeFactory,
            const css::uno::Reference< css::uno::XComponentContext >& xContext
            const css::uno::Reference< css::uno::XComponentContext >& xContext,
            ChartModel& rModel
                ) override;

    virtual LegendSymbolStyle getLegendSymbolStyle();
diff --git a/chart2/source/view/main/VLegend.cxx b/chart2/source/view/main/VLegend.cxx
index 0e6e32b..22c32d5 100644
--- a/chart2/source/view/main/VLegend.cxx
+++ b/chart2/source/view/main/VLegend.cxx
@@ -953,7 +953,7 @@
                {
                    std::vector<ViewLegendEntry> aNewEntries = pLegendEntryProvider->createLegendEntries(
                                                                    aMaxSymbolExtent, eExpansion, xLegendProp,
                                                                    xLegendContainer, m_xShapeFactory, m_xContext);
                                                                    xLegendContainer, m_xShapeFactory, m_xContext, mrModel);
                    aViewEntries.insert( aViewEntries.end(), aNewEntries.begin(), aNewEntries.end() );
                }
            }
diff --git a/sw/qa/extras/layout/data/tdf114163.odt b/sw/qa/extras/layout/data/tdf114163.odt
new file mode 100755
index 0000000..cf22e11
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf114163.odt
Binary files differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 996423e..4d65fc1 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -40,6 +40,7 @@
    void testRedlineTables();
    void testRedlineCharAttributes();
    void testTdf116830();
    void testTdf114163();
    void testTdf116925();
    void testTdf117028();
    void testTdf106390();
@@ -74,6 +75,7 @@
    CPPUNIT_TEST(testRedlineTables);
    CPPUNIT_TEST(testRedlineCharAttributes);
    CPPUNIT_TEST(testTdf116830);
    CPPUNIT_TEST(testTdf114163);
    CPPUNIT_TEST(testTdf116925);
    CPPUNIT_TEST(testTdf117028);
    CPPUNIT_TEST(testTdf106390);
@@ -2301,6 +2303,24 @@
    assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/rect", 1);
}

void SwLayoutWriter::testTdf114163()
{
    SwDoc* pDoc = createDoc("tdf114163.odt");
    SwDocShell* pShell = pDoc->GetDocShell();

    // Dump the rendering of the first page as an XML file.
    std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
    MetafileXmlDump dumper;
    xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile);
    CPPUNIT_ASSERT(pXmlDoc);

    assertXPathContent(
        pXmlDoc,
        "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/push[1]/push[1]/textarray[12]/text",
        "Data3");
    // This failed, if the legend first label is not "Data3".
}

void SwLayoutWriter::testTdf116925()
{
    SwDoc* pDoc = createDoc("tdf116925.docx");