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 ) {
104 TQScrollView * scrollView =
new TQScrollView( vbox );
105 scrollView->setHScrollBarMode( TQScrollView::AlwaysOff );
106 scrollView->setResizePolicy( TQScrollView::AutoOneFit );
107 TQVBox* boxInScrollView =
new TQVBox( scrollView->viewport() );
108 boxInScrollView->setMargin( KDialog::marginHint() );
109 scrollView->addChild( boxInScrollView );
111 CryptoConfigComponentGUI* compGUI =
112 new CryptoConfigComponentGUI(
this, comp, boxInScrollView, (*it).local8Bit() );
114 mComponentGUIs.append( compGUI );
117 const int deskHeight = TQApplication::desktop()->height();
119 if (deskHeight > 1000)
121 else if (deskHeight > 650)
125 TQSize sz = scrollView->sizeHint();
126 scrollView->setMinimumSize( sz.width()
127 + scrollView->style().pixelMetric(TQStyle::PM_ScrollBarExtent),
128 TQMIN( compGUI->sizeHint().height(), dialogHeight ) );
130 if ( mComponentGUIs.empty() ) {
131 Q_ASSERT( face() == Plain );
132 const TQString msg = i18n(
"The gpgconf tool used to provide the information " 133 "for this dialog does not seem to be installed " 134 "properly. It did not return any components. " 135 "Try running \"%1\" on the command line for more " 137 .arg( components.empty() ?
"gpgconf --list-components" :
"gpgconf --list-options gpg" );
138 TQLabel * label =
new TQLabel( msg, vbox );
139 label->setAlignment( TQt::WordBreak );
140 label->setMinimumHeight( fontMetrics().lineSpacing() * 5 );
144 bool Kleo::CryptoConfigModule::hasError()
const {
145 return mComponentGUIs.empty();
148 void Kleo::CryptoConfigModule::save()
150 bool changed =
false;
151 TQValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
152 for( ; it != mComponentGUIs.end(); ++it ) {
157 mConfig->sync(
true );
160 void Kleo::CryptoConfigModule::reset()
162 TQValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
163 for( ; it != mComponentGUIs.end(); ++it ) {
168 void Kleo::CryptoConfigModule::defaults()
170 TQValueList<CryptoConfigComponentGUI *>::Iterator it = mComponentGUIs.begin();
171 for( ; it != mComponentGUIs.end(); ++it ) {
176 void Kleo::CryptoConfigModule::cancel()
183 Kleo::CryptoConfigComponentGUI::CryptoConfigComponentGUI(
185 TQWidget* parent,
const char* name )
186 : TQWidget( parent, name ),
187 mComponent( component )
189 TQGridLayout * glay =
new TQGridLayout(
this, 1, 3, 0, KDialog::spacingHint() );
190 const TQStringList groups = mComponent->groupList();
191 if ( groups.size() > 1 ) {
192 glay->setColSpacing( 0, KDHorizontalLine::indentHint() );
193 for ( TQStringList::const_iterator it = groups.begin(), end = groups.end() ; it != end; ++it ) {
198 KDHorizontalLine * hl =
new KDHorizontalLine( group->
description(), this );
199 const int row = glay->numRows();
200 glay->addMultiCellWidget( hl, row, row, 0, 2 );
201 mGroupGUIs.append(
new CryptoConfigGroupGUI( module, group, glay,
this ) );
203 }
else if ( !groups.empty() ) {
204 mGroupGUIs.append(
new CryptoConfigGroupGUI( module, mComponent->group( groups.front() ), glay,
this ) );
206 glay->setRowStretch( glay->numRows(), 1 );
210 bool Kleo::CryptoConfigComponentGUI::save()
212 bool changed =
false;
213 TQValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
214 for( ; it != mGroupGUIs.end(); ++it ) {
221 void Kleo::CryptoConfigComponentGUI::load()
223 TQValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
224 for( ; it != mGroupGUIs.end(); ++it )
228 void Kleo::CryptoConfigComponentGUI::defaults()
230 TQValueList<CryptoConfigGroupGUI *>::Iterator it = mGroupGUIs.begin();
231 for( ; it != mGroupGUIs.end(); ++it )
237 Kleo::CryptoConfigGroupGUI::CryptoConfigGroupGUI(
239 TQGridLayout * glay, TQWidget* widget,
const char* name )
240 : TQObject( module, name ), mGroup( group )
242 const int startRow = glay->numRows();
243 const TQStringList entries = mGroup->entryList();
244 for( TQStringList::const_iterator it = entries.begin(), end = entries.end() ; it != end; ++it ) {
247 if ( entry->
level() > CryptoConfigEntry::Level_Advanced )
continue;
248 CryptoConfigEntryGUI* entryGUI =
249 CryptoConfigEntryGUIFactory::createEntryGUI( module, entry, *it, glay, widget );
251 mEntryGUIs.append( entryGUI );
255 const int endRow = glay->numRows() - 1;
256 if ( endRow < startRow )
259 const TQString iconName = group->
iconName();
260 if ( iconName.isEmpty() )
263 TQLabel * l =
new TQLabel( widget );
264 l->setPixmap( loadIcon( iconName ) );
265 glay->addMultiCellWidget( l, startRow, endRow, 0, 0, TQt::AlignTop );
268 bool Kleo::CryptoConfigGroupGUI::save()
270 bool changed =
false;
271 TQValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
272 for( ; it != mEntryGUIs.end(); ++it ) {
273 if ( (*it)->isChanged() ) {
281 void Kleo::CryptoConfigGroupGUI::load()
283 TQValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
284 for( ; it != mEntryGUIs.end(); ++it )
288 void Kleo::CryptoConfigGroupGUI::defaults()
290 TQValueList<CryptoConfigEntryGUI *>::Iterator it = mEntryGUIs.begin();
291 for( ; it != mEntryGUIs.end(); ++it )
292 (*it)->resetToDefault();
297 CryptoConfigEntryGUI* Kleo::CryptoConfigEntryGUIFactory::createEntryGUI(
CryptoConfigModule* module,
Kleo::CryptoConfigEntry* entry,
const TQString& entryName, TQGridLayout * glay, TQWidget* widget,
const char* name )
301 case Kleo::CryptoConfigEntry::ArgType_None:
303 return new CryptoConfigEntrySpinBox( module, entry, entryName, glay, widget, name );
304 case Kleo::CryptoConfigEntry::ArgType_Int:
305 case Kleo::CryptoConfigEntry::ArgType_UInt:
307 return new CryptoConfigEntryLineEdit( module, entry, entryName, glay, widget, name );
308 case Kleo::CryptoConfigEntry::ArgType_URL:
309 case Kleo::CryptoConfigEntry::ArgType_Path:
310 case Kleo::CryptoConfigEntry::ArgType_DirPath:
311 case Kleo::CryptoConfigEntry::ArgType_String:
312 kdWarning(5150) <<
"No widget implemented for list of type " << entry->
argType() << endl;
314 case Kleo::CryptoConfigEntry::ArgType_LDAPURL:
315 return new CryptoConfigEntryLDAPURL( module, entry, entryName, glay, widget, name );
317 kdWarning(5150) <<
"No widget implemented for list of (unknown) type " << entry->
argType() << endl;
322 case Kleo::CryptoConfigEntry::ArgType_None:
323 return new CryptoConfigEntryCheckBox( module, entry, entryName, glay, widget, name );
324 case Kleo::CryptoConfigEntry::ArgType_Int:
325 case Kleo::CryptoConfigEntry::ArgType_UInt:
326 return new CryptoConfigEntrySpinBox( module, entry, entryName, glay, widget, name );
327 case Kleo::CryptoConfigEntry::ArgType_URL:
328 return new CryptoConfigEntryURL( module, entry, entryName, glay, widget, name );
329 case Kleo::CryptoConfigEntry::ArgType_Path:
330 return new CryptoConfigEntryPath( module, entry, entryName, glay, widget, name );
331 case Kleo::CryptoConfigEntry::ArgType_DirPath:
332 return new CryptoConfigEntryDirPath( module, entry, entryName, glay, widget, name );
333 case Kleo::CryptoConfigEntry::ArgType_LDAPURL:
334 kdWarning(5150) <<
"No widget implemented for type " << entry->
argType() << endl;
336 case Kleo::CryptoConfigEntry::ArgType_String:
337 return new CryptoConfigEntryLineEdit( module, entry, entryName, glay, widget, name );
339 kdWarning(5150) <<
"No widget implemented for (unknown) type " << entry->
argType() << endl;
345 Kleo::CryptoConfigEntryGUI::CryptoConfigEntryGUI(
348 const TQString& entryName,
350 : TQObject( module, name ), mEntry( entry ), mName( entryName ), mChanged( false )
352 connect(
this, TQT_SIGNAL( changed() ), module, TQT_SIGNAL( changed() ) );
355 TQString Kleo::CryptoConfigEntryGUI::description()
const 357 TQString descr = mEntry->description();
358 if ( descr.isEmpty() )
359 descr = TQString(
"<%1>" ).arg( mName );
363 void Kleo::CryptoConfigEntryGUI::resetToDefault()
365 mEntry->resetToDefault();
371 Kleo::CryptoConfigEntryLineEdit::CryptoConfigEntryLineEdit(
374 TQGridLayout * glay, TQWidget* widget,
const char* name )
375 : CryptoConfigEntryGUI( module, entry, entryName, name )
377 const int row = glay->numRows();
378 mLineEdit =
new KLineEdit( widget );
379 TQLabel* label =
new TQLabel( mLineEdit, description(), widget );
380 glay->addWidget( label, row, 1 );
381 glay->addWidget( mLineEdit, row, 2 );
383 label->setEnabled(
false );
384 mLineEdit->setEnabled(
false );
386 connect( mLineEdit, TQT_SIGNAL( textChanged(
const TQString& ) ), TQT_SLOT( slotChanged() ) );
390 void Kleo::CryptoConfigEntryLineEdit::doSave()
392 mEntry->setStringValue( mLineEdit->text() );
395 void Kleo::CryptoConfigEntryLineEdit::doLoad()
397 mLineEdit->setText( mEntry->stringValue() );
402 Kleo::CryptoConfigEntryPath::CryptoConfigEntryPath(
405 TQGridLayout * glay, TQWidget* widget,
const char* name )
406 : CryptoConfigEntryGUI( module, entry, entryName, name )
408 const int row = glay->numRows();
409 mUrlRequester =
new KURLRequester( widget );
410 mUrlRequester->setMode( KFile::File | KFile::ExistingOnly | KFile::LocalOnly );
411 TQLabel* label =
new TQLabel( mUrlRequester, description(), widget );
412 glay->addWidget( label, row, 1 );
413 glay->addWidget( mUrlRequester, row, 2 );
415 label->setEnabled(
false );
416 mUrlRequester->setEnabled(
false );
418 connect( mUrlRequester, TQT_SIGNAL( textChanged(
const TQString& ) ), TQT_SLOT( slotChanged() ) );
422 void Kleo::CryptoConfigEntryPath::doSave()
425 url.setPath( mUrlRequester->url() );
426 mEntry->setURLValue( url );
429 void Kleo::CryptoConfigEntryPath::doLoad()
431 mUrlRequester->setURL( mEntry->urlValue().path() );
436 Kleo::CryptoConfigEntryDirPath::CryptoConfigEntryDirPath(
439 TQGridLayout * glay, TQWidget* widget,
const char* name )
440 : CryptoConfigEntryGUI( module, entry, entryName, name )
442 const int row = glay->numRows();
443 mUrlRequester =
new KURLRequester( widget );
444 mUrlRequester->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
445 TQLabel* label =
new TQLabel( mUrlRequester, description(), widget );
446 glay->addWidget( label, row, 1 );
447 glay->addWidget( mUrlRequester, row, 2 );
449 label->setEnabled(
false );
450 mUrlRequester->setEnabled(
false );
452 connect( mUrlRequester, TQT_SIGNAL( textChanged(
const TQString& ) ), TQT_SLOT( slotChanged() ) );
456 void Kleo::CryptoConfigEntryDirPath::doSave()
459 url.setPath( mUrlRequester->url() );
460 mEntry->setURLValue( url );
464 void Kleo::CryptoConfigEntryDirPath::doLoad()
466 mUrlRequester->setURL( mEntry->urlValue().path() );
471 Kleo::CryptoConfigEntryURL::CryptoConfigEntryURL(
474 TQGridLayout * glay, TQWidget* widget,
const char* name )
475 : CryptoConfigEntryGUI( module, entry, entryName, name )
477 const int row = glay->numRows();
478 mUrlRequester =
new KURLRequester( widget );
479 mUrlRequester->setMode( KFile::File | KFile::ExistingOnly );
480 TQLabel* label =
new TQLabel( mUrlRequester, description(), widget );
481 glay->addWidget( label, row, 1 );
482 glay->addWidget( mUrlRequester, row, 2 );
484 label->setEnabled(
false );
485 mUrlRequester->setEnabled(
false );
487 connect( mUrlRequester, TQT_SIGNAL( textChanged(
const TQString& ) ), TQT_SLOT( slotChanged() ) );
491 void Kleo::CryptoConfigEntryURL::doSave()
493 mEntry->setURLValue( mUrlRequester->url() );
496 void Kleo::CryptoConfigEntryURL::doLoad()
498 mUrlRequester->setURL( mEntry->urlValue().url() );
503 Kleo::CryptoConfigEntrySpinBox::CryptoConfigEntrySpinBox(
506 TQGridLayout * glay, TQWidget* widget,
const char* name )
507 : CryptoConfigEntryGUI( module, entry, entryName, name )
510 if ( entry->
argType() == Kleo::CryptoConfigEntry::ArgType_None && entry->
isList() ) {
512 }
else if ( entry->
argType() == Kleo::CryptoConfigEntry::ArgType_UInt ) {
515 Q_ASSERT( entry->
argType() == Kleo::CryptoConfigEntry::ArgType_Int );
519 const int row = glay->numRows();
520 mNumInput =
new KIntNumInput( widget );
521 TQLabel* label =
new TQLabel( mNumInput, description(), widget );
522 glay->addWidget( label, row, 1 );
523 glay->addWidget( mNumInput, row, 2 );
526 label->setEnabled(
false );
527 mNumInput->setEnabled(
false );
529 if ( mKind == UInt || mKind == ListOfNone )
530 mNumInput->setMinValue( 0 );
531 connect( mNumInput, TQT_SIGNAL( valueChanged(
int) ), TQT_SLOT( slotChanged() ) );
535 void Kleo::CryptoConfigEntrySpinBox::doSave()
537 int value = mNumInput->value();
540 mEntry->setNumberOfTimesSet( value );
543 mEntry->setUIntValue( value );
546 mEntry->setIntValue( value );
551 void Kleo::CryptoConfigEntrySpinBox::doLoad()
556 value = mEntry->numberOfTimesSet();
559 value = mEntry->uintValue();
562 value = mEntry->intValue();
565 mNumInput->setValue( value );
570 Kleo::CryptoConfigEntryCheckBox::CryptoConfigEntryCheckBox(
573 TQGridLayout * glay, TQWidget* widget,
const char* name )
574 : CryptoConfigEntryGUI( module, entry, entryName, name )
576 const int row = glay->numRows();
577 mCheckBox =
new TQCheckBox( widget );
578 glay->addMultiCellWidget( mCheckBox, row, row, 1, 2 );
579 mCheckBox->setText( description() );
581 mCheckBox->setEnabled(
false );
583 connect( mCheckBox, TQT_SIGNAL( toggled(
bool) ), TQT_SLOT( slotChanged() ) );
587 void Kleo::CryptoConfigEntryCheckBox::doSave()
589 mEntry->setBoolValue( mCheckBox->isChecked() );
592 void Kleo::CryptoConfigEntryCheckBox::doLoad()
594 mCheckBox->setChecked( mEntry->boolValue() );
597 Kleo::CryptoConfigEntryLDAPURL::CryptoConfigEntryLDAPURL(
600 const TQString& entryName,
601 TQGridLayout * glay, TQWidget* widget,
const char* name )
602 : CryptoConfigEntryGUI( module, entry, entryName, name )
604 mLabel =
new TQLabel( widget );
605 mPushButton =
new TQPushButton( i18n(
"Edit..." ), widget );
607 const int row = glay->numRows();
608 glay->addWidget(
new TQLabel( mPushButton, description(), widget ), row, 1 );
609 TQHBoxLayout * hlay =
new TQHBoxLayout;
610 glay->addLayout( hlay, row, 2 );
611 hlay->addWidget( mLabel, 1 );
612 hlay->addWidget( mPushButton );
615 mLabel->setEnabled(
false );
618 connect( mPushButton, TQT_SIGNAL( clicked() ), TQT_SLOT( slotOpenDialog() ) );
622 void Kleo::CryptoConfigEntryLDAPURL::doLoad()
624 setURLList( mEntry->urlValueList() );
627 void Kleo::CryptoConfigEntryLDAPURL::doSave()
629 mEntry->setURLValueList( mURLList );
632 void Kleo::CryptoConfigEntryLDAPURL::slotOpenDialog()
636 KDialogBase dialog( mPushButton->parentWidget(), 0,
true ,
637 i18n(
"Configure LDAP Servers" ),
638 KDialogBase::Default|KDialogBase::Cancel|KDialogBase::Ok,
639 KDialogBase::Ok,
true );
640 DirectoryServicesWidget* dirserv =
new DirectoryServicesWidget( mEntry, &dialog );
642 dialog.setMainWidget( dirserv );
643 connect( &dialog, TQT_SIGNAL( defaultClicked() ), dirserv, TQT_SLOT( defaults() ) );
644 if ( dialog.exec() ) {
647 setURLList( dirserv->urlList() );
652 void Kleo::CryptoConfigEntryLDAPURL::setURLList(
const KURL::List& urlList )
655 if ( mURLList.isEmpty() )
656 mLabel->setText( i18n(
"No server configured yet" ) );
658 mLabel->setText( i18n(
"1 server configured",
"%n servers configured", mURLList.count() ) );
661 #include "cryptoconfigmodule.moc" 662 #include "cryptoconfigmodule_p.moc" virtual TQStringList groupList() const =0
Returns the list of groups that are known about.
virtual TQString iconName() const =0
Return the name of the icon for this group.
virtual TQString iconName() const =0
Return the name of the icon for this component.
Main interface to crypto configuration.
virtual bool isList() const =0
virtual bool isReadOnly() const =0
Crypto config for one component (e.g.
Group containing a set of config options.
virtual TQString description() const =0
Return user-visible description of this component.
Crypto Config Module widget, dynamically generated from CryptoConfig It's a simple TQWidget so that i...
Description of a single option.
virtual TQString description() const =0
virtual TQStringList componentList() const =0
Returns the list of known components (e.g.
virtual Level level() const =0
User level.
virtual CryptoConfigEntry * entry(const TQString &name) const =0
virtual ArgType argType() const =0
Argument type.
virtual CryptoConfigComponent * component(const TQString &name) const =0