-rw-r--r-- | core/pim/addressbook/TODO | 1 | ||||
-rw-r--r-- | core/pim/addressbook/contacteditor.cpp | 8 | ||||
-rw-r--r-- | core/pim/addressbook/version.h | 2 |
3 files changed, 6 insertions, 5 deletions
diff --git a/core/pim/addressbook/TODO b/core/pim/addressbook/TODO index 906b462..719b720 100644 --- a/core/pim/addressbook/TODO +++ b/core/pim/addressbook/TODO @@ -1,118 +1,119 @@ 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: ----------- - 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 Bugs but not in addressbook: ----------------------------- - VCARD: If umlaut (äöüß) in address, the parser gets confused.. - Exporting and reimporting of Jobtitle was reported to fail (Could not reproduce this ! (se)) Urgent: -------- ContactEditor: - Contact-Editor is temporarely reenabled. Wait for replacement. - Redesign of Contacteditor - 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: ---------- - If new contact is added (contacteditor closed): focus (table, card) to this entry ! - After search (Started with Return): KeyFocus should be on Tabelle - "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 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 - Use opie-mail insted of qt-mail if possible. - Font menu is invisible using german translation - Personal contact editor: Disable categories - "Nonenglish" translation bug has to be fixed. - contacteditor: Birthday, annyversary, ... : Use Dateselector - The names of the countries are sorted by there english names, only.. Even if they are translated.. :S - Cursor keys should work in detail-view (ablabel) -> Ablabel should be removed and Abtable should be increased with different views (as started by darwin zins).. - Use advanced database functions in abtable to decrease memory footprint and to make everything more easy ! (abtable should store Iterator for selected Category) - Abtable: Configure Contact column (internally already available, need configuration) - Select of primary contact (see #274 on mantis) - Category-select does not work completely: "Unfiled" is always in listview .. - Return from Contacteditor: Category resettet to all - Personal Details not working - If category changed, the letterpicker should be resetted - 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 diff --git a/core/pim/addressbook/contacteditor.cpp b/core/pim/addressbook/contacteditor.cpp index 97573af..b60f2dd 100644 --- a/core/pim/addressbook/contacteditor.cpp +++ b/core/pim/addressbook/contacteditor.cpp @@ -470,1329 +470,1329 @@ void ContactEditor::init() { tabMain->insertTab( tabViewport, tr( "Address" ) ); tabViewport = new QWidget ( tabMain ); vb = new QVBoxLayout( tabViewport ); svDetails = new QScrollView( tabViewport ); vb->addWidget( svDetails, 0, 0 ); svDetails->setResizePolicy( QScrollView::AutoOneFit ); svDetails->setFrameStyle( QFrame::NoFrame ); container = new QWidget( svDetails->viewport() ); svDetails->addChild( container ); gl = new QGridLayout( container, 1, 2, 2, 4 ); int counter = 0; // Birthday QHBox* hBox = new QHBox( container ); l = new QLabel( tr("Birthday"), container ); gl->addWidget( l, counter, 0 ); QPopupMenu* m1 = new QPopupMenu( container ); birthdayPicker = new DateBookMonth( m1, 0, TRUE ); m1->insertItem( birthdayPicker ); birthdayButton= new QToolButton( hBox, "buttonStart" ); birthdayButton->setPopup( m1 ); birthdayButton->setPopupDelay(0); QPushButton* deleteButton = new QPushButton( QIconSet( Resource::loadPixmap( "trash" ) ), tr( "Delete" ), hBox, 0 ); gl->addWidget( hBox, counter , 1 ); connect( birthdayPicker, SIGNAL( dateClicked( int, int, int ) ), this, SLOT( slotBirthdayDateChanged( int, int, int ) ) ); connect( deleteButton, SIGNAL( clicked() ), this, SLOT( slotRemoveBirthday() ) ); ++counter; // Anniversary hBox = new QHBox( container ); l = new QLabel( tr("Anniversary"), container ); gl->addWidget( l, counter, 0 ); m1 = new QPopupMenu( container ); anniversaryPicker = new DateBookMonth( m1, 0, TRUE ); m1->insertItem( anniversaryPicker ); anniversaryButton= new QToolButton( hBox, "buttonStart" ); anniversaryButton->setPopup( m1 ); anniversaryButton->setPopupDelay(0); deleteButton = new QPushButton( QIconSet( Resource::loadPixmap( "trash" ) ), tr( "Delete" ), hBox, 0 ); gl->addWidget( hBox, counter , 1 ); connect( anniversaryPicker, SIGNAL( dateClicked( int, int, int ) ), this, SLOT( slotAnniversaryDateChanged( int, int, int ) ) ); connect( deleteButton, SIGNAL( clicked() ), this, SLOT( slotRemoveAnniversary() ) ); ++counter; // Gender l = new QLabel( tr("Gender"), container ); gl->addWidget( l, counter, 0 ); cmbGender = new QComboBox( container ); cmbGender->insertItem( "", 0 ); cmbGender->insertItem( tr("Male"), 1); cmbGender->insertItem( tr("Female"), 2); gl->addWidget( cmbGender, counter, 1 ); ++counter; // Create Labels and lineedit fields for every dynamic entry QStringList::ConstIterator it = slDynamicEntries.begin(); QMap<QString, int> mapStrToID = OContactFields::untrFieldsToId(); QMap<int, QString> mapIdToStr = OContactFields::idToTrFields(); for (i = counter; it != slDynamicEntries.end(); i++, ++it ) { if (((*it) == "Anniversary") || ((*it) == "Birthday")|| ((*it) == "Gender")) continue; l = new QLabel( mapIdToStr[mapStrToID[*it]].utf8() , container ); listName.append( l ); gl->addWidget( l, i, 0 ); QLineEdit *e = new QLineEdit( container ); listValue.append( e ); gl->addWidget( e, i, 1); } // 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 ); 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 &)) ); connect( txtZip, SIGNAL(textChanged(const QString &)), this, SLOT(slotZipChange(const QString &)) ); connect( cmbCountry, SIGNAL(textChanged(const QString &)), this, SLOT(slotCountryChange(const QString &)) ); connect( cmbCountry, SIGNAL(activated(const QString &)), this, SLOT(slotCountryChange(const QString &)) ); connect( cmbChooserField1, SIGNAL(activated(int)), this, SLOT(slotCmbChooser1Change(int)) ); connect( cmbChooserField2, SIGNAL(activated(int)), this, SLOT(slotCmbChooser2Change(int)) ); connect( cmbChooserField3, SIGNAL(activated(int)), this, SLOT(slotCmbChooser3Change(int)) ); connect( cmbChooserField4, SIGNAL(activated(int)), this, SLOT(slotCmbChooser4Change(int)) ); connect( cmbAddress, SIGNAL(activated(int)), this, SLOT(slotAddressTypeChange(int)) ); new QPEDialogListener(this); setPersonalView ( m_personalView ); qWarning("init() END"); } void ContactEditor::defaultEmailChanged(int i){ qDebug("defaultEmailChanged"); // was sollte das ? (se) // int index = cmbChooserField1->currentItem(); // slChooserValues[index] = cmbDefaultEmail->text(i); defaultEmail = cmbDefaultEmail->text(i); qDebug ("Changed to: %s", defaultEmail.latin1()); } void ContactEditor::populateDefaultEmailCmb(){ // if the default-email combo was not selected and therfore not created // we get a lot of trouble.. Therfore create an invisible one.. if ( !cmbDefaultEmail ){ cmbDefaultEmail = new QComboBox(this); cmbDefaultEmail -> hide(); } cmbDefaultEmail->clear(); cmbDefaultEmail->insertStringList( emails ); // cmbDefaultEmail->show(); // Select default email in combo.. bool found = false; for ( int i = 0; i < cmbDefaultEmail->count(); i++){ qDebug(" populateDefaultEmailCmb text >%s< defaultEmail >%s<", cmbDefaultEmail->text( i ).latin1(), defaultEmail.latin1()); if ( cmbDefaultEmail->text( i ).stripWhiteSpace() == defaultEmail.stripWhiteSpace() ){ cmbDefaultEmail->setCurrentItem( i ); qDebug("set"); found = true; } } // If the current default email is not found in the list, we choose the // first one.. if ( !found ) defaultEmail = cmbDefaultEmail->text(0); } // Called when any combobox was changed. // "true" returned if the change was chandled by this function, else it should // be handled by something else.. bool ContactEditor::cmbChooserChange( int index, QLineEdit *inputWid, int widgetPos ) { QString type = slChooserNames[index]; qWarning("ContactEditor::cmbChooserChange -> Type: %s, WidgetPos: %d", type.latin1(), widgetPos ); if ( !initializing ) contactfields.setFieldOrder( widgetPos-1, index ); // Create and connect combobox for selecting the default email if ( type == "Default Email"){ qWarning("Choosing default-email (defaultEmailChooserPosition= %d) ", defaultEmailChooserPosition); // More than one defaul-email chooser is not allowed ! if ( ( defaultEmailChooserPosition != -1 ) && defaultEmailChooserPosition != widgetPos && !initializing){ chooserError( widgetPos ); return true; } if ( cmbDefaultEmail ){ delete cmbDefaultEmail; cmbDefaultEmail = 0l; } cmbDefaultEmail = new QComboBox(inputWid->parentWidget()); cmbDefaultEmail->setGeometry(inputWid->frameGeometry()); /* :SX */ QRect rect = inputWid->frameGeometry(); qWarning("Geometrie: X=%d, Y=%d, Left=%d, Top=%d, Right=%d, Bottom=%d", rect.x(), rect.y(), rect.left(), rect.top(), rect.right(), rect.bottom()); QPoint pnt = inputWid->pos(); qWarning("Position : X=%d, Y=%d", pnt.x(), pnt.y() ); connect( cmbDefaultEmail,SIGNAL( activated(int) ), SLOT( defaultEmailChanged(int) ) ); cmbDefaultEmail->clear(); cmbDefaultEmail->insertStringList( emails ); cmbDefaultEmail->show(); defaultEmailChooserPosition = widgetPos; // Set current default email populateDefaultEmailCmb(); } else { // Something else was selected: Hide combo.. qWarning(" Hiding default-email combo" ); if ( defaultEmailChooserPosition == widgetPos ){ defaultEmailChooserPosition = -1; if ( cmbDefaultEmail ) cmbDefaultEmail->hide(); } // Caller should initialize the responsible textfield, therefore // "false" is returned return false; } // Everything is worked off .. return true; } // Currently accessed when we select default-email more than once ! void ContactEditor::chooserError( int index ) { qWarning("ContactEditor::chooserError( %d )", index); QMessageBox::warning( this, "Chooser Error", "Multiple selection of this\n" "Item is not allowed !\n\n" "First deselect the previous one !", "&OK", 0, 0, 0, 0 ); // Reset the selected Chooser. Unfortunately the chooser // generates no signal, therfore we have to // call the cmbChooserChange function manually.. switch( index ){ case 1: cmbChooserField1 -> setCurrentItem( 0 ); slotCmbChooser1Change( 0 ); break; case 2: cmbChooserField2 -> setCurrentItem( 0 ); slotCmbChooser2Change( 0 ); break; case 3: cmbChooserField3 -> setCurrentItem( 0 ); slotCmbChooser3Change( 0 ); break; case 4: cmbChooserField4 -> setCurrentItem( 0 ); slotCmbChooser4Change( 0 ); break; } } // Called when something was changed in a textfield (shouldn't it called textchanged? (se)) void ContactEditor::chooserChange( const QString &textChanged, int index, QLineEdit* , int widgetPos ) { QString type = slChooserNames[index]; qDebug("ContactEditor::chooserChange( type=>%s<, textChanged=>%s< index=%i, widgetPos=%i", type.latin1(),textChanged.latin1(), index, widgetPos ); if ( type == "Default Email"){ qWarning ("??? Wozu??: %s", textChanged.latin1()); defaultEmail = textChanged; populateDefaultEmailCmb(); }else if (defaultEmailChooserPosition == widgetPos){ qDebug("cmbDefaultEmail->hide()"); if (cmbDefaultEmail) cmbDefaultEmail->hide(); widgetPos=-1; }else if (type == "Emails"){ qDebug("emails"); QString de; emails = QStringList::split (",", textChanged ); populateDefaultEmailCmb(); } slChooserValues[index] = textChanged; } void ContactEditor::slotChooser1Change( const QString &textChanged ) { qWarning("ContactEditor::slotChooser1Change( %s )", textChanged.latin1()); chooserChange( textChanged, cmbChooserField1->currentItem(), txtChooserField1, 1); } void ContactEditor::slotChooser2Change( const QString &textChanged ) { qWarning("ContactEditor::slotChooser2Change( %s )", textChanged.latin1()); chooserChange( textChanged, cmbChooserField2->currentItem(), txtChooserField2, 2); } void ContactEditor::slotChooser3Change( const QString &textChanged ) { qWarning("ContactEditor::slotChooser3Change( %s )", textChanged.latin1()); chooserChange( textChanged, cmbChooserField3->currentItem(), txtChooserField3, 3); } void ContactEditor::slotChooser4Change( const QString &textChanged ) { qWarning("ContactEditor::slotChooser4Change( %s )", textChanged.latin1()); chooserChange( textChanged, cmbChooserField4->currentItem(), txtChooserField4, 4); } 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 ) { qWarning("ContactEditor::slotCmbChooser1Change( %d )", index); if ( !cmbChooserChange( cmbChooserField1->currentItem(), txtChooserField1, 1) ){ txtChooserField1->setText( slChooserValues[index] ); txtChooserField1->setFocus(); } } void ContactEditor::slotCmbChooser2Change( int index ) { qWarning("ContactEditor::slotCmbChooser2Change( %d )", index); if ( !cmbChooserChange( cmbChooserField2->currentItem(), txtChooserField2, 2) ){ txtChooserField2->setText( slChooserValues[index] ); txtChooserField2->setFocus(); } } void ContactEditor::slotCmbChooser3Change( int index ) { qWarning("ContactEditor::slotCmbChooser3Change( %d )", index); if ( !cmbChooserChange( cmbChooserField3->currentItem(), txtChooserField3, 3) ){ txtChooserField3->setText( slChooserValues[index] ); txtChooserField3->setFocus(); } } void ContactEditor::slotCmbChooser4Change( int index ) { qWarning("ContactEditor::slotCmbChooser4Change( %d )", index); if ( !cmbChooserChange( cmbChooserField4->currentItem(), txtChooserField4, 4) ){ txtChooserField4->setText( slChooserValues[index] ); txtChooserField4->setFocus(); } } 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 ) { 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::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) ); } 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] = ""; } 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() ); 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(); //} 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 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 == "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 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 == "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 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, 0) ); - cmbChooserField2->setCurrentItem( contactfields.getFieldOrder(1, 1) ); - cmbChooserField3->setCurrentItem( contactfields.getFieldOrder(2, 2) ); - cmbChooserField4->setCurrentItem( contactfields.getFieldOrder(3, 5) ); + 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 ) ); 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] ); // } 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() ); } } } 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; } 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 ); } 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 ); } 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 e716fe4..3c1e5ee 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 "0" +#define PATCHVERSION "1" #define APPNAME "OPIE_ADDRESSBOOK" #endif |