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