summaryrefslogtreecommitdiffstats
path: root/kaddressbook/kcmconfigs/ldapoptionswidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kaddressbook/kcmconfigs/ldapoptionswidget.cpp')
-rw-r--r--kaddressbook/kcmconfigs/ldapoptionswidget.cpp303
1 files changed, 303 insertions, 0 deletions
diff --git a/kaddressbook/kcmconfigs/ldapoptionswidget.cpp b/kaddressbook/kcmconfigs/ldapoptionswidget.cpp
new file mode 100644
index 00000000..df80ad87
--- /dev/null
+++ b/kaddressbook/kcmconfigs/ldapoptionswidget.cpp
@@ -0,0 +1,303 @@
+/*
+ This file is part of KAddressBook.
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <qgroupbox.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qstring.h>
+
+#include <kapplication.h>
+#include <kbuttonbox.h>
+#include <kconfig.h>
+#include <klistview.h>
+#include <klocale.h>
+
+#include "addhostdialog.h"
+#include "ldapoptionswidget.h"
+#include <qvgroupbox.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <kiconloader.h>
+
+class LDAPItem : public QCheckListItem
+{
+ public:
+ LDAPItem( QListView *parent, const KPIM::LdapServer &server, bool isActive = false )
+ : QCheckListItem( parent, parent->lastItem(), QString::null, QCheckListItem::CheckBox ),
+ mIsActive( isActive )
+ {
+ setServer( server );
+ }
+
+ void setServer( const KPIM::LdapServer &server )
+ {
+ mServer = server;
+
+ setText( 0, mServer.host() );
+ }
+
+ const KPIM::LdapServer &server() const { return mServer; }
+
+ void setIsActive( bool isActive ) { mIsActive = isActive; }
+ bool isActive() const { return mIsActive; }
+
+ private:
+ KPIM::LdapServer mServer;
+ bool mIsActive;
+};
+
+LDAPOptionsWidget::LDAPOptionsWidget( QWidget* parent, const char* name )
+ : QWidget( parent, name )
+{
+ initGUI();
+
+ mHostListView->setSorting( -1 );
+ mHostListView->setAllColumnsShowFocus( true );
+ mHostListView->setFullWidth( true );
+ mHostListView->addColumn( QString::null );
+ mHostListView->header()->hide();
+
+ connect( mHostListView, SIGNAL( selectionChanged( QListViewItem* ) ),
+ SLOT( slotSelectionChanged( QListViewItem* ) ) );
+ connect( mHostListView, SIGNAL(doubleClicked( QListViewItem *, const QPoint &, int )), this, SLOT(slotEditHost()));
+ connect( mHostListView, SIGNAL( clicked( QListViewItem* ) ),
+ SLOT( slotItemClicked( QListViewItem* ) ) );
+
+ connect( mUpButton, SIGNAL( clicked() ), this, SLOT( slotMoveUp() ) );
+ connect( mDownButton, SIGNAL( clicked() ), this, SLOT( slotMoveDown() ) );
+}
+
+LDAPOptionsWidget::~LDAPOptionsWidget()
+{
+}
+
+void LDAPOptionsWidget::slotSelectionChanged( QListViewItem *item )
+{
+ bool state = ( item != 0 );
+ mEditButton->setEnabled( state );
+ mRemoveButton->setEnabled( state );
+ mDownButton->setEnabled( item && item->itemBelow() );
+ mUpButton->setEnabled( item && item->itemAbove() );
+}
+
+void LDAPOptionsWidget::slotItemClicked( QListViewItem *item )
+{
+ LDAPItem *ldapItem = dynamic_cast<LDAPItem*>( item );
+ if ( !ldapItem )
+ return;
+
+ if ( ldapItem->isOn() != ldapItem->isActive() ) {
+ emit changed( true );
+ ldapItem->setIsActive( ldapItem->isOn() );
+ }
+}
+
+void LDAPOptionsWidget::slotAddHost()
+{
+ KPIM::LdapServer server;
+ AddHostDialog dlg( &server, this );
+
+ if ( dlg.exec() && !server.host().isEmpty() ) {
+ new LDAPItem( mHostListView, server );
+
+ emit changed( true );
+ }
+}
+
+void LDAPOptionsWidget::slotEditHost()
+{
+ LDAPItem *item = dynamic_cast<LDAPItem*>( mHostListView->currentItem() );
+ if ( !item )
+ return;
+
+ KPIM::LdapServer server = item->server();
+ AddHostDialog dlg( &server, this );
+ dlg.setCaption( i18n( "Edit Host" ) );
+
+ if ( dlg.exec() && !server.host().isEmpty() ) {
+ item->setServer( server );
+
+ emit changed( true );
+ }
+}
+
+void LDAPOptionsWidget::slotRemoveHost()
+{
+ QListViewItem *item = mHostListView->currentItem();
+ if ( !item )
+ return;
+
+ mHostListView->takeItem( item );
+ delete item;
+
+ slotSelectionChanged( mHostListView->currentItem() );
+
+ emit changed( true );
+}
+
+static void swapItems( LDAPItem *item, LDAPItem *other )
+{
+ KPIM::LdapServer server = item->server();
+ bool isActive = item->isActive();
+ item->setServer( other->server() );
+ item->setIsActive( other->isActive() );
+ item->setOn( other->isActive() );
+ other->setServer( server );
+ other->setIsActive( isActive );
+ other->setOn( isActive );
+}
+
+void LDAPOptionsWidget::slotMoveUp()
+{
+ LDAPItem *item = static_cast<LDAPItem *>( mHostListView->selectedItem() );
+ if ( !item ) return;
+ LDAPItem *above = static_cast<LDAPItem *>( item->itemAbove() );
+ if ( !above ) return;
+ swapItems( item, above );
+ mHostListView->setCurrentItem( above );
+ mHostListView->setSelected( above, true );
+ emit changed( true );
+}
+
+void LDAPOptionsWidget::slotMoveDown()
+{
+ LDAPItem *item = static_cast<LDAPItem *>( mHostListView->selectedItem() );
+ if ( !item ) return;
+ LDAPItem *below = static_cast<LDAPItem *>( item->itemBelow() );
+ if ( !below ) return;
+ swapItems( item, below );
+ mHostListView->setCurrentItem( below );
+ mHostListView->setSelected( below, true );
+ emit changed( true );
+}
+
+void LDAPOptionsWidget::restoreSettings()
+{
+ mHostListView->clear();
+ KConfig *config = KPIM::LdapSearch::config();
+ KConfigGroupSaver saver( config, "LDAP" );
+
+ QString host;
+
+ uint count = config->readUnsignedNumEntry( "NumSelectedHosts");
+ for ( uint i = 0; i < count; ++i ) {
+ KPIM::LdapServer server;
+ KPIM::LdapSearch::readConfig( server, config, i, true );
+ LDAPItem *item = new LDAPItem( mHostListView, server, true );
+ item->setOn( true );
+ }
+
+ count = config->readUnsignedNumEntry( "NumHosts" );
+ for ( uint i = 0; i < count; ++i ) {
+ KPIM::LdapServer server;
+ KPIM::LdapSearch::readConfig( server, config, i, false );
+ new LDAPItem( mHostListView, server );
+ }
+
+ emit changed( false );
+}
+
+void LDAPOptionsWidget::saveSettings()
+{
+ KConfig *config = KPIM::LdapSearch::config();
+ config->deleteGroup( "LDAP" );
+
+ KConfigGroupSaver saver( config, "LDAP" );
+
+ uint selected = 0; uint unselected = 0;
+ QListViewItemIterator it( mHostListView );
+ for ( ; it.current(); ++it ) {
+ LDAPItem *item = dynamic_cast<LDAPItem*>( it.current() );
+ if ( !item )
+ continue;
+
+ KPIM::LdapServer server = item->server();
+ if ( item->isOn() ) {
+ KPIM::LdapSearch::writeConfig( server, config, selected, true );
+ selected++;
+ } else {
+ KPIM::LdapSearch::writeConfig( server, config, unselected, false );
+ unselected++;
+ }
+ }
+
+ config->writeEntry( "NumSelectedHosts", selected );
+ config->writeEntry( "NumHosts", unselected );
+ config->sync();
+
+ emit changed( false );
+}
+
+void LDAPOptionsWidget::defaults()
+{
+ // add default configuration here
+}
+
+void LDAPOptionsWidget::initGUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+
+ QVGroupBox *groupBox = new QVGroupBox( i18n( "LDAP Servers" ), this );
+ groupBox->setInsideSpacing( KDialog::spacingHint() );
+ groupBox->setInsideMargin( KDialog::marginHint() );
+
+ // Contents of the QVGroupBox: label and hbox
+ /*QLabel *label =*/ new QLabel( i18n( "Check all servers that should be used:" ), groupBox );
+
+ QHBox* hBox = new QHBox( groupBox );
+ hBox->setSpacing( 6 );
+ // Contents of the hbox: listview and up/down buttons on the right (vbox)
+ mHostListView = new KListView( hBox );
+
+ QVBox* upDownBox = new QVBox( hBox );
+ upDownBox->setSpacing( 6 );
+ mUpButton = new QToolButton( upDownBox, "mUpButton" );
+ mUpButton->setIconSet( BarIconSet( "up", KIcon::SizeSmall ) );
+ mUpButton->setEnabled( false ); // b/c no item is selected yet
+
+ mDownButton = new QToolButton( upDownBox, "mDownButton" );
+ mDownButton->setIconSet( BarIconSet( "down", KIcon::SizeSmall ) );
+ mDownButton->setEnabled( false ); // b/c no item is selected yet
+
+ QWidget* spacer = new QWidget( upDownBox );
+ upDownBox->setStretchFactor( spacer, 100 );
+
+ layout->addWidget( groupBox );
+
+ KButtonBox *buttons = new KButtonBox( this );
+ buttons->addButton( i18n( "&Add Host..." ), this, SLOT( slotAddHost() ) );
+ mEditButton = buttons->addButton( i18n( "&Edit Host..." ), this, SLOT( slotEditHost() ) );
+ mEditButton->setEnabled( false );
+ mRemoveButton = buttons->addButton( i18n( "&Remove Host" ), this, SLOT( slotRemoveHost() ) );
+ mRemoveButton->setEnabled( false );
+ buttons->layout();
+
+ layout->addWidget( buttons );
+
+ resize( QSize( 460, 300 ).expandedTo( sizeHint() ) );
+}
+
+#include "ldapoptionswidget.moc"