author | tux_mike <tux_mike> | 2002-03-26 17:39:54 (UTC) |
---|---|---|
committer | tux_mike <tux_mike> | 2002-03-26 17:39:54 (UTC) |
commit | e91f77a9ebf359c0fbf4f8d1a0de50bf0dcf81d8 (patch) (side-by-side diff) | |
tree | f3214c3c9dac147f43e127371e3f547f30c97dbf | |
parent | 7c55845eb070ce39eb0673be191130be64e96cfb (diff) | |
download | opie-e91f77a9ebf359c0fbf4f8d1a0de50bf0dcf81d8.zip opie-e91f77a9ebf359c0fbf4f8d1a0de50bf0dcf81d8.tar.gz opie-e91f77a9ebf359c0fbf4f8d1a0de50bf0dcf81d8.tar.bz2 |
Mike Crawford <mike@tuxnami.org>
Changed addressbook input screen to be a little more user friendly,
divided all the options into 3 tabs.
-rw-r--r-- | core/pim/addressbook/abeditor.cpp | 2 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.cpp | 8 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.h | 4 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.pro | 4 |
4 files changed, 9 insertions, 9 deletions
diff --git a/core/pim/addressbook/abeditor.cpp b/core/pim/addressbook/abeditor.cpp index 94baa71..6354db9 100644 --- a/core/pim/addressbook/abeditor.cpp +++ b/core/pim/addressbook/abeditor.cpp @@ -1,568 +1,568 @@ /********************************************************************** ** 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 <qpe/categoryselect.h> #include <qpe/qpeapplication.h> #include <qpe/qpedialog.h> #include <qcombobox.h> #include <qlabel.h> #include <qlayout.h> #include <qlineedit.h> #include <qmultilineedit.h> #include <qscrollview.h> #include <qtoolbutton.h> #include <qpushbutton.h> #include <qmainwindow.h> 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<int> *newOrdered, QStringList *slNewOrdered, - QWidget *parent, const char *name, WFlags fl ) + 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<QLabel> lit( listName ); for ( it = slOrdered->begin(); *lit; ++lit, ++it ) { (*lit)->setText( *it ); } } void AbEditor::setEntry( const Contact &entry ) { ent = entry; QListIterator<QLineEdit> it( listValue ); firstEdit->setText( ent.firstName() ); lastEdit->setText( ent.lastName() ); cmbCat->setCategories( ent.categories(), "Contacts", tr("Contacts") ); // ### Fix... QValueList<int>::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<QLineEdit> 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<QLineEdit> it( listValue ); int i; QValueList<int>::ConstIterator<int> 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<int> 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() ); } diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp index a2b8276..e8fa37c 100644 --- a/core/pim/addressbook/addressbook.cpp +++ b/core/pim/addressbook/addressbook.cpp @@ -1,831 +1,831 @@ /********************************************************************** ** 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. ** **********************************************************************/ #define QTOPIA_INTERNAL_FD -#include "abeditor.h" +#include "contacteditor.h" #include "ablabel.h" #include "abtable.h" #include "addresssettings.h" #include "addressbook.h" #include <qpe/qpeapplication.h> #include <qpe/config.h> #include <qpe/contact.h> #include <qpe/finddialog.h> #include <qpe/global.h> #include <qpe/resource.h> #include <qpe/ir.h> #include <qpe/qpemessagebox.h> #include <qpe/qcopenvelope_qws.h> #include <qaction.h> #include <qdialog.h> #include <qdir.h> #include <qfile.h> #include <qimage.h> #include <qlayout.h> #include <qpe/qpemenubar.h> #include <qmessagebox.h> #include <qpixmap.h> #include <qpopupmenu.h> #include <qpe/qpetoolbar.h> #include <qstringlist.h> #include <qtoolbutton.h> #include <qwhatsthis.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <qdatetime.h> static QString addressbookOldXMLFilename() { QString filename = QPEApplication::documentDir() + "addressbook.xml"; return filename; } static QString addressbookXMLFilename() { QString filename = Global::applicationFileName("addressbook", "addressbook.xml"); return filename; } static QString addressbookPersonalVCardName() { QString filename = Global::applicationFileName("addressbook", "businesscard.vcf"); return filename; } AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, WFlags f ) : QMainWindow( parent, name, f ), abEditor(0), bAbEditFirstTime(TRUE), syncing(FALSE) { initFields(); setCaption( tr("Contacts") ); setIcon( Resource::loadPixmap( "AddressBook" ) ); setToolBarsMovable( FALSE ); // Create Toolbars QPEToolBar *bar = new QPEToolBar( this ); bar->setHorizontalStretchable( TRUE ); QPEMenuBar *mbList = new QPEMenuBar( bar ); mbList->setMargin( 0 ); QPopupMenu *edit = new QPopupMenu( this ); mbList->insertItem( tr( "Contact" ), edit ); listTools = new QPEToolBar( this, "list operations" ); QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), QString::null, 0, this, 0 ); actionNew = a; connect( a, SIGNAL( activated() ), this, SLOT( slotListNew() ) ); a->addTo( edit ); a->addTo( listTools ); a = new QAction( tr( "Edit" ), Resource::loadPixmap( "edit" ), QString::null, 0, this, 0 ); actionEdit = a; connect( a, SIGNAL( activated() ), this, SLOT( slotViewEdit() ) ); a->addTo( edit ); a->addTo( listTools ); a = new QAction( tr( "Delete" ), Resource::loadPixmap( "trash" ), QString::null, 0, this, 0 ); actionTrash = a; connect( a, SIGNAL( activated() ), this, SLOT( slotListDelete() ) ); a->addTo( edit ); a->addTo( listTools ); a = new QAction( tr( "Find" ), Resource::loadPixmap( "mag" ), QString::null, 0, this, 0 ); actionFind = a; connect( a, SIGNAL(activated()), this, SLOT(slotFind()) ); a->addTo( edit ); a->addTo( listTools ); a = new QAction( tr( "Write Mail To" ), Resource::loadPixmap( "qtmail/reply" ), QString::null, 0, this, 0 ); //a->setEnabled( FALSE ); we got support for it now :) zecke actionMail = a; connect( a, SIGNAL( activated() ), this, SLOT( writeMail() ) ); a->addTo( edit ); a->addTo( listTools ); if ( Ir::supported() ) { a = new QAction( tr ("Beam Entry" ), Resource::loadPixmap( "beam" ), QString::null, 0, this, 0 ); actionBeam = a; connect( a, SIGNAL( activated() ), this, SLOT( slotBeam() ) ); a->addTo( edit ); a->addTo( listTools ); } edit->insertSeparator(); a = new QAction( tr("My Personal Details"), QString::null, 0, 0, 0, TRUE ); actionPersonal = a; connect( a, SIGNAL( activated() ), this, SLOT( slotPersonalView() ) ); a->addTo( edit ); a = new QAction( tr( "Arrange Edit Fields"), QString::null, 0, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotSettings() ) ); a->addTo( edit ); // Create Views // This is safe to call without checking to see if it exists... // not to mention it also does the necessary stuff for the // journaling... QString str = addressbookXMLFilename(); if ( str.isNull() ) { QMessageBox::warning( this, tr("Out of Space"), tr("There is not enough space to create\n" "neccessary startup files.\n" "\nFree up some space before\nentering data!") ); } abList = new AbTable( &orderedFields, this, "table" ); abList->setHScrollBarMode( QScrollView::AlwaysOff ); connect( abList, SIGNAL( empty( bool ) ), this, SLOT( listIsEmpty( bool ) ) ); connect( abList, SIGNAL( details() ), this, SLOT( slotListView() ) ); connect( abList, SIGNAL(currentChanged(int,int)), this, SLOT(slotUpdateToolbar()) ); mView = 0; abList->load( addressbookXMLFilename() ); if ( QFile::exists(addressbookOldXMLFilename()) ) { abList->load( addressbookOldXMLFilename() ); QFile::remove(addressbookOldXMLFilename()); } catMenu = new QPopupMenu( this ); catMenu->setCheckable( TRUE ); connect( catMenu, SIGNAL(activated(int)), this, SLOT(slotSetCategory(int)) ); populateCategories(); mbList->insertItem( tr("View"), catMenu ); setCentralWidget( abList ); // qDebug("adressbook contrsuction: t=%d", t.elapsed() ); } void AddressbookWindow::setDocument( const QString &filename ) { if ( filename.find(".vcf") != int(filename.length()) - 4 ) return; QValueList<Contact> cl = Contact::readVCard( filename ); for( QValueList<Contact>::Iterator it = cl.begin(); it != cl.end(); ++it ) { // QString msg = tr("You received a vCard for\n%1.\nDo You want to add it to your\naddressbook?") // .arg( (*it).fullName() ); // if ( QMessageBox::information( this, tr("received contact"), msg, QMessageBox::Ok, QMessageBox::Cancel ) == // QMessageBox::Ok ) { abList->addEntry( *it ); // } } } void AddressbookWindow::resizeEvent( QResizeEvent *e ) { QMainWindow::resizeEvent( e ); if ( centralWidget() == abList ) showList(); else if ( centralWidget() == mView ) showView(); } AddressbookWindow::~AddressbookWindow() { } void AddressbookWindow::slotUpdateToolbar() { Contact ce = abList->currentEntry(); actionMail->setEnabled( !ce.defaultEmail().isEmpty() ); } void AddressbookWindow::showList() { if ( mView ) mView->hide(); setCentralWidget( abList ); abList->show(); // update our focues... (or use a stack widget!); abList->setFocus(); } void AddressbookWindow::showView() { if ( abList->numRows() > 0 ) { abList->hide(); setCentralWidget( abView() ); mView->show(); mView->setFocus(); } } void AddressbookWindow::slotListNew() { Contact cnt; if( !syncing ) { if ( abEditor ) abEditor->setEntry( cnt ); abView()->init( cnt ); editEntry( NewEntry ); } else { QMessageBox::warning(this, tr("Contacts"), tr("Can not edit data, currently syncing")); } } void AddressbookWindow::slotListView() { abView()->init( abList->currentEntry() ); mView->sync(); showView(); } void AddressbookWindow::slotListDelete() { if(!syncing) { Contact tmpEntry = abList->currentEntry(); // get a name, do the best we can... QString strName = tmpEntry.fullName(); if ( strName.isEmpty() ) { strName = tmpEntry.company(); if ( strName.isEmpty() ) strName = "No Name"; } if ( QPEMessageBox::confirmDelete( this, tr( "Contacts" ), strName ) ) { abList->deleteCurrentEntry(); showList(); } } else { QMessageBox::warning( this, tr("Contacts"), tr("Can not edit data, currently syncing") ); } } void AddressbookWindow::slotViewBack() { showList(); } void AddressbookWindow::slotViewEdit() { if(!syncing) { if (actionPersonal->isOn()) { editPersonal(); } else { if ( !bAbEditFirstTime ) abEditor->setEntry( abList->currentEntry() ); editEntry( EditEntry ); } } else { QMessageBox::warning( this, tr("Contacts"), tr("Can not edit data, currently syncing") ); } } void AddressbookWindow::writeMail() { Contact c = abList->currentEntry(); QString name = c.fileAs(); QString email = c.defaultEmail(); QCopEnvelope e("QPE/Application/qtmail", "writeMail(QString,QString)"); e << name << email; } static const char * beamfile = "/tmp/obex/contact.vcf"; void AddressbookWindow::slotBeam() { QString filename; Contact c; if ( actionPersonal->isOn() ) { filename = addressbookPersonalVCardName(); if (!QFile::exists(filename)) return; // can't beam a non-existent file c = Contact::readVCard( filename )[0]; } else { unlink( beamfile ); // delete if exists c = abList->currentEntry(); mkdir("/tmp/obex/", 0755); Contact::writeVCard( beamfile, c ); filename = beamfile; } Ir *ir = new Ir( this ); connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) ); QString description = c.fullName(); ir->send( filename, description, "text/x-vCard" ); } void AddressbookWindow::beamDone( Ir *ir ) { delete ir; unlink( beamfile ); } static void parseName( const QString& name, QString *first, QString *middle, QString * last ) { int comma = name.find ( "," ); QString rest; if ( comma > 0 ) { *last = name.left( comma ); comma++; while ( comma < int(name.length()) && name[comma] == ' ' ) comma++; rest = name.mid( comma ); } else { int space = name.findRev( ' ' ); *last = name.mid( space+1 ); rest = name.left( space ); } int space = rest.find( ' ' ); if ( space <= 0 ) { *first = rest; } else { *first = rest.left( space ); *middle = rest.mid( space+1 ); } } void AddressbookWindow::appMessage(const QCString &msg, const QByteArray &data) { if (msg == "editPersonal()") { editPersonal(); } else if (msg == "editPersonalAndClose()") { editPersonal(); close(); } else if ( msg == "addContact(QString,QString)" ) { QDataStream stream(data,IO_ReadOnly); QString name, email; stream >> name >> email; Contact cnt; QString fn, mn, ln; parseName( name, &fn, &mn, &ln ); // qDebug( " %s - %s - %s", fn.latin1(), mn.latin1(), ln.latin1() ); cnt.setFirstName( fn ); cnt.setMiddleName( mn ); cnt.setLastName( ln ); cnt.setEmails( email ); cnt.setDefaultEmail( email ); cnt.setFileAs(); if ( bAbEditFirstTime ) { - abEditor = new AbEditor( cnt, &orderedFields, &slOrderedFields, + abEditor = new ContactEditor( cnt, &orderedFields, &slOrderedFields, this, "editor" ); bAbEditFirstTime = FALSE; } else { abEditor->setEntry( cnt ); } abView()->init( cnt ); editEntry( NewEntry ); } #if 0 else if (msg == "pickAddresses(QCString,QCString,QStringList,...)" ) { QDataStream stream(data,IO_ReadOnly); QCString ch,m; QStringList types; stream >> ch >> m >> types; AddressPicker picker(abList,this,0,TRUE); picker.showMaximized(); picker.setChoiceNames(types); int i=0; for (QStringList::ConstIterator it = types.begin(); it!=types.end(); ++it) { QStringList sel; stream >> sel; picker.setSelection(i++,sel); } picker.showMaximized(); picker.exec(); // ###### note: contacts may have been added - save here! setCentralWidget(abList); QCopEnvelope e(ch,m); i=0; for (QStringList::ConstIterator it = types.begin(); it!=types.end(); ++it) { QStringList sel = picker.selection(i++); e << sel; } } #endif } void AddressbookWindow::editPersonal() { QString filename = addressbookPersonalVCardName(); Contact me; if (QFile::exists(filename)) me = Contact::readVCard( filename )[0]; if (bAbEditFirstTime) { - abEditor = new AbEditor( me, &orderedFields, &slOrderedFields, + abEditor = new ContactEditor( me, &orderedFields, &slOrderedFields, this, "editor" ); // don't create a new editor every time bAbEditFirstTime = FALSE; } else abEditor->setEntry( me ); abEditor->setCaption(tr("Edit My Personal Details")); abEditor->showMaximized(); // fix the foxus... abEditor->setNameFocus(); if ( abEditor->exec() ) { setFocus(); Contact new_personal = abEditor->entry(); QString fname = addressbookPersonalVCardName(); Contact::writeVCard( fname, new_personal ); abView()->init(new_personal); abView()->sync(); } abEditor->setCaption( tr("Edit Address") ); } void AddressbookWindow::slotPersonalView() { if (!actionPersonal->isOn()) { // we just turned it off setCaption( tr("Contacts") ); actionNew->setEnabled(TRUE); actionTrash->setEnabled(TRUE); actionFind->setEnabled(TRUE); slotUpdateToolbar(); // maybe some of the above could be moved there showList(); return; } // XXX need to disable some QActions. actionNew->setEnabled(FALSE); actionTrash->setEnabled(FALSE); actionFind->setEnabled(FALSE); actionMail->setEnabled(FALSE); setCaption( tr("Contacts - My Personal Details") ); QString filename = addressbookPersonalVCardName(); Contact me; if (QFile::exists(filename)) me = Contact::readVCard( filename )[0]; abView()->init( me ); abView()->sync(); abList->hide(); setCentralWidget( abView() ); mView->show(); mView->setFocus(); } void AddressbookWindow::editEntry( EntryMode entryMode ) { Contact entry; if ( bAbEditFirstTime ) { - abEditor = new AbEditor( entry, &orderedFields, &slOrderedFields, + abEditor = new ContactEditor( entry, &orderedFields, &slOrderedFields, this, "editor" ); bAbEditFirstTime = FALSE; if ( entryMode == EditEntry ) abEditor->setEntry( abList->currentEntry() ); } // other things may chane the caption. abEditor->setCaption( tr("Edit Address") ); #if defined(Q_WS_QWS) || defined(_WS_QWS_) abEditor->showMaximized(); #endif // fix the foxus... abEditor->setNameFocus(); if ( abEditor->exec() ) { setFocus(); if ( entryMode == NewEntry ) { Contact insertEntry = abEditor->entry(); insertEntry.assignUid(); abList->addEntry( insertEntry ); } else { Contact replaceEntry = abEditor->entry(); if ( !replaceEntry.isValidUid() ) replaceEntry.assignUid(); abList->replaceCurrentEntry( replaceEntry ); } } populateCategories(); showList(); } void AddressbookWindow::listIsEmpty( bool empty ) { if ( !empty ) { deleteButton->setEnabled( TRUE ); } } void AddressbookWindow::reload() { syncing = FALSE; abList->clear(); abList->load( addressbookXMLFilename() ); } void AddressbookWindow::flush() { syncing = TRUE; abList->save( addressbookXMLFilename() ); } void AddressbookWindow::closeEvent( QCloseEvent *e ) { if ( centralWidget() == mView ) { if (actionPersonal->isOn()) { // pretend we clicked it off actionPersonal->setOn(FALSE); slotPersonalView(); } else { showList(); } e->ignore(); return; } if(syncing) { /* shouldn't we save, I hear you say? well its already been set so that an edit can not occur during a sync, and we flushed at the start of the sync, so there is no need to save Saving however itself would cause problems. */ e->accept(); return; } //################## shouldn't always save if ( save() ) e->accept(); else e->ignore(); } /* Returns TRUE if it is OK to exit */ bool AddressbookWindow::save() { QString str = addressbookXMLFilename(); if ( str.isNull() ) { if ( QMessageBox::critical( 0, tr("Out of space"), tr("Unable to save information.\n" "Free up some space\n" "and try again.\n" "\nQuit anyway?"), QMessageBox::Yes|QMessageBox::Escape, QMessageBox::No|QMessageBox::Default ) != QMessageBox::No ) return TRUE; else return FALSE; } else { if ( !abList->save( str ) ) { if ( QMessageBox::critical( 0, tr( "Out of space" ), tr("Unable to save information.\n" "Free up some space\n" "and try again.\n" "\nQuit anyway?"), QMessageBox::Yes|QMessageBox::Escape, QMessageBox::No|QMessageBox::Default ) != QMessageBox::No ) return TRUE; else return FALSE; } } return TRUE; } void AddressbookWindow::slotSettings() { AddressSettings frmSettings( this ); #if defined(Q_WS_QWS) || defined(_WS_QWS_) frmSettings.showMaximized(); #endif if ( frmSettings.exec() ) { allFields.clear(); orderedFields.clear(); slOrderedFields.clear(); initFields(); if ( abEditor ) abEditor->loadFields(); abList->refresh(); } } void AddressbookWindow::initFields() { // we really don't need the things from the configuration, anymore // only thing that is important are the important categories. So, // Call the contact functions that correspond to these old functions... QStringList xmlFields = Contact::fields(); QStringList visibleFields = Contact::trfields(); xmlFields.remove( "Title" ); visibleFields.remove( tr("Name Title") ); visibleFields.remove( tr("Notes") ); int i, version; Config cfg( "AddressBook" ); QString zn; // ### Write a function to keep this from happening again... QStringList::ConstIterator it; for ( i = 0, it = xmlFields.begin(); it != xmlFields.end(); ++it, i++ ) { allFields.append( i + 3 ); } cfg.setGroup( "Version" ); version = cfg.readNumEntry( "version" ); i = 0; if ( version >= ADDRESSVERSION ) { cfg.setGroup( "ImportantCategory" ); zn = cfg.readEntry( "Category" + QString::number(i), QString::null ); while ( !zn.isNull() ) { if ( zn.contains( tr("Work") ) || zn.contains( tr("Mb") ) ) { slOrderedFields.clear(); break; } slOrderedFields.append( zn ); zn = cfg.readEntry( "Category" + QString::number(++i), QString::null ); } } else { QString str; str = getenv("HOME"); str += "/Settings/AddressBook.conf"; QFile::remove( str ); } if ( slOrderedFields.count() > 0 ) { for( QStringList::ConstIterator it = slOrderedFields.begin(); it != slOrderedFields.end(); ++it ) { QValueList<int>::ConstIterator itVl; QStringList::ConstIterator itVis; itVl = allFields.begin(); for ( itVis = visibleFields.begin(); itVis != visibleFields.end() && itVl != allFields.end(); ++itVis, ++itVl ) { if ( *it == *itVis && itVl != allFields.end() ) { orderedFields.append( *itVl ); } } } } else { QValueList<int>::ConstIterator it; for ( it = allFields.begin(); it != allFields.end(); ++it ) orderedFields.append( *it ); slOrderedFields = visibleFields; orderedFields.remove( Qtopia::AddressUid ); orderedFields.remove( Qtopia::Title ); orderedFields.remove( Qtopia::Groups ); orderedFields.remove( Qtopia::AddressCategory ); orderedFields.remove( Qtopia::FirstName ); orderedFields.remove( Qtopia::LastName ); orderedFields.remove( Qtopia::DefaultEmail ); orderedFields.remove( Qtopia::FileAs ); orderedFields.remove( Qtopia::Notes ); orderedFields.remove( Qtopia::Gender ); slOrderedFields.remove( tr("Name Title") ); slOrderedFields.remove( tr("First Name") ); slOrderedFields.remove( tr("Last Name") ); slOrderedFields.remove( tr("File As") ); slOrderedFields.remove( tr("Default Email") ); slOrderedFields.remove( tr("Notes") ); slOrderedFields.remove( tr("Gender") ); } } AbLabel *AddressbookWindow::abView() { if ( !mView ) { mView = new AbLabel( this, "viewer" ); mView->init( Contact() ); connect( mView, SIGNAL( okPressed() ), this, SLOT( slotListView() ) ); } return mView; } void AddressbookWindow::slotFind() { if ( centralWidget() == abView() ) showList(); FindDialog frmFind( "Contacts", this ); QObject::connect( &frmFind, SIGNAL(signalFindClicked(const QString &, bool, bool, int)), abList, SLOT(slotDoFind( const QString&,bool,bool,int))); QObject::connect( abList, SIGNAL(signalNotFound()), &frmFind, SLOT(slotNotFound()) ); QObject::connect( abList, SIGNAL(signalWrapAround()), &frmFind, SLOT(slotWrapAround()) ); frmFind.exec(); if ( abList->numSelections() ) abList->clearSelection(); abList->clearFindRow(); } void AddressbookWindow::slotSetCategory( int c ) { if ( c <= 0 ) return; for ( unsigned int i = 1; i < catMenu->count(); i++ ) catMenu->setItemChecked( i, c == (int)i ); if ( c == 1 ) { abList->setShowCategory( QString::null ); setCaption( tr("Contacts") + " - " + tr ( "All" ) ); } else if ( c == (int)catMenu->count() ) { abList->setShowCategory( tr( "Unfiled" ) ); setCaption( tr("Contacts") + " - " + tr( "Unfiled" ) ); } else { QString cat = abList->categories()[c - 2]; abList->setShowCategory( cat ); setCaption( tr("Contacts") + " - " + cat ); } } void AddressbookWindow::populateCategories() { catMenu->clear(); int id, rememberId; id = 1; catMenu->insertItem( tr( "All" ), id++ ); QStringList categories = abList->categories(); categories.append( tr( "Unfiled" ) ); for ( QStringList::Iterator it = categories.begin(); it != categories.end(); ++it ) { catMenu->insertItem( *it, id ); if ( *it == abList->showCategory() ) rememberId = id; ++id; } if ( abList->showCategory().isEmpty() ) slotSetCategory( 1 ); else slotSetCategory( rememberId ); } diff --git a/core/pim/addressbook/addressbook.h b/core/pim/addressbook/addressbook.h index 9694465..342077f 100644 --- a/core/pim/addressbook/addressbook.h +++ b/core/pim/addressbook/addressbook.h @@ -1,99 +1,99 @@ /********************************************************************** ** 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. ** **********************************************************************/ #ifndef Addressbook_H #define Addressbook_H #include <qmainwindow.h> -class AbEditor; +class ContactEditor; class AbLabel; class AbTable; class QPEToolBar; class QPopupMenu; class QToolButton; class QDialog; class Ir; class QAction; class AddressbookWindow: public QMainWindow { Q_OBJECT public: AddressbookWindow( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); ~AddressbookWindow(); protected: void resizeEvent( QResizeEvent * e ); void showList(); void showView(); enum EntryMode { NewEntry=0, EditEntry }; void editPersonal(); void editEntry( EntryMode ); void closeEvent( QCloseEvent *e ); bool save(); public slots: void flush(); void reload(); void appMessage(const QCString &, const QByteArray &); void setDocument( const QString & ); private slots: void slotListNew(); void slotListView(); void slotListDelete(); void slotViewBack(); void slotViewEdit(); void slotPersonalView(); void listIsEmpty( bool ); void slotSettings(); void writeMail(); void slotBeam(); void beamDone( Ir * ); void slotFind(); void slotSetCategory( int ); void slotUpdateToolbar(); private: void initFields(); // inititialize our fields... AbLabel *abView(); void populateCategories(); QPopupMenu *catMenu; QPEToolBar *listTools; QToolButton *deleteButton; QValueList<int> allFields, orderedFields; QStringList slOrderedFields; enum Panes { paneList=0, paneView, paneEdit }; - AbEditor *abEditor; + ContactEditor *abEditor; AbLabel *mView; AbTable *abList; QAction *actionNew, *actionEdit, *actionTrash, *actionFind, *actionBeam, *actionPersonal, *actionMail; bool bAbEditFirstTime; int viewMargin; bool syncing; }; #endif diff --git a/core/pim/addressbook/addressbook.pro b/core/pim/addressbook/addressbook.pro index 31de2a3..180b401 100644 --- a/core/pim/addressbook/addressbook.pro +++ b/core/pim/addressbook/addressbook.pro @@ -1,23 +1,23 @@ TEMPLATE = app CONFIG = qt warn_on release DESTDIR = $(OPIEDIR)/bin HEADERS = addressbook.h \ - abeditor.h \ + contacteditor.h \ ablabel.h \ abtable.h \ addresssettings.h SOURCES = main.cpp \ addressbook.cpp \ - abeditor.cpp \ + contacteditor.cpp \ ablabel.cpp \ abtable.cpp \ addresssettings.cpp INTERFACES = addresssettingsbase.ui TARGET = addressbook INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe TRANSLATIONS = ../i18n/de/addressbook.ts TRANSLATIONS += ../i18n/pt_BR/addressbook.ts |