ldapconfigwidget.cpp

00001 /*
00002     This file is part of libkabc.
00003     Copyright (c) 2004 Szombathelyi György <gyurco@freemail.hu>
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018     Boston, MA 02110-1301, USA.
00019 */
00020 #include <qapplication.h>
00021 
00022 #include <qobjectlist.h>
00023 #include <qcheckbox.h>
00024 #include <qlabel.h>
00025 #include <qlayout.h>
00026 #include <qpushbutton.h>
00027 #include <qspinbox.h>
00028 #include <qvgroupbox.h>
00029 #include <qhbuttongroup.h>
00030 #include <qradiobutton.h>
00031 
00032 #include <kmessagebox.h>
00033 #include <kaccelmanager.h>
00034 #include <kdialogbase.h>
00035 #include <klocale.h>
00036 #include <klineedit.h>
00037 #include <kcombobox.h>
00038 #include <kprogress.h>
00039 
00040 #include <kdebug.h>
00041 
00042 #include "ldapconfigwidget.h"
00043 #include "ldapconfigwidget.moc"
00044 
00045 using namespace KABC;
00046 
00047 LdapConfigWidget::LdapConfigWidget( QWidget* parent,
00048   const char* name, WFlags fl ) : QWidget( parent, name, fl )
00049 {
00050   mProg = 0;
00051   mFlags = 0;
00052   mainLayout = new QGridLayout( this, 12, 4, 0,
00053       KDialog::spacingHint() );
00054 }
00055 
00056 LdapConfigWidget::LdapConfigWidget( int flags, QWidget* parent,
00057   const char* name, WFlags fl ) : QWidget( parent, name, fl )
00058 {
00059   mFlags = flags;
00060   mProg = 0;
00061   mainLayout = new QGridLayout( this, 12, 4, 0,
00062       KDialog::spacingHint() );
00063   initWidget();
00064 }
00065 
00066 LdapConfigWidget::~LdapConfigWidget()
00067 {
00068 }
00069 
00070 void LdapConfigWidget::initWidget()
00071 {
00072   QLabel *label;
00073 
00074   mUser = mPassword = mHost = mDn = mBindDN = mRealm = mFilter = 0;
00075   mPort = mVer = mTimeLimit = mSizeLimit = 0;
00076   mAnonymous = mSimple = mSASL = mSecNO = mSecTLS = mSecSSL = 0;
00077   mEditButton =  mQueryMech = 0;
00078   mMech = 0;
00079   int row = 0;
00080   int col;
00081   
00082   if ( mFlags & W_USER ) {
00083     label = new QLabel( i18n( "User:" ), this );
00084     mUser = new KLineEdit( this, "kcfg_ldapuser" );
00085 
00086     mainLayout->addWidget( label, row, 0 );
00087     mainLayout->addMultiCellWidget( mUser, row, row, 1, 3 );
00088     row++;
00089   }
00090 
00091   if ( mFlags & W_BINDDN ) {
00092     label = new QLabel( i18n( "Bind DN:" ), this );
00093     mBindDN = new KLineEdit( this, "kcfg_ldapbinddn" );
00094 
00095     mainLayout->addWidget( label, row, 0 );
00096     mainLayout->addMultiCellWidget( mBindDN, row, row, 1, 3 );
00097     row++;
00098   }
00099 
00100   if ( mFlags & W_REALM ) {
00101     label = new QLabel( i18n( "Realm:" ), this );
00102     mRealm = new KLineEdit( this, "kcfg_ldaprealm" );
00103 
00104     mainLayout->addWidget( label, row, 0 );
00105     mainLayout->addMultiCellWidget( mRealm, row, row, 1, 3 );
00106     row++;
00107   }
00108 
00109   if ( mFlags & W_PASS ) {
00110     label = new QLabel( i18n( "Password:" ), this );
00111     mPassword = new KLineEdit( this, "kcfg_ldappassword" );
00112     mPassword->setEchoMode( KLineEdit::Password );
00113 
00114     mainLayout->addWidget( label, row, 0 );
00115     mainLayout->addMultiCellWidget( mPassword, row, row, 1, 3 );
00116     row++;
00117   }
00118 
00119   if ( mFlags & W_HOST ) {
00120     label = new QLabel( i18n( "Host:" ), this );
00121     mHost = new KLineEdit( this, "kcfg_ldaphost" );
00122 
00123     mainLayout->addWidget( label, row, 0 );
00124     mainLayout->addMultiCellWidget( mHost, row, row, 1, 3 );
00125     row++;
00126   }
00127 
00128   col = 0;
00129   if ( mFlags & W_PORT ) {
00130     label = new QLabel( i18n( "Port:" ), this );
00131     mPort = new QSpinBox( 0, 65535, 1, this, "kcfg_ldapport" );
00132     mPort->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) );
00133     mPort->setValue( 389 );
00134 
00135     mainLayout->addWidget( label, row, col );
00136     mainLayout->addWidget( mPort, row, col+1 );
00137     col += 2;
00138   }
00139 
00140   if ( mFlags & W_VER ) {
00141     label = new QLabel( i18n( "LDAP version:" ), this );
00142     mVer = new QSpinBox( 2, 3, 1, this, "kcfg_ldapver" );
00143     mVer->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) );
00144     mVer->setValue( 3 );
00145     mainLayout->addWidget( label, row, col );
00146     mainLayout->addWidget( mVer, row, col+1 );
00147   }
00148   if ( mFlags & ( W_PORT | W_VER ) ) row++;
00149 
00150   col = 0;
00151   if ( mFlags & W_SIZELIMIT ) {
00152     label = new QLabel( i18n( "Size limit:" ), this );
00153     mSizeLimit = new QSpinBox( 0, 9999999, 1, this, "kcfg_ldapsizelimit" );
00154     mSizeLimit->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) );
00155     mSizeLimit->setValue( 0 );
00156     mSizeLimit->setSpecialValueText( i18n("Default") );
00157     mainLayout->addWidget( label, row, col );
00158     mainLayout->addWidget( mSizeLimit, row, col+1 );
00159     col += 2;
00160   }
00161 
00162   if ( mFlags & W_TIMELIMIT ) {
00163     label = new QLabel( i18n( "Time limit:" ), this );
00164     mTimeLimit = new QSpinBox( 0, 9999999, 1, this, "kcfg_ldaptimelimit" );
00165     mTimeLimit->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) );
00166     mTimeLimit->setValue( 0 );
00167     mTimeLimit->setSuffix( i18n(" sec") );
00168     mTimeLimit->setSpecialValueText( i18n("Default") );
00169     mainLayout->addWidget( label, row, col );
00170     mainLayout->addWidget( mTimeLimit, row, col+1 );
00171   }
00172   if ( mFlags & ( W_SIZELIMIT | W_TIMELIMIT ) ) row++;
00173 
00174   if ( mFlags & W_DN ) {
00175     label = new QLabel( i18n( "Distinguished Name", "DN:" ), this );
00176     mDn = new KLineEdit( this, "kcfg_ldapdn" );
00177 
00178     mainLayout->addWidget( label, row, 0 );
00179     mainLayout->addMultiCellWidget( mDn, row, row, 1, 1 );
00180     //without host query doesn't make sense
00181     if ( mHost ) {
00182       QPushButton *dnquery = new QPushButton( i18n( "Query Server" ), this );
00183       connect( dnquery, SIGNAL( clicked() ), SLOT( mQueryDNClicked() ) );
00184       mainLayout->addMultiCellWidget( dnquery, row, row, 2, 3 );
00185     }
00186     row++;
00187   }
00188 
00189   if ( mFlags & W_FILTER ) {
00190     label = new QLabel( i18n( "Filter:" ), this );
00191     mFilter = new KLineEdit( this, "kcfg_ldapfilter" );
00192 
00193     mainLayout->addWidget( label, row, 0 );
00194     mainLayout->addMultiCellWidget( mFilter, row, row, 1, 3 );
00195     row++;
00196   }
00197 
00198   if ( mFlags & W_SECBOX ) {
00199     QHButtonGroup *btgroup = new QHButtonGroup( i18n( "Security" ), this );
00200     mSecNO = new QRadioButton( i18n( "No" ), btgroup, "kcfg_ldapnosec" );
00201     mSecTLS = new QRadioButton( i18n( "TLS" ), btgroup, "kcfg_ldaptls" );
00202     mSecSSL = new QRadioButton( i18n( "SSL" ), btgroup, "kcfg_ldapssl" );
00203     mainLayout->addMultiCellWidget( btgroup, row, row, 0, 3 );
00204 
00205     connect( mSecNO, SIGNAL( clicked() ), SLOT( setLDAPPort() ) );
00206     connect( mSecTLS, SIGNAL( clicked() ), SLOT( setLDAPPort() ) );
00207     connect( mSecSSL, SIGNAL( clicked() ), SLOT( setLDAPSPort( ) ) );
00208 
00209     mSecNO->setChecked( true );
00210     row++;
00211   }
00212 
00213   if ( mFlags & W_AUTHBOX ) {
00214 
00215     QButtonGroup *authbox =
00216       new QButtonGroup( 3, Qt::Horizontal, i18n( "Authentication" ), this );
00217 
00218     mAnonymous = new QRadioButton( i18n( "Anonymous" ), authbox, "kcfg_ldapanon" );
00219     mSimple = new QRadioButton( i18n( "Simple" ), authbox, "kcfg_ldapsimple" );
00220     mSASL = new QRadioButton( i18n( "SASL" ), authbox, "kcfg_ldapsasl" );
00221 
00222     label = new QLabel( i18n( "SASL mechanism:" ), authbox );
00223     mMech = new KComboBox( false, authbox, "kcfg_ldapsaslmech" );
00224     mMech->setEditable( true );
00225     mMech->insertItem( "DIGEST-MD5" );
00226     mMech->insertItem( "GSSAPI" );
00227     mMech->insertItem( "PLAIN" );
00228 
00229     //without host query doesn't make sense
00230     if ( mHost ) {
00231       mQueryMech = new QPushButton( i18n( "Query Server" ), authbox );
00232       connect( mQueryMech, SIGNAL( clicked() ), SLOT( mQueryMechClicked() ) );
00233     }
00234 
00235     mainLayout->addMultiCellWidget( authbox, row, row+1, 0, 3 );
00236 
00237     connect( mAnonymous, SIGNAL( stateChanged(int) ), SLOT( setAnonymous(int) ) );
00238     connect( mSimple, SIGNAL( stateChanged(int) ), SLOT( setSimple(int) ) );
00239     connect( mSASL, SIGNAL( stateChanged(int) ), SLOT( setSASL(int) ) );
00240 
00241     mAnonymous->setChecked( true );
00242   }
00243 
00244 }
00245 
00246 void LdapConfigWidget::loadData( KIO::Job*, const QByteArray& d )
00247 {
00248   LDIF::ParseVal ret;
00249 
00250   if ( d.size() ) {
00251     mLdif.setLDIF( d );
00252   } else {
00253     mLdif.endLDIF();
00254   }
00255   do {
00256     ret = mLdif.nextItem();
00257     if ( ret == LDIF::Item && mLdif.attr().lower() == mAttr ) {
00258       mProg->progressBar()->advance( 1 );
00259       mQResult.push_back( QString::fromUtf8( mLdif.val(), mLdif.val().size() ) );
00260     }
00261   } while ( ret != LDIF::MoreData );
00262 }
00263 
00264 void LdapConfigWidget::loadResult( KIO::Job* job)
00265 {
00266   int error = job->error();
00267   if ( error && error != KIO::ERR_USER_CANCELED )
00268     mErrorMsg = job->errorString();
00269   else
00270     mErrorMsg = "";
00271 
00272   mCancelled = false;
00273   mProg->close();
00274 }
00275 
00276 void LdapConfigWidget::sendQuery()
00277 {
00278   LDAPUrl _url;
00279 
00280   mQResult.clear();
00281   mCancelled = true;
00282 
00283   _url.setProtocol( ( mSecSSL && mSecSSL->isChecked() ) ? "ldaps" : "ldap" );
00284   if ( mHost ) _url.setHost( mHost->text() );
00285   if ( mPort ) _url.setPort( mPort->value() );
00286   _url.setDn( "" );
00287   _url.setAttributes( mAttr );
00288   _url.setScope( LDAPUrl::Base );
00289   if ( mVer ) _url.setExtension( "x-ver", QString::number( mVer->value() ) );
00290   if ( mSecTLS && mSecTLS->isChecked() ) _url.setExtension( "x-tls", "" );
00291 
00292   kdDebug(5700) << "sendQuery url: " << _url.prettyURL() << endl;
00293   mLdif.startParsing();
00294   KIO::Job *job = KIO::get( _url, true, false );
00295   job->addMetaData("no-auth-prompt","true");
00296   connect( job, SIGNAL( data( KIO::Job*, const QByteArray& ) ),
00297     this, SLOT( loadData( KIO::Job*, const QByteArray& ) ) );
00298   connect( job, SIGNAL( result( KIO::Job* ) ),
00299     this, SLOT( loadResult( KIO::Job* ) ) );
00300 
00301   if ( mProg == NULL )
00302     mProg = new KProgressDialog( this, 0, i18n("LDAP Query"), _url.prettyURL(), true );
00303   else
00304     mProg->setLabel( _url.prettyURL() );
00305   mProg->progressBar()->setValue( 0 );
00306   mProg->progressBar()->setTotalSteps( 1 );
00307   mProg->exec();
00308   if ( mCancelled ) {
00309     kdDebug(5700) << "query cancelled!" << endl;
00310     job->kill( true );
00311   } else {
00312     if ( !mErrorMsg.isEmpty() ) KMessageBox::error( this, mErrorMsg );
00313   }
00314 }
00315 
00316 void LdapConfigWidget::mQueryMechClicked()
00317 {
00318   mAttr = "supportedsaslmechanisms";
00319   sendQuery();
00320   if ( !mQResult.isEmpty() ) {
00321     mQResult.sort();
00322     mMech->clear();
00323     mMech->insertStringList( mQResult );
00324   }
00325 }
00326 
00327 void LdapConfigWidget::mQueryDNClicked()
00328 {
00329   mAttr = "namingcontexts";
00330   sendQuery();
00331   if ( !mQResult.isEmpty() ) mDn->setText( mQResult.first() );
00332 }
00333 
00334 void LdapConfigWidget::setAnonymous( int state )
00335 {
00336   if ( state == QButton::Off ) return;
00337   if ( mUser ) mUser->setEnabled(false);
00338   if ( mPassword ) mPassword->setEnabled(false);
00339   if ( mBindDN ) mBindDN->setEnabled(false);
00340   if ( mRealm ) mRealm->setEnabled(false);
00341   if ( mMech ) mMech->setEnabled(false);
00342   if ( mQueryMech ) mQueryMech->setEnabled(false);
00343 }
00344 
00345 void LdapConfigWidget::setSimple( int state )
00346 {
00347   if ( state == QButton::Off ) return;
00348   if ( mUser ) mUser->setEnabled(true);
00349   if ( mPassword ) mPassword->setEnabled(true);
00350   if ( mBindDN ) mBindDN->setEnabled(false);
00351   if ( mRealm ) mRealm->setEnabled(false);
00352   if ( mMech ) mMech->setEnabled(false);
00353   if ( mQueryMech ) mQueryMech->setEnabled(false);
00354 }
00355 
00356 void LdapConfigWidget::setSASL( int state )
00357 {
00358   if ( state == QButton::Off ) return;
00359   if ( mUser ) mUser->setEnabled(true);
00360   if ( mPassword ) mPassword->setEnabled(true);
00361   if ( mBindDN ) mBindDN->setEnabled(true);
00362   if ( mRealm ) mRealm->setEnabled(true);
00363   if ( mMech ) mMech->setEnabled(true);
00364   if ( mQueryMech ) mQueryMech->setEnabled(true);
00365 }
00366 
00367 void LdapConfigWidget::setLDAPPort()
00368 {
00369   mPort->setValue( 389 );
00370 }
00371 
00372 void LdapConfigWidget::setLDAPSPort()
00373 {
00374   mPort->setValue( 636 );
00375 }
00376 
00377 
00378 LDAPUrl LdapConfigWidget::url() const
00379 {
00380   LDAPUrl _url;
00381   if ( mSecSSL && mSecSSL->isChecked() )
00382     _url.setProtocol( "ldaps" );
00383   else
00384     _url.setProtocol( "ldap" );
00385 
00386   if ( mUser ) _url.setUser( mUser->text() );
00387   if ( mPassword ) _url.setPass( mPassword->text() );
00388   if ( mHost ) _url.setHost( mHost->text() );
00389   if ( mPort ) _url.setPort( mPort->value() );
00390   if ( mDn ) _url.setDn( mDn->text() );
00391   if ( mVer ) _url.setExtension( "x-ver", QString::number( mVer->value() ) );
00392   if ( mSizeLimit && mSizeLimit->value() != 0 )
00393     _url.setExtension( "x-sizelimit", QString::number( mSizeLimit->value() ) );
00394   if ( mTimeLimit && mTimeLimit->value() != 0 )
00395     _url.setExtension( "x-timelimit", QString::number( mTimeLimit->value() ) );
00396   if ( mSecTLS && mSecTLS->isChecked() ) _url.setExtension( "x-tls","" );
00397   if ( mFilter && !mFilter->text().isEmpty() )
00398     _url.setFilter( mFilter->text() );
00399   if ( mSASL && mSASL->isChecked() ) {
00400     _url.setExtension( "x-sasl", "" );
00401     _url.setExtension( "x-mech", mMech->currentText() );
00402     if ( mBindDN && !mBindDN->text().isEmpty() )
00403       _url.setExtension( "bindname", mBindDN->text() );
00404     if ( mRealm && !mRealm->text().isEmpty() )
00405       _url.setExtension( "x-realm", mRealm->text() );
00406   }
00407   return ( _url );
00408 }
00409 
00410 void LdapConfigWidget::setUser( const QString &user )
00411 {
00412   if ( mUser ) mUser->setText( user );
00413 }
00414 
00415 QString LdapConfigWidget::user() const
00416 {
00417   return ( mUser ? mUser->text() : QString::null );
00418 }
00419 
00420 void LdapConfigWidget::setPassword( const QString &password )
00421 {
00422   if ( mPassword ) mPassword->setText( password );
00423 }
00424 
00425 QString LdapConfigWidget::password() const
00426 {
00427   return ( mPassword ? mPassword->text() : QString::null );
00428 }
00429 
00430 void LdapConfigWidget::setBindDN( const QString &binddn )
00431 {
00432   if ( mBindDN ) mBindDN->setText( binddn );
00433 }
00434 
00435 QString LdapConfigWidget::bindDN() const
00436 {
00437   return ( mBindDN ? mBindDN->text() : QString::null );
00438 }
00439 
00440 void LdapConfigWidget::setRealm( const QString &realm )
00441 {
00442   if ( mRealm ) mRealm->setText( realm );
00443 }
00444 
00445 QString LdapConfigWidget::realm() const
00446 {
00447   return ( mRealm ? mRealm->text() : QString::null );
00448 }
00449 
00450 void LdapConfigWidget::setHost( const QString &host )
00451 {
00452   if ( mHost ) mHost->setText( host );
00453 }
00454 
00455 QString LdapConfigWidget::host() const
00456 {
00457   return ( mHost ? mHost->text() : QString::null );
00458 }
00459 
00460 void LdapConfigWidget::setPort( int port )
00461 {
00462   if ( mPort ) mPort->setValue( port );
00463 }
00464 
00465 int LdapConfigWidget::port() const
00466 {
00467   return ( mPort ? mPort->value() : 389 );
00468 }
00469 
00470 void LdapConfigWidget::setVer( int ver )
00471 {
00472   if ( mVer ) mVer->setValue( ver );
00473 }
00474 
00475 int LdapConfigWidget::ver() const
00476 {
00477   return ( mVer ? mVer->value() : 3 );
00478 }
00479 
00480 void LdapConfigWidget::setDn( const QString &dn )
00481 {
00482   if ( mDn ) mDn->setText( dn );
00483 }
00484 
00485 QString LdapConfigWidget::dn() const
00486 {
00487   return ( mDn ? mDn->text() : QString::null );
00488 }
00489 
00490 void LdapConfigWidget::setFilter( const QString &filter )
00491 {
00492   if ( mFilter ) mFilter->setText( filter );
00493 }
00494 
00495 QString LdapConfigWidget::filter() const
00496 {
00497   return ( mFilter ? mFilter->text() : QString::null );
00498 }
00499 
00500 void LdapConfigWidget::setMech( const QString &mech )
00501 {
00502   if ( mMech == 0 ) return;
00503   if ( !mech.isEmpty() ) {
00504     int i = 0;
00505     while ( i < mMech->count() ) {
00506       if ( mMech->text( i ) == mech ) break;
00507       i++;
00508     }
00509     if ( i == mMech->count() ) mMech->insertItem( mech );
00510     mMech->setCurrentItem( i );
00511   }
00512 }
00513 
00514 QString LdapConfigWidget::mech() const
00515 {
00516   return ( mMech ? mMech->currentText() : QString::null );
00517 }
00518 
00519 void LdapConfigWidget::setSecNO( bool b )
00520 {
00521   if ( mSecNO ) mSecNO->setChecked( b );
00522 }
00523 
00524 bool LdapConfigWidget::isSecNO() const
00525 {
00526   return ( mSecNO ? mSecNO->isChecked() : true );
00527 }
00528 
00529 void LdapConfigWidget::setSecTLS( bool b )
00530 {
00531   if ( mSecTLS ) mSecTLS->setChecked( b );
00532 }
00533 
00534 bool LdapConfigWidget::isSecTLS() const
00535 {
00536   return ( mSecTLS ? mSecTLS->isChecked() : false );
00537 }
00538 
00539 void LdapConfigWidget::setSecSSL( bool b )
00540 {
00541   if ( mSecSSL ) mSecSSL->setChecked( b );
00542 }
00543 
00544 bool LdapConfigWidget::isSecSSL() const
00545 {
00546   return ( mSecSSL ? mSecSSL->isChecked() : false );
00547 }
00548 
00549 void LdapConfigWidget::setAuthAnon( bool b )
00550 {
00551   if ( mAnonymous ) mAnonymous->setChecked( b );
00552 }
00553 
00554 bool LdapConfigWidget::isAuthAnon() const
00555 {
00556   return ( mAnonymous ? mAnonymous->isChecked() : true );
00557 }
00558 
00559 void LdapConfigWidget::setAuthSimple( bool b )
00560 {
00561   if ( mSimple ) mSimple->setChecked( b );
00562 }
00563 
00564 bool LdapConfigWidget::isAuthSimple() const
00565 {
00566   return ( mSimple ? mSimple->isChecked() : false );
00567 }
00568 
00569 void LdapConfigWidget::setAuthSASL( bool b )
00570 {
00571   if ( mSASL ) mSASL->setChecked( b );
00572 }
00573 
00574 bool LdapConfigWidget::isAuthSASL() const
00575 {
00576   return ( mSASL ? mSASL->isChecked() : false );
00577 }
00578 
00579 void LdapConfigWidget::setSizeLimit( int sizelimit )
00580 {
00581   if ( mSizeLimit ) mSizeLimit->setValue( sizelimit );
00582 }
00583 
00584 int LdapConfigWidget::sizeLimit() const
00585 {
00586   return ( mSizeLimit ? mSizeLimit->value() : 0 );
00587 }
00588 
00589 void LdapConfigWidget::setTimeLimit( int timelimit )
00590 {
00591   if ( mTimeLimit ) mTimeLimit->setValue( timelimit );
00592 }
00593 
00594 int LdapConfigWidget::timeLimit() const
00595 {
00596   return ( mTimeLimit ? mTimeLimit->value() : 0 );
00597 }
00598 
00599 int LdapConfigWidget::flags() const
00600 {
00601   return mFlags;
00602 }
00603 
00604 void LdapConfigWidget::setFlags( int flags )
00605 {
00606   mFlags = flags;
00607 
00608   // First delete all the child widgets.
00609   // FIXME: I hope it's correct
00610   const QObjectList *ch = children();
00611   QObjectList ch2 = *ch;
00612   QObject *obj;
00613   QWidget *widget;
00614 
00615   obj = ch2.first();
00616   while ( obj != 0 ) {
00617     widget = dynamic_cast<QWidget*> (obj);
00618     if ( widget && widget->parent() == this ) {
00619       mainLayout->remove( widget );
00620       delete ( widget );
00621     }
00622     obj = ch2.next();
00623   }
00624   // Re-create child widgets according to the new flags
00625   initWidget();
00626 }
KDE Home | KDE Accessibility Home | Description of Access Keys