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

List:       kde-commits
Subject:    playground/pim/mailody
From:       Tom Albers <tomalbers () kde ! nl>
Date:       2006-11-12 1:50:10
Message-ID: 1163296210.438679.11411.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 604222 by toma:

- add a size column
- basic support for threading of messages, works quite well, but probably still a lot to do


 M  +1 -2      TODO  
 M  +30 -0     src/headerlistview.cpp  
 M  +14 -3     src/headerlistview.h  
 M  +22 -8     src/imap.cpp  
 M  +35 -1     src/mainwindow.cpp  
 M  +13 -1     src/messagedata.cpp  
 M  +13 -1     src/messagedata.h  


--- trunk/playground/pim/mailody/TODO #604221:604222
@@ -7,7 +7,7 @@
 
 Notifications:
 dont show the popup when it is the current mailbox [allee]
-make an area clickable to go to that mailbox
+make an area clickable to go to that mailbox [allee]
 
 -----------------------------------
 
@@ -30,7 +30,6 @@
 go back to last visted header [allee]
 go to next unread [fdoving]
 make keys configurable for nex/previous [fdoving]
-size column [allee]
 on resync(slotFetchMailBox()) save uid and reselect that one [allee]
 select all [allee]
 
--- trunk/playground/pim/mailody/src/headerlistview.cpp #604221:604222
@@ -34,12 +34,17 @@
     addColumn( i18n("Subject"), 150 );
     addColumn( i18n("Sender"), 150 );
     addColumn( i18n("Date"), 150 );
+    addColumn( i18n("Size"), 150 );
     setColumnWidthMode(0, QListView::Manual);
     setColumnWidthMode(1, QListView::Manual);
+    setColumnWidthMode(2, QListView::Manual);
+    setColumnWidthMode(3, QListView::Manual);
     setSorting(2);
+    setColumnAlignment(3, Qt::AlignRight);
     setAllColumnsShowFocus(true);
     setSelectionMode(QListView::Extended);
     setDragEnabled(true);
+    setRootIsDecorated(true);
 }
 
 QDragObject *HeaderListView::dragObject()
@@ -124,9 +129,23 @@
     setText(0, msg->subject() );
     setText(1, msg->sender() );
     setText(2, msg->vDate() );
+    setText(3, msg->vSize() );
     setDragEnabled(true);
 }
 
+HeaderListViewItem::HeaderListViewItem( HeaderListViewItem* parent,
+                                        MessageData* msg)
+    : KListViewItem( parent )
+{
+    m_msg = msg;
+    setText(0, msg->subject() );
+    setText(1, msg->sender() );
+    setText(2, msg->vDate() );
+    setText(3, msg->vSize() );
+    setDragEnabled(true);
+}
+
+
 HeaderListViewItem::~HeaderListViewItem()
 {
 }
@@ -204,6 +223,17 @@
         else
             return -1;
     }
+    else if (col == 3)
+    {
+        int one = m_msg->size();
+        int two = t->msg()->size();
+        if (one == two)
+            return 0;
+        else if (one > two)
+            return 1;
+        else
+            return -1;
+    }
     else
         return key( col, ascending ).lower()
                 .compare( i->key( col, ascending).lower() );
--- trunk/playground/pim/mailody/src/headerlistview.h #604221:604222
@@ -39,6 +39,7 @@
     public:
         /** Constructor */
         explicit HeaderListView( QWidget* );
+
         /** dragobject */
         QDragObject *dragObject();
 
@@ -78,11 +79,21 @@
          * @param md The message which this headerlistviewitem should be
          *           created for
          */
-        HeaderListViewItem( KListView* lv, MessageData* md);
+        explicit HeaderListViewItem( KListView* lv, MessageData* md);
 
         /**
-        * Destructor
-        */
+         * Constructor
+         * @param lvi The headerlistviewitem to which this item should be
+         *           a child.
+         * @param md The message which this headerlistviewitem should be
+         *           created for
+         */
+        explicit HeaderListViewItem( HeaderListViewItem* lvi,
+                                     MessageData* msg);
+
+        /**
+         * Destructor
+         */
         ~HeaderListViewItem();
 
         /**
--- trunk/playground/pim/mailody/src/imap.cpp #604221:604222
@@ -395,9 +395,11 @@
 
         QRegExp rx;
         if (m_currentQueueItem.state() == Queue::GetHeaders)
-            rx.setPattern("UID (\\d*)" + QRegExp::escape(" BODY[HEADER.FIELDS ")
+            rx.setPattern("UID (\\d*) RFC822.SIZE (\\d*)"
+                    + QRegExp::escape(" BODY[HEADER.FIELDS ")
                     + "\\(\"?FROM\"? \"?TO\"? \"?CC\"? "
-                    + "\"?SUBJECT\"? \"?DATE\"?\\)\\] "
+                    + "\"?SUBJECT\"? \"?DATE\"? \"?IN-REPLY-TO\"? "
+                    + "\"?MESSAGE-ID\"?\\)\\] "
                     + QRegExp::escape("{") + "(\\d*)" + QRegExp::escape("}"));
         else
             rx.setPattern("UID (\\d*)" + QRegExp::escape(" BODY[] ")
@@ -409,17 +411,28 @@
         while (rx.search(r.stripWhiteSpace()) != -1)
         {
             int uid = rx.cap(1).toInt();
-            int expectedLength = rx.cap(2).toInt();
 
+            QString size;
+            int expectedLength;
+            if (m_currentQueueItem.state() == Queue::GetHeaders)
+            {
+                size = "Size: " + rx.cap(2);
+                expectedLength = rx.cap(3).toInt();
+            }
+            else
+                expectedLength = rx.cap(2).toInt();
+
             int i = r.find("}")+1;
             QString text = r.mid(i, expectedLength);
 
             if (m_currentQueueItem.state() == Queue::GetHeaders)
             {
-                // kdDebug() << "UID: " << uid
-                //   << " mb: " << m_currentQueueItem.mailbox()
-                //   << "text" << text
-                //   << endl;
+                text += size;
+                kdDebug() << "UID: " << uid
+                  << " mb: " << m_currentQueueItem.mailbox()
+                  << "text" << text
+                  << endl;
+
                 headersToSend.append(rx.cap(1));
                 headersToSend.append(m_currentQueueItem.mailbox());
                 headersToSend.append(text);
@@ -613,7 +626,8 @@
         // Priority; above the checkmail calls in the queue.
         m_queue.prepend(Queue(Queue::GetHeaders, mb,
                    "UID FETCH " + part
-           + " (BODY.PEEK[HEADER.FIELDS (FROM TO CC SUBJECT DATE)])"));
+           + " (RFC822.SIZE BODY.PEEK[HEADER.FIELDS (FROM TO CC SUBJECT "
+                           "DATE IN-REPLY-TO MESSAGE-ID)])"));
     }
 }
 
--- trunk/playground/pim/mailody/src/mainwindow.cpp #604221:604222
@@ -491,6 +491,7 @@
 
     QStringList::ConstIterator it = values.begin();
 
+    QMap<QString, HeaderListViewItem*> threadMap;
     while (it != values.end())
     {
         int uid = (*it).toInt();
@@ -506,11 +507,44 @@
         if (!exists ||  mbi->fullName() == "All")
         {
             MessageData* r = new MessageData(this, "message", uid, mb, headers);
-            exists = new HeaderListViewItem(m_headerList, r);
+            HeaderListViewItem* threadTo = threadMap[r->inreplyto()];
+            if (!threadTo || r->inreplyto().isEmpty())
+                exists = new HeaderListViewItem(m_headerList, r);
+            else
+                exists = new HeaderListViewItem(threadTo, r);
+            threadMap[r->messageID()] = exists;
             m_headerMap[uid] = exists;
         }
     }
 
+    // Well, all message are now shown, and if there was a relation
+    // they are already there. But, maybe some of the items ahve childeren
+    // now all messages are known.
+    kdDebug() << "reparanting start " << endl;
+
+    if (m_headerList->childCount() > 200)
+        kdDebug() << " Aborted, to many items... " << endl;
+    else
+    {
+    int items=0;
+    int items2=0;
+    HeaderListViewItem* item =
+            (HeaderListViewItem*)m_headerList->firstChild();
+    while( item )
+    {
+        HeaderListViewItem* i = threadMap[item->msg()->inreplyto()];
+        if (i != 0 && !i->msg()->inreplyto().isEmpty())
+        {
+            items++;
+            m_headerList->takeItem(item);
+            i->insertItem(item);
+        }
+        item = (HeaderListViewItem*)item->nextSibling();
+        items2++;
+    }
+    kdDebug() << "reparanting end, usefull for " << items
+            << " of " << items2 << endl;
+    }
     // kdDebug() << "Messages shown: " << m_headerList->childCount() << endl;
 
     // scroll down as long as we do not store the last selected mail.
--- trunk/playground/pim/mailody/src/messagedata.cpp #604221:604222
@@ -93,8 +93,20 @@
     QStringList::iterator it;
     for (it = headerlist.begin(); it != headerlist.end(); ++it)
     {
-        if ((*it).startsWith("Subject", false))
+        if ((*it).startsWith("Size", false))
         {
+            m_size = (*it).section(' ',1).stripWhiteSpace().toInt();
+        }
+        else if ((*it).startsWith("Message-Id", false))
+        {
+            m_messageID = (*it).section(' ',1).stripWhiteSpace();
+        }
+        else if ((*it).startsWith("In-Reply-To", false))
+        {
+            m_inreplyto = (*it).section(' ',1).stripWhiteSpace();
+        }
+        else if ((*it).startsWith("Subject", false))
+        {
             const char* usedCS;
             QString t = (*it).section(' ',1).stripWhiteSpace();
             m_subject =
--- trunk/playground/pim/mailody/src/messagedata.h #604221:604222
@@ -27,8 +27,8 @@
 
 #include <kglobal.h>
 #include <klocale.h>
+#include <kio/job.h>
 
-
 class QStrList;
 class QListViewItem;
 
@@ -97,6 +97,16 @@
     /** Returns the to header of the message, all recepients */
     QString to() const              { return m_to;   }
 
+    /** Returns the size of message */
+    int size() const                { return m_size;   }
+
+    /** Returns the size of message for the user */
+    QString vSize() const           { return
+                        KIO::convertSize(KIO::filesize_t(m_size));   }
+
+    /** Returns id of the message where this is a reply to */
+    QString inreplyto() const       { return m_inreplyto;   }
+
     /** Returns the cc header of the message, all recepients */
     QString cc() const              { return m_cc;   }
 
@@ -181,6 +191,8 @@
     QString     m_sender_full;
     QString     m_company;
     QString     m_cc;
+    int         m_size;
+    QString     m_inreplyto;
     QStringList* m_cc_addresses;
     QString     m_to;
     QStringList* m_to_addresses;
[prev in list] [next in list] [prev in thread] [next in thread] 

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