-rw-r--r-- | kaddressbook/phoneeditwidget.cpp | 112 | ||||
-rw-r--r-- | kaddressbook/phoneeditwidget.h | 87 |
2 files changed, 187 insertions, 12 deletions
diff --git a/kaddressbook/phoneeditwidget.cpp b/kaddressbook/phoneeditwidget.cpp index 2bce39a..b20275d 100644 --- a/kaddressbook/phoneeditwidget.cpp +++ b/kaddressbook/phoneeditwidget.cpp @@ -1,148 +1,258 @@ /* 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 <qhbox.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 ) + : QScrollView(parent,name) +{ + setFrameStyle ( QFrame::Panel | QFrame::Plain ); + setLineWidth ( 1 ); + setMidLineWidth ( 1 ); + mw = new QWidget ( viewport() ); + addChild(mw); + setResizePolicy( AutoOneFit ); + mainLayout = new QVBoxLayout ( mw ); + mainLayout->setMargin( 2 ); + mainLayout->setSpacing( 2 ); + QWidget* hb = new QWidget ( mw ); + mainLayout->add( hb ); + QHBoxLayout* hbLayout = new QHBoxLayout ( hb ); + QPushButton *addBut = new QPushButton ( "add", hb ); + hbLayout->add( addBut ); + addBut->setPixmap ( SmallIcon("plus")); + addBut->setMaximumSize( addBut->sizeHint().height(),addBut->sizeHint().height() ); + connect(addBut,SIGNAL(clicked()),SLOT(addNumber())); + //QLabel * temp = new QLabel( i18n("Phone Type"), hb ); + QLabel *temp = new QLabel( i18n("Phone Number"),hb ); + temp->setAlignment( Qt::AlignCenter ); + temp->setPixmap( KGlobal::iconLoader()->loadIcon( "kaddressbook", KIcon::Desktop, 0 ) ); + hbLayout->add( temp ); + appendEditCombo(); + appendEditCombo(); + appendEditCombo(); + setDefaults(); +} + +PhoneEditWidget::~PhoneEditWidget() +{ +} +void PhoneEditWidget::setDefaults() +{ + PhoneTypeNumberEdit* edit = mTypeNumberEditList.first(); + KABC::PhoneNumber phoneNumber; + phoneNumber.setType( KABC::PhoneNumber::Home | KABC::PhoneNumber::Pref ); + edit->setPhoneNumber( phoneNumber ); + edit = mTypeNumberEditList.next(); + phoneNumber.setType( KABC::PhoneNumber::Work | KABC::PhoneNumber::Pref ); + edit->setPhoneNumber( phoneNumber ); + edit = mTypeNumberEditList.next(); + phoneNumber.setType( KABC::PhoneNumber::Cell ); + edit->setPhoneNumber( phoneNumber ); + edit = mTypeNumberEditList.next(); + while ( edit ) { + edit->hide(); + edit = mTypeNumberEditList.next(); + } +} +void PhoneEditWidget::addNumber() +{ + +} +PhoneTypeNumberEdit* PhoneEditWidget::appendEditCombo() +{ + PhoneTypeNumberEdit* edit = new PhoneTypeNumberEdit( mw ); + connect ( edit, SIGNAL ( typeChange( int , int) ), this, SIGNAL ( typeChange( int , int)) ); + connect ( edit, SIGNAL ( modified() ), this, SIGNAL ( modified() ) ); + connect ( this, SIGNAL ( typeChange( int , int)), edit, SLOT ( typeExternalChanged( int, int)) ); + + mainLayout->add( edit ); + mTypeNumberEditList.append( edit ); + return edit; +} + +void PhoneEditWidget::setPhoneNumbers( const KABC::PhoneNumber::List &li ) +{ + if ( li.isEmpty() ) { + setDefaults(); + return; + } + KABC::PhoneNumber::List::Iterator it; + KABC::PhoneNumber::List list = li; + PhoneTypeNumberEdit* edit = mTypeNumberEditList.first(); + for ( it = list.begin(); it != list.end(); ++it ) { + if ( edit ) { + edit->setPhoneNumber( (*it ) ); + edit = mTypeNumberEditList.next(); + } else { + PhoneTypeNumberEdit* editNew = appendEditCombo(); + editNew->setPhoneNumber( (*it ) ); + } + } + while ( edit ) { + edit->hide(); + edit = mTypeNumberEditList.next(); + } + //mainLayout->invalidate (); + mw->update(); +} +KABC::PhoneNumber::List PhoneEditWidget::phoneNumbers() +{ + KABC::PhoneNumber::List retList; + + PhoneTypeNumberEdit* edit = mTypeNumberEditList.first(); + while ( edit ) { + if ( edit->isValid() ) { + retList.append( edit->phoneNumber()); + } + edit = mTypeNumberEditList.next(); + + } + return retList; +} + +#if 0 +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() { } @@ -457,100 +567,100 @@ 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 ); mNumber->setFocus(); mNumber->setSelection( 0, 1024); } 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; } - +#endif #ifndef KAB_EMBEDDED #include "phoneeditwidget.moc" #endif //KAB_EMBEDDED diff --git a/kaddressbook/phoneeditwidget.h b/kaddressbook/phoneeditwidget.h index 0241cf0..6a514ed 100644 --- a/kaddressbook/phoneeditwidget.h +++ b/kaddressbook/phoneeditwidget.h @@ -1,222 +1,287 @@ #ifndef PHONEEDITWIDGET_H #define PHONEEDITWIDGET_H /* 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 <kdialogbase.h> #include <kiconloader.h> #include <qpushbutton.h> #include <qlayout.h> +#include <qptrlist.h> +#include <qscrollview.h> #include "addresseeconfig.h" #include "typecombo.h" class QButtonGroup; class QCheckBox; +class PhoneTypeNumberEdit; #include <klineedit.h> #include <kcombobox.h> -class KListView; +#include <kabc/phonenumber.h> typedef TypeCombo<KABC::PhoneNumber> PhoneTypeCombo; /** Widget for editing phone numbers. */ -class PhoneEditWidget : public QWidget +class PhoneEditWidget : public QScrollView { Q_OBJECT public: PhoneEditWidget( QWidget *parent, const char *name = 0 ); ~PhoneEditWidget(); void setPhoneNumbers( const KABC::PhoneNumber::List &list ); KABC::PhoneNumber::List phoneNumbers(); - void updateTypeCombo( const KABC::PhoneNumber::List&, KComboBox* ); - KABC::PhoneNumber currentPhoneNumber( KComboBox*, int ); + // void updateTypeCombo( const KABC::PhoneNumber::List&, KComboBox* ); + //KABC::PhoneNumber currentPhoneNumber( KComboBox*, int ); signals: void modified(); + void typeChange( int oldType, int newType ); private slots: + void addNumber(); + protected: + + private: + void setDefaults(); + PhoneTypeNumberEdit* appendEditCombo(); + QWidget* mw; + QVBoxLayout* mainLayout; + QPtrList <PhoneTypeNumberEdit> mTypeNumberEditList; + + KABC::PhoneNumber::List mPhoneList; +}; + + + + + +#if 0 +class PhoneEditWidget : public QWidget +{ + Q___OBJECT + + public: + PhoneEditWidget( QWidget *parent, const char *name = 0 ); + ~PhoneEditWidget(); + + void setPhoneNumbers( const KABC::PhoneNumber::List &list ); + KABC::PhoneNumber::List phoneNumbers(); + + void updateTypeCombo( const KABC::PhoneNumber::List&, KComboBox* ); + KABC::PhoneNumber currentPhoneNumber( KComboBox*, int ); + + sig_nals: + void modified(); + void typeChange( int oldType, int newType ); + + private sl_ots: void edit(); void updatePrefEdit(); void updateSecondEdit(); void updateThirdEdit(); void updateFourthEdit(); void slotPrefEditChanged(); void slotSecondEditChanged(); void slotThirdEditChanged(); void slotFourthEditChanged(); protected: void updateLineEdits(); void updateCombos(); private: + QPtrList <PhoneTypeNumberEdit> mTypeNumberEditList; void updateEdit( PhoneTypeCombo *combo ); void updatePhoneNumber( PhoneTypeCombo *combo ); void updateOtherEdit( PhoneTypeCombo *combo, PhoneTypeCombo *otherCombo ); PhoneTypeCombo *mPrefCombo; PhoneTypeCombo *mSecondCombo; PhoneTypeCombo *mThirdCombo; PhoneTypeCombo *mFourthCombo; KLineEdit *mPrefEdit; KLineEdit *mSecondEdit; KLineEdit *mThirdEdit; KLineEdit *mFourthEdit; KABC::PhoneNumber::List mPhoneList; }; /** Dialog for editing lists of phonenumbers. */ class PhoneEditDialog : public KDialogBase { - Q_OBJECT + Q___OBJECT public: PhoneEditDialog( const KABC::PhoneNumber::List &list, QWidget *parent, const char *name = 0 ); ~PhoneEditDialog(); const KABC::PhoneNumber::List &phoneNumbers(); bool changed() const; - protected slots: + protected s__lots: void slotAddPhoneNumber(); void slotRemovePhoneNumber(); void slotEditPhoneNumber(); void slotSelectionChanged(); private: KABC::PhoneNumber::List mPhoneNumberList; KABC::PhoneNumber::TypeList mTypeList; KComboBox *mTypeBox; KListView *mListView; QPushButton *mRemoveButton; QPushButton *mEditButton; bool mChanged; }; /** Dialog for editing phone number types. */ class PhoneTypeDialog : public KDialogBase { - Q_OBJECT + Q___OBJECT public: PhoneTypeDialog( const KABC::PhoneNumber &phoneNumber, QWidget *parent, const char *name = 0 ); KABC::PhoneNumber phoneNumber(); private: KABC::PhoneNumber mPhoneNumber; KABC::PhoneNumber::TypeList mTypeList; QButtonGroup *mGroup; QCheckBox *mPreferredBox; KLineEdit *mNumber; }; +#endif + class PhoneTypeNumberEdit : public QWidget { Q_OBJECT public: - PhoneTypeNumberEdit( QWidget *parent, const char *name = 0 ) + PhoneTypeNumberEdit( QWidget *parent, const char *name = 0 ) :QWidget( parent ) { QHBoxLayout * lay = new QHBoxLayout( this ); lay->setSpacing( KDialogBase::spacingHintSmall() ); lay->setMargin( KDialogBase::marginHintSmall() ); mMinusButton = new QPushButton ( this ); mMinusButton->setPixmap ( SmallIcon("minus")); mCombo = new KComboBox( this ); mNumber = new KLineEdit( this ); lay->addWidget( mMinusButton ); lay->addWidget( mCombo ); lay->addWidget( mNumber ); connect( mMinusButton , SIGNAL ( clicked() ), this, SLOT ( deleteNumber() ) ); connect( mCombo , SIGNAL ( activated ( int ) ), this, SLOT ( comboTypeChange( int ) ) ); + connect( mNumber , SIGNAL ( textChanged ( const QString & ) ), + this, SLOT ( textChanged ( const QString & ) ) ); mCombo->insertStringList( PhoneNumber::supportedTypeListNames() ); + mIsValid = true; } void setPhoneNumber( const KABC::PhoneNumber &phoneNumber ) { mPhoneNumber = phoneNumber; int index = PhoneNumber::typeListIndex4Type( mPhoneNumber.type() ); mCombo->setCurrentItem( index ); mNumber->setText( mPhoneNumber.number() ); + mIsValid = true; show(); } KABC::PhoneNumber phoneNumber() { mPhoneNumber.setNumber( mNumber->text() ); int index = mCombo->currentItem(); mPhoneNumber.setType( PhoneNumber::supportedTypeList()[index] ); return mPhoneNumber; - } + bool isValid() + { + if ( !mIsValid ) return false; + if ( mNumber->text().isEmpty() )return false; + return true; + } private slots: void typeExternalChanged( int oldType, int newType ) { if ( mPhoneNumber.type() == newType ) { mPhoneNumber.setType(oldType); int index = PhoneNumber::typeListIndex4Type( mPhoneNumber.type() ); mCombo->setCurrentItem( index ); } - } void deleteNumber() { + emit modified(); hide(); + mIsValid = false; } void comboTypeChange( int index ) { int old = mPhoneNumber.type(); int newT = PhoneNumber::supportedTypeList()[index]; if ( old != newT ) { - mPhoneNumber.setType(newT ); + emit modified(); emit typeChange ( old, newT ); + mPhoneNumber.setType(newT ); } } + int currentType() + { + return mCombo->currentItem(); + } + void textChanged ( const QString & ) + { + emit modified(); + } signals: void typeChange( int oldType, int newType ); + void modified(); private: + bool mIsValid; KABC::PhoneNumber mPhoneNumber; QPushButton* mMinusButton; KComboBox *mCombo; KLineEdit *mNumber; }; #endif |