kaddressbook

addresseditwidget.cpp
1 /*
2  This file is part of KAddressBook.
3  Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4  2003 Tobias Koenig <tokoe@kde.org>
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 
20  As a special exception, permission is given to link this program
21  with any edition of TQt, and distribute the resulting executable,
22  without including the source code for TQt in the source distribution.
23 */
24 
25 #include <tqbuttongroup.h>
26 #include <tqcheckbox.h>
27 #include <tqhbox.h>
28 #include <tqlabel.h>
29 #include <tqlayout.h>
30 #include <tqlistbox.h>
31 #include <tqlistview.h>
32 #include <tqpushbutton.h>
33 #include <tqsignal.h>
34 #include <tqstring.h>
35 #include <tqtextedit.h>
36 #include <tqtoolbutton.h>
37 #include <tqtooltip.h>
38 
39 #include <tdeaccelmanager.h>
40 #include <kactivelabel.h>
41 #include <tdeapplication.h>
42 #include <kbuttonbox.h>
43 #include <kcombobox.h>
44 #include <tdeconfig.h>
45 #include <kdebug.h>
46 #include <kdialog.h>
47 #include <kiconloader.h>
48 #include <kinputdialog.h>
49 #include <klineedit.h>
50 #include <tdelistview.h>
51 #include <tdelocale.h>
52 #include <tdemessagebox.h>
53 #include <kseparator.h>
54 
55 #include "addresseditwidget.h"
56 
57 class TabPressEater : public TQObject
58 {
59  public:
60  TabPressEater( TQObject *parent )
61  : TQObject( parent, "TabPressEater" )
62  {
63  }
64 
65  protected:
66  bool eventFilter( TQObject*, TQEvent *event )
67  {
68  if ( event->type() == TQEvent::KeyPress ) {
69  TQKeyEvent *keyEvent = (TQKeyEvent*)event;
70  if ( keyEvent->key() == TQt::Key_Tab ) {
71  TQApplication::sendEvent( parent(), event );
72  return true;
73  } else
74  return false;
75  } else {
76  return false;
77  }
78  }
79 };
80 
81 
82 AddressEditWidget::AddressEditWidget( TQWidget *parent, const char *name )
83  : TQWidget( parent, name )
84 {
85  TQBoxLayout *layout = new TQVBoxLayout( this, 4, 2 );
86  layout->setSpacing( KDialog::spacingHint() );
87 
88  mTypeCombo = new AddressTypeCombo( mAddressList, this );
89  connect( mTypeCombo, TQ_SIGNAL( activated( int ) ),
90  TQ_SLOT( updateAddressEdit() ) );
91  layout->addWidget( mTypeCombo );
92 
93  mAddressField = new KActiveLabel( this );
94  mAddressField->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
95  mAddressField->setMinimumHeight( 20 );
96  mAddressField->setAlignment( TQt::AlignTop );
97  mAddressField->setTextFormat( TQt::PlainText );
98  layout->addWidget( mAddressField );
99 
100  mEditButton = new TQPushButton( i18n( "street/postal", "&Edit Addresses..." ), this );
101  connect( mEditButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( edit() ) );
102 
103  layout->addWidget( mEditButton );
104 }
105 
106 AddressEditWidget::~AddressEditWidget()
107 {
108 }
109 
110 void AddressEditWidget::setReadOnly( bool readOnly )
111 {
112  mEditButton->setEnabled( !readOnly );
113 }
114 
115 TDEABC::Address::List AddressEditWidget::addresses()
116 {
117  TDEABC::Address::List retList;
118 
119  TDEABC::Address::List::ConstIterator it;
120  for ( it = mAddressList.begin(); it != mAddressList.end(); ++it )
121  if ( !(*it).isEmpty() )
122  retList.append( *it );
123 
124  return retList;
125 }
126 
127 void AddressEditWidget::setAddresses( const TDEABC::Addressee &addr,
128  const TDEABC::Address::List &list )
129 {
130  mAddressee = addr;
131 
132  mAddressList.clear();
133 
134  // Insert types for existing numbers.
135  mTypeCombo->insertTypeList( list );
136 
137  TQValueList<int> defaultTypes;
138  defaultTypes << TDEABC::Address::Home;
139  defaultTypes << TDEABC::Address::Work;
140 
141  AddresseeConfig config( mAddressee );
142  const TQValueList<int> configList = config.noDefaultAddrTypes();
143  TQValueList<int>::ConstIterator it;
144  for ( it = configList.begin(); it != configList.end(); ++it )
145  defaultTypes.remove( *it );
146 
147  // Insert default types.
148  // Doing this for mPrefCombo is enough because the list is shared by all
149  // combos.
150  for ( it = defaultTypes.begin(); it != defaultTypes.end(); ++it ) {
151  if ( !mTypeCombo->hasType( *it ) )
152  mTypeCombo->insertType( list, *it, Address( *it ) );
153  }
154 
155  mTypeCombo->updateTypes();
156 
157  // find preferred address which will be shown
158  int preferred = TDEABC::Address::Home; // default if no preferred address set
159  TDEABC::Address::List::ConstIterator addrIt;
160  for ( addrIt = list.begin(); addrIt != list.end(); ++addrIt )
161  if ( (*addrIt).type() & TDEABC::Address::Pref ) {
162  preferred = (*addrIt).type();
163  break;
164  }
165 
166  mTypeCombo->selectType( preferred );
167 
168  updateAddressEdit();
169 }
170 
171 void AddressEditWidget::updateAddressee( const TDEABC::Addressee &addr )
172 {
173  mAddressee = addr;
174  updateAddressEdit();
175 }
176 
177 void AddressEditWidget::edit()
178 {
179  AddressEditDialog dialog( mAddressList, mTypeCombo->currentItem(), this );
180  if ( dialog.exec() ) {
181  if ( dialog.changed() ) {
182  mAddressList = dialog.addresses();
183 
184  bool hasHome = false, hasWork = false;
185  TDEABC::Address::List::ConstIterator it;
186  for ( it = mAddressList.begin(); it != mAddressList.end(); ++it ) {
187  if ( (*it).type() == TDEABC::Address::Home ) {
188  if ( !(*it).isEmpty() )
189  hasHome = true;
190  }
191  if ( (*it).type() == TDEABC::Address::Work ) {
192  if ( !(*it).isEmpty() )
193  hasWork = true;
194  }
195  }
196 
197  AddresseeConfig config( mAddressee );
198  TQValueList<int> configList;
199  if ( !hasHome )
200  configList << TDEABC::Address::Home;
201  if ( !hasWork )
202  configList << TDEABC::Address::Work;
203  config.setNoDefaultAddrTypes( configList );
204 
205  mTypeCombo->updateTypes();
206  updateAddressEdit();
207  emit modified();
208  }
209  }
210 }
211 
212 void AddressEditWidget::updateAddressEdit()
213 {
214  TDEABC::Address::List::Iterator it = mTypeCombo->selectedElement();
215 
216  bool block = signalsBlocked();
217  blockSignals( true );
218 
219  mAddressField->setText( "" );
220 
221  if ( it != mAddressList.end() ) {
222  TDEABC::Address a = *it;
223  if ( !a.isEmpty() ) {
224 #if TDE_VERSION >= 319
225  if ( a.type() & TDEABC::Address::Work && mAddressee.realName() != mAddressee.organization() ) {
226  mAddressField->setText( a.formattedAddress( mAddressee.realName(),
227  mAddressee.organization() ) );
228  } else {
229  mAddressField->setText( a.formattedAddress( mAddressee.realName() ) );
230  }
231 #else
232  TQString text;
233  if ( !a.street().isEmpty() )
234  text += a.street() + "\n";
235 
236  if ( !a.postOfficeBox().isEmpty() )
237  text += a.postOfficeBox() + "\n";
238 
239  text += a.locality() + TQString(" ") + a.region();
240 
241  if ( !a.postalCode().isEmpty() )
242  text += TQString(", ") + a.postalCode();
243 
244  text += "\n";
245 
246  if ( !a.country().isEmpty() )
247  text += a.country() + "\n";
248 
249  text += a.extended();
250 
251  mAddressField->setText( text );
252 #endif
253  }
254  }
255 
256  blockSignals( block );
257 }
258 
259 AddressEditDialog::AddressEditDialog( const TDEABC::Address::List &list,
260  int selected, TQWidget *parent,
261  const char *name )
262  : KDialogBase( Plain, i18n( "street/postal", "Edit Address" ), Ok | Cancel, Ok,
263  parent, name, true, true ),
264  mPreviousAddress( 0 )
265 {
266  mAddressList = list;
267 
268  TQWidget *page = plainPage();
269 
270  TQGridLayout *topLayout = new TQGridLayout( page, 8, 2 );
271  topLayout->setSpacing( spacingHint() );
272 
273  mTypeCombo = new AddressTypeCombo( mAddressList, page );
274  topLayout->addMultiCellWidget( mTypeCombo, 0, 0, 0, 1 );
275 
276  TQLabel *label = new TQLabel( i18n( "<streetLabel>:", "%1:" ).arg( TDEABC::Address::streetLabel() ), page );
277  label->setAlignment( TQt::AlignTop | TQt::AlignLeft );
278  topLayout->addWidget( label, 1, 0 );
279  mStreetTextEdit = new TQTextEdit( page );
280  mStreetTextEdit->setTextFormat( TQt::PlainText );
281  label->setBuddy( mStreetTextEdit );
282  topLayout->addWidget( mStreetTextEdit, 1, 1 );
283 
284  TabPressEater *eater = new TabPressEater( this );
285  mStreetTextEdit->installEventFilter( eater );
286 
287  label = new TQLabel( i18n( "<postOfficeBoxLabel>:", "%1:" ).arg( TDEABC::Address::postOfficeBoxLabel() ), page );
288  topLayout->addWidget( label, 2 , 0 );
289  mPOBoxEdit = new KLineEdit( page );
290  label->setBuddy( mPOBoxEdit );
291  topLayout->addWidget( mPOBoxEdit, 2, 1 );
292 
293  label = new TQLabel( i18n( "<localityLabel>:", "%1:" ).arg( TDEABC::Address::localityLabel() ), page );
294  topLayout->addWidget( label, 3, 0 );
295  mLocalityEdit = new KLineEdit( page );
296  label->setBuddy( mLocalityEdit );
297  topLayout->addWidget( mLocalityEdit, 3, 1 );
298 
299  label = new TQLabel( i18n( "<regionLabel>:", "%1:" ).arg( TDEABC::Address::regionLabel() ), page );
300  topLayout->addWidget( label, 4, 0 );
301  mRegionEdit = new KLineEdit( page );
302  label->setBuddy( mRegionEdit );
303  topLayout->addWidget( mRegionEdit, 4, 1 );
304 
305  label = new TQLabel( i18n( "<postalCodeLabel>:", "%1:" ).arg( TDEABC::Address::postalCodeLabel() ), page );
306  topLayout->addWidget( label, 5, 0 );
307  mPostalCodeEdit = new KLineEdit( page );
308  label->setBuddy( mPostalCodeEdit );
309  topLayout->addWidget( mPostalCodeEdit, 5, 1 );
310 
311  label = new TQLabel( i18n( "<countryLabel>:", "%1:" ).arg( TDEABC::Address::countryLabel() ), page );
312  topLayout->addWidget( label, 6, 0 );
313  mCountryCombo = new KComboBox( page );
314  mCountryCombo->setEditable( true );
315  mCountryCombo->setDuplicatesEnabled( false );
316 
317 #if KDE_IS_VERSION(3,3,0)
318  TQPushButton *labelButton = new TQPushButton( i18n( "Edit Label..." ), page );
319  topLayout->addMultiCellWidget( labelButton, 7, 7, 0, 1 );
320  connect( labelButton, TQ_SIGNAL( clicked() ), TQ_SLOT( editLabel() ) );
321 #endif
322 
323  fillCountryCombo();
324  label->setBuddy( mCountryCombo );
325  topLayout->addWidget( mCountryCombo, 6, 1 );
326 
327  mPreferredCheckBox = new TQCheckBox( i18n( "street/postal", "This is the preferred address" ), page );
328  topLayout->addMultiCellWidget( mPreferredCheckBox, 8, 8, 0, 1 );
329 
330  KSeparator *sep = new KSeparator( KSeparator::HLine, page );
331  topLayout->addMultiCellWidget( sep, 9, 9, 0, 1 );
332 
333  TQHBox *buttonBox = new TQHBox( page );
334  buttonBox->setSpacing( spacingHint() );
335  topLayout->addMultiCellWidget( buttonBox, 10, 10, 0, 1 );
336 
337  TQPushButton *addButton = new TQPushButton( i18n( "New..." ), buttonBox );
338  connect( addButton, TQ_SIGNAL( clicked() ), TQ_SLOT( addAddress() ) );
339 
340  mRemoveButton = new TQPushButton( i18n( "Remove" ), buttonBox );
341  connect( mRemoveButton, TQ_SIGNAL( clicked() ), TQ_SLOT( removeAddress() ) );
342 
343  mChangeTypeButton = new TQPushButton( i18n( "Change Type..." ), buttonBox );
344  connect( mChangeTypeButton, TQ_SIGNAL( clicked() ), TQ_SLOT( changeType() ) );
345 
346  mTypeCombo->updateTypes();
347  mTypeCombo->setCurrentItem( selected );
348 
349  updateAddressEdits();
350 
351  connect( mTypeCombo, TQ_SIGNAL( activated( int ) ),
352  TQ_SLOT( updateAddressEdits() ) );
353  connect( mStreetTextEdit, TQ_SIGNAL( textChanged() ), TQ_SLOT( modified() ) );
354  connect( mPOBoxEdit, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
355  connect( mLocalityEdit, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
356  connect( mRegionEdit, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
357  connect( mPostalCodeEdit, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
358  connect( mCountryCombo, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
359  connect( mPreferredCheckBox, TQ_SIGNAL( toggled( bool ) ), TQ_SLOT( modified() ) );
360 
361  TDEAcceleratorManager::manage( this );
362 
363  mChanged = false;
364 
365  bool state = (mAddressList.count() > 0);
366  mRemoveButton->setEnabled( state );
367  mChangeTypeButton->setEnabled( state );
368 }
369 
370 AddressEditDialog::~AddressEditDialog()
371 {
372 }
373 
374 TDEABC::Address::List AddressEditDialog::addresses()
375 {
376  saveAddress( *(mTypeCombo->selectedElement()) );
377 
378  return mAddressList;
379 }
380 
381 bool AddressEditDialog::changed() const
382 {
383  return mChanged;
384 }
385 
386 void AddressEditDialog::addAddress()
387 {
388  AddressTypeDialog dlg( mTypeCombo->selectedType(), this );
389  if ( dlg.exec() ) {
390  mAddressList.append( Address( dlg.type() ) );
391 
392  mTypeCombo->updateTypes();
393  mTypeCombo->setCurrentItem( mTypeCombo->count() - 1 );
394  updateAddressEdits();
395 
396  modified();
397 
398  mRemoveButton->setEnabled( true );
399  mChangeTypeButton->setEnabled( true );
400  }
401 }
402 
403 void AddressEditDialog::removeAddress()
404 {
405  if ( mAddressList.count() > 0 ) {
406  TDEABC::Address::List::Iterator it = mTypeCombo->selectedElement();
407  if ( mPreviousAddress && mPreviousAddress->id() == (*it).id() )
408  mPreviousAddress = 0;
409 
410  mAddressList.remove( it );
411  mTypeCombo->updateTypes();
412  updateAddressEdits();
413 
414  modified();
415  }
416 
417  bool state = ( mAddressList.count() > 0 );
418  mRemoveButton->setEnabled( state );
419  mChangeTypeButton->setEnabled( state );
420 }
421 
422 void AddressEditDialog::changeType()
423 {
424  TDEABC::Address::List::Iterator a = mTypeCombo->selectedElement();
425 
426  AddressTypeDialog dlg( (*a).type(), this );
427  if ( dlg.exec() ) {
428  (*a).setType( dlg.type() );
429 
430  mTypeCombo->updateTypes();
431 
432  modified();
433  }
434 }
435 
436 void AddressEditDialog::editLabel()
437 {
438 #if KDE_IS_VERSION(3,3,0)
439  bool ok = false;
440  TQString result = KInputDialog::getMultiLineText( TDEABC::Address::labelLabel(),
441  TDEABC::Address::labelLabel(),
442  mLabel, &ok, this );
443  if ( ok ) {
444  mLabel = result;
445  modified();
446  }
447 #endif
448 }
449 
450 void AddressEditDialog::updateAddressEdits()
451 {
452  if ( mPreviousAddress )
453  saveAddress( *mPreviousAddress );
454 
455  TDEABC::Address::List::Iterator it = mTypeCombo->selectedElement();
456  TDEABC::Address a = *it;
457  mPreviousAddress = &(*it);
458 
459  bool tmp = mChanged;
460 
461  mStreetTextEdit->setText( a.street() );
462  mRegionEdit->setText( a.region() );
463  mLocalityEdit->setText( a.locality() );
464  mPostalCodeEdit->setText( a.postalCode() );
465  mPOBoxEdit->setText( a.postOfficeBox() );
466  mCountryCombo->setCurrentText( a.country() );
467  mLabel = a.label();
468 
469  mPreferredCheckBox->setChecked( a.type() & TDEABC::Address::Pref );
470 
471  if ( a.isEmpty() )
472  mCountryCombo->setCurrentText( TDEGlobal::locale()->twoAlphaToCountryName( TDEGlobal::locale()->country() ) );
473 
474  mStreetTextEdit->setFocus();
475 
476  mChanged = tmp;
477 }
478 
479 void AddressEditDialog::modified()
480 {
481  mChanged = true;
482 }
483 
484 void AddressEditDialog::saveAddress( TDEABC::Address &addr )
485 {
486  addr.setLocality( mLocalityEdit->text() );
487  addr.setRegion( mRegionEdit->text() );
488  addr.setPostalCode( mPostalCodeEdit->text() );
489  addr.setCountry( mCountryCombo->currentText() );
490  addr.setPostOfficeBox( mPOBoxEdit->text() );
491  addr.setStreet( mStreetTextEdit->text() );
492  addr.setLabel( mLabel );
493 
494 
495  if ( mPreferredCheckBox->isChecked() ) {
496  TDEABC::Address::List::Iterator it;
497  for ( it = mAddressList.begin(); it != mAddressList.end(); ++it )
498  (*it).setType( (*it).type() & ~( TDEABC::Address::Pref ) );
499 
500  addr.setType( addr.type() | TDEABC::Address::Pref );
501  } else
502  addr.setType( addr.type() & ~( TDEABC::Address::Pref ) );
503 }
504 
505 void AddressEditDialog::fillCountryCombo()
506 {
507  TQString country[] = {
508  i18n( "Afghanistan" ), i18n( "Albania" ), i18n( "Algeria" ),
509  i18n( "American Samoa" ), i18n( "Andorra" ), i18n( "Angola" ),
510  i18n( "Anguilla" ), i18n( "Antarctica" ), i18n( "Antigua and Barbuda" ),
511  i18n( "Argentina" ), i18n( "Armenia" ), i18n( "Aruba" ),
512  i18n( "Ashmore and Cartier Islands" ), i18n( "Australia" ),
513  i18n( "Austria" ), i18n( "Azerbaijan" ), i18n( "Bahamas" ),
514  i18n( "Bahrain" ), i18n( "Bangladesh" ), i18n( "Barbados" ),
515  i18n( "Belarus" ), i18n( "Belgium" ), i18n( "Belize" ),
516  i18n( "Benin" ), i18n( "Bermuda" ), i18n( "Bhutan" ),
517  i18n( "Bolivia" ), i18n( "Bosnia and Herzegovina" ), i18n( "Botswana" ),
518  i18n( "Brazil" ), i18n( "Brunei" ), i18n( "Bulgaria" ),
519  i18n( "Burkina Faso" ), i18n( "Burundi" ), i18n( "Cambodia" ),
520  i18n( "Cameroon" ), i18n( "Canada" ), i18n( "Cape Verde" ),
521  i18n( "Cayman Islands" ), i18n( "Central African Republic" ),
522  i18n( "Chad" ), i18n( "Chile" ), i18n( "China" ), i18n( "Colombia" ),
523  i18n( "Comoros" ), i18n( "Congo" ), i18n( "Congo, Dem. Rep." ),
524  i18n( "Costa Rica" ), i18n( "Croatia" ),
525  i18n( "Cuba" ), i18n( "Cyprus" ), i18n( "Czech Republic" ),
526  i18n( "Denmark" ), i18n( "Djibouti" ),
527  i18n( "Dominica" ), i18n( "Dominican Republic" ), i18n( "Ecuador" ),
528  i18n( "Egypt" ), i18n( "El Salvador" ), i18n( "Equatorial Guinea" ),
529  i18n( "Eritrea" ), i18n( "Estonia" ), i18n( "England" ),
530  i18n( "Ethiopia" ), i18n( "European Union" ), i18n( "Faroe Islands" ),
531  i18n( "Fiji" ), i18n( "Finland" ), i18n( "France" ),
532  i18n( "French Polynesia" ), i18n( "Gabon" ), i18n( "Gambia" ),
533  i18n( "Georgia" ), i18n( "Germany" ), i18n( "Ghana" ),
534  i18n( "Greece" ), i18n( "Greenland" ), i18n( "Grenada" ),
535  i18n( "Guam" ), i18n( "Guatemala" ), i18n( "Guinea" ),
536  i18n( "Guinea-Bissau" ), i18n( "Guyana" ), i18n( "Haiti" ),
537  i18n( "Honduras" ), i18n( "Hong Kong" ), i18n( "Hungary" ),
538  i18n( "Iceland" ), i18n( "India" ), i18n( "Indonesia" ),
539  i18n( "Iran" ), i18n( "Iraq" ), i18n( "Ireland" ),
540  i18n( "Israel" ), i18n( "Italy" ), i18n( "Ivory Coast" ),
541  i18n( "Jamaica" ), i18n( "Japan" ), i18n( "Jordan" ),
542  i18n( "Kazakhstan" ), i18n( "Kenya" ), i18n( "Kiribati" ),
543  i18n( "Korea, North" ), i18n( "Korea, South" ),
544  i18n( "Kuwait" ), i18n( "Kyrgyzstan" ), i18n( "Laos" ),
545  i18n( "Latvia" ), i18n( "Lebanon" ), i18n( "Lesotho" ),
546  i18n( "Liberia" ), i18n( "Libya" ), i18n( "Liechtenstein" ),
547  i18n( "Lithuania" ), i18n( "Luxembourg" ), i18n( "Macau" ),
548  i18n( "Madagascar" ), i18n( "Malawi" ), i18n( "Malaysia" ),
549  i18n( "Maldives" ), i18n( "Mali" ), i18n( "Malta" ),
550  i18n( "Marshall Islands" ), i18n( "Martinique" ), i18n( "Mauritania" ),
551  i18n( "Mauritius" ), i18n( "Mexico" ),
552  i18n( "Micronesia, Federated States Of" ), i18n( "Moldova" ),
553  i18n( "Monaco" ), i18n( "Mongolia" ), i18n( "Montserrat" ),
554  i18n( "Morocco" ), i18n( "Mozambique" ), i18n( "Myanmar" ),
555  i18n( "Namibia" ),
556  i18n( "Nauru" ), i18n( "Nepal" ), i18n( "Netherlands" ),
557  i18n( "Netherlands Antilles" ), i18n( "New Caledonia" ),
558  i18n( "New Zealand" ), i18n( "Nicaragua" ), i18n( "Niger" ),
559  i18n( "Nigeria" ), i18n( "Niue" ), i18n( "North Korea" ),
560  i18n( "Northern Ireland" ), i18n( "Northern Mariana Islands" ),
561  i18n( "Norway" ), i18n( "Oman" ), i18n( "Pakistan" ), i18n( "Palau" ),
562  i18n( "Palestinian" ), i18n( "Panama" ), i18n( "Papua New Guinea" ),
563  i18n( "Paraguay" ), i18n( "Peru" ), i18n( "Philippines" ),
564  i18n( "Poland" ), i18n( "Portugal" ), i18n( "Puerto Rico" ),
565  i18n( "Qatar" ), i18n( "Romania" ), i18n( "Russia" ), i18n( "Rwanda" ),
566  i18n( "St. Kitts and Nevis" ), i18n( "St. Lucia" ),
567  i18n( "St. Vincent and the Grenadines" ), i18n( "San Marino" ),
568  i18n( "Sao Tome and Principe" ), i18n( "Saudi Arabia" ),
569  i18n( "Senegal" ), i18n( "Serbia & Montenegro" ), i18n( "Seychelles" ),
570  i18n( "Sierra Leone" ), i18n( "Singapore" ), i18n( "Slovakia" ),
571  i18n( "Slovenia" ), i18n( "Solomon Islands" ), i18n( "Somalia" ),
572  i18n( "South Africa" ), i18n( "South Korea" ), i18n( "Spain" ),
573  i18n( "Sri Lanka" ), i18n( "St. Kitts and Nevis" ), i18n( "Sudan" ),
574  i18n( "Suriname" ), i18n( "Swaziland" ), i18n( "Sweden" ),
575  i18n( "Switzerland" ), i18n( "Syria" ), i18n( "Taiwan" ),
576  i18n( "Tajikistan" ), i18n( "Tanzania" ), i18n( "Thailand" ),
577  i18n( "Tibet" ), i18n( "Togo" ), i18n( "Tonga" ),
578  i18n( "Trinidad and Tobago" ), i18n( "Tunisia" ), i18n( "Turkey" ),
579  i18n( "Turkmenistan" ), i18n( "Turks and Caicos Islands" ),
580  i18n( "Tuvalu" ), i18n( "Uganda" ), i18n( "Ukraine" ),
581  i18n( "United Arab Emirates" ), i18n( "United Kingdom" ),
582  i18n( "United States" ), i18n( "Uruguay" ), i18n( "Uzbekistan" ),
583  i18n( "Vanuatu" ), i18n( "Vatican City" ), i18n( "Venezuela" ),
584  i18n( "Vietnam" ), i18n( "Western Samoa" ), i18n( "Yemen" ),
585  i18n( "Yugoslavia" ), i18n( "Zaire" ), i18n( "Zambia" ),
586  i18n( "Zimbabwe" ),
587  ""
588  };
589 
590  TQStringList countries;
591  for ( int i = 0; !country[ i ].isEmpty(); ++i )
592  countries.append( country[ i ] );
593 
594  countries = sortLocaleAware( countries );
595 
596  mCountryCombo->insertStringList( countries );
597  mCountryCombo->completionObject()->setItems( countries );
598  mCountryCombo->setAutoCompletion( true );
599 }
600 
601 
602 AddressTypeDialog::AddressTypeDialog( int type, TQWidget *parent )
603  : KDialogBase( Plain, i18n( "street/postal", "Edit Address Type" ), Ok | Cancel, Ok,
604  parent, "AddressTypeDialog" )
605 {
606  TQWidget *page = plainPage();
607  TQVBoxLayout *layout = new TQVBoxLayout( page );
608 
609  mGroup = new TQButtonGroup( 2, TQt::Horizontal, i18n( "street/postal", "Address Types" ), page );
610  layout->addWidget( mGroup );
611 
612  mTypeList = TDEABC::Address::typeList();
613  mTypeList.remove( TDEABC::Address::Pref );
614 
615  TDEABC::Address::TypeList::ConstIterator it;
616  for ( it = mTypeList.begin(); it != mTypeList.end(); ++it )
617  new TQCheckBox( TDEABC::Address::typeLabel( *it ), mGroup );
618 
619  for ( int i = 0; i < mGroup->count(); ++i ) {
620  TQCheckBox *box = (TQCheckBox*)mGroup->find( i );
621  box->setChecked( type & mTypeList[ i ] );
622  }
623 }
624 
625 AddressTypeDialog::~AddressTypeDialog()
626 {
627 }
628 
629 int AddressTypeDialog::type() const
630 {
631  int type = 0;
632  for ( int i = 0; i < mGroup->count(); ++i ) {
633  TQCheckBox *box = (TQCheckBox*)mGroup->find( i );
634  if ( box->isChecked() )
635  type += mTypeList[ i ];
636  }
637 
638  return type;
639 }
640 
645 class LocaleAwareString : public TQString
646 {
647  public:
648  LocaleAwareString() : TQString()
649  {}
650 
651  LocaleAwareString( const TQString &str ) : TQString( str )
652  {}
653 };
654 
655 static bool operator<( const LocaleAwareString &s1, const LocaleAwareString &s2 )
656 {
657  return ( TQString::localeAwareCompare( s1, s2 ) < 0 );
658 }
659 
660 TQStringList AddressEditDialog::sortLocaleAware( const TQStringList &list )
661 {
662  TQValueList<LocaleAwareString> sortedList;
663 
664  TQStringList::ConstIterator it;
665  for ( it = list.begin(); it != list.end(); ++it )
666  sortedList.append( LocaleAwareString( *it ) );
667 
668  qHeapSort( sortedList );
669 
670  TQStringList retval;
671  TQValueList<LocaleAwareString>::ConstIterator retIt;
672  for ( retIt = sortedList.begin(); retIt != sortedList.end(); ++retIt )
673  retval.append( *retIt );
674 
675  return retval;
676 }
677 
678 #include "addresseditwidget.moc"
Dialog for editing address details.
Dialog for selecting an address type.
Combo box for type information of Addresses and Phone numbers.
Definition: typecombo.h:35