Index: kmail/kmheaders.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmheaders.cpp,v
retrieving revision 1.705
diff -u -5 -d -p -r1.705 kmheaders.cpp
--- kmail/kmheaders.cpp	1 Mar 2005 21:20:33 -0000	1.705
+++ kmail/kmheaders.cpp	11 Mar 2005 15:45:25 -0000
@@ -1105,17 +1105,34 @@ void KMHeaders::msgHeaderChanged(KMFolde
 
 
 //-----------------------------------------------------------------------------
 void KMHeaders::setMsgStatus (KMMsgStatus status, bool toggle)
 {
+  kdDebug() << k_funcinfo << endl;
   SerNumList serNums;
-  for (QListViewItemIterator it(this); it.current(); ++it)
+  QListViewItemIterator it(this);
+  while( it.current() )
+  {
     if ( it.current()->isSelected() && it.current()->isVisible() ) {
+      if ( it.current()->parent() && ( !it.current()->parent()->isOpen() ) )
+      {
+        // the item's parent is closed, don't traverse any more of this subtree
+        QListViewItem * lastAncestorWithSiblings = it.current()->parent();
+        // travel towards the root until we find an ancestor with siblings
+        while ( ( lastAncestorWithSiblings->depth() > 0 ) && !lastAncestorWithSiblings->nextSibling() )
+          lastAncestorWithSiblings = lastAncestorWithSiblings->parent();
+        // move the iterator to that ancestor's next sibling
+        it = QListViewItemIterator( lastAncestorWithSiblings->nextSibling() );
+        continue;
+      }
+
       HeaderItem *item = static_cast<HeaderItem*>(it.current());
       KMMsgBase *msgBase = mFolder->getMsgBase(item->msgId());
       serNums.append( msgBase->getMsgSerNum() );
     }
+    ++it;
+  }
   if (serNums.empty())
     return;
 
   KMCommand *command = new KMSetStatusCommand( status, serNums, toggle );
   command->start();
