From 2c33c7e38bc767330b4eebdc9e4d234caca72966 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Thu, 16 Jan 2014 09:41:19 -0500
Subject: [PATCH] Make message pagenav (prev/next) work with sorted multi-folder search results

---
 program/lib/Roundcube/rcube_result_multifolder.php |   40 ++++++++++++++++++++++++++++++++++++----
 1 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/program/lib/Roundcube/rcube_result_multifolder.php b/program/lib/Roundcube/rcube_result_multifolder.php
index 8d7ae5d..277a6d1 100644
--- a/program/lib/Roundcube/rcube_result_multifolder.php
+++ b/program/lib/Roundcube/rcube_result_multifolder.php
@@ -28,8 +28,11 @@
 {
     public $multi = true;
     public $sets = array();
+    public $folder;
 
     protected $meta = array();
+    protected $index = array();
+    protected $sorting;
     protected $order = 'ASC';
 
 
@@ -53,6 +56,19 @@
         $this->meta['count'] += $result->count();
     }
 
+    /**
+     * Store a global index of (sorted) message UIDs
+     */
+    public function set_message_index($headers, $sort_field, $sort_order)
+    {
+        $this->index = array();
+        foreach ($headers as $header) {
+            $this->index[] = $header->uid . '-' . $header->folder;
+        }
+
+        $this->sorting = $sort_field;
+        $this->order = $sort_order;
+    }
 
     /**
      * Checks the result from IMAP command
@@ -119,7 +135,10 @@
      */
     public function exists($msgid, $get_index = false)
     {
-        return false;
+        if (!empty($this->folder)) {
+            $msgid .= '-' . $this->folder;
+        }
+        return array_search($msgid, $this->index);
     }
 
 
@@ -157,7 +176,7 @@
      */
     public function get()
     {
-        return array();
+        return $this->index;
     }
 
 
@@ -179,9 +198,13 @@
      *
      * @return int Element value
      */
-    public function get_element($index)
+    public function get_element($idx)
     {
-        return null;
+        switch ($idx) {
+            case 'FIRST': return $this->index[0];
+            case 'LAST':  return end($this->index);
+            default:      return $this->index[$idx];
+        }
     }
 
 
@@ -195,6 +218,15 @@
      */
     public function get_parameters($param=null)
     {
+        $params = array(
+            'SORT' => $this->sorting,
+            'ORDER' => $this->order,
+        );
+
+        if ($param !== null) {
+            return $params[$param];
+        }
+
         return $params;
     }
 

--
Gitblit v1.9.1