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
00030
00031 #include <opie2/ofontselector.h>
00032 #include <qpe/fontdatabase.h>
00033
00034
00035 #include <qlayout.h>
00036 #include <qlistbox.h>
00037 #include <qcombobox.h>
00038 #include <qlabel.h>
00039 #include <qmultilineedit.h>
00040
00041
00042
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
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 );
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 )
00378 {
00379 changeFont();
00380 }
00381
00382 void OFontSelector::fontSizeClicked ( int )
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