diff --git a/Makefile.am b/Makefile.am index 8f46216b4..2f2644f63 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,8 +41,8 @@ METASOURCES = kmmainwin.moc kmfolderdia.moc kmfolder.moc \ kmnewiostatus.moc kmnewiostatuswdg.moc \ charsetsDlg.moc kmtopwidget.moc \ kmbroadcaststatus.moc kmacctexppop.moc configuredialog.moc \ - colorlistbox.moc kmkernel.moc accountdialog.moc \ - addtoaddressbook.moc kmdisplayvcard.moc + colorlistbox.moc kmkernel.moc accountdialog.moc \ + addtoaddressbook.moc kmdisplayvcard.moc include_HEADERS = kmailIface.h diff --git a/kmdisplayvcard.cpp b/kmdisplayvcard.cpp index cd90acd7b..301c3925c 100644 --- a/kmdisplayvcard.cpp +++ b/kmdisplayvcard.cpp @@ -1,11 +1,11 @@ -#include "kmdisplayvcard.h" +#include "kmdisplayvcard.moc" #include #include #include #include -KMDisplayVCard::KMDisplayVCard(VCard *vc) { +KMDisplayVCard::KMDisplayVCard(VCard *vc, QWidget *parent, const char *name) : KTabCtl(parent, name) { _vc = vc; BuildInterface(); } @@ -31,7 +31,7 @@ void KMDisplayVCard::BuildInterface() { QWidget *KMDisplayVCard::getFirstTab() { QFrame *page = new QFrame(this); -QGridLayout *grid = new QGridLayout(page, 5, 2); +QGridLayout *grid = new QGridLayout(page, 7, 2); QLabel *name; QLabel *value; QString tmpstr; @@ -39,29 +39,42 @@ QValueList values; // // Display the Name: field - values = _vc->getValues(QString("n")); - if (values.count() > 0) { + tmpstr = _vc->getValue(VCARD_FN); + if (tmpstr.length() == 0) { + values = _vc->getValues(VCARD_N); tmpstr = ""; - for (unsigned int i = 1; i < values.count(); i++) { - tmpstr += values[i]; + if (values.count() >= 4) { + tmpstr += values[3]; + tmpstr += " "; + } + if (values.count() >= 2) { + tmpstr += values[1]; + tmpstr += " "; + } + if (values.count() >= 3) { + tmpstr += values[2]; tmpstr += " "; } tmpstr += values[0]; - name = new QLabel(i18n("Name:"), page); - value = new QLabel(tmpstr, page); - grid->addWidget(name, 0, 0); - grid->addWidget(value, 0, 1); - } else { - tmpstr = _vc->getValue(QString("fn")); - name = new QLabel(i18n("Name:"), page); - value = new QLabel(tmpstr, page); - grid->addWidget(name, 0, 0); - grid->addWidget(value, 0, 1); + if (values.count() >= 5) { + tmpstr += " "; + tmpstr += values[4]; + } } + QString nn = _vc->getValue(VCARD_NICKNAME); + if (nn != "") { + tmpstr += " ("; + tmpstr += nn; + tmpstr += ")"; + } + name = new QLabel(i18n("Name:"), page); + value = new QLabel(tmpstr, page); + grid->addWidget(name, 0, 0); + grid->addWidget(value, 0, 1); // // Display the Organization: field - tmpstr = _vc->getValue(QString("org")); + tmpstr = _vc->getValue(VCARD_ORG); name = new QLabel(i18n("Organization:"), page); value = new QLabel(tmpstr, page); grid->addWidget(name, 1, 0); @@ -69,7 +82,7 @@ QValueList values; // // Display the Title: field - tmpstr = _vc->getValue(QString("title")); + tmpstr = _vc->getValue(VCARD_TITLE); name = new QLabel(i18n("Title:"), page); value = new QLabel(tmpstr, page); grid->addWidget(name, 2, 0); @@ -77,7 +90,7 @@ QValueList values; // // Display the E-Mail: field - tmpstr = _vc->getValue(QString("email"), QString("internet")); + tmpstr = _vc->getValue(VCARD_EMAIL, VCARD_EMAIL_INTERNET); name = new QLabel(i18n("E-Mail:"), page); value = new QLabel(tmpstr, page); grid->addWidget(name, 3, 0); @@ -85,16 +98,34 @@ QValueList values; // // Display the URL: field - tmpstr = _vc->getValue(QString("url")); + tmpstr = _vc->getValue(VCARD_URL); name = new QLabel(i18n("URL:"), page); value = new QLabel(tmpstr, page); grid->addWidget(name, 4, 0); grid->addWidget(value, 4, 1); + // + // Display the Birthday: field + tmpstr = _vc->getValue(VCARD_BDAY); + name = new QLabel(i18n("Birthday:"), page); + // FIXME: this needs to be formatted + value = new QLabel(tmpstr, page); + grid->addWidget(name, 5, 0); + grid->addWidget(value, 5, 1); + return page; } + +#define DO_PHONENUMBER(X,Y) thisnum = _vc->getValue(VCARD_TEL, X); \ + if (thisnum.length() > 0) { \ + name = new QLabel(i18n(Y), page); \ + grid->addWidget(name, row, 0); \ + value = new QLabel(thisnum, page); \ + grid->addWidget(value, row++, 1); \ + } + QWidget *KMDisplayVCard::getSecondTab() { QFrame *page = new QFrame(this); QGridLayout *grid = new QGridLayout(page, 5, 2); @@ -103,9 +134,104 @@ QLabel *value; QString tmpstr; QValueList values; + // + // Add the Address[es] + name = new QLabel(i18n("Address:"), page); + grid->addWidget(name, 0, 0); + mAddrList = new QListBox(page); + mAddrList->setSelectionMode(QListBox::Single); + grid->addWidget(mAddrList, 0, 1); + QFrame *addrPage = new QFrame(page); + QGridLayout *addrGrid = new QGridLayout(addrPage, 5, 4); + name = new QLabel(i18n("PO BOX:"), addrPage); + addrGrid->addWidget(name, 0, 0); + mAddr_PO = new QLabel("", addrPage); + addrGrid->addMultiCellWidget(mAddr_PO, 0, 0, 1, 3); + name = new QLabel(i18n("Address 1:"), addrPage); + addrGrid->addWidget(name, 1, 0); + mAddr_addr1 = new QLabel("", addrPage); + addrGrid->addMultiCellWidget(mAddr_addr1, 1, 1, 1, 3); + name = new QLabel(i18n("Address 2:"), addrPage); + addrGrid->addWidget(name, 2, 0); + mAddr_addr2 = new QLabel("", addrPage); + addrGrid->addMultiCellWidget(mAddr_addr2, 2, 2, 1, 3); + name = new QLabel(i18n("City:"), addrPage); + addrGrid->addWidget(name, 3, 0); + mAddr_city = new QLabel("", addrPage); + addrGrid->addWidget(mAddr_city, 3, 1); + name = new QLabel(i18n("Province:"), addrPage); + addrGrid->addWidget(name, 3, 2); + mAddr_prov = new QLabel("", addrPage); + addrGrid->addWidget(mAddr_prov, 3, 3); + name = new QLabel(i18n("Country:"), addrPage); + addrGrid->addWidget(name, 4, 0); + mAddr_country = new QLabel("", addrPage); + addrGrid->addWidget(mAddr_country, 4, 1); + name = new QLabel(i18n("Postal Code:"), addrPage); + addrGrid->addWidget(name, 4, 2); + mAddr_postal = new QLabel("", addrPage); + addrGrid->addWidget(mAddr_postal, 4, 3); + + // set the types that are available + if (!_vc->getValues(VCARD_ADR).isEmpty()) { + mAddrList->insertItem(i18n("Default")); + mAddresses.append(_vc->getValues(VCARD_ADR)); + } + if (!_vc->getValues(VCARD_ADR, VCARD_ADR_DOM).isEmpty()) { + mAddrList->insertItem(i18n("Domestic")); + mAddresses.append(_vc->getValues(VCARD_ADR, VCARD_ADR_DOM)); + } + if (!_vc->getValues(VCARD_ADR, VCARD_ADR_INTL).isEmpty()) { + mAddrList->insertItem(i18n("International")); + mAddresses.append(_vc->getValues(VCARD_ADR, VCARD_ADR_INTL)); + } + if (!_vc->getValues(VCARD_ADR, VCARD_ADR_POSTAL).isEmpty()) { + mAddrList->insertItem(i18n("Postal")); + mAddresses.append(_vc->getValues(VCARD_ADR, VCARD_ADR_POSTAL)); + } + if (!_vc->getValues(VCARD_ADR, VCARD_ADR_HOME).isEmpty()) { + mAddrList->insertItem(i18n("Home")); + mAddresses.append(_vc->getValues(VCARD_ADR, VCARD_ADR_HOME)); + } + if (!_vc->getValues(VCARD_ADR, VCARD_ADR_WORK).isEmpty()) { + mAddrList->insertItem(i18n("Work")); + mAddresses.append(_vc->getValues(VCARD_ADR, VCARD_ADR_WORK)); + } + if (!_vc->getValues(VCARD_ADR, VCARD_ADR_PREF).isEmpty()) { + mAddrList->insertItem(i18n("Preferred")); + mAddresses.append(_vc->getValues(VCARD_ADR, VCARD_ADR_PREF)); + } + + mAddrList->setSelected(0,true); + mAddrList->setMinimumSize(mAddrList->minimumSizeHint()); + connect(mAddrList, SIGNAL(selectionChanged()), SLOT(slotChangeAddress())); + slotChangeAddress(); // set the first one + + grid->addWidget(addrPage, 1, 1); + name = new QLabel(i18n("Phone Numbers"), page); + grid->addWidget(name, 2, 0); + // try to add each type of phone number if we have them + QString thisnum; + int row = 3; + DO_PHONENUMBER(VCARD_TEL_HOME, "Home"); + DO_PHONENUMBER(VCARD_TEL_WORK, "Work"); + DO_PHONENUMBER(VCARD_TEL_PREF, "Preferred"); + DO_PHONENUMBER(VCARD_TEL_VOICE, "Voice"); + DO_PHONENUMBER(VCARD_TEL_FAX, "Fax"); + DO_PHONENUMBER(VCARD_TEL_MSG, "Message"); + DO_PHONENUMBER(VCARD_TEL_CELL, "Cellular"); + DO_PHONENUMBER(VCARD_TEL_PAGER, "Pager"); + DO_PHONENUMBER(VCARD_TEL_BBS, "BBS"); + DO_PHONENUMBER(VCARD_TEL_MODEM, "Modem"); + DO_PHONENUMBER(VCARD_TEL_CAR, "Car"); + DO_PHONENUMBER(VCARD_TEL_ISDN, "ISDN"); + DO_PHONENUMBER(VCARD_TEL_VIDEO, "Video"); + DO_PHONENUMBER(VCARD_TEL_PCS, "PCS"); + return page; } +#undef DO_PHONENUMBER QWidget *KMDisplayVCard::getThirdTab() { QFrame *page = new QFrame(this); @@ -119,4 +245,30 @@ return page; } +void KMDisplayVCard::slotChangeAddress() { +int c = mAddrList->currentItem(); + + if (mAddresses.count() > c) { + mAddr_PO->setText(mAddresses[c][0]); + mAddr_PO->resize(mAddr_PO->sizeHint()); + + mAddr_addr1->setText(mAddresses[c][2]); + mAddr_addr1->resize(mAddr_addr1->sizeHint()); + + mAddr_addr2->setText(mAddresses[c][1]); + mAddr_addr2->resize(mAddr_addr2->sizeHint()); + + mAddr_city->setText(mAddresses[c][3]); + mAddr_city->resize(mAddr_city->sizeHint()); + + mAddr_prov->setText(mAddresses[c][4]); + mAddr_prov->resize(mAddr_prov->sizeHint()); + + mAddr_country->setText(mAddresses[c][6]); + mAddr_country->resize(mAddr_country->sizeHint()); + + mAddr_postal->setText(mAddresses[c][5]); + mAddr_postal->resize(mAddr_postal->sizeHint()); + } +} diff --git a/kmdisplayvcard.h b/kmdisplayvcard.h index bb65395c3..69b02b4f5 100644 --- a/kmdisplayvcard.h +++ b/kmdisplayvcard.h @@ -5,24 +5,36 @@ #include #include #include +#include +#include #include "vcard.h" class KMDisplayVCard : public KTabCtl { +Q_OBJECT + public: - KMDisplayVCard(VCard *vc); + KMDisplayVCard(VCard *vc, QWidget *parent = 0, const char *name = 0); virtual ~KMDisplayVCard(); void setVCard(VCard *vc); + public slots: + void slotChangeAddress(); + private: VCard *_vc; + QListBox *mAddrList; + QLabel *mAddr_PO, *mAddr_addr1, *mAddr_addr2, *mAddr_city, *mAddr_prov, + *mAddr_country, *mAddr_postal; + QValueList< QValueList > mAddresses; void BuildInterface(); QWidget *getFirstTab(); QWidget *getSecondTab(); QWidget *getThirdTab(); + }; diff --git a/vcard.cpp b/vcard.cpp index 53a9be4f7..757570d5d 100644 --- a/vcard.cpp +++ b/vcard.cpp @@ -17,88 +17,7 @@ // // FIXME: do proper CRLF/CR handling - -// required -#define VCARD_BEGIN "begin:vcard" -#define VCARD_END "end:vcard" -#define VCARD_BEGIN_N "begin" -#define VCARD_END_N "end" -#define VCARD_VERSION "version" -// one of the following two?? -#define VCARD_FN "fn" -#define VCARD_N "n" - -// optional -#define VCARD_NAME "name" -#define VCARD_NICKNAME "nickname" -#define VCARD_PHOTO "photo" -#define VCARD_BDAY "bday" -#define VCARD_ADR "adr" - // types - #define VCARD_ADR_DOM "dom" - #define VCARD_ADR_INTL "intl" - #define VCARD_ADR_POSTAL "postal" - #define VCARD_ADR_HOME "home" - #define VCARD_ADR_WORK "work" - #define VCARD_ADR_PREF "pref" - // values - #define VCARD_ADR_POBOX "PO Box" - #define VCARD_ADR_EXTADR "Extended Address" - #define VCARD_ADR_STREET "Street" - #define VCARD_ADR_LOCALITY "Locality" - #define VCARD_ADR_REGION "Region" - #define VCARD_ADR_POSTCODE "Postal Code" - #define VCARD_ADR_COUNTRY "Country Name" -#define VCARD_LABEL "label" -#define VCARD_PROFILE "profile" -#define VCARD_SOURCE "source" -#define VCARD_TEL "tel" - // types - #define VCARD_TEL_HOME "home" - #define VCARD_TEL_WORK "work" - #define VCARD_TEL_PREF "pref" - #define VCARD_TEL_VOICE "voice" - #define VCARD_TEL_FAX "fax" - #define VCARD_TEL_MSG "msg" - #define VCARD_TEL_CELL "cell" - #define VCARD_TEL_PAGER "pager" - #define VCARD_TEL_BBS "bbs" - #define VCARD_TEL_MODEM "modem" - #define VCARD_TEL_CAR "car" - #define VCARD_TEL_ISDN "isdn" - #define VCARD_TEL_VIDEO "video" - #define VCARD_TEL_PCS "pcs" -#define VCARD_EMAIL "email" - // types - #define VCARD_EMAIL_INTERNET "internet" - #define VCARD_EMAIL_X400 "x400" -#define VCARD_TZ "tz" -#define VCARD_GEO "geo" -#define VCARD_MAILER "mailer" -#define VCARD_TITLE "title" -#define VCARD_ROLE "role" -#define VCARD_LOGO "logo" -#define VCARD_AGENT "agent" -#define VCARD_ORG "org" -#define VCARD_CATEGORIES "categories" -#define VCARD_NOTE "note" -#define VCARD_PRODID "prodid" -#define VCARD_REV "rev" -#define VCARD_SOUND "sound" -#define VCARD_UID "uid" -#define VCARD_URL "url" -#define VCARD_CLASS "class" - #define VCARD_CLASS_PUBLIC "public" - #define VCARD_CLASS_PRIVATE "private" - #define VCARD_CLASS_CONFIDENTIAL "confidential" -#define VCARD_KEY "key" - // types - #define VCARD_KEY_X509 "x509" - #define VCARD_KEY_PGP "pgp" - -#define VCARD_QUOTED_PRINTABLE "quoted-printable" - -/* X-xxxxx also usable */ +// FIXME: handle TYPE=x,y,z qualifiers /* @@ -117,9 +36,8 @@ value := // This code is screaming "come do me in PERL!" -// This STRIPS OUT EMPTY TOKENS //static QValueList tokenizeBy(const QString& str, char tok) { -static QValueList tokenizeBy(const QString& str, const QRegExp& tok) { +static QValueList tokenizeBy(const QString& str, const QRegExp& tok, bool keepEmpties = false) { QValueList tokens; unsigned int head, tail; const char *chstr = str.ascii(); @@ -140,7 +58,7 @@ unsigned int length = str.length(); if (tail > length) // last token - none at end tail = length; - if (tail-head > 0) { // it has to be at least 1 long! + if (tail-head > 0 || keepEmpties) { // it has to be at least 1 long! thisline = &(chstr[head]); thisline.truncate(tail-head); tokens.append(thisline); @@ -299,7 +217,7 @@ QValueList lines; // split into tokens by ; // add to parameters vector //_vcl.parameters = tokenizeBy(linetokens[1], ';'); - _vcl.parameters = tokenizeBy(linetokens[1], QRegExp(";")); + _vcl.parameters = tokenizeBy(linetokens[1], QRegExp(";"), true); if (qp) { for (QValueListIterator z = _vcl.parameters.begin(); z != _vcl.parameters.end(); @@ -476,7 +394,7 @@ return failed; QValueList VCard::getValues(const QString& name, const QString& qualifier) { -QString failedstr = ""; +//QString failedstr = ""; QValueList failed; for (QValueListIterator i = _vcdata->begin(); i != _vcdata->end(); @@ -485,13 +403,13 @@ QValueList failed; return (*i).parameters; } } -failed.append(failedstr); +//failed.append(failedstr); return failed; } QValueList VCard::getValues(const QString& name) { -QString failedstr = ""; +//QString failedstr = ""; QValueList failed; for (QValueListIterator i = _vcdata->begin(); i != _vcdata->end(); @@ -500,7 +418,7 @@ QValueList failed; return (*i).parameters; } } -failed.append(failedstr); +//failed.append(failedstr); return failed; } diff --git a/vcard.h b/vcard.h index 4b8bd402e..9a0dbdc48 100644 --- a/vcard.h +++ b/vcard.h @@ -14,6 +14,89 @@ // Requires QT 2.1+ // + +// required +#define VCARD_BEGIN "begin:vcard" +#define VCARD_END "end:vcard" +#define VCARD_BEGIN_N "begin" +#define VCARD_END_N "end" +#define VCARD_VERSION "version" +// one of the following two?? +#define VCARD_FN "fn" +#define VCARD_N "n" + +// optional +#define VCARD_NAME "name" +#define VCARD_NICKNAME "nickname" +#define VCARD_PHOTO "photo" +#define VCARD_BDAY "bday" +#define VCARD_ADR "adr" + // types + #define VCARD_ADR_DOM "dom" + #define VCARD_ADR_INTL "intl" + #define VCARD_ADR_POSTAL "postal" + #define VCARD_ADR_HOME "home" + #define VCARD_ADR_WORK "work" + #define VCARD_ADR_PREF "pref" + // values + #define VCARD_ADR_POBOX "PO Box" + #define VCARD_ADR_EXTADR "Extended Address" + #define VCARD_ADR_STREET "Street" + #define VCARD_ADR_LOCALITY "Locality" + #define VCARD_ADR_REGION "Region" + #define VCARD_ADR_POSTCODE "Postal Code" + #define VCARD_ADR_COUNTRY "Country Name" +#define VCARD_LABEL "label" +#define VCARD_PROFILE "profile" +#define VCARD_SOURCE "source" +#define VCARD_TEL "tel" + // types + #define VCARD_TEL_HOME "home" + #define VCARD_TEL_WORK "work" + #define VCARD_TEL_PREF "pref" + #define VCARD_TEL_VOICE "voice" + #define VCARD_TEL_FAX "fax" + #define VCARD_TEL_MSG "msg" + #define VCARD_TEL_CELL "cell" + #define VCARD_TEL_PAGER "pager" + #define VCARD_TEL_BBS "bbs" + #define VCARD_TEL_MODEM "modem" + #define VCARD_TEL_CAR "car" + #define VCARD_TEL_ISDN "isdn" + #define VCARD_TEL_VIDEO "video" + #define VCARD_TEL_PCS "pcs" +#define VCARD_EMAIL "email" + // types + #define VCARD_EMAIL_INTERNET "internet" + #define VCARD_EMAIL_X400 "x400" +#define VCARD_TZ "tz" +#define VCARD_GEO "geo" +#define VCARD_MAILER "mailer" +#define VCARD_TITLE "title" +#define VCARD_ROLE "role" +#define VCARD_LOGO "logo" +#define VCARD_AGENT "agent" +#define VCARD_ORG "org" +#define VCARD_CATEGORIES "categories" +#define VCARD_NOTE "note" +#define VCARD_PRODID "prodid" +#define VCARD_REV "rev" +#define VCARD_SOUND "sound" +#define VCARD_UID "uid" +#define VCARD_URL "url" +#define VCARD_CLASS "class" + #define VCARD_CLASS_PUBLIC "public" + #define VCARD_CLASS_PRIVATE "private" + #define VCARD_CLASS_CONFIDENTIAL "confidential" +#define VCARD_KEY "key" + // types + #define VCARD_KEY_X509 "x509" + #define VCARD_KEY_PGP "pgp" + +#define VCARD_QUOTED_PRINTABLE "quoted-printable" + +/* X-xxxxx also usable */ + #include #include