1: <?php
2: /**
3: * The IMP_Imap_Thread class provides functions to manipulate threaded sorts
4: * of messages.
5: *
6: * Copyright 2005-2012 Horde LLC (http://www.horde.org/)
7: *
8: * See the enclosed file COPYING for license information (GPL). If you
9: * did not receive this file, see http://www.horde.org/licenses/gpl.
10: *
11: * @author Michael Slusarz <slusarz@horde.org>
12: * @category Horde
13: * @license http://www.horde.org/licenses/gpl GPL
14: * @package IMP
15: */
16: class IMP_Imap_Thread
17: {
18: /**
19: * The thread data object.
20: *
21: * @var Horde_Imap_Client_Data_Thread
22: */
23: protected $_thread;
24:
25: /**
26: * Constructor.
27: *
28: * @param Horde_Imap_Client_Data_Thread $thread The thread data object.
29: */
30: public function __construct($thread)
31: {
32: $this->_thread = $thread;
33: }
34:
35: /**
36: * Generate the thread representation for the given index list in the
37: * internal format.
38: *
39: * @param array $indices The list of indices to create a tree for.
40: * @param boolean $sortdir True for newest first, false for oldest first.
41: *
42: * @return array An array with the index as the key and the internal
43: * thread representation as the value.
44: * <pre>
45: * 0 - blank
46: * 1 - line
47: * 2 - join
48: * 3 - joinbottom-down
49: * 4 - joinbottom
50: * </pre>
51: */
52: public function getThreadTreeOb($indices, $sortdir)
53: {
54: $container = $last_level = $last_thread = null;
55: $thread_level = $tree = array();
56: $t = &$this->_thread;
57:
58: if (empty($indices)) {
59: return $tree;
60: }
61:
62: $indices = array_intersect($t->messageList(), $indices);
63:
64: /* If starting in the middle of a thread, the threadLevel tree needs
65: * to be built from the base of the current thread. */
66: $first = reset($indices);
67: foreach ($t->getThread(reset($indices)) as $val) {
68: if ($first == $val) {
69: break;
70: }
71: $thread_level[$t->getThreadIndent($val)] = $t->lastInLevel($val);
72: }
73:
74: foreach ($indices as $val) {
75: $tree[$val] = '';
76:
77: $indentBase = $t->getThreadBase($val);
78: if (empty($indentBase)) {
79: continue;
80: }
81:
82: $lines = '';
83: $indentLevel = $t->getThreadIndent($val);
84: $lastinlevel = $t->lastInLevel($val);
85:
86: if ($lastinlevel && ($indentBase == $val)) {
87: continue;
88: }
89:
90: if ($lastinlevel) {
91: $join_img = ($sortdir) ? 3 : 4;
92: } elseif (($indentLevel == 1) && ($indentBase == $val)) {
93: $join_img = ($sortdir) ? 4 : 3;
94: } else {
95: $join_img = 2;
96: }
97:
98: $thread_level[$indentLevel] = $lastinlevel;
99: $line = '';
100:
101: for ($i = 1; $i < $indentLevel; ++$i) {
102: $line .= intval(isset($thread_level[$i]) && !$thread_level[$i]);
103: }
104: $tree[$val] = $line . $join_img;
105: }
106:
107: return $sortdir
108: ? array_reverse($tree, true)
109: : $tree;
110: }
111:
112: /**
113: * Generate the thread representation image for the given index list.
114: *
115: * @param array $indices The list of indices to create a tree for.
116: * @param boolean $sortdir True for newest first, false for oldest first.
117: *
118: * @return array An array with the index as the key and the thread image
119: * representation as the value.
120: */
121: public function getThreadImageTree($indices, $sortdir)
122: {
123: $tree = array();
124:
125: foreach ($this->getThreadTreeOb($indices, $sortdir) as $k => $v) {
126: $tree[$k] = '';
127: for ($i = 0, $length = strlen($v); $i < $length; ++$i) {
128: $tree[$k] .= '<span class="treeImg treeImg' . $v[$i] . '"></span>';
129: }
130: }
131: return $tree;
132: }
133:
134: /**
135: * Generate the thread representation text for the given index list.
136: *
137: * @param array $indices The list of indices to create a tree for.
138: * @param boolean $sortdir True for newest first, false for oldest first.
139: *
140: * @return array An array with the index as the key and the thread image
141: * representation as the value.
142: */
143: public function getThreadTextTree($indices, $sortdir)
144: {
145: $tree = array();
146:
147: foreach ($this->getThreadTreeOb($indices, $sortdir) as $k => $v) {
148: $tmp = '';
149:
150: if (!empty($v)) {
151: foreach (str_split($v) as $c) {
152: switch (intval($c)) {
153: case 0:
154: $tmp .= ' ';
155: break;
156:
157: case '1':
158: $tmp .= '| ';
159: break;
160:
161: case '2':
162: $tmp .= '|-';
163: break;
164:
165: case '3':
166: $tmp .= '/-';
167: break;
168:
169: case '4':
170: $tmp .= '\-';
171: break;
172: }
173: }
174: }
175:
176: $tree[$k] = $tmp;
177: }
178:
179: return $tree;
180: }
181:
182: }
183: