You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ar...@apache.org on 2013/10/23 22:04:48 UTC
svn commit: r1535143 [2/3] - in /openoffice/trunk/main/cui/source/dialogs:
colorpicker.cxx colorpicker.hrc colorpicker.src
Modified: openoffice/trunk/main/cui/source/dialogs/colorpicker.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/cui/source/dialogs/colorpicker.cxx?rev=1535143&r1=1535142&r2=1535143&view=diff
==============================================================================
--- openoffice/trunk/main/cui/source/dialogs/colorpicker.cxx (original)
+++ openoffice/trunk/main/cui/source/dialogs/colorpicker.cxx Wed Oct 23 20:04:47 2013
@@ -18,1688 +18,1688 @@
* under the License.
*
*************************************************************/
-
+
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_cui.hxx"
-
-#include <com/sun/star/uno/XComponentContext.hpp>
-#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
-#include <com/sun/star/beans/XPropertyAccess.hpp>
-#include <com/sun/star/lang/XInitialization.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/datatransfer/XTransferable.hpp>
-#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
-#include <com/sun/star/awt/XWindow.hpp>
-#include <cppuhelper/compbase4.hxx>
-#include <comphelper/broadcasthelper.hxx>
-#include <vcl/dialog.hxx>
-#include <vcl/button.hxx>
-#include <vcl/fixed.hxx>
-#include <vcl/edit.hxx>
-#include <vcl/field.hxx>
-#include <vcl/bmpacc.hxx>
-#include <vcl/decoview.hxx>
-#include <vcl/sound.hxx>
-#include <vcl/svapp.hxx>
-#include <toolkit/helper/vclunohelper.hxx>
-#include <sot/exchange.hxx>
-#include <sot/formats.hxx>
-#include <sax/tools/converter.hxx>
-#include "dialmgr.hxx"
-#include "colorpicker.hrc"
-#include <cmath>
-
-using rtl::OUString;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::lang;
-using namespace ::com::sun::star::ui::dialogs;
-using namespace ::com::sun::star::beans;
-
-namespace cui
-{
-const sal_uInt16 COLORMODE_RGB = 0x10;
-const sal_uInt16 COLORMODE_HSV = 0x20;
-const sal_uInt16 COLORMODE_CMYK = 0x40;
-
-const sal_uInt16 COLORCOMP_RED = 0x10;
-const sal_uInt16 COLORCOMP_GREEN = 0x11;
-const sal_uInt16 COLORCOMP_BLUE = 0x12;
-
-const sal_uInt16 COLORCOMP_HUE = 0x20;
-const sal_uInt16 COLORCOMP_SAT = 0x21;
-const sal_uInt16 COLORCOMP_BRI = 0x22;
-
-const sal_uInt16 COLORCOMP_CYAN = 0x40;
-const sal_uInt16 COLORCOMP_YELLOW = 0x41;
-const sal_uInt16 COLORCOMP_MAGENTA = 0x42;
-const sal_uInt16 COLORCOMP_KEY = 0x43;
-
-// -----------------------------------------------------------------------
-// color space conversion
-// RGB = 0 .. 1
-// H = 0 .. 360
-// SV = 0 .. 1
-// CMYK = 0 .. 1
-// -----------------------------------------------------------------------
-
-static void RGBtoHSV( double dR, double dG, double dB, double& dH, double& dS, double& dV )
-{
- // Brightness = max(R, G, B);
- dV = std::max( dR, std::max( dG, dB ) );
-
- double cDelta = dV - std::min( dR, std::min( dG, dB ) );
-
- // Saturation = max - min / max
- if( dV > 0 )
- dS = cDelta / dV;
- else
- dS = 0.0;
-
- dH = 0.0;
-
- if( !basegfx::fTools::equalZero( dS ) )
- {
- if( basegfx::fTools::equal( dR, dV ) )
- {
- dH = ( dG - dB ) / cDelta;
- }
- else if( basegfx::fTools::equal( dG, dV ) )
- {
- dH = 2.0 + ( dB - dR ) / cDelta;
- }
- else if ( basegfx::fTools::equal( dB, dV ) )
- {
- dH = 4.0 + ( dR - dG ) / cDelta;
- }
- dH *= 60.0;
-
- if( dH < 0.0 )
- dH += 360.0;
- }
-}
-
-static void HSVtoRGB(double dH, double dS, double dV, double& dR, double& dG, double& dB )
-{
- if( basegfx::fTools::equalZero( dS ) )
- {
- dR = dV;
- dG = dV;
- dB = dV;
- }
- else
- {
- if( basegfx::fTools::equal( dH, 360.0 ) )
- dH = 0.0;
- else
- dH /= 60.0;
-
- sal_uInt16 n = (sal_uInt16) dH;
- double f = dH - n;
-
- double a = dV * ( 1.0 - dS );
- double b = dV * ( 1.0 - ( dS * f ) );
- double c = dV * ( 1.0 - ( dS * ( 1.0 - f ) ) );
-
- switch( n )
- {
- case 0: dR = dV; dG = c; dB = a; break;
- case 1: dR = b; dG = dV; dB = a; break;
- case 2: dR = a; dG = dV; dB = c; break;
- case 3: dR = a; dG = b; dB = dV; break;
- case 4: dR = c; dG = a; dB = dV; break;
- case 5: dR = dV; dG = a; dB = b; break;
- }
- }
-}
-
-// -----------------------------------------------------------------------
-
-// CMYK values from 0 to 1
-static void CMYKtoRGB( double fCyan, double fMagenta, double fYellow, double fKey, double& dR, double& dG, double& dB )
-{
- fCyan = (fCyan * ( 1.0 - fKey )) + fKey;
- fMagenta = (fMagenta * ( 1.0 - fKey )) + fKey;
- fYellow = (fYellow * ( 1.0 - fKey )) + fKey;
-
- dR = std::max( std::min( ( 1.0 - fCyan ), 1.0), 0.0 );
- dG = std::max( std::min( ( 1.0 - fMagenta ), 1.0), 0.0 );
- dB = std::max( std::min( ( 1.0 - fYellow ), 1.0), 0.0 );
-}
-
-// -----------------------------------------------------------------------
-
-// CMY results from 0 to 1
-static void RGBtoCMYK( double dR, double dG, double dB, double& fCyan, double& fMagenta, double& fYellow, double& fKey )
-{
- fCyan = 1 - dR;
- fMagenta = 1 - dG;
- fYellow = 1 - dB;
-
- //CMYK and CMY values from 0 to 1
- fKey = 1.0;
- if( fCyan < fKey ) fKey = fCyan;
- if( fMagenta < fKey ) fKey = fMagenta;
- if( fYellow < fKey ) fKey = fYellow;
-
- if( basegfx::fTools::equal( fKey, 1.0 ) )
- {
- //Black
- fCyan = 0.0;
- fMagenta = 0.0;
- fYellow = 0.0;
- }
- else
- {
- fCyan = ( fCyan - fKey ) / ( 1.0 - fKey );
- fMagenta = ( fMagenta - fKey ) / ( 1.0 - fKey );
- fYellow = ( fYellow - fKey ) / ( 1.0 - fKey );
- }
-}
-
-// ====================================================================
-
-class HexColorControl : public Edit
-{
-public:
- HexColorControl( Window* pParent, const ResId& rResId );
-
- virtual long PreNotify( NotifyEvent& rNEvt );
- virtual void Paste();
-
- void SetColor( sal_Int32 nColor );
- sal_Int32 GetColor();
-
-private:
- bool ImplProcessKeyInput( const KeyEvent& rKEv );
-};
-
-HexColorControl::HexColorControl( Window* pParent, const ResId& rResId )
-: Edit( pParent, rResId )
-{
- SetMaxTextLen( 6 );
-}
-
-// -----------------------------------------------------------------------
-
-void HexColorControl::SetColor( sal_Int32 nColor )
-{
- ::rtl::OUStringBuffer aBuffer;
- sax::Converter::convertColor( aBuffer, nColor );
- SetText( aBuffer.makeStringAndClear().copy(1) );
-}
-
-// -----------------------------------------------------------------------
-
-sal_Int32 HexColorControl::GetColor()
-{
- sal_Int32 nColor = -1;
-
- OUString aStr( RTL_CONSTASCII_USTRINGPARAM( "#" ) );
- aStr += GetText();
- sal_Int32 nLen = aStr.getLength();
- if( nLen < 7 )
- {
- static const sal_Char* pNullStr = "000000";
- aStr += OUString::createFromAscii( &pNullStr[nLen-1] );
- }
-
- sax::Converter::convertColor( nColor, aStr );
-
- if( nColor == -1 )
- SetControlBackground( Color( COL_RED ) );
- else
- SetControlBackground();
-
- return nColor;
-}
-
-// -----------------------------------------------------------------------
-
-long HexColorControl::PreNotify( NotifyEvent& rNEvt )
-{
- if ( (rNEvt.GetType() == EVENT_KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() )
- {
- if ( ImplProcessKeyInput( *rNEvt.GetKeyEvent() ) )
- return 1;
- }
-
- return Edit::PreNotify( rNEvt );
-}
-
-// -----------------------------------------------------------------------
-
-void HexColorControl::Paste()
-{
- ::com::sun::star::uno::Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipboard(GetClipboard());
- if ( aClipboard.is() )
- {
- ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xDataObj;
-
- const sal_uInt32 nRef = Application::ReleaseSolarMutex();
-
- try
- {
- xDataObj = aClipboard->getContents();
- }
- catch( const ::com::sun::star::uno::Exception& )
- {
- }
-
- Application::AcquireSolarMutex( nRef );
-
- if ( xDataObj.is() )
- {
- ::com::sun::star::datatransfer::DataFlavor aFlavor;
- SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
- try
- {
- ::com::sun::star::uno::Any aData = xDataObj->getTransferData( aFlavor );
- ::rtl::OUString aText;
- aData >>= aText;
-
- if( aText.getLength() && aText.matchAsciiL( "#", 1, 0 ) )
- aText = aText.copy(1);
-
- if( aText.getLength() > 6 )
- aText = aText.copy( 0, 6 );
-
- SetText( aText );
- }
- catch( const ::com::sun::star::uno::Exception& )
- {
- }
- }
- }
-}
-
-// -----------------------------------------------------------------------
-
-bool HexColorControl::ImplProcessKeyInput( const KeyEvent& rKEv )
-{
- const KeyCode& rKeyCode = rKEv.GetKeyCode();
-
- if( rKeyCode.GetGroup() == KEYGROUP_ALPHA && !rKeyCode.IsMod1() && !rKeyCode.IsMod2() )
- {
- if( (rKeyCode.GetCode() < KEY_A) || (rKeyCode.GetCode() > KEY_F) )
- {
- Sound::Beep();
- return true;
- }
- }
- else if( rKeyCode.GetGroup() == KEYGROUP_NUM )
- {
- if( rKeyCode.IsShift() )
- {
- Sound::Beep();
- return true;
- }
- }
- return false;
-}
-
-// ====================================================================
-
-class ColorPreviewControl : public Control
-{
-public:
- ColorPreviewControl( Window* pParent, const ResId& rResId );
-
- virtual void Paint( const Rectangle& rRect );
-
- void SetColor( const Color& rColor );
-private:
- Color maColor;
-};
-
-// -----------------------------------------------------------------------
-
-ColorPreviewControl::ColorPreviewControl( Window* pParent, const ResId& rResId )
-: Control( pParent, rResId )
-{
- SetFillColor( maColor );
- SetLineColor( maColor );
-}
-
-// -----------------------------------------------------------------------
-
-void ColorPreviewControl::SetColor( const Color& rCol )
-{
- if( rCol != maColor )
- {
- maColor = rCol;
- SetFillColor( maColor );
- SetLineColor( maColor );
- Invalidate();
- }
-}
-
-// -----------------------------------------------------------------------
-
-void ColorPreviewControl::Paint( const Rectangle& rRect )
-{
- DrawRect( rRect );
-}
-
-// ====================================================================
-
-enum ColorMode { HUE, SATURATION, BRIGHTNESS, RED, GREEN, BLUE };
-const ColorMode DefaultMode = HUE;
-
-class ColorFieldControl : public Control
-{
-public:
- ColorFieldControl( Window* pParent, const ResId& rResId );
- ~ColorFieldControl();
-
- virtual void MouseMove( const MouseEvent& rMEvt );
- virtual void MouseButtonDown( const MouseEvent& rMEvt );
- virtual void MouseButtonUp( const MouseEvent& rMEvt );
- virtual void KeyInput( const KeyEvent& rKEvt );
- virtual void Paint( const Rectangle& rRect );
- virtual void Resize();
-
- void UpdateBitmap();
- void ShowPosition( const Point& rPos, bool bUpdate );
- void UpdatePosition();
- void Modify();
-
- void SetValues( Color aColor, ColorMode eMode, double x, double y );
- double GetX();
- double GetY();
-
- void KeyMove( int dx, int dy );
-
- void SetModifyHdl( Link& rLink ) { maModifyHdl = rLink; }
-
-private:
- Link maModifyHdl;
- ColorMode meMode;
- Color maColor;
- double mdX;
- double mdY;
- Point maPosition;
- Bitmap* mpBitmap;
- std::vector< sal_uInt8 > maRGB_Horiz;
- std::vector< sal_uInt16 > maGrad_Horiz;
- std::vector< sal_uInt16 > maPercent_Horiz;
- std::vector< sal_uInt8 > maRGB_Vert;
- std::vector< sal_uInt16 > maPercent_Vert;
- bool mbInit;
-};
-
-// -----------------------------------------------------------------------
-
-ColorFieldControl::ColorFieldControl( Window* pParent, const ResId& rResId )
-: Control( pParent, rResId )
-, meMode( DefaultMode )
-, mdX( -1.0 )
-, mdY( -1.0 )
-, mpBitmap( 0 )
-, mbInit( false )
-{
- SetControlBackground();
-}
-
-// -----------------------------------------------------------------------
-
-ColorFieldControl::~ColorFieldControl()
-{
- delete mpBitmap;
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::UpdateBitmap()
-{
- const Size aSize( GetOutputSizePixel() );
-
- if( mpBitmap && mpBitmap->GetSizePixel() != aSize )
- delete mpBitmap, mpBitmap = NULL;
-
- const sal_Int32 nWidth = aSize.Width();
- const sal_Int32 nHeight = aSize.Height();
-
- if( !mpBitmap )
- {
- mpBitmap = new Bitmap( aSize, 24 );
-
- maRGB_Horiz.resize( nWidth );
- maGrad_Horiz.resize( nWidth );
- maPercent_Horiz.resize( nWidth );
-
- sal_uInt8* pRGB = &(*maRGB_Horiz.begin());
- sal_uInt16* pGrad = &(*maGrad_Horiz.begin());
- sal_uInt16* pPercent = &(*maPercent_Horiz.begin());
-
- for( sal_Int32 x = 0; x < nWidth; x++ )
- {
- *pRGB++ = static_cast< sal_uInt8 >( (x * 256) / nWidth );
- *pGrad++ = static_cast< sal_uInt16 >( (x * 359) / nWidth );
- *pPercent++ = static_cast< sal_uInt16 >( (x * 100) / nWidth );
- }
-
- maRGB_Vert.resize( nHeight );
- maPercent_Vert.resize( nHeight );
-
- pRGB = &(*maRGB_Vert.begin());
- pPercent = &(*maPercent_Vert.begin());
-
- sal_Int32 y = nHeight;
- while( y-- )
- {
- *pRGB++ = static_cast< sal_uInt8 >( (y * 256) / nHeight );
- *pPercent++ = static_cast< sal_uInt16 >( (y * 100) / nHeight );
- }
- }
-
- sal_uInt8* pRGB_Horiz = &(*maRGB_Horiz.begin());
- sal_uInt16* pGrad_Horiz = &(*maGrad_Horiz.begin());
- sal_uInt16* pPercent_Horiz = &(*maPercent_Horiz.begin());
- sal_uInt8* pRGB_Vert = &(*maRGB_Vert.begin());
- sal_uInt16* pPercent_Vert = &(*maPercent_Vert.begin());
-
- BitmapWriteAccess* pWriteAccess = mpBitmap->AcquireWriteAccess();
- if( pWriteAccess )
- {
- BitmapColor aBitmapColor( maColor );
-
- sal_uInt16 nHue, nSat, nBri;
- maColor.RGBtoHSB( nHue, nSat, nBri );
-
- // this has been unlooped for performance reason, please do not merge back!
-
- sal_uInt16 y = nHeight,x;
-
- switch( meMode )
- {
- case HUE:
- while( y-- )
- {
- nBri = pPercent_Vert[y];
- x = nWidth;
- while( x-- )
- {
- nSat = pPercent_Horiz[x];
- pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
- }
- }
- break;
- case SATURATION:
- while( y-- )
- {
- nBri = pPercent_Vert[y];
- x = nWidth;
- while( x-- )
- {
- nHue = pGrad_Horiz[x];
- pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
- }
- }
- break;
- case BRIGHTNESS:
- while( y-- )
- {
- nSat = pPercent_Vert[y];
- x = nWidth;
- while( x-- )
- {
- nHue = pGrad_Horiz[x];
- pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
- }
- }
- break;
- case RED:
- while( y-- )
- {
- aBitmapColor.SetGreen( pRGB_Vert[y] );
- x = nWidth;
- while( x-- )
- {
- aBitmapColor.SetBlue( pRGB_Horiz[x] );
- pWriteAccess->SetPixel( y, x, aBitmapColor );
- }
- }
- break;
- case GREEN:
- while( y-- )
- {
- aBitmapColor.SetRed( pRGB_Vert[y] );
- x = nWidth;
- while( x-- )
- {
- aBitmapColor.SetBlue( pRGB_Horiz[x] );
- pWriteAccess->SetPixel( y, x, aBitmapColor );
- }
- }
- break;
- case BLUE:
- while( y-- )
- {
- aBitmapColor.SetGreen( pRGB_Vert[y] );
- x = nWidth;
- while( x-- )
- {
- aBitmapColor.SetRed( pRGB_Horiz[x] );
- pWriteAccess->SetPixel( y, x, aBitmapColor );
- }
- }
- break;
- }
-
- mpBitmap->ReleaseAccess( pWriteAccess );
- }
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::ShowPosition( const Point& rPos, bool bUpdate )
-{
- if( !mpBitmap )
- {
- UpdateBitmap();
- Invalidate();
- }
-
- const Size aSize( mpBitmap->GetSizePixel() );
-
- long nX = rPos.X();
- long nY = rPos.Y();
- if( nX < 0L )
- nX = 0L;
- else if( nX >= aSize.Width() )
- nX = aSize.Width() - 1L;
-
- if( nY < 0L )
- nY= 0L;
- else if( nY >= aSize.Height() )
- nY = aSize.Height() - 1L;
-
- Point aPos = maPosition;
- maPosition.X() = nX - 5;
- maPosition.Y() = nY - 5;
- Invalidate( Rectangle( aPos, Size( 11, 11) ) );
- Invalidate( Rectangle( maPosition, Size( 11, 11) ) );
-
- if( bUpdate )
- {
- mdX = (double)nX / (double)(aSize.Width()-1);
- mdY = (double)(aSize.Height()-1-nY) / (double)(aSize.Height()-1);
-
- BitmapReadAccess* pReadAccess = mpBitmap->AcquireReadAccess();
- if( pReadAccess != NULL )
- {
- // mpBitmap always has a bit count of 24 => use of GetPixel(...) is safe
- maColor = pReadAccess->GetPixel( nY, nX );
- mpBitmap->ReleaseAccess( pReadAccess );
- pReadAccess = NULL;
- }
- }
-}
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::MouseMove( const MouseEvent& rMEvt )
-{
- if( rMEvt.IsLeft() )
- {
- ShowPosition( rMEvt.GetPosPixel(), true );
- Modify();
- }
-}
-
-// -----------------------------------------------------------------------
-void ColorFieldControl::MouseButtonDown( const MouseEvent& rMEvt )
-{
- if( rMEvt.IsLeft() && !rMEvt.IsShift() )
- {
- CaptureMouse();
- ShowPosition( rMEvt.GetPosPixel(), true );
- Modify();
- }
-}
-
-// -----------------------------------------------------------------------
-void ColorFieldControl::MouseButtonUp( const MouseEvent& )
-{
- if( IsMouseCaptured() )
- ReleaseMouse();
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::KeyMove( int dx, int dy )
-{
- Size aSize( GetOutputSizePixel() );
- Point aPos( mdX * aSize.Width(), (1.0 - mdY) * aSize.Height() );
- aPos.X() += dx;
- aPos.Y() += dy;
- if( aPos.X() < 0 )
- aPos.X() += aSize.Width();
- else if( aPos.X() >= aSize.Width() )
- aPos.X() -= aSize.Width();
-
- if( aPos.Y() < 0 )
- aPos.Y() += aSize.Height();
- else if( aPos.Y() >= aSize.Height() )
- aPos.Y() -= aSize.Height();
-
- ShowPosition( aPos, true );
- Modify();
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::KeyInput( const KeyEvent& rKEvt )
-{
- bool bShift = rKEvt.GetKeyCode().IsShift();
- bool bCtrl = rKEvt.GetKeyCode().IsMod1();
- bool bAlt = rKEvt.GetKeyCode().IsMod2();
-
- if ( !bAlt && !bShift )
- {
- switch( rKEvt.GetKeyCode().GetCode() )
- {
- case KEY_DOWN: KeyMove( 0, bCtrl ? 5 : 1 ); return;
- case KEY_UP: KeyMove( 0, bCtrl ? -5 : -1 ); return;
- case KEY_LEFT: KeyMove( bCtrl ? -5 : -1, 0 ); return;
- case KEY_RIGHT: KeyMove( bCtrl ? 5 : 1, 0 ); return;
- }
- }
- Control::KeyInput( rKEvt );
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::Paint( const Rectangle& rRect )
-{
- if( !mpBitmap )
- UpdateBitmap();
-
- Bitmap aOutputBitmap( *mpBitmap );
-
- if( GetBitCount() <= 8 )
- aOutputBitmap.Dither();
-
- DrawBitmap( rRect.TopLeft(), rRect.GetSize(), rRect.TopLeft(), rRect.GetSize(), aOutputBitmap );
-
- // draw circle around current color
- if( maColor.IsDark() )
- SetLineColor( COL_WHITE );
- else
- SetLineColor( COL_BLACK );
-
- SetFillColor();
-
- DrawEllipse( Rectangle( maPosition, Size( 11, 11) ) );
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::Resize()
-{
- UpdateBitmap();
- Control::Resize();
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::Modify()
-{
- maModifyHdl.Call( this );
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::SetValues( Color aColor, ColorMode eMode, double x, double y )
-{
- bool bUpdateBitmap = (maColor!= aColor) || (meMode != eMode);
- if( bUpdateBitmap || (mdX != x) || (mdY != y) )
- {
- maColor = aColor;
- meMode = eMode;
- mdX = x;
- mdY = y;
-
- if( bUpdateBitmap )
- UpdateBitmap();
- UpdatePosition();
- if( bUpdateBitmap )
- Invalidate();
- }
-}
-
-// -----------------------------------------------------------------------
-
-double ColorFieldControl::GetX()
-{
- return mdX;
-}
-
-// -----------------------------------------------------------------------
-
-double ColorFieldControl::GetY()
-{
- return mdY;
-}
-
-// -----------------------------------------------------------------------
-
-void ColorFieldControl::UpdatePosition()
-{
- Size aSize( GetOutputSizePixel() );
- ShowPosition( Point( mdX * aSize.Width(), (1.0 - mdY) * aSize.Height() ), false );
-}
-
-// ====================================================================
-
-class ColorSliderControl : public Control
-{
-public:
- ColorSliderControl( Window* pParent, const ResId& rResId );
- ~ColorSliderControl();
-
- virtual void MouseMove( const MouseEvent& rMEvt );
- virtual void MouseButtonDown( const MouseEvent& rMEvt );
- virtual void MouseButtonUp( const MouseEvent& rMEvt );
- virtual void KeyInput( const KeyEvent& rKEvt );
- virtual void Paint( const Rectangle& rRect );
- virtual void Resize();
-
- void UpdateBitmap();
- void ChangePosition( long nY );
- void Modify();
-
- void SetValue( const Color& rColor, ColorMode eMode, double dValue );
- double GetValue() const { return mdValue; }
-
- void KeyMove( int dy );
-
- void SetModifyHdl( Link& rLink ) { maModifyHdl = rLink; }
-
- sal_Int16 GetLevel() const { return mnLevel; }
-
-private:
- Link maModifyHdl;
- Color maColor;
- ColorMode meMode;
- Bitmap* mpBitmap;
- sal_Int16 mnLevel;
- double mdValue;
-};
-
-// -----------------------------------------------------------------------
-
-ColorSliderControl::ColorSliderControl( Window* pParent, const ResId& rResId )
-: Control( pParent, rResId )
-, meMode( DefaultMode )
-, mpBitmap( 0 )
-, mnLevel( 0 )
-, mdValue( -1.0 )
-{
- SetControlBackground();
-}
-
-// -----------------------------------------------------------------------
-
-ColorSliderControl::~ColorSliderControl()
-{
- delete mpBitmap;
-}
-
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::UpdateBitmap()
-{
- Size aSize( 1, GetOutputSizePixel().Height() );
-
- if( mpBitmap && mpBitmap->GetSizePixel() != aSize )
- delete mpBitmap, mpBitmap = NULL;
-
- if( !mpBitmap )
- mpBitmap = new Bitmap( aSize, 24 );
-
- BitmapWriteAccess* pWriteAccess = mpBitmap->AcquireWriteAccess();
-
- if( pWriteAccess )
- {
- const long nY = aSize.Height()-1;
-
- BitmapColor aBitmapColor( maColor );
-
- sal_uInt16 nHue, nSat, nBri;
- maColor.RGBtoHSB( nHue, nSat, nBri );
-
- // this has been unlooped for performance reason, please do not merge back!
-
- switch( meMode )
- {
- case HUE:
- nSat = 100;
- nBri = 100;
- for( long y = 0; y <= nY; y++ )
- {
- nHue = static_cast< sal_uInt16 >( (359 * y) / nY );
- aBitmapColor = BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) );
- pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
- }
- break;
-
- case SATURATION:
- nBri = std::max( (sal_uInt16)32, nBri );
- for( long y = 0; y <= nY; y++ )
- {
- nSat = static_cast< sal_uInt16 >( (100 * y) / nY );
- pWriteAccess->SetPixel( nY-y, 0, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
- }
- break;
-
- case BRIGHTNESS:
- for( long y = 0; y <= nY; y++ )
- {
- nBri = static_cast< sal_uInt16 >( (100 * y) / nY );
- pWriteAccess->SetPixel( nY-y, 0, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
- }
- break;
-
- case RED:
- for( long y = 0; y <= nY; y++ )
- {
- aBitmapColor.SetRed( sal_uInt8( ((long)255 * y) / nY ) );
- pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
- }
- break;
-
- case GREEN:
- for( long y = 0; y <= nY; y++ )
- {
- aBitmapColor.SetGreen( sal_uInt8( ((long)255 * y) / nY ) );
- pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
- }
- break;
-
- case BLUE:
- for( long y = 0; y <= nY; y++ )
- {
- aBitmapColor.SetBlue( sal_uInt8( ((long)255 * y) / nY ) );
- pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
- }
- break;
- }
-
- mpBitmap->ReleaseAccess( pWriteAccess );
- }
-}
-
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::ChangePosition( long nY )
-{
- const long nHeight = GetOutputSizePixel().Height() - 1;
-
- if( nY < 0L )
- nY = 0;
- else if( nY > nHeight )
- nY = nHeight;
-
- mnLevel = nY;
- mdValue = ((double)(nHeight - nY)) / (double)nHeight;
-}
-
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::MouseMove( const MouseEvent& rMEvt )
-{
- if( rMEvt.IsLeft() )
- {
- ChangePosition( rMEvt.GetPosPixel().Y() );
- Modify();
- }
-}
-
-// -----------------------------------------------------------------------
-void ColorSliderControl::MouseButtonDown( const MouseEvent& rMEvt )
-{
- if( rMEvt.IsLeft() && !rMEvt.IsShift() )
- {
- CaptureMouse();
- ChangePosition( rMEvt.GetPosPixel().Y() );
- Modify();
- }
-}
-
-// -----------------------------------------------------------------------
-void ColorSliderControl::MouseButtonUp( const MouseEvent& )
-{
- if( IsMouseCaptured() )
- ReleaseMouse();
-}
-
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::KeyMove( int dy )
-{
- ChangePosition( mnLevel + dy );
- Modify();
-}
-
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::KeyInput( const KeyEvent& rKEvt )
-{
- if ( !rKEvt.GetKeyCode().IsMod2() && !rKEvt.GetKeyCode().IsShift() )
- {
- switch( rKEvt.GetKeyCode().GetCode() )
- {
- case KEY_DOWN: KeyMove( rKEvt.GetKeyCode().IsMod1() ? 5 : 1 ); return;
- case KEY_UP: KeyMove( rKEvt.GetKeyCode().IsMod1() ? -5 : -1 ); return;
- }
- }
-
- Control::KeyInput( rKEvt );
-}
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::Paint( const Rectangle& /*rRect*/ )
-{
- if( !mpBitmap )
- UpdateBitmap();
-
- const Size aSize( GetOutputSizePixel() );
-
- Bitmap aOutputBitmap( *mpBitmap );
-
- if( GetBitCount() <= 8 )
- aOutputBitmap.Dither();
-
- Point aPos;
- int x = aSize.Width();
- while( x-- )
- {
- DrawBitmap( aPos, aOutputBitmap );
- aPos.X() += 1;
- }
-}
-
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::Resize()
-{
- UpdateBitmap();
- Control::Resize();
-}
-
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::Modify()
-{
- maModifyHdl.Call( this );
-}
-
-// -----------------------------------------------------------------------
-
-void ColorSliderControl::SetValue( const Color& rColor, ColorMode eMode, double dValue )
-{
- bool bUpdateBitmap = (rColor != maColor) || (eMode != meMode);
- if( bUpdateBitmap || (mdValue != dValue))
- {
- maColor = rColor;
- mdValue = dValue;
- mnLevel = (1.0-dValue) * GetOutputSizePixel().Height();
- meMode = eMode;
- if( bUpdateBitmap )
- UpdateBitmap();
- Invalidate();
- }
-}
-
-// ====================================================================
-
-const sal_uInt16 UPDATE_RGB = 0x01;
-const sal_uInt16 UPDATE_CMYK = 0x02;
-const sal_uInt16 UPDATE_HSB = 0x04;
-const sal_uInt16 UPDATE_COLORCHOOSER = 0x08;
-const sal_uInt16 UPDATE_COLORSLIDER = 0x10;
-const sal_uInt16 UPDATE_HEX = 0x20;
-const sal_uInt16 UPDATE_ALL = 0xff;
-
-class ColorPickerDialog : public ModalDialog
-{
-public:
- ColorPickerDialog( Window* pParent, sal_Int32 nColor, sal_Int16 nMode );
-
- void update_color( sal_uInt16 n = UPDATE_ALL );
-
- DECL_LINK( ColorModifyHdl, void * );
- DECL_LINK( ModeModifyHdl, void * );
-
- sal_Int32 GetColor() const;
-
- void setColorComponent( sal_uInt16 nComp, double dValue );
-
-private:
- Color maPreviousColor;
- sal_Int16 mnDialogMode;
- ColorMode meMode;
-
- double mdRed, mdGreen, mdBlue;
- double mdHue, mdSat, mdBri;
- double mdCyan, mdMagenta, mdYellow, mdKey;
-
-private:
- ColorFieldControl maColorField;
- ColorSliderControl maColorSlider;
- ColorPreviewControl maColorPreview;
- ColorPreviewControl maColorPrevious;
-
- FixedImage maFISliderLeft;
- FixedImage maFISliderRight;
- Image maSliderImage;
-
-#if 0
- ImageButton maBtnPicker;
-#endif
-
- FixedLine maFLRGB;
-
- RadioButton maRBRed;
- RadioButton maRBGreen;
- RadioButton maRBBlue;
- RadioButton maRBHue;
- RadioButton maRBSaturation;
- RadioButton maRBBrightness;
-
- FixedText maFTRed;
- MetricField maMFRed;
- FixedText maFTGreen;
- MetricField maMFGreen;
- FixedText maFTBlue;
- MetricField maMFBlue;
- FixedText maFTHex;
- HexColorControl maEDHex;
-
- FixedLine maFLHSB;
- FixedText maFTHue;
- MetricField maMFHue;
- FixedText maFTSaturation;
- MetricField maMFSaturation;
- FixedText maFTBrightness;
- MetricField maMFBrightness;
-
- FixedLine maFLCMYK;
- FixedText maFTCyan;
- MetricField maMFCyan;
- FixedText maFTMagenta;
- MetricField maMFMagenta;
- FixedText maFTYellow;
- MetricField maMFYellow;
- FixedText maFTKey;
- MetricField maMFKey;
-
- FixedLine maFLBottmLine;
- HelpButton maBTNHelp;
- OKButton maBTNOk;
- CancelButton maBTNCancel;
-};
-
-// --------------------------------------------------------------------
-
-ColorPickerDialog::ColorPickerDialog( Window* pParent, sal_Int32 nColor, sal_Int16 nMode )
-: ModalDialog( pParent, CUI_RES( RID_CUI_DIALOG_COLORPICKER ) )
-, maPreviousColor( nColor )
-, mnDialogMode( nMode )
-, meMode( DefaultMode )
-, maColorField( this, CUI_RES( CT_COLORFIELD ) )
-, maColorSlider( this, CUI_RES( CT_COLORSLIDER ) )
-, maColorPreview( this, CUI_RES( CT_PREVIEW ) )
-, maColorPrevious( this, CUI_RES( CT_PREVIOUS ) )
-, maFISliderLeft( this, CUI_RES( CT_LEFT_SLIDER ) )
-, maFISliderRight( this, CUI_RES( CT_RIGHT_SLIDER ) )
-, maSliderImage( CUI_RES( CT_SLIDERIMG ) )
-#if 0
-, maBtnPicker( this, CUI_RES( PB_PICKER ) )
-#endif
-, maFLRGB( this, CUI_RES( FL_RGB ) )
-, maRBRed( this, CUI_RES( CT_RED ) )
-, maRBGreen( this, CUI_RES( CT_GREEN ) )
-, maRBBlue( this, CUI_RES( CT_BLUE ) )
-, maRBHue( this, CUI_RES( CT_HUE ) )
-, maRBSaturation( this, CUI_RES( CT_SATURATION ) )
-, maRBBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
-, maFTRed( this, CUI_RES( CT_RED ) )
-, maMFRed( this, CUI_RES( CT_RED ) )
-, maFTGreen( this, CUI_RES( CT_GREEN ) )
-, maMFGreen( this, CUI_RES( CT_GREEN ) )
-, maFTBlue( this, CUI_RES( CT_BLUE ) )
-, maMFBlue( this, CUI_RES( CT_BLUE ) )
-, maFTHex( this, CUI_RES( CT_HEX ) )
-, maEDHex( this, CUI_RES( CT_HEX ) )
-, maFLHSB( this, CUI_RES( FL_HSB ) )
-, maFTHue( this, CUI_RES( CT_HUE ) )
-, maMFHue( this, CUI_RES( CT_HUE ) )
-, maFTSaturation( this, CUI_RES( CT_SATURATION ) )
-, maMFSaturation( this, CUI_RES( CT_SATURATION ) )
-, maFTBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
-, maMFBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
-, maFLCMYK( this, CUI_RES( FL_CMYK ) )
-, maFTCyan( this, CUI_RES( CT_CYAN ) )
-, maMFCyan( this, CUI_RES( CT_CYAN ) )
-, maFTMagenta( this, CUI_RES( CT_MAGENTA ) )
-, maMFMagenta( this, CUI_RES( CT_MAGENTA ) )
-, maFTYellow( this, CUI_RES( CT_YELLOW ) )
-, maMFYellow( this, CUI_RES( CT_YELLOW ) )
-, maFTKey( this, CUI_RES( CT_KEY ) )
-, maMFKey( this, CUI_RES( CT_KEY ) )
-
-, maFLBottmLine( this, CUI_RES( FT_BOTTOMLINE ) )
-, maBTNHelp( this, CUI_RES( BTN_HELP ) )
-, maBTNOk( this, CUI_RES( BTN_OK ) )
-, maBTNCancel( this, CUI_RES( BTN_CANCEL ) )
-{
- FreeResource();
-
- String sUnitText;
- sUnitText.Append( ' ' );
- sUnitText.Append( (sal_Unicode) 0xb0 );
-
- maMFHue.SetCustomUnitText( sUnitText );
-
- Link aLink( LINK( this, ColorPickerDialog, ColorModifyHdl ) );
- maColorField.SetModifyHdl( aLink );
- maColorSlider.SetModifyHdl( aLink );
-
- maMFRed.SetModifyHdl( aLink );
- maMFGreen.SetModifyHdl( aLink );
- maMFBlue.SetModifyHdl( aLink );
-
- maMFCyan.SetModifyHdl( aLink );
- maMFMagenta.SetModifyHdl( aLink );
- maMFYellow.SetModifyHdl( aLink );
- maMFKey.SetModifyHdl( aLink );
-
- maMFHue.SetModifyHdl( aLink );
- maMFSaturation.SetModifyHdl( aLink );
- maMFBrightness.SetModifyHdl( aLink );
-
- maEDHex.SetModifyHdl( aLink );
-
- aLink = LINK( this, ColorPickerDialog, ModeModifyHdl );
- maRBRed.SetToggleHdl( aLink );
- maRBGreen.SetToggleHdl( aLink );
- maRBBlue.SetToggleHdl( aLink );
- maRBHue.SetToggleHdl( aLink );
- maRBSaturation.SetToggleHdl( aLink );
- maRBBrightness.SetToggleHdl( aLink );
-
- Image aSliderImage( maSliderImage );
-
- maFISliderLeft.SetImage( aSliderImage );
-
- BitmapEx aTmpBmp( maSliderImage.GetBitmapEx() );
- aTmpBmp.Mirror( BMP_MIRROR_HORZ );
- maFISliderRight.SetImage( Image( aTmpBmp ) );
-
- Size aSize( maSliderImage.GetSizePixel() );
- maFISliderLeft.SetSizePixel( aSize );
- maFISliderRight.SetSizePixel( aSize );
-
- Point aPos( maColorSlider.GetPosPixel() );
-
- aPos.X() -= aSize.Width();
- aPos.Y() -= aSize.Height() / 2;
- maFISliderLeft.SetPosPixel( aPos );
-
- aPos.X() += aSize.Width() + maColorSlider.GetSizePixel().Width();
- maFISliderRight.SetPosPixel( aPos );
-
- Color aColor( nColor );
-
- // modify
- if( mnDialogMode == 2 )
- {
- maColorPreview.SetSizePixel( maColorPrevious.GetSizePixel() );
- maColorPrevious.SetColor( aColor );
- maColorPrevious.Show( true );
- }
-
- mdRed = ((double)aColor.GetRed()) / 255.0;
- mdGreen = ((double)aColor.GetGreen()) / 255.0;
- mdBlue = ((double)aColor.GetBlue()) / 255.0;
-
- RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
- RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
-
- update_color();
-}
-
-// --------------------------------------------------------------------
-
-static int toInt( double dValue, double bRange )
-{
- return static_cast< int >( std::floor((dValue * bRange) + 0.5 ) );
-}
-
-sal_Int32 ColorPickerDialog::GetColor() const
-{
- return Color( toInt(mdRed,255.0), toInt(mdGreen,255.0), toInt(mdBlue,255.0) ).GetColor();
-}
-
-void ColorPickerDialog::update_color( sal_uInt16 n )
-{
- sal_uInt8 nRed = toInt(mdRed,255.0);
- sal_uInt8 nGreen = toInt(mdGreen,255.0);
- sal_uInt8 nBlue = toInt(mdBlue,255.0);
-
- Color aColor( nRed, nGreen, nBlue );
-
- if( n & UPDATE_RGB ) // update RGB
- {
- maMFRed.SetValue( nRed );
- maMFGreen.SetValue( nGreen );
- maMFBlue.SetValue( nBlue );
- }
-
- if( n & UPDATE_CMYK ) // update CMYK
- {
- maMFCyan.SetValue( toInt( mdCyan, 100.0 ) );
- maMFMagenta.SetValue( toInt( mdMagenta, 100.0 ) );
- maMFYellow.SetValue( toInt( mdYellow, 100.0 ) );
- maMFKey.SetValue( toInt( mdKey, 100.0 ) );
- }
-
- if( n & UPDATE_HSB ) // update HSB
- {
- maMFHue.SetValue( toInt( mdHue, 1.0 ) );
- maMFSaturation.SetValue( toInt( mdSat, 100.0 ) );
- maMFBrightness.SetValue( toInt( mdBri, 100.0 ) );
- }
-
- if( n & UPDATE_COLORCHOOSER ) // update Color Chooser 1
- {
- switch( meMode )
- {
- case HUE: maColorField.SetValues( aColor, meMode, mdSat, mdBri ); break;
- case SATURATION: maColorField.SetValues( aColor, meMode, mdHue / 360.0, mdBri ); break;
- case BRIGHTNESS: maColorField.SetValues( aColor, meMode, mdHue / 360.0, mdSat ); break;
- case RED: maColorField.SetValues( aColor, meMode, mdBlue, mdGreen ); break;
- case GREEN: maColorField.SetValues( aColor, meMode, mdBlue, mdRed ); break;
- case BLUE: maColorField.SetValues( aColor, meMode, mdRed, mdGreen ); break;
- }
- }
-
- if( n & UPDATE_COLORSLIDER ) // update Color Chooser 2
- {
- switch( meMode )
- {
- case HUE: maColorSlider.SetValue( aColor, meMode, mdHue / 360.0 ); break;
- case SATURATION: maColorSlider.SetValue( aColor, meMode, mdSat ); break;
- case BRIGHTNESS: maColorSlider.SetValue( aColor, meMode, mdBri ); break;
- case RED: maColorSlider.SetValue( aColor, meMode, mdRed ); break;
- case GREEN: maColorSlider.SetValue( aColor, meMode, mdGreen ); break;
- case BLUE: maColorSlider.SetValue( aColor, meMode, mdBlue ); break;
- }
- }
-
- if( n & UPDATE_HEX ) // update hex
- {
- maEDHex.SetColor( aColor.GetColor() );
- }
-
- {
- Point aPos( 0, maColorSlider.GetLevel() + maColorSlider.GetPosPixel().Y() - 1 );
-
- aPos.X() = maFISliderLeft.GetPosPixel().X();
- if( aPos != maFISliderLeft.GetPosPixel() )
- {
- maFISliderLeft.SetPosPixel( aPos );
-
- aPos.X() = maFISliderRight.GetPosPixel().X();
- maFISliderRight.SetPosPixel( aPos );
- }
- }
-
- maColorPreview.SetColor( aColor );
-}
-
-// --------------------------------------------------------------------
-
-IMPL_LINK( ColorPickerDialog, ColorModifyHdl, void *, p )
-{
- sal_uInt16 n = 0;
-
- if( p == &maColorField )
- {
- double x = maColorField.GetX();
- double y = maColorField.GetY();
-
- switch( meMode )
- {
- case HUE: mdSat = x; setColorComponent( COLORCOMP_BRI, y ); break;
- case SATURATION: mdHue = x * 360.0; setColorComponent( COLORCOMP_BRI, y ); break;
- case BRIGHTNESS: mdHue = x * 360.0; setColorComponent( COLORCOMP_SAT, y ); break;
- case RED: mdBlue = x; setColorComponent( COLORCOMP_GREEN, y ); break;
- case GREEN: mdBlue = x; setColorComponent( COLORCOMP_RED, y ); break;
- case BLUE: mdRed = x; setColorComponent( COLORCOMP_GREEN, y ); break;
- }
-
- n = UPDATE_ALL&~(UPDATE_COLORCHOOSER);
- }
- else if( p == &maColorSlider )
- {
- double dValue = maColorSlider.GetValue();
- switch( meMode )
- {
- case HUE: setColorComponent( COLORCOMP_HUE, dValue * 360.0 ); break;
- case SATURATION: setColorComponent( COLORCOMP_SAT, dValue ); break;
- case BRIGHTNESS: setColorComponent( COLORCOMP_BRI, dValue ); break;
- case RED: setColorComponent( COLORCOMP_RED, dValue ); break;
- case GREEN: setColorComponent( COLORCOMP_GREEN, dValue ); break;
- case BLUE: setColorComponent( COLORCOMP_BLUE, dValue ); break;
- }
-
- n = UPDATE_ALL&~(UPDATE_COLORSLIDER);
- }
- else if( p == &maMFRed )
- {
- setColorComponent( COLORCOMP_RED, ((double)maMFRed.GetValue()) / 255.0 );
- n = UPDATE_ALL&~(UPDATE_RGB);
- }
- else if( p == &maMFGreen )
- {
- setColorComponent( COLORCOMP_GREEN, ((double)maMFGreen.GetValue()) / 255.0 );
- n = UPDATE_ALL&~(UPDATE_RGB);
- }
- else if( p == &maMFBlue )
- {
- setColorComponent( COLORCOMP_BLUE, ((double)maMFBlue.GetValue()) / 255.0 );
- n = UPDATE_ALL&~(UPDATE_RGB);
- }
- else if( p == &maMFHue )
- {
- setColorComponent( COLORCOMP_HUE, (double)maMFHue.GetValue() );
- n = UPDATE_ALL&~(UPDATE_HSB);
- }
- else if( p == &maMFSaturation )
- {
- setColorComponent( COLORCOMP_SAT, ((double)maMFSaturation.GetValue()) / 100.0 );
- n = UPDATE_ALL&~(UPDATE_HSB);
- }
- else if( p == &maMFBrightness )
- {
- setColorComponent( COLORCOMP_BRI, ((double)maMFBrightness.GetValue()) / 100.0 );
- n = UPDATE_ALL&~(UPDATE_HSB);
- }
- else if( p == &maMFCyan )
- {
- setColorComponent( COLORCOMP_CYAN, ((double)maMFCyan.GetValue()) / 100.0 );
- n = UPDATE_ALL&~(UPDATE_CMYK);
- }
- else if( p == &maMFMagenta )
- {
- setColorComponent( COLORCOMP_MAGENTA, ((double)maMFMagenta.GetValue()) / 100.0 );
- n = UPDATE_ALL&~(UPDATE_CMYK);
- }
- else if( p == &maMFYellow )
- {
- setColorComponent( COLORCOMP_YELLOW, ((double)maMFYellow.GetValue()) / 100.0 );
- n = UPDATE_ALL&~(UPDATE_CMYK);
- }
- else if( p == &maMFKey )
- {
- setColorComponent( COLORCOMP_KEY, ((double)maMFKey.GetValue()) / 100.0 );
- n = UPDATE_ALL&~(UPDATE_CMYK);
- }
- else if( p == &maEDHex )
- {
- sal_Int32 nColor = maEDHex.GetColor();
-
- if( nColor != -1 )
- {
- Color aColor( nColor );
-
- if( aColor != GetColor() )
- {
- // #121251# green and blue were wrongly taken
- mdRed = ((double)aColor.GetRed()) / 255.0;
- mdGreen = ((double)aColor.GetGreen()) / 255.0;
- mdBlue = ((double)aColor.GetBlue()) / 255.0;
-
- RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
- RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
- n = UPDATE_ALL&~(UPDATE_HEX);
- }
- }
- }
-
- if( n )
- update_color( n );
-
- return 0;
-}
-
-// --------------------------------------------------------------------
-
-IMPL_LINK( ColorPickerDialog, ModeModifyHdl, void *, EMPTYARG )
-{
- ColorMode eMode = HUE;
-
- if( maRBRed.IsChecked() )
- {
- eMode = RED;
- }
- else if( maRBGreen.IsChecked() )
- {
- eMode = GREEN;
- }
- else if( maRBBlue.IsChecked() )
- {
- eMode = BLUE;
- }
- else if( maRBSaturation.IsChecked() )
- {
- eMode = SATURATION;
- }
- else if( maRBBrightness.IsChecked() )
- {
- eMode = BRIGHTNESS;
- }
-
- if( meMode != eMode )
- {
- meMode = eMode;
- update_color( UPDATE_COLORCHOOSER | UPDATE_COLORSLIDER );
- }
-
- return 0;
-}
-
-// --------------------------------------------------------------------
-
-void ColorPickerDialog::setColorComponent( sal_uInt16 nComp, double dValue )
-{
- switch( nComp )
- {
- case COLORCOMP_RED: mdRed = dValue; break;
- case COLORCOMP_GREEN: mdGreen = dValue; break;
- case COLORCOMP_BLUE: mdBlue = dValue; break;
- case COLORCOMP_HUE: mdHue = dValue; break;
- case COLORCOMP_SAT: mdSat = dValue; break;
- case COLORCOMP_BRI: mdBri = dValue; break;
- case COLORCOMP_CYAN: mdCyan = dValue; break;
- case COLORCOMP_YELLOW: mdYellow = dValue; break;
- case COLORCOMP_MAGENTA: mdMagenta = dValue; break;
- case COLORCOMP_KEY: mdKey = dValue; break;
- }
-
- if( nComp & COLORMODE_RGB )
- {
- RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
- RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
- }
- else if( nComp & COLORMODE_HSV )
- {
- HSVtoRGB( mdHue, mdSat, mdBri, mdRed, mdGreen, mdBlue );
- RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
- }
- else
- {
- CMYKtoRGB( mdCyan, mdMagenta, mdYellow, mdKey, mdRed, mdGreen, mdBlue );
- RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
- }
-}
-
-// --------------------------------------------------------------------
-
-typedef ::cppu::WeakComponentImplHelper4< XServiceInfo, XExecutableDialog, XInitialization, XPropertyAccess > ColorPickerBase;
-
-class ColorPicker : protected ::comphelper::OBaseMutex, // Struct for right initalization of mutex member! Must be first of baseclasses.
- public ColorPickerBase
-{
-public:
- ColorPicker( Reference< XComponentContext > const & xContext );
-
- // XInitialization
- virtual void SAL_CALL initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException);
-
- // XInitialization
- virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException);
- virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException);
- virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException);
-
- // XPropertyAccess
- virtual Sequence< PropertyValue > SAL_CALL getPropertyValues( ) throw (RuntimeException);
- virtual void SAL_CALL setPropertyValues( const Sequence< PropertyValue >& aProps ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException);
-
- // XExecutableDialog
- virtual void SAL_CALL setTitle( const OUString& aTitle ) throw (RuntimeException);
- virtual sal_Int16 SAL_CALL execute( ) throw (RuntimeException);
-
-private:
- Reference< XComponentContext > mxContext;
- OUString msTitle;
- const OUString msColorKey;
- const OUString msModeKey;
- sal_Int32 mnColor;
- sal_Int16 mnMode;
- Reference< ::com::sun::star::awt::XWindow > mxParent;
-};
-
-// --------------------------------------------------------------------
-
-OUString SAL_CALL ColorPicker_getImplementationName()
-{
- return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.cui.ColorPicker" ) );
-}
-
-// --------------------------------------------------------------------
-
-Reference< XInterface > SAL_CALL ColorPicker_createInstance( Reference< XComponentContext > const & xContext ) SAL_THROW( (Exception) )
-{
- return static_cast<XWeak*>( new ColorPicker( xContext ) );
-}
-
-// --------------------------------------------------------------------
-
-Sequence< OUString > SAL_CALL ColorPicker_getSupportedServiceNames() throw( RuntimeException )
-{
- Sequence< OUString > seq(1);
- seq[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.ColorPicker" ) );
- return seq;
-}
-
-// --------------------------------------------------------------------
-
-ColorPicker::ColorPicker( Reference< XComponentContext > const & xContext )
-: ColorPickerBase( m_aMutex )
-, mxContext( xContext )
-, msColorKey( RTL_CONSTASCII_USTRINGPARAM( "Color" ) )
-, msModeKey( RTL_CONSTASCII_USTRINGPARAM( "Mode" ) )
-, mnColor( 0 )
-, mnMode( 0 )
-{
-}
-
-// --------------------------------------------------------------------
-
-// XInitialization
-void SAL_CALL ColorPicker::initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException)
-{
- if( aArguments.getLength() == 1 )
- {
- aArguments[0] >>= mxParent;
- }
-}
-
-// --------------------------------------------------------------------
-
-// XInitialization
-OUString SAL_CALL ColorPicker::getImplementationName( ) throw (RuntimeException)
-{
- return ColorPicker_getImplementationName();
-}
-
-// --------------------------------------------------------------------
-
-sal_Bool SAL_CALL ColorPicker::supportsService( const OUString& sServiceName ) throw (RuntimeException)
-{
- return sServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.ui.dialogs.ColorPicker" ) );
-}
-
-// --------------------------------------------------------------------
-
-Sequence< OUString > SAL_CALL ColorPicker::getSupportedServiceNames( ) throw (RuntimeException)
-{
- return ColorPicker_getSupportedServiceNames();
-}
-
-// --------------------------------------------------------------------
-
-// XPropertyAccess
-Sequence< PropertyValue > SAL_CALL ColorPicker::getPropertyValues( ) throw (RuntimeException)
-{
- Sequence< PropertyValue > props(1);
- props[0].Name = msColorKey;
- props[0].Value <<= mnColor;
- return props;
-}
-
-// --------------------------------------------------------------------
-
-void SAL_CALL ColorPicker::setPropertyValues( const Sequence< PropertyValue >& aProps ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
-{
- for( sal_Int32 n = 0; n < aProps.getLength(); n++ )
- {
- if( aProps[n].Name.equals( msColorKey ) )
- {
- aProps[n].Value >>= mnColor;
- }
- else if( aProps[n].Name.equals( msModeKey ) )
- {
- aProps[n].Value >>= mnMode;
- }
- }
-}
-
-// --------------------------------------------------------------------
-
-// XExecutableDialog
-void SAL_CALL ColorPicker::setTitle( const OUString& sTitle ) throw (RuntimeException)
-{
- msTitle = sTitle;
-}
-
-// --------------------------------------------------------------------
-
-sal_Int16 SAL_CALL ColorPicker::execute( ) throw (RuntimeException)
-{
- ColorPickerDialog aDlg( VCLUnoHelper::GetWindow( mxParent ), mnColor, mnMode );
- sal_Int16 ret = aDlg.Execute();
- if( ret )
- mnColor = aDlg.GetColor();
-
- return ret;
-}
-
-// --------------------------------------------------------------------
-
-}
-
-// eof
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
+#include <com/sun/star/beans/XPropertyAccess.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/datatransfer/XTransferable.hpp>
+#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <cppuhelper/compbase4.hxx>
+#include <comphelper/broadcasthelper.hxx>
+#include <vcl/dialog.hxx>
+#include <vcl/button.hxx>
+#include <vcl/fixed.hxx>
+#include <vcl/edit.hxx>
+#include <vcl/field.hxx>
+#include <vcl/bmpacc.hxx>
+#include <vcl/decoview.hxx>
+#include <vcl/sound.hxx>
+#include <vcl/svapp.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <sot/exchange.hxx>
+#include <sot/formats.hxx>
+#include <sax/tools/converter.hxx>
+#include "dialmgr.hxx"
+#include "colorpicker.hrc"
+#include <cmath>
+
+using rtl::OUString;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::ui::dialogs;
+using namespace ::com::sun::star::beans;
+
+namespace cui
+{
+const sal_uInt16 COLORMODE_RGB = 0x10;
+const sal_uInt16 COLORMODE_HSV = 0x20;
+const sal_uInt16 COLORMODE_CMYK = 0x40;
+
+const sal_uInt16 COLORCOMP_RED = 0x10;
+const sal_uInt16 COLORCOMP_GREEN = 0x11;
+const sal_uInt16 COLORCOMP_BLUE = 0x12;
+
+const sal_uInt16 COLORCOMP_HUE = 0x20;
+const sal_uInt16 COLORCOMP_SAT = 0x21;
+const sal_uInt16 COLORCOMP_BRI = 0x22;
+
+const sal_uInt16 COLORCOMP_CYAN = 0x40;
+const sal_uInt16 COLORCOMP_YELLOW = 0x41;
+const sal_uInt16 COLORCOMP_MAGENTA = 0x42;
+const sal_uInt16 COLORCOMP_KEY = 0x43;
+
+// -----------------------------------------------------------------------
+// color space conversion
+// RGB = 0 .. 1
+// H = 0 .. 360
+// SV = 0 .. 1
+// CMYK = 0 .. 1
+// -----------------------------------------------------------------------
+
+static void RGBtoHSV( double dR, double dG, double dB, double& dH, double& dS, double& dV )
+{
+ // Brightness = max(R, G, B);
+ dV = std::max( dR, std::max( dG, dB ) );
+
+ double cDelta = dV - std::min( dR, std::min( dG, dB ) );
+
+ // Saturation = max - min / max
+ if( dV > 0 )
+ dS = cDelta / dV;
+ else
+ dS = 0.0;
+
+ dH = 0.0;
+
+ if( !basegfx::fTools::equalZero( dS ) )
+ {
+ if( basegfx::fTools::equal( dR, dV ) )
+ {
+ dH = ( dG - dB ) / cDelta;
+ }
+ else if( basegfx::fTools::equal( dG, dV ) )
+ {
+ dH = 2.0 + ( dB - dR ) / cDelta;
+ }
+ else if ( basegfx::fTools::equal( dB, dV ) )
+ {
+ dH = 4.0 + ( dR - dG ) / cDelta;
+ }
+ dH *= 60.0;
+
+ if( dH < 0.0 )
+ dH += 360.0;
+ }
+}
+
+static void HSVtoRGB(double dH, double dS, double dV, double& dR, double& dG, double& dB )
+{
+ if( basegfx::fTools::equalZero( dS ) )
+ {
+ dR = dV;
+ dG = dV;
+ dB = dV;
+ }
+ else
+ {
+ if( basegfx::fTools::equal( dH, 360.0 ) )
+ dH = 0.0;
+ else
+ dH /= 60.0;
+
+ sal_uInt16 n = (sal_uInt16) dH;
+ double f = dH - n;
+
+ double a = dV * ( 1.0 - dS );
+ double b = dV * ( 1.0 - ( dS * f ) );
+ double c = dV * ( 1.0 - ( dS * ( 1.0 - f ) ) );
+
+ switch( n )
+ {
+ case 0: dR = dV; dG = c; dB = a; break;
+ case 1: dR = b; dG = dV; dB = a; break;
+ case 2: dR = a; dG = dV; dB = c; break;
+ case 3: dR = a; dG = b; dB = dV; break;
+ case 4: dR = c; dG = a; dB = dV; break;
+ case 5: dR = dV; dG = a; dB = b; break;
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// CMYK values from 0 to 1
+static void CMYKtoRGB( double fCyan, double fMagenta, double fYellow, double fKey, double& dR, double& dG, double& dB )
+{
+ fCyan = (fCyan * ( 1.0 - fKey )) + fKey;
+ fMagenta = (fMagenta * ( 1.0 - fKey )) + fKey;
+ fYellow = (fYellow * ( 1.0 - fKey )) + fKey;
+
+ dR = std::max( std::min( ( 1.0 - fCyan ), 1.0), 0.0 );
+ dG = std::max( std::min( ( 1.0 - fMagenta ), 1.0), 0.0 );
+ dB = std::max( std::min( ( 1.0 - fYellow ), 1.0), 0.0 );
+}
+
+// -----------------------------------------------------------------------
+
+// CMY results from 0 to 1
+static void RGBtoCMYK( double dR, double dG, double dB, double& fCyan, double& fMagenta, double& fYellow, double& fKey )
+{
+ fCyan = 1 - dR;
+ fMagenta = 1 - dG;
+ fYellow = 1 - dB;
+
+ //CMYK and CMY values from 0 to 1
+ fKey = 1.0;
+ if( fCyan < fKey ) fKey = fCyan;
+ if( fMagenta < fKey ) fKey = fMagenta;
+ if( fYellow < fKey ) fKey = fYellow;
+
+ if( basegfx::fTools::equal( fKey, 1.0 ) )
+ {
+ //Black
+ fCyan = 0.0;
+ fMagenta = 0.0;
+ fYellow = 0.0;
+ }
+ else
+ {
+ fCyan = ( fCyan - fKey ) / ( 1.0 - fKey );
+ fMagenta = ( fMagenta - fKey ) / ( 1.0 - fKey );
+ fYellow = ( fYellow - fKey ) / ( 1.0 - fKey );
+ }
+}
+
+// ====================================================================
+
+class HexColorControl : public Edit
+{
+public:
+ HexColorControl( Window* pParent, const ResId& rResId );
+
+ virtual long PreNotify( NotifyEvent& rNEvt );
+ virtual void Paste();
+
+ void SetColor( sal_Int32 nColor );
+ sal_Int32 GetColor();
+
+private:
+ bool ImplProcessKeyInput( const KeyEvent& rKEv );
+};
+
+HexColorControl::HexColorControl( Window* pParent, const ResId& rResId )
+: Edit( pParent, rResId )
+{
+ SetMaxTextLen( 6 );
+}
+
+// -----------------------------------------------------------------------
+
+void HexColorControl::SetColor( sal_Int32 nColor )
+{
+ ::rtl::OUStringBuffer aBuffer;
+ sax::Converter::convertColor( aBuffer, nColor );
+ SetText( aBuffer.makeStringAndClear().copy(1) );
+}
+
+// -----------------------------------------------------------------------
+
+sal_Int32 HexColorControl::GetColor()
+{
+ sal_Int32 nColor = -1;
+
+ OUString aStr( RTL_CONSTASCII_USTRINGPARAM( "#" ) );
+ aStr += GetText();
+ sal_Int32 nLen = aStr.getLength();
+ if( nLen < 7 )
+ {
+ static const sal_Char* pNullStr = "000000";
+ aStr += OUString::createFromAscii( &pNullStr[nLen-1] );
+ }
+
+ sax::Converter::convertColor( nColor, aStr );
+
+ if( nColor == -1 )
+ SetControlBackground( Color( COL_RED ) );
+ else
+ SetControlBackground();
+
+ return nColor;
+}
+
+// -----------------------------------------------------------------------
+
+long HexColorControl::PreNotify( NotifyEvent& rNEvt )
+{
+ if ( (rNEvt.GetType() == EVENT_KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() )
+ {
+ if ( ImplProcessKeyInput( *rNEvt.GetKeyEvent() ) )
+ return 1;
+ }
+
+ return Edit::PreNotify( rNEvt );
+}
+
+// -----------------------------------------------------------------------
+
+void HexColorControl::Paste()
+{
+ ::com::sun::star::uno::Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipboard(GetClipboard());
+ if ( aClipboard.is() )
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xDataObj;
+
+ const sal_uInt32 nRef = Application::ReleaseSolarMutex();
+
+ try
+ {
+ xDataObj = aClipboard->getContents();
+ }
+ catch( const ::com::sun::star::uno::Exception& )
+ {
+ }
+
+ Application::AcquireSolarMutex( nRef );
+
+ if ( xDataObj.is() )
+ {
+ ::com::sun::star::datatransfer::DataFlavor aFlavor;
+ SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
+ try
+ {
+ ::com::sun::star::uno::Any aData = xDataObj->getTransferData( aFlavor );
+ ::rtl::OUString aText;
+ aData >>= aText;
+
+ if( aText.getLength() && aText.matchAsciiL( "#", 1, 0 ) )
+ aText = aText.copy(1);
+
+ if( aText.getLength() > 6 )
+ aText = aText.copy( 0, 6 );
+
+ SetText( aText );
+ }
+ catch( const ::com::sun::star::uno::Exception& )
+ {
+ }
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+bool HexColorControl::ImplProcessKeyInput( const KeyEvent& rKEv )
+{
+ const KeyCode& rKeyCode = rKEv.GetKeyCode();
+
+ if( rKeyCode.GetGroup() == KEYGROUP_ALPHA && !rKeyCode.IsMod1() && !rKeyCode.IsMod2() )
+ {
+ if( (rKeyCode.GetCode() < KEY_A) || (rKeyCode.GetCode() > KEY_F) )
+ {
+ Sound::Beep();
+ return true;
+ }
+ }
+ else if( rKeyCode.GetGroup() == KEYGROUP_NUM )
+ {
+ if( rKeyCode.IsShift() )
+ {
+ Sound::Beep();
+ return true;
+ }
+ }
+ return false;
+}
+
+// ====================================================================
+
+class ColorPreviewControl : public Control
+{
+public:
+ ColorPreviewControl( Window* pParent, const ResId& rResId );
+
+ virtual void Paint( const Rectangle& rRect );
+
+ void SetColor( const Color& rColor );
+private:
+ Color maColor;
+};
+
+// -----------------------------------------------------------------------
+
+ColorPreviewControl::ColorPreviewControl( Window* pParent, const ResId& rResId )
+: Control( pParent, rResId )
+{
+ SetFillColor( maColor );
+ SetLineColor( maColor );
+}
+
+// -----------------------------------------------------------------------
+
+void ColorPreviewControl::SetColor( const Color& rCol )
+{
+ if( rCol != maColor )
+ {
+ maColor = rCol;
+ SetFillColor( maColor );
+ SetLineColor( maColor );
+ Invalidate();
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ColorPreviewControl::Paint( const Rectangle& rRect )
+{
+ DrawRect( rRect );
+}
+
+// ====================================================================
+
+enum ColorMode { HUE, SATURATION, BRIGHTNESS, RED, GREEN, BLUE };
+const ColorMode DefaultMode = HUE;
+
+class ColorFieldControl : public Control
+{
+public:
+ ColorFieldControl( Window* pParent, const ResId& rResId );
+ ~ColorFieldControl();
+
+ virtual void MouseMove( const MouseEvent& rMEvt );
+ virtual void MouseButtonDown( const MouseEvent& rMEvt );
+ virtual void MouseButtonUp( const MouseEvent& rMEvt );
+ virtual void KeyInput( const KeyEvent& rKEvt );
+ virtual void Paint( const Rectangle& rRect );
+ virtual void Resize();
+
+ void UpdateBitmap();
+ void ShowPosition( const Point& rPos, bool bUpdate );
+ void UpdatePosition();
+ void Modify();
+
+ void SetValues( Color aColor, ColorMode eMode, double x, double y );
+ double GetX();
+ double GetY();
+
+ void KeyMove( int dx, int dy );
+
+ void SetModifyHdl( Link& rLink ) { maModifyHdl = rLink; }
+
+private:
+ Link maModifyHdl;
+ ColorMode meMode;
+ Color maColor;
+ double mdX;
+ double mdY;
+ Point maPosition;
+ Bitmap* mpBitmap;
+ std::vector< sal_uInt8 > maRGB_Horiz;
+ std::vector< sal_uInt16 > maGrad_Horiz;
+ std::vector< sal_uInt16 > maPercent_Horiz;
+ std::vector< sal_uInt8 > maRGB_Vert;
+ std::vector< sal_uInt16 > maPercent_Vert;
+ bool mbInit;
+};
+
+// -----------------------------------------------------------------------
+
+ColorFieldControl::ColorFieldControl( Window* pParent, const ResId& rResId )
+: Control( pParent, rResId )
+, meMode( DefaultMode )
+, mdX( -1.0 )
+, mdY( -1.0 )
+, mpBitmap( 0 )
+, mbInit( false )
+{
+ SetControlBackground();
+}
+
+// -----------------------------------------------------------------------
+
+ColorFieldControl::~ColorFieldControl()
+{
+ delete mpBitmap;
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::UpdateBitmap()
+{
+ const Size aSize( GetOutputSizePixel() );
+
+ if( mpBitmap && mpBitmap->GetSizePixel() != aSize )
+ delete mpBitmap, mpBitmap = NULL;
+
+ const sal_Int32 nWidth = aSize.Width();
+ const sal_Int32 nHeight = aSize.Height();
+
+ if( !mpBitmap )
+ {
+ mpBitmap = new Bitmap( aSize, 24 );
+
+ maRGB_Horiz.resize( nWidth );
+ maGrad_Horiz.resize( nWidth );
+ maPercent_Horiz.resize( nWidth );
+
+ sal_uInt8* pRGB = &(*maRGB_Horiz.begin());
+ sal_uInt16* pGrad = &(*maGrad_Horiz.begin());
+ sal_uInt16* pPercent = &(*maPercent_Horiz.begin());
+
+ for( sal_Int32 x = 0; x < nWidth; x++ )
+ {
+ *pRGB++ = static_cast< sal_uInt8 >( (x * 256) / nWidth );
+ *pGrad++ = static_cast< sal_uInt16 >( (x * 359) / nWidth );
+ *pPercent++ = static_cast< sal_uInt16 >( (x * 100) / nWidth );
+ }
+
+ maRGB_Vert.resize( nHeight );
+ maPercent_Vert.resize( nHeight );
+
+ pRGB = &(*maRGB_Vert.begin());
+ pPercent = &(*maPercent_Vert.begin());
+
+ sal_Int32 y = nHeight;
+ while( y-- )
+ {
+ *pRGB++ = static_cast< sal_uInt8 >( (y * 256) / nHeight );
+ *pPercent++ = static_cast< sal_uInt16 >( (y * 100) / nHeight );
+ }
+ }
+
+ sal_uInt8* pRGB_Horiz = &(*maRGB_Horiz.begin());
+ sal_uInt16* pGrad_Horiz = &(*maGrad_Horiz.begin());
+ sal_uInt16* pPercent_Horiz = &(*maPercent_Horiz.begin());
+ sal_uInt8* pRGB_Vert = &(*maRGB_Vert.begin());
+ sal_uInt16* pPercent_Vert = &(*maPercent_Vert.begin());
+
+ BitmapWriteAccess* pWriteAccess = mpBitmap->AcquireWriteAccess();
+ if( pWriteAccess )
+ {
+ BitmapColor aBitmapColor( maColor );
+
+ sal_uInt16 nHue, nSat, nBri;
+ maColor.RGBtoHSB( nHue, nSat, nBri );
+
+ // this has been unlooped for performance reason, please do not merge back!
+
+ sal_uInt16 y = nHeight,x;
+
+ switch( meMode )
+ {
+ case HUE:
+ while( y-- )
+ {
+ nBri = pPercent_Vert[y];
+ x = nWidth;
+ while( x-- )
+ {
+ nSat = pPercent_Horiz[x];
+ pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
+ }
+ }
+ break;
+ case SATURATION:
+ while( y-- )
+ {
+ nBri = pPercent_Vert[y];
+ x = nWidth;
+ while( x-- )
+ {
+ nHue = pGrad_Horiz[x];
+ pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
+ }
+ }
+ break;
+ case BRIGHTNESS:
+ while( y-- )
+ {
+ nSat = pPercent_Vert[y];
+ x = nWidth;
+ while( x-- )
+ {
+ nHue = pGrad_Horiz[x];
+ pWriteAccess->SetPixel( y, x, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
+ }
+ }
+ break;
+ case RED:
+ while( y-- )
+ {
+ aBitmapColor.SetGreen( pRGB_Vert[y] );
+ x = nWidth;
+ while( x-- )
+ {
+ aBitmapColor.SetBlue( pRGB_Horiz[x] );
+ pWriteAccess->SetPixel( y, x, aBitmapColor );
+ }
+ }
+ break;
+ case GREEN:
+ while( y-- )
+ {
+ aBitmapColor.SetRed( pRGB_Vert[y] );
+ x = nWidth;
+ while( x-- )
+ {
+ aBitmapColor.SetBlue( pRGB_Horiz[x] );
+ pWriteAccess->SetPixel( y, x, aBitmapColor );
+ }
+ }
+ break;
+ case BLUE:
+ while( y-- )
+ {
+ aBitmapColor.SetGreen( pRGB_Vert[y] );
+ x = nWidth;
+ while( x-- )
+ {
+ aBitmapColor.SetRed( pRGB_Horiz[x] );
+ pWriteAccess->SetPixel( y, x, aBitmapColor );
+ }
+ }
+ break;
+ }
+
+ mpBitmap->ReleaseAccess( pWriteAccess );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::ShowPosition( const Point& rPos, bool bUpdate )
+{
+ if( !mpBitmap )
+ {
+ UpdateBitmap();
+ Invalidate();
+ }
+
+ const Size aSize( mpBitmap->GetSizePixel() );
+
+ long nX = rPos.X();
+ long nY = rPos.Y();
+ if( nX < 0L )
+ nX = 0L;
+ else if( nX >= aSize.Width() )
+ nX = aSize.Width() - 1L;
+
+ if( nY < 0L )
+ nY= 0L;
+ else if( nY >= aSize.Height() )
+ nY = aSize.Height() - 1L;
+
+ Point aPos = maPosition;
+ maPosition.X() = nX - 5;
+ maPosition.Y() = nY - 5;
+ Invalidate( Rectangle( aPos, Size( 11, 11) ) );
+ Invalidate( Rectangle( maPosition, Size( 11, 11) ) );
+
+ if( bUpdate )
+ {
+ mdX = (double)nX / (double)(aSize.Width()-1);
+ mdY = (double)(aSize.Height()-1-nY) / (double)(aSize.Height()-1);
+
+ BitmapReadAccess* pReadAccess = mpBitmap->AcquireReadAccess();
+ if( pReadAccess != NULL )
+ {
+ // mpBitmap always has a bit count of 24 => use of GetPixel(...) is safe
+ maColor = pReadAccess->GetPixel( nY, nX );
+ mpBitmap->ReleaseAccess( pReadAccess );
+ pReadAccess = NULL;
+ }
+ }
+}
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::MouseMove( const MouseEvent& rMEvt )
+{
+ if( rMEvt.IsLeft() )
+ {
+ ShowPosition( rMEvt.GetPosPixel(), true );
+ Modify();
+ }
+}
+
+// -----------------------------------------------------------------------
+void ColorFieldControl::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ if( rMEvt.IsLeft() && !rMEvt.IsShift() )
+ {
+ CaptureMouse();
+ ShowPosition( rMEvt.GetPosPixel(), true );
+ Modify();
+ }
+}
+
+// -----------------------------------------------------------------------
+void ColorFieldControl::MouseButtonUp( const MouseEvent& )
+{
+ if( IsMouseCaptured() )
+ ReleaseMouse();
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::KeyMove( int dx, int dy )
+{
+ Size aSize( GetOutputSizePixel() );
+ Point aPos( mdX * aSize.Width(), (1.0 - mdY) * aSize.Height() );
+ aPos.X() += dx;
+ aPos.Y() += dy;
+ if( aPos.X() < 0 )
+ aPos.X() += aSize.Width();
+ else if( aPos.X() >= aSize.Width() )
+ aPos.X() -= aSize.Width();
+
+ if( aPos.Y() < 0 )
+ aPos.Y() += aSize.Height();
+ else if( aPos.Y() >= aSize.Height() )
+ aPos.Y() -= aSize.Height();
+
+ ShowPosition( aPos, true );
+ Modify();
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::KeyInput( const KeyEvent& rKEvt )
+{
+ bool bShift = rKEvt.GetKeyCode().IsShift();
+ bool bCtrl = rKEvt.GetKeyCode().IsMod1();
+ bool bAlt = rKEvt.GetKeyCode().IsMod2();
+
+ if ( !bAlt && !bShift )
+ {
+ switch( rKEvt.GetKeyCode().GetCode() )
+ {
+ case KEY_DOWN: KeyMove( 0, bCtrl ? 5 : 1 ); return;
+ case KEY_UP: KeyMove( 0, bCtrl ? -5 : -1 ); return;
+ case KEY_LEFT: KeyMove( bCtrl ? -5 : -1, 0 ); return;
+ case KEY_RIGHT: KeyMove( bCtrl ? 5 : 1, 0 ); return;
+ }
+ }
+ Control::KeyInput( rKEvt );
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::Paint( const Rectangle& rRect )
+{
+ if( !mpBitmap )
+ UpdateBitmap();
+
+ Bitmap aOutputBitmap( *mpBitmap );
+
+ if( GetBitCount() <= 8 )
+ aOutputBitmap.Dither();
+
+ DrawBitmap( rRect.TopLeft(), rRect.GetSize(), rRect.TopLeft(), rRect.GetSize(), aOutputBitmap );
+
+ // draw circle around current color
+ if( maColor.IsDark() )
+ SetLineColor( COL_WHITE );
+ else
+ SetLineColor( COL_BLACK );
+
+ SetFillColor();
+
+ DrawEllipse( Rectangle( maPosition, Size( 11, 11) ) );
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::Resize()
+{
+ UpdateBitmap();
+ Control::Resize();
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::Modify()
+{
+ maModifyHdl.Call( this );
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::SetValues( Color aColor, ColorMode eMode, double x, double y )
+{
+ bool bUpdateBitmap = (maColor!= aColor) || (meMode != eMode);
+ if( bUpdateBitmap || (mdX != x) || (mdY != y) )
+ {
+ maColor = aColor;
+ meMode = eMode;
+ mdX = x;
+ mdY = y;
+
+ if( bUpdateBitmap )
+ UpdateBitmap();
+ UpdatePosition();
+ if( bUpdateBitmap )
+ Invalidate();
+ }
+}
+
+// -----------------------------------------------------------------------
+
+double ColorFieldControl::GetX()
+{
+ return mdX;
+}
+
+// -----------------------------------------------------------------------
+
+double ColorFieldControl::GetY()
+{
+ return mdY;
+}
+
+// -----------------------------------------------------------------------
+
+void ColorFieldControl::UpdatePosition()
+{
+ Size aSize( GetOutputSizePixel() );
+ ShowPosition( Point( mdX * aSize.Width(), (1.0 - mdY) * aSize.Height() ), false );
+}
+
+// ====================================================================
+
+class ColorSliderControl : public Control
+{
+public:
+ ColorSliderControl( Window* pParent, const ResId& rResId );
+ ~ColorSliderControl();
+
+ virtual void MouseMove( const MouseEvent& rMEvt );
+ virtual void MouseButtonDown( const MouseEvent& rMEvt );
+ virtual void MouseButtonUp( const MouseEvent& rMEvt );
+ virtual void KeyInput( const KeyEvent& rKEvt );
+ virtual void Paint( const Rectangle& rRect );
+ virtual void Resize();
+
+ void UpdateBitmap();
+ void ChangePosition( long nY );
+ void Modify();
+
+ void SetValue( const Color& rColor, ColorMode eMode, double dValue );
+ double GetValue() const { return mdValue; }
+
+ void KeyMove( int dy );
+
+ void SetModifyHdl( Link& rLink ) { maModifyHdl = rLink; }
+
+ sal_Int16 GetLevel() const { return mnLevel; }
+
+private:
+ Link maModifyHdl;
+ Color maColor;
+ ColorMode meMode;
+ Bitmap* mpBitmap;
+ sal_Int16 mnLevel;
+ double mdValue;
+};
+
+// -----------------------------------------------------------------------
+
+ColorSliderControl::ColorSliderControl( Window* pParent, const ResId& rResId )
+: Control( pParent, rResId )
+, meMode( DefaultMode )
+, mpBitmap( 0 )
+, mnLevel( 0 )
+, mdValue( -1.0 )
+{
+ SetControlBackground();
+}
+
+// -----------------------------------------------------------------------
+
+ColorSliderControl::~ColorSliderControl()
+{
+ delete mpBitmap;
+}
+
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::UpdateBitmap()
+{
+ Size aSize( 1, GetOutputSizePixel().Height() );
+
+ if( mpBitmap && mpBitmap->GetSizePixel() != aSize )
+ delete mpBitmap, mpBitmap = NULL;
+
+ if( !mpBitmap )
+ mpBitmap = new Bitmap( aSize, 24 );
+
+ BitmapWriteAccess* pWriteAccess = mpBitmap->AcquireWriteAccess();
+
+ if( pWriteAccess )
+ {
+ const long nY = aSize.Height()-1;
+
+ BitmapColor aBitmapColor( maColor );
+
+ sal_uInt16 nHue, nSat, nBri;
+ maColor.RGBtoHSB( nHue, nSat, nBri );
+
+ // this has been unlooped for performance reason, please do not merge back!
+
+ switch( meMode )
+ {
+ case HUE:
+ nSat = 100;
+ nBri = 100;
+ for( long y = 0; y <= nY; y++ )
+ {
+ nHue = static_cast< sal_uInt16 >( (359 * y) / nY );
+ aBitmapColor = BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) );
+ pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
+ }
+ break;
+
+ case SATURATION:
+ nBri = std::max( (sal_uInt16)32, nBri );
+ for( long y = 0; y <= nY; y++ )
+ {
+ nSat = static_cast< sal_uInt16 >( (100 * y) / nY );
+ pWriteAccess->SetPixel( nY-y, 0, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
+ }
+ break;
+
+ case BRIGHTNESS:
+ for( long y = 0; y <= nY; y++ )
+ {
+ nBri = static_cast< sal_uInt16 >( (100 * y) / nY );
+ pWriteAccess->SetPixel( nY-y, 0, BitmapColor( Color( Color::HSBtoRGB( nHue, nSat, nBri ) ) ) );
+ }
+ break;
+
+ case RED:
+ for( long y = 0; y <= nY; y++ )
+ {
+ aBitmapColor.SetRed( sal_uInt8( ((long)255 * y) / nY ) );
+ pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
+ }
+ break;
+
+ case GREEN:
+ for( long y = 0; y <= nY; y++ )
+ {
+ aBitmapColor.SetGreen( sal_uInt8( ((long)255 * y) / nY ) );
+ pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
+ }
+ break;
+
+ case BLUE:
+ for( long y = 0; y <= nY; y++ )
+ {
+ aBitmapColor.SetBlue( sal_uInt8( ((long)255 * y) / nY ) );
+ pWriteAccess->SetPixel( nY-y, 0, aBitmapColor );
+ }
+ break;
+ }
+
+ mpBitmap->ReleaseAccess( pWriteAccess );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::ChangePosition( long nY )
+{
+ const long nHeight = GetOutputSizePixel().Height() - 1;
+
+ if( nY < 0L )
+ nY = 0;
+ else if( nY > nHeight )
+ nY = nHeight;
+
+ mnLevel = nY;
+ mdValue = ((double)(nHeight - nY)) / (double)nHeight;
+}
+
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::MouseMove( const MouseEvent& rMEvt )
+{
+ if( rMEvt.IsLeft() )
+ {
+ ChangePosition( rMEvt.GetPosPixel().Y() );
+ Modify();
+ }
+}
+
+// -----------------------------------------------------------------------
+void ColorSliderControl::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ if( rMEvt.IsLeft() && !rMEvt.IsShift() )
+ {
+ CaptureMouse();
+ ChangePosition( rMEvt.GetPosPixel().Y() );
+ Modify();
+ }
+}
+
+// -----------------------------------------------------------------------
+void ColorSliderControl::MouseButtonUp( const MouseEvent& )
+{
+ if( IsMouseCaptured() )
+ ReleaseMouse();
+}
+
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::KeyMove( int dy )
+{
+ ChangePosition( mnLevel + dy );
+ Modify();
+}
+
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::KeyInput( const KeyEvent& rKEvt )
+{
+ if ( !rKEvt.GetKeyCode().IsMod2() && !rKEvt.GetKeyCode().IsShift() )
+ {
+ switch( rKEvt.GetKeyCode().GetCode() )
+ {
+ case KEY_DOWN: KeyMove( rKEvt.GetKeyCode().IsMod1() ? 5 : 1 ); return;
+ case KEY_UP: KeyMove( rKEvt.GetKeyCode().IsMod1() ? -5 : -1 ); return;
+ }
+ }
+
+ Control::KeyInput( rKEvt );
+}
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::Paint( const Rectangle& /*rRect*/ )
+{
+ if( !mpBitmap )
+ UpdateBitmap();
+
+ const Size aSize( GetOutputSizePixel() );
+
+ Bitmap aOutputBitmap( *mpBitmap );
+
+ if( GetBitCount() <= 8 )
+ aOutputBitmap.Dither();
+
+ Point aPos;
+ int x = aSize.Width();
+ while( x-- )
+ {
+ DrawBitmap( aPos, aOutputBitmap );
+ aPos.X() += 1;
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::Resize()
+{
+ UpdateBitmap();
+ Control::Resize();
+}
+
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::Modify()
+{
+ maModifyHdl.Call( this );
+}
+
+// -----------------------------------------------------------------------
+
+void ColorSliderControl::SetValue( const Color& rColor, ColorMode eMode, double dValue )
+{
+ bool bUpdateBitmap = (rColor != maColor) || (eMode != meMode);
+ if( bUpdateBitmap || (mdValue != dValue))
+ {
+ maColor = rColor;
+ mdValue = dValue;
+ mnLevel = (1.0-dValue) * GetOutputSizePixel().Height();
+ meMode = eMode;
+ if( bUpdateBitmap )
+ UpdateBitmap();
+ Invalidate();
+ }
+}
+
+// ====================================================================
+
+const sal_uInt16 UPDATE_RGB = 0x01;
+const sal_uInt16 UPDATE_CMYK = 0x02;
+const sal_uInt16 UPDATE_HSB = 0x04;
+const sal_uInt16 UPDATE_COLORCHOOSER = 0x08;
+const sal_uInt16 UPDATE_COLORSLIDER = 0x10;
+const sal_uInt16 UPDATE_HEX = 0x20;
+const sal_uInt16 UPDATE_ALL = 0xff;
+
+class ColorPickerDialog : public ModalDialog
+{
+public:
+ ColorPickerDialog( Window* pParent, sal_Int32 nColor, sal_Int16 nMode );
+
+ void update_color( sal_uInt16 n = UPDATE_ALL );
+
+ DECL_LINK( ColorModifyHdl, void * );
+ DECL_LINK( ModeModifyHdl, void * );
+
+ sal_Int32 GetColor() const;
+
+ void setColorComponent( sal_uInt16 nComp, double dValue );
+
+private:
+ Color maPreviousColor;
+ sal_Int16 mnDialogMode;
+ ColorMode meMode;
+
+ double mdRed, mdGreen, mdBlue;
+ double mdHue, mdSat, mdBri;
+ double mdCyan, mdMagenta, mdYellow, mdKey;
+
+private:
+ ColorFieldControl maColorField;
+ ColorSliderControl maColorSlider;
+ ColorPreviewControl maColorPreview;
+ ColorPreviewControl maColorPrevious;
+
+ FixedImage maFISliderLeft;
+ FixedImage maFISliderRight;
+ Image maSliderImage;
+
+#if 0
+ ImageButton maBtnPicker;
+#endif
+
+ FixedLine maFLRGB;
+
+ RadioButton maRBRed;
+ RadioButton maRBGreen;
+ RadioButton maRBBlue;
+ RadioButton maRBHue;
+ RadioButton maRBSaturation;
+ RadioButton maRBBrightness;
+
+ FixedText maFTRed;
+ MetricField maMFRed;
+ FixedText maFTGreen;
+ MetricField maMFGreen;
+ FixedText maFTBlue;
+ MetricField maMFBlue;
+ FixedText maFTHex;
+ HexColorControl maEDHex;
+
+ FixedLine maFLHSB;
+ FixedText maFTHue;
+ MetricField maMFHue;
+ FixedText maFTSaturation;
+ MetricField maMFSaturation;
+ FixedText maFTBrightness;
+ MetricField maMFBrightness;
+
+ FixedLine maFLCMYK;
+ FixedText maFTCyan;
+ MetricField maMFCyan;
+ FixedText maFTMagenta;
+ MetricField maMFMagenta;
+ FixedText maFTYellow;
+ MetricField maMFYellow;
+ FixedText maFTKey;
+ MetricField maMFKey;
+
+ FixedLine maFLBottmLine;
+ HelpButton maBTNHelp;
+ OKButton maBTNOk;
+ CancelButton maBTNCancel;
+};
+
+// --------------------------------------------------------------------
+
+ColorPickerDialog::ColorPickerDialog( Window* pParent, sal_Int32 nColor, sal_Int16 nMode )
+: ModalDialog( pParent, CUI_RES( RID_CUI_DIALOG_COLORPICKER ) )
+, maPreviousColor( nColor )
+, mnDialogMode( nMode )
+, meMode( DefaultMode )
+, maColorField( this, CUI_RES( CT_COLORFIELD ) )
+, maColorSlider( this, CUI_RES( CT_COLORSLIDER ) )
+, maColorPreview( this, CUI_RES( CT_PREVIEW ) )
+, maColorPrevious( this, CUI_RES( CT_PREVIOUS ) )
+, maFISliderLeft( this, CUI_RES( CT_LEFT_SLIDER ) )
+, maFISliderRight( this, CUI_RES( CT_RIGHT_SLIDER ) )
+, maSliderImage( CUI_RES( CT_SLIDERIMG ) )
+#if 0
+, maBtnPicker( this, CUI_RES( PB_PICKER ) )
+#endif
+, maFLRGB( this, CUI_RES( FL_RGB ) )
+, maRBRed( this, CUI_RES( CT_RED ) )
+, maRBGreen( this, CUI_RES( CT_GREEN ) )
+, maRBBlue( this, CUI_RES( CT_BLUE ) )
+, maRBHue( this, CUI_RES( CT_HUE ) )
+, maRBSaturation( this, CUI_RES( CT_SATURATION ) )
+, maRBBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
+, maFTRed( this, CUI_RES( CT_RED ) )
+, maMFRed( this, CUI_RES( CT_RED ) )
+, maFTGreen( this, CUI_RES( CT_GREEN ) )
+, maMFGreen( this, CUI_RES( CT_GREEN ) )
+, maFTBlue( this, CUI_RES( CT_BLUE ) )
+, maMFBlue( this, CUI_RES( CT_BLUE ) )
+, maFTHex( this, CUI_RES( CT_HEX ) )
+, maEDHex( this, CUI_RES( CT_HEX ) )
+, maFLHSB( this, CUI_RES( FL_HSB ) )
+, maFTHue( this, CUI_RES( CT_HUE ) )
+, maMFHue( this, CUI_RES( CT_HUE ) )
+, maFTSaturation( this, CUI_RES( CT_SATURATION ) )
+, maMFSaturation( this, CUI_RES( CT_SATURATION ) )
+, maFTBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
+, maMFBrightness( this, CUI_RES( CT_BRIGHTNESS ) )
+, maFLCMYK( this, CUI_RES( FL_CMYK ) )
+, maFTCyan( this, CUI_RES( CT_CYAN ) )
+, maMFCyan( this, CUI_RES( CT_CYAN ) )
+, maFTMagenta( this, CUI_RES( CT_MAGENTA ) )
+, maMFMagenta( this, CUI_RES( CT_MAGENTA ) )
+, maFTYellow( this, CUI_RES( CT_YELLOW ) )
+, maMFYellow( this, CUI_RES( CT_YELLOW ) )
+, maFTKey( this, CUI_RES( CT_KEY ) )
+, maMFKey( this, CUI_RES( CT_KEY ) )
+
+, maFLBottmLine( this, CUI_RES( FT_BOTTOMLINE ) )
+, maBTNHelp( this, CUI_RES( BTN_HELP ) )
+, maBTNOk( this, CUI_RES( BTN_OK ) )
+, maBTNCancel( this, CUI_RES( BTN_CANCEL ) )
+{
+ FreeResource();
+
+ String sUnitText;
+ sUnitText.Append( ' ' );
+ sUnitText.Append( (sal_Unicode) 0xb0 );
+
+ maMFHue.SetCustomUnitText( sUnitText );
+
+ Link aLink( LINK( this, ColorPickerDialog, ColorModifyHdl ) );
+ maColorField.SetModifyHdl( aLink );
+ maColorSlider.SetModifyHdl( aLink );
+
+ maMFRed.SetModifyHdl( aLink );
+ maMFGreen.SetModifyHdl( aLink );
+ maMFBlue.SetModifyHdl( aLink );
+
+ maMFCyan.SetModifyHdl( aLink );
+ maMFMagenta.SetModifyHdl( aLink );
+ maMFYellow.SetModifyHdl( aLink );
+ maMFKey.SetModifyHdl( aLink );
+
+ maMFHue.SetModifyHdl( aLink );
+ maMFSaturation.SetModifyHdl( aLink );
+ maMFBrightness.SetModifyHdl( aLink );
+
+ maEDHex.SetModifyHdl( aLink );
+
+ aLink = LINK( this, ColorPickerDialog, ModeModifyHdl );
+ maRBRed.SetToggleHdl( aLink );
+ maRBGreen.SetToggleHdl( aLink );
+ maRBBlue.SetToggleHdl( aLink );
+ maRBHue.SetToggleHdl( aLink );
+ maRBSaturation.SetToggleHdl( aLink );
+ maRBBrightness.SetToggleHdl( aLink );
+
+ Image aSliderImage( maSliderImage );
+
+ maFISliderLeft.SetImage( aSliderImage );
+
+ BitmapEx aTmpBmp( maSliderImage.GetBitmapEx() );
+ aTmpBmp.Mirror( BMP_MIRROR_HORZ );
+ maFISliderRight.SetImage( Image( aTmpBmp ) );
+
+ Size aSize( maSliderImage.GetSizePixel() );
+ maFISliderLeft.SetSizePixel( aSize );
+ maFISliderRight.SetSizePixel( aSize );
+
+ Point aPos( maColorSlider.GetPosPixel() );
+
+ aPos.X() -= aSize.Width();
+ aPos.Y() -= aSize.Height() / 2;
+ maFISliderLeft.SetPosPixel( aPos );
+
+ aPos.X() += aSize.Width() + maColorSlider.GetSizePixel().Width();
+ maFISliderRight.SetPosPixel( aPos );
+
+ Color aColor( nColor );
+
+ // modify
+ if( mnDialogMode == 2 )
+ {
+ maColorPreview.SetSizePixel( maColorPrevious.GetSizePixel() );
+ maColorPrevious.SetColor( aColor );
+ maColorPrevious.Show( true );
+ }
+
+ mdRed = ((double)aColor.GetRed()) / 255.0;
+ mdGreen = ((double)aColor.GetGreen()) / 255.0;
+ mdBlue = ((double)aColor.GetBlue()) / 255.0;
+
+ RGBtoHSV( mdRed, mdGreen, mdBlue, mdHue, mdSat, mdBri );
+ RGBtoCMYK( mdRed, mdGreen, mdBlue, mdCyan, mdMagenta, mdYellow, mdKey );
+
+ update_color();
+}
+
+// --------------------------------------------------------------------
+
+static int toInt( double dValue, double bRange )
+{
+ return static_cast< int >( std::floor((dValue * bRange) + 0.5 ) );
+}
+
+sal_Int32 ColorPickerDialog::GetColor() const
+{
[... 425 lines stripped ...]