summaryrefslogtreecommitdiffabout
path: root/kaddressbook/phoneeditwidget.cpp
Side-by-side diff
Diffstat (limited to 'kaddressbook/phoneeditwidget.cpp') (more/less context) (show whitespace changes)
-rw-r--r--kaddressbook/phoneeditwidget.cpp532
1 files changed, 532 insertions, 0 deletions
diff --git a/kaddressbook/phoneeditwidget.cpp b/kaddressbook/phoneeditwidget.cpp
new file mode 100644
index 0000000..78b9941
--- a/dev/null
+++ b/kaddressbook/phoneeditwidget.cpp
@@ -0,0 +1,532 @@
+/*
+ This file is part of KAddressBook.
+ Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
+
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 <qlayout.h>
+#include <qlabel.h>
+#include <qtooltip.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qstring.h>
+#include <qlistbox.h>
+#include <qlistview.h>
+#include <qbuttongroup.h>
+
+#include <kbuttonbox.h>
+#include <klistview.h>
+#include <kapplication.h>
+#include <qapplication.h>
+#include <kconfig.h>
+#include <klineedit.h>
+#include <kcombobox.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+#include <kabc/phonenumber.h>
+
+#include "typecombo.h"
+
+#include "phoneeditwidget.h"
+
+PhoneEditWidget::PhoneEditWidget( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ QGridLayout *layout = new QGridLayout( this, 4, 1 );
+//US layout->setSpacing( KDialog::spacingHint() );
+ layout->setSpacing( KDialogBase::spacingHintSmall() );
+
+
+
+ QLabel* label = new QLabel( this );
+//US loadIcon call is ambiguous. Add one more parameter
+//US label->setPixmap( KGlobal::iconLoader()->loadIcon( "kaddressbook", KIcon::Desktop ) );
+ label->setPixmap( KGlobal::iconLoader()->loadIcon( "kaddressbook", KIcon::Desktop, 0 ) );
+ label->setAlignment( AlignCenter );
+//US layout->addMultiCellWidget( label, 0, 1, 3, 3 );
+ layout->addWidget( label, 0, 0 );
+
+ QPushButton *editButton = new QPushButton( i18n( "Edit Phone Numbers..." ),
+ this );
+ if ( QApplication::desktop()->width() < 640 )
+ layout->addWidget( editButton, 0, 1 );
+ else
+ layout->addMultiCellWidget( editButton, 0, 0, 1, 3);
+
+ mPrefCombo = new PhoneTypeCombo( mPhoneList, this );
+ mPrefEdit = new KLineEdit( this );
+ //mPrefEdit->setMinimumWidth( int(mPrefEdit->sizeHint().width() * 1.5) );
+ mPrefCombo->setLineEdit( mPrefEdit );
+ layout->addWidget( mPrefCombo, 1, 0 );
+ layout->addWidget( mPrefEdit, 1, 1 );
+ int x = 1, y = 2;
+ if ( QApplication::desktop()->width() < 640 ) {
+ ++x;
+ y = 0;
+ }
+ mSecondCombo = new PhoneTypeCombo( mPhoneList, this );
+ mSecondEdit = new KLineEdit( this );
+ mSecondCombo->setLineEdit( mSecondEdit );
+ layout->addWidget( mSecondCombo, x, y++ );
+ layout->addWidget( mSecondEdit, x, y++ );
+
+ y = 0;
+ ++x;
+ mThirdCombo = new PhoneTypeCombo( mPhoneList, this );
+ mThirdEdit = new KLineEdit( this );
+ mThirdCombo->setLineEdit( mThirdEdit );
+ layout->addWidget( mThirdCombo, x, y++ );
+ layout->addWidget( mThirdEdit, x, y++ );
+ if ( QApplication::desktop()->width() < 640 ) {
+ ++x;
+ y = 0;
+ }
+ mFourthCombo = new PhoneTypeCombo( mPhoneList, this );
+ mFourthEdit = new KLineEdit( this );
+ mFourthCombo->setLineEdit( mFourthEdit );
+ layout->addWidget( mFourthCombo, x, y++ );
+ layout->addWidget( mFourthEdit, x, y++ );
+
+ // Four numbers don't fit in the current dialog
+ if ( QApplication::desktop()->width() < 640 ) {
+ mFourthCombo->hide();
+ mFourthEdit->hide();
+ } else {
+ QFontMetrics fm ( font () ) ;
+ int wid = fm.width( "Messenger" ) +60;
+ mPrefCombo->setMaximumWidth( wid );
+ mSecondCombo->setMaximumWidth( wid );
+ mThirdCombo->setMaximumWidth( wid );
+ mFourthCombo->setMaximumWidth( wid );
+ }
+
+
+ connect( mPrefEdit, SIGNAL( textChanged( const QString& ) ),
+ SLOT( slotPrefEditChanged() ) );
+ connect( mSecondEdit, SIGNAL( textChanged( const QString& ) ),
+ SLOT( slotSecondEditChanged() ) );
+ connect( mThirdEdit, SIGNAL( textChanged( const QString& ) ),
+ SLOT( slotThirdEditChanged() ) );
+ connect( mFourthEdit, SIGNAL( textChanged( const QString& ) ),
+ SLOT( slotFourthEditChanged() ) );
+
+ connect( editButton, SIGNAL( clicked() ), SLOT( edit() ) );
+
+ connect( mPrefCombo, SIGNAL( activated( int ) ),
+ SLOT( updatePrefEdit() ) );
+ connect( mSecondCombo, SIGNAL( activated( int ) ),
+ SLOT( updateSecondEdit() ) );
+ connect( mThirdCombo, SIGNAL( activated( int ) ),
+ SLOT( updateThirdEdit() ) );
+ connect( mFourthCombo, SIGNAL( activated( int ) ),
+ SLOT( updateFourthEdit() ) );
+}
+
+PhoneEditWidget::~PhoneEditWidget()
+{
+}
+
+void PhoneEditWidget::setPhoneNumbers( const KABC::PhoneNumber::List &list )
+{
+ mPhoneList.clear();
+
+ // Insert types for existing numbers.
+ mPrefCombo->insertTypeList( list );
+
+ QValueList<int> defaultTypes;
+ defaultTypes << KABC::PhoneNumber::Home;
+ defaultTypes << KABC::PhoneNumber::Work;
+ defaultTypes << KABC::PhoneNumber::Cell;
+ defaultTypes << ( KABC::PhoneNumber::Work | KABC::PhoneNumber::Fax );
+ defaultTypes << ( KABC::PhoneNumber::Home | KABC::PhoneNumber::Fax );
+
+ // Insert default types.
+ // Doing this for mPrefCombo is enough because the list is shared by all
+ // combos.
+ QValueList<int>::ConstIterator it;
+ for( it = defaultTypes.begin(); it != defaultTypes.end(); ++it ) {
+ if ( !mPrefCombo->hasType( *it ) )
+ mPrefCombo->insertType( list, *it, PhoneNumber( "", *it ) );
+ }
+
+ updateCombos();
+
+ mPrefCombo->selectType( defaultTypes[ 0 ] );
+ mSecondCombo->selectType( defaultTypes[ 1 ] );
+ mThirdCombo->selectType( defaultTypes[ 2 ] );
+ mFourthCombo->selectType( defaultTypes[ 3 ] );
+
+ updateLineEdits();
+}
+
+void PhoneEditWidget::updateLineEdits()
+{
+ updatePrefEdit();
+ updateSecondEdit();
+ updateThirdEdit();
+ updateFourthEdit();
+}
+
+void PhoneEditWidget::updateCombos()
+{
+ mPrefCombo->updateTypes();
+ mSecondCombo->updateTypes();
+ mThirdCombo->updateTypes();
+ mFourthCombo->updateTypes();
+}
+
+KABC::PhoneNumber::List PhoneEditWidget::phoneNumbers()
+{
+ KABC::PhoneNumber::List retList;
+
+ KABC::PhoneNumber::List::Iterator it;
+ for ( it = mPhoneList.begin(); it != mPhoneList.end(); ++it )
+ if ( !(*it).number().isEmpty() )
+ retList.append( *it );
+
+ return retList;
+}
+
+void PhoneEditWidget::edit()
+{
+ PhoneEditDialog dlg( mPhoneList, this );
+
+ if ( dlg.exec() ) {
+ if ( dlg.changed() ) {
+ mPhoneList = dlg.phoneNumbers();
+ updateCombos();
+ emit modified();
+ }
+ }
+}
+
+void PhoneEditWidget::updatePrefEdit()
+{
+ updateEdit( mPrefCombo );
+}
+
+void PhoneEditWidget::updateSecondEdit()
+{
+ updateEdit( mSecondCombo );
+}
+
+void PhoneEditWidget::updateThirdEdit()
+{
+ updateEdit( mThirdCombo );
+}
+
+void PhoneEditWidget::updateFourthEdit()
+{
+ updateEdit( mFourthCombo );
+}
+
+void PhoneEditWidget::updateEdit( PhoneTypeCombo *combo )
+{
+ QLineEdit *edit = combo->lineEdit();
+ if ( !edit )
+ return;
+
+#if 0
+ if ( edit == mPrefEdit ) kdDebug(5720) << " prefEdit" << endl;
+ if ( edit == mSecondEdit ) kdDebug(5720) << " secondEdit" << endl;
+ if ( edit == mThirdEdit ) kdDebug(5720) << " thirdEdit" << endl;
+ if ( edit == mFourthEdit ) kdDebug(5720) << " fourthEdit" << endl;
+#endif
+
+ PhoneNumber::List::Iterator it = combo->selectedElement();
+ if ( it != mPhoneList.end() ) {
+ edit->setText( (*it).number() );
+ } else {
+ kdDebug(5720) << "PhoneEditWidget::updateEdit(): no selected element" << endl;
+ }
+}
+
+void PhoneEditWidget::slotPrefEditChanged()
+{
+ updatePhoneNumber( mPrefCombo );
+}
+
+void PhoneEditWidget::slotSecondEditChanged()
+{
+ updatePhoneNumber( mSecondCombo );
+}
+
+void PhoneEditWidget::slotThirdEditChanged()
+{
+ updatePhoneNumber( mThirdCombo );
+}
+
+void PhoneEditWidget::slotFourthEditChanged()
+{
+ updatePhoneNumber( mFourthCombo );
+}
+
+void PhoneEditWidget::updatePhoneNumber( PhoneTypeCombo *combo )
+{
+ QLineEdit *edit = combo->lineEdit();
+ if ( !edit ) return;
+
+ PhoneNumber::List::Iterator it = combo->selectedElement();
+ if ( it != mPhoneList.end() ) {
+ (*it).setNumber( edit->text() );
+ } else {
+ kdDebug(5720) << "PhoneEditWidget::updatePhoneNumber(): no selected element"
+ << endl;
+ }
+
+ updateOtherEdit( combo, mPrefCombo );
+ updateOtherEdit( combo, mSecondCombo );
+ updateOtherEdit( combo, mThirdCombo );
+ updateOtherEdit( combo, mFourthCombo );
+
+ emit modified();
+}
+
+void PhoneEditWidget::updateOtherEdit( PhoneTypeCombo *combo, PhoneTypeCombo *otherCombo )
+{
+ if ( combo == otherCombo ) return;
+
+ if ( combo->currentItem() == otherCombo->currentItem() ) {
+ updateEdit( otherCombo );
+ }
+}
+
+///////////////////////////////////////////
+// PhoneEditDialog
+
+class PhoneViewItem : public QListViewItem
+{
+public:
+ PhoneViewItem( QListView *parent, const KABC::PhoneNumber &number );
+
+ void setPhoneNumber( const KABC::PhoneNumber &number )
+ {
+ mPhoneNumber = number;
+ makeText();
+ }
+
+ QString key() { return mPhoneNumber.id(); }
+ QString country() { return ""; }
+ QString region() { return ""; }
+ QString number() { return ""; }
+
+ KABC::PhoneNumber phoneNumber() { return mPhoneNumber; }
+
+private:
+ void makeText();
+
+ KABC::PhoneNumber mPhoneNumber;
+};
+
+PhoneViewItem::PhoneViewItem( QListView *parent, const KABC::PhoneNumber &number )
+ : QListViewItem( parent ), mPhoneNumber( number )
+{
+ makeText();
+}
+
+void PhoneViewItem::makeText()
+{
+ /**
+ * Will be used in future versions of kaddressbook/libkabc
+
+ setText( 0, mPhoneNumber.country() );
+ setText( 1, mPhoneNumber.region() );
+ setText( 2, mPhoneNumber.number() );
+ setText( 3, mPhoneNumber.typeLabel() );
+ */
+
+ setText( 0, mPhoneNumber.number() );
+ setText( 1, mPhoneNumber.typeLabel() );
+}
+
+PhoneEditDialog::PhoneEditDialog( const KABC::PhoneNumber::List &list, QWidget *parent, const char *name )
+ : KDialogBase( KDialogBase::Plain, i18n( "Edit Phone Numbers" ),
+ KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok,
+ parent, name, true)
+{
+ mPhoneNumberList = list;
+
+ QWidget *page = plainPage();
+
+ QGridLayout *layout = new QGridLayout( page, 1, 2 );
+ layout->setSpacing( spacingHint() );
+
+ mListView = new KListView( page );
+ mListView->setAllColumnsShowFocus( true );
+ mListView->addColumn( i18n( "Number" ) );
+ mListView->addColumn( i18n( "Type" ) );
+
+ KButtonBox *buttonBox = new KButtonBox( page, Vertical );
+
+ buttonBox->addButton( i18n( "&Add..." ), this, SLOT( slotAddPhoneNumber() ) );
+ mEditButton = buttonBox->addButton( i18n( "&Edit..." ), this, SLOT( slotEditPhoneNumber() ) );
+ mEditButton->setEnabled( false );
+ mRemoveButton = buttonBox->addButton( i18n( "&Remove" ), this, SLOT( slotRemovePhoneNumber() ) );
+ mRemoveButton->setEnabled( false );
+ buttonBox->layout();
+
+ layout->addWidget( mListView, 0, 0 );
+ layout->addWidget( buttonBox, 0, 1 );
+
+ connect( mListView, SIGNAL(selectionChanged()), SLOT(slotSelectionChanged()) );
+ connect( mListView, SIGNAL(doubleClicked( QListViewItem *, const QPoint &, int )), this, SLOT( slotEditPhoneNumber()));
+
+ KABC::PhoneNumber::List::Iterator it;
+ for ( it = mPhoneNumberList.begin(); it != mPhoneNumberList.end(); ++it )
+ new PhoneViewItem( mListView, *it );
+
+ mChanged = false;
+}
+
+PhoneEditDialog::~PhoneEditDialog()
+{
+}
+
+void PhoneEditDialog::slotAddPhoneNumber()
+{
+ KABC::PhoneNumber tmp( "", 0 );
+ PhoneTypeDialog dlg( tmp, this );
+
+ if ( dlg.exec() ) {
+ KABC::PhoneNumber phoneNumber = dlg.phoneNumber();
+ mPhoneNumberList.append( phoneNumber );
+ new PhoneViewItem( mListView, phoneNumber );
+
+ mChanged = true;
+ }
+}
+
+void PhoneEditDialog::slotRemovePhoneNumber()
+{
+ PhoneViewItem *item = static_cast<PhoneViewItem*>( mListView->currentItem() );
+ if ( !item )
+ return;
+
+ mPhoneNumberList.remove( item->phoneNumber() );
+ QListViewItem *currItem = mListView->currentItem();
+ mListView->takeItem( currItem );
+ delete currItem;
+
+ mChanged = true;
+}
+
+void PhoneEditDialog::slotEditPhoneNumber()
+{
+ PhoneViewItem *item = static_cast<PhoneViewItem*>( mListView->currentItem() );
+ if ( !item )
+ return;
+
+ PhoneTypeDialog dlg( item->phoneNumber(), this );
+
+ if ( dlg.exec() ) {
+ slotRemovePhoneNumber();
+ KABC::PhoneNumber phoneNumber = dlg.phoneNumber();
+ mPhoneNumberList.append( phoneNumber );
+ new PhoneViewItem( mListView, phoneNumber );
+
+ mChanged = true;
+ }
+}
+
+void PhoneEditDialog::slotSelectionChanged()
+{
+ bool state = ( mListView->currentItem() != 0 );
+
+ mRemoveButton->setEnabled( state );
+ mEditButton->setEnabled( state );
+}
+
+const KABC::PhoneNumber::List &PhoneEditDialog::phoneNumbers()
+{
+ return mPhoneNumberList;
+}
+
+bool PhoneEditDialog::changed() const
+{
+ return mChanged;
+}
+
+///////////////////////////////////////////
+// PhoneTypeDialog
+PhoneTypeDialog::PhoneTypeDialog( const KABC::PhoneNumber &phoneNumber,
+ QWidget *parent, const char *name)
+ : KDialogBase( KDialogBase::Plain, i18n( "Edit Phone Number" ),
+ KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok,
+ parent, name, true), mPhoneNumber( phoneNumber )
+{
+ QWidget *page = plainPage();
+ QLabel *label = 0;
+ QGridLayout *layout = new QGridLayout( page, 3, 2, marginHint(), spacingHint() );
+
+ label = new QLabel( i18n( "Number:" ), page );
+ layout->addWidget( label, 0, 0 );
+ mNumber = new KLineEdit( page );
+ layout->addWidget( mNumber, 0, 1 );
+
+ mPreferredBox = new QCheckBox( i18n( "This is the preferred phone number" ), page );
+ layout->addMultiCellWidget( mPreferredBox, 1, 1, 0, 1 );
+
+ mGroup = new QButtonGroup( 2, Horizontal, i18n( "Types" ), page );
+ layout->addMultiCellWidget( mGroup, 2, 2, 0, 1 );
+
+ // fill widgets
+ mNumber->setText( mPhoneNumber.number() );
+
+ mTypeList = KABC::PhoneNumber::typeList();
+ mTypeList.remove( KABC::PhoneNumber::Pref );
+
+ KABC::PhoneNumber::TypeList::Iterator it;
+ for ( it = mTypeList.begin(); it != mTypeList.end(); ++it )
+ new QCheckBox( KABC::PhoneNumber::typeLabel( *it ), mGroup );
+
+ for ( int i = 0; i < mGroup->count(); ++i ) {
+ int type = mPhoneNumber.type();
+ QCheckBox *box = (QCheckBox*)mGroup->find( i );
+ box->setChecked( type & mTypeList[ i ] );
+ }
+
+ mPreferredBox->setChecked( mPhoneNumber.type() & KABC::PhoneNumber::Pref );
+}
+
+KABC::PhoneNumber PhoneTypeDialog::phoneNumber()
+{
+ mPhoneNumber.setNumber( mNumber->text() );
+
+ int type = 0;
+ for ( int i = 0; i < mGroup->count(); ++i ) {
+ QCheckBox *box = (QCheckBox*)mGroup->find( i );
+ if ( box->isChecked() )
+ type += mTypeList[ i ];
+ }
+
+ if ( mPreferredBox->isChecked() )
+ mPhoneNumber.setType( type | KABC::PhoneNumber::Pref );
+ else
+ mPhoneNumber.setType( type & ~KABC::PhoneNumber::Pref );
+
+ return mPhoneNumber;
+}
+
+#ifndef KAB_EMBEDDED
+#include "phoneeditwidget.moc"
+#endif //KAB_EMBEDDED