-rw-r--r-- | core/pim/addressbook/addressbook.cpp | 2 | ||||
-rw-r--r-- | core/pim/addressbook/contacteditor.cpp | 12 | ||||
-rw-r--r-- | core/pim/todo/todotable.h | 11 |
3 files changed, 14 insertions, 11 deletions
diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp index e11cf4c..3255269 100644 --- a/core/pim/addressbook/addressbook.cpp +++ b/core/pim/addressbook/addressbook.cpp @@ -340,385 +340,385 @@ void AddressbookWindow::resizeEvent( QResizeEvent *e ) AddressbookWindow::~AddressbookWindow() { Config cfg("AddressBook"); cfg.setGroup("Font"); cfg.writeEntry("fontSize", startFontSize); } void AddressbookWindow::slotUpdateToolbar() { Contact ce = abList->currentEntry(); actionMail->setEnabled( !ce.defaultEmail().isEmpty() ); } void AddressbookWindow::showList() { if ( mView ) mView->hide(); setCentralWidget( listContainer ); listContainer->show(); // update our focues... (or use a stack widget!); abList->setFocus(); } void AddressbookWindow::showView() { if ( abList->numRows() > 0 ) { listContainer->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.insertEmails( email ); cnt.setDefaultEmail( email ); cnt.setFileAs(); if ( bAbEditFirstTime ) { 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 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); #ifndef MAKE_FOR_SHARP_ROM actionFind->setEnabled(TRUE); #endif slotUpdateToolbar(); // maybe some of the above could be moved there showList(); return; } // XXX need to disable some QActions. actionNew->setEnabled(FALSE); actionTrash->setEnabled(FALSE); #ifndef MAKE_FOR_SHARP_ROM actionFind->setEnabled(FALSE); #endif 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(); listContainer->hide(); setCentralWidget( abView() ); mView->show(); mView->setFocus(); } void AddressbookWindow::editEntry( EntryMode entryMode ) { Contact entry; if ( bAbEditFirstTime ) { 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; diff --git a/core/pim/addressbook/contacteditor.cpp b/core/pim/addressbook/contacteditor.cpp index 39bd63c..ae86ed0 100644 --- a/core/pim/addressbook/contacteditor.cpp +++ b/core/pim/addressbook/contacteditor.cpp @@ -1,465 +1,465 @@ /* * Copyright (c) 2002 Michael R. Crawford <mike@tuxnami.org> * * This file is an add-on for the OPIE 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 pacakaging * 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. * * * This is a rewrite of the abeditor.h file, modified to provide a more * intuitive interface to TrollTech's original Address Book editor. This * is made to operate exactly in interface with the exception of name. * */ #include "contacteditor.h" #include "addresspicker.h" #include <qpe/categoryselect.h> #include <qpe/qpeapplication.h> #include <qpe/qpedialog.h> #include <qcombobox.h> #include <qlabel.h> #include <qtabwidget.h> #include <qlayout.h> #include <qlineedit.h> #include <qmultilineedit.h> #include <qscrollview.h> #include <qtoolbutton.h> #include <qpushbutton.h> #include <qmainwindow.h> #include <qvaluelist.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 ); ContactEditor::ContactEditor( const Contact &entry, const QValueList<int> *newOrderedValues, QStringList *slNewOrdered, QWidget *parent, const char *name, WFlags fl ) : QDialog( parent, name, TRUE, fl ), orderedValues( newOrderedValues ), slOrdered( *slNewOrdered ) { init(); initMap(); setEntry( entry ); qDebug("finish"); } ContactEditor::~ContactEditor() { } void ContactEditor::init() { useFullName = TRUE; int i = 0; /** SHut up and stop leaking slHomeAddress = new QStringList; slBusinessAddress = new QStringList; slChooserNames = new QStringList; slChooserValues = new QStringList; slDynamicEntries = new QStringList; */ //*slDynamicEntries = *slOrdered; for (i = 0; i <= 6; i++) { slHomeAddress.append( "" ); slBusinessAddress.append( "" ); } { hasGender = FALSE; hasTitle = FALSE; hasCompany = FALSE; hasNotes = FALSE; hasStreet = FALSE; hasStreet2 = FALSE; hasPOBox = FALSE; hasCity = FALSE; hasState = FALSE; hasZip = FALSE; hasCountry = FALSE; QStringList::ConstIterator it = slOrdered.begin(); for ( i = 0; it != slOrdered.end(); i++, ++it ) { if ( (*it) == tr( "Business Fax" ) ) { slChooserNames.append( *it ); slChooserValues.append("" ); //slDynamicEntries->remove( it ); continue; } - + if ( (*it) == tr( "Home Fax" ) ) { slChooserNames.append( *it ); slChooserValues.append("" ); //slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Business Phone" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Home Phone" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } /* if ( (*it).right( 2 ) == tr( "IM" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } */ if ( (*it) == tr( "Business Mobile" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Home Mobile" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Business WebPage" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Home Web Page" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Business Pager" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Default Email" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Emails" ) ) { slChooserNames.append( *it ); slChooserValues.append( "" ); //slDynamicEntries->remove( it ); continue; } - + if ( *it == "Name Title" || *it == "First Name" || *it == "Middle Name" || *it == "Last Name" || *it == "File As" || *it == "Default Email" || *it == "Emails" || *it == "Groups" ) continue; if ( *it == tr( "Name Title" ) ) { //slDynamicEntries->remove( it ); continue; } if ( *it == tr( "First Name" ) ) { // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Middle Name" ) ) { // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Last Name" ) ) { // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Suffix" ) ) { // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "File As" ) ) { // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Gender" ) ) { hasGender = TRUE; // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Job Title" ) ) { hasTitle = TRUE; // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Company") || *it == tr( "Organization" ) ) { hasCompany = TRUE; // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Notes" ) ) { hasNotes = TRUE; // slDynamicEntries->remove( it ); continue; } if ( *it == tr( "Groups" ) ) { // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Business Street" ) ) { hasStreet = TRUE; // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Home Street" ) ) { hasStreet = TRUE; // slDynamicEntries->remove( it ); continue; } /* if ( (*it).right( 8 ) == tr( "Street 2" ) ) { hasStreet2 = TRUE; // slDynamicEntries->remove( it ); continue; - } + } if ( (*it).right( 8 ) == tr( "P.O. Box" ) ) { hasPOBox = TRUE; // slDynamicEntries->remove( it ); continue; } */ if ( (*it) == tr( "Business City" ) ) { hasCity = TRUE; // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Business State" ) ) { hasState = TRUE; // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Business Zip" ) ) { hasZip = TRUE; // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Business Country" ) ) { hasCountry = TRUE; // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Home City" ) ) { hasCity = TRUE; // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Home State" ) ) { hasState = TRUE; // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Home Zip" ) ) { hasZip = TRUE; // slDynamicEntries->remove( it ); continue; } if ( (*it) == tr( "Home Country" ) ) { hasCountry = TRUE; // slDynamicEntries->remove( it ); continue; } slDynamicEntries.append( *it ); } } QVBoxLayout *vb = new QVBoxLayout( this ); tabMain = new QTabWidget( this ); vb->addWidget( tabMain ); QWidget *tabViewport = new QWidget ( tabMain ); vb = new QVBoxLayout( tabViewport ); svGeneral = new QScrollView( tabViewport ); vb->addWidget( svGeneral, 0, 0 ); svGeneral->setResizePolicy( QScrollView::AutoOneFit ); svGeneral->setFrameStyle( QFrame::NoFrame ); QWidget *container = new QWidget( svGeneral->viewport() ); svGeneral->addChild( container ); QGridLayout *gl = new QGridLayout( container, 1, 1, 2, 4 ); gl->setResizeMode( QLayout::FreeResize ); btnFullName = new QPushButton( tr( "Full Name..." ), container ); gl->addWidget( btnFullName, 0, 0 ); txtFullName = new QLineEdit( container ); gl->addWidget( txtFullName, 0, 1 ); QLabel *l = new QLabel( tr( "Job Title" ), container ); gl->addWidget( l, 1, 0 ); txtJobTitle = new QLineEdit( container ); gl->addWidget( txtJobTitle, 1, 1 ); l = new QLabel( tr( "Organization" ), container ); gl->addWidget( l, 2, 0 ); txtOrganization = new QLineEdit( container ); gl->addWidget( txtOrganization, 2, 1 ); cmbChooserField1 = new QComboBox( FALSE, container ); cmbChooserField1->setMaximumWidth( 90 ); gl->addWidget( cmbChooserField1, 3, 0 ); txtChooserField1 = new QLineEdit( container ); gl->addWidget( txtChooserField1, 3, 1 ); cmbChooserField2 = new QComboBox( FALSE, container ); cmbChooserField2->setMaximumWidth( 90 ); gl->addWidget( cmbChooserField2, 4, 0 ); txtChooserField2 = new QLineEdit( container ); gl->addWidget( txtChooserField2, 4, 1 ); cmbChooserField3 = new QComboBox( FALSE, container ); cmbChooserField3->setMaximumWidth( 90 ); gl->addWidget( cmbChooserField3, 5, 0 ); txtChooserField3 = new QLineEdit( container ); gl->addWidget( txtChooserField3, 5, 1 ); l = new QLabel( tr( "File As" ), container ); gl->addWidget( l, 6, 0 ); cmbFileAs = new QComboBox( TRUE, container ); gl->addWidget( cmbFileAs, 6, 1 ); l = new QLabel( tr( "Category" ), container ); gl->addWidget( l, 7, 0 ); cmbCat = new CategorySelect( container ); gl->addWidget( cmbCat, 7, 1 ); btnNote = new QPushButton( tr( "Notes..." ), container ); gl->addWidget( btnNote, 8, 1 ); tabMain->insertTab( tabViewport, tr( "General" ) ); tabViewport = new QWidget ( tabMain ); vb = new QVBoxLayout( tabViewport ); svAddress = new QScrollView( tabViewport ); vb->addWidget( svAddress, 0, 0 ); svAddress->setResizePolicy( QScrollView::AutoOneFit ); svAddress->setFrameStyle( QFrame::NoFrame ); container = new QWidget( svAddress->viewport() ); svAddress->addChild( container ); gl = new QGridLayout( container, 8, 3, 2, 4 ); // row 7 QSpacerItem cmbAddress = new QComboBox( FALSE, container ); cmbAddress->insertItem( tr( "Business" ) ); cmbAddress->insertItem( tr( "Home" ) ); gl->addMultiCellWidget( cmbAddress, 0, 0, 0, 1 ); l = new QLabel( tr( "Address" ), container ); gl->addWidget( l, 1, 0 ); txtAddress = new QLineEdit( container ); gl->addMultiCellWidget( txtAddress, 1, 1, 1, 2 ); /* l = new QLabel( tr( "Address 2" ), container ); gl->addWidget( l, 2, 0 ); txtAddress2 = new QLineEdit( container ); gl->addMultiCellWidget( txtAddress2, 2, 2, 1, 2 ); l = new QLabel( tr( "P.O. Box" ), container ); gl->addWidget( l, 3, 0 ); txtPOBox = new QLineEdit( container ); gl->addMultiCellWidget( txtPOBox, 3, 3, 1, 2 ); */ l = new QLabel( tr( "City" ), container ); gl->addWidget( l, 2, 0 ); txtCity = new QLineEdit( container ); gl->addMultiCellWidget( txtCity, 2, 2, 1, 2 ); l = new QLabel( tr( "State" ), container ); gl->addWidget( l, 3, 0 ); txtState = new QLineEdit( container ); gl->addMultiCellWidget( txtState, 3, 3, 1, 2 ); l = new QLabel( tr( "Zip Code" ), container ); gl->addWidget( l, 4, 0 ); txtZip = new QLineEdit( container ); gl->addMultiCellWidget( txtZip, 4, 4, 1, 2 ); l = new QLabel( tr( "Country" ), container ); gl->addWidget( l, 5, 0 ); cmbCountry = new QComboBox( TRUE, container ); cmbCountry->insertItem( tr( "" ) ); cmbCountry->insertItem( tr ( "United States" ) ); cmbCountry->insertItem( tr ( "United Kingdom" ) ); cmbCountry->insertItem( tr ( "Afganistan" ) ); cmbCountry->insertItem( tr ( "Albania" ) ); cmbCountry->insertItem( tr ( "Algeria" ) ); cmbCountry->insertItem( tr ( "American Samoa" ) ); cmbCountry->insertItem( tr ( "Andorra" ) ); cmbCountry->insertItem( tr ( "Angola" ) ); cmbCountry->insertItem( tr ( "Anguilla" ) ); cmbCountry->insertItem( tr ( "Antartica" ) ); cmbCountry->insertItem( tr ( "Argentina" ) ); @@ -845,913 +845,913 @@ void ContactEditor::slotChooser2Change( const QString &textChanged ) { void ContactEditor::slotChooser3Change( const QString &textChanged ) { int index = cmbChooserField3->currentItem(); slChooserValues[index] = textChanged; } void ContactEditor::slotChooser4Change( const QString &textChanged ) { int index = cmbChooserField4->currentItem(); slChooserValues[index] = textChanged; } void ContactEditor::slotAddressChange( const QString &textChanged ) { if ( cmbAddress->currentItem() == 0 ) { slBusinessAddress[0] = textChanged; } else { slHomeAddress[0] = textChanged; } } void ContactEditor::slotAddress2Change( const QString &textChanged ) { if ( cmbAddress->currentItem() == 0 ) { slBusinessAddress[1] = textChanged; } else { slHomeAddress[1] = textChanged; } } void ContactEditor::slotPOBoxChange( const QString &textChanged ) { if ( cmbAddress->currentItem() == 0 ) { slBusinessAddress[2] = textChanged; } else { slHomeAddress[2] = textChanged; } } void ContactEditor::slotCityChange( const QString &textChanged ) { if ( cmbAddress->currentItem() == 0 ) { slBusinessAddress[3] = textChanged; } else { slHomeAddress[3] = textChanged; } } void ContactEditor::slotStateChange( const QString &textChanged ) { if ( cmbAddress->currentItem() == 0 ) { slBusinessAddress[4] = textChanged; } else { slHomeAddress[4] = textChanged; } } void ContactEditor::slotZipChange( const QString &textChanged ) { if ( cmbAddress->currentItem() == 0 ) { slBusinessAddress[5] = textChanged; } else { slHomeAddress[5] = textChanged; } } void ContactEditor::slotCountryChange( const QString &textChanged ) { if ( cmbAddress->currentItem() == 0 ) { slBusinessAddress[6] = textChanged; } else { slHomeAddress[6] = textChanged; } } void ContactEditor::slotCmbChooser1Change( int index ) { txtChooserField1->setText( slChooserValues[index] ); txtChooserField1->setFocus(); } void ContactEditor::slotCmbChooser2Change( int index ) { txtChooserField2->setText( slChooserValues[index] ); txtChooserField2->setFocus(); } void ContactEditor::slotCmbChooser3Change( int index ) { txtChooserField3->setText( slChooserValues[index] ); txtChooserField3->setFocus(); } void ContactEditor::slotCmbChooser4Change( int index ) { txtChooserField4->setText( slChooserValues[index] ); txtChooserField4->setFocus(); } void ContactEditor::slotAddressTypeChange( int index ) { if ( index == 0 ) { txtAddress->setText( slBusinessAddress[0] ); //txtAddress2->setText( (*slBusinessAddress)[1] ); //txtPOBox->setText( (*slBusinessAddress)[2] ); txtCity->setText( slBusinessAddress[3] ); txtState->setText( slBusinessAddress[4] ); txtZip->setText( slBusinessAddress[5] ); QLineEdit *txtTmp = cmbCountry->lineEdit(); txtTmp->setText( slBusinessAddress[6] ); } else { txtAddress->setText( slHomeAddress[0] ); //txtAddress2->setText( (*slHomeAddress)[1] ); //txtPOBox->setText( (*slHomeAddress)[2] ); txtCity->setText( slHomeAddress[3] ); txtState->setText( slHomeAddress[4] ); txtZip->setText( slHomeAddress[5] ); QLineEdit *txtTmp = cmbCountry->lineEdit(); txtTmp->setText( slHomeAddress[6] ); } } void ContactEditor::slotFullNameChange( const QString &textChanged ) { int index = cmbFileAs->currentItem(); cmbFileAs->clear(); cmbFileAs->insertItem( parseName( textChanged, 0 ) ); cmbFileAs->insertItem( parseName( textChanged, 1 ) ); cmbFileAs->insertItem( parseName( textChanged, 2 ) ); cmbFileAs->insertItem( parseName( textChanged, 3 ) ); cmbFileAs->setCurrentItem( index ); useFullName = TRUE; } void ContactEditor::loadFields() { QStringList::ConstIterator it; QListIterator<QLabel> lit( listName ); for ( it = slDynamicEntries.begin(); *lit; ++lit, ++it) { (*lit)->setText( *it ); } } void ContactEditor::accept() { if ( isEmpty() ) { cleanupFields(); reject(); } else { saveEntry(); cleanupFields(); QDialog::accept(); } } void ContactEditor::slotNote() { dlgNote->showMaximized(); if ( !dlgNote->exec() ) { txtNote->setText( ent.notes() ); } } void ContactEditor::slotName() { QString tmpName; if (useFullName == TRUE) { txtFirstName->setText( parseName(txtFullName->text(), NAME_F) ); txtMiddleName->setText( parseName(txtFullName->text(), NAME_M) ); txtLastName->setText( parseName(txtFullName->text(), NAME_L) ); txtSuffix->setText( parseName(txtFullName->text(), NAME_S) ); } dlgName->showMaximized(); if ( dlgName->exec() ) { - + tmpName = txtFirstName->text() + " " + txtMiddleName->text() + " " + txtLastName->text() + " " + txtSuffix->text(); txtFullName->setText( tmpName.simplifyWhiteSpace() ); slotFullNameChange( txtFullName->text() ); useFullName = FALSE; } } void ContactEditor::setNameFocus() { txtFullName->setFocus(); } bool ContactEditor::isEmpty() { // Test and see if the record should be saved. // More strict than the original qtopia, needs name or fileas to save QString t = txtFullName->text(); if ( !t.isEmpty() && containsAlphaNum( t ) ) return false; t = cmbFileAs->currentText(); if ( !t.isEmpty() && containsAlphaNum( t ) ) return false; return true; } QString ContactEditor::parseName( const QString fullName, int type ) { QString simplifiedName( fullName.simplifyWhiteSpace() ); QString strFirstName; QString strMiddleName; QString strLastName; QString strSuffix; QString strTitle; int commapos; int spCount; int spPos; int spPos2; commapos = simplifiedName.find( ',', 0, TRUE); spCount = simplifiedName.contains( ' ', TRUE ); if ( commapos == -1 ) { switch (spCount) { case 0: //return simplifiedName; if (txtLastName->text() != "") { strLastName = simplifiedName; break; } if (txtMiddleName->text() != "") { strMiddleName = simplifiedName; break; } if (txtSuffix->text() != "") { strSuffix = simplifiedName; break; } strFirstName = simplifiedName; break; case 1: spPos = simplifiedName.find( ' ', 0, TRUE ); strFirstName = simplifiedName.left( spPos ); strLastName = simplifiedName.mid( spPos + 1 ); break; case 2: spPos = simplifiedName.find( ' ', 0, TRUE ); strFirstName = simplifiedName.left( spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strMiddleName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); strLastName = simplifiedName.mid( spPos2 + 1 ); break; case 3: spPos = simplifiedName.find( ' ', 0, TRUE ); strFirstName = simplifiedName.left( spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strMiddleName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); spPos = simplifiedName.find( ' ', spPos2 + 1, TRUE ); strLastName = simplifiedName.mid( spPos2 + 1, (spPos - 1) - spPos2 ); strSuffix = simplifiedName.mid( spPos + 1 ); break; case 4: spPos = simplifiedName.find( ' ', 0, TRUE ); strTitle = simplifiedName.left( spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strFirstName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); spPos = simplifiedName.find( ' ', spPos2 + 1, TRUE ); strMiddleName = simplifiedName.mid( spPos2 + 1, (spPos - 1) - spPos2 ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strLastName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); strSuffix = simplifiedName.mid( spPos2 + 1 ); break; default: spPos = simplifiedName.find( ' ', 0, TRUE ); strTitle = simplifiedName.left( spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strFirstName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); spPos = simplifiedName.find( ' ', spPos2 + 1, TRUE ); strMiddleName = simplifiedName.mid( spPos2 + 1, (spPos - 1) - spPos2 ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strLastName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); strSuffix = simplifiedName.mid( spPos2 + 1 ); break; } } else { simplifiedName.replace( commapos, 1, " " ); simplifiedName = simplifiedName.simplifyWhiteSpace(); switch (spCount) { case 0: //return simplifiedName; if (txtLastName->text() != "") { strLastName = simplifiedName; break; } if (txtMiddleName->text() != "") { strMiddleName = simplifiedName; break; } if (txtSuffix->text() != "") { strSuffix = simplifiedName; break; } strFirstName = simplifiedName; break; case 1: spPos = simplifiedName.find( ' ', 0, TRUE ); strLastName = simplifiedName.left( spPos ); strFirstName = simplifiedName.mid( spPos + 1 ); break; case 2: spPos = simplifiedName.find( ' ', 0, TRUE ); strLastName = simplifiedName.left( spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strFirstName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); strMiddleName = simplifiedName.mid( spPos2 + 1 ); break; case 3: spPos = simplifiedName.find( ' ', 0, TRUE ); strLastName = simplifiedName.left( spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strFirstName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); spPos = simplifiedName.find( ' ', spPos2 + 1, TRUE ); strMiddleName = simplifiedName.mid( spPos2 + 1, (spPos - 1) - spPos2 ); strSuffix = simplifiedName.mid( spPos + 1 ); break; case 4: spPos = simplifiedName.find( ' ', 0, TRUE ); strLastName = simplifiedName.left( spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strTitle = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); spPos = simplifiedName.find( ' ', spPos2 + 1, TRUE ); strFirstName = simplifiedName.mid( spPos2 + 1, (spPos - 1) - spPos2 ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strMiddleName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); strSuffix = simplifiedName.mid( spPos2 + 1 ); break; default: spPos = simplifiedName.find( ' ', 0, TRUE ); strLastName = simplifiedName.left( spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strTitle = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); spPos = simplifiedName.find( ' ', spPos2 + 1, TRUE ); strFirstName = simplifiedName.mid( spPos2 + 1, (spPos - 1) - spPos ); spPos2 = simplifiedName.find( ' ', spPos + 1, TRUE ); strMiddleName = simplifiedName.mid( spPos + 1, (spPos2 - 1) - spPos ); strSuffix = simplifiedName.mid( spPos2 + 1 ); break; } } switch (type) { case NAME_FL: return strFirstName + " " + strLastName; case NAME_LF: return strLastName + ", " + strFirstName; case NAME_LFM: return strLastName + ", " + strFirstName + " " + strMiddleName; case NAME_FMLS: return strFirstName + " " + strMiddleName + " " + strLastName + " " + strSuffix; case NAME_F: return strFirstName; case NAME_M: return strMiddleName; case NAME_L: return strLastName; case NAME_S: return strSuffix; } return QString::null; } void ContactEditor::cleanupFields() { QStringList::Iterator it = slChooserValues.begin(); for ( int i = 0; it != slChooserValues.end(); i++, ++it ) { (*it) = ""; } for ( int i = 0; i < 7; i++ ) { slHomeAddress[i] = ""; slBusinessAddress[i] = ""; } QStringList::ConstIterator cit; QListIterator<QLineEdit> itLE( listValue ); for ( cit = slDynamicEntries.begin(); cit != slDynamicEntries.end(); ++cit, ++itLE) { (*itLE)->setText( "" ); } txtFirstName->setText(""); txtMiddleName->setText(""); txtLastName->setText(""); txtSuffix->setText(""); txtNote->setText(""); txtFullName->setText(""); txtJobTitle->setText(""); txtOrganization->setText(""); txtChooserField1->setText(""); txtChooserField2->setText(""); txtChooserField3->setText(""); txtAddress->setText(""); //txtAddress2->setText(""); txtCity->setText(""); //txtPOBox->setText(""); txtState->setText(""); txtZip->setText(""); QLineEdit *txtTmp = cmbCountry->lineEdit(); txtTmp->setText(""); txtTmp = cmbFileAs->lineEdit(); txtTmp->setText(""); } void ContactEditor::setEntry( const Contact &entry ) { cleanupFields(); ent = entry; useFullName = FALSE; txtFirstName->setText( ent.firstName() ); txtMiddleName->setText( ent.middleName() ); txtLastName->setText( ent.lastName() ); txtSuffix->setText( ent.suffix() ); QString *tmpString = new QString; *tmpString = ent.firstName() + " " + ent.middleName() + + " " + ent.lastName() + " " + ent.suffix(); txtFullName->setText( tmpString->simplifyWhiteSpace() ); cmbFileAs->setEditText( ent.fileAs() ); if (hasTitle) txtJobTitle->setText( ent.jobTitle() ); if (hasCompany) txtOrganization->setText( ent.company() ); if (hasNotes) txtNote->setText( ent.notes() ); if (hasStreet) { slHomeAddress[0] = ent.homeStreet(); slBusinessAddress[0] = ent.businessStreet(); } /* if (hasStreet2) { (*slHomeAddress)[1] = ent.homeStreet2(); (*slBusinessAddress)[1] = ent.businessStreet2(); } if (hasPOBox) { (*slHomeAddress)[2] = ent.homePOBox(); (*slBusinessAddress)[2] = ent.businessPOBox(); } */ if (hasCity) { slHomeAddress[3] = ent.homeCity(); slBusinessAddress[3] = ent.businessCity(); } if (hasState) { slHomeAddress[4] = ent.homeState(); slBusinessAddress[4] = ent.businessState(); } if (hasZip) { slHomeAddress[5] = ent.homeZip(); slBusinessAddress[5] = ent.businessZip(); } if (hasCountry) { slHomeAddress[6] = ent.homeCountry(); slBusinessAddress[6] = ent.businessCountry(); } QStringList::ConstIterator it; QListIterator<QLineEdit> itLE( listValue ); for ( it = slDynamicEntries.begin(); it != slDynamicEntries.end(); ++it, ++itLE) { if ( *it == tr("Department") ) (*itLE)->setText( ent.department() ); if ( *it == tr("Company" )) (*itLE)->setText( ent.company() ); if ( *it == tr("Office" )) (*itLE)->setText( ent.office() ); if ( *it == tr("Profession" )) (*itLE)->setText( ent.profession() ); if ( *it == tr("Assistant" )) (*itLE)->setText( ent.assistant() ); if ( *it == tr("Manager" )) (*itLE)->setText( ent.manager() ); if ( *it == tr("Spouse" )) (*itLE)->setText( ent.spouse() ); if ( *it == tr("Birthday" )) (*itLE)->setText( ent.birthday() ); if ( *it == tr("Anniversary" )) (*itLE)->setText( ent.anniversary() ); if ( *it == tr("Nickname" )) (*itLE)->setText( ent.nickname() ); if ( *it == tr("Children" )) (*itLE)->setText( ent.children() ); } QStringList::Iterator itV; for ( it = slChooserNames.begin(), itV = slChooserValues.begin(); it != slChooserNames.end(); ++it, ++itV ) { if ( *it == tr("Business Phone") || *it == tr("Work Phone" )) *itV = ent.businessPhone(); /* if ( *it == "Business 2 Phone" ) *itV = ent.business2Phone(); */ if ( *it == tr("Business Fax") || *it == tr("Work Fax" )) *itV = ent.businessFax(); if ( *it == tr("Business Mobile") || *it == tr("work Mobile" )) *itV = ent.businessMobile(); /* if ( *it == "Company Phone" ) *itV = ent.companyPhone(); */ if ( *it == tr("Default Email" )) *itV = ent.defaultEmail(); if ( *it == tr("Emails" )) - *itV = ent.emails(); + *itV = ent.emailList().join(";"); if ( *it == tr("Home Phone" )) *itV = ent.homePhone(); /* if ( *it == "Home 2 Phone" ) *itV = ent.home2Phone(); */ if ( *it == tr("Home Fax" )) *itV = ent.homeFax(); if ( *it == tr("Home Mobile" )) *itV = ent.homeMobile(); /* if ( *it == "Car Phone" ) *itV = ent.carPhone(); if ( *it == "ISDN Phone" ) *itV = ent.ISDNPhone(); if ( *it == "Other Phone" ) *itV = ent.otherPhone(); */ if ( *it == tr("Business Pager") || *it == tr("Work Pager" )) *itV = ent.businessPager(); /* if ( *it == "Home Pager") *itV = ent.homePager(); if ( *it == "AIM IM" ) *itV = ent.AIMIM(); if ( *it == "ICQ IM" ) *itV = ent.ICQIM(); if ( *it == "Jabber IM" ) *itV = ent.jabberIM(); if ( *it == "MSN IM" ) *itV = ent.MSNIM(); if ( *it == "Yahoo IM" ) *itV = ent.yahooIM(); */ if ( *it == tr("Home Web Page") ) *itV = ent.homeWebpage(); if ( *it == tr("Business WebPage") || *it == tr("Work Web Page") ) *itV = ent.businessWebpage(); } cmbCat->setCategories( ent.categories(), "Contacts", tr("Contacts") ); QString gender = ent.gender(); cmbGender->setCurrentItem( gender.toInt() ); txtNote->setText( ent.notes() ); slotCmbChooser1Change( cmbChooserField1->currentItem() ); slotCmbChooser2Change( cmbChooserField2->currentItem() ); slotCmbChooser3Change( cmbChooserField3->currentItem() ); slotAddressTypeChange( cmbAddress->currentItem() ); } void ContactEditor::saveEntry() { if ( useFullName == TRUE ) { txtFirstName->setText( parseName( txtFullName->text(), NAME_F ) ); txtMiddleName->setText( parseName( txtFullName->text(), NAME_M ) ); txtLastName->setText( parseName( txtFullName->text(), NAME_L ) ); txtSuffix->setText( parseName( txtFullName->text(), NAME_S ) ); useFullName = FALSE; } /*if ( ent.firstName() != txtFirstName->text() || ent.lastName != txtLastName->text() || ent.middleName != txtMiddleName->text() ) { */ ent.setFirstName( txtFirstName->text() ); ent.setLastName( txtLastName->text() ); ent.setMiddleName( txtMiddleName->text() ); ent.setSuffix( txtSuffix->text() ); //} ent.setFileAs( cmbFileAs->currentText() ); ent.setCategories( cmbCat->currentCategories() ); if (hasTitle) ent.setJobTitle( txtJobTitle->text() ); if (hasCompany) ent.setCompany( txtOrganization->text() ); if (hasNotes) ent.setNotes( txtNote->text() ); if (hasStreet) { ent.setHomeStreet( slHomeAddress[0] ); ent.setBusinessStreet( slBusinessAddress[0] ); } /* if (hasStreet2) { ent.setHomeStreet2( (*slHomeAddress)[1] ); ent.setBusinessStreet2( (*slBusinessAddress)[1] ); } if (hasPOBox) { ent.setHomePOBox( (*slHomeAddress)[2] ); ent.setBusinessPOBox( (*slBusinessAddress)[2] ); } */ if (hasCity) { ent.setHomeCity( slHomeAddress[3] ); ent.setBusinessCity( slBusinessAddress[3] ); } if (hasState) { ent.setHomeState( slHomeAddress[4] ); ent.setBusinessState( slBusinessAddress[4] ); } if (hasZip) { ent.setHomeZip( slHomeAddress[5] ); ent.setBusinessZip( slBusinessAddress[5] ); } if (hasCountry) { ent.setHomeCountry( slHomeAddress[6] ); ent.setBusinessCountry( slBusinessAddress[6] ); } QStringList::ConstIterator it; QListIterator<QLineEdit> itLE( listValue ); for ( it = slDynamicEntries.begin(); it != slDynamicEntries.end(); ++it, ++itLE) { if ( *it == tr("Department" )) ent.setDepartment( (*itLE)->text() ); if ( *it == tr("Company" )) ent.setCompany( (*itLE)->text() ); if ( *it == tr("Office" )) ent.setOffice( (*itLE)->text() ); if ( *it == tr("Profession" )) ent.setProfession( (*itLE)->text() ); if ( *it == tr("Assistant" )) ent.setAssistant( (*itLE)->text() ); if ( *it == tr("Manager" )) ent.setManager( (*itLE)->text() ); if ( *it == tr("Spouse" )) ent.setSpouse( (*itLE)->text() ); if ( *it == tr("Birthday" )) ent.setBirthday( (*itLE)->text() ); if ( *it == tr("Anniversary" )) ent.setAnniversary( (*itLE)->text() ); if ( *it == tr("Nickname" )) ent.setNickname( (*itLE)->text() ); if ( *it == tr("Children" )) ent.setChildren( (*itLE)->text() ); } QStringList::ConstIterator itV; for ( it = slChooserNames.begin(), itV = slChooserValues.begin(); it != slChooserNames.end(); ++it, ++itV ) { if ( *it == tr("Business Phone") || *it == tr("Work Phone" )) ent.setBusinessPhone( *itV ); /* if ( *it == tr("Business 2 Phone" ) ent.setBusiness2Phone( *itV ); */ if ( *it == tr("Business Fax") || *it == tr("Work Fax" )) ent.setBusinessFax( *itV ); if ( *it == tr("Business Mobile") || *it == tr("Work Mobile" )) ent.setBusinessMobile( *itV ); /* if ( *it == "Company Phone" ) ent.setCompanyPhone( *itV ); */ //if ( *it == "Default Email" ) //ent.setDefaultEmail( *itV ); if ( *it == tr("Emails" )) { QString allemail; QString defaultmail; parseEmailFrom( *itV, defaultmail, allemail ); ent.setDefaultEmail( defaultmail ); - ent.setEmails( *itV ); + ent.insertEmails( *itV ); } if ( *it == tr("Home Phone" )) ent.setHomePhone( *itV ); /* if ( *it == "Home 2 Phone" ) ent.setHome2Phone( *itV ); */ if ( *it == tr("Home Fax" )) ent.setHomeFax( *itV ); if ( *it == tr("Home Mobile" )) ent.setHomeMobile( *itV ); /* if ( *it == "Car Phone" ) ent.setCarPhone( *itV ); if ( *it == "ISDN Phone" ) ent.setISDNPhone( *itV ); if ( *it == "Other Phone" ) ent.setOtherPhone( *itV ); */ if ( *it == tr("Business Pager") || *it == tr("Work Pager") ) ent.setBusinessPager( *itV ); /* if ( *it == "Home Pager" ) ent.setHomePager( *itV ); if ( *it == "AIM IM" ) ent.setAIMIM( *itV ); if ( *it == "ICQ IM" ) ent.setICQIM( *itV ); if ( *it == "Jabber IM" ) ent.setJabberIM( *itV ); if ( *it == "MSN IM" ) ent.setMSNIM( *itV ); if ( *it == "Yahoo IM" ) ent.setYahooIM( *itV ); */ if ( *it == tr("Home Web Page") ) ent.setHomeWebpage( *itV ); if ( *it == tr("Business WebPage") || *it == tr("Work Web Page" )) ent.setBusinessWebpage( *itV ); } int gender = cmbGender->currentItem(); ent.setGender( QString::number( gender ) ); QString str = txtNote->text(); if ( !str.isNull() ) ent.setNotes( str ); } 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; } diff --git a/core/pim/todo/todotable.h b/core/pim/todo/todotable.h index 39e00d1..7539df1 100644 --- a/core/pim/todo/todotable.h +++ b/core/pim/todo/todotable.h @@ -1,245 +1,248 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia 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 TODOTABLE_H #define TODOTABLE_H #include <qpe/categories.h> #include <qpe/stringutil.h> //#include <qpe/task.h> #include <opie/todoevent.h> #include <qtable.h> #include <qmap.h> #include <qguardedptr.h> class Node; class QComboBox; class QTimer; class CheckItem : public QTableItem { public: CheckItem( QTable *t, const QString &sortkey ); void setChecked( bool b ); void toggle(); bool isChecked() const; void setKey( const QString &key ) { sortKey = key; } QString key() const; void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected ); private: bool checked; QString sortKey; }; class ComboItem : public QTableItem { public: ComboItem( QTable *t, EditType et ); QWidget *createEditor() const; void setContentFromEditor( QWidget *w ); void setText( const QString &s ); int alignment() const { return Qt::AlignCenter; } QString text() const; private: QGuardedPtr<QComboBox> cb; }; class TodoTextItem : public QTableItem { public: - TodoTextItem( QTable *t, const QString & str ) + TodoTextItem( QTable *t, const QString & str ) :QTableItem( t, QTableItem::Never, str ) {} QString key () const { return Qtopia::buildSortKey( text() ); } }; class DueTextItem : public QTableItem { public: DueTextItem( QTable *t, ToDoEvent *ev ); QString key() const; void setToDoEvent( const ToDoEvent *ev ); void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected ); private: int m_off; bool m_hasDate:1; bool m_completed:1; }; enum journal_action { ACTION_ADD=0, ACTION_REMOVE, ACTION_REPLACE }; namespace Opie { class XMLElement; }; class TodoTable : public QTable { Q_OBJECT public: TodoTable( QWidget *parent = 0, const char * name = 0 ); void addEntry( const ToDoEvent &todo ); void clearFindRow() { currFindRow = -2; } ToDoEvent currentEntry() const; void replaceCurrentEntry( const ToDoEvent &todo, bool fromTableItem = false ); QStringList categories(); void setShowCompleted( bool sc ) { showComp = sc; updateVisible(); } bool showCompleted() const { return showComp; } void setShowDeadline (bool sd) {showDeadl = sd; updateVisible();} bool showDeadline() const { return showDeadl;} void setShowCategory( const QString &c ) { showCat = c; updateVisible(); } const QString &showCategory() const { return showCat; } int showCategoryId() const; bool save( const QString &fn ); void load( const QString &fn ); void applyJournal( ); void clear(); void removeCurrentEntry(); void removeAllEntries() { clear(); }; //void removeAllEntriesInCategory(const QString &category ); void setPaintingEnabled( bool e ); virtual void sortColumn( int col, bool ascending, bool /*wholeRows*/ ); // int rowHeight( int ) const; // int rowPos( int row ) const; // virtual int rowAt( int pos ) const; signals: void signalEdit(); void signalDoneChanged( bool b ); void signalPriorityChanged( int i ); void signalShowMenu( const QPoint & ); void signalNotFound(); void signalWrapAround(); void showDetails( const ToDoEvent & ); protected: void keyPressEvent( QKeyEvent *e ); private: void updateVisible(); void viewportPaintEvent( QPaintEvent * ); void internalAddEntries( QList<ToDoEvent> &list); inline void insertIntoTable( ToDoEvent *todo, int row ); void updateJournal( const ToDoEvent &todo, journal_action action); void mergeJournal(); void journalFreeReplaceEntry( const ToDoEvent &todo, int row ); void journalFreeRemoveEntry( int row ); inline void realignTable( int row ); void loadFile( const QString &strFile); private slots: void slotClicked( int row, int col, int button, const QPoint &pos ); void slotPressed( int row, int col, int button, const QPoint &pos ); void slotCheckPriority(int row, int col ); void slotCurrentChanged(int row, int col ); void slotDoFind( const QString &findString, bool caseSensetive, bool backwards, int category ); void slotShowMenu(); void rowHeightChanged( int row ); void slotCheckDay(); // check the day private: friend class TodoWindow; QMap<CheckItem*, ToDoEvent *> todoList; QStringList categoryList; bool showComp; QString showCat; QTimer *menuTimer; QDate mDay; QTimer *mDayTimer; // see if the day changed bool enablePainting; Categories mCat; int currFindRow; bool showDeadl:1; }; inline void TodoTable::insertIntoTable( ToDoEvent *todo, int row ) { - QString sortKey = (char) ((todo->isCompleted() ? 'a' : 'A') - + todo->priority() ) + int rows = numRows(); + ++rows; + setNumRows( rows ); + QString sortKey = (char) ((todo->isCompleted() ? 'a' : 'A') + + todo->priority() ) + Qtopia::buildSortKey( todo->description() ); CheckItem *chk = new CheckItem( this, sortKey ); chk->setChecked( todo->isCompleted() ); ComboItem *cmb = new ComboItem( this, QTableItem::WhenCurrent ); cmb->setText( QString::number( todo->priority() ) ); QString sum = todo->summary(); QTableItem *ti = new TodoTextItem( this, sum.isEmpty() ? todo->description().left(40).simplifyWhiteSpace() : sum ); ti->setReplaceable( false ); DueTextItem *due = new DueTextItem(this, todo ); setItem( row, 3, due); - + setItem( row, 0, chk ); setItem( row, 1, cmb ); setItem( row, 2, ti ); todoList.insert( chk, todo ); } inline void TodoTable::realignTable( int row ) { QTableItem *ti1, *ti2, *ti3, *ti4; int totalRows = numRows(); for ( int curr = row; curr < totalRows - 1; curr++ ) { // this is bad, we must take the item out and then // set it. In the end, it behaves no worse (time wise) // then the old way of saving the entries to file, clearing // the table re-reading in the file and resetting the table ti1 = item( curr + 1, 0 ); ti2 = item( curr + 1, 1 ); ti3 = item( curr + 1, 2 ); ti4 = item( curr + 1, 3 ); takeItem( ti1 ); takeItem( ti2 ); takeItem( ti3 ); takeItem( ti4 ); setItem( curr, 0, ti1 ); setItem( curr, 1, ti2 ); setItem( curr, 2, ti3 ); setItem( curr, 3, ti4 ); } setNumRows( totalRows - 1 ); } #endif |