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
57class 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
82AddressEditWidget::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
106AddressEditWidget::~AddressEditWidget()
107{
108}
109
110void AddressEditWidget::setReadOnly( bool readOnly )
111{
112 mEditButton->setEnabled( !readOnly );
113}
114
115TDEABC::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
127void 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
171void AddressEditWidget::updateAddressee( const TDEABC::Addressee &addr )
172{
173 mAddressee = addr;
174 updateAddressEdit();
175}
176
177void 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
212void 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
259AddressEditDialog::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 TQPushButton *labelButton = new TQPushButton( i18n( "Edit Label..." ), page );
318 topLayout->addMultiCellWidget( labelButton, 7, 7, 0, 1 );
319 connect( labelButton, TQ_SIGNAL( clicked() ), TQ_SLOT( editLabel() ) );
320
321 fillCountryCombo();
322 label->setBuddy( mCountryCombo );
323 topLayout->addWidget( mCountryCombo, 6, 1 );
324
325 mPreferredCheckBox = new TQCheckBox( i18n( "street/postal", "This is the preferred address" ), page );
326 topLayout->addMultiCellWidget( mPreferredCheckBox, 8, 8, 0, 1 );
327
328 KSeparator *sep = new KSeparator( KSeparator::HLine, page );
329 topLayout->addMultiCellWidget( sep, 9, 9, 0, 1 );
330
331 TQHBox *buttonBox = new TQHBox( page );
332 buttonBox->setSpacing( spacingHint() );
333 topLayout->addMultiCellWidget( buttonBox, 10, 10, 0, 1 );
334
335 TQPushButton *addButton = new TQPushButton( i18n( "New..." ), buttonBox );
336 connect( addButton, TQ_SIGNAL( clicked() ), TQ_SLOT( addAddress() ) );
337
338 mRemoveButton = new TQPushButton( i18n( "Remove" ), buttonBox );
339 connect( mRemoveButton, TQ_SIGNAL( clicked() ), TQ_SLOT( removeAddress() ) );
340
341 mChangeTypeButton = new TQPushButton( i18n( "Change Type..." ), buttonBox );
342 connect( mChangeTypeButton, TQ_SIGNAL( clicked() ), TQ_SLOT( changeType() ) );
343
344 mTypeCombo->updateTypes();
345 mTypeCombo->setCurrentItem( selected );
346
347 updateAddressEdits();
348
349 connect( mTypeCombo, TQ_SIGNAL( activated( int ) ),
350 TQ_SLOT( updateAddressEdits() ) );
351 connect( mStreetTextEdit, TQ_SIGNAL( textChanged() ), TQ_SLOT( modified() ) );
352 connect( mPOBoxEdit, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
353 connect( mLocalityEdit, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
354 connect( mRegionEdit, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
355 connect( mPostalCodeEdit, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
356 connect( mCountryCombo, TQ_SIGNAL( textChanged( const TQString& ) ), TQ_SLOT( modified() ) );
357 connect( mPreferredCheckBox, TQ_SIGNAL( toggled( bool ) ), TQ_SLOT( modified() ) );
358
359 TDEAcceleratorManager::manage( this );
360
361 mChanged = false;
362
363 bool state = (mAddressList.count() > 0);
364 mRemoveButton->setEnabled( state );
365 mChangeTypeButton->setEnabled( state );
366}
367
368AddressEditDialog::~AddressEditDialog()
369{
370}
371
372TDEABC::Address::List AddressEditDialog::addresses()
373{
374 saveAddress( *(mTypeCombo->selectedElement()) );
375
376 return mAddressList;
377}
378
379bool AddressEditDialog::changed() const
380{
381 return mChanged;
382}
383
384void AddressEditDialog::addAddress()
385{
386 AddressTypeDialog dlg( mTypeCombo->selectedType(), this );
387 if ( dlg.exec() ) {
388 mAddressList.append( Address( dlg.type() ) );
389
390 mTypeCombo->updateTypes();
391 mTypeCombo->setCurrentItem( mTypeCombo->count() - 1 );
392 updateAddressEdits();
393
394 modified();
395
396 mRemoveButton->setEnabled( true );
397 mChangeTypeButton->setEnabled( true );
398 }
399}
400
401void AddressEditDialog::removeAddress()
402{
403 if ( mAddressList.count() > 0 ) {
404 TDEABC::Address::List::Iterator it = mTypeCombo->selectedElement();
405 if ( mPreviousAddress && mPreviousAddress->id() == (*it).id() )
406 mPreviousAddress = 0;
407
408 mAddressList.remove( it );
409 mTypeCombo->updateTypes();
410 updateAddressEdits();
411
412 modified();
413 }
414
415 bool state = ( mAddressList.count() > 0 );
416 mRemoveButton->setEnabled( state );
417 mChangeTypeButton->setEnabled( state );
418}
419
420void AddressEditDialog::changeType()
421{
422 TDEABC::Address::List::Iterator a = mTypeCombo->selectedElement();
423
424 AddressTypeDialog dlg( (*a).type(), this );
425 if ( dlg.exec() ) {
426 (*a).setType( dlg.type() );
427
428 mTypeCombo->updateTypes();
429
430 modified();
431 }
432}
433
434void AddressEditDialog::editLabel()
435{
436 bool ok = false;
437 TQString result = KInputDialog::getMultiLineText( TDEABC::Address::labelLabel(),
438 TDEABC::Address::labelLabel(),
439 mLabel, &ok, this );
440 if ( ok ) {
441 mLabel = result;
442 modified();
443 }
444}
445
446void AddressEditDialog::updateAddressEdits()
447{
448 if ( mPreviousAddress )
449 saveAddress( *mPreviousAddress );
450
451 TDEABC::Address::List::Iterator it = mTypeCombo->selectedElement();
452 TDEABC::Address a = *it;
453 mPreviousAddress = &(*it);
454
455 bool tmp = mChanged;
456
457 mStreetTextEdit->setText( a.street() );
458 mRegionEdit->setText( a.region() );
459 mLocalityEdit->setText( a.locality() );
460 mPostalCodeEdit->setText( a.postalCode() );
461 mPOBoxEdit->setText( a.postOfficeBox() );
462 mCountryCombo->setCurrentText( a.country() );
463 mLabel = a.label();
464
465 mPreferredCheckBox->setChecked( a.type() & TDEABC::Address::Pref );
466
467 if ( a.isEmpty() )
468 mCountryCombo->setCurrentText( TDEGlobal::locale()->twoAlphaToCountryName( TDEGlobal::locale()->country() ) );
469
470 mStreetTextEdit->setFocus();
471
472 mChanged = tmp;
473}
474
475void AddressEditDialog::modified()
476{
477 mChanged = true;
478}
479
480void AddressEditDialog::saveAddress( TDEABC::Address &addr )
481{
482 addr.setLocality( mLocalityEdit->text() );
483 addr.setRegion( mRegionEdit->text() );
484 addr.setPostalCode( mPostalCodeEdit->text() );
485 addr.setCountry( mCountryCombo->currentText() );
486 addr.setPostOfficeBox( mPOBoxEdit->text() );
487 addr.setStreet( mStreetTextEdit->text() );
488 addr.setLabel( mLabel );
489
490
491 if ( mPreferredCheckBox->isChecked() ) {
492 TDEABC::Address::List::Iterator it;
493 for ( it = mAddressList.begin(); it != mAddressList.end(); ++it )
494 (*it).setType( (*it).type() & ~( TDEABC::Address::Pref ) );
495
496 addr.setType( addr.type() | TDEABC::Address::Pref );
497 } else
498 addr.setType( addr.type() & ~( TDEABC::Address::Pref ) );
499}
500
501void AddressEditDialog::fillCountryCombo()
502{
503 TQString country[] = {
504 i18n( "Afghanistan" ), i18n( "Albania" ), i18n( "Algeria" ),
505 i18n( "American Samoa" ), i18n( "Andorra" ), i18n( "Angola" ),
506 i18n( "Anguilla" ), i18n( "Antarctica" ), i18n( "Antigua and Barbuda" ),
507 i18n( "Argentina" ), i18n( "Armenia" ), i18n( "Aruba" ),
508 i18n( "Ashmore and Cartier Islands" ), i18n( "Australia" ),
509 i18n( "Austria" ), i18n( "Azerbaijan" ), i18n( "Bahamas" ),
510 i18n( "Bahrain" ), i18n( "Bangladesh" ), i18n( "Barbados" ),
511 i18n( "Belarus" ), i18n( "Belgium" ), i18n( "Belize" ),
512 i18n( "Benin" ), i18n( "Bermuda" ), i18n( "Bhutan" ),
513 i18n( "Bolivia" ), i18n( "Bosnia and Herzegovina" ), i18n( "Botswana" ),
514 i18n( "Brazil" ), i18n( "Brunei" ), i18n( "Bulgaria" ),
515 i18n( "Burkina Faso" ), i18n( "Burundi" ), i18n( "Cambodia" ),
516 i18n( "Cameroon" ), i18n( "Canada" ), i18n( "Cape Verde" ),
517 i18n( "Cayman Islands" ), i18n( "Central African Republic" ),
518 i18n( "Chad" ), i18n( "Chile" ), i18n( "China" ), i18n( "Colombia" ),
519 i18n( "Comoros" ), i18n( "Congo" ), i18n( "Congo, Dem. Rep." ),
520 i18n( "Costa Rica" ), i18n( "Croatia" ),
521 i18n( "Cuba" ), i18n( "Cyprus" ), i18n( "Czech Republic" ),
522 i18n( "Denmark" ), i18n( "Djibouti" ),
523 i18n( "Dominica" ), i18n( "Dominican Republic" ), i18n( "Ecuador" ),
524 i18n( "Egypt" ), i18n( "El Salvador" ), i18n( "Equatorial Guinea" ),
525 i18n( "Eritrea" ), i18n( "Estonia" ), i18n( "England" ),
526 i18n( "Ethiopia" ), i18n( "European Union" ), i18n( "Faroe Islands" ),
527 i18n( "Fiji" ), i18n( "Finland" ), i18n( "France" ),
528 i18n( "French Polynesia" ), i18n( "Gabon" ), i18n( "Gambia" ),
529 i18n( "Georgia" ), i18n( "Germany" ), i18n( "Ghana" ),
530 i18n( "Greece" ), i18n( "Greenland" ), i18n( "Grenada" ),
531 i18n( "Guam" ), i18n( "Guatemala" ), i18n( "Guinea" ),
532 i18n( "Guinea-Bissau" ), i18n( "Guyana" ), i18n( "Haiti" ),
533 i18n( "Honduras" ), i18n( "Hong Kong" ), i18n( "Hungary" ),
534 i18n( "Iceland" ), i18n( "India" ), i18n( "Indonesia" ),
535 i18n( "Iran" ), i18n( "Iraq" ), i18n( "Ireland" ),
536 i18n( "Israel" ), i18n( "Italy" ), i18n( "Ivory Coast" ),
537 i18n( "Jamaica" ), i18n( "Japan" ), i18n( "Jordan" ),
538 i18n( "Kazakhstan" ), i18n( "Kenya" ), i18n( "Kiribati" ),
539 i18n( "Korea, North" ), i18n( "Korea, South" ),
540 i18n( "Kuwait" ), i18n( "Kyrgyzstan" ), i18n( "Laos" ),
541 i18n( "Latvia" ), i18n( "Lebanon" ), i18n( "Lesotho" ),
542 i18n( "Liberia" ), i18n( "Libya" ), i18n( "Liechtenstein" ),
543 i18n( "Lithuania" ), i18n( "Luxembourg" ), i18n( "Macau" ),
544 i18n( "Madagascar" ), i18n( "Malawi" ), i18n( "Malaysia" ),
545 i18n( "Maldives" ), i18n( "Mali" ), i18n( "Malta" ),
546 i18n( "Marshall Islands" ), i18n( "Martinique" ), i18n( "Mauritania" ),
547 i18n( "Mauritius" ), i18n( "Mexico" ),
548 i18n( "Micronesia, Federated States Of" ), i18n( "Moldova" ),
549 i18n( "Monaco" ), i18n( "Mongolia" ), i18n( "Montserrat" ),
550 i18n( "Morocco" ), i18n( "Mozambique" ), i18n( "Myanmar" ),
551 i18n( "Namibia" ),
552 i18n( "Nauru" ), i18n( "Nepal" ), i18n( "Netherlands" ),
553 i18n( "Netherlands Antilles" ), i18n( "New Caledonia" ),
554 i18n( "New Zealand" ), i18n( "Nicaragua" ), i18n( "Niger" ),
555 i18n( "Nigeria" ), i18n( "Niue" ), i18n( "North Korea" ),
556 i18n( "Northern Ireland" ), i18n( "Northern Mariana Islands" ),
557 i18n( "Norway" ), i18n( "Oman" ), i18n( "Pakistan" ), i18n( "Palau" ),
558 i18n( "Palestinian" ), i18n( "Panama" ), i18n( "Papua New Guinea" ),
559 i18n( "Paraguay" ), i18n( "Peru" ), i18n( "Philippines" ),
560 i18n( "Poland" ), i18n( "Portugal" ), i18n( "Puerto Rico" ),
561 i18n( "Qatar" ), i18n( "Romania" ), i18n( "Russia" ), i18n( "Rwanda" ),
562 i18n( "St. Kitts and Nevis" ), i18n( "St. Lucia" ),
563 i18n( "St. Vincent and the Grenadines" ), i18n( "San Marino" ),
564 i18n( "Sao Tome and Principe" ), i18n( "Saudi Arabia" ),
565 i18n( "Senegal" ), i18n( "Serbia & Montenegro" ), i18n( "Seychelles" ),
566 i18n( "Sierra Leone" ), i18n( "Singapore" ), i18n( "Slovakia" ),
567 i18n( "Slovenia" ), i18n( "Solomon Islands" ), i18n( "Somalia" ),
568 i18n( "South Africa" ), i18n( "South Korea" ), i18n( "Spain" ),
569 i18n( "Sri Lanka" ), i18n( "St. Kitts and Nevis" ), i18n( "Sudan" ),
570 i18n( "Suriname" ), i18n( "Swaziland" ), i18n( "Sweden" ),
571 i18n( "Switzerland" ), i18n( "Syria" ), i18n( "Taiwan" ),
572 i18n( "Tajikistan" ), i18n( "Tanzania" ), i18n( "Thailand" ),
573 i18n( "Tibet" ), i18n( "Togo" ), i18n( "Tonga" ),
574 i18n( "Trinidad and Tobago" ), i18n( "Tunisia" ), i18n( "Turkey" ),
575 i18n( "Turkmenistan" ), i18n( "Turks and Caicos Islands" ),
576 i18n( "Tuvalu" ), i18n( "Uganda" ), i18n( "Ukraine" ),
577 i18n( "United Arab Emirates" ), i18n( "United Kingdom" ),
578 i18n( "United States" ), i18n( "Uruguay" ), i18n( "Uzbekistan" ),
579 i18n( "Vanuatu" ), i18n( "Vatican City" ), i18n( "Venezuela" ),
580 i18n( "Vietnam" ), i18n( "Western Samoa" ), i18n( "Yemen" ),
581 i18n( "Yugoslavia" ), i18n( "Zaire" ), i18n( "Zambia" ),
582 i18n( "Zimbabwe" ),
583 ""
584 };
585
586 TQStringList countries;
587 for ( int i = 0; !country[ i ].isEmpty(); ++i )
588 countries.append( country[ i ] );
589
590 countries = sortLocaleAware( countries );
591
592 mCountryCombo->insertStringList( countries );
593 mCountryCombo->completionObject()->setItems( countries );
594 mCountryCombo->setAutoCompletion( true );
595}
596
597
598AddressTypeDialog::AddressTypeDialog( int type, TQWidget *parent )
599 : KDialogBase( Plain, i18n( "street/postal", "Edit Address Type" ), Ok | Cancel, Ok,
600 parent, "AddressTypeDialog" )
601{
602 TQWidget *page = plainPage();
603 TQVBoxLayout *layout = new TQVBoxLayout( page );
604
605 mGroup = new TQButtonGroup( 2, TQt::Horizontal, i18n( "street/postal", "Address Types" ), page );
606 layout->addWidget( mGroup );
607
608 mTypeList = TDEABC::Address::typeList();
609 mTypeList.remove( TDEABC::Address::Pref );
610
611 TDEABC::Address::TypeList::ConstIterator it;
612 for ( it = mTypeList.begin(); it != mTypeList.end(); ++it )
613 new TQCheckBox( TDEABC::Address::typeLabel( *it ), mGroup );
614
615 for ( int i = 0; i < mGroup->count(); ++i ) {
616 TQCheckBox *box = (TQCheckBox*)mGroup->find( i );
617 box->setChecked( type & mTypeList[ i ] );
618 }
619}
620
621AddressTypeDialog::~AddressTypeDialog()
622{
623}
624
625int AddressTypeDialog::type() const
626{
627 int type = 0;
628 for ( int i = 0; i < mGroup->count(); ++i ) {
629 TQCheckBox *box = (TQCheckBox*)mGroup->find( i );
630 if ( box->isChecked() )
631 type += mTypeList[ i ];
632 }
633
634 return type;
635}
636
641class LocaleAwareString : public TQString
642{
643 public:
644 LocaleAwareString() : TQString()
645 {}
646
647 LocaleAwareString( const TQString &str ) : TQString( str )
648 {}
649};
650
651static bool operator<( const LocaleAwareString &s1, const LocaleAwareString &s2 )
652{
653 return ( TQString::localeAwareCompare( s1, s2 ) < 0 );
654}
655
656TQStringList AddressEditDialog::sortLocaleAware( const TQStringList &list )
657{
658 TQValueList<LocaleAwareString> sortedList;
659
660 TQStringList::ConstIterator it;
661 for ( it = list.begin(); it != list.end(); ++it )
662 sortedList.append( LocaleAwareString( *it ) );
663
664 qHeapSort( sortedList );
665
666 TQStringList retval;
667 TQValueList<LocaleAwareString>::ConstIterator retIt;
668 for ( retIt = sortedList.begin(); retIt != sortedList.end(); ++retIt )
669 retval.append( *retIt );
670
671 return retval;
672}
673
674#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