From 34ebe0ba2c726bc679778dfb9faf92b30f303494 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 11 Jul 2009 09:28:56 -0400
Subject: [PATCH] - speed up adding of messages to the list after message move/delete

---
 program/include/rcube_imap.php  |   13 ++++++++++---
 program/steps/mail/mark.inc     |    7 ++-----
 program/steps/mail/move_del.inc |    8 +++-----
 3 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 9b8d7d0..5bd3542 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -537,13 +537,14 @@
    * @param   int      Current page to list
    * @param   string   Header field to sort by
    * @param   string   Sort order [ASC|DESC]
+   * @param   boolean  Number of slice items to extract from result array
    * @return  array    Indexed array with message header objects
    * @access  public   
    */
-  function list_headers($mbox_name='', $page=NULL, $sort_field=NULL, $sort_order=NULL)
+  function list_headers($mbox_name='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
     {
     $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-    return $this->_list_headers($mailbox, $page, $sort_field, $sort_order);
+    return $this->_list_headers($mailbox, $page, $sort_field, $sort_order, false, $slice);
     }
 
 
@@ -553,7 +554,7 @@
    * @access  private
    * @see     rcube_imap::list_headers
    */
-  private function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE)
+  private function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE, $slice=0)
     {
     if (!strlen($mailbox))
       return array();
@@ -591,6 +592,9 @@
       $max = max($msg_index);
       $msg_index = array_slice($msg_index, $begin, $end-$begin);
 
+      if ($slice)
+        $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
+
       // fetch reqested headers from server
       $this->_fetch_headers($mailbox, join(',', $msg_index), $a_msg_headers, $cache_key);
       }
@@ -607,6 +611,9 @@
       list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
       $msg_index = array_slice($msg_index, $begin, $end-$begin);
 
+      if ($slice)
+        $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
+
       // fetch reqested headers from server
       $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key);
       }
diff --git a/program/steps/mail/mark.inc b/program/steps/mail/mark.inc
index 6a8a3ca..b5ba4af 100644
--- a/program/steps/mail/mark.inc
+++ b/program/steps/mail/mark.inc
@@ -100,12 +100,9 @@
 	$sort_col   = isset($_SESSION['sort_col'])   ? $_SESSION['sort_col']   : $CONFIG['message_sort_col'];
 	$sort_order = isset($_SESSION['sort_order']) ? $_SESSION['sort_order'] : $CONFIG['message_sort_order'];
   
-	$a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order);
-	if (!$jump_back) {
-          $a_headers = array_slice($a_headers, -$count, $count);
-        }
+	$a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order, $count);
       
-      rcmail_js_message_list($a_headers, false, false);
+        rcmail_js_message_list($a_headers, false, false);
       }
     }
   }
diff --git a/program/steps/mail/move_del.inc b/program/steps/mail/move_del.inc
index df7bef9..d22cd35 100644
--- a/program/steps/mail/move_del.inc
+++ b/program/steps/mail/move_del.inc
@@ -115,11 +115,9 @@
   if ($addrows && ($jump_back || $nextpage_count > 0)) {
     $sort_col   = isset($_SESSION['sort_col'])   ? $_SESSION['sort_col']   : $CONFIG['message_sort_col'];
     $sort_order = isset($_SESSION['sort_order']) ? $_SESSION['sort_order'] : $CONFIG['message_sort_order'];
-  
-    $a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order);
-    if (!$jump_back) {
-        $a_headers = array_slice($a_headers, -$count, $count);
-    }
+
+    $a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order, $count);
+
     rcmail_js_message_list($a_headers, false, false);
   }
 }

--
Gitblit v1.9.1