From f1531cdaaebe706d909dc6ddde439ccb5f4ad36d Mon Sep 17 00:00:00 2001
From: Kohei Yoshida <kohei.yoshida@collabora.com>
Date: Wed, 23 Jul 2014 15:49:11 -0400
Subject: bnc#885825: Support borders around data labels.

Change-Id: Ib141413e523cbf73746876f727e9f80dda9f5f7c
---
 chart2/Library_chartcontroller.mk                  |   1 +
 chart2/inc/unonames.hxx                            |   7 +
 .../controller/dialogs/dlg_ObjectProperties.cxx    |   1 +
 .../controller/inc/TextLabelItemConverter.hxx      |  73 +++
 .../controller/itemsetwrapper/SchWhichPairs.hxx    |  16 +
 .../itemsetwrapper/TextLabelItemConverter.cxx      | 615 +++++++++++++++++++++
 .../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 +-
 11 files changed, 842 insertions(+), 32 deletions(-)
 create mode 100644 chart2/source/controller/inc/TextLabelItemConverter.hxx
 create mode 100644 chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx

(limited to 'chart2')

diff --git a/chart2/Library_chartcontroller.mk b/chart2/Library_chartcontroller.mk
index b7e86bfc353e..f77ef70b9056 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 0731ab6874a6..867a155e14aa 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 f5baf352a01f..4f6a0178029b 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 000000000000..70e17a310804
--- /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 891fd75fe926..2fdc76eec808 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 000000000000..c18247507337
--- /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 25836427f45e..bfdd4b8056d1 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 58d15f1f41a8..13a7c8d8c9da 100644
--- a/chart2/source/model/main/DataPointProperties.cxx
+++ b/chart2/source/model/main/DataPointProperties.cxx
@@ -263,20 +263,6 @@ void DataPointProperties::AddPropertiesToVector(
                   beans::PropertyAttribute::BOUND
                   | 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,
@@ -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 2d7258aca510..721e02bf6296 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 610f24cdf89a..c1c29b7ea4d1 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 05e874b48fcc..1cff389c9c2d 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
-- 
cgit