summaryrefslogtreecommitdiffabout
path: root/kaddressbook/phoneeditwidget.cpp
Unidiff
Diffstat (limited to 'kaddressbook/phoneeditwidget.cpp') (more/less context) (ignore 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 @@
1/*
2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution.
22*/
23
24#include <qlayout.h>
25#include <qlabel.h>
26#include <qtooltip.h>
27#include <qpushbutton.h>
28#include <qcheckbox.h>
29#include <qstring.h>
30#include <qlistbox.h>
31#include <qlistview.h>
32#include <qbuttongroup.h>
33
34#include <kbuttonbox.h>
35#include <klistview.h>
36#include <kapplication.h>
37#include <qapplication.h>
38#include <kconfig.h>
39#include <klineedit.h>
40#include <kcombobox.h>
41#include <klocale.h>
42#include <kdebug.h>
43#include <kglobal.h>
44#include <kiconloader.h>
45
46#include <kabc/phonenumber.h>
47
48#include "typecombo.h"
49
50#include "phoneeditwidget.h"
51
52PhoneEditWidget::PhoneEditWidget( QWidget *parent, const char *name )
53 : QWidget( parent, name )
54{
55 QGridLayout *layout = new QGridLayout( this, 4, 1 );
56//US layout->setSpacing( KDialog::spacingHint() );
57 layout->setSpacing( KDialogBase::spacingHintSmall() );
58
59
60
61 QLabel* label = new QLabel( this );
62//US loadIcon call is ambiguous. Add one more parameter
63//US label->setPixmap( KGlobal::iconLoader()->loadIcon( "kaddressbook", KIcon::Desktop ) );
64 label->setPixmap( KGlobal::iconLoader()->loadIcon( "kaddressbook", KIcon::Desktop, 0 ) );
65 label->setAlignment( AlignCenter );
66//US layout->addMultiCellWidget( label, 0, 1, 3, 3 );
67 layout->addWidget( label, 0, 0 );
68
69 QPushButton *editButton = new QPushButton( i18n( "Edit Phone Numbers..." ),
70 this );
71 if ( QApplication::desktop()->width() < 640 )
72 layout->addWidget( editButton, 0, 1 );
73 else
74 layout->addMultiCellWidget( editButton, 0, 0, 1, 3);
75
76 mPrefCombo = new PhoneTypeCombo( mPhoneList, this );
77 mPrefEdit = new KLineEdit( this );
78 //mPrefEdit->setMinimumWidth( int(mPrefEdit->sizeHint().width() * 1.5) );
79 mPrefCombo->setLineEdit( mPrefEdit );
80 layout->addWidget( mPrefCombo, 1, 0 );
81 layout->addWidget( mPrefEdit, 1, 1 );
82 int x = 1, y = 2;
83 if ( QApplication::desktop()->width() < 640 ) {
84 ++x;
85 y = 0;
86 }
87 mSecondCombo = new PhoneTypeCombo( mPhoneList, this );
88 mSecondEdit = new KLineEdit( this );
89 mSecondCombo->setLineEdit( mSecondEdit );
90 layout->addWidget( mSecondCombo, x, y++ );
91 layout->addWidget( mSecondEdit, x, y++ );
92
93 y = 0;
94 ++x;
95 mThirdCombo = new PhoneTypeCombo( mPhoneList, this );
96 mThirdEdit = new KLineEdit( this );
97 mThirdCombo->setLineEdit( mThirdEdit );
98 layout->addWidget( mThirdCombo, x, y++ );
99 layout->addWidget( mThirdEdit, x, y++ );
100 if ( QApplication::desktop()->width() < 640 ) {
101 ++x;
102 y = 0;
103 }
104 mFourthCombo = new PhoneTypeCombo( mPhoneList, this );
105 mFourthEdit = new KLineEdit( this );
106 mFourthCombo->setLineEdit( mFourthEdit );
107 layout->addWidget( mFourthCombo, x, y++ );
108 layout->addWidget( mFourthEdit, x, y++ );
109
110 // Four numbers don't fit in the current dialog
111 if ( QApplication::desktop()->width() < 640 ) {
112 mFourthCombo->hide();
113 mFourthEdit->hide();
114 } else {
115 QFontMetrics fm ( font () ) ;
116 int wid = fm.width( "Messenger" ) +60;
117 mPrefCombo->setMaximumWidth( wid );
118 mSecondCombo->setMaximumWidth( wid );
119 mThirdCombo->setMaximumWidth( wid );
120 mFourthCombo->setMaximumWidth( wid );
121 }
122
123
124 connect( mPrefEdit, SIGNAL( textChanged( const QString& ) ),
125 SLOT( slotPrefEditChanged() ) );
126 connect( mSecondEdit, SIGNAL( textChanged( const QString& ) ),
127 SLOT( slotSecondEditChanged() ) );
128 connect( mThirdEdit, SIGNAL( textChanged( const QString& ) ),
129 SLOT( slotThirdEditChanged() ) );
130 connect( mFourthEdit, SIGNAL( textChanged( const QString& ) ),
131 SLOT( slotFourthEditChanged() ) );
132
133 connect( editButton, SIGNAL( clicked() ), SLOT( edit() ) );
134
135 connect( mPrefCombo, SIGNAL( activated( int ) ),
136 SLOT( updatePrefEdit() ) );
137 connect( mSecondCombo, SIGNAL( activated( int ) ),
138 SLOT( updateSecondEdit() ) );
139 connect( mThirdCombo, SIGNAL( activated( int ) ),
140 SLOT( updateThirdEdit() ) );
141 connect( mFourthCombo, SIGNAL( activated( int ) ),
142 SLOT( updateFourthEdit() ) );
143}
144
145PhoneEditWidget::~PhoneEditWidget()
146{
147}
148
149void PhoneEditWidget::setPhoneNumbers( const KABC::PhoneNumber::List &list )
150{
151 mPhoneList.clear();
152
153 // Insert types for existing numbers.
154 mPrefCombo->insertTypeList( list );
155
156 QValueList<int> defaultTypes;
157 defaultTypes << KABC::PhoneNumber::Home;
158 defaultTypes << KABC::PhoneNumber::Work;
159 defaultTypes << KABC::PhoneNumber::Cell;
160 defaultTypes << ( KABC::PhoneNumber::Work | KABC::PhoneNumber::Fax );
161 defaultTypes << ( KABC::PhoneNumber::Home | KABC::PhoneNumber::Fax );
162
163 // Insert default types.
164 // Doing this for mPrefCombo is enough because the list is shared by all
165 // combos.
166 QValueList<int>::ConstIterator it;
167 for( it = defaultTypes.begin(); it != defaultTypes.end(); ++it ) {
168 if ( !mPrefCombo->hasType( *it ) )
169 mPrefCombo->insertType( list, *it, PhoneNumber( "", *it ) );
170 }
171
172 updateCombos();
173
174 mPrefCombo->selectType( defaultTypes[ 0 ] );
175 mSecondCombo->selectType( defaultTypes[ 1 ] );
176 mThirdCombo->selectType( defaultTypes[ 2 ] );
177 mFourthCombo->selectType( defaultTypes[ 3 ] );
178
179 updateLineEdits();
180}
181
182void PhoneEditWidget::updateLineEdits()
183{
184 updatePrefEdit();
185 updateSecondEdit();
186 updateThirdEdit();
187 updateFourthEdit();
188}
189
190void PhoneEditWidget::updateCombos()
191{
192 mPrefCombo->updateTypes();
193 mSecondCombo->updateTypes();
194 mThirdCombo->updateTypes();
195 mFourthCombo->updateTypes();
196}
197
198KABC::PhoneNumber::List PhoneEditWidget::phoneNumbers()
199{
200 KABC::PhoneNumber::List retList;
201
202 KABC::PhoneNumber::List::Iterator it;
203 for ( it = mPhoneList.begin(); it != mPhoneList.end(); ++it )
204 if ( !(*it).number().isEmpty() )
205 retList.append( *it );
206
207 return retList;
208}
209
210void PhoneEditWidget::edit()
211{
212 PhoneEditDialog dlg( mPhoneList, this );
213
214 if ( dlg.exec() ) {
215 if ( dlg.changed() ) {
216 mPhoneList = dlg.phoneNumbers();
217 updateCombos();
218 emit modified();
219 }
220 }
221}
222
223void PhoneEditWidget::updatePrefEdit()
224{
225 updateEdit( mPrefCombo );
226}
227
228void PhoneEditWidget::updateSecondEdit()
229{
230 updateEdit( mSecondCombo );
231}
232
233void PhoneEditWidget::updateThirdEdit()
234{
235 updateEdit( mThirdCombo );
236}
237
238void PhoneEditWidget::updateFourthEdit()
239{
240 updateEdit( mFourthCombo );
241}
242
243void PhoneEditWidget::updateEdit( PhoneTypeCombo *combo )
244{
245 QLineEdit *edit = combo->lineEdit();
246 if ( !edit )
247 return;
248
249#if 0
250 if ( edit == mPrefEdit ) kdDebug(5720) << " prefEdit" << endl;
251 if ( edit == mSecondEdit ) kdDebug(5720) << " secondEdit" << endl;
252 if ( edit == mThirdEdit ) kdDebug(5720) << " thirdEdit" << endl;
253 if ( edit == mFourthEdit ) kdDebug(5720) << " fourthEdit" << endl;
254#endif
255
256 PhoneNumber::List::Iterator it = combo->selectedElement();
257 if ( it != mPhoneList.end() ) {
258 edit->setText( (*it).number() );
259 } else {
260 kdDebug(5720) << "PhoneEditWidget::updateEdit(): no selected element" << endl;
261 }
262}
263
264void PhoneEditWidget::slotPrefEditChanged()
265{
266 updatePhoneNumber( mPrefCombo );
267}
268
269void PhoneEditWidget::slotSecondEditChanged()
270{
271 updatePhoneNumber( mSecondCombo );
272}
273
274void PhoneEditWidget::slotThirdEditChanged()
275{
276 updatePhoneNumber( mThirdCombo );
277}
278
279void PhoneEditWidget::slotFourthEditChanged()
280{
281 updatePhoneNumber( mFourthCombo );
282}
283
284void PhoneEditWidget::updatePhoneNumber( PhoneTypeCombo *combo )
285{
286 QLineEdit *edit = combo->lineEdit();
287 if ( !edit ) return;
288
289 PhoneNumber::List::Iterator it = combo->selectedElement();
290 if ( it != mPhoneList.end() ) {
291 (*it).setNumber( edit->text() );
292 } else {
293 kdDebug(5720) << "PhoneEditWidget::updatePhoneNumber(): no selected element"
294 << endl;
295 }
296
297 updateOtherEdit( combo, mPrefCombo );
298 updateOtherEdit( combo, mSecondCombo );
299 updateOtherEdit( combo, mThirdCombo );
300 updateOtherEdit( combo, mFourthCombo );
301
302 emit modified();
303}
304
305void PhoneEditWidget::updateOtherEdit( PhoneTypeCombo *combo, PhoneTypeCombo *otherCombo )
306{
307 if ( combo == otherCombo ) return;
308
309 if ( combo->currentItem() == otherCombo->currentItem() ) {
310 updateEdit( otherCombo );
311 }
312}
313
314///////////////////////////////////////////
315// PhoneEditDialog
316
317class PhoneViewItem : public QListViewItem
318{
319public:
320 PhoneViewItem( QListView *parent, const KABC::PhoneNumber &number );
321
322 void setPhoneNumber( const KABC::PhoneNumber &number )
323 {
324 mPhoneNumber = number;
325 makeText();
326 }
327
328 QString key() { return mPhoneNumber.id(); }
329 QString country() { return ""; }
330 QString region() { return ""; }
331 QString number() { return ""; }
332
333 KABC::PhoneNumber phoneNumber() { return mPhoneNumber; }
334
335private:
336 void makeText();
337
338 KABC::PhoneNumber mPhoneNumber;
339};
340
341PhoneViewItem::PhoneViewItem( QListView *parent, const KABC::PhoneNumber &number )
342 : QListViewItem( parent ), mPhoneNumber( number )
343{
344 makeText();
345}
346
347void PhoneViewItem::makeText()
348{
349 /**
350 * Will be used in future versions of kaddressbook/libkabc
351
352 setText( 0, mPhoneNumber.country() );
353 setText( 1, mPhoneNumber.region() );
354 setText( 2, mPhoneNumber.number() );
355 setText( 3, mPhoneNumber.typeLabel() );
356 */
357
358 setText( 0, mPhoneNumber.number() );
359 setText( 1, mPhoneNumber.typeLabel() );
360}
361
362PhoneEditDialog::PhoneEditDialog( const KABC::PhoneNumber::List &list, QWidget *parent, const char *name )
363 : KDialogBase( KDialogBase::Plain, i18n( "Edit Phone Numbers" ),
364 KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok,
365 parent, name, true)
366{
367 mPhoneNumberList = list;
368
369 QWidget *page = plainPage();
370
371 QGridLayout *layout = new QGridLayout( page, 1, 2 );
372 layout->setSpacing( spacingHint() );
373
374 mListView = new KListView( page );
375 mListView->setAllColumnsShowFocus( true );
376 mListView->addColumn( i18n( "Number" ) );
377 mListView->addColumn( i18n( "Type" ) );
378
379 KButtonBox *buttonBox = new KButtonBox( page, Vertical );
380
381 buttonBox->addButton( i18n( "&Add..." ), this, SLOT( slotAddPhoneNumber() ) );
382 mEditButton = buttonBox->addButton( i18n( "&Edit..." ), this, SLOT( slotEditPhoneNumber() ) );
383 mEditButton->setEnabled( false );
384 mRemoveButton = buttonBox->addButton( i18n( "&Remove" ), this, SLOT( slotRemovePhoneNumber() ) );
385 mRemoveButton->setEnabled( false );
386 buttonBox->layout();
387
388 layout->addWidget( mListView, 0, 0 );
389 layout->addWidget( buttonBox, 0, 1 );
390
391 connect( mListView, SIGNAL(selectionChanged()), SLOT(slotSelectionChanged()) );
392 connect( mListView, SIGNAL(doubleClicked( QListViewItem *, const QPoint &, int )), this, SLOT( slotEditPhoneNumber()));
393
394 KABC::PhoneNumber::List::Iterator it;
395 for ( it = mPhoneNumberList.begin(); it != mPhoneNumberList.end(); ++it )
396 new PhoneViewItem( mListView, *it );
397
398 mChanged = false;
399}
400
401PhoneEditDialog::~PhoneEditDialog()
402{
403}
404
405void PhoneEditDialog::slotAddPhoneNumber()
406{
407 KABC::PhoneNumber tmp( "", 0 );
408 PhoneTypeDialog dlg( tmp, this );
409
410 if ( dlg.exec() ) {
411 KABC::PhoneNumber phoneNumber = dlg.phoneNumber();
412 mPhoneNumberList.append( phoneNumber );
413 new PhoneViewItem( mListView, phoneNumber );
414
415 mChanged = true;
416 }
417}
418
419void PhoneEditDialog::slotRemovePhoneNumber()
420{
421 PhoneViewItem *item = static_cast<PhoneViewItem*>( mListView->currentItem() );
422 if ( !item )
423 return;
424
425 mPhoneNumberList.remove( item->phoneNumber() );
426 QListViewItem *currItem = mListView->currentItem();
427 mListView->takeItem( currItem );
428 delete currItem;
429
430 mChanged = true;
431}
432
433void PhoneEditDialog::slotEditPhoneNumber()
434{
435 PhoneViewItem *item = static_cast<PhoneViewItem*>( mListView->currentItem() );
436 if ( !item )
437 return;
438
439 PhoneTypeDialog dlg( item->phoneNumber(), this );
440
441 if ( dlg.exec() ) {
442 slotRemovePhoneNumber();
443 KABC::PhoneNumber phoneNumber = dlg.phoneNumber();
444 mPhoneNumberList.append( phoneNumber );
445 new PhoneViewItem( mListView, phoneNumber );
446
447 mChanged = true;
448 }
449}
450
451void PhoneEditDialog::slotSelectionChanged()
452{
453 bool state = ( mListView->currentItem() != 0 );
454
455 mRemoveButton->setEnabled( state );
456 mEditButton->setEnabled( state );
457}
458
459const KABC::PhoneNumber::List &PhoneEditDialog::phoneNumbers()
460{
461 return mPhoneNumberList;
462}
463
464bool PhoneEditDialog::changed() const
465{
466 return mChanged;
467}
468
469///////////////////////////////////////////
470// PhoneTypeDialog
471PhoneTypeDialog::PhoneTypeDialog( const KABC::PhoneNumber &phoneNumber,
472 QWidget *parent, const char *name)
473 : KDialogBase( KDialogBase::Plain, i18n( "Edit Phone Number" ),
474 KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok,
475 parent, name, true), mPhoneNumber( phoneNumber )
476{
477 QWidget *page = plainPage();
478 QLabel *label = 0;
479 QGridLayout *layout = new QGridLayout( page, 3, 2, marginHint(), spacingHint() );
480
481 label = new QLabel( i18n( "Number:" ), page );
482 layout->addWidget( label, 0, 0 );
483 mNumber = new KLineEdit( page );
484 layout->addWidget( mNumber, 0, 1 );
485
486 mPreferredBox = new QCheckBox( i18n( "This is the preferred phone number" ), page );
487 layout->addMultiCellWidget( mPreferredBox, 1, 1, 0, 1 );
488
489 mGroup = new QButtonGroup( 2, Horizontal, i18n( "Types" ), page );
490 layout->addMultiCellWidget( mGroup, 2, 2, 0, 1 );
491
492 // fill widgets
493 mNumber->setText( mPhoneNumber.number() );
494
495 mTypeList = KABC::PhoneNumber::typeList();
496 mTypeList.remove( KABC::PhoneNumber::Pref );
497
498 KABC::PhoneNumber::TypeList::Iterator it;
499 for ( it = mTypeList.begin(); it != mTypeList.end(); ++it )
500 new QCheckBox( KABC::PhoneNumber::typeLabel( *it ), mGroup );
501
502 for ( int i = 0; i < mGroup->count(); ++i ) {
503 int type = mPhoneNumber.type();
504 QCheckBox *box = (QCheckBox*)mGroup->find( i );
505 box->setChecked( type & mTypeList[ i ] );
506 }
507
508 mPreferredBox->setChecked( mPhoneNumber.type() & KABC::PhoneNumber::Pref );
509}
510
511KABC::PhoneNumber PhoneTypeDialog::phoneNumber()
512{
513 mPhoneNumber.setNumber( mNumber->text() );
514
515 int type = 0;
516 for ( int i = 0; i < mGroup->count(); ++i ) {
517 QCheckBox *box = (QCheckBox*)mGroup->find( i );
518 if ( box->isChecked() )
519 type += mTypeList[ i ];
520 }
521
522 if ( mPreferredBox->isChecked() )
523 mPhoneNumber.setType( type | KABC::PhoneNumber::Pref );
524 else
525 mPhoneNumber.setType( type & ~KABC::PhoneNumber::Pref );
526
527 return mPhoneNumber;
528}
529
530#ifndef KAB_EMBEDDED
531#include "phoneeditwidget.moc"
532#endif //KAB_EMBEDDED