chart2/source/controller/dialogs/tp_ChartColorPalette.cxx     |   73 ++---
 chart2/source/controller/dialogs/tp_ChartColorPalette.hxx     |   12 
 chart2/source/controller/sidebar/ChartColorPaletteControl.cxx |  127 ++++++----
 chart2/source/controller/sidebar/ChartColorPaletteControl.hxx |   30 +-
 chart2/source/controller/sidebar/ChartColorsPanel.cxx         |   23 +
 chart2/source/inc/ChartColorPalettes.hxx                      |   40 ++-
 chart2/source/tools/ChartColorPalettes.cxx                    |   97 ++++++-
 chart2/uiconfig/ui/chartcolorpalettepopup.ui                  |   81 ++++--
 chart2/uiconfig/ui/tp_ChartColorPalette.ui                    |   72 ++++-
 9 files changed, 386 insertions(+), 169 deletions(-)

New commits:
commit a26c93a6305bed437ab505713950858893db519d
Author:     Marco Cecchetti <marco.cecche...@collabora.com>
AuthorDate: Sun Aug 10 22:33:37 2025 +0200
Commit:     Marco Cecchetti <marco.cecche...@collabora.com>
CommitDate: Sun Aug 24 23:21:59 2025 +0200

    chart color palettes: switch from drawingarea to IconView
    
    Change-Id: Ie57acb02473ed5f51c4a2b969786418f6630bfb3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189536
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190037
    Tested-by: Jenkins
    Reviewed-by: Marco Cecchetti <marco.cecche...@collabora.com>

diff --git a/chart2/source/controller/dialogs/tp_ChartColorPalette.cxx 
b/chart2/source/controller/dialogs/tp_ChartColorPalette.cxx
index c52148c9dc17..fd5af1885ace 100644
--- a/chart2/source/controller/dialogs/tp_ChartColorPalette.cxx
+++ b/chart2/source/controller/dialogs/tp_ChartColorPalette.cxx
@@ -32,35 +32,20 @@ 
ChartColorPaletteTabPage::ChartColorPaletteTabPage(weld::Container* pPage,
                                                    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))
+    , mxColorfulPalettes(new ChartColorPalettes(*m_xBuilder, 
"colorful_palettes", "colorfulwin"))
+    , mxMonoPalettes(
+          new ChartColorPalettes(*m_xBuilder, "monochromatic_palettes", 
"monochromaticwin"))
 {
-    mxColorfulValueSet->SetColCount(2);
-    mxColorfulValueSet->SetLineCount(2);
-    
mxColorfulValueSet->SetColor(Application::GetSettings().GetStyleSettings().GetFaceColor());
+    mxColorfulPalettes->SetSelectHdl(
+        LINK(this, ChartColorPaletteTabPage, SelectColorfulPaletteHdl));
 
-    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));
+    mxMonoPalettes->SetSelectHdl(LINK(this, ChartColorPaletteTabPage, 
SelectMonoPaletteHdl));
 }
 
 ChartColorPaletteTabPage::~ChartColorPaletteTabPage()
 {
-    mxColorfulValueSetWin.reset();
-    mxColorfulValueSet.reset();
-    mxMonoValueSetWin.reset();
-    mxMonoValueSet.reset();
+    mxColorfulPalettes.reset();
+    mxMonoPalettes.reset();
 }
 
 std::unique_ptr<SfxTabPage> ChartColorPaletteTabPage::Create(weld::Container* 
pPage,
@@ -88,10 +73,12 @@ void ChartColorPaletteTabPage::initColorPalettes() const
         return;
     // colorful palettes
     for (size_t i = 0; i < ChartColorPaletteHelper::ColorfulPaletteSize; ++i)
-        
mxColorfulValueSet->insert(mxHelper->getColorPalette(ChartColorPaletteType::Colorful,
 i));
+        
mxColorfulPalettes->insert(mxHelper->getColorPalette(ChartColorPaletteType::Colorful,
 i));
+    mxColorfulPalettes->Fill();
     // monotonic palettes
     for (size_t i = 0; i < ChartColorPaletteHelper::MonotonicPaletteSize; ++i)
-        
mxMonoValueSet->insert(mxHelper->getColorPalette(ChartColorPaletteType::Monochromatic,
 i));
+        
mxMonoPalettes->insert(mxHelper->getColorPalette(ChartColorPaletteType::Monochromatic,
 i));
+    mxMonoPalettes->Fill();
 }
 
 void ChartColorPaletteTabPage::selectItem(const ChartColorPaletteType eType,
@@ -101,16 +88,16 @@ void ChartColorPaletteTabPage::selectItem(const 
ChartColorPaletteType eType,
     {
         default:
         case ChartColorPaletteType::Unknown:
-            mxColorfulValueSet->SetNoSelection();
-            mxMonoValueSet->SetNoSelection();
+            mxColorfulPalettes->SetNoSelection();
+            mxMonoPalettes->SetNoSelection();
             break;
         case ChartColorPaletteType::Colorful:
-            mxMonoValueSet->SetNoSelection();
-            mxColorfulValueSet->SelectItem(nIndex);
+            mxMonoPalettes->SetNoSelection();
+            mxColorfulPalettes->SelectItem(nIndex);
             break;
         case ChartColorPaletteType::Monochromatic:
-            mxColorfulValueSet->SetNoSelection();
-            mxMonoValueSet->SelectItem(nIndex);
+            mxColorfulPalettes->SetNoSelection();
+            mxMonoPalettes->SelectItem(nIndex);
             break;
     }
 }
@@ -120,15 +107,15 @@ bool ChartColorPaletteTabPage::FillItemSet(SfxItemSet* 
pOutAttrs)
     ChartColorPaletteType eType = ChartColorPaletteType::Unknown;
     sal_uInt32 nIndex = 0;
 
-    if (!mxColorfulValueSet->IsNoSelection())
+    if (!mxColorfulPalettes->IsNoSelection())
     {
         eType = ChartColorPaletteType::Colorful;
-        nIndex = mxColorfulValueSet->GetSelectedItemId() - 1;
+        nIndex = mxColorfulPalettes->GetSelectedItemId() - 1;
     }
-    else if (!mxMonoValueSet->IsNoSelection())
+    else if (!mxMonoPalettes->IsNoSelection())
     {
         eType = ChartColorPaletteType::Monochromatic;
-        nIndex = mxMonoValueSet->GetSelectedItemId() - 1;
+        nIndex = mxMonoPalettes->GetSelectedItemId() - 1;
     }
 
     pOutAttrs->Put(SvxChartColorPaletteItem(eType, nIndex, 
SCHATTR_COLOR_PALETTE));
@@ -149,26 +136,28 @@ DeactivateRC 
ChartColorPaletteTabPage::DeactivatePage(SfxItemSet* pItemSet)
     return DeactivateRC::LeavePage;
 }
 
-IMPL_LINK_NOARG(ChartColorPaletteTabPage, SelectColorfulValueSetHdl, 
ValueSet*, void)
+IMPL_LINK_NOARG(ChartColorPaletteTabPage, SelectColorfulPaletteHdl, 
weld::IconView&, bool)
 {
-    sal_uInt32 nIndex = SelectValueSetHdl(mxColorfulValueSet);
+    sal_uInt32 nIndex = SelectPaletteHdl(mxColorfulPalettes);
     if (nIndex != static_cast<sal_uInt32>(-1))
     {
-        mxMonoValueSet->SetNoSelection();
+        mxMonoPalettes->SetNoSelection();
     }
+    return true;
 }
 
-IMPL_LINK_NOARG(ChartColorPaletteTabPage, SelectMonoValueSetHdl, ValueSet*, 
void)
+IMPL_LINK_NOARG(ChartColorPaletteTabPage, SelectMonoPaletteHdl, 
weld::IconView&, bool)
 {
-    sal_uInt32 nIndex = SelectValueSetHdl(mxMonoValueSet);
+    sal_uInt32 nIndex = SelectPaletteHdl(mxMonoPalettes);
     if (nIndex != static_cast<sal_uInt32>(-1))
     {
-        mxColorfulValueSet->SetNoSelection();
+        mxColorfulPalettes->SetNoSelection();
     }
+    return true;
 }
 
 sal_uInt32
-ChartColorPaletteTabPage::SelectValueSetHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet)
+ChartColorPaletteTabPage::SelectPaletteHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet)
 {
     const sal_uInt32 nItemId = xValueSet->GetSelectedItemId();
 
diff --git a/chart2/source/controller/dialogs/tp_ChartColorPalette.hxx 
b/chart2/source/controller/dialogs/tp_ChartColorPalette.hxx
index 53ea633585a6..7f24977f6464 100644
--- a/chart2/source/controller/dialogs/tp_ChartColorPalette.hxx
+++ b/chart2/source/controller/dialogs/tp_ChartColorPalette.hxx
@@ -52,14 +52,12 @@ private:
 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;
+    std::unique_ptr<ChartColorPalettes> mxColorfulPalettes;
+    std::unique_ptr<ChartColorPalettes> mxMonoPalettes;
 
-    DECL_LINK(SelectColorfulValueSetHdl, ValueSet*, void);
-    DECL_LINK(SelectMonoValueSetHdl, ValueSet*, void);
-    static sal_uInt32 SelectValueSetHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet);
+    DECL_LINK(SelectColorfulPaletteHdl, weld::IconView&, bool);
+    DECL_LINK(SelectMonoPaletteHdl, weld::IconView&, bool);
+    static sal_uInt32 SelectPaletteHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet);
 };
 } //namespace chart
 
diff --git a/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx 
b/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx
index ae055f942e9b..477728f39259 100644
--- a/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx
+++ b/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx
@@ -244,34 +244,21 @@ 
ChartColorPalettePopup::ChartColorPalettePopup(ChartColorPaletteControl* pContro
     : WeldToolbarPopup(pControl->getFrameInterface(), pParent,
                        "modules/schart/ui/chartcolorpalettepopup.ui", 
"ColorPaletteWindow")
     , mxControl(pControl)
-    , mxColorfulValueSet(new ChartColorPalettes)
-    , mxColorfulValueSetWin(
-          new weld::CustomWeld(*m_xBuilder, "colorful_palettes", 
*mxColorfulValueSet))
-    , mxMonoValueSet(new ChartColorPalettes)
-    , mxMonoValueSetWin(
-          new weld::CustomWeld(*m_xBuilder, "monochromatic_palettes", 
*mxMonoValueSet))
+    , mxColorfulPalettes(new ChartColorPalettes(*m_xBuilder, 
"colorful_palettes", "colorfulwin"))
+    , mxMonoPalettes(
+          new ChartColorPalettes(*m_xBuilder, "monochromatic_palettes", 
"monochromaticwin"))
     , meHighlightedItemType(mxControl->getColorPaletteType())
     , mnHighlightedItemId(mxControl->getColorPaletteIndex())
     , mbItemSelected(false)
 {
-    mxColorfulValueSet->SetColCount(2);
-    mxColorfulValueSet->SetLineCount(2);
-    
mxColorfulValueSet->SetColor(Application::GetSettings().GetStyleSettings().GetFaceColor());
+    mxColorfulPalettes->SetSelectHdl(LINK(this, ChartColorPalettePopup, 
SelectColorfulPaletteHdl));
+    mxColorfulPalettes->setMouseMoveHdl(LINK(this, ChartColorPalettePopup, 
ColorfulMouseMoveHdl));
 
-    mxMonoValueSet->SetColCount(2);
-    mxMonoValueSet->SetLineCount(3);
-    
mxMonoValueSet->SetColor(Application::GetSettings().GetStyleSettings().GetFaceColor());
+    mxMonoPalettes->SetSelectHdl(LINK(this, ChartColorPalettePopup, 
SelectMonoPaletteHdl));
+    mxMonoPalettes->setMouseMoveHdl(LINK(this, ChartColorPalettePopup, 
MonoMouseMoveHdl));
 
     initColorPalettes();
 
-    mxColorfulValueSet->SetOptimalSize();
-    mxColorfulValueSet->SetSelectHdl(LINK(this, ChartColorPalettePopup, 
SelectColorfulValueSetHdl));
-    mxColorfulValueSet->setMouseMoveHdl(LINK(this, ChartColorPalettePopup, 
ColorfulMouseMoveHdl));
-
-    mxMonoValueSet->SetOptimalSize();
-    mxMonoValueSet->SetSelectHdl(LINK(this, ChartColorPalettePopup, 
SelectMonoValueSetHdl));
-    mxMonoValueSet->setMouseMoveHdl(LINK(this, ChartColorPalettePopup, 
MonoMouseMoveHdl));
-
     selectItem(mxControl->getColorPaletteType(), 
mxControl->getColorPaletteIndex() + 1);
 
     mxControl->createDiagramSnapshot();
@@ -290,14 +277,14 @@ void ChartColorPalettePopup::selectItem(const 
ChartColorPaletteType eType,
     {
         default:
         case ChartColorPaletteType::Unknown:
-            mxColorfulValueSet->SetNoSelection();
-            mxMonoValueSet->SetNoSelection();
+            mxColorfulPalettes->SetNoSelection();
+            mxMonoPalettes->SetNoSelection();
             break;
         case ChartColorPaletteType::Colorful:
-            mxColorfulValueSet->SelectItem(nIndex);
+            mxColorfulPalettes->SelectItem(nIndex);
             break;
         case ChartColorPaletteType::Monochromatic:
-            mxMonoValueSet->SelectItem(nIndex);
+            mxMonoPalettes->SelectItem(nIndex);
             break;
     }
 }
@@ -309,57 +296,60 @@ void ChartColorPalettePopup::initColorPalettes() const
         return;
     // colorful palettes
     for (size_t i = 0; i < ChartColorPaletteHelper::ColorfulPaletteSize; ++i)
-        mxColorfulValueSet->insert(
+        mxColorfulPalettes->insert(
             
pColorPaletteHelper->getColorPalette(ChartColorPaletteType::Colorful, i));
+    mxColorfulPalettes->Fill();
     // monotonic palettes
     for (size_t i = 0; i < ChartColorPaletteHelper::MonotonicPaletteSize; ++i)
-        mxMonoValueSet->insert(
+        mxMonoPalettes->insert(
             
pColorPaletteHelper->getColorPalette(ChartColorPaletteType::Monochromatic, i));
+    mxMonoPalettes->Fill();
 }
 
 void ChartColorPalettePopup::GrabFocus()
 {
-    if (mxMonoValueSet->IsNoSelection())
-        mxColorfulValueSet->GrabFocus();
+    if (mxMonoPalettes->IsNoSelection())
+        mxColorfulPalettes->GrabFocus();
     else
-        mxMonoValueSet->GrabFocus();
+        mxMonoPalettes->GrabFocus();
 }
 
-IMPL_LINK_NOARG(ChartColorPalettePopup, SelectColorfulValueSetHdl, ValueSet*, 
void)
+IMPL_LINK_NOARG(ChartColorPalettePopup, SelectColorfulPaletteHdl, 
weld::IconView&, bool)
 {
-    sal_uInt32 nIndex = SelectValueSetHdl(mxColorfulValueSet);
+    sal_uInt32 nIndex = SelectPaletteHdl(mxColorfulPalettes);
     if (nIndex != static_cast<sal_uInt32>(-1))
     {
         
mxControl->dispatchColorPaletteCommand(ChartColorPaletteType::Colorful, nIndex);
-        mxMonoValueSet->SetNoSelection();
+        mxMonoPalettes->SetNoSelection();
         mxControl->updateStatus();
     }
     mxControl->EndPopupMode();
+    return true;
 }
 
-IMPL_LINK_NOARG(ChartColorPalettePopup, SelectMonoValueSetHdl, ValueSet*, void)
+IMPL_LINK_NOARG(ChartColorPalettePopup, SelectMonoPaletteHdl, weld::IconView&, 
bool)
 {
-    sal_uInt32 nIndex = SelectValueSetHdl(mxMonoValueSet);
+    sal_uInt32 nIndex = SelectPaletteHdl(mxMonoPalettes);
     if (nIndex != static_cast<sal_uInt32>(-1))
     {
         
mxControl->dispatchColorPaletteCommand(ChartColorPaletteType::Monochromatic, 
nIndex);
-        mxColorfulValueSet->SetNoSelection();
+        mxColorfulPalettes->SetNoSelection();
         mxControl->updateStatus();
     }
     mxControl->EndPopupMode();
+    return true;
 }
 
 sal_uInt32
-ChartColorPalettePopup::SelectValueSetHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet)
+ChartColorPalettePopup::SelectPaletteHdl(const 
std::unique_ptr<ChartColorPalettes>& xPalettes)
 {
-    const sal_uInt32 nItemId = xValueSet->GetSelectedItemId();
-
+    const sal_uInt32 nItemId = xPalettes->GetSelectedItemId();
     if (!nItemId)
         return static_cast<sal_uInt32>(-1);
 
     const sal_uInt32 nIndex = nItemId - 1;
 
-    if (const ChartColorPalette* pPalette = xValueSet->getPalette(nIndex))
+    if (const ChartColorPalette* pPalette = xPalettes->getPalette(nIndex))
     {
         mxControl->applyColorPalette(pPalette);
         mbItemSelected = true;
@@ -368,26 +358,28 @@ ChartColorPalettePopup::SelectValueSetHdl(const 
std::unique_ptr<ChartColorPalett
     return static_cast<sal_uInt32>(-1);
 }
 
-IMPL_LINK_NOARG(ChartColorPalettePopup, ColorfulMouseMoveHdl, const 
MouseEvent&, void)
+IMPL_LINK_NOARG(ChartColorPalettePopup, ColorfulMouseMoveHdl, const 
MouseEvent&, bool)
 {
-    MouseMoveHdl(mxColorfulValueSet, ChartColorPaletteType::Colorful);
+    MouseMoveHdl(mxColorfulPalettes, ChartColorPaletteType::Colorful);
+    return true;
 }
 
-IMPL_LINK_NOARG(ChartColorPalettePopup, MonoMouseMoveHdl, const MouseEvent&, 
void)
+IMPL_LINK_NOARG(ChartColorPalettePopup, MonoMouseMoveHdl, const MouseEvent&, 
bool)
 {
-    MouseMoveHdl(mxMonoValueSet, ChartColorPaletteType::Monochromatic);
+    MouseMoveHdl(mxMonoPalettes, ChartColorPaletteType::Monochromatic);
+    return true;
 }
 
-void ChartColorPalettePopup::MouseMoveHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet,
+void ChartColorPalettePopup::MouseMoveHdl(const 
std::unique_ptr<ChartColorPalettes>& xPalettes,
                                           const ChartColorPaletteType 
eHlItemType)
 {
-    const sal_uInt16 nHlId = xValueSet->GetHighlightedItemId();
+    const sal_uInt16 nHlId = xPalettes->GetHighlightedItemId();
     if (eHlItemType == meHighlightedItemType && nHlId == mnHighlightedItemId)
         return;
 
     if (nHlId > 0)
     {
-        if (const ChartColorPalette* pPalette = xValueSet->getPalette(nHlId - 
1))
+        if (const ChartColorPalette* pPalette = xPalettes->getPalette(nHlId - 
1))
         {
             mxControl->applyColorPalette(pPalette);
         }
diff --git a/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx 
b/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx
index ad243f5c860b..6eb656716480 100644
--- a/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx
+++ b/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx
@@ -77,22 +77,20 @@ private:
 class ChartColorPalettePopup final : public WeldToolbarPopup
 {
     rtl::Reference<ChartColorPaletteControl> mxControl;
-    std::unique_ptr<ChartColorPalettes> mxColorfulValueSet;
-    std::unique_ptr<weld::CustomWeld> mxColorfulValueSetWin;
-    std::unique_ptr<ChartColorPalettes> mxMonoValueSet;
-    std::unique_ptr<weld::CustomWeld> mxMonoValueSetWin;
+    std::unique_ptr<ChartColorPalettes> mxColorfulPalettes;
+    std::unique_ptr<ChartColorPalettes> mxMonoPalettes;
 
     ChartColorPaletteType meHighlightedItemType;
     sal_uInt16 mnHighlightedItemId;
     bool mbItemSelected;
 
-    DECL_LINK(SelectColorfulValueSetHdl, ValueSet*, void);
-    DECL_LINK(SelectMonoValueSetHdl, ValueSet*, void);
-    sal_uInt32 SelectValueSetHdl(const std::unique_ptr<ChartColorPalettes>& 
xValueSet);
+    DECL_LINK(SelectColorfulPaletteHdl, weld::IconView&, bool);
+    DECL_LINK(SelectMonoPaletteHdl, weld::IconView&, bool);
+    sal_uInt32 SelectPaletteHdl(const std::unique_ptr<ChartColorPalettes>& 
xPalettes);
 
-    DECL_LINK(ColorfulMouseMoveHdl, const MouseEvent&, void);
-    DECL_LINK(MonoMouseMoveHdl, const MouseEvent&, void);
-    void MouseMoveHdl(const std::unique_ptr<ChartColorPalettes>& xValueSet,
+    DECL_LINK(ColorfulMouseMoveHdl, const MouseEvent&, bool);
+    DECL_LINK(MonoMouseMoveHdl, const MouseEvent&, bool);
+    void MouseMoveHdl(const std::unique_ptr<ChartColorPalettes>& xPalettes,
                       ChartColorPaletteType eHlItemType);
 
     void GrabFocus() override;
diff --git a/chart2/source/inc/ChartColorPalettes.hxx 
b/chart2/source/inc/ChartColorPalettes.hxx
index 4af31653597b..b14e773c6193 100644
--- a/chart2/source/inc/ChartColorPalettes.hxx
+++ b/chart2/source/inc/ChartColorPalettes.hxx
@@ -10,34 +10,49 @@
 #pragma once
 
 #include <svx/ChartColorPaletteType.hxx>
-#include <svtools/valueset.hxx>
+#include <rtl/ref.hxx>
+#include <tools/link.hxx>
+#include <vcl/customweld.hxx>
+
+class MouseEvent;
 
 namespace chart
 {
-class ChartColorPalettes final : public ValueSet
+class ChartColorPalettes final
 {
 public:
-    typedef Link<const MouseEvent&, void> MouseEventHandler;
+    typedef Link<const MouseEvent&, bool> MouseEventHandler;
 
 private:
+    weld::Builder& mrBuilder;
+    std::unique_ptr<weld::IconView> mxIconView;
+    std::unique_ptr<weld::ScrolledWindow> mxWindow;
     std::vector<ChartColorPalette> maColorSets;
+    sal_uInt16 mnHighlightedItemId;
     MouseEventHandler maMouseMoveHdl;
 
 public:
-    ChartColorPalettes()
-        : ValueSet(nullptr)
-    {
-    }
+    ChartColorPalettes(weld::Builder& rBuilder, const OUString& id, const 
OUString& winId);
 
-    void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
-    void UserDraw(const UserDrawEvent& rUserDrawEvent) override;
-    void StyleUpdated() override;
-    bool MouseMove(const MouseEvent& rMEvt) override;
+    sal_uInt16 GetSelectedItemId();
+    sal_uInt16 GetHighlightedItemId();
+    void SetSelectHdl(const Link<weld::IconView&, bool>& rLink);
+    void SetNoSelection();
+    void SelectItem(sal_uInt16 nItemId);
+    bool IsNoSelection();
+    void GrabFocus();
 
     void insert(ChartColorPalette const& rColorSet);
     const ChartColorPalette* getPalette(sal_uInt32 nItem) const;
     void setMouseMoveHdl(const MouseEventHandler& rLink);
+
+    void Fill();
+
+private:
+    DECL_LINK(OnQueryTooltip, const weld::TreeIter&, OUString);
+    DECL_LINK(OnMouseMove, const MouseEvent&, bool);
 };
+
 } // end namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/tools/ChartColorPalettes.cxx 
b/chart2/source/tools/ChartColorPalettes.cxx
index 1ff465d1fea1..6958d0c096f3 100644
--- a/chart2/source/tools/ChartColorPalettes.cxx
+++ b/chart2/source/tools/ChartColorPalettes.cxx
@@ -10,16 +10,48 @@
 #include <ChartColorPalettes.hxx>
 #include <ChartColorPaletteHelper.hxx>
 #include <vcl/event.hxx>
+#include <vcl/virdev.hxx>
 
 namespace chart
 {
 constexpr tools::Long BORDER = ChartColorPaletteLayout::ItemBorder;
 constexpr tools::Long SIZE = ChartColorPaletteLayout::ItemSize;
 
+ChartColorPalettes::ChartColorPalettes(weld::Builder& rBuilder, const 
OUString& id,
+                                       const OUString& winId)
+    : mrBuilder(rBuilder)
+    , mxIconView(mrBuilder.weld_icon_view(id))
+    , mxWindow(mrBuilder.weld_scrolled_window(winId))
+    , mnHighlightedItemId(0)
+{
+    mxIconView->connect_mouse_move(LINK(this, ChartColorPalettes, 
OnMouseMove));
+    mxIconView->connect_query_tooltip(LINK(this, ChartColorPalettes, 
OnQueryTooltip));
+}
+
+void ChartColorPalettes::SetSelectHdl(const Link<weld::IconView&, bool>& rLink)
+{
+    mxIconView->connect_item_activated(rLink);
+}
+
+sal_uInt16 ChartColorPalettes::GetSelectedItemId()
+{
+    OUString sId = mxIconView->get_selected_id();
+    if (sId.isEmpty())
+        return 0;
+    return sId.toUInt32();
+}
+
+void ChartColorPalettes::SelectItem(sal_uInt16 nItemId) { 
mxIconView->select(nItemId - 1); }
+
+void ChartColorPalettes::SetNoSelection() { mxIconView->unselect_all(); }
+
+bool ChartColorPalettes::IsNoSelection() { return 
mxIconView->get_selected_id().isEmpty(); }
+
+void ChartColorPalettes::GrabFocus() { mxIconView->grab_focus(); }
+
 void ChartColorPalettes::insert(ChartColorPalette const& rColorSet)
 {
     maColorSets.push_back(rColorSet);
-    InsertItem(maColorSets.size());
 }
 
 const ChartColorPalette* ChartColorPalettes::getPalette(const sal_uInt32 
nItem) const
@@ -31,39 +63,62 @@ const ChartColorPalette* 
ChartColorPalettes::getPalette(const sal_uInt32 nItem)
     return nullptr;
 }
 
-void ChartColorPalettes::SetDrawingArea(weld::DrawingArea* pDrawingArea)
-{
-    ValueSet::SetDrawingArea(pDrawingArea);
-    SetStyle(WB_TABSTOP | WB_DOUBLEBORDER | WB_FLATVALUESET);
-    SetItemWidth(BORDER * 6 + SIZE * ChartColorPaletteSize / 2);
-    SetItemHeight(BORDER * 5 + SIZE * 2);
-}
+sal_uInt16 ChartColorPalettes::GetHighlightedItemId() { return 
mnHighlightedItemId; }
 
-void ChartColorPalettes::UserDraw(const UserDrawEvent& rUserDrawEvent)
+void ChartColorPalettes::setMouseMoveHdl(const MouseEventHandler& rLink) { 
maMouseMoveHdl = rLink; }
+
+void ChartColorPalettes::Fill()
 {
-    vcl::RenderContext* pDev = rUserDrawEvent.GetRenderContext();
-    const tools::Rectangle aDrawArea = rUserDrawEvent.GetRect();
-    const sal_uInt16 nItemId = rUserDrawEvent.GetItemId();
-    ChartColorPalette const& rColorSet = maColorSets[nItemId - 1];
-    ChartColorPaletteHelper::renderColorPalette(pDev, aDrawArea, rColorSet, 
false);
+    const sal_uInt32 nColumns = 2;
+    const Size aSize(BORDER * 6 + SIZE * ChartColorPaletteSize / 2, BORDER * 5 
+ SIZE * 2);
+
+    const sal_uInt32 nRows = maColorSets.size() / nColumns;
+    mxIconView->set_item_width(aSize.getWidth());
+    mxIconView->set_size_request(nColumns * (aSize.getWidth() + 8),
+                                 nRows * (aSize.getHeight() + 8));
+
+    mxIconView->clear();
+
+    mxIconView->freeze();
+
+    VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
+    pVDev->SetOutputSizePixel(aSize);
+
+    tools::Rectangle aDrawArea(0, 0, aSize.getWidth(), aSize.getHeight());
+    for (size_t i = 0; i < maColorSets.size(); ++i)
+    {
+        const ChartColorPalette& rColorSet = maColorSets[i];
+        pVDev->Erase();
+        ChartColorPaletteHelper::renderColorPalette(pVDev, aDrawArea, 
rColorSet, false);
+        OUString sId = OUString::number(i + 1);
+        OUString sName = "Palette " + OUString::number(i + 1);
+
+        Bitmap aBitmap(pVDev->GetBitmap(Point(0, 0), 
pVDev->GetOutputSizePixel()));
+        mxIconView->insert(-1, &sName, &sId, &aBitmap, nullptr);
+    }
+
+    mxIconView->thaw();
+    mnHighlightedItemId = 0;
 }
 
-void ChartColorPalettes::StyleUpdated()
+IMPL_LINK(ChartColorPalettes, OnQueryTooltip, const weld::TreeIter&, rIter, 
OUString)
 {
-    SetFormat();
-    Invalidate();
-    ValueSet::StyleUpdated();
+    OUString sId = mxIconView->get_id(rIter);
+    mnHighlightedItemId = sId.isEmpty() ? 0 : 
static_cast<sal_uInt16>(sId.toUInt32());
+
+    // Suppress actual tooltip text.
+    return {};
 }
 
-bool ChartColorPalettes::MouseMove(const MouseEvent& rMEvt)
+IMPL_LINK(ChartColorPalettes, OnMouseMove, const MouseEvent&, rMouseEvent, 
bool)
 {
-    bool bRes = ValueSet::MouseMove(rMEvt);
-    maMouseMoveHdl.Call(rMEvt);
-    return bRes;
+    if (rMouseEvent.IsLeaveWindow())
+        mnHighlightedItemId = 0;
+    if (maMouseMoveHdl.IsSet())
+        return maMouseMoveHdl.Call(rMouseEvent);
+    return false;
 }
 
-void ChartColorPalettes::setMouseMoveHdl(const MouseEventHandler& rLink) { 
maMouseMoveHdl = rLink; }
-
 } // end namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/uiconfig/ui/chartcolorpalettepopup.ui 
b/chart2/uiconfig/ui/chartcolorpalettepopup.ui
index 0bb803ae9a5b..cf5265795d69 100644
--- a/chart2/uiconfig/ui/chartcolorpalettepopup.ui
+++ b/chart2/uiconfig/ui/chartcolorpalettepopup.ui
@@ -2,12 +2,30 @@
 <!-- Generated with glade 3.40.0 -->
 <interface domain="chart">
   <requires lib="gtk+" version="3.20"/>
+  <object class="GtkTreeStore" id="liststore1">
+    <columns>
+      <!-- column-name pixbuf -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkTreeStore" id="liststore2">
+    <columns>
+      <!-- column-name pixbuf -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkPopover" id="ColorPaletteWindow">
     <property name="can-focus">False</property>
     <child>
       <object class="GtkBox" id="container">
         <property name="visible">True</property>
         <property name="can-focus">False</property>
+        <property name="hexpand">True</property>
+        <property name="vexpand">True</property>
         <property name="orientation">vertical</property>
         <property name="spacing">6</property>
         <child>
@@ -16,6 +34,7 @@
             <property name="visible">True</property>
             <property name="can-focus">False</property>
             <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
             <property name="border-width">6</property>
             <property name="row-spacing">3</property>
             <property name="column-spacing">6</property>
@@ -41,23 +60,26 @@
               <object class="GtkScrolledWindow" id="colorfulwin">
                 <property name="visible">True</property>
                 <property name="can-focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
                 <property name="shadow-type">in</property>
                 <child>
-                  <object class="GtkViewport">
+                  <object class="GtkIconView" id="colorful_palettes">
                     <property name="visible">True</property>
-                    <property name="can-focus">False</property>
-                    <child>
-                      <object class="GtkDrawingArea" id="colorful_palettes">
-                        <property name="visible">True</property>
-                        <property name="can-focus">False</property>
-                        <property name="events">GDK_BUTTON_MOTION_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
-                        <property name="hexpand">True</property>
-                        <property name="vexpand">True</property>
-                        <accessibility>
-                          <relation type="labelled-by" target="label1"/>
-                        </accessibility>
-                      </object>
-                    </child>
+                    <property name="can-focus">True</property>
+                    <property name="margin">0</property>
+                    <property name="hexpand">True</property>
+                    <property name="vexpand">True</property>
+                    <property name="model">liststore1</property>
+                    <property name="pixbuf-column">0</property>
+                    <property name="columns">2</property>
+                    <property name="row-spacing">0</property>
+                    <property name="column-spacing">0</property>
+                    <property name="item-padding">4</property>
+                    <property name="activate-on-single-click">True</property>
+                    <accessibility>
+                      <relation type="labelled-by" target="label1"/>
+                    </accessibility>
                   </object>
                 </child>
               </object>
@@ -89,23 +111,26 @@
               <object class="GtkScrolledWindow" id="monochromaticwin">
                 <property name="visible">True</property>
                 <property name="can-focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
                 <property name="shadow-type">in</property>
                 <child>
-                  <object class="GtkViewport">
+                  <object class="GtkIconView" id="monochromatic_palettes">
                     <property name="visible">True</property>
-                    <property name="can-focus">False</property>
-                    <child>
-                      <object class="GtkDrawingArea" 
id="monochromatic_palettes">
-                        <property name="visible">True</property>
-                        <property name="can-focus">False</property>
-                        <property name="events">GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | 
GDK_STRUCTURE_MASK</property>
-                        <property name="hexpand">True</property>
-                        <property name="vexpand">True</property>
-                        <accessibility>
-                          <relation type="labelled-by" target="label2"/>
-                        </accessibility>
-                      </object>
-                    </child>
+                    <property name="can-focus">True</property>
+                    <property name="margin">0</property>
+                    <property name="hexpand">True</property>
+                    <property name="vexpand">True</property>
+                    <property name="model">liststore2</property>
+                    <property name="pixbuf-column">0</property>
+                    <property name="columns">2</property>
+                    <property name="row-spacing">0</property>
+                    <property name="column-spacing">0</property>
+                    <property name="item-padding">4</property>
+                    <property name="activate-on-single-click">True</property>
+                    <accessibility>
+                      <relation type="labelled-by" target="label2"/>
+                    </accessibility>
                   </object>
                 </child>
               </object>
diff --git a/chart2/uiconfig/ui/tp_ChartColorPalette.ui 
b/chart2/uiconfig/ui/tp_ChartColorPalette.ui
index 3fb233011922..f79e1b9b3e8e 100644
--- a/chart2/uiconfig/ui/tp_ChartColorPalette.ui
+++ b/chart2/uiconfig/ui/tp_ChartColorPalette.ui
@@ -2,6 +2,22 @@
 <!-- Generated with glade 3.40.0 -->
 <interface domain="chart">
   <requires lib="gtk+" version="3.20"/>
+  <object class="GtkTreeStore" id="liststore1">
+    <columns>
+      <!-- column-name pixbuf -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkTreeStore" id="liststore2">
+    <columns>
+      <!-- column-name pixbuf -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkBox" id="tp_ChartColorPalette">
     <property name="visible">True</property>
     <property name="can-focus">False</property>
@@ -24,17 +40,22 @@
             <property name="valign">start</property>
             <property name="shadow-type">in</property>
             <child>
-              <object class="GtkViewport">
+              <object class="GtkIconView" id="colorful_palettes">
                 <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>
+                <property name="can-focus">True</property>
+                <property name="margin">0</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="model">liststore1</property>
+                <property name="pixbuf-column">0</property>
+                <property name="columns">2</property>
+                <property name="row-spacing">0</property>
+                <property name="column-spacing">0</property>
+                <property name="item-padding">4</property>
+                <property name="activate-on-single-click">True</property>
+                <accessibility>
+                  <relation type="labelled-by" target="LBL_COLORFUL"/>
+                </accessibility>
               </object>
             </child>
           </object>
@@ -48,6 +69,9 @@
             <attributes>
               <attribute name="weight" value="bold"/>
             </attributes>
+            <accessibility>
+              <relation type="label-for" target="colorful_palettes"/>
+            </accessibility>
           </object>
         </child>
       </object>
@@ -74,17 +98,22 @@
             <property name="valign">start</property>
             <property name="shadow-type">in</property>
             <child>
-              <object class="GtkViewport">
+              <object class="GtkIconView" id="monochromatic_palettes">
                 <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>
+                <property name="can-focus">True</property>
+                <property name="margin">0</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="model">liststore2</property>
+                <property name="pixbuf-column">0</property>
+                <property name="columns">2</property>
+                <property name="row-spacing">0</property>
+                <property name="column-spacing">0</property>
+                <property name="item-padding">4</property>
+                <property name="activate-on-single-click">True</property>
+                <accessibility>
+                  <relation type="labelled-by" target="LBL_MONOCHROMATIC"/>
+                </accessibility>
               </object>
             </child>
           </object>
@@ -98,6 +127,9 @@
             <attributes>
               <attribute name="weight" value="bold"/>
             </attributes>
+            <accessibility>
+              <relation type="label-for" target="monochromatic_palettes"/>
+            </accessibility>
           </object>
         </child>
       </object>
commit 25fa7051654704ea7fb218e01dad5a5af4aef53d
Author:     Marco Cecchetti <marco.cecche...@collabora.com>
AuthorDate: Fri May 9 18:11:25 2025 +0200
Commit:     Marco Cecchetti <marco.cecche...@collabora.com>
CommitDate: Sun Aug 24 23:21:52 2025 +0200

    chart preview color palette for data series on mouse over
    
    Change-Id: I99b8adefe87cb54d886a7dcead72709568f72c57
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186338
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190036
    Reviewed-by: Marco Cecchetti <marco.cecche...@collabora.com>
    Tested-by: Jenkins

diff --git a/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx 
b/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx
index 7c9a28348b2a..ae055f942e9b 100644
--- a/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx
+++ b/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx
@@ -123,6 +123,18 @@ void ChartColorPaletteControl::updateStatus(bool bForce)
     }
 }
 
+void ChartColorPaletteControl::createDiagramSnapshot() const
+{
+    if (mpHandler)
+        mpHandler->createDiagramSnapshot();
+}
+
+void ChartColorPaletteControl::restoreOriginalDiagram() const
+{
+    if (mpHandler)
+        mpHandler->restoreOriginalDiagram();
+}
+
 void ChartColorPaletteControl::renderSelectedColorPalette(const 
VclPtr<VirtualDevice>& pDev) const
 {
     if (!pDev)
@@ -238,6 +250,9 @@ 
ChartColorPalettePopup::ChartColorPalettePopup(ChartColorPaletteControl* pContro
     , mxMonoValueSet(new ChartColorPalettes)
     , mxMonoValueSetWin(
           new weld::CustomWeld(*m_xBuilder, "monochromatic_palettes", 
*mxMonoValueSet))
+    , meHighlightedItemType(mxControl->getColorPaletteType())
+    , mnHighlightedItemId(mxControl->getColorPaletteIndex())
+    , mbItemSelected(false)
 {
     mxColorfulValueSet->SetColCount(2);
     mxColorfulValueSet->SetLineCount(2);
@@ -251,14 +266,22 @@ 
ChartColorPalettePopup::ChartColorPalettePopup(ChartColorPaletteControl* pContro
 
     mxColorfulValueSet->SetOptimalSize();
     mxColorfulValueSet->SetSelectHdl(LINK(this, ChartColorPalettePopup, 
SelectColorfulValueSetHdl));
+    mxColorfulValueSet->setMouseMoveHdl(LINK(this, ChartColorPalettePopup, 
ColorfulMouseMoveHdl));
 
     mxMonoValueSet->SetOptimalSize();
     mxMonoValueSet->SetSelectHdl(LINK(this, ChartColorPalettePopup, 
SelectMonoValueSetHdl));
+    mxMonoValueSet->setMouseMoveHdl(LINK(this, ChartColorPalettePopup, 
MonoMouseMoveHdl));
 
     selectItem(mxControl->getColorPaletteType(), 
mxControl->getColorPaletteIndex() + 1);
+
+    mxControl->createDiagramSnapshot();
 }
 
-ChartColorPalettePopup::~ChartColorPalettePopup() {}
+ChartColorPalettePopup::~ChartColorPalettePopup()
+{
+    if (!mbItemSelected)
+        mxControl->restoreOriginalDiagram();
+}
 
 void ChartColorPalettePopup::selectItem(const ChartColorPaletteType eType,
                                         const sal_uInt32 nIndex) const
@@ -326,8 +349,8 @@ IMPL_LINK_NOARG(ChartColorPalettePopup, 
SelectMonoValueSetHdl, ValueSet*, void)
     mxControl->EndPopupMode();
 }
 
-sal_uInt32 ChartColorPalettePopup::SelectValueSetHdl(
-    const std::unique_ptr<ChartColorPalettes>& xValueSet) const
+sal_uInt32
+ChartColorPalettePopup::SelectValueSetHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet)
 {
     const sal_uInt32 nItemId = xValueSet->GetSelectedItemId();
 
@@ -339,11 +362,45 @@ sal_uInt32 ChartColorPalettePopup::SelectValueSetHdl(
     if (const ChartColorPalette* pPalette = xValueSet->getPalette(nIndex))
     {
         mxControl->applyColorPalette(pPalette);
+        mbItemSelected = true;
         return nIndex;
     }
     return static_cast<sal_uInt32>(-1);
 }
 
+IMPL_LINK_NOARG(ChartColorPalettePopup, ColorfulMouseMoveHdl, const 
MouseEvent&, void)
+{
+    MouseMoveHdl(mxColorfulValueSet, ChartColorPaletteType::Colorful);
+}
+
+IMPL_LINK_NOARG(ChartColorPalettePopup, MonoMouseMoveHdl, const MouseEvent&, 
void)
+{
+    MouseMoveHdl(mxMonoValueSet, ChartColorPaletteType::Monochromatic);
+}
+
+void ChartColorPalettePopup::MouseMoveHdl(const 
std::unique_ptr<ChartColorPalettes>& xValueSet,
+                                          const ChartColorPaletteType 
eHlItemType)
+{
+    const sal_uInt16 nHlId = xValueSet->GetHighlightedItemId();
+    if (eHlItemType == meHighlightedItemType && nHlId == mnHighlightedItemId)
+        return;
+
+    if (nHlId > 0)
+    {
+        if (const ChartColorPalette* pPalette = xValueSet->getPalette(nHlId - 
1))
+        {
+            mxControl->applyColorPalette(pPalette);
+        }
+    }
+    else
+    {
+        mxControl->restoreOriginalDiagram();
+    }
+
+    meHighlightedItemType = eHlItemType;
+    mnHighlightedItemId = nHlId;
+}
+
 } // end namespace chart::sidebar
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx 
b/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx
index 3ba66a1e72ec..ad243f5c860b 100644
--- a/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx
+++ b/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx
@@ -23,6 +23,10 @@ namespace sidebar
 struct IColorPaletteHandler
 {
     virtual ~IColorPaletteHandler() = default;
+
+    virtual void createDiagramSnapshot() = 0;
+    virtual void restoreOriginalDiagram() = 0;
+
     virtual void select(ChartColorPaletteType eType, sal_uInt32 nIndex) = 0;
     virtual void apply(const ChartColorPalette* pColorPalette) = 0;
     [[nodiscard]] virtual std::shared_ptr<ChartColorPaletteHelper> getHelper() 
const = 0;
@@ -60,6 +64,9 @@ public:
     void applyColorPalette(const ChartColorPalette* pColorPalette) const;
     void updateStatus(bool bForce = false);
 
+    void createDiagramSnapshot() const;
+    void restoreOriginalDiagram() const;
+
 private:
     std::unique_ptr<WeldToolbarPopup> weldPopupWindow() override;
     VclPtr<vcl::Window> createVclPopupWindow(vcl::Window* pParent) override;
@@ -75,9 +82,18 @@ class ChartColorPalettePopup final : public WeldToolbarPopup
     std::unique_ptr<ChartColorPalettes> mxMonoValueSet;
     std::unique_ptr<weld::CustomWeld> mxMonoValueSetWin;
 
+    ChartColorPaletteType meHighlightedItemType;
+    sal_uInt16 mnHighlightedItemId;
+    bool mbItemSelected;
+
     DECL_LINK(SelectColorfulValueSetHdl, ValueSet*, void);
     DECL_LINK(SelectMonoValueSetHdl, ValueSet*, void);
-    sal_uInt32 SelectValueSetHdl(const std::unique_ptr<ChartColorPalettes>& 
xValueSet) const;
+    sal_uInt32 SelectValueSetHdl(const std::unique_ptr<ChartColorPalettes>& 
xValueSet);
+
+    DECL_LINK(ColorfulMouseMoveHdl, const MouseEvent&, void);
+    DECL_LINK(MonoMouseMoveHdl, const MouseEvent&, void);
+    void MouseMoveHdl(const std::unique_ptr<ChartColorPalettes>& xValueSet,
+                      ChartColorPaletteType eHlItemType);
 
     void GrabFocus() override;
 
diff --git a/chart2/source/controller/sidebar/ChartColorsPanel.cxx 
b/chart2/source/controller/sidebar/ChartColorsPanel.cxx
index 89e42f631ceb..1c7670e3ffcb 100644
--- a/chart2/source/controller/sidebar/ChartColorsPanel.cxx
+++ b/chart2/source/controller/sidebar/ChartColorsPanel.cxx
@@ -25,6 +25,8 @@
 #include <ChartColorPaletteHelper.hxx>
 #include <ChartController.hxx>
 #include <ChartModel.hxx>
+#include <DataSeries.hxx>
+#include <Diagram.hxx>
 
 #include <com/sun/star/drawing/FillStyle.hpp>
 
@@ -86,6 +88,9 @@ public:
     void updateModel(const rtl::Reference<ChartModel>& xModel);
     void updateData() const;
 
+    void createDiagramSnapshot() override;
+    void restoreOriginalDiagram() override;
+
     void select(ChartColorPaletteType eType, sal_uInt32 nIndex) override;
     void apply(const ChartColorPalette* pColorPalette) override;
     [[nodiscard]] std::shared_ptr<ChartColorPaletteHelper> getHelper() const 
override;
@@ -95,6 +100,7 @@ public:
 private:
     rtl::Reference<ChartModel> mxModel;
     ChartColorPaletteControl* mpControl;
+    rtl::Reference<Diagram> mxDiagramSnapshot;
 };
 
 ColorPaletteWrapper::ColorPaletteWrapper(rtl::Reference<ChartModel> xModel,
@@ -119,6 +125,23 @@ void ColorPaletteWrapper::updateData() const
         mpControl->statusChanged(aEvent);
 }
 
+void ColorPaletteWrapper::createDiagramSnapshot()
+{
+    const rtl::Reference<Diagram> xDiagram = mxModel->getFirstChartDiagram();
+    mxDiagramSnapshot = new ::chart::Diagram(*xDiagram);
+}
+
+void ColorPaletteWrapper::restoreOriginalDiagram()
+{
+    if (mxDiagramSnapshot)
+    {
+        const rtl::Reference<Diagram> xDiagram = new 
::chart::Diagram(*mxDiagramSnapshot);
+        // setDiagram didn't make a copy internally, so we need to pass a copy 
or
+        // the diagram snapshot would be modified on preview
+        mxModel->setFirstDiagram(xDiagram);
+    }
+}
+
 void ColorPaletteWrapper::select(ChartColorPaletteType eType, const sal_uInt32 
nIndex)
 {
     mxModel->setColorPalette(eType, nIndex);
diff --git a/chart2/source/inc/ChartColorPalettes.hxx 
b/chart2/source/inc/ChartColorPalettes.hxx
index 78e12c396c6f..4af31653597b 100644
--- a/chart2/source/inc/ChartColorPalettes.hxx
+++ b/chart2/source/inc/ChartColorPalettes.hxx
@@ -16,7 +16,12 @@ namespace chart
 {
 class ChartColorPalettes final : public ValueSet
 {
+public:
+    typedef Link<const MouseEvent&, void> MouseEventHandler;
+
+private:
     std::vector<ChartColorPalette> maColorSets;
+    MouseEventHandler maMouseMoveHdl;
 
 public:
     ChartColorPalettes()
@@ -27,9 +32,11 @@ public:
     void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
     void UserDraw(const UserDrawEvent& rUserDrawEvent) override;
     void StyleUpdated() override;
+    bool MouseMove(const MouseEvent& rMEvt) override;
 
     void insert(ChartColorPalette const& rColorSet);
     const ChartColorPalette* getPalette(sal_uInt32 nItem) const;
+    void setMouseMoveHdl(const MouseEventHandler& rLink);
 };
 } // end namespace chart
 
diff --git a/chart2/source/tools/ChartColorPalettes.cxx 
b/chart2/source/tools/ChartColorPalettes.cxx
index dbe7697c7210..1ff465d1fea1 100644
--- a/chart2/source/tools/ChartColorPalettes.cxx
+++ b/chart2/source/tools/ChartColorPalettes.cxx
@@ -34,7 +34,7 @@ const ChartColorPalette* ChartColorPalettes::getPalette(const 
sal_uInt32 nItem)
 void ChartColorPalettes::SetDrawingArea(weld::DrawingArea* pDrawingArea)
 {
     ValueSet::SetDrawingArea(pDrawingArea);
-    SetStyle(WB_TABSTOP | WB_DOUBLEBORDER);
+    SetStyle(WB_TABSTOP | WB_DOUBLEBORDER | WB_FLATVALUESET);
     SetItemWidth(BORDER * 6 + SIZE * ChartColorPaletteSize / 2);
     SetItemHeight(BORDER * 5 + SIZE * 2);
 }
@@ -54,6 +54,16 @@ void ChartColorPalettes::StyleUpdated()
     Invalidate();
     ValueSet::StyleUpdated();
 }
+
+bool ChartColorPalettes::MouseMove(const MouseEvent& rMEvt)
+{
+    bool bRes = ValueSet::MouseMove(rMEvt);
+    maMouseMoveHdl.Call(rMEvt);
+    return bRes;
+}
+
+void ChartColorPalettes::setMouseMoveHdl(const MouseEventHandler& rLink) { 
maMouseMoveHdl = rLink; }
+
 } // end namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to