summaryrefslogtreecommitdiffstats
path: root/dselect/pkgdisplay.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dselect/pkgdisplay.cc')
-rw-r--r--dselect/pkgdisplay.cc272
1 files changed, 272 insertions, 0 deletions
diff --git a/dselect/pkgdisplay.cc b/dselect/pkgdisplay.cc
new file mode 100644
index 0000000..5cc4663
--- /dev/null
+++ b/dselect/pkgdisplay.cc
@@ -0,0 +1,272 @@
+/*
+ * dselect - Debian package maintenance user interface
+ * pkgdisplay.cc - package list display
+ *
+ * Copyright © 1994,1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
+ * Copyright © 2006, 2008-2015 Guillem Jover <guillem@debian.org>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <compat.h>
+
+#include <string.h>
+#include <stdio.h>
+
+#include <dpkg/i18n.h>
+#include <dpkg/dpkg.h>
+#include <dpkg/dpkg-db.h>
+
+#include "dselect.h"
+#include "pkglist.h"
+
+/* These MUST be in the same order as the corresponding enums in dpkg-db.h */
+const char
+ *const wantstrings[]= { N_("new package"),
+ N_("install"),
+ N_("hold"),
+ N_("remove"),
+ N_("purge"),
+ nullptr },
+
+ /* TRANSLATORS: The space is a trick to work around gettext which uses
+ * the empty string to store information about the translation. DO NOT
+ * CHANGE THAT IN A TRANSLATION! The code really relies on that being
+ * a single space. */
+ *const eflagstrings[]= { N_(" "),
+ N_("REINSTALL"),
+ nullptr },
+
+ *const statusstrings[]= { N_("not installed"),
+ N_("removed (configs remain)"),
+ N_("half installed"),
+ N_("unpacked (not set up)"),
+ N_("half configured (config failed)"),
+ N_("awaiting trigger processing"),
+ N_("triggered"),
+ N_("installed"),
+ nullptr },
+
+ *const prioritystrings[]= { N_("Required"),
+ N_("Important"),
+ N_("Standard"),
+ N_("Optional"),
+ N_("Extra"),
+ N_("Unclassified"),
+ nullptr },
+
+ *const relatestrings[]= { N_("suggests"),
+ N_("recommends"),
+ N_("depends on"),
+ N_("pre-depends on"),
+ N_("breaks"),
+ N_("conflicts with"),
+ N_("provides"),
+ N_("replaces"),
+ N_("enhances"),
+ nullptr },
+
+ *const priorityabbrevs[]= { N_("Req"),
+ N_("Imp"),
+ N_("Std"),
+ N_("Opt"),
+ N_("Xtr"),
+ N_("bUG"),
+ N_("?") };
+
+const char statuschars[] = " -IUCWt*";
+const char eflagchars[] = " R";
+const char wantchars[]= "n*=-_";
+
+/* These MUST be in the same order as the corresponding enums in pkglist.h */
+const char
+ *const ssaabbrevs[]= { N_("Broken"),
+ N_("New"),
+ N_("Upgradable"),
+ N_("Obsolete/local"),
+ N_("Installed"),
+ N_("Available"),
+ N_("Removed") },
+ *const ssastrings[]= { N_("Brokenly installed packages"),
+ N_("Newly available packages"),
+ N_("Upgradable packages"),
+ N_("Obsolete and locally created packages"),
+ N_("Installed packages"),
+ N_("Available not installed packages"),
+ N_("Removed and no longer available packages") };
+
+const char
+ *const sssstrings[]= { N_("Brokenly installed packages"),
+ N_("Installed packages"),
+ N_("Removed packages (configuration still present)"),
+ N_("Purged packages and those never installed") },
+ *const sssabbrevs[]= { N_("Broken"),
+ N_("Installed"),
+ N_("Removed"),
+ N_("Purged") };
+
+static int maximumstring(const char *const *array) {
+ int maxlen= 0;
+ while (*array) {
+ int l= strlen(gettext(*array));
+ const char *p= strchr(*array, '(');
+ if (p && p > *array && *--p == ' ') l= p - *array;
+ if (l > maxlen) maxlen= l;
+ array++;
+ }
+ return maxlen;
+}
+
+void packagelist::setwidths() {
+ debug(dbg_general, "packagelist[%p]::setwidths()", this);
+
+ col_cur_x = 0;
+
+ if (verbose) {
+ add_column(col_status_hold, _("Error"), 9);
+ add_column(col_status_status, _("Installed?"), maximumstring(statusstrings));
+ add_column(col_status_old_want, _("Old mark"), maximumstring(wantstrings));
+ add_column(col_status_new_want, _("Marked for"), maximumstring(wantstrings));
+ } else {
+ add_column(col_status, _("EIOM"), 4);
+ }
+
+ if (sortorder == so_section)
+ add_column(col_section, _("Section"), 8);
+ add_column(col_priority, _("Priority"), verbose ? 8 : 3);
+ if (sortorder != so_section)
+ add_column(col_section, _("Section"), 8);
+
+ add_column(col_package, _("Package"), verbose ? 16 : 12);
+
+ switch (archdisplayopt) {
+ case ado_none:
+ col_archinstalled.blank();
+ col_archavailable.blank();
+ break;
+ case ado_available:
+ col_archinstalled.blank();
+ add_column(col_archavailable, _("Avail.arch"), verbose ? 14 : 10);
+ break;
+ case ado_both:
+ add_column(col_archinstalled, _("Inst.arch"), verbose ? 14 : 10);
+ add_column(col_archavailable, _("Avail.arch"), verbose ? 14 : 10);
+ break;
+ default:
+ internerr("unknown archdisplayopt %d", archdisplayopt);
+ }
+
+ switch (versiondisplayopt) {
+ case vdo_none:
+ col_versioninstalled.blank();
+ col_versionavailable.blank();
+ break;
+ case vdo_available:
+ col_versioninstalled.blank();
+ add_column(col_versionavailable, _("Avail.ver"), 11);
+ break;
+ case vdo_both:
+ add_column(col_versioninstalled, _("Inst.ver"), 11);
+ add_column(col_versionavailable, _("Avail.ver"), 11);
+ break;
+ default:
+ internerr("unknown versiondisplayopt %d", versiondisplayopt);
+ }
+
+ end_column(col_description, _("Description"));
+}
+
+void packagelist::redrawtitle() {
+ if (title_height) {
+ int x, y DPKG_ATTR_UNUSED;
+
+ mywerase(titlewin);
+ mvwaddnstr(titlewin,0,0,
+ recursive ? _("dselect - recursive package listing") :
+ modstatdb_get_status() == msdbrw_readonly ?
+ _("dselect - inspection of package states") :
+ _("dselect - main package listing"),
+ xmax);
+ getyx(titlewin,y,x);
+ if (x < xmax) {
+ switch (sortorder) {
+ case so_section:
+ switch (statsortorder) {
+ case sso_unsorted:
+ waddnstr(titlewin, _(" (by section)"), xmax-x);
+ break;
+ case sso_avail:
+ waddnstr(titlewin, _(" (avail., section)"), xmax-x);
+ break;
+ case sso_state:
+ waddnstr(titlewin, _(" (status, section)"), xmax-x);
+ break;
+ default:
+ internerr("bad statsort %d on so_section", statsortorder);
+ }
+ break;
+ case so_priority:
+ switch (statsortorder) {
+ case sso_unsorted:
+ waddnstr(titlewin, _(" (by priority)"), xmax-x);
+ break;
+ case sso_avail:
+ waddnstr(titlewin, _(" (avail., priority)"), xmax-x);
+ break;
+ case sso_state:
+ waddnstr(titlewin, _(" (status, priority)"), xmax-x);
+ break;
+ default:
+ internerr("bad statsort %d on so_priority", statsortorder);
+ }
+ break;
+ case so_alpha:
+ switch (statsortorder) {
+ case sso_unsorted:
+ waddnstr(titlewin, _(" (alphabetically)"), xmax-x);
+ break;
+ case sso_avail:
+ waddnstr(titlewin, _(" (by availability)"), xmax-x);
+ break;
+ case sso_state:
+ waddnstr(titlewin, _(" (by status)"), xmax-x);
+ break;
+ default:
+ internerr("bad statsort %d on so_priority", statsortorder);
+ }
+ break;
+ case so_unsorted:
+ break;
+ default:
+ internerr("bad sort %d", sortorder);
+ }
+ }
+ const char *helpstring;
+
+ if (modstatdb_get_status() == msdbrw_write)
+ helpstring = (verbose ? _(" mark:+/=/- terse:v help:?")
+ : _(" mark:+/=/- verbose:v help:?"));
+ else
+ helpstring = (verbose ? _(" terse:v help:?")
+ : _(" verbose:v help:?"));
+
+ int l= strlen(helpstring);
+ getyx(titlewin,y,x);
+ if (xmax-l > 0) {
+ mvwaddstr(titlewin,0,xmax-l, helpstring);
+ }
+ wnoutrefresh(titlewin);
+ }
+}