lib Library API Documentation

koFontDia.cc

00001 /* This file is part of the KDE project
00002    Copyright (C)  2001, 2002 Montel Laurent <lmontel@mandrakesoft.com>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017    Boston, MA 02111-1307, USA.
00018 */
00019 
00020 #include "koFontDia_p.h"
00021 #include "koFontDia.h"
00022 #include "korichtext.h"
00023 
00024 #include <kcolordialog.h>
00025 #include <klocale.h>
00026 #include <kdebug.h>
00027 
00028 #include <qgroupbox.h>
00029 #include <qpushbutton.h>
00030 #include <qtabwidget.h>
00031 #include <qlabel.h>
00032 #include <qcombobox.h>
00033 #include <qradiobutton.h>
00034 #include <qcheckbox.h>
00035 #include <knuminput.h>
00036 #include <koGlobal.h>
00037 #include <qvgroupbox.h>
00038 #include <qvbox.h>
00039 #include <qhgroupbox.h>
00040 #include <qhbuttongroup.h>
00041 #include <kcolorbutton.h>
00042 #include <kiconloader.h>
00043 
00044 KoShadowPreview::KoShadowPreview( QWidget* parent, const char* name )
00045     : QFrame( parent, name )
00046 {
00047     setFrameStyle( WinPanel | Sunken );
00048     setBackgroundColor( white );
00049 }
00050 
00051 void KoShadowPreview::drawContents( QPainter* painter )
00052 {
00053     QFont font(KoGlobal::defaultFont().family(), 30, QFont::Bold);
00054     QFontMetrics fm( font );
00055 
00056     QString text = "KOffice"; // i18n?
00057     QRect br = fm.boundingRect( text );
00058     int x = ( width() - br.width() ) / 2;
00059     int y = ( height() - br.height() ) / 2 + br.height();
00060     painter->save();
00061 
00062     int sx = x + qRound(shadowDistanceX);
00063     int sy = y + qRound(shadowDistanceY);
00064 
00065     painter->setFont( font );
00066     painter->setPen( shadowColor );
00067     painter->drawText( sx, sy, text );
00068 
00069     painter->setPen( blue );
00070     painter->drawText( x, y, text );
00071 
00072     painter->restore();
00073 }
00074 
00075 KoTextShadowWidget::KoTextShadowWidget( QWidget * parent, const char * name )
00076   : QWidget( parent, name )
00077 {
00078     QGridLayout *grid = new QGridLayout( this, 8, 2, KDialog::marginHint(), KDialog::spacingHint() );
00079 
00080     QGroupBox *shadowBox = new QGroupBox( i18n( "Shadow" ), this, "shadow" );
00081     grid->addMultiCellWidget( shadowBox, 0, 3,0,0 );
00082 
00083     QGridLayout *grid2 = new QGridLayout( shadowBox, 4, 2, 2*KDialog::marginHint(), 2*KDialog::spacingHint() );
00084 
00085     QLabel *lcolor = new QLabel( i18n( "Co&lor:" ), shadowBox );
00086     grid2->addWidget(lcolor,0,0);
00087     color = new KColorButton( black,
00088                               black,
00089                               shadowBox );
00090     lcolor->setBuddy( color );
00091     grid2->addWidget(color,1,0);
00092     connect( color, SIGNAL( changed( const QColor& ) ), this, SLOT( colorChanged( const QColor& ) ) );
00093 
00094     QLabel *ldistance = new QLabel( i18n( "&Distance (pt):" ), shadowBox );
00095     grid2->addWidget(ldistance,2,0);
00096 
00097     distance = new QSpinBox( 0, 20, 1, shadowBox );
00098     distance->setSuffix(i18n("pt"));
00099     ldistance->setBuddy( distance );
00100     connect( distance, SIGNAL( valueChanged( int ) ), this, SLOT( distanceChanged( int ) ) );
00101     grid2->addWidget(distance,3,0);
00102 
00103     QLabel *ldirection = new QLabel( i18n( "Di&rection:" ), shadowBox );
00104     grid2->addWidget(ldirection,0,1);
00105 
00106     QGridLayout *grid3 = new QGridLayout( 0L, 3, 3, KDialog::marginHint(), KDialog::spacingHint() );
00107 
00108     lu = new QPushButton( shadowBox );
00109     grid3->addWidget(lu,0,0);
00110     lu->setToggleButton( true );
00111         ldirection->setBuddy( lu );
00112     u = new QPushButton( shadowBox );
00113     grid3->addWidget(u,0,1);
00114     u->setToggleButton( true );
00115     ru = new QPushButton( shadowBox );
00116     grid3->addWidget(ru,0,2);
00117     ru->setToggleButton( true );
00118     r = new QPushButton( shadowBox );
00119     grid3->addWidget(r,1,2);
00120     r->setToggleButton( true );
00121     rb = new QPushButton( shadowBox );
00122     grid3->addWidget(rb,2,2);
00123     rb->setToggleButton( true );
00124     b = new QPushButton( shadowBox );
00125     grid3->addWidget(b,2,1);
00126     b->setToggleButton( true );
00127     lb = new QPushButton( shadowBox );
00128     grid3->addWidget(lb,2,0);
00129     lb->setToggleButton( true );
00130     l = new QPushButton( shadowBox );
00131     grid3->addWidget(l,1,0);
00132     l->setToggleButton( true );
00133 
00134     lu->setPixmap( BarIcon( "shadowLU" ) );
00135     u->setPixmap( BarIcon( "shadowU" ) );
00136     ru->setPixmap( BarIcon( "shadowRU" ) );
00137     r->setPixmap( BarIcon( "shadowR" ) );
00138     rb->setPixmap( BarIcon( "shadowRB" ) );
00139     b->setPixmap( BarIcon( "shadowB" ) );
00140     lb->setPixmap( BarIcon( "shadowLB" ) );
00141     l->setPixmap( BarIcon( "shadowL" ) );
00142 
00143     connect( lu, SIGNAL( clicked() ), this, SLOT( luChanged() ) );
00144     connect( u, SIGNAL( clicked() ), this, SLOT( uChanged() ) );
00145     connect( ru, SIGNAL( clicked() ), this, SLOT( ruChanged() ) );
00146     connect( r, SIGNAL( clicked() ), this, SLOT( rChanged() ) );
00147     connect( rb, SIGNAL( clicked() ), this, SLOT( rbChanged() ) );
00148     connect( b, SIGNAL( clicked() ), this, SLOT( bChanged() ) );
00149     connect( lb, SIGNAL( clicked() ), this, SLOT( lbChanged() ) );
00150     connect( l, SIGNAL( clicked() ), this, SLOT( lChanged() ) );
00151 
00152 
00153     grid2->addMultiCellLayout (grid3, 1,3, 1, 1 );
00154 
00155     m_shadowPreview = new KoShadowPreview( this, "preview" );
00156     grid->addMultiCellWidget( m_shadowPreview, 0, 3, 1, 1 );
00157 }
00158 
00159 void KoTextShadowWidget::setShadowDirection( short int sd )
00160 {
00161     m_shadowDirection = sd;
00162     m_shadowPreview->setShadowDistanceX( shadowDistanceX() );
00163     m_shadowPreview->setShadowDistanceY( shadowDistanceY() );
00164 
00165     lu->setOn( false );
00166     u->setOn( false );
00167     ru->setOn( false );
00168     r->setOn( false );
00169     rb->setOn( false );
00170     b->setOn( false );
00171     lb->setOn( false );
00172     l->setOn( false );
00173 
00174     switch ( m_shadowDirection )
00175     {
00176     case SD_LEFT_UP:
00177         lu->setOn( true );
00178         break;
00179     case SD_UP:
00180         u->setOn( true );
00181         break;
00182     case SD_RIGHT_UP:
00183         ru->setOn( true );
00184         break;
00185     case SD_RIGHT:
00186         r->setOn( true );
00187         break;
00188     case SD_RIGHT_BOTTOM:
00189         rb->setOn( true );
00190         break;
00191     case SD_BOTTOM:
00192         b->setOn( true );
00193         break;
00194     case SD_LEFT_BOTTOM:
00195         lb->setOn( true );
00196         break;
00197     case SD_LEFT:
00198         l->setOn( true );
00199         break;
00200     }
00201 }
00202 
00203 void KoTextShadowWidget::setShadow( double shadowDistanceX, double shadowDistanceY, const QColor& shadowColor )
00204 {
00205     // Figure out shadow direction from x and y distance
00206     // Ugly temporary code
00207     m_shadowDirection = SD_RIGHT_BOTTOM;
00208     if ( shadowDistanceX > 0 ) // right
00209         if ( shadowDistanceY == 0 )
00210             m_shadowDirection = SD_RIGHT;
00211         else
00212             m_shadowDirection = shadowDistanceY > 0 ? SD_RIGHT_BOTTOM : SD_RIGHT_UP;
00213     else if ( shadowDistanceX == 0 ) // top/bottom
00214             m_shadowDirection = shadowDistanceY > 0 ? SD_BOTTOM : SD_UP;
00215     else // left
00216         if ( shadowDistanceY == 0 )
00217             m_shadowDirection = SD_LEFT;
00218         else
00219             m_shadowDirection = shadowDistanceY > 0 ? SD_LEFT_BOTTOM : SD_LEFT_UP;
00220 
00221     m_shadowDistance = QMAX( QABS(shadowDistanceX), QABS(shadowDistanceY) );
00222     m_shadowPreview->setShadowDistanceX( shadowDistanceX );
00223     m_shadowPreview->setShadowDistanceY( shadowDistanceY );
00224     // TODO turn distance into a KDoubleNumInput
00225     distance->setValue( (int)m_shadowDistance );
00226 
00227     m_shadowColor = shadowColor;
00228     m_shadowPreview->setShadowColor( m_shadowColor );
00229     color->setColor( m_shadowColor.isValid() ? m_shadowColor: gray  );
00230 }
00231 
00232 void KoTextShadowWidget::luChanged()
00233 {
00234     setShadowDirection( SD_LEFT_UP );
00235 }
00236 
00237 void KoTextShadowWidget::uChanged()
00238 {
00239     setShadowDirection( SD_UP );
00240 }
00241 
00242 void KoTextShadowWidget::ruChanged()
00243 {
00244     setShadowDirection( SD_RIGHT_UP );
00245 }
00246 
00247 void KoTextShadowWidget::rChanged()
00248 {
00249     setShadowDirection( SD_RIGHT );
00250 }
00251 
00252 void KoTextShadowWidget::rbChanged()
00253 {
00254     setShadowDirection( SD_RIGHT_BOTTOM );
00255 }
00256 
00257 void KoTextShadowWidget::bChanged()
00258 {
00259     setShadowDirection( SD_BOTTOM );
00260 }
00261 
00262 void KoTextShadowWidget::lbChanged()
00263 {
00264     setShadowDirection( SD_LEFT_BOTTOM );
00265 }
00266 
00267 void KoTextShadowWidget::lChanged()
00268 {
00269     setShadowDirection( SD_LEFT );
00270 }
00271 
00272 void KoTextShadowWidget::colorChanged( const QColor& col )
00273 {
00274     m_shadowColor = col;
00275     m_shadowPreview->setShadowColor( col );
00276     emit changed();
00277 }
00278 
00279 void KoTextShadowWidget::distanceChanged( int _val )
00280 {
00281     m_shadowDistance = _val;
00282     m_shadowPreview->setShadowDistanceX( shadowDistanceX() );
00283     m_shadowPreview->setShadowDistanceY( shadowDistanceY() );
00284     emit changed();
00285 }
00286 
00287 QString KoTextShadowWidget::tabName() {
00288     return i18n( "S&hadow" );
00289 }
00290 
00291 double KoTextShadowWidget::shadowDistanceX() const
00292 {
00293     switch ( m_shadowDirection )
00294     {
00295     case SD_LEFT_BOTTOM:
00296     case SD_LEFT:
00297     case SD_LEFT_UP:
00298         return - m_shadowDistance;
00299     case SD_UP:
00300     case SD_BOTTOM:
00301         return 0;
00302     case SD_RIGHT_UP:
00303     case SD_RIGHT:
00304     case SD_RIGHT_BOTTOM:
00305         return m_shadowDistance;
00306     }
00307     return 0;
00308 }
00309 
00310 double KoTextShadowWidget::shadowDistanceY() const
00311 {
00312     switch ( m_shadowDirection )
00313     {
00314     case SD_LEFT_UP:
00315     case SD_UP:
00316     case SD_RIGHT_UP:
00317         return - m_shadowDistance;
00318     case SD_LEFT:
00319     case SD_RIGHT:
00320         return 0;
00321     case SD_LEFT_BOTTOM:
00322     case SD_BOTTOM:
00323     case SD_RIGHT_BOTTOM:
00324         return m_shadowDistance;
00325     }
00326     return 0;
00327 }
00328 
00329 class KoFontChooser::KoFontChooserPrivate
00330 {
00331 public:
00332     QComboBox *m_strikeOut;
00333     QColor m_textColor;
00334     KoTextShadowWidget *m_shadowWidget;
00335     KIntNumInput *m_relativeSize;
00336     QLabel *m_lRelativeSize;
00337     KIntNumInput *m_offsetBaseLine;
00338     QCheckBox *m_wordByWord;
00339 #ifdef ATTRCOMBO
00340     QComboBox *m_fontAttribute;
00341 #else
00342     QButtonGroup* m_fontAttribute;
00343 #endif
00344     QComboBox *m_language;
00345     QCheckBox *m_hyphenation;
00346 };
00347 
00348 KoFontChooser::KoFontChooser( QWidget* parent, const char* name, bool _withSubSuperScript, uint fontListCriteria)
00349     : QTabWidget( parent, name )
00350 {
00351     d = new KoFontChooserPrivate;
00352     setupTab1(_withSubSuperScript, fontListCriteria );
00353     setupTab2();
00354     // More modular solution: one widget per tab....
00355     d->m_shadowWidget = new KoTextShadowWidget( this );
00356     connect( d->m_shadowWidget, SIGNAL(changed()), this, SLOT(slotShadowChanged()) );
00357     addTab( d->m_shadowWidget, d->m_shadowWidget->tabName() );
00358     m_changedFlags = 0;
00359 }
00360 
00361 KoFontChooser::~KoFontChooser()
00362 {
00363     delete d; d = 0;
00364 }
00365 
00366 QColor KoFontChooser::color() const
00367 {
00368     return d->m_textColor;
00369 }
00370 
00371 void KoFontChooser::setupTab1(bool _withSubSuperScript, uint fontListCriteria )
00372 {
00373     QWidget *page = new QWidget( this );
00374     addTab( page, i18n( "&Fonts" ) );
00375     QVBoxLayout *lay1 = new QVBoxLayout( page, KDialog::marginHint(), KDialog::spacingHint() );
00376     QStringList list;
00377     KFontChooser::getFontList(list,fontListCriteria);
00378     m_chooseFont = new KFontChooser(page, "FontList", false, list);
00379     lay1->addWidget(m_chooseFont);
00380 
00381     QVGroupBox *grp = new QVGroupBox(i18n("Position"), page);
00382     lay1->addWidget(grp);
00383     QWidget* grpBox = new QWidget( grp ); // container for the grid - laid out inside the QVGroupBox
00384     QGridLayout *grid = new QGridLayout( grpBox, 2, 3, 0, KDialog::spacingHint() );
00385     grid->setColStretch( 1, 1 ); // better stretch labels than spinboxes.
00386 
00387     // superscript/subscript need to be checkboxes, not radiobuttons.
00388     // otherwise it's not possible to disable both, and there's no room for a 3rd one like 'none'
00389     m_superScript = new QCheckBox(i18n("Su&perscript"),grpBox);
00390     grid->addWidget(m_superScript,0,0);
00391 
00392     m_subScript = new QCheckBox(i18n("Su&bscript"),grpBox);
00393     grid->addWidget(m_subScript,1,0);
00394 
00395     d->m_lRelativeSize = new QLabel ( i18n("Relative &size:"), grpBox);
00396     d->m_lRelativeSize->setAlignment( Qt::AlignRight );
00397     grid->addWidget(d->m_lRelativeSize,0,1);
00398 
00399     // ## How to make this widget smaller? Sounds like the [minimum]sizeHint for KIntNumInput is big...
00400     d->m_relativeSize = new KIntNumInput( grpBox );
00401     d->m_lRelativeSize->setBuddy( d->m_relativeSize );
00402     grid->addWidget(d->m_relativeSize,0,2);
00403 
00404     d->m_relativeSize-> setRange(1, 100, 1,false);
00405     d->m_relativeSize->setSuffix("%");
00406 
00407     QLabel *lab = new QLabel ( i18n("Offse&t from baseline:"), grpBox);
00408     lab->setAlignment( Qt::AlignRight );
00409     grid->addWidget(lab,1,1);
00410 
00411     d->m_offsetBaseLine= new KIntNumInput( grpBox );
00412     lab->setBuddy( d->m_offsetBaseLine );
00413     grid->addWidget(d->m_offsetBaseLine,1,2);
00414 
00415     d->m_offsetBaseLine->setRange(-9, 9, 1,false);
00416     d->m_offsetBaseLine->setSuffix("pt");
00417 
00418     if(!_withSubSuperScript)
00419     {
00420         m_subScript->setEnabled(false);
00421         m_superScript->setEnabled(false);
00422         d->m_relativeSize->setEnabled( false );
00423         d->m_lRelativeSize->setEnabled( false );
00424     }
00425 
00426     QHGroupBox* colorsGrp = new QHGroupBox(i18n("Colors"), page);
00427     lay1->addWidget(colorsGrp);
00428     //grid = new QGridLayout( colorsGrp, 2, 2, KDialog::marginHint(), KDialog::spacingHint() );
00429     m_colorButton = new QPushButton( i18n( "Change Co&lor..." ), colorsGrp );
00430     //grid->addWidget(m_colorButton,0,0);
00431 
00432     m_backGroundColorButton = new QPushButton( i18n( "Change Bac&kground Color..." ), colorsGrp );
00433     //grid->addWidget(m_backGroundColorButton,0,1);
00434 
00435     connect( m_subScript, SIGNAL(clicked()), this, SLOT( slotSubScriptClicked() ) );
00436     connect( m_superScript, SIGNAL(clicked()), this, SLOT( slotSuperScriptClicked() ) );
00437     connect( m_colorButton, SIGNAL(clicked()), this, SLOT( slotChangeColor() ) );
00438 
00439     connect( m_backGroundColorButton,  SIGNAL(clicked()), this, SLOT( slotChangeBackGroundColor() ) );
00440 
00441     connect( m_chooseFont, SIGNAL( fontSelected( const QFont & )),
00442              this, SLOT( slotFontChanged(const QFont &) ) );
00443 
00444     connect( d->m_relativeSize, SIGNAL( valueChanged(int) ), this, SLOT( slotRelativeSizeChanged( int )));
00445     connect( d->m_offsetBaseLine, SIGNAL( valueChanged(int) ), this, SLOT( slotOffsetFromBaseLineChanged( int )));
00446 
00447     updatePositionButton();
00448 
00449 }
00450 
00451 void KoFontChooser::setupTab2()
00452 {
00453     QWidget *page = new QWidget( this );
00454     addTab( page, i18n( "Font &Effects" ) );
00455 
00456     //QVBoxLayout *lay1 = new QVBoxLayout( page, KDialog::marginHint(), KDialog::spacingHint() );
00457     // A single groupbox, without title, looks stupid.
00458     //QGroupBox *grp = new QGroupBox(page);
00459     //lay1->addWidget(grp);
00460     QWidget* grp = page; // just to be able to go back to a groupbox
00461 
00462     QGridLayout *grid = new QGridLayout( grp, 10, 2, KDialog::marginHint(), KDialog::spacingHint() );
00463 
00464     QLabel * lab = new QLabel( i18n("&Underlining:"), grp);
00465     grid->addWidget( lab, 0, 0);
00466 
00467     m_underlining = new QComboBox( grp );
00468     lab->setBuddy( m_underlining );
00469     grid->addWidget( m_underlining, 1, 0);
00470 
00471     m_underlining->insertStringList( KoTextFormat::underlineTypeList() );
00472 
00473     m_underlineType = new QComboBox(grp );
00474     grid->addWidget( m_underlineType, 1, 1);
00475     m_underlineType->insertStringList( KoTextFormat::underlineStyleList() );
00476 
00477 
00478     m_underlineColorButton = new QPushButton( i18n( "Change Co&lor..." ), grp );
00479     grid->addWidget(m_underlineColorButton,1,2);
00480 
00481 
00482     QLabel * lab2 = new QLabel( i18n("&Strikethrough:"), grp);
00483     grid->addWidget( lab2, 2, 0);
00484     d->m_strikeOut = new QComboBox( grp );
00485     lab2->setBuddy( d->m_strikeOut );
00486     grid->addWidget( d->m_strikeOut, 3, 0);
00487     d->m_strikeOut->insertStringList( KoTextFormat::strikeOutTypeList() );
00488 
00489 
00490     m_strikeOutType= new QComboBox(grp );
00491     grid->addWidget( m_strikeOutType, 3, 1);
00492     m_strikeOutType->insertStringList( KoTextFormat::strikeOutStyleList() );
00493 
00494     d->m_wordByWord = new QCheckBox( i18n("&Word by word"), grp);
00495     grid->addWidget( d->m_wordByWord, 5, 0);
00496 
00497 #ifdef ATTRCOMBO
00498     QLabel * lab3 = new QLabel( i18n("A&ttribute:"), grp);
00499     grid->addWidget( lab3, 6, 0);
00500 
00501     d->m_fontAttribute = new QComboBox( grp );
00502     lab3->setBuddy( d->m_fontAttribute );
00503     grid->addWidget( d->m_fontAttribute, 7, 0);
00504 
00505     d->m_fontAttribute->insertStringList( KoTextFormat::fontAttributeList() );
00506     connect( d->m_fontAttribute, SIGNAL( activated( int ) ), this, SLOT( slotChangeAttributeFont( int )));
00507 #else
00508     d->m_fontAttribute = new QHButtonGroup( i18n("Capitalization"), grp );
00509     grid->addMultiCellWidget( d->m_fontAttribute, 6, 6, 0, grid->numCols()-1 );
00510     QStringList fontAttributes = KoTextFormat::fontAttributeList();
00511     for( QStringList::Iterator it = fontAttributes.begin(); it != fontAttributes.end(); ++it ) {
00512         (void) new QRadioButton( *it, d->m_fontAttribute );
00513     }
00514     connect( d->m_fontAttribute,  SIGNAL( clicked( int ) ), this, SLOT( slotChangeAttributeFont( int )));
00515 #endif
00516 
00517     QLabel * lab4 = new QLabel( i18n("La&nguage:"), grp);
00518     grid->addWidget( lab4, 8, 0);
00519 
00520     d->m_language = new QComboBox( grp );
00521     d->m_language->insertStringList( KoGlobal::listOfLanguages() );
00522     lab4->setBuddy( d->m_language );
00523     grid->addWidget( d->m_language, 9, 0 );
00524 
00525     d->m_hyphenation = new QCheckBox( i18n("Auto h&yphenation"), grp );
00526     grid->addWidget( d->m_hyphenation, 10, 0 );
00527 
00528     // Add one row that can stretch
00529     grid->expand( grid->numRows() + 1, grid->numCols() );
00530     grid->setRowStretch( grid->numRows(), 1 );
00531 
00532     connect( d->m_strikeOut, SIGNAL(activated ( int )), this, SLOT( slotStrikeOutTypeChanged( int ) ) );
00533     connect( m_underlineColorButton, SIGNAL(clicked()), this, SLOT( slotUnderlineColor() ) );
00534     connect( m_underlining,  SIGNAL( activated ( int  ) ), this, SLOT( slotChangeUnderlining( int )));
00535     connect( m_strikeOutType,  SIGNAL( activated ( int  ) ), this, SLOT( slotChangeStrikeOutType( int )));
00536     connect( m_underlineType,  SIGNAL( activated ( int  ) ), this, SLOT( slotChangeUnderlineType( int )));
00537     connect( d->m_wordByWord, SIGNAL(clicked()), this, SLOT( slotWordByWordClicked() ) );
00538     connect( d->m_language,  SIGNAL( activated ( int  ) ), this, SLOT( slotChangeLanguage( int )));
00539     connect( d->m_hyphenation, SIGNAL( clicked()), this, SLOT( slotHyphenationClicked()));
00540 }
00541 
00542 void KoFontChooser::updatePositionButton()
00543 {
00544     bool state = (m_superScript->isChecked() || m_subScript->isChecked());
00545     d->m_relativeSize->setEnabled( state );
00546     d->m_lRelativeSize->setEnabled( state );
00547 }
00548 
00549 void KoFontChooser::setLanguage( const QString & _tag)
00550 {
00551     d->m_language->setCurrentItem (KoGlobal::languageIndexFromTag( _tag));
00552 }
00553 
00554 QString KoFontChooser::language() const
00555 {
00556     return KoGlobal::tagOfLanguage( d->m_language->currentText() );
00557 }
00558 
00559 KoTextFormat::AttributeStyle KoFontChooser::fontAttribute()const
00560 {
00561 #ifdef ATTRCOMBO
00562     int currentItem = d->m_fontAttribute->currentItem ();
00563 #else
00564     int currentItem = 0;
00565     for ( int i = 0; i < d->m_fontAttribute->count(); ++i )
00566     {
00567         if ( d->m_fontAttribute->find( i )->isOn() )
00568         {
00569             currentItem = i;
00570             break;
00571         }
00572     }
00573 #endif
00574     switch ( currentItem )
00575     {
00576     case 0:
00577         return KoTextFormat::ATT_NONE;
00578         break;
00579     case 1:
00580         return KoTextFormat::ATT_UPPER;
00581         break;
00582     case 2:
00583         return KoTextFormat::ATT_LOWER;
00584         break;
00585     case 3:
00586         return KoTextFormat::ATT_SMALL_CAPS;
00587         break;
00588     default:
00589         return KoTextFormat::ATT_NONE;
00590     }
00591 }
00592 
00593 void KoFontChooser::setFontAttribute( KoTextFormat::AttributeStyle _att)
00594 {
00595     int currentItem = 0;
00596     if ( _att == KoTextFormat::ATT_NONE)
00597         currentItem = 0;
00598     else if ( _att == KoTextFormat::ATT_UPPER)
00599         currentItem = 1;
00600     else if ( _att == KoTextFormat::ATT_LOWER )
00601         currentItem = 2;
00602     else if ( _att == KoTextFormat::ATT_SMALL_CAPS )
00603         currentItem = 3;
00604 #ifdef ATTRCOMBO
00605     d->m_fontAttribute->setCurrentItem( currentItem );
00606 #else
00607     d->m_fontAttribute->setButton( currentItem );
00608 #endif
00609 }
00610 
00611 bool KoFontChooser::wordByWord()const
00612 {
00613     return d->m_wordByWord->isChecked();
00614 }
00615 
00616 void KoFontChooser::setWordByWord( bool _b)
00617 {
00618     d->m_wordByWord->setChecked( _b);
00619 }
00620 
00621 
00622 double KoFontChooser::relativeTextSize()const
00623 {
00624     return ((double)d->m_relativeSize->value()/100.0);
00625 }
00626 
00627 void KoFontChooser::setRelativeTextSize(double _size)
00628 {
00629     d->m_relativeSize->setValue( (int)(_size * 100) );
00630 }
00631 
00632 int KoFontChooser::offsetFromBaseLine()const
00633 {
00634     return d->m_offsetBaseLine->value();
00635 }
00636 
00637 void KoFontChooser::setOffsetFromBaseLine(int _offset)
00638 {
00639     d->m_offsetBaseLine->setValue( _offset );
00640 }
00641 
00642 void KoFontChooser::setFont( const QFont &_font, bool _subscript, bool _superscript )
00643 {
00644 
00645     m_newFont = _font;
00646     kdDebug()<<" setFont m_newFont.bold() :"<<m_newFont.bold()<<" m_newFont.italic():"<<m_newFont.italic()<<endl;
00647     kdDebug()<<" setfont m_newFont.family() :"<<m_newFont.family()<<endl;
00648 
00649     m_subScript->setChecked( _subscript );
00650     m_superScript->setChecked( _superscript );
00651 
00652     m_chooseFont->setFont( m_newFont );
00653     m_changedFlags = 0;
00654 }
00655 
00656 void KoFontChooser::setColor( const QColor & col )
00657 {
00658     d->m_textColor = col;
00659     if ( col.isValid() )
00660         m_chooseFont->setColor( col );
00661     else
00662         m_chooseFont->setColor( QApplication::palette().color( QPalette::Active, QColorGroup::Text ) );
00663     m_changedFlags = 0;
00664 }
00665 
00666 void KoFontChooser::setUnderlineColor( const QColor & col )
00667 {
00668     m_underlineColor = col;
00669     m_changedFlags = 0;
00670 }
00671 
00672 void KoFontChooser::setBackGroundColor ( const QColor & col )
00673 {
00674     m_backGroundColor = col;
00675     m_changedFlags = 0;
00676 }
00677 
00678 void KoFontChooser::slotFontChanged(const QFont & f)
00679 {
00680     kdDebug()<<" slotFontChanged m_newFont.bold() :"<<f.bold()<<" m_newFont.italic():"<<f.italic()<<endl;
00681     kdDebug()<<" slotFontChanged m_newFont.family() :"<<f.family()<<endl;
00682 
00683     if ( f.weight() != m_newFont.weight() )
00684         m_changedFlags |= KoTextFormat::Bold;
00685     if ( f.italic() != m_newFont.italic() )
00686         m_changedFlags |= KoTextFormat::Italic;
00687     if ( f.family() != m_newFont.family() )
00688         m_changedFlags |= KoTextFormat::Family;
00689     if ( f.pointSize() != m_newFont.pointSize() )
00690         m_changedFlags |= KoTextFormat::Size;
00691     kdDebug(32500) << "KWFontChooser::slotFontChanged m_changedFlags=" << m_changedFlags << endl;
00692     m_newFont = f;
00693 }
00694 
00695 bool KoFontChooser::hyphenation() const
00696 {
00697     return d->m_hyphenation->isChecked();
00698 }
00699 void KoFontChooser::setHyphenation( bool _b)
00700 {
00701     d->m_hyphenation->setChecked( _b);
00702 }
00703 
00704 void KoFontChooser::slotHyphenationClicked()
00705 {
00706     m_changedFlags |= KoTextFormat::Hyphenation;
00707 }
00708 
00709 void KoFontChooser::slotStrikeOutTypeChanged( int _val)
00710 {
00711     m_changedFlags |= KoTextFormat::StrikeOut;
00712     m_strikeOutType->setEnabled( _val!=0 );
00713     d->m_wordByWord->setEnabled( ( _val != 0 ) || ( m_underlining->currentItem()!=0 ));
00714 }
00715 
00716 void KoFontChooser::slotSubScriptClicked()
00717 {
00718     if(m_superScript->isChecked())
00719         m_superScript->setChecked(false);
00720     m_changedFlags |= KoTextFormat::VAlign;
00721     updatePositionButton();
00722 }
00723 
00724 void KoFontChooser::slotSuperScriptClicked()
00725 {
00726     if(m_subScript->isChecked())
00727         m_subScript->setChecked(false);
00728     m_changedFlags |= KoTextFormat::VAlign;
00729     updatePositionButton();
00730 }
00731 
00732 void KoFontChooser::slotRelativeSizeChanged( int )
00733 {
00734     m_changedFlags |= KoTextFormat::VAlign;
00735 }
00736 
00737 void KoFontChooser::slotOffsetFromBaseLineChanged( int )
00738 {
00739     m_changedFlags |= KoTextFormat::OffsetFromBaseLine;
00740 }
00741 
00742 void KoFontChooser::slotShadowChanged()
00743 {
00744     m_changedFlags |= KoTextFormat::ShadowText;
00745 }
00746 
00747 void KoFontChooser::slotWordByWordClicked()
00748 {
00749     m_changedFlags |= KoTextFormat::WordByWord;
00750 }
00751 
00752 void KoFontChooser::slotChangeAttributeFont( int )
00753 {
00754     m_changedFlags |= KoTextFormat::Attribute;
00755 }
00756 
00757 void KoFontChooser::slotChangeLanguage( int )
00758 {
00759     m_changedFlags |= KoTextFormat::Language;
00760 }
00761 
00762 void KoFontChooser::slotChangeColor()
00763 {
00764     QColor color = d->m_textColor;
00765     QColor defaultTextColor = QApplication::palette().color( QPalette::Active, QColorGroup::Text );
00766     if ( KColorDialog::getColor( color, defaultTextColor ) )
00767     {
00768         if ( color != d->m_textColor )
00769         {
00770             d->m_textColor = color;
00771             m_changedFlags |= KoTextFormat::Color;
00772             if ( color.isValid() )
00773                 m_chooseFont->setColor( color );
00774             else
00775                 m_chooseFont->setColor( defaultTextColor );
00776         }
00777     }
00778 }
00779 
00780 void KoFontChooser::slotChangeBackGroundColor()
00781 {
00782     QColor color = m_backGroundColor;
00783     if ( KColorDialog::getColor( color, QApplication::palette().color( QPalette::Active, QColorGroup::Base ) ) )
00784     {
00785         if ( color != m_chooseFont->color() )
00786         {
00787             m_changedFlags |= KoTextFormat::TextBackgroundColor;
00788             m_backGroundColor = color;
00789         }
00790     }
00791 }
00792 
00793 void KoFontChooser::slotUnderlineColor()
00794 {
00795     QColor color = m_underlineColor;
00796     if ( KColorDialog::getColor( color, QApplication::palette().color( QPalette::Active, QColorGroup::Base ) ) )
00797     {
00798         if ( color != m_underlineColor )
00799         {
00800             m_changedFlags |= KoTextFormat::ExtendUnderLine;
00801             m_underlineColor = color;
00802         }
00803     }
00804 }
00805 
00806 KoTextFormat::UnderlineType KoFontChooser::underlineType() const
00807 {
00808     switch (m_underlining->currentItem () )
00809     {
00810     case 0:
00811         return KoTextFormat::U_NONE;
00812         break;
00813     case 1:
00814         return KoTextFormat::U_SIMPLE;
00815         break;
00816     case 2:
00817         return KoTextFormat::U_SIMPLE_BOLD;
00818         break;
00819     case 3:
00820         return KoTextFormat::U_DOUBLE;
00821         break;
00822     case 4:
00823         return KoTextFormat::U_WAVE;
00824         break;
00825     default:
00826         return KoTextFormat::U_NONE;
00827     }
00828 
00829 }
00830 
00831 KoTextFormat::StrikeOutType KoFontChooser::strikeOutType() const
00832 {
00833     switch (d->m_strikeOut->currentItem () )
00834     {
00835     case 0:
00836         return KoTextFormat::S_NONE;
00837         break;
00838     case 1:
00839         return KoTextFormat::S_SIMPLE;
00840         break;
00841     case 2:
00842         return KoTextFormat::S_SIMPLE_BOLD;
00843         break;
00844     case 3:
00845         return KoTextFormat::S_DOUBLE;
00846         break;
00847     default:
00848         return KoTextFormat::S_NONE;
00849     }
00850 }
00851 
00852 
00853 void KoFontChooser::setStrikeOutlineType(KoTextFormat::StrikeOutType nb)
00854 {
00855     switch ( nb )
00856     {
00857     case KoTextFormat::S_NONE:
00858         d->m_strikeOut->setCurrentItem(0);
00859         break;
00860     case KoTextFormat::S_SIMPLE:
00861          d->m_strikeOut->setCurrentItem(1);
00862         break;
00863     case KoTextFormat::S_SIMPLE_BOLD:
00864         d->m_strikeOut->setCurrentItem(2);
00865         break;
00866     case KoTextFormat::S_DOUBLE:
00867          d->m_strikeOut->setCurrentItem(3);
00868         break;
00869     }
00870     m_strikeOutType->setEnabled( d->m_strikeOut->currentItem()!= 0);
00871     d->m_wordByWord->setEnabled( ( d->m_strikeOut->currentItem()!= 0 ) || ( m_underlining->currentItem()!=0 ));
00872     m_changedFlags = 0;
00873 }
00874 
00875 
00876 void KoFontChooser::setUnderlineType(KoTextFormat::UnderlineType nb)
00877 {
00878     switch ( nb )
00879     {
00880     case KoTextFormat::U_NONE:
00881         m_underlining->setCurrentItem(0);
00882         break;
00883     case KoTextFormat::U_SIMPLE:
00884         m_underlining->setCurrentItem(1);
00885         break;
00886     case KoTextFormat::U_SIMPLE_BOLD:
00887         m_underlining->setCurrentItem(2);
00888         break;
00889     case KoTextFormat::U_DOUBLE:
00890         m_underlining->setCurrentItem(3);
00891         break;
00892     case KoTextFormat::U_WAVE:
00893         m_underlining->setCurrentItem(4);
00894         break;
00895     default:
00896         m_underlining->setCurrentItem(0);
00897         break;
00898     }
00899     m_changedFlags = 0;
00900 }
00901 
00902 void KoFontChooser::setUnderlineStyle(KoTextFormat::UnderlineStyle _t)
00903 {
00904     switch ( _t )
00905     {
00906     case KoTextFormat::U_SOLID:
00907         m_underlineType->setCurrentItem( 0 );
00908         break;
00909     case KoTextFormat::U_DASH:
00910         m_underlineType->setCurrentItem( 1 );
00911         break;
00912     case KoTextFormat::U_DOT:
00913         m_underlineType->setCurrentItem( 2 );
00914         break;
00915     case KoTextFormat::U_DASH_DOT:
00916         m_underlineType->setCurrentItem( 3 );
00917         break;
00918     case KoTextFormat::U_DASH_DOT_DOT:
00919         m_underlineType->setCurrentItem( 4 );
00920         break;
00921     default:
00922         m_underlineType->setCurrentItem( 0 );
00923         break;
00924     }
00925     m_underlineType->setEnabled( m_underlining->currentItem()!= 0);
00926     m_underlineColorButton->setEnabled( m_underlining->currentItem()!=0);
00927 
00928     d->m_wordByWord->setEnabled( ( d->m_strikeOut->currentItem()!= 0 ) || ( m_underlining->currentItem()!=0 ));
00929 
00930     m_changedFlags = 0;
00931 }
00932 
00933 void KoFontChooser::setStrikeOutStyle(KoTextFormat::StrikeOutStyle _t)
00934 {
00935     switch ( _t )
00936     {
00937     case KoTextFormat::S_NONE:
00938         m_strikeOutType->setCurrentItem( 0 );
00939         break;
00940     case KoTextFormat::S_DASH:
00941         m_strikeOutType->setCurrentItem( 1 );
00942         break;
00943     case KoTextFormat::S_DOT:
00944         m_strikeOutType->setCurrentItem( 2 );
00945         break;
00946     case KoTextFormat::S_DASH_DOT:
00947         m_strikeOutType->setCurrentItem( 3 );
00948         break;
00949     case KoTextFormat::S_DASH_DOT_DOT:
00950         m_strikeOutType->setCurrentItem( 4 );
00951         break;
00952     default:
00953         m_strikeOutType->setCurrentItem( 0 );
00954         break;
00955     }
00956     m_changedFlags = 0;
00957 }
00958 
00959 KoTextFormat::UnderlineStyle KoFontChooser::underlineStyle() const
00960 {
00961     switch ( m_underlineType->currentItem() )
00962     {
00963     case 0:
00964         return KoTextFormat::U_SOLID;
00965         break;
00966     case 1:
00967         return KoTextFormat::U_DASH;
00968         break;
00969     case 2:
00970         return KoTextFormat::U_DOT;
00971         break;
00972     case 3:
00973         return KoTextFormat::U_DASH_DOT;
00974         break;
00975     case 4:
00976         return KoTextFormat::U_DASH_DOT_DOT;
00977         break;
00978     default:
00979         return KoTextFormat::U_SOLID;
00980     }
00981 }
00982 
00983 KoTextFormat::StrikeOutStyle KoFontChooser::strikeOutStyle() const
00984 {
00985 
00986     switch ( m_strikeOutType->currentItem() )
00987     {
00988     case 0:
00989         return KoTextFormat::S_SOLID;
00990         break;
00991     case 1:
00992         return KoTextFormat::S_DASH;
00993         break;
00994     case 2:
00995         return KoTextFormat::S_DOT;
00996         break;
00997     case 3:
00998         return KoTextFormat::S_DASH_DOT;
00999         break;
01000     case 4:
01001         return KoTextFormat::S_DASH_DOT_DOT;
01002         break;
01003     default:
01004         return KoTextFormat::S_SOLID;
01005     }
01006 }
01007 
01008 
01009 void KoFontChooser::slotChangeUnderlineType( int /*i*/)
01010 {
01011     m_changedFlags |= KoTextFormat::ExtendUnderLine;
01012 }
01013 
01014 void KoFontChooser::slotChangeUnderlining( int i)
01015 {
01016     m_changedFlags |= KoTextFormat::ExtendUnderLine;
01017     m_underlineType->setEnabled( i!= 0);
01018     m_underlineColorButton->setEnabled( i!=0);
01019     d->m_wordByWord->setEnabled( ( d->m_strikeOut->currentItem()!= 0 ) || ( i !=0 ));
01020 
01021 }
01022 
01023 void KoFontChooser::slotChangeStrikeOutType( int /*i*/ )
01024 {
01025     m_changedFlags |= KoTextFormat::StrikeOut;
01026 }
01027 
01028 
01029 void KoFontChooser::setShadow( double shadowDistanceX, double shadowDistanceY, const QColor& shadowColor )
01030 {
01031     d->m_shadowWidget->setShadow( shadowDistanceX, shadowDistanceY, shadowColor );
01032 }
01033 
01034 double KoFontChooser::shadowDistanceX() const
01035 {
01036     return d->m_shadowWidget->shadowDistanceX();
01037 }
01038 
01039 double KoFontChooser::shadowDistanceY() const
01040 {
01041     return d->m_shadowWidget->shadowDistanceY();
01042 }
01043 
01044 QColor KoFontChooser::shadowColor() const
01045 {
01046     return d->m_shadowWidget->shadowColor();
01047 }
01048 
01049 void KoFontChooser::setFormat( const KoTextFormat& format )
01050 {
01051     setFont( format.font(),
01052                         format.vAlign() & KoTextFormat::AlignSubScript,
01053                         format.vAlign() & KoTextFormat::AlignSuperScript );
01054     setColor( format.color() );
01055     setBackGroundColor( format.textBackgroundColor() );
01056     setUnderlineColor( format.textUnderlineColor() );
01057 
01058     setUnderlineType( format.underlineType() );
01059     setUnderlineStyle( format.underlineStyle() );
01060 
01061     setStrikeOutlineType( format.strikeOutType() );
01062     setStrikeOutStyle( format.strikeOutStyle() );
01063 
01064     setShadow( format.shadowDistanceX(), format.shadowDistanceY(), format.shadowColor() );
01065 
01066     setWordByWord( format.wordByWord() );
01067     setRelativeTextSize( format.relativeTextSize() );
01068     setOffsetFromBaseLine( format.offsetFromBaseLine() );
01069     setFontAttribute( format.attributeFont() );
01070     setLanguage( format.language() );
01071 
01072     setHyphenation( format.hyphenation() );
01073 
01074     updatePositionButton();
01075 }
01076 
01077 KoTextFormat KoFontChooser::newFormat() const
01078 {
01079     return KoTextFormat( newFont(),
01080                          vAlign(),
01081                          color(),
01082                          backGroundColor(),
01083                          underlineColor(),
01084                          underlineType(),
01085                          underlineStyle(),
01086                          strikeOutType(),
01087                          strikeOutStyle(),
01088                          fontAttribute(),
01089                          language(),
01090                          relativeTextSize(),
01091                          offsetFromBaseLine(),
01092                          wordByWord(),
01093                          hyphenation(),
01094                          shadowDistanceX(),
01095                          shadowDistanceY(),
01096                          shadowColor() );
01097 }
01098 
01100 
01101 KoFontDia::KoFontDia( const KoTextFormat& initialFormat, QWidget* parent, const char* name )
01102     : KDialogBase( parent, name, true,
01103                    i18n("Select Font"), Ok|Cancel|User1|Apply, Ok ),
01104       m_initialFormat(initialFormat)
01105 {
01106     setButtonText( KDialogBase::User1, i18n("&Reset") );
01107 
01108     m_chooser = new KoFontChooser( this, "kofontchooser", true /*_withSubSuperScript*/,
01109                                    KFontChooser::SmoothScalableFonts);
01110     setMainWidget( m_chooser );
01111     connect( this, SIGNAL( user1Clicked() ), this, SLOT(slotReset()) );
01112 
01113     slotReset();
01114 }
01115 
01116 void KoFontDia::slotApply()
01117 {
01118     emit applyFont();
01119 }
01120 
01121 void KoFontDia::slotOk()
01122 {
01123     slotApply();
01124     KDialogBase::slotOk();
01125 }
01126 
01127 void KoFontDia::slotReset()
01128 {
01129     m_chooser->setFormat( m_initialFormat );
01130 }
01131 
01132 #include "koFontDia.moc"
01133 #include "koFontDia_p.moc"
KDE Logo
This file is part of the documentation for lib Library Version 1.3.5.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Mar 11 11:47:41 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003