conversation tree interface

This commit is contained in:
Evan Prodromou 2009-05-15 13:55:49 -04:00
parent 99f8501d32
commit 4ac7a4054e

View File

@ -42,6 +42,7 @@ require_once(INSTALLDIR.'/lib/noticelist.php');
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://laconi.ca/ * @link http://laconi.ca/
*/ */
class ConversationAction extends Action class ConversationAction extends Action
{ {
var $id = null; var $id = null;
@ -95,9 +96,9 @@ class ConversationAction extends Action
'notice:conversation:'.$this->id, 'notice:conversation:'.$this->id,
$offset, $limit); $offset, $limit);
$nl = new NoticeList($notices, $this); $ct = new ConversationTree($notices, $this);
$cnt = $nl->show(); $cnt = $ct->show();
$this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE, $this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE,
$this->page, 'conversation', array('id' => $this->id)); $this->page, 'conversation', array('id' => $this->id));
@ -105,3 +106,94 @@ class ConversationAction extends Action
} }
class ConversationTree extends NoticeList
{
var $tree = null;
var $table = null;
function show()
{
$cnt = 0;
$this->tree = array();
$table = array();
while ($this->notice->fetch()) {
$cnt++;
$this->table[$this->notice->id] = clone($this->notice);
if (is_null($notice->reply_to)) {
// We assume no notice has -1 ID
$this->tree[-1] = array($notice->id);
} else if (array_key_exists($notice->reply_to, $this->tree)) {
$this->tree[$notice->reply_to][] = $notice->id;
} else {
$this->tree[$notice->reply_to] = array($notice->id);
}
}
$this->out->elementStart('div', array('id' =>'notices_primary'));
$this->out->element('h2', null, _('Notices'));
$this->out->elementStart('ul', array('class' => 'notices'));
if (array_key_exists(-1, $this->tree)) {
$this->showNoticePlus($this->tree[-1][0]);
}
$this->out->elementEnd('ul');
$this->out->elementEnd('div');
return $cnt;
}
function showNoticePlus($id)
{
$notice = $this->table[$id];
print_r($notice);
// We take responsibility for doing the li
$this->out->elementStart('li', array('class' => 'hentry notice',
'id' => 'notice-' . $this->notice->id));
$item = $this->newListItem($notice);
$item->show();
if (array_key_exists($id, $this->tree)) {
$children = $this->tree[$id];
$this->out->elementStart('ul', array('class' => 'notices'));
foreach ($children as $child) {
$this->showNoticePlus($child);
}
$this->out->elementEnd('ul');
}
$this->out->elementEnd('li');
}
function newListItem($notice)
{
return new ConversationTreeItem($notice, $this->out);
}
}
class ConversationTreeItem extends NoticeListItem
{
function showStart()
{
// skip; ConversationTree draws the list
}
function showEnd()
{
// skip; ConversationTree draws the list
}
function showContext()
{
// skip; this _is_ the context!
}
}