[Libreoffice-commits] core.git: 3 commits - chart2/inc chart2/Library_chartcontroller.mk chart2/source include/oox include/xmloff oox/source xmloff/source

Kohei Yoshida kohei.yoshida at collabora.com
Sat Jul 26 13:24:15 PDT 2014


 chart2/Library_chartcontroller.mk                                   |    1 
 chart2/inc/unonames.hxx                                             |    7 
 chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx |   35 
 chart2/source/controller/dialogs/dlg_ObjectProperties.cxx           |    1 
 chart2/source/controller/inc/TextLabelItemConverter.hxx             |   73 +
 chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx           |   16 
 chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx  |  615 ++++++++++
 chart2/source/controller/main/ChartController_Properties.cxx        |   32 
 chart2/source/model/main/DataPointProperties.cxx                    |   93 +
 chart2/source/model/main/DataPointProperties.hxx                    |   14 
 chart2/source/view/inc/PropertyMapper.hxx                           |    1 
 chart2/source/view/main/PropertyMapper.cxx                          |   21 
 include/oox/export/chartexport.hxx                                  |    4 
 include/oox/export/utils.hxx                                        |    1 
 include/xmloff/xmltoken.hxx                                         |    4 
 oox/source/drawingml/chart/seriesconverter.cxx                      |   28 
 oox/source/export/chartexport.cxx                                   |  219 +--
 oox/source/token/properties.txt                                     |    3 
 xmloff/source/chart/PropertyMap.hxx                                 |    7 
 xmloff/source/chart/PropertyMaps.cxx                                |   21 
 xmloff/source/core/xmltoken.cxx                                     |    4 
 21 files changed, 1029 insertions(+), 171 deletions(-)

New commits:
commit 6c2c974dd3f0b21a23bc3bc5560487d28bbe0fad
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Sat Jul 26 14:44:38 2014 -0400

    bnc#885825: Handle ODF import and export of data label border properties.
    
    Change-Id: Ic8c7bc873768008537cd52a3fd4b11031b403139

diff --git a/chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx b/chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx
index e69042b..a897eb7 100644
--- a/chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx
+++ b/chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx
@@ -80,7 +80,11 @@ enum
     PROP_SERIES_DATAPOINT_LABEL_PLACEMENT,
     //other series properties
     PROP_SERIES_ATTACHED_AXIS,
-    PROP_SERIES_DATAPOINT_TEXT_ROTATION
+    PROP_SERIES_DATAPOINT_TEXT_ROTATION,
+    PROP_SERIES_DATAPOINT_LABEL_BORDER_STYLE,
+    PROP_SERIES_DATAPOINT_LABEL_BORDER_WIDTH,
+    PROP_SERIES_DATAPOINT_LABEL_BORDER_COLOR,
+    PROP_SERIES_DATAPOINT_LABEL_BORDER_TRANS
 };
 
 void lcl_AddPropertiesToVector_PointProperties(
@@ -142,6 +146,35 @@ void lcl_AddPropertiesToVector_PointProperties(
                   cppu::UnoType<sal_Int32>::get(),
                   beans::PropertyAttribute::BOUND
                   | beans::PropertyAttribute::MAYBEDEFAULT ));
+
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_STYLE,
+                  PROP_SERIES_DATAPOINT_LABEL_BORDER_STYLE,
+                  cppu::UnoType<drawing::LineStyle>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
+
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_WIDTH,
+                  PROP_SERIES_DATAPOINT_LABEL_BORDER_WIDTH,
+                  cppu::UnoType<sal_Int32>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
+
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_COLOR,
+                  PROP_SERIES_DATAPOINT_LABEL_BORDER_COLOR,
+                  cppu::UnoType<sal_Int32>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEVOID         // "maybe auto"
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
+
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_TRANS,
+                  PROP_SERIES_DATAPOINT_LABEL_BORDER_TRANS,
+                  cppu::UnoType<sal_Int16>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
 }
 
 void lcl_AddPropertiesToVector_SeriesOnly(
diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index 9e206d8..e03dcfd 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -1067,6 +1067,10 @@ namespace xmloff { namespace token {
         XML_LABEL_RANGE,
         XML_LABEL_RANGES,
         XML_LABEL_STRING,
+        XML_LABEL_STROKE,
+        XML_LABEL_STROKE_COLOR,
+        XML_LABEL_STROKE_OPACITY,
+        XML_LABEL_STROKE_WIDTH,
         XML_LAMBDA,
         XML_LANDSCAPE,
         XML_LANGUAGE,
diff --git a/xmloff/source/chart/PropertyMap.hxx b/xmloff/source/chart/PropertyMap.hxx
index c6b63e5..a876c2b 100644
--- a/xmloff/source/chart/PropertyMap.hxx
+++ b/xmloff/source/chart/PropertyMap.hxx
@@ -53,6 +53,8 @@
 #define XML_SCH_TYPE_AXIS_POSITION_VALUE    ( XML_SCH_TYPES_START + 14 )
 #define XML_SCH_TYPE_AXIS_LABEL_POSITION    ( XML_SCH_TYPES_START + 15 )
 #define XML_SCH_TYPE_TICK_MARK_POSITION     ( XML_SCH_TYPES_START + 16 )
+#define XML_SCH_TYPE_LABEL_BORDER_STYLE     ( XML_SCH_TYPES_START + 17 )
+#define XML_SCH_TYPE_LABEL_BORDER_OPACITY   ( XML_SCH_TYPES_START + 18 )
 
 // context ids
 #define XML_SCH_CONTEXT_USER_SYMBOL                 ( XML_SCH_CTF_START + 0 )
@@ -146,6 +148,11 @@ const XMLPropertyMapEntry aXMLChartPropMap[] =
     // OpenGL 3D chart flags
     MAP_ENTRY_ODF_EXT( "RoundedEdge", LO_EXT, XML_ROUNDED_EDGE, XML_TYPE_BOOL),
 
+    MAP_ENTRY_ODF_EXT( "LabelBorderColor", LO_EXT, XML_LABEL_STROKE_COLOR, XML_TYPE_COLOR ),
+    MAP_ENTRY_ODF_EXT( "LabelBorderStyle", LO_EXT, XML_LABEL_STROKE, XML_SCH_TYPE_LABEL_BORDER_STYLE ),
+    MAP_ENTRY_ODF_EXT( "LabelBorderTransparency", LO_EXT, XML_LABEL_STROKE_OPACITY, XML_SCH_TYPE_LABEL_BORDER_OPACITY ),
+    MAP_ENTRY_ODF_EXT( "LabelBorderWidth", LO_EXT, XML_LABEL_STROKE_WIDTH, XML_TYPE_MEASURE ),
+
     MAP_ENTRY( "ScaleText", CHART, XML_SCALE_TEXT, XML_TYPE_BOOL ),
 
     // spline settings
diff --git a/xmloff/source/chart/PropertyMaps.cxx b/xmloff/source/chart/PropertyMaps.cxx
index cedcc8d..aea50b0 100644
--- a/xmloff/source/chart/PropertyMaps.cxx
+++ b/xmloff/source/chart/PropertyMaps.cxx
@@ -34,6 +34,7 @@
 #include "XMLTextOrientationHdl.hxx"
 #include "XMLSymbolTypePropertyHdl.hxx"
 #include "XMLAxisPositionPropertyHdl.hxx"
+#include "../draw/propimp0.hxx"
 
 #include <xmloff/EnumPropertyHdl.hxx>
 #include <xmloff/XMLConstantsPropertyHandler.hxx>
@@ -66,6 +67,18 @@
 using namespace com::sun::star;
 using namespace ::xmloff::token;
 
+namespace {
+
+SvXMLEnumMapEntry const aLineStyleMap[] =
+{
+    { XML_NONE,     drawing::LineStyle_NONE },
+    { XML_SOLID,    drawing::LineStyle_SOLID },
+    { XML_DASH,     drawing::LineStyle_DASH },
+    { XML_TOKEN_INVALID, 0 }
+};
+
+}
+
 // the following class implementations are in this file:
 
 // * XMLChartPropHdlFactory
@@ -154,6 +167,14 @@ const XMLPropertyHandler* XMLChartPropHdlFactory::GetPropertyHandler( sal_Int32
                 pHdl = new XMLEnumPropertyHdl( aXMLChartMissingValueTreatmentEnumMap,
                                                ::cppu::UnoType<sal_Int32>::get() );
                 break;
+            case XML_SCH_TYPE_LABEL_BORDER_STYLE:
+                pHdl = new XMLEnumPropertyHdl(aLineStyleMap, cppu::UnoType<drawing::LineStyle>::get());
+            break;
+            case XML_SCH_TYPE_LABEL_BORDER_OPACITY:
+                pHdl = new XMLOpacityPropertyHdl(NULL);
+            break;
+            default:
+                ;
         }
         if( pHdl )
             PutHdlCache( nType, pHdl );
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index 09027cd..6c4c098 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -1072,6 +1072,10 @@ namespace xmloff { namespace token {
         TOKEN( "label-range",                     XML_LABEL_RANGE ),
         TOKEN( "label-ranges",                    XML_LABEL_RANGES ),
         TOKEN( "label-string",                    XML_LABEL_STRING ),
+        TOKEN( "label-stroke",                    XML_LABEL_STROKE ),
+        TOKEN( "label-stroke-color",              XML_LABEL_STROKE_COLOR ),
+        TOKEN( "label-stroke-opacity",            XML_LABEL_STROKE_OPACITY ),
+        TOKEN( "label-stroke-width",              XML_LABEL_STROKE_WIDTH ),
         TOKEN( "lambda",                          XML_LAMBDA ),
         TOKEN( "landscape",                       XML_LANDSCAPE ),
         TOKEN( "language",                        XML_LANGUAGE ),
commit 48f31a924280a418046f0c816f8a7d20b672dac6
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Wed Jul 23 15:49:11 2014 -0400

    bnc#885825: OOXML import and export of data label borders.

diff --git a/include/oox/export/chartexport.hxx b/include/oox/export/chartexport.hxx
index 4252135..8d570ec 100644
--- a/include/oox/export/chartexport.hxx
+++ b/include/oox/export/chartexport.hxx
@@ -157,9 +157,7 @@ private:
     void exportDataPoints(
         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xSeriesProperties,
         sal_Int32 nSeriesLength );
-    void exportDataLabels(
-        const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xSeriesProperties,
-        sal_Int32 nSeriesLength );
+    void exportDataLabels( const css::uno::Reference<css::chart2::XDataSeries>& xSeries, sal_Int32 nSeriesLength );
     void exportGrouping( bool isBar = false );
     void exportTrendlines( ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > xSeries );
     void exportMarker( ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > xSeries );
diff --git a/include/oox/export/utils.hxx b/include/oox/export/utils.hxx
index b6bafdd..2c4fcec 100644
--- a/include/oox/export/utils.hxx
+++ b/include/oox/export/utils.hxx
@@ -23,6 +23,7 @@
 #define I32S(x) OString::number( (sal_Int32) x ).getStr()
 #define I64S(x) OString::number( (sal_Int64) x ).getStr()
 #define IS(x) OString::number( x ).getStr()
+#define BS(x) (x ? "1":"0")
 #define USS(x) OUStringToOString( x, RTL_TEXTENCODING_UTF8 ).getStr()
 
 #ifndef DBG
diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx
index 2389967..5326ff4 100644
--- a/oox/source/drawingml/chart/seriesconverter.cxx
+++ b/oox/source/drawingml/chart/seriesconverter.cxx
@@ -34,11 +34,13 @@
 #include "drawingml/chart/typegroupconverter.hxx"
 #include "drawingml/chart/typegroupmodel.hxx"
 #include "oox/helper/containerhelper.hxx"
+#include <oox/drawingml/lineproperties.hxx>
 
 namespace oox {
 namespace drawingml {
 namespace chart {
 
+using namespace com::sun::star;
 using namespace ::com::sun::star::beans;
 using namespace ::com::sun::star::chart2;
 using namespace ::com::sun::star::chart2::data;
@@ -162,6 +164,20 @@ void lclConvertLabelFormatting( PropertySet& rPropSet, ObjectFormatter& rFormatt
     }
 }
 
+void importBorderProperties( PropertySet& rPropSet, Shape& rShape, const GraphicHelper& rGraphicHelper )
+{
+    LineProperties& rLP = rShape.getLineProperties();
+    if (rLP.moLineWidth.has())
+    {
+        sal_Int32 nWidth = convertEmuToHmm(rLP.moLineWidth.get());
+        rPropSet.setProperty(PROP_LabelBorderWidth, uno::makeAny(nWidth));
+        rPropSet.setProperty(PROP_LabelBorderStyle, uno::makeAny(drawing::LineStyle_SOLID));
+    }
+    const Color& aColor = rLP.maLineFill.maFillColor;
+    sal_Int32 nColor = aColor.getColor(rGraphicHelper);
+    rPropSet.setProperty(PROP_LabelBorderColor, uno::makeAny(nColor));
+}
+
 } // namespace
 
 DataLabelConverter::DataLabelConverter( const ConverterRoot& rParent, DataLabelModel& rModel ) :
@@ -175,7 +191,10 @@ DataLabelConverter::~DataLabelConverter()
 
 void DataLabelConverter::convertFromModel( const Reference< XDataSeries >& rxDataSeries, const TypeGroupConverter& rTypeGroup )
 {
-    if( rxDataSeries.is() ) try
+    if (!rxDataSeries.is())
+        return;
+
+    try
     {
         PropertySet aPropSet( rxDataSeries->getDataPointByIndex( mrModel.mnIndex ) );
         lclConvertLabelFormatting( aPropSet, getFormatter(), mrModel, rTypeGroup, false );
@@ -201,6 +220,9 @@ void DataLabelConverter::convertFromModel( const Reference< XDataSeries >& rxDat
             aPropSet.setProperty( PROP_LabelPlacement,
                                   aPositionsLookupTable[ simplifiedX+1 + 3*(simplifiedY+1) ] );
         }
+
+        if (mrModel.mxShapeProp)
+            importBorderProperties(aPropSet, *mrModel.mxShapeProp, getFilter().getGraphicHelper());
     }
     catch( Exception& )
     {
@@ -222,6 +244,10 @@ void DataLabelsConverter::convertFromModel( const Reference< XDataSeries >& rxDa
     {
         PropertySet aPropSet( rxDataSeries );
         lclConvertLabelFormatting( aPropSet, getFormatter(), mrModel, rTypeGroup, true );
+
+        if (mrModel.mxShapeProp)
+            // Import baseline border properties for these data labels.
+            importBorderProperties(aPropSet, *mrModel.mxShapeProp, getFilter().getGraphicHelper());
     }
 
     // data point label settings
diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index c12a961..2d4555f 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -1760,8 +1760,8 @@ void ChartExport::exportSeries( Reference< chart2::XChartType > xChartType, sal_
                     // export data labels
                     // Excel does not like our current data label export
                     // for scatter charts
-                    if( eChartType != chart::TYPEID_SCATTER && eChartType != chart::TYPEID_BAR )
-                        exportDataLabels( uno::Reference< beans::XPropertySet >( aSeriesSeq[nSeriesIdx], uno::UNO_QUERY ), nSeriesLength );
+                    if( eChartType != chart::TYPEID_SCATTER )
+                        exportDataLabels(aSeriesSeq[nSeriesIdx], nSeriesLength);
 
                     exportTrendlines( aSeriesSeq[nSeriesIdx] );
 
@@ -2533,152 +2533,103 @@ void ChartExport::_exportAxis(
     pFS->endElement( FSNS( XML_c, nAxisType ) );
 }
 
-void ChartExport::exportDataLabels(
-    const uno::Reference< beans::XPropertySet > & xSeriesProperties,
-    sal_Int32 nSeriesLength )
+namespace {
+
+const char* toOOXMLPlacement( sal_Int32 nPlacement )
 {
-    // TODO: export field separators, missing flag vs. showing series name or not
-    uno::Reference< chart2::XDataSeries > xSeries( xSeriesProperties, uno::UNO_QUERY );
+    switch (nPlacement)
+    {
+        case css::chart::DataLabelPlacement::OUTSIDE:       return "outEnd";
+        case css::chart::DataLabelPlacement::INSIDE:        return "inEnd";
+        case css::chart::DataLabelPlacement::CENTER:        return "ctr";
+        case css::chart::DataLabelPlacement::NEAR_ORIGIN:   return "inBase";
+        case css::chart::DataLabelPlacement::TOP:           return "t";
+        case css::chart::DataLabelPlacement::BOTTOM:        return "b";
+        case css::chart::DataLabelPlacement::LEFT:          return "l";
+        case css::chart::DataLabelPlacement::RIGHT:         return "r";
+        case css::chart::DataLabelPlacement::AVOID_OVERLAP: return "bestFit";
+        default:
+            ;
+    }
 
-    if( xSeriesProperties.is())
+    return "outEnd";
+}
+
+void writeLabelProperties( FSHelperPtr pFS, const uno::Reference<beans::XPropertySet>& xPropSet )
+{
+    if (!xPropSet.is())
+        return;
+
+    chart2::DataPointLabel aLabel;
+    sal_Int32 nLabelPlacement = css::chart::DataLabelPlacement::OUTSIDE;
+    sal_Int32 nLabelBorderWidth = 0;
+    sal_Int32 nLabelBorderColor = 0x00FFFFFF;
+
+    xPropSet->getPropertyValue("Label") >>= aLabel;
+    xPropSet->getPropertyValue("LabelPlacement") >>= nLabelPlacement;
+    xPropSet->getPropertyValue("LabelBorderWidth") >>= nLabelBorderWidth;
+    xPropSet->getPropertyValue("LabelBorderColor") >>= nLabelBorderColor;
+
+    if (nLabelBorderWidth > 0)
     {
-        FSHelperPtr pFS = GetFS();
-        pFS->startElement( FSNS( XML_c, XML_dLbls ),
-                    FSEND );
+        pFS->startElement(FSNS(XML_c, XML_spPr), FSEND);
+        pFS->startElement(FSNS(XML_a, XML_ln), XML_w, IS(convertHmmToEmu(nLabelBorderWidth)), FSEND);
+        pFS->startElement(FSNS(XML_a, XML_solidFill), FSEND);
 
-        bool showLegendSymbol = false;
-        bool showNumber = false;
-        bool showCategoryName = false;
-        bool showNumberInPercent = false;
+        OString aStr = OString::number(nLabelBorderColor, 16).toAsciiUpperCase();
+        pFS->singleElement(FSNS(XML_a, XML_srgbClr), XML_val, aStr.getStr(), FSEND);
 
-        sal_Int32 nElem = 0;
+        pFS->endElement(FSNS(XML_a, XML_solidFill));
+        pFS->endElement(FSNS(XML_a, XML_ln));
+        pFS->endElement(FSNS(XML_c, XML_spPr));
+    }
 
-        uno::Reference< beans::XPropertySet > xPropSet;
-        if(nSeriesLength != 0)
-        {
-           try
-           {
-               xPropSet = SchXMLSeriesHelper::createOldAPIDataPointPropertySet(
-                          xSeries, nElem, getModel() );
-           }
-           catch( const uno::Exception & rEx )
-           {
-                SAL_WARN("oox", "Exception caught during Export of data label: " << rEx.Message );
-           }
-        }
+    pFS->singleElement(FSNS(XML_c, XML_dLblPos), XML_val, toOOXMLPlacement(nLabelPlacement), FSEND);
+    pFS->singleElement(FSNS(XML_c, XML_showLegendKey), XML_val, BS(aLabel.ShowLegendSymbol), FSEND);
+    pFS->singleElement(FSNS(XML_c, XML_showVal), XML_val, BS(aLabel.ShowNumber), FSEND);
+    pFS->singleElement(FSNS(XML_c, XML_showCatName), XML_val, BS(aLabel.ShowCategoryName), FSEND);
+    pFS->singleElement(FSNS(XML_c, XML_showSerName), XML_val, BS(false), FSEND);
+    pFS->singleElement(FSNS(XML_c, XML_showPercent), XML_val, BS(aLabel.ShowNumberInPercent), FSEND);
+}
 
-        namespace cssc2 = ::com::sun::star::chart2;
-        cssc2::DataPointLabel aTempLabel;
-        if( xPropSet.is() )
-        {
-            if (GetProperty( xPropSet, "Label"))
-               mAny >>= aTempLabel;
-        }
+}
 
-        for( nElem = 1; nElem < nSeriesLength; ++nElem)
-        {
-            try
-            {
-                xPropSet = SchXMLSeriesHelper::createOldAPIDataPointPropertySet(
-                           xSeries, nElem, getModel() );
-            }
-            catch( const uno::Exception & rEx )
-            {
-                SAL_WARN("oox", "Exception caught during Export of data label: " << rEx.Message );
-            }
+void ChartExport::exportDataLabels( const uno::Reference<chart2::XDataSeries> & xSeries,
+    sal_Int32 nSeriesLength )
+{
+    if (!xSeries.is() || nSeriesLength <= 0)
+        return;
 
-            if( xPropSet.is() )
-            {
-               namespace cssc2 = ::com::sun::star::chart2;
-               cssc2::DataPointLabel aLabel;
-               if (GetProperty( xPropSet, "Label"))
-               {
-                   mAny >>= aLabel;
-
-                   namespace csscd = ::com::sun::star::chart::DataLabelPlacement;
-                   sal_Int32 nPlacement(csscd::AVOID_OVERLAP);
-                   const char *aPlacement = NULL;
-                   OUString aSep;
-
-                   if (GetProperty( xPropSet, "LabelPlacement"))
-                       mAny >>= nPlacement;
-
-                   switch( nPlacement )
-                   {
-                       case csscd::OUTSIDE:       aPlacement = "outEnd";  break;
-                       case csscd::INSIDE:        aPlacement = "inEnd";   break;
-                       case csscd::CENTER:        aPlacement = "ctr";     break;
-                       case csscd::NEAR_ORIGIN:   aPlacement = "inBase";  break;
-                       case csscd::TOP:           aPlacement = "t";       break;
-                       case csscd::BOTTOM:        aPlacement = "b";       break;
-                       case csscd::LEFT:          aPlacement = "l";       break;
-                       case csscd::RIGHT:         aPlacement = "r";       break;
-                       case csscd::AVOID_OVERLAP: aPlacement = "bestFit";  break;
-                   }
-
-                   if (aLabel.ShowLegendSymbol)
-                       showLegendSymbol = true;
-                   if(aLabel.ShowNumber)
-                       showNumber = true;
-                   if(aLabel.ShowCategoryName)
-                       showCategoryName =  true;
-                   if(aLabel.ShowNumberInPercent)
-                       showNumberInPercent = true;
-
-              if(aTempLabel.ShowLegendSymbol != aLabel.ShowLegendSymbol || aTempLabel.ShowNumber!= aLabel.ShowNumber ||
-                       aTempLabel.ShowCategoryName != aLabel.ShowCategoryName || aTempLabel.ShowNumberInPercent != aLabel.ShowNumberInPercent)
-                {
-                       pFS->startElement( FSNS( XML_c, XML_dLbl ), FSEND);
-                       pFS->singleElement( FSNS( XML_c, XML_idx), XML_val, I32S(nElem), FSEND);
-                       pFS->singleElement( FSNS( XML_c, XML_dLblPos), XML_val, aPlacement, FSEND);
-
-                       if(aTempLabel.ShowLegendSymbol != aLabel.ShowLegendSymbol)
-                       {
-                           pFS->singleElement( FSNS( XML_c, XML_showLegendKey), XML_val, aLabel.ShowLegendSymbol ? "1": "0", FSEND);
-                       }
-
-                       if (aTempLabel.ShowNumber!= aLabel.ShowNumber)
-                       {
-                           pFS->singleElement( FSNS( XML_c, XML_showVal), XML_val,aLabel.ShowNumber ? "1": "0", FSEND);
-                       }
-
-                       if(aTempLabel.ShowCategoryName != aLabel.ShowCategoryName)
-                       {
-                           pFS->singleElement( FSNS( XML_c, XML_showCatName), XML_val, aLabel.ShowCategoryName ? "1": "0", FSEND);
-                       }
-                       // MSO somehow assumes series name to be on (=displayed) by default.
-                       // Let's put false here and switch it off then, since we have no UI means
-                       // in LibO to toggle it on anyway
-                       pFS->singleElement( FSNS( XML_c, XML_showSerName), XML_val, "0", FSEND);
-
-                       if(aTempLabel.ShowNumberInPercent != aLabel.ShowNumberInPercent)
-                       {
-                           pFS->singleElement( FSNS( XML_c, XML_showPercent), XML_val,aLabel.ShowNumberInPercent ? "1": "0", FSEND);
-                       }
-
-                       if (GetProperty( xPropSet, "LabelSeparator"))
-                       {
-                           mAny >>= aSep;
-                           pFS->startElement( FSNS( XML_c, XML_separator), FSEND);
-                           pFS->writeEscaped(aSep);
-                           pFS->endElement( FSNS( XML_c, XML_separator) );
-                       }
-                       pFS->endElement( FSNS( XML_c, XML_dLbl ));
-                }
-                }
-            }
-        }
+    uno::Reference<beans::XPropertySet> xPropSet(xSeries, uno::UNO_QUERY);
+    if (!xPropSet.is())
+        return;
 
-        pFS->singleElement( FSNS( XML_c, XML_showLegendKey), XML_val, showLegendSymbol ? "1": "0", FSEND);
-        pFS->singleElement( FSNS( XML_c, XML_showVal), XML_val, showNumber ? "1": "0", FSEND);
-        pFS->singleElement( FSNS( XML_c, XML_showCatName), XML_val, showCategoryName ? "1": "0", FSEND);
+    FSHelperPtr pFS = GetFS();
+    pFS->startElement(FSNS(XML_c, XML_dLbls), FSEND);
 
-        pFS->singleElement( FSNS( XML_c, XML_showSerName), XML_val, "0", FSEND);
+    uno::Sequence<sal_Int32> aAttrLabelIndices;
+    xPropSet->getPropertyValue("AttributedDataPoints") >>= aAttrLabelIndices;
 
-        pFS->singleElement( FSNS( XML_c, XML_showPercent), XML_val, showNumberInPercent ? "1": "0", FSEND);
+    const sal_Int32* p = aAttrLabelIndices.getConstArray();
+    const sal_Int32* pEnd = p + aAttrLabelIndices.getLength();
+    for (; p != pEnd; ++p)
+    {
+        sal_Int32 nIdx = *p;
+        uno::Reference<beans::XPropertySet> xLabelPropSet = xSeries->getDataPointByIndex(nIdx);
+        if (!xLabelPropSet.is())
+            continue;
 
-        pFS->endElement( FSNS( XML_c, XML_dLbls ) );
+        // Individual label property thhat overwrites the baseline.
+        pFS->startElement(FSNS(XML_c, XML_dLbl), FSEND);
+        pFS->singleElement(FSNS(XML_c, XML_idx), XML_val, I32S(nIdx), FSEND);
+        writeLabelProperties(pFS, xLabelPropSet);
+        pFS->endElement(FSNS(XML_c, XML_dLbl));
     }
+
+    // Baseline label properties for all labels.
+    writeLabelProperties(pFS, xPropSet);
+
+    pFS->endElement(FSNS(XML_c, XML_dLbls));
 }
 
 void ChartExport::exportDataPoints(
diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt
index 4735ccf..90b8418 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -273,6 +273,9 @@ IterationCount
 IterationEpsilon
 Japanese
 Label
+LabelBorderColor
+LabelBorderStyle
+LabelBorderWidth
 LabelPlacement
 LabelPosition
 LabelSeparator
commit f1531cdaaebe706d909dc6ddde439ccb5f4ad36d
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Wed Jul 23 15:49:11 2014 -0400

    bnc#885825: Support borders around data labels.
    
    Change-Id: Ib141413e523cbf73746876f727e9f80dda9f5f7c

diff --git a/chart2/Library_chartcontroller.mk b/chart2/Library_chartcontroller.mk
index b7e86bf..f77ef70 100644
--- a/chart2/Library_chartcontroller.mk
+++ b/chart2/Library_chartcontroller.mk
@@ -154,6 +154,7 @@ $(eval $(call gb_Library_add_exception_objects,chartcontroller,\
     chart2/source/controller/itemsetwrapper/RegressionEquationItemConverter \
     chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter \
     chart2/source/controller/itemsetwrapper/StatisticsItemConverter \
+    chart2/source/controller/itemsetwrapper/TextLabelItemConverter \
     chart2/source/controller/itemsetwrapper/TitleItemConverter \
     chart2/source/controller/main/ChartController \
     chart2/source/controller/main/ChartController_EditData \
diff --git a/chart2/inc/unonames.hxx b/chart2/inc/unonames.hxx
index 0731ab6..867a155 100644
--- a/chart2/inc/unonames.hxx
+++ b/chart2/inc/unonames.hxx
@@ -22,6 +22,13 @@
 #define CHART_UNONAME_ERRORBAR_X            "ErrorBarX"
 #define CHART_UNONAME_ERRORBAR_Y            "ErrorBarY"
 #define CHART_UNONAME_LABEL                 "Label"
+#define CHART_UNONAME_LABEL_SEP             "LabelSeparator"
+#define CHART_UNONAME_LABEL_BORDER_STYLE    "LabelBorderStyle"
+#define CHART_UNONAME_LABEL_BORDER_WIDTH    "LabelBorderWidth"
+#define CHART_UNONAME_LABEL_BORDER_COLOR    "LabelBorderColor"
+#define CHART_UNONAME_LABEL_BORDER_DASH     "LabelBorderDash"
+#define CHART_UNONAME_LABEL_BORDER_DASHNAME "LabelBorderDashName"
+#define CHART_UNONAME_LABEL_BORDER_TRANS    "LabelBorderTransparency"
 
 #endif
 
diff --git a/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx b/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx
index f5baf35..4f6a017 100644
--- a/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx
+++ b/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx
@@ -388,6 +388,7 @@ SchAttribTabDlg::SchAttribTabDlg(Window* pParent,
 
         case OBJECTTYPE_DATA_LABEL:
         case OBJECTTYPE_DATA_LABELS:
+            AddTabPage(RID_SVXPAGE_LINE, SCH_RESSTR(STR_PAGE_BORDER));
             AddTabPage(TP_DATA_DESCR, SCH_RESSTR(STR_OBJECT_DATALABELS), DataLabelsTabPage::Create, NULL);
             AddTabPage(RID_SVXPAGE_CHAR_NAME, SCH_RESSTR(STR_PAGE_FONT));
             AddTabPage(RID_SVXPAGE_CHAR_EFFECTS, SCH_RESSTR(STR_PAGE_FONT_EFFECTS));
diff --git a/chart2/source/controller/inc/TextLabelItemConverter.hxx b/chart2/source/controller/inc/TextLabelItemConverter.hxx
new file mode 100644
index 0000000..70e17a3
--- /dev/null
+++ b/chart2/source/controller/inc/TextLabelItemConverter.hxx
@@ -0,0 +1,73 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#ifndef INCLUDED_CHART2_SOURCE_CONTROLLER_INC_TEXTLABELITEMCONVERTER_HXX
+#define INCLUDED_CHART2_SOURCE_CONTROLLER_INC_TEXTLABELITEMCONVERTER_HXX
+
+#include <ItemConverter.hxx>
+
+#include <com/sun/star/chart2/XDataSeries.hpp>
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+
+#include <vector>
+
+namespace chart { namespace wrapper {
+
+class TextLabelItemConverter : public ItemConverter
+{
+public:
+    TextLabelItemConverter(
+        const css::uno::Reference<css::frame::XModel>& xChartModel,
+        const css::uno::Reference<css::beans::XPropertySet>& rPropertySet,
+        const css::uno::Reference<css::chart2::XDataSeries>& xSeries,
+        SfxItemPool& rItemPool,
+        const css::awt::Size* pRefSize = NULL,
+        bool bDataSeries = false,
+        sal_Int32 nNumberFormat = 0,
+        sal_Int32 nPercentNumberFormat = 0 );
+
+    virtual ~TextLabelItemConverter();
+
+    virtual void FillItemSet( SfxItemSet & rOutItemSet ) const SAL_OVERRIDE;
+    virtual bool ApplyItemSet( const SfxItemSet & rItemSet ) SAL_OVERRIDE;
+
+protected:
+    virtual const sal_uInt16* GetWhichPairs() const SAL_OVERRIDE;
+    virtual bool GetItemProperty( tWhichIdType nWhichId, tPropertyNameWithMemberId & rOutProperty ) const SAL_OVERRIDE;
+
+    virtual void FillSpecialItem( sal_uInt16 nWhichId, SfxItemSet & rOutItemSet ) const
+        throw (css::uno::Exception) SAL_OVERRIDE;
+    virtual bool ApplySpecialItem( sal_uInt16 nWhichId, const SfxItemSet & rItemSet )
+        throw (css::uno::Exception) SAL_OVERRIDE;
+
+private:
+    std::vector<ItemConverter*> maConverters;
+    sal_Int32                           mnNumberFormat;
+    sal_Int32                           mnPercentNumberFormat;
+    css::uno::Sequence<sal_Int32>       maAvailableLabelPlacements;
+
+    bool mbDataSeries:1;
+    bool mbForbidPercentValue:1;
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx b/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
index 891fd75..2fdc76e 100644
--- a/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
+++ b/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
@@ -109,6 +109,22 @@ const sal_uInt16 nDataPointWhichPairs[] =
     0
 };
 
+const sal_uInt16 nTextLabelWhichPairs[] =
+{
+    XATTR_LINESTYLE, XATTR_LINECOLOR,
+    XATTR_LINETRANSPARENCE, XATTR_LINETRANSPARENCE,
+    EE_ITEMS_START, EE_ITEMS_END,
+    SID_CHAR_DLG_PREVIEW_STRING, SID_CHAR_DLG_PREVIEW_STRING,
+    SCHATTR_DATADESCR_START, SCHATTR_DATADESCR_END,
+    SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_INFO,
+    SID_ATTR_NUMBERFORMAT_SOURCE, SID_ATTR_NUMBERFORMAT_SOURCE,
+    SCHATTR_TEXT_DEGREES, SCHATTR_TEXT_DEGREES,
+    SCHATTR_STYLE_SYMBOL, SCHATTR_STYLE_SYMBOL,
+    SCHATTR_SYMBOL_BRUSH, SCHATTR_SYMBOL_BRUSH,
+    SCHATTR_SYMBOL_SIZE, SCHATTR_SYMBOL_SIZE,
+    0
+};
+
 #define CHART_SERIES_OPTIONS_WHICHPAIRS \
     SCHATTR_AXIS,SCHATTR_AXIS,                      /*    69          sch/schattr.hxx*/ \
     SCHATTR_BAR_OVERLAP,SCHATTR_BAR_CONNECT,         /*    98 - 100 (incl. SCHATTR_GAPWIDTH) */  \
diff --git a/chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx b/chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx
new file mode 100644
index 0000000..c182475
--- /dev/null
+++ b/chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx
@@ -0,0 +1,615 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <TextLabelItemConverter.hxx>
+#include <CharacterPropertyItemConverter.hxx>
+#include <ChartModelHelper.hxx>
+#include <ChartTypeHelper.hxx>
+#include <DataSeriesHelper.hxx>
+#include <DiagramHelper.hxx>
+#include <ItemPropertyMap.hxx>
+#include <SchWhichPairs.hxx>
+#include <macros.hxx>
+#include <unonames.hxx>
+
+#include <editeng/brushitem.hxx>
+#include <editeng/sizeitem.hxx>
+#include <svl/ilstitem.hxx>
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <svx/tabline.hxx>
+
+#include <com/sun/star/chart2/DataPointLabel.hpp>
+#include <com/sun/star/chart2/Symbol.hpp>
+
+using namespace com::sun::star;
+using namespace com::sun::star::chart2;
+using com::sun::star::uno::Reference;
+
+namespace chart { namespace wrapper {
+
+namespace {
+
+const ItemPropertyMapType& getTextLabelPropertyMap()
+{
+    static ItemPropertyMapType aMap(
+        MakeItemPropertyMap
+        IPM_MAP_ENTRY(XATTR_LINESTYLE, CHART_UNONAME_LABEL_BORDER_STYLE, 0)
+        IPM_MAP_ENTRY(XATTR_LINEWIDTH, CHART_UNONAME_LABEL_BORDER_WIDTH, 0)
+        IPM_MAP_ENTRY(XATTR_LINEDASH,  CHART_UNONAME_LABEL_BORDER_DASH, 0)
+        IPM_MAP_ENTRY(XATTR_LINECOLOR, CHART_UNONAME_LABEL_BORDER_COLOR, 0)
+        IPM_MAP_ENTRY(XATTR_LINETRANSPARENCE, CHART_UNONAME_LABEL_BORDER_TRANS, 0)
+    );
+
+    return aMap;
+};
+
+sal_Int32 getSymbolStyleForSymbol( const chart2::Symbol& rSymbol )
+{
+    sal_Int32 nStyle = SVX_SYMBOLTYPE_UNKNOWN;
+    switch (rSymbol.Style)
+    {
+        case chart2::SymbolStyle_NONE:
+            nStyle = SVX_SYMBOLTYPE_NONE;
+        break;
+        case chart2::SymbolStyle_AUTO:
+            nStyle = SVX_SYMBOLTYPE_AUTO;
+        break;
+        case chart2::SymbolStyle_GRAPHIC:
+            nStyle = SVX_SYMBOLTYPE_BRUSHITEM;
+        break;
+        case chart2::SymbolStyle_STANDARD:
+            nStyle = rSymbol.StandardSymbol;
+        break;
+        case chart2::SymbolStyle_POLYGON:
+        default:
+            ;
+    }
+    return nStyle;
+}
+
+bool numberFormatFromItemToPropertySet(
+    sal_uInt16 nWhichId, const SfxItemSet& rItemSet, const uno::Reference<beans::XPropertySet>& xPropertySet,
+    bool bOverwriteDataPoints )
+{
+    bool bChanged = false;
+    if (!xPropertySet.is())
+        return bChanged;
+
+    OUString aPropertyName = (SID_ATTR_NUMBERFORMAT_VALUE == nWhichId) ? OUString(CHART_UNONAME_NUMFMT) : OUString("PercentageNumberFormat");
+    sal_uInt16 nSourceWhich = (SID_ATTR_NUMBERFORMAT_VALUE == nWhichId) ? SID_ATTR_NUMBERFORMAT_SOURCE : SCHATTR_PERCENT_NUMBERFORMAT_SOURCE;
+
+    if (SFX_ITEM_SET != rItemSet.GetItemState(nSourceWhich))
+        return bChanged;
+
+    uno::Any aValue;
+    bool bUseSourceFormat = (static_cast<const SfxBoolItem&>(rItemSet.Get(nSourceWhich)).GetValue());
+    if (!bUseSourceFormat)
+    {
+        SfxItemState aState = rItemSet.GetItemState(nWhichId);
+        if (aState == SFX_ITEM_SET)
+        {
+            sal_Int32 nFmt = static_cast<sal_Int32>(
+                static_cast<const SfxUInt32Item&>(
+                    rItemSet.Get(nWhichId)).GetValue());
+            aValue = uno::makeAny(nFmt);
+        }
+        else
+            return bChanged;
+    }
+
+    uno::Any aOldValue = xPropertySet->getPropertyValue(aPropertyName);
+    if (bOverwriteDataPoints)
+    {
+        Reference<chart2::XDataSeries> xSeries(xPropertySet, uno::UNO_QUERY);
+        if (aValue != aOldValue ||
+            ::chart::DataSeriesHelper::hasAttributedDataPointDifferentValue(xSeries, aPropertyName, aOldValue))
+        {
+            ::chart::DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints(xSeries, aPropertyName, aValue);
+            bChanged = true;
+        }
+    }
+    else if (aOldValue != aValue)
+    {
+        xPropertySet->setPropertyValue(aPropertyName, aValue);
+        bChanged = true;
+    }
+    return bChanged;
+}
+
+bool useSourceFormatFromItemToPropertySet(
+    sal_uInt16 nWhichId, const SfxItemSet& rItemSet, const uno::Reference<beans::XPropertySet>& xPropertySet,
+    bool bOverwriteDataPoints )
+{
+    bool bChanged = false;
+    if (!xPropertySet.is())
+        return bChanged;
+    OUString aPropertyName = (SID_ATTR_NUMBERFORMAT_SOURCE == nWhichId) ? OUString(CHART_UNONAME_NUMFMT) : OUString("PercentageNumberFormat");
+    sal_uInt16 nFormatWhich = (SID_ATTR_NUMBERFORMAT_SOURCE == nWhichId) ? SID_ATTR_NUMBERFORMAT_VALUE : SCHATTR_PERCENT_NUMBERFORMAT_VALUE;
+
+    if (SFX_ITEM_SET != rItemSet.GetItemState(nWhichId))
+        return bChanged;
+
+    uno::Any aNewValue;
+    bool bUseSourceFormat = (static_cast<const SfxBoolItem&>(
+            rItemSet.Get(nWhichId)).GetValue());
+    if (!bUseSourceFormat)
+    {
+        SfxItemState aState = rItemSet.GetItemState(nFormatWhich);
+        if (aState == SFX_ITEM_SET)
+        {
+            sal_Int32 nFormatKey = static_cast<sal_Int32>(
+                static_cast<const SfxUInt32Item&>(
+                    rItemSet.Get(nFormatWhich)).GetValue());
+            aNewValue <<= nFormatKey;
+        }
+        else
+            return bChanged;
+    }
+
+    uno::Any aOldValue(xPropertySet->getPropertyValue(aPropertyName));
+    if (bOverwriteDataPoints)
+    {
+        Reference<chart2::XDataSeries> xSeries(xPropertySet, uno::UNO_QUERY);
+        if (aNewValue != aOldValue ||
+            ::chart::DataSeriesHelper::hasAttributedDataPointDifferentValue(xSeries, aPropertyName, aOldValue))
+        {
+            ::chart::DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints(xSeries, aPropertyName, aNewValue);
+            bChanged = true;
+        }
+    }
+    else if (aOldValue != aNewValue)
+    {
+        xPropertySet->setPropertyValue(aPropertyName, aNewValue);
+        bChanged = true;
+    }
+
+    return bChanged;
+}
+
+} // anonymous namespace
+
+TextLabelItemConverter::TextLabelItemConverter(
+    const uno::Reference<frame::XModel>& xChartModel,
+    const uno::Reference<beans::XPropertySet>& rPropertySet,
+    const uno::Reference<XDataSeries>& xSeries,
+    SfxItemPool& rItemPool, const awt::Size* pRefSize,
+    bool bDataSeries, sal_Int32 nNumberFormat, sal_Int32 nPercentNumberFormat ) :
+    ItemConverter(rPropertySet, rItemPool),
+    mnNumberFormat(nNumberFormat),
+    mnPercentNumberFormat(nPercentNumberFormat),
+    mbDataSeries(bDataSeries),
+    mbForbidPercentValue(true)
+{
+    maConverters.push_back(new CharacterPropertyItemConverter(rPropertySet, rItemPool, pRefSize, "ReferencePageSize"));
+
+    uno::Reference<XDiagram> xDiagram(ChartModelHelper::findDiagram(xChartModel));
+    uno::Reference<XChartType> xChartType(DiagramHelper::getChartTypeOfSeries(xDiagram, xSeries));
+    bool bFound = false;
+    bool bAmbiguous = false;
+    bool bSwapXAndY = DiagramHelper::getVertical(xDiagram, bFound, bAmbiguous);
+    maAvailableLabelPlacements = ChartTypeHelper::getSupportedLabelPlacements(xChartType, DiagramHelper::getDimension(xDiagram), bSwapXAndY, xSeries);
+
+    mbForbidPercentValue = AxisType::CATEGORY != ChartTypeHelper::getAxisType(xChartType, 0);
+}
+
+TextLabelItemConverter::~TextLabelItemConverter()
+{
+    std::for_each(maConverters.begin(), maConverters.end(), boost::checked_deleter<ItemConverter>());
+}
+
+void TextLabelItemConverter::FillItemSet( SfxItemSet& rOutItemSet ) const
+{
+    std::for_each(maConverters.begin(), maConverters.end(),
+        FillItemSetFunc(rOutItemSet));
+
+    // own items
+    ItemConverter::FillItemSet(rOutItemSet);
+}
+
+bool TextLabelItemConverter::ApplyItemSet( const SfxItemSet& rItemSet )
+{
+    bool bResult = false;
+
+    std::for_each(maConverters.begin(), maConverters.end(),
+        ApplyItemSetFunc(rItemSet, bResult));
+
+    // own items
+    return ItemConverter::ApplyItemSet(rItemSet) || bResult;
+}
+
+const sal_uInt16* TextLabelItemConverter::GetWhichPairs() const
+{
+    // must span all used items!
+    return nTextLabelWhichPairs;
+}
+
+bool TextLabelItemConverter::GetItemProperty( tWhichIdType nWhichId, tPropertyNameWithMemberId& rOutProperty ) const
+{
+    const ItemPropertyMapType& rMap = getTextLabelPropertyMap();
+    ItemPropertyMapType::const_iterator it = rMap.find(nWhichId);
+
+    if (it == rMap.end())
+        return false;
+
+    rOutProperty = it->second;
+    return true;
+}
+
+bool TextLabelItemConverter::ApplySpecialItem( sal_uInt16 nWhichId, const SfxItemSet& rItemSet )
+    throw (uno::Exception)
+{
+    bool bChanged = false;
+
+    switch (nWhichId)
+    {
+        case SCHATTR_DATADESCR_SHOW_NUMBER:
+        case SCHATTR_DATADESCR_SHOW_PERCENTAGE:
+        case SCHATTR_DATADESCR_SHOW_CATEGORY:
+        case SCHATTR_DATADESCR_SHOW_SYMBOL:
+        {
+            const SfxBoolItem& rItem = static_cast<const SfxBoolItem&>(rItemSet.Get(nWhichId));
+
+            uno::Any aOldValue = GetPropertySet()->getPropertyValue(CHART_UNONAME_LABEL);
+            chart2::DataPointLabel aLabel;
+            if (aOldValue >>= aLabel)
+            {
+                sal_Bool& rValue = (SCHATTR_DATADESCR_SHOW_NUMBER == nWhichId) ? aLabel.ShowNumber : (
+                    (SCHATTR_DATADESCR_SHOW_PERCENTAGE == nWhichId) ? aLabel.ShowNumberInPercent : (
+                        (SCHATTR_DATADESCR_SHOW_CATEGORY == nWhichId) ? aLabel.ShowCategoryName : aLabel.ShowLegendSymbol));
+                bool bOldValue = rValue;
+                rValue = rItem.GetValue();
+                if (mbDataSeries)
+                {
+                    Reference<chart2::XDataSeries> xSeries(GetPropertySet(), uno::UNO_QUERY);
+                    if ((bOldValue ? 1 : 0) != rValue ||
+                        DataSeriesHelper::hasAttributedDataPointDifferentValue(xSeries, CHART_UNONAME_LABEL, aOldValue))
+                    {
+                        DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints(xSeries, CHART_UNONAME_LABEL, uno::makeAny(aLabel));
+                        bChanged = true;
+                    }
+                }
+                else if ((bOldValue ? 1 : 0) != rValue)
+                {
+                    GetPropertySet()->setPropertyValue(CHART_UNONAME_LABEL, uno::makeAny(aLabel));
+                    bChanged = true;
+                }
+            }
+        }
+        break;
+        case SID_ATTR_NUMBERFORMAT_VALUE:
+        case SCHATTR_PERCENT_NUMBERFORMAT_VALUE:  //fall through intended
+        {
+            bChanged = numberFormatFromItemToPropertySet(nWhichId, rItemSet, GetPropertySet(), mbDataSeries);
+        }
+        break;
+        case SID_ATTR_NUMBERFORMAT_SOURCE:
+        case SCHATTR_PERCENT_NUMBERFORMAT_SOURCE: //fall through intended
+        {
+            bChanged = useSourceFormatFromItemToPropertySet(nWhichId, rItemSet, GetPropertySet(), mbDataSeries);
+        }
+        break;
+        case SCHATTR_DATADESCR_SEPARATOR:
+        {
+            OUString aNewValue = static_cast<const SfxStringItem&>(rItemSet.Get(nWhichId)).GetValue();
+            OUString aOldValue;
+            try
+            {
+                GetPropertySet()->getPropertyValue("LabelSeparator") >>= aOldValue;
+                if (mbDataSeries)
+                {
+                    Reference<chart2::XDataSeries> xSeries(GetPropertySet(), uno::UNO_QUERY);
+                    if (!aOldValue.equals(aNewValue) ||
+                        DataSeriesHelper::hasAttributedDataPointDifferentValue(xSeries, "LabelSeparator", uno::makeAny(aOldValue)))
+                    {
+                        DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints(xSeries, "LabelSeparator", uno::makeAny(aNewValue));
+                        bChanged = true;
+                    }
+                }
+                else if (!aOldValue.equals(aNewValue))
+                {
+                    GetPropertySet()->setPropertyValue("LabelSeparator", uno::makeAny(aNewValue));
+                    bChanged = true;
+                }
+            }
+            catch (const uno::Exception& e)
+            {
+                ASSERT_EXCEPTION(e);
+            }
+        }
+        break;
+        case SCHATTR_DATADESCR_PLACEMENT:
+        {
+            try
+            {
+                sal_Int32 nNew = static_cast<const SfxInt32Item&>(rItemSet.Get(nWhichId)).GetValue();
+                sal_Int32 nOld = 0;
+                if (!(GetPropertySet()->getPropertyValue("LabelPlacement") >>= nOld))
+                {
+                    if (maAvailableLabelPlacements.getLength())
+                        nOld = maAvailableLabelPlacements[0];
+                }
+                if (mbDataSeries)
+                {
+                    Reference<chart2::XDataSeries> xSeries(GetPropertySet(), uno::UNO_QUERY);
+                    if (nOld != nNew ||
+                        DataSeriesHelper::hasAttributedDataPointDifferentValue(xSeries, "LabelPlacement", uno::makeAny(nOld)))
+                    {
+                        DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints(xSeries, "LabelPlacement", uno::makeAny(nNew));
+                        bChanged = true;
+                    }
+                }
+                else if (nOld != nNew)
+                {
+                    GetPropertySet()->setPropertyValue("LabelPlacement", uno::makeAny(nNew));
+                    bChanged = true;
+                }
+            }
+            catch (const uno::Exception& e)
+            {
+                ASSERT_EXCEPTION(e);
+            }
+        }
+        break;
+        case SCHATTR_STYLE_SYMBOL:
+        {
+            sal_Int32 nStyle =
+                static_cast<const SfxInt32Item&>(
+                rItemSet.Get(nWhichId)).GetValue();
+            chart2::Symbol aSymbol;
+
+            GetPropertySet()->getPropertyValue("Symbol") >>= aSymbol;
+            sal_Int32 nOldStyle = getSymbolStyleForSymbol(aSymbol);
+
+            if (nStyle != nOldStyle)
+            {
+                bool bDeleteSymbol = false;
+                switch (nStyle)
+                {
+                    case SVX_SYMBOLTYPE_NONE:
+                        aSymbol.Style = chart2::SymbolStyle_NONE;
+                        break;
+                    case SVX_SYMBOLTYPE_AUTO:
+                        aSymbol.Style = chart2::SymbolStyle_AUTO;
+                        break;
+                    case SVX_SYMBOLTYPE_BRUSHITEM:
+                        aSymbol.Style = chart2::SymbolStyle_GRAPHIC;
+                        break;
+                    case SVX_SYMBOLTYPE_UNKNOWN:
+                        bDeleteSymbol = true;
+                        break;
+
+                    default:
+                        aSymbol.Style = chart2::SymbolStyle_STANDARD;
+                        aSymbol.StandardSymbol = nStyle;
+                }
+
+                if (bDeleteSymbol)
+                    GetPropertySet()->setPropertyValue("Symbol", uno::Any());
+                else
+                    GetPropertySet()->setPropertyValue("Symbol", uno::makeAny(aSymbol));
+                bChanged = true;
+            }
+        }
+        break;
+        case SCHATTR_SYMBOL_SIZE:
+        {
+            Size aSize = static_cast<const SvxSizeItem&>(
+                rItemSet.Get(nWhichId)).GetSize();
+            chart2::Symbol aSymbol;
+
+            GetPropertySet()->getPropertyValue("Symbol") >>= aSymbol;
+            if (aSize.getWidth() != aSymbol.Size.Width ||
+                aSize.getHeight() != aSymbol.Size.Height)
+            {
+                aSymbol.Size.Width = aSize.getWidth();
+                aSymbol.Size.Height = aSize.getHeight();
+
+                GetPropertySet()->setPropertyValue("Symbol", uno::makeAny(aSymbol));
+                bChanged = true;
+            }
+        }
+        break;
+        case SCHATTR_SYMBOL_BRUSH:
+        {
+            const SvxBrushItem& rBrshItem(static_cast<const SvxBrushItem&>(
+                    rItemSet.Get(nWhichId)));
+            uno::Any aXGraphicAny;
+            const Graphic* pGraphic(rBrshItem.GetGraphic());
+            if (pGraphic)
+            {
+                uno::Reference<graphic::XGraphic> xGraphic(pGraphic->GetXGraphic());
+                if (xGraphic.is())
+                {
+                    aXGraphicAny <<= xGraphic;
+                    chart2::Symbol aSymbol;
+                    GetPropertySet()->getPropertyValue("Symbol") >>= aSymbol;
+                    if (aSymbol.Graphic != xGraphic)
+                    {
+                        aSymbol.Graphic = xGraphic;
+                        GetPropertySet()->setPropertyValue("Symbol", uno::makeAny(aSymbol));
+                        bChanged = true;
+                    }
+                }
+            }
+        }
+        break;
+        case SCHATTR_TEXT_DEGREES:
+        {
+            double fValue = static_cast<double>(
+                static_cast<const SfxInt32Item&>(
+                    rItemSet.Get(nWhichId)).GetValue()) / 100.0;
+            double fOldValue = 0.0;
+            bool bPropExisted =
+                (GetPropertySet()->getPropertyValue("TextRotation") >>= fOldValue);
+
+            if (!bPropExisted ||
+                (bPropExisted && fOldValue != fValue))
+            {
+                GetPropertySet()->setPropertyValue("TextRotation", uno::makeAny(fValue));
+                bChanged = true;
+            }
+        }
+        break;
+    }
+
+    return bChanged;
+}
+
+void TextLabelItemConverter::FillSpecialItem( sal_uInt16 nWhichId, SfxItemSet& rOutItemSet ) const
+    throw (uno::Exception)
+{
+    switch (nWhichId)
+    {
+        case SCHATTR_DATADESCR_SHOW_NUMBER:
+        case SCHATTR_DATADESCR_SHOW_PERCENTAGE:
+        case SCHATTR_DATADESCR_SHOW_CATEGORY:
+        case SCHATTR_DATADESCR_SHOW_SYMBOL:
+        {
+            chart2::DataPointLabel aLabel;
+            if (GetPropertySet()->getPropertyValue(CHART_UNONAME_LABEL) >>= aLabel)
+            {
+                bool bValue = (SCHATTR_DATADESCR_SHOW_NUMBER == nWhichId) ? aLabel.ShowNumber : (
+                    (SCHATTR_DATADESCR_SHOW_PERCENTAGE == nWhichId) ? aLabel.ShowNumberInPercent : (
+                        (SCHATTR_DATADESCR_SHOW_CATEGORY == nWhichId) ? aLabel.ShowCategoryName : aLabel.ShowLegendSymbol));
+
+                rOutItemSet.Put(SfxBoolItem(nWhichId, bValue));
+
+                if (mbDataSeries)
+                {
+                    if (DataSeriesHelper::hasAttributedDataPointDifferentValue(
+                            Reference<chart2::XDataSeries>(GetPropertySet(), uno::UNO_QUERY), CHART_UNONAME_LABEL, uno::makeAny(aLabel)))
+                    {
+                        rOutItemSet.InvalidateItem(nWhichId);
+                    }
+                }
+            }
+        }
+        break;
+        case SID_ATTR_NUMBERFORMAT_VALUE:
+        {
+            sal_Int32 nKey = 0;
+            if (!(GetPropertySet()->getPropertyValue(CHART_UNONAME_NUMFMT) >>= nKey))
+                nKey = mnNumberFormat;
+            rOutItemSet.Put(SfxUInt32Item(nWhichId, nKey));
+        }
+        break;
+        case SCHATTR_PERCENT_NUMBERFORMAT_VALUE:
+        {
+            sal_Int32 nKey = 0;
+            if (!(GetPropertySet()->getPropertyValue("PercentageNumberFormat") >>= nKey))
+                nKey = mnPercentNumberFormat;
+            rOutItemSet.Put(SfxUInt32Item(nWhichId, nKey));
+        }
+        break;
+        case SID_ATTR_NUMBERFORMAT_SOURCE:
+        {
+            bool bNumberFormatIsSet = GetPropertySet()->getPropertyValue(CHART_UNONAME_NUMFMT).hasValue();
+            rOutItemSet.Put(SfxBoolItem(nWhichId, !bNumberFormatIsSet));
+        }
+        break;
+        case SCHATTR_PERCENT_NUMBERFORMAT_SOURCE:
+        {
+            bool bNumberFormatIsSet = (GetPropertySet()->getPropertyValue("PercentageNumberFormat").hasValue());
+            rOutItemSet.Put(SfxBoolItem(nWhichId, !bNumberFormatIsSet));
+        }
+        break;
+        case SCHATTR_DATADESCR_SEPARATOR:
+        {
+            OUString aValue;
+            try
+            {
+                GetPropertySet()->getPropertyValue("LabelSeparator") >>= aValue;
+                rOutItemSet.Put(SfxStringItem(nWhichId, aValue));
+            }
+            catch (const uno::Exception& e)
+            {
+                ASSERT_EXCEPTION(e);
+            }
+        }
+        break;
+        case SCHATTR_DATADESCR_PLACEMENT:
+        {
+            try
+            {
+                sal_Int32 nPlacement = 0;
+                if (GetPropertySet()->getPropertyValue("LabelPlacement") >>= nPlacement)
+                    rOutItemSet.Put(SfxInt32Item(nWhichId, nPlacement));
+                else if (maAvailableLabelPlacements.getLength())
+                    rOutItemSet.Put(SfxInt32Item(nWhichId, maAvailableLabelPlacements[0]));
+            }
+            catch (const uno::Exception& e)
+            {
+                ASSERT_EXCEPTION(e);
+            }
+        }
+        break;
+        case SCHATTR_DATADESCR_AVAILABLE_PLACEMENTS:
+        {
+            rOutItemSet.Put(SfxIntegerListItem(nWhichId, maAvailableLabelPlacements));
+        }
+        break;
+        case SCHATTR_DATADESCR_NO_PERCENTVALUE:
+        {
+            rOutItemSet.Put(SfxBoolItem(nWhichId, mbForbidPercentValue));
+        }
+        break;
+        case SCHATTR_STYLE_SYMBOL:
+        {
+            chart2::Symbol aSymbol;
+            if (GetPropertySet()->getPropertyValue("Symbol") >>= aSymbol)
+                rOutItemSet.Put(SfxInt32Item(nWhichId, getSymbolStyleForSymbol(aSymbol)));
+        }
+        break;
+        case SCHATTR_SYMBOL_SIZE:
+        {
+            chart2::Symbol aSymbol;
+            if (GetPropertySet()->getPropertyValue("Symbol") >>= aSymbol)
+                rOutItemSet.Put(
+                    SvxSizeItem(nWhichId, Size(aSymbol.Size.Width, aSymbol.Size.Height)));
+        }
+        break;
+        case SCHATTR_SYMBOL_BRUSH:
+        {
+            chart2::Symbol aSymbol;
+            if ((GetPropertySet()->getPropertyValue("Symbol") >>= aSymbol)
+                && aSymbol.Graphic.is())
+            {
+                rOutItemSet.Put(
+                    SvxBrushItem(Graphic(aSymbol.Graphic), GPOS_MM, SCHATTR_SYMBOL_BRUSH));
+            }
+        }
+        break;
+        case SCHATTR_TEXT_DEGREES:
+        {
+            double fValue = 0;
+
+            if (GetPropertySet()->getPropertyValue("TextRotation") >>= fValue)
+            {
+                rOutItemSet.Put(
+                    SfxInt32Item(nWhichId, static_cast<sal_Int32>(rtl::math::round(fValue * 100.0))));
+            }
+        }
+        break;
+    }
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/main/ChartController_Properties.cxx b/chart2/source/controller/main/ChartController_Properties.cxx
index 2583642..bfdd4b8 100644
--- a/chart2/source/controller/main/ChartController_Properties.cxx
+++ b/chart2/source/controller/main/ChartController_Properties.cxx
@@ -28,6 +28,7 @@
 #include "dlg_InsertErrorBars.hxx"
 #include "ViewElementListProvider.hxx"
 #include "DataPointItemConverter.hxx"
+#include "TextLabelItemConverter.hxx"
 #include "AxisItemConverter.hxx"
 #include "MultipleChartConverters.hxx"
 #include "TitleItemConverter.hxx"
@@ -167,8 +168,35 @@ wrapper::ItemConverter* createItemConverter(
             case OBJECTTYPE_AXIS_UNITLABEL:
                     break;
             case OBJECTTYPE_DATA_LABELS:
-            case OBJECTTYPE_DATA_SERIES:
             case OBJECTTYPE_DATA_LABEL:
+            {
+                boost::scoped_ptr<awt::Size> pRefSize;
+                if (pRefSizeProvider)
+                    pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
+
+                uno::Reference<XDataSeries> xSeries = ObjectIdentifier::getDataSeriesForCID(aObjectCID, xChartModel);
+                uno::Reference<XChartType> xChartType = ChartModelHelper::getChartTypeOfSeries(xChartModel, xSeries);
+
+                uno::Reference<XDiagram> xDiagram = ChartModelHelper::findDiagram(xChartModel);
+
+                bool bDataSeries = eObjectType == OBJECTTYPE_DATA_LABELS;
+
+                sal_Int32 nPointIndex = -1; /*-1 for whole series*/
+                if (!bDataSeries)
+                    nPointIndex = aParticleID.toInt32();
+
+                sal_Int32 nNumberFormat = ExplicitValueProvider::getExplicitNumberFormatKeyForDataLabel(
+                    xObjectProperties, xSeries, nPointIndex, xDiagram);
+                sal_Int32 nPercentNumberFormat = ExplicitValueProvider::getExplicitPercentageNumberFormatKeyForDataLabel(
+                    xObjectProperties,uno::Reference<util::XNumberFormatsSupplier>(xChartModel, uno::UNO_QUERY));
+
+                pItemConverter = new wrapper::TextLabelItemConverter(
+                    xChartModel, xObjectProperties, xSeries,
+                    rDrawModel.GetItemPool(), pRefSize.get(), bDataSeries,
+                    nNumberFormat, nPercentNumberFormat);
+            }
+            break;
+            case OBJECTTYPE_DATA_SERIES:
             case OBJECTTYPE_DATA_POINT:
             {
                 boost::scoped_ptr<awt::Size> pRefSize;
@@ -186,7 +214,7 @@ wrapper::ItemConverter* createItemConverter(
                 if( !ChartTypeHelper::isSupportingAreaProperties( xChartType, nDimensionCount ) )
                     eMapTo = wrapper::GraphicPropertyItemConverter::LINE_DATA_POINT;
 
-                bool bDataSeries = ( eObjectType == OBJECTTYPE_DATA_SERIES || eObjectType == OBJECTTYPE_DATA_LABELS );
+                bool bDataSeries = eObjectType == OBJECTTYPE_DATA_SERIES;
 
                 //special color for pie chart:
                 bool bUseSpecialFillColor = false;
diff --git a/chart2/source/model/main/DataPointProperties.cxx b/chart2/source/model/main/DataPointProperties.cxx
index 58d15f1..13a7c8d 100644
--- a/chart2/source/model/main/DataPointProperties.cxx
+++ b/chart2/source/model/main/DataPointProperties.cxx
@@ -264,20 +264,6 @@ void DataPointProperties::AddPropertiesToVector(
                   | beans::PropertyAttribute::MAYBEDEFAULT ));
 
     rOutProperties.push_back(
-        Property( CHART_UNONAME_LABEL,
-                  PROP_DATAPOINT_LABEL,
-                  cppu::UnoType<chart2::DataPointLabel>::get(),
-                  beans::PropertyAttribute::BOUND
-                  | beans::PropertyAttribute::MAYBEDEFAULT ));
-
-    rOutProperties.push_back(
-        Property( "LabelSeparator",
-                  PROP_DATAPOINT_LABEL_SEPARATOR,
-                  cppu::UnoType<OUString>::get(),
-                  beans::PropertyAttribute::BOUND
-                  | beans::PropertyAttribute::MAYBEDEFAULT ));
-
-    rOutProperties.push_back(
         Property( CHART_UNONAME_NUMFMT,
                   PROP_DATAPOINT_NUMBER_FORMAT,
                   cppu::UnoType<sal_Int32>::get(),
@@ -347,6 +333,60 @@ void DataPointProperties::AddPropertiesToVector(
                   cppu::UnoType<sal_Int16>::get(),
                   beans::PropertyAttribute::BOUND
                   | beans::PropertyAttribute::MAYBEVOID ));
+
+    // Properties specific to data label.
+
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL,
+                  PROP_DATAPOINT_LABEL,
+                  cppu::UnoType<chart2::DataPointLabel>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
+
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_SEP,
+                  PROP_DATAPOINT_LABEL_SEPARATOR,
+                  cppu::UnoType<OUString>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
+
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_STYLE,
+                  PROP_DATAPOINT_LABEL_BORDER_STYLE,
+                  cppu::UnoType<drawing::LineStyle>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_COLOR,
+                  PROP_DATAPOINT_LABEL_BORDER_COLOR,
+                  cppu::UnoType<sal_Int32>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEVOID         // "maybe auto"
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_WIDTH,
+                  PROP_DATAPOINT_LABEL_BORDER_WIDTH,
+                  cppu::UnoType<sal_Int32>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
+    rOutProperties.push_back(
+         Property( CHART_UNONAME_LABEL_BORDER_DASH,
+                   PROP_DATAPOINT_LABEL_BORDER_DASH,
+                   cppu::UnoType<drawing::LineDash>::get(),
+                   beans::PropertyAttribute::BOUND
+                   | beans::PropertyAttribute::MAYBEVOID ));
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_DASHNAME,
+                  PROP_DATAPOINT_LABEL_BORDER_DASH_NAME,
+                  cppu::UnoType<OUString>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEVOID ));
+    rOutProperties.push_back(
+        Property( CHART_UNONAME_LABEL_BORDER_TRANS,
+                  PROP_DATAPOINT_LABEL_BORDER_TRANS,
+                  cppu::UnoType<sal_Int16>::get(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ));
 }
 
 void DataPointProperties::AddDefaultsToMap(
@@ -400,6 +440,16 @@ void DataPointProperties::AddDefaultsToMap(
     PropertyHelper::setPropertyValueDefault< double >( rOutMap, PROP_DATAPOINT_OFFSET, 0.0 );
     PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DATAPOINT_GEOMETRY3D, chart2::DataPointGeometry3D::CUBOID );
 
+    //@todo maybe choose a different one here -> should be dynamically that of the attached axis
+    PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DATAPOINT_ERROR_BAR_X, uno::Reference< beans::XPropertySet >());
+    PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DATAPOINT_ERROR_BAR_Y, uno::Reference< beans::XPropertySet >());
+    PropertyHelper::setPropertyValueDefault< sal_Int16 >( rOutMap, PROP_DATAPOINT_PERCENT_DIAGONAL, 0 );
+
+    PropertyHelper::setPropertyValueDefault< double >( rOutMap, PROP_DATAPOINT_TEXT_ROTATION, 0.0 );
+
+    PropertyHelper::setPropertyValueDefault(rOutMap, PROP_DATAPOINT_LINK_NUMBERFORMAT_TO_SOURCE, true);
+
+    // data label
     PropertyHelper::setPropertyValueDefault(
         rOutMap, PROP_DATAPOINT_LABEL,
         chart2::DataPointLabel(
@@ -410,15 +460,12 @@ void DataPointProperties::AddDefaultsToMap(
             ));
 
     PropertyHelper::setPropertyValueDefault< OUString >( rOutMap, PROP_DATAPOINT_LABEL_SEPARATOR, " " );
-
-    //@todo maybe choose a different one here -> should be dynamically that of the attached axis
-    PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DATAPOINT_ERROR_BAR_X, uno::Reference< beans::XPropertySet >());
-    PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DATAPOINT_ERROR_BAR_Y, uno::Reference< beans::XPropertySet >());
-    PropertyHelper::setPropertyValueDefault< sal_Int16 >( rOutMap, PROP_DATAPOINT_PERCENT_DIAGONAL, 0 );
-
-    PropertyHelper::setPropertyValueDefault< double >( rOutMap, PROP_DATAPOINT_TEXT_ROTATION, 0.0 );
-
-    PropertyHelper::setPropertyValueDefault(rOutMap, PROP_DATAPOINT_LINK_NUMBERFORMAT_TO_SOURCE, true);
+    PropertyHelper::setPropertyValueDefault<sal_Int32>(rOutMap, PROP_DATAPOINT_LABEL_BORDER_STYLE, drawing::LineStyle_NONE);
+    PropertyHelper::setEmptyPropertyValueDefault(rOutMap, PROP_DATAPOINT_LABEL_BORDER_COLOR);
+    PropertyHelper::setPropertyValueDefault<sal_Int32>(rOutMap, PROP_DATAPOINT_LABEL_BORDER_WIDTH, 0);
+    PropertyHelper::setPropertyValueDefault(rOutMap, PROP_DATAPOINT_LABEL_BORDER_DASH, drawing::LineDash());
+    PropertyHelper::setEmptyPropertyValueDefault(rOutMap, PROP_DATAPOINT_LABEL_BORDER_DASH_NAME);
+    PropertyHelper::setPropertyValueDefault<sal_Int16>(rOutMap, PROP_DATAPOINT_LABEL_BORDER_TRANS, 0);
 }
 
 } //  namespace chart
diff --git a/chart2/source/model/main/DataPointProperties.hxx b/chart2/source/model/main/DataPointProperties.hxx
index 2d7258a..721e02b 100644
--- a/chart2/source/model/main/DataPointProperties.hxx
+++ b/chart2/source/model/main/DataPointProperties.hxx
@@ -59,8 +59,6 @@ public:
         PROP_DATAPOINT_SYMBOL_PROP,
         PROP_DATAPOINT_OFFSET,
         PROP_DATAPOINT_GEOMETRY3D,
-        PROP_DATAPOINT_LABEL,
-        PROP_DATAPOINT_LABEL_SEPARATOR,
         PROP_DATAPOINT_NUMBER_FORMAT,
         PROP_DATAPOINT_LINK_NUMBERFORMAT_TO_SOURCE,
         PROP_DATAPOINT_PERCENTAGE_NUMBER_FORMAT,
@@ -72,7 +70,17 @@ public:
         PROP_DATAPOINT_ERROR_BAR_X,
         PROP_DATAPOINT_ERROR_BAR_Y,
         PROP_DATAPOINT_SHOW_ERROR_BOX,
-        PROP_DATAPOINT_PERCENT_DIAGONAL
+        PROP_DATAPOINT_PERCENT_DIAGONAL,
+
+        // label
+        PROP_DATAPOINT_LABEL,
+        PROP_DATAPOINT_LABEL_SEPARATOR,
+        PROP_DATAPOINT_LABEL_BORDER_STYLE,
+        PROP_DATAPOINT_LABEL_BORDER_COLOR,
+        PROP_DATAPOINT_LABEL_BORDER_WIDTH,
+        PROP_DATAPOINT_LABEL_BORDER_DASH,
+        PROP_DATAPOINT_LABEL_BORDER_DASH_NAME,
+        PROP_DATAPOINT_LABEL_BORDER_TRANS
 
         // additionally some properites from ::chart::LineProperties
     };
diff --git a/chart2/source/view/inc/PropertyMapper.hxx b/chart2/source/view/inc/PropertyMapper.hxx
index 610f24c..c1c29b7 100644
--- a/chart2/source/view/inc/PropertyMapper.hxx
+++ b/chart2/source/view/inc/PropertyMapper.hxx
@@ -115,6 +115,7 @@ public:
 
     static const tMakePropertyNameMap& getPropertyNameMapForFilledSeriesProperties();
     static const tMakePropertyNameMap& getPropertyNameMapForLineSeriesProperties();
+    static const tMakePropertyNameMap& getPropertyNameMapForTextLabelProperties();
 
     static void getTextLabelMultiPropertyLists(
                 const ::com::sun::star::uno::Reference<
diff --git a/chart2/source/view/main/PropertyMapper.cxx b/chart2/source/view/main/PropertyMapper.cxx
index 05e874b..1cff389 100644
--- a/chart2/source/view/main/PropertyMapper.cxx
+++ b/chart2/source/view/main/PropertyMapper.cxx
@@ -20,6 +20,7 @@
 #include "PropertyMapper.hxx"
 #include "ContainerHelper.hxx"
 #include "macros.hxx"
+#include <unonames.hxx>
 
 #include <com/sun/star/beans/XMultiPropertySet.hpp>
 #include <com/sun/star/drawing/LineStyle.hpp>
@@ -334,6 +335,19 @@ const tMakePropertyNameMap& PropertyMapper::getPropertyNameMapForLineSeriesPrope
     return m_aShapePropertyMapForLineSeriesProperties;
 }
 
+const tMakePropertyNameMap& PropertyMapper::getPropertyNameMapForTextLabelProperties()
+{
+    // taget name (drawing layer) : source name (chart model)
+    static tMakePropertyNameMap aMap = tMakePropertyNameMap
+        ( getPropertyNameMapForCharacterProperties() )
+        ( "LineStyle", CHART_UNONAME_LABEL_BORDER_STYLE )
+        ( "LineWidth", CHART_UNONAME_LABEL_BORDER_WIDTH )
+        ( "LineColor", CHART_UNONAME_LABEL_BORDER_COLOR )
+        ( "LineTransparence", CHART_UNONAME_LABEL_BORDER_TRANS ) // fix the spelling!
+        ;
+    return aMap;
+}
+
 const tMakePropertyNameMap& PropertyMapper::getPropertyNameMapForFilledSeriesProperties()
 {
     //shape property -- chart model object property
@@ -425,12 +439,11 @@ void PropertyMapper::getTextLabelMultiPropertyLists(
 {
     //fill character properties into the ValueMap
     tPropertyNameValueMap aValueMap;
-    PropertyMapper::getValueMap( aValueMap
-            , PropertyMapper::getPropertyNameMapForCharacterProperties()
-            , xSourceProp );
+    tMakePropertyNameMap aNameMap = PropertyMapper::getPropertyNameMapForTextLabelProperties();
+
+    PropertyMapper::getValueMap(aValueMap, aNameMap, xSourceProp);
 
     //some more shape properties apart from character properties, position-matrix and label string
-    aValueMap.insert( tPropertyNameValueMap::value_type( "LineStyle", uno::makeAny(drawing::LineStyle_NONE) ) ); // drawing::LineStyle
     aValueMap.insert( tPropertyNameValueMap::value_type( "TextHorizontalAdjust", uno::makeAny(drawing::TextHorizontalAdjust_CENTER) ) ); // drawing::TextHorizontalAdjust - needs to be overwritten
     aValueMap.insert( tPropertyNameValueMap::value_type( "TextVerticalAdjust", uno::makeAny(drawing::TextVerticalAdjust_CENTER) ) ); //drawing::TextVerticalAdjust - needs to be overwritten
     aValueMap.insert( tPropertyNameValueMap::value_type( "TextAutoGrowHeight", uno::makeAny(sal_True) ) ); // sal_Bool


More information about the Libreoffice-commits mailing list