00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
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 )
00359 {
00360 changeFont ( );
00361 }
00362
00363 void OFontSelector::fontSizeClicked ( int )
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 }