From 4ac7a4054e31241813404cdfdf2cb5e8cf97b4f1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 15 May 2009 13:55:49 -0400 Subject: [PATCH] conversation tree interface --- actions/conversation.php | 96 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/actions/conversation.php b/actions/conversation.php index 05cfb76e3c..f3beade6c7 100644 --- a/actions/conversation.php +++ b/actions/conversation.php @@ -42,6 +42,7 @@ require_once(INSTALLDIR.'/lib/noticelist.php'); * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @link http://laconi.ca/ */ + class ConversationAction extends Action { var $id = null; @@ -95,9 +96,9 @@ class ConversationAction extends Action 'notice:conversation:'.$this->id, $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->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! + } +} \ No newline at end of file