1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include <i18nutil/unicode.hxx>
22 #include <svtools/colrdlg.hxx>
23 #include <vcl/svapp.hxx>
24 #include <vcl/weld.hxx>
26 #include <strings.hrc>
27 #include <svx/xfillit0.hxx>
28 #include <svx/xflclit.hxx>
29 #include <svx/xtable.hxx>
30 #include <cuitabarea.hxx>
31 #include <svx/svxdlg.hxx>
32 #include <dialmgr.hxx>
33 #include <cuitabline.hxx>
34 #include <svx/dialmgr.hxx>
35 #include <svx/strings.hrc>
36 #include <officecfg/Office/Common.hxx>
37 #include <osl/diagnose.h>
38 #include <comphelper/dispatchcommand.hxx>
39 #include <comphelper/lok.hxx>
40 #include <comphelper/propertyvalue.hxx>
42 using namespace com::sun::star
;
44 SvxColorTabPage::SvxColorTabPage(weld::Container
* pPage
, weld::DialogController
* pController
, const SfxItemSet
& rInAttrs
)
45 : SfxTabPage(pPage
, pController
, u
"cui/ui/colorpage.ui"_ustr
, u
"ColorPage"_ustr
, &rInAttrs
)
46 , rOutAttrs ( rInAttrs
)
47 // All the horrific pointers we store and should not
48 , pnColorListState( nullptr )
49 , aXFillAttr( rInAttrs
.GetPool() )
50 , rXFSet( aXFillAttr
.GetItemSet() )
51 , eCM( ColorModel::RGB
)
52 , m_xValSetColorList(new SvxColorValueSet(m_xBuilder
->weld_scrolled_window(u
"colorsetwin"_ustr
, true)))
53 , m_xValSetRecentList(new SvxColorValueSet(nullptr))
54 , m_xSelectPalette(m_xBuilder
->weld_combo_box(u
"paletteselector"_ustr
))
55 , m_xRbRGB(m_xBuilder
->weld_radio_button(u
"RGB"_ustr
))
56 , m_xRbCMYK(m_xBuilder
->weld_radio_button(u
"CMYK"_ustr
))
57 , m_xRGBcustom(m_xBuilder
->weld_widget(u
"rgbcustom"_ustr
))
58 , m_xRGBpreset(m_xBuilder
->weld_widget(u
"rgbpreset"_ustr
))
59 , m_xRpreset(m_xBuilder
->weld_entry(u
"R_preset"_ustr
))
60 , m_xGpreset(m_xBuilder
->weld_entry(u
"G_preset"_ustr
))
61 , m_xBpreset(m_xBuilder
->weld_entry(u
"B_preset"_ustr
))
62 , m_xRcustom(m_xBuilder
->weld_spin_button(u
"R_custom"_ustr
))
63 , m_xGcustom(m_xBuilder
->weld_spin_button(u
"G_custom"_ustr
))
64 , m_xBcustom(m_xBuilder
->weld_spin_button(u
"B_custom"_ustr
))
65 , m_xHexpreset(new weld::HexColorControl(m_xBuilder
->weld_entry(u
"hex_preset"_ustr
)))
66 , m_xHexcustom(new weld::HexColorControl(m_xBuilder
->weld_entry(u
"hex_custom"_ustr
)))
67 , m_xCMYKcustom(m_xBuilder
->weld_widget(u
"cmykcustom"_ustr
))
68 , m_xCMYKpreset(m_xBuilder
->weld_widget(u
"cmykpreset"_ustr
))
69 , m_xCpreset(m_xBuilder
->weld_entry(u
"C_preset"_ustr
))
70 , m_xYpreset(m_xBuilder
->weld_entry(u
"Y_preset"_ustr
))
71 , m_xMpreset(m_xBuilder
->weld_entry(u
"M_preset"_ustr
))
72 , m_xKpreset(m_xBuilder
->weld_entry(u
"K_preset"_ustr
))
73 , m_xCcustom(m_xBuilder
->weld_metric_spin_button(u
"C_custom"_ustr
, FieldUnit::PERCENT
))
74 , m_xYcustom(m_xBuilder
->weld_metric_spin_button(u
"Y_custom"_ustr
, FieldUnit::PERCENT
))
75 , m_xMcustom(m_xBuilder
->weld_metric_spin_button(u
"M_custom"_ustr
, FieldUnit::PERCENT
))
76 , m_xKcustom(m_xBuilder
->weld_metric_spin_button(u
"K_custom"_ustr
, FieldUnit::PERCENT
))
77 , m_xBtnAdd(m_xBuilder
->weld_button(u
"add"_ustr
))
78 , m_xBtnDelete(m_xBuilder
->weld_button(u
"delete"_ustr
))
79 , m_xBtnWorkOn(m_xBuilder
->weld_button(u
"edit"_ustr
))
80 , m_xMoreColors(m_xBuilder
->weld_button(u
"btnMoreColors"_ustr
))
81 , m_xCtlPreviewOld(new weld::CustomWeld(*m_xBuilder
, u
"oldpreview"_ustr
, m_aCtlPreviewOld
))
82 , m_xCtlPreviewNew(new weld::CustomWeld(*m_xBuilder
, u
"newpreview"_ustr
, m_aCtlPreviewNew
))
83 , m_xValSetColorListWin(new weld::CustomWeld(*m_xBuilder
, u
"colorset"_ustr
, *m_xValSetColorList
))
84 , m_xValSetRecentListWin(new weld::CustomWeld(*m_xBuilder
, u
"recentcolorset"_ustr
, *m_xValSetRecentList
))
86 Size
aSize(m_xBtnWorkOn
->get_approximate_digit_width() * 25,
87 m_xBtnWorkOn
->get_text_height() * 10);
88 m_xValSetColorList
->set_size_request(aSize
.Width(), aSize
.Height());
89 aSize
= Size(m_xBtnWorkOn
->get_approximate_digit_width() * 8,
90 m_xBtnWorkOn
->get_text_height() * 3);
91 m_aCtlPreviewOld
.set_size_request(aSize
.Width(), aSize
.Height());
92 m_aCtlPreviewNew
.set_size_request(aSize
.Width(), aSize
.Height());
93 // this page needs ExchangeSupport
96 // setting the output device
97 rXFSet
.Put( XFillStyleItem(drawing::FillStyle_SOLID
) );
98 rXFSet
.Put( XFillColorItem(OUString(), COL_BLACK
) );
99 m_aCtlPreviewOld
.SetAttributes( aXFillAttr
.GetItemSet() );
100 m_aCtlPreviewNew
.SetAttributes( aXFillAttr
.GetItemSet() );
103 m_xSelectPalette
->connect_changed(LINK(this, SvxColorTabPage
, SelectPaletteLBHdl
));
104 Link
<ValueSet
*, void> aValSelectLink
= LINK(this, SvxColorTabPage
, SelectValSetHdl_Impl
);
105 m_xValSetColorList
->SetSelectHdl(aValSelectLink
);
106 m_xValSetRecentList
->SetSelectHdl(aValSelectLink
);
108 Link
<weld::SpinButton
&,void> aSpinLink
= LINK(this, SvxColorTabPage
, SpinValueHdl_Impl
);
109 m_xRcustom
->connect_value_changed(aSpinLink
);
110 m_xGcustom
->connect_value_changed(aSpinLink
);
111 m_xBcustom
->connect_value_changed(aSpinLink
);
112 Link
<weld::Entry
&,void> aEntryLink
= LINK(this, SvxColorTabPage
, ModifiedHdl_Impl
);
113 m_xHexcustom
->connect_changed(aEntryLink
);
114 Link
<weld::MetricSpinButton
&,void> aMetricSpinLink
= LINK(this, SvxColorTabPage
, MetricSpinValueHdl_Impl
);
115 m_xCcustom
->connect_value_changed(aMetricSpinLink
);
116 m_xYcustom
->connect_value_changed(aMetricSpinLink
);
117 m_xMcustom
->connect_value_changed(aMetricSpinLink
);
118 m_xKcustom
->connect_value_changed(aMetricSpinLink
);
120 Link
<weld::Toggleable
&,void> aLink2
= LINK( this, SvxColorTabPage
, SelectColorModeHdl_Impl
);
121 m_xRbRGB
->connect_toggled(aLink2
);
122 m_xRbCMYK
->connect_toggled(aLink2
);
123 SetColorModel( eCM
);
126 m_xBtnAdd
->connect_clicked( LINK( this, SvxColorTabPage
, ClickAddHdl_Impl
) );
127 m_xBtnWorkOn
->connect_clicked( LINK( this, SvxColorTabPage
, ClickWorkOnHdl_Impl
) );
128 m_xBtnDelete
->connect_clicked( LINK( this, SvxColorTabPage
, ClickDeleteHdl_Impl
) );
129 // disable modify buttons
130 // Color palettes can't be modified
131 m_xBtnDelete
->set_sensitive(false);
132 m_xBtnDelete
->set_tooltip_text( CuiResId(RID_CUISTR_DELETEUSERCOLOR1
) );
134 m_xMoreColors
->connect_clicked(LINK(this, SvxColorTabPage
, OnMoreColorsClick
));
136 // disable preset color values
137 m_xRGBpreset
->set_sensitive(false);
138 m_xCMYKpreset
->set_sensitive(false);
141 m_xValSetColorList
->SetStyle(m_xValSetColorList
->GetStyle() |
142 WB_FLATVALUESET
| WB_ITEMBORDER
| WB_NO_DIRECTSELECT
| WB_TABSTOP
);
143 m_xValSetColorList
->Show();
145 m_xValSetRecentList
->SetStyle(m_xValSetRecentList
->GetStyle() |
146 WB_FLATVALUESET
| WB_ITEMBORDER
| WB_NO_DIRECTSELECT
| WB_TABSTOP
);
147 m_xValSetRecentList
->Show();
149 maPaletteManager
.ReloadRecentColorSet(*m_xValSetRecentList
);
150 aSize
= m_xValSetRecentList
->layoutAllVisible(maPaletteManager
.GetRecentColorCount());
151 m_xValSetRecentList
->set_size_request(aSize
.Width(), aSize
.Height());
153 // it is not possible to install color palette extensions in Online or mobile apps
154 if(comphelper::LibreOfficeKit::isActive())
156 m_xMoreColors
->hide();
160 SvxColorTabPage::~SvxColorTabPage()
162 m_xValSetRecentListWin
.reset();
163 m_xValSetRecentList
.reset();
164 m_xValSetColorListWin
.reset();
165 m_xValSetColorList
.reset();
168 void SvxColorTabPage::ImpColorCountChanged()
170 if (!pColorList
.is())
172 m_xValSetColorList
->SetColCount(SvxColorValueSet::getColumnCount());
173 m_xValSetRecentList
->SetColCount(SvxColorValueSet::getColumnCount());
176 void SvxColorTabPage::FillPaletteLB()
178 m_xSelectPalette
->clear();
179 std::vector
<OUString
> aPaletteList
= maPaletteManager
.GetPaletteList();
180 for (auto const& palette
: aPaletteList
)
182 m_xSelectPalette
->append_text(palette
);
184 OUString
aPaletteName( officecfg::Office::Common::UserColors::PaletteName::get() );
185 m_xSelectPalette
->set_active_text(aPaletteName
);
186 if (m_xSelectPalette
->get_active() != -1)
188 SelectPaletteLBHdl(*m_xSelectPalette
);
192 void SvxColorTabPage::Construct()
197 ImpColorCountChanged();
201 void SvxColorTabPage::ActivatePage( const SfxItemSet
& )
203 if( !pColorList
.is() )
206 if( const XFillColorItem
* pFillColorItem
= rOutAttrs
.GetItemIfSet( GetWhich( XATTR_FILLCOLOR
) ) )
208 SetColorModel( ColorModel::RGB
);
211 const Color aColor
= pFillColorItem
->GetColorValue();
212 NamedColor aNamedColor
;
213 aNamedColor
.m_aColor
= aColor
;
214 ChangeColor(aNamedColor
);
215 sal_Int32 nPos
= FindInPalette( aColor
);
218 m_xValSetColorList
->SelectItem(m_xValSetColorList
->GetItemId(nPos
));
219 // else search in other palettes?
223 m_aCtlPreviewOld
.SetAttributes(aXFillAttr
.GetItemSet());
224 m_aCtlPreviewOld
.Invalidate();
226 SelectValSetHdl_Impl(m_xValSetColorList
.get());
229 DeactivateRC
SvxColorTabPage::DeactivatePage( SfxItemSet
* _pSet
)
232 FillItemSet( _pSet
);
234 return DeactivateRC::LeavePage
;
237 bool SvxColorTabPage::FillItemSet( SfxItemSet
* rSet
)
239 Color aColor
= m_xValSetColorList
->GetItemColor( m_xValSetColorList
->GetSelectedItemId() );
241 if (m_aCurrentColor
.m_aColor
== aColor
)
242 sColorName
= m_xValSetColorList
->GetItemText( m_xValSetColorList
->GetSelectedItemId() );
244 sColorName
= "#" + m_aCurrentColor
.m_aColor
.AsRGBHexString().toAsciiUpperCase();
246 maPaletteManager
.AddRecentColor(m_aCurrentColor
.m_aColor
, sColorName
);
247 XFillColorItem
aColorItem(sColorName
, m_aCurrentColor
.m_aColor
);
248 aColorItem
.setComplexColor(m_aCurrentColor
.getComplexColor());
249 rSet
->Put(aColorItem
);
250 rSet
->Put(XFillStyleItem(drawing::FillStyle_SOLID
));
254 void SvxColorTabPage::UpdateModified()
256 bool bEnable
= pColorList
.is() && pColorList
->Count();
257 m_xBtnWorkOn
->set_sensitive(bEnable
);
260 void SvxColorTabPage::Reset( const SfxItemSet
* rSet
)
262 SfxItemState nState
= rSet
->GetItemState( XATTR_FILLCOLOR
);
266 if ( nState
>= SfxItemState::DEFAULT
)
268 const XFillColorItem
& aColorItem( rSet
->Get( XATTR_FILLCOLOR
) );
269 m_aPreviousColor
= aColorItem
.GetColorValue();
270 aNewColor
= aColorItem
.GetColorValue();
274 OUString aStr
= GetUserData();
275 eCM
= static_cast<ColorModel
>(aStr
.toInt32());
276 SetColorModel( eCM
);
280 aColor
.m_aColor
= aNewColor
;
286 std::unique_ptr
<SfxTabPage
> SvxColorTabPage::Create(weld::Container
* pPage
, weld::DialogController
* pController
, const SfxItemSet
* rOutAttrs
)
288 return std::make_unique
<SvxColorTabPage
>(pPage
, pController
, *rOutAttrs
);
291 // is called when the content of the MtrFields is changed for color values
292 IMPL_LINK_NOARG(SvxColorTabPage
, SpinValueHdl_Impl
, weld::SpinButton
&, void)
294 // read current MtrFields, if cmyk, then k-value as transparency
295 m_aCurrentColor
.m_aColor
= Color(static_cast<sal_uInt8
>(PercentToColor_Impl(m_xRcustom
->get_value())),
296 static_cast<sal_uInt8
>(PercentToColor_Impl(m_xGcustom
->get_value())),
297 static_cast<sal_uInt8
>(PercentToColor_Impl(m_xBcustom
->get_value())));
300 rXFSet
.Put( XFillColorItem( OUString(), m_aCurrentColor
.m_aColor
) );
301 m_aCtlPreviewNew
.SetAttributes( aXFillAttr
.GetItemSet() );
303 m_aCtlPreviewNew
.Invalidate();
306 IMPL_LINK_NOARG(SvxColorTabPage
, MetricSpinValueHdl_Impl
, weld::MetricSpinButton
&, void)
308 // read current MtrFields, if cmyk, then k-value as transparency
309 m_aCurrentColor
.m_aColor
= Color(ColorTransparency
, static_cast<sal_uInt8
>(PercentToColor_Impl(m_xKcustom
->get_value(FieldUnit::NONE
))),
310 static_cast<sal_uInt8
>(PercentToColor_Impl(m_xCcustom
->get_value(FieldUnit::NONE
))),
311 static_cast<sal_uInt8
>(PercentToColor_Impl(m_xYcustom
->get_value(FieldUnit::NONE
))),
312 static_cast<sal_uInt8
>(PercentToColor_Impl(m_xMcustom
->get_value(FieldUnit::NONE
))));
313 ConvertColorValues (m_aCurrentColor
.m_aColor
, ColorModel::RGB
);
315 rXFSet
.Put( XFillColorItem( OUString(), m_aCurrentColor
.m_aColor
) );
316 m_aCtlPreviewNew
.SetAttributes( aXFillAttr
.GetItemSet() );
318 m_aCtlPreviewNew
.Invalidate();
321 IMPL_LINK_NOARG(SvxColorTabPage
, ModifiedHdl_Impl
, weld::Entry
&, void)
323 m_aCurrentColor
.m_aColor
= m_xHexcustom
->GetColor();
326 rXFSet
.Put( XFillColorItem( OUString(), m_aCurrentColor
.m_aColor
) );
327 m_aCtlPreviewNew
.SetAttributes( aXFillAttr
.GetItemSet() );
329 m_aCtlPreviewNew
.Invalidate();
332 IMPL_LINK_NOARG(SvxColorTabPage
, ClickAddHdl_Impl
, weld::Button
&, void)
334 OUString
aNewName( SvxResId( RID_SVXSTR_COLOR
) );
335 OUString
aDesc( CuiResId( RID_CUISTR_DESC_COLOR
) );
339 bool bValidColorName
= false;
340 // check if name is already existing
341 while (!bValidColorName
)
343 aName
= aNewName
+ " " + OUString::number( j
++ );
344 bValidColorName
= (FindInCustomColors(aName
) == -1);
347 SvxAbstractDialogFactory
* pFact
= SvxAbstractDialogFactory::Create();
348 ScopedVclPtr
<AbstractSvxNameDialog
> pDlg(pFact
->CreateSvxNameDialog(GetFrameWeld(), aName
, aDesc
));
349 sal_uInt16 nError
= 1;
351 while (pDlg
->Execute() == RET_OK
)
353 aName
= pDlg
->GetName();
355 bValidColorName
= (FindInCustomColors(aName
) == -1);
362 std::unique_ptr
<weld::Builder
> xBuilder(Application::CreateBuilder(GetFrameWeld(), u
"cui/ui/queryduplicatedialog.ui"_ustr
));
363 std::unique_ptr
<weld::MessageDialog
> xWarnBox(xBuilder
->weld_message_dialog(u
"DuplicateNameDialog"_ustr
));
364 if (xWarnBox
->run() != RET_OK
)
368 pDlg
.disposeAndClear();
372 m_xSelectPalette
->set_active(0);
373 SelectPaletteLBHdl(*m_xSelectPalette
);
374 std::shared_ptr
<comphelper::ConfigurationChanges
> batch(comphelper::ConfigurationChanges::create());
375 css::uno::Sequence
< sal_Int32
> aCustomColorList(officecfg::Office::Common::UserColors::CustomColor::get());
376 css::uno::Sequence
< OUString
> aCustomColorNameList(officecfg::Office::Common::UserColors::CustomColorName::get());
377 sal_Int32 nSize
= aCustomColorList
.getLength();
378 aCustomColorList
.realloc( nSize
+ 1 );
379 aCustomColorNameList
.realloc( nSize
+ 1 );
380 aCustomColorList
.getArray()[nSize
] = sal_Int32(m_aCurrentColor
.m_aColor
);
381 aCustomColorNameList
.getArray()[nSize
] = aName
;
382 officecfg::Office::Common::UserColors::CustomColor::set(aCustomColorList
, batch
);
383 officecfg::Office::Common::UserColors::CustomColorName::set(aCustomColorNameList
, batch
);
385 sal_uInt16 nId
= m_xValSetColorList
->GetItemId(nSize
- 1);
386 m_xValSetColorList
->InsertItem( nId
+ 1 , m_aCurrentColor
.m_aColor
, aName
);
387 m_xValSetColorList
->SelectItem( nId
+ 1 );
388 m_xBtnDelete
->set_sensitive(false);
389 m_xBtnDelete
->set_tooltip_text( CuiResId(RID_CUISTR_DELETEUSERCOLOR2
) );
390 ImpColorCountChanged();
396 IMPL_LINK_NOARG(SvxColorTabPage
, ClickWorkOnHdl_Impl
, weld::Button
&, void)
398 SvColorDialog aColorDlg
;
400 aColorDlg
.SetColor (m_aCurrentColor
.m_aColor
);
401 aColorDlg
.SetMode( svtools::ColorPickerMode::Modify
);
403 if (aColorDlg
.Execute(GetFrameWeld()) == RET_OK
)
405 Color aPreviewColor
= aColorDlg
.GetColor();
406 m_aCurrentColor
.m_aColor
= aPreviewColor
;
407 UpdateColorValues( false );
408 // fill ItemSet and pass it on to XOut
409 rXFSet
.Put( XFillColorItem( OUString(), aPreviewColor
) );
410 //m_aCtlPreviewOld.SetAttributes( aXFillAttr );
411 m_aCtlPreviewNew
.SetAttributes( aXFillAttr
.GetItemSet() );
413 m_aCtlPreviewNew
.Invalidate();
417 IMPL_LINK_NOARG(SvxColorTabPage
, ClickDeleteHdl_Impl
, weld::Button
&, void)
419 sal_uInt16 nId
= m_xValSetColorList
->GetSelectedItemId();
420 size_t nPos
= m_xValSetColorList
->GetSelectItemPos();
421 if (m_xSelectPalette
->get_active() != 0 || nPos
== VALUESET_ITEM_NOTFOUND
)
424 std::shared_ptr
<comphelper::ConfigurationChanges
> batch(comphelper::ConfigurationChanges::create());
425 css::uno::Sequence
< sal_Int32
> aCustomColorList(officecfg::Office::Common::UserColors::CustomColor::get());
426 auto aCustomColorListRange
= asNonConstRange(aCustomColorList
);
427 css::uno::Sequence
< OUString
> aCustomColorNameList(officecfg::Office::Common::UserColors::CustomColorName::get());
428 auto aCustomColorNameListRange
= asNonConstRange(aCustomColorNameList
);
429 sal_Int32 nSize
= aCustomColorList
.getLength() - 1;
430 for(sal_Int32 nIndex
= static_cast<sal_Int32
>(nPos
);nIndex
< nSize
;nIndex
++)
432 aCustomColorListRange
[nIndex
] = aCustomColorList
[nIndex
+1];
433 aCustomColorNameListRange
[nIndex
] = aCustomColorNameList
[nIndex
+1];
435 aCustomColorList
.realloc(nSize
);
436 aCustomColorNameList
.realloc(nSize
);
437 officecfg::Office::Common::UserColors::CustomColor::set(aCustomColorList
, batch
);
438 officecfg::Office::Common::UserColors::CustomColorName::set(aCustomColorNameList
, batch
);
440 m_xValSetColorList
->RemoveItem(nId
);
441 if (m_xValSetColorList
->GetItemCount() != 0)
443 nId
= m_xValSetColorList
->GetItemId(0);
444 m_xValSetColorList
->SelectItem(nId
);
445 SelectValSetHdl_Impl(m_xValSetColorList
.get());
449 m_xBtnDelete
->set_sensitive(false);
450 m_xBtnDelete
->set_tooltip_text( CuiResId(RID_CUISTR_DELETEUSERCOLOR2
) );
454 IMPL_LINK_NOARG(SvxColorTabPage
, SelectPaletteLBHdl
, weld::ComboBox
&, void)
456 m_xValSetColorList
->Clear();
457 sal_Int32 nPos
= m_xSelectPalette
->get_active();
458 maPaletteManager
.SetPalette( nPos
);
459 maPaletteManager
.ReloadColorSet(*m_xValSetColorList
);
461 if(nPos
!= maPaletteManager
.GetPaletteCount() - 1 && nPos
!= 0)
463 XColorListRef pList
= XPropertyList::AsColorList(
464 XPropertyList::CreatePropertyListFromURL(
465 XPropertyListType::Color
, maPaletteManager
.GetSelectedPalettePath()));
466 pList
->SetName(maPaletteManager
.GetPaletteName());
469 SfxOkDialogController
* pController
= GetDialogController();
470 SvxAreaTabDialog
* pArea
= dynamic_cast<SvxAreaTabDialog
*>(pController
);
471 SvxLineTabDialog
* pLine
= dynamic_cast<SvxLineTabDialog
*>(pController
);
474 pArea
->SetNewColorList(pList
);
476 pLine
->SetNewColorList(pList
);
479 *pnColorListState
|= ChangeType::CHANGED
;
480 *pnColorListState
&= ~ChangeType::MODIFIED
;
485 m_xBtnDelete
->set_sensitive(false);
486 m_xBtnDelete
->set_tooltip_text( CuiResId(RID_CUISTR_DELETEUSERCOLOR1
) );
489 m_xValSetColorList
->Resize();
492 IMPL_LINK(SvxColorTabPage
, SelectValSetHdl_Impl
, ValueSet
*, pValSet
, void)
494 sal_Int32 nPos
= pValSet
->GetSelectedItemId();
498 Color aColor
= pValSet
->GetItemColor( nPos
);
500 rXFSet
.Put( XFillColorItem( OUString(), aColor
) );
501 m_aCtlPreviewNew
.SetAttributes( aXFillAttr
.GetItemSet() );
502 m_aCtlPreviewNew
.Invalidate();
504 NamedColor aNamedColor
;
505 aNamedColor
.m_aColor
= aColor
;
507 if (pValSet
== m_xValSetColorList
.get() && maPaletteManager
.IsThemePaletteSelected())
509 sal_uInt16 nThemeIndex
;
510 sal_uInt16 nEffectIndex
;
511 if (PaletteManager::GetThemeAndEffectIndex(nPos
, nThemeIndex
, nEffectIndex
))
513 aNamedColor
.m_nThemeIndex
= nThemeIndex
;
514 maPaletteManager
.GetLumModOff(nThemeIndex
, nEffectIndex
, aNamedColor
.m_nLumMod
, aNamedColor
.m_nLumOff
);
518 ChangeColor(aNamedColor
, false);
520 if (pValSet
== m_xValSetColorList
.get())
522 m_xValSetRecentList
->SetNoSelection();
523 if (m_xSelectPalette
->get_active() == 0 && m_xValSetColorList
->GetSelectedItemId() != 0)
525 m_xBtnDelete
->set_sensitive(true);
526 m_xBtnDelete
->set_tooltip_text(u
""_ustr
);
530 m_xBtnDelete
->set_sensitive(false);
531 m_xBtnDelete
->set_tooltip_text( CuiResId(RID_CUISTR_DELETEUSERCOLOR1
) );
534 if (pValSet
== m_xValSetRecentList
.get())
536 m_xValSetColorList
->SetNoSelection();
537 m_xBtnDelete
->set_sensitive(false);
538 m_xBtnDelete
->set_tooltip_text( CuiResId(RID_CUISTR_DELETEUSERCOLOR2
) );
542 void SvxColorTabPage::ConvertColorValues (Color
& rColor
, ColorModel eModell
)
546 case ColorModel::RGB
:
548 CmykToRgb_Impl (rColor
, static_cast<sal_uInt16
>(255 - rColor
.GetAlpha()) );
549 rColor
.SetAlpha (255);
553 case ColorModel::CMYK
:
556 RgbToCmyk_Impl (rColor
, nK
);
557 rColor
.SetAlpha (255 - static_cast<sal_uInt8
>(nK
));
563 IMPL_LINK_NOARG(SvxColorTabPage
, SelectColorModeHdl_Impl
, weld::Toggleable
&, void)
565 if (m_xRbRGB
->get_active())
566 eCM
= ColorModel::RGB
;
567 else if (m_xRbCMYK
->get_active())
568 eCM
= ColorModel::CMYK
;
574 IMPL_STATIC_LINK_NOARG(SvxColorTabPage
, OnMoreColorsClick
, weld::Button
&, void)
576 css::uno::Sequence
<css::beans::PropertyValue
> aArgs
{ comphelper::makePropertyValue(
577 u
"AdditionsTag"_ustr
, u
"Color Palette"_ustr
) };
578 comphelper::dispatchCommand(u
".uno:AdditionsDialog"_ustr
, aArgs
);
581 void SvxColorTabPage::ChangeColor(const NamedColor
&rNewColor
, bool bUpdatePreset
)
583 m_aPreviousColor
= rNewColor
.m_aColor
;
584 m_aCurrentColor
= rNewColor
;
585 UpdateColorValues( bUpdatePreset
);
586 // fill ItemSet and pass it on to XOut
587 XFillColorItem
aItem(OUString(), m_aCurrentColor
.m_aColor
);
588 aItem
.setComplexColor(m_aCurrentColor
.getComplexColor());
591 m_aCtlPreviewNew
.SetAttributes(aXFillAttr
.GetItemSet());
592 m_aCtlPreviewNew
.Invalidate();
595 void SvxColorTabPage::SetColorModel( ColorModel eModel
)
597 if (eModel
== ColorModel::RGB
)
598 m_xRbRGB
->set_active(true);
599 else if (eModel
== ColorModel::CMYK
)
600 m_xRbCMYK
->set_active(true);
603 void SvxColorTabPage::ChangeColorModel()
607 case ColorModel::RGB
:
609 m_xRGBcustom
->show();
610 m_xRGBpreset
->show();
611 m_xCMYKcustom
->hide();
612 m_xCMYKpreset
->hide();
616 case ColorModel::CMYK
:
618 m_xCMYKcustom
->show();
619 m_xCMYKpreset
->show();
620 m_xRGBcustom
->hide();
621 m_xRGBpreset
->hide();
627 void SvxColorTabPage::UpdateColorValues( bool bUpdatePreset
)
629 if (eCM
!= ColorModel::RGB
)
631 ConvertColorValues (m_aPreviousColor
, eCM
);
632 ConvertColorValues (m_aCurrentColor
.m_aColor
, eCM
);
634 m_xCcustom
->set_value( ColorToPercent_Impl( m_aCurrentColor
.m_aColor
.GetRed() ), FieldUnit::PERCENT
);
635 m_xMcustom
->set_value( ColorToPercent_Impl( m_aCurrentColor
.m_aColor
.GetBlue() ), FieldUnit::PERCENT
);
636 m_xYcustom
->set_value( ColorToPercent_Impl( m_aCurrentColor
.m_aColor
.GetGreen() ), FieldUnit::PERCENT
);
637 m_xKcustom
->set_value( ColorToPercent_Impl( 255 - m_aCurrentColor
.m_aColor
.GetAlpha() ), FieldUnit::PERCENT
);
641 m_xCpreset
->set_text(unicode::formatPercent(ColorToPercent_Impl(m_aPreviousColor
.GetRed()),
642 Application::GetSettings().GetUILanguageTag()));
643 m_xMpreset
->set_text(unicode::formatPercent(ColorToPercent_Impl(m_aPreviousColor
.GetBlue()),
644 Application::GetSettings().GetUILanguageTag()));
645 m_xYpreset
->set_text(unicode::formatPercent(ColorToPercent_Impl(m_aPreviousColor
.GetGreen()),
646 Application::GetSettings().GetUILanguageTag()));
647 m_xKpreset
->set_text(unicode::formatPercent(ColorToPercent_Impl(255 - m_aPreviousColor
.GetAlpha()),
648 Application::GetSettings().GetUILanguageTag()));
651 ConvertColorValues (m_aPreviousColor
, ColorModel::RGB
);
652 ConvertColorValues (m_aCurrentColor
.m_aColor
, ColorModel::RGB
);
656 m_xRcustom
->set_value( ColorToPercent_Impl( m_aCurrentColor
.m_aColor
.GetRed() ) );
657 m_xGcustom
->set_value( ColorToPercent_Impl( m_aCurrentColor
.m_aColor
.GetGreen() ) );
658 m_xBcustom
->set_value( ColorToPercent_Impl( m_aCurrentColor
.m_aColor
.GetBlue() ) );
659 m_xHexcustom
->SetColor( m_aCurrentColor
.m_aColor
);
663 m_xRpreset
->set_text(OUString::number(ColorToPercent_Impl(m_aPreviousColor
.GetRed())));
664 m_xGpreset
->set_text(OUString::number(ColorToPercent_Impl(m_aPreviousColor
.GetGreen())));
665 m_xBpreset
->set_text(OUString::number(ColorToPercent_Impl(m_aPreviousColor
.GetBlue())));
666 m_xHexpreset
->SetColor( m_aPreviousColor
);
671 sal_Int32
SvxColorTabPage::FindInCustomColors(std::u16string_view aColorName
)
673 css::uno::Sequence
< OUString
> aCustomColorNameList(officecfg::Office::Common::UserColors::CustomColorName::get());
674 tools::Long nCount
= aCustomColorNameList
.getLength();
675 bool bValidColorName
= true;
678 for(tools::Long i
= 0;i
< nCount
&& bValidColorName
;i
++)
680 if(aColorName
== aCustomColorNameList
[i
])
683 bValidColorName
= false;
689 sal_Int32
SvxColorTabPage::FindInPalette( const Color
& rColor
)
691 return pColorList
->GetIndexOfColor(rColor
);
694 // A RGB value is converted to a CMYK value - not in an ideal way as
695 // R is converted into C, G into M and B into Y. The K value is held in an
696 // extra variable. For further color models one should develop own
697 // classes which should contain the respective casts.
699 void SvxColorTabPage::RgbToCmyk_Impl( Color
& rColor
, sal_uInt16
& rK
)
701 sal_uInt16
const nColor1
= 255 - rColor
.GetRed();
702 sal_uInt16
const nColor2
= 255 - rColor
.GetGreen();
703 sal_uInt16
const nColor3
= 255 - rColor
.GetBlue();
705 rK
= std::min( std::min( nColor1
, nColor2
), nColor3
);
707 rColor
.SetRed( sal::static_int_cast
< sal_uInt8
>( nColor1
- rK
) );
708 rColor
.SetGreen( sal::static_int_cast
< sal_uInt8
>( nColor2
- rK
) );
709 rColor
.SetBlue( sal::static_int_cast
< sal_uInt8
>( nColor3
- rK
) );
713 // reverse case to RgbToCmyk_Impl (see above)
715 void SvxColorTabPage::CmykToRgb_Impl( Color
& rColor
, const sal_uInt16 nK
)
719 lTemp
= 255 - ( rColor
.GetRed() + nK
);
723 rColor
.SetRed( static_cast<sal_uInt8
>(lTemp
) );
725 lTemp
= 255 - ( rColor
.GetGreen() + nK
);
729 rColor
.SetGreen( static_cast<sal_uInt8
>(lTemp
) );
731 lTemp
= 255 - ( rColor
.GetBlue() + nK
);
735 rColor
.SetBlue( static_cast<sal_uInt8
>(lTemp
) );
739 sal_uInt16
SvxColorTabPage::ColorToPercent_Impl( sal_uInt16 nColor
)
741 sal_uInt16 nValue
= 0;
745 case ColorModel::RGB
:
749 case ColorModel::CMYK
:
750 nValue
= static_cast<sal_uInt16
>( static_cast<double>(nColor
) * 100.0 / 255.0 + 0.5 );
758 sal_uInt16
SvxColorTabPage::PercentToColor_Impl( sal_uInt16 nPercent
)
760 sal_uInt16 nValue
= 0;
764 case ColorModel::RGB
:
768 case ColorModel::CMYK
:
769 nValue
= static_cast<sal_uInt16
>( static_cast<double>(nPercent
) * 255.0 / 100.0 + 0.5 );
777 void SvxColorTabPage::FillUserData()
779 // the color model is saved in the Ini-file
780 SetUserData( OUString::number( static_cast<int>(eCM
) ) );
784 void SvxColorTabPage::SetPropertyList( XPropertyListType t
, const XPropertyListRef
&xRef
)
786 OSL_ASSERT( t
== XPropertyListType::Color
);
787 pColorList
= XColorListRef( static_cast<XColorList
*>(xRef
.get() ) );
790 void SvxColorTabPage::SetColorList( const XColorListRef
& pColList
)
792 SetPropertyList( XPropertyListType::Color
, XPropertyListRef( ( pColList
.get() ) ) );
795 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */