00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <qlayout.h>
00023 #include <qlabel.h>
00024 #include <qbuttongroup.h>
00025 #include <qlineedit.h>
00026 #include <qfont.h>
00027 #include <qspinbox.h>
00028 #include <qframe.h>
00029 #include <qcombobox.h>
00030 #include <qcheckbox.h>
00031 #include <qradiobutton.h>
00032 #include <qpushbutton.h>
00033 #include <qwhatsthis.h>
00034
00035 #include <kcolorbutton.h>
00036 #include <kdebug.h>
00037 #include <klocale.h>
00038 #include <kfontdialog.h>
00039 #include <kmessagebox.h>
00040 #include <kconfigskeleton.h>
00041 #include "ktimeedit.h"
00042
00043 #include "kprefsdialog.h"
00044 #include "kprefsdialog.moc"
00045
00046 namespace KPrefsWidFactory {
00047
00048 KPrefsWid *create( KConfigSkeletonItem *item, QWidget *parent )
00049 {
00050 KConfigSkeleton::ItemBool *boolItem =
00051 dynamic_cast<KConfigSkeleton::ItemBool *>( item );
00052 if ( boolItem ) {
00053 return new KPrefsWidBool( boolItem, parent );
00054 }
00055
00056 KConfigSkeleton::ItemString *stringItem =
00057 dynamic_cast<KConfigSkeleton::ItemString *>( item );
00058 if ( stringItem ) {
00059 return new KPrefsWidString( stringItem, parent );
00060 }
00061
00062 KConfigSkeleton::ItemEnum *enumItem =
00063 dynamic_cast<KConfigSkeleton::ItemEnum *>( item );
00064 if ( enumItem ) {
00065 QValueList<KConfigSkeleton::ItemEnum::Choice> choices = enumItem->choices();
00066 if ( choices.isEmpty() ) {
00067 kdError() << "KPrefsWidFactory::create(): Enum has no choices." << endl;
00068 return 0;
00069 } else {
00070 KPrefsWidRadios *radios = new KPrefsWidRadios( enumItem, parent );
00071 QValueList<KConfigSkeleton::ItemEnum::Choice>::ConstIterator it;
00072 for( it = choices.begin(); it != choices.end(); ++it ) {
00073 radios->addRadio( (*it).label );
00074 }
00075 return radios;
00076 }
00077 }
00078
00079 KConfigSkeleton::ItemInt *intItem =
00080 dynamic_cast<KConfigSkeleton::ItemInt *>( item );
00081 if ( intItem ) {
00082 return new KPrefsWidInt( intItem, parent );
00083 }
00084
00085 return 0;
00086 }
00087
00088 }
00089
00090
00091 QValueList<QWidget *> KPrefsWid::widgets() const
00092 {
00093 return QValueList<QWidget *>();
00094 }
00095
00096
00097 KPrefsWidBool::KPrefsWidBool( KConfigSkeleton::ItemBool *item, QWidget *parent )
00098 : mItem( item )
00099 {
00100 mCheck = new QCheckBox( item->label(), parent);
00101 connect( mCheck, SIGNAL( clicked() ), SIGNAL( changed() ) );
00102 if ( !item->whatsThis().isNull() ) {
00103 QWhatsThis::add( mCheck, item->whatsThis() );
00104 }
00105 }
00106
00107 void KPrefsWidBool::readConfig()
00108 {
00109 mCheck->setChecked( mItem->value() );
00110 }
00111
00112 void KPrefsWidBool::writeConfig()
00113 {
00114 mItem->setValue( mCheck->isChecked() );
00115 }
00116
00117 QCheckBox *KPrefsWidBool::checkBox()
00118 {
00119 return mCheck;
00120 }
00121
00122 QValueList<QWidget *> KPrefsWidBool::widgets() const
00123 {
00124 QValueList<QWidget *> widgets;
00125 widgets.append( mCheck );
00126 return widgets;
00127 }
00128
00129
00130 KPrefsWidInt::KPrefsWidInt( KConfigSkeleton::ItemInt *item,
00131 QWidget *parent )
00132 : mItem( item )
00133 {
00134 mLabel = new QLabel( mItem->label()+':', parent );
00135 mSpin = new QSpinBox( parent );
00136 if ( !item->minValue().isNull() ) {
00137 mSpin->setMinValue( item->minValue().toInt() );
00138 }
00139 if ( !item->maxValue().isNull() ) {
00140 mSpin->setMaxValue( item->maxValue().toInt() );
00141 }
00142 connect( mSpin, SIGNAL( valueChanged( int ) ), SIGNAL( changed() ) );
00143 mLabel->setBuddy( mSpin );
00144 QString whatsThis = mItem->whatsThis();
00145 if ( !whatsThis.isEmpty() ) {
00146 QWhatsThis::add( mLabel, whatsThis );
00147 QWhatsThis::add( mSpin, whatsThis );
00148 }
00149 }
00150
00151 void KPrefsWidInt::readConfig()
00152 {
00153 mSpin->setValue( mItem->value() );
00154 }
00155
00156 void KPrefsWidInt::writeConfig()
00157 {
00158 mItem->setValue( mSpin->value() );
00159 }
00160
00161 QLabel *KPrefsWidInt::label()
00162 {
00163 return mLabel;
00164 }
00165
00166 QSpinBox *KPrefsWidInt::spinBox()
00167 {
00168 return mSpin;
00169 }
00170
00171 QValueList<QWidget *> KPrefsWidInt::widgets() const
00172 {
00173 QValueList<QWidget *> widgets;
00174 widgets.append( mLabel );
00175 widgets.append( mSpin );
00176 return widgets;
00177 }
00178
00179
00180 KPrefsWidColor::KPrefsWidColor( KConfigSkeleton::ItemColor *item,
00181 QWidget *parent )
00182 : mItem( item )
00183 {
00184 mButton = new KColorButton( parent );
00185 connect( mButton, SIGNAL( changed( const QColor & ) ), SIGNAL( changed() ) );
00186 mLabel = new QLabel( mButton, mItem->label()+':', parent );
00187 QString whatsThis = mItem->whatsThis();
00188 if (!whatsThis.isNull()) {
00189 QWhatsThis::add(mButton, whatsThis);
00190 }
00191 }
00192
00193 KPrefsWidColor::~KPrefsWidColor()
00194 {
00195
00196 }
00197
00198 void KPrefsWidColor::readConfig()
00199 {
00200 mButton->setColor( mItem->value() );
00201 }
00202
00203 void KPrefsWidColor::writeConfig()
00204 {
00205 mItem->setValue( mButton->color() );
00206 }
00207
00208 QLabel *KPrefsWidColor::label()
00209 {
00210 return mLabel;
00211 }
00212
00213 KColorButton *KPrefsWidColor::button()
00214 {
00215 return mButton;
00216 }
00217
00218
00219 KPrefsWidFont::KPrefsWidFont( KConfigSkeleton::ItemFont *item,
00220 QWidget *parent, const QString &sampleText )
00221 : mItem( item )
00222 {
00223 mLabel = new QLabel( mItem->label()+':', parent );
00224
00225 mPreview = new QLabel( sampleText, parent );
00226 mPreview->setFrameStyle( QFrame::Panel | QFrame::Sunken );
00227
00228 mButton = new QPushButton( i18n("Choose..."), parent );
00229 connect( mButton, SIGNAL( clicked() ), SLOT( selectFont() ) );
00230 QString whatsThis = mItem->whatsThis();
00231 if (!whatsThis.isNull()) {
00232 QWhatsThis::add(mPreview, whatsThis);
00233 QWhatsThis::add(mButton, whatsThis);
00234 }
00235 }
00236
00237 KPrefsWidFont::~KPrefsWidFont()
00238 {
00239 }
00240
00241 void KPrefsWidFont::readConfig()
00242 {
00243 mPreview->setFont( mItem->value() );
00244 }
00245
00246 void KPrefsWidFont::writeConfig()
00247 {
00248 mItem->setValue( mPreview->font() );
00249 }
00250
00251 QLabel *KPrefsWidFont::label()
00252 {
00253 return mLabel;
00254 }
00255
00256 QFrame *KPrefsWidFont::preview()
00257 {
00258 return mPreview;
00259 }
00260
00261 QPushButton *KPrefsWidFont::button()
00262 {
00263 return mButton;
00264 }
00265
00266 void KPrefsWidFont::selectFont()
00267 {
00268 QFont myFont(mPreview->font());
00269 int result = KFontDialog::getFont(myFont);
00270 if (result == KFontDialog::Accepted) {
00271 mPreview->setFont(myFont);
00272 emit changed();
00273 }
00274 }
00275
00276
00277 KPrefsWidTime::KPrefsWidTime( KConfigSkeleton::ItemDateTime *item,
00278 QWidget *parent )
00279 : mItem( item )
00280 {
00281 mLabel = new QLabel( mItem->label()+':', parent );
00282 mTimeEdit = new KTimeEdit( parent );
00283 connect( mTimeEdit, SIGNAL( timeChanged( QTime ) ), SIGNAL( changed() ) );
00284 QString whatsThis = mItem->whatsThis();
00285 if ( !whatsThis.isNull() ) {
00286 QWhatsThis::add( mTimeEdit, whatsThis );
00287 }
00288 }
00289
00290 void KPrefsWidTime::readConfig()
00291 {
00292 mTimeEdit->setTime( mItem->value().time() );
00293 }
00294
00295 void KPrefsWidTime::writeConfig()
00296 {
00297 mItem->setValue( QDateTime( QDate(0,0,0), mTimeEdit->getTime() ) );
00298 }
00299
00300 QLabel *KPrefsWidTime::label()
00301 {
00302 return mLabel;
00303 }
00304
00305 KTimeEdit *KPrefsWidTime::timeEdit()
00306 {
00307 return mTimeEdit;
00308 }
00309
00310
00311 KPrefsWidRadios::KPrefsWidRadios( KConfigSkeleton::ItemEnum *item,
00312 QWidget *parent )
00313 : mItem( item )
00314 {
00315 mBox = new QButtonGroup( 1, Qt::Horizontal, mItem->label(), parent );
00316 connect( mBox, SIGNAL( clicked( int ) ), SIGNAL( changed() ) );
00317 }
00318
00319 KPrefsWidRadios::~KPrefsWidRadios()
00320 {
00321 }
00322
00323 void KPrefsWidRadios::addRadio(const QString &text, const QString &whatsThis)
00324 {
00325 QRadioButton *r = new QRadioButton(text,mBox);
00326 if (!whatsThis.isNull()) {
00327 QWhatsThis::add(r, whatsThis);
00328 }
00329 }
00330
00331 QButtonGroup *KPrefsWidRadios::groupBox()
00332 {
00333 return mBox;
00334 }
00335
00336 void KPrefsWidRadios::readConfig()
00337 {
00338 mBox->setButton( mItem->value() );
00339 }
00340
00341 void KPrefsWidRadios::writeConfig()
00342 {
00343 mItem->setValue( mBox->id( mBox->selected() ) );
00344 }
00345
00346 QValueList<QWidget *> KPrefsWidRadios::widgets() const
00347 {
00348 QValueList<QWidget *> w;
00349 w.append( mBox );
00350 return w;
00351 }
00352
00353
00354 KPrefsWidString::KPrefsWidString( KConfigSkeleton::ItemString *item,
00355 QWidget *parent,
00356 QLineEdit::EchoMode echomode )
00357 : mItem( item )
00358 {
00359 mLabel = new QLabel( mItem->label()+':', parent );
00360 mEdit = new QLineEdit( parent );
00361 connect( mEdit, SIGNAL( textChanged( const QString & ) ),
00362 SIGNAL( changed() ) );
00363 mEdit->setEchoMode( echomode );
00364 QString whatsThis = mItem->whatsThis();
00365 if ( !whatsThis.isNull() ) {
00366 QWhatsThis::add( mEdit, whatsThis );
00367 }
00368 }
00369
00370 KPrefsWidString::~KPrefsWidString()
00371 {
00372 }
00373
00374 void KPrefsWidString::readConfig()
00375 {
00376 mEdit->setText( mItem->value() );
00377 }
00378
00379 void KPrefsWidString::writeConfig()
00380 {
00381 mItem->setValue( mEdit->text() );
00382 }
00383
00384 QLabel *KPrefsWidString::label()
00385 {
00386 return mLabel;
00387 }
00388
00389 QLineEdit *KPrefsWidString::lineEdit()
00390 {
00391 return mEdit;
00392 }
00393
00394 QValueList<QWidget *> KPrefsWidString::widgets() const
00395 {
00396 QValueList<QWidget *> widgets;
00397 widgets.append( mLabel );
00398 widgets.append( mEdit );
00399 return widgets;
00400 }
00401
00402
00403 KPrefsWidManager::KPrefsWidManager( KConfigSkeleton *prefs )
00404 : mPrefs( prefs )
00405 {
00406 }
00407
00408 KPrefsWidManager::~KPrefsWidManager()
00409 {
00410 }
00411
00412 void KPrefsWidManager::addWid( KPrefsWid *wid )
00413 {
00414 mPrefsWids.append( wid );
00415 }
00416
00417 KPrefsWidBool *KPrefsWidManager::addWidBool( KConfigSkeleton::ItemBool *item,
00418 QWidget *parent )
00419 {
00420 KPrefsWidBool *w = new KPrefsWidBool( item, parent );
00421 addWid( w );
00422 return w;
00423 }
00424
00425 KPrefsWidTime *KPrefsWidManager::addWidTime( KConfigSkeleton::ItemDateTime *item,
00426 QWidget *parent )
00427 {
00428 KPrefsWidTime *w = new KPrefsWidTime( item, parent );
00429 addWid( w );
00430 return w;
00431 }
00432
00433 KPrefsWidColor *KPrefsWidManager::addWidColor( KConfigSkeleton::ItemColor *item,
00434 QWidget *parent )
00435 {
00436 KPrefsWidColor *w = new KPrefsWidColor( item, parent );
00437 addWid( w );
00438 return w;
00439 }
00440
00441 KPrefsWidRadios *KPrefsWidManager::addWidRadios( KConfigSkeleton::ItemEnum *item,
00442 QWidget *parent )
00443 {
00444 KPrefsWidRadios *w = new KPrefsWidRadios( item, parent );
00445 QValueList<KConfigSkeleton::ItemEnum::Choice> choices;
00446 choices = item->choices();
00447 QValueList<KConfigSkeleton::ItemEnum::Choice>::ConstIterator it;
00448 for( it = choices.begin(); it != choices.end(); ++it ) {
00449 w->addRadio( (*it).label, (*it).whatsThis );
00450 }
00451 addWid( w );
00452 return w;
00453 }
00454
00455 KPrefsWidString *KPrefsWidManager::addWidString( KConfigSkeleton::ItemString *item,
00456 QWidget *parent )
00457 {
00458 KPrefsWidString *w = new KPrefsWidString( item, parent,
00459 QLineEdit::Normal );
00460 addWid( w );
00461 return w;
00462 }
00463
00464 KPrefsWidString *KPrefsWidManager::addWidPassword( KConfigSkeleton::ItemString *item,
00465 QWidget *parent )
00466 {
00467 KPrefsWidString *w = new KPrefsWidString( item, parent, QLineEdit::Password );
00468 addWid( w );
00469 return w;
00470 }
00471
00472 KPrefsWidFont *KPrefsWidManager::addWidFont( KConfigSkeleton::ItemFont *item,
00473 QWidget *parent,
00474 const QString &sampleText )
00475 {
00476 KPrefsWidFont *w = new KPrefsWidFont( item, parent, sampleText );
00477 addWid( w );
00478 return w;
00479 }
00480
00481 KPrefsWidInt *KPrefsWidManager::addWidInt( KConfigSkeleton::ItemInt *item,
00482 QWidget *parent )
00483 {
00484 KPrefsWidInt *w = new KPrefsWidInt( item, parent );
00485 addWid( w );
00486 return w;
00487 }
00488
00489 void KPrefsWidManager::setWidDefaults()
00490 {
00491 kdDebug() << "KPrefsWidManager::setWidDefaults()" << endl;
00492
00493 bool tmp = mPrefs->useDefaults( true );
00494
00495 readWidConfig();
00496
00497 mPrefs->useDefaults( tmp );
00498 }
00499
00500 void KPrefsWidManager::readWidConfig()
00501 {
00502 kdDebug(5310) << "KPrefsWidManager::readWidConfig()" << endl;
00503
00504 KPrefsWid *wid;
00505 for( wid = mPrefsWids.first(); wid; wid = mPrefsWids.next() ) {
00506 wid->readConfig();
00507 }
00508 }
00509
00510 void KPrefsWidManager::writeWidConfig()
00511 {
00512 kdDebug(5310) << "KPrefsWidManager::writeWidConfig()" << endl;
00513
00514 KPrefsWid *wid;
00515 for( wid = mPrefsWids.first(); wid; wid = mPrefsWids.next() ) {
00516 wid->writeConfig();
00517 }
00518
00519 mPrefs->writeConfig();
00520 }
00521
00522
00523 KPrefsDialog::KPrefsDialog( KConfigSkeleton *prefs, QWidget *parent, char *name,
00524 bool modal )
00525 : KDialogBase(IconList,i18n("Preferences"),Ok|Apply|Cancel|Default,Ok,parent,
00526 name,modal,true),
00527 KPrefsWidManager( prefs )
00528 {
00529
00530
00531
00532
00533 connect(this,SIGNAL(cancelClicked()),SLOT(reject()));
00534 }
00535
00536 KPrefsDialog::~KPrefsDialog()
00537 {
00538 }
00539
00540 void KPrefsDialog::autoCreate()
00541 {
00542 KConfigSkeletonItem::List items = prefs()->items();
00543
00544 QMap<QString,QWidget *> mGroupPages;
00545 QMap<QString,QGridLayout *> mGroupLayouts;
00546 QMap<QString,int> mCurrentRows;
00547
00548 KConfigSkeletonItem::List::ConstIterator it;
00549 for( it = items.begin(); it != items.end(); ++it ) {
00550 QString group = (*it)->group();
00551 QString name = (*it)->name();
00552
00553 kdDebug() << "ITEMS: " << (*it)->name() << endl;
00554
00555 QWidget *page;
00556 QGridLayout *layout;
00557 int currentRow;
00558 if ( !mGroupPages.contains( group ) ) {
00559 page = addPage( group );
00560 layout = new QGridLayout( page );
00561 mGroupPages.insert( group, page );
00562 mGroupLayouts.insert( group, layout );
00563 currentRow = 0;
00564 mCurrentRows.insert( group, currentRow );
00565 } else {
00566 page = mGroupPages[ group ];
00567 layout = mGroupLayouts[ group ];
00568 currentRow = mCurrentRows[ group ];
00569 }
00570
00571 KPrefsWid *wid = KPrefsWidFactory::create( *it, page );
00572
00573 if ( wid ) {
00574 QValueList<QWidget *> widgets = wid->widgets();
00575 if ( widgets.count() == 1 ) {
00576 layout->addMultiCellWidget( widgets[ 0 ],
00577 currentRow, currentRow, 0, 1 );
00578 } else if ( widgets.count() == 2 ) {
00579 layout->addWidget( widgets[ 0 ], currentRow, 0 );
00580 layout->addWidget( widgets[ 1 ], currentRow, 1 );
00581 } else {
00582 kdError() << "More widgets than expected: " << widgets.count() << endl;
00583 }
00584
00585 if ( (*it)->isImmutable() ) {
00586 QValueList<QWidget *>::Iterator it2;
00587 for( it2 = widgets.begin(); it2 != widgets.end(); ++it2 ) {
00588 (*it2)->setEnabled( false );
00589 }
00590 }
00591
00592 addWid( wid );
00593
00594 mCurrentRows.replace( group, ++currentRow );
00595 }
00596 }
00597
00598 readConfig();
00599 }
00600
00601 void KPrefsDialog::setDefaults()
00602 {
00603 setWidDefaults();
00604 }
00605
00606 void KPrefsDialog::readConfig()
00607 {
00608 readWidConfig();
00609
00610 usrReadConfig();
00611 }
00612
00613 void KPrefsDialog::writeConfig()
00614 {
00615 writeWidConfig();
00616
00617 usrWriteConfig();
00618
00619 readConfig();
00620 }
00621
00622
00623 void KPrefsDialog::slotApply()
00624 {
00625 writeConfig();
00626 emit configChanged();
00627 }
00628
00629 void KPrefsDialog::slotOk()
00630 {
00631 slotApply();
00632 accept();
00633 }
00634
00635 void KPrefsDialog::slotDefault()
00636 {
00637 kdDebug() << "KPrefsDialog::slotDefault()" << endl;
00638
00639 if (KMessageBox::warningContinueCancel(this,
00640 i18n("You are about to set all preferences to default values. All "
00641 "custom modifications will be lost."),i18n("Setting Default Preferences"),
00642 i18n("Reset to Defaults"))
00643 == KMessageBox::Continue) setDefaults();
00644 }
00645
00646
00647 KPrefsModule::KPrefsModule( KConfigSkeleton *prefs, QWidget *parent,
00648 const char *name )
00649 : KCModule( parent, name ),
00650 KPrefsWidManager( prefs )
00651 {
00652 emit changed( false );
00653 }
00654
00655 void KPrefsModule::addWid( KPrefsWid *wid )
00656 {
00657 KPrefsWidManager::addWid( wid );
00658
00659 connect( wid, SIGNAL( changed() ), SLOT( slotWidChanged() ) );
00660 }
00661
00662 void KPrefsModule::slotWidChanged()
00663 {
00664 kdDebug(5310) << "KPrefsModule::slotWidChanged()" << endl;
00665
00666 emit changed( true );
00667 }
00668
00669 void KPrefsModule::load()
00670 {
00671 kdDebug(5310) << "KPrefsModule::load()" << endl;
00672
00673 readWidConfig();
00674
00675 usrReadConfig();
00676
00677 emit changed( false );
00678 }
00679
00680 void KPrefsModule::save()
00681 {
00682 kdDebug(5310) << "KPrefsModule::save()" << endl;
00683
00684 writeWidConfig();
00685
00686 usrWriteConfig();
00687 }
00688
00689 void KPrefsModule::defaults()
00690 {
00691 setWidDefaults();
00692
00693 emit changed( true );
00694 }