20 #include <com/sun/star/uno/XComponentContext.hpp>
21 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
22 #include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
23 #include <com/sun/star/beans/XPropertyAccess.hpp>
24 #include <com/sun/star/lang/XInitialization.hpp>
25 #include <com/sun/star/lang/XServiceInfo.hpp>
26 #include <com/sun/star/awt/XWindow.hpp>
66 template<>
struct typed_flags<
UpdateFlags> : is_typed_flags<UpdateFlags, 0x3f> {};
75 enum class ColorComponent {
92 static void RGBtoHSV(
double dR,
double dG,
double dB,
double& dH,
double& dS,
double& dV )
101 static void HSVtoRGB(
double dH,
double dS,
double dV,
double& dR,
double& dG,
double& dB )
105 dR = result.getRed();
106 dG = result.getGreen();
107 dB = result.getBlue();
111 static void CMYKtoRGB(
double fCyan,
double fMagenta,
double fYellow,
double fKey,
double& dR,
double& dG,
double& dB )
113 fCyan = (fCyan * ( 1.0 - fKey )) + fKey;
114 fMagenta = (fMagenta * ( 1.0 - fKey )) + fKey;
115 fYellow = (fYellow * ( 1.0 - fKey )) + fKey;
117 dR = std::clamp( 1.0 - fCyan, 0.0, 1.0 );
118 dG = std::clamp( 1.0 - fMagenta, 0.0, 1.0 );
119 dB = std::clamp( 1.0 - fYellow, 0.0, 1.0 );
123 static void RGBtoCMYK(
double dR,
double dG,
double dB,
double& fCyan,
double& fMagenta,
double& fYellow,
double& fKey )
131 if( fCyan < fKey ) fKey = fCyan;
132 if( fMagenta < fKey ) fKey = fMagenta;
133 if( fYellow < fKey ) fKey = fYellow;
144 fCyan = ( fCyan - fKey ) / ( 1.0 - fKey );
145 fMagenta = ( fMagenta - fKey ) / ( 1.0 - fKey );
146 fYellow = ( fYellow - fKey ) / ( 1.0 - fKey );
159 ColorPreviewControl()
165 CustomWidgetController::SetDrawingArea(pDrawingArea);
170 void SetColor(
const Color& rCol)
172 if (rCol != m_aColor)
191 enum ColorMode { HUE, SATURATION, BRIGHTNESS,
RED,
GREEN,
BLUE };
212 CustomWidgetController::SetDrawingArea(pDrawingArea);
217 virtual ~ColorFieldControl()
override
223 virtual void Resize()
override;
229 void ShowPosition(
const Point& rPos,
bool bUpdate );
230 void UpdatePosition();
233 void SetValues(
Color aColor, ColorMode
eMode,
double x,
double y);
234 double GetX()
const {
return mdX;}
235 double GetY()
const {
return mdY;}
257 void ColorFieldControl::UpdateBitmap()
259 const Size aSize(GetOutputSizePixel());
264 const sal_Int32 nWidth = aSize.
Width();
265 const sal_Int32 nHeight = aSize.
Height();
267 if (nWidth == 0 || nHeight == 0)
283 for( sal_Int32
x = 0;
x < nWidth;
x++ )
285 *pRGB++ =
static_cast<sal_uInt8>((
x * 256) / nWidth);
286 *pGrad++ =
static_cast<sal_uInt16
>((
x * 359) / nWidth);
287 *pPercent++ =
static_cast<sal_uInt16
>((
x * 100) / nWidth);
296 sal_Int32
y = nHeight;
299 *pRGB++ =
static_cast<sal_uInt8>((y * 256) / nHeight);
300 *pPercent++ =
static_cast<sal_uInt16
>((y * 100) / nHeight);
312 sal_uInt16 nHue, nSat, nBri;
317 sal_uInt16 y = nHeight,
x;
324 nBri = pPercent_Vert[y];
328 nSat = pPercent_Horiz[x];
336 nBri = pPercent_Vert[y];
340 nHue = pGrad_Horiz[x];
348 nSat = pPercent_Vert[y];
352 nHue = pGrad_Horiz[x];
360 aBitmapColor.SetGreen(pRGB_Vert[y]);
364 aBitmapColor.SetBlue(pRGB_Horiz[x]);
372 aBitmapColor.SetRed(pRGB_Vert[y]);
376 aBitmapColor.SetBlue(pRGB_Horiz[x]);
384 aBitmapColor.SetGreen(pRGB_Vert[y]);
388 aBitmapColor.SetRed(pRGB_Horiz[x]);
396 void ColorFieldControl::ShowPosition(
const Point& rPos,
bool bUpdate )
413 else if (nX >= aSize.
Width())
414 nX = aSize.
Width() - 1;
418 else if (nY >= aSize.
Height())
429 mdX = double(nX) / double(aSize.
Width() - 1.0);
430 mdY = double(aSize.
Height() - 1.0 - nY) /
double(aSize.
Height() - 1.0);
436 bool ColorFieldControl::MouseButtonDown(
const MouseEvent& rMEvt)
445 bool ColorFieldControl::MouseMove(
const MouseEvent& rMEvt)
455 bool ColorFieldControl::MouseButtonUp(
const MouseEvent&)
469 Size aSize(GetOutputSizePixel());
484 void ColorFieldControl::Resize()
486 CustomWidgetController::Resize();
491 void ColorFieldControl::Modify()
496 void ColorFieldControl::SetValues(
Color aColor, ColorMode eMode,
double x,
double y )
498 bool bUpdateBitmap = (
maColor!= aColor) || (
meMode != eMode);
499 if( !(bUpdateBitmap || (
mdX != x) || (
mdY != y)) )
514 void ColorFieldControl::UpdatePosition()
516 Size aSize(GetOutputSizePixel());
517 ShowPosition(
Point(static_cast<tools::Long>(
mdX * aSize.
Width()), static_cast<tools::Long>((1.0 -
mdY) * aSize.
Height())),
false);
525 ColorSliderControl();
526 virtual ~ColorSliderControl()
override;
534 virtual void Resize()
override;
540 void SetValue(
const Color& rColor, ColorMode eMode,
double dValue );
545 sal_Int16 GetLevel()
const {
return mnLevel; }
558 ColorSliderControl::ColorSliderControl()
567 CustomWidgetController::SetDrawingArea(pDrawingArea);
571 ColorSliderControl::~ColorSliderControl()
576 void ColorSliderControl::UpdateBitmap()
593 sal_uInt16 nHue, nSat, nBri;
605 nHue =
static_cast<sal_uInt16
>((359 * y) / nY);
611 nBri = std::max(sal_uInt16(32), nBri);
614 nSat =
static_cast<sal_uInt16
>((100 * y) / nY);
622 nBri =
static_cast<sal_uInt16
>((100 * y) / nY);
653 void ColorSliderControl::ChangePosition(
tools::Long nY)
655 const tools::Long nHeight = GetOutputSizePixel().Height() - 1;
659 else if (nY > nHeight)
663 mdValue = double(nHeight - nY) / double(nHeight);
666 bool ColorSliderControl::MouseButtonDown(
const MouseEvent& rMEvt)
674 bool ColorSliderControl::MouseMove(
const MouseEvent& rMEvt)
676 if (IsMouseCaptured())
684 bool ColorSliderControl::MouseButtonUp(
const MouseEvent&)
695 const Size aSize(GetOutputSizePixel());
698 int x = aSize.
Width();
706 void ColorSliderControl::Resize()
708 CustomWidgetController::Resize();
712 void ColorSliderControl::Modify()
719 bool bUpdateBitmap = (rColor !=
maColor) || (eMode !=
meMode);
720 if( bUpdateBitmap || (
mdValue != dValue))
724 mnLevel =
static_cast<sal_Int16
>((1.0-dValue) * GetOutputSizePixel().Height());
773 void update_color(
UpdateFlags n = UpdateFlags::All);
775 DECL_LINK(ColorFieldControlModifydl, ColorFieldControl&,
void);
776 DECL_LINK(ColorSliderControlModifyHdl, ColorSliderControl&,
void);
782 Color GetColor()
const;
784 void setColorComponent(ColorComponent nComp,
double dValue);
796 ColorPickerDialog::ColorPickerDialog(
weld::Window* pParent,
Color nColor, sal_Int16 nDialogMode)
804 ,
m_xRBRed(m_xBuilder->weld_radio_button(
"redRadiobutton"))
805 ,
m_xRBGreen(m_xBuilder->weld_radio_button(
"greenRadiobutton"))
806 ,
m_xRBBlue(m_xBuilder->weld_radio_button(
"blueRadiobutton"))
807 ,
m_xRBHue(m_xBuilder->weld_radio_button(
"hueRadiobutton"))
810 ,
m_xMFRed(m_xBuilder->weld_spin_button(
"redSpinbutton"))
811 ,
m_xMFGreen(m_xBuilder->weld_spin_button(
"greenSpinbutton"))
812 ,
m_xMFBlue(m_xBuilder->weld_spin_button(
"blueSpinbutton"))
813 ,
m_xEDHex(new
weld::HexColorControl(m_xBuilder->weld_entry(
"hexEntry")))
823 m_aColorField.SetModifyHdl(
LINK(
this, ColorPickerDialog, ColorFieldControlModifydl ) );
824 m_aColorSlider.SetModifyHdl(
LINK(
this, ColorPickerDialog, ColorSliderControlModifyHdl ) );
826 int nMargin = (
m_xFISliderLeft->get_preferred_size().Height() + 1) / 2;
831 m_xMFCyan->connect_value_changed( aLink3 );
834 m_xMFKey->connect_value_changed( aLink3 );
836 m_xMFHue->connect_value_changed( aLink3 );
841 m_xMFRed->connect_value_changed(aLink4);
843 m_xMFBlue->connect_value_changed(aLink4);
845 m_xEDHex->connect_changed(
LINK(
this, ColorPickerDialog, ColorModifyEditHdl));
848 m_xRBRed->connect_toggled( aLink2 );
851 m_xRBHue->connect_toggled( aLink2 );
855 Color aColor(nColor);
858 if (nDialogMode == 2)
864 mdRed =
static_cast<double>(aColor.
GetRed()) / 255.0;
874 static int toInt(
double dValue,
double dRange )
876 return static_cast< int >( std::floor((dValue * dRange) + 0.5 ) );
879 Color ColorPickerDialog::GetColor()
const
884 void ColorPickerDialog::update_color(
UpdateFlags n )
890 Color aColor(nRed, nGreen, nBlue);
892 if (n & UpdateFlags::RGB)
899 if (n & UpdateFlags::CMYK)
907 if (n & UpdateFlags::HSB )
914 if (n & UpdateFlags::ColorChooser )
939 if (n & UpdateFlags::ColorSlider)
964 if (n & UpdateFlags::Hex)
973 IMPL_LINK_NOARG(ColorPickerDialog, ColorFieldControlModifydl, ColorFieldControl&,
void)
982 setColorComponent( ColorComponent::Brightness, y );
986 setColorComponent( ColorComponent::Brightness, y );
990 setColorComponent( ColorComponent::Saturation, y );
994 setColorComponent( ColorComponent::Green, y );
998 setColorComponent( ColorComponent::Red, y );
1002 setColorComponent( ColorComponent::Green, y );
1006 update_color(UpdateFlags::All & ~UpdateFlags::ColorChooser);
1009 IMPL_LINK_NOARG(ColorPickerDialog, ColorSliderControlModifyHdl, ColorSliderControl&,
void)
1015 setColorComponent( ColorComponent::Hue, dValue * 360.0 );
1018 setColorComponent( ColorComponent::Saturation, dValue );
1021 setColorComponent( ColorComponent::Brightness, dValue );
1024 setColorComponent( ColorComponent::Red, dValue );
1027 setColorComponent( ColorComponent::Green, dValue );
1030 setColorComponent( ColorComponent::Blue, dValue );
1034 update_color(UpdateFlags::All & ~UpdateFlags::ColorSlider);
1043 setColorComponent( ColorComponent::Hue, static_cast<double>(
m_xMFHue->get_value(FieldUnit::DEGREE)) );
1048 setColorComponent( ColorComponent::Saturation, static_cast<double>(
m_xMFSaturation->get_value(FieldUnit::PERCENT)) / 100.0 );
1053 setColorComponent( ColorComponent::Brightness, static_cast<double>(
m_xMFBrightness->get_value(FieldUnit::PERCENT)) / 100.0 );
1058 setColorComponent( ColorComponent::Cyan, static_cast<double>(
m_xMFCyan->get_value(FieldUnit::PERCENT)) / 100.0 );
1063 setColorComponent( ColorComponent::Magenta, static_cast<double>(
m_xMFMagenta->get_value(FieldUnit::PERCENT)) / 100.0 );
1068 setColorComponent( ColorComponent::Yellow, static_cast<double>(
m_xMFYellow->get_value(FieldUnit::PERCENT)) / 100.0 );
1073 setColorComponent( ColorComponent::Key, static_cast<double>(
m_xMFKey->get_value(FieldUnit::PERCENT)) / 100.0 );
1077 if (n != UpdateFlags::NONE)
1087 if (aColor !=
COL_AUTO && aColor != GetColor())
1089 mdRed =
static_cast<double>(aColor.
GetRed()) / 255.0;
1098 if (n != UpdateFlags::NONE)
1108 setColorComponent( ColorComponent::Red, static_cast<double>(
m_xMFRed->get_value()) / 255.0 );
1113 setColorComponent( ColorComponent::Green, static_cast<double>(
m_xMFGreen->get_value()) / 255.0 );
1118 setColorComponent( ColorComponent::Blue, static_cast<double>(
m_xMFBlue->get_value()) / 255.0 );
1122 if (n != UpdateFlags::NONE)
1129 ColorMode eMode = HUE;
1155 update_color(UpdateFlags::ColorChooser | UpdateFlags::ColorSlider);
1159 void ColorPickerDialog::setColorComponent( ColorComponent nComp,
double dValue )
1163 case ColorComponent::Red:
1166 case ColorComponent::Green:
1169 case ColorComponent::Blue:
1172 case ColorComponent::Hue:
1175 case ColorComponent::Saturation:
1178 case ColorComponent::Brightness:
1181 case ColorComponent::Cyan:
1184 case ColorComponent::Yellow:
1187 case ColorComponent::Magenta:
1190 case ColorComponent::Key:
1195 if (nComp == ColorComponent::Red || nComp == ColorComponent::Green || nComp == ColorComponent::Blue)
1200 else if (nComp == ColorComponent::Hue || nComp == ColorComponent::Saturation || nComp == ColorComponent::Brightness)
1212 typedef ::cppu::WeakComponentImplHelper< XServiceInfo, XExecutableDialog, XAsynchronousExecutableDialog, XInitialization, XPropertyAccess >
ColorPickerBase;
1217 public ColorPickerBase
1220 explicit ColorPicker();
1223 virtual void SAL_CALL initialize(
const Sequence< Any >&
aArguments )
override;
1231 virtual Sequence< PropertyValue > SAL_CALL getPropertyValues( )
override;
1232 virtual void SAL_CALL setPropertyValues(
const Sequence< PropertyValue >& aProps )
override;
1235 virtual void SAL_CALL setTitle(
const OUString& aTitle )
override;
1236 virtual sal_Int16 SAL_CALL execute( )
override;
1239 virtual void SAL_CALL setDialogTitle(
const OUString& aTitle )
override;
1240 virtual void SAL_CALL startExecuteModal(
const css::uno::Reference< css::ui::dialogs::XDialogClosedListener >& xListener )
override;
1250 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
1252 css::uno::XComponentContext*, css::uno::Sequence<css::uno::Any>
const&)
1254 return cppu::acquire(
new ColorPicker );
1258 constexpr OUStringLiteral
gsColorKey( u
"Color" );
1259 constexpr OUStringLiteral
gsModeKey( u
"Mode" );
1261 ColorPicker::ColorPicker()
1269 void SAL_CALL ColorPicker::initialize(
const Sequence< Any >& aArguments )
1271 if( aArguments.getLength() == 1 )
1278 OUString SAL_CALL ColorPicker::getImplementationName( )
1280 return "com.sun.star.cui.ColorPicker";
1283 sal_Bool SAL_CALL ColorPicker::supportsService(
const OUString& sServiceName )
1290 return {
"com.sun.star.ui.dialogs.ColorPicker",
1291 "com.sun.star.ui.dialogs.AsynchronousColorPicker" };
1295 Sequence< PropertyValue > SAL_CALL ColorPicker::getPropertyValues( )
1301 void SAL_CALL ColorPicker::setPropertyValues(
const Sequence< PropertyValue >& aProps )
1303 for (
const PropertyValue& rProp : aProps )
1317 void SAL_CALL ColorPicker::setTitle(
const OUString& )
1321 sal_Int16 SAL_CALL ColorPicker::execute()
1324 sal_Int16 ret = xDlg->run();
1331 void SAL_CALL ColorPicker::setDialogTitle(
const OUString& )
1335 void SAL_CALL ColorPicker::startExecuteModal(
const css::uno::Reference< css::ui::dialogs::XDialogClosedListener >& xListener )
1340 mnColor = xDlg->GetColor();
1342 sal_Int16 nRet =
static_cast<sal_Int16
>(nResult);
1343 css::ui::dialogs::DialogClosedEvent
aEvent( *
this, nRet );
1344 xListener->dialogClosed( aEvent );
std::unique_ptr< weld::MetricSpinButton > m_xMFCyan
std::vector< sal_uInt16 > maPercent_Vert
#define LINK(Instance, Class, Member)
ColorPreviewControl m_aColorPrevious
static int toInt(double dValue, double dRange)
DECL_LINK(CheckNameHdl, SvxNameDialog &, bool)
ColorPreviewControl m_aColorPreview
std::unique_ptr< weld::HexColorControl > m_xEDHex
std::unique_ptr< weld::RadioButton > m_xRBSaturation
std::unique_ptr< weld::SpinButton > m_xMFGreen
std::unique_ptr< weld::CustomWeld > m_xColorField
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_cui_ColorPicker_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
ColorSliderControl m_aColorSlider
std::unique_ptr< weld::RadioButton > m_xRBBlue
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
std::unique_ptr< weld::RadioButton > m_xRBRed
constexpr::Color COL_AUTO(ColorTransparency, 0xFF, 0xFF, 0xFF, 0xFF)
std::unique_ptr< weld::CustomWeld > m_xColorPreview
constexpr OUStringLiteral PERCENT(u"Percent")
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
std::unique_ptr< weld::MetricSpinButton > m_xMFSaturation
const ColorMode DefaultMode
IMPL_LINK(ColorPickerDialog, ColorModifySpinHdl, weld::SpinButton &, rEdit, void)
IMPL_LINK_NOARG(ColorPickerDialog, ModeModifyHdl, weld::Toggleable &, void)
std::unique_ptr< weld::MetricSpinButton > m_xMFHue
std::vector< sal_uInt8 > maRGB_Horiz
std::unique_ptr< weld::CustomWeld > m_xColorPrevious
constexpr OUStringLiteral gsColorKey(u"Color")
constexpr tools::Long Width() const
static bool runAsync(const std::shared_ptr< DialogController > &rController, const std::function< void(sal_Int32)> &)
Sequence< PropertyValue > aArguments
static void HSVtoRGB(double dH, double dS, double dV, double &dR, double &dG, double &dB)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
Reference< css::awt::XWindow > mxParent
static Color HSBtoRGB(sal_uInt16 nHue, sal_uInt16 nSaturation, sal_uInt16 nBrightness)
sal_uInt8 GetBlue() const
void DrawRect(const tools::Rectangle &rRect)
virtual tools::Long GetValue() const override
std::unique_ptr< weld::SpinButton > m_xMFRed
static void RGBtoCMYK(double dR, double dG, double dB, double &fCyan, double &fMagenta, double &fYellow, double &fKey)
std::unique_ptr< weld::RadioButton > m_xRBGreen
Link< ColorFieldControl &, void > maModifyHdl
bool SetOutputSizePixel(const Size &rNewSize, bool bErase=true)
BColor hsv2rgb(const BColor &rHSVColor)
std::unique_ptr< weld::CustomWeld > m_xColorSlider
static weld::Window * GetFrameWeld(const css::uno::Reference< css::awt::XWindow > &rWindow)
static void RGBtoHSV(double dR, double dG, double dB, double &dH, double &dS, double &dV)
std::vector< sal_uInt16 > maPercent_Horiz
VclPtr< VirtualDevice > mxBitmap
Size GetOutputSizePixel() const
std::unique_ptr< weld::MetricSpinButton > m_xMFKey
std::unique_ptr< weld::MetricSpinButton > m_xMFYellow
void DrawPixel(const Point &rPt)
sal_uInt8 GetGreen() const
constexpr OUStringLiteral gsModeKey(u"Mode")
constexpr tools::Long Height() const
static void CMYKtoRGB(double fCyan, double fMagenta, double fYellow, double fKey, double &dR, double &dG, double &dB)
std::vector< sal_uInt8 > maRGB_Vert
std::unique_ptr< weld::MetricSpinButton > m_xMFBrightness
std::unique_ptr< weld::RadioButton > m_xRBBrightness
::cppu::WeakComponentImplHelper< XServiceInfo, XExecutableDialog, XAsynchronousExecutableDialog, XInitialization, XPropertyAccess > ColorPickerBase
static VclPtr< reference_type > Create(Arg &&...arg)
const Point & GetPosPixel() const
BColor rgb2hsv(const BColor &rRGBColor)
std::vector< sal_uInt16 > maGrad_Horiz
void DrawEllipse(const tools::Rectangle &rRect)
std::unique_ptr< weld::Widget > m_xFISliderRight
void RGBtoHSB(sal_uInt16 &nHue, sal_uInt16 &nSaturation, sal_uInt16 &nBrightness) const
std::unique_ptr< weld::MetricSpinButton > m_xMFMagenta
std::unique_ptr< weld::SpinButton > m_xMFBlue
Color GetPixel(const Point &rPt) const
std::unique_ptr< weld::RadioButton > m_xRBHue
std::unique_ptr< weld::Widget > m_xFISliderLeft
ColorFieldControl m_aColorField
SAL_DLLPRIVATE void DrawOutDev(const Point &, const Size &, const Point &, const Size &, const Printer &)=delete
virtual void SetValue(tools::Long nNew) override