blob: 67750b3347a464f48b09a3923e79e883750b45a2 [file] [log] [blame]
/*
* dselect - Debian package maintenance user interface
* pkgdisplay.cc - package list display
*
* Copyright © 1994,1995 Ian Jackson <ian@chiark.greenend.org.uk>
*
* 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 <http://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"),
0 },
/* 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"),
0 },
*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"),
0 },
*const prioritystrings[]= { N_("Required"),
N_("Important"),
N_("Standard"),
N_("Optional"),
N_("Extra"),
N_("!Bug!"),
N_("Unclassified"),
0 },
*const relatestrings[]= { N_("suggests"),
N_("recommends"),
N_("depends on"),
N_("pre-depends on"),
N_("breaks"),
N_("conflicts with"),
N_("provides"),
N_("replaces"),
N_("enhances"),
0 },
*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_("Updated"),
N_("Obsolete/local"),
N_("Up-to-date"),
N_("Available"),
N_("Removed") },
*const ssastrings[]= { N_("Brokenly installed packages"),
N_("Newly available packages"),
N_("Updated packages (newer version is available)"),
N_("Obsolete and local packages present on system"),
N_("Up to date installed packages"),
N_("Available packages (not currently installed)"),
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);
if (verbose) {
status_hold_width= 9;
status_status_width= maximumstring(statusstrings);
status_want_width= maximumstring(wantstrings);
status_width= status_hold_width+status_status_width+status_want_width*2+3;
priority_width= 8;
package_width= 16;
} else {
status_width= 4;
priority_width= 3;
package_width= 12;
}
section_width= 8;
gap_width= 1;
if (sortorder == so_section) {
section_column= status_width + gap_width;
priority_column= section_column + section_width + gap_width;
package_column= priority_column + priority_width + gap_width;
} else {
priority_column= status_width + gap_width;
section_column= priority_column + priority_width + gap_width;
package_column= section_column + section_width + gap_width;
}
int versiondescriptioncolumn= package_column + package_width + gap_width;
switch (versiondisplayopt) {
case vdo_none:
versioninstalled_column= versioninstalled_width= 0;
versionavailable_column= versionavailable_width= 0;
description_column= versiondescriptioncolumn;
break;
case vdo_available:
versioninstalled_column= versioninstalled_width= 0;
versionavailable_column= versiondescriptioncolumn;
versionavailable_width= 11;
description_column= versionavailable_column + versionavailable_width + gap_width;
break;
case vdo_both:
versioninstalled_column= versiondescriptioncolumn;
versioninstalled_width= 11;
versionavailable_column= versioninstalled_column + versioninstalled_width +gap_width;
versionavailable_width= versioninstalled_width;
description_column= versionavailable_column + versionavailable_width + gap_width;
break;
default:
internerr("unknown versiondisplayopt in setwidths");
}
total_width= TOTAL_LIST_WIDTH;
if (total_width < COLS)
total_width= COLS;
description_width= total_width - description_column;
}
void packagelist::redrawtitle() {
int x, y DPKG_ATTR_UNUSED;
if (title_height) {
mywerase(titlewin);
mvwaddnstr(titlewin,0,0,
recursive ? _("dselect - recursive package listing") :
!readwrite ? _("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 in redrawtitle/so_section");
}
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 in redrawtitle/so_priority");
}
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 in redrawtitle/so_priority");
}
break;
waddnstr(titlewin, _(" (alphabetically)"), xmax-x);
break;
case so_unsorted:
break;
default:
internerr("bad sort in redrawtitle");
}
}
const char *helpstring= readwrite ? (verbose ? _(" mark:+/=/- terse:v help:?")
: _(" mark:+/=/- verbose:v help:?"))
: (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);
}
}