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 <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
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 )
00358 {
00359 changeFont ( );
00360 }
00361
00362 void OFontSelector::fontSizeClicked ( int )
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 }