sc/sdi/scalc.sdi              |    4 -
 sc/source/ui/view/cellsh1.cxx |  155 ++++++++++++++++++++++++++++++++++++++----
 2 files changed, 143 insertions(+), 16 deletions(-)

New commits:
commit 50abd90d739410ed34de5e7cd9c4308dc75f9ab6
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Wed Oct 25 18:23:06 2023 +0200
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Sat Oct 28 21:31:16 2023 +0200

    Introduce easy to apply cond format styles
    
    UNO commands for Data bars and Color scale conditional
    formatting now can be called with parameter to apply
    few predefined themes.
    
    In the future it could be moved somewhere so it could
    be configured from the UI maybe...
    
    Change-Id: I080709709fcc0886dcaf6050a6c1ae621b6728c9
    (cherry picked from commit c8d4a99082269c7008df5765232a93d19e7a3d84)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158539
    Tested-by: Jenkins
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>

diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index 4da6e21b162e..614293cc90bb 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -787,7 +787,7 @@ SfxVoidItem CurrentConditionalFormatDialog 
SID_OPENDLG_CURRENTCONDFRMT
 
 
 SfxVoidItem ColorScaleFormatDialog SID_OPENDLG_COLORSCALE
-()
+(SfxInt16Item IconSet FN_PARAM_1)
 [
     AutoUpdate = FALSE,
     FastCall = FALSE,
@@ -805,7 +805,7 @@ SfxVoidItem ColorScaleFormatDialog SID_OPENDLG_COLORSCALE
 
 
 SfxVoidItem DataBarFormatDialog SID_OPENDLG_DATABAR
-()
+(SfxInt16Item IconSet FN_PARAM_1)
 [
     AutoUpdate = FALSE,
     FastCall = FALSE,
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index b35796ff0c2e..1b307963dc01 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -2186,27 +2186,154 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
 
                 // do we have a parameter with the conditional formatting type?
                 const SfxInt16Item* pParam = 
rReq.GetArg<SfxInt16Item>(FN_PARAM_1);
-                if (pParam && nSlot == SID_OPENDLG_ICONSET)
+                if (pParam)
                 {
                     auto pFormat = std::make_unique<ScConditionalFormat>(0, 
&rDoc);
                     pFormat->SetRange(aRangeList);
 
-                    ScIconSetType eIconSetType = 
limit_cast<ScIconSetType>(pParam->GetValue(), IconSet_3Arrows, IconSet_5Boxes);
-                    const int nSteps = 
ScIconSetFormat::getIconSetElements(eIconSetType);
+                    if (nSlot == SID_OPENDLG_ICONSET)
+                    {
+                        ScIconSetType eIconSetType = 
limit_cast<ScIconSetType>(pParam->GetValue(), IconSet_3Arrows, IconSet_5Boxes);
+                        const int nSteps = 
ScIconSetFormat::getIconSetElements(eIconSetType);
+
+                        ScIconSetFormat* pEntry = new ScIconSetFormat(&rDoc);
+                        ScIconSetFormatData* pIconSetFormatData = new 
ScIconSetFormatData(eIconSetType);
+
+                        pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(0, COL_RED, COLORSCALE_PERCENT));
+                        pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(round(100. / nSteps), COL_BROWN, COLORSCALE_PERCENT));
+                        pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(round(200. / nSteps), COL_YELLOW, COLORSCALE_PERCENT));
+                        if (nSteps > 3)
+                            pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(round(300. / nSteps), COL_WHITE, COLORSCALE_PERCENT));
+                        if (nSteps > 4)
+                            pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(round(400. / nSteps), COL_GREEN, COLORSCALE_PERCENT));
+
+                        pEntry->SetIconSetData(pIconSetFormatData);
+                        pFormat->AddEntry(pEntry);
+                    }
+                    else if (nSlot == SID_OPENDLG_COLORSCALE)
+                    {
+                        typedef std::tuple<double, Color, 
ScColorScaleEntryType> ScaleEntry;
+                        static std::vector<std::vector<ScaleEntry>> 
aScaleThemes =
+                            {
+                                {
+                                    { 0, Color(0xF8696B), COLORSCALE_MIN },
+                                    { 0, Color(0x63BE7B), COLORSCALE_MAX },
+                                    { 50, Color(0xFFEB84), 
COLORSCALE_PERCENTILE }
+                                },
+                                {
+                                    { 0, Color(0x63BE7B), COLORSCALE_MIN },
+                                    { 0, Color(0xF8696B), COLORSCALE_MAX },
+                                    { 50, Color(0xFFEB84), 
COLORSCALE_PERCENTILE }
+                                },
+                                {
+                                    { 0, Color(0xF8696B), COLORSCALE_MIN },
+                                    { 0, Color(0x63BE7B), COLORSCALE_MAX },
+                                    { 50, Color(0xFCFCFF), 
COLORSCALE_PERCENTILE }
+                                },
+                                {
+                                    { 0, Color(0x63BE7B), COLORSCALE_MIN },
+                                    { 0, Color(0xF8696B), COLORSCALE_MAX },
+                                    { 50, Color(0xFCFCFF), 
COLORSCALE_PERCENTILE }
+                                },
+                                {
+                                    { 0, Color(0xF8696B), COLORSCALE_MIN },
+                                    { 0, Color(0x5A8AC6), COLORSCALE_MAX },
+                                    { 50, Color(0xFCFCFF), 
COLORSCALE_PERCENTILE }
+                                },
+                                {
+                                    { 0, Color(0x5A8AC6), COLORSCALE_MIN },
+                                    { 0, Color(0xF8696B), COLORSCALE_MAX },
+                                    { 50, Color(0xFCFCFF), 
COLORSCALE_PERCENTILE }
+                                },
+                                {
+                                    { 0, Color(0xF8696B), COLORSCALE_MIN },
+                                    { 0, Color(0xFCFCFF), COLORSCALE_MAX }
+                                },
+                                {
+                                    { 0, Color(0xFCFCFF), COLORSCALE_MIN },
+                                    { 0, Color(0xF8696B), COLORSCALE_MAX }
+                                },
+                                {
+                                    { 0, Color(0x63BE7B), COLORSCALE_MIN },
+                                    { 0, Color(0xFCFCFF), COLORSCALE_MAX }
+                                },
+                                {
+                                    { 0, Color(0xFCFCFF), COLORSCALE_MIN },
+                                    { 0, Color(0x63BE7B), COLORSCALE_MAX }
+                                },
+                                {
+                                    { 0, Color(0x63BE7B), COLORSCALE_MIN },
+                                    { 0, Color(0xFFEF9C), COLORSCALE_MAX }
+                                },
+                                {
+                                    { 0, Color(0xFFEF9C), COLORSCALE_MIN },
+                                    { 0, Color(0x63BE7B), COLORSCALE_MAX }
+                                }
+                            };
+
+                        sal_uInt16 nTheme = pParam->GetValue();
+                        if (nTheme < aScaleThemes.size())
+                        {
+                            ScColorScaleFormat* pFormatEntry = new 
ScColorScaleFormat(&rDoc);
+
+                            auto& aTheme = aScaleThemes[nTheme];
+
+                            ScColorScaleEntry* pMin = new 
ScColorScaleEntry(std::get<0>(aTheme[0]), std::get<1>(aTheme[0]), 
std::get<2>(aTheme[0]));
+                            ScColorScaleEntry* pMax = new 
ScColorScaleEntry(std::get<0>(aTheme[1]), std::get<1>(aTheme[1]), 
std::get<2>(aTheme[1]));
+
+                            pFormatEntry->AddEntry(pMin);
+
+                            // COLORSCALE_PERCENTILE has to be in the middle
+                            if (aTheme.size() > 2)
+                            {
+                                ScColorScaleEntry* pPer = new 
ScColorScaleEntry(std::get<0>(aTheme[2]), std::get<1>(aTheme[2]), 
std::get<2>(aTheme[2]));
+                                pFormatEntry->AddEntry(pPer);
+                            }
+
+                            pFormatEntry->AddEntry(pMax);
+
+                            pFormat->AddEntry(pFormatEntry);
+                        }
 
-                    ScIconSetFormat* pEntry = new ScIconSetFormat(&rDoc);
-                    ScIconSetFormatData* pIconSetFormatData = new 
ScIconSetFormatData(eIconSetType);
+                    }
+                    else if (nSlot == SID_OPENDLG_DATABAR)
+                    {
+                        typedef std::tuple<Color, bool> DatabarEntry;
+                        static std::vector<DatabarEntry> aDatabarThemes =
+                            {
+                                { Color(0x638EC6), true },
+                                { Color(0x63C384), true },
+                                { Color(0xFF555A), true },
+                                { Color(0xFFB628), true },
+                                { Color(0x008AEF), true },
+                                { Color(0xD6007B), true },
+                                { Color(0x638EC6), false },
+                                { Color(0x63C384), false },
+                                { Color(0xFF555A), false },
+                                { Color(0xFFB628), false },
+                                { Color(0x008AEF), false },
+                                { Color(0xD6007B), false }
+                            };
+
+                        sal_uInt16 nTheme = pParam->GetValue();
+                        if (nTheme < aDatabarThemes.size())
+                        {
+                            ScDataBarFormat* pFormatEntry = new 
ScDataBarFormat(&rDoc);
 
-                    pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(0, COL_RED, COLORSCALE_PERCENT));
-                    pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(round(100. / nSteps), COL_BROWN, COLORSCALE_PERCENT));
-                    pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(round(200. / nSteps), COL_YELLOW, COLORSCALE_PERCENT));
-                    if (nSteps > 3)
-                        pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(round(300. / nSteps), COL_WHITE, COLORSCALE_PERCENT));
-                    if (nSteps > 4)
-                        pIconSetFormatData->m_Entries.emplace_back(new 
ScColorScaleEntry(round(400. / nSteps), COL_GREEN, COLORSCALE_PERCENT));
+                            auto& aTheme = aDatabarThemes[nTheme];
 
-                    pEntry->SetIconSetData(pIconSetFormatData);
-                    pFormat->AddEntry(pEntry);
+                            ScDataBarFormatData* pData = new 
ScDataBarFormatData();
+                            pData->maPositiveColor = std::get<0>(aTheme);
+                            pData->mbGradient = std::get<1>(aTheme);
+                            pData->mxNegativeColor = Color(0xFF0000);
+                            pData->mpLowerLimit.reset(new ScColorScaleEntry(0, 
0, COLORSCALE_AUTO));
+                            pData->mpUpperLimit.reset(new ScColorScaleEntry(0, 
0, COLORSCALE_AUTO));
+
+                            pFormatEntry->SetDataBarData(pData);
+
+                            pFormat->AddEntry(pFormatEntry);
+                        }
+                    }
 
                     // use the new conditional formatting
                     
GetViewData().GetDocShell()->GetDocFunc().ReplaceConditionalFormat(nIndex, 
std::move(pFormat), aPos.Tab(), aRangeList);

Reply via email to