/* This file is part of libkldap. Copyright (c) 2004-2006 Szombathelyi György This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "ldapconfigwidget.h" #include "ldapsearch.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace KLDAP; class LdapConfigWidget::Private { public: Private( LdapConfigWidget *parent ) : mParent( parent ), mFeatures( W_ALL ), mProg( 0 ) { mainLayout = new QGridLayout( mParent ); mainLayout->setMargin( 0 ); } void setLDAPPort(); void setLDAPSPort(); void setAnonymous( bool on ); void setSimple( bool on ); void setSASL( bool on ); void queryDNClicked(); void queryMechClicked(); void loadData( LdapSearch *search, const LdapObject &object ); void loadResult( LdapSearch *search ); void sendQuery(); void initWidget(); LdapConfigWidget *mParent; WinFlags mFeatures; QStringList mQResult; QString mAttr; KLineEdit *mUser; KLineEdit *mPassword; KLineEdit *mHost; QSpinBox *mPort, *mVersion, *mSizeLimit, *mTimeLimit, *mPageSize; KLineEdit *mDn, *mBindDn, *mRealm; KLineEdit *mFilter; QRadioButton *mAnonymous,*mSimple,*mSASL; QCheckBox *mSubTree; QPushButton *mEditButton; QPushButton *mQueryMech; QRadioButton *mSecNo,*mSecTLS,*mSecSSL; KComboBox *mMech; bool mCancelled; KProgressDialog *mProg; QGridLayout *mainLayout; }; void LdapConfigWidget::Private::initWidget() { QLabel *label; mUser = mPassword = mHost = mDn = mBindDn = mRealm = mFilter = 0; mPort = mVersion = mTimeLimit = mSizeLimit = 0; mAnonymous = mSimple = mSASL = mSecNo = mSecTLS = mSecSSL = 0; mEditButton = mQueryMech = 0; mPageSize = 0; mMech = 0; int row = 0; int col; if ( mFeatures & W_USER ) { label = new QLabel( i18n( "User:" ), mParent ); mUser = new KLineEdit( mParent ); mUser->setObjectName( QLatin1String("kcfg_ldapuser") ); mainLayout->addWidget( label, row, 0 ); mainLayout->addWidget( mUser, row, 1, 1, 3 ); row++; } if ( mFeatures & W_BINDDN ) { label = new QLabel( i18n( "Bind DN:" ), mParent ); mBindDn = new KLineEdit( mParent ); mBindDn->setObjectName( QLatin1String("kcfg_ldapbinddn") ); mainLayout->addWidget( label, row, 0 ); mainLayout->addWidget( mBindDn, row, 1, 1, 3 ); row++; } if ( mFeatures & W_REALM ) { label = new QLabel( i18n( "Realm:" ), mParent ); mRealm = new KLineEdit( mParent ); mRealm->setObjectName( QLatin1String("kcfg_ldaprealm") ); mainLayout->addWidget( label, row, 0 ); mainLayout->addWidget( mRealm, row, 1, 1, 3 ); row++; } if ( mFeatures & W_PASS ) { label = new QLabel( i18n( "Password:" ), mParent ); mPassword = new KLineEdit( mParent ); mPassword->setObjectName( QLatin1String("kcfg_ldappassword") ); mPassword->setEchoMode( KLineEdit::Password ); mainLayout->addWidget( label, row, 0 ); mainLayout->addWidget( mPassword, row, 1, 1, 3 ); row++; } if ( mFeatures & W_HOST ) { label = new QLabel( i18n( "Host:" ), mParent ); mHost = new KLineEdit( mParent ); mHost->setObjectName( QLatin1String("kcfg_ldaphost") ); mParent->connect(mHost, SIGNAL(textChanged(QString)), SIGNAL(hostNameChanged(QString))); mainLayout->addWidget( label, row, 0 ); mainLayout->addWidget( mHost, row, 1, 1, 3 ); row++; } col = 0; if ( mFeatures & W_PORT ) { label = new QLabel( i18n( "Port:" ), mParent ); mPort = new QSpinBox( mParent ); mPort->setRange( 0, 65535 ); mPort->setObjectName( QLatin1String("kcfg_ldapport") ); mPort->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) ); mPort->setValue( 389 ); mainLayout->addWidget( label, row, col ); mainLayout->addWidget( mPort, row, col+1 ); col += 2; } if ( mFeatures & W_VER ) { label = new QLabel( i18n( "LDAP version:" ), mParent ); mVersion = new QSpinBox( mParent ); mVersion->setRange( 2, 3 ); mVersion->setObjectName( QLatin1String("kcfg_ldapver") ); mVersion->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) ); mVersion->setValue( 3 ); mainLayout->addWidget( label, row, col ); mainLayout->addWidget( mVersion, row, col+1 ); } if ( mFeatures & ( W_PORT | W_VER ) ) { row++; } col = 0; if ( mFeatures & W_SIZELIMIT ) { label = new QLabel( i18n( "Size limit:" ), mParent ); mSizeLimit = new QSpinBox( mParent ); mSizeLimit->setRange( 0, 9999999 ); mSizeLimit->setObjectName( QLatin1String("kcfg_ldapsizelimit") ); mSizeLimit->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) ); mSizeLimit->setValue( 0 ); mSizeLimit->setSpecialValueText( i18nc( "default ldap size limit", "Default" ) ); mainLayout->addWidget( label, row, col ); mainLayout->addWidget( mSizeLimit, row, col+1 ); col += 2; } if ( mFeatures & W_TIMELIMIT ) { label = new QLabel( i18n( "Time limit:" ), mParent ); mTimeLimit = new QSpinBox( mParent ); mTimeLimit->setRange( 0, 9999999 ); mTimeLimit->setObjectName( QLatin1String("kcfg_ldaptimelimit") ); mTimeLimit->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) ); mTimeLimit->setValue( 0 ); mTimeLimit->setSuffix( i18n( " sec" ) ); mTimeLimit->setSpecialValueText( i18nc( "default ldap time limit", "Default" ) ); mainLayout->addWidget( label, row, col ); mainLayout->addWidget( mTimeLimit, row, col+1 ); } if ( mFeatures & ( W_SIZELIMIT | W_TIMELIMIT ) ) { row++; } if ( mFeatures & W_PAGESIZE ) { label = new QLabel( i18n( "Page size:" ), mParent ); mPageSize = new QSpinBox( mParent ); mPageSize->setRange( 0, 9999999 ); mPageSize->setObjectName( QLatin1String("kcfg_ldappagesize") ); mPageSize->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) ); mPageSize->setValue( 0 ); mPageSize->setSpecialValueText( i18n( "No paging" ) ); mainLayout->addWidget( label, row, 0 ); mainLayout->addWidget( mPageSize, row++, 1 ); } if ( mFeatures & W_DN ) { label = new QLabel( i18nc( "Distinguished Name", "DN:" ), mParent ); mDn = new KLineEdit( mParent ); mDn->setObjectName( QLatin1String("kcfg_ldapdn") ); mainLayout->addWidget( label, row, 0 ); mainLayout->addWidget( mDn, row, 1, 1, 1 ); //without host query doesn't make sense if ( mHost ) { QPushButton *dnquery = new QPushButton( i18n( "Query Server" ), mParent ); connect( dnquery, SIGNAL(clicked()), mParent, SLOT(queryDNClicked()) ); mainLayout->addWidget( dnquery, row, 2, 1, 1 ); } row++; } if ( mFeatures & W_FILTER ) { label = new QLabel( i18n( "Filter:" ), mParent ); mFilter = new KLineEdit( mParent ); mFilter->setObjectName( QLatin1String("kcfg_ldapfilter") ); mainLayout->addWidget( label, row, 0 ); mainLayout->addWidget( mFilter, row, 1, 1, 3 ); row++; } if ( mFeatures & W_SECBOX ) { QGroupBox *btgroup = new QGroupBox( i18n( "Security" ), mParent ); QHBoxLayout *hbox = new QHBoxLayout; btgroup->setLayout( hbox ); mSecNo = new QRadioButton( i18nc( "@option:radio set no security", "No" ), btgroup ); mSecNo->setObjectName( QLatin1String("kcfg_ldapnosec") ); hbox->addWidget( mSecNo ); mSecTLS = new QRadioButton( i18nc( "@option:radio use TLS security", "TLS" ), btgroup ); mSecTLS->setObjectName( QLatin1String("kcfg_ldaptls") ); hbox->addWidget( mSecTLS ); mSecSSL = new QRadioButton( i18nc( "@option:radio use SSL security", "SSL" ), btgroup ); mSecSSL->setObjectName( QLatin1String("kcfg_ldapssl") ); hbox->addWidget( mSecSSL ); mainLayout->addWidget( btgroup, row, 0, 1, 4 ); connect( mSecNo, SIGNAL(clicked()), mParent, SLOT(setLDAPPort()) ); connect( mSecTLS, SIGNAL(clicked()), mParent, SLOT(setLDAPPort()) ); connect( mSecSSL, SIGNAL(clicked()), mParent, SLOT(setLDAPSPort()) ); mSecNo->setChecked( true ); row++; } if ( mFeatures & W_AUTHBOX ) { QGroupBox *authbox = new QGroupBox( i18n( "Authentication" ), mParent ); QVBoxLayout *vbox = new QVBoxLayout; authbox->setLayout( vbox ); QHBoxLayout *hbox = new QHBoxLayout; vbox->addLayout( hbox ); mAnonymous = new QRadioButton( i18nc( "@option:radio anonymous authentication", "Anonymous" ), authbox ); mAnonymous->setObjectName( QLatin1String("kcfg_ldapanon") ); hbox->addWidget( mAnonymous ); mSimple = new QRadioButton( i18nc( "@option:radio simple authentication", "Simple" ), authbox ); mSimple->setObjectName( QLatin1String("kcfg_ldapsimple") ); hbox->addWidget( mSimple ); mSASL = new QRadioButton( i18nc( "@option:radio SASL authentication", "SASL" ), authbox ); mSASL->setObjectName( QLatin1String("kcfg_ldapsasl") ); hbox->addWidget( mSASL ); hbox = new QHBoxLayout; vbox->addLayout( hbox ); label = new QLabel( i18n( "SASL mechanism:" ), authbox ); hbox->addWidget( label ); mMech = new KComboBox( false, authbox ); mMech->setObjectName( QLatin1String("kcfg_ldapsaslmech") ); mMech->setEditable( true ); mMech->addItem( QLatin1String("DIGEST-MD5") ); mMech->addItem( QLatin1String("GSSAPI") ); mMech->addItem( QLatin1String("PLAIN") ); hbox->addWidget( mMech ); //without host query doesn't make sense if ( mHost ) { mQueryMech = new QPushButton( i18n( "Query Server" ), authbox ); hbox->addWidget( mQueryMech ); connect( mQueryMech, SIGNAL(clicked()), mParent, SLOT(queryMechClicked()) ); } mainLayout->addWidget( authbox, row, 0, 2, 4 ); connect( mAnonymous, SIGNAL(toggled(bool)), mParent, SLOT(setAnonymous(bool)) ); connect( mSimple, SIGNAL(toggled(bool)), mParent, SLOT(setSimple(bool)) ); connect( mSASL, SIGNAL(toggled(bool)), mParent, SLOT(setSASL(bool)) ); mAnonymous->setChecked( true ); } } void LdapConfigWidget::Private::sendQuery() { LdapServer _server( mParent->server() ); mQResult.clear(); mCancelled = true; if ( mAttr == QLatin1String("supportedsaslmechanisms") ) { _server.setAuth( LdapServer::Anonymous ); } LdapUrl _url( _server.url() ); _url.setDn( LdapDN( QLatin1String("") ) ); _url.setAttributes( QStringList( mAttr ) ); _url.setScope( LdapUrl::Base ); kDebug() << "sendQuery url:" << _url.prettyUrl(); LdapSearch search; connect( &search, SIGNAL(data(KLDAP::LdapSearch*,KLDAP::LdapObject)), mParent, SLOT(loadData(KLDAP::LdapSearch*,KLDAP::LdapObject)) ); connect( &search, SIGNAL(result(KLDAP::LdapSearch*)), mParent, SLOT(loadResult(KLDAP::LdapSearch*)) ); if ( !search.search( _url ) ) { KMessageBox::error( mParent, search.errorString() ); return; } if ( mProg == 0 ) { mProg = new KProgressDialog( mParent ); mProg->setWindowTitle( i18n( "LDAP Query" ) ); mProg->setModal( true ); } mProg->setLabelText( _url.prettyUrl() ); mProg->progressBar()->setRange( 0, 1 ); mProg->progressBar()->setValue( 0 ); mProg->exec(); if ( mCancelled ) { kDebug() << "query canceled!"; search.abandon(); } else { if ( search.error() ) { if ( search.errorString().isEmpty() ) { KMessageBox::error( mParent, i18nc( "%1 is a url to ldap server", "Unknown error connecting %1", _url.prettyUrl() ) ); } else { KMessageBox::error( mParent, search.errorString() ); } } } } void LdapConfigWidget::Private::queryMechClicked() { mAttr = QLatin1String("supportedsaslmechanisms"); sendQuery(); if ( !mQResult.isEmpty() ) { mQResult.sort(); mMech->clear(); mMech->addItems( mQResult ); } } void LdapConfigWidget::Private::queryDNClicked() { mAttr = QLatin1String("namingcontexts"); sendQuery(); if ( !mQResult.isEmpty() ) { mDn->setText( mQResult.first() ); } } void LdapConfigWidget::Private::loadData( LdapSearch *, const LdapObject &object ) { kDebug() << "object:" << object.toString(); mProg->progressBar()->setValue( mProg->progressBar()->value() + 1 ); LdapAttrMap::ConstIterator end( object.attributes().constEnd() ); for ( LdapAttrMap::ConstIterator it = object.attributes().constBegin(); it != end; ++it ) { LdapAttrValue::ConstIterator end2( ( *it ).constEnd() ); for ( LdapAttrValue::ConstIterator it2 = ( *it ).constBegin(); it2 != end2; ++it2 ) { mQResult.push_back( QString::fromUtf8( *it2 ) ); } } } void LdapConfigWidget::Private::loadResult( LdapSearch *search ) { Q_UNUSED( search ); mCancelled = false; mProg->close(); } void LdapConfigWidget::Private::setAnonymous( bool on ) { if ( !on ) { return; } if ( mUser ) { mUser->setEnabled( false ); } if ( mPassword ) { mPassword->setEnabled( false ); } if ( mBindDn ) { mBindDn->setEnabled( false ); } if ( mRealm ) { mRealm->setEnabled( false ); } if ( mMech ) { mMech->setEnabled( false ); } if ( mQueryMech ) { mQueryMech->setEnabled( false ); } } void LdapConfigWidget::Private::setSimple( bool on ) { if ( !on ) { return; } if ( mUser ) { mUser->setEnabled( false ); } if ( mPassword ) { mPassword->setEnabled( true ); } if ( mBindDn ) { mBindDn->setEnabled( true ); } if ( mRealm ) { mRealm->setEnabled( false ); } if ( mMech ) { mMech->setEnabled( false ); } if ( mQueryMech ) { mQueryMech->setEnabled( false ); } } void LdapConfigWidget::Private::setSASL( bool on ) { if ( !on ) { return; } if ( mUser ) { mUser->setEnabled( true ); } if ( mPassword ) { mPassword->setEnabled( true ); } if ( mBindDn ) { mBindDn->setEnabled( true ); } if ( mRealm ) { mRealm->setEnabled( true ); } if ( mMech ) { mMech->setEnabled( true ); } if ( mQueryMech ) { mQueryMech->setEnabled( true ); } } void LdapConfigWidget::Private::setLDAPPort() { if ( mPort ) { mPort->setValue( 389 ); } } void LdapConfigWidget::Private::setLDAPSPort() { if ( mPort ) { mPort->setValue( 636 ); } } LdapConfigWidget::LdapConfigWidget( QWidget *parent, Qt::WindowFlags fl ) : QWidget( parent, fl ), d( new Private( this ) ) { } LdapConfigWidget::LdapConfigWidget( LdapConfigWidget::WinFlags flags, QWidget *parent, Qt::WindowFlags fl ) : QWidget( parent, fl ), d( new Private( this ) ) { d->mFeatures = flags; d->initWidget(); } LdapConfigWidget::~LdapConfigWidget() { delete d; } LdapUrl LdapConfigWidget::url() const { return server().url(); } void LdapConfigWidget::setUrl( const LdapUrl &url ) { LdapServer _server; _server.setUrl( url ); setServer( _server ); } LdapServer LdapConfigWidget::server() const { LdapServer _server; if ( d->mSecSSL && d->mSecSSL->isChecked() ) { _server.setSecurity( LdapServer::SSL ); } else if ( d->mSecTLS && d->mSecTLS->isChecked() ) { _server.setSecurity( LdapServer::TLS ); } else { _server.setSecurity( LdapServer::None ); } if ( d->mUser ) { _server.setUser( d->mUser->text() ); } if ( d->mBindDn ) { _server.setBindDn( d->mBindDn->text() ); } if ( d->mPassword ) { _server.setPassword( d->mPassword->text() ); } if ( d->mRealm ) { _server.setRealm( d->mRealm->text() ); } if ( d->mHost ) { _server.setHost( d->mHost->text() ); } if ( d->mPort ) { _server.setPort( d->mPort->value() ); } if ( d->mDn ) { _server.setBaseDn( LdapDN( d->mDn->text() ) ); } if ( d->mFilter ) { _server.setFilter( d->mFilter->text() ); } if ( d->mVersion ) { _server.setVersion( d->mVersion->value() ); } if ( d->mSizeLimit && d->mSizeLimit->value() != 0 ) { _server.setSizeLimit( d->mSizeLimit->value() ); } if ( d->mTimeLimit && d->mTimeLimit->value() != 0 ) { _server.setTimeLimit( d->mTimeLimit->value() ); } if ( d->mPageSize && d->mPageSize->value() != 0 ) { _server.setPageSize( d->mPageSize->value() ); } if ( d->mAnonymous && d->mAnonymous->isChecked() ) { _server.setAuth( LdapServer::Anonymous ); } else if ( d->mSimple && d->mSimple->isChecked() ) { _server.setAuth( LdapServer::Simple ); } else if ( d->mSASL && d->mSASL->isChecked() ) { _server.setAuth( LdapServer::SASL ); _server.setMech( d->mMech->currentText() ); } return _server; } void LdapConfigWidget::setServer( const LdapServer &server ) { switch ( server.security() ) { case LdapServer::SSL: if ( d->mSecSSL ) { d->mSecSSL->setChecked( true ); } break; case LdapServer::TLS: if ( d->mSecTLS ) { d->mSecTLS->setChecked( true ); } break; case LdapServer::None: if ( d->mSecNo ) { d->mSecNo->setChecked( true ); } break; } switch ( server.auth() ) { case LdapServer::Anonymous: if ( d->mAnonymous ) { d->mAnonymous->setChecked( true ); } break; case LdapServer::Simple: if ( d->mSimple ) { d->mSimple->setChecked( true ); } break; case LdapServer::SASL: if ( d->mSASL ) { d->mSASL->setChecked( true ); } break; } setUser( server.user() ); setBindDn( server.bindDn() ); setPassword( server.password() ); setRealm( server.realm() ); setHost( server.host() ); setPort( server.port() ); setFilter( server.filter() ); setDn( server.baseDn() ); setVersion( server.version() ); setSizeLimit( server.sizeLimit() ); setTimeLimit( server.timeLimit() ); setPageSize( server.pageSize() ); setMech( server.mech() ); } void LdapConfigWidget::setUser( const QString &user ) { if ( d->mUser ) { d->mUser->setText( user ); } } QString LdapConfigWidget::user() const { return d->mUser ? d->mUser->text() : QString(); } void LdapConfigWidget::setPassword( const QString &password ) { if ( d->mPassword ) { d->mPassword->setText( password ); } } QString LdapConfigWidget::password() const { return d->mPassword ? d->mPassword->text() : QString(); } void LdapConfigWidget::setBindDn( const QString &binddn ) { if ( d->mBindDn ) { d->mBindDn->setText( binddn ); } } QString LdapConfigWidget::bindDn() const { return d->mBindDn ? d->mBindDn->text() : QString(); } void LdapConfigWidget::setRealm( const QString &realm ) { if ( d->mRealm ) { d->mRealm->setText( realm ); } } QString LdapConfigWidget::realm() const { return d->mRealm ? d->mRealm->text() : QString(); } void LdapConfigWidget::setHost( const QString &host ) { if ( d->mHost ) { d->mHost->setText( host ); } } QString LdapConfigWidget::host() const { return d->mHost ? d->mHost->text() : QString(); } void LdapConfigWidget::setPort( int port ) { if ( d->mPort ) { d->mPort->setValue( port ); } } int LdapConfigWidget::port() const { return d->mPort ? d->mPort->value() : 389; } void LdapConfigWidget::setVersion( int version ) { if ( d->mVersion ) { d->mVersion->setValue( version ); } } int LdapConfigWidget::version() const { return d->mVersion ? d->mVersion->value() : 3; } void LdapConfigWidget::setDn( const LdapDN &dn ) { if ( d->mDn ) { d->mDn->setText( dn.toString() ); } } LdapDN LdapConfigWidget::dn() const { return d->mDn ? LdapDN( d->mDn->text() ) : LdapDN(); } void LdapConfigWidget::setFilter( const QString &filter ) { if ( d->mFilter ) { d->mFilter->setText( filter ); } } QString LdapConfigWidget::filter() const { return d->mFilter ? d->mFilter->text() : QString(); } void LdapConfigWidget::setMech( const QString &mech ) { if ( d->mMech == 0 ) { return; } if ( !mech.isEmpty() ) { int i = 0; while ( i < d->mMech->count() ) { if ( d->mMech->itemText( i ) == mech ) { break; } i++; } if ( i == d->mMech->count() ) { d->mMech->addItem( mech ); } d->mMech->setCurrentIndex( i ); } } QString LdapConfigWidget::mech() const { return d->mMech ? d->mMech->currentText() : QString(); } void LdapConfigWidget::setSecurity( Security security ) { switch ( security ) { case None: d->mSecNo->setChecked( true ); break; case SSL: d->mSecSSL->setChecked( true ); break; case TLS: d->mSecTLS->setChecked( true ); break; } } LdapConfigWidget::Security LdapConfigWidget::security() const { if ( d->mSecTLS->isChecked() ) { return TLS; } if ( d->mSecSSL->isChecked() ) { return SSL; } return None; } void LdapConfigWidget::setAuth( Auth auth ) { switch ( auth ) { case Anonymous: d->mAnonymous->setChecked( true ); break; case Simple: d->mSimple->setChecked( true ); break; case SASL: d->mSASL->setChecked( true ); break; } } LdapConfigWidget::Auth LdapConfigWidget::auth() const { if ( d->mSimple->isChecked() ) { return Simple; } if ( d->mSASL->isChecked() ) { return SASL; } return Anonymous; } void LdapConfigWidget::setSizeLimit( int sizelimit ) { if ( d->mSizeLimit ) { d->mSizeLimit->setValue( sizelimit ); } } int LdapConfigWidget::sizeLimit() const { return d->mSizeLimit ? d->mSizeLimit->value() : 0; } void LdapConfigWidget::setTimeLimit( int timelimit ) { if ( d->mTimeLimit ) { d->mTimeLimit->setValue( timelimit ); } } int LdapConfigWidget::timeLimit() const { return d->mTimeLimit ? d->mTimeLimit->value() : 0; } void LdapConfigWidget::setPageSize( int pagesize ) { if ( d->mPageSize ) { d->mPageSize->setValue( pagesize ); } } int LdapConfigWidget::pageSize() const { return d->mPageSize ? d->mPageSize->value() : 0; } LdapConfigWidget::WinFlags LdapConfigWidget::features() const { return d->mFeatures; } void LdapConfigWidget::setFeatures( LdapConfigWidget::WinFlags features ) { d->mFeatures = features; // First delete all the child widgets. // FIXME: I hope it's correct QList ch = children(); const int numberOfChild( ch.count() ); for ( int i = 0; i < numberOfChild; ++i ) { QWidget *widget = dynamic_cast( ch[ i ] ); if ( widget && widget->parent() == this ) { delete ( widget ); } } // Re-create child widgets according to the new flags d->initWidget(); } #include "moc_ldapconfigwidget.cpp"