• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kdeui

kfontcombo.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE libraries
00002    Copyright (c) 2001 Malte Starostik <malte@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License version 2 as published by the Free Software Foundation.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public License
00014    along with this library; see the file COPYING.LIB.  If not, write to
00015    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00016    Boston, MA 02110-1301, USA.
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  * Maintenance note: Keep in sync with KFontAction::setFont()
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 

kdeui

Skip menu "kdeui"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal