Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 : #include <com/sun/star/uno/XComponentContext.hpp>
21 : #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
22 : #include <com/sun/star/beans/XPropertyAccess.hpp>
23 : #include <com/sun/star/lang/XInitialization.hpp>
24 : #include <com/sun/star/lang/XServiceInfo.hpp>
25 : #include <com/sun/star/datatransfer/XTransferable.hpp>
26 : #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
27 : #include <com/sun/star/awt/XWindow.hpp>
28 : #include <cppuhelper/compbase4.hxx>
29 : #include <cppuhelper/supportsservice.hxx>
30 : #include <comphelper/broadcasthelper.hxx>
31 : #include <vcl/dialog.hxx>
32 : #include <vcl/button.hxx>
33 : #include <vcl/fixed.hxx>
34 : #include <vcl/edit.hxx>
35 : #include <vcl/field.hxx>
36 : #include <vcl/bmpacc.hxx>
37 : #include <vcl/decoview.hxx>
38 : #include <vcl/svapp.hxx>
39 : #include <toolkit/helper/vclunohelper.hxx>
40 : #include <sot/exchange.hxx>
41 : #include <sot/formats.hxx>
42 : #include <sax/tools/converter.hxx>
43 : #include <basegfx/color/bcolortools.hxx>
44 : #include "dialmgr.hxx"
45 : #include "colorpicker.hrc"
46 : #include "colorpicker.hxx"
47 : #include <cmath>
48 : #include <limits>
49 :
50 : using namespace ::com::sun::star::uno;
51 : using namespace ::com::sun::star::lang;
52 : using namespace ::com::sun::star::ui::dialogs;
53 : using namespace ::com::sun::star::beans;
54 : using namespace ::basegfx;
55 :
56 : namespace cui
57 : {
58 : const sal_uInt16 COLORMODE_RGB = 0x10;
59 : const sal_uInt16 COLORMODE_HSV = 0x20;
60 :
61 : const sal_uInt16 COLORCOMP_RED = 0x10;
62 : const sal_uInt16 COLORCOMP_GREEN = 0x11;
63 : const sal_uInt16 COLORCOMP_BLUE = 0x12;
64 :
65 : const sal_uInt16 COLORCOMP_HUE = 0x20;
66 : const sal_uInt16 COLORCOMP_SAT = 0x21;
67 : const sal_uInt16 COLORCOMP_BRI = 0x22;
68 :
69 : const sal_uInt16 COLORCOMP_CYAN = 0x40;
70 : const sal_uInt16 COLORCOMP_YELLOW = 0x41;
71 : const sal_uInt16 COLORCOMP_MAGENTA = 0x42;
72 : const sal_uInt16 COLORCOMP_KEY = 0x43;
73 :
74 : // color space conversion helpers
75 :
76 0 : static void RGBtoHSV( double dR, double dG, double dB, double& dH, double& dS, double& dV )
77 : {
78 0 : BColor result = basegfx::tools::rgb2hsv( BColor( dR, dG, dB ) );
79 :
80 0 : dH = result.getX();
81 0 : dS = result.getY();
82 0 : dV = result.getZ();
83 0 : }
84 :
85 0 : static void HSVtoRGB(double dH, double dS, double dV, double& dR, double& dG, double& dB )
86 : {
87 0 : BColor result = basegfx::tools::hsv2rgb( BColor( dH, dS, dV ) );
88 :
89 0 : dR = result.getRed();
90 0 : dG = result.getGreen();
91 0 : dB = result.getBlue();
92 0 : }
93 :
94 : // CMYK values from 0 to 1
95 0 : static void CMYKtoRGB( double fCyan, double fMagenta, double fYellow, double fKey, double& dR, double& dG, double& dB )
96 : {
97 0 : fCyan = (fCyan * ( 1.0 - fKey )) + fKey;
98 0 : fMagenta = (fMagenta * ( 1.0 - fKey )) + fKey;
99 0 : fYellow = (fYellow * ( 1.0 - fKey )) + fKey;
100 :
101 0 : dR = std::max( std::min( ( 1.0 - fCyan ), 1.0), 0.0 );
102 0 : dG = std::max( std::min( ( 1.0 - fMagenta ), 1.0), 0.0 );
103 0 : dB = std::max( std::min( ( 1.0 - fYellow ), 1.0), 0.0 );
104 0 : }
105 :
106 : // CMY results from 0 to 1
107 0 : static void RGBtoCMYK( double dR, double dG, double dB, double& fCyan, double& fMagenta, double& fYellow, double& fKey )
108 : {
109 0 : fCyan = 1 - dR;
110 0 : fMagenta = 1 - dG;
111 0 : fYellow = 1 - dB;
112 :
113 : //CMYK and CMY values from 0 to 1
114 0 : fKey = 1.0;
115 0 : if( fCyan < fKey ) fKey = fCyan;
116 0 : if( fMagenta < fKey ) fKey = fMagenta;
117 0 : if( fYellow < fKey ) fKey = fYellow;
118 :
119 0 : if( fKey >= 1.0 )
120 : {
121 : //Black
122 0 : fCyan = 0.0;
123 0 : fMagenta = 0.0;
124 0 : fYellow = 0.0;
125 : }
126 : else
127 : {
128 0 : fCyan = ( fCyan - fKey ) / ( 1.0 - fKey );
129 0 : fMagenta = ( fMagenta - fKey ) / ( 1.0 - fKey );
130 0 : fYellow = ( fYellow - fKey ) / ( 1.0 - fKey );
131 : }
132 0 : }
133 :
134 0 : class HexColorControl : public Edit
135 : {
136 : public:
137 : HexColorControl( Window* pParent, const ResId& rResId );
138 :
139 : virtual bool PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
140 : virtual void Paste() SAL_OVERRIDE;
141 :
142 : void SetColor( sal_Int32 nColor );
143 : sal_Int32 GetColor();
144 :
145 : private:
146 : bool ImplProcessKeyInput( const KeyEvent& rKEv );
147 : };
148 :
149 0 : HexColorControl::HexColorControl( Window* pParent, const ResId& rResId )
150 0 : : Edit( pParent, rResId )
151 : {
152 0 : SetMaxTextLen( 6 );
153 0 : }
154 :
155 0 : void HexColorControl::SetColor( sal_Int32 nColor )
156 : {
157 0 : OUStringBuffer aBuffer;
158 0 : sax::Converter::convertColor( aBuffer, nColor );
159 0 : SetText( aBuffer.makeStringAndClear().copy(1) );
160 0 : }
161 :
162 0 : sal_Int32 HexColorControl::GetColor()
163 : {
164 0 : sal_Int32 nColor = -1;
165 :
166 0 : OUString aStr( "#" );
167 0 : aStr += GetText();
168 0 : sal_Int32 nLen = aStr.getLength();
169 0 : if( nLen < 7 )
170 : {
171 : static const sal_Char* pNullStr = "000000";
172 0 : aStr += OUString::createFromAscii( &pNullStr[nLen-1] );
173 : }
174 :
175 0 : sax::Converter::convertColor( nColor, aStr );
176 :
177 0 : if( nColor == -1 )
178 0 : SetControlBackground( Color( COL_RED ) );
179 : else
180 0 : SetControlBackground();
181 :
182 0 : return nColor;
183 : }
184 :
185 0 : bool HexColorControl::PreNotify( NotifyEvent& rNEvt )
186 : {
187 0 : if ( (rNEvt.GetType() == EVENT_KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() )
188 : {
189 0 : if ( ImplProcessKeyInput( *rNEvt.GetKeyEvent() ) )
190 0 : return true;
191 : }
192 :
193 0 : return Edit::PreNotify( rNEvt );
194 : }
195 :
196 0 : void HexColorControl::Paste()
197 : {
198 0 : ::com::sun::star::uno::Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipboard(GetClipboard());
199 0 : if ( aClipboard.is() )
200 : {
201 0 : ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xDataObj;
202 :
203 0 : const sal_uInt32 nRef = Application::ReleaseSolarMutex();
204 :
205 : try
206 : {
207 0 : xDataObj = aClipboard->getContents();
208 : }
209 0 : catch( const ::com::sun::star::uno::Exception& )
210 : {
211 : }
212 :
213 0 : Application::AcquireSolarMutex( nRef );
214 :
215 0 : if ( xDataObj.is() )
216 : {
217 0 : ::com::sun::star::datatransfer::DataFlavor aFlavor;
218 0 : SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
219 : try
220 : {
221 0 : ::com::sun::star::uno::Any aData = xDataObj->getTransferData( aFlavor );
222 0 : OUString aText;
223 0 : aData >>= aText;
224 :
225 0 : if( !aText.isEmpty() && aText.matchAsciiL( "#", 1, 0 ) )
226 0 : aText = aText.copy(1);
227 :
228 0 : if( aText.getLength() > 6 )
229 0 : aText = aText.copy( 0, 6 );
230 :
231 0 : SetText( aText );
232 : }
233 0 : catch( const ::com::sun::star::uno::Exception& )
234 : {
235 0 : }
236 0 : }
237 0 : }
238 0 : }
239 :
240 0 : bool HexColorControl::ImplProcessKeyInput( const KeyEvent& rKEv )
241 : {
242 0 : const KeyCode& rKeyCode = rKEv.GetKeyCode();
243 :
244 0 : if( rKeyCode.GetGroup() == KEYGROUP_ALPHA && !rKeyCode.IsMod1() && !rKeyCode.IsMod2() )
245 : {
246 0 : if( (rKeyCode.GetCode() < KEY_A) || (rKeyCode.GetCode() > KEY_F) )
247 0 : return true;
248 : }
249 0 : else if( rKeyCode.GetGroup() == KEYGROUP_NUM )
250 : {
251 0 : if( rKeyCode.IsShift() )
252 0 : return true;
253 : }
254 0 : return false;
255 : }
256 :
257 0 : class ColorPreviewControl : public Control
258 : {
259 : public:
260 : ColorPreviewControl( Window* pParent, const ResId& rResId );
261 :
262 : virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE;
263 :
264 : void SetColor( const Color& rColor );
265 : private:
266 : Color maColor;
267 : };
268 :
269 0 : ColorPreviewControl::ColorPreviewControl( Window* pParent, const ResId& rResId )
270 0 : : Control( pParent, rResId )
271 : {
272 0 : SetFillColor( maColor );
273 0 : SetLineColor( maColor );
274 0 : }
275 :
276 0 : void ColorPreviewControl::SetColor( const Color& rCol )
277 : {
278 0 : if( rCol != maColor )
279 : {
280 0 : maColor = rCol;
281 0 : SetFillColor( maColor );
282 0 : SetLineColor( maColor );
283 0 : Invalidate();
284 : }
285 0 : }
286 :
287 0 : void ColorPreviewControl::Paint( const Rectangle& rRect )
288 : {
289 0 : DrawRect( rRect );
290 0 : }
291 :
292 : enum ColorMode { HUE, SATURATION, BRIGHTNESS, RED, GREEN, BLUE };
293 : const ColorMode DefaultMode = HUE;
294 :
295 : class ColorFieldControl : public Control
296 : {
297 : public:
298 : ColorFieldControl( Window* pParent, const ResId& rResId );
299 : virtual ~ColorFieldControl();
300 :
301 : virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
302 : virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
303 : virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
304 : virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
305 : virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE;
306 : virtual void Resize() SAL_OVERRIDE;
307 :
308 : void UpdateBitmap();
309 : void ShowPosition( const Point& rPos, bool bUpdate );
310 : void UpdatePosition();
311 : void Modify();
312 :
313 : void SetValues( Color aColor, ColorMode eMode, double x, double y );
314 : double GetX();
315 : double GetY();
316 :
317 : void KeyMove( int dx, int dy );
318 :
319 0 : void SetModifyHdl( Link& rLink ) { maModifyHdl = rLink; }
320 :
321 : private:
322 : Link maModifyHdl;
323 : ColorMode meMode;
324 : Color maColor;
325 : double mdX;
326 : double mdY;
327 : Point maPosition;
328 : Bitmap* mpBitmap;
329 : std::vector< sal_uInt8 > maRGB_Horiz;
330 : std::vector< sal_uInt16 > maGrad_Horiz;
331 : std::vector< sal_uInt16 > maPercent_Horiz;
332 : std::vector< sal_uInt8 > maRGB_Vert;
333 : std::vector< sal_uInt16 > maPercent_Vert;
334 : };
335 :
336 0 : ColorFieldControl::ColorFieldControl( Window* pParent, const ResId& rResId )
337 : : Control( pParent, rResId )
338 : , meMode( DefaultMode )
339 : , mdX( -1.0 )
340 : , mdY( -1.0 )
341 0 : , mpBitmap( 0 )
342 : {
343 0 : SetControlBackground();
344 0 : }
345 :
346 0 : ColorFieldControl::~ColorFieldControl()
347 : {
348 0 : delete mpBitmap;
349 0 : }
350 :
351 0 : void ColorFieldControl::UpdateBitmap()
352 : {
353 0 : const Size aSize( GetOutputSizePixel() );
354 :
355 0 : if( mpBitmap && mpBitmap->GetSizePixel() != aSize )
356 0 : delete mpBitmap, mpBitmap = NULL;
357 :
358 0 : const sal_Int32 nWidth = aSize.Width();
359 0 : const sal_Int32 nHeight = aSize.Height();
360 :
361 0 : if( !mpBitmap )
362 : {
363 0 : mpBitmap = new Bitmap( aSize, 24 );
364 :
365 0 : maRGB_Horiz.resize( nWidth );
366 0 : maGrad_Horiz.resize( nWidth );
367 0 : maPercent_Horiz.resize( nWidth );
368 :
369 0 : sal_uInt8* pRGB = &(*maRGB_Horiz.begin());
370 0 : sal_uInt16* pGrad = &(*maGrad_Horiz.begin());
371 0 : sal_uInt16* pPercent = &(*maPercent_Horiz.begin());
372 :
373 0 : for( sal_Int32 x = 0; x < nWidth; x++ )
374 : {
375 0 : *pRGB++ = static_cast< sal_uInt8 >( (x * 256) / nWidth );
376 0 : *pGrad++ = static_cast< sal_uInt16 >( (x * 359) / nWidth );
377 0 : *pPercent++ = static_cast< sal_uInt16 >( (x * 100) / nWidth );
378 : }
379 :
380 0 : maRGB_Vert.resize( nHeight );
381 0 : maPercent_Vert.resize( nHeight );
382 :
383 0 : pRGB = &(*maRGB_Vert.begin());
384 0 : pPercent = &(*maPercent_Vert.begin());
385 :
386 0 : sal_Int32 y = nHeight;
387 0 : while( y-- )
388 : {
389 0 : *pRGB++ = static_cast< sal_uInt8 >( (y * 256) / nHeight );
390 0 : *pPercent++ = static_cast< sal_uInt16 >( (y * 100) / nHeight );
391 : }
392 : }
393 :
394 0 : sal_uInt8* pRGB_Horiz = &(*maRGB_Horiz.begin());
395 0 : sal_uInt16* pGrad_Horiz = &(*maGrad_Horiz.begin());
396 0 : sal_uInt16* pPercent_Horiz = &(*maPercent_Horiz.begin());
397 0 : sal_uInt8* pRGB_Vert = &(*maRGB_Vert.begin());
398 0 : sal_uInt16* pPercent_Vert = &(*maPercent_Vert.begin());
399 :
400 0 : BitmapWriteAccess* pWriteAccess = mpBitmap->AcquireWriteAccess();
401 0 : if( pWriteAccess )
402 : {
403 0 : BitmapColor aBitmapColor( maColor );
404 :
405 : sal_uInt16 nHue, nSat, nBri;
406 0 : maColor.RGBtoHSB( nHue, nSat, nBri );
407 :
408 : // this has been unlooped for performance reason, please do not merge back!
409 :
410 0 : sal_uInt16 y = nHeight,x;
411 :
412 0 : switch( meMode )
413 : {
414 : case HUE:
415 0 : while( y-- )
416 : {
417 0 : nBri = pPercent_Vert[y];
418 0 : x = nWidth;
419 0 : while( x-- )
420 : {
421 0 : nSat = pPercent_Horiz[x];
422 0 : pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
423 : }
424 : }
425 0 : break;
426 : case SATURATION:
427 0 : while( y-- )
428 : {
429 0 : nBri = pPercent_Vert[y];
430 0 : x = nWidth;
431 0 : while( x-- )
432 : {
433 0 : nHue = pGrad_Horiz[x];
434 0 : pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
435 : }
436 : }
437 0 : break;
438 : case BRIGHTNESS:
439 0 : while( y-- )
440 : {
441 0 : nSat = pPercent_Vert[y];
442 0 : x = nWidth;
443 0 : while( x-- )
444 : {
445 0 : nHue = pGrad_Horiz[x];
446 0 : pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
447 : }
448 : }
449 0 : break;
450 : case RED:
451 0 : while( y-- )
452 : {
453 0 : aBitmapColor.SetGreen( pRGB_Vert[y] );
454 0 : x = nWidth;
455 0 : while( x-- )
456 : {
457 0 : aBitmapColor.SetBlue( pRGB_Horiz[x] );
458 0 : pWriteAccess->SetPixel( y, x, aBitmapColor );
459 : }
460 : }
461 0 : break;
462 : case GREEN:
463 0 : while( y-- )
464 : {
465 0 : aBitmapColor.SetRed( pRGB_Vert[y] );
466 0 : x = nWidth;
467 0 : while( x-- )
468 : {
469 0 : aBitmapColor.SetBlue( pRGB_Horiz[x] );
470 0 : pWriteAccess->SetPixel( y, x, aBitmapColor );
471 : }
472 : }
473 0 : break;
474 : case BLUE:
475 0 : while( y-- )
476 : {
477 0 : aBitmapColor.SetGreen( pRGB_Vert[y] );
478 0 : x = nWidth;
479 0 : while( x-- )
480 : {
481 0 : aBitmapColor.SetRed( pRGB_Horiz[x] );
482 0 : pWriteAccess->SetPixel( y, x, aBitmapColor );
483 : }
484 : }
485 0 : break;
486 : }
487 :
488 0 : mpBitmap->ReleaseAccess( pWriteAccess );
489 : }
490 0 : }
491 :
492 0 : void ColorFieldControl::ShowPosition( const Point& rPos, bool bUpdate )
493 : {
494 0 : if( !mpBitmap )
495 : {
496 0 : UpdateBitmap();
497 0 : Invalidate();
498 : }
499 :
500 0 : const Size aSize( mpBitmap->GetSizePixel() );
501 :
502 0 : long nX = rPos.X();
503 0 : long nY = rPos.Y();
504 0 : if( nX < 0L )
505 0 : nX = 0L;
506 0 : else if( nX >= aSize.Width() )
507 0 : nX = aSize.Width() - 1L;
508 :
509 0 : if( nY < 0L )
510 0 : nY= 0L;
511 0 : else if( nY >= aSize.Height() )
512 0 : nY = aSize.Height() - 1L;
513 :
514 0 : Point aPos = maPosition;
515 0 : maPosition.X() = nX - 5;
516 0 : maPosition.Y() = nY - 5;
517 0 : Invalidate( Rectangle( aPos, Size( 11, 11) ) );
518 0 : Invalidate( Rectangle( maPosition, Size( 11, 11) ) );
519 :
520 0 : if( bUpdate )
521 : {
522 0 : mdX = (double)nX / (double)(aSize.Width()-1);
523 0 : mdY = (double)(aSize.Height()-1-nY) / (double)(aSize.Height()-1);
524 :
525 0 : BitmapReadAccess* pReadAccess = mpBitmap->AcquireReadAccess();
526 0 : if( pReadAccess != NULL )
527 : {
528 : // mpBitmap always has a bit count of 24 => use of GetPixel(...) is safe
529 0 : maColor = pReadAccess->GetPixel( nY, nX );
530 0 : mpBitmap->ReleaseAccess( pReadAccess );
531 0 : pReadAccess = NULL;
532 : }
533 : }
534 0 : }
535 :
536 0 : void ColorFieldControl::MouseMove( const MouseEvent& rMEvt )
537 : {
538 0 : if( rMEvt.IsLeft() )
539 : {
540 0 : ShowPosition( rMEvt.GetPosPixel(), true );
541 0 : Modify();
542 : }
543 0 : }
544 :
545 0 : void ColorFieldControl::MouseButtonDown( const MouseEvent& rMEvt )
546 : {
547 0 : if( rMEvt.IsLeft() && !rMEvt.IsShift() )
548 : {
549 0 : CaptureMouse();
550 0 : ShowPosition( rMEvt.GetPosPixel(), true );
551 0 : Modify();
552 : }
553 0 : }
554 :
555 0 : void ColorFieldControl::MouseButtonUp( const MouseEvent& )
556 : {
557 0 : if( IsMouseCaptured() )
558 0 : ReleaseMouse();
559 0 : }
560 :
561 0 : void ColorFieldControl::KeyMove( int dx, int dy )
562 : {
563 0 : Size aSize( GetOutputSizePixel() );
564 0 : Point aPos(static_cast<long>(mdX * aSize.Width()), static_cast<long>((1.0 - mdY) * aSize.Height()));
565 0 : aPos.X() += dx;
566 0 : aPos.Y() += dy;
567 0 : if( aPos.X() < 0 )
568 0 : aPos.X() += aSize.Width();
569 0 : else if( aPos.X() >= aSize.Width() )
570 0 : aPos.X() -= aSize.Width();
571 :
572 0 : if( aPos.Y() < 0 )
573 0 : aPos.Y() += aSize.Height();
574 0 : else if( aPos.Y() >= aSize.Height() )
575 0 : aPos.Y() -= aSize.Height();
576 :
577 0 : ShowPosition( aPos, true );
578 0 : Modify();
579 0 : }
580 :
581 0 : void ColorFieldControl::KeyInput( const KeyEvent& rKEvt )
582 : {
583 0 : bool bShift = rKEvt.GetKeyCode().IsShift();
584 0 : bool bCtrl = rKEvt.GetKeyCode().IsMod1();
585 0 : bool bAlt = rKEvt.GetKeyCode().IsMod2();
586 :
587 0 : if ( !bAlt && !bShift )
588 : {
589 0 : switch( rKEvt.GetKeyCode().GetCode() )
590 : {
591 0 : case KEY_DOWN: KeyMove( 0, bCtrl ? 5 : 1 ); return;
592 0 : case KEY_UP: KeyMove( 0, bCtrl ? -5 : -1 ); return;
593 0 : case KEY_LEFT: KeyMove( bCtrl ? -5 : -1, 0 ); return;
594 0 : case KEY_RIGHT: KeyMove( bCtrl ? 5 : 1, 0 ); return;
595 : }
596 : }
597 0 : Control::KeyInput( rKEvt );
598 : }
599 :
600 0 : void ColorFieldControl::Paint( const Rectangle& rRect )
601 : {
602 0 : if( !mpBitmap )
603 0 : UpdateBitmap();
604 :
605 0 : Bitmap aOutputBitmap( *mpBitmap );
606 :
607 0 : if( GetBitCount() <= 8 )
608 0 : aOutputBitmap.Dither();
609 :
610 0 : DrawBitmap( rRect.TopLeft(), rRect.GetSize(), rRect.TopLeft(), rRect.GetSize(), aOutputBitmap );
611 :
612 : // draw circle around current color
613 0 : if( maColor.IsDark() )
614 0 : SetLineColor( COL_WHITE );
615 : else
616 0 : SetLineColor( COL_BLACK );
617 :
618 0 : SetFillColor();
619 :
620 0 : DrawEllipse( Rectangle( maPosition, Size( 11, 11) ) );
621 0 : }
622 :
623 0 : void ColorFieldControl::Resize()
624 : {
625 0 : UpdateBitmap();
626 0 : Control::Resize();
627 0 : }
628 :
629 0 : void ColorFieldControl::Modify()
630 : {
631 0 : maModifyHdl.Call( this );
632 0 : }
633 :
634 0 : void ColorFieldControl::SetValues( Color aColor, ColorMode eMode, double x, double y )
635 : {
636 0 : bool bUpdateBitmap = (maColor!= aColor) || (meMode != eMode);
637 0 : if( bUpdateBitmap || (mdX != x) || (mdY != y) )
638 : {
639 0 : maColor = aColor;
640 0 : meMode = eMode;
641 0 : mdX = x;
642 0 : mdY = y;
643 :
644 0 : if( bUpdateBitmap )
645 0 : UpdateBitmap();
646 0 : UpdatePosition();
647 0 : if( bUpdateBitmap )
648 0 : Invalidate();
649 : }
650 0 : }
651 :
652 0 : double ColorFieldControl::GetX()
653 : {
654 0 : return mdX;
655 : }
656 :
657 0 : double ColorFieldControl::GetY()
658 : {
659 0 : return mdY;
660 : }
661 :
662 0 : void ColorFieldControl::UpdatePosition()
663 : {
664 0 : Size aSize( GetOutputSizePixel() );
665 0 : ShowPosition( Point(static_cast<long>(mdX * aSize.Width()), static_cast<long>((1.0 - mdY) * aSize.Height())), false );
666 0 : }
667 :
668 : class ColorSliderControl : public Control
669 : {
670 : public:
671 : ColorSliderControl( Window* pParent, const ResId& rResId );
672 : virtual ~ColorSliderControl();
673 :
674 : virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
675 : virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
676 : virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
677 : virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
678 : virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE;
679 : virtual void Resize() SAL_OVERRIDE;
680 :
681 : void UpdateBitmap();
682 : void ChangePosition( long nY );
683 : void Modify();
684 :
685 : void SetValue( const Color& rColor, ColorMode eMode, double dValue );
686 0 : double GetValue() const { return mdValue; }
687 :
688 : void KeyMove( int dy );
689 :
690 0 : void SetModifyHdl( Link& rLink ) { maModifyHdl = rLink; }
691 :
692 0 : sal_Int16 GetLevel() const { return mnLevel; }
693 :
694 : private:
695 : Link maModifyHdl;
696 : Color maColor;
697 : ColorMode meMode;
698 : Bitmap* mpBitmap;
699 : sal_Int16 mnLevel;
700 : double mdValue;
701 : };
702 :
703 0 : ColorSliderControl::ColorSliderControl( Window* pParent, const ResId& rResId )
704 : : Control( pParent, rResId )
705 : , meMode( DefaultMode )
706 : , mpBitmap( 0 )
707 : , mnLevel( 0 )
708 0 : , mdValue( -1.0 )
709 : {
710 0 : SetControlBackground();
711 0 : }
712 :
713 0 : ColorSliderControl::~ColorSliderControl()
714 : {
715 0 : delete mpBitmap;
716 0 : }
717 :
718 0 : void ColorSliderControl::UpdateBitmap()
719 : {
720 0 : Size aSize( 1, GetOutputSizePixel().Height() );
721 :
722 0 : if( mpBitmap && mpBitmap->GetSizePixel() != aSize )
723 0 : delete mpBitmap, mpBitmap = NULL;
724 :
725 0 : if( !mpBitmap )
726 0 : mpBitmap = new Bitmap( aSize, 24 );
727 :
728 0 : BitmapWriteAccess* pWriteAccess = mpBitmap->AcquireWriteAccess();
729 :
730 0 : if( pWriteAccess )
731 : {
732 0 : const long nY = aSize.Height()-1;
733 :
734 0 : BitmapColor aBitmapColor( maColor );
735 :
736 : sal_uInt16 nHue, nSat, nBri;
737 0 : maColor.RGBtoHSB( nHue, nSat, nBri );
738 :
739 : // this has been unlooped for performance reason, please do not merge back!
740 :
741 0 : switch( meMode )
742 : {
743 : case HUE:
744 0 : nSat = 100;
745 0 : nBri = 100;
746 0 : for( long y = 0; y <= nY; y++ )
747 : {
748 0 : nHue = static_cast< sal_uInt16 >( (359 * y) / nY );
749 0 : aBitmapColor = BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) );
750 0 : pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
751 : }
752 0 : break;
753 :
754 : case SATURATION:
755 0 : nBri = std::max( (sal_uInt16)32, nBri );
756 0 : for( long y = 0; y <= nY; y++ )
757 : {
758 0 : nSat = static_cast< sal_uInt16 >( (100 * y) / nY );
759 0 : pWriteAccess->SetPixel( nY-y, 0, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
760 : }
761 0 : break;
762 :
763 : case BRIGHTNESS:
764 0 : for( long y = 0; y <= nY; y++ )
765 : {
766 0 : nBri = static_cast< sal_uInt16 >( (100 * y) / nY );
767 0 : pWriteAccess->SetPixel( nY-y, 0, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
768 : }
769 0 : break;
770 :
771 : case RED:
772 0 : for( long y = 0; y <= nY; y++ )
773 : {
774 0 : aBitmapColor.SetRed( sal_uInt8( ((long)255 * y) / nY ) );
775 0 : pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
776 : }
777 0 : break;
778 :
779 : case GREEN:
780 0 : for( long y = 0; y <= nY; y++ )
781 : {
782 0 : aBitmapColor.SetGreen( sal_uInt8( ((long)255 * y) / nY ) );
783 0 : pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
784 : }
785 0 : break;
786 :
787 : case BLUE:
788 0 : for( long y = 0; y <= nY; y++ )
789 : {
790 0 : aBitmapColor.SetBlue( sal_uInt8( ((long)255 * y) / nY ) );
791 0 : pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
792 : }
793 0 : break;
794 : }
795 :
796 0 : mpBitmap->ReleaseAccess( pWriteAccess );
797 : }
798 0 : }
799 :
800 0 : void ColorSliderControl::ChangePosition( long nY )
801 : {
802 0 : const long nHeight = GetOutputSizePixel().Height() - 1;
803 :
804 0 : if( nY < 0L )
805 0 : nY = 0;
806 0 : else if( nY > nHeight )
807 0 : nY = nHeight;
808 :
809 0 : mnLevel = nY;
810 0 : mdValue = ((double)(nHeight - nY)) / (double)nHeight;
811 0 : }
812 :
813 0 : void ColorSliderControl::MouseMove( const MouseEvent& rMEvt )
814 : {
815 0 : if( rMEvt.IsLeft() )
816 : {
817 0 : ChangePosition( rMEvt.GetPosPixel().Y() );
818 0 : Modify();
819 : }
820 0 : }
821 :
822 0 : void ColorSliderControl::MouseButtonDown( const MouseEvent& rMEvt )
823 : {
824 0 : if( rMEvt.IsLeft() && !rMEvt.IsShift() )
825 : {
826 0 : CaptureMouse();
827 0 : ChangePosition( rMEvt.GetPosPixel().Y() );
828 0 : Modify();
829 : }
830 0 : }
831 :
832 0 : void ColorSliderControl::MouseButtonUp( const MouseEvent& )
833 : {
834 0 : if( IsMouseCaptured() )
835 0 : ReleaseMouse();
836 0 : }
837 :
838 0 : void ColorSliderControl::KeyMove( int dy )
839 : {
840 0 : ChangePosition( mnLevel + dy );
841 0 : Modify();
842 0 : }
843 :
844 0 : void ColorSliderControl::KeyInput( const KeyEvent& rKEvt )
845 : {
846 0 : if ( !rKEvt.GetKeyCode().IsMod2() && !rKEvt.GetKeyCode().IsShift() )
847 : {
848 0 : switch( rKEvt.GetKeyCode().GetCode() )
849 : {
850 0 : case KEY_DOWN: KeyMove( rKEvt.GetKeyCode().IsMod1() ? 5 : 1 ); return;
851 0 : case KEY_UP: KeyMove( rKEvt.GetKeyCode().IsMod1() ? -5 : -1 ); return;
852 : }
853 : }
854 :
855 0 : Control::KeyInput( rKEvt );
856 : }
857 :
858 0 : void ColorSliderControl::Paint( const Rectangle& /*rRect*/ )
859 : {
860 0 : if( !mpBitmap )
861 0 : UpdateBitmap();
862 :
863 0 : const Size aSize( GetOutputSizePixel() );
864 :
865 0 : Bitmap aOutputBitmap( *mpBitmap );
866 :
867 0 : if( GetBitCount() <= 8 )
868 0 : aOutputBitmap.Dither();
869 :
870 0 : Point aPos;
871 0 : int x = aSize.Width();
872 0 : while( x-- )
873 : {
874 0 : DrawBitmap( aPos, aOutputBitmap );
875 0 : aPos.X() += 1;
876 0 : }
877 0 : }
878 :
879 0 : void ColorSliderControl::Resize()
880 : {
881 0 : UpdateBitmap();
882 0 : Control::Resize();
883 0 : }
884 :
885 0 : void ColorSliderControl::Modify()
886 : {
887 0 : maModifyHdl.Call( this );
888 0 : }
889 :
890 0 : void ColorSliderControl::SetValue( const Color& rColor, ColorMode eMode, double dValue )
891 : {
892 0 : bool bUpdateBitmap = (rColor != maColor) || (eMode != meMode);
893 0 : if( bUpdateBitmap || (mdValue != dValue))
894 : {
895 0 : maColor = rColor;
896 0 : mdValue = dValue;
897 0 : mnLevel = static_cast<sal_Int16>((1.0-dValue) * GetOutputSizePixel().Height());
898 0 : meMode = eMode;
899 0 : if( bUpdateBitmap )
900 0 : UpdateBitmap();
901 0 : Invalidate();
902 : }
903 0 : }
904 :
905 : const sal_uInt16 UPDATE_RGB = 0x01;
906 : const sal_uInt16 UPDATE_CMYK = 0x02;
907 : const sal_uInt16 UPDATE_HSB = 0x04;
908 : const sal_uInt16 UPDATE_COLORCHOOSER = 0x08;
909 : const sal_uInt16 UPDATE_COLORSLIDER = 0x10;
910 : const sal_uInt16 UPDATE_HEX = 0x20;
911 : const sal_uInt16 UPDATE_ALL = 0xff;
912 :
913 0 : class ColorPickerDialog : public ModalDialog
914 : {
915 : public:
916 : ColorPickerDialog( Window* pParent, sal_Int32 nColor, sal_Int16 nMode );
917 :
918 : void update_color( sal_uInt16 n = UPDATE_ALL );
919 :
920 : DECL_LINK( ColorModifyHdl, void * );
921 : DECL_LINK( ModeModifyHdl, void * );
922 :
923 : sal_Int32 GetColor() const;
924 :
925 : void setColorComponent( sal_uInt16 nComp, double dValue );
926 :
927 : private:
928 : Color maPreviousColor;
929 : sal_Int16 mnDialogMode;
930 : ColorMode meMode;
931 :
932 : double mdRed, mdGreen, mdBlue;
933 : double mdHue, mdSat, mdBri;
934 : double mdCyan, mdMagenta, mdYellow, mdKey;
935 :
936 : private:
937 : ColorFieldControl maColorField;
938 : ColorSliderControl maColorSlider;
939 : ColorPreviewControl maColorPreview;
940 : ColorPreviewControl maColorPrevious;
941 :
942 : FixedImage maFISliderLeft;
943 : FixedImage maFISliderRight;
944 : Image maSliderImage;
945 :
946 : #if 0
947 : ImageButton maBtnPicker;
948 : #endif
949 :
950 : FixedLine maFLRGB;
951 :
952 : RadioButton maRBRed;
953 : RadioButton maRBGreen;
954 : RadioButton maRBBlue;
955 : RadioButton maRBHue;
956 : RadioButton maRBSaturation;
957 : RadioButton maRBBrightness;
958 :
959 : FixedText maFTRed;
960 : MetricField maMFRed;
961 : FixedText maFTGreen;
962 : MetricField maMFGreen;
963 : FixedText maFTBlue;
964 : MetricField maMFBlue;
965 : FixedText maFTHex;
966 : HexColorControl maEDHex;
967 :
968 : FixedLine maFLHSB;
969 : FixedText maFTHue;
970 : MetricField maMFHue;
971 : FixedText maFTSaturation;
972 : MetricField maMFSaturation;
973 : FixedText maFTBrightness;
974 : MetricField maMFBrightness;
975 :
976 : FixedLine maFLCMYK;
977 : FixedText maFTCyan;
978 : MetricField maMFCyan;
979 : FixedText maFTMagenta;
980 : MetricField maMFMagenta;
981 : FixedText maFTYellow;
982 : MetricField maMFYellow;
983 : FixedText maFTKey;
984 : MetricField maMFKey;
985 :
986 : FixedLine maFLBottmLine;
987 : HelpButton maBTNHelp;
988 : OKButton maBTNOk;
989 : CancelButton maBTNCancel;
990 : };
991 :
992 0 : ColorPickerDialog::ColorPickerDialog( Window* pParent, sal_Int32 nColor, sal_Int16 nMode )
993 0 : : ModalDialog( pParent, CUI_RES( RID_CUI_DIALOG_COLORPICKER ) )
994 : , maPreviousColor( nColor )
995 : , mnDialogMode( nMode )
996 : , meMode( DefaultMode )
997 0 : , maColorField( this, CUI_RES( CT_COLORFIELD ) )
998 0 : , maColorSlider( this, CUI_RES( CT_COLORSLIDER ) )
999 0 : , maColorPreview( this, CUI_RES( CT_PREVIEW ) )
1000 0 : , maColorPrevious( this, CUI_RES( CT_PREVIOUS ) )
1001 0 : , maFISliderLeft( this, CUI_RES( CT_LEFT_SLIDER ) )
1002 0 : , maFISliderRight( this, CUI_RES( CT_RIGHT_SLIDER ) )
1003 0 : , maSliderImage( CUI_RES( CT_SLIDERIMG ) )
1004 : #if 0
1005 : , maBtnPicker( this, CUI_RES( PB_PICKER ) )
1006 : #endif
1007 0 : , maFLRGB( this, CUI_RES( FL_RGB ) )
1008 0 : , maRBRed( this, CUI_RES( CT_RED ) )
1009 0 : , maRBGreen( this, CUI_RES( CT_GREEN ) )
1010 0 : , maRBBlue( this, CUI_RES( CT_BLUE ) )
1011 0 : , maRBHue( this, CUI_RES( CT_HUE ) )
1012 0 : , maRBSaturation( this, CUI_RES( CT_SATURATION ) )
1013 0 : , maRBBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
1014 0 : , maFTRed( this, CUI_RES( CT_RED ) )
1015 0 : , maMFRed( this, CUI_RES( CT_RED ) )
1016 0 : , maFTGreen( this, CUI_RES( CT_GREEN ) )
1017 0 : , maMFGreen( this, CUI_RES( CT_GREEN ) )
1018 0 : , maFTBlue( this, CUI_RES( CT_BLUE ) )
1019 0 : , maMFBlue( this, CUI_RES( CT_BLUE ) )
1020 0 : , maFTHex( this, CUI_RES( CT_HEX ) )
1021 0 : , maEDHex( this, CUI_RES( CT_HEX ) )
1022 0 : , maFLHSB( this, CUI_RES( FL_HSB ) )
1023 0 : , maFTHue( this, CUI_RES( CT_HUE ) )
1024 0 : , maMFHue( this, CUI_RES( CT_HUE ) )
1025 0 : , maFTSaturation( this, CUI_RES( CT_SATURATION ) )
1026 0 : , maMFSaturation( this, CUI_RES( CT_SATURATION ) )
1027 0 : , maFTBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
1028 0 : , maMFBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
1029 0 : , maFLCMYK( this, CUI_RES( FL_CMYK ) )
1030 0 : , maFTCyan( this, CUI_RES( CT_CYAN ) )
1031 0 : , maMFCyan( this, CUI_RES( CT_CYAN ) )
1032 0 : , maFTMagenta( this, CUI_RES( CT_MAGENTA ) )
1033 0 : , maMFMagenta( this, CUI_RES( CT_MAGENTA ) )
1034 0 : , maFTYellow( this, CUI_RES( CT_YELLOW ) )
1035 0 : , maMFYellow( this, CUI_RES( CT_YELLOW ) )
1036 0 : , maFTKey( this, CUI_RES( CT_KEY ) )
1037 0 : , maMFKey( this, CUI_RES( CT_KEY ) )
1038 :
1039 0 : , maFLBottmLine( this, CUI_RES( FT_BOTTOMLINE ) )
1040 0 : , maBTNHelp( this, CUI_RES( BTN_HELP ) )
1041 0 : , maBTNOk( this, CUI_RES( BTN_OK ) )
1042 0 : , maBTNCancel( this, CUI_RES( BTN_CANCEL ) )
1043 : {
1044 0 : FreeResource();
1045 :
1046 0 : Link aLink( LINK( this, ColorPickerDialog, ColorModifyHdl ) );
1047 0 : maColorField.SetModifyHdl( aLink );
1048 0 : maColorSlider.SetModifyHdl( aLink );
1049 :
1050 0 : maMFRed.SetModifyHdl( aLink );
1051 0 : maMFGreen.SetModifyHdl( aLink );
1052 0 : maMFBlue.SetModifyHdl( aLink );
1053 :
1054 0 : maMFCyan.SetModifyHdl( aLink );
1055 0 : maMFMagenta.SetModifyHdl( aLink );
1056 0 : maMFYellow.SetModifyHdl( aLink );
1057 0 : maMFKey.SetModifyHdl( aLink );
1058 :
1059 0 : maMFHue.SetModifyHdl( aLink );
1060 0 : maMFSaturation.SetModifyHdl( aLink );
1061 0 : maMFBrightness.SetModifyHdl( aLink );
1062 :
1063 0 : maEDHex.SetModifyHdl( aLink );
1064 :
1065 0 : aLink = LINK( this, ColorPickerDialog, ModeModifyHdl );
1066 0 : maRBRed.SetToggleHdl( aLink );
1067 0 : maRBGreen.SetToggleHdl( aLink );
1068 0 : maRBBlue.SetToggleHdl( aLink );
1069 0 : maRBHue.SetToggleHdl( aLink );
1070 0 : maRBSaturation.SetToggleHdl( aLink );
1071 0 : maRBBrightness.SetToggleHdl( aLink );
1072 :
1073 0 : Image aSliderImage( maSliderImage );
1074 :
1075 0 : maFISliderLeft.SetImage( aSliderImage );
1076 :
1077 0 : BitmapEx aTmpBmp( maSliderImage.GetBitmapEx() );
1078 0 : aTmpBmp.Mirror( BMP_MIRROR_HORZ );
1079 0 : maFISliderRight.SetImage( Image( aTmpBmp ) );
1080 :
1081 0 : Size aSize( maSliderImage.GetSizePixel() );
1082 0 : maFISliderLeft.SetSizePixel( aSize );
1083 0 : maFISliderRight.SetSizePixel( aSize );
1084 :
1085 0 : Point aPos( maColorSlider.GetPosPixel() );
1086 :
1087 0 : aPos.X() -= aSize.Width();
1088 0 : aPos.Y() -= aSize.Height() / 2;
1089 0 : maFISliderLeft.SetPosPixel( aPos );
1090 :
1091 0 : aPos.X() += aSize.Width() + maColorSlider.GetSizePixel().Width();
1092 0 : maFISliderRight.SetPosPixel( aPos );
1093 :
1094 0 : Color aColor( nColor );
1095 :
1096 : // modify
1097 0 : if( mnDialogMode == 2 )
1098 : {
1099 0 : maColorPreview.SetSizePixel( maColorPrevious.GetSizePixel() );
1100 0 : maColorPrevious.SetColor( aColor );
1101 0 : maColorPrevious.Show( true );
1102 : }
1103 :
1104 0 : mdRed = ((double)aColor.GetRed()) / 255.0;
1105 0 : mdGreen = ((double)aColor.GetGreen()) / 255.0;
1106 0 : mdBlue = ((double)aColor.GetBlue()) / 255.0;
1107 :
1108 0 : RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
1109 0 : RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
1110 :
1111 0 : update_color();
1112 0 : }
1113 :
1114 0 : static int toInt( double dValue, double dRange )
1115 : {
1116 0 : return static_cast< int >( std::floor((dValue * dRange) + 0.5 ) );
1117 : }
1118 :
1119 0 : sal_Int32 ColorPickerDialog::GetColor() const
1120 : {
1121 0 : return Color( toInt(mdRed,255.0), toInt(mdGreen,255.0), toInt(mdBlue,255.0) ).GetColor();
1122 : }
1123 :
1124 0 : void ColorPickerDialog::update_color( sal_uInt16 n )
1125 : {
1126 0 : sal_uInt8 nRed = toInt(mdRed,255.0);
1127 0 : sal_uInt8 nGreen = toInt(mdGreen,255.0);
1128 0 : sal_uInt8 nBlue = toInt(mdBlue,255.0);
1129 :
1130 0 : Color aColor( nRed, nGreen, nBlue );
1131 :
1132 0 : if( n & UPDATE_RGB ) // update RGB
1133 : {
1134 0 : maMFRed.SetValue( nRed );
1135 0 : maMFGreen.SetValue( nGreen );
1136 0 : maMFBlue.SetValue( nBlue );
1137 : }
1138 :
1139 0 : if( n & UPDATE_CMYK ) // update CMYK
1140 : {
1141 0 : maMFCyan.SetValue( toInt( mdCyan, 100.0 ) );
1142 0 : maMFMagenta.SetValue( toInt( mdMagenta, 100.0 ) );
1143 0 : maMFYellow.SetValue( toInt( mdYellow, 100.0 ) );
1144 0 : maMFKey.SetValue( toInt( mdKey, 100.0 ) );
1145 : }
1146 :
1147 0 : if( n & UPDATE_HSB ) // update HSB
1148 : {
1149 0 : maMFHue.SetValue( toInt( mdHue, 1.0 ) );
1150 0 : maMFSaturation.SetValue( toInt( mdSat, 100.0 ) );
1151 0 : maMFBrightness.SetValue( toInt( mdBri, 100.0 ) );
1152 : }
1153 :
1154 0 : if( n & UPDATE_COLORCHOOSER ) // update Color Chooser 1
1155 : {
1156 0 : switch( meMode )
1157 : {
1158 0 : case HUE: maColorField.SetValues( aColor, meMode, mdSat, mdBri ); break;
1159 0 : case SATURATION: maColorField.SetValues( aColor, meMode, mdHue / 360.0, mdBri ); break;
1160 0 : case BRIGHTNESS: maColorField.SetValues( aColor, meMode, mdHue / 360.0, mdSat ); break;
1161 0 : case RED: maColorField.SetValues( aColor, meMode, mdBlue, mdGreen ); break;
1162 0 : case GREEN: maColorField.SetValues( aColor, meMode, mdBlue, mdRed ); break;
1163 0 : case BLUE: maColorField.SetValues( aColor, meMode, mdRed, mdGreen ); break;
1164 : }
1165 : }
1166 :
1167 0 : if( n & UPDATE_COLORSLIDER ) // update Color Chooser 2
1168 : {
1169 0 : switch( meMode )
1170 : {
1171 0 : case HUE: maColorSlider.SetValue( aColor, meMode, mdHue / 360.0 ); break;
1172 0 : case SATURATION: maColorSlider.SetValue( aColor, meMode, mdSat ); break;
1173 0 : case BRIGHTNESS: maColorSlider.SetValue( aColor, meMode, mdBri ); break;
1174 0 : case RED: maColorSlider.SetValue( aColor, meMode, mdRed ); break;
1175 0 : case GREEN: maColorSlider.SetValue( aColor, meMode, mdGreen ); break;
1176 0 : case BLUE: maColorSlider.SetValue( aColor, meMode, mdBlue ); break;
1177 : }
1178 : }
1179 :
1180 0 : if( n & UPDATE_HEX ) // update hex
1181 : {
1182 0 : maEDHex.SetColor( aColor.GetColor() );
1183 : }
1184 :
1185 : {
1186 0 : Point aPos( 0, maColorSlider.GetLevel() + maColorSlider.GetPosPixel().Y() - 1 );
1187 :
1188 0 : aPos.X() = maFISliderLeft.GetPosPixel().X();
1189 0 : if( aPos != maFISliderLeft.GetPosPixel() )
1190 : {
1191 0 : maFISliderLeft.SetPosPixel( aPos );
1192 :
1193 0 : aPos.X() = maFISliderRight.GetPosPixel().X();
1194 0 : maFISliderRight.SetPosPixel( aPos );
1195 : }
1196 : }
1197 :
1198 0 : maColorPreview.SetColor( aColor );
1199 0 : }
1200 :
1201 0 : IMPL_LINK( ColorPickerDialog, ColorModifyHdl, void *, p )
1202 : {
1203 0 : sal_uInt16 n = 0;
1204 :
1205 0 : if( p == &maColorField )
1206 : {
1207 0 : double x = maColorField.GetX();
1208 0 : double y = maColorField.GetY();
1209 :
1210 0 : switch( meMode )
1211 : {
1212 0 : case HUE: mdSat = x; setColorComponent( COLORCOMP_BRI, y ); break;
1213 0 : case SATURATION: mdHue = x * 360.0; setColorComponent( COLORCOMP_BRI, y ); break;
1214 0 : case BRIGHTNESS: mdHue = x * 360.0; setColorComponent( COLORCOMP_SAT, y ); break;
1215 0 : case RED: mdBlue = x; setColorComponent( COLORCOMP_GREEN, y ); break;
1216 0 : case GREEN: mdBlue = x; setColorComponent( COLORCOMP_RED, y ); break;
1217 0 : case BLUE: mdRed = x; setColorComponent( COLORCOMP_GREEN, y ); break;
1218 : }
1219 :
1220 0 : n = UPDATE_ALL&~(UPDATE_COLORCHOOSER);
1221 : }
1222 0 : else if( p == &maColorSlider )
1223 : {
1224 0 : double dValue = maColorSlider.GetValue();
1225 0 : switch( meMode )
1226 : {
1227 0 : case HUE: setColorComponent( COLORCOMP_HUE, dValue * 360.0 ); break;
1228 0 : case SATURATION: setColorComponent( COLORCOMP_SAT, dValue ); break;
1229 0 : case BRIGHTNESS: setColorComponent( COLORCOMP_BRI, dValue ); break;
1230 0 : case RED: setColorComponent( COLORCOMP_RED, dValue ); break;
1231 0 : case GREEN: setColorComponent( COLORCOMP_GREEN, dValue ); break;
1232 0 : case BLUE: setColorComponent( COLORCOMP_BLUE, dValue ); break;
1233 : }
1234 :
1235 0 : n = UPDATE_ALL&~(UPDATE_COLORSLIDER);
1236 : }
1237 0 : else if( p == &maMFRed )
1238 : {
1239 0 : setColorComponent( COLORCOMP_RED, ((double)maMFRed.GetValue()) / 255.0 );
1240 0 : n = UPDATE_ALL&~(UPDATE_RGB);
1241 : }
1242 0 : else if( p == &maMFGreen )
1243 : {
1244 0 : setColorComponent( COLORCOMP_GREEN, ((double)maMFGreen.GetValue()) / 255.0 );
1245 0 : n = UPDATE_ALL&~(UPDATE_RGB);
1246 : }
1247 0 : else if( p == &maMFBlue )
1248 : {
1249 0 : setColorComponent( COLORCOMP_BLUE, ((double)maMFBlue.GetValue()) / 255.0 );
1250 0 : n = UPDATE_ALL&~(UPDATE_RGB);
1251 : }
1252 0 : else if( p == &maMFHue )
1253 : {
1254 0 : setColorComponent( COLORCOMP_HUE, (double)maMFHue.GetValue() );
1255 0 : n = UPDATE_ALL&~(UPDATE_HSB);
1256 : }
1257 0 : else if( p == &maMFSaturation )
1258 : {
1259 0 : setColorComponent( COLORCOMP_SAT, ((double)maMFSaturation.GetValue()) / 100.0 );
1260 0 : n = UPDATE_ALL&~(UPDATE_HSB);
1261 : }
1262 0 : else if( p == &maMFBrightness )
1263 : {
1264 0 : setColorComponent( COLORCOMP_BRI, ((double)maMFBrightness.GetValue()) / 100.0 );
1265 0 : n = UPDATE_ALL&~(UPDATE_HSB);
1266 : }
1267 0 : else if( p == &maMFCyan )
1268 : {
1269 0 : setColorComponent( COLORCOMP_CYAN, ((double)maMFCyan.GetValue()) / 100.0 );
1270 0 : n = UPDATE_ALL&~(UPDATE_CMYK);
1271 : }
1272 0 : else if( p == &maMFMagenta )
1273 : {
1274 0 : setColorComponent( COLORCOMP_MAGENTA, ((double)maMFMagenta.GetValue()) / 100.0 );
1275 0 : n = UPDATE_ALL&~(UPDATE_CMYK);
1276 : }
1277 0 : else if( p == &maMFYellow )
1278 : {
1279 0 : setColorComponent( COLORCOMP_YELLOW, ((double)maMFYellow.GetValue()) / 100.0 );
1280 0 : n = UPDATE_ALL&~(UPDATE_CMYK);
1281 : }
1282 0 : else if( p == &maMFKey )
1283 : {
1284 0 : setColorComponent( COLORCOMP_KEY, ((double)maMFKey.GetValue()) / 100.0 );
1285 0 : n = UPDATE_ALL&~(UPDATE_CMYK);
1286 : }
1287 0 : else if( p == &maEDHex )
1288 : {
1289 0 : sal_Int32 nColor = maEDHex.GetColor();
1290 :
1291 0 : if( nColor != -1 )
1292 : {
1293 0 : Color aColor( nColor );
1294 :
1295 0 : if( aColor != GetColor() )
1296 : {
1297 0 : mdRed = ((double)aColor.GetRed()) / 255.0;
1298 0 : mdGreen = ((double)aColor.GetGreen()) / 255.0;
1299 0 : mdBlue = ((double)aColor.GetBlue()) / 255.0;
1300 :
1301 0 : RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
1302 0 : RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
1303 0 : n = UPDATE_ALL&~(UPDATE_HEX);
1304 : }
1305 : }
1306 : }
1307 :
1308 0 : if( n )
1309 0 : update_color( n );
1310 :
1311 0 : return 0;
1312 : }
1313 :
1314 0 : IMPL_LINK_NOARG(ColorPickerDialog, ModeModifyHdl)
1315 : {
1316 0 : ColorMode eMode = HUE;
1317 :
1318 0 : if( maRBRed.IsChecked() )
1319 : {
1320 0 : eMode = RED;
1321 : }
1322 0 : else if( maRBGreen.IsChecked() )
1323 : {
1324 0 : eMode = GREEN;
1325 : }
1326 0 : else if( maRBBlue.IsChecked() )
1327 : {
1328 0 : eMode = BLUE;
1329 : }
1330 0 : else if( maRBSaturation.IsChecked() )
1331 : {
1332 0 : eMode = SATURATION;
1333 : }
1334 0 : else if( maRBBrightness.IsChecked() )
1335 : {
1336 0 : eMode = BRIGHTNESS;
1337 : }
1338 :
1339 0 : if( meMode != eMode )
1340 : {
1341 0 : meMode = eMode;
1342 0 : update_color( UPDATE_COLORCHOOSER | UPDATE_COLORSLIDER );
1343 : }
1344 :
1345 0 : return 0;
1346 : }
1347 :
1348 0 : void ColorPickerDialog::setColorComponent( sal_uInt16 nComp, double dValue )
1349 : {
1350 0 : switch( nComp )
1351 : {
1352 0 : case COLORCOMP_RED: mdRed = dValue; break;
1353 0 : case COLORCOMP_GREEN: mdGreen = dValue; break;
1354 0 : case COLORCOMP_BLUE: mdBlue = dValue; break;
1355 0 : case COLORCOMP_HUE: mdHue = dValue; break;
1356 0 : case COLORCOMP_SAT: mdSat = dValue; break;
1357 0 : case COLORCOMP_BRI: mdBri = dValue; break;
1358 0 : case COLORCOMP_CYAN: mdCyan = dValue; break;
1359 0 : case COLORCOMP_YELLOW: mdYellow = dValue; break;
1360 0 : case COLORCOMP_MAGENTA: mdMagenta = dValue; break;
1361 0 : case COLORCOMP_KEY: mdKey = dValue; break;
1362 : }
1363 :
1364 0 : if( nComp & COLORMODE_RGB )
1365 : {
1366 0 : RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
1367 0 : RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
1368 : }
1369 0 : else if( nComp & COLORMODE_HSV )
1370 : {
1371 0 : HSVtoRGB( mdHue, mdSat, mdBri, mdRed, mdGreen, mdBlue );
1372 0 : RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
1373 : }
1374 : else
1375 : {
1376 0 : CMYKtoRGB( mdCyan, mdMagenta, mdYellow, mdKey, mdRed, mdGreen, mdBlue );
1377 0 : RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
1378 : }
1379 0 : }
1380 :
1381 : typedef ::cppu::WeakComponentImplHelper4< XServiceInfo, XExecutableDialog, XInitialization, XPropertyAccess > ColorPickerBase;
1382 :
1383 0 : class ColorPicker : protected ::comphelper::OBaseMutex, // Struct for right initalization of mutex member! Must be first of baseclasses.
1384 : public ColorPickerBase
1385 : {
1386 : public:
1387 : ColorPicker( Reference< XComponentContext > const & xContext );
1388 :
1389 : // XInitialization
1390 : virtual void SAL_CALL initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException, std::exception) SAL_OVERRIDE;
1391 :
1392 : // XInitialization
1393 : virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException, std::exception) SAL_OVERRIDE;
1394 : virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException, std::exception) SAL_OVERRIDE;
1395 : virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException, std::exception) SAL_OVERRIDE;
1396 :
1397 : // XPropertyAccess
1398 : virtual Sequence< PropertyValue > SAL_CALL getPropertyValues( ) throw (RuntimeException, std::exception) SAL_OVERRIDE;
1399 : virtual void SAL_CALL setPropertyValues( const Sequence< PropertyValue >& aProps ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE;
1400 :
1401 : // XExecutableDialog
1402 : virtual void SAL_CALL setTitle( const OUString& aTitle ) throw (RuntimeException, std::exception) SAL_OVERRIDE;
1403 : virtual sal_Int16 SAL_CALL execute( ) throw (RuntimeException, std::exception) SAL_OVERRIDE;
1404 :
1405 : private:
1406 : Reference< XComponentContext > mxContext;
1407 : OUString msTitle;
1408 : const OUString msColorKey;
1409 : const OUString msModeKey;
1410 : sal_Int32 mnColor;
1411 : sal_Int16 mnMode;
1412 : Reference< ::com::sun::star::awt::XWindow > mxParent;
1413 : };
1414 :
1415 0 : OUString SAL_CALL ColorPicker_getImplementationName()
1416 : {
1417 0 : return OUString( "com.sun.star.cui.ColorPicker" );
1418 : }
1419 :
1420 0 : Reference< XInterface > SAL_CALL ColorPicker_createInstance( Reference< XComponentContext > const & xContext ) SAL_THROW( (Exception) )
1421 : {
1422 0 : return static_cast<XWeak*>( new ColorPicker( xContext ) );
1423 : }
1424 :
1425 0 : Sequence< OUString > SAL_CALL ColorPicker_getSupportedServiceNames() throw( RuntimeException )
1426 : {
1427 0 : Sequence< OUString > seq(1);
1428 0 : seq[0] = "com.sun.star.ui.dialogs.ColorPicker";
1429 0 : return seq;
1430 : }
1431 :
1432 0 : ColorPicker::ColorPicker( Reference< XComponentContext > const & xContext )
1433 : : ColorPickerBase( m_aMutex )
1434 : , mxContext( xContext )
1435 : , msColorKey( "Color" )
1436 : , msModeKey( "Mode" )
1437 : , mnColor( 0 )
1438 0 : , mnMode( 0 )
1439 : {
1440 0 : }
1441 :
1442 : // XInitialization
1443 0 : void SAL_CALL ColorPicker::initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException, std::exception)
1444 : {
1445 0 : if( aArguments.getLength() == 1 )
1446 : {
1447 0 : aArguments[0] >>= mxParent;
1448 : }
1449 0 : }
1450 :
1451 : // XInitialization
1452 0 : OUString SAL_CALL ColorPicker::getImplementationName( ) throw (RuntimeException, std::exception)
1453 : {
1454 0 : return ColorPicker_getImplementationName();
1455 : }
1456 :
1457 0 : sal_Bool SAL_CALL ColorPicker::supportsService( const OUString& sServiceName ) throw (RuntimeException, std::exception)
1458 : {
1459 0 : return cppu::supportsService(this, sServiceName);
1460 : }
1461 :
1462 0 : Sequence< OUString > SAL_CALL ColorPicker::getSupportedServiceNames( ) throw (RuntimeException, std::exception)
1463 : {
1464 0 : return ColorPicker_getSupportedServiceNames();
1465 : }
1466 :
1467 : // XPropertyAccess
1468 0 : Sequence< PropertyValue > SAL_CALL ColorPicker::getPropertyValues( ) throw (RuntimeException, std::exception)
1469 : {
1470 0 : Sequence< PropertyValue > props(1);
1471 0 : props[0].Name = msColorKey;
1472 0 : props[0].Value <<= mnColor;
1473 0 : return props;
1474 : }
1475 :
1476 0 : void SAL_CALL ColorPicker::setPropertyValues( const Sequence< PropertyValue >& aProps ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
1477 : {
1478 0 : for( sal_Int32 n = 0; n < aProps.getLength(); n++ )
1479 : {
1480 0 : if( aProps[n].Name.equals( msColorKey ) )
1481 : {
1482 0 : aProps[n].Value >>= mnColor;
1483 : }
1484 0 : else if( aProps[n].Name.equals( msModeKey ) )
1485 : {
1486 0 : aProps[n].Value >>= mnMode;
1487 : }
1488 : }
1489 0 : }
1490 :
1491 : // XExecutableDialog
1492 0 : void SAL_CALL ColorPicker::setTitle( const OUString& sTitle ) throw (RuntimeException, std::exception)
1493 : {
1494 0 : msTitle = sTitle;
1495 0 : }
1496 :
1497 0 : sal_Int16 SAL_CALL ColorPicker::execute( ) throw (RuntimeException, std::exception)
1498 : {
1499 0 : ColorPickerDialog aDlg( VCLUnoHelper::GetWindow( mxParent ), mnColor, mnMode );
1500 0 : sal_Int16 ret = aDlg.Execute();
1501 0 : if( ret )
1502 0 : mnColor = aDlg.GetColor();
1503 :
1504 0 : return ret;
1505 : }
1506 :
1507 : }
1508 :
1509 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|