From 15318cad33835e4e2dc620d033e43cd930676cdd Mon Sep 17 00:00:00 2001 From: kergoth Date: Fri, 25 Jan 2002 22:14:26 +0000 Subject: Initial revision --- (limited to 'core/pim/addressbook/abeditor.cpp') diff --git a/core/pim/addressbook/abeditor.cpp b/core/pim/addressbook/abeditor.cpp new file mode 100644 index 0000000..6354db9 --- a/dev/null +++ b/core/pim/addressbook/abeditor.cpp @@ -0,0 +1,619 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Palmtop Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "abeditor.h" +#include "addresspicker.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +static inline bool containsAlphaNum( const QString &str ); +static inline bool constainsWhiteSpace( const QString &str ); + + +// helper functions, convert our comma delimited list to proper +// file format... +void parseEmailFrom( const QString &txt, QString &strDefaultEmail, + QString &strAll ); + +// helper convert from file format to comma delimited... +void parseEmailTo( const QString &strDefaultEmail, + const QString &strOtherEmail, QString &strBack ); + + + +AbEditor::AbEditor( const Contact &entry, const QValueList *newOrdered, + QStringList *slNewOrdered, + QWidget *parent = 0, const char *name = 0, WFlags fl = 0 ) + : QDialog( parent, name, TRUE, fl ), + orderedValues( newOrdered ), + slOrdered( slNewOrdered ) +{ + init(); + initMap(); + setEntry( entry ); +} + +AbEditor::~AbEditor() +{ +} + +void AbEditor::init() +{ + middleEdit = 0; + QVBoxLayout *vb = new QVBoxLayout( this ); + svPage = new QScrollView( this ); + svPage->setHScrollBarMode( QScrollView::AlwaysOff ); + vb->addWidget( svPage ); + svPage->setResizePolicy( QScrollView::AutoOneFit ); + svPage->setFrameStyle( QFrame::NoFrame ); + + QWidget *container = new QWidget( svPage->viewport() ); + svPage->addChild( container ); + + QGridLayout *gl = new QGridLayout( container, 20, 2, 4, 2 ); + + QLabel *l = new QLabel( tr("First Name"), container ); + gl->addWidget( l, 0, 0 ); + firstEdit = new QLineEdit( container ); + gl->addWidget( firstEdit, 0, 1 ); + + l = new QLabel( tr("Last Name"), container ); + gl->addWidget( l, 1, 0 ); + lastEdit = new QLineEdit( container ); + gl->addWidget( lastEdit, 1, 1 ); + + l = new QLabel( tr("Categories"), container ); + gl->addWidget( l, 2, 0 ); + + cmbCat = new CategorySelect( container ); + gl->addWidget( cmbCat, 2, 1 ); + + int i; + bool foundGender, + foundNotes; + foundGender = foundNotes = false; + QStringList::ConstIterator it = slOrdered->begin(); + for ( i = 0; it != slOrdered->end(); i++, ++it ) { + if ( !foundGender && *it == tr("Gender") ) { + foundGender = true; + } else if ( !foundNotes && *it == tr("Notes") ) { + foundNotes = true; + } else { + l = new QLabel( *it, container ); + listName.append( l ); + gl->addWidget( l, i + 3, 0 ); + QLineEdit *e = new QLineEdit( container ); + listValue.append( e ); + gl->addWidget( e, i + 3, 1 ); + if ( *it == tr( "Middle Name" ) ) + middleEdit = e; + } + } + l = new QLabel( tr("Gender"), container ); + gl->addWidget( l, slOrdered->count() + 3, 0 ); + genderCombo = new QComboBox( container ); + genderCombo->insertItem( "", 0 ); + genderCombo->insertItem( tr( "Male" ), 1 ); + genderCombo->insertItem( tr( "Female" ), 2 ); + gl->addWidget( genderCombo, slOrdered->count() + 3, 1 ); + + dlgNote = new QDialog( this, "Note Dialog", TRUE ); + dlgNote->setCaption( tr("Enter Note") ); + QVBoxLayout *vbNote = new QVBoxLayout( dlgNote ); + // lblNote = new QLabel( dlgNote ); + // lblNote->setMinimumSize( lblNote->sizeHint() + QSize( 0, 4 ) ); + // vbNote->addWidget( lblNote ); + txtNote = new QMultiLineEdit( dlgNote ); + vbNote->addWidget( txtNote ); + + QHBoxLayout *hb = new QHBoxLayout( vb ); + hb->addStretch( 2 ); + QPushButton *pb = new QPushButton( tr("Notes..."), this ); + hb->addWidget( pb ); + connect( pb, SIGNAL(clicked()), this, SLOT(slotNote()) ); + + new QPEDialogListener(this); +} + +void AbEditor::initMap() +{ + /* + // since the fields and the XML fields exist, create a map + // between them... + Config cfg1( "AddressBook" ); + Config cfg2( "AddressBook" ); + QString strCfg1, + strCfg2; + int i; + + // This stuff better exist... + cfg1.setGroup( "AddressFields" ); + cfg2.setGroup( "XMLFields" ); + i = 0; + strCfg1 = cfg1.readEntry( "Field" + QString::number(i), QString::null ); + strCfg2 = cfg2.readEntry( "XMLField" + QString::number(i++), + QString::null ); + while ( !strCfg1.isNull() && !strCfg2.isNull() ) { + mapField.insert( strCfg1, strCfg2 ); + strCfg1 = cfg1.readEntry( "Field" + QString::number(i), + QString::null ); + strCfg2 = cfg2.readEntry( "XMLField" + QString::number(i++), + QString::null ); + } + */ +} + +void AbEditor::loadFields() +{ + QStringList::ConstIterator it; + QListIterator lit( listName ); + for ( it = slOrdered->begin(); *lit; ++lit, ++it ) { + (*lit)->setText( *it ); + } +} + +void AbEditor::setEntry( const Contact &entry ) +{ + ent = entry; + QListIterator it( listValue ); + firstEdit->setText( ent.firstName() ); + lastEdit->setText( ent.lastName() ); + cmbCat->setCategories( ent.categories(), "Contacts", tr("Contacts") ); + + // ### Fix... + QValueList::ConstIterator itVl; + for ( itVl = orderedValues->begin(); *it && itVl != orderedValues->end(); + ++itVl, ++it ) { + switch( *itVl ) { + case Qtopia::Title: + (*it)->setText(ent.title()); + break; + case Qtopia::MiddleName: + (*it)->setText( ent.middleName() ); + break; + case Qtopia::Suffix: + (*it)->setText( ent.suffix() ); + break; + + // email + case Qtopia::DefaultEmail: + case Qtopia::Emails: + { + QString strDefEmail = ent.defaultEmail(); + QString strAllEmail = ent.emails(); + QString strFinal; + parseEmailTo( strDefEmail, strAllEmail, strFinal ); + (*it)->setText( strFinal ); + // make sure we see the "default" + (*it)->home( false ); + break; + } + + // home + case Qtopia::HomeStreet: + (*it)->setText(ent.homeStreet() ); + break; + case Qtopia::HomeCity: + (*it)->setText( ent.homeCity() ); + break; + case Qtopia::HomeState: + (*it)->setText( ent.homeState() ); + break; + case Qtopia::HomeZip: + (*it)->setText( ent.homeZip() ); + break; + case Qtopia::HomeCountry: + (*it)->setText( ent.homeCountry() ); + break; + case Qtopia::HomePhone: + (*it)->setText( ent.homePhone() ); + break; + case Qtopia::HomeFax: + (*it)->setText( ent.homeFax() ); + break; + case Qtopia::HomeMobile: + (*it)->setText( ent.homeMobile() ); + break; + case Qtopia::HomeWebPage: + (*it)->setText( ent.homeWebpage() ); + break; + + // business + case Qtopia::Company: + (*it)->setText( ent.company() ); + break; + case Qtopia::BusinessStreet: + (*it)->setText( ent.businessStreet() ); + break; + case Qtopia::BusinessCity: + (*it)->setText( ent.businessCity() ); + break; + case Qtopia::BusinessState: + (*it)->setText( ent.businessState() ); + break; + case Qtopia::BusinessZip: + (*it)->setText( ent.businessZip() ); + break; + case Qtopia::BusinessCountry: + (*it)->setText( ent.businessCountry() ); + break; + case Qtopia::BusinessWebPage: + (*it)->setText( ent.businessWebpage() ); + break; + case Qtopia::JobTitle: + (*it)->setText( ent.jobTitle() ); + break; + case Qtopia::Department: + (*it)->setText( ent.department() ); + break; + case Qtopia::Office: + (*it)->setText( ent.office() ); + break; + case Qtopia::BusinessPhone: + (*it)->setText( ent.businessPhone() ); + break; + case Qtopia::BusinessFax: + (*it)->setText( ent.businessFax() ); + break; + case Qtopia::BusinessMobile: + (*it)->setText( ent.businessMobile() ); + break; + case Qtopia::BusinessPager: + (*it)->setText( ent.businessPager() ); + break; + case Qtopia::Profession: + (*it)->setText( ent.profession() ); + break; + case Qtopia::Assistant: + (*it)->setText( ent.assistant() ); + break; + case Qtopia::Manager: + (*it)->setText( ent.manager() ); + break; + + // personal + case Qtopia::Spouse: + (*it)->setText( ent.spouse() ); + break; + case Qtopia::Children: + (*it)->setText( ent.children() ); + break; + case Qtopia::Birthday: + (*it)->setText( ent.birthday() ); + break; + case Qtopia::Anniversary: + (*it)->setText( ent.anniversary() ); + break; + case Qtopia::Nickname: + (*it)->setText( ent.nickname() ); + break; + + } + } + + QString gender = ent.gender(); + genderCombo->setCurrentItem( gender.toInt() ); + + txtNote->setText( ent.notes() ); +} + +void AbEditor::accept() +{ + if ( isEmpty() ) + reject(); + else { + saveEntry(); + QDialog::accept(); + } +} + +bool AbEditor::isEmpty() +{ + // analyze all the fields and make sure there is _something_ there + // that warrants saving... + QString t = firstEdit->text(); + if ( !t.isEmpty() && containsAlphaNum( t ) ) + return false; + + t = lastEdit->text(); + if ( !t.isEmpty() && containsAlphaNum( t ) ) + return false; + + QListIterator it( listValue ); + for ( ; it.current(); ++it ) { + t = it.current()->text(); + if ( !t.isEmpty() && containsAlphaNum( t ) ) + return false; + } + + t = txtNote->text(); + if ( !t.isEmpty() && containsAlphaNum( t ) ) + return false; + + return true; +} + +void AbEditor::saveEntry() +{ + QString strDefaultEmail, strOtherEmail; + + // determine if there has been a change in names + if ( ent.firstName() != firstEdit->text() || + ent.lastName() != lastEdit->text() + || (middleEdit && ent.middleName() != middleEdit->text()) ) { + // set the names + ent.setFirstName( firstEdit->text() ); + ent.setLastName( lastEdit->text() ); + if ( middleEdit ) + ent.setMiddleName( middleEdit->text() ); + ent.setFileAs(); + } + + ent.setCategories( cmbCat->currentCategories() ); + + QListIterator it( listValue ); + int i; + QValueList::ConstIterator vlIt; + for ( i = 0, vlIt = orderedValues->begin(); + it.current(); ++it, ++vlIt, i++ ) { + switch( *vlIt ) { + case Qtopia::Title: + ent.setTitle( it.current()->text() ); + break; + case Qtopia::MiddleName: + ent.setMiddleName( it.current()->text() ); + break; + case Qtopia::Suffix: + ent.setSuffix( it.current()->text() ); + break; +// case Qtopia::Category: +// { +// // QStringList slCat = QStringList::split( ";", value ); +// // QValueList cat; +// // for ( QStringList::ConstIterator it = slCat.begin(); +// // it != slCat.end(); ++it ) +// // cat.append( (*it).toInt() ); +// // ent.setCategories( cat ); +// } +// break; + + // email + case Qtopia::DefaultEmail: + case Qtopia::Emails: + parseEmailFrom( it.current()->text(), strDefaultEmail, + strOtherEmail ); + ent.setDefaultEmail( strDefaultEmail ); + ent.setEmails( strOtherEmail ); + break; + + // home + case Qtopia::HomeStreet: + ent.setHomeStreet( it.current()->text() ); + break; + case Qtopia::HomeCity: + ent.setHomeCity( it.current()->text() ); + break; + case Qtopia::HomeState: + ent.setHomeState( it.current()->text() ); + break; + case Qtopia::HomeZip: + ent.setHomeZip( it.current()->text() ); + break; + case Qtopia::HomeCountry: + ent.setHomeCountry( it.current()->text() ); + break; + case Qtopia::HomePhone: + ent.setHomePhone( it.current()->text() ); + break; + case Qtopia::HomeFax: + ent.setHomeFax( it.current()->text() ); + break; + case Qtopia::HomeMobile: + ent.setHomeMobile( it.current()->text() ); + break; + case Qtopia::HomeWebPage: + ent.setHomeWebpage( it.current()->text() ); + break; + + // business + case Qtopia::Company: + ent.setCompany( it.current()->text() ); + break; + case Qtopia::BusinessStreet: + ent.setBusinessStreet( it.current()->text() ); + break; + case Qtopia::BusinessCity: + ent.setBusinessCity( it.current()->text() ); + break; + case Qtopia::BusinessState: + ent.setBusinessState( it.current()->text() ); + break; + case Qtopia::BusinessZip: + ent.setBusinessZip( it.current()->text() ); + break; + case Qtopia::BusinessCountry: + ent.setBusinessCountry( it.current()->text() ); + break; + case Qtopia::BusinessWebPage: + ent.setBusinessWebpage( it.current()->text() ); + break; + case Qtopia::JobTitle: + ent.setJobTitle( it.current()->text() ); + break; + case Qtopia::Department: + ent.setDepartment( it.current()->text() ); + break; + case Qtopia::Office: + ent.setOffice( it.current()->text() ); + break; + case Qtopia::BusinessPhone: + ent.setBusinessPhone( it.current()->text() ); + break; + case Qtopia::BusinessFax: + ent.setBusinessFax( it.current()->text() ); + break; + case Qtopia::BusinessMobile: + ent.setBusinessMobile( it.current()->text() ); + break; + case Qtopia::BusinessPager: + ent.setBusinessPager( it.current()->text() ); + break; + case Qtopia::Profession: + ent.setProfession( it.current()->text() ); + break; + case Qtopia::Assistant: + ent.setAssistant( it.current()->text() ); + break; + case Qtopia::Manager: + ent.setManager( it.current()->text() ); + break; + + // personal + case Qtopia::Spouse: + ent.setSpouse( it.current()->text() ); + break; + case Qtopia::Children: + ent.setChildren( it.current()->text() ); + break; + case Qtopia::Birthday: + ent.setBirthday( it.current()->text() ); + break; + case Qtopia::Anniversary: + ent.setAnniversary( it.current()->text() ); + break; + case Qtopia::Nickname: + ent.setNickname( it.current()->text() ); + break; + default: + break; + + } + } + + int gender = genderCombo->currentItem(); + ent.setGender( QString::number( gender ) ); + + QString str = txtNote->text(); + if ( !str.isNull() ) + ent.setNotes( str ); +} + +void AbEditor::slotNote() +{ + dlgNote->showMaximized(); + if ( !dlgNote->exec() ) { + // reset the note... + txtNote->setText( ent.notes() ); + } +} + +void AbEditor::setNameFocus() +{ + firstEdit->setFocus(); +} + +void parseEmailFrom( const QString &txt, QString &strDefaultEmail, + QString &strAll ) +{ + int where, + start; + if ( txt.isEmpty() ) + return; + // find the first + where = txt.find( ',' ); + if ( where < 0 ) { + strDefaultEmail = txt; + strAll = txt; + } else { + strDefaultEmail = txt.left( where ).stripWhiteSpace(); + strAll = strDefaultEmail; + while ( where > -1 ) { + strAll.append(" "); + start = where; + where = txt.find( ',', where + 1 ); + if ( where > - 1 ) + strAll.append( txt.mid(start + 1, where - start - 1).stripWhiteSpace() ); + else // grab until the end... + strAll.append( txt.right(txt.length() - start - 1).stripWhiteSpace() ); + } + } +} + +void parseEmailTo( const QString &strDefaultEmail, + const QString &strOtherEmail, QString &strBack ) +{ + // create a comma dilimeted set of emails... + // use the power of short circuiting... + bool foundDefault = false; + QString strTmp; + int start = 0; + int where; + // start at the beginng. + strBack = strDefaultEmail; + where = 0; + while ( where > -1 ) { + start = where; + where = strOtherEmail.find( ' ', where + 1 ); + if ( where > 0 ) { + strTmp = strOtherEmail.mid( start, where - start ).stripWhiteSpace(); + } else + strTmp = strOtherEmail.right( strOtherEmail.length() - start ).stripWhiteSpace(); + if ( foundDefault || strTmp != strDefaultEmail ) { + strBack.append( ", " ); + strBack.append( strTmp ); + } else + foundDefault = true; + } +} + + +static inline bool containsAlphaNum( const QString &str ) +{ + int i, + count = str.length(); + for ( i = 0; i < count; i++ ) + if ( !str[i].isSpace() ) + return TRUE; + return FALSE; +} + +static inline bool constainsWhiteSpace( const QString &str ) +{ + int i, + count = str.length(); + for (i = 0; i < count; i++ ) + if ( str[i].isSpace() ) + return TRUE; + return FALSE; +} + -- cgit v0.9.0.2