From: Art Cancro Date: Wed, 3 Feb 2010 05:26:25 +0000 (+0000) Subject: * New new BBS view X-Git-Tag: v7.86~464 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=48d3253378cdaf1270b3377c845cb5820657af34 * New new BBS view --- diff --git a/webcit/bbsview_renderer.c b/webcit/bbsview_renderer.c index 4aadbeb88..45b67fb6e 100644 --- a/webcit/bbsview_renderer.c +++ b/webcit/bbsview_renderer.c @@ -3,6 +3,10 @@ * * BBS View renderer module for WebCit * + * Note: we briefly had a dynamic UI for this. I thought it was cool, but + * it was not received well by the user community. If you want to play + * with it, go get r8256 of bbsview_renderer.c and have fun. + * * Copyright (c) 1996-2010 by the citadel.org team * * This program is free software; you can redistribute it and/or modify @@ -20,18 +24,25 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#define RANGE 5 + #include "webcit.h" #include "webserver.h" #include "groupdav.h" /* * Data which gets passed around between the various functions in this module + * + * We do this weird "pivot point" thing instead of starting the page numbers at 0 or 1 so that + * the border between old and new messages always falls on a page boundary. We'll renumber them + * to page numbers starting at 1 when presenting them to the user. */ struct bbsview { long *msgs; /* Array of msgnums for messages we are displaying */ int num_msgs; /* Number of msgnums stored in 'msgs' */ int alloc_msgs; /* Currently allocated size of array */ - long lastseen; /* msgnum of the last seen message in this room */ + long pivot_msgnum; /* Page numbers are relative to this message number */ + int requested_page; /* Which page number did the user request? */ }; @@ -76,35 +87,33 @@ int bbsview_GetParamsGetServerCall(SharedMessageStatus *Stat, memset(BBS, 0, sizeof(struct bbsview)); *ViewSpecific = BBS; - Stat->startmsg = -1; - Stat->sortit = 1; - BBS->lastseen = bbsview_get_last_seen(); /* FIXME do something with this */ - - rlid[oper].cmd(cmd, len); /* this performs the server call to fetch the msg list */ + Stat->startmsg = -1; /* not used here */ + Stat->sortit = 1; /* not used here */ + Stat->num_displayed = DEFAULT_MAXMSGS; /* not used here */ + BBS->requested_page = 0; + + if (havebstr("page")) { + BBS->requested_page = ibstr("page"); + } + if (havebstr("pivot")) { + BBS->pivot_msgnum = ibstr("pivot"); + } + else if (oper == 2) { /* 2 == "read all" (otherwise we pivot at the beginning of new msgs) */ + BBS->pivot_msgnum = 0; /* start from the top */ + } + else { + BBS->pivot_msgnum = bbsview_get_last_seen(); + } + if (havebstr("maxmsgs")) { Stat->maxmsgs = ibstr("maxmsgs"); } if (Stat->maxmsgs == 0) Stat->maxmsgs = DEFAULT_MAXMSGS; - Stat->num_displayed = DEFAULT_MAXMSGS; - if (havebstr("startmsg")) { - Stat->startmsg = lbstr("startmsg"); - } - - return 200; -} - - -/* - * begin_ajax_response() was moved from bbsview_LoadMsgFromServer() to here ... - */ -int bbsview_PrintViewHeader(SharedMessageStatus *Stat, void **ViewSpecific) -{ - if (WC->is_ajax) { - begin_ajax_response(); /* for non-ajax, headers are output in messages.c */ - } - + /* perform a "read all" call to fetch the message list -- we'll cut it down later */ + rlid[2].cmd(cmd, len); + return 200; } @@ -121,11 +130,11 @@ int bbsview_LoadMsgFromServer(SharedMessageStatus *Stat, struct bbsview *BBS = (struct bbsview *) *ViewSpecific; if (BBS->alloc_msgs == 0) { - BBS->alloc_msgs = Stat->maxmsgs; + BBS->alloc_msgs = 1000; BBS->msgs = malloc(BBS->alloc_msgs * sizeof(long)); } - /* Theoretically this never happens because the initial allocation == maxmsgs */ + /* Check our buffer size */ if (BBS->num_msgs >= BBS->alloc_msgs) { BBS->alloc_msgs *= 2; BBS->msgs = realloc(BBS->msgs, (BBS->alloc_msgs * sizeof(long))); @@ -136,6 +145,7 @@ int bbsview_LoadMsgFromServer(SharedMessageStatus *Stat, return 200; } + int bbsview_sortfunc(const void *s1, const void *s2) { long l1; long l2; @@ -155,34 +165,12 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, { struct bbsview *BBS = (struct bbsview *) *ViewSpecific; int i; + int seq; const StrBuf *Mime; - char olderdiv[64]; - char newerdiv[64]; - int doing_older_messages = 0; - int doing_newer_messages = 0; - - int increments[] = { 20, 50, 100 } ; -#define NUM_INCREMENTS (sizeof(increments) / sizeof(int)) - - snprintf(olderdiv, sizeof olderdiv, "olderdiv%08lx%08x", time(NULL), rand()); - snprintf(newerdiv, sizeof newerdiv, "newerdiv%08lx%08x", time(NULL), rand()); - - /* Determine whether we are in the middle of a 'click for older messages' or 'click for - * newer messages' operation. If neither, then we are in the initial page load. - */ - if (!strcasecmp(bstr("gt_or_lt"), "lt")) { - doing_older_messages = 1; - doing_newer_messages = 0; - } - else if (!strcasecmp(bstr("gt_or_lt"), "gt")) { - doing_older_messages = 0; - doing_newer_messages = 1; - } - else { - doing_older_messages = 0; - doing_newer_messages = 0; - } - + int pivot_index = 0; + int page_offset = 0; + int start_index = 0; + int end_index = 0; /* Cut the message list down to the requested size */ if (Stat->nummsgs > 0) { @@ -193,121 +181,109 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, if (BBS->num_msgs > Stat->maxmsgs) { - if (doing_older_messages) { - /* LT ... cut it down to the LAST 20 messages received */ - memcpy(&BBS->msgs[0], &BBS->msgs[BBS->num_msgs - Stat->maxmsgs], - (Stat->maxmsgs * sizeof(long)) - ); - BBS->num_msgs = Stat->maxmsgs; + /* Locate the pivot point in our message index */ + for (i=0; i<(BBS->num_msgs); ++i) { + if (BBS->msgs[i] <= BBS->pivot_msgnum) { + pivot_index = i; + } } - else { - /* GT ... cut it down to the FIRST 20 messages received */ - BBS->num_msgs = Stat->maxmsgs; - } - } - } + page_offset = (pivot_index / Stat->maxmsgs) + 2; - /* Supply the link to prepend the previous 20 messages */ - - if ((!WC->is_ajax) && (Stat->nummsgs == 0)) { - wc_printf("
", olderdiv); - wc_printf("
"); - for (i=0; i", - olderdiv, - LONG_MAX, - increments[i] - ); - wc_printf("↑ "); - wc_printf(_("Previous %d"), increments[i]); - wc_printf(" ↑"); - wc_printf(""); } - wc_printf("
"); - wc_printf("

"); - wc_printf(_("No messages here.")); - wc_printf("
\n"); - wc_printf("
"); } - else if (doing_newer_messages == 0) { - wc_printf("
", olderdiv); - wc_printf("
"); - if (Stat->nummsgs > 0) { - for (i=0; i", - olderdiv, - BBS->msgs[0], - increments[i] - ); - wc_printf("↑ "); - wc_printf(_("Previous %d"), increments[i]); - wc_printf(" ↑"); - wc_printf(""); - } - wc_printf("
"); - } - wc_printf("
"); - } - - /* Non-empty message set... */ - if (Stat->nummsgs > 0) { - /* Render the messages */ - - for (i=0; inum_msgs; ++i) { - read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime); - } - } + start_index = pivot_index + (BBS->requested_page * Stat->maxmsgs) ; + if (start_index < 0) start_index = 0; + end_index = start_index + Stat->maxmsgs - 1; + for (seq = 0; seq < 3; ++seq) { /* cheap and sleazy way of rendering the funbar twice */ - /* Supply the link to append the next 20 messages */ + if (seq == 1) { + /* display the selected range of messages */ - if (doing_older_messages == 0) { - wc_printf("
", newerdiv); - if (Stat->nummsgs >= Stat->maxmsgs) { - wc_printf("
"); - for (i=0; i", - newerdiv, - BBS->msgs[BBS->num_msgs-1], - increments[i] - ); - wc_printf("↓ "); - wc_printf(_("Next %d"), increments[i]); - wc_printf(" ↓"); - wc_printf(""); + if (Stat->nummsgs > 0) { + wc_printf("\n"); + for (i=start_index; (i<=end_index && i<=BBS->num_msgs); ++i) { + if (BBS->msgs[i] > 0L) { + read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime); + } + } + wc_printf("
\n"); } - wc_printf("
"); } else { - long gt = 0; /* if new messages appear later, where will they begin? */ - if (Stat->nummsgs > 0) { - gt = BBS->msgs[BBS->num_msgs-1]; - } - else { - gt = atol(bstr("gt")); - } - wc_printf("", - newerdiv, - gt, - Stat->maxmsgs - ); + /* Display the range selecto-bar */ + wc_printf("
"); - wc_printf("↓ "); - wc_printf("%s", _("no more messages")); - wc_printf(" ↓"); - wc_printf("
"); - wc_printf("
"); + wc_printf(_("Go to page: ")); + + int first = 1; + int last = (BBS->num_msgs / Stat->maxmsgs) + 2 ; + + for (i=1; i<=last; ++i) { + + if ( + (i == first) + || (i == last) + || ((i - page_offset) == BBS->requested_page) + || ( + ((BBS->requested_page - (i - page_offset)) < RANGE) + && ((BBS->requested_page - (i - page_offset)) > (0 - RANGE)) + ) + ) { + + if ( + (i == last) + && (last - (BBS->requested_page + page_offset) > RANGE) + ) { + wc_printf("... "); + } + if ((i - page_offset) == BBS->requested_page) { + wc_printf("["); + } + else { + wc_printf("", + BBS->pivot_msgnum, + i - page_offset + ); + wc_printf(""); + } + if ( + (i == first) + && ((BBS->requested_page + page_offset) > (RANGE + 1)) + ) { + wc_printf(_("First")); + } + else if ( + (i == last) + && (last - (BBS->requested_page + page_offset) > RANGE) + ) { + wc_printf(_("Last")); + } + else { + wc_printf("%d", i); + } + if ((i - page_offset) == BBS->requested_page) { + wc_printf("]"); + } + else { + wc_printf(""); + wc_printf(""); + } + if ( + (i == first) + && ((BBS->requested_page + page_offset) > (RANGE + 1)) + ) { + wc_printf(" ..."); + } + if (i != last) { + wc_printf(" "); + } + } + } + wc_printf("
\n"); } - wc_printf(""); - } - - /* Leave a little padding at the bottom, but only for the initial page load -- don't keep - * adding it every time we extend the visible message set. - */ - if (!WC->is_ajax) { - wc_printf("



"); } return(0); @@ -323,16 +299,11 @@ int bbsview_Cleanup(void **ViewSpecific) } free(BBS); - if (WC->is_ajax) { - end_ajax_response(); - WC->is_ajax = 0; - } - else { - wDumpContent(1); - } + wDumpContent(1); return 0; } + void InitModule_BBSVIEWRENDERERS (void) @@ -340,9 +311,10 @@ InitModule_BBSVIEWRENDERERS RegisterReadLoopHandlerset( VIEW_BBS, bbsview_GetParamsGetServerCall, - bbsview_PrintViewHeader, + NULL, NULL, bbsview_LoadMsgFromServer, bbsview_RenderView_or_Tail, - bbsview_Cleanup); + bbsview_Cleanup + ); } diff --git a/webcit/msg_renderers.c b/webcit/msg_renderers.c index 5de3f3ba3..9f35f8673 100644 --- a/webcit/msg_renderers.c +++ b/webcit/msg_renderers.c @@ -1160,6 +1160,7 @@ void servcmd_readold(char *buf, long bufsize) } +/* DO NOT REORDER OR REMOVE ANY OF THESE */ readloop_struct rlid[] = { { {HKEY("do_search")}, servcmd_do_search }, { {HKEY("headers")}, servcmd_headers }, diff --git a/webcit/static/wclib.js b/webcit/static/wclib.js index 334bf03ab..8fd9b16bd 100644 --- a/webcit/static/wclib.js +++ b/webcit/static/wclib.js @@ -954,17 +954,3 @@ function DeleteSMTPqueueMsg(msgnum1, msgnum2) { } ); } - -/* - * Update function for BBS view - */ -function moremsgs(target_div, gt_or_lt, gt_or_lt_value, maxmsgs) -{ - $(target_div).innerHTML = '
'; - p = gt_or_lt + '=' + gt_or_lt_value + '&maxmsgs=' + maxmsgs - + '&is_summary=0&is_ajax=1' - + '>_or_lt=' + gt_or_lt - + '&r=' + CtdlRandomString(); - new Ajax.Updater(target_div, 'read' + gt_or_lt, - { method: 'get', parameters: p, evalScripts: true } ); -} diff --git a/webcit/static/webcit.css b/webcit/static/webcit.css index 7978ab695..f616bc545 100644 --- a/webcit/static/webcit.css +++ b/webcit/static/webcit.css @@ -563,7 +563,7 @@ body, #global { .moreprompt { text-align: center; - font-size: 130%; + font-size: 100%; background-color: #004E79; color: #dddddd; }