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.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Sep 24 18:22:24 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003