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

List:       kmail-devel
Subject:    Re: [PATCH] attachment column
From:       Carsten Burghardt <burghardt () kde ! org>
Date:       2004-02-25 18:34:24
Message-ID: 200402251934.25125.burghardt () kde ! org
[Download RAW message or body]

On Sunday 22 February 2004 17:01, Ingo Klöcker wrote:
> On Sunday 22 February 2004 14:44, Carsten Burghardt wrote:
> > Hi,
> >
> > the attached patch adds a new column that shows if the email has an
> > attachment. You can add that column with a right-click on the
> > header-column or via the configuration. It also cleans up the column
> > code a bit. I had to comment out two sections in kmheaders.cpp that
> > overwrite the columnheader and therefore delete the attachment icon
> > that is shown. I didn't encounter any drawbacks, perhaps these two
> > parts are not needed?
>
> Without having looked at the patch I wonder why we need an extra column
> for this while we don't need one for all the other status icons. (Some
> people will disagree that we don't need an extra column.)
>
> I'd like to see the normal message icons being overlayed with a paper
> clip in case the message has an attachment. This way the information
> would not occupy any additional space (which is important for people
> with small displays).

Attached is an adapted patch that shows the attachment icon along with the 
other icons.


Carsten

["attachment_column.diff" (text/x-diff)]

? libkdenetwork/libgpg-error-copy/code-from-errno.h
? libkdenetwork/libgpg-error-copy/code-to-errno.h
? libkdenetwork/libgpg-error-copy/err-codes.h
? libkdenetwork/libgpg-error-copy/err-sources.h
? libkdenetwork/libgpgme-copy/assuan/assuan-errors.c
? kmail/folderstorage.loT
? kmail/globalsettings.cpp
? kmail/globalsettings.h
? kmail/pics/kmmsgattachment.png
Index: libkdenetwork/kfoldertree.h
===================================================================
RCS file: /home/kde/kdepim/libkdenetwork/kfoldertree.h,v
retrieving revision 1.16
diff -u -3 -p -r1.16 kfoldertree.h
--- libkdenetwork/kfoldertree.h	20 Feb 2004 21:57:17 -0000	1.16
+++ libkdenetwork/kfoldertree.h	25 Feb 2004 18:24:36 -0000
@@ -50,6 +50,7 @@ struct KPaintInfo {
   int dateCol;
   int sizeCol;
   bool showCryptoIcons;
+  bool showAttachmentIcon;
 };
 
 //==========================================================================
Index: kmail/configuredialog.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/configuredialog.cpp,v
retrieving revision 1.416
diff -u -3 -p -r1.416 configuredialog.cpp
--- kmail/configuredialog.cpp	23 Feb 2004 09:08:27 -0000	1.416
+++ kmail/configuredialog.cpp	25 Feb 2004 18:24:40 -0000
@@ -1912,11 +1912,15 @@ AppearancePageHeadersTab::AppearancePage
 
   mCryptoIconsCheck = new QCheckBox( i18n( "Show crypto &icons" ), group );
 
+  mAttachmentCheck = new QCheckBox( i18n("&Display attachment icon"), group );
+
   mNestedMessagesCheck =
     new QCheckBox( i18n("&Thread list of message headers"), group );
 
   connect( mMessageSizeCheck, SIGNAL( stateChanged( int ) ),
            this, SLOT( slotEmitChanged( void ) ) );
+  connect( mAttachmentCheck, SIGNAL( stateChanged( int ) ),
+           this, SLOT( slotEmitChanged( void ) ) );
   connect( mCryptoIconsCheck, SIGNAL( stateChanged( int ) ),
            this, SLOT( slotEmitChanged( void ) ) );
   connect( mNestedMessagesCheck, SIGNAL( stateChanged( int ) ),
@@ -2017,6 +2021,7 @@ void AppearancePage::HeadersTab::load() 
   mNestedMessagesCheck->setChecked( geometry.readBoolEntry( "nestedMessages", false \
) );  mMessageSizeCheck->setChecked( general.readBoolEntry( "showMessageSize", false \
) );  mCryptoIconsCheck->setChecked( general.readBoolEntry( "showCryptoIcons", false \
) ); +  mAttachmentCheck->setChecked( general.readBoolEntry( "showAttachmentIcon", \
true ) );  
   // "Message Header Threading Options":
   int num = geometry.readNumEntry( "nestingPolicy", 3 );
@@ -2056,6 +2061,8 @@ void AppearancePage::HeadersTab::install
 
   if( general.hasKey( "showCryptoIcons" ) )
     mCryptoIconsCheck->setChecked( general.readBoolEntry( "showCryptoIcons" ) );
+  if ( general.hasKey( "showAttachmentIcon" ) )
+    mAttachmentCheck->setChecked( general.readBoolEntry( "showAttachmentIcon" ) );
 
   if ( geometry.hasKey( "nestingPolicy" ) ) {
     int num = geometry.readNumEntry( "nestingPolicy" );
@@ -2094,6 +2101,7 @@ void AppearancePage::HeadersTab::save() 
 		       mNestingPolicy->id( mNestingPolicy->selected() ) );
   general.writeEntry( "showMessageSize", mMessageSizeCheck->isChecked() );
   general.writeEntry( "showCryptoIcons", mCryptoIconsCheck->isChecked() );
+  general.writeEntry( "showAttachmentIcon", mAttachmentCheck->isChecked() );
 
   int dateDisplayID = mDateDisplay->id( mDateDisplay->selected() );
   // check bounds:
Index: kmail/configuredialog_p.h
===================================================================
RCS file: /home/kde/kdepim/kmail/configuredialog_p.h,v
retrieving revision 1.75
diff -u -3 -p -r1.75 configuredialog_p.h
--- kmail/configuredialog_p.h	22 Feb 2004 16:23:17 -0000	1.75
+++ kmail/configuredialog_p.h	25 Feb 2004 18:24:40 -0000
@@ -459,6 +459,7 @@ protected: // methods
 
 protected: // data
   QCheckBox    *mMessageSizeCheck;
+  QCheckBox    *mAttachmentCheck;
   QCheckBox    *mNestedMessagesCheck;
   QCheckBox    *mCryptoIconsCheck;
   QButtonGroup *mNestingPolicy;
Index: kmail/imapjob.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/imapjob.cpp,v
retrieving revision 1.49
diff -u -3 -p -r1.49 imapjob.cpp
--- kmail/imapjob.cpp	22 Feb 2004 23:17:38 -0000	1.49
+++ kmail/imapjob.cpp	25 Feb 2004 18:24:40 -0000
@@ -324,20 +324,24 @@ void ImapJob::slotGetMessageResult( KIO:
         if ( size > 0 && mPartSpecifier.isEmpty() )
           (*it).done = size;
         ulong uid = msg->UID();
+        // must set this first so that msg->fromByteArray sets the attachment status
+        if ( mPartSpecifier.isEmpty() ) 
+          msg->setComplete( true );
+        else
+          msg->setReadyToShow( false );
+
         msg->fromByteArray( (*it).data );
         // reconstruct as it may be overwritten above
         msg->setUID(uid);
         if ( size > 0 && msg->msgSizeServer() == 0 ) 
           msg->setMsgSizeServer(size);
 
-        if ( mPartSpecifier.isEmpty() ) 
-          msg->setComplete( true );
-        else
-          msg->setReadyToShow( false );
       } else {
         // Update the body of the retrieved part (the message notifies all \
observers)  msg->updateBodyPart( mPartSpecifier, (*it).data );
         msg->setReadyToShow( true );
+        if (msg->attachmentState() != KMMsgHasAttachment)
+          msg->updateAttachmentState();
       }
     } else {
       kdDebug(5006) << "ImapJob::slotGetMessageResult - got no data for " << \
                mPartSpecifier << endl;
Index: kmail/kmfolderimap.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmfolderimap.cpp,v
retrieving revision 1.175
diff -u -3 -p -r1.175 kmfolderimap.cpp
--- kmail/kmfolderimap.cpp	24 Feb 2004 10:14:37 -0000	1.175
+++ kmail/kmfolderimap.cpp	25 Feb 2004 18:24:41 -0000
@@ -912,7 +912,8 @@ void KMFolderImap::slotListFolderEntries
       else if ((*eIt).m_uds == KIO::UDS_ACCESS)
         flags = (*eIt).m_long;
     }
-    if (mimeType == "message/rfc822-imap" && !(flags & 8))
+    if ((mimeType == "message/rfc822-imap" || mimeType == "message/rfc822") && 
+        !(flags & 8))
       (*it).items.append(name + "," + QString::number(flags));
   }
 }
@@ -1061,7 +1062,9 @@ KMFolderImap::doCreateJob( KMMessage *ms
        mAccount && mAccount->loadOnDemand() &&
        ( msg->msgSizeServer() > 5000 || msg->msgSizeServer() == 0 ) &&
        ( msg->signatureState() == KMMsgNotSigned || 
-         msg->signatureState() == KMMsgSignatureStateUnknown ) )
+         msg->signatureState() == KMMsgSignatureStateUnknown ) &&
+       ( msg->encryptionState() == KMMsgNotEncrypted || 
+         msg->encryptionState() == KMMsgEncryptionStateUnknown ) )
   {
     // load-on-demand: retrieve the BODYSTRUCTURE and to speed things up also the \
headers  // this is not activated for small or signed messages
Index: kmail/kmheaders.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmheaders.cpp,v
retrieving revision 1.615
diff -u -3 -p -r1.615 kmheaders.cpp
--- kmail/kmheaders.cpp	22 Feb 2004 22:53:46 -0000	1.615
+++ kmail/kmheaders.cpp	25 Feb 2004 18:24:42 -0000
@@ -71,6 +71,7 @@ QPixmap* KMHeaders::pixPartiallyEncrypte
 QPixmap* KMHeaders::pixUndefinedEncrypted = 0;
 QPixmap* KMHeaders::pixEncryptionProblematic = 0;
 QPixmap* KMHeaders::pixSignatureProblematic = 0;
+QPixmap* KMHeaders::pixAttachment = 0;
 
 #define KMAIL_SORT_VERSION 1012
 #define KMAIL_SORT_FILE(x) x->indexLocation() + ".sorted"
@@ -334,10 +335,10 @@ public:
 
   const QPixmap * pixmap( int col) const
   {
-    if(!col) {
-      KMHeaders *headers = static_cast<KMHeaders*>(listView());
-      KMMsgBase *mMsgBase = headers->folder()->getMsgBase( mMsgId );
+    KMHeaders *headers = static_cast<KMHeaders*>(listView());
+    KMMsgBase *mMsgBase = headers->folder()->getMsgBase( mMsgId );
 
+    if(!col) {
       PixmapList pixmaps;
 
       // Have the spam/ham and watched/ignored icons first, I guess.
@@ -376,11 +377,15 @@ public:
           else if( mMsgBase->signatureState() == KMMsgSignatureProblematic )
               pixmaps << *KMHeaders::pixSignatureProblematic;
       }
+      // Only merge the attachment icon in if that is configured.
+      if( headers->paintInfo()->showAttachmentIcon && 
+          mMsgBase->attachmentState() == KMMsgHasAttachment ) 
+        pixmaps << *KMHeaders::pixAttachment;
 
       static QPixmap mergedpix;
       mergedpix = pixmapMerge( pixmaps );
       return &mergedpix;
-    }
+    } 
     return 0;
   }
 
@@ -555,35 +560,21 @@ KMHeaders::KMHeaders(KMMainWidget *aOwne
   mPopup = new KPopupMenu(this);
   mPopup->insertTitle(i18n("View Columns"));
   mPopup->setCheckable(true);
-  mSizeColumn = mPopup->insertItem(i18n("Size Column"), this, \
SLOT(slotToggleSizeColumn())); +  mSizeColumn = mPopup->insertItem(i18n("Size"), \
this, SLOT(slotToggleSizeColumn())); +  mPaintInfo.showSize = false;
 
   mPaintInfo.flagCol = -1;
   mPaintInfo.subCol    = mPaintInfo.flagCol   + 1;
   mPaintInfo.senderCol = mPaintInfo.subCol    + 1;
   mPaintInfo.dateCol   = mPaintInfo.senderCol + 1;
-  mPaintInfo.sizeCol   = mPaintInfo.dateCol   + 1;
   mPaintInfo.orderOfArrival = false;
   mPaintInfo.status = false;
   mSortCol = KMMsgList::sfDate;
   mSortDescending = false;
 
-  readConfig();
-  restoreLayout(KMKernel::config(), "Header-Geometry");
   setShowSortIndicator(true);
   setFocusPolicy( WheelFocus );
 
-  addColumn( i18n("Subject"), 310 );
-  addColumn( i18n("Sender"), 170 );
-  addColumn( i18n("Date"), 170 );
-
-  if (mPaintInfo.showSize) {
-    addColumn( i18n("Size"), 80 );
-    setColumnAlignment( mPaintInfo.sizeCol, AlignRight );
-    showingSize = true;
-  } else {
-    showingSize = false;
-  }
-
   if (!pixmapsLoaded)
   {
     pixmapsLoaded = true;
@@ -608,8 +599,16 @@ KMHeaders::KMHeaders(KMMainWidget *aOwne
     pixUndefinedEncrypted = new QPixmap( UserIcon( "kmmsgundefinedencrypted" ) );
     pixEncryptionProblematic = new QPixmap( UserIcon( "kmmsgencryptionproblematic" ) \
                );
     pixSignatureProblematic = new QPixmap( UserIcon( "kmmsgsignatureproblematic" ) \
); +    pixAttachment  = new QPixmap( UserIcon( "kmmsgattachment" ) );
   }
 
+  addColumn( i18n("Subject"), 310 );
+  addColumn( i18n("Sender"), 170 );
+  addColumn( i18n("Date"), 170 );
+
+  readConfig();
+  restoreLayout(KMKernel::config(), "Header-Geometry");
+
   connect( this, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint &, int \
                )),
            this, SLOT( rightButtonPressed( QListViewItem*, const QPoint &, int )));
   connect(this, SIGNAL(doubleClicked(QListViewItem*)),
@@ -648,20 +647,27 @@ bool KMHeaders::eventFilter ( QObject *o
 }
 
 //-----------------------------------------------------------------------------
-void KMHeaders::slotToggleSizeColumn ()
+void KMHeaders::slotToggleSizeColumn(int mode)
 {
-  mPaintInfo.showSize = !mPaintInfo.showSize;
-  mPopup->setItemChecked(mSizeColumn, mPaintInfo.showSize);
+  bool old = mPaintInfo.showSize;
+  if (mode == -1)
+    mPaintInfo.showSize = !mPaintInfo.showSize;
+  else
+    mPaintInfo.showSize = mode;
 
-  // we need to write it back so that
-  // the configure-dialog knows the correct status
-  KConfig* config = KMKernel::config();
-  KConfigGroupSaver saver(config, "General");
-  config->writeEntry("showMessageSize", mPaintInfo.showSize);
+  mPopup->setItemChecked(mSizeColumn, mPaintInfo.showSize);
+  if (mPaintInfo.showSize && !old)
+    mPaintInfo.sizeCol = addColumn(i18n("Size"), 80);
+  else if (!mPaintInfo.showSize && old) {
+    removeColumn(mPaintInfo.sizeCol);
+    mPaintInfo.sizeCol = -1;
+  }
 
-  setFolder(mFolder);
+  if (mode == -1)
+    writeConfig();
 }
 
+
 //-----------------------------------------------------------------------------
 // Support for backing pixmap
 void KMHeaders::paintEmptyArea( QPainter * p, const QRect & rect )
@@ -743,9 +749,12 @@ void KMHeaders::readConfig (void)
 
   { // area for config group "General"
     KConfigGroupSaver saver(config, "General");
-    mPaintInfo.showSize = config->readBoolEntry("showMessageSize");
-    mPopup->setItemChecked(mSizeColumn, mPaintInfo.showSize);
+    bool show = config->readBoolEntry("showMessageSize");
+    mPopup->setItemChecked(mSizeColumn, show);
+    slotToggleSizeColumn(show);
+
     mPaintInfo.showCryptoIcons = config->readBoolEntry( "showCryptoIcons", false );
+    mPaintInfo.showAttachmentIcon = config->readBoolEntry( "showAttachmentIcon", \
true );  
     KMime::DateFormatter::FormatType t =
       (KMime::DateFormatter::FormatType) config->readNumEntry("dateFormat", \
KMime::DateFormatter::Fancy ) ; @@ -860,7 +869,10 @@ void \
KMHeaders::writeFolderConfig (void)  \
//-----------------------------------------------------------------------------  void \
KMHeaders::writeConfig (void)  {
-  saveLayout(KMKernel::config(), "Header-Geometry");
+  KConfig* config = KMKernel::config();
+  saveLayout(config, "Header-Geometry");
+  KConfigGroupSaver saver(config, "General");
+  config->writeEntry("showMessageSize", mPaintInfo.showSize);
 }
 
 //-----------------------------------------------------------------------------
@@ -873,7 +885,7 @@ void KMHeaders::setFolder (KMFolder *aFo
   QString str;
 
   mSortInfo.fakeSort = 0;
-  setColumnText( mSortCol, QIconSet( QPixmap()), columnText( mSortCol ));
+//  setColumnText( mSortCol, QIconSet( QPixmap()), columnText( mSortCol ));
   if (mFolder && mFolder==aFolder) {
     int top = topItemIndex();
     id = currentItemIndex();
@@ -987,27 +999,6 @@ void KMHeaders::setFolder (KMFolder *aFo
     colText = colText + i18n( " (Status)" );
   setColumnText( mPaintInfo.subCol, colText);
 
-
-  if (mFolder) {
-    if (mPaintInfo.showSize) {
-      colText = i18n( "Size" );
-      if (showingSize) {
-        setColumnText( mPaintInfo.sizeCol, colText);
-      } else {
-        // add in the size field
-        addColumn(colText);
-
-        setColumnAlignment( mPaintInfo.sizeCol, AlignRight );
-      }
-      showingSize = true;
-    } else {
-      if (showingSize) {
-        // remove the size field
-        removeColumn(mPaintInfo.sizeCol);
-      }
-      showingSize = false;
-    }
-  }
   END_TIMER(set_folder);
   SHOW_TIMER(set_folder);
 }
@@ -2598,8 +2589,8 @@ void KMHeaders::setOpen( QListViewItem *
 void KMHeaders::setSorting( int column, bool ascending )
 {
   if (column != -1) {
-    if (column != mSortCol)
-      setColumnText( mSortCol, QIconSet( QPixmap()), columnText( mSortCol ));
+//    if (column != mSortCol)
+//      setColumnText( mSortCol, QIconSet( QPixmap()), columnText( mSortCol ));
     if(mSortInfo.dirty || column != mSortInfo.column || ascending != \
                mSortInfo.ascending) { //dirtied
         QObject::disconnect(header(), SIGNAL(clicked(int)), this, \
SLOT(dirtySortOrder(int)));  mSortInfo.dirty = true;
Index: kmail/kmheaders.h
===================================================================
RCS file: /home/kde/kdepim/kmail/kmheaders.h,v
retrieving revision 1.143
diff -u -3 -p -r1.143 kmheaders.h
--- kmail/kmheaders.h	20 Feb 2004 22:11:41 -0000	1.143
+++ kmail/kmheaders.h	25 Feb 2004 18:24:43 -0000
@@ -209,8 +209,9 @@ public slots:
     recursively select its children. */   
   virtual void setSelected(QListViewItem *item, bool selected);
 
-  /** switch size-column */
-  void slotToggleSizeColumn();
+  /** switch size-column 
+      1 for activate, 0 for deactivate, -1 for toggle*/
+  void slotToggleSizeColumn(int mode = -1);
 
   /** Provide information about number of messages in a folder */
   void setFolderInfoStatus();
@@ -221,7 +222,7 @@ protected:
     *pixFullySigned, *pixPartiallySigned, *pixUndefinedSigned,
     *pixFullyEncrypted, *pixPartiallyEncrypted, *pixUndefinedEncrypted,
       *pixFiller, *pixEncryptionProblematic,
-      *pixSignatureProblematic;
+      *pixSignatureProblematic, *pixAttachment;
 
   /** Look for color changes */
   virtual bool event(QEvent *e);
@@ -340,8 +341,6 @@ private:
   /** */
   bool readSortOrder(bool set_selection=false);
 
-  /** are we currently showing the size field? */
-  bool showingSize;
   /** Updated as side effect of KMHeaders::getMsg */
   int getMsgIndex;
   /** ditto */
@@ -372,6 +371,7 @@ private:
   /** popup to switch columns */
   KPopupMenu* mPopup;
   int mSizeColumn;
+  int mAttachmentColumn;
 };
 
 #endif
Index: kmail/kmmessage.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmessage.cpp,v
retrieving revision 1.457
diff -u -3 -p -r1.457 kmmessage.cpp
--- kmail/kmmessage.cpp	15 Feb 2004 16:04:02 -0000	1.457
+++ kmail/kmmessage.cpp	25 Feb 2004 18:24:44 -0000
@@ -356,6 +356,8 @@ void KMMessage::fromDwString(const DwStr
     setSignatureStateChar(  headerField("X-KMail-SignatureState").at(0) );
     setMDNSentState( static_cast<KMMsgMDNSentState>( \
headerField("X-KMail-MDN-Sent").at(0).latin1() ) );  }
+  if (attachmentState() == KMMsgAttachmentUnknown && readyToShow())
+    updateAttachmentState();
 
   mNeedsAssembly = FALSE;
   mDate = date();
@@ -4155,6 +4157,48 @@ void KMMessage::updateBodyPart(const QSt
   }
 }
 
+//-----------------------------------------------------------------------------
+void KMMessage::updateAttachmentState( DwBodyPart* part )
+{
+  if ( !part ) 
+    part = getFirstDwBodyPart();
+  if ( !part ) 
+  {
+    setStatus( KMMsgStatusHasNoAttach );
+    return;
+  }
+
+  if ( part->hasHeaders() &&
+       part->Headers().HasContentDisposition() &&
+       !part->Headers().ContentDisposition().Filename().empty() )
+  {
+    setStatus( KMMsgStatusHasAttach );
+    return;
+  }
+
+  // multipart
+  if ( part->hasHeaders() &&
+       part->Headers().HasContentType() &&
+       part->Body().FirstBodyPart() &&
+       (DwMime::kTypeMultipart == part->Headers().ContentType().Type() ) )
+  {
+    updateAttachmentState( part->Body().FirstBodyPart() );
+  }
+
+  // encapsulated message
+  if ( part->Body().Message() &&
+       part->Body().Message()->Body().FirstBodyPart() )
+  {
+    updateAttachmentState( part->Body().Message()->Body().FirstBodyPart() );
+  }
+
+  // next part
+  if ( part->Next() )
+    updateAttachmentState( part->Next() );
+  else if ( attachmentState() == KMMsgAttachmentUnknown ) 
+    setStatus( KMMsgStatusHasNoAttach );
+}
+
 void KMMessage::setBodyFromUnicode( const QString & str ) {
   QCString encoding = KMMsgBase::autoDetectCharset( charset(), \
KMMessage::preferredCharsets(), str );  if ( encoding.isEmpty() )
Index: kmail/kmmessage.h
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmessage.h,v
retrieving revision 1.162
diff -u -3 -p -r1.162 kmmessage.h
--- kmail/kmmessage.h	23 Feb 2004 22:18:13 -0000	1.162
+++ kmail/kmmessage.h	25 Feb 2004 18:24:44 -0000
@@ -804,6 +804,8 @@ public:
   /** Returns the last DwBodyPart that was updated */
   DwBodyPart* lastUpdatedPart() { return mLastUpdated; }
 
+  void updateAttachmentState(DwBodyPart * part = 0);
+
 private:
   /** Returns message body with quoting header and indented by the
     given indentation string. This is suitable for including the message
Index: kmail/kmmsgbase.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmsgbase.cpp,v
retrieving revision 1.176
diff -u -3 -p -r1.176 kmmsgbase.cpp
--- kmail/kmmsgbase.cpp	22 Feb 2004 15:27:30 -0000	1.176
+++ kmail/kmmsgbase.cpp	25 Feb 2004 18:24:45 -0000
@@ -235,6 +235,14 @@ void KMMsgBase::setStatus(const KMMsgSta
       mStatus &= ~KMMsgStatusSpam;
       mStatus |= KMMsgStatusHam;
       break;
+    case KMMsgStatusHasAttach:
+      mStatus &= ~KMMsgStatusHasNoAttach;
+      mStatus |= KMMsgStatusHasAttach;
+      break;
+    case KMMsgStatusHasNoAttach:
+      mStatus &= ~KMMsgStatusHasAttach;
+      mStatus |= KMMsgStatusHasNoAttach;
+      break;
     default:
       mStatus = aStatus;
       break;
@@ -267,6 +275,8 @@ void KMMsgBase::setStatus(const char* aS
     if (strchr(aXStatusStr, 'G')) setStatus(KMMsgStatusFlag);
     if (strchr(aXStatusStr, 'P')) setStatus(KMMsgStatusSpam);
     if (strchr(aXStatusStr, 'H')) setStatus(KMMsgStatusHam);
+    if (strchr(aXStatusStr, 'T')) setStatus(KMMsgStatusHasAttach);
+    if (strchr(aXStatusStr, 'C')) setStatus(KMMsgStatusHasNoAttach);
   }
 
   // Merge the contents of the "Status" field
@@ -464,6 +474,8 @@ QCString KMMsgBase::statusToStr(const KM
   if (status & KMMsgStatusIgnored) sstr += 'I';
   if (status & KMMsgStatusSpam) sstr += 'P';
   if (status & KMMsgStatusHam) sstr += 'H';
+  if (status & KMMsgStatusHasAttach) sstr += 'T';
+  if (status & KMMsgStatusHasNoAttach) sstr += 'C';
 
   return sstr;
 }
@@ -1022,6 +1034,18 @@ void KMMsgBase::setTransferInProgress(bo
 
 
 //-----------------------------------------------------------------------------
+KMMsgAttachmentState KMMsgBase::attachmentState()
+{
+  KMMsgStatus st = status();
+  if (st & KMMsgStatusHasAttach)
+    return KMMsgHasAttachment;
+  else if (st & KMMsgStatusHasNoAttach)
+    return KMMsgHasNoAttachment;
+  else
+    return KMMsgAttachmentUnknown;
+}
+
+//-----------------------------------------------------------------------------
 static void swapEndian(QString &str)
 {
   uint len = str.length();
Index: kmail/kmmsgbase.h
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmsgbase.h,v
retrieving revision 1.67
diff -u -3 -p -r1.67 kmmsgbase.h
--- kmail/kmmsgbase.h	22 Feb 2004 15:27:30 -0000	1.67
+++ kmail/kmmsgbase.h	25 Feb 2004 18:24:45 -0000
@@ -35,7 +35,9 @@ enum MsgStatus
     KMMsgStatusIgnored =           0x00000800, 
     KMMsgStatusTodo =              0x00001000,
     KMMsgStatusSpam =              0x00002000,
-    KMMsgStatusHam =               0x00004000 
+    KMMsgStatusHam =               0x00004000, 
+    KMMsgStatusHasAttach =         0x00008000, 
+    KMMsgStatusHasNoAttach =       0x00010000 
 };
 
 typedef uint KMMsgStatus;
@@ -102,6 +104,13 @@ typedef enum
     KMMsgDnDActionASK=2
 } KMMsgDnDAction;
 
+/** Flags for attachment state */
+typedef enum
+{
+  KMMsgHasAttachment,
+  KMMsgHasNoAttachment,
+  KMMsgAttachmentUnknown
+} KMMsgAttachmentState;
 
 
 class KMMsgBase
@@ -361,6 +370,9 @@ public:
   /** Set that the message shall not be deleted because it is still required */
   void setTransferInProgress(bool value, bool force = false);
 
+  /** Return if the message has at least one attachment */
+  virtual KMMsgAttachmentState attachmentState();
+
 protected:
   KMFolder* mParent;
   bool mDirty;
Index: kmail/pics/Makefile.am
===================================================================
RCS file: /home/kde/kdepim/kmail/pics/Makefile.am,v
retrieving revision 1.35
diff -u -3 -p -r1.35 Makefile.am
--- kmail/pics/Makefile.am	16 Nov 2003 17:01:27 -0000	1.35
+++ kmail/pics/Makefile.am	25 Feb 2004 18:24:45 -0000
@@ -8,7 +8,7 @@ pics_DATA = kmmsgdel.png kmmsgnew.png km
 	kmmsgpartiallyencrypted.png \
 	kmmsgpartiallysigned.png kmmsgfiller.png kmmsgfullyencrypted.png \
 	kmmsgfullysigned.png kmmsgundefinedencrypted.png \
-	kmmsgundefinedsigned.png kmmsgspam.png \
+	kmmsgundefinedsigned.png kmmsgspam.png kmmsgattachment.png \
 	kmailwindowlayout1.png \
 	kmailwindowlayout2.png kmailwindowlayout3.png kmailwindowlayout4.png \
 	kmailwindowlayout5.png kmailwindowlayout1_smart_mime.png \


["kmmsgattachment.png" (image/png)]

_______________________________________________
KMail developers mailing list
KMail-devel@kde.org
https://mail.kde.org/mailman/listinfo/kmail-devel


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

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