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