[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-pim
Subject:    Re: [Kde-pim] [PATCH] kmail recipient picker fixes
From:       Sander van Grieken <sander () 3v8 ! net>
Date:       2007-11-11 17:43:16
Message-ID: 200711111843.17709.sander () 3v8 ! net
[Download RAW message or body]

Sorry to post a big patch again, but please disregard previous patch and use 
this one.

grtz,
Sander

["recipientspicker-fixes.patch" (text/x-diff)]

Index: kmail/recipientspicker.h
===================================================================
--- kmail/recipientspicker.h	(revision 734800)
+++ kmail/recipientspicker.h	(working copy)
@@ -52,12 +52,15 @@
     typedef QList<RecipientItem *> List;
 
 #ifdef KDEPIM_NEW_DISTRLISTS
-  RecipientItem( KABC::AddressBook *ab );
-  void setDistributionList( const KPIM::DistributionList& );
+    RecipientItem( KABC::AddressBook *ab );
+    void setDistributionList( const KPIM::DistributionList& );
+    KPIM::DistributionList& distributionList();
 #else
     RecipientItem();
     void setDistributionList( KABC::DistributionList * );
+    KABC::DistributionList * distributionList();
 #endif
+
     void setAddressee( const KABC::Addressee &, const QString &email );
 
     void setRecipientType( const QString &type );
@@ -71,18 +74,27 @@
 
     QString key() const { return mKey; }
 
-    QString toolTip() const;
+    QString tooltip() const;
 
   private:
+#ifdef KDEPIM_NEW_DISTRLISTS
+    QString createTooltip( KPIM::DistributionList & ) const;
+#else
+    QString createTooltip( KABC::DistributionList * ) const;
+#endif
+
     KABC::Addressee mAddressee;
+    QString mName;
     QString mEmail;
+    QString mRecipient;
 #ifdef KDEPIM_NEW_DISTRLISTS
-  KPIM::DistributionList mDistributionList;
-  KABC::AddressBook *mAddressBook;
+    KPIM::DistributionList mDistributionList;
+    KABC::AddressBook *mAddressBook;
 #else
     KABC::DistributionList *mDistributionList;
 #endif
     QString mType;
+    QString mTooltip;
 
     QPixmap mIcon;
 
@@ -106,6 +118,9 @@
     RecipientsCollection();
     ~RecipientsCollection();
 
+    void setReferenceContainer( bool );
+    bool isReferenceContainer();
+
     void setTitle( const QString & );
     QString title() const;
 
@@ -114,14 +129,17 @@
     RecipientItem::List items() const;
 
     bool hasEquivalentItem( RecipientItem * ) const;
+    RecipientItem * getEquivalentItem( RecipientItem *) const;
 
     void clear();
 
     void deleteAll();
 
   private:
+    // flag to indicate if this collection contains just references
+    // or should manage memory (de)allocation as well.
+    bool mIsReferenceContainer;
     QString mTitle;
-    RecipientItem::List mItems;
     QMap<QString, RecipientItem *> mKeyMap;
 };
 
@@ -190,6 +208,8 @@
 
     void setDefaultButton( QPushButton *button );
 
+    void rebuildAllRecipientsList();
+
   protected slots:
     void updateList();
     void slotToClicked();
@@ -213,6 +233,7 @@
 
     QMap<int,RecipientsCollection *> mCollectionMap;
     RecipientsCollection *mAllRecipients;
+    RecipientsCollection *mDistributionLists;
     RecipientsCollection *mSelectedRecipients;
 
     Recipient::Type mDefaultType;
Index: kmail/recipientspicker.cpp
===================================================================
--- kmail/recipientspicker.cpp	(revision 734800)
+++ kmail/recipientspicker.cpp	(working copy)
@@ -69,7 +69,16 @@
 
   mIcon = KIconLoader::global()->loadIcon( "kontact_contacts", KIconLoader::Small );
 
-  mKey = 'D' + list.name();
+  mName = list.name();
+  mKey = list.name();
+
+  int count = list.entries( mAddressBook ).count();
+
+  mEmail = i18np( "1 email address", "%1 email addresses", count );
+
+  mRecipient = mName;
+
+  mTooltip = createTooltip( list );
 }
 #else
 void RecipientItem::setDistributionList( KABC::DistributionList *list )
@@ -78,7 +87,15 @@
 
   mIcon = KIconLoader::global()->loadIcon( "kontact_contacts", KIconLoader::Small );
 
-  mKey = 'D' + list->name();
+  mName = list->name();
+  mKey = list->name();
+
+  int count = list->entries().count();
+  mEmail = i18np( "1 email address", "%1 email addresses", count );
+
+  mRecipient = mName;
+
+  mTooltip = createTooltip( list );
 }
 #endif
 
@@ -87,6 +104,7 @@
 {
   mAddressee = a;
   mEmail = email;
+  mRecipient = mAddressee.fullEmail( mEmail );
 
   QImage img = a.photo().data();
   if ( !img.isNull() )
@@ -94,7 +112,14 @@
   else
     mIcon = KIconLoader::global()->loadIcon( "personal", KIconLoader::Small );
 
-  mKey = 'A' + a.preferredEmail();
+  mName = mAddressee.realName();
+  mKey = mAddressee.realName() + '|' + mEmail;
+
+  mTooltip = "<qt>";
+  if ( !mAddressee.realName().isEmpty() ) {
+    mTooltip += mAddressee.realName() + "<br/>";
+  }
+  mTooltip += "<b>" + mEmail + "</b>";
 }
 
 QPixmap RecipientItem::icon() const
@@ -104,103 +129,81 @@
 
 QString RecipientItem::name() const
 {
-#ifdef KDEPIM_NEW_DISTRLISTS
-  if ( !mAddressee.isEmpty() ) return mAddressee.realName();
-  else if ( !mDistributionList.isEmpty() ) return mDistributionList.name();
-  else return QString();
-#else
-  if ( !mAddressee.isEmpty() ) return mAddressee.realName();
-  else if ( mDistributionList ) return mDistributionList->name();
-  else return QString();
-#endif
+  return mName;
 }
 
 QString RecipientItem::email() const
 {
-#ifdef KDEPIM_NEW_DISTRLISTS
-  if ( mAddressee.isEmpty() && !mDistributionList.isEmpty() ) {
-    int count = mDistributionList.entries( mAddressBook ).count();
-    return i18np( "1 email address", "%1 email addresses", count );
-  } else {
-    return mEmail;
-  }
-#else
-  if ( mAddressee.isEmpty() &&  mDistributionList ) {
-    int count = mDistributionList->entries().count();
-    return i18np( "1 email address", "%1 email addresses", count );
-  } else {
-    return mEmail;
-  }
-#endif
-  return QString();
+  return mEmail;
 }
 
-#ifdef KDEPIM_NEW_DISTRLISTS
 QString RecipientItem::recipient() const
 {
-  QString r;
-  if ( !mAddressee.isEmpty() ) r = mAddressee.fullEmail( mEmail );
-  else if ( !mDistributionList.isEmpty() ) r = mDistributionList.name();
-  return r;
+  return mRecipient;
 }
-#else
-QString RecipientItem::recipient() const
+
+QString RecipientItem::tooltip() const
 {
-  QString r;
-  if ( !mAddressee.isEmpty() ) r = mAddressee.fullEmail( mEmail );
-  else if ( mDistributionList ) r = mDistributionList->name();
-  return r;
+  return mTooltip;
 }
+
+#ifdef KDEPIM_NEW_DISTRLISTS
+KPIM::DistributionList& RecipientItem::distributionList() {
+  return mDistributionList;
+}
+#else
+KABC::DistributionList * RecipientItem::distributionList() {
+  return mDistributionList;
+}
 #endif
 
-QString RecipientItem::toolTip() const
+#ifdef KDEPIM_NEW_DISTRLISTS
+QString RecipientItem::createTooltip( KPIM::DistributionList &distributionList ) const
 {
   QString txt = "<qt>";
 
-  if ( !mAddressee.isEmpty() ) {
-    if ( !mAddressee.realName().isEmpty() ) {
-      txt += mAddressee.realName() + "<br/>";
-    }
-    txt += "<b>" + mEmail + "</b>";
-#ifdef KDEPIM_NEW_DISTRLISTS
-  } else if ( !mDistributionList.isEmpty() ) {
-    txt += "<b>" + i18n( "Distribution List %1", mDistributionList.name() ) + "</b>";
-    txt += "<ul>";
-    KPIM::DistributionList::Entry::List entries = mDistributionList.entries( mAddressBook );
-    KPIM::DistributionList::Entry::List::ConstIterator it;
-    for( it = entries.begin(); it != entries.end(); ++it ) {
-      txt += "<li>";
-      txt += (*it).addressee.realName() + ' ';
-      txt += "<em>";
-      if ( (*it).email.isEmpty() ) txt += (*it).addressee.preferredEmail();
-      else txt += (*it).email;
-      txt += "</em>";
-      txt += "<li/>";
-    }
-    txt += "</ul>";
+  txt += "<b>" + i18n( "Distribution List %1", distributionList.name() ) + "</b>";
+  txt += "<ul>";
+  KPIM::DistributionList::Entry::List entries = distributionList.entries( mAddressBook );
+  KPIM::DistributionList::Entry::List::ConstIterator it;
+  for( it = entries.begin(); it != entries.end(); ++it ) {
+    txt += "<li>";
+    txt += (*it).addressee.realName() + ' ';
+    txt += "<em>";
+    if ( (*it).email.isEmpty() ) txt += (*it).addressee.preferredEmail();
+    else txt += (*it).email;
+    txt += "</em>";
+    txt += "<li/>";
   }
+  txt += "</ul>";
+  txt += "</qt>";
+
+  return txt;
+}
 #else
-  } else if ( mDistributionList ) {
-    txt += "<b>" + i18n("Distribution List %1",
-        mDistributionList->name() ) + "</b>";
-    txt += "<ul>";
-    KABC::DistributionList::Entry::List entries = mDistributionList->entries();
-    KABC::DistributionList::Entry::List::ConstIterator it;
-    for( it = entries.begin(); it != entries.end(); ++it ) {
-      txt += "<li>";
-      txt += (*it).addressee().realName() + ' ';
-      txt += "<em>";
-      if ( (*it).email().isEmpty() ) txt += (*it).addressee().preferredEmail();
-      else txt += (*it).email();
-      txt += "</em>";
-      txt += "</li>";
-    }
-    txt += "</ul>";
+QString RecipientItem::createTooltip( KABC::DistributionList *distributionList ) const
+{
+  QString txt = "<qt>";
+
+  txt += "<b>" + i18n("Distribution List %1", distributionList->name() ) + "</b>";
+  txt += "<ul>";
+  KABC::DistributionList::Entry::List entries = distributionList->entries();
+  KABC::DistributionList::Entry::List::ConstIterator it;
+  for( it = entries.begin(); it != entries.end(); ++it ) {
+    txt += "<li>";
+    txt += (*it).addressee().realName() + ' ';
+    txt += "<em>";
+    if ( (*it).email().isEmpty() ) txt += (*it).addressee().preferredEmail();
+    else txt += (*it).email();
+    txt += "</em>";
+    txt += "</li>";
   }
-#endif
+  txt += "</ul>";
+  txt += "</qt>";
 
   return txt;
 }
+#endif
 
 void RecipientItem::setRecipientType( const QString &type )
 {
@@ -212,7 +215,6 @@
   return mType;
 }
 
-
 RecipientViewItem::RecipientViewItem( RecipientItem *item, QTreeWidget *listView )
   : QTreeWidgetItem( listView ), mRecipientItem( item )
 {
@@ -230,13 +232,24 @@
 
 RecipientsCollection::RecipientsCollection()
 {
+  mIsReferenceContainer = false;
 }
 
 RecipientsCollection::~RecipientsCollection()
 {
-  clear();
+  deleteAll();
 }
 
+void RecipientsCollection::setReferenceContainer( bool isReferenceContainer )
+{
+  mIsReferenceContainer = isReferenceContainer;
+}
+
+bool RecipientsCollection::isReferenceContainer()
+{
+  return mIsReferenceContainer;
+}
+
 void RecipientsCollection::setTitle( const QString &title )
 {
   mTitle = title;
@@ -249,14 +262,12 @@
 
 void RecipientsCollection::addItem( RecipientItem *item )
 {
-  mItems.append( item );
-
   mKeyMap.insert( item->key(), item );
 }
 
 RecipientItem::List RecipientsCollection::items() const
 {
-  return mItems;
+  return mKeyMap.values();
 }
 
 bool RecipientsCollection::hasEquivalentItem( RecipientItem *item ) const
@@ -264,6 +275,15 @@
   return mKeyMap.find( item->key() ) != mKeyMap.end();
 }
 
+RecipientItem * RecipientsCollection::getEquivalentItem( RecipientItem *item) const
+{
+  QMap<QString, RecipientItem *>::ConstIterator it;
+  it = mKeyMap.find( item->key() );
+  if ( it == mKeyMap.end() )
+    return 0;
+  return (*it);
+}
+
 void RecipientsCollection::clear()
 {
   mKeyMap.clear();
@@ -271,9 +291,11 @@
 
 void RecipientsCollection::deleteAll()
 {
-  QMap<QString, RecipientItem *>::ConstIterator it;
-  for( it = mKeyMap.begin(); it != mKeyMap.end(); ++it ) {
-    delete *it;
+  if ( !isReferenceContainer() ) {
+    QMap<QString, RecipientItem *>::ConstIterator it;
+    for( it = mKeyMap.begin(); it != mKeyMap.end(); ++it ) {
+      delete *it;
+    }
   }
   clear();
 }
@@ -319,10 +341,8 @@
 
   mCollectionCombo = new QComboBox( this );
   resLayout->addWidget( mCollectionCombo );
-  resLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding));
+  resLayout->addItem( new QSpacerItem(1, 1, QSizePolicy::Expanding) );
 
-  connect( mCollectionCombo, SIGNAL( highlighted( int ) ),
-    SLOT( updateList() ) );
   connect( mCollectionCombo, SIGNAL( activated( int ) ),
     SLOT( updateList() ) );
 
@@ -404,8 +424,6 @@
 {
   writeConfig();
 
-  mAllRecipients->deleteAll();
-
   QMap<int,RecipientsCollection *>::ConstIterator it;
   for( it = mCollectionMap.begin(); it != mCollectionMap.end(); ++it ) {
     delete *it;
@@ -415,18 +433,22 @@
 void RecipientsPicker::initCollections()
 {
   mAllRecipients = new RecipientsCollection;
+  mAllRecipients->setReferenceContainer( true );
   mAllRecipients->setTitle( i18n("All") );
-  insertCollection( mAllRecipients );
 
-  insertAddressBook( mAddressBook );
+  mDistributionLists = new RecipientsCollection;
+  mDistributionLists->setTitle( i18n("Distribution Lists") );
 
-  insertDistributionLists();
+  mSelectedRecipients = new RecipientsCollection;
+  mSelectedRecipients->setTitle( i18n("Selected Recipients") );
 
+  insertCollection( mAllRecipients );
+  insertAddressBook( mAddressBook );
+  insertCollection( mDistributionLists );
   insertRecentAddresses();
+  insertCollection( mSelectedRecipients );
 
-  mSelectedRecipients = new RecipientsCollection;
-  mSelectedRecipients->setTitle( i18n("Selected Recipients") );
-  insertCollection( mSelectedRecipients );
+  rebuildAllRecipientsList();
 }
 
 void RecipientsPicker::insertAddressBook( KABC::AddressBook *addressbook )
@@ -454,12 +476,13 @@
       RecipientItem *item = new RecipientItem;
 #endif
       item->setAddressee( *it, *it3 );
-      mAllRecipients->addItem( item );
 
       QMap<KABC::Resource *,RecipientsCollection *>::ConstIterator collIt;
       collIt = collectionMap.find( it->resource() );
       if ( collIt != collectionMap.end() ) {
         (*collIt)->addItem( item );
+      } else {
+        kDebug(5006) << "Collection for resource not found. shouldn't happen";
       }
 
       QStringList categories = (*it).categories();
@@ -470,6 +493,7 @@
         RecipientsCollection *collection;
         if ( catMapIt == categoryMap.end() ) {
           collection = new RecipientsCollection;
+          collection->setReferenceContainer( true );
           collection->setTitle( *catIt );
           categoryMap.insert( *catIt, collection );
         } else {
@@ -490,33 +514,31 @@
     insertCollection( *it3 );
   }
 
+  insertDistributionLists();
+  rebuildAllRecipientsList();
   updateList();
 }
 
 void RecipientsPicker::insertDistributionLists()
 {
-  RecipientsCollection *collection = new RecipientsCollection;
-  collection->setTitle( i18n("Distribution Lists") );
+  mDistributionLists->deleteAll();
 
 #ifdef KDEPIM_NEW_DISTRLISTS
   QList<KPIM::DistributionList> lists = KPIM::DistributionList::allDistributionLists( mAddressBook );
   for ( int i = 0; i < lists.count(); ++i ) {
     RecipientItem *item = new RecipientItem( mAddressBook );
     item->setDistributionList( lists[ i ] );
-    mAllRecipients->addItem( item );
-    collection->addItem( item );
+    mDistributionLists->addItem( item );
   }
 #else
   QList<KABC::DistributionList*> lists = mAddressBook->allDistributionLists();
   foreach ( KABC::DistributionList *list, lists ) {
     RecipientItem *item = new RecipientItem;
     item->setDistributionList( list );
-    mAllRecipients->addItem( item );
-    collection->addItem( item );
+    mDistributionLists->addItem( item );
   }
 #endif
 
-  insertCollection( collection );
 }
 
 void RecipientsPicker::insertRecentAddresses()
@@ -536,9 +558,6 @@
     RecipientItem *item = new RecipientItem;
 #endif
     item->setAddressee( *it, (*it).preferredEmail() );
-    if ( !mAllRecipients->hasEquivalentItem( item ) ) {
-      mAllRecipients->addItem( item );
-    }
     collection->addItem( item );
   }
 
@@ -547,11 +566,17 @@
 
 void RecipientsPicker::insertCollection( RecipientsCollection *coll )
 {
-  int index = mCollectionMap.count();
+  int index = 0;
+  QMap<int,RecipientsCollection *>::ConstIterator it;
+  for (it = mCollectionMap.begin(); it != mCollectionMap.end(); ++it) {
+    if ( (*it)->title() == coll->title() ) {
+      delete *it;
+      mCollectionMap.replace( index, coll );
+      return;
+    }
+    index++;
+  }
 
-  kDebug(5006) <<"RecipientsPicker::insertCollection()" << coll->title()
-    << "index:" << index;
-
   mCollectionCombo->insertItem( index, coll->title() );
   mCollectionMap.insert( index, coll );
 }
@@ -570,27 +595,37 @@
 
 void RecipientsPicker::setRecipients( const Recipient::List &recipients )
 {
-  RecipientItem::List allRecipients = mAllRecipients->items();
-  RecipientItem::List::ConstIterator itAll;
-  for( itAll = allRecipients.begin(); itAll != allRecipients.end(); ++itAll ) {
-    (*itAll)->setRecipientType( QString() );
-  }
+  mSelectedRecipients->deleteAll();
 
-  mSelectedRecipients->clear();
-
   Recipient::List::ConstIterator it;
   for( it = recipients.begin(); it != recipients.end(); ++it ) {
     RecipientItem *item = 0;
-    for( itAll = allRecipients.begin(); itAll != allRecipients.end(); ++itAll ) {
-      if ( (*itAll)->recipient() == (*it).email() ) {
-        (*itAll)->setRecipientType( (*it).typeLabel() );
-        item = *itAll;
+
+    // if recipient is a distribution list, create
+    // a detached copy.
+    RecipientItem::List items = mDistributionLists->items();
+    RecipientItem::List::ConstIterator distIt;
+#ifdef KDEPIM_NEW_DISTRLISTS
+    for ( distIt = items.begin(); distIt != items.end(); ++distIt ) {
+      if ( (*it).email() == (*distIt)->name() ) {
+        item = new RecipientItem( mAddressBook );
+        item->setDistributionList( (*distIt)->distributionList() );
       }
     }
+#else
+    for ( distIt = items.begin(); distIt != items.end(); ++distIt ) {
+      if ( (*it).email() == (*distIt)->name() ) {
+        item = new RecipientItem();
+        item->setDistributionList( (*distIt)->distributionList() );
+      }
+    }
+#endif
+
     if ( !item ) {
       KABC::Addressee a;
       QString name;
       QString email;
+
       KABC::Addressee::parseEmailAddress( (*it).email(), name, email );
       a.setNameFromString( name );
       a.insertEmail( email );
@@ -601,9 +636,9 @@
       item = new RecipientItem;
 #endif
       item->setAddressee( a, a.preferredEmail() );
-      item->setRecipientType( (*it).typeLabel() );
-      mAllRecipients->addItem( item );
     }
+
+    item->setRecipientType( (*it).typeLabel() );
     mSelectedRecipients->addItem( item );
   }
 
@@ -612,7 +647,6 @@
 
 void RecipientsPicker::setDefaultButton( QPushButton *button )
 {
-//  button->setText( "<qt><b>" + button->text() + "</b></qt>" );
   button->setDefault( true );
 }
 
@@ -624,6 +658,27 @@
   mBccButton->setDefault( type == Recipient::Bcc );
 }
 
+void RecipientsPicker::rebuildAllRecipientsList()
+{
+  mAllRecipients->clear();
+
+  QMap<int,RecipientsCollection *>::ConstIterator it;
+  for( it = mCollectionMap.begin(); it != mCollectionMap.end(); ++it ) {
+    // skip self
+    if ( (*it) == mAllRecipients )
+      continue;
+
+    kDebug(5006) << "processing collection" << (*it)->title();
+
+    RecipientItem::List coll = (*it)->items();
+
+    RecipientItem::List::ConstIterator rcptIt;
+    for ( rcptIt = coll.begin(); rcptIt != coll.end(); ++rcptIt ) {
+      mAllRecipients->addItem( *rcptIt );
+    }
+  }
+}
+
 void RecipientsPicker::updateList()
 {
   mRecipientList->clear();
@@ -633,9 +688,17 @@
   RecipientItem::List items = coll->items();
   RecipientItem::List::ConstIterator it;
   for( it = items.begin(); it != items.end(); ++it ) {
+    if ( coll != mSelectedRecipients ) {
+      RecipientItem *selItem = mSelectedRecipients->getEquivalentItem(*it);
+      if (selItem) {
+        (*it)->setRecipientType( selItem->recipientType() );
+      } else {
+        (*it)->setRecipientType( QString() );
+      }
+    }
     RecipientViewItem *newItem = new RecipientViewItem( *it, mRecipientList );
     for ( int i = 0; i < mRecipientList->columnCount(); i++ )
-      newItem->setToolTip( i, newItem->recipientItem()->toolTip() );
+      newItem->setToolTip( i, newItem->recipientItem()->tooltip() );
     mRecipientList->addTopLevelItem( newItem );
   }
 


_______________________________________________
KDE PIM mailing list kde-pim@kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
KDE PIM home page at http://pim.kde.org/

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic