32 #include "cryptoconfigmodule.h"
33 #include "cryptoconfigmodule_p.h"
34 #include "directoryserviceswidget.h"
35 #include "kdhorizontalline.h"
37 #include <kleo/cryptoconfig.h>
39 #include <klineedit.h>
40 #include <tdelocale.h>
41 #include <kdialogbase.h>
43 #include <knuminput.h>
44 #include <kiconloader.h>
45 #include <tdeglobal.h>
46 #include <kurlrequester.h>
53 #include <tqpushbutton.h>
56 #include <tqapplication.h>
60 static inline TQPixmap loadIcon( TQString s ) {
61 return TDEGlobal::instance()->iconLoader()
62 ->loadIcon( s.replace( TQRegExp(
"[^a-zA-Z0-9_]" ),
"_" ), TDEIcon::NoGroup, TDEIcon::SizeMedium );
69 unsigned int result = 0;
70 for ( TQStringList::const_iterator it = components.begin() ; it != components.end() ; ++it )
72 if ( !comp->groupList().empty() )
77 static const KJanusWidget::Face determineJanusFace(
const Kleo::CryptoConfig * config ) {
78 return num_components_with_options( config ) < 2
80 : KJanusWidget::IconList ;
83 Kleo::CryptoConfigModule::CryptoConfigModule(
Kleo::CryptoConfig* config, TQWidget * parent,
const char * name )
84 : KJanusWidget( parent, name, determineJanusFace( config ) ), mConfig( config )
87 if ( face() == Plain ) {
89 TQVBoxLayout * vlay =
new TQVBoxLayout( vbox, 0, KDialog::spacingHint() );
90 vlay->setAutoAdd(
true );
94 for ( TQStringList::const_iterator it = components.begin(); it != components.end(); ++it ) {
100 if ( face() != Plain ) {
101 TQString iconName = comp->
iconName();
102 if (iconName == TQString::null || iconName ==
"") {
105 vbox = addVBoxPage( comp->
description(), TQString(), loadIcon(iconName) );
108 TQScrollView * scrollView =
new TQScrollView( vbox );
109 scrollView->setHScrollBarMode( TQScrollView::AlwaysOff );
110 scrollView->setResizePolicy( TQScrollView::AutoOneFit );
111 TQVBox* boxInScrollView =
new TQVBox( scrollView->viewport() );
112 boxInScrollView->setMargin( KDialog::marginHint() );
113 scrollView->addChild( boxInScrollView );
115 CryptoConfigComponentGUI* compGUI =
116 new CryptoConfigComponentGUI(
this, comp, boxInScrollView, (*it).local8Bit() );
118 mComponentGUIs.append( compGUI );
121 const int deskHeight = TQApplication::desktop()->height();
123 if (deskHeight > 1000)
125 else if (deskHeight > 650)
129 TQSize sz = scrollView->sizeHint();
130 scrollView->setMinimumSize( sz.width()
131 + scrollView->style().pixelMetric(TQStyle::PM_ScrollBarExtent),
132 TQMIN( compGUI->sizeHint().height(), dialogHeight ) );
134 if ( mComponentGUIs.empty() ) {
135 Q_ASSERT( face() == Plain );
136 const TQString msg = i18n(
"The gpgconf tool used to provide the information "
137 "for this dialog does not seem to be installed "
138 "properly. It did not return any components. "
139 "Try running \"%1\" on the command line for more "
141 .arg( components.empty() ?
"gpgconf --list-components" :
"gpgconf --list-options gpg" );
142 TQLabel * label =
new TQLabel( msg, vbox );
143 label->setAlignment( TQt::WordBreak );
144 label->setMinimumHeight( fontMetrics().lineSpacing() * 5 );
148 bool Kleo::CryptoConfigModule::hasError()
const {
149 return mComponentGUIs.empty();
152 void Kleo::CryptoConfigModule::save()
154 bool changed =
false;
155 TQValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
156 for( ; it != mComponentGUIs.end(); ++it ) {
161 mConfig->sync(
true );
164 void Kleo::CryptoConfigModule::reset()
166 TQValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
167 for( ; it != mComponentGUIs.end(); ++it ) {
172 void Kleo::CryptoConfigModule::defaults()
174 TQValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
175 for( ; it != mComponentGUIs.end(); ++it ) {
180 void Kleo::CryptoConfigModule::cancel()
187 Kleo::CryptoConfigComponentGUI::CryptoConfigComponentGUI(
189 TQWidget* parent,
const char* name )
190 : TQWidget( parent, name ),
191 mComponent( component )
193 TQGridLayout * glay =
new TQGridLayout(
this, 1, 3, 0, KDialog::spacingHint() );
194 const TQStringList groups = mComponent->groupList();
195 if ( groups.size() > 1 ) {
196 glay->setColSpacing( 0, KDHorizontalLine::indentHint() );
197 for ( TQStringList::const_iterator it = groups.begin(), end = groups.end() ; it != end; ++it ) {
202 KDHorizontalLine * hl =
new KDHorizontalLine( group->
description(),
this );
203 const int row = glay->numRows();
204 glay->addMultiCellWidget( hl, row, row, 0, 2 );
205 mGroupGUIs.append(
new CryptoConfigGroupGUI( module, group, glay,
this ) );
207 }
else if ( !groups.empty() ) {
208 mGroupGUIs.append(
new CryptoConfigGroupGUI( module, mComponent->group( groups.front() ), glay,
this ) );
210 glay->setRowStretch( glay->numRows(), 1 );
214 bool Kleo::CryptoConfigComponentGUI::save()
216 bool changed =
false;
217 TQValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
218 for( ; it != mGroupGUIs.end(); ++it ) {
225 void Kleo::CryptoConfigComponentGUI::load()
227 TQValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
228 for( ; it != mGroupGUIs.end(); ++it )
232 void Kleo::CryptoConfigComponentGUI::defaults()
234 TQValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
235 for( ; it != mGroupGUIs.end(); ++it )
241 Kleo::CryptoConfigGroupGUI::CryptoConfigGroupGUI(
243 TQGridLayout * glay, TQWidget* widget,
const char* name )
244 : TQObject( module, name ), mGroup( group )
246 const int startRow = glay->numRows();
247 const TQStringList entries = mGroup->entryList();
248 for( TQStringList::const_iterator it = entries.begin(), end = entries.end() ; it != end; ++it ) {
251 if ( entry->
level() > CryptoConfigEntry::Level_Advanced )
continue;
252 CryptoConfigEntryGUI* entryGUI =
253 CryptoConfigEntryGUIFactory::createEntryGUI( module, entry, *it, glay, widget );
255 mEntryGUIs.append( entryGUI );
259 const int endRow = glay->numRows() - 1;
260 if ( endRow < startRow )
263 const TQString iconName = group->
iconName();
264 if ( iconName.isEmpty() )
267 TQLabel * l =
new TQLabel( widget );
268 l->setPixmap( loadIcon( iconName ) );
269 glay->addMultiCellWidget( l, startRow, endRow, 0, 0, TQt::AlignTop );
272 bool Kleo::CryptoConfigGroupGUI::save()
274 bool changed =
false;
275 TQValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
276 for( ; it != mEntryGUIs.end(); ++it ) {
277 if ( (*it)->isChanged() ) {
285 void Kleo::CryptoConfigGroupGUI::load()
287 TQValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
288 for( ; it != mEntryGUIs.end(); ++it )
292 void Kleo::CryptoConfigGroupGUI::defaults()
294 TQValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
295 for( ; it != mEntryGUIs.end(); ++it )
296 (*it)->resetToDefault();
301 CryptoConfigEntryGUI* Kleo::CryptoConfigEntryGUIFactory::createEntryGUI(
CryptoConfigModule* module,
Kleo::CryptoConfigEntry* entry,
const TQString& entryName, TQGridLayout * glay, TQWidget* widget,
const char* name )
305 case Kleo::CryptoConfigEntry::ArgType_None:
307 return new CryptoConfigEntrySpinBox( module, entry, entryName, glay, widget, name );
308 case Kleo::CryptoConfigEntry::ArgType_Int:
309 case Kleo::CryptoConfigEntry::ArgType_UInt:
311 return new CryptoConfigEntryLineEdit( module, entry, entryName, glay, widget, name );
312 case Kleo::CryptoConfigEntry::ArgType_URL:
313 case Kleo::CryptoConfigEntry::ArgType_Path:
314 case Kleo::CryptoConfigEntry::ArgType_DirPath:
315 case Kleo::CryptoConfigEntry::ArgType_String:
316 kdWarning(5150) <<
"No widget implemented for list of type " << entry->
argType() << endl;
318 case Kleo::CryptoConfigEntry::ArgType_LDAPURL:
319 return new CryptoConfigEntryLDAPURL( module, entry, entryName, glay, widget, name );
321 kdWarning(5150) <<
"No widget implemented for list of (unknown) type " << entry->
argType() << endl;
326 case Kleo::CryptoConfigEntry::ArgType_None:
327 return new CryptoConfigEntryCheckBox( module, entry, entryName, glay, widget, name );
328 case Kleo::CryptoConfigEntry::ArgType_Int:
329 case Kleo::CryptoConfigEntry::ArgType_UInt:
330 return new CryptoConfigEntrySpinBox( module, entry, entryName, glay, widget, name );
331 case Kleo::CryptoConfigEntry::ArgType_URL:
332 return new CryptoConfigEntryURL( module, entry, entryName, glay, widget, name );
333 case Kleo::CryptoConfigEntry::ArgType_Path:
334 return new CryptoConfigEntryPath( module, entry, entryName, glay, widget, name );
335 case Kleo::CryptoConfigEntry::ArgType_DirPath:
336 return new CryptoConfigEntryDirPath( module, entry, entryName, glay, widget, name );
337 case Kleo::CryptoConfigEntry::ArgType_LDAPURL:
338 kdWarning(5150) <<
"No widget implemented for type " << entry->
argType() << endl;
340 case Kleo::CryptoConfigEntry::ArgType_String:
341 return new CryptoConfigEntryLineEdit( module, entry, entryName, glay, widget, name );
343 kdWarning(5150) <<
"No widget implemented for (unknown) type " << entry->
argType() << endl;
349 Kleo::CryptoConfigEntryGUI::CryptoConfigEntryGUI(
352 const TQString& entryName,
354 : TQObject( module, name ), mEntry( entry ), mName( entryName ), mChanged( false )
356 connect(
this, TQ_SIGNAL( changed() ), module, TQ_SIGNAL( changed() ) );
359 TQString Kleo::CryptoConfigEntryGUI::description()
const
361 TQString descr = mEntry->description();
362 if ( descr.isEmpty() )
363 descr = TQString(
"<%1>" ).arg( mName );
367 void Kleo::CryptoConfigEntryGUI::resetToDefault()
369 mEntry->resetToDefault();
375 Kleo::CryptoConfigEntryLineEdit::CryptoConfigEntryLineEdit(
378 TQGridLayout * glay, TQWidget* widget,
const char* name )
379 : CryptoConfigEntryGUI( module, entry, entryName, name )
381 const int row = glay->numRows();
382 mLineEdit =
new KLineEdit( widget );
383 TQLabel* label =
new TQLabel( mLineEdit, description(), widget );
384 glay->addWidget( label, row, 1 );
385 glay->addWidget( mLineEdit, row, 2 );
387 label->setEnabled(
false );
388 mLineEdit->setEnabled(
false );
390 connect( mLineEdit, TQ_SIGNAL( textChanged(
const TQString& ) ), TQ_SLOT( slotChanged() ) );
394 void Kleo::CryptoConfigEntryLineEdit::doSave()
396 mEntry->setStringValue( mLineEdit->text() );
399 void Kleo::CryptoConfigEntryLineEdit::doLoad()
401 mLineEdit->setText( mEntry->stringValue() );
406 Kleo::CryptoConfigEntryPath::CryptoConfigEntryPath(
409 TQGridLayout * glay, TQWidget* widget,
const char* name )
410 : CryptoConfigEntryGUI( module, entry, entryName, name )
412 const int row = glay->numRows();
413 mUrlRequester =
new KURLRequester( widget );
414 mUrlRequester->setMode( KFile::File | KFile::ExistingOnly | KFile::LocalOnly );
415 TQLabel* label =
new TQLabel( mUrlRequester, description(), widget );
416 glay->addWidget( label, row, 1 );
417 glay->addWidget( mUrlRequester, row, 2 );
419 label->setEnabled(
false );
420 mUrlRequester->setEnabled(
false );
422 connect( mUrlRequester, TQ_SIGNAL( textChanged(
const TQString& ) ), TQ_SLOT( slotChanged() ) );
426 void Kleo::CryptoConfigEntryPath::doSave()
429 url.setPath( mUrlRequester->url() );
430 mEntry->setURLValue( url );
433 void Kleo::CryptoConfigEntryPath::doLoad()
435 mUrlRequester->setURL( mEntry->urlValue().path() );
440 Kleo::CryptoConfigEntryDirPath::CryptoConfigEntryDirPath(
443 TQGridLayout * glay, TQWidget* widget,
const char* name )
444 : CryptoConfigEntryGUI( module, entry, entryName, name )
446 const int row = glay->numRows();
447 mUrlRequester =
new KURLRequester( widget );
448 mUrlRequester->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
449 TQLabel* label =
new TQLabel( mUrlRequester, description(), widget );
450 glay->addWidget( label, row, 1 );
451 glay->addWidget( mUrlRequester, row, 2 );
453 label->setEnabled(
false );
454 mUrlRequester->setEnabled(
false );
456 connect( mUrlRequester, TQ_SIGNAL( textChanged(
const TQString& ) ), TQ_SLOT( slotChanged() ) );
460 void Kleo::CryptoConfigEntryDirPath::doSave()
463 url.setPath( mUrlRequester->url() );
464 mEntry->setURLValue( url );
468 void Kleo::CryptoConfigEntryDirPath::doLoad()
470 mUrlRequester->setURL( mEntry->urlValue().path() );
475 Kleo::CryptoConfigEntryURL::CryptoConfigEntryURL(
478 TQGridLayout * glay, TQWidget* widget,
const char* name )
479 : CryptoConfigEntryGUI( module, entry, entryName, name )
481 const int row = glay->numRows();
482 mUrlRequester =
new KURLRequester( widget );
483 mUrlRequester->setMode( KFile::File | KFile::ExistingOnly );
484 TQLabel* label =
new TQLabel( mUrlRequester, description(), widget );
485 glay->addWidget( label, row, 1 );
486 glay->addWidget( mUrlRequester, row, 2 );
488 label->setEnabled(
false );
489 mUrlRequester->setEnabled(
false );
491 connect( mUrlRequester, TQ_SIGNAL( textChanged(
const TQString& ) ), TQ_SLOT( slotChanged() ) );
495 void Kleo::CryptoConfigEntryURL::doSave()
497 mEntry->setURLValue( mUrlRequester->url() );
500 void Kleo::CryptoConfigEntryURL::doLoad()
502 mUrlRequester->setURL( mEntry->urlValue().url() );
507 Kleo::CryptoConfigEntrySpinBox::CryptoConfigEntrySpinBox(
510 TQGridLayout * glay, TQWidget* widget,
const char* name )
511 : CryptoConfigEntryGUI( module, entry, entryName, name )
514 if ( entry->
argType() == Kleo::CryptoConfigEntry::ArgType_None && entry->
isList() ) {
516 }
else if ( entry->
argType() == Kleo::CryptoConfigEntry::ArgType_UInt ) {
519 Q_ASSERT( entry->
argType() == Kleo::CryptoConfigEntry::ArgType_Int );
523 const int row = glay->numRows();
524 mNumInput =
new KIntNumInput( widget );
525 TQLabel* label =
new TQLabel( mNumInput, description(), widget );
526 glay->addWidget( label, row, 1 );
527 glay->addWidget( mNumInput, row, 2 );
530 label->setEnabled(
false );
531 mNumInput->setEnabled(
false );
533 if ( mKind == UInt || mKind == ListOfNone )
534 mNumInput->setMinValue( 0 );
535 connect( mNumInput, TQ_SIGNAL( valueChanged(
int) ), TQ_SLOT( slotChanged() ) );
539 void Kleo::CryptoConfigEntrySpinBox::doSave()
541 int value = mNumInput->value();
544 mEntry->setNumberOfTimesSet( value );
547 mEntry->setUIntValue( value );
550 mEntry->setIntValue( value );
555 void Kleo::CryptoConfigEntrySpinBox::doLoad()
560 value = mEntry->numberOfTimesSet();
563 value = mEntry->uintValue();
566 value = mEntry->intValue();
569 mNumInput->setValue( value );
574 Kleo::CryptoConfigEntryCheckBox::CryptoConfigEntryCheckBox(
577 TQGridLayout * glay, TQWidget* widget,
const char* name )
578 : CryptoConfigEntryGUI( module, entry, entryName, name )
580 const int row = glay->numRows();
581 mCheckBox =
new TQCheckBox( widget );
582 glay->addMultiCellWidget( mCheckBox, row, row, 1, 2 );
583 mCheckBox->setText( description() );
585 mCheckBox->setEnabled(
false );
587 connect( mCheckBox, TQ_SIGNAL( toggled(
bool) ), TQ_SLOT( slotChanged() ) );
591 void Kleo::CryptoConfigEntryCheckBox::doSave()
593 mEntry->setBoolValue( mCheckBox->isChecked() );
596 void Kleo::CryptoConfigEntryCheckBox::doLoad()
598 mCheckBox->setChecked( mEntry->boolValue() );
601 Kleo::CryptoConfigEntryLDAPURL::CryptoConfigEntryLDAPURL(
604 const TQString& entryName,
605 TQGridLayout * glay, TQWidget* widget,
const char* name )
606 : CryptoConfigEntryGUI( module, entry, entryName, name )
608 mLabel =
new TQLabel( widget );
609 mPushButton =
new TQPushButton( i18n(
"Edit..." ), widget );
611 const int row = glay->numRows();
612 glay->addWidget(
new TQLabel( mPushButton, description(), widget ), row, 1 );
613 TQHBoxLayout * hlay =
new TQHBoxLayout;
614 glay->addLayout( hlay, row, 2 );
615 hlay->addWidget( mLabel, 1 );
616 hlay->addWidget( mPushButton );
619 mLabel->setEnabled(
false );
622 connect( mPushButton, TQ_SIGNAL( clicked() ), TQ_SLOT( slotOpenDialog() ) );
626 void Kleo::CryptoConfigEntryLDAPURL::doLoad()
628 setURLList( mEntry->urlValueList() );
631 void Kleo::CryptoConfigEntryLDAPURL::doSave()
633 mEntry->setURLValueList( mURLList );
636 void Kleo::CryptoConfigEntryLDAPURL::slotOpenDialog()
640 KDialogBase dialog( mPushButton->parentWidget(), 0,
true ,
641 i18n(
"Configure LDAP Servers" ),
642 KDialogBase::Default|KDialogBase::Cancel|KDialogBase::Ok,
643 KDialogBase::Ok,
true );
644 DirectoryServicesWidget* dirserv =
new DirectoryServicesWidget( mEntry, &dialog );
646 dialog.setMainWidget( dirserv );
647 connect( &dialog, TQ_SIGNAL( defaultClicked() ), dirserv, TQ_SLOT( defaults() ) );
648 if ( dialog.exec() ) {
651 setURLList( dirserv->urlList() );
656 void Kleo::CryptoConfigEntryLDAPURL::setURLList(
const KURL::List& urlList )
659 if ( mURLList.isEmpty() )
660 mLabel->setText( i18n(
"No server configured yet" ) );
662 mLabel->setText( i18n(
"1 server configured",
"%n servers configured", mURLList.count() ) );
665 #include "cryptoconfigmodule.moc"
666 #include "cryptoconfigmodule_p.moc"
Crypto config for one component (e.g.
virtual TQString iconName() const =0
Return the name of the icon for this component.
virtual TQString description() const =0
Return user-visible description of this component.
virtual TQStringList groupList() const =0
Returns the list of groups that are known about.
Description of a single option.
virtual bool isList() const =0
virtual ArgType argType() const =0
Argument type.
virtual Level level() const =0
User level.
virtual bool isReadOnly() const =0
Group containing a set of config options.
virtual CryptoConfigEntry * entry(const TQString &name) const =0
virtual TQString description() const =0
virtual TQString iconName() const =0
Return the name of the icon for this group.
Crypto Config Module widget, dynamically generated from CryptoConfig It's a simple TQWidget so that i...
Main interface to crypto configuration.
virtual TQStringList componentList() const =0
Returns the list of known components (e.g.
virtual CryptoConfigComponent * component(const TQString &name) const =0