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 #include <config.h>
00028
00029 #include <stdio.h>
00030 #include <stdlib.h>
00031
00032 #include <qcombobox.h>
00033 #include <qcheckbox.h>
00034 #include <qfile.h>
00035 #include <qfont.h>
00036 #include <qgroupbox.h>
00037 #include <qlabel.h>
00038 #include <qlayout.h>
00039 #include <qscrollbar.h>
00040 #include <qstringlist.h>
00041 #include <qfontdatabase.h>
00042 #include <qwhatsthis.h>
00043 #include <qtooltip.h>
00044
00045 #include <kapplication.h>
00046 #include <kcharsets.h>
00047 #include <kconfig.h>
00048 #include <kdialog.h>
00049 #include <kglobal.h>
00050 #include <kglobalsettings.h>
00051 #include <qlineedit.h>
00052 #include <klistbox.h>
00053 #include <klocale.h>
00054 #include <kstandarddirs.h>
00055 #include <kdebug.h>
00056 #include <knuminput.h>
00057 #if defined Q_WS_X11 && ! defined K_WS_QTONLY
00058 #include <X11/Xlib.h>
00059
00060 #endif
00061
00062 #include "kfontdialog.moc"
00063
00064 static int minimumListWidth( const QListBox *list )
00065 {
00066 int w=0;
00067 for( uint i=0; i<list->count(); i++ )
00068 {
00069 int itemWidth = list->item(i)->width(list);
00070 w = QMAX(w,itemWidth);
00071 }
00072 if( w == 0 ) { w = 40; }
00073 w += list->frameWidth() * 2;
00074 w += list->verticalScrollBar()->sizeHint().width();
00075 return( w );
00076 }
00077
00078 static int minimumListHeight( const QListBox *list, int numVisibleEntry )
00079 {
00080 int w = list->count() > 0 ? list->item(0)->height(list) :
00081 list->fontMetrics().lineSpacing();
00082
00083 if( w < 0 ) { w = 10; }
00084 if( numVisibleEntry <= 0 ) { numVisibleEntry = 4; }
00085 return( w * numVisibleEntry + 2 * list->frameWidth() );
00086 }
00087
00088 class KFontChooser::KFontChooserPrivate
00089 {
00090 public:
00091 KFontChooserPrivate()
00092 { m_palette.setColor(QPalette::Active, QColorGroup::Text, Qt::black);
00093 m_palette.setColor(QPalette::Active, QColorGroup::Base, Qt::white); }
00094 QPalette m_palette;
00095 };
00096
00097 KFontChooser::KFontChooser(QWidget *parent, const char *name,
00098 bool onlyFixed, const QStringList &fontList,
00099 bool makeFrame, int visibleListSize, bool diff,
00100 QButton::ToggleState *sizeIsRelativeState )
00101 : QWidget(parent, name), usingFixed(onlyFixed)
00102 {
00103 charsetsCombo = 0;
00104
00105 QString mainWhatsThisText =
00106 i18n( "Here you can choose the font to be used." );
00107 QWhatsThis::add( this, mainWhatsThisText );
00108
00109 d = new KFontChooserPrivate;
00110 QVBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
00111 int checkBoxGap = KDialog::spacingHint() / 2;
00112
00113 QWidget *page;
00114 QGridLayout *gridLayout;
00115 int row = 0;
00116 if( makeFrame == true )
00117 {
00118 page = new QGroupBox( i18n("Requested Font"), this );
00119 topLayout->addWidget(page);
00120 gridLayout = new QGridLayout( page, 5, 3, KDialog::marginHint(), KDialog::spacingHint() );
00121 gridLayout->addRowSpacing( 0, fontMetrics().lineSpacing() );
00122 row = 1;
00123 }
00124 else
00125 {
00126 page = new QWidget( this );
00127 topLayout->addWidget(page);
00128 gridLayout = new QGridLayout( page, 4, 3, 0, KDialog::spacingHint() );
00129 }
00130
00131
00132
00133
00134 QHBoxLayout *familyLayout = new QHBoxLayout();
00135 familyLayout->addSpacing( checkBoxGap );
00136 if (diff) {
00137 familyCheckbox = new QCheckBox(i18n("Font"), page);
00138 connect(familyCheckbox, SIGNAL(toggled(bool)), SLOT(toggled_checkbox()));
00139 familyLayout->addWidget(familyCheckbox, 0, Qt::AlignLeft);
00140 QString familyCBToolTipText =
00141 i18n("Change font family?");
00142 QString familyCBWhatsThisText =
00143 i18n("Enable this checkbox to change the font family settings.");
00144 QWhatsThis::add( familyCheckbox, familyCBWhatsThisText );
00145 QToolTip::add( familyCheckbox, familyCBToolTipText );
00146 familyLabel = 0;
00147 } else {
00148 familyCheckbox = 0;
00149 familyLabel = new QLabel( i18n("Font:"), page, "familyLabel" );
00150 familyLayout->addWidget(familyLabel, 1, Qt::AlignLeft);
00151 }
00152 gridLayout->addLayout(familyLayout, row, 0 );
00153
00154 QHBoxLayout *styleLayout = new QHBoxLayout();
00155 if (diff) {
00156 styleCheckbox = new QCheckBox(i18n("Font style"), page);
00157 connect(styleCheckbox, SIGNAL(toggled(bool)), SLOT(toggled_checkbox()));
00158 styleLayout->addWidget(styleCheckbox, 0, Qt::AlignLeft);
00159 QString styleCBToolTipText =
00160 i18n("Change font style?");
00161 QString styleCBWhatsThisText =
00162 i18n("Enable this checkbox to change the font style settings.");
00163 QWhatsThis::add( styleCheckbox, styleCBWhatsThisText );
00164 QToolTip::add( styleCheckbox, styleCBToolTipText );
00165 styleLabel = 0;
00166 } else {
00167 styleCheckbox = 0;
00168 styleLabel = new QLabel( i18n("Font style:"), page, "styleLabel");
00169 styleLayout->addWidget(styleLabel, 1, Qt::AlignLeft);
00170 }
00171 styleLayout->addSpacing( checkBoxGap );
00172 gridLayout->addLayout(styleLayout, row, 1 );
00173
00174 QHBoxLayout *sizeLayout = new QHBoxLayout();
00175 if (diff) {
00176 sizeCheckbox = new QCheckBox(i18n("Size"),page);
00177 connect(sizeCheckbox, SIGNAL(toggled(bool)), SLOT(toggled_checkbox()));
00178 sizeLayout->addWidget(sizeCheckbox, 0, Qt::AlignLeft);
00179 QString sizeCBToolTipText =
00180 i18n("Change font size?");
00181 QString sizeCBWhatsThisText =
00182 i18n("Enable this checkbox to change the font size settings.");
00183 QWhatsThis::add( sizeCheckbox, sizeCBWhatsThisText );
00184 QToolTip::add( sizeCheckbox, sizeCBToolTipText );
00185 sizeLabel = 0;
00186 } else {
00187 sizeCheckbox = 0;
00188 sizeLabel = new QLabel( i18n("Size:"), page, "sizeLabel");
00189 sizeLayout->addWidget(sizeLabel, 1, Qt::AlignLeft);
00190 }
00191 sizeLayout->addSpacing( checkBoxGap );
00192 sizeLayout->addSpacing( checkBoxGap );
00193 gridLayout->addLayout(sizeLayout, row, 2 );
00194
00195 row ++;
00196
00197
00198
00199
00200 familyListBox = new KListBox( page, "familyListBox");
00201 familyListBox->setEnabled( !diff );
00202 gridLayout->addWidget( familyListBox, row, 0 );
00203 QString fontFamilyWhatsThisText =
00204 i18n("Here you can choose the font family to be used." );
00205 QWhatsThis::add( familyListBox, fontFamilyWhatsThisText );
00206 QWhatsThis::add(diff?(QWidget *) familyCheckbox:(QWidget *) familyLabel, fontFamilyWhatsThisText );
00207 connect(familyListBox, SIGNAL(highlighted(const QString &)),
00208 SLOT(family_chosen_slot(const QString &)));
00209 if(fontList.count() != 0)
00210 {
00211 familyListBox->insertStringList(fontList);
00212 }
00213 else
00214 {
00215 fillFamilyListBox(onlyFixed);
00216 }
00217
00218 familyListBox->setMinimumWidth( minimumListWidth( familyListBox ) );
00219 familyListBox->setMinimumHeight(
00220 minimumListHeight( familyListBox, visibleListSize ) );
00221
00222 styleListBox = new KListBox( page, "styleListBox");
00223 styleListBox->setEnabled( !diff );
00224 gridLayout->addWidget(styleListBox, row, 1);
00225 QString fontStyleWhatsThisText =
00226 i18n("Here you can choose the font style to be used." );
00227 QWhatsThis::add( styleListBox, fontStyleWhatsThisText );
00228 QWhatsThis::add(diff?(QWidget *)styleCheckbox:(QWidget *)styleLabel, fontFamilyWhatsThisText );
00229 styleListBox->insertItem(i18n("Regular"));
00230 styleListBox->insertItem(i18n("Italic"));
00231 styleListBox->insertItem(i18n("Bold"));
00232 styleListBox->insertItem(i18n("Bold Italic"));
00233 styleListBox->setMinimumWidth( minimumListWidth( styleListBox ) );
00234 styleListBox->setMinimumHeight(
00235 minimumListHeight( styleListBox, visibleListSize ) );
00236
00237 connect(styleListBox, SIGNAL(highlighted(const QString &)),
00238 SLOT(style_chosen_slot(const QString &)));
00239
00240
00241 sizeListBox = new KListBox( page, "sizeListBox");
00242 sizeOfFont = new KIntNumInput( page, "sizeOfFont");
00243 sizeOfFont->setMinValue(4);
00244
00245 sizeListBox->setEnabled( !diff );
00246 sizeOfFont->setEnabled( !diff );
00247 if( sizeIsRelativeState ) {
00248 QString sizeIsRelativeCBText =
00249 i18n("Relative");
00250 QString sizeIsRelativeCBToolTipText =
00251 i18n("Font size<br><i>fixed</i> or <i>relative</i><br>to environment");
00252 QString sizeIsRelativeCBWhatsThisText =
00253 i18n("Here you can switch between fixed font size and font size "
00254 "to be calculated dynamically and adjusted to changing "
00255 "environment (e.g. widget dimensions, paper size)." );
00256 sizeIsRelativeCheckBox = new QCheckBox( sizeIsRelativeCBText,
00257 page,
00258 "sizeIsRelativeCheckBox" );
00259 sizeIsRelativeCheckBox->setTristate( diff );
00260 QGridLayout *sizeLayout2 = new QGridLayout( 3,2, KDialog::spacingHint()/2, "sizeLayout2" );
00261 gridLayout->addLayout(sizeLayout2, row, 2);
00262 sizeLayout2->setColStretch( 1, 1 );
00263 sizeLayout2->addMultiCellWidget( sizeOfFont, 0, 0, 0, 1);
00264 sizeLayout2->addMultiCellWidget(sizeListBox, 1,1, 0,1);
00265 sizeLayout2->addWidget(sizeIsRelativeCheckBox, 2, 0, Qt::AlignLeft);
00266 QWhatsThis::add( sizeIsRelativeCheckBox, sizeIsRelativeCBWhatsThisText );
00267 QToolTip::add( sizeIsRelativeCheckBox, sizeIsRelativeCBToolTipText );
00268 }
00269 else {
00270 sizeIsRelativeCheckBox = 0L;
00271 QGridLayout *sizeLayout2 = new QGridLayout( 2,1, KDialog::spacingHint()/2, "sizeLayout2" );
00272 gridLayout->addLayout(sizeLayout2, row, 2);
00273 sizeLayout2->addWidget( sizeOfFont, 0, 0);
00274 sizeLayout2->addMultiCellWidget(sizeListBox, 1,1, 0,0);
00275 }
00276 QString fontSizeWhatsThisText =
00277 i18n("Here you can choose the font size to be used." );
00278 QWhatsThis::add( sizeListBox, fontSizeWhatsThisText );
00279 QWhatsThis::add( diff?(QWidget *)sizeCheckbox:(QWidget *)sizeLabel, fontSizeWhatsThisText );
00280
00281 fillSizeList();
00282 sizeListBox->setMinimumWidth( minimumListWidth(sizeListBox) +
00283 sizeListBox->fontMetrics().maxWidth() );
00284 sizeListBox->setMinimumHeight(
00285 minimumListHeight( sizeListBox, visibleListSize ) );
00286
00287 connect( sizeOfFont, SIGNAL( valueChanged(int) ),
00288 SLOT(size_value_slot(int)));
00289
00290 connect( sizeListBox, SIGNAL(highlighted(const QString&)),
00291 SLOT(size_chosen_slot(const QString&)) );
00292 sizeListBox->setSelected(sizeListBox->findItem(QString::number(10)), true);
00293
00294 row ++;
00295
00296 row ++;
00297 sampleEdit = new QLineEdit( page, "sampleEdit");
00298 QFont tmpFont( KGlobalSettings::generalFont().family(), 64, QFont::Black );
00299 sampleEdit->setFont(tmpFont);
00300 sampleEdit->setText(i18n("The Quick Brown Fox Jumps Over The Lazy Dog"));
00301 sampleEdit->setMinimumHeight( sampleEdit->fontMetrics().lineSpacing() );
00302 sampleEdit->setAlignment(Qt::AlignCenter);
00303 gridLayout->addMultiCellWidget(sampleEdit, 4, 4, 0, 2);
00304 QString sampleEditWhatsThisText =
00305 i18n("This sample text illustrates the current settings. "
00306 "You may edit it to test special characters." );
00307 QWhatsThis::add( sampleEdit, sampleEditWhatsThisText );
00308 connect(this, SIGNAL(fontSelected(const QFont &)),
00309 SLOT(displaySample(const QFont &)));
00310
00311 QVBoxLayout *vbox;
00312 if( makeFrame == true )
00313 {
00314 page = new QGroupBox( i18n("Actual Font"), this );
00315 topLayout->addWidget(page);
00316 vbox = new QVBoxLayout( page, KDialog::spacingHint() );
00317 vbox->addSpacing( fontMetrics().lineSpacing() );
00318 }
00319 else
00320 {
00321 page = new QWidget( this );
00322 topLayout->addWidget(page);
00323 vbox = new QVBoxLayout( page, 0, KDialog::spacingHint() );
00324 QLabel *label = new QLabel( i18n("Actual Font"), page );
00325 vbox->addWidget( label );
00326 }
00327
00328 xlfdEdit = new QLineEdit( page, "xlfdEdit" );
00329 vbox->addWidget( xlfdEdit );
00330
00331
00332 setFont( KGlobalSettings::generalFont(), usingFixed );
00333
00334 if( sizeIsRelativeState && sizeIsRelativeCheckBox )
00335 setSizeIsRelative( *sizeIsRelativeState );
00336
00337 KConfig *config = KGlobal::config();
00338 KConfigGroupSaver saver(config, QString::fromLatin1("General"));
00339 showXLFDArea(config->readBoolEntry(QString::fromLatin1("fontSelectorShowXLFD"), false));
00340 }
00341
00342 KFontChooser::~KFontChooser()
00343 {
00344 delete d;
00345 }
00346
00347 void KFontChooser::fillSizeList() {
00348 if(! sizeListBox) return;
00349
00350 static const int c[] =
00351 {
00352 4, 5, 6, 7,
00353 8, 9, 10, 11,
00354 12, 13, 14, 15,
00355 16, 17, 18, 19,
00356 20, 22, 24, 26,
00357 28, 32, 48, 64,
00358 0
00359 };
00360 for(int i = 0; c[i] != 0; i++)
00361 {
00362 sizeListBox->insertItem(QString::number(c[i]));
00363 }
00364 }
00365
00366 void KFontChooser::setColor( const QColor & col )
00367 {
00368 d->m_palette.setColor( QPalette::Active, QColorGroup::Text, col );
00369 QPalette pal = sampleEdit->palette();
00370 pal.setColor( QPalette::Active, QColorGroup::Text, col );
00371 sampleEdit->setPalette( pal );
00372 }
00373
00374 QColor KFontChooser::color() const
00375 {
00376 return d->m_palette.color( QPalette::Active, QColorGroup::Text );
00377 }
00378
00379 void KFontChooser::setBackgroundColor( const QColor & col )
00380 {
00381 d->m_palette.setColor( QPalette::Active, QColorGroup::Base, col );
00382 QPalette pal = sampleEdit->palette();
00383 pal.setColor( QPalette::Active, QColorGroup::Base, col );
00384 sampleEdit->setPalette( pal );
00385 }
00386
00387 QColor KFontChooser::backgroundColor() const
00388 {
00389 return d->m_palette.color( QPalette::Active, QColorGroup::Base );
00390 }
00391
00392 void KFontChooser::setSizeIsRelative( QButton::ToggleState relative )
00393 {
00394
00395 if( sizeIsRelativeCheckBox ) {
00396 if( QButton::NoChange == relative )
00397 sizeIsRelativeCheckBox->setNoChange();
00398 else
00399 sizeIsRelativeCheckBox->setChecked( QButton::On == relative );
00400 }
00401 }
00402
00403 QButton::ToggleState KFontChooser::sizeIsRelative() const
00404 {
00405 return sizeIsRelativeCheckBox
00406 ? sizeIsRelativeCheckBox->state()
00407 : QButton::NoChange;
00408 }
00409
00410 QSize KFontChooser::sizeHint( void ) const
00411 {
00412 return( minimumSizeHint() );
00413 }
00414
00415
00416 void KFontChooser::enableColumn( int column, bool state )
00417 {
00418 if( column & FamilyList )
00419 {
00420 familyListBox->setEnabled(state);
00421 }
00422 if( column & StyleList )
00423 {
00424 styleListBox->setEnabled(state);
00425 }
00426 if( column & SizeList )
00427 {
00428 sizeListBox->setEnabled(state);
00429 }
00430 }
00431
00432
00433 void KFontChooser::setFont( const QFont& aFont, bool onlyFixed )
00434 {
00435 selFont = aFont;
00436 selectedSize=aFont.pointSize();
00437 if (selectedSize == -1)
00438 selectedSize = QFontInfo(aFont).pointSize();
00439
00440 if( onlyFixed != usingFixed)
00441 {
00442 usingFixed = onlyFixed;
00443 fillFamilyListBox(usingFixed);
00444 }
00445 setupDisplay();
00446 displaySample(selFont);
00447 }
00448
00449
00450 int KFontChooser::fontDiffFlags() {
00451 int diffFlags = 0;
00452 if (familyCheckbox && styleCheckbox && sizeCheckbox) {
00453 diffFlags = (int)(familyCheckbox->isChecked() ? FontDiffFamily : 0)
00454 | (int)( styleCheckbox->isChecked() ? FontDiffStyle : 0)
00455 | (int)( sizeCheckbox->isChecked() ? FontDiffSize : 0);
00456 }
00457 return diffFlags;
00458 }
00459
00460 void KFontChooser::toggled_checkbox()
00461 {
00462 familyListBox->setEnabled( familyCheckbox->isChecked() );
00463 styleListBox->setEnabled( styleCheckbox->isChecked() );
00464 sizeListBox->setEnabled( sizeCheckbox->isChecked() );
00465 sizeOfFont->setEnabled( sizeCheckbox->isChecked() );
00466 }
00467
00468 void KFontChooser::family_chosen_slot(const QString& family)
00469 {
00470 QFontDatabase dbase;
00471 QStringList styles = QStringList(dbase.styles(family));
00472 styleListBox->clear();
00473 currentStyles.clear();
00474 for ( QStringList::Iterator it = styles.begin(); it != styles.end(); ++it ) {
00475 QString style = *it;
00476 int pos = style.find("Plain");
00477 if(pos >=0) style = style.replace(pos,5,i18n("Regular"));
00478 pos = style.find("Normal");
00479 if(pos >=0) style = style.replace(pos,6,i18n("Regular"));
00480 pos = style.find("Oblique");
00481 if(pos >=0) style = style.replace(pos,7,i18n("Italic"));
00482 if(styleListBox->findItem(style) ==0) {
00483 styleListBox->insertItem(i18n(style.utf8()));
00484 currentStyles.insert(i18n(style.utf8()), *it);
00485 }
00486 }
00487 if(styleListBox->count()==0) {
00488 styleListBox->insertItem(i18n("Regular"));
00489 currentStyles.insert(i18n("Regular"), "Normal");
00490 }
00491
00492 styleListBox->blockSignals(true);
00493 QListBoxItem *item = styleListBox->findItem(selectedStyle);
00494 if (item)
00495 styleListBox->setSelected(styleListBox->findItem(selectedStyle), true);
00496 else
00497 styleListBox->setSelected(0, true);
00498 styleListBox->blockSignals(false);
00499
00500 style_chosen_slot(QString::null);
00501 }
00502
00503 void KFontChooser::size_chosen_slot(const QString& size){
00504
00505 selectedSize=size.toInt();
00506 sizeOfFont->setValue(selectedSize);
00507 selFont.setPointSize(selectedSize);
00508 emit fontSelected(selFont);
00509 }
00510
00511 void KFontChooser::size_value_slot(int val) {
00512 selFont.setPointSize(val);
00513 emit fontSelected(selFont);
00514 }
00515
00516 void KFontChooser::style_chosen_slot(const QString& style)
00517 {
00518 QString currentStyle;
00519 if (style.isEmpty())
00520 currentStyle = styleListBox->currentText();
00521 else
00522 currentStyle = style;
00523
00524 int diff=0;
00525
00526 sizeListBox->clear();
00527 QFontDatabase dbase;
00528 if(dbase.isSmoothlyScalable(familyListBox->currentText(), currentStyles[currentStyle])) {
00529
00530 fillSizeList();
00531 } else {
00532
00533 QValueList<int> sizes = dbase.smoothSizes(familyListBox->currentText(), currentStyles[currentStyle]);
00534 if(sizes.count() > 0) {
00535 QValueList<int>::iterator it;
00536 diff=1000;
00537 for ( it = sizes.begin(); it != sizes.end(); ++it ) {
00538 if(*it <= selectedSize || diff > *it - selectedSize) diff = selectedSize - *it;
00539 sizeListBox->insertItem(QString::number(*it));
00540 }
00541 } else
00542 fillSizeList();
00543 }
00544 sizeListBox->blockSignals(true);
00545 sizeListBox->setSelected(sizeListBox->findItem(QString::number(selectedSize)), true);
00546 sizeListBox->blockSignals(false);
00547 sizeListBox->ensureCurrentVisible();
00548
00549
00550 selFont = dbase.font(familyListBox->currentText(), currentStyles[currentStyle], selectedSize-diff);
00551 emit fontSelected(selFont);
00552 if (!style.isEmpty())
00553 selectedStyle = style;
00554 }
00555
00556 void KFontChooser::displaySample(const QFont& font)
00557 {
00558 sampleEdit->setFont(font);
00559 sampleEdit->setCursorPosition(0);
00560 xlfdEdit->setText(font.rawName());
00561 xlfdEdit->setCursorPosition(0);
00562
00563
00564
00565
00566 }
00567
00568 void KFontChooser::setupDisplay()
00569 {
00570
00571
00572 QString family = selFont.family().lower();
00573 int style = (selFont.bold() ? 2 : 0) + (selFont.italic() ? 1 : 0);
00574 int size = selFont.pointSize();
00575 if (size == -1)
00576 size = QFontInfo(selFont).pointSize();
00577 QString sizeStr = QString::number(size);
00578
00579 int numEntries, i;
00580
00581 numEntries = familyListBox->count();
00582 for (i = 0; i < numEntries; i++) {
00583 if (family == familyListBox->text(i).lower()) {
00584 familyListBox->setCurrentItem(i);
00585 break;
00586 }
00587 }
00588
00589
00590 if ( (i == numEntries) )
00591 {
00592 if (family.contains('['))
00593 {
00594 family = family.left(family.find('[')).stripWhiteSpace();
00595 for (i = 0; i < numEntries; i++) {
00596 if (family == familyListBox->text(i).lower()) {
00597 familyListBox->setCurrentItem(i);
00598 break;
00599 }
00600 }
00601 }
00602 }
00603
00604
00605 if ( (i == numEntries) )
00606 {
00607 QString fallback = family+" [";
00608 for (i = 0; i < numEntries; i++) {
00609 if (familyListBox->text(i).lower().startsWith(fallback)) {
00610 familyListBox->setCurrentItem(i);
00611 break;
00612 }
00613 }
00614 }
00615
00616
00617 if ( (i == numEntries) )
00618 {
00619 for (i = 0; i < numEntries; i++) {
00620 if (familyListBox->text(i).lower().startsWith(family)) {
00621 familyListBox->setCurrentItem(i);
00622 break;
00623 }
00624 }
00625 }
00626
00627
00628 if ( i == numEntries )
00629 familyListBox->setCurrentItem( 0 );
00630
00631 styleListBox->setCurrentItem(style);
00632
00633 numEntries = sizeListBox->count();
00634 for (i = 0; i < numEntries; i++){
00635 if (sizeStr == sizeListBox->text(i)) {
00636 sizeListBox->setCurrentItem(i);
00637 break;
00638 }
00639 }
00640
00641 sizeOfFont->setValue(size);
00642 }
00643
00644
00645 void KFontChooser::getFontList( QStringList &list, uint fontListCriteria)
00646 {
00647 QFontDatabase dbase;
00648 QStringList lstSys(dbase.families());
00649
00650
00651 if (fontListCriteria)
00652 {
00653 QStringList lstFonts;
00654 for (QStringList::Iterator it = lstSys.begin(); it != lstSys.end(); ++it)
00655 {
00656 if ((fontListCriteria & FixedWidthFonts) > 0 && !dbase.isFixedPitch(*it)) continue;
00657 if ((fontListCriteria & (SmoothScalableFonts | ScalableFonts) == ScalableFonts) &&
00658 !dbase.isBitmapScalable(*it)) continue;
00659 if ((fontListCriteria & SmoothScalableFonts) > 0 && !dbase.isSmoothlyScalable(*it)) continue;
00660 lstFonts.append(*it);
00661 }
00662
00663 if((fontListCriteria & FixedWidthFonts) > 0) {
00664
00665
00666 if (lstFonts.count() == 0)
00667 lstFonts.append("fixed");
00668 }
00669
00670 lstSys = lstFonts;
00671 }
00672
00673 lstSys.sort();
00674
00675 list = lstSys;
00676 }
00677
00678 void KFontChooser::addFont( QStringList &list, const char *xfont )
00679 {
00680 const char *ptr = strchr( xfont, '-' );
00681 if ( !ptr )
00682 return;
00683
00684 ptr = strchr( ptr + 1, '-' );
00685 if ( !ptr )
00686 return;
00687
00688 QString font = QString::fromLatin1(ptr + 1);
00689
00690 int pos;
00691 if ( ( pos = font.find( '-' ) ) > 0 ) {
00692 font.truncate( pos );
00693
00694 if ( font.find( QString::fromLatin1("open look"), 0, false ) >= 0 )
00695 return;
00696
00697 QStringList::Iterator it = list.begin();
00698
00699 for ( ; it != list.end(); ++it )
00700 if ( *it == font )
00701 return;
00702 list.append( font );
00703 }
00704 }
00705
00706 void KFontChooser::fillFamilyListBox(bool onlyFixedFonts)
00707 {
00708 QStringList fontList;
00709 getFontList(fontList, onlyFixedFonts?FixedWidthFonts:0);
00710 familyListBox->clear();
00711 familyListBox->insertStringList(fontList);
00712 }
00713
00714 void KFontChooser::showXLFDArea(bool show)
00715 {
00716 if( show == true )
00717 {
00718 xlfdEdit->parentWidget()->show();
00719 }
00720 else
00721 {
00722 xlfdEdit->parentWidget()->hide();
00723 }
00724 }
00725
00727
00728 KFontDialog::KFontDialog( QWidget *parent, const char* name,
00729 bool onlyFixed, bool modal,
00730 const QStringList &fontList, bool makeFrame, bool diff,
00731 QButton::ToggleState *sizeIsRelativeState )
00732 : KDialogBase( parent, name, modal, i18n("Select Font"), Ok|Cancel, Ok )
00733 {
00734 chooser = new KFontChooser( this, "fontChooser",
00735 onlyFixed, fontList, makeFrame, 8,
00736 diff, sizeIsRelativeState );
00737 setMainWidget(chooser);
00738 }
00739
00740
00741 int KFontDialog::getFontDiff( QFont &theFont, int &diffFlags, bool onlyFixed,
00742 QWidget *parent, bool makeFrame,
00743 QButton::ToggleState *sizeIsRelativeState )
00744 {
00745 KFontDialog dlg( parent, "Font Selector", onlyFixed, true, QStringList(),
00746 makeFrame, true, sizeIsRelativeState );
00747 dlg.setFont( theFont, onlyFixed );
00748
00749 int result = dlg.exec();
00750 if( result == Accepted )
00751 {
00752 theFont = dlg.chooser->font();
00753 diffFlags = dlg.chooser->fontDiffFlags();
00754 if( sizeIsRelativeState )
00755 *sizeIsRelativeState = dlg.chooser->sizeIsRelative();
00756 }
00757 return( result );
00758 }
00759
00760 int KFontDialog::getFont( QFont &theFont, bool onlyFixed,
00761 QWidget *parent, bool makeFrame,
00762 QButton::ToggleState *sizeIsRelativeState )
00763 {
00764 KFontDialog dlg( parent, "Font Selector", onlyFixed, true, QStringList(),
00765 makeFrame, false, sizeIsRelativeState );
00766 dlg.setFont( theFont, onlyFixed );
00767
00768 int result = dlg.exec();
00769 if( result == Accepted )
00770 {
00771 theFont = dlg.chooser->font();
00772 if( sizeIsRelativeState )
00773 *sizeIsRelativeState = dlg.chooser->sizeIsRelative();
00774 }
00775 return( result );
00776 }
00777
00778
00779 int KFontDialog::getFontAndText( QFont &theFont, QString &theString,
00780 bool onlyFixed, QWidget *parent,
00781 bool makeFrame,
00782 QButton::ToggleState *sizeIsRelativeState )
00783 {
00784 KFontDialog dlg( parent, "Font and Text Selector", onlyFixed, true,
00785 QStringList(), makeFrame, false, sizeIsRelativeState );
00786 dlg.setFont( theFont, onlyFixed );
00787
00788 int result = dlg.exec();
00789 if( result == Accepted )
00790 {
00791 theFont = dlg.chooser->font();
00792 theString = dlg.chooser->sampleText();
00793 if( sizeIsRelativeState )
00794 *sizeIsRelativeState = dlg.chooser->sizeIsRelative();
00795 }
00796 return( result );
00797 }
00798
00799 void KFontChooser::virtual_hook( int, void* )
00800 { }
00801
00802 void KFontDialog::virtual_hook( int id, void* data )
00803 { KDialogBase::virtual_hook( id, data ); }