Abstract out folder tree image generation.
authorMichael M Slusarz <slusarz@curecanti.org>
Mon, 28 Sep 2009 20:47:32 +0000 (14:47 -0600)
committerMichael M Slusarz <slusarz@curecanti.org>
Mon, 28 Sep 2009 20:49:40 +0000 (14:49 -0600)
Use this nicer tree in the advanced search page.

imp/folders.php
imp/js/search.js
imp/lib/UI/Folder.php [new file with mode: 0644]
imp/search.php
imp/templates/search/search.html
imp/themes/screen.css

index f266bca..bf1f2e1 100644 (file)
@@ -417,11 +417,16 @@ if (!empty($newmsgs)) {
     }
 }
 
+/* Get the tree images. */
+$imp_ui_folder = new IMP_UI_Folder();
+$tree_imgs = $imp_ui_folder->getTreeImages($raw_rows, array('expand_url' => $folders_url));
+
 /* Add some further information to the $raw_rows array. */
+$rows = array();
 $name_url = Horde_Util::addParameter(Horde::applicationUrl('mailbox.php'), 'no_newmail_popup', 1);
 $rowct = 0;
-$morembox = $rows = array();
-foreach ($raw_rows as $val) {
+
+foreach ($raw_rows as $key => $val) {
     $val['nocheckbox'] = !empty($val['vfolder']);
     if (!empty($val['vfolder']) && $val['editvfolder']) {
         $val['delvfolder'] = Horde::link($imp_search->deleteUrl($val['value']), _("Delete Virtual Folder")) . _("Delete") . '</a>';
@@ -445,65 +450,8 @@ foreach ($raw_rows as $val) {
         $val['name'] = Horde::link(Horde_Util::addParameter($name_url, 'mailbox', $val['value']), $val['vfolder'] ? $val['base_elt']['l'] : $val['display']) . $val['name'] . '</a>';
     }
 
-    $dir2 = $val['user_icon']
-        ? Horde::img($val['icon'], $val['alt'], null, $val['icondir'])
-        : '<span class="foldersImg ' . $val['class'] . '"></span>';
-
-    if ($val['children']) {
-        $dir = Horde_Util::addParameter($folders_url, 'folder', $val['value']);
-        if ($imaptree->isOpen($val['base_elt'])) {
-            $dir = Horde_Util::addParameter($dir, 'actionID', 'collapse_folder');
-            $alt = _("Collapse Folder");
-            if (empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) {
-                $tree_img = ($val['value'] == 'INBOX')
-                    ? 9
-                    : ($val['peek'] ? 10 : 11);
-            } else {
-                $tree_img = ($val['value'] == 'INBOX')
-                    ? 12
-                    : ($val['peek'] ? 13 : 14);
-            }
-        } else {
-            $dir = Horde_Util::addParameter($dir, 'actionID', 'expand_folder');
-            $alt = _("Expand Folder");
-            if (empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) {
-                $tree_img = ($val['value'] == 'INBOX')
-                    ? 15
-                    : ($val['peek'] ? 16 : 17);
-            } else {
-                $tree_img = ($val['value'] == 'INBOX')
-                    ? 18
-                    : ($val['peek'] ? 19 : 20);
-            }
-        }
-        $dir = Horde::link($dir, $alt) . '<span class="treeImg treeImg' . $tree_img . '"></span></a>' . $dir2;
-    } else {
-        if (($val['value'] == 'INBOX') && !$val['peek']) {
-            $dir = '<span class="treeImg"></span>' . $dir2;
-        } else {
-            if (empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) {
-                $tree_img = ($val['value'] == 'INBOX')
-                    ? 3
-                    : ($val['peek'] ? 2 : 4);
-            } else {
-                $tree_img = ($val['value'] == 'INBOX')
-                    ? 7
-                    : ($val['peek'] ? 6 : 8);
-            }
-            $dir = '<span class="treeImg treeImg' . $tree_img . '"></span>' . $dir2;
-        }
-    }
+    $val['line'] = $tree_imgs[$key];
 
-    $line = '';
-    $morembox[$val['level']] = $val['peek'];
-    for ($i = 0; $i < $val['level']; $i++) {
-        if ($morembox[$i]) {
-            $line .= '<span class="treeImg treeImg' . (empty($GLOBALS['nls']['rtl'][$GLOBALS['language']]) ? 1 : 5) . '"></span>';
-        } else {
-            $line .= '<span class="treeImg"></span>';
-        }
-    }
-    $val['line'] = $line . $dir;
     $rows[] = $val;
 }
 
index 53fb317..0d67c00 100644 (file)
@@ -33,11 +33,13 @@ var ImpSearch = {
 
         folders.each(function(f) {
             var n = $(node.cloneNode(true));
-            n.down().writeAttribute({ disabled: !Boolean(f.v), value: (f.v ? f.v.escapeHTML() : null) }).insert({ after: f.l });
+            n.down().writeAttribute({ disabled: Boolean(f.c), value: (f.co ? null : f.v.escapeHTML()) }).insert({ after: f.l });
             fragment.appendChild(n);
         });
 
         $('search_folders_hdr').next('DIV').update('').appendChild(fragment);
+
+        stripeAllElements();
     },
 
     updateSavedSearches: function(searches)
@@ -351,7 +353,7 @@ var ImpSearch = {
                     elt.hasClassName('arrowCollapsed')) {
                     elt.up().down().toggle().next().toggle().up().next().toggle();
                     if (elt.descendantOf('search_folders_hdr')) {
-                        elt.next('SPAN.searchFoldersActions').toggle();
+                        elt.next('SPAN.searchuiFoldersActions').toggle();
                     }
                 } else if (elt.hasClassName('searchuiDelete')) {
                     tmp = elt.up('TR');
diff --git a/imp/lib/UI/Folder.php b/imp/lib/UI/Folder.php
new file mode 100644 (file)
index 0000000..bb19e14
--- /dev/null
@@ -0,0 +1,131 @@
+<?php
+/**
+ * The IMP_UI_Folder:: class is designed to provide a place to store common
+ * code shared among IMP's various UI views for folders.
+ *
+ * Copyright 2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package IMP
+ */
+class IMP_UI_Folder
+{
+    /**
+     * Temporary array used to determine tree levels.
+     *
+     * @var array
+     */
+    var $_moreMbox = array();
+
+    /**
+     * Create the tree images for a list of folder elements.
+     *
+     * @var array $rows     Folder rows returned from IMP_Imap_Tree::build().
+     * @var array $options  Additional options:
+     * <pre>
+     * 'expand_url' - (string) The URL to use for expand/collapse links.
+     * </pre>
+     *
+     * @return array  An array of tree image strings.
+     */
+    public function getTreeImages($rows, $options = array())
+    {
+        $this->_moreMbox = array();
+        $out = array();
+
+        reset($rows);
+        while (list($key, $elt) = each($rows)) {
+            $out[$key] = $this->_getTreeImage($elt, $options);
+        }
+
+        return $out;
+    }
+
+    /**
+     * Create a tree image from a folder element entry.
+     *
+     * @var array $elt      An entry returned from IMP_Imap_Tree::element().
+     * @var array $options  See self::getTreeImages().
+     *
+     * @return string  The image string.
+     */
+    protected function _getTreeImage($elt, $options = array())
+    {
+        $alt = $dir = null;
+        $dir2 = $elt['user_icon']
+            ? Horde::img($elt['icon'], $elt['alt'], null, $elt['icondir'])
+            : '<span class="foldersImg ' . $elt['class'] . '"></span>';
+        $imaptree = IMP_Imap_Tree::singleton();
+
+        if ($elt['children'] && isset($options['expand_url'])) {
+            $dir = Horde_Util::addParameter($options['expand_url'], 'folder', $elt['value']);
+
+            if ($imaptree->isOpen($elt['base_elt'])) {
+                if (!is_null($dir)) {
+                    $dir = Horde_Util::addParameter($dir, 'actionID', 'collapse_folder');
+                    $alt = _("Collapse Folder");
+                }
+
+                if (empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) {
+                    $tree_img = ($elt['value'] == 'INBOX')
+                        ? 9
+                        : ($elt['peek'] ? 10 : 11);
+                } else {
+                    $tree_img = ($elt['value'] == 'INBOX')
+                        ? 12
+                        : ($elt['peek'] ? 13 : 14);
+                }
+            } else {
+                if (!is_null($dir)) {
+                    $dir = Horde_Util::addParameter($dir, 'actionID', 'expand_folder');
+                    $alt = _("Expand Folder");
+                }
+
+                if (empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) {
+                    $tree_img = ($elt['value'] == 'INBOX')
+                        ? 15
+                        : ($elt['peek'] ? 16 : 17);
+                } else {
+                    $tree_img = ($elt['value'] == 'INBOX')
+                        ? 18
+                        : ($elt['peek'] ? 19 : 20);
+                }
+            }
+
+            if (!is_null($dir)) {
+                $dir = Horde::link($dir, $alt) . '<span class="treeImg treeImg' . $tree_img . '"></span></a>' . $dir2;
+            }
+        } else {
+            if (($elt['value'] == 'INBOX') && !$elt['peek']) {
+                $dir = '<span class="treeImg"></span>' . $dir2;
+            } else {
+                if (empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) {
+                    $tree_img = ($elt['value'] == 'INBOX')
+                        ? 3
+                        : ($elt['peek'] ? 2 : 4);
+                } else {
+                    $tree_img = ($elt['value'] == 'INBOX')
+                        ? 7
+                        : ($elt['peek'] ? 6 : 8);
+                }
+                $dir = '<span class="treeImg treeImg' . $tree_img . '"></span>' . $dir2;
+            }
+        }
+
+        $line = '';
+        $this->_moreMbox[$elt['level']] = $elt['peek'];
+        for ($i = 0; $i < $elt['level']; $i++) {
+            if ($this->_moreMbox[$i]) {
+                $line .= '<span class="treeImg treeImg' . (empty($GLOBALS['nls']['rtl'][$GLOBALS['language']]) ? 1 : 5) . '"></span>';
+            } else {
+                $line .= '<span class="treeImg"></span>';
+            }
+        }
+
+        return $line . $dir;
+    }
+
+}
index c63db64..c07a6f4 100644 (file)
@@ -80,17 +80,25 @@ if (!empty($criteria)) {
 }
 
 /* Generate master folder list. */
-$show_unsub = ($subscribe = $prefs->getValue('subscribe'))
-    ? Horde_Util::getFormData('show_unsub', false)
-    : false;
+$imp_imap_tree = IMP_Imap_Tree::singleton();
+$mask = IMP_Imap_Tree::NEXT_SHOWCLOSED;
+$subscribe = $prefs->getValue('subscribe');
+if ($subscribe || !Horde_Util::getFormData('show_unsub')) {
+    $mask |= IMP_Imap_Tree::NEXT_SHOWSUB;
+}
+
+list($raw_rows,) = $imp_imap_tree->build($mask);
+
+$imp_ui_folder = new IMP_UI_Folder();
+$tree_imgs = $imp_ui_folder->getTreeImages($raw_rows);
 
-$imp_folder = IMP_Folder::singleton();
 $folders = array();
-foreach ($imp_folder->flist(array(), $subscribe && !$show_unsub) as $val) {
-    $folders[] = array_filter(array(
-        'l' => Horde_Text_Filter::filter($val['label'], 'space2html', array('charset' => $charset, 'encode' => true)),
-        'v' => $val['val']
-    ));
+foreach ($raw_rows as $key => $val) {
+    $folders[] = array(
+        'c' => intval($val['container']),
+        'l' => $tree_imgs[$key] . ' ' . $val['name'],
+        'v' => $val['value']
+    );
 }
 
 if (Horde_Util::getFormData('show_unsub') !== null) {
@@ -190,6 +198,7 @@ Horde::addInlineScript($on_domload, 'dom');
 
 $title = _("Search");
 Horde::addScriptFile('horde.js', 'horde', true);
+Horde::addScriptFile('stripe.js', 'horde', true);
 Horde::addScriptFile('search.js', 'imp', true);
 
 if ($dimp_view) {
index 5255f21..ba4382a 100644 (file)
@@ -54,7 +54,7 @@
   </span>
  </div>
 
- <div class="item" style="display:none">
+ <div class="item striped" style="display:none">
  </div>
 
 <if:virtualfolder>
index 8415d94..eb70f22 100644 (file)
@@ -176,7 +176,7 @@ div.msgActions, #fmanager div.folderActions {
 }
 
 /* Folder view. */
-#fmanager div, #fmanager div input {
+#checkAll0, #checkAll1 {
     vertical-align: middle;
 }
 #fmanager div.folderChoose {
@@ -438,7 +438,7 @@ span.treeImg {
     width: 20px;
     display: -moz-inline-stack;
     display: inline-block;
-    vertical-align: middle;
+    vertical-align: bottom;
 }
 
 span.treeImg1 {