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