00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <qgroupbox.h>
00025 #include <qheader.h>
00026 #include <qlabel.h>
00027 #include <qlayout.h>
00028 #include <qpushbutton.h>
00029 #include <qstring.h>
00030
00031 #include <kabc/addresslineedit.h>
00032 #include <kapplication.h>
00033 #include <kbuttonbox.h>
00034 #include <kconfig.h>
00035 #include <klistview.h>
00036 #include <klocale.h>
00037
00038 #include "addhostdialog.h"
00039 #include "ldapoptionswidget.h"
00040
00041 class LDAPServer
00042 {
00043 public:
00044 LDAPServer() : mPort( 389 ) {}
00045 LDAPServer( const QString &host, int port, const QString &baseDN,
00046 const QString &bindDN, const QString &pwdBindDN )
00047 : mHost( host ), mPort( port ), mBaseDN( baseDN ), mBindDN( bindDN ),
00048 mPwdBindDN( pwdBindDN )
00049 { }
00050
00051 QString host() const { return mHost; }
00052 int port() const { return mPort; }
00053 QString baseDN() const { return mBaseDN; }
00054 QString bindDN() const { return mBindDN; }
00055 QString pwdBindDN() const { return mPwdBindDN; }
00056
00057 void setHost( const QString &host ) { mHost = host; }
00058 void setPort( int port ) { mPort = port; }
00059 void setBaseDN( const QString &baseDN ) { mBaseDN = baseDN; }
00060 void setBindDN( const QString &bindDN ) { mBindDN = bindDN; }
00061 void setPwdBindDN( const QString &pwdBindDN ) { mPwdBindDN = pwdBindDN; }
00062
00063 private:
00064 QString mHost;
00065 int mPort;
00066 QString mBaseDN;
00067 QString mBindDN;
00068 QString mPwdBindDN;
00069 };
00070
00071 class LDAPItem : public QCheckListItem
00072 {
00073 public:
00074 LDAPItem( QListView *parent, const LDAPServer &server, bool isActive = false )
00075 : QCheckListItem( parent, QString::null, QCheckListItem::CheckBox ),
00076 mIsActive( isActive )
00077 {
00078 setServer( server );
00079 }
00080
00081 void setServer( const LDAPServer &server )
00082 {
00083 mServer = server;
00084
00085 setText( 0, mServer.host() );
00086 }
00087
00088 LDAPServer server() const { return mServer; }
00089
00090 void setIsActive( bool isActive ) { mIsActive = isActive; }
00091 bool isActive() const { return mIsActive; }
00092
00093 private:
00094 LDAPServer mServer;
00095 bool mIsActive;
00096 };
00097
00098 LDAPOptionsWidget::LDAPOptionsWidget( QWidget* parent, const char* name )
00099 : QWidget( parent, name )
00100 {
00101 initGUI();
00102
00103 mHostListView->addColumn( QString::null );
00104 mHostListView->header()->hide();
00105
00106 connect( mHostListView, SIGNAL( selectionChanged( QListViewItem* ) ),
00107 SLOT( slotSelectionChanged( QListViewItem* ) ) );
00108 connect( mHostListView, SIGNAL(doubleClicked( QListViewItem *, const QPoint &, int )), this, SLOT(slotEditHost()));
00109 connect( mHostListView, SIGNAL( clicked( QListViewItem* ) ),
00110 SLOT( slotItemClicked( QListViewItem* ) ) );
00111 }
00112
00113 LDAPOptionsWidget::~LDAPOptionsWidget()
00114 {
00115 }
00116
00117 void LDAPOptionsWidget::slotSelectionChanged( QListViewItem *item )
00118 {
00119 bool state = ( item != 0 );
00120
00121 mEditButton->setEnabled( state );
00122 mRemoveButton->setEnabled( state );
00123 }
00124
00125 void LDAPOptionsWidget::slotItemClicked( QListViewItem *item )
00126 {
00127 LDAPItem *ldapItem = dynamic_cast<LDAPItem*>( item );
00128 if ( !ldapItem )
00129 return;
00130
00131 if ( ldapItem->isOn() != ldapItem->isActive() ) {
00132 emit changed( true );
00133 ldapItem->setIsActive( ldapItem->isOn() );
00134 }
00135 }
00136
00137 void LDAPOptionsWidget::slotAddHost()
00138 {
00139 AddHostDialog dlg( this );
00140
00141 if ( dlg.exec() && !dlg.host().isEmpty() ) {
00142 LDAPServer server( dlg.host(), dlg.port(), dlg.baseDN(),
00143 dlg.bindDN(), dlg.pwdBindDN() );
00144 new LDAPItem( mHostListView, server );
00145
00146 emit changed( true );
00147 }
00148 }
00149
00150 void LDAPOptionsWidget::slotEditHost()
00151 {
00152 LDAPItem *item = dynamic_cast<LDAPItem*>( mHostListView->currentItem() );
00153 if ( !item )
00154 return;
00155
00156 AddHostDialog dlg( this );
00157 dlg.setCaption( i18n( "Edit Host" ) );
00158
00159 dlg.setHost( item->server().host() );
00160 dlg.setPort( item->server().port() );
00161 dlg.setBaseDN( item->server().baseDN() );
00162 dlg.setBindDN( item->server().bindDN() );
00163 dlg.setPwdBindDN( item->server().pwdBindDN() );
00164
00165 if ( dlg.exec() && !dlg.host().isEmpty() ) {
00166 LDAPServer server( dlg.host(), dlg.port(), dlg.baseDN(),
00167 dlg.bindDN(), dlg.pwdBindDN() );
00168 item->setServer( server );
00169
00170 emit changed( true );
00171 }
00172 }
00173
00174 void LDAPOptionsWidget::slotRemoveHost()
00175 {
00176 QListViewItem *item = mHostListView->currentItem();
00177 if ( !item )
00178 return;
00179
00180 mHostListView->takeItem( item );
00181 delete item;
00182
00183 slotSelectionChanged( mHostListView->currentItem() );
00184
00185 emit changed( true );
00186 }
00187
00188 void LDAPOptionsWidget::restoreSettings()
00189 {
00190 mHostListView->clear();
00191 KConfig *config = KABC::AddressLineEdit::config();
00192 KConfigGroupSaver saver( config, "LDAP" );
00193
00194 QString host;
00195
00196 uint count = config->readUnsignedNumEntry( "NumSelectedHosts");
00197 for ( uint i = 0; i < count; ++i ) {
00198 LDAPServer server;
00199 server.setHost( config->readEntry( QString( "SelectedHost%1").arg( i ) ) );
00200 server.setPort( config->readUnsignedNumEntry( QString( "SelectedPort%1" ).arg( i ) ) );
00201 server.setBaseDN( config->readEntry( QString( "SelectedBase%1" ).arg( i ) ) );
00202 server.setBindDN( config->readEntry( QString( "SelectedBind%1" ).arg( i ) ) );
00203 server.setPwdBindDN( config->readEntry( QString( "SelectedPwdBind%1" ).arg( i ) ) );
00204
00205 LDAPItem *item = new LDAPItem( mHostListView, server, true );
00206 item->setOn( true );
00207 }
00208
00209 count = config->readUnsignedNumEntry( "NumHosts" );
00210 for ( uint i = 0; i < count; ++i ) {
00211 LDAPServer server;
00212 server.setHost( config->readEntry( QString( "Host%1" ).arg( i ) ) );
00213 server.setPort( config->readUnsignedNumEntry( QString( "Port%1" ).arg( i ) ) );
00214 server.setBaseDN( config->readEntry( QString( "Base%1" ).arg( i ) ) );
00215 server.setBindDN( config->readEntry( QString( "Bind%1" ).arg( i ) ) );
00216 server.setPwdBindDN( config->readEntry( QString( "PwdBind%1" ).arg( i ) ) );
00217
00218 new LDAPItem( mHostListView, server );
00219 }
00220
00221 emit changed( false );
00222 }
00223
00224 void LDAPOptionsWidget::saveSettings()
00225 {
00226 KConfig *config = KABC::AddressLineEdit::config();
00227 config->deleteGroup( "LDAP" );
00228
00229 KConfigGroupSaver saver( config, "LDAP" );
00230
00231 uint selected = 0; uint unselected = 0;
00232 QListViewItemIterator it( mHostListView );
00233 for ( ; it.current(); ++it ) {
00234 LDAPItem *item = dynamic_cast<LDAPItem*>( it.current() );
00235 if ( !item )
00236 continue;
00237
00238 LDAPServer server = item->server();
00239 if ( item->isOn() ) {
00240 config->writeEntry( QString( "SelectedHost%1" ).arg( selected ), server.host() );
00241 config->writeEntry( QString( "SelectedPort%1" ).arg( selected ), server.port() );
00242 config->writeEntry( QString( "SelectedBase%1" ).arg( selected ), server.baseDN() );
00243 config->writeEntry( QString( "SelectedBind%1" ).arg( selected ), server.bindDN() );
00244 config->writeEntry( QString( "SelectedPwdBind%1" ).arg( selected ), server.pwdBindDN() );
00245 selected++;
00246 } else {
00247 config->writeEntry( QString( "Host%1" ).arg( unselected ), server.host() );
00248 config->writeEntry( QString( "Port%1" ).arg( unselected ), server.port() );
00249 config->writeEntry( QString( "Base%1" ).arg( unselected ), server.baseDN() );
00250 config->writeEntry( QString( "Bind%1" ).arg( unselected ), server.bindDN() );
00251 config->writeEntry( QString( "PwdBind%1" ).arg( unselected ), server.pwdBindDN() );
00252 unselected++;
00253 }
00254 }
00255
00256 config->writeEntry( "NumSelectedHosts", selected );
00257 config->writeEntry( "NumHosts", unselected );
00258 config->sync();
00259
00260 emit changed( false );
00261 }
00262
00263 void LDAPOptionsWidget::defaults()
00264 {
00265
00266 }
00267
00268 void LDAPOptionsWidget::initGUI()
00269 {
00270 QVBoxLayout *layout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
00271
00272 QGroupBox *groupBox = new QGroupBox( i18n( "LDAP Servers" ), this );
00273 groupBox->setColumnLayout( 0, Qt::Vertical );
00274 groupBox->layout()->setSpacing( KDialog::spacingHint() );
00275 groupBox->layout()->setMargin( KDialog::marginHint() );
00276
00277 QVBoxLayout *groupBoxLayout = new QVBoxLayout( groupBox->layout() );
00278 groupBoxLayout->setAlignment( Qt::AlignTop );
00279
00280 QLabel *label = new QLabel( i18n( "Check all servers that should be used:" ), groupBox );
00281 groupBoxLayout->addWidget( label );
00282
00283 mHostListView = new KListView( groupBox );
00284 groupBoxLayout->addWidget( mHostListView );
00285
00286 layout->addWidget( groupBox );
00287
00288 KButtonBox *buttons = new KButtonBox( this );
00289 buttons->addButton( i18n( "&Add Host..." ), this, SLOT( slotAddHost() ) );
00290 mEditButton = buttons->addButton( i18n( "&Edit Host..." ), this, SLOT( slotEditHost() ) );
00291 mEditButton->setEnabled( false );
00292 mRemoveButton = buttons->addButton( i18n( "&Remove Host" ), this, SLOT( slotRemoveHost() ) );
00293 mRemoveButton->setEnabled( false );
00294 buttons->layout();
00295
00296 layout->addWidget( buttons );
00297
00298 resize( QSize( 460, 300 ).expandedTo( sizeHint() ) );
00299 }
00300
00301 #include "ldapoptionswidget.moc"