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 ); }