#include "mutt_curses.h"
#include "sidebar.h"
#include "buffy.h"
-#include <libgen.h>
#include "keymap.h"
+
+#include "lib/mem.h"
+#include "lib/str.h"
+#include "lib/intl.h"
+
+#include <libgen.h>
#include <ctype.h>
-/*BUFFY *CurBuffy = 0;*/
-static BUFFY *TopBuffy = 0;
-static BUFFY *BottomBuffy = 0;
+static int TopBuffy = 0;
+static int CurBuffy = 0;
static int known_lines = 0;
static short initialized = 0;
static int prev_show_value;
static short saveSidebarWidth;
static char *entry = 0;
-static int quick_log10 (int n)
-{
+/* computes how many digets a number has;
+ * FIXME move out to library?
+ */
+static int quick_log10 (int n) {
int len = 0;
for (; n > 9; len++, n /= 10);
return (++len);
}
-/* CurBuffy should contain a valid buffy
- * mailbox before calling this function!!! */
+/* computes first entry to be shown */
void calc_boundaries (int menu)
{
- BUFFY *tmp = Incoming;
- int position;
- int i, count, mailbox_position;
+ int lines = 0;
+ if (list_empty(Incoming))
+ return;
/* correct known_lines if it has changed because of a window resize */
- if (known_lines != LINES) {
+ if (known_lines != LINES)
known_lines = LINES;
- }
- /* fix all the prev links on all the mailboxes
- * FIXME move this over to buffy.c where it belongs */
- for (; tmp->next != 0; tmp = tmp->next)
- tmp->next->prev = tmp;
-
- /* calculate the position of the current mailbox */
- position = 1;
- tmp = Incoming;
- while (tmp != CurBuffy) {
- position++;
- tmp = tmp->next;
- }
- /* calculate the size of the screen we can use */
- count = LINES - 2 - (menu != MENU_PAGER || option (OPTSTATUSONTOP));
- /* calculate the position of the current mailbox on the screen */
- mailbox_position = position % count;
- if (mailbox_position == 0)
- mailbox_position = count;
- /* determine topbuffy */
- TopBuffy = CurBuffy;
- for (i = mailbox_position; i > 1; i--)
- TopBuffy = TopBuffy->prev;
- /* determine bottombuffy */
- BottomBuffy = CurBuffy;
- for (i = mailbox_position; i < count && BottomBuffy->next; i++)
- BottomBuffy = BottomBuffy->next;
+ lines = LINES - 2 - (menu != MENU_PAGER || option (OPTSTATUSONTOP));
+ TopBuffy = CurBuffy - (CurBuffy % lines);
+ if (TopBuffy < 0)
+ TopBuffy = 0;
}
static char *shortened_hierarchy (char *box)
return safe_strdup (box);
}
+/* print single item
+ * FIXME this is completely fucked up right now
+ */
char *make_sidebar_entry (char *box, int size, int new, int flagged)
{
int i = 0, dlen, max, shortened = 0;
#if USE_IMAP
if (ImapHomeNamespace && mutt_strlen (ImapHomeNamespace) > 0) {
if (strncmp (box, ImapHomeNamespace, mutt_strlen (ImapHomeNamespace)) == 0
- && strcmp (box, ImapHomeNamespace) != 0) {
+ && mutt_strcmp (box, ImapHomeNamespace) != 0) {
box += mutt_strlen (ImapHomeNamespace) + 1;
}
}
return entry;
}
-void set_curbuffy (char buf[LONG_STRING])
-{
- BUFFY *tmp = CurBuffy = Incoming;
-
- if (!Incoming)
- return;
-
- while (1) {
- if (!strcmp (tmp->path, buf)) {
- CurBuffy = tmp;
- break;
- }
-
- if (tmp->next)
- tmp = tmp->next;
- else
- break;
- }
+/* returns folder name of currently
+ * selected folder for <sidebar-open>
+ */
+const char* sidebar_get_current (void) {
+ if (list_empty(Incoming))
+ return (NULL);
+ return ((char*) ((BUFFY*) Incoming->data[CurBuffy])->path);
}
-void set_buffystats (CONTEXT * Context)
-{
- BUFFY *tmp = Incoming;
+/* internally sets item to buf */
+void sidebar_set_current (const char* buf) {
+ int i = buffy_lookup (buf);
+ if (i >= 0)
+ CurBuffy = i;
+}
- if (!Context)
+/* fix counters for a context
+ * FIXME since ctx must not be of our business, move it elsewhere
+ */
+void sidebar_set_buffystats (CONTEXT* Context) {
+ int i = 0;
+ BUFFY* tmp = NULL;
+ if (!Context || list_empty(Incoming) || (i = buffy_lookup (Context->path)) < 0)
return;
- while (tmp) {
- if (strcmp (tmp->path, Context->path) == 0) {
- tmp->new = Context->new;
- tmp->msg_unread = Context->unread;
- tmp->msgcount = Context->msgcount;
- tmp->msg_flagged = Context->flagged;
- break;
- }
- tmp = tmp->next;
- }
+ tmp = (BUFFY*) Incoming->data[i];
+ tmp->new = Context->new;
+ tmp->msg_unread = Context->unread;
+ tmp->msgcount = Context->msgcount;
+ tmp->msg_flagged = Context->flagged;
}
-int draw_sidebar (int menu)
+/* actually draws something
+ * FIXME this needs some clue when to do it
+ * FIXME this is completely fucked up right now
+ */
+int sidebar_draw (int menu)
{
int lines = option (OPTHELP) ? 1 : 0;
BUFFY *tmp;
+ int i = 0;
short delim_len = mutt_strlen (SidebarDelim);
/* initialize first time */
return 0;
/* draw the divider */
- /* SETCOLOR(MT_COLOR_STATUS); */
SETCOLOR (MT_COLOR_SIDEBAR);
for (lines = 1;
lines < LINES - 1 - (menu != MENU_PAGER || option (OPTSTATUSONTOP));
move (lines, SidebarWidth - delim_len);
if (option (OPTASCIICHARS))
addstr (NONULL (SidebarDelim));
- else if (!option (OPTASCIICHARS) && !strcmp (SidebarDelim, "|"))
+ else if (!option (OPTASCIICHARS) && !mutt_strcmp (SidebarDelim, "|"))
addch (ACS_VLINE);
- else if ((Charset_is_utf8) && !strcmp (SidebarDelim, "|"))
+ else if ((Charset_is_utf8) && !mutt_strcmp (SidebarDelim, "|"))
addstr ("\342\224\202");
else
addstr (NONULL (SidebarDelim));
}
SETCOLOR (MT_COLOR_NORMAL);
- if (Incoming == 0)
+ if (list_empty(Incoming))
return 0;
- lines = option (OPTHELP) ? 1 : 0; /* go back to the top */
- if (CurBuffy == 0)
- CurBuffy = Incoming;
-#if 0
- if (known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0)
-#endif
- calc_boundaries (menu);
+ lines = option (OPTHELP) ? 1 : 0; /* go back to the top */
- tmp = TopBuffy;
+ calc_boundaries (menu);
- for (;
- tmp && lines < LINES - 1 - (menu != MENU_PAGER
- || option (OPTSTATUSONTOP));
- tmp = tmp->next) {
- if (tmp == CurBuffy)
+ for (i = TopBuffy; i < Incoming->length && lines < LINES - 1 -
+ (menu != MENU_PAGER || option (OPTSTATUSONTOP)); i++) {
+ tmp = (BUFFY*) Incoming->data[i];
+ if (i == CurBuffy)
SETCOLOR (MT_COLOR_INDICATOR);
else if (tmp->msg_flagged > 0)
SETCOLOR (MT_COLOR_FLAGGED);
move (lines, 0);
if (option (OPTSIDEBARNEWMAILONLY)) {
if (tmp->msg_unread > 0) {
- if (Context && !strcmp (tmp->path, Context->path)) {
+ if (Context && !mutt_strcmp (tmp->path, Context->path)) {
printw ("%.*s", SidebarWidth - delim_len,
make_sidebar_entry (basename (tmp->path),
Context->msgcount, Context->unread,
}
}
else {
- if (Context && !strcmp (tmp->path, Context->path)) {
+ if (Context && !mutt_strcmp (tmp->path, Context->path)) {
printw ("%.*s", SidebarWidth - delim_len,
make_sidebar_entry (basename (tmp->path),
Context->msgcount, Context->unread,
return 0;
}
-BUFFY *exist_next_new ()
-{
- BUFFY *tmp = CurBuffy;
-
- if (tmp == NULL)
- return NULL;
- while (tmp->next != NULL) {
- tmp = tmp->next;
- if (tmp->msg_unread)
- return tmp;
- }
- return NULL;
+/* returns index of new item with new mail or -1 */
+static int exist_next_new () {
+ int i = 0;
+ if (list_empty(Incoming))
+ return (-1);
+ i = CurBuffy + 1;
+ while (i < Incoming->length)
+ if (((BUFFY*) Incoming->data[i++])->msg_unread)
+ return (i-1);
+ return (-1);
}
-BUFFY *exist_prev_new ()
-{
- BUFFY *tmp = CurBuffy;
-
- if (tmp == NULL)
- return NULL;
- while (tmp->prev != NULL) {
- tmp = tmp->prev;
- if (tmp->msg_unread)
- return tmp;
- }
- return NULL;
+/* returns index of prev item with new mail or -1 */
+static int exist_prev_new () {
+ int i = 0;
+ if (list_empty(Incoming))
+ return (-1);
+ i = CurBuffy - 1;
+ while (i >= 0)
+ if (((BUFFY*) Incoming->data[i--])->msg_unread)
+ return (i+1);
+ return (-1);
}
+void sidebar_scroll (int op, int menu) {
+ int i = 0;
-void scroll_sidebar (int op, int menu)
-{
- BUFFY *tmp;
-
- if (!SidebarWidth)
- return;
- if (!CurBuffy)
+ if (!SidebarWidth || list_empty(Incoming))
return;
switch (op) {
case OP_SIDEBAR_NEXT:
if (!option (OPTSIDEBARNEWMAILONLY)) {
- if (CurBuffy->next == NULL) {
+ if (CurBuffy + 1 == Incoming->length) {
mutt_error (_("You are on the last mailbox."));
return;
}
- CurBuffy = CurBuffy->next;
+ CurBuffy++;
break;
} /* the fall-through is intentional */
case OP_SIDEBAR_NEXT_NEW:
- if ((tmp = exist_next_new ()) == NULL) {
+ if ((i = exist_next_new ()) < 0) {
mutt_error (_("No next mailboxes with new mail."));
return;
}
else
- CurBuffy = tmp;
+ CurBuffy = i;
break;
case OP_SIDEBAR_PREV:
if (!option (OPTSIDEBARNEWMAILONLY)) {
- if (CurBuffy->prev == NULL) {
+ if (CurBuffy == 0) {
mutt_error (_("You are on the first mailbox."));
return;
}
- CurBuffy = CurBuffy->prev;
+ CurBuffy--;
break;
} /* the fall-through is intentional */
case OP_SIDEBAR_PREV_NEW:
- if ((tmp = exist_prev_new ()) == NULL) {
+ if ((i = exist_prev_new ()) < 0) {
mutt_error (_("No previous mailbox with new mail."));
return;
}
else
- CurBuffy = tmp;
+ CurBuffy = i;
break;
case OP_SIDEBAR_SCROLL_UP:
- CurBuffy = TopBuffy;
- if (CurBuffy != Incoming) {
- calc_boundaries (menu);
- CurBuffy = CurBuffy->prev;
+ if (TopBuffy == 0) {
+ mutt_error (_("You are on the first mailbox."));
+ return;
}
+ CurBuffy -= known_lines;
+ if (CurBuffy < 0)
+ CurBuffy = 0;
break;
case OP_SIDEBAR_SCROLL_DOWN:
- CurBuffy = BottomBuffy;
- if (CurBuffy->next) {
- calc_boundaries (menu);
- CurBuffy = CurBuffy->next;
+ if (TopBuffy + known_lines >= Incoming->length) {
+ mutt_error (_("You are on the last mailbox."));
+ return;
}
+ CurBuffy += known_lines;
+ if (CurBuffy >= Incoming->length)
+ CurBuffy = Incoming->length;
break;
default:
return;
}
calc_boundaries (menu);
- draw_sidebar (menu);
+ sidebar_draw (menu);
}