<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.kde.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.6"
          urlbase="https://bugs.kde.org/"
          
          maintainer="sysadmin@kde.org"
>

    <bug>
          <bug_id>119526</bug_id>
          
          <creation_ts>2006-01-04 21:06:07 +0000</creation_ts>
          <short_desc>JJ: attachment display in editor: &quot;sort by size&quot; sorts alphanumerically, not by size</short_desc>
          <delta_ts>2007-09-14 12:17:01 +0000</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>10</classification_id>
          <classification>Unmaintained</classification>
          <product>kmail</product>
          <component>general</component>
          <version>1.9.1</version>
          <rep_platform>unspecified</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>NOR</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Jens">jens-bugs.kde.org</reporter>
          <assigned_to name="kdepim bugs">pim-bugs-null</assigned_to>
          <cc>mcguire</cc>
          
          <cf_commitlink></cf_commitlink>
          <cf_versionfixedin></cf_versionfixedin>
          <cf_sentryurl></cf_sentryurl>
          <votes>0</votes>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>403640</commentid>
    <comment_count>0</comment_count>
    <who name="Jens">jens-bugs.kde.org</who>
    <bug_when>2006-01-04 21:06:07 +0000</bug_when>
    <thetext>Version:           1.9.1 (using KDE 3.5.0 Level &quot;a&quot; , SUSE 10.0 UNSUPPORTED)
Compiler:          Target: i586-suse-linux
OS:                Linux (i686) release 2.6.13-15.7-default

I suspect this is a JJ (please change if not).

Reproduce:
- Create new mail in KMail
- Attach a few files

Problem:
KMail sorts alphanumerically, ie. 42.5kb &lt; 4.3kb &lt; 800 bytes.

Solution: Either sort according to &quot;real&quot; (hidden) value or display true numerical value. This problem was also in the date column in Bug #96994 (Search dialog, sort by date).

Thanks :)

Jens</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>405859</commentid>
    <comment_count>1</comment_count>
      <attachid>14242</attachid>
    <who name="Thomas McGuire">mcguire</who>
    <bug_when>2006-01-13 23:15:18 +0000</bug_when>
    <thetext>Created attachment 14242
Patch which fixes the problem

This patch fixes the problem by sorting with the &quot;hidden&quot; value.
The patch is against a recent version of the 3.5 SVN branch, please apply to
the 3.5 branch and trunk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>484709</commentid>
    <comment_count>2</comment_count>
    <who name="Allen Winter">winter</who>
    <bug_when>2006-11-06 19:19:47 +0000</bug_when>
    <thetext>SVN commit 602743 by winterz:

Patch from Thomas McGuire that fixes the bugs:
+ Wrong checkbox in the layout when adding attachments to the composer
+ attachment display in editor: &quot;sort by size&quot; sorts alphanumerically, not by size

Thanks for the patch Thomas and sorry it took so long.
Will merge into the 3.5 branch shortly.

CCBUGS: 113458, 119526


 M  +104 -215  branches/work/kdepim-3.5.5+/kmail/kmatmlistview.cpp  
 M  +31 -22    branches/work/kdepim-3.5.5+/kmail/kmatmlistview.h  
 M  +1 -0      branches/work/kdepim-3.5.5+/kmail/kmcomposewin.cpp  


--- branches/work/kdepim-3.5.5+/kmail/kmatmlistview.cpp #602742:602743
@@ -1,147 +1,30 @@
 // -*- mode: C++; c-file-style: &quot;gnu&quot; -*-
-// kmcomposewin.cpp
+// kmatmlistview.cpp
 // Author: Markus Wuebben &lt;markus.wuebben@kde.org&gt;
 // This code is published under the GPL.
 
 #include &lt;config.h&gt;
 
 #include &quot;kmatmlistview.h&quot;
-
-#include &quot;kmmainwin.h&quot;
-#include &quot;kmreadermainwin.h&quot;
-#include &quot;messagesender.h&quot;
-#include &quot;kmmsgpartdlg.h&quot;
-#include &lt;kpgpblock.h&gt;
-#include &lt;kaddrbook.h&gt;
-#include &quot;kmaddrbook.h&quot;
-#include &quot;kmmsgdict.h&quot;
-#include &quot;kmfolderimap.h&quot;
-#include &quot;kmfoldermgr.h&quot;
-#include &quot;kmfoldercombobox.h&quot;
-#include &quot;kmtransport.h&quot;
-#include &quot;kmcommands.h&quot;
-#include &quot;kcursorsaver.h&quot;
-#include &quot;partNode.h&quot;
-#include &quot;attachmentlistview.h&quot;
-#include &quot;transportmanager.h&quot;
-using KMail::AttachmentListView;
-#include &quot;dictionarycombobox.h&quot;
-using KMail::DictionaryComboBox;
-#include &quot;addressesdialog.h&quot;
-using KPIM::AddressesDialog;
-#include &quot;addresseeemailselection.h&quot;
-using KPIM::AddresseeEmailSelection;
-using KPIM::AddresseeSelectorDialog;
-#include &lt;maillistdrag.h&gt;
-using KPIM::MailListDrag;
-#include &quot;recentaddresses.h&quot;
-using KRecentAddress::RecentAddresses;
-#include &quot;kleo_util.h&quot;
-#include &quot;stl_util.h&quot;
-#include &quot;recipientseditor.h&quot;
-
-#include &quot;attachmentcollector.h&quot;
-#include &quot;objecttreeparser.h&quot;
-
-#include &quot;kmfoldermaildir.h&quot;
-
-#include &lt;libkpimidentities/identitymanager.h&gt;
-#include &lt;libkpimidentities/identitycombo.h&gt;
-#include &lt;libkpimidentities/identity.h&gt;
-#include &lt;libkdepim/kfileio.h&gt;
-#include &lt;libemailfunctions/email.h&gt;
-#include &lt;kleo/cryptobackendfactory.h&gt;
-#include &lt;kleo/exportjob.h&gt;
-#include &lt;ui/progressdialog.h&gt;
-#include &lt;ui/keyselectiondialog.h&gt;
-
-#include &lt;gpgmepp/context.h&gt;
-#include &lt;gpgmepp/key.h&gt;
-
-#include &lt;kabc/vcardconverter.h&gt;
-#include &lt;libkdepim/kvcarddrag.h&gt;
-#include &lt;kio/netaccess.h&gt;
-
-
-#include &quot;klistboxdialog.h&quot;
-
-#include &quot;messagecomposer.h&quot;
-
-#include &lt;kcharsets.h&gt;
-#include &lt;kcompletionbox.h&gt;
-#include &lt;kcursor.h&gt;
-#include &lt;kcombobox.h&gt;
-#include &lt;kstdaccel.h&gt;
-#include &lt;kpopupmenu.h&gt;
-#include &lt;kedittoolbar.h&gt;
-#include &lt;kkeydialog.h&gt;
-#include &lt;kdebug.h&gt;
-#include &lt;kfiledialog.h&gt;
-#include &lt;kwin.h&gt;
-#include &lt;kinputdialog.h&gt;
-#include &lt;kmessagebox.h&gt;
-#include &lt;kurldrag.h&gt;
-#include &lt;kio/scheduler.h&gt;
-#include &lt;ktempfile.h&gt;
-#include &lt;klocale.h&gt;
-#include &lt;kapplication.h&gt;
-#include &lt;kstatusbar.h&gt;
-#include &lt;kaction.h&gt;
-#include &lt;kstdaction.h&gt;
-#include &lt;kdirwatch.h&gt;
-#include &lt;kstdguiitem.h&gt;
-#include &lt;kiconloader.h&gt;
-#include &lt;kpushbutton.h&gt;
-#include &lt;kuserprofile.h&gt;
-#include &lt;krun.h&gt;
-#include &lt;ktempdir.h&gt;
-//#include &lt;keditlistbox.h&gt;
-#include &quot;globalsettings.h&quot;
-#include &quot;replyphrases.h&quot;
-
-#include &lt;kspell.h&gt;
-#include &lt;kspelldlg.h&gt;
-#include &lt;spellingfilter.h&gt;
-#include &lt;ksyntaxhighlighter.h&gt;
-#include &lt;kcolordialog.h&gt;
-#include &lt;kzip.h&gt;
-#include &lt;ksavefile.h&gt;
-
-#include &lt;qtabdialog.h&gt;
-#include &lt;qregexp.h&gt;
-#include &lt;qbuffer.h&gt;
-#include &lt;qtooltip.h&gt;
-#include &lt;qtextcodec.h&gt;
+#include &lt;qcheckbox.h&gt;
 #include &lt;qheader.h&gt;
-#include &lt;qwhatsthis.h&gt;
-#include &lt;qfontdatabase.h&gt;
 
-#include &lt;mimelib/mimepp.h&gt;
-
-#include &lt;algorithm&gt;
-
-#include &lt;sys/stat.h&gt;
-#include &lt;sys/types.h&gt;
-#include &lt;stdlib.h&gt;
-#include &lt;unistd.h&gt;
-#include &lt;errno.h&gt;
-#include &lt;fcntl.h&gt;
-#include &lt;assert.h&gt;
-
-KMAtmListViewItem::KMAtmListViewItem(QListView *parent)
+KMAtmListViewItem::KMAtmListViewItem( QListView *parent )
   : QObject(),
-    QListViewItem( parent ),
-    mListview( parent ),
-    mCBSignEnabled( false ),
-    mCBEncryptEnabled( false )
+    QListViewItem( parent )
 {
-  mCBEncrypt = new QCheckBox( mListview-&gt;viewport() );
-  mCBSign = new QCheckBox( mListview-&gt;viewport() );
-  mCBCompress = new QCheckBox( mListview-&gt;viewport() );
-  connect( mCBCompress, SIGNAL( clicked() ), this, SLOT( slotCompress() ) );
+  mCBCompress = new QCheckBox( listView()-&gt;viewport() );
+  mCBEncrypt = new QCheckBox( listView()-&gt;viewport() );
+  mCBSign = new QCheckBox( listView()-&gt;viewport() );
+  mCBCompress-&gt;setShown( true );
+  updateAllCheckBoxes();
 
-  mCBEncrypt-&gt;hide();
-  mCBSign-&gt;hide();
+  connect( mCBCompress, SIGNAL( clicked() ), this, SLOT( slotCompress() ) );
+  connect( listView()-&gt;header(), SIGNAL( sizeChange(int, int, int) ),
+           SLOT( slotHeaderChange( int, int, int ) ) );
+  connect( listView()-&gt;header(), SIGNAL( indexChange(int, int, int) ),
+           SLOT( slotHeaderChange( int, int, int ) ) );
+  connect( listView()-&gt;header(), SIGNAL( clicked( int ) ), SLOT( slotHeaderClick( int ) ) );
 }
 
 KMAtmListViewItem::~KMAtmListViewItem()
@@ -154,118 +37,110 @@
   mCBCompress = 0;
 }
 
-void KMAtmListViewItem::paintCell( QPainter * p, const QColorGroup &amp; cg,
-                                  int column, int width, int align )
+void KMAtmListViewItem::updateCheckBox( int headerSection, QCheckBox *cb )
 {
-  // this is also called for the encrypt/sign columns to assure that the
-  // background is cleared
-  QListViewItem::paintCell( p, cg, column, width, align );
-  if ( 4 == column ) {
-    QRect r = mListview-&gt;itemRect( this );
-    if ( !r.size().isValid() ) {
-        mListview-&gt;ensureItemVisible( this );
-        mListview-&gt;repaintContents( FALSE );
-        r = mListview-&gt;itemRect( this );
-    }
-    int colWidth = mListview-&gt;header()-&gt;sectionSize( column );
-    r.setX( mListview-&gt;header()-&gt;sectionPos( column )
-            - mListview-&gt;header()-&gt;offset()
-            + colWidth / 2
-            - r.height() / 2
-            - 1 );
-    r.setY( r.y() + 1 );
-    r.setWidth(  r.height() - 2 );
-    r.setHeight( r.height() - 2 );
-    r = QRect( mListview-&gt;viewportToContents( r.topLeft() ), r.size() );
+  //Calculate some values to determine the x-position where the checkbox
+  //will be drawn
+  int sectionWidth = listView()-&gt;header()-&gt;sectionSize( headerSection );
+  int sectionPos = listView()-&gt;header()-&gt;sectionPos( headerSection );
+  int sectionOffset = sectionWidth / 2 - height() / 4;
 
-    mCBCompress-&gt;resize( r.size() );
-    mListview-&gt;moveChild( mCBCompress, r.x(), r.y() );
+  //Resize and move the checkbox
+  cb-&gt;resize( sectionWidth - sectionOffset - 1, height() - 2 );
+  listView()-&gt;moveChild( cb, sectionPos + sectionOffset, itemPos() + 1 );
 
-    QColor bg;
-    if (isSelected())
-      bg = cg.highlight();
-    else
-      bg = cg.base();
-
-    mCBCompress-&gt;setPaletteBackgroundColor(bg);
-    mCBCompress-&gt;show();
+  //Set the correct background color
+  QColor bg;
+  if ( isSelected() ) {
+    bg = listView()-&gt;colorGroup().highlight();
+  } else {
+    bg = listView()-&gt;colorGroup().base();
   }
-  if( 5 == column || 6 == column ) {
-    QRect r = mListview-&gt;itemRect( this );
-    if ( !r.size().isValid() ) {
-        mListview-&gt;ensureItemVisible( this );
-        mListview-&gt;repaintContents( FALSE );
-        r = mListview-&gt;itemRect( this );
-    }
-    int colWidth = mListview-&gt;header()-&gt;sectionSize( column );
-    r.setX( mListview-&gt;header()-&gt;sectionPos( column )
-            + colWidth / 2
-            - r.height() / 2
-            - 1 );
-    r.setY( r.y() + 1 );
-    r.setWidth(  r.height() - 2 );
-    r.setHeight( r.height() - 2 );
-    r = QRect( mListview-&gt;viewportToContents( r.topLeft() ), r.size() );
+  cb-&gt;setPaletteBackgroundColor( bg );
+}
 
-    QCheckBox* cb = (5 == column) ? mCBEncrypt : mCBSign;
-    cb-&gt;resize( r.size() );
-    mListview-&gt;moveChild( cb, r.x(), r.y() );
+void KMAtmListViewItem::updateAllCheckBoxes()
+{
+  updateCheckBox( 4, mCBCompress );
+  updateCheckBox( 5, mCBEncrypt );
+  updateCheckBox( 6, mCBSign );
+}
 
-    QColor bg;
-    if (isSelected())
-      bg = cg.highlight();
-    else
-      bg = cg.base();
-
-    bool enabled = (5 == column) ? mCBEncryptEnabled : mCBSignEnabled;
-    cb-&gt;setPaletteBackgroundColor(bg);
-    if (enabled) cb-&gt;show();
+// Each time a cell is about to be painted, the item&apos;s checkboxes are updated
+// as well. This is necessary to keep the positions of the checkboxes
+// up-to-date. The signals which are, in the constructor of this class,
+// connected to the update slots are not sufficent because unfortunatly,
+// Qt does not provide a signal for changed item positions, e.g. during
+// deleting or adding items. The problem with this is that this function does
+// not catch updates which are off-screen, which means under some circumstances
+// checkboxes have invalid positions. This should not happen anymore, but was
+// the cause of bug 113458. Therefore, both the signals connected in the
+// constructor and this function are necessary to keep the checkboxes&apos;
+// positions in sync, and hopefully is enough.
+void KMAtmListViewItem::paintCell ( QPainter * p, const QColorGroup &amp;cg,
+                                    int column, int width, int align )
+{
+  switch ( column ) {
+    case 4: updateCheckBox( 4, mCBCompress ); break;
+    case 5: updateCheckBox( 5, mCBEncrypt ); break;
+    case 6: updateCheckBox( 6, mCBSign ); break;
   }
+
+  QListViewItem::paintCell( p, cg, column, width, align );
 }
 
-void KMAtmListViewItem::enableCryptoCBs(bool on)
+int KMAtmListViewItem::compare( QListViewItem *i, int col, bool ascending ) const
 {
-  if( mCBEncrypt ) {
-    mCBEncryptEnabled = on;
-    mCBEncrypt-&gt;setEnabled( on );
-    mCBEncrypt-&gt;setShown( on );
+  if ( col != 1 ) {
+    return QListViewItem::compare( i, col, ascending );
   }
-  if( mCBSign ) {
-    mCBSignEnabled = on;
-    mCBSign-&gt;setEnabled( on );
-    mCBSign-&gt;setShown( on );
-  }
+
+  return mAttachmentSize -
+    (static_cast&lt;KMAtmListViewItem*&gt;(i))-&gt;mAttachmentSize;
 }
 
-void KMAtmListViewItem::setEncrypt(bool on)
+void KMAtmListViewItem::enableCryptoCBs( bool on )
 {
-  if( mCBEncrypt )
+  // Show/Hide the appropriate checkboxes.
+  // This should not be necessary because the caller hides the columns
+  // containing the checkboxes anyway.
+  mCBEncrypt-&gt;setShown( on );
+  mCBSign-&gt;setShown( on );
+}
+
+void KMAtmListViewItem::setEncrypt( bool on )
+{
+  if ( mCBEncrypt ) {
     mCBEncrypt-&gt;setChecked( on );
+  }
 }
 
 bool KMAtmListViewItem::isEncrypt()
 {
-  if( mCBEncrypt )
+  if ( mCBEncrypt ) {
     return mCBEncrypt-&gt;isChecked();
-  else
+  } else {
     return false;
+  }
 }
 
-void KMAtmListViewItem::setSign(bool on)
+void KMAtmListViewItem::setSign( bool on )
 {
-  if( mCBSign )
+  if ( mCBSign ) {
     mCBSign-&gt;setChecked( on );
+  }
 }
 
 bool KMAtmListViewItem::isSign()
 {
-  if( mCBSign )
+  if ( mCBSign ) {
     return mCBSign-&gt;isChecked();
-  else
+  } else {
     return false;
+  }
 }
 
-void KMAtmListViewItem::setCompress(bool on)
+void KMAtmListViewItem::setCompress( bool on )
 {
   mCBCompress-&gt;setChecked( on );
 }
@@ -277,10 +152,24 @@
 
 void KMAtmListViewItem::slotCompress()
 {
-    if ( mCBCompress-&gt;isChecked() )
-        emit compress( itemPos() );
-    else
-        emit uncompress( itemPos() );
+  if ( mCBCompress-&gt;isChecked() ) {
+    emit compress( itemPos() );
+  } else {
+    emit uncompress( itemPos() );
+  }
 }
 
+// Update the item&apos;s checkboxes when the position of those change
+// due to different column positions
+void KMAtmListViewItem::slotHeaderChange ( int, int, int )
+{
+  updateAllCheckBoxes();
+}
+
+//Update the item&apos;s checkboxes when the list is being sorted
+void KMAtmListViewItem::slotHeaderClick( int )
+{
+  updateAllCheckBoxes();
+}
+
 #include &quot;kmatmlistview.moc&quot;
--- branches/work/kdepim-3.5.5+/kmail/kmatmlistview.h #602742:602743
@@ -1,5 +1,5 @@
 /* -*- mode: C++; c-file-style: &quot;gnu&quot; -*-
- * KMComposeWin Header File
+ * KMAtmListViewItem Header File
  * Author: Markus Wuebben &lt;markus.wuebben@kde.org&gt;
  */
 #ifndef __KMAIL_KMATMLISTVIEW_H__
@@ -15,48 +15,57 @@
 class KMAtmListViewItem : public QObject, public QListViewItem
 {
   Q_OBJECT
-  friend class ::KMComposeWin;
-  friend class ::MessageComposer;
 
 public:
-  KMAtmListViewItem(QListView * parent);
+  KMAtmListViewItem( QListView *parent );
   virtual ~KMAtmListViewItem();
-  virtual void paintCell( QPainter * p, const QColorGroup &amp; cg,
-                          int column, int width, int align );
 
+  //A custom compare function is needed because the size column is
+  //human-readable and therefore doesn&apos;t sort correctly.
+  virtual int compare( QListViewItem *i, int col, bool ascending ) const;
+
+  virtual void paintCell ( QPainter * p, const QColorGroup &amp; cg, int column, int width, int align );
+
   void setUncompressedMimeType( const QCString &amp; type, const QCString &amp; subtype ) {
     mType = type; mSubtype = subtype;
   }
+  void setAttachmentSize( int numBytes ) {
+    mAttachmentSize = numBytes;
+  }
   void uncompressedMimeType( QCString &amp; type, QCString &amp; subtype ) const {
     type = mType; subtype = mSubtype;
   }
-  void setUncompressedCodec( const QCString &amp; codec ) { mCodec = codec; }
+  void setUncompressedCodec( const QCString &amp;codec ) { mCodec = codec; }
   QCString uncompressedCodec() const { return mCodec; }
 
+  void enableCryptoCBs( bool on );
+  void setEncrypt( bool on );
+  bool isEncrypt();
+  void setSign( bool on );
+  bool isSign();
+  void setCompress( bool on );
+  bool isCompress();
+
 signals:
   void compress( int );
   void uncompress( int );
 
-protected:
-  void enableCryptoCBs(bool on);
-  void setEncrypt(bool on);
-  bool isEncrypt();
-  void setSign(bool on);
-  bool isSign();
-  void setCompress(bool on);
-  bool isCompress();
-
 private slots:
   void slotCompress();
+  void slotHeaderChange( int, int, int );
+  void slotHeaderClick( int );
 
+protected:
+
+  void updateCheckBox( int headerSection, QCheckBox *cb );
+  void updateAllCheckBoxes();
+
 private:
-  QListView* mListview;
-  QCheckBox* mCBEncrypt;
-  QCheckBox* mCBSign;
-  QCheckBox* mCBCompress;
-  bool mCBSignEnabled, mCBEncryptEnabled;
+  QCheckBox *mCBEncrypt;
+  QCheckBox *mCBSign;
+  QCheckBox *mCBCompress;
   QCString mType, mSubtype, mCodec;
+  int mAttachmentSize;
 };
 
-
 #endif // __KMAIL_KMATMLISTVIEW_H__
--- branches/work/kdepim-3.5.5+/kmail/kmcomposewin.cpp #602742:602743
@@ -2307,6 +2307,7 @@
   lvi-&gt;setText(1, KIO::convertSize( msgPart-&gt;decodedSize()));
   lvi-&gt;setText(2, msgPart-&gt;contentTransferEncodingStr());
   lvi-&gt;setText(3, prettyMimeType(msgPart-&gt;typeStr() + &quot;/&quot; + msgPart-&gt;subtypeStr()));
+  lvi-&gt;setAttachmentSize(msgPart-&gt;decodedSize());
 
   if ( loadDefaults ) {
     if( canSignEncryptAttachments() ) {
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>484714</commentid>
    <comment_count>3</comment_count>
    <who name="Allen Winter">winter</who>
    <bug_when>2006-11-06 19:25:41 +0000</bug_when>
    <thetext>SVN commit 602752 by winterz:

merge SVN commit 602743 by winterz:

Patch from Thomas McGuire that fixes the bugs:
+ Wrong checkbox in the layout when adding attachments to the composer
+ attachment display in editor: &quot;sort by size&quot; sorts alphanumerically, not by size

Thanks for the patch Thomas and sorry it took so long.

BUGS: 113458, 119526


 M  +104 -215  kmatmlistview.cpp  
 M  +31 -22    kmatmlistview.h  
 M  +1 -0      kmcomposewin.cpp  


--- branches/KDE/3.5/kdepim/kmail/kmatmlistview.cpp #602751:602752
@@ -1,147 +1,30 @@
 // -*- mode: C++; c-file-style: &quot;gnu&quot; -*-
-// kmcomposewin.cpp
+// kmatmlistview.cpp
 // Author: Markus Wuebben &lt;markus.wuebben@kde.org&gt;
 // This code is published under the GPL.
 
 #include &lt;config.h&gt;
 
 #include &quot;kmatmlistview.h&quot;
-
-#include &quot;kmmainwin.h&quot;
-#include &quot;kmreadermainwin.h&quot;
-#include &quot;messagesender.h&quot;
-#include &quot;kmmsgpartdlg.h&quot;
-#include &lt;kpgpblock.h&gt;
-#include &lt;kaddrbook.h&gt;
-#include &quot;kmaddrbook.h&quot;
-#include &quot;kmmsgdict.h&quot;
-#include &quot;kmfolderimap.h&quot;
-#include &quot;kmfoldermgr.h&quot;
-#include &quot;kmfoldercombobox.h&quot;
-#include &quot;kmtransport.h&quot;
-#include &quot;kmcommands.h&quot;
-#include &quot;kcursorsaver.h&quot;
-#include &quot;partNode.h&quot;
-#include &quot;attachmentlistview.h&quot;
-#include &quot;transportmanager.h&quot;
-using KMail::AttachmentListView;
-#include &quot;dictionarycombobox.h&quot;
-using KMail::DictionaryComboBox;
-#include &quot;addressesdialog.h&quot;
-using KPIM::AddressesDialog;
-#include &quot;addresseeemailselection.h&quot;
-using KPIM::AddresseeEmailSelection;
-using KPIM::AddresseeSelectorDialog;
-#include &lt;maillistdrag.h&gt;
-using KPIM::MailListDrag;
-#include &quot;recentaddresses.h&quot;
-using KRecentAddress::RecentAddresses;
-#include &quot;kleo_util.h&quot;
-#include &quot;stl_util.h&quot;
-#include &quot;recipientseditor.h&quot;
-
-#include &quot;attachmentcollector.h&quot;
-#include &quot;objecttreeparser.h&quot;
-
-#include &quot;kmfoldermaildir.h&quot;
-
-#include &lt;libkpimidentities/identitymanager.h&gt;
-#include &lt;libkpimidentities/identitycombo.h&gt;
-#include &lt;libkpimidentities/identity.h&gt;
-#include &lt;libkdepim/kfileio.h&gt;
-#include &lt;libemailfunctions/email.h&gt;
-#include &lt;kleo/cryptobackendfactory.h&gt;
-#include &lt;kleo/exportjob.h&gt;
-#include &lt;ui/progressdialog.h&gt;
-#include &lt;ui/keyselectiondialog.h&gt;
-
-#include &lt;gpgmepp/context.h&gt;
-#include &lt;gpgmepp/key.h&gt;
-
-#include &lt;kabc/vcardconverter.h&gt;
-#include &lt;libkdepim/kvcarddrag.h&gt;
-#include &lt;kio/netaccess.h&gt;
-
-
-#include &quot;klistboxdialog.h&quot;
-
-#include &quot;messagecomposer.h&quot;
-
-#include &lt;kcharsets.h&gt;
-#include &lt;kcompletionbox.h&gt;
-#include &lt;kcursor.h&gt;
-#include &lt;kcombobox.h&gt;
-#include &lt;kstdaccel.h&gt;
-#include &lt;kpopupmenu.h&gt;
-#include &lt;kedittoolbar.h&gt;
-#include &lt;kkeydialog.h&gt;
-#include &lt;kdebug.h&gt;
-#include &lt;kfiledialog.h&gt;
-#include &lt;kwin.h&gt;
-#include &lt;kinputdialog.h&gt;
-#include &lt;kmessagebox.h&gt;
-#include &lt;kurldrag.h&gt;
-#include &lt;kio/scheduler.h&gt;
-#include &lt;ktempfile.h&gt;
-#include &lt;klocale.h&gt;
-#include &lt;kapplication.h&gt;
-#include &lt;kstatusbar.h&gt;
-#include &lt;kaction.h&gt;
-#include &lt;kstdaction.h&gt;
-#include &lt;kdirwatch.h&gt;
-#include &lt;kstdguiitem.h&gt;
-#include &lt;kiconloader.h&gt;
-#include &lt;kpushbutton.h&gt;
-#include &lt;kuserprofile.h&gt;
-#include &lt;krun.h&gt;
-#include &lt;ktempdir.h&gt;
-//#include &lt;keditlistbox.h&gt;
-#include &quot;globalsettings.h&quot;
-#include &quot;replyphrases.h&quot;
-
-#include &lt;kspell.h&gt;
-#include &lt;kspelldlg.h&gt;
-#include &lt;spellingfilter.h&gt;
-#include &lt;ksyntaxhighlighter.h&gt;
-#include &lt;kcolordialog.h&gt;
-#include &lt;kzip.h&gt;
-#include &lt;ksavefile.h&gt;
-
-#include &lt;qtabdialog.h&gt;
-#include &lt;qregexp.h&gt;
-#include &lt;qbuffer.h&gt;
-#include &lt;qtooltip.h&gt;
-#include &lt;qtextcodec.h&gt;
+#include &lt;qcheckbox.h&gt;
 #include &lt;qheader.h&gt;
-#include &lt;qwhatsthis.h&gt;
-#include &lt;qfontdatabase.h&gt;
 
-#include &lt;mimelib/mimepp.h&gt;
-
-#include &lt;algorithm&gt;
-
-#include &lt;sys/stat.h&gt;
-#include &lt;sys/types.h&gt;
-#include &lt;stdlib.h&gt;
-#include &lt;unistd.h&gt;
-#include &lt;errno.h&gt;
-#include &lt;fcntl.h&gt;
-#include &lt;assert.h&gt;
-
-KMAtmListViewItem::KMAtmListViewItem(QListView *parent)
+KMAtmListViewItem::KMAtmListViewItem( QListView *parent )
   : QObject(),
-    QListViewItem( parent ),
-    mListview( parent ),
-    mCBSignEnabled( false ),
-    mCBEncryptEnabled( false )
+    QListViewItem( parent )
 {
-  mCBEncrypt = new QCheckBox( mListview-&gt;viewport() );
-  mCBSign = new QCheckBox( mListview-&gt;viewport() );
-  mCBCompress = new QCheckBox( mListview-&gt;viewport() );
-  connect( mCBCompress, SIGNAL( clicked() ), this, SLOT( slotCompress() ) );
+  mCBCompress = new QCheckBox( listView()-&gt;viewport() );
+  mCBEncrypt = new QCheckBox( listView()-&gt;viewport() );
+  mCBSign = new QCheckBox( listView()-&gt;viewport() );
+  mCBCompress-&gt;setShown( true );
+  updateAllCheckBoxes();
 
-  mCBEncrypt-&gt;hide();
-  mCBSign-&gt;hide();
+  connect( mCBCompress, SIGNAL( clicked() ), this, SLOT( slotCompress() ) );
+  connect( listView()-&gt;header(), SIGNAL( sizeChange(int, int, int) ),
+           SLOT( slotHeaderChange( int, int, int ) ) );
+  connect( listView()-&gt;header(), SIGNAL( indexChange(int, int, int) ),
+           SLOT( slotHeaderChange( int, int, int ) ) );
+  connect( listView()-&gt;header(), SIGNAL( clicked( int ) ), SLOT( slotHeaderClick( int ) ) );
 }
 
 KMAtmListViewItem::~KMAtmListViewItem()
@@ -154,118 +37,110 @@
   mCBCompress = 0;
 }
 
-void KMAtmListViewItem::paintCell( QPainter * p, const QColorGroup &amp; cg,
-                                  int column, int width, int align )
+void KMAtmListViewItem::updateCheckBox( int headerSection, QCheckBox *cb )
 {
-  // this is also called for the encrypt/sign columns to assure that the
-  // background is cleared
-  QListViewItem::paintCell( p, cg, column, width, align );
-  if ( 4 == column ) {
-    QRect r = mListview-&gt;itemRect( this );
-    if ( !r.size().isValid() ) {
-        mListview-&gt;ensureItemVisible( this );
-        mListview-&gt;repaintContents( FALSE );
-        r = mListview-&gt;itemRect( this );
-    }
-    int colWidth = mListview-&gt;header()-&gt;sectionSize( column );
-    r.setX( mListview-&gt;header()-&gt;sectionPos( column )
-            - mListview-&gt;header()-&gt;offset()
-            + colWidth / 2
-            - r.height() / 2
-            - 1 );
-    r.setY( r.y() + 1 );
-    r.setWidth(  r.height() - 2 );
-    r.setHeight( r.height() - 2 );
-    r = QRect( mListview-&gt;viewportToContents( r.topLeft() ), r.size() );
+  //Calculate some values to determine the x-position where the checkbox
+  //will be drawn
+  int sectionWidth = listView()-&gt;header()-&gt;sectionSize( headerSection );
+  int sectionPos = listView()-&gt;header()-&gt;sectionPos( headerSection );
+  int sectionOffset = sectionWidth / 2 - height() / 4;
 
-    mCBCompress-&gt;resize( r.size() );
-    mListview-&gt;moveChild( mCBCompress, r.x(), r.y() );
+  //Resize and move the checkbox
+  cb-&gt;resize( sectionWidth - sectionOffset - 1, height() - 2 );
+  listView()-&gt;moveChild( cb, sectionPos + sectionOffset, itemPos() + 1 );
 
-    QColor bg;
-    if (isSelected())
-      bg = cg.highlight();
-    else
-      bg = cg.base();
-
-    mCBCompress-&gt;setPaletteBackgroundColor(bg);
-    mCBCompress-&gt;show();
+  //Set the correct background color
+  QColor bg;
+  if ( isSelected() ) {
+    bg = listView()-&gt;colorGroup().highlight();
+  } else {
+    bg = listView()-&gt;colorGroup().base();
   }
-  if( 5 == column || 6 == column ) {
-    QRect r = mListview-&gt;itemRect( this );
-    if ( !r.size().isValid() ) {
-        mListview-&gt;ensureItemVisible( this );
-        mListview-&gt;repaintContents( FALSE );
-        r = mListview-&gt;itemRect( this );
-    }
-    int colWidth = mListview-&gt;header()-&gt;sectionSize( column );
-    r.setX( mListview-&gt;header()-&gt;sectionPos( column )
-            + colWidth / 2
-            - r.height() / 2
-            - 1 );
-    r.setY( r.y() + 1 );
-    r.setWidth(  r.height() - 2 );
-    r.setHeight( r.height() - 2 );
-    r = QRect( mListview-&gt;viewportToContents( r.topLeft() ), r.size() );
+  cb-&gt;setPaletteBackgroundColor( bg );
+}
 
-    QCheckBox* cb = (5 == column) ? mCBEncrypt : mCBSign;
-    cb-&gt;resize( r.size() );
-    mListview-&gt;moveChild( cb, r.x(), r.y() );
+void KMAtmListViewItem::updateAllCheckBoxes()
+{
+  updateCheckBox( 4, mCBCompress );
+  updateCheckBox( 5, mCBEncrypt );
+  updateCheckBox( 6, mCBSign );
+}
 
-    QColor bg;
-    if (isSelected())
-      bg = cg.highlight();
-    else
-      bg = cg.base();
-
-    bool enabled = (5 == column) ? mCBEncryptEnabled : mCBSignEnabled;
-    cb-&gt;setPaletteBackgroundColor(bg);
-    if (enabled) cb-&gt;show();
+// Each time a cell is about to be painted, the item&apos;s checkboxes are updated
+// as well. This is necessary to keep the positions of the checkboxes
+// up-to-date. The signals which are, in the constructor of this class,
+// connected to the update slots are not sufficent because unfortunatly,
+// Qt does not provide a signal for changed item positions, e.g. during
+// deleting or adding items. The problem with this is that this function does
+// not catch updates which are off-screen, which means under some circumstances
+// checkboxes have invalid positions. This should not happen anymore, but was
+// the cause of bug 113458. Therefore, both the signals connected in the
+// constructor and this function are necessary to keep the checkboxes&apos;
+// positions in sync, and hopefully is enough.
+void KMAtmListViewItem::paintCell ( QPainter * p, const QColorGroup &amp;cg,
+                                    int column, int width, int align )
+{
+  switch ( column ) {
+    case 4: updateCheckBox( 4, mCBCompress ); break;
+    case 5: updateCheckBox( 5, mCBEncrypt ); break;
+    case 6: updateCheckBox( 6, mCBSign ); break;
   }
+
+  QListViewItem::paintCell( p, cg, column, width, align );
 }
 
-void KMAtmListViewItem::enableCryptoCBs(bool on)
+int KMAtmListViewItem::compare( QListViewItem *i, int col, bool ascending ) const
 {
-  if( mCBEncrypt ) {
-    mCBEncryptEnabled = on;
-    mCBEncrypt-&gt;setEnabled( on );
-    mCBEncrypt-&gt;setShown( on );
+  if ( col != 1 ) {
+    return QListViewItem::compare( i, col, ascending );
   }
-  if( mCBSign ) {
-    mCBSignEnabled = on;
-    mCBSign-&gt;setEnabled( on );
-    mCBSign-&gt;setShown( on );
-  }
+
+  return mAttachmentSize -
+    (static_cast&lt;KMAtmListViewItem*&gt;(i))-&gt;mAttachmentSize;
 }
 
-void KMAtmListViewItem::setEncrypt(bool on)
+void KMAtmListViewItem::enableCryptoCBs( bool on )
 {
-  if( mCBEncrypt )
+  // Show/Hide the appropriate checkboxes.
+  // This should not be necessary because the caller hides the columns
+  // containing the checkboxes anyway.
+  mCBEncrypt-&gt;setShown( on );
+  mCBSign-&gt;setShown( on );
+}
+
+void KMAtmListViewItem::setEncrypt( bool on )
+{
+  if ( mCBEncrypt ) {
     mCBEncrypt-&gt;setChecked( on );
+  }
 }
 
 bool KMAtmListViewItem::isEncrypt()
 {
-  if( mCBEncrypt )
+  if ( mCBEncrypt ) {
     return mCBEncrypt-&gt;isChecked();
-  else
+  } else {
     return false;
+  }
 }
 
-void KMAtmListViewItem::setSign(bool on)
+void KMAtmListViewItem::setSign( bool on )
 {
-  if( mCBSign )
+  if ( mCBSign ) {
     mCBSign-&gt;setChecked( on );
+  }
 }
 
 bool KMAtmListViewItem::isSign()
 {
-  if( mCBSign )
+  if ( mCBSign ) {
     return mCBSign-&gt;isChecked();
-  else
+  } else {
     return false;
+  }
 }
 
-void KMAtmListViewItem::setCompress(bool on)
+void KMAtmListViewItem::setCompress( bool on )
 {
   mCBCompress-&gt;setChecked( on );
 }
@@ -277,10 +152,24 @@
 
 void KMAtmListViewItem::slotCompress()
 {
-    if ( mCBCompress-&gt;isChecked() )
-        emit compress( itemPos() );
-    else
-        emit uncompress( itemPos() );
+  if ( mCBCompress-&gt;isChecked() ) {
+    emit compress( itemPos() );
+  } else {
+    emit uncompress( itemPos() );
+  }
 }
 
+// Update the item&apos;s checkboxes when the position of those change
+// due to different column positions
+void KMAtmListViewItem::slotHeaderChange ( int, int, int )
+{
+  updateAllCheckBoxes();
+}
+
+//Update the item&apos;s checkboxes when the list is being sorted
+void KMAtmListViewItem::slotHeaderClick( int )
+{
+  updateAllCheckBoxes();
+}
+
 #include &quot;kmatmlistview.moc&quot;
--- branches/KDE/3.5/kdepim/kmail/kmatmlistview.h #602751:602752
@@ -1,5 +1,5 @@
 /* -*- mode: C++; c-file-style: &quot;gnu&quot; -*-
- * KMComposeWin Header File
+ * KMAtmListViewItem Header File
  * Author: Markus Wuebben &lt;markus.wuebben@kde.org&gt;
  */
 #ifndef __KMAIL_KMATMLISTVIEW_H__
@@ -15,48 +15,57 @@
 class KMAtmListViewItem : public QObject, public QListViewItem
 {
   Q_OBJECT
-  friend class ::KMComposeWin;
-  friend class ::MessageComposer;
 
 public:
-  KMAtmListViewItem(QListView * parent);
+  KMAtmListViewItem( QListView *parent );
   virtual ~KMAtmListViewItem();
-  virtual void paintCell( QPainter * p, const QColorGroup &amp; cg,
-                          int column, int width, int align );
 
+  //A custom compare function is needed because the size column is
+  //human-readable and therefore doesn&apos;t sort correctly.
+  virtual int compare( QListViewItem *i, int col, bool ascending ) const;
+
+  virtual void paintCell ( QPainter * p, const QColorGroup &amp; cg, int column, int width, int align );
+
   void setUncompressedMimeType( const QCString &amp; type, const QCString &amp; subtype ) {
     mType = type; mSubtype = subtype;
   }
+  void setAttachmentSize( int numBytes ) {
+    mAttachmentSize = numBytes;
+  }
   void uncompressedMimeType( QCString &amp; type, QCString &amp; subtype ) const {
     type = mType; subtype = mSubtype;
   }
-  void setUncompressedCodec( const QCString &amp; codec ) { mCodec = codec; }
+  void setUncompressedCodec( const QCString &amp;codec ) { mCodec = codec; }
   QCString uncompressedCodec() const { return mCodec; }
 
+  void enableCryptoCBs( bool on );
+  void setEncrypt( bool on );
+  bool isEncrypt();
+  void setSign( bool on );
+  bool isSign();
+  void setCompress( bool on );
+  bool isCompress();
+
 signals:
   void compress( int );
   void uncompress( int );
 
-protected:
-  void enableCryptoCBs(bool on);
-  void setEncrypt(bool on);
-  bool isEncrypt();
-  void setSign(bool on);
-  bool isSign();
-  void setCompress(bool on);
-  bool isCompress();
-
 private slots:
   void slotCompress();
+  void slotHeaderChange( int, int, int );
+  void slotHeaderClick( int );
 
+protected:
+
+  void updateCheckBox( int headerSection, QCheckBox *cb );
+  void updateAllCheckBoxes();
+
 private:
-  QListView* mListview;
-  QCheckBox* mCBEncrypt;
-  QCheckBox* mCBSign;
-  QCheckBox* mCBCompress;
-  bool mCBSignEnabled, mCBEncryptEnabled;
+  QCheckBox *mCBEncrypt;
+  QCheckBox *mCBSign;
+  QCheckBox *mCBCompress;
   QCString mType, mSubtype, mCodec;
+  int mAttachmentSize;
 };
 
-
 #endif // __KMAIL_KMATMLISTVIEW_H__
--- branches/KDE/3.5/kdepim/kmail/kmcomposewin.cpp #602751:602752
@@ -2273,6 +2273,7 @@
   lvi-&gt;setText(1, KIO::convertSize( msgPart-&gt;decodedSize()));
   lvi-&gt;setText(2, msgPart-&gt;contentTransferEncodingStr());
   lvi-&gt;setText(3, prettyMimeType(msgPart-&gt;typeStr() + &quot;/&quot; + msgPart-&gt;subtypeStr()));
+  lvi-&gt;setAttachmentSize(msgPart-&gt;decodedSize());
 
   if ( loadDefaults ) {
     if( canSignEncryptAttachments() ) {
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>14242</attachid>
            <date>2006-01-13 23:15:18 +0000</date>
            <delta_ts>2006-01-13 23:15:18 +0000</delta_ts>
            <desc>Patch which fixes the problem</desc>
            <filename>kmail-attachmentsort.diff</filename>
            <type>text/plain</type>
            <size>2037</size>
            <attacher name="Thomas McGuire">mcguire</attacher>
            
              <data encoding="base64">SW5kZXg6IGttYWlsL2ttYXRtbGlzdHZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGttYWlsL2ttYXRt
bGlzdHZpZXcuY3BwCShyZXZpc2lvbiA0OTY5ODkpCisrKyBrbWFpbC9rbWF0bWxpc3R2aWV3LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjIzLDYgKzIyMywxNCBAQAogICB9CiB9CiAKK2ludCBLTUF0
bUxpc3RWaWV3SXRlbTo6Y29tcGFyZSggUUxpc3RWaWV3SXRlbSAqaSwgaW50IGNvbCwgYm9vbCBh
c2NlbmRpbmcgKSBjb25zdAoreworICBpZiAoY29sICE9IDEpCisgICAgcmV0dXJuIFFMaXN0Vmll
d0l0ZW06OmNvbXBhcmUoaSwgY29sLCBhc2NlbmRpbmcpOworCisgIHJldHVybiBtU2l6ZSAtIChz
dGF0aWNfY2FzdDxLTUF0bUxpc3RWaWV3SXRlbSo+KGkpKS0+bVNpemU7Cit9CisKIHZvaWQgS01B
dG1MaXN0Vmlld0l0ZW06OmVuYWJsZUNyeXB0b0NCcyhib29sIG9uKQogewogICBpZiggbUNCRW5j
cnlwdCApIHsKSW5kZXg6IGttYWlsL2ttY29tcG9zZXdpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga21h
aWwva21jb21wb3Nld2luLmNwcAkocmV2aXNpb24gNDk2OTg5KQorKysga21haWwva21jb21wb3Nl
d2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjI0NSw2ICsyMjQ1LDcgQEAKICAgbHZpLT5zZXRU
ZXh0KDEsIEtJTzo6Y29udmVydFNpemUoIG1zZ1BhcnQtPmRlY29kZWRTaXplKCkpKTsKICAgbHZp
LT5zZXRUZXh0KDIsIG1zZ1BhcnQtPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nU3RyKCkpOwogICBs
dmktPnNldFRleHQoMywgcHJldHR5TWltZVR5cGUobXNnUGFydC0+dHlwZVN0cigpICsgIi8iICsg
bXNnUGFydC0+c3VidHlwZVN0cigpKSk7CisgIGx2aS0+c2V0U2l6ZShtc2dQYXJ0LT5kZWNvZGVk
U2l6ZSgpKTsKIAogICBpZiAoIGxvYWREZWZhdWx0cyApIHsKICAgICBpZiggY2FuU2lnbkVuY3J5
cHRBdHRhY2htZW50cygpICkgewpJbmRleDoga21haWwva21hdG1saXN0dmlldy5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIGttYWlsL2ttYXRtbGlzdHZpZXcuaAkocmV2aXNpb24gNDk2OTg5KQorKysga21haWwv
a21hdG1saXN0dmlldy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw5ICsyNCwxNiBAQAogICB2aXJ0
dWFsIHZvaWQgcGFpbnRDZWxsKCBRUGFpbnRlciAqIHAsIGNvbnN0IFFDb2xvckdyb3VwICYgY2cs
CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW4sIGludCB3aWR0aCwgaW50IGFs
aWduICk7CiAKKyAgLy9BIGN1c3RvbSBjb21wYXJlIGZ1bmN0aW9uIGlzIG5lZWRlZCBiZWNhdXNl
IHRoZSBzaXplIGNvbHVtbiBpcworICAvL2h1bWFuLXJlYWRhYmxlIGFuZCB0aGVyZWZvcmUgZG9l
c24ndCBzb3J0IGNvcnJlY3RseQorICB2aXJ0dWFsIGludCBjb21wYXJlKCBRTGlzdFZpZXdJdGVt
ICppLCBpbnQgY29sLCBib29sIGFzY2VuZGluZyApIGNvbnN0OworCiAgIHZvaWQgc2V0VW5jb21w
cmVzc2VkTWltZVR5cGUoIGNvbnN0IFFDU3RyaW5nICYgdHlwZSwgY29uc3QgUUNTdHJpbmcgJiBz
dWJ0eXBlICkgewogICAgIG1UeXBlID0gdHlwZTsgbVN1YnR5cGUgPSBzdWJ0eXBlOwogICB9Cisg
IHZvaWQgc2V0U2l6ZSggaW50IG51bUJ5dGVzICkgeworICAgIG1TaXplID0gbnVtQnl0ZXM7Cisg
IH0KICAgdm9pZCB1bmNvbXByZXNzZWRNaW1lVHlwZSggUUNTdHJpbmcgJiB0eXBlLCBRQ1N0cmlu
ZyAmIHN1YnR5cGUgKSBjb25zdCB7CiAgICAgdHlwZSA9IG1UeXBlOyBzdWJ0eXBlID0gbVN1YnR5
cGU7CiAgIH0KQEAgLTU2LDYgKzYzLDcgQEAKICAgUUNoZWNrQm94KiBtQ0JDb21wcmVzczsKICAg
Ym9vbCBtQ0JTaWduRW5hYmxlZCwgbUNCRW5jcnlwdEVuYWJsZWQ7CiAgIFFDU3RyaW5nIG1UeXBl
LCBtU3VidHlwZSwgbUNvZGVjOworICBpbnQgbVNpemU7CiB9OwogCiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>