blob: 7b148c3fabb990cef42200df8c8e36a5acb49ca3 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* 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( (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