libopie API Documentation

ofontselector.cpp

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