00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <qfontdatabase.h>
00022
#include <qlistbox.h>
00023
#include <qpainter.h>
00024
00025
#include <kcharsets.h>
00026
#include <kconfig.h>
00027
#include <kglobal.h>
00028
#include <kfontdialog.h>
00029
00030
#include "kfontcombo.h"
00031
#include "kfontcombo.moc"
00032
00033
struct KFontComboPrivate
00034 {
00035 KFontComboPrivate()
00036 : bold(false),
00037 italic(false),
00038 underline(false),
00039 strikeOut(false),
00040 modified(false),
00041 size(0),
00042 lineSpacing(0)
00043 {
00044 };
00045
00046
bool bold : 1;
00047
bool italic : 1;
00048
bool underline : 1;
00049
bool strikeOut : 1;
00050
bool displayFonts : 1;
00051
bool modified : 1;
00052
int size;
00053
int lineSpacing;
00054
QString defaultFamily;
00055 };
00056
00057
class KFontListItem :
public QListBoxItem
00058 {
00059
public:
00060 KFontListItem(
const QString &fontName,
KFontCombo *combo);
00061
virtual ~KFontListItem();
00062
00063
virtual int width(
const QListBox *) const;
00064 virtual
int height(const
QListBox *) const;
00065
00066
void updateFont();
00067
00068 protected:
00069 virtual
void paint(
QPainter *p);
00070
00071 private:
00072
void createFont();
00073
00074 private:
00075
KFontCombo *m_combo;
00076
QString m_fontName;
00077
QFont *m_font;
00078
bool m_canPaintName;
00079 };
00080
00081 KFontListItem::KFontListItem(const
QString &fontName,
KFontCombo *combo)
00082 :
QListBoxItem(combo->listBox()),
00083 m_combo(combo),
00084 m_fontName(fontName),
00085 m_font(0),
00086 m_canPaintName(true)
00087 {
00088
setText(fontName);
00089 }
00090
00091 KFontListItem::~KFontListItem()
00092 {
00093
delete m_font;
00094 }
00095
00096
int KFontListItem::width(
const QListBox *lb)
const
00097
{
00098
if (m_font)
00099
return QFontMetrics(*m_font).width(text()) + 6;
00100
return lb->fontMetrics().width(text()) + 6;
00101 }
00102
00103
int KFontListItem::height(
const QListBox *lb)
const
00104
{
00105
if (m_combo->d->displayFonts)
00106
return m_combo->d->lineSpacing + 2;
00107
QFontMetrics fm(lb->fontMetrics());
00108
return fm.
lineSpacing() + 2;
00109 }
00110
00111
void KFontListItem::paint(
QPainter *p)
00112 {
00113
if (m_combo->d->displayFonts)
00114 {
00115
if (!m_font)
00116 createFont();
00117
00118
QString t = m_fontName;
00119
if (p->
device() != m_combo)
00120 {
00121
if (m_canPaintName)
00122 p->
setFont(*m_font);
00123
else
00124 t =
QString::fromLatin1(
"(%1)").arg(m_fontName);
00125 }
00126
QFontMetrics fm(p->
fontMetrics());
00127 p->
drawText(3, (m_combo->d->lineSpacing + fm.
ascent() + fm.
leading() / 2) / 2, t);
00128 }
00129
else
00130 {
00131
QFontMetrics fm(p->
fontMetrics());
00132 p->
drawText(3, fm.
ascent() + fm.
leading() / 2, m_fontName);
00133 }
00134 }
00135
00136
void KFontListItem::updateFont()
00137 {
00138
if (!m_font)
00139
return;
00140
00141 m_font->setBold(m_combo->d->bold);
00142 m_font->setItalic(m_combo->d->italic);
00143 m_font->setUnderline(m_combo->d->underline);
00144 m_font->setStrikeOut(m_combo->d->strikeOut);
00145 m_font->setPointSize(m_combo->d->size);
00146 }
00147
00148
void KFontListItem::createFont()
00149 {
00150
if (m_font)
00151
return;
00152
00153 m_font =
new QFont(m_fontName);
00154
QFontMetrics fm(*m_font);
00155
for (
unsigned int i = 0; i < m_fontName.length(); ++i)
00156
if (!fm.
inFont(m_fontName[i]))
00157 {
00158 m_canPaintName =
false;
00159
break;
00160 }
00161 updateFont();
00162 }
00163
00164 KFontCombo::KFontCombo(
QWidget *parent,
const char *name)
00165 :
KComboBox(true, parent, name)
00166 {
00167 init();
00168
QStringList families;
00169 KFontChooser::getFontList(families, 0);
00170
setFonts(families);
00171 }
00172
00173 KFontCombo::KFontCombo(
const QStringList &fonts,
QWidget *parent,
const char *name)
00174 :
KComboBox(true, parent, name)
00175 {
00176 init();
00177
setFonts(fonts);
00178 }
00179
00180 void KFontCombo::setFonts(
const QStringList &fonts)
00181 {
00182
clear();
00183
for (QStringList::ConstIterator it = fonts.begin(); it != fonts.end(); ++it)
00184
new KFontListItem(*it,
this);
00185 }
00186
00187
00188
00189
00190 void KFontCombo::setCurrentFont(
const QString &family)
00191 {
00192
QString lowerName = family.
lower();
00193
int c =
count();
00194
for(
int i = 0; i < c; i++)
00195 {
00196
if (text(i).lower() == lowerName)
00197 {
00198
setCurrentItem(i);
00199 d->defaultFamily = text(i);
00200 d->modified =
false;
00201
return;
00202 }
00203 }
00204
int x = lowerName.
find(
" [");
00205
if (x>-1)
00206 {
00207 lowerName = lowerName.
left(x);
00208
for(
int i = 0; i < c; i++)
00209 {
00210
if (text(i).lower() == lowerName)
00211 {
00212
setCurrentItem(i);
00213 d->defaultFamily = text(i);
00214 d->modified =
false;
00215
return;
00216 }
00217 }
00218 }
00219
00220 lowerName +=
" [";
00221
for(
int i = 0; i < c; i++)
00222 {
00223
if (text(i).lower().startsWith(lowerName))
00224 {
00225
setCurrentItem(i);
00226 d->defaultFamily = text(i);
00227 d->modified =
false;
00228
return;
00229 }
00230 }
00231 }
00232
00233 QString KFontCombo::currentFont()
const
00234
{
00235
if (d->modified)
00236
return currentText();
00237
return d->defaultFamily;
00238 }
00239
00240 void KFontCombo::setCurrentItem(
int i)
00241 {
00242 d->modified =
true;
00243 QComboBox::setCurrentItem(i);
00244 }
00245
00246
void KFontCombo::init()
00247 {
00248 d =
new KFontComboPrivate;
00249 d->displayFonts =
displayFonts();
00250 setInsertionPolicy(NoInsertion);
00251 setAutoCompletion(
true);
00252 setSize(12);
00253 }
00254
00255 KFontCombo::~KFontCombo()
00256 {
00257
delete d;
00258 }
00259
00260 void KFontCombo::setBold(
bool bold)
00261 {
00262
if (d->bold == bold)
00263
return;
00264 d->bold = bold;
00265
updateFonts();
00266 }
00267
00268
bool KFontCombo::bold()
const
00269
{
00270
return d->bold;
00271 }
00272
00273 void KFontCombo::setItalic(
bool italic)
00274 {
00275
if (d->italic == italic)
00276
return;
00277 d->italic = italic;
00278
updateFonts();
00279 }
00280
00281
bool KFontCombo::italic()
const
00282
{
00283
return d->italic;
00284 }
00285
00286 void KFontCombo::setUnderline(
bool underline)
00287 {
00288
if (d->underline == underline)
00289
return;
00290 d->underline = underline;
00291
updateFonts();
00292 }
00293
00294
bool KFontCombo::underline()
const
00295
{
00296
return d->underline;
00297 }
00298
00299 void KFontCombo::setStrikeOut(
bool strikeOut)
00300 {
00301
if (d->strikeOut == strikeOut)
00302
return;
00303 d->strikeOut = strikeOut;
00304
updateFonts();
00305 }
00306
00307
bool KFontCombo::strikeOut()
const
00308
{
00309
return d->strikeOut;
00310 }
00311
00312 void KFontCombo::setSize(
int size)
00313 {
00314
if (d->size == size)
00315
return;
00316 d->size = size;
00317
QFont f;
00318 f.
setPointSize(size);
00319
QFontMetrics fm(f);
00320 d->lineSpacing = fm.
lineSpacing();
00321
updateFonts();
00322 }
00323
00324 int KFontCombo::size()
const
00325
{
00326
return d->size;
00327 }
00328
00329 void KFontCombo::updateFonts()
00330 {
00331
if (!d->displayFonts)
00332
return;
00333
00334
for (
unsigned int i = 0; i <
listBox()->count(); ++i)
00335 {
00336 KFontListItem *item = static_cast<KFontListItem *>(
listBox()->item(i));
00337 item->updateFont();
00338 }
00339 }
00340
00341 bool KFontCombo::displayFonts()
00342 {
00343
KConfigGroupSaver saver(KGlobal::config(),
"KDE");
00344
return KGlobal::config()->
readBoolEntry(
"DisplayFontItems",
true);
00345 }
00346
00347
void KFontCombo::virtual_hook(
int id,
void* data )
00348 { KComboBox::virtual_hook(
id, data ); }
00349