kfontcombo.cpp
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
This file is part of the documentation for kdeui Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Apr 21 18:43:16 2004 by
doxygen 1.3.6-20040222 written by
Dimitri van Heesch, © 1997-2003