00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kcharselect.h"
00022 #include "kcharselect.moc"
00023
00024 #include <qevent.h>
00025 #include <qfont.h>
00026 #include <qpen.h>
00027 #include <qbrush.h>
00028 #include <qpainter.h>
00029 #include <qcolor.h>
00030 #include <qlabel.h>
00031 #include <qhbox.h>
00032 #include <qkeycode.h>
00033 #include <qfontdatabase.h>
00034 #include <qstyle.h>
00035
00036 #include <klocale.h>
00037 #include <kdebug.h>
00038 #include <kdialog.h>
00039 #include <kapplication.h>
00040
00041 QFontDatabase * KCharSelect::fontDataBase = 0;
00042
00043 void KCharSelect::cleanupFontDatabase()
00044 {
00045 delete fontDataBase;
00046 fontDataBase = 0;
00047 }
00048
00049
00050
00051
00052
00053
00054 KCharSelectTable::KCharSelectTable( QWidget *parent, const char *name, const QString &_font,
00055 const QChar &_chr, int _tableNum )
00056 : QGridView( parent, name ), vFont( _font ), vChr( _chr ),
00057 vTableNum( _tableNum ), vPos( 0, 0 ), focusItem( _chr ), focusPos( 0, 0 )
00058 {
00059 setBackgroundColor( colorGroup().base() );
00060
00061 setCellWidth( 20 );
00062 setCellHeight( 25 );
00063
00064 setNumCols( 32 );
00065 setNumRows( 8 );
00066
00067 repaintContents( false );
00068
00069 setFocusPolicy( QWidget::StrongFocus );
00070 setBackgroundMode( QWidget::NoBackground );
00071 }
00072
00073
00074 void KCharSelectTable::setFont( const QString &_font )
00075 {
00076 vFont = _font;
00077 repaintContents( false );
00078 }
00079
00080
00081 void KCharSelectTable::setChar( const QChar &_chr )
00082 {
00083 vChr = _chr;
00084 repaintContents( false );
00085 }
00086
00087
00088 void KCharSelectTable::setTableNum( int _tableNum )
00089 {
00090 focusItem = QChar( _tableNum * 256 );
00091
00092 vTableNum = _tableNum;
00093 repaintContents( false );
00094 }
00095
00096
00097 QSize KCharSelectTable::sizeHint() const
00098 {
00099 int w = cellWidth();
00100 int h = cellHeight();
00101
00102 w *= numCols();
00103 h *= numRows();
00104
00105 return QSize( w, h );
00106 }
00107
00108
00109 void KCharSelectTable::resizeEvent( QResizeEvent * e )
00110 {
00111 int new_w = (e->size().width() - 2*(margin()+frameWidth())) / numCols();
00112 int new_h = (e->size().height() - 2*(margin()+frameWidth())) / numRows();
00113
00114 if( new_w != cellWidth())
00115 setCellWidth( new_w );
00116 if( new_h != cellHeight())
00117 setCellHeight( new_h );
00118 }
00119
00120
00121 void KCharSelectTable::paintCell( class QPainter* p, int row, int col )
00122 {
00123 int w = cellWidth();
00124 int h = cellHeight();
00125 int x2 = w - 1;
00126 int y2 = h - 1;
00127
00128
00129
00130
00131
00132
00133 QFont font = QFont( vFont );
00134 font.setPixelSize( int(.7 * h) );
00135
00136 unsigned short c = vTableNum * 256;
00137 c += row * numCols();
00138 c += col;
00139
00140 if ( c == vChr.unicode() ) {
00141 p->setBrush( QBrush( colorGroup().highlight() ) );
00142 p->setPen( NoPen );
00143 p->drawRect( 0, 0, w, h );
00144 p->setPen( colorGroup().highlightedText() );
00145 vPos = QPoint( col, row );
00146 } else {
00147 QFontMetrics fm = QFontMetrics( font );
00148 if( fm.inFont( c ) )
00149 p->setBrush( QBrush( colorGroup().base() ) );
00150 else
00151 p->setBrush( QBrush( colorGroup().button() ) );
00152 p->setPen( NoPen );
00153 p->drawRect( 0, 0, w, h );
00154 p->setPen( colorGroup().text() );
00155 }
00156
00157 if ( c == focusItem.unicode() && hasFocus() ) {
00158 #if QT_VERSION < 300
00159 style().drawFocusRect( p, QRect( 2, 2, w - 4, h - 4 ), colorGroup() );
00160 #else
00161 style().drawPrimitive( QStyle::PE_FocusRect, p, QRect( 2, 2, w - 4, h - 4 ),
00162 colorGroup() );
00163 #endif
00164 focusPos = QPoint( col, row );
00165 }
00166
00167 p->setFont( font );
00168
00169 p->drawText( 0, 0, x2, y2, AlignHCenter | AlignVCenter, QString( QChar( c ) ) );
00170
00171 p->setPen( colorGroup().text() );
00172 p->drawLine( x2, 0, x2, y2 );
00173 p->drawLine( 0, y2, x2, y2 );
00174
00175 if ( row == 0 )
00176 p->drawLine( 0, 0, x2, 0 );
00177 if ( col == 0 )
00178 p->drawLine( 0, 0, 0, y2 );
00179 }
00180
00181
00182 void KCharSelectTable::mouseMoveEvent( QMouseEvent *e )
00183 {
00184 int row = rowAt( e->y() );
00185 int col = columnAt( e->x() );
00186 if ( row >= 0 && row < numRows() && col >= 0 && col < numCols() ) {
00187 QPoint oldPos = vPos;
00188
00189 vPos.setX( col );
00190 vPos.setY( row );
00191
00192 vChr = QChar( vTableNum * 256 + numCols() * vPos.y() + vPos.x() );
00193
00194 QPoint oldFocus = focusPos;
00195
00196 focusPos = vPos;
00197 focusItem = vChr;
00198
00199 repaintCell( oldFocus.y(), oldFocus.x(), true );
00200 repaintCell( oldPos.y(), oldPos.x(), true );
00201 repaintCell( vPos.y(), vPos.x(), true );
00202
00203 emit highlighted( vChr );
00204 emit highlighted();
00205
00206 emit focusItemChanged( focusItem );
00207 emit focusItemChanged();
00208 }
00209 }
00210
00211
00212 void KCharSelectTable::keyPressEvent( QKeyEvent *e )
00213 {
00214 switch ( e->key() ) {
00215 case Key_Left:
00216 gotoLeft();
00217 break;
00218 case Key_Right:
00219 gotoRight();
00220 break;
00221 case Key_Up:
00222 gotoUp();
00223 break;
00224 case Key_Down:
00225 gotoDown();
00226 break;
00227 case Key_Next:
00228 emit tableDown();
00229 break;
00230 case Key_Prior:
00231 emit tableUp();
00232 break;
00233 case Key_Space:
00234 emit activated( ' ' );
00235 emit activated();
00236 emit highlighted( ' ' );
00237 emit highlighted();
00238 break;
00239 case Key_Enter: case Key_Return: {
00240 QPoint oldPos = vPos;
00241
00242 vPos = focusPos;
00243 vChr = focusItem;
00244
00245 repaintCell( oldPos.y(), oldPos.x(), true );
00246 repaintCell( vPos.y(), vPos.x(), true );
00247
00248 emit activated( vChr );
00249 emit activated();
00250 emit highlighted( vChr );
00251 emit highlighted();
00252 } break;
00253 }
00254 }
00255
00256
00257 void KCharSelectTable::gotoLeft()
00258 {
00259 if ( focusPos.x() > 0 ) {
00260 QPoint oldPos = focusPos;
00261
00262 focusPos.setX( focusPos.x() - 1 );
00263
00264 focusItem = QChar( vTableNum * 256 + numCols() * focusPos.y() + focusPos.x() );
00265
00266 repaintCell( oldPos.y(), oldPos.x(), true );
00267 repaintCell( focusPos.y(), focusPos.x(), true );
00268
00269 emit focusItemChanged( vChr );
00270 emit focusItemChanged();
00271 }
00272 }
00273
00274
00275 void KCharSelectTable::gotoRight()
00276 {
00277 if ( focusPos.x() < numCols()-1 ) {
00278 QPoint oldPos = focusPos;
00279
00280 focusPos.setX( focusPos.x() + 1 );
00281
00282 focusItem = QChar( vTableNum * 256 + numCols() * focusPos.y() + focusPos.x() );
00283
00284 repaintCell( oldPos.y(), oldPos.x(), true );
00285 repaintCell( focusPos.y(), focusPos.x(), true );
00286
00287 emit focusItemChanged( vChr );
00288 emit focusItemChanged();
00289 }
00290 }
00291
00292
00293 void KCharSelectTable::gotoUp()
00294 {
00295 if ( focusPos.y() > 0 ) {
00296 QPoint oldPos = focusPos;
00297
00298 focusPos.setY( focusPos.y() - 1 );
00299
00300 focusItem = QChar( vTableNum * 256 + numCols() * focusPos.y() + focusPos.x() );
00301
00302 repaintCell( oldPos.y(), oldPos.x(), true );
00303 repaintCell( focusPos.y(), focusPos.x(), true );
00304
00305 emit focusItemChanged( vChr );
00306 emit focusItemChanged();
00307 }
00308 }
00309
00310
00311 void KCharSelectTable::gotoDown()
00312 {
00313 if ( focusPos.y() < numRows()-1 ) {
00314 QPoint oldPos = focusPos;
00315
00316 focusPos.setY( focusPos.y() + 1 );
00317
00318 focusItem = QChar( vTableNum * 256 + numCols() * focusPos.y() + focusPos.x() );
00319
00320 repaintCell( oldPos.y(), oldPos.x(), true );
00321 repaintCell( focusPos.y(), focusPos.x(), true );
00322
00323 emit focusItemChanged( vChr );
00324 emit focusItemChanged();
00325 }
00326 }
00327
00328
00329
00330
00331
00332
00333 KCharSelect::KCharSelect( QWidget *parent, const char *name, const QString &_font, const QChar &_chr, int _tableNum )
00334 : QVBox( parent, name )
00335 {
00336 setSpacing( KDialog::spacingHint() );
00337 QHBox *bar = new QHBox( this );
00338 bar->setSpacing( KDialog::spacingHint() );
00339
00340 QLabel *lFont = new QLabel( i18n( " Font: " ), bar );
00341 lFont->resize( lFont->sizeHint() );
00342 lFont->setAlignment( Qt::AlignRight | Qt::AlignVCenter );
00343 lFont->setMaximumWidth( lFont->sizeHint().width() );
00344
00345 fontCombo = new QComboBox( true, bar );
00346 fillFontCombo();
00347 fontCombo->resize( fontCombo->sizeHint() );
00348
00349 connect( fontCombo, SIGNAL( activated( const QString & ) ), this, SLOT( fontSelected( const QString & ) ) );
00350
00351 QLabel *lTable = new QLabel( i18n( " Table: " ), bar );
00352 lTable->resize( lTable->sizeHint() );
00353 lTable->setAlignment( Qt::AlignRight | Qt::AlignVCenter );
00354 lTable->setMaximumWidth( lTable->sizeHint().width() );
00355
00356 tableSpinBox = new QSpinBox( 0, 255, 1, bar );
00357 tableSpinBox->resize( tableSpinBox->sizeHint() );
00358
00359 connect( tableSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( tableChanged( int ) ) );
00360
00361 charTable = new KCharSelectTable( this, name, _font.isEmpty() ? QVBox::font().family() : _font, _chr, _tableNum );
00362 QSize sz( charTable->contentsWidth() + 4 ,
00363 charTable->contentsHeight() + 4 );
00364 charTable->resize( sz );
00365
00366 charTable->setMinimumSize( sz );
00367 charTable->setHScrollBarMode( QScrollView::AlwaysOff );
00368 charTable->setVScrollBarMode( QScrollView::AlwaysOff );
00369
00370 setFont( _font.isEmpty() ? QVBox::font().family() : _font );
00371 setTableNum( _tableNum );
00372
00373 connect( charTable, SIGNAL( highlighted( const QChar & ) ), this, SLOT( charHighlighted( const QChar & ) ) );
00374 connect( charTable, SIGNAL( highlighted() ), this, SLOT( charHighlighted() ) );
00375 connect( charTable, SIGNAL( activated( const QChar & ) ), this, SLOT( charActivated( const QChar & ) ) );
00376 connect( charTable, SIGNAL( activated() ), this, SLOT( charActivated() ) );
00377 connect( charTable, SIGNAL( focusItemChanged( const QChar & ) ),
00378 this, SLOT( charFocusItemChanged( const QChar & ) ) );
00379 connect( charTable, SIGNAL( focusItemChanged() ), this, SLOT( charFocusItemChanged() ) );
00380 connect( charTable, SIGNAL( tableUp() ), this, SLOT( charTableUp() ) );
00381 connect( charTable, SIGNAL( tableDown() ), this, SLOT( charTableDown() ) );
00382
00383 connect( charTable, SIGNAL(doubleClicked()),this,SLOT(slotDoubleClicked()));
00384
00385 setFocusPolicy( QWidget::StrongFocus );
00386 setFocusProxy( charTable );
00387 }
00388
00389
00390 QSize KCharSelect::sizeHint() const
00391 {
00392 return QVBox::sizeHint();
00393 }
00394
00395
00396 void KCharSelect::setFont( const QString &_font )
00397 {
00398 QValueList<QString>::Iterator it = fontList.find( _font );
00399 if ( it != fontList.end() ) {
00400 QValueList<QString>::Iterator it2 = fontList.begin();
00401 int pos = 0;
00402 for ( ; it != it2; ++it2, ++pos);
00403 fontCombo->setCurrentItem( pos );
00404 charTable->setFont( _font );
00405 }
00406 else
00407 kdWarning() << "Can't find Font: " << _font << endl;
00408 }
00409
00410
00411 void KCharSelect::setChar( const QChar &_chr )
00412 {
00413 charTable->setChar( _chr );
00414 }
00415
00416
00417 void KCharSelect::setTableNum( int _tableNum )
00418 {
00419 tableSpinBox->setValue( _tableNum );
00420 charTable->setTableNum( _tableNum );
00421 }
00422
00423
00424 void KCharSelect::fillFontCombo()
00425 {
00426 if ( !fontDataBase ) {
00427 fontDataBase = new QFontDatabase();
00428 qAddPostRoutine( cleanupFontDatabase );
00429 }
00430 fontList=fontDataBase->families();
00431 fontCombo->insertStringList( fontList );
00432 }
00433
00434
00435 void KCharSelect::fontSelected( const QString &_font )
00436 {
00437 charTable->setFont( _font );
00438 emit fontChanged( _font );
00439 }
00440
00441
00442 void KCharSelect::tableChanged( int _value )
00443 {
00444 charTable->setTableNum( _value );
00445 }
00446
00447 void KCharSelectTable::virtual_hook( int, void*)
00448 { }
00449
00450 void KCharSelect::virtual_hook( int, void* )
00451 { }
00452