Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ofontselector.cpp

Go to the documentation of this file.
00001 /*
00002                              This file is part of the Opie Project
00003                              Copyright (C) Robert Griebl <sandman@handhelds.org>
00004               =.             Copyright (C) The Opie Team <opie-devel@handhelds.org>
00005             .=l.
00006            .>+-=
00007  _;:,     .>    :=|.         This program is free software; you can
00008 .> <`_,   >  .   <=          redistribute it and/or  modify it under
00009 :`=1 )Y*s>-.--   :           the terms of the GNU Library General Public
00010 .="- .-=="i,     .._         License as published by the Free Software
00011  - .   .-<_>     .<>         Foundation; either version 2 of the License,
00012      ._= =}       :          or (at your option) any later version.
00013     .%`+i>       _;_.
00014     .i_,=:_.      -<s.       This program is distributed in the hope that
00015      +  .  -:.       =       it will be useful,  but WITHOUT ANY WARRANTY;
00016     : ..    .:,     . . .    without even the implied warranty of
00017     =_        +     =;=|`    MERCHANTABILITY or FITNESS FOR A
00018   _.=:.       :    :=>`:     PARTICULAR PURPOSE. See the GNU
00019 ..}^=.=       =       ;      Library General Public License for more
00020 ++=   -.     .`     .:       details.
00021  :     =  ...= . :.=-
00022  -.   .:....=;==+<;          You should have received a copy of the GNU
00023   -_. . .   )=.  =           Library General Public License along with
00024     --        :-=`           this library; see the file COPYING.LIB.
00025                              If not, write to the Free Software Foundation,
00026                              Inc., 59 Temple Place - Suite 330,
00027                              Boston, MA 02111-1307, USA.
00028 */
00029 
00030 /* OPIE */
00031 #include <opie2/ofontselector.h>
00032 #include <qpe/fontdatabase.h>
00033 
00034 /* QT */
00035 #include <qlayout.h>
00036 #include <qlistbox.h>
00037 #include <qcombobox.h>
00038 #include <qlabel.h>
00039 #include <qmultilineedit.h>
00040 
00041 
00042 /* TRANSLATOR Opie::Ui::OFontSelector */
00043 
00044 
00045 namespace Opie {
00046 namespace Ui   {
00047 namespace Internal {
00048 
00049 class OFontSelectorPrivate
00050 {
00051 public:
00052     QListBox *      m_font_family_list;
00053     QComboBox *     m_font_style_list;
00054     QComboBox *     m_font_size_list;
00055     QMultiLineEdit *m_preview;
00056 
00057     bool            m_pointbug : 1;
00058 
00059     FontDatabase    m_fdb;
00060 };
00061 
00062 class FontListItem : public QListBoxText
00063 {
00064 public:
00065     FontListItem ( const QString &t, const QStringList &styles, const QValueList<int> &sizes ) : QListBoxText()
00066     {
00067         m_name = t;
00068         m_styles = styles;
00069         m_sizes = sizes;
00070 
00071         QString str = t;
00072         str [0] = str [0]. upper();
00073         setText ( str );
00074     }
00075 
00076     QString family() const
00077     {
00078         return m_name;
00079     }
00080 
00081     const QStringList &styles() const
00082     {
00083         return m_styles;
00084     }
00085 
00086     const QValueList<int> &sizes() const
00087     {
00088         return m_sizes;
00089     }
00090 
00091 private:
00092     QStringList m_styles;
00093     QValueList<int> m_sizes;
00094     QString m_name;
00095 };
00096 }
00097 }
00098 }
00099 
00100 
00101 using namespace Opie::Ui;
00102 using namespace Opie::Ui::Internal;
00103 
00104 static int findItemCB( QComboBox *box, const QString &str )
00105 {
00106     for ( int i = 0; i < box->count(); i++ )
00107     {
00108         if ( box->text ( i ) == str )
00109             return i;
00110     }
00111     return -1;
00112 }
00113 
00114 /* static same as anon. namespace */
00115 static int qt_version()
00116 {
00117     const char *qver = qVersion();
00118 
00119     return ( qver [0] - '0' ) * 100 + ( qver [2] - '0' ) * 10 + ( qver [4] - '0' );
00120 }
00121 
00129 OFontSelector::OFontSelector( bool withpreview, QWidget *parent, const char *name, WFlags fl ) : QWidget ( parent, name, fl )
00130 {
00131     d = new OFontSelectorPrivate();
00132 
00133     QGridLayout *gridLayout = new QGridLayout( this, 0, 0, 4, 4 );
00134     gridLayout->setRowStretch( 4, 10 );
00135 
00136     d->m_font_family_list = new QListBox( this, "FontListBox" );
00137     gridLayout->addMultiCellWidget( d->m_font_family_list, 0, 4, 0, 0 );
00138     connect( d->m_font_family_list, SIGNAL( highlighted(int) ), this, SLOT( fontFamilyClicked(int) ) );
00139 
00140     QLabel *label = new QLabel( tr( "Style" ), this );
00141     gridLayout->addWidget( label, 0, 1 );
00142 
00143     d->m_font_style_list = new QComboBox( this, "StyleListBox" );
00144     connect( d->m_font_style_list, SIGNAL(  activated(int) ), this, SLOT( fontStyleClicked(int) ) );
00145     gridLayout->addWidget( d->m_font_style_list, 1, 1 );
00146 
00147     label = new QLabel( tr( "Size" ), this );
00148     gridLayout->addWidget( label, 2, 1 );
00149 
00150     d->m_font_size_list = new QComboBox( this, "SizeListBox" );
00151     connect( d->m_font_size_list, SIGNAL(  activated(int) ),
00152              this, SLOT( fontSizeClicked(int) ) );
00153     gridLayout->addWidget( d->m_font_size_list, 3, 1 );
00154 
00155     d->m_pointbug = ( qt_version() == 232 || qt_version() == 233 ); // SharpROM uses 2.3.2
00156 
00157     if ( withpreview )
00158     {
00159         d->m_preview = new QMultiLineEdit ( this, "Preview" );
00160         d->m_preview->setAlignment ( AlignCenter );
00161         d->m_preview->setWordWrap ( QMultiLineEdit::WidgetWidth );
00162         d->m_preview->setMargin ( 3 );
00163         d->m_preview->setText ( tr( "The Quick Brown Fox Jumps Over The Lazy Dog" ));
00164         gridLayout->addRowSpacing ( 5, 4 );
00165         gridLayout->addMultiCellWidget ( d->m_preview, 6, 6, 0, 1 );
00166         gridLayout->setRowStretch ( 6, 5 );
00167     }
00168     else
00169         d->m_preview = 0;
00170 
00171     loadFonts ( d->m_font_family_list );
00172 }
00173 
00174 OFontSelector::~OFontSelector()
00175 {
00176     delete d;
00177 }
00178 
00184 bool OFontSelector::setSelectedFont ( const QFont &f )
00185 {
00186     return setSelectedFont ( f. family(), d->m_fdb. styleString ( f ), f. pointSize(), QFont::encodingName ( f. charSet()));
00187 }
00188 
00189 
00197 bool OFontSelector::setSelectedFont( const QString &familyStr, const QString &styleStr, int sizeVal, const QString & charset )
00198 {
00199     Q_CONST_UNUSED( charset )
00200     QString sizeStr = QString::number ( sizeVal );
00201 
00202     QListBoxItem *family = d->m_font_family_list->findItem ( familyStr );
00203     if ( !family )
00204         family = d->m_font_family_list->findItem ( "Helvetica" );
00205     if ( !family )
00206         family = d->m_font_family_list->firstItem();
00207     d->m_font_family_list->setCurrentItem ( family );
00208     fontFamilyClicked ( d->m_font_family_list->index ( family ));
00209 
00210     int style = findItemCB ( d->m_font_style_list, styleStr );
00211     if ( style < 0 )
00212         style = findItemCB ( d->m_font_style_list, "Regular" );
00213     if ( style < 0 && d->m_font_style_list->count() > 0 )
00214         style = 0;
00215     d->m_font_style_list->setCurrentItem ( style );
00216     fontStyleClicked ( style );
00217 
00218     int size = findItemCB ( d->m_font_size_list, sizeStr );
00219     if ( size < 0 )
00220         size = findItemCB ( d->m_font_size_list, "10" );
00221     if ( size < 0 && d->m_font_size_list->count() > 0 )
00222         size = 0;
00223     d->m_font_size_list->setCurrentItem ( size );
00224     fontSizeClicked ( size );
00225 
00226     return (( family ) && ( style >= 0 ) && ( size >= 0 ));
00227 }
00228 
00237 bool OFontSelector::selectedFont ( QString &family, QString &style, int &size )
00238 {
00239     QString dummy;
00240     return selectedFont ( family, style, size, dummy );
00241 }
00242 
00243 
00249 QString OFontSelector::fontFamily() const
00250 {
00251     FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem());
00252 
00253     return fli ? fli->family() : QString::null;
00254 }
00255 
00260 QString OFontSelector::fontStyle() const
00261 {
00262     FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem());
00263     int fst = d->m_font_style_list->currentItem();
00264 
00265     return ( fli && fst >= 0 ) ? fli->styles() [fst] : QString::null;
00266 }
00267 
00271 int OFontSelector::fontSize() const
00272 {
00273     FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem());
00274     int fsi = d->m_font_size_list->currentItem();
00275 
00276     return ( fli && fsi >= 0 ) ? fli->sizes() [fsi] : 10;
00277 }
00278 
00282 QString OFontSelector::fontCharSet() const
00283 {
00284     FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem());
00285 
00286     return fli ? d->m_fdb. charSets ( fli->family()) [0] : QString::null;
00287 }
00288 
00293 bool OFontSelector::selectedFont ( QString &family, QString &style, int &size, QString &charset )
00294 {
00295     int ffa = d->m_font_family_list->currentItem();
00296     int fst = d->m_font_style_list->currentItem();
00297     int fsi = d->m_font_size_list->currentItem();
00298 
00299     FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( ffa );
00300 
00301     if ( fli )
00302     {
00303         family = fli->family();
00304         style = fst >= 0 ? fli->styles() [fst] : QString::null;
00305         size = fsi >= 0 ? fli->sizes() [fsi] : 10;
00306         charset = d->m_fdb. charSets ( fli->family()) [0];
00307 
00308         return true;
00309     }
00310     else
00311         return false;
00312 }
00313 
00314 void OFontSelector::loadFonts ( QListBox *list )
00315 {
00316     QStringList f = d->m_fdb. families();
00317 
00318     for ( QStringList::ConstIterator it = f. begin(); it != f. end(); ++it )
00319     {
00320         QValueList <int> ps = d->m_fdb. pointSizes ( *it );
00321 
00322         if ( d->m_pointbug )
00323         {
00324             for ( QValueList <int>::Iterator it = ps. begin(); it != ps. end(); it++ )
00325                 *it /= 10;
00326         }
00327 
00328         list->insertItem ( new FontListItem ( *it, d->m_fdb. styles ( *it ), ps ));
00329     }
00330 }
00331 
00332 void OFontSelector::fontFamilyClicked ( int index )
00333 {
00334     QString oldstyle = d->m_font_style_list->currentText();
00335     QString oldsize  = d->m_font_size_list->currentText();
00336 
00337     FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( index );
00338 
00339     d->m_font_style_list->clear();
00340     d->m_font_style_list->insertStringList ( fli->styles());
00341     d->m_font_style_list->setEnabled ( !fli->styles(). isEmpty());
00342 
00343     int i;
00344 
00345     i = findItemCB ( d->m_font_style_list, oldstyle );
00346     if ( i < 0 )
00347         i = findItemCB ( d->m_font_style_list, "Regular" );
00348     if (( i < 0 ) && ( d->m_font_style_list->count() > 0 ))
00349         i = 0;
00350 
00351     if ( i >= 0 )
00352     {
00353         d->m_font_style_list->setCurrentItem ( i );
00354         fontStyleClicked ( i );
00355     }
00356 
00357     d->m_font_size_list->clear();
00358     QValueList<int> sl = fli->sizes();
00359 
00360     for ( QValueList<int>::Iterator it = sl. begin(); it != sl. end(); ++it )
00361         d->m_font_size_list->insertItem ( QString::number ( *it ));
00362 
00363     i = findItemCB ( d->m_font_size_list, oldsize );
00364     if ( i < 0 )
00365         i = findItemCB ( d->m_font_size_list, "10" );
00366     if (( i < 0 ) && ( d->m_font_size_list->count() > 0 ))
00367         i = 0;
00368 
00369     if ( i >= 0 )
00370     {
00371         d->m_font_size_list->setCurrentItem ( i );
00372         fontSizeClicked ( i );
00373     }
00374     changeFont();
00375 }
00376 
00377 void OFontSelector::fontStyleClicked ( int /*index*/ )
00378 {
00379     changeFont();
00380 }
00381 
00382 void OFontSelector::fontSizeClicked ( int /*index*/ )
00383 {
00384     changeFont();
00385 }
00386 
00387 void OFontSelector::changeFont()
00388 {
00389     QFont f = selectedFont();
00390 
00391     if ( d->m_preview )
00392         d->m_preview->setFont ( f );
00393 
00394     emit fontSelected ( f );
00395 }
00396 
00400 QFont OFontSelector::selectedFont()
00401 {
00402     int ffa = d->m_font_family_list->currentItem();
00403     int fst = d->m_font_style_list->currentItem();
00404     int fsi = d->m_font_size_list->currentItem();
00405 
00406     FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( ffa );
00407 
00408     if ( fli )
00409     {
00410         return d->m_fdb. font ( fli->family(), \
00411                                  fst >= 0 ? fli->styles() [fst] : QString::null, \
00412                                  fsi >= 0 ? fli->sizes() [fsi] : 10, \
00413                                  d->m_fdb. charSets ( fli->family()) [0] );
00414     }
00415     else
00416         return QFont();
00417 }
00418 
00419 void OFontSelector::resizeEvent ( QResizeEvent *re )
00420 {
00421     if ( d->m_preview )
00422     {
00423         d->m_preview->setMinimumHeight ( 1 );
00424         d->m_preview->setMaximumHeight ( 32767 );
00425     }
00426 
00427     QWidget::resizeEvent ( re );
00428 
00429     if ( d->m_preview )
00430         d->m_preview->setFixedHeight ( d->m_preview->height());
00431 
00432 }
00433 

Generated on Sat Nov 5 16:16:25 2005 for OPIE by  doxygen 1.4.2