Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

abeditor.cpp

Go to the documentation of this file.
00001 /**********************************************************************
00002 ** Copyright (C) 2000 Trolltech AS.  All rights reserved.
00003 **
00004 ** This file is part of Qt Palmtop Environment.
00005 **
00006 ** This file may be distributed and/or modified under the terms of the
00007 ** GNU General Public License version 2 as published by the Free Software
00008 ** Foundation and appearing in the file LICENSE.GPL included in the
00009 ** packaging of this file.
00010 **
00011 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00012 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00013 **
00014 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
00015 **
00016 ** Contact info@trolltech.com if any conditions of this licensing are
00017 ** not clear to you.
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 // helper functions, convert our comma delimited list to proper
00044 // file format...
00045 void parseEmailFrom( const QString &txt, QString &strDefaultEmail,
00046                      QString &strAll );
00047 
00048 // helper convert from file format to comma delimited...
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     //    lblNote = new QLabel( dlgNote );
00134     //    lblNote->setMinimumSize( lblNote->sizeHint() + QSize( 0, 4 ) );
00135     //    vbNote->addWidget( lblNote );
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     // since the fields and the XML fields exist, create a map
00152     // between them...
00153     Config cfg1( "AddressBook" );
00154     Config cfg2( "AddressBook" );
00155     QString strCfg1,
00156             strCfg2;
00157     int i;
00158 
00159     // This stuff better exist...
00160     cfg1.setGroup( "AddressFields" );
00161     cfg2.setGroup( "XMLFields" );
00162     i = 0;
00163     strCfg1 = cfg1.readEntry( "Field" + QString::number(i), QString::null );
00164     strCfg2 = cfg2.readEntry( "XMLField" + QString::number(i++),
00165                               QString::null );
00166     while ( !strCfg1.isNull() && !strCfg2.isNull() ) {
00167         mapField.insert( strCfg1, strCfg2 );
00168         strCfg1 = cfg1.readEntry( "Field" + QString::number(i),
00169                                   QString::null );
00170         strCfg2 = cfg2.readEntry( "XMLField" + QString::number(i++),
00171                                   QString::null );
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     // ### Fix...
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             // email
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                 // make sure we see the "default"
00218                 (*it)->home( false );
00219                 break;
00220             }
00221 
00222             // home
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             // business
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             // personal
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     // analyze all the fields and make sure there is _something_ there
00343     // that warrants saving...
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     // determine if there has been a change in names
00371     if ( ent.firstName() != firstEdit->text() ||
00372          ent.lastName() != lastEdit->text()
00373          || (middleEdit && ent.middleName() != middleEdit->text()) ) {
00374         // set the names
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 //      case Qtopia::Category:
00400 //          {
00401 // //           QStringList slCat = QStringList::split( ";", value );
00402 // //           QValueList<int> cat;
00403 // //           for ( QStringList::ConstIterator it = slCat.begin();
00404 // //                 it != slCat.end(); ++it )
00405 // //               cat.append( (*it).toInt() );
00406 // //           ent.setCategories( cat );
00407 //          }
00408 //          break;
00409 
00410             // email
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             // home
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             // business
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             // personal
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         // reset the note...
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     // find the first
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 // grab until the end...
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     // create a comma dilimeted set of emails...
00576     // use the power of short circuiting...
00577     bool foundDefault = false;
00578     QString strTmp;
00579     int start = 0;
00580     int where;
00581     // start at the beginng.
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 

Generated on Sat Nov 5 16:15:45 2005 for OPIE by  doxygen 1.4.2