summaryrefslogtreecommitdiffstats
path: root/kaddressbook/viewconfigurefieldspage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kaddressbook/viewconfigurefieldspage.cpp')
-rw-r--r--kaddressbook/viewconfigurefieldspage.cpp285
1 files changed, 285 insertions, 0 deletions
diff --git a/kaddressbook/viewconfigurefieldspage.cpp b/kaddressbook/viewconfigurefieldspage.cpp
new file mode 100644
index 000000000..fd50d92fe
--- /dev/null
+++ b/kaddressbook/viewconfigurefieldspage.cpp
@@ -0,0 +1,285 @@
+/*
+ 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 <qlabel.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qapplication.h>
+
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include "viewconfigurefieldspage.h"
+
+class FieldItem : public QListBoxText
+{
+ public:
+ FieldItem( QListBox *parent, KABC::Field *field )
+ : QListBoxText( parent, field->label() ), mField( field ) {}
+
+ FieldItem( QListBox *parent, KABC::Field *field, int index )
+ : QListBoxText( parent, field->label(), parent->item( index ) ),
+ mField( field ) {}
+
+ KABC::Field *field() { return mField; }
+
+ private:
+ KABC::Field *mField;
+};
+
+
+ViewConfigureFieldsPage::ViewConfigureFieldsPage( KABC::AddressBook *ab,
+ QWidget *parent,
+ const char *name )
+ : QWidget( parent, name ), mAddressBook( ab )
+{
+ initGUI();
+}
+
+void ViewConfigureFieldsPage::restoreSettings( KConfig *config )
+{
+ KABC::Field::List fields = KABC::Field::restoreFields( config, "KABCFields" );
+
+ if ( fields.isEmpty() )
+ fields = KABC::Field::defaultFields();
+
+ KABC::Field::List::ConstIterator it;
+ for ( it = fields.begin(); it != fields.end(); ++it )
+ new FieldItem( mSelectedBox, *it );
+
+ slotShowFields( mCategoryCombo->currentItem() );
+}
+
+void ViewConfigureFieldsPage::saveSettings( KConfig *config )
+{
+ KABC::Field::List fields;
+
+ for ( uint i = 0; i < mSelectedBox->count(); ++i ) {
+ FieldItem *fieldItem = static_cast<FieldItem *>( mSelectedBox->item( i ) );
+ fields.append( fieldItem->field() );
+ }
+
+ KABC::Field::saveFields( config, "KABCFields", fields );
+}
+
+void ViewConfigureFieldsPage::slotShowFields( int index )
+{
+ int currentPos = mUnSelectedBox->currentItem();
+ mUnSelectedBox->clear();
+
+ int category;
+ if ( index == 0 ) category = KABC::Field::All;
+ else category = 1 << ( index - 1 );
+
+ KABC::Field::List allFields = mAddressBook->fields( category );
+
+ KABC::Field::List::ConstIterator it;
+ for ( it = allFields.begin(); it != allFields.end(); ++it ) {
+ QListBoxItem *item = mSelectedBox->firstItem();
+ while( item ) {
+ FieldItem *fieldItem = static_cast<FieldItem *>( item );
+ if ( (*it)->equals( fieldItem->field() ) )
+ break;
+ item = item->next();
+ }
+
+ if ( !item )
+ new FieldItem( mUnSelectedBox, *it );
+ }
+
+ mUnSelectedBox->sort();
+ mUnSelectedBox->setCurrentItem( currentPos );
+}
+
+void ViewConfigureFieldsPage::slotSelect()
+{
+ // insert selected items in the unselected list to the selected list,
+ // directoy under the current item if selected, or at the bottonm if
+ // nothing is selected in the selected list
+ int where = mSelectedBox->currentItem();
+ if ( !(where > -1 && mSelectedBox->item( where )->isSelected()) )
+ where = mSelectedBox->count() - 1;
+
+ for ( uint i = 0; i < mUnSelectedBox->count(); ++i )
+ if ( mUnSelectedBox->isSelected( mUnSelectedBox->item( i ) ) ) {
+ FieldItem *fieldItem = static_cast<FieldItem *>( mUnSelectedBox->item( i ) );
+ new FieldItem( mSelectedBox, fieldItem->field(), where );
+ where++;
+ }
+
+ slotShowFields( mCategoryCombo->currentItem() );
+}
+
+void ViewConfigureFieldsPage::slotUnSelect()
+{
+ for ( uint i = 0; i < mSelectedBox->count(); ++i )
+ if ( mSelectedBox->isSelected( mSelectedBox->item( i ) ) ) {
+ mSelectedBox->removeItem( i );
+ --i;
+ }
+
+ slotShowFields( mCategoryCombo->currentItem() );
+}
+
+void ViewConfigureFieldsPage::slotButtonsEnabled()
+{
+ bool state = false;
+ // add button: enabled if any items are selected in the unselected list
+ for ( uint i = 0; i < mUnSelectedBox->count(); ++i )
+ if ( mUnSelectedBox->item( i )->isSelected() ) {
+ state = true;
+ break;
+ }
+ mAddButton->setEnabled( state );
+
+ int j = mSelectedBox->currentItem();
+ state = ( j > -1 && mSelectedBox->isSelected( j ) );
+
+ // up button: enabled if there is a current item > 0 and that is selected
+ mUpButton->setEnabled( ( j > 0 && state ) );
+
+ // down button: enabled if there is a current item < count - 2 and that is selected
+ mDownButton->setEnabled( ( j > -1 && j < (int)mSelectedBox->count() - 1 && state ) );
+
+ // remove button: enabled if any items are selected in the selected list
+ state = false;
+ for ( uint i = 0; i < mSelectedBox->count(); ++i )
+ if ( mSelectedBox->item( i )->isSelected() ) {
+ state = true;
+ break;
+ }
+ mRemoveButton->setEnabled( state );
+}
+
+void ViewConfigureFieldsPage::slotMoveUp()
+{
+ int i = mSelectedBox->currentItem();
+ if ( i > 0 ) {
+ QListBoxItem *item = mSelectedBox->item( i );
+ mSelectedBox->takeItem( item );
+ mSelectedBox->insertItem( item, i - 1 );
+ mSelectedBox->setCurrentItem( item );
+ mSelectedBox->setSelected( i - 1, true );
+ }
+}
+
+void ViewConfigureFieldsPage::slotMoveDown()
+{
+ int i = mSelectedBox->currentItem();
+ if ( i > -1 && i < (int)mSelectedBox->count() - 1 ) {
+ QListBoxItem *item = mSelectedBox->item( i );
+ mSelectedBox->takeItem( item );
+ mSelectedBox->insertItem( item, i + 1 );
+ mSelectedBox->setCurrentItem( item );
+ mSelectedBox->setSelected( i + 1, true );
+ }
+}
+
+void ViewConfigureFieldsPage::initGUI()
+{
+ setCaption( i18n("Select Fields to Display") );
+
+ QGridLayout *gl = new QGridLayout( this , 6, 4, 0, KDialog::spacingHint() );
+
+ mCategoryCombo = new KComboBox( false, this );
+ mCategoryCombo->insertItem( KABC::Field::categoryLabel( KABC::Field::All ) );
+ mCategoryCombo->insertItem( KABC::Field::categoryLabel( KABC::Field::Frequent ) );
+ mCategoryCombo->insertItem( KABC::Field::categoryLabel( KABC::Field::Address ) );
+ mCategoryCombo->insertItem( KABC::Field::categoryLabel( KABC::Field::Email ) );
+ mCategoryCombo->insertItem( KABC::Field::categoryLabel( KABC::Field::Personal ) );
+ mCategoryCombo->insertItem( KABC::Field::categoryLabel( KABC::Field::Organization ) );
+ mCategoryCombo->insertItem( KABC::Field::categoryLabel( KABC::Field::CustomCategory ) );
+ connect( mCategoryCombo, SIGNAL( activated(int) ), SLOT( slotShowFields(int) ) );
+ gl->addWidget( mCategoryCombo, 0, 0 );
+
+ QLabel *label = new QLabel( i18n( "&Selected fields:" ), this );
+ gl->addWidget( label, 0, 2 );
+
+ mUnSelectedBox = new QListBox( this );
+ mUnSelectedBox->setSelectionMode( QListBox::Extended );
+ mUnSelectedBox->setMinimumHeight( 100 );
+ gl->addWidget( mUnSelectedBox, 1, 0 );
+
+ mSelectedBox = new QListBox( this );
+ mSelectedBox->setSelectionMode( QListBox::Extended );
+ label->setBuddy( mSelectedBox );
+ gl->addWidget( mSelectedBox, 1, 2 );
+
+ QBoxLayout *vb1 = new QBoxLayout( QBoxLayout::TopToBottom, KDialog::spacingHint() );
+ vb1->addStretch();
+
+ mAddButton = new QToolButton( this );
+ mAddButton->setIconSet( QApplication::reverseLayout() ? SmallIconSet( "1leftarrow" ) : SmallIconSet( "1rightarrow" ) );
+ connect( mAddButton, SIGNAL( clicked() ), SLOT( slotSelect() ) );
+ vb1->addWidget( mAddButton );
+
+ mRemoveButton = new QToolButton( this );
+ mRemoveButton->setIconSet( QApplication::reverseLayout() ? SmallIconSet( "1rightarrow" ) : SmallIconSet( "1leftarrow" ) );
+ connect( mRemoveButton, SIGNAL( clicked() ), SLOT( slotUnSelect() ) );
+ vb1->addWidget( mRemoveButton );
+
+ vb1->addStretch();
+ gl->addLayout( vb1, 1, 1 );
+
+ QBoxLayout *vb2 = new QBoxLayout( QBoxLayout::TopToBottom, KDialog::spacingHint() );
+ vb2->addStretch();
+
+ mUpButton = new QToolButton( this );
+ mUpButton->setIconSet( SmallIconSet( "1uparrow" ) );
+ connect( mUpButton, SIGNAL( clicked() ), SLOT( slotMoveUp() ) );
+ vb2->addWidget( mUpButton );
+
+ mDownButton = new QToolButton( this );
+ mDownButton->setIconSet( SmallIconSet( "1downarrow" ) );
+ connect( mDownButton, SIGNAL( clicked() ), SLOT( slotMoveDown() ) );
+ vb2->addWidget( mDownButton );
+
+ vb2->addStretch();
+ gl->addLayout( vb2, 1, 3 );
+
+ QSize sizeHint = mUnSelectedBox->sizeHint();
+
+ // make sure we fill the list with all items, so that we can
+ // get the maxItemWidth we need to not truncate the view
+ slotShowFields( 0 );
+
+ sizeHint = sizeHint.expandedTo( mSelectedBox->sizeHint() );
+ sizeHint.setWidth( mUnSelectedBox->maxItemWidth() );
+ mUnSelectedBox->setMinimumSize( sizeHint );
+ mSelectedBox->setMinimumSize( sizeHint );
+
+ gl->activate();
+
+ connect( mUnSelectedBox, SIGNAL( selectionChanged() ), SLOT( slotButtonsEnabled() ) );
+ connect( mSelectedBox, SIGNAL( selectionChanged() ), SLOT( slotButtonsEnabled() ) );
+ connect( mSelectedBox, SIGNAL( currentChanged( QListBoxItem * ) ), SLOT( slotButtonsEnabled() ) );
+
+ slotButtonsEnabled();
+}
+
+#include "viewconfigurefieldspage.moc"