From da5fa28d5705ab2b9991f39741f2a8f1751a25ad Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Wed, 25 Dec 2013 04:33:06 -0500
Subject: [PATCH] Display different icons when Trash folder is empty or full (#1485775)

---
 CHANGELOG                              |    1 
 program/steps/mail/list.inc            |   11 ++++-
 skins/classic/mail.css                 |    7 +++
 skins/classic/images/icons/folders.gif |    0 
 program/steps/mail/folders.inc         |   20 ++++++----
 program/steps/mail/check_recent.inc    |    6 +++
 program/steps/mail/getunread.inc       |   42 ++++++++++++--------
 skins/classic/images/icons/folders.png |    0 
 program/js/app.js                      |    6 +++
 program/steps/mail/move_del.inc        |   20 +++++++---
 10 files changed, 79 insertions(+), 34 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 146aa07..7a64d18 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Display different icons when Trash folder is empty or full (#1485775)
 - Remember last position of more headers switch (#1488323)
 - Fix so message flags modified by another client are applied on the list on refresh (#1485186)
 - Fix broken text/* attachments when forwarding/editing a message (#1489426)
diff --git a/program/js/app.js b/program/js/app.js
index 2438ff9..e6cc281 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -6459,6 +6459,12 @@
     this.env.quota_content = content;
   };
 
+  // update trash folder state
+  this.set_trash_count = function(count)
+  {
+    this[(count ? 'un' : '') + 'mark_folder'](this.env.trash_mailbox, 'empty', '', true);
+  };
+
   // update the mailboxlist
   this.set_unread_count = function(mbox, count, set_title, mark)
   {
diff --git a/program/steps/mail/check_recent.inc b/program/steps/mail/check_recent.inc
index 60da68a..d2d27a2 100644
--- a/program/steps/mail/check_recent.inc
+++ b/program/steps/mail/check_recent.inc
@@ -25,6 +25,7 @@
     return;
 }
 
+$trash     = $RCMAIL->config->get('trash_mbox');
 $current   = $RCMAIL->storage->get_folder();
 $check_all = $RCMAIL->action != 'refresh' || (bool)$RCMAIL->config->get('check_all_folders');
 
@@ -132,6 +133,11 @@
             $RCMAIL->output->set_env('recent_flags', $flags);
         }
     }
+
+    // set trash folder state
+    if ($mbox_name === $trash) {
+        $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($mbox_name, 'EXISTS'));
+    }
 }
 
 // trigger refresh hook
diff --git a/program/steps/mail/folders.inc b/program/steps/mail/folders.inc
index d7cfd93..1c9ed0d 100644
--- a/program/steps/mail/folders.inc
+++ b/program/steps/mail/folders.inc
@@ -27,7 +27,6 @@
 
 // send EXPUNGE command
 if ($RCMAIL->action == 'expunge') {
-
     $success = $RCMAIL->storage->expunge_folder($mbox);
 
     // reload message list if current mailbox
@@ -45,16 +44,16 @@
         $RCMAIL->display_server_error();
     }
 }
-
 // clear mailbox
-else if ($RCMAIL->action == 'purge')
-{
-    $delimiter = $RCMAIL->storage->get_hierarchy_delimiter();
-    $trash_regexp = '/^' . preg_quote($CONFIG['trash_mbox'] . $delimiter, '/') . '/';
-    $junk_regexp  = '/^' . preg_quote($CONFIG['junk_mbox'] . $delimiter, '/') . '/';
+else if ($RCMAIL->action == 'purge') {
+    $delimiter    = $RCMAIL->storage->get_hierarchy_delimiter();
+    $trash_mbox   = $RCMAIL->config->get('trash_mbox');
+    $junk_mbox    = $RCMAIL->config->get('junk_mbox');
+    $trash_regexp = '/^' . preg_quote($trash_mbox . $delimiter, '/') . '/';
+    $junk_regexp  = '/^' . preg_quote($junk_mbox . $delimiter, '/') . '/';
 
     // we should only be purging trash and junk (or their subfolders)
-    if ($mbox == $CONFIG['trash_mbox'] || $mbox == $CONFIG['junk_mbox']
+    if ($mbox == $trash_mbox || $mbox == $junk_mbox
         || preg_match($trash_regexp, $mbox) || preg_match($junk_regexp, $mbox)
     ) {
         $success = $RCMAIL->storage->clear_folder($mbox);
@@ -71,6 +70,11 @@
                 $OUTPUT->command('set_unread_count', $mbox, 0);
                 $OUTPUT->command('set_quota', $RCMAIL->quota_content());
                 rcmail_set_unseen_count($mbox, 0);
+
+                // set trash folder state
+                if ($mbox === $trash_mbox) {
+                    $OUTPUT->command('set_trash_count', 0);
+                }
             }
         }
         else {
diff --git a/program/steps/mail/getunread.inc b/program/steps/mail/getunread.inc
index fda6448..3b93e8e 100644
--- a/program/steps/mail/getunread.inc
+++ b/program/steps/mail/getunread.inc
@@ -23,27 +23,35 @@
 
 if (!empty($a_folders))
 {
-  $current = $RCMAIL->storage->get_folder();
-  $inbox = ($current == 'INBOX');
-  $check_all = (bool)$RCMAIL->config->get('check_all_folders');
+    $current   = $RCMAIL->storage->get_folder();
+    $inbox     = ($current == 'INBOX');
+    $trash     = $RCMAIL->config->get('trash_mbox');
+    $check_all = (bool)$RCMAIL->config->get('check_all_folders');
 
-  foreach ($a_folders as $mbox_row) {
-    $unseen_old = rcmail_get_unseen_count($mbox_row);
+    foreach ($a_folders as $mbox) {
+        $unseen_old = rcmail_get_unseen_count($mbox);
 
-    if (!$check_all && $unseen_old !== null && $mbox_row != $current)
-      $unseen = $unseen_old;
-    else
-      $unseen = $RCMAIL->storage->count($mbox_row, 'UNSEEN', $unseen_old === null);
+        if (!$check_all && $unseen_old !== null && $mbox != $current) {
+            $unseen = $unseen_old;
+        }
+        else {
+            $unseen = $RCMAIL->storage->count($mbox, 'UNSEEN', $unseen_old === null);
+        }
 
-    // call it always for current folder, so it can update counter
-    // after possible message status change when opening a message
-    // not in preview frame
-    if ($unseen || $unseen_old === null || $mbox_row == $current) {
-      $OUTPUT->command('set_unread_count', $mbox_row, $unseen, $inbox && $mbox_row == 'INBOX');
+        // call it always for current folder, so it can update counter
+        // after possible message status change when opening a message
+        // not in preview frame
+        if ($unseen || $unseen_old === null || $mbox == $current) {
+            $OUTPUT->command('set_unread_count', $mbox, $unseen, $inbox && $mbox_row == 'INBOX');
+        }
+
+        rcmail_set_unseen_count($mbox, $unseen);
+
+        // set trash folder state
+        if ($mbox === $trash) {
+            $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($mbox, 'EXISTS'));
+        }
     }
-
-    rcmail_set_unseen_count($mbox_row, $unseen);
-  }
 }
 
 $OUTPUT->send();
diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc
index 91c53e8..277564c 100644
--- a/program/steps/mail/list.inc
+++ b/program/steps/mail/list.inc
@@ -90,12 +90,14 @@
 rcmail_send_unread_count($mbox_name, !empty($_REQUEST['_refresh']), $unseen);
 
 // update message count display
-$pages = ceil($count/$RCMAIL->storage->get_pagesize());
+$pages  = ceil($count/$RCMAIL->storage->get_pagesize());
+$exists = $RCMAIL->storage->count($mbox_name, 'EXISTS');
+
 $OUTPUT->set_env('messagecount', $count);
 $OUTPUT->set_env('pagecount', $pages);
 $OUTPUT->set_env('threading', $threading);
 $OUTPUT->set_env('current_page', $count ? $RCMAIL->storage->get_page() : 1);
-$OUTPUT->set_env('exists', $RCMAIL->storage->count($mbox_name, 'EXISTS'));
+$OUTPUT->set_env('exists', $exists);
 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count), $mbox_name);
 
 // add message rows
@@ -123,5 +125,10 @@
     $OUTPUT->show_message('nomessagesfound', 'notice');
 }
 
+// set trash folder state
+if ($mbox_name === $RCMAIL->config->get('trash_mbox')) {
+    $OUTPUT->command('set_trash_count', $exists);
+}
+
 // send response
 $OUTPUT->send();
diff --git a/program/steps/mail/move_del.inc b/program/steps/mail/move_del.inc
index 5873739..7564bb8 100644
--- a/program/steps/mail/move_del.inc
+++ b/program/steps/mail/move_del.inc
@@ -28,12 +28,13 @@
 $old_count = $RCMAIL->storage->count(NULL, $threading ? 'THREADS' : 'ALL');
 $old_pages = ceil($old_count / $RCMAIL->storage->get_pagesize());
 
+$trash  = $RCMAIL->config->get('trash_mbox');
+
 // move messages
 if ($RCMAIL->action == 'move' && !empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) {
     $count  = sizeof(explode(',', ($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST))));
     $target = rcube_utils::get_input_value('_target_mbox', rcube_utils::INPUT_POST, true);
     $mbox   = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST, true);
-    $trash  = $RCMAIL->config->get('trash_mbox');
 
     $moved = $RCMAIL->storage->move_message($uids, $target, $mbox);
 
@@ -86,16 +87,15 @@
     $_SESSION['search'] = $RCMAIL->storage->refresh_search();
 }
 
-if ($_POST['_from'] == 'show')
-{
+if ($_POST['_from'] == 'show') {
   if ($next = rcube_utils::get_input_value('_next_uid', rcube_utils::INPUT_GPC))
     $OUTPUT->command('show_message', $next);
   else
     $OUTPUT->command('command', 'list');
 }
-else
-{
+else {
   $msg_count      = $RCMAIL->storage->count(NULL, $threading ? 'THREADS' : 'ALL');
+  $exists         = $RCMAIL->storage->count($mbox, 'EXISTS', true);
   $page_size      = $RCMAIL->storage->get_pagesize();
   $page           = $RCMAIL->storage->get_page();
   $pages          = ceil($msg_count / $page_size);
@@ -114,7 +114,7 @@
   $OUTPUT->set_env('messagecount', $msg_count);
   $OUTPUT->set_env('current_page', $page);
   $OUTPUT->set_env('pagecount', $pages);
-  $OUTPUT->set_env('exists', $RCMAIL->storage->count($mbox, 'EXISTS', true));
+  $OUTPUT->set_env('exists', $exists);
 
   // update mailboxlist
   $mbox = $RCMAIL->storage->get_folder();
@@ -144,6 +144,14 @@
 
     rcmail_js_message_list($a_headers, false);
   }
+
+  // set trash folder state
+  if ($mbox === $trash) {
+      $OUTPUT->command('set_trash_count', $exists);
+  }
+  else if ($target !== null && $target === $trash) {
+      $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($trash, 'EXISTS'));
+  }
 }
 
 // send response
diff --git a/skins/classic/images/icons/folders.gif b/skins/classic/images/icons/folders.gif
index eb06bd8..2795194 100644
--- a/skins/classic/images/icons/folders.gif
+++ b/skins/classic/images/icons/folders.gif
Binary files differ
diff --git a/skins/classic/images/icons/folders.png b/skins/classic/images/icons/folders.png
index 4c27052..9243252 100644
--- a/skins/classic/images/icons/folders.png
+++ b/skins/classic/images/icons/folders.png
Binary files differ
diff --git a/skins/classic/mail.css b/skins/classic/mail.css
index bf07383..f5406b5 100644
--- a/skins/classic/mail.css
+++ b/skins/classic/mail.css
@@ -425,7 +425,12 @@
 
 #mailboxlist li.trash a
 {
-  background-position: 5px -91px;
+  background-position: 5px -180px;
+}
+
+#mailboxlist li.trash.empty a
+{
+  background-position: 5px -90px;
 }
 
 #mailboxlist li a

--
Gitblit v1.9.1