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              .=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 <qmultilineedit.h>
00034 
00035 #include <qpe/fontdatabase.h>
00036 
00037 #include "ofontselector.h"
00038 
00039 class OFontSelectorPrivate {
00040 public:
00041         QListBox *      m_font_family_list;
00042         QComboBox *     m_font_style_list;
00043         QComboBox *     m_font_size_list;
00044         QMultiLineEdit *m_preview;
00045 
00046         bool            m_pointbug : 1;
00047 
00048         FontDatabase    m_fdb;
00049 };
00050 
00051 namespace {
00052 
00053 class FontListItem : public QListBoxText {
00054 public:
00055         FontListItem ( const QString &t, const QStringList &styles, const QValueList<int> &sizes ) : QListBoxText ( )
00056         {
00057                 m_name = t;
00058                 m_styles = styles;
00059                 m_sizes = sizes;
00060 
00061                 QString str = t;
00062                 str [0] = str [0]. upper ( );
00063                 setText ( str );
00064         }
00065 
00066         QString family ( ) const
00067         {
00068                 return m_name;
00069         }
00070 
00071         const QStringList &styles ( ) const
00072         {
00073                 return m_styles;
00074         }
00075 
00076         const QValueList<int> &sizes ( ) const
00077         {
00078                 return m_sizes;
00079         }
00080 
00081 private:
00082         QStringList m_styles;
00083         QValueList<int> m_sizes;
00084         QString m_name;
00085 };
00086 
00087 
00088 static int findItemCB ( QComboBox *box, const QString &str )
00089 {
00090         for ( int i = 0; i < box-> count ( ); i++ ) {
00091                 if ( box-> text ( i ) == str )
00092                         return i;
00093         }
00094         return -1;
00095 }
00096 
00097 }
00098 /* static same as anon. namespace */
00099 static int qt_version ( )
00100 {
00101         const char *qver = qVersion ( );
00102 
00103         return ( qver [0] - '0' ) * 100 + ( qver [2] - '0' ) * 10 + ( qver [4] - '0' );
00104 }
00105 
00113 OFontSelector::OFontSelector ( bool withpreview, QWidget *parent, const char *name, WFlags fl ) : QWidget ( parent, name, fl )
00114 {
00115         d = new OFontSelectorPrivate ( );
00116 
00117         QGridLayout *gridLayout = new QGridLayout ( this, 0, 0, 4, 4 );
00118         gridLayout->setRowStretch ( 4, 10 );
00119 
00120         d-> m_font_family_list = new QListBox( this, "FontListBox" );
00121         gridLayout->addMultiCellWidget( d-> m_font_family_list, 0, 4, 0, 0 );
00122         connect( d-> m_font_family_list, SIGNAL( highlighted(int) ), this, SLOT( fontFamilyClicked(int) ) );
00123 
00124         QLabel *label = new QLabel( tr( "Style" ), this );
00125         gridLayout->addWidget( label, 0, 1 );
00126 
00127         d-> m_font_style_list = new QComboBox( this, "StyleListBox" );
00128         connect( d-> m_font_style_list, SIGNAL(  activated(int) ), this, SLOT( fontStyleClicked(int) ) );
00129         gridLayout->addWidget( d-> m_font_style_list, 1, 1 );
00130 
00131         label = new QLabel( tr( "Size" ), this );
00132         gridLayout->addWidget( label, 2, 1 );
00133 
00134         d-> m_font_size_list = new QComboBox( this, "SizeListBox" );
00135         connect( d-> m_font_size_list, SIGNAL(  activated(int) ),
00136                          this, SLOT( fontSizeClicked(int) ) );
00137         gridLayout->addWidget( d-> m_font_size_list, 3, 1 );
00138 
00139         d-> m_pointbug = ( qt_version ( ) <= 233 );
00140 
00141         if ( withpreview ) {
00142                 d-> m_preview = new QMultiLineEdit ( this, "Preview" );
00143                 d-> m_preview-> setAlignment ( AlignCenter );
00144                 d-> m_preview-> setWordWrap ( QMultiLineEdit::WidgetWidth );
00145                 d-> m_preview-> setMargin ( 3 );
00146                 d-> m_preview-> setText ( tr( "The Quick Brown Fox Jumps Over The Lazy Dog" ));
00147                 gridLayout-> addRowSpacing ( 5, 4 );
00148                 gridLayout-> addMultiCellWidget ( d-> m_preview, 6, 6, 0, 1 );
00149                 gridLayout-> setRowStretch ( 6, 5 );
00150         }
00151         else
00152                 d-> m_preview = 0;
00153 
00154         loadFonts ( d-> m_font_family_list );
00155 }
00156 
00157 OFontSelector::~OFontSelector ( )
00158 {
00159         delete d;
00160 }
00161 
00167 bool OFontSelector::setSelectedFont ( const QFont &f )
00168 {
00169         return setSelectedFont ( f. family ( ), d-> m_fdb. styleString ( f ), f. pointSize ( ), QFont::encodingName ( f. charSet ( )));
00170 }
00171 
00172 
00180 bool OFontSelector::setSelectedFont ( const QString &familyStr, const QString &styleStr, int sizeVal, const QString & charset )
00181 {
00182         QString sizeStr = QString::number ( sizeVal );
00183 
00184         QListBoxItem *family = d-> m_font_family_list-> findItem ( familyStr );
00185         if ( !family )
00186                 family = d-> m_font_family_list-> findItem ( "Helvetica" );
00187         if ( !family )
00188                 family = d-> m_font_family_list-> firstItem ( );
00189          d-> m_font_family_list-> setCurrentItem ( family );
00190         fontFamilyClicked ( d-> m_font_family_list-> index ( family ));
00191 
00192         int style = findItemCB ( d-> m_font_style_list, styleStr );
00193         if ( style < 0 )
00194                 style = findItemCB ( d-> m_font_style_list, "Regular" );
00195         if ( style < 0 && d-> m_font_style_list-> count ( ) > 0 )
00196                 style = 0;
00197         d-> m_font_style_list-> setCurrentItem ( style );
00198         fontStyleClicked ( style );
00199 
00200         int size = findItemCB ( d-> m_font_size_list, sizeStr );
00201         if ( size < 0 )
00202                 size = findItemCB ( d-> m_font_size_list, "10" );
00203         if ( size < 0 && d-> m_font_size_list-> count ( ) > 0 )
00204                 size = 0;
00205         d-> m_font_size_list-> setCurrentItem ( size );
00206         fontSizeClicked ( size );
00207 
00208         return (( family ) && ( style >= 0 ) && ( size >= 0 ));
00209 }
00210 
00219 bool OFontSelector::selectedFont ( QString &family, QString &style, int &size )
00220 {
00221         QString dummy;
00222         return selectedFont ( family, style, size, dummy );
00223 }
00224 
00225 
00231 QString OFontSelector::fontFamily ( ) const
00232 {
00233         FontListItem *fli = (FontListItem *) d-> m_font_family_list-> item ( d-> m_font_family_list-> currentItem ( ));
00234 
00235         return fli ? fli-> family ( ) : QString::null;
00236 }
00237 
00242 QString OFontSelector::fontStyle ( ) const
00243 {
00244         FontListItem *fli = (FontListItem *) d-> m_font_family_list-> item ( d-> m_font_family_list-> currentItem ( ));
00245         int fst = d-> m_font_style_list-> currentItem ( );
00246 
00247         return ( fli && fst >= 0 ) ? fli-> styles ( ) [fst] : QString::null;
00248 }
00249 
00253 int OFontSelector::fontSize ( ) const
00254 {
00255         FontListItem *fli = (FontListItem *) d-> m_font_family_list-> item ( d-> m_font_family_list-> currentItem ( ));
00256         int fsi = d-> m_font_size_list-> currentItem ( );
00257 
00258         return ( fli && fsi >= 0 ) ? fli-> sizes ( ) [fsi] : 10;
00259 }
00260 
00264 QString OFontSelector::fontCharSet ( ) const
00265 {
00266         FontListItem *fli = (FontListItem *) d-> m_font_family_list-> item ( d-> m_font_family_list-> currentItem ( ));
00267 
00268         return fli ? d-> m_fdb. charSets ( fli-> family ( )) [0] : QString::null;
00269 }
00270 
00275 bool OFontSelector::selectedFont ( QString &family, QString &style, int &size, QString &charset )
00276 {
00277         int ffa = d-> m_font_family_list-> currentItem ( );
00278         int fst = d-> m_font_style_list-> currentItem ( );
00279         int fsi = d-> m_font_size_list-> currentItem ( );
00280 
00281         FontListItem *fli = (FontListItem *) d-> m_font_family_list-> item ( ffa );
00282 
00283         if ( fli ) {
00284                 family = fli-> family ( );
00285                 style = fst >= 0 ? fli-> styles ( ) [fst] : QString::null;
00286                 size = fsi >= 0 ? fli-> sizes ( ) [fsi] : 10;
00287                 charset = d-> m_fdb. charSets ( fli-> family ( )) [0];
00288 
00289                 return true;
00290         }
00291         else
00292                 return false;
00293 }
00294 
00295 
00296 
00297 
00298 void OFontSelector::loadFonts ( QListBox *list )
00299 {
00300         QStringList f = d-> m_fdb. families ( );
00301 
00302         for ( QStringList::ConstIterator it = f. begin ( ); it != f. end ( ); ++it ) {
00303                 QValueList <int> ps = d-> m_fdb. pointSizes ( *it );
00304 
00305                 if ( d-> m_pointbug ) {
00306                         for ( QValueList <int>::Iterator it = ps. begin ( ); it != ps. end ( ); it++ )
00307                                 *it /= 10;
00308                 }
00309 
00310                 list-> insertItem ( new FontListItem ( *it, d-> m_fdb. styles ( *it ), ps ));
00311         }
00312 }
00313 
00314 void OFontSelector::fontFamilyClicked ( int index )
00315 {
00316         QString oldstyle = d-> m_font_style_list-> currentText ( );
00317         QString oldsize  = d-> m_font_size_list-> currentText ( );
00318 
00319         FontListItem *fli = (FontListItem *) d-> m_font_family_list-> item ( index );
00320 
00321         d-> m_font_style_list-> clear ( );
00322         d-> m_font_style_list-> insertStringList ( fli-> styles ( ));
00323         d-> m_font_style_list-> setEnabled ( !fli-> styles ( ). isEmpty ( ));
00324 
00325         int i;
00326 
00327         i = findItemCB ( d-> m_font_style_list, oldstyle );
00328         if ( i < 0 )
00329                 i = findItemCB ( d-> m_font_style_list, "Regular" );
00330         if (( i < 0 ) && ( d-> m_font_style_list-> count ( ) > 0 ))
00331                 i = 0;
00332 
00333         if ( i >= 0 ) {
00334                 d-> m_font_style_list-> setCurrentItem ( i );
00335                 fontStyleClicked ( i );
00336         }
00337 
00338         d-> m_font_size_list-> clear ( );
00339         QValueList<int> sl = fli-> sizes ( );
00340 
00341         for ( QValueList<int>::Iterator it = sl. begin ( ); it != sl. end ( ); ++it )
00342                 d-> m_font_size_list-> insertItem ( QString::number ( *it ));
00343 
00344         i = findItemCB ( d-> m_font_size_list, oldsize );
00345         if ( i < 0 )
00346                 i = findItemCB ( d-> m_font_size_list, "10" );
00347         if (( i < 0 ) && ( d-> m_font_size_list-> count ( ) > 0 ))
00348                 i = 0;
00349 
00350         if ( i >= 0 ) {
00351                 d-> m_font_size_list-> setCurrentItem ( i );
00352                 fontSizeClicked ( i );
00353         }
00354         changeFont ( );
00355 }
00356 
00357 void OFontSelector::fontStyleClicked ( int /*index*/ )
00358 {
00359         changeFont ( );
00360 }
00361 
00362 void OFontSelector::fontSizeClicked ( int /*index*/ )
00363 {
00364         changeFont ( );
00365 }
00366 
00367 void OFontSelector::changeFont ( )
00368 {
00369         QFont f = selectedFont ( );
00370 
00371         if ( d-> m_preview )
00372                 d-> m_preview-> setFont ( f );
00373 
00374         emit fontSelected ( f );
00375 }
00376 
00380 QFont OFontSelector::selectedFont ( )
00381 {
00382         int ffa = d-> m_font_family_list-> currentItem ( );
00383         int fst = d-> m_font_style_list-> currentItem ( );
00384         int fsi = d-> m_font_size_list-> currentItem ( );
00385 
00386         FontListItem *fli = (FontListItem *) d-> m_font_family_list-> item ( ffa );
00387 
00388         if ( fli ) {
00389                 return d-> m_fdb. font ( fli-> family ( ), \
00390                                          fst >= 0 ? fli-> styles ( ) [fst] : QString::null, \
00391                                          fsi >= 0 ? fli-> sizes ( ) [fsi] : 10, \
00392                                          d-> m_fdb. charSets ( fli-> family ( )) [0] );
00393         }
00394         else
00395                 return QFont ( );
00396 }
00397 
00398 
00399 void OFontSelector::resizeEvent ( QResizeEvent *re )
00400 {
00401         if ( d-> m_preview ) {
00402                 d-> m_preview-> setMinimumHeight ( 1 );
00403                 d-> m_preview-> setMaximumHeight ( 32767 );
00404         }
00405 
00406         QWidget::resizeEvent ( re );
00407 
00408         if ( d-> m_preview )
00409                 d-> m_preview-> setFixedHeight ( d-> m_preview-> height ( ));
00410 
00411 }

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