move more files.
[apps/madmutt.git] / lib-ui / status.c
diff --git a/lib-ui/status.c b/lib-ui/status.c
new file mode 100644 (file)
index 0000000..1f756a5
--- /dev/null
@@ -0,0 +1,312 @@
+/*
+ * Copyright notice from original mutt:
+ * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <lib-lib/mem.h>
+#include <lib-lib/str.h>
+#include <lib-lib/macros.h>
+#include <lib-lib/mapping.h>
+
+#include <lib-ui/curses.h>
+#include <lib-ui/menu.h>
+
+#include "mutt.h"
+#include "sort.h"
+#include "mx.h"
+#include "buffy.h"
+
+
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+
+#define SW              (option(OPTMBOXPANE)?SidebarWidth:0)
+
+static char *get_sort_str (char *buf, ssize_t buflen, int method)
+{
+  snprintf (buf, buflen, "%s%s%s",
+            (method & SORT_REVERSE) ? "reverse-" : "",
+            (method & SORT_LAST) ? "last-" : "",
+            mutt_getnamebyvalue (method & SORT_MASK, SortMethods));
+  return buf;
+}
+
+/* %b = number of incoming folders with unread messages [option]
+ * %B = short mailbox path
+ * %d = number of deleted messages [option]
+ * %f = full mailbox path
+ * %F = number of flagged messages [option]
+ * %h = hostname
+ * %l = length of mailbox (in bytes) [option]
+ * %m = total number of messages [option]
+ * %M = number of messages shown (virutal message count when limiting) [option]
+ * %n = number of new messages [option]
+ * %p = number of postponed messages [option]
+ * %P = percent of way through index
+ * %r = readonly/wontwrite/changed flag
+ * %s = current sorting method ($sort)
+ * %S = current aux sorting method ($sort_aux)
+ * %t = # of tagged messages [option]
+ * %v = Madmutt version 
+ * %V = currently active limit pattern [option] */
+static const char *status_format_str (char *buf, ssize_t buflen, char op,
+                                      const char *src, const char *prefix,
+                                      const char *ifstring,
+                                      const char *elsestring,
+                                      unsigned long data, format_flag flags)
+{
+  char fmt[SHORT_STRING], tmp[SHORT_STRING];
+  const char *cp, *p;
+  int count, optional = (flags & M_FORMAT_OPTIONAL);
+  MUTTMENU *menu = (MUTTMENU *) data;
+
+  *buf = 0;
+  switch (op) {
+  case 'b':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, buffy_check (0));
+    }
+    else if (!buffy_check (0))
+      optional = 0;
+    break;
+
+  case 'B':
+    snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+    if (Context && Context->compressinfo && Context->realpath) {
+      if ((p = strrchr (Context->realpath, '/')))
+        m_strcpy(tmp, sizeof(tmp), p + 1);
+      else
+        m_strcpy(tmp, sizeof(tmp), Context->realpath);
+    }
+    else
+    if (Context && Context->path) {
+      if ((p = strrchr (Context->path, '/')))
+        m_strcpy(tmp, sizeof(tmp), p + 1);
+      else
+        m_strcpy(tmp, sizeof(tmp), Context->path);
+    }
+    else
+      m_strcpy(tmp, sizeof(tmp), _("no mailbox"));
+    snprintf (buf, buflen, fmt, tmp);
+    break;
+
+  case 'd':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, Context ? Context->deleted : 0);
+    }
+    else if (!Context || !Context->deleted)
+      optional = 0;
+    break;
+
+  case 'h':
+    snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+    snprintf (buf, buflen, fmt, NONULL (Hostname));
+    break;
+
+  case 'f':
+    snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+    if (Context && Context->compressinfo && Context->realpath) {
+      m_strcpy(tmp, sizeof(tmp), Context->realpath);
+      mutt_pretty_mailbox (tmp);
+    }
+    else
+    if (Context && Context->path) {
+      m_strcpy(tmp, sizeof(tmp), Context->path);
+      mutt_pretty_mailbox (tmp);
+    }
+    else
+      m_strcpy(tmp, sizeof(tmp), _("(no mailbox)"));
+    snprintf (buf, buflen, fmt, tmp);
+    break;
+
+  case 'F':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, Context ? Context->flagged : 0);
+    }
+    else if (!Context || !Context->flagged)
+      optional = 0;
+    break;
+
+  case 'l':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+      mutt_pretty_size (tmp, sizeof (tmp), Context ? Context->size : 0);
+      snprintf (buf, buflen, fmt, tmp);
+    }
+    else if (!Context || !Context->size)
+      optional = 0;
+    break;
+
+  case 'L':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+      mutt_pretty_size (tmp, sizeof (tmp), Context ? Context->vsize : 0);
+      snprintf (buf, buflen, fmt, tmp);
+    }
+    else if (!Context || !Context->pattern)
+      optional = 0;
+    break;
+
+  case 'm':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, Context ? Context->msgcount : 0);
+    }
+    else if (!Context || !Context->msgcount)
+      optional = 0;
+    break;
+
+  case 'M':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, Context ? Context->vcount : 0);
+    }
+    else if (!Context || !Context->pattern)
+      optional = 0;
+    break;
+
+  case 'n':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, Context ? Context->new : 0);
+    }
+    else if (!Context || Context->new <= 0)
+      optional = 0;
+    break;
+
+  case 'o':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt,
+                Context ? Context->unread - Context->new : 0);
+    }
+    else if (!Context || !(Context->unread - Context->new))
+      optional = 0;
+    break;
+
+  case 'p':
+    count = mutt_num_postponed (0);
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, count);
+    }
+    else if (!count)
+      optional = 0;
+    break;
+
+  case 'P':
+    if (menu->top + menu->pagelen >= menu->max)
+      cp = menu->top ? "end" : "all";
+    else {
+      count = (100 * (menu->top + menu->pagelen)) / menu->max;
+      snprintf (tmp, sizeof (tmp), "%d%%", count);
+      cp = tmp;
+    }
+    snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+    snprintf (buf, buflen, fmt, cp);
+    break;
+
+  case 'r':
+    {
+      int i = 0;
+
+      if (Context) {
+        /* XXX: deleted doesn't necessarily mean changed in IMAP */
+        i = option (OPTATTACHMSG) ? 3
+            : ((Context->readonly || Context->dontwrite) ? 2
+               : (Context->changed || (Context-> magic != M_IMAP && Context->
+                                        deleted)) ? 1 : 0);
+      }
+
+      if (!StChars)
+        buf[0] = 0;
+      else if (i >= m_strlen(StChars))
+        buf[0] = StChars[0];
+      else
+        buf[0] = StChars[i];
+
+      buf[1] = 0;
+      break;
+    }
+
+  case 's':
+    snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+    snprintf (buf, buflen, fmt, get_sort_str (tmp, sizeof (tmp), Sort));
+    break;
+
+  case 'S':
+    snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+    snprintf (buf, buflen, fmt, get_sort_str (tmp, sizeof (tmp), SortAux));
+    break;
+
+  case 't':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, Context ? Context->tagged : 0);
+    }
+    else if (!Context || !Context->tagged)
+      optional = 0;
+    break;
+
+  case 'u':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (buf, buflen, fmt, Context ? Context->unread : 0);
+    }
+    else if (!Context || !Context->unread)
+      optional = 0;
+    break;
+
+  case 'v':
+    m_strcpy(buf, buflen, mutt_make_version(0));
+    break;
+
+  case 'V':
+    if (!optional) {
+      snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
+      snprintf (buf, buflen, fmt,
+                (Context && Context->pattern) ? Context->pattern : "");
+    }
+    else if (!Context || !Context->pattern)
+      optional = 0;
+    break;
+
+  case 0:
+    *buf = 0;
+    return (src);
+
+  default:
+    snprintf (buf, buflen, "%%%s%c", prefix, op);
+    break;
+  }
+
+  if (optional)
+    menu_status_line (buf, buflen, menu, ifstring);
+  else if (flags & M_FORMAT_OPTIONAL)
+    menu_status_line (buf, buflen, menu, elsestring);
+
+  return (src);
+}
+
+void menu_status_line (char* buf, ssize_t len, MUTTMENU* menu, const char* p) {
+  /*
+   * if we have enough space for buffer, format lines to $COLS-$SidebarWidth
+   * only to not wrap past end of screen
+   */
+  int width = COLS - SW;
+  mutt_FormatString (buf, (width >= len ? len : (width + 1)),
+                     p, status_format_str,
+                     (unsigned long) menu, 0);
+}