00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "abeditor.h"
00022 #include "addresspicker.h"
00023
00024 #include <qpe/categoryselect.h>
00025 #include <qpe/qpeapplication.h>
00026 #include <qpe/qpedialog.h>
00027
00028 #include <qcombobox.h>
00029 #include <qlabel.h>
00030 #include <qlayout.h>
00031 #include <qlineedit.h>
00032 #include <qmultilineedit.h>
00033 #include <qscrollview.h>
00034 #include <qtoolbutton.h>
00035 #include <qpushbutton.h>
00036 #include <qmainwindow.h>
00037
00038
00039 static inline bool containsAlphaNum( const QString &str );
00040 static inline bool constainsWhiteSpace( const QString &str );
00041
00042
00043
00044
00045 void parseEmailFrom( const QString &txt, QString &strDefaultEmail,
00046 QString &strAll );
00047
00048
00049 void parseEmailTo( const QString &strDefaultEmail,
00050 const QString &strOtherEmail, QString &strBack );
00051
00052
00053
00054 AbEditor::AbEditor( const OContact &entry, const QValueList<int> *newOrdered,
00055 QStringList *slNewOrdered,
00056 QWidget *parent = 0, const char *name = 0, WFlags fl = 0 )
00057 : QDialog( parent, name, TRUE, fl ),
00058 orderedValues( newOrdered ),
00059 slOrdered( slNewOrdered )
00060 {
00061 init();
00062 initMap();
00063 setEntry( entry );
00064 }
00065
00066 AbEditor::~AbEditor()
00067 {
00068 }
00069
00070 void AbEditor::init()
00071 {
00072 middleEdit = 0;
00073 QVBoxLayout *vb = new QVBoxLayout( this );
00074 svPage = new QScrollView( this );
00075 svPage->setHScrollBarMode( QScrollView::AlwaysOff );
00076 vb->addWidget( svPage );
00077 svPage->setResizePolicy( QScrollView::AutoOneFit );
00078 svPage->setFrameStyle( QFrame::NoFrame );
00079
00080 QWidget *container = new QWidget( svPage->viewport() );
00081 svPage->addChild( container );
00082
00083 QGridLayout *gl = new QGridLayout( container, 20, 2, 4, 2 );
00084
00085 QLabel *l = new QLabel( tr("First Name"), container );
00086 gl->addWidget( l, 0, 0 );
00087 firstEdit = new QLineEdit( container );
00088 gl->addWidget( firstEdit, 0, 1 );
00089
00090 l = new QLabel( tr("Last Name"), container );
00091 gl->addWidget( l, 1, 0 );
00092 lastEdit = new QLineEdit( container );
00093 gl->addWidget( lastEdit, 1, 1 );
00094
00095 l = new QLabel( tr("Categories"), container );
00096 gl->addWidget( l, 2, 0 );
00097
00098 cmbCat = new CategorySelect( container );
00099 gl->addWidget( cmbCat, 2, 1 );
00100
00101 int i;
00102 bool foundGender,
00103 foundNotes;
00104 foundGender = foundNotes = false;
00105 QStringList::ConstIterator it = slOrdered->begin();
00106 for ( i = 0; it != slOrdered->end(); i++, ++it ) {
00107 if ( !foundGender && *it == tr("Gender") ) {
00108 foundGender = true;
00109 } else if ( !foundNotes && *it == tr("Notes") ) {
00110 foundNotes = true;
00111 } else {
00112 l = new QLabel( *it, container );
00113 listName.append( l );
00114 gl->addWidget( l, i + 3, 0 );
00115 QLineEdit *e = new QLineEdit( container );
00116 listValue.append( e );
00117 gl->addWidget( e, i + 3, 1 );
00118 if ( *it == tr( "Middle Name" ) )
00119 middleEdit = e;
00120 }
00121 }
00122 l = new QLabel( tr("Gender"), container );
00123 gl->addWidget( l, slOrdered->count() + 3, 0 );
00124 genderCombo = new QComboBox( container );
00125 genderCombo->insertItem( "", 0 );
00126 genderCombo->insertItem( tr( "Male" ), 1 );
00127 genderCombo->insertItem( tr( "Female" ), 2 );
00128 gl->addWidget( genderCombo, slOrdered->count() + 3, 1 );
00129
00130 dlgNote = new QDialog( this, "Note Dialog", TRUE );
00131 dlgNote->setCaption( tr("Enter Note") );
00132 QVBoxLayout *vbNote = new QVBoxLayout( dlgNote );
00133
00134
00135
00136 txtNote = new QMultiLineEdit( dlgNote );
00137 vbNote->addWidget( txtNote );
00138
00139 QHBoxLayout *hb = new QHBoxLayout( vb );
00140 hb->addStretch( 2 );
00141 QPushButton *pb = new QPushButton( tr("Notes..."), this );
00142 hb->addWidget( pb );
00143 connect( pb, SIGNAL(clicked()), this, SLOT(slotNote()) );
00144
00145 new QPEDialogListener(this);
00146 }
00147
00148 void AbEditor::initMap()
00149 {
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 }
00175
00176 void AbEditor::loadFields()
00177 {
00178 QStringList::ConstIterator it;
00179 QListIterator<QLabel> lit( listName );
00180 for ( it = slOrdered->begin(); *lit; ++lit, ++it ) {
00181 (*lit)->setText( *it );
00182 }
00183 }
00184
00185 void AbEditor::setEntry( const OContact &entry )
00186 {
00187 ent = entry;
00188 QListIterator<QLineEdit> it( listValue );
00189 firstEdit->setText( ent.firstName() );
00190 lastEdit->setText( ent.lastName() );
00191 cmbCat->setCategories( ent.categories(), "Contacts", tr("Contacts") );
00192
00193
00194 QValueList<int>::ConstIterator itVl;
00195 for ( itVl = orderedValues->begin(); *it && itVl != orderedValues->end();
00196 ++itVl, ++it ) {
00197 switch( *itVl ) {
00198 case Qtopia::Title:
00199 (*it)->setText(ent.title());
00200 break;
00201 case Qtopia::MiddleName:
00202 (*it)->setText( ent.middleName() );
00203 break;
00204 case Qtopia::Suffix:
00205 (*it)->setText( ent.suffix() );
00206 break;
00207
00208
00209 case Qtopia::DefaultEmail:
00210 case Qtopia::Emails:
00211 {
00212 QString strDefEmail = ent.defaultEmail();
00213 QString strAllEmail = ent.emails();
00214 QString strFinal;
00215 parseEmailTo( strDefEmail, strAllEmail, strFinal );
00216 (*it)->setText( strFinal );
00217
00218 (*it)->home( false );
00219 break;
00220 }
00221
00222
00223 case Qtopia::HomeStreet:
00224 (*it)->setText(ent.homeStreet() );
00225 break;
00226 case Qtopia::HomeCity:
00227 (*it)->setText( ent.homeCity() );
00228 break;
00229 case Qtopia::HomeState:
00230 (*it)->setText( ent.homeState() );
00231 break;
00232 case Qtopia::HomeZip:
00233 (*it)->setText( ent.homeZip() );
00234 break;
00235 case Qtopia::HomeCountry:
00236 (*it)->setText( ent.homeCountry() );
00237 break;
00238 case Qtopia::HomePhone:
00239 (*it)->setText( ent.homePhone() );
00240 break;
00241 case Qtopia::HomeFax:
00242 (*it)->setText( ent.homeFax() );
00243 break;
00244 case Qtopia::HomeMobile:
00245 (*it)->setText( ent.homeMobile() );
00246 break;
00247 case Qtopia::HomeWebPage:
00248 (*it)->setText( ent.homeWebpage() );
00249 break;
00250
00251
00252 case Qtopia::Company:
00253 (*it)->setText( ent.company() );
00254 break;
00255 case Qtopia::BusinessStreet:
00256 (*it)->setText( ent.businessStreet() );
00257 break;
00258 case Qtopia::BusinessCity:
00259 (*it)->setText( ent.businessCity() );
00260 break;
00261 case Qtopia::BusinessState:
00262 (*it)->setText( ent.businessState() );
00263 break;
00264 case Qtopia::BusinessZip:
00265 (*it)->setText( ent.businessZip() );
00266 break;
00267 case Qtopia::BusinessCountry:
00268 (*it)->setText( ent.businessCountry() );
00269 break;
00270 case Qtopia::BusinessWebPage:
00271 (*it)->setText( ent.businessWebpage() );
00272 break;
00273 case Qtopia::JobTitle:
00274 (*it)->setText( ent.jobTitle() );
00275 break;
00276 case Qtopia::Department:
00277 (*it)->setText( ent.department() );
00278 break;
00279 case Qtopia::Office:
00280 (*it)->setText( ent.office() );
00281 break;
00282 case Qtopia::BusinessPhone:
00283 (*it)->setText( ent.businessPhone() );
00284 break;
00285 case Qtopia::BusinessFax:
00286 (*it)->setText( ent.businessFax() );
00287 break;
00288 case Qtopia::BusinessMobile:
00289 (*it)->setText( ent.businessMobile() );
00290 break;
00291 case Qtopia::BusinessPager:
00292 (*it)->setText( ent.businessPager() );
00293 break;
00294 case Qtopia::Profession:
00295 (*it)->setText( ent.profession() );
00296 break;
00297 case Qtopia::Assistant:
00298 (*it)->setText( ent.assistant() );
00299 break;
00300 case Qtopia::Manager:
00301 (*it)->setText( ent.manager() );
00302 break;
00303
00304
00305 case Qtopia::Spouse:
00306 (*it)->setText( ent.spouse() );
00307 break;
00308 case Qtopia::Children:
00309 (*it)->setText( ent.children() );
00310 break;
00311 case Qtopia::Birthday:
00312 (*it)->setText( ent.birthday() );
00313 break;
00314 case Qtopia::Anniversary:
00315 (*it)->setText( ent.anniversary() );
00316 break;
00317 case Qtopia::Nickname:
00318 (*it)->setText( ent.nickname() );
00319 break;
00320
00321 }
00322 }
00323
00324 QString gender = ent.gender();
00325 genderCombo->setCurrentItem( gender.toInt() );
00326
00327 txtNote->setText( ent.notes() );
00328 }
00329
00330 void AbEditor::accept()
00331 {
00332 if ( isEmpty() )
00333 reject();
00334 else {
00335 saveEntry();
00336 QDialog::accept();
00337 }
00338 }
00339
00340 bool AbEditor::isEmpty()
00341 {
00342
00343
00344 QString t = firstEdit->text();
00345 if ( !t.isEmpty() && containsAlphaNum( t ) )
00346 return false;
00347
00348 t = lastEdit->text();
00349 if ( !t.isEmpty() && containsAlphaNum( t ) )
00350 return false;
00351
00352 QListIterator<QLineEdit> it( listValue );
00353 for ( ; it.current(); ++it ) {
00354 t = it.current()->text();
00355 if ( !t.isEmpty() && containsAlphaNum( t ) )
00356 return false;
00357 }
00358
00359 t = txtNote->text();
00360 if ( !t.isEmpty() && containsAlphaNum( t ) )
00361 return false;
00362
00363 return true;
00364 }
00365
00366 void AbEditor::saveEntry()
00367 {
00368 QString strDefaultEmail, strOtherEmail;
00369
00370
00371 if ( ent.firstName() != firstEdit->text() ||
00372 ent.lastName() != lastEdit->text()
00373 || (middleEdit && ent.middleName() != middleEdit->text()) ) {
00374
00375 ent.setFirstName( firstEdit->text() );
00376 ent.setLastName( lastEdit->text() );
00377 if ( middleEdit )
00378 ent.setMiddleName( middleEdit->text() );
00379 ent.setFileAs();
00380 }
00381
00382 ent.setCategories( cmbCat->currentCategories() );
00383
00384 QListIterator<QLineEdit> it( listValue );
00385 int i;
00386 QValueList<int>::ConstIterator<int> vlIt;
00387 for ( i = 0, vlIt = orderedValues->begin();
00388 it.current(); ++it, ++vlIt, i++ ) {
00389 switch( *vlIt ) {
00390 case Qtopia::Title:
00391 ent.setTitle( it.current()->text() );
00392 break;
00393 case Qtopia::MiddleName:
00394 ent.setMiddleName( it.current()->text() );
00395 break;
00396 case Qtopia::Suffix:
00397 ent.setSuffix( it.current()->text() );
00398 break;
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411 case Qtopia::DefaultEmail:
00412 case Qtopia::Emails:
00413 parseEmailFrom( it.current()->text(), strDefaultEmail,
00414 strOtherEmail );
00415 ent.setDefaultEmail( strDefaultEmail );
00416 ent.setEmails( strOtherEmail );
00417 break;
00418
00419
00420 case Qtopia::HomeStreet:
00421 ent.setHomeStreet( it.current()->text() );
00422 break;
00423 case Qtopia::HomeCity:
00424 ent.setHomeCity( it.current()->text() );
00425 break;
00426 case Qtopia::HomeState:
00427 ent.setHomeState( it.current()->text() );
00428 break;
00429 case Qtopia::HomeZip:
00430 ent.setHomeZip( it.current()->text() );
00431 break;
00432 case Qtopia::HomeCountry:
00433 ent.setHomeCountry( it.current()->text() );
00434 break;
00435 case Qtopia::HomePhone:
00436 ent.setHomePhone( it.current()->text() );
00437 break;
00438 case Qtopia::HomeFax:
00439 ent.setHomeFax( it.current()->text() );
00440 break;
00441 case Qtopia::HomeMobile:
00442 ent.setHomeMobile( it.current()->text() );
00443 break;
00444 case Qtopia::HomeWebPage:
00445 ent.setHomeWebpage( it.current()->text() );
00446 break;
00447
00448
00449 case Qtopia::Company:
00450 ent.setCompany( it.current()->text() );
00451 break;
00452 case Qtopia::BusinessStreet:
00453 ent.setBusinessStreet( it.current()->text() );
00454 break;
00455 case Qtopia::BusinessCity:
00456 ent.setBusinessCity( it.current()->text() );
00457 break;
00458 case Qtopia::BusinessState:
00459 ent.setBusinessState( it.current()->text() );
00460 break;
00461 case Qtopia::BusinessZip:
00462 ent.setBusinessZip( it.current()->text() );
00463 break;
00464 case Qtopia::BusinessCountry:
00465 ent.setBusinessCountry( it.current()->text() );
00466 break;
00467 case Qtopia::BusinessWebPage:
00468 ent.setBusinessWebpage( it.current()->text() );
00469 break;
00470 case Qtopia::JobTitle:
00471 ent.setJobTitle( it.current()->text() );
00472 break;
00473 case Qtopia::Department:
00474 ent.setDepartment( it.current()->text() );
00475 break;
00476 case Qtopia::Office:
00477 ent.setOffice( it.current()->text() );
00478 break;
00479 case Qtopia::BusinessPhone:
00480 ent.setBusinessPhone( it.current()->text() );
00481 break;
00482 case Qtopia::BusinessFax:
00483 ent.setBusinessFax( it.current()->text() );
00484 break;
00485 case Qtopia::BusinessMobile:
00486 ent.setBusinessMobile( it.current()->text() );
00487 break;
00488 case Qtopia::BusinessPager:
00489 ent.setBusinessPager( it.current()->text() );
00490 break;
00491 case Qtopia::Profession:
00492 ent.setProfession( it.current()->text() );
00493 break;
00494 case Qtopia::Assistant:
00495 ent.setAssistant( it.current()->text() );
00496 break;
00497 case Qtopia::Manager:
00498 ent.setManager( it.current()->text() );
00499 break;
00500
00501
00502 case Qtopia::Spouse:
00503 ent.setSpouse( it.current()->text() );
00504 break;
00505 case Qtopia::Children:
00506 ent.setChildren( it.current()->text() );
00507 break;
00508 case Qtopia::Birthday:
00509 ent.setBirthday( it.current()->text() );
00510 break;
00511 case Qtopia::Anniversary:
00512 ent.setAnniversary( it.current()->text() );
00513 break;
00514 case Qtopia::Nickname:
00515 ent.setNickname( it.current()->text() );
00516 break;
00517 default:
00518 break;
00519
00520 }
00521 }
00522
00523 int gender = genderCombo->currentItem();
00524 ent.setGender( QString::number( gender ) );
00525
00526 QString str = txtNote->text();
00527 if ( !str.isNull() )
00528 ent.setNotes( str );
00529 }
00530
00531 void AbEditor::slotNote()
00532 {
00533 if ( ! QPEApplication::execDialog( &dlgNote ) ) {
00534
00535 txtNote->setText( ent.notes() );
00536 }
00537 }
00538
00539 void AbEditor::setNameFocus()
00540 {
00541 firstEdit->setFocus();
00542 }
00543
00544 void parseEmailFrom( const QString &txt, QString &strDefaultEmail,
00545 QString &strAll )
00546 {
00547 int where,
00548 start;
00549 if ( txt.isEmpty() )
00550 return;
00551
00552
00553 where = txt.find( ',' );
00554 if ( where < 0 ) {
00555 strDefaultEmail = txt;
00556 strAll = txt;
00557 } else {
00558 strDefaultEmail = txt.left( where ).stripWhiteSpace();
00559 strAll = strDefaultEmail;
00560 while ( where > -1 ) {
00561 strAll.append(" ");
00562 start = where;
00563 where = txt.find( ',', where + 1 );
00564 if ( where > - 1 )
00565 strAll.append( txt.mid(start + 1, where - start - 1).stripWhiteSpace() );
00566 else
00567 strAll.append( txt.right(txt.length() - start - 1).stripWhiteSpace() );
00568 }
00569 }
00570 }
00571
00572 void parseEmailTo( const QString &strDefaultEmail,
00573 const QString &strOtherEmail, QString &strBack )
00574 {
00575
00576
00577 bool foundDefault = false;
00578 QString strTmp;
00579 int start = 0;
00580 int where;
00581
00582 strBack = strDefaultEmail;
00583 where = 0;
00584 while ( where > -1 ) {
00585 start = where;
00586 where = strOtherEmail.find( ' ', where + 1 );
00587 if ( where > 0 ) {
00588 strTmp = strOtherEmail.mid( start, where - start ).stripWhiteSpace();
00589 } else
00590 strTmp = strOtherEmail.right( strOtherEmail.length() - start ).stripWhiteSpace();
00591 if ( foundDefault || strTmp != strDefaultEmail ) {
00592 strBack.append( ", " );
00593 strBack.append( strTmp );
00594 } else
00595 foundDefault = true;
00596 }
00597 }
00598
00599
00600 static inline bool containsAlphaNum( const QString &str )
00601 {
00602 int i,
00603 count = str.length();
00604 for ( i = 0; i < count; i++ )
00605 if ( !str[i].isSpace() )
00606 return TRUE;
00607 return FALSE;
00608 }
00609
00610 static inline bool constainsWhiteSpace( const QString &str )
00611 {
00612 int i,
00613 count = str.length();
00614 for (i = 0; i < count; i++ )
00615 if ( str[i].isSpace() )
00616 return TRUE;
00617 return FALSE;
00618 }
00619