00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <stdio.h>
00032 #include <stdlib.h>
00033
00034 #include <qcheckbox.h>
00035 #include <qcombobox.h>
00036 #include <qdrawutil.h>
00037 #include <qevent.h>
00038 #include <qfile.h>
00039 #include <qimage.h>
00040 #include <qlabel.h>
00041 #include <qlayout.h>
00042 #include <qlineedit.h>
00043 #include <qvalidator.h>
00044 #include <qpainter.h>
00045 #include <qpushbutton.h>
00046 #include <qspinbox.h>
00047 #include <qtimer.h>
00048
00049 #include <kapplication.h>
00050 #include <kconfig.h>
00051 #include <kglobal.h>
00052 #include <kglobalsettings.h>
00053 #include <kiconloader.h>
00054 #include <klistbox.h>
00055 #include <klocale.h>
00056 #include <kmessagebox.h>
00057 #include <kseparator.h>
00058 #include <kpalette.h>
00059 #include <kimageeffect.h>
00060
00061 #include "kcolordialog.h"
00062 #include "kcolordrag.h"
00063 #include "kstaticdeleter.h"
00064 #include <config.h>
00065 #include <kdebug.h>
00066
00067 #include "config.h"
00068 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
00069 #include <X11/Xlib.h>
00070
00071
00072 typedef int (*QX11EventFilter) (XEvent*);
00073 extern QX11EventFilter qt_set_x11_event_filter (QX11EventFilter filter);
00074 #endif
00075
00076 static const char * const recentColors = "Recent_Colors";
00077 static const char * const customColors = "Custom_Colors";
00078
00079 class KColorSpinBox : public QSpinBox
00080 {
00081 public:
00082 KColorSpinBox(int minValue, int maxValue, int step, QWidget* parent)
00083 : QSpinBox(minValue, maxValue, step, parent, "kcolorspinbox")
00084 { }
00085
00086
00087 virtual void valueChange()
00088 {
00089 updateDisplay();
00090 emit valueChanged( value() );
00091 emit valueChanged( currentValueText() );
00092 }
00093
00094 };
00095
00096
00097 #define STANDARD_PAL_SIZE 17
00098
00099 KColor::KColor()
00100 : QColor()
00101 {
00102 r = 0; g = 0; b = 0; h = 0; s = 0; v = 0;
00103 }
00104
00105 KColor::KColor( const KColor &col)
00106 : QColor( col )
00107 {
00108 h = col.h; s = col.s; v = col.v;
00109 r = col.r; g = col.g; b = col.b;
00110 }
00111
00112 KColor::KColor( const QColor &col)
00113 : QColor( col )
00114 {
00115 QColor::rgb(&r, &g, &b);
00116 QColor::hsv(&h, &s, &v);
00117 }
00118
00119 bool KColor::operator==(const KColor& col) const
00120 {
00121 return (h == col.h) && (s == col.s) && (v == col.v) &&
00122 (r == col.r) && (g == col.g) && (b == col.b);
00123 }
00124
00125 KColor& KColor::operator=(const KColor& col)
00126 {
00127 *(QColor *)this = col;
00128 h = col.h; s = col.s; v = col.v;
00129 r = col.r; g = col.g; b = col.b;
00130 return *this;
00131 }
00132
00133 void
00134 KColor::setHsv(int _h, int _s, int _v)
00135 {
00136 h = _h; s = _s; v = _v;
00137 QColor::setHsv(h, s, v);
00138 QColor::rgb(&r, &g, &b);
00139 }
00140
00141 void
00142 KColor::setRgb(int _r, int _g, int _b)
00143 {
00144 r = _r; g = _g; b = _b;
00145 QColor::setRgb(r, g, b);
00146 QColor::hsv(&h, &s, &v);
00147 }
00148
00149 void
00150 KColor::rgb(int *_r, int *_g, int *_b) const
00151 {
00152 *_r = r; *_g = g; *_b = b;
00153 }
00154
00155 void
00156 KColor::hsv(int *_h, int *_s, int *_v) const
00157 {
00158 *_h = h; *_s = s; *_v = v;
00159 }
00160
00161
00162 static QColor *standardPalette = 0;
00163 static KStaticDeleter<QColor> spd;
00164
00165 static void createStandardPalette()
00166 {
00167 if ( standardPalette )
00168 return;
00169
00170 spd.setObject(standardPalette, new QColor [STANDARD_PAL_SIZE], true);
00171
00172 int i = 0;
00173
00174 standardPalette[i++] = Qt::red;
00175 standardPalette[i++] = Qt::green;
00176 standardPalette[i++] = Qt::blue;
00177 standardPalette[i++] = Qt::cyan;
00178 standardPalette[i++] = Qt::magenta;
00179 standardPalette[i++] = Qt::yellow;
00180 standardPalette[i++] = Qt::darkRed;
00181 standardPalette[i++] = Qt::darkGreen;
00182 standardPalette[i++] = Qt::darkBlue;
00183 standardPalette[i++] = Qt::darkCyan;
00184 standardPalette[i++] = Qt::darkMagenta;
00185 standardPalette[i++] = Qt::darkYellow;
00186 standardPalette[i++] = Qt::white;
00187 standardPalette[i++] = Qt::lightGray;
00188 standardPalette[i++] = Qt::gray;
00189 standardPalette[i++] = Qt::darkGray;
00190 standardPalette[i++] = Qt::black;
00191
00192 KGlobal::locale()->insertCatalogue("kdelibs_colors");
00193 }
00194
00195
00196 KHSSelector::KHSSelector( QWidget *parent, const char *name )
00197 : KXYSelector( parent, name )
00198 {
00199 setRange( 0, 0, 359, 255 );
00200 }
00201
00202 void KHSSelector::updateContents()
00203 {
00204 drawPalette(&pixmap);
00205 }
00206
00207 void KHSSelector::resizeEvent( QResizeEvent * )
00208 {
00209 updateContents();
00210 }
00211
00212 void KHSSelector::drawContents( QPainter *painter )
00213 {
00214 painter->drawPixmap( contentsRect().x(), contentsRect().y(), pixmap );
00215 }
00216
00217 void KHSSelector::drawPalette( QPixmap *pixmap )
00218 {
00219 int xSize = contentsRect().width(), ySize = contentsRect().height();
00220 QImage image( xSize, ySize, 32 );
00221 QColor col;
00222 int h, s;
00223 uint *p;
00224
00225 for ( s = ySize-1; s >= 0; s-- )
00226 {
00227 p = (uint *) image.scanLine( ySize - s - 1 );
00228 for( h = 0; h < xSize; h++ )
00229 {
00230 col.setHsv( 359*h/(xSize-1), 255*s/(ySize-1), 192 );
00231 *p = col.rgb();
00232 p++;
00233 }
00234 }
00235
00236 if ( QColor::numBitPlanes() <= 8 )
00237 {
00238 createStandardPalette();
00239 KImageEffect::dither( image, standardPalette, STANDARD_PAL_SIZE );
00240 }
00241 pixmap->convertFromImage( image );
00242 }
00243
00244
00245
00246
00247 KValueSelector::KValueSelector( QWidget *parent, const char *name )
00248 : KSelector( KSelector::Vertical, parent, name ), _hue(0), _sat(0)
00249 {
00250 setRange( 0, 255 );
00251 pixmap.setOptimization( QPixmap::BestOptim );
00252 }
00253
00254 KValueSelector::KValueSelector(Orientation o, QWidget *parent, const char *name
00255 )
00256 : KSelector( o, parent, name), _hue(0), _sat(0)
00257 {
00258 setRange( 0, 255 );
00259 pixmap.setOptimization( QPixmap::BestOptim );
00260 }
00261
00262 void KValueSelector::updateContents()
00263 {
00264 drawPalette(&pixmap);
00265 }
00266
00267 void KValueSelector::resizeEvent( QResizeEvent * )
00268 {
00269 updateContents();
00270 }
00271
00272 void KValueSelector::drawContents( QPainter *painter )
00273 {
00274 painter->drawPixmap( contentsRect().x(), contentsRect().y(), pixmap );
00275 }
00276
00277 void KValueSelector::drawPalette( QPixmap *pixmap )
00278 {
00279 int xSize = contentsRect().width(), ySize = contentsRect().height();
00280 QImage image( xSize, ySize, 32 );
00281 QColor col;
00282 uint *p;
00283 QRgb rgb;
00284
00285 if ( orientation() == KSelector::Horizontal )
00286 {
00287 for ( int v = 0; v < ySize; v++ )
00288 {
00289 p = (uint *) image.scanLine( ySize - v - 1 );
00290
00291 for( int x = 0; x < xSize; x++ )
00292 {
00293 col.setHsv( _hue, _sat, 255*x/(xSize-1) );
00294 rgb = col.rgb();
00295 *p++ = rgb;
00296 }
00297 }
00298 }
00299
00300 if( orientation() == KSelector::Vertical )
00301 {
00302 for ( int v = 0; v < ySize; v++ )
00303 {
00304 p = (uint *) image.scanLine( ySize - v - 1 );
00305 col.setHsv( _hue, _sat, 255*v/(ySize-1) );
00306 rgb = col.rgb();
00307 for ( int i = 0; i < xSize; i++ )
00308 *p++ = rgb;
00309 }
00310 }
00311
00312 if ( QColor::numBitPlanes() <= 8 )
00313 {
00314 createStandardPalette();
00315 KImageEffect::dither( image, standardPalette, STANDARD_PAL_SIZE );
00316 }
00317 pixmap->convertFromImage( image );
00318 }
00319
00320
00321
00322 KColorCells::KColorCells( QWidget *parent, int rows, int cols )
00323 : QGridView( parent )
00324 {
00325 shade = true;
00326 setNumRows( rows );
00327 setNumCols( cols );
00328 colors = new QColor [ rows * cols ];
00329
00330 for ( int i = 0; i < rows * cols; i++ )
00331 colors[i] = QColor();
00332
00333 selected = 0;
00334 inMouse = false;
00335
00336
00337 setAcceptDrops( true);
00338
00339 setHScrollBarMode( AlwaysOff );
00340 setVScrollBarMode( AlwaysOff );
00341 viewport()->setBackgroundMode( PaletteBackground );
00342 setBackgroundMode( PaletteBackground );
00343 }
00344
00345 KColorCells::~KColorCells()
00346 {
00347 delete [] colors;
00348 }
00349
00350 void KColorCells::setColor( int colNum, const QColor &col )
00351 {
00352 colors[colNum] = col;
00353 updateCell( colNum/numCols(), colNum%numCols() );
00354 }
00355
00356 void KColorCells::paintCell( QPainter *painter, int row, int col )
00357 {
00358 QBrush brush;
00359 int w = 1;
00360
00361 if (shade)
00362 {
00363 qDrawShadePanel( painter, 1, 1, cellWidth()-2,
00364 cellHeight()-2, colorGroup(), true, 1, &brush );
00365 w = 2;
00366 }
00367 QColor color = colors[ row * numCols() + col ];
00368 if (!color.isValid())
00369 {
00370 if (!shade) return;
00371 color = backgroundColor();
00372 }
00373
00374 painter->setPen( color );
00375 painter->setBrush( QBrush( color ) );
00376 painter->drawRect( w, w, cellWidth()-w*2, cellHeight()-w*2 );
00377
00378 if ( row * numCols() + col == selected )
00379 painter->drawWinFocusRect( w, w, cellWidth()-w*2, cellHeight()-w*2 );
00380 }
00381
00382 void KColorCells::resizeEvent( QResizeEvent * )
00383 {
00384 setCellWidth( width() / numCols() );
00385 setCellHeight( height() / numRows() );
00386 }
00387
00388 void KColorCells::mousePressEvent( QMouseEvent *e )
00389 {
00390 inMouse = true;
00391 mPos = e->pos();
00392 }
00393
00394 int KColorCells::posToCell(const QPoint &pos, bool ignoreBorders)
00395 {
00396 int row = pos.y() / cellHeight();
00397 int col = pos.x() / cellWidth();
00398 int cell = row * numCols() + col;
00399
00400 if (!ignoreBorders)
00401 {
00402 int border = 2;
00403 int x = pos.x() - col * cellWidth();
00404 int y = pos.y() - row * cellHeight();
00405 if ( (x < border) || (x > cellWidth()-border) ||
00406 (y < border) || (y > cellHeight()-border))
00407 return -1;
00408 }
00409 return cell;
00410 }
00411
00412 void KColorCells::mouseMoveEvent( QMouseEvent *e )
00413 {
00414 if( !(e->state() && LeftButton)) return;
00415
00416 if(inMouse) {
00417 int delay = KGlobalSettings::dndEventDelay();
00418 if(e->x() > mPos.x()+delay || e->x() < mPos.x()-delay ||
00419 e->y() > mPos.y()+delay || e->y() < mPos.y()-delay){
00420
00421 int cell = posToCell(mPos);
00422 if ((cell != -1) && colors[cell].isValid())
00423 {
00424 KColorDrag *d = new KColorDrag( colors[cell], this);
00425 d->dragCopy();
00426 }
00427 }
00428 }
00429 }
00430
00431 void KColorCells::dragEnterEvent( QDragEnterEvent *event)
00432 {
00433 event->accept( acceptDrags && KColorDrag::canDecode( event));
00434 }
00435
00436 void KColorCells::dropEvent( QDropEvent *event)
00437 {
00438 QColor c;
00439 if( KColorDrag::decode( event, c)) {
00440 int cell = posToCell(event->pos(), true);
00441 setColor(cell,c);
00442 }
00443 }
00444
00445 void KColorCells::mouseReleaseEvent( QMouseEvent *e )
00446 {
00447 int cell = posToCell(mPos);
00448 int currentCell = posToCell(e->pos());
00449
00450
00451
00452 if (currentCell != cell)
00453 cell = -1;
00454
00455 if ( (cell != -1) && (selected != cell) )
00456 {
00457 int prevSel = selected;
00458 selected = cell;
00459 updateCell( prevSel/numCols(), prevSel%numCols() );
00460 updateCell( cell/numCols(), cell%numCols() );
00461 }
00462
00463 inMouse = false;
00464 if (cell != -1)
00465 emit colorSelected( cell );
00466 }
00467
00468 void KColorCells::mouseDoubleClickEvent( QMouseEvent * )
00469 {
00470 int cell = posToCell(mPos);
00471
00472 if (cell != -1)
00473 emit colorDoubleClicked( cell );
00474 }
00475
00476
00477
00478
00479 KColorPatch::KColorPatch( QWidget *parent ) : QFrame( parent )
00480 {
00481 setFrameStyle( QFrame::Panel | QFrame::Sunken );
00482 colContext = 0;
00483 setAcceptDrops( true);
00484 }
00485
00486 KColorPatch::~KColorPatch()
00487 {
00488 if ( colContext )
00489 QColor::destroyAllocContext( colContext );
00490 }
00491
00492 void KColorPatch::setColor( const QColor &col )
00493 {
00494 if ( colContext )
00495 QColor::destroyAllocContext( colContext );
00496 colContext = QColor::enterAllocContext();
00497 color.setRgb( col.rgb() );
00498 color.alloc();
00499 QColor::leaveAllocContext();
00500
00501 QPainter painter;
00502
00503 painter.begin( this );
00504 drawContents( &painter );
00505 painter.end();
00506 }
00507
00508 void KColorPatch::drawContents( QPainter *painter )
00509 {
00510 painter->setPen( color );
00511 painter->setBrush( QBrush( color ) );
00512 painter->drawRect( contentsRect() );
00513 }
00514
00515 void KColorPatch::mouseMoveEvent( QMouseEvent *e )
00516 {
00517
00518 if( !(e->state() && LeftButton)) return;
00519 KColorDrag *d = new KColorDrag( color, this);
00520 d->dragCopy();
00521 }
00522
00523 void KColorPatch::dragEnterEvent( QDragEnterEvent *event)
00524 {
00525 event->accept( KColorDrag::canDecode( event));
00526 }
00527
00528 void KColorPatch::dropEvent( QDropEvent *event)
00529 {
00530 QColor c;
00531 if( KColorDrag::decode( event, c)) {
00532 setColor( c);
00533 emit colorChanged( c);
00534 }
00535 }
00536
00537
00538 KPaletteTable::KPaletteTable( QWidget *parent, int minWidth, int cols)
00539 : QWidget( parent ), mMinWidth(minWidth), mCols(cols)
00540 {
00541 cells = 0;
00542 mPalette = 0;
00543 i18n_customColors = i18n("* Custom Colors *");
00544 i18n_recentColors = i18n("* Recent Colors *");
00545 i18n_namedColors = i18n("Named Colors");
00546
00547 QStringList paletteList = KPalette::getPaletteList();
00548 paletteList.remove(customColors);
00549 paletteList.remove(recentColors);
00550 paletteList.prepend(i18n_customColors);
00551 paletteList.prepend(i18n_recentColors);
00552 paletteList.append( i18n_namedColors );
00553
00554 QVBoxLayout *layout = new QVBoxLayout( this );
00555
00556 combo = new QComboBox( false, this );
00557 combo->insertStringList( paletteList );
00558 layout->addWidget(combo);
00559
00560 sv = new QScrollView( this );
00561 QSize cellSize = QSize( mMinWidth, 120);
00562 sv->setHScrollBarMode( QScrollView::AlwaysOff);
00563 sv->setVScrollBarMode( QScrollView::AlwaysOn);
00564 QSize minSize = QSize(sv->verticalScrollBar()->width(), 0);
00565 minSize += QSize(sv->frameWidth(), 0);
00566 minSize += QSize(cellSize);
00567 sv->setFixedSize(minSize);
00568 layout->addWidget(sv);
00569
00570 mNamedColorList = new KListBox( this, "namedColorList", 0 );
00571 mNamedColorList->setFixedSize(minSize);
00572 mNamedColorList->hide();
00573 layout->addWidget(mNamedColorList);
00574 connect( mNamedColorList, SIGNAL(highlighted( const QString & )),
00575 this, SLOT( slotColorTextSelected( const QString & )) );
00576
00577 setFixedSize( sizeHint());
00578 connect( combo, SIGNAL(activated(const QString &)),
00579 this, SLOT(slotSetPalette( const QString &)));
00580 }
00581
00582 KPaletteTable::~KPaletteTable()
00583 {
00584 delete mPalette;
00585 }
00586
00587 QString
00588 KPaletteTable::palette() const
00589 {
00590 return combo->currentText();
00591 }
00592
00593
00594 static const char * const *namedColorFilePath( void )
00595 {
00596
00597
00598
00599
00600 static const char * const path[] =
00601 {
00602 #ifdef X11_RGBFILE
00603 X11_RGBFILE,
00604 #endif
00605 "/usr/X11R6/lib/X11/rgb.txt",
00606 "/usr/openwin/lib/X11/rgb.txt",
00607 0
00608 };
00609 return( path );
00610 }
00611
00612
00613
00614
00615 void
00616 KPaletteTable::readNamedColor( void )
00617 {
00618 if( mNamedColorList->count() != 0 )
00619 {
00620 return;
00621 }
00622
00623
00624
00625
00626
00627 const char * const *path = namedColorFilePath();
00628 for( int i=0; path[i] != 0; i++ )
00629 {
00630 QFile paletteFile( path[i] );
00631 if( paletteFile.open( IO_ReadOnly ) == false )
00632 {
00633 continue;
00634 }
00635
00636 QString line;
00637 QStringList list;
00638 while( paletteFile.readLine( line, 100 ) != -1 )
00639 {
00640 int red, green, blue;
00641 int pos = 0;
00642
00643 if( sscanf(line.ascii(), "%d %d %d%n", &red, &green, &blue, &pos ) == 3 )
00644 {
00645
00646
00647
00648
00649 QString name = line.mid(pos).stripWhiteSpace();
00650 if( name.isNull() == true || name.find(' ') != -1 ||
00651 name.find( "gray" ) != -1 || name.find( "grey" ) != -1 )
00652 {
00653 continue;
00654 }
00655 list.append( i18n("color", name.latin1() ) );
00656 }
00657 }
00658
00659 list.sort();
00660 mNamedColorList->insertStringList( list );
00661 break;
00662 }
00663
00664 if( mNamedColorList->count() == 0 )
00665 {
00666
00667
00668
00669
00670
00671
00672
00673 QTimer::singleShot( 10, this, SLOT(slotShowNamedColorReadError()) );
00674 }
00675 }
00676
00677
00678 void
00679 KPaletteTable::slotShowNamedColorReadError( void )
00680 {
00681 if( mNamedColorList->count() == 0 )
00682 {
00683 QString msg = i18n(""
00684 "Unable to read X11 RGB color strings. The following "
00685 "file location(s) were examined:\n");
00686
00687 const char * const *path = namedColorFilePath();
00688 for( int i=0; path[i] != 0; i++ )
00689 {
00690 msg += path[i];
00691 msg += "\n";
00692 }
00693 KMessageBox::sorry( this, msg );
00694 }
00695 }
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708 void
00709 KPaletteTable::slotSetPalette( const QString &_paletteName )
00710 {
00711 setPalette( _paletteName );
00712 if( mNamedColorList->isVisible() == true )
00713 {
00714 int item = mNamedColorList->currentItem();
00715 mNamedColorList->setCurrentItem( item < 0 ? 0 : item );
00716 slotColorTextSelected( mNamedColorList->currentText() );
00717 }
00718 else
00719 {
00720 slotColorCellSelected(0);
00721 }
00722 }
00723
00724
00725 void
00726 KPaletteTable::setPalette( const QString &_paletteName )
00727 {
00728 QString paletteName( _paletteName);
00729 if (paletteName.isEmpty())
00730 paletteName = i18n_recentColors;
00731
00732 if (combo->currentText() != paletteName)
00733 {
00734 bool found = false;
00735 for(int i = 0; i < combo->count(); i++)
00736 {
00737 if (combo->text(i) == paletteName)
00738 {
00739 combo->setCurrentItem(i);
00740 found = true;
00741 break;
00742 }
00743 }
00744 if (!found)
00745 {
00746 combo->insertItem(paletteName);
00747 combo->setCurrentItem(combo->count()-1);
00748 }
00749 }
00750
00751 if (paletteName == i18n_customColors)
00752 paletteName = customColors;
00753 else if (paletteName == i18n_recentColors)
00754 paletteName = recentColors;
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765 if( mPalette == 0 || mPalette->name() != paletteName )
00766 {
00767 if( paletteName == i18n_namedColors )
00768 {
00769 sv->hide();
00770 mNamedColorList->show();
00771 readNamedColor();
00772
00773 delete cells; cells = 0;
00774 delete mPalette; mPalette = 0;
00775 }
00776 else
00777 {
00778 mNamedColorList->hide();
00779 sv->show();
00780
00781 delete cells;
00782 delete mPalette;
00783 mPalette = new KPalette(paletteName);
00784 int rows = (mPalette->nrColors()+mCols-1) / mCols;
00785 if (rows < 1) rows = 1;
00786 cells = new KColorCells( sv->viewport(), rows, mCols);
00787 cells->setShading(false);
00788 cells->setAcceptDrags(false);
00789 QSize cellSize = QSize( mMinWidth, mMinWidth * rows / mCols);
00790 cells->setFixedSize( cellSize );
00791 for( int i = 0; i < mPalette->nrColors(); i++)
00792 {
00793 cells->setColor( i, mPalette->color(i) );
00794 }
00795 connect( cells, SIGNAL( colorSelected( int ) ),
00796 SLOT( slotColorCellSelected( int ) ) );
00797 connect( cells, SIGNAL( colorDoubleClicked( int ) ),
00798 SLOT( slotColorCellDoubleClicked( int ) ) );
00799 sv->addChild( cells );
00800 cells->show();
00801 sv->updateScrollBars();
00802 }
00803 }
00804 }
00805
00806
00807
00808 void
00809 KPaletteTable::slotColorCellSelected( int col )
00810 {
00811 if (!mPalette || (col >= mPalette->nrColors()))
00812 return;
00813 emit colorSelected( mPalette->color(col), mPalette->colorName(col) );
00814 }
00815
00816 void
00817 KPaletteTable::slotColorCellDoubleClicked( int col )
00818 {
00819 if (!mPalette || (col >= mPalette->nrColors()))
00820 return;
00821 emit colorDoubleClicked( mPalette->color(col), mPalette->colorName(col) );
00822 }
00823
00824
00825 void
00826 KPaletteTable::slotColorTextSelected( const QString &colorText )
00827 {
00828 emit colorSelected( QColor (colorText), colorText );
00829 }
00830
00831
00832 void
00833 KPaletteTable::addToCustomColors( const QColor &color)
00834 {
00835 setPalette(i18n_customColors);
00836 mPalette->addColor( color );
00837 mPalette->save();
00838 delete mPalette;
00839 mPalette = 0;
00840 setPalette(i18n_customColors);
00841 }
00842
00843 void
00844 KPaletteTable::addToRecentColors( const QColor &color)
00845 {
00846
00847
00848
00849
00850 bool recentIsSelected = false;
00851 if ( mPalette != 0 && mPalette->name() == recentColors)
00852 {
00853 delete mPalette;
00854 mPalette = 0;
00855 recentIsSelected = true;
00856 }
00857 KPalette *recentPal = new KPalette(recentColors);
00858 if (recentPal->findColor(color) == -1)
00859 {
00860 recentPal->addColor( color );
00861 recentPal->save();
00862 }
00863 delete recentPal;
00864 if (recentIsSelected)
00865 setPalette(i18n_recentColors);
00866 }
00867
00868 class KColorDialog::KColorDialogPrivate {
00869 public:
00870 KPaletteTable *table;
00871 QString originalPalette;
00872 bool bRecursion;
00873 bool bEditRgb;
00874 bool bEditHsv;
00875 bool bEditHtml;
00876 bool bColorPicking;
00877 QLabel *colorName;
00878 QLineEdit *htmlName;
00879 KColorSpinBox *hedit;
00880 KColorSpinBox *sedit;
00881 KColorSpinBox *vedit;
00882 KColorSpinBox *redit;
00883 KColorSpinBox *gedit;
00884 KColorSpinBox *bedit;
00885 KColorPatch *patch;
00886 KHSSelector *hsSelector;
00887 KPalette *palette;
00888 KValueSelector *valuePal;
00889 QVBoxLayout* l_right;
00890 QGridLayout* tl_layout;
00891 QCheckBox *cbDefaultColor;
00892 KColor defaultColor;
00893 KColor selColor;
00894 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
00895 QX11EventFilter oldfilter;
00896 #endif
00897 };
00898
00899
00900 KColorDialog::KColorDialog( QWidget *parent, const char *name, bool modal )
00901 :KDialogBase( parent, name, modal, i18n("Select Color"),
00902 modal ? Help|Ok|Cancel : Help|Close,
00903 Ok, true )
00904 {
00905 d = new KColorDialogPrivate;
00906 d->bRecursion = true;
00907 d->bColorPicking = false;
00908 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
00909 d->oldfilter = 0;
00910 #endif
00911 d->cbDefaultColor = 0L;
00912 setHelp( QString::fromLatin1("kcolordialog.html"), QString::null );
00913 connect( this, SIGNAL(okClicked(void)),this,SLOT(slotWriteSettings(void)));
00914 connect( this, SIGNAL(closeClicked(void)),this,SLOT(slotWriteSettings(void)));
00915
00916 QLabel *label;
00917
00918
00919
00920
00921 QWidget *page = new QWidget( this );
00922 setMainWidget( page );
00923
00924 QGridLayout *tl_layout = new QGridLayout( page, 3, 3, 0, spacingHint() );
00925 d->tl_layout = tl_layout;
00926 tl_layout->addColSpacing( 1, spacingHint() * 2 );
00927
00928
00929
00930
00931
00932 QVBoxLayout *l_left = new QVBoxLayout();
00933 tl_layout->addLayout(l_left, 0, 0);
00934
00935
00936
00937
00938
00939 QHBoxLayout *l_ltop = new QHBoxLayout();
00940 l_left->addLayout(l_ltop);
00941
00942
00943 l_left->addSpacing(10);
00944
00945 QGridLayout *l_lbot = new QGridLayout(3, 6);
00946 l_left->addLayout(l_lbot);
00947
00948
00949
00950
00951 d->hsSelector = new KHSSelector( page );
00952 d->hsSelector->setMinimumSize(140, 70);
00953 l_ltop->addWidget(d->hsSelector, 8);
00954 connect( d->hsSelector, SIGNAL( valueChanged( int, int ) ),
00955 SLOT( slotHSChanged( int, int ) ) );
00956
00957 d->valuePal = new KValueSelector( page );
00958 d->valuePal->setMinimumSize(26, 70);
00959 l_ltop->addWidget(d->valuePal, 1);
00960 connect( d->valuePal, SIGNAL( valueChanged( int ) ),
00961 SLOT( slotVChanged( int ) ) );
00962
00963
00964
00965
00966
00967 label = new QLabel( i18n("H:"), page );
00968 label->setAlignment(AlignRight | AlignVCenter);
00969 l_lbot->addWidget(label, 0, 2);
00970 d->hedit = new KColorSpinBox( 0, 359, 1, page );
00971 d->hedit->setValidator( new QIntValidator( d->hedit ) );
00972 l_lbot->addWidget(d->hedit, 0, 3);
00973 connect( d->hedit, SIGNAL( valueChanged(int) ),
00974 SLOT( slotHSVChanged() ) );
00975
00976 label = new QLabel( i18n("S:"), page );
00977 label->setAlignment(AlignRight | AlignVCenter);
00978 l_lbot->addWidget(label, 1, 2);
00979 d->sedit = new KColorSpinBox( 0, 255, 1, page );
00980 d->sedit->setValidator( new QIntValidator( d->sedit ) );
00981 l_lbot->addWidget(d->sedit, 1, 3);
00982 connect( d->sedit, SIGNAL( valueChanged(int) ),
00983 SLOT( slotHSVChanged() ) );
00984
00985 label = new QLabel( i18n("V:"), page );
00986 label->setAlignment(AlignRight | AlignVCenter);
00987 l_lbot->addWidget(label, 2, 2);
00988 d->vedit = new KColorSpinBox( 0, 255, 1, page );
00989 d->vedit->setValidator( new QIntValidator( d->vedit ) );
00990 l_lbot->addWidget(d->vedit, 2, 3);
00991 connect( d->vedit, SIGNAL( valueChanged(int) ),
00992 SLOT( slotHSVChanged() ) );
00993
00994
00995
00996
00997 label = new QLabel( i18n("R:"), page );
00998 label->setAlignment(AlignRight | AlignVCenter);
00999 l_lbot->addWidget(label, 0, 4);
01000 d->redit = new KColorSpinBox( 0, 255, 1, page );
01001 d->redit->setValidator( new QIntValidator( d->redit ) );
01002 l_lbot->addWidget(d->redit, 0, 5);
01003 connect( d->redit, SIGNAL( valueChanged(int) ),
01004 SLOT( slotRGBChanged() ) );
01005
01006 label = new QLabel( i18n("G:"), page );
01007 label->setAlignment(AlignRight | AlignVCenter);
01008 l_lbot->addWidget( label, 1, 4);
01009 d->gedit = new KColorSpinBox( 0, 255,1, page );
01010 d->gedit->setValidator( new QIntValidator( d->gedit ) );
01011 l_lbot->addWidget(d->gedit, 1, 5);
01012 connect( d->gedit, SIGNAL( valueChanged(int) ),
01013 SLOT( slotRGBChanged() ) );
01014
01015 label = new QLabel( i18n("B:"), page );
01016 label->setAlignment(AlignRight | AlignVCenter);
01017 l_lbot->addWidget(label, 2, 4);
01018 d->bedit = new KColorSpinBox( 0, 255, 1, page );
01019 d->bedit->setValidator( new QIntValidator( d->bedit ) );
01020 l_lbot->addWidget(d->bedit, 2, 5);
01021 connect( d->bedit, SIGNAL( valueChanged(int) ),
01022 SLOT( slotRGBChanged() ) );
01023
01024
01025
01026
01027 int w = d->hedit->fontMetrics().width("8888888");
01028 d->hedit->setFixedWidth(w);
01029 d->sedit->setFixedWidth(w);
01030 d->vedit->setFixedWidth(w);
01031
01032 d->redit->setFixedWidth(w);
01033 d->gedit->setFixedWidth(w);
01034 d->bedit->setFixedWidth(w);
01035
01036
01037
01038
01039 d->l_right = new QVBoxLayout;
01040 tl_layout->addLayout(d->l_right, 0, 2);
01041
01042
01043
01044
01045 d->table = new KPaletteTable( page );
01046 d->l_right->addWidget(d->table, 10);
01047
01048 connect( d->table, SIGNAL( colorSelected( const QColor &, const QString & ) ),
01049 SLOT( slotColorSelected( const QColor &, const QString & ) ) );
01050
01051 connect(
01052 d->table,
01053 SIGNAL( colorDoubleClicked( const QColor &, const QString & ) ),
01054 SLOT( slotColorDoubleClicked( const QColor &, const QString & ) )
01055 );
01056
01057 d->originalPalette = d->table->palette();
01058
01059
01060
01061
01062 d->l_right->addSpacing(10);
01063
01064 QHBoxLayout *l_hbox = new QHBoxLayout( d->l_right );
01065
01066
01067
01068
01069 QPushButton *button = new QPushButton( page );
01070 button->setText(i18n("&Add to Custom Colors"));
01071 l_hbox->addWidget(button, 0, AlignLeft);
01072 connect( button, SIGNAL( clicked()), SLOT( slotAddToCustomColors()));
01073
01074
01075
01076
01077 button = new QPushButton( page );
01078 button->setPixmap( BarIcon("colorpicker"));
01079 l_hbox->addWidget(button, 0, AlignHCenter );
01080 connect( button, SIGNAL( clicked()), SLOT( slotColorPicker()));
01081
01082
01083
01084
01085 d->l_right->addSpacing(10);
01086
01087
01088
01089
01090 QGridLayout *l_grid = new QGridLayout( d->l_right, 2, 3);
01091
01092 l_grid->setColStretch(2, 1);
01093
01094 label = new QLabel( page );
01095 label->setText(i18n("Name:"));
01096 l_grid->addWidget(label, 0, 1, AlignLeft);
01097
01098 d->colorName = new QLabel( page );
01099 l_grid->addWidget(d->colorName, 0, 2, AlignLeft);
01100
01101 label = new QLabel( page );
01102 label->setText(i18n("HTML:"));
01103 l_grid->addWidget(label, 1, 1, AlignLeft);
01104
01105 d->htmlName = new QLineEdit( page );
01106 d->htmlName->setMaxLength( 7 );
01107 d->htmlName->setText("#FFFFFF");
01108 w = d->htmlName->fontMetrics().width(QString::fromLatin1("#DDDDDDD"));
01109 d->htmlName->setFixedWidth(w);
01110 l_grid->addWidget(d->htmlName, 1, 2, AlignLeft);
01111
01112 connect( d->htmlName, SIGNAL( textChanged(const QString &) ),
01113 SLOT( slotHtmlChanged() ) );
01114
01115 d->patch = new KColorPatch( page );
01116 d->patch->setFixedSize(48, 48);
01117 l_grid->addMultiCellWidget(d->patch, 0, 1, 0, 0, AlignHCenter | AlignVCenter);
01118 connect( d->patch, SIGNAL( colorChanged( const QColor&)),
01119 SLOT( setColor( const QColor&)));
01120
01121 tl_layout->activate();
01122 page->setMinimumSize( page->sizeHint() );
01123
01124 readSettings();
01125 d->bRecursion = false;
01126 d->bEditHsv = false;
01127 d->bEditRgb = false;
01128 d->bEditHtml = false;
01129
01130 disableResize();
01131 KColor col;
01132 col.setHsv( 0, 0, 255 );
01133 _setColor( col );
01134
01135 d->htmlName->installEventFilter(this);
01136 d->hsSelector->installEventFilter(this);
01137 d->hsSelector->setAcceptDrops(true);
01138 }
01139
01140 KColorDialog::~KColorDialog()
01141 {
01142 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
01143 if (d->bColorPicking)
01144 qt_set_x11_event_filter(d->oldfilter);
01145 #endif
01146 delete d;
01147 }
01148
01149 bool
01150 KColorDialog::eventFilter( QObject *obj, QEvent *ev )
01151 {
01152 if ((obj == d->htmlName) || (obj == d->hsSelector))
01153 switch(ev->type())
01154 {
01155 case QEvent::DragEnter:
01156 case QEvent::DragMove:
01157 case QEvent::DragLeave:
01158 case QEvent::Drop:
01159 case QEvent::DragResponse:
01160 qApp->sendEvent(d->patch, ev);
01161 return true;
01162 default:
01163 break;
01164 }
01165 return KDialogBase::eventFilter(obj, ev);
01166 }
01167
01168 void
01169 KColorDialog::setDefaultColor( const QColor& col )
01170 {
01171 if ( !d->cbDefaultColor )
01172 {
01173
01174
01175
01176 d->l_right->addSpacing(10);
01177
01178
01179
01180
01181 d->cbDefaultColor = new QCheckBox( i18n( "Default color" ), mainWidget() );
01182 d->cbDefaultColor->setChecked(true);
01183
01184 d->l_right->addWidget( d->cbDefaultColor );
01185
01186 mainWidget()->setMaximumSize( QWIDGETSIZE_MAX, QWIDGETSIZE_MAX );
01187 d->tl_layout->activate();
01188 mainWidget()->setMinimumSize( mainWidget()->sizeHint() );
01189 disableResize();
01190
01191 connect( d->cbDefaultColor, SIGNAL( clicked() ), SLOT( slotDefaultColorClicked() ) );
01192 }
01193
01194 d->defaultColor = col;
01195
01196 slotDefaultColorClicked();
01197 }
01198
01199 QColor KColorDialog::defaultColor() const
01200 {
01201 return d->defaultColor;
01202 }
01203
01204 void KColorDialog::slotDefaultColorClicked()
01205 {
01206 if ( d->cbDefaultColor->isChecked() )
01207 {
01208 d->selColor = d->defaultColor;
01209 showColor( d->selColor, i18n( "-default-" ) );
01210 } else
01211 {
01212 showColor( d->selColor, QString::null );
01213 }
01214 }
01215
01216 void
01217 KColorDialog::readSettings()
01218 {
01219 KConfig* config = KGlobal::config();
01220
01221 QString oldgroup = config->group();
01222
01223 config->setGroup("Colors");
01224 QString palette = config->readEntry("CurrentPalette");
01225 d->table->setPalette(palette);
01226 config->setGroup( oldgroup );
01227 }
01228
01229 void
01230 KColorDialog::slotWriteSettings()
01231 {
01232 KConfig* config = KGlobal::config();
01233 config->setGroup("Colors");
01234 QString palette = d->table->palette();
01235 if (!config->hasDefault("CurrentPalette") &&
01236 (d->table->palette() == d->originalPalette))
01237 {
01238 config->revertToDefault("CurrentPalette");
01239 }
01240 else
01241 {
01242 config->writeEntry("CurrentPalette", d->table->palette());
01243 }
01244 }
01245
01246 QColor
01247 KColorDialog::color() const
01248 {
01249 if ( d->cbDefaultColor && d->cbDefaultColor->isChecked() )
01250 return QColor();
01251 if ( d->selColor.isValid() )
01252 d->table->addToRecentColors( d->selColor );
01253 return d->selColor;
01254 }
01255
01256 void KColorDialog::setColor( const QColor &col )
01257 {
01258 _setColor( col );
01259 }
01260
01261
01262
01263
01264 int KColorDialog::getColor( QColor &theColor, QWidget *parent )
01265 {
01266 KColorDialog dlg( parent, "Color Selector", true );
01267 if ( theColor.isValid() )
01268 dlg.setColor( theColor );
01269 int result = dlg.exec();
01270
01271 if ( result == Accepted )
01272 {
01273 theColor = dlg.color();
01274 }
01275
01276 return result;
01277 }
01278
01279
01280
01281
01282 int KColorDialog::getColor( QColor &theColor, const QColor& defaultCol, QWidget *parent )
01283 {
01284 KColorDialog dlg( parent, "Color Selector", true );
01285 dlg.setDefaultColor( defaultCol );
01286 dlg.setColor( theColor );
01287 int result = dlg.exec();
01288
01289 if ( result == Accepted )
01290 theColor = dlg.color();
01291
01292 return result;
01293 }
01294
01295 void KColorDialog::slotRGBChanged( void )
01296 {
01297 if (d->bRecursion) return;
01298 int red = d->redit->value();
01299 int grn = d->gedit->value();
01300 int blu = d->bedit->value();
01301
01302 if ( red > 255 || red < 0 ) return;
01303 if ( grn > 255 || grn < 0 ) return;
01304 if ( blu > 255 || blu < 0 ) return;
01305
01306 KColor col;
01307 col.setRgb( red, grn, blu );
01308 d->bEditRgb = true;
01309 _setColor( col );
01310 d->bEditRgb = false;
01311 }
01312
01313 void KColorDialog::slotHtmlChanged( void )
01314 {
01315 if (d->bRecursion || d->htmlName->text().isEmpty()) return;
01316
01317 unsigned int red = 256;
01318 unsigned int grn = 256;
01319 unsigned int blu = 256;
01320
01321 if (sscanf(d->htmlName->text().latin1(), "#%02x%02x%02x", &red, &grn, &blu)!=3)
01322 return;
01323
01324 if ( red > 255 || grn > 255 || blu > 255) return;
01325
01326 KColor col;
01327 col.setRgb( red, grn, blu );
01328 d->bEditHtml = true;
01329 _setColor( col );
01330 d->bEditHtml = false;
01331 }
01332
01333 void KColorDialog::slotHSVChanged( void )
01334 {
01335 if (d->bRecursion) return;
01336 int hue = d->hedit->value();
01337 int sat = d->sedit->value();
01338 int val = d->vedit->value();
01339
01340 if ( hue > 359 || hue < 0 ) return;
01341 if ( sat > 255 || sat < 0 ) return;
01342 if ( val > 255 || val < 0 ) return;
01343
01344 KColor col;
01345 col.setHsv( hue, sat, val );
01346 d->bEditHsv = true;
01347 _setColor( col );
01348 d->bEditHsv = false;
01349 }
01350
01351 void KColorDialog::slotHSChanged( int h, int s )
01352 {
01353 int _h, _s, v;
01354 d->selColor.hsv(&_h, &_s, &v);
01355 if (v < 1)
01356 v = 1;
01357 KColor col;
01358 col.setHsv( h, s, v );
01359 _setColor( col );
01360 }
01361
01362 void KColorDialog::slotVChanged( int v )
01363 {
01364 int h, s, _v;
01365 d->selColor.hsv(&h, &s, &_v);
01366 KColor col;
01367 col.setHsv( h, s, v );
01368 _setColor( col );
01369 }
01370
01371 void KColorDialog::slotColorSelected( const QColor &color )
01372 {
01373 _setColor( color );
01374 }
01375
01376 void KColorDialog::slotAddToCustomColors( )
01377 {
01378 d->table->addToCustomColors( d->selColor );
01379 }
01380
01381 void KColorDialog::slotColorSelected( const QColor &color, const QString &name )
01382 {
01383 _setColor( color, name);
01384 }
01385
01386 void KColorDialog::slotColorDoubleClicked
01387 (
01388 const QColor & color,
01389 const QString & name
01390 )
01391 {
01392 _setColor(color, name);
01393 accept();
01394 }
01395
01396 void KColorDialog::_setColor(const KColor &color, const QString &name)
01397 {
01398 if (color.isValid())
01399 {
01400 if (d->cbDefaultColor && d->cbDefaultColor->isChecked())
01401 d->cbDefaultColor->setChecked(false);
01402 d->selColor = color;
01403 }
01404 else
01405 {
01406 if (d->cbDefaultColor && d->cbDefaultColor->isChecked())
01407 d->cbDefaultColor->setChecked(true);
01408 d->selColor = d->defaultColor;
01409 }
01410
01411 showColor( d->selColor, name );
01412
01413 emit colorSelected( d->selColor );
01414 }
01415
01416
01417 void KColorDialog::showColor( const KColor &color, const QString &name )
01418 {
01419 d->bRecursion = true;
01420
01421 if (name.isEmpty())
01422 d->colorName->setText( i18n("-unnamed-"));
01423 else
01424 d->colorName->setText( name );
01425
01426 d->patch->setColor( color );
01427
01428 setRgbEdit( color );
01429 setHsvEdit( color );
01430 setHtmlEdit( color );
01431
01432 int h, s, v;
01433 color.hsv( &h, &s, &v );
01434 d->hsSelector->setValues( h, s );
01435 d->valuePal->blockSignals(true);
01436 d->valuePal->setHue( h );
01437 d->valuePal->setSaturation( s );
01438 d->valuePal->setValue( v );
01439 d->valuePal->updateContents();
01440 d->valuePal->blockSignals(false);
01441 d->valuePal->repaint( false );
01442 d->bRecursion = false;
01443 }
01444
01445
01446 static QWidget *kde_color_dlg_widget = 0;
01447
01448 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
01449 static int kde_color_dlg_handler(XEvent *event)
01450 {
01451 if (event->type == ButtonRelease)
01452 {
01453 QMouseEvent e( QEvent::MouseButtonRelease, QPoint(),
01454 QPoint(event->xmotion.x_root, event->xmotion.y_root) , 0, 0 );
01455 QApplication::sendEvent( kde_color_dlg_widget, &e );
01456 return true;
01457 }
01458 return false;
01459 }
01460 #endif
01461 void
01462 KColorDialog::slotColorPicker()
01463 {
01464 d->bColorPicking = true;
01465 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
01466 d->oldfilter = qt_set_x11_event_filter(kde_color_dlg_handler);
01467 #endif
01468 kde_color_dlg_widget = this;
01469 grabMouse( crossCursor );
01470 grabKeyboard();
01471 }
01472
01473 void
01474 KColorDialog::mouseReleaseEvent( QMouseEvent *e )
01475 {
01476 if (d->bColorPicking)
01477 {
01478 d->bColorPicking = false;
01479 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
01480 qt_set_x11_event_filter(d->oldfilter);
01481 d->oldfilter = 0;
01482 #endif
01483 releaseMouse();
01484 releaseKeyboard();
01485 _setColor( grabColor( e->globalPos() ) );
01486 return;
01487 }
01488 KDialogBase::mouseReleaseEvent( e );
01489 }
01490
01491 QColor
01492 KColorDialog::grabColor(const QPoint &p)
01493 {
01494 QWidget *desktop = QApplication::desktop();
01495 QPixmap pm = QPixmap::grabWindow( desktop->winId(), p.x(), p.y(), 1, 1);
01496 QImage i = pm.convertToImage();
01497 return i.pixel(0,0);
01498 }
01499
01500 void
01501 KColorDialog::keyPressEvent( QKeyEvent *e )
01502 {
01503 if (d->bColorPicking)
01504 {
01505 if (e->key() == Key_Escape)
01506 {
01507 d->bColorPicking = false;
01508 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
01509 qt_set_x11_event_filter(d->oldfilter);
01510 d->oldfilter = 0;
01511 #endif
01512 releaseMouse();
01513 releaseKeyboard();
01514 }
01515 e->accept();
01516 return;
01517 }
01518 KDialogBase::keyPressEvent( e );
01519 }
01520
01521 void KColorDialog::setRgbEdit( const KColor &col )
01522 {
01523 if (d->bEditRgb) return;
01524 int r, g, b;
01525 col.rgb( &r, &g, &b );
01526
01527 d->redit->setValue( r );
01528 d->gedit->setValue( g );
01529 d->bedit->setValue( b );
01530 }
01531
01532 void KColorDialog::setHtmlEdit( const KColor &col )
01533 {
01534 if (d->bEditHtml) return;
01535 int r, g, b;
01536 col.rgb( &r, &g, &b );
01537 QString num;
01538
01539 num.sprintf("#%02X%02X%02X", r,g,b);
01540 d->htmlName->setText( num );
01541 }
01542
01543
01544 void KColorDialog::setHsvEdit( const KColor &col )
01545 {
01546 if (d->bEditHsv) return;
01547 int h, s, v;
01548 col.hsv( &h, &s, &v );
01549
01550 d->hedit->setValue( h );
01551 d->sedit->setValue( s );
01552 d->vedit->setValue( v );
01553 }
01554
01555 void KHSSelector::virtual_hook( int id, void* data )
01556 { KXYSelector::virtual_hook( id, data ); }
01557
01558 void KValueSelector::virtual_hook( int id, void* data )
01559 { KSelector::virtual_hook( id, data ); }
01560
01561 void KPaletteTable::virtual_hook( int, void* )
01562 { }
01563
01564 void KColorCells::virtual_hook( int, void* )
01565 { }
01566
01567 void KColorPatch::virtual_hook( int, void* )
01568 { }
01569
01570 void KColorDialog::virtual_hook( int id, void* data )
01571 { KDialogBase::virtual_hook( id, data ); }
01572
01573
01574 #include "kcolordialog.moc"
01575