diff options
Diffstat (limited to 'dselect/pkginfo.cc')
-rw-r--r-- | dselect/pkginfo.cc | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/dselect/pkginfo.cc b/dselect/pkginfo.cc new file mode 100644 index 0000000..0defc4e --- /dev/null +++ b/dselect/pkginfo.cc @@ -0,0 +1,188 @@ +/* + * dselect - Debian package maintenance user interface + * pkginfo.cc - handles (re)draw of package list window infopad + * + * Copyright © 1995 Ian Jackson <ijackson@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 <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 <dpkg/string.h> + +#include "dselect.h" +#include "bindings.h" +#include "helpmsgs.h" + +const struct helpmenuentry *packagelist::helpmenulist() { + static const struct helpmenuentry + rw[]= { + { 'i', &hlp_mainintro }, + { 'k', &hlp_listkeys }, + { 'l', &hlp_displayexplain1 }, + { 'd', &hlp_displayexplain2 }, + { 0 } + }, + ro[]= { + { 'i', &hlp_readonlyintro }, + { 'k', &hlp_listkeys }, + { 'l', &hlp_displayexplain1 }, + { 'd', &hlp_displayexplain2 }, + { 0 } + }, + recur[]= { + { 'i', &hlp_recurintro }, + { 'k', &hlp_listkeys }, + { 'l', &hlp_displayexplain1 }, + { 'd', &hlp_displayexplain2 }, + { 0 } + }; + return + modstatdb_get_status() == msdbrw_readonly ? ro : + !recursive ? rw : + recur; +} + +bool +packagelist::itr_recursive() +{ + return recursive; +} + +const packagelist::infotype packagelist::infoinfos[]= { + { &packagelist::itr_recursive, &packagelist::itd_relations }, + { nullptr, &packagelist::itd_description }, + { nullptr, &packagelist::itd_statuscontrol }, + { nullptr, &packagelist::itd_availablecontrol }, + { nullptr, nullptr } +}; + +const packagelist::infotype *const packagelist::baseinfo= infoinfos; + +void packagelist::severalinfoblurb() +{ + varbuf vb; + vb(_("The line you have highlighted represents many packages; " + "if you ask to install, remove, hold, etc. it you will affect all " + "the packages which match the criterion shown.\n" + "\n" + "If you move the highlight to a line for a particular package " + "you will see information about that package displayed here." + "\n" + "You can use 'o' and 'O' to change the sort order and give yourself " + "the opportunity to mark packages in different kinds of groups.")); + wordwrapinfo(0,vb.string()); +} + +void packagelist::itd_relations() { + whatinfovb(_("Interrelationships")); + + if (table[cursorline]->pkg->set->name) { + debug(dbg_general, "packagelist[%p]::idt_relations(); '%s'", + this, table[cursorline]->relations.string()); + waddstr(infopad,table[cursorline]->relations.string()); + } else { + severalinfoblurb(); + } +} + +void packagelist::itd_description() { + whatinfovb(_("Description")); + + if (table[cursorline]->pkg->set->name) { + const char *m= table[cursorline]->pkg->available.description; + if (str_is_unset(m)) + m = table[cursorline]->pkg->installed.description; + if (str_is_unset(m)) + m = _("No description available."); + const char *p = strchrnul(m, '\n'); + ptrdiff_t l = p - m; + + wattrset(infopad, part_attr[info_head]); + waddstr(infopad, table[cursorline]->pkg->set->name); + waddstr(infopad," - "); + waddnstr(infopad,m,l); + wattrset(infopad, part_attr[info_body]); + if (*p) { + waddstr(infopad,"\n\n"); + wordwrapinfo(1,++p); + } + } else { + severalinfoblurb(); + } +} + +void packagelist::itd_statuscontrol() { + whatinfovb(_("Installed control file information")); + + werase(infopad); + if (!table[cursorline]->pkg->set->name) { + severalinfoblurb(); + } else { + varbuf vb; + varbuf_stanza(&vb, table[cursorline]->pkg, + &table[cursorline]->pkg->installed); + debug(dbg_general, "packagelist[%p]::idt_statuscontrol(); '%s'", + this, vb.string()); + waddstr(infopad,vb.string()); + } +} + +void packagelist::itd_availablecontrol() { + whatinfovb(_("Available control file information")); + + werase(infopad); + if (!table[cursorline]->pkg->set->name) { + severalinfoblurb(); + } else { + varbuf vb; + varbuf_stanza(&vb, table[cursorline]->pkg, + &table[cursorline]->pkg->available); + debug(dbg_general, "packagelist[%p]::idt_availablecontrol(); '%s'", + this, vb.string()); + waddstr(infopad,vb.string()); + } +} + +void packagelist::redrawinfo() { + for (;;) { + if (!currentinfo || !currentinfo->display) currentinfo= baseinfo; + if (!currentinfo->relevant) break; + if ((this->*currentinfo->relevant)()) break; + currentinfo++; + } + if (!info_height) return; + whatinfovb.reset(); + werase(infopad); wmove(infopad,0,0); + + debug(dbg_general, "packagelist[%p]::redrawinfo(); #=%zd", + this, currentinfo - baseinfo); + + (this->*currentinfo->display)(); + + int y,x; + getyx(infopad, y,x); + if (x) y++; + infolines= y; + + refreshinfo(); +} |