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
#include <config.h>
00027
00028
#include <stdio.h>
00029
#include <stdlib.h>
00030
00031
#include <qcombobox.h>
00032
#include <qcheckbox.h>
00033
#include <qfile.h>
00034
#include <qfont.h>
00035
#include <qgroupbox.h>
00036
#include <qlabel.h>
00037
#include <qlayout.h>
00038
#include <qscrollbar.h>
00039
#include <qstringlist.h>
00040
#include <qfontdatabase.h>
00041
#include <qwhatsthis.h>
00042
#include <qtooltip.h>
00043
00044
#include <kapplication.h>
00045
#include <kcharsets.h>
00046
#include <kconfig.h>
00047
#include <kdialog.h>
00048
#include <kglobal.h>
00049
#include <kglobalsettings.h>
00050
#include <qlineedit.h>
00051
#include <klistbox.h>
00052
#include <klocale.h>
00053
#include <kstandarddirs.h>
00054
#include <kdebug.h>
00055
#include <knuminput.h>
00056
#ifdef Q_WS_X11
00057
#include <X11/Xlib.h>
00058
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 )
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.isEmpty())
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 )
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]; ++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)) {
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
00627
if ( i == numEntries )
00628 familyListBox->setCurrentItem( 0 );
00629
00630 styleListBox->setCurrentItem(style);
00631
00632 numEntries = sizeListBox->count();
00633
for (i = 0; i < numEntries; i++){
00634
if (sizeStr == sizeListBox->text(i)) {
00635 sizeListBox->setCurrentItem(i);
00636
break;
00637 }
00638 }
00639
00640 sizeOfFont->
setValue(size);
00641 }
00642
00643
00644 void KFontChooser::getFontList( QStringList &list, uint fontListCriteria)
00645 {
00646
QFontDatabase dbase;
00647 QStringList lstSys(dbase.families());
00648
00649
00650
if (fontListCriteria)
00651 {
00652 QStringList lstFonts;
00653
for (QStringList::Iterator it = lstSys.begin(); it != lstSys.end(); ++it)
00654 {
00655
if ((fontListCriteria & FixedWidthFonts) > 0 && !dbase.isFixedPitch(*it))
continue;
00656
if (((fontListCriteria & (SmoothScalableFonts | ScalableFonts)) == ScalableFonts) &&
00657 !dbase.isBitmapScalable(*it))
continue;
00658
if ((fontListCriteria & SmoothScalableFonts) > 0 && !dbase.isSmoothlyScalable(*it))
continue;
00659 lstFonts.append(*it);
00660 }
00661
00662
if((fontListCriteria & FixedWidthFonts) > 0) {
00663
00664
00665
if (lstFonts.count() == 0)
00666 lstFonts.append(
"fixed");
00667 }
00668
00669 lstSys = lstFonts;
00670 }
00671
00672 lstSys.sort();
00673
00674 list = lstSys;
00675 }
00676
00677
void KFontChooser::addFont( QStringList &list,
const char *xfont )
00678 {
00679
const char *ptr = strchr( xfont,
'-' );
00680
if ( !ptr )
00681
return;
00682
00683 ptr = strchr( ptr + 1,
'-' );
00684
if ( !ptr )
00685
return;
00686
00687
QString font = QString::fromLatin1(ptr + 1);
00688
00689
int pos;
00690
if ( ( pos = font.find(
'-' ) ) > 0 ) {
00691 font.truncate( pos );
00692
00693
if ( font.find( QString::fromLatin1(
"open look"), 0,
false ) >= 0 )
00694
return;
00695
00696 QStringList::Iterator it = list.begin();
00697
00698
for ( ; it != list.end(); ++it )
00699
if ( *it == font )
00700
return;
00701 list.append( font );
00702 }
00703 }
00704
00705
void KFontChooser::fillFamilyListBox(
bool onlyFixedFonts)
00706 {
00707 QStringList fontList;
00708
getFontList(fontList, onlyFixedFonts?FixedWidthFonts:0);
00709 familyListBox->clear();
00710 familyListBox->insertStringList(fontList);
00711 }
00712
00713
void KFontChooser::showXLFDArea(
bool show)
00714 {
00715
if( show )
00716 {
00717 xlfdEdit->parentWidget()->show();
00718 }
00719
else
00720 {
00721 xlfdEdit->parentWidget()->hide();
00722 }
00723 }
00724
00726
00727 KFontDialog::KFontDialog(
QWidget *parent,
const char* name,
00728
bool onlyFixed,
bool modal,
00729
const QStringList &fontList,
bool makeFrame,
bool diff,
00730 QButton::ToggleState *sizeIsRelativeState )
00731 :
KDialogBase( parent, name, modal, i18n("Select Font"), Ok|Cancel, Ok )
00732 {
00733 chooser =
new KFontChooser(
this,
"fontChooser",
00734 onlyFixed, fontList, makeFrame, 8,
00735 diff, sizeIsRelativeState );
00736 setMainWidget(chooser);
00737 }
00738
00739
00740 int KFontDialog::getFontDiff(
QFont &theFont,
int &diffFlags,
bool onlyFixed,
00741
QWidget *parent,
bool makeFrame,
00742 QButton::ToggleState *sizeIsRelativeState )
00743 {
00744
KFontDialog dlg( parent,
"Font Selector", onlyFixed,
true, QStringList(),
00745 makeFrame,
true, sizeIsRelativeState );
00746 dlg.
setFont( theFont, onlyFixed );
00747
00748
int result = dlg.exec();
00749
if( result == Accepted )
00750 {
00751 theFont = dlg.
chooser->
font();
00752 diffFlags = dlg.
chooser->
fontDiffFlags();
00753
if( sizeIsRelativeState )
00754 *sizeIsRelativeState = dlg.
chooser->
sizeIsRelative();
00755 }
00756
return result;
00757 }
00758
00759 int KFontDialog::getFont(
QFont &theFont,
bool onlyFixed,
00760
QWidget *parent,
bool makeFrame,
00761 QButton::ToggleState *sizeIsRelativeState )
00762 {
00763
KFontDialog dlg( parent,
"Font Selector", onlyFixed,
true, QStringList(),
00764 makeFrame,
false, sizeIsRelativeState );
00765 dlg.
setFont( theFont, onlyFixed );
00766
00767
int result = dlg.exec();
00768
if( result == Accepted )
00769 {
00770 theFont = dlg.
chooser->
font();
00771
if( sizeIsRelativeState )
00772 *sizeIsRelativeState = dlg.
chooser->
sizeIsRelative();
00773 }
00774
return result;
00775 }
00776
00777
00778 int KFontDialog::getFontAndText(
QFont &theFont,
QString &theString,
00779
bool onlyFixed,
QWidget *parent,
00780
bool makeFrame,
00781 QButton::ToggleState *sizeIsRelativeState )
00782 {
00783
KFontDialog dlg( parent,
"Font and Text Selector", onlyFixed,
true,
00784 QStringList(), makeFrame,
false, sizeIsRelativeState );
00785 dlg.
setFont( theFont, onlyFixed );
00786
00787
int result = dlg.exec();
00788
if( result == Accepted )
00789 {
00790 theFont = dlg.
chooser->
font();
00791 theString = dlg.
chooser->
sampleText();
00792
if( sizeIsRelativeState )
00793 *sizeIsRelativeState = dlg.
chooser->
sizeIsRelative();
00794 }
00795
return result;
00796 }
00797
00798
void KFontChooser::virtual_hook(
int,
void* )
00799 { }
00800
00801
void KFontDialog::virtual_hook(
int id,
void* data )
00802 { KDialogBase::virtual_hook(
id, data ); }