chart2/Library_chartcontroller.mk                                        |    
1 
 chart2/UIConfig_chart2.mk                                                |    
1 
 chart2/inc/strings.hrc                                                   |    
1 
 chart2/source/controller/dialogs/dlg_ObjectProperties.cxx                |   
16 
 chart2/source/controller/dialogs/tp_ChartColorPalette.cxx                |  
188 ++++++++++
 chart2/source/controller/dialogs/tp_ChartColorPalette.hxx                |   
64 +++
 chart2/source/controller/inc/GraphicPropertyItemConverter.hxx            |    
5 
 chart2/source/controller/itemsetwrapper/GraphicPropertyItemConverter.cxx |   
22 +
 chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx                |    
3 
 chart2/source/inc/chartview/ChartSfxItemIds.hxx                          |    
7 
 chart2/source/view/main/ChartItemPool.cxx                                |    
5 
 chart2/uiconfig/ui/tp_ChartColorPalette.ui                               |  
112 +++++
 include/svl/poolitem.hxx                                                 |    
1 
 include/svx/chrtitem.hxx                                                 |   
30 +
 include/svx/unomid.hxx                                                   |    
4 
 svx/source/items/chrtitem.cxx                                            |   
88 ++++
 vcl/jsdialog/enabled.cxx                                                 |    
1 
 17 files changed, 545 insertions(+), 4 deletions(-)

New commits:
commit 51bbf3b037112d1fc2c13c7b18215c2a86758c98
Author:     Marco Cecchetti <marco.cecche...@collabora.com>
AuthorDate: Fri Apr 11 16:43:30 2025 +0200
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Thu May 1 08:56:05 2025 +0200

    chart color palette for data series: dialog tab pane
    
    Change-Id: I0877212c715d320e954fcd8089d4f984eae16ac6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184265
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/chart2/Library_chartcontroller.mk 
b/chart2/Library_chartcontroller.mk
index ab3249e36e76..29bde1779759 100644
--- a/chart2/Library_chartcontroller.mk
+++ b/chart2/Library_chartcontroller.mk
@@ -132,6 +132,7 @@ $(eval $(call 
gb_Library_add_exception_objects,chartcontroller,\
     chart2/source/controller/dialogs/tp_3D_SceneIllumination \
     chart2/source/controller/dialogs/tp_AxisLabel \
     chart2/source/controller/dialogs/tp_AxisPositions \
+    chart2/source/controller/dialogs/tp_ChartColorPalette \
     chart2/source/controller/dialogs/tp_ChartType \
     chart2/source/controller/dialogs/tp_DataLabel \
     chart2/source/controller/dialogs/tp_DataPointOption \
diff --git a/chart2/UIConfig_chart2.mk b/chart2/UIConfig_chart2.mk
index 93d8db3154d9..722faf0d8580 100644
--- a/chart2/UIConfig_chart2.mk
+++ b/chart2/UIConfig_chart2.mk
@@ -67,6 +67,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/schart,\
        chart2/uiconfig/ui/tp_3D_SceneIllumination \
        chart2/uiconfig/ui/tp_axisLabel \
        chart2/uiconfig/ui/tp_AxisPositions \
+       chart2/uiconfig/ui/tp_ChartColorPalette \
        chart2/uiconfig/ui/tp_ChartType \
        chart2/uiconfig/ui/tp_DataLabel \
        chart2/uiconfig/ui/tp_DataPointOption \
diff --git a/chart2/inc/strings.hrc b/chart2/inc/strings.hrc
index 1b1e3588fb2d..d2aa4d9c275b 100644
--- a/chart2/inc/strings.hrc
+++ b/chart2/inc/strings.hrc
@@ -48,6 +48,7 @@
 #define STR_PAGE_APPEARANCE                         NC_("STR_PAGE_APPEARANCE", 
"Appearance")
 #define STR_PAGE_ILLUMINATION                       
NC_("STR_PAGE_ILLUMINATION", "Illumination")
 #define STR_PAGE_ASIAN                              NC_("STR_PAGE_ASIAN", 
"Asian Typography")
+#define STR_PAGE_COLOR_PALETTE                      
NC_("STR_PAGE_COLOR_PALETTE", "Color Palette")
 #define STR_OBJECT_AVERAGE_LINE_WITH_PARAMETERS     
NC_("STR_OBJECT_AVERAGE_LINE_WITH_PARAMETERS", "Mean value line with value 
%AVERAGE_VALUE and standard deviation %STD_DEVIATION")
 #define STR_OBJECT_AXIS                             NC_("STR_OBJECT_AXIS", 
"Axis")
 #define STR_OBJECT_AXIS_X                           NC_("STR_OBJECT_AXIS_X", 
"X Axis")
diff --git a/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx 
b/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx
index f067bd2b0987..db633f227249 100644
--- a/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx
+++ b/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx
@@ -36,6 +36,7 @@
 #include "tp_PolarOptions.hxx"
 #include "tp_DataPointOption.hxx"
 #include "tp_DataTable.hxx"
+#include "tp_ChartColorPalette.hxx"
 #include <ResId.hxx>
 #include <ViewElementListProvider.hxx>
 #include <ChartModelHelper.hxx>
@@ -346,7 +347,8 @@ SchAttribTabDlg::SchAttribTabDlg(weld::Window* pParent,
 
     m_xDialog->set_title(pDialogParameter->getLocalizedName());
 
-    switch (pDialogParameter->getObjectType())
+    ObjectType eType = pDialogParameter->getObjectType();
+    switch (eType)
     {
         case OBJECTTYPE_TITLE:
             AddTabPage(u"border"_ustr, SchResId(STR_PAGE_BORDER), 
RID_SVXPAGE_LINE);
@@ -363,6 +365,7 @@ SchAttribTabDlg::SchAttribTabDlg(weld::Window* pParent,
             AddTabPage(u"border"_ustr, SchResId(STR_PAGE_BORDER), 
RID_SVXPAGE_LINE);
             AddTabPage(u"area"_ustr, SchResId(STR_PAGE_AREA), 
RID_SVXPAGE_AREA);
             AddTabPage(u"transparent"_ustr, SchResId(STR_PAGE_TRANSPARENCY), 
RID_SVXPAGE_TRANSPARENCE);
+            AddTabPage(u"colorpalette"_ustr, SchResId(STR_PAGE_COLOR_PALETTE), 
ChartColorPaletteTabPage::Create);
             AddTabPage(u"fontname"_ustr, SchResId(STR_PAGE_FONT), 
RID_SVXPAGE_CHAR_NAME);
             AddTabPage(u"effects"_ustr, SchResId(STR_PAGE_FONT_EFFECTS), 
RID_SVXPAGE_CHAR_EFFECTS);
             AddTabPage(u"legendpos"_ustr, SchResId(STR_PAGE_POSITION), 
SchLegendPosTabPage::Create);
@@ -388,6 +391,7 @@ SchAttribTabDlg::SchAttribTabDlg(weld::Window* pParent,
                 AddTabPage(u"transparent"_ustr, 
SchResId(STR_PAGE_TRANSPARENCY), RID_SVXPAGE_TRANSPARENCE);
             }
             AddTabPage(u"border"_ustr, SchResId( 
m_pParameter->HasAreaProperties() ? STR_PAGE_BORDER : STR_PAGE_LINE ), 
RID_SVXPAGE_LINE);
+            AddTabPage(u"colorpalette"_ustr, SchResId(STR_PAGE_COLOR_PALETTE), 
ChartColorPaletteTabPage::Create);
             break;
 
         case OBJECTTYPE_DATA_LABEL:
@@ -454,6 +458,8 @@ SchAttribTabDlg::SchAttribTabDlg(weld::Window* pParent,
             AddTabPage(u"border"_ustr, SchResId(STR_PAGE_BORDER), 
RID_SVXPAGE_LINE);
             AddTabPage(u"area"_ustr, SchResId(STR_PAGE_AREA), 
RID_SVXPAGE_AREA);
             AddTabPage(u"transparent"_ustr, SchResId(STR_PAGE_TRANSPARENCY), 
RID_SVXPAGE_TRANSPARENCE);
+            if (eType != OBJECTTYPE_DATA_STOCK_LOSS && eType != 
OBJECTTYPE_DATA_STOCK_GAIN)
+                AddTabPage(u"colorpalette"_ustr, 
SchResId(STR_PAGE_COLOR_PALETTE), ChartColorPaletteTabPage::Create);
             break;
 
         case OBJECTTYPE_LEGEND_ENTRY:
@@ -625,6 +631,14 @@ void SchAttribTabDlg::PageCreated(const OUString& rId, 
SfxTabPage &rPage)
             pTrendlineTabPage->SetNbPoints( m_pParameter->getNbPoints() );
         }
     }
+    else if (rId == "colorpalette")
+    {
+        auto* pColorPaletteTabPage = dynamic_cast<ChartColorPaletteTabPage*>( 
&rPage );
+        if (pColorPaletteTabPage)
+        {
+            pColorPaletteTabPage->init(m_pParameter->getDocument());
+        }
+    }
 }
 
 IMPL_LINK(SchAttribTabDlg, OKPressed, weld::Button&, rButton, void)
diff --git a/chart2/source/controller/dialogs/tp_ChartColorPalette.cxx 
b/chart2/source/controller/dialogs/tp_ChartColorPalette.cxx
new file mode 100644
index 000000000000..a48907fa62c6
--- /dev/null
+++ b/chart2/source/controller/dialogs/tp_ChartColorPalette.cxx
@@ -0,0 +1,188 @@
+/* -*- 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 "tp_ChartColorPalette.hxx"
+
+#include <ChartColorPaletteHelper.hxx>
+#include <ChartModel.hxx>
+#include <chartview/ChartSfxItemIds.hxx>
+#include <svx/chrtitem.hxx>
+#include <vcl/svapp.hxx>
+
+namespace chart
+{
+ChartColorPaletteTabPage::ChartColorPaletteTabPage(weld::Container* pPage,
+                                                   weld::DialogController* 
pController,
+                                                   const SfxItemSet& rInAttrs)
+    : SfxTabPage(pPage, pController, 
"modules/schart/ui/tp_ChartColorPalette.ui",
+                 "tp_ChartColorPalette", &rInAttrs)
+    , mxColorfulValueSet(new ChartColorPalettes)
+    , mxColorfulValueSetWin(
+          new weld::CustomWeld(*m_xBuilder, "colorful_palettes", 
*mxColorfulValueSet))
+    , mxMonoValueSet(new ChartColorPalettes)
+    , mxMonoValueSetWin(
+          new weld::CustomWeld(*m_xBuilder, "monochromatic_palettes", 
*mxMonoValueSet))
+{
+    mxColorfulValueSet->SetColCount(2);
+    mxColorfulValueSet->SetLineCount(2);
+    
mxColorfulValueSet->SetColor(Application::GetSettings().GetStyleSettings().GetFaceColor());
+
+    mxMonoValueSet->SetColCount(2);
+    mxMonoValueSet->SetLineCount(3);
+    
mxMonoValueSet->SetColor(Application::GetSettings().GetStyleSettings().GetFaceColor());
+
+    mxColorfulValueSet->SetOptimalSize();
+    mxColorfulValueSet->SetSelectHdl(
+        LINK(this, ChartColorPaletteTabPage, SelectColorfulValueSetHdl));
+
+    mxMonoValueSet->SetOptimalSize();
+    mxMonoValueSet->SetSelectHdl(LINK(this, ChartColorPaletteTabPage, 
SelectMonoValueSetHdl));
+}
+
+ChartColorPaletteTabPage::~ChartColorPaletteTabPage()
+{
+    mxColorfulValueSetWin.reset();
+    mxColorfulValueSet.reset();
+    mxMonoValueSetWin.reset();
+    mxMonoValueSet.reset();
+}
+
+std::unique_ptr<SfxTabPage> ChartColorPaletteTabPage::Create(weld::Container* 
pPage,
+                                                             
weld::DialogController* pController,
+                                                             const SfxItemSet* 
rInAttrs)
+{
+    return std::make_unique<ChartColorPaletteTabPage>(pPage, pController, 
*rInAttrs);
+}
+
+void ChartColorPaletteTabPage::init(const rtl::Reference<ChartModel>& 
xChartModel)
+{
+    assert(xChartModel);
+    mxChartModel = xChartModel;
+
+    const std::shared_ptr<model::Theme> pTheme = 
mxChartModel->getDocumentTheme();
+    mxHelper = std::make_unique<ChartColorPaletteHelper>(pTheme);
+
+    selectItem(mxChartModel->getColorPaletteType(), 
mxChartModel->getColorPaletteIndex() + 1);
+    initColorPalettes();
+}
+
+void ChartColorPaletteTabPage::initColorPalettes() const
+{
+    if (!mxHelper)
+        return;
+    // colorful palettes
+    for (size_t i = 0; i < ChartColorPaletteHelper::ColorfulPaletteSize; ++i)
+        
mxColorfulValueSet->insert(mxHelper->getColorPalette(ChartColorPaletteType::Colorful,
 i));
+    // monotonic palettes
+    for (size_t i = 0; i < ChartColorPaletteHelper::MonotonicPaletteSize; ++i)
+        
mxMonoValueSet->insert(mxHelper->getColorPalette(ChartColorPaletteType::Monochromatic,
 i));
+}
+
+void ChartColorPaletteTabPage::selectItem(const ChartColorPaletteType eType,
+                                          const sal_uInt32 nIndex) const
+{
+    switch (eType)
+    {
+        default:
+        case ChartColorPaletteType::Unknown:
+            mxColorfulValueSet->SetNoSelection();
+            mxMonoValueSet->SetNoSelection();
+            break;
+        case ChartColorPaletteType::Colorful:
+            mxMonoValueSet->SetNoSelection();
+            mxColorfulValueSet->SelectItem(nIndex);
+            break;
+        case ChartColorPaletteType::Monochromatic:
+            mxColorfulValueSet->SetNoSelection();
+            mxMonoValueSet->SelectItem(nIndex);
+            break;
+    }
+}
+
+bool ChartColorPaletteTabPage::FillItemSet(SfxItemSet* pOutAttrs)
+{
+    ChartColorPaletteType eType = ChartColorPaletteType::Unknown;
+    sal_uInt32 nIndex = 0;
+
+    if (!mxColorfulValueSet->IsNoSelection())
+    {
+        eType = ChartColorPaletteType::Colorful;
+        nIndex = mxColorfulValueSet->GetSelectedItemId() - 1;
+    }
+    else if (!mxMonoValueSet->IsNoSelection())
+    {
+        eType = ChartColorPaletteType::Monochromatic;
+        nIndex = mxMonoValueSet->GetSelectedItemId() - 1;
+    }
+
+    pOutAttrs->Put(SvxChartColorPaletteItem(eType, nIndex, 
SCHATTR_COLOR_PALETTE));
+
+    return true;
+}
+
+void ChartColorPaletteTabPage::Reset(const SfxItemSet*)
+{
+    selectItem(mxChartModel->getColorPaletteType(), 
mxChartModel->getColorPaletteIndex() + 1);
+}
+
+DeactivateRC ChartColorPaletteTabPage::DeactivatePage(SfxItemSet* pItemSet)
+{
+    if (pItemSet)
+        FillItemSet(pItemSet);
+
+    return DeactivateRC::LeavePage;
+}
+
+IMPL_LINK_NOARG(ChartColorPaletteTabPage, SelectColorfulValueSetHdl, 
ValueSet*, void)
+{
+    sal_uInt32 nIndex = SelectValueSetHdl(mxColorfulValueSet);
+    if (nIndex != static_cast<sal_uInt32>(-1))
+    {
+        mxMonoValueSet->SetNoSelection();
+    }
+}
+
+IMPL_LINK_NOARG(ChartColorPaletteTabPage, SelectMonoValueSetHdl, ValueSet*, 
void)
+{
+    sal_uInt32 nIndex = SelectValueSetHdl(mxMonoValueSet);
+    if (nIndex != static_cast<sal_uInt32>(-1))
+    {
+        mxColorfulValueSet->SetNoSelection();
+    }
+}
+
+sal_uInt32
+ChartColorPaletteTabPage::SelectValueSetHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet)
+{
+    const sal_uInt32 nItemId = xValueSet->GetSelectedItemId();
+
+    if (!nItemId)
+        return -1;
+
+    const sal_uInt32 nIndex = nItemId - 1;
+
+    if (xValueSet->getPalette(nIndex))
+    {
+        return nIndex;
+    }
+    return -1;
+}
+} //namespace chart
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/dialogs/tp_ChartColorPalette.hxx 
b/chart2/source/controller/dialogs/tp_ChartColorPalette.hxx
new file mode 100644
index 000000000000..02cfe3cd5c94
--- /dev/null
+++ b/chart2/source/controller/dialogs/tp_ChartColorPalette.hxx
@@ -0,0 +1,64 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/tabdlg.hxx>
+#include <ChartColorPalettes.hxx>
+
+namespace chart
+{
+class ChartModel;
+class ChartColorPaletteHelper;
+
+class ChartColorPaletteTabPage final : public SfxTabPage
+{
+public:
+    ChartColorPaletteTabPage(weld::Container* pPage, weld::DialogController* 
pController,
+                             const SfxItemSet& rInAttrs);
+    ~ChartColorPaletteTabPage() override;
+
+    static std::unique_ptr<SfxTabPage>
+    Create(weld::Container* pPage, weld::DialogController* pController, const 
SfxItemSet* rInAttrs);
+
+    bool FillItemSet(SfxItemSet* pOutAttrs) override;
+    void Reset(const SfxItemSet* rInAttrs) override;
+    DeactivateRC DeactivatePage(SfxItemSet* pItemSet) override;
+
+    void init(const rtl::Reference<ChartModel>& xChartModel);
+
+private:
+    void selectItem(ChartColorPaletteType eType, sal_uInt32 nIndex) const;
+    void initColorPalettes() const;
+
+private:
+    rtl::Reference<ChartModel> mxChartModel;
+    std::unique_ptr<ChartColorPaletteHelper> mxHelper;
+    std::unique_ptr<ChartColorPalettes> mxColorfulValueSet;
+    std::unique_ptr<weld::CustomWeld> mxColorfulValueSetWin;
+    std::unique_ptr<ChartColorPalettes> mxMonoValueSet;
+    std::unique_ptr<weld::CustomWeld> mxMonoValueSetWin;
+
+    DECL_LINK(SelectColorfulValueSetHdl, ValueSet*, void);
+    DECL_LINK(SelectMonoValueSetHdl, ValueSet*, void);
+    static sal_uInt32 SelectValueSetHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet);
+};
+} //namespace chart
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/inc/GraphicPropertyItemConverter.hxx 
b/chart2/source/controller/inc/GraphicPropertyItemConverter.hxx
index 9d119d53ca3a..c8a78944c96b 100644
--- a/chart2/source/controller/inc/GraphicPropertyItemConverter.hxx
+++ b/chart2/source/controller/inc/GraphicPropertyItemConverter.hxx
@@ -20,10 +20,14 @@
 
 #include "ItemConverter.hxx"
 
+#include <rtl/ref.hxx>
+
 namespace com::sun::star::lang { class XMultiServiceFactory; }
 
 class SdrModel;
 
+namespace chart { class ChartModel; }
+
 namespace chart::wrapper
 {
 
@@ -57,6 +61,7 @@ private:
     GraphicObjectType              m_GraphicObjectType;
     SdrModel &                      m_rDrawModel;
     css::uno::Reference< css::lang::XMultiServiceFactory >  
m_xNamedPropertyTableFactory;
+    rtl::Reference<ChartModel> m_xChartModel;
 };
 
 } //  namespace chart::wrapper
diff --git 
a/chart2/source/controller/itemsetwrapper/GraphicPropertyItemConverter.cxx 
b/chart2/source/controller/itemsetwrapper/GraphicPropertyItemConverter.cxx
index 0ca5be652a84..a6fecfb39f85 100644
--- a/chart2/source/controller/itemsetwrapper/GraphicPropertyItemConverter.cxx
+++ b/chart2/source/controller/itemsetwrapper/GraphicPropertyItemConverter.cxx
@@ -19,10 +19,12 @@
 
 #include <GraphicPropertyItemConverter.hxx>
 #include "SchWhichPairs.hxx"
+#include <ChartModel.hxx>
 #include <ItemPropertyMap.hxx>
 #include <PropertyHelper.hxx>
 #include <CommonConverters.hxx>
 #include <editeng/memberids.h>
+#include <svx/chrtitem.hxx>
 #include <svx/unomid.hxx>
 #include <svx/xflbmtit.hxx>
 #include <svx/xflbstit.hxx>
@@ -144,7 +146,11 @@ GraphicPropertyItemConverter::GraphicPropertyItemConverter(
         m_GraphicObjectType( eObjectType ),
         m_rDrawModel( rDrawModel ),
         m_xNamedPropertyTableFactory(std::move( xNamedPropertyContainerFactory 
))
-{}
+{
+    m_xChartModel = 
dynamic_cast<ChartModel*>(m_xNamedPropertyTableFactory.get());
+    DBG_ASSERT(m_xChartModel.is(),
+        "GraphicPropertyItemConverter ctor: passed XMultiServiceFactory 
parameter is not a ChartModel instance.");
+}
 
 GraphicPropertyItemConverter::~GraphicPropertyItemConverter()
 {}
@@ -168,6 +174,11 @@ const WhichRangesContainer& 
GraphicPropertyItemConverter::GetWhichPairs() const
 
 bool GraphicPropertyItemConverter::GetItemProperty( tWhichIdType nWhichId, 
tPropertyNameWithMemberId & rOutProperty ) const
 {
+    if (nWhichId == SCHATTR_COLOR_PALETTE)
+    {
+        return false;
+    }
+
     ItemPropertyMapType::const_iterator aEndIt;
     ItemPropertyMapType::const_iterator aIt;
 
@@ -742,6 +753,15 @@ bool GraphicPropertyItemConverter::ApplySpecialItem(
                 }
             }
             break;
+        case SCHATTR_COLOR_PALETTE:
+        {
+            const auto& rItem = static_cast<const 
SvxChartColorPaletteItem&>(rItemSet.Get(nWhichId));
+            m_xChartModel->setColorPalette(rItem.GetType(), rItem.GetIndex());
+            const auto oColorPalette = m_xChartModel->getCurrentColorPalette();
+            if (oColorPalette)
+                m_xChartModel->applyColorPaletteToDataSeries(*oColorPalette);
+        }
+        break;
     }
 
     return bChanged;
diff --git a/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx 
b/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
index 676527f3fef3..8216c4b32337 100644
--- a/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
+++ b/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
@@ -59,6 +59,7 @@ const WhichRangesContainer nGridWhichPairs(svl::Items<
 
 const WhichRangesContainer nLegendWhichPairs(svl::Items<
     SCHATTR_LEGEND_START, SCHATTR_LEGEND_END,       //     3 -     3  
sch/schattr.hxx
+    SCHATTR_COLOR_PALETTE_START, SCHATTR_COLOR_PALETTE_END, // 107 - 107
     XATTR_LINE_FIRST, XATTR_LINE_LAST,              //  1000 -  1016  
svx/xdef.hxx
     XATTR_FILL_FIRST, XATTR_FILL_LAST,              //  1018 -  1046  
svx/xdef.hxx
     SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST,      //  1067 -  1078  
svx/svddef.hxx
@@ -121,6 +122,7 @@ const WhichRangesContainer nRowWhichPairs(svl::Items<
     SCHATTR_HIDE_DATA_POINT_LEGEND_ENTRY, SCHATTR_HIDE_DATA_POINT_LEGEND_ENTRY,
     SCHATTR_BAR_OVERLAP,SCHATTR_BAR_CONNECT,         /*    98 - 100 (incl. 
SCHATTR_GAPWIDTH) */
     SCHATTR_GROUP_BARS_PER_AXIS,SCHATTR_AXIS_FOR_ALL_SERIES,
+    SCHATTR_COLOR_PALETTE_START, SCHATTR_COLOR_PALETTE_END, // 107 - 107
     XATTR_LINE_FIRST, XATTR_LINE_LAST,              /*  1000 -  1016  
svx/xdef.hxx   */
     XATTR_FILL_FIRST, XATTR_FILL_LAST,              /*  1018 -  1046  
svx/xdef.hxx   */
     SDRATTR_3D_FIRST, SDRATTR_3D_LAST,              /*  1244 -  1334  
svx/svddef.hxx */
@@ -152,6 +154,7 @@ const WhichRangesContainer 
nLinePropertyWhichPairs(svl::Items<
 >);
 
 const WhichRangesContainer nLineAndFillPropertyWhichPairs(svl::Items<
+    SCHATTR_COLOR_PALETTE_START, SCHATTR_COLOR_PALETTE_END, // 107 - 107
     XATTR_LINE_FIRST, XATTR_LINE_LAST,              //  1000 -  1016  
svx/xdef.hxx
     XATTR_FILL_FIRST, XATTR_FILL_LAST,              //  1000 -  1016  
svx/xdef.hxx
     SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST      //  1067 -  1078  
svx/svddef.hxx
diff --git a/chart2/source/inc/chartview/ChartSfxItemIds.hxx 
b/chart2/source/inc/chartview/ChartSfxItemIds.hxx
index 7ddcf432cb1e..43341728d4da 100644
--- a/chart2/source/inc/chartview/ChartSfxItemIds.hxx
+++ b/chart2/source/inc/chartview/ChartSfxItemIds.hxx
@@ -33,6 +33,7 @@ class SvxChartKindErrorItem;
 class SvxChartTextOrderItem;
 class SvxChartRegressItem;
 class SdrAngleItem;
+class SvxChartColorPaletteItem;
 
 // SCHATTR
 
@@ -201,7 +202,11 @@ inline constexpr TypedWhichId<SfxBoolItem>         
SCHATTR_DATA_TABLE_OUTLINE
 inline constexpr TypedWhichId<SfxBoolItem>         SCHATTR_DATA_TABLE_KEYS     
            (SCHATTR_DATA_TABLE_START + 3);
 inline constexpr sal_uInt16                        SCHATTR_DATA_TABLE_END      
            (SCHATTR_DATA_TABLE_KEYS);
 
-inline constexpr sal_uInt16 SCHATTR_END (SCHATTR_DATA_TABLE_END);
+inline constexpr sal_uInt16                             
SCHATTR_COLOR_PALETTE_START        (SCHATTR_DATA_TABLE_END + 1);
+inline constexpr TypedWhichId<SvxChartColorPaletteItem> SCHATTR_COLOR_PALETTE  
            (SCHATTR_COLOR_PALETTE_START);
+inline constexpr sal_uInt16                             
SCHATTR_COLOR_PALETTE_END          (SCHATTR_COLOR_PALETTE);
+
+inline constexpr sal_uInt16 SCHATTR_END (SCHATTR_COLOR_PALETTE_END);
 
 // values for Items
 
diff --git a/chart2/source/view/main/ChartItemPool.cxx 
b/chart2/source/view/main/ChartItemPool.cxx
index 1a46a041fb17..84903cd42609 100644
--- a/chart2/source/view/main/ChartItemPool.cxx
+++ b/chart2/source/view/main/ChartItemPool.cxx
@@ -27,6 +27,7 @@
 #include <svx/sdangitm.hxx>
 #include <svx/svdpool.hxx>
 #include <svx/svx3ditems.hxx>
+#include <svx/ChartColorPaletteType.hxx>
 #include <svl/intitem.hxx>
 #include <editeng/editeng.hxx>
 #include <editeng/brushitem.hxx>
@@ -179,7 +180,9 @@ static ItemInfoPackage& getItemInfoPackageChart()
             { SCHATTR_DATA_TABLE_HORIZONTAL_BORDER, new 
SfxBoolItem(SCHATTR_DATA_TABLE_HORIZONTAL_BORDER, false), 0, 
SFX_ITEMINFOFLAG_NONE },
             { SCHATTR_DATA_TABLE_VERTICAL_BORDER, new 
SfxBoolItem(SCHATTR_DATA_TABLE_VERTICAL_BORDER, false), 0, 
SFX_ITEMINFOFLAG_NONE },
             { SCHATTR_DATA_TABLE_OUTLINE, new 
SfxBoolItem(SCHATTR_DATA_TABLE_OUTLINE, false), 0, SFX_ITEMINFOFLAG_NONE },
-            { SCHATTR_DATA_TABLE_KEYS, new 
SfxBoolItem(SCHATTR_DATA_TABLE_KEYS, false), 0, SFX_ITEMINFOFLAG_NONE }
+            { SCHATTR_DATA_TABLE_KEYS, new 
SfxBoolItem(SCHATTR_DATA_TABLE_KEYS, false), 0, SFX_ITEMINFOFLAG_NONE },
+            { SCHATTR_COLOR_PALETTE, new 
SvxChartColorPaletteItem(ChartColorPaletteType::Unknown, 0, 
SCHATTR_COLOR_PALETTE), 0, SFX_ITEMINFOFLAG_NONE }
+
         }};
 
         virtual const ItemInfoStatic& getItemInfoStatic(size_t nIndex) const 
override { return maItemInfos[nIndex]; }
diff --git a/chart2/uiconfig/ui/tp_ChartColorPalette.ui 
b/chart2/uiconfig/ui/tp_ChartColorPalette.ui
new file mode 100644
index 000000000000..3fb233011922
--- /dev/null
+++ b/chart2/uiconfig/ui/tp_ChartColorPalette.ui
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.40.0 -->
+<interface domain="chart">
+  <requires lib="gtk+" version="3.20"/>
+  <object class="GtkBox" id="tp_ChartColorPalette">
+    <property name="visible">True</property>
+    <property name="can-focus">False</property>
+    <property name="margin-top">4</property>
+    <property name="margin-bottom">4</property>
+    <property name="spacing">16</property>
+    <child>
+      <object class="GtkFrame" id="FL_COLORFUL">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="margin-start">4</property>
+        <property name="margin-end">4</property>
+        <property name="margin-top">3</property>
+        <property name="label-xalign">0</property>
+        <property name="shadow-type">none</property>
+        <child>
+          <object class="GtkScrolledWindow" id="colorfulwin">
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="valign">start</property>
+            <property name="shadow-type">in</property>
+            <child>
+              <object class="GtkViewport">
+                <property name="visible">True</property>
+                <property name="can-focus">False</property>
+                <property name="valign">start</property>
+                <child>
+                  <object class="GtkDrawingArea" id="colorful_palettes">
+                    <property name="visible">True</property>
+                    <property name="can-focus">False</property>
+                    <property name="valign">start</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child type="label">
+          <object class="GtkLabel" id="LBL_COLORFUL">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="margin-bottom">2</property>
+            <property name="label" translatable="yes" 
context="tp_ChartColorPalette|colorfulwin">Colorful</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="padding">8</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkFrame" id="FL_MONOCHROMATIC">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="margin-start">4</property>
+        <property name="margin-end">4</property>
+        <property name="margin-top">3</property>
+        <property name="label-xalign">0</property>
+        <property name="shadow-type">none</property>
+        <child>
+          <object class="GtkScrolledWindow" id="monochromaticwin">
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="valign">start</property>
+            <property name="shadow-type">in</property>
+            <child>
+              <object class="GtkViewport">
+                <property name="visible">True</property>
+                <property name="can-focus">False</property>
+                <property name="valign">start</property>
+                <child>
+                  <object class="GtkDrawingArea" id="monochromatic_palettes">
+                    <property name="visible">True</property>
+                    <property name="can-focus">False</property>
+                    <property name="valign">start</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child type="label">
+          <object class="GtkLabel" id="LBL_MONOCHROMATIC">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="margin-bottom">2</property>
+            <property name="label" translatable="yes" 
context="tp_ChartColorPalette|monochromaticwin">Monochromatic</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="padding">8</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/include/svl/poolitem.hxx b/include/svl/poolitem.hxx
index a2f98c57b0b8..f939279cd89e 100644
--- a/include/svl/poolitem.hxx
+++ b/include/svl/poolitem.hxx
@@ -322,6 +322,7 @@ enum class SfxItemType : sal_uInt16
     SvxCharReliefItemType,
     SvxCharRotateItemType,
     SvxCharScaleWidthItemType,
+    SvxChartColorPaletteItemType,
     SvxChartColorTableItemType,
     SvxChartIndicateItemType,
     SvxChartKindErrorItemType,
diff --git a/include/svx/chrtitem.hxx b/include/svx/chrtitem.hxx
index 77f65646d02a..f999bd290c20 100644
--- a/include/svx/chrtitem.hxx
+++ b/include/svx/chrtitem.hxx
@@ -26,6 +26,7 @@
 #include <svl/poolitem.hxx>
 #include <svx/svxdllapi.h>
 
+enum class ChartColorPaletteType: sal_Int32;
 class IntlWrapper;
 class SfxItemPool;
 
@@ -153,6 +154,35 @@ public:
     double GetValue() const { return fVal; }
 };
 
+class SAL_WARN_UNUSED SVXCORE_DLLPUBLIC SvxChartColorPaletteItem final : 
public SfxPoolItem
+{
+    ChartColorPaletteType meType;
+    sal_uInt32 mnIndex;
+
+public:
+    static SfxPoolItem* CreateDefault();
+    DECLARE_ITEM_TYPE_FUNCTION(SvxChartColorPaletteItem);
+    SvxChartColorPaletteItem(ChartColorPaletteType eType, sal_uInt32 nIndex,
+                             TypedWhichId<SvxChartColorPaletteItem> nId);
+    SvxChartColorPaletteItem(const SvxChartColorPaletteItem& rItem);
+
+    virtual bool QueryValue(css::uno::Any& rVal, sal_uInt8 nMemberId = 0) 
const override;
+    virtual bool PutValue(const css::uno::Any& rVal, sal_uInt8 nMemberId) 
override;
+
+    virtual bool GetPresentation(SfxItemPresentation ePres, MapUnit 
eCoreMetric,
+                                 MapUnit ePresMetric, OUString& rText,
+                                 const IntlWrapper&) const override;
+
+    virtual bool operator==(const SfxPoolItem& rItem) const override;
+    virtual SvxChartColorPaletteItem* Clone(SfxItemPool* pPool = nullptr) 
const override;
+
+    ChartColorPaletteType GetType() const { return meType; }
+    sal_uInt32 GetIndex() const { return mnIndex; }
+
+    void SetType(const ChartColorPaletteType eType) { meType = eType; }
+    void SetIndex(const sal_uInt32 nIndex) { mnIndex = nIndex; }
+};
+
 #endif // INCLUDED_SVX_CHRTITEM_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/svx/unomid.hxx b/include/svx/unomid.hxx
index 766996a57ac0..0af529c5797d 100644
--- a/include/svx/unomid.hxx
+++ b/include/svx/unomid.hxx
@@ -93,6 +93,10 @@
 
 #define MID_LEFT                    3
 
+// SvxChartColorPaletteItem
+#define MID_CHART_COLOR_PALETTE_TYPE 0
+#define MID_CHART_COLOR_PALETTE_INDEX 1
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/items/chrtitem.cxx b/svx/source/items/chrtitem.cxx
index 44a7631910dd..4dcab21c4c58 100644
--- a/svx/source/items/chrtitem.cxx
+++ b/svx/source/items/chrtitem.cxx
@@ -22,7 +22,10 @@
 #include <unotools/localedatawrapper.hxx>
 #include <com/sun/star/chart/ChartAxisArrangeOrderType.hpp>
 #include <o3tl/hash_combine.hxx>
+
+#include <svx/ChartColorPaletteType.hxx>
 #include <svx/chrtitem.hxx>
+#include <svx/unomid.hxx>
 
 using namespace ::com::sun::star;
 
@@ -176,4 +179,89 @@ SvxChartRegressItem* 
SvxChartRegressItem::Clone(SfxItemPool* /*pPool*/) const
     return new SvxChartRegressItem(*this);
 }
 
+// SvxChartColorPaletteItem implementation
+
+SfxPoolItem* SvxChartColorPaletteItem::CreateDefault()
+{
+    return new SvxChartColorPaletteItem(ChartColorPaletteType::Unknown, 0,
+                                        
TypedWhichId<SvxChartColorPaletteItem>(0));
+}
+
+SvxChartColorPaletteItem::SvxChartColorPaletteItem(const ChartColorPaletteType 
eType,
+                                                   const sal_uInt32 nIndex,
+                                                   const 
TypedWhichId<SvxChartColorPaletteItem> nId)
+    : SfxPoolItem(nId)
+    , meType(eType)
+    , mnIndex(nIndex)
+{
+}
+
+SvxChartColorPaletteItem::SvxChartColorPaletteItem(const 
SvxChartColorPaletteItem& rItem)
+    : SfxPoolItem(rItem)
+    , meType(rItem.meType)
+    , mnIndex(rItem.mnIndex)
+{
+}
+
+bool SvxChartColorPaletteItem::QueryValue(uno::Any& rVal, const sal_uInt8 
nMemberId) const
+{
+    if (nMemberId == MID_CHART_COLOR_PALETTE_TYPE)
+    {
+        rVal <<= static_cast<sal_Int32>(meType);
+        return true;
+    }
+    if (nMemberId == MID_CHART_COLOR_PALETTE_INDEX)
+    {
+        rVal <<= mnIndex;
+        return true;
+    }
+    return false;
+}
+
+bool SvxChartColorPaletteItem::PutValue(const uno::Any& rVal, const sal_uInt8 
nMemberId)
+{
+    if (nMemberId == MID_CHART_COLOR_PALETTE_TYPE)
+    {
+        sal_Int32 nType = -1;
+        rVal >>= nType;
+        meType = static_cast<ChartColorPaletteType>(nType);
+        return true;
+    }
+    if (nMemberId == MID_CHART_COLOR_PALETTE_INDEX)
+    {
+        rVal >>= mnIndex;
+        return true;
+    }
+    return false;
+}
+
+bool SvxChartColorPaletteItem::GetPresentation(SfxItemPresentation /*ePres*/,
+                                               MapUnit /*eCoreMetric*/, 
MapUnit /*ePresMetric*/,
+                                               OUString& rText, const 
IntlWrapper&) const
+{
+    if (meType == ChartColorPaletteType::Colorful)
+        rText = u"Colorful"_ustr;
+    else if (meType == ChartColorPaletteType::Monochromatic)
+        rText = u"Monochromatic"_ustr;
+    else
+        rText = u"Unknown"_ustr;
+
+    rText += u" "_ustr;
+    rText += OUString::number(mnIndex);
+
+    return true;
+}
+
+bool SvxChartColorPaletteItem::operator==(const SfxPoolItem& rItem) const
+{
+    assert(SfxPoolItem::operator==(rItem));
+    const auto& rOther = static_cast<const SvxChartColorPaletteItem&>(rItem);
+    return (meType == rOther.meType && mnIndex == rOther.mnIndex);
+}
+
+SvxChartColorPaletteItem* SvxChartColorPaletteItem::Clone(SfxItemPool* 
/*pPool*/) const
+{
+    return new SvxChartColorPaletteItem(*this);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/jsdialog/enabled.cxx b/vcl/jsdialog/enabled.cxx
index 8a817ad8833f..b7ca603dd6e8 100644
--- a/vcl/jsdialog/enabled.cxx
+++ b/vcl/jsdialog/enabled.cxx
@@ -285,6 +285,7 @@ constexpr auto SchartDialogList
         { u"modules/schart/ui/inserttitledlg.ui" },
         { u"modules/schart/ui/smoothlinesdlg.ui" },
         { u"modules/schart/ui/steppedlinesdlg.ui" },
+        { u"modules/schart/ui/tp_ChartColorPalette.ui" },
         { u"modules/schart/ui/tp_ChartType.ui" },
         { u"modules/schart/ui/tp_DataLabel.ui" },
         { u"modules/schart/ui/tp_DataSource.ui" },

Reply via email to