tdf#51671, implement feature to disable legend entry for series

No UI and no ODF or OOXML support yet.

Change-Id: I839c195e9c42f074838ff6592331f7cdd13b6cd2
Reviewed-on: https://gerrit.libreoffice.org/64583
Tested-by: Jenkins
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
diff --git a/chart2/source/model/main/DataSeriesProperties.cxx b/chart2/source/model/main/DataSeriesProperties.cxx
index 6c7e38d..375e6c4 100644
--- a/chart2/source/model/main/DataSeriesProperties.cxx
+++ b/chart2/source/model/main/DataSeriesProperties.cxx
@@ -57,6 +57,12 @@ void DataSeriesProperties::AddPropertiesToVector(
                  | beans::PropertyAttribute::MAYBEVOID
                  | beans::PropertyAttribute::MAYBEDEFAULT );

    rOutProperties.emplace_back( "ShowLegendEntry",
                  PROP_DATASERIES_SHOW_LEGEND_ENTRY,
                  cppu::UnoType<sal_Bool>::get(),
                  beans::PropertyAttribute::BOUND
                  | beans::PropertyAttribute::MAYBEDEFAULT );

    // add properties of service DataPointProperties
    DataPointProperties::AddPropertiesToVector( rOutProperties );
}
@@ -67,6 +73,7 @@ void DataSeriesProperties::AddDefaultsToMap(
    PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DATASERIES_STACKING_DIRECTION, chart2::StackingDirection_NO_STACKING );
    PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DATASERIES_VARY_COLORS_BY_POINT, false );
    PropertyHelper::setPropertyValueDefault< sal_Int32 >( rOutMap, PROP_DATASERIES_ATTACHED_AXIS_INDEX, 0 );
    PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DATASERIES_SHOW_LEGEND_ENTRY, true );

    // PROP_DATASERIES_ATTRIBUTED_DATA_POINTS has no default

diff --git a/chart2/source/model/main/DataSeriesProperties.hxx b/chart2/source/model/main/DataSeriesProperties.hxx
index e27b9ac..6791078 100644
--- a/chart2/source/model/main/DataSeriesProperties.hxx
+++ b/chart2/source/model/main/DataSeriesProperties.hxx
@@ -36,7 +36,8 @@ namespace DataSeriesProperties
        PROP_DATASERIES_ATTRIBUTED_DATA_POINTS = FAST_PROPERTY_ID_START_DATA_SERIES,
        PROP_DATASERIES_STACKING_DIRECTION,
        PROP_DATASERIES_VARY_COLORS_BY_POINT,
        PROP_DATASERIES_ATTACHED_AXIS_INDEX
        PROP_DATASERIES_ATTACHED_AXIS_INDEX,
        PROP_DATASERIES_SHOW_LEGEND_ENTRY
    };

    void AddPropertiesToVector(
diff --git a/chart2/source/view/charttypes/VSeriesPlotter.cxx b/chart2/source/view/charttypes/VSeriesPlotter.cxx
index ff09606..ee76f73 100644
--- a/chart2/source/view/charttypes/VSeriesPlotter.cxx
+++ b/chart2/source/view/charttypes/VSeriesPlotter.cxx
@@ -2208,6 +2208,11 @@ std::vector< ViewLegendEntry > VSeriesPlotter::createLegendEntries(
                    if (!pSeries)
                        continue;

                    if (!pSeries->getPropertiesOfSeries()->getPropertyValue("ShowLegendEntry").get<sal_Bool>())
                    {
                        continue;
                    }

                    std::vector<ViewLegendEntry> aSeriesEntries(
                            createLegendEntriesForSeries(
                                        rEntryKeyAspectRatio, *pSeries, xTextProperties,
diff --git a/offapi/com/sun/star/chart2/DataSeries.idl b/offapi/com/sun/star/chart2/DataSeries.idl
index 0d43ee6..357ec4f 100644
--- a/offapi/com/sun/star/chart2/DataSeries.idl
+++ b/offapi/com/sun/star/chart2/DataSeries.idl
@@ -173,6 +173,13 @@ service DataSeries
        this series there.</p>
    */
    [optional, property] long                       AttachedAxisIndex;

    /** This property describes whether the legend entry for the
        the data series should be shown.

        @since LibreOffice 6.3
      */
    [optional, property] boolean                    ShowLegendEntry;
};

} ; // chart2
diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx
index 6ff977f..b8d32f8 100644
--- a/sc/source/filter/excel/xichart.cxx
+++ b/sc/source/filter/excel/xichart.cxx
@@ -1778,7 +1778,8 @@ XclImpChSeries::XclImpChSeries( const XclImpChRoot& rRoot, sal_uInt16 nSeriesIdx
    XclImpChRoot( rRoot ),
    mnGroupIdx( EXC_CHSERGROUP_NONE ),
    mnSeriesIdx( nSeriesIdx ),
    mnParentIdx( EXC_CHSERIES_INVALID )
    mnParentIdx( EXC_CHSERIES_INVALID ),
    mbLabelDeleted( false )
{
}

@@ -1817,6 +1818,9 @@ void XclImpChSeries::ReadSubRecord( XclImpStream& rStrm )
        case EXC_ID_CHSERERRORBAR:
            ReadChSerErrorBar( rStrm );
        break;
        case EXC_ID_CHLEGENDEXCEPTION:
            ReadChLegendException( rStrm );
        break;
    }
}

@@ -2054,6 +2058,9 @@ Reference< XDataSeries > XclImpChSeries::CreateDataSeries() const
        if( mxSeriesFmt )
            mxSeriesFmt->Convert( aSeriesProp, rTypeInfo );

        if (mbLabelDeleted)
            aSeriesProp.SetProperty(EXC_CHPROP_SHOWLEGENDENTRY, false);

        // trend lines
        ConvertTrendLines( xDataSeries );

@@ -2185,6 +2192,13 @@ Reference< XPropertySet > XclImpChSeries::CreateErrorBar( sal_uInt8 nPosBarId, s
    return XclImpChSerErrorBar::CreateErrorBar(itrPosBar->second.get(), itrNegBar->second.get());
}

void XclImpChSeries::ReadChLegendException(XclImpStream& rStrm)
{
    rStrm.Ignore(2);
    sal_uInt16 nFlags = rStrm.ReaduInt16();
    mbLabelDeleted = (nFlags & EXC_CHLEGENDEXCEPTION_DELETED);
}

// Chart type groups ==========================================================

XclImpChType::XclImpChType( const XclImpChRoot& rRoot ) :
diff --git a/sc/source/filter/inc/xichart.hxx b/sc/source/filter/inc/xichart.hxx
index ec033e5..5a686ca 100644
--- a/sc/source/filter/inc/xichart.hxx
+++ b/sc/source/filter/inc/xichart.hxx
@@ -822,6 +822,7 @@ private:
    /** Reads a CHSERERRORBAR record containing error bar settings. */
    void                ReadChSerErrorBar( XclImpStream& rStrm );

    void                ReadChLegendException( XclImpStream& rStrm );
    /** Creates a new CHDATAFORMAT group with the specified point index. */
    XclImpChDataFormatRef CreateDataFormat( sal_uInt16 nPointIdx, sal_uInt16 nFormatIdx );

@@ -849,6 +850,7 @@ private:
    sal_uInt16          mnGroupIdx;         /// Chart type group (CHTYPEGROUP group) this series is assigned to.
    sal_uInt16          mnSeriesIdx;        /// 0-based series index.
    sal_uInt16          mnParentIdx;        /// 0-based index of parent series (trend lines and error bars).
    bool                mbLabelDeleted;     /// Legend label deleted
};

typedef std::shared_ptr< XclImpChSeries > XclImpChSeriesRef;
diff --git a/sc/source/filter/inc/xlchart.hxx b/sc/source/filter/inc/xlchart.hxx
index e149794..8ba2219 100644
--- a/sc/source/filter/inc/xlchart.hxx
+++ b/sc/source/filter/inc/xlchart.hxx
@@ -89,6 +89,7 @@ class XclRoot;
#define EXC_CHPROP_LABELPLACEMENT           "LabelPlacement"
#define EXC_CHPROP_LABELPOSITION            "LabelPosition"
#define EXC_CHPROP_LABELSEPARATOR           "LabelSeparator"
#define EXC_CHPROP_SHOWLEGENDENTRY          "ShowLegendEntry"
#define EXC_CHPROP_MAJORTICKS               "MajorTickmarks"
#define EXC_CHPROP_MARKPOSITION             "MarkPosition"
#define EXC_CHPROP_MINORTICKS               "MinorTickmarks"
@@ -583,6 +584,13 @@ const sal_uInt16 EXC_CHAXESSET_PRIMARY          = 0;
const sal_uInt16 EXC_CHAXESSET_SECONDARY        = 1;
const sal_uInt16 EXC_CHAXESSET_NONE             = 0xFFFF;   /// For internal use.

// (0x1043) LEGENDEXCEPTION

const sal_uInt16 EXC_ID_CHLEGENDEXCEPTION       = 0x1043;

const sal_uInt16 EXC_CHLEGENDEXCEPTION_DELETED  = 0x0001;
const sal_uInt16 EXC_CHLEGENDEXCEPTION_LABEL    = 0x0002;

// (0x1044) CHPROPERTIES ------------------------------------------------------

const sal_uInt16 EXC_ID_CHPROPERTIES            = 0x1044;