00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "cryptoconfigmodule.h"
00033 #include "directoryserviceswidget.h"
00034 #include <kleo/cryptoconfig.h>
00035
00036 #include <klineedit.h>
00037 #include <klocale.h>
00038 #include <kdialogbase.h>
00039 #include <kdebug.h>
00040 #include <knuminput.h>
00041 #include <kiconloader.h>
00042 #include <kglobal.h>
00043
00044 #include <qgrid.h>
00045 #include <qlabel.h>
00046 #include <qlayout.h>
00047 #include <qvbox.h>
00048 #include <qpushbutton.h>
00049 #include <qregexp.h>
00050
00051 using namespace Kleo;
00052
00053 inline QPixmap loadIcon( QString s ) {
00054 return KGlobal::instance()->iconLoader()
00055 ->loadIcon( s.replace( QRegExp( "[^a-zA-Z0-9_]" ), "_" ), KIcon::NoGroup, KIcon::SizeMedium );
00056 }
00057
00058 Kleo::CryptoConfigModule::CryptoConfigModule( Kleo::CryptoConfig* config, QWidget * parent, const char * name )
00059 : KJanusWidget( parent, name, KJanusWidget::IconList ), mConfig( config )
00060 {
00061
00062
00063
00064
00065 QStringList components = config->componentList();
00066
00067 for( QStringList::Iterator compit = components.begin(); compit != components.end(); ++compit ) {
00068
00069 Kleo::CryptoConfigComponent* comp = config->component( *compit );
00070 Q_ASSERT( comp );
00071 if ( !comp->groupList().isEmpty() ) {
00072 QVBox* vbox = addVBoxPage( comp->description(), QString::null, loadIcon( *compit ) );
00073 CryptoConfigComponentGUI* compGUI =
00074 new CryptoConfigComponentGUI( this, comp, vbox, (*compit).local8Bit() );
00075
00076 mComponentGUIs.append( compGUI );
00077 }
00078 }
00079 }
00080
00081 void Kleo::CryptoConfigModule::save()
00082 {
00083 bool changed = false;
00084 QValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
00085 for( ; it != mComponentGUIs.end(); ++it ) {
00086 if ( (*it)->save() )
00087 changed = true;
00088 }
00089 if ( changed )
00090 mConfig->sync(true );
00091 }
00092
00093 void Kleo::CryptoConfigModule::reset()
00094 {
00095 QValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
00096 for( ; it != mComponentGUIs.end(); ++it ) {
00097 (*it)->load();
00098 }
00099 }
00100
00101 void Kleo::CryptoConfigModule::defaults()
00102 {
00103 QValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
00104 for( ; it != mComponentGUIs.end(); ++it ) {
00105 (*it)->defaults();
00106 }
00107 }
00108
00109 void Kleo::CryptoConfigModule::cancel()
00110 {
00111 mConfig->clear();
00112 }
00113
00115
00116 Kleo::CryptoConfigComponentGUI::CryptoConfigComponentGUI(
00117 CryptoConfigModule* module, Kleo::CryptoConfigComponent* component,
00118 QWidget* parent, const char* name )
00119 #ifdef USE_TABS
00120 : QTabWidget( parent, name ),
00121 #else
00122 : QWidget( parent, name ),
00123 #endif
00124 mComponent( component )
00125 {
00126 #ifndef USE_TABS
00127 QVBoxLayout *vlay = new QVBoxLayout( this, 0, KDialog::spacingHint() );
00128 #endif
00129
00130 QStringList groups = mComponent->groupList();
00131 for( QStringList::Iterator groupit = groups.begin(); groupit != groups.end(); ++groupit ) {
00132 Kleo::CryptoConfigGroup* group = mComponent->group( *groupit );
00133 Q_ASSERT( group );
00134 CryptoConfigGroupGUI* gg = new CryptoConfigGroupGUI( module, group, this );
00135 #ifdef USE_TABS
00136 addTab( gg, group->description() );
00137 #else
00138 vlay->addWidget( gg );
00139 #endif
00140 mGroupGUIs.append( gg );
00141 }
00142 }
00143
00144
00145 bool Kleo::CryptoConfigComponentGUI::save()
00146 {
00147 bool changed = false;
00148 QValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
00149 for( ; it != mGroupGUIs.end(); ++it ) {
00150 if ( (*it)->save() )
00151 changed = true;
00152 }
00153 return changed;
00154 }
00155
00156 void Kleo::CryptoConfigComponentGUI::load()
00157 {
00158 QValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
00159 for( ; it != mGroupGUIs.end(); ++it )
00160 (*it)->load();
00161 }
00162
00163 void Kleo::CryptoConfigComponentGUI::defaults()
00164 {
00165 QValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
00166 for( ; it != mGroupGUIs.end(); ++it )
00167 (*it)->defaults();
00168 }
00169
00171
00172 Kleo::CryptoConfigGroupGUI::CryptoConfigGroupGUI(
00173 CryptoConfigModule* module, Kleo::CryptoConfigGroup* group,
00174 QWidget* parent, const char* name )
00175 : QGroupBox( 1, Qt::Horizontal,
00176 group->description(), parent, name ), mGroup( group )
00177 {
00178 QStringList entries = mGroup->entryList();
00179 for( QStringList::Iterator entryit = entries.begin(); entryit != entries.end(); ++entryit ) {
00180 Kleo::CryptoConfigEntry* entry = group->entry( *entryit );
00181 Q_ASSERT( entry );
00182 CryptoConfigEntryGUI* entryGUI =
00183 CryptoConfigEntryGUIFactory::createEntryGUI( module, entry, *entryit, this );
00184 if ( entryGUI ) {
00185 mEntryGUIs.append( entryGUI );
00186 entryGUI->load();
00187 }
00188 }
00189 }
00190
00191 bool Kleo::CryptoConfigGroupGUI::save()
00192 {
00193 bool changed = false;
00194 QValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
00195 for( ; it != mEntryGUIs.end(); ++it ) {
00196 if ( (*it)->isChanged() ) {
00197 (*it)->save();
00198 changed = true;
00199 }
00200 }
00201 return changed;
00202 }
00203
00204 void Kleo::CryptoConfigGroupGUI::load()
00205 {
00206 QValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
00207 for( ; it != mEntryGUIs.end(); ++it )
00208 (*it)->load();
00209 }
00210
00211 void Kleo::CryptoConfigGroupGUI::defaults()
00212 {
00213 QValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
00214 for( ; it != mEntryGUIs.end(); ++it )
00215 (*it)->resetToDefault();
00216 }
00217
00219
00220 CryptoConfigEntryGUI* Kleo::CryptoConfigEntryGUIFactory::createEntryGUI( CryptoConfigModule* module, Kleo::CryptoConfigEntry* entry, const QString& entryName, QWidget* parent, const char* name )
00221 {
00222 if ( entry->isList() ) {
00223 switch( entry->argType() ) {
00224 case Kleo::CryptoConfigEntry::ArgType_None:
00225
00226 return new CryptoConfigEntrySpinBox( module, entry, entryName, parent, name );
00227 case Kleo::CryptoConfigEntry::ArgType_Int:
00228 case Kleo::CryptoConfigEntry::ArgType_UInt:
00229
00230 return new CryptoConfigEntryLineEdit( module, entry, entryName, parent, name );
00231 case Kleo::CryptoConfigEntry::ArgType_URL:
00232 case Kleo::CryptoConfigEntry::ArgType_Path:
00233 case Kleo::CryptoConfigEntry::ArgType_String:
00234 kdWarning(5150) << "No widget implemented for list of type " << entry->argType() << endl;
00235 return 0;
00236 case Kleo::CryptoConfigEntry::ArgType_LDAPURL:
00237 return new CryptoConfigEntryLDAPURL( module, entry, entryName, parent, name );
00238 }
00239 }
00240
00241 switch( entry->argType() ) {
00242 case Kleo::CryptoConfigEntry::ArgType_None:
00243 return new CryptoConfigEntryCheckBox( module, entry, entryName, parent, name );
00244 case Kleo::CryptoConfigEntry::ArgType_Int:
00245
00246 case Kleo::CryptoConfigEntry::ArgType_UInt:
00247 return new CryptoConfigEntrySpinBox( module, entry, entryName, parent, name );
00248 case Kleo::CryptoConfigEntry::ArgType_LDAPURL:
00249
00250 case Kleo::CryptoConfigEntry::ArgType_URL:
00251
00252 case Kleo::CryptoConfigEntry::ArgType_Path:
00253
00254 case Kleo::CryptoConfigEntry::ArgType_String:
00255 return new CryptoConfigEntryLineEdit( module, entry, entryName, parent, name );
00256 }
00257 kdWarning(5150) << "No widget implemented for list of (unknown) type " << entry->argType() << endl;
00258 return 0;
00259 }
00260
00262
00263 Kleo::CryptoConfigEntryGUI::CryptoConfigEntryGUI(
00264 CryptoConfigModule* module,
00265 Kleo::CryptoConfigEntry* entry,
00266 const QString& entryName,
00267 QWidget* parent, const char* name )
00268 : QHBox( parent, name ), mEntry( entry ), mName( entryName ), mChanged( false )
00269 {
00270 connect( this, SIGNAL( changed() ), module, SIGNAL( changed() ) );
00271 }
00272
00273 QString Kleo::CryptoConfigEntryGUI::description() const
00274 {
00275 QString descr = mEntry->description();
00276 if ( descr.isEmpty() )
00277 descr = QString( "<%1>" ).arg( mName );
00278 return descr;
00279 }
00280
00281 void Kleo::CryptoConfigEntryGUI::resetToDefault()
00282 {
00283 mEntry->resetToDefault();
00284 load();
00285 }
00286
00288
00289 Kleo::CryptoConfigEntryLineEdit::CryptoConfigEntryLineEdit(
00290 CryptoConfigModule* module,
00291 Kleo::CryptoConfigEntry* entry, const QString& entryName,
00292 QWidget* parent, const char* name )
00293 : CryptoConfigEntryGUI( module, entry, entryName, parent, name )
00294 {
00295 setSpacing( KDialog::spacingHint() );
00296 QLabel* label = new QLabel( description(), this );
00297 mLineEdit = new KLineEdit( this );
00298 connect( mLineEdit, SIGNAL( textChanged( const QString& ) ), SLOT( slotChanged() ) );
00299 label->setBuddy( mLineEdit );
00300 QWidget* stretch = new QWidget( this );
00301 setStretchFactor( stretch, 1 );
00302 }
00303
00304 void Kleo::CryptoConfigEntryLineEdit::doSave()
00305 {
00306 mEntry->setStringValue( mLineEdit->text() );
00307 }
00308
00309 void Kleo::CryptoConfigEntryLineEdit::doLoad()
00310 {
00311 mLineEdit->setText( mEntry->stringValue() );
00312 }
00313
00315
00316 Kleo::CryptoConfigEntrySpinBox::CryptoConfigEntrySpinBox(
00317 CryptoConfigModule* module,
00318 Kleo::CryptoConfigEntry* entry, const QString& entryName,
00319 QWidget* parent, const char* name )
00320 : CryptoConfigEntryGUI( module, entry, entryName, parent, name )
00321 {
00322 setSpacing( KDialog::spacingHint() );
00323 QLabel* label = new QLabel( description(), this );
00324
00325 if ( entry->argType() == Kleo::CryptoConfigEntry::ArgType_None && entry->isList() ) {
00326 mKind = ListOfNone;
00327 } else if ( entry->argType() == Kleo::CryptoConfigEntry::ArgType_UInt ) {
00328 mKind = UInt;
00329 } else {
00330 Q_ASSERT( entry->argType() == Kleo::CryptoConfigEntry::ArgType_Int );
00331 mKind = Int;
00332 }
00333
00334 mNumInput = new KIntNumInput( this );
00335 if ( mKind == UInt || mKind == ListOfNone )
00336 mNumInput->setMinValue( 0 );
00337 connect( mNumInput, SIGNAL( valueChanged(int) ), SLOT( slotChanged() ) );
00338 label->setBuddy( mNumInput );
00339
00340 QWidget* stretch = new QWidget( this );
00341 setStretchFactor( stretch, 1 );
00342 }
00343
00344 void Kleo::CryptoConfigEntrySpinBox::doSave()
00345 {
00346 int value = mNumInput->value();
00347 switch ( mKind ) {
00348 case ListOfNone:
00349 mEntry->setNumberOfTimesSet( value );
00350 break;
00351 case UInt:
00352 mEntry->setUIntValue( value );
00353 break;
00354 case Int:
00355 mEntry->setIntValue( value );
00356 break;
00357 }
00358 }
00359
00360 void Kleo::CryptoConfigEntrySpinBox::doLoad()
00361 {
00362 int value = 0;
00363 switch ( mKind ) {
00364 case ListOfNone:
00365 value = mEntry->numberOfTimesSet();
00366 break;
00367 case UInt:
00368 value = mEntry->uintValue();
00369 break;
00370 case Int:
00371 value = mEntry->intValue();
00372 break;
00373 }
00374 mNumInput->setValue( value );
00375 }
00376
00378
00379 Kleo::CryptoConfigEntryCheckBox::CryptoConfigEntryCheckBox(
00380 CryptoConfigModule* module,
00381 Kleo::CryptoConfigEntry* entry, const QString& entryName,
00382 QWidget* parent, const char* name )
00383 : CryptoConfigEntryGUI( module, entry, entryName, parent, name )
00384 {
00385 mCheckBox = new QCheckBox( this);
00386 mCheckBox->setText( description() );
00387 connect( mCheckBox, SIGNAL( toggled(bool) ), SLOT( slotChanged() ) );
00388 }
00389
00390 void Kleo::CryptoConfigEntryCheckBox::doSave()
00391 {
00392 mEntry->setBoolValue( mCheckBox->isChecked() );
00393 }
00394
00395 void Kleo::CryptoConfigEntryCheckBox::doLoad()
00396 {
00397 mCheckBox->setChecked( mEntry->boolValue() );
00398 }
00399
00400 Kleo::CryptoConfigEntryLDAPURL::CryptoConfigEntryLDAPURL(
00401 CryptoConfigModule* module,
00402 Kleo::CryptoConfigEntry* entry,
00403 const QString& entryName,
00404 QWidget* parent, const char* name )
00405 : CryptoConfigEntryGUI( module, entry, entryName, parent, name )
00406 {
00407 setSpacing( KDialog::spacingHint() );
00408 QLabel* label = new QLabel( description(), this );
00409 mPushButton = new QPushButton( i18n( "Edit..." ), this );
00410 mLabel = new QLabel( this );
00411 connect( mPushButton, SIGNAL( clicked() ), SLOT( slotOpenDialog() ) );
00412 label->setBuddy( mPushButton );
00413 QWidget* stretch = new QWidget( this );
00414 setStretchFactor( stretch, 1 );
00415 }
00416
00417 void Kleo::CryptoConfigEntryLDAPURL::doLoad()
00418 {
00419 setURLList( mEntry->urlValueList() );
00420 }
00421
00422 void Kleo::CryptoConfigEntryLDAPURL::doSave()
00423 {
00424 mEntry->setURLValueList( mURLList );
00425 }
00426
00427 void Kleo::CryptoConfigEntryLDAPURL::slotOpenDialog()
00428 {
00429
00430
00431 KDialogBase dialog( this, 0, true ,
00432 i18n( "Configure LDAP Servers" ),
00433 KDialogBase::Default|KDialogBase::Cancel|KDialogBase::Ok,
00434 KDialogBase::Ok, true );
00435 DirectoryServicesWidget* dirserv = new DirectoryServicesWidget( mEntry, &dialog );
00436 dirserv->load();
00437 dialog.setMainWidget( dirserv );
00438 connect( &dialog, SIGNAL( defaultClicked() ), dirserv, SLOT( defaults() ) );
00439 if ( dialog.exec() ) {
00440
00441
00442 setURLList( dirserv->urlList() );
00443 slotChanged();
00444 }
00445 }
00446
00447 void Kleo::CryptoConfigEntryLDAPURL::setURLList( const KURL::List& urlList )
00448 {
00449 mURLList = urlList;
00450 if ( mURLList.isEmpty() )
00451 mLabel->setText( i18n( "No server configured yet" ) );
00452 else
00453 mLabel->setText( i18n( "1 server configured", "%n servers configured", mURLList.count() ) );
00454 }
00455
00456 #include "cryptoconfigmodule.moc"