LCOV - code coverage report
Current view: top level - cui/source/dialogs - colorpicker.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 719 0.0 %
Date: 2014-04-14 Functions: 0 77 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10