-rw-r--r-- | core/pim/addressbook/TODO | 2 | ||||
-rw-r--r-- | core/pim/addressbook/contacteditor.cpp | 803 | ||||
-rw-r--r-- | core/pim/addressbook/version.h | 4 |
3 files changed, 363 insertions, 446 deletions
diff --git a/core/pim/addressbook/TODO b/core/pim/addressbook/TODO index a0d50a3..106747e 100644 --- a/core/pim/addressbook/TODO +++ b/core/pim/addressbook/TODO @@ -1,64 +1,63 @@ Stuff todo until OPIE 1.0 : =========================== Feature requests: ----------------- - Dial by mobile phone by tapping the number.. (Maybe using gsmtool. And we may add a library class for this) - dial with dtmfdial in case it's installed and there's no mobile - 3rd column for 2. Contact - Implementing additional Views (Phonebook, ...) - Birthday & Anniversary Reminder - Beaming of multiple contacts (current list/ by search or by category) - Configure the letter-picker: lastname/fullname search - User center of the joypad to switch back from card to listview ! - Cursor-UP/Down: Should additionally scroll cardview if it is too large (behaviour should be selectable by configuration) Known Bugs: ----------- Bugs but not in addressbook: ----------------------------- - VCARD: If umlaut (äöüß) in address, the parser gets confused.. Urgent: -------- - Category is on the wrong position after changing to personal and back to normal ( Temporarily workaround: Category is never deactivated.. :S ) -- Fix handling of 3 Firstnames Important: ---------- - "What's this" should be added (Deleyed after Feature Freeze) Less important: --------------- - Reload if contacts were changed externally - The picker (alphabetical sort widget) should be placed verticaly or horizontally (configurable) - Find a smart solution for activating/deactivating the "send email" event - If new contact is added (contacteditor closed): focus (table, card) to this entry ! - After search (Started with Return): KeyFocus should be on Tabelle ContactEditor: - Redesign of Contacteditor Should be Fixed (not absolute sure, need further validation): ------------------------------------------------------------- Fixed/Ready: ------- - Syncing: abtable not reloaded after sync. - Find widget should be replaced by something like qpdf has. - Adding a configuration dialog - Picker: Activated letter schould be more visible - Advanced handling of cursor keys (search..) - Mail-Icon is missing @@ -85,32 +84,33 @@ Fixed/Ready: - There should be some icons for List and Cardview - If in Cardview and a category change removes all entries: There are already entries in Cardview after up/down - Personal Details: Anniversary zeigt Fantasie-Werte - Unfiled shown just in Category "All" and "Unfiled". - After finising search and after Edit: Clear Picker - After Edit: Table position back to edited entry. - Optimize Table Update... - Change MyDialog to Config - Store position and state of toolbar - Searchwidget closed: Selected user is jumping - Wenn suchen beendet, dann dauert das Tabellenupdate (was überhaupt überflüssig ist) zu lange.. - VCARD: Import of Anniversary does not work correctly (currently disabled) - Name order selected in "contacteditor" not used in list view. - OK-Key does not switch from Detailview (ablable) to Listview - Receiving of beams should open a dialog - Fix start of opie-mail - Implement Button Pics - Add a dialog to accept and optionally edit received contacts by IRDA. - Language not English (tested with german opie-translation): 1. Configure nicht übersetzt (alles leer). 2. Contacteditor nur teilweise übersetzt. 3. Kategorie-Picker geht nicht. - Plugin for Today for Birthdays and Anniversaries - Implement a picker/combo for the default email. - Overview window cleanup needed.. - Store last settings of combo-boxes - Personal and Business Web-page is not editable - Default Email-button: A lot of problems: If on second tab: The combo chooser is on the top left of the screen ! :( - Default Email-Button: Sometimes not hiding the textfields completely +- Fix handling of 3 Firstnames diff --git a/core/pim/addressbook/contacteditor.cpp b/core/pim/addressbook/contacteditor.cpp index d1338f6..7bc5bde 100644 --- a/core/pim/addressbook/contacteditor.cpp +++ b/core/pim/addressbook/contacteditor.cpp @@ -128,119 +128,124 @@ void ContactEditor::init() { 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 ); + l = new QLabel( tr("Suffix"), container ); gl->addWidget( l, 2, 0 ); + txtSuffix = new QLineEdit( container ); + gl->addWidget( txtSuffix, 2, 1 ); + + l = new QLabel( tr( "Organization" ), container ); + gl->addWidget( l, 3, 0 ); txtOrganization = new QLineEdit( container ); - gl->addWidget( txtOrganization, 2, 1 ); + gl->addWidget( txtOrganization, 3, 1 ); // Chooser 1 cmbChooserField1 = new QComboBox( FALSE, container ); cmbChooserField1->setMaximumWidth( 90 ); - gl->addWidget( cmbChooserField1, 3, 0 ); + gl->addWidget( cmbChooserField1, 4, 0 ); // Textfield for chooser 1. // Now use Widgetstack to contain the textfield and the default-email combo ! m_widgetStack1 = new QWidgetStack( container ); txtChooserField1 = new QLineEdit( m_widgetStack1 ); m_widgetStack1 -> addWidget( txtChooserField1, TextField ); - gl->addWidget( m_widgetStack1, 3, 1 ); + gl->addWidget( m_widgetStack1, 4, 1 ); m_widgetStack1 -> raiseWidget( TextField ); // Chooser 2 cmbChooserField2 = new QComboBox( FALSE, container ); cmbChooserField2->setMaximumWidth( 90 ); - gl->addWidget( cmbChooserField2, 4, 0 ); + gl->addWidget( cmbChooserField2, 5, 0 ); // Textfield for chooser 2 // Now use WidgetStack to contain the textfield and the default-email combo! m_widgetStack2 = new QWidgetStack( container ); txtChooserField2 = new QLineEdit( m_widgetStack2 ); m_widgetStack2 -> addWidget( txtChooserField2, TextField ); - gl->addWidget( m_widgetStack2, 4, 1 ); + gl->addWidget( m_widgetStack2, 5, 1 ); m_widgetStack2 -> raiseWidget( TextField ); // Chooser 3 cmbChooserField3 = new QComboBox( FALSE, container ); cmbChooserField3->setMaximumWidth( 90 ); - gl->addWidget( cmbChooserField3, 5, 0 ); + gl->addWidget( cmbChooserField3, 6, 0 ); // Textfield for chooser 2 // Now use WidgetStack to contain the textfield and the default-email combo! m_widgetStack3 = new QWidgetStack( container ); txtChooserField3 = new QLineEdit( m_widgetStack3 ); m_widgetStack3 -> addWidget( txtChooserField3, TextField ); - gl->addWidget( m_widgetStack3, 5, 1 ); + gl->addWidget( m_widgetStack3, 6, 1 ); m_widgetStack3 -> raiseWidget( TextField ); l = new QLabel( tr( "File As" ), container ); - gl->addWidget( l, 6, 0 ); + gl->addWidget( l, 7, 0 ); cmbFileAs = new QComboBox( TRUE, container ); - gl->addWidget( cmbFileAs, 6, 1 ); + gl->addWidget( cmbFileAs, 7, 1 ); labCat = new QLabel( tr( "Category" ), container ); - gl->addWidget( labCat, 7, 0 ); + gl->addWidget( labCat, 8, 0 ); cmbCat = new CategorySelect( container ); - gl->addWidget( cmbCat, 7, 1 ); + gl->addWidget( cmbCat, 8, 1 ); labCat->show(); cmbCat->show(); btnNote = new QPushButton( tr( "Notes..." ), container ); - gl->addWidget( btnNote, 8, 1 ); + gl->addWidget( btnNote, 9, 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( "City" ), container ); gl->addWidget( l, 2, 0 ); txtCity = new QLineEdit( container ); gl->addMultiCellWidget( txtCity, 2, 2, 1, 2 ); @@ -589,68 +594,68 @@ void ContactEditor::init() { // Fill labels with names.. // loadFields(); tabMain->insertTab( tabViewport, tr( "Details" ) ); dlgNote = new QDialog( this, "Note Dialog", TRUE ); dlgNote->setCaption( tr("Enter Note") ); QVBoxLayout *vbNote = new QVBoxLayout( dlgNote ); txtNote = new QMultiLineEdit( dlgNote ); vbNote->addWidget( txtNote ); connect( btnNote, SIGNAL(clicked()), this, SLOT(slotNote()) ); dlgName = new QDialog( this, "Name Dialog", TRUE ); dlgName->setCaption( tr("Edit Name") ); gl = new QGridLayout( dlgName, 5, 2, 2, 3 ); l = new QLabel( tr("First Name"), dlgName ); gl->addWidget( l, 0, 0 ); txtFirstName = new QLineEdit( dlgName ); gl->addWidget( txtFirstName, 0, 1 ); l = new QLabel( tr("Middle Name"), dlgName ); gl->addWidget( l, 1, 0 ); txtMiddleName = new QLineEdit( dlgName ); gl->addWidget( txtMiddleName, 1, 1 ); l = new QLabel( tr("Last Name"), dlgName ); gl->addWidget( l, 2, 0 ); txtLastName = new QLineEdit( dlgName ); gl->addWidget( txtLastName, 2, 1 ); - l = new QLabel( tr("Suffix"), dlgName ); - gl->addWidget( l, 3, 0 ); - txtSuffix = new QLineEdit( dlgName ); - gl->addWidget( txtSuffix, 3, 1 ); +// l = new QLabel( tr("Suffix"), dlgName ); +// gl->addWidget( l, 3, 0 ); +// txtSuffix = new QLineEdit( dlgName ); +// gl->addWidget( txtSuffix, 3, 1 ); space = new QSpacerItem(1,1, QSizePolicy::Maximum, QSizePolicy::MinimumExpanding ); gl->addItem( space, 4, 0 ); cmbChooserField1->insertStringList( trlChooserNames ); cmbChooserField2->insertStringList( trlChooserNames ); cmbChooserField3->insertStringList( trlChooserNames ); cmbChooserField4->insertStringList( trlChooserNames ); cmbChooserField1->setCurrentItem( 0 ); cmbChooserField2->setCurrentItem( 1 ); cmbChooserField3->setCurrentItem( 2 ); connect( btnFullName, SIGNAL(clicked()), this, SLOT(slotName()) ); connect( txtFullName, SIGNAL(textChanged(const QString &)), this, SLOT(slotFullNameChange(const QString &)) ); connect( txtChooserField1, SIGNAL(textChanged(const QString &)), this, SLOT(slotChooser1Change(const QString &)) ); connect( txtChooserField2, SIGNAL(textChanged(const QString &)), this, SLOT(slotChooser2Change(const QString &)) ); connect( txtChooserField3, SIGNAL(textChanged(const QString &)), this, SLOT(slotChooser3Change(const QString &)) ); connect( txtChooserField4, SIGNAL(textChanged(const QString &)), this, SLOT(slotChooser4Change(const QString &)) ); connect( txtAddress, SIGNAL(textChanged(const QString &)), this, SLOT(slotAddressChange(const QString &)) ); connect( txtCity, SIGNAL(textChanged(const QString &)), this, SLOT(slotCityChange(const QString &)) ); connect( txtState, SIGNAL(textChanged(const QString &)), this, SLOT(slotStateChange(const QString &)) ); @@ -986,832 +991,744 @@ void ContactEditor::slotAddressTypeChange( int index ) { if ( !initializing ) contactfields.setFieldOrder( 4, 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 ) { + qWarning( "ContactEditor::slotFullNameChange( %s )", textChanged.latin1() ); + 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->insertItem( parseName( textChanged, NAME_FL ) ); + cmbFileAs->insertItem( parseName( textChanged, NAME_FMLS ) ); + cmbFileAs->insertItem( parseName( textChanged, NAME_LF ) ); + cmbFileAs->insertItem( parseName( textChanged, NAME_LFM ) ); cmbFileAs->setCurrentItem( index ); useFullName = true; } 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) { 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) ); + // 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; + bool haveLastName = false; + qWarning("Fullname: %s", simplifiedName.latin1()); 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; + if ( commapos >= 0 ) { + qWarning(" Commapos: %d", commapos ); + + // A comma (",") separates the lastname from one or + // many first names. Thus, remove the lastname from the + // String and parse the firstnames. + + strLastName = simplifiedName.left( commapos ); + simplifiedName= simplifiedName.mid( commapos + 1 ); + haveLastName = true; + qWarning("Fullname without ',': %s", simplifiedName.latin1()); + + // If we have any lastname, we should now split all first names. + // The first one will be the used as first, the rest as "middle names" + + QStringList allFirstNames = QStringList::split(" ", simplifiedName); + QStringList::Iterator it = allFirstNames.begin(); + strFirstName = *it++; + QStringList allSecondNames; + for ( ; it != allFirstNames.end(); ++it ) + allSecondNames.append( *it ); + + strMiddleName = allSecondNames.join(" "); - case NAME_FMLS: - return strFirstName + " " + strMiddleName + " " + strLastName + " " + strSuffix; + } else { - case NAME_F: - return strFirstName; + // No comma separator used: We use the first word as firstname, the + // last as second/lastname and everything in the middle as middlename - case NAME_M: - return strMiddleName; + QStringList allNames = QStringList::split(" ", simplifiedName); + QStringList::Iterator it = allNames.begin(); + strFirstName = *it++; + QStringList allSecondNames; + for ( ; it != --allNames.end(); ++it ) + allSecondNames.append( *it ); + + strMiddleName = allSecondNames.join(" "); + strLastName = *(--allNames.end()); - case NAME_L: - return strLastName; + } - case NAME_S: - return strSuffix; + qWarning(" strFirstName: %s", strFirstName.latin1()); + qWarning(" strMiddleName: %s", strMiddleName.latin1()); + qWarning(" strLastName: %s", strLastName.latin1()); + qWarning(" strSuffix: %s", strSuffix.latin1()); + qWarning(" strTitle: %s", strTitle.latin1()); + 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] = ""; } - + QListIterator<QLineEdit> itLV( listValue ); for ( ; itLV.current(); ++itLV ) { (*itLV)->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(""); txtCity->setText(""); txtState->setText(""); txtZip->setText(""); QLineEdit *txtTmp = cmbCountry->lineEdit(); txtTmp->setText(""); txtTmp = cmbFileAs->lineEdit(); txtTmp->setText(""); - + } void ContactEditor::setEntry( const OContact &entry ) { - + initializing = true; - + cleanupFields(); - + ent = entry; - + emails = QStringList(ent.emailList()); defaultEmail = ent.defaultEmail(); if (defaultEmail.isEmpty()) defaultEmail = emails[0]; qDebug("default email=%s",defaultEmail.latin1()); - + 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() ); - + +// QString *tmpString = new QString; +// *tmpString = ent.firstName() + " " + ent.middleName() + +// + " " + ent.lastName() + " " + ent.suffix(); +// txtFullName->setText( tmpString->simplifyWhiteSpace() ); + + // Lastnames with multiple words need to be protected by a comma ! + if ( ent.lastName().contains( ' ', TRUE ) ) + txtFullName->setText( ent.lastName() + ", " + ent.firstName() + " " + ent.middleName() ); + else + txtFullName->setText( ent.firstName() + " " + ent.middleName() + " " + ent.lastName() ); + 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 (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(); -//} - + 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 (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(); itLE.current()/* != slDynamicEntries.end()*/; ++it, ++itLE) { - + qWarning(" Filling dynamic Field: %s", (*it).latin1() ); - + if ( *it == "Department" ) (*itLE)->setText( ent.department() ); - + if ( *it == "Company" ) (*itLE)->setText( ent.company() ); - + if ( *it == "Office" ) (*itLE)->setText( ent.office() ); - + if ( *it == "Profession" ) (*itLE)->setText( ent.profession() ); - + if ( *it == "Assistant" ) (*itLE)->setText( ent.assistant() ); - + if ( *it == "Manager" ) (*itLE)->setText( ent.manager() ); - + if ( *it == "Spouse" ) (*itLE)->setText( ent.spouse() ); - + if ( *it == "Nickname" ){ qWarning("**** Nichname: %s", ent.nickname().latin1() ); (*itLE)->setText( ent.nickname() ); } - + if ( *it == "Children" ) (*itLE)->setText( ent.children() ); - + } - + QStringList::Iterator itV; for ( it = slChooserNames.begin(), itV = slChooserValues.begin(); it != slChooserNames.end(); ++it, ++itV ) { - + if ( ( *it == "Business Phone") || ( *it == "Work Phone" ) ) *itV = ent.businessPhone(); -/* - if ( *it == "Business 2 Phone" ) - *itV = ent.business2Phone(); -*/ + /* + if ( *it == "Business 2 Phone" ) + *itV = ent.business2Phone(); + */ if ( ( *it == "Business Fax") || ( *it == "Work Fax" ) ) *itV = ent.businessFax(); - + if ( ( *it == "Business Mobile" ) || ( *it == "work Mobile" ) ) *itV = ent.businessMobile(); -/* - if ( *it == "Company Phone" ) - *itV = ent.companyPhone(); -*/ + /* + if ( *it == "Company Phone" ) + *itV = ent.companyPhone(); + */ if ( *it == "Default Email" ) *itV = ent.defaultEmail(); - + if ( *it == "Emails" ) *itV = ent.emailList().join(", "); // :SX - + if ( *it == "Home Phone" ) *itV = ent.homePhone(); -/* - if ( *it == "Home 2 Phone" ) - *itV = ent.home2Phone(); -*/ + /* + if ( *it == "Home 2 Phone" ) + *itV = ent.home2Phone(); + */ if ( *it == "Home Fax" ) *itV = ent.homeFax(); - + if ( *it == "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 == "Car Phone" ) + *itV = ent.carPhone(); + + if ( *it == "ISDN Phone" ) + *itV = ent.ISDNPhone(); + + if ( *it == "Other Phone" ) + *itV = ent.otherPhone(); + */ if ( ( *it == "Business Pager" ) || ( *it == "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 == "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 == "Home Web Page" ) *itV = ent.homeWebpage(); - + if ( ( *it == "Business WebPage" ) || ( *it == "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() ); - + slotAddressTypeChange( cmbAddress->currentItem() ); - + // Calling "show()" to arrange all widgets. Otherwise we will get // a wrong position of the textfields and are unable to put our // default-email combo over it.. This is very ugly ! // Does anybody has a better solution ? // Basically we should rethink the strategy to hide // a textfield with overwriting.. (se) show(); - + // Get combo-settings from contact and set preset.. contactfields.loadFromRecord( ent ); cmbChooserField1->setCurrentItem( contactfields.getFieldOrder(0, 7) ); cmbChooserField2->setCurrentItem( contactfields.getFieldOrder(1, 9) ); cmbChooserField3->setCurrentItem( contactfields.getFieldOrder(2, 0) ); cmbChooserField4->setCurrentItem( contactfields.getFieldOrder(3, 6) ); cmbAddress->setCurrentItem( contactfields.getFieldOrder(4, 1) ); slotCmbChooser1Change( cmbChooserField1->currentItem() ); slotCmbChooser2Change( cmbChooserField2->currentItem() ); slotCmbChooser3Change( cmbChooserField3->currentItem() ); slotCmbChooser4Change( cmbChooserField4->currentItem() ); slotAddressTypeChange( cmbAddress->currentItem() ); - + updateDatePicker(); - + initializing = false; } void ContactEditor::updateDatePicker() { // Set DatePicker if ( !ent.birthday().isNull() ){ birthdayButton->setText( TimeString::numberDateString( ent.birthday() ) ); birthdayPicker->setDate( ent.birthday() ); } else birthdayButton->setText( tr ("Unknown") ); - + if ( !ent.anniversary().isNull() ){ anniversaryButton->setText( TimeString::numberDateString( ent.anniversary() ) ); anniversaryPicker->setDate( ent.anniversary() ); } else anniversaryButton->setText( tr ("Unknown") ); - + } void ContactEditor::saveEntry() { - + // Store current combo into contact contactfields.saveToRecord( ent ); - + if ( useFullName ) { 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 ) ); - + // txtSuffix->setText( parseName( txtFullName->text(), NAME_S ) ); + useFullName = false; } - + 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 (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] ); - // } - + 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 (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(); itLE.current() && it != slDynamicEntries.end(); ++it, ++itLE) { - + if ( *it == "Department" ) ent.setDepartment( (*itLE)->text() ); - + if ( *it == "Company" ) ent.setCompany( (*itLE)->text() ); - + if ( *it == "Office" ) ent.setOffice( (*itLE)->text() ); - + if ( *it == "Profession" ) ent.setProfession( (*itLE)->text() ); - + if ( *it == "Assistant" ) ent.setAssistant( (*itLE)->text() ); - + if ( *it == "Manager" ) ent.setManager( (*itLE)->text() ); - + if ( *it == "Spouse" ) ent.setSpouse( (*itLE)->text() ); - + if ( *it == "Nickname" ) ent.setNickname( (*itLE)->text() ); - + if ( *it == "Children" ) ent.setChildren( (*itLE)->text() ); - + } - - + + QStringList::ConstIterator itV; for ( it = slChooserNames.begin(), itV = slChooserValues.begin(); it != slChooserNames.end(); ++it, ++itV ) { - + if ( ( *it == "Business Phone" ) || ( *it == "Work Phone" ) ) ent.setBusinessPhone( *itV ); - + if ( ( *it == "Business Fax" ) || ( *it == "Work Fax" ) ) ent.setBusinessFax( *itV ); - + if ( ( *it == "Business Mobile" ) || ( *it == "Work Mobile" ) ) ent.setBusinessMobile( *itV ); - + if ( *it == "Emails" ){ QString allemail; QString defaultmail; parseEmailFrom( emails.join(","), defaultmail, allemail ); if ( defaultEmail.isEmpty() ){ qWarning("Default email was not set by user!"); qWarning("Using first email in list: %s", defaultmail.latin1()); ent.setDefaultEmail( defaultmail ); } ent.setEmails( allemail ); } - + if ( *it == "Default Email") ent.setDefaultEmail( defaultEmail /* *itV */ ); - + if ( *it == "Home Phone" ) ent.setHomePhone( *itV ); - + if ( *it == "Home Fax" ) ent.setHomeFax( *itV ); - + if ( *it == "Home Mobile" ) ent.setHomeMobile( *itV ); - + if ( ( *it == "Business Pager" ) || ( *it == "Work Pager" ) ) ent.setBusinessPager( *itV ); - + if ( *it == "Home Web Page" ) ent.setHomeWebpage( *itV ); - + if ( ( *it == "Business WebPage" ) || ( *it == "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() ); + 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; - } + // 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; + 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; + int i, + count = str.length(); + for (i = 0; i < count; i++ ) + if ( str[i].isSpace() ) + return TRUE; + return FALSE; } void ContactEditor::setPersonalView( bool personal ) { m_personalView = personal; // Currently disbled due to the fact that // show will not work... return; - + if ( personal ){ cmbCat->hide(); labCat->hide(); - + } else{ cmbCat->show(); labCat->show(); } } void ContactEditor::slotAnniversaryDateChanged( int year, int month, int day) { - QDate date; - date.setYMD( year, month, day ); - QString dateString = TimeString::numberDateString( date ); - anniversaryButton->setText( dateString ); - ent.setAnniversary ( date ); + QDate date; + date.setYMD( year, month, day ); + QString dateString = TimeString::numberDateString( date ); + anniversaryButton->setText( dateString ); + ent.setAnniversary ( date ); } void ContactEditor::slotBirthdayDateChanged( int year, int month, int day) { - QDate date; - date.setYMD( year, month, day ); - QString dateString = TimeString::numberDateString( date ); - birthdayButton->setText( dateString ); - ent.setBirthday ( date ); + QDate date; + date.setYMD( year, month, day ); + QString dateString = TimeString::numberDateString( date ); + birthdayButton->setText( dateString ); + ent.setBirthday ( date ); } void ContactEditor::slotRemoveBirthday() { qWarning("void ContactEditor::slotRemoveBirthday()"); ent.setBirthday( QDate() ); updateDatePicker(); } void ContactEditor::slotRemoveAnniversary() { qWarning("void ContactEditor::slotRemoveAnniversary()"); ent.setAnniversary( QDate() ); updateDatePicker(); } diff --git a/core/pim/addressbook/version.h b/core/pim/addressbook/version.h index 3becfdc..c2ead05 100644 --- a/core/pim/addressbook/version.h +++ b/core/pim/addressbook/version.h @@ -1,10 +1,10 @@ #ifndef _VERSION_H_ #define _VERSION_H_ #define MAINVERSION "0" -#define SUBVERSION "2" -#define PATCHVERSION "2" +#define SUBVERSION "3" +#define PATCHVERSION "0" #define APPNAME "OPIE_ADDRESSBOOK" #endif |