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 <qlayout.h>
00025
#include <qlabel.h>
00026
#include <qtooltip.h>
00027
#include <qpushbutton.h>
00028
#include <qcheckbox.h>
00029
#include <qstring.h>
00030
#include <qlistbox.h>
00031
#include <qlistview.h>
00032
#include <qbuttongroup.h>
00033
00034
#include <kbuttonbox.h>
00035
#include <klistview.h>
00036
#include <kapplication.h>
00037
#include <kconfig.h>
00038
#include <klineedit.h>
00039
#include <kcombobox.h>
00040
#include <klocale.h>
00041
#include <kdebug.h>
00042
#include <kiconloader.h>
00043
00044
#include <kabc/phonenumber.h>
00045
00046
#include "typecombo.h"
00047
00048
#include "phoneeditwidget.h"
00049
00050 PhoneEditWidget::PhoneEditWidget(
QWidget *parent,
const char *name )
00051 :
QWidget( parent, name ), mReadOnly(false)
00052 {
00053
QGridLayout *layout =
new QGridLayout(
this, 5, 2 );
00054 layout->setSpacing( KDialog::spacingHint() );
00055
00056 mPrefCombo =
new PhoneTypeCombo( mPhoneList,
this );
00057 mPrefEdit =
new KLineEdit(
this );
00058 mPrefEdit->setMinimumWidth(
int(mPrefEdit->sizeHint().width() * 1.5) );
00059 mPrefCombo->setLineEdit( mPrefEdit );
00060 layout->addWidget( mPrefCombo, 0, 0 );
00061 layout->addWidget( mPrefEdit, 0, 1 );
00062
00063 mSecondCombo =
new PhoneTypeCombo( mPhoneList,
this );
00064 mSecondEdit =
new KLineEdit(
this );
00065 mSecondCombo->setLineEdit( mSecondEdit );
00066 layout->addWidget( mSecondCombo, 1, 0 );
00067 layout->addWidget( mSecondEdit, 1, 1 );
00068
00069 mThirdCombo =
new PhoneTypeCombo( mPhoneList,
this );
00070 mThirdEdit =
new KLineEdit(
this );
00071 mThirdCombo->setLineEdit( mThirdEdit );
00072 layout->addWidget( mThirdCombo, 2, 0 );
00073 layout->addWidget( mThirdEdit, 2, 1 );
00074
00075 mFourthCombo =
new PhoneTypeCombo( mPhoneList,
this );
00076 mFourthEdit =
new KLineEdit(
this );
00077 mFourthCombo->setLineEdit( mFourthEdit );
00078 layout->addWidget( mFourthCombo, 3, 0 );
00079 layout->addWidget( mFourthEdit, 3, 1 );
00080
00081
00082 mFourthCombo->hide();
00083 mFourthEdit->hide();
00084
00085 mEditButton =
new QPushButton( i18n(
"Edit Phone Numbers..." ),
this );
00086 layout->addMultiCellWidget( mEditButton, 4, 4, 0, 1 );
00087
00088 connect( mPrefEdit, SIGNAL( textChanged(
const QString& ) ),
00089 SLOT( slotPrefEditChanged() ) );
00090 connect( mSecondEdit, SIGNAL( textChanged(
const QString& ) ),
00091 SLOT( slotSecondEditChanged() ) );
00092 connect( mThirdEdit, SIGNAL( textChanged(
const QString& ) ),
00093 SLOT( slotThirdEditChanged() ) );
00094 connect( mFourthEdit, SIGNAL( textChanged(
const QString& ) ),
00095 SLOT( slotFourthEditChanged() ) );
00096
00097 connect( mEditButton, SIGNAL( clicked() ), SLOT( edit() ) );
00098
00099 connect( mPrefCombo, SIGNAL( activated(
int ) ),
00100 SLOT( updatePrefEdit() ) );
00101 connect( mSecondCombo, SIGNAL( activated(
int ) ),
00102 SLOT( updateSecondEdit() ) );
00103 connect( mThirdCombo, SIGNAL( activated(
int ) ),
00104 SLOT( updateThirdEdit() ) );
00105 connect( mFourthCombo, SIGNAL( activated(
int ) ),
00106 SLOT( updateFourthEdit() ) );
00107 }
00108
00109 PhoneEditWidget::~PhoneEditWidget()
00110 {
00111 }
00112
00113
void PhoneEditWidget::setReadOnly(
bool readOnly )
00114 {
00115 mReadOnly = readOnly;
00116
00117 mPrefEdit->setReadOnly( mReadOnly );
00118 mSecondEdit->setReadOnly( mReadOnly );
00119 mThirdEdit->setReadOnly( mReadOnly );
00120 mFourthEdit->setReadOnly( mReadOnly );
00121 mEditButton->setEnabled( !mReadOnly );
00122 }
00123
00124
void PhoneEditWidget::setPhoneNumbers(
const KABC::PhoneNumber::List &list )
00125 {
00126 mPhoneList.clear();
00127
00128
00129 mPrefCombo->
insertTypeList( list );
00130
00131
QValueList<int> defaultTypes;
00132 defaultTypes << KABC::PhoneNumber::Home;
00133 defaultTypes << KABC::PhoneNumber::Work;
00134 defaultTypes << KABC::PhoneNumber::Cell;
00135 defaultTypes << ( KABC::PhoneNumber::Work | KABC::PhoneNumber::Fax );
00136 defaultTypes << ( KABC::PhoneNumber::Home | KABC::PhoneNumber::Fax );
00137
00138
00139
00140
00141
QValueList<int>::ConstIterator it;
00142
for( it = defaultTypes.begin(); it != defaultTypes.end(); ++it ) {
00143
if ( !mPrefCombo->
hasType( *it ) )
00144 mPrefCombo->
insertType( list, *it, PhoneNumber(
"", *it ) );
00145 }
00146
00147 updateCombos();
00148
00149 mPrefCombo->
selectType( defaultTypes[ 0 ] );
00150 mSecondCombo->
selectType( defaultTypes[ 1 ] );
00151 mThirdCombo->
selectType( defaultTypes[ 2 ] );
00152 mFourthCombo->
selectType( defaultTypes[ 3 ] );
00153
00154 updateLineEdits();
00155 }
00156
00157
void PhoneEditWidget::updateLineEdits()
00158 {
00159 updatePrefEdit();
00160 updateSecondEdit();
00161 updateThirdEdit();
00162 updateFourthEdit();
00163 }
00164
00165
void PhoneEditWidget::updateCombos()
00166 {
00167 mPrefCombo->
updateTypes();
00168 mSecondCombo->
updateTypes();
00169 mThirdCombo->
updateTypes();
00170 mFourthCombo->
updateTypes();
00171 }
00172
00173 KABC::PhoneNumber::List PhoneEditWidget::phoneNumbers()
00174 {
00175 KABC::PhoneNumber::List retList;
00176
00177 KABC::PhoneNumber::List::Iterator it;
00178
for ( it = mPhoneList.begin(); it != mPhoneList.end(); ++it )
00179
if ( !(*it).number().isEmpty() )
00180 retList.append( *it );
00181
00182
return retList;
00183 }
00184
00185
void PhoneEditWidget::edit()
00186 {
00187
PhoneEditDialog dlg( mPhoneList,
this );
00188
00189
if ( dlg.exec() ) {
00190
if ( dlg.
changed() ) {
00191 mPhoneList = dlg.
phoneNumbers();
00192 updateCombos();
00193 emit modified();
00194 }
00195 }
00196 }
00197
00198
void PhoneEditWidget::updatePrefEdit()
00199 {
00200 updateEdit( mPrefCombo );
00201 }
00202
00203
void PhoneEditWidget::updateSecondEdit()
00204 {
00205 updateEdit( mSecondCombo );
00206 }
00207
00208
void PhoneEditWidget::updateThirdEdit()
00209 {
00210 updateEdit( mThirdCombo );
00211 }
00212
00213
void PhoneEditWidget::updateFourthEdit()
00214 {
00215 updateEdit( mFourthCombo );
00216 }
00217
00218
void PhoneEditWidget::updateEdit( PhoneTypeCombo *combo )
00219 {
00220
QLineEdit *edit = combo->
lineEdit();
00221
if ( !edit )
00222
return;
00223
00224
#if 0
00225
if ( edit == mPrefEdit ) kdDebug(5720) <<
" prefEdit" << endl;
00226
if ( edit == mSecondEdit ) kdDebug(5720) <<
" secondEdit" << endl;
00227
if ( edit == mThirdEdit ) kdDebug(5720) <<
" thirdEdit" << endl;
00228
if ( edit == mFourthEdit ) kdDebug(5720) <<
" fourthEdit" << endl;
00229
#endif
00230
00231 PhoneNumber::List::Iterator it = combo->
selectedElement();
00232
if ( it != mPhoneList.end() ) {
00233
int pos = edit->cursorPosition();
00234 edit->setText( (*it).number() );
00235 edit->setCursorPosition( pos );
00236 }
else {
00237 kdDebug(5720) <<
"PhoneEditWidget::updateEdit(): no selected element" << endl;
00238 }
00239 }
00240
00241
void PhoneEditWidget::slotPrefEditChanged()
00242 {
00243 updatePhoneNumber( mPrefCombo );
00244 }
00245
00246
void PhoneEditWidget::slotSecondEditChanged()
00247 {
00248 updatePhoneNumber( mSecondCombo );
00249 }
00250
00251
void PhoneEditWidget::slotThirdEditChanged()
00252 {
00253 updatePhoneNumber( mThirdCombo );
00254 }
00255
00256
void PhoneEditWidget::slotFourthEditChanged()
00257 {
00258 updatePhoneNumber( mFourthCombo );
00259 }
00260
00261
void PhoneEditWidget::updatePhoneNumber( PhoneTypeCombo *combo )
00262 {
00263
QLineEdit *edit = combo->
lineEdit();
00264
if ( !edit )
return;
00265
00266 PhoneNumber::List::Iterator it = combo->
selectedElement();
00267
if ( it != mPhoneList.end() ) {
00268 (*it).setNumber( edit->text() );
00269 }
else {
00270 kdDebug(5720) <<
"PhoneEditWidget::updatePhoneNumber(): no selected element"
00271 << endl;
00272 }
00273
00274 updateOtherEdit( combo, mPrefCombo );
00275 updateOtherEdit( combo, mSecondCombo );
00276 updateOtherEdit( combo, mThirdCombo );
00277 updateOtherEdit( combo, mFourthCombo );
00278
00279
if ( !mReadOnly )
00280 emit modified();
00281 }
00282
00283
void PhoneEditWidget::updateOtherEdit( PhoneTypeCombo *combo, PhoneTypeCombo *otherCombo )
00284 {
00285
if ( combo == otherCombo )
return;
00286
00287
if ( combo->currentItem() == otherCombo->currentItem() ) {
00288 updateEdit( otherCombo );
00289 }
00290 }
00291
00293
00294
00295
class PhoneViewItem :
public QListViewItem
00296 {
00297
public:
00298 PhoneViewItem(
QListView *parent,
const KABC::PhoneNumber &number );
00299
00300
void setPhoneNumber(
const KABC::PhoneNumber &number )
00301 {
00302 mPhoneNumber = number;
00303 makeText();
00304 }
00305
00306
QString key() {
return mPhoneNumber.id(); }
00307
QString country() {
return ""; }
00308
QString region() {
return ""; }
00309
QString number() {
return ""; }
00310
00311 KABC::PhoneNumber phoneNumber() {
return mPhoneNumber; }
00312
00313
private:
00314
void makeText();
00315
00316 KABC::PhoneNumber mPhoneNumber;
00317 };
00318
00319 PhoneViewItem::PhoneViewItem(
QListView *parent,
const KABC::PhoneNumber &number )
00320 :
QListViewItem( parent ), mPhoneNumber( number )
00321 {
00322 makeText();
00323 }
00324
00325
void PhoneViewItem::makeText()
00326 {
00336 setText( 0, mPhoneNumber.number() );
00337 setText( 1, mPhoneNumber.typeLabel() );
00338 }
00339
00340 PhoneEditDialog::PhoneEditDialog(
const KABC::PhoneNumber::List &list,
QWidget *parent,
const char *name )
00341 : KDialogBase( KDialogBase::Plain, i18n( "Edit Phone Numbers" ),
00342 KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok,
00343 parent, name, true)
00344 {
00345 mPhoneNumberList = list;
00346
00347
QWidget *page = plainPage();
00348
00349 QGridLayout *layout =
new QGridLayout( page, 1, 2 );
00350 layout->setSpacing( spacingHint() );
00351
00352 mListView =
new KListView( page );
00353 mListView->setAllColumnsShowFocus(
true );
00354 mListView->addColumn( i18n(
"Number" ) );
00355 mListView->addColumn( i18n(
"Type" ) );
00356
00357 KButtonBox *buttonBox =
new KButtonBox( page, Vertical );
00358
00359 buttonBox->addButton( i18n(
"&Add..." ),
this, SLOT( slotAddPhoneNumber() ) );
00360 mEditButton = buttonBox->addButton( i18n(
"&Edit..." ),
this, SLOT( slotEditPhoneNumber() ) );
00361 mEditButton->setEnabled(
false );
00362 mRemoveButton = buttonBox->addButton( i18n(
"&Remove" ),
this, SLOT( slotRemovePhoneNumber() ) );
00363 mRemoveButton->setEnabled(
false );
00364 buttonBox->layout();
00365
00366 layout->addWidget( mListView, 0, 0 );
00367 layout->addWidget( buttonBox, 0, 1 );
00368
00369 connect( mListView, SIGNAL(selectionChanged()), SLOT(slotSelectionChanged()) );
00370 connect( mListView, SIGNAL(doubleClicked(
QListViewItem *,
const QPoint &,
int )),
this, SLOT( slotEditPhoneNumber()));
00371
00372 KABC::PhoneNumber::List::Iterator it;
00373
for ( it = mPhoneNumberList.begin(); it != mPhoneNumberList.end(); ++it )
00374
new PhoneViewItem( mListView, *it );
00375
00376 mChanged =
false;
00377 }
00378
00379 PhoneEditDialog::~PhoneEditDialog()
00380 {
00381 }
00382
00383
void PhoneEditDialog::slotAddPhoneNumber()
00384 {
00385 KABC::PhoneNumber tmp(
"", 0 );
00386
PhoneTypeDialog dlg( tmp,
this );
00387
00388
if ( dlg.exec() ) {
00389 KABC::PhoneNumber phoneNumber = dlg.
phoneNumber();
00390 mPhoneNumberList.append( phoneNumber );
00391
new PhoneViewItem( mListView, phoneNumber );
00392
00393 mChanged =
true;
00394 }
00395 }
00396
00397
void PhoneEditDialog::slotRemovePhoneNumber()
00398 {
00399 PhoneViewItem *item = static_cast<PhoneViewItem*>( mListView->currentItem() );
00400
if ( !item )
00401
return;
00402
00403 mPhoneNumberList.remove( item->phoneNumber() );
00404
QListViewItem *currItem = mListView->currentItem();
00405 mListView->takeItem( currItem );
00406
delete currItem;
00407
00408 mChanged =
true;
00409 }
00410
00411
void PhoneEditDialog::slotEditPhoneNumber()
00412 {
00413 PhoneViewItem *item = static_cast<PhoneViewItem*>( mListView->currentItem() );
00414
if ( !item )
00415
return;
00416
00417
PhoneTypeDialog dlg( item->phoneNumber(),
this );
00418
00419
if ( dlg.exec() ) {
00420 slotRemovePhoneNumber();
00421 KABC::PhoneNumber phoneNumber = dlg.
phoneNumber();
00422 mPhoneNumberList.append( phoneNumber );
00423
new PhoneViewItem( mListView, phoneNumber );
00424
00425 mChanged =
true;
00426 }
00427 }
00428
00429
void PhoneEditDialog::slotSelectionChanged()
00430 {
00431
bool state = ( mListView->currentItem() != 0 );
00432
00433 mRemoveButton->setEnabled( state );
00434 mEditButton->setEnabled( state );
00435 }
00436
00437
const KABC::PhoneNumber::List &PhoneEditDialog::phoneNumbers()
00438 {
00439
return mPhoneNumberList;
00440 }
00441
00442
bool PhoneEditDialog::changed()
const
00443
{
00444
return mChanged;
00445 }
00446
00448
00449 PhoneTypeDialog::PhoneTypeDialog(
const KABC::PhoneNumber &phoneNumber,
00450
QWidget *parent,
const char *name)
00451 : KDialogBase( KDialogBase::Plain, i18n( "Edit Phone Number" ),
00452 KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok,
00453 parent, name, true), mPhoneNumber( phoneNumber )
00454 {
00455
QWidget *page = plainPage();
00456
QLabel *label = 0;
00457 QGridLayout *layout =
new QGridLayout( page, 3, 2, marginHint(), spacingHint() );
00458
00459 label =
new QLabel( i18n(
"Number:" ), page );
00460 layout->addWidget( label, 0, 0 );
00461 mNumber =
new KLineEdit( page );
00462 layout->addWidget( mNumber, 0, 1 );
00463
00464 mPreferredBox =
new QCheckBox( i18n(
"This is the preferred phone number" ), page );
00465 layout->addMultiCellWidget( mPreferredBox, 1, 1, 0, 1 );
00466
00467 mGroup =
new QButtonGroup( 2, Horizontal, i18n(
"Types" ), page );
00468 layout->addMultiCellWidget( mGroup, 2, 2, 0, 1 );
00469
00470
00471 mNumber->setText( mPhoneNumber.number() );
00472
00473 mTypeList = KABC::PhoneNumber::typeList();
00474 mTypeList.remove( KABC::PhoneNumber::Pref );
00475
00476 KABC::PhoneNumber::TypeList::Iterator it;
00477
for ( it = mTypeList.begin(); it != mTypeList.end(); ++it )
00478
new QCheckBox( KABC::PhoneNumber::typeLabel( *it ), mGroup );
00479
00480
for (
int i = 0; i < mGroup->count(); ++i ) {
00481
int type = mPhoneNumber.type();
00482 QCheckBox *box = (QCheckBox*)mGroup->find( i );
00483 box->setChecked( type & mTypeList[ i ] );
00484 }
00485
00486 mPreferredBox->setChecked( mPhoneNumber.type() & KABC::PhoneNumber::Pref );
00487 }
00488
00489 KABC::PhoneNumber PhoneTypeDialog::phoneNumber()
00490 {
00491 mPhoneNumber.setNumber( mNumber->text() );
00492
00493
int type = 0;
00494
for (
int i = 0; i < mGroup->count(); ++i ) {
00495 QCheckBox *box = (QCheckBox*)mGroup->find( i );
00496
if ( box->isChecked() )
00497 type += mTypeList[ i ];
00498 }
00499
00500
if ( mPreferredBox->isChecked() )
00501 mPhoneNumber.setType( type | KABC::PhoneNumber::Pref );
00502
else
00503 mPhoneNumber.setType( type & ~KABC::PhoneNumber::Pref );
00504
00505
return mPhoneNumber;
00506 }
00507
00508
00509
#include "phoneeditwidget.moc"