[Aptitude-svn-commit] r4185 - in branches/aptitude-0.3/aptitude: .
src
Daniel Burrows
dburrows at costa.debian.org
Thu Sep 22 21:53:34 UTC 2005
Author: dburrows
Date: Thu Sep 22 21:53:31 2005
New Revision: 4185
Added:
branches/aptitude-0.3/aptitude/src/solution_item.cc
branches/aptitude-0.3/aptitude/src/solution_item.h
Modified:
branches/aptitude-0.3/aptitude/ChangeLog
branches/aptitude-0.3/aptitude/src/solution_screen.cc
Log:
Split the tree items from solution_screen.cc into a separate file.
Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog (original)
+++ branches/aptitude-0.3/aptitude/ChangeLog Thu Sep 22 21:53:31 2005
@@ -1,5 +1,10 @@
2005-09-22 Daniel Burrows <dburrows at debian.org>
+ * src/solution_item.cc, src/solution_item.h, src/solution_screen.cc:
+
+ Split the tree items from solution_screen.cc into their own
+ file.
+
* src/ui.cc:
Typo fix.
Added: branches/aptitude-0.3/aptitude/src/solution_item.cc
==============================================================================
--- (empty file)
+++ branches/aptitude-0.3/aptitude/src/solution_item.cc Thu Sep 22 21:53:31 2005
@@ -0,0 +1,563 @@
+// solution_item.cc
+//
+// Copyright (C) 2005 Daniel Burrows
+//
+// This program 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 program 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; see the file COPYING. If not, write to
+// the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+// Boston, MA 02111-1307, USA.
+
+#include "solution_item.h"
+
+
+#include "aptitude.h"
+#include "pkg_info_screen.h"
+#include "solution_fragment.h"
+#include "ui.h"
+
+
+#include <apt-pkg/pkgrecords.h>
+
+#include <generic/resolver_manager.h>
+#include <generic/util.h>
+
+#include <vscreen/config/keybindings.h>
+#include <vscreen/fragment.h>
+#include <vscreen/transcode.h>
+#include <vscreen/vs_tree.h>
+
+
+using namespace std;
+
+
+action_type analyze_action(const aptitude_universe::version &ver)
+{
+ pkgCache::PkgIterator pkg=ver.get_pkg();
+ pkgCache::VerIterator curver=pkg.CurrentVer();
+ pkgCache::VerIterator newver=ver.get_ver();
+
+ if(curver.end())
+ {
+ if(newver.end())
+ return action_keep;
+ else
+ return action_install;
+ }
+ else if(newver.end())
+ return action_remove;
+ else if(newver == curver)
+ return action_keep;
+ else
+ {
+ int cmp=_system->VS->CmpVersion(curver.VerStr(),
+ newver.VerStr());
+
+ // The versions shouldn't be equal -- otherwise
+ // something is majorly wrong.
+ // assert(cmp!=0);
+ //
+ // The above is not true: consider, eg, the case of a
+ // locally compiled package and a standard package.
+
+ /** \todo indicate "sidegrades" separately? */
+ if(cmp <= 0)
+ return action_upgrade;
+ else
+ return action_downgrade;
+ }
+}
+
+/** \return a description of what will happen if the given version
+ * is installed.
+ */
+static fragment *action_description(const aptitude_resolver_version &ver)
+{
+ pkgCache::PkgIterator pkg = ver.get_pkg();
+
+ switch(analyze_action(ver))
+ {
+ case action_remove:
+ return fragf(_("Remove %F [%s (%s)]"),
+ text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+ pkg.CurrentVer().VerStr(),
+ archives_text(pkg.CurrentVer()).c_str());
+ break;
+
+ case action_install:
+ return fragf(_("Install %F [%s (%s)]"),
+ text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+ ver.get_ver().VerStr(),
+ archives_text(ver.get_ver()).c_str());
+ break;
+
+ case action_keep:
+ if(ver.get_ver().end())
+ return fragf(_("Cancel the installation of %F"),
+ text_fragment(pkg.Name(), style_attrs_on(A_BOLD)));
+ else if(ver.get_package().current_version().get_ver().end())
+ return fragf(_("Cancel the removal of %F"),
+ text_fragment(pkg.Name(), style_attrs_on(A_BOLD)));
+ else
+ return fragf(_("Keep %F at version %s (%s)"),
+ text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+ ver.get_ver().VerStr(),
+ archives_text(ver.get_ver()).c_str());
+
+ break;
+
+ case action_upgrade:
+ return fragf(_("Upgrade %F [%s (%s) -> %s (%s)]"),
+ text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+ pkg.CurrentVer().VerStr(),
+ archives_text(pkg.CurrentVer()).c_str(),
+ ver.get_ver().VerStr(), archives_text(ver.get_ver()).c_str());
+ break;
+
+
+ case action_downgrade:
+ return fragf(_("Downgrade %F [%s (%s) -> %s (%s)]"),
+ text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+ pkg.CurrentVer().VerStr(), archives_text(pkg.CurrentVer()).c_str(),
+ ver.get_ver().VerStr(), archives_text(ver.get_ver()).c_str());
+ break;
+ default:
+ // Impossible.
+ abort();
+ }
+}
+
+
+const wchar_t *solution_item::tag()
+{
+ return L"";
+}
+
+const wchar_t *solution_item::label()
+{
+ return L"";
+}
+
+style solution_item::get_normal_style()
+{
+ if(is_rejected())
+ return get_style("SolutionActionRejected");
+ else if(is_mandatory())
+ return get_style("SolutionActionApproved");
+ else
+ return style();
+}
+
+bool solution_item::dispatch_key(const key &k, vs_tree *owner)
+{
+ if(global_bindings.key_matches(k, "SolutionActionReject"))
+ {
+ if(is_rejected())
+ unreject();
+ else
+ reject();
+
+ owner->line_down();
+ }
+ else if(global_bindings.key_matches(k, "SolutionActionApprove"))
+ {
+ if(is_mandatory())
+ unmandate();
+ else
+ mandate();
+
+ owner->line_down();
+ }
+ else
+ return vs_treeitem::dispatch_key(k, owner);
+
+ return true;
+}
+
+bool solution_act_item::is_rejected()
+{
+ assert(resman->resolver_exists());
+
+ return resman->is_rejected(ver);
+}
+
+bool solution_act_item::is_mandatory()
+{
+ assert(resman->resolver_exists());
+
+ return resman->is_mandatory(ver);
+}
+
+void solution_act_item::reject()
+{
+ resman->reject_version(ver);
+}
+
+void solution_act_item::unreject()
+{
+ resman->unreject_version(ver);
+}
+
+void solution_act_item::mandate()
+{
+ resman->mandate_version(ver);
+}
+
+void solution_act_item::unmandate()
+{
+ resman->unmandate_version(ver);
+}
+
+void solution_act_item::highlighted(vs_tree *win)
+{
+ pkgCache::VerIterator real_ver = ver.get_ver();
+
+ if(real_ver.end())
+ real_ver = ver.get_package().current_version().get_ver();
+
+ if(real_ver.end())
+ real_ver = ver.get_pkg().VersionList();
+
+ if(real_ver.end() || real_ver.FileList().end() ||
+ apt_package_records == NULL)
+ set_short_description(fragf(""));
+ else
+ set_short_description(text_fragment(apt_package_records->Lookup(real_ver.FileList()).ShortDesc()));
+
+ set_active_dep(d);
+}
+
+void solution_act_item::unhighlighted(vs_tree *win)
+{
+ set_short_description(fragf(""));
+
+ set_active_dep(aptitude_resolver_dep());
+}
+
+bool solution_act_item::dispatch_key(const key &k, vs_tree *owner)
+{
+ if(global_bindings.key_matches(k, "InfoScreen"))
+ {
+ pkgCache::VerIterator real_ver = ver.get_ver();
+ pkgCache::PkgIterator pkg = ver.get_pkg();
+
+ if(real_ver.end())
+ real_ver = ver.get_package().current_version().get_ver();
+
+ if(real_ver.end())
+ real_ver = pkg.VersionList();
+
+ // Show information about the corresponding package/version.
+ insert_main_widget(make_info_screen(pkg, real_ver),
+ ssprintf(_("%s info"), pkg.Name()),
+ "",
+ ssprintf(_("Information about %s"), pkg.Name()));
+ return true;
+ }
+ else
+ return solution_item::dispatch_key(k, owner);
+}
+
+void solution_act_item::paint(vs_tree *win, int y, bool hierarchical, const style &st)
+{
+ unsigned int basex = hierarchical ? 2*get_depth() : 0;
+ unsigned int width = win->getmaxx();
+
+ unsigned int x = 0;
+
+ win->move(y, 0);
+
+ if(x < width)
+ {
+ if(is_rejected())
+ win->addch('R'); // For "reject"
+ else if(is_mandatory())
+ win->addch('A'); // For "accept"
+ else
+ win->addch(' ');
+ ++x;
+ }
+
+ if(x < width)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ while(x < width && x < basex)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ if(x < width)
+ {
+ win->addch('-');
+ ++x;
+ }
+
+ if(x < width)
+ {
+ win->addch('>');
+ ++x;
+ }
+
+ if(x < width)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ fragment *f = clipbox(action_description(ver));
+ fragment_contents c = f->layout(width-x, width-x, st);
+ delete f;
+
+ assert(c.size() < 2);
+ if(c.size() > 0)
+ {
+ const fragment_line &l = c.front();
+
+ fragment_line::const_iterator loc = l.begin();
+ while(loc != l.end() && x < width)
+ {
+ win->attrset(loc->attrs);
+ win->add_wch(loc->ch);
+ x += wcwidth(loc->ch);
+ ++loc;
+ }
+ }
+
+ win->apply_style(st);
+
+ while(x < width)
+ {
+ win->addch(' ');
+ ++x;
+ }
+}
+
+void solution_act_item_bare::paint(vs_tree *win, int y, bool hierarchical, const style &st)
+{
+ unsigned int basex = hierarchical ? 2*get_depth() : 0;
+ unsigned int width = win->getmaxx();
+
+ unsigned int x = 0;
+
+ win->move(y, 0);
+
+ if(x < width)
+ {
+ if(is_rejected())
+ win->addch('R'); // For "reject"
+ else if(is_mandatory())
+ win->addch('A'); // For "accept"
+ else
+ win->addch(' ');
+ ++x;
+ }
+
+ if(x < width)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ while(x < width && x < basex)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ win->apply_style(st+style_attrs_on(A_BOLD));
+
+ aptitude_universe::version ver = get_ver();
+
+ const char *name = ver.get_pkg().Name();
+ while(x < width && *name)
+ {
+ win->addch(*name);
+ ++name;
+ ++x;
+ }
+
+ // Ensure that at least one space separates the two columns.
+ if(x < width)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ win->apply_style(st);
+ string righttext;
+
+ pkgCache::VerIterator currver = ver.get_pkg().CurrentVer();
+
+ if(currver.end() || ver.get_ver().end() || currver == ver.get_ver())
+ {
+ pkgCache::VerIterator dispv = currver;
+
+ if(dispv.end())
+ dispv = ver.get_ver();
+
+ if(dispv.end())
+ righttext = "[UNINST]";
+ else
+ righttext = ssprintf("[%s (%s)]",
+ dispv.VerStr(), archives_text(dispv).c_str());
+ }
+ else
+ {
+ righttext = "[";
+
+ if(currver.end())
+ righttext += "UNINST";
+ else
+ {
+ righttext += currver.VerStr();
+ righttext += " ";
+ righttext += archives_text(currver);
+ }
+
+ righttext += " -> ";
+
+ if(ver.get_ver().end())
+ righttext += "UNINST";
+ else
+ {
+ righttext += ver.get_ver().VerStr();
+ righttext += " ";
+ righttext += archives_text(ver.get_ver());
+ }
+
+ righttext += "]";
+ }
+
+ unsigned int startx;
+ if(x+righttext.size() >= width)
+ startx = x;
+ else
+ startx = width-righttext.size();
+ while(x < startx)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ unsigned int rightloc = 0;
+ while(x < width && rightloc < righttext.size())
+ {
+ win->addch(righttext[rightloc]);
+ ++rightloc;
+ ++x;
+ }
+}
+
+
+
+bool solution_unresolved_item::is_rejected()
+{
+ return resman->is_hardened(d);
+}
+
+bool solution_unresolved_item::is_mandatory()
+{
+ return resman->is_forced_broken(d);
+}
+
+void solution_unresolved_item::highlighted(vs_tree *win)
+{
+ set_active_dep(d);
+}
+
+void solution_unresolved_item::unhighlighted(vs_tree *win)
+{
+ set_active_dep(aptitude_resolver_dep());
+}
+
+void solution_unresolved_item::reject()
+{
+ resman->harden_dep(d);
+}
+
+void solution_unresolved_item::unreject()
+{
+ resman->unharden_dep(d);
+}
+
+void solution_unresolved_item::mandate()
+{
+ resman->force_break_dep(d);
+}
+
+void solution_unresolved_item::unmandate()
+{
+ resman->unforce_break_dep(d);
+}
+
+void solution_unresolved_item::paint(vs_tree *win, int y, bool hierarchical, const style &st)
+{
+ unsigned int basex = hierarchical ? 2*get_depth() : 0;
+ unsigned int width = win->getmaxx();
+
+ unsigned int x = 0;
+
+ win->move(y, 0);
+
+ if(x < width)
+ {
+ if(is_rejected())
+ win->addch('R'); // For "reject"
+ else if(is_mandatory())
+ win->addch('A'); // For "accept"
+ else
+ win->addch(' ');
+ ++x;
+ }
+
+ if(x < width)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ while(x < width && x < basex)
+ {
+ win->addch(' ');
+ ++x;
+ }
+
+ wstring text;
+
+ if(!fully_explained)
+ text = swsprintf(transcode(_("%s recommends %s")).c_str(),
+ d.get_dep().ParentPkg().Name(),
+ dep_targets(d.get_dep()).c_str());
+ else
+ text = swsprintf(transcode(_("-> Leave the dependency \"%s recommends %s\" unresolved.")).c_str(),
+ d.get_dep().ParentPkg().Name(),
+ dep_targets(d.get_dep()).c_str());
+
+ wstring::const_iterator loc = text.begin();
+
+ while(loc != text.end() && x < width)
+ {
+ win->addch(*loc);
+ x += wcwidth(*loc);
+ ++loc;
+ }
+
+ while(x < width)
+ {
+ win->addch(' ');
+ ++x;
+ }
+}
Added: branches/aptitude-0.3/aptitude/src/solution_item.h
==============================================================================
--- (empty file)
+++ branches/aptitude-0.3/aptitude/src/solution_item.h Thu Sep 22 21:53:31 2005
@@ -0,0 +1,182 @@
+// solution_item.h -*-c++-*-
+//
+// Copyright (C) 2005 Daniel Burrows
+//
+// This program 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 program 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; see the file COPYING. If not, write to
+// the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+// Boston, MA 02111-1307, USA.
+//
+// Tree items that represent the contents of a solution.
+
+#ifndef SOLUTION_ITEM_H
+#define SOLUTION_ITEM_H
+
+#include <sigc++/slot.h>
+
+#include <generic/aptitude_resolver_universe.h>
+#include <generic/problemresolver/solution.h>
+
+#include <vscreen/vs_treeitem.h>
+
+class fragment;
+
+class solution_item : public vs_treeitem
+{
+public:
+ const wchar_t *tag();
+
+ const wchar_t *label();
+
+ /** \return \b true if this item is rejected. */
+ virtual bool is_rejected() = 0;
+
+ /** \return \b true if this item is mandatory. */
+ virtual bool is_mandatory() = 0;
+
+ /** Reject this item. */
+ virtual void reject() = 0;
+
+ /** Cancel the rejection of this item. */
+ virtual void unreject() = 0;
+
+ /** Make this item mandatory. */
+ virtual void mandate() = 0;
+
+ /** Make this item not mandatory. */
+ virtual void unmandate() = 0;
+
+ style get_normal_style();
+
+ bool dispatch_key(const key &k, vs_tree *owner);
+};
+
+class solution_act_item : public solution_item
+{
+ aptitude_universe::version ver;
+ aptitude_universe::dep d;
+
+ /** A callback to be invoked with a fragment-based description of
+ * this item.
+ */
+ sigc::slot1<void, fragment *> set_short_description;
+
+ /** A callback to be invoked with the dependency corresponding to this item. */
+ sigc::slot1<void, aptitude_resolver_dep> set_active_dep;
+public:
+
+ /** Create a solution_act_item.
+ *
+ * \param act the action that this item corresponds to
+ * \param _set_short_description a callback to be invoked with a
+ * brief description of this item when it is selected
+ * \param _set_active_dep a callback to be invoked with the dependency
+ * corresponding to this item when the item is selected
+ */
+ solution_act_item(const generic_solution<aptitude_universe>::action &act,
+ const sigc::slot1<void, fragment *> &_set_short_description,
+ const sigc::slot1<void, aptitude_resolver_dep> &_set_active_dep)
+ :ver(act.ver),
+ d(act.d),
+ set_short_description(_set_short_description),
+ set_active_dep(_set_active_dep)
+ {
+ }
+
+ bool is_rejected();
+
+ bool is_mandatory();
+
+ void reject();
+
+ void unreject();
+
+ void mandate();
+
+ void unmandate();
+
+ void highlighted(vs_tree *win);
+
+ void unhighlighted(vs_tree *win);
+
+ aptitude_universe::version get_ver() const
+ {
+ return ver;
+ }
+
+ bool dispatch_key(const key &k, vs_tree *owner);
+
+ void paint(vs_tree *win, int y, bool hierarchical, const style &st);
+};
+
+/** Like a solution_act_item, but the display doesn't include the
+ * descriptive verb ("install" or whatever).
+ */
+class solution_act_item_bare : public solution_act_item
+{
+public:
+ solution_act_item_bare(const generic_solution<aptitude_universe>::action &act,
+ const sigc::slot1<void, fragment *> &set_short_description,
+ const sigc::slot1<void, aptitude_resolver_dep> &set_active_dep)
+ :solution_act_item(act, set_short_description, set_active_dep)
+ {
+ }
+
+ void paint(vs_tree *win, int y, bool hierarchical, const style &st);
+};
+
+/** A solution item corresponding to leaving a dependency unresolved. */
+class solution_unresolved_item : public solution_item
+{
+ aptitude_universe::dep d;
+
+ /** If \b true, then a brief explanation about what this item is
+ * (suitable for inclusion in a list of alternatives) will be
+ * displayed.
+ */
+ bool fully_explained;
+
+ sigc::slot1<void, aptitude_resolver_dep> set_active_dep;
+public:
+ solution_unresolved_item(const aptitude_universe::dep &_d,
+ bool _fully_explained,
+ const sigc::slot1<void, aptitude_resolver_dep> &_set_active_dep)
+ :d(_d), fully_explained(_fully_explained), set_active_dep(_set_active_dep)
+ {
+ }
+
+ bool is_rejected();
+ bool is_mandatory();
+ void highlighted(vs_tree *win);
+ void unhighlighted(vs_tree *win);
+ void reject();
+ void unreject();
+ void mandate();
+ void unmandate();
+
+ void paint(vs_tree *win, int y, bool hierarchical, const style &st);
+};
+
+
+enum action_type {action_remove, action_keep, action_install,
+ action_downgrade, action_upgrade};
+
+
+/** A simpler version of find_pkg_state that doesn't care about
+ * automaticness. Provided here because it's used by the solution
+ * item and screen, but should probably migrate to generic/
+ * eventually.
+ */
+action_type analyze_action(const aptitude_universe::version &ver);
+
+#endif
Modified: branches/aptitude-0.3/aptitude/src/solution_screen.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/solution_screen.cc (original)
+++ branches/aptitude-0.3/aptitude/src/solution_screen.cc Thu Sep 22 21:53:31 2005
@@ -20,21 +20,16 @@
#include "solution_screen.h"
#include "aptitude.h"
-#include "pkg_info_screen.h"
#include "solution_fragment.h"
-#include "ui.h"
-
-#include <apt-pkg/pkgrecords.h>
+#include "solution_item.h"
#include <generic/aptitude_resolver_universe.h>
-#include <generic/problemresolver/exceptions.h>
#include <generic/problemresolver/solution.h>
#include <generic/resolver_manager.h>
#include <generic/util.h>
#include <sigc++/adaptors/bind.h>
-#include <vscreen/config/keybindings.h>
#include <vscreen/config/style.h>
#include <vscreen/fragment.h>
#include <vscreen/transcode.h>
@@ -44,8 +39,6 @@
#include <vscreen/vs_staticitem.h>
#include <vscreen/vs_subtree.h>
#include <vscreen/vs_table.h>
-#include <vscreen/vs_tree.h>
-#include <vscreen/vs_treeitem.h>
typedef generic_solution<aptitude_universe> aptitude_solution;
@@ -61,109 +54,6 @@
}
};
-enum action_type {action_remove, action_keep, action_install,
- action_downgrade, action_upgrade};
-
-/** A simpler version of find_pkg_state that doesn't care about
- * automaticness.
- */
-static
-action_type analyze_action(const aptitude_universe::version &ver)
-{
- pkgCache::PkgIterator pkg=ver.get_pkg();
- pkgCache::VerIterator curver=pkg.CurrentVer();
- pkgCache::VerIterator newver=ver.get_ver();
-
- if(curver.end())
- {
- if(newver.end())
- return action_keep;
- else
- return action_install;
- }
- else if(newver.end())
- return action_remove;
- else if(newver == curver)
- return action_keep;
- else
- {
- int cmp=_system->VS->CmpVersion(curver.VerStr(),
- newver.VerStr());
-
- // The versions shouldn't be equal -- otherwise
- // something is majorly wrong.
- // assert(cmp!=0);
- //
- // The above is not true: consider, eg, the case of a
- // locally compiled package and a standard package.
-
- /** \todo indicate "sidegrades" separately? */
- if(cmp <= 0)
- return action_upgrade;
- else
- return action_downgrade;
- }
-}
-
-/** Return a description of what will happen if the given version
- * is installed.
- */
-static fragment *action_description(const aptitude_resolver_version &ver)
-{
- pkgCache::PkgIterator pkg = ver.get_pkg();
-
- switch(analyze_action(ver))
- {
- case action_remove:
- return fragf(_("Remove %F [%s (%s)]"),
- text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
- pkg.CurrentVer().VerStr(),
- archives_text(pkg.CurrentVer()).c_str());
- break;
-
- case action_install:
- return fragf(_("Install %F [%s (%s)]"),
- text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
- ver.get_ver().VerStr(),
- archives_text(ver.get_ver()).c_str());
- break;
-
- case action_keep:
- if(ver.get_ver().end())
- return fragf(_("Cancel the installation of %F"),
- text_fragment(pkg.Name(), style_attrs_on(A_BOLD)));
- else if(ver.get_package().current_version().get_ver().end())
- return fragf(_("Cancel the removal of %F"),
- text_fragment(pkg.Name(), style_attrs_on(A_BOLD)));
- else
- return fragf(_("Keep %F at version %s (%s)"),
- text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
- ver.get_ver().VerStr(),
- archives_text(ver.get_ver()).c_str());
-
- break;
-
- case action_upgrade:
- return fragf(_("Upgrade %F [%s (%s) -> %s (%s)]"),
- text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
- pkg.CurrentVer().VerStr(),
- archives_text(pkg.CurrentVer()).c_str(),
- ver.get_ver().VerStr(), archives_text(ver.get_ver()).c_str());
- break;
-
-
- case action_downgrade:
- return fragf(_("Downgrade %F [%s (%s) -> %s (%s)]"),
- text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
- pkg.CurrentVer().VerStr(), archives_text(pkg.CurrentVer()).c_str(),
- ver.get_ver().VerStr(), archives_text(ver.get_ver()).c_str());
- break;
- default:
- // Impossible.
- abort();
- }
-}
-
/** Partition the set of all packages into several vectors,
* according to the action to be performed on each package.
*
@@ -240,508 +130,7 @@
}
};
-class solution_item : public vs_treeitem
-{
-public:
- const wchar_t *tag()
- {
- return L"";
- }
-
- const wchar_t *label()
- {
- return L"";
- }
-
- virtual bool is_rejected() = 0;
-
- virtual bool is_mandatory() = 0;
-
- virtual void reject() = 0;
-
- virtual void unreject() = 0;
-
- virtual void mandate() = 0;
-
- virtual void unmandate() = 0;
-
- style get_normal_style()
- {
- if(is_rejected())
- return get_style("SolutionActionRejected");
- else if(is_mandatory())
- return get_style("SolutionActionApproved");
- else
- return style();
- }
-
- bool dispatch_key(const key &k, vs_tree *owner)
- {
- if(global_bindings.key_matches(k, "SolutionActionReject"))
- {
- if(is_rejected())
- unreject();
- else
- reject();
-
- owner->line_down();
- }
- else if(global_bindings.key_matches(k, "SolutionActionApprove"))
- {
- if(is_mandatory())
- unmandate();
- else
- mandate();
-
- owner->line_down();
- }
- else
- return vs_treeitem::dispatch_key(k, owner);
-
- return true;
- }
-};
-
-class solution_act_item : public solution_item
-{
- aptitude_universe::version ver;
- aptitude_universe::dep d;
-
- /** A callback to be invoked with a fragment-based description of
- * this item.
- */
- sigc::slot1<void, fragment *> set_short_description;
-
- /** A callback to be invoked with the dependency corresponding to this item. */
- sigc::slot1<void, aptitude_resolver_dep> set_active_dep;
-public:
- solution_act_item(const aptitude_solution::action &act,
- const sigc::slot1<void, fragment *> &_set_short_description,
- const sigc::slot1<void, aptitude_resolver_dep> &_set_active_dep)
- :ver(act.ver),
- d(act.d),
- set_short_description(_set_short_description),
- set_active_dep(_set_active_dep)
- {
- }
-
- bool is_rejected()
- {
- assert(resman->resolver_exists());
-
- return resman->is_rejected(ver);
- }
-
- // Dual of rejecting.
- bool is_mandatory()
- {
- assert(resman->resolver_exists());
-
- return resman->is_mandatory(ver);
- }
-
- void reject()
- {
- resman->reject_version(ver);
- }
-
- void unreject()
- {
- resman->unreject_version(ver);
- }
-
- void mandate()
- {
- resman->mandate_version(ver);
- }
-
- void unmandate()
- {
- resman->unmandate_version(ver);
- }
-
- void highlighted(vs_tree *win)
- {
- pkgCache::VerIterator real_ver = ver.get_ver();
-
- if(real_ver.end())
- real_ver = ver.get_package().current_version().get_ver();
-
- if(real_ver.end())
- real_ver = ver.get_pkg().VersionList();
-
- if(real_ver.end() || real_ver.FileList().end() ||
- apt_package_records == NULL)
- set_short_description(fragf(""));
- else
- set_short_description(text_fragment(apt_package_records->Lookup(real_ver.FileList()).ShortDesc()));
-
- set_active_dep(d);
- }
-
- void unhighlighted(vs_tree *win)
- {
- set_short_description(fragf(""));
-
- set_active_dep(aptitude_resolver_dep());
- }
-
- aptitude_universe::version get_ver() const
- {
- return ver;
- }
-
- bool dispatch_key(const key &k, vs_tree *owner)
- {
- if(global_bindings.key_matches(k, "InfoScreen"))
- {
- pkgCache::VerIterator real_ver = ver.get_ver();
- pkgCache::PkgIterator pkg = ver.get_pkg();
-
- if(real_ver.end())
- real_ver = ver.get_package().current_version().get_ver();
-
- if(real_ver.end())
- real_ver = pkg.VersionList();
-
- // Show information about the corresponding package/version.
- insert_main_widget(make_info_screen(pkg, real_ver),
- ssprintf(_("%s info"), pkg.Name()),
- "",
- ssprintf(_("Information about %s"), pkg.Name()));
- return true;
- }
- else
- return solution_item::dispatch_key(k, owner);
- }
-
- void paint(vs_tree *win, int y, bool hierarchical, const style &st)
- {
- unsigned int basex = hierarchical ? 2*get_depth() : 0;
- unsigned int width = win->getmaxx();
-
- unsigned int x = 0;
-
- win->move(y, 0);
-
- if(x < width)
- {
- if(is_rejected())
- win->addch('R'); // For "reject"
- else if(is_mandatory())
- win->addch('A'); // For "accept"
- else
- win->addch(' ');
- ++x;
- }
-
- if(x < width)
- {
- win->addch(' ');
- ++x;
- }
-
- while(x < width && x < basex)
- {
- win->addch(' ');
- ++x;
- }
-
- if(x < width)
- {
- win->addch('-');
- ++x;
- }
-
- if(x < width)
- {
- win->addch('>');
- ++x;
- }
-
- if(x < width)
- {
- win->addch(' ');
- ++x;
- }
-
- fragment *f = clipbox(action_description(ver));
- fragment_contents c = f->layout(width-x, width-x, st);
- delete f;
-
- assert(c.size() < 2);
- if(c.size() > 0)
- {
- const fragment_line &l = c.front();
-
- fragment_line::const_iterator loc = l.begin();
- while(loc != l.end() && x < width)
- {
- win->attrset(loc->attrs);
- win->add_wch(loc->ch);
- x += wcwidth(loc->ch);
- ++loc;
- }
- }
-
- win->apply_style(st);
-
- while(x < width)
- {
- win->addch(' ');
- ++x;
- }
- }
-};
-
-/** Like a solution_act_item, but the display doesn't include the
- * descriptive verb ("install" or whatever).
- */
-class solution_act_item_bare : public solution_act_item
-{
-public:
- solution_act_item_bare(const aptitude_solution::action &act,
- const sigc::slot1<void, fragment *> &set_short_description,
- const sigc::slot1<void, aptitude_resolver_dep> &set_active_dep)
- :solution_act_item(act, set_short_description, set_active_dep)
- {
- }
-
- void paint(vs_tree *win, int y, bool hierarchical, const style &st)
- {
- unsigned int basex = hierarchical ? 2*get_depth() : 0;
- unsigned int width = win->getmaxx();
-
- unsigned int x = 0;
-
- win->move(y, 0);
-
- if(x < width)
- {
- if(is_rejected())
- win->addch('R'); // For "reject"
- else if(is_mandatory())
- win->addch('A'); // For "accept"
- else
- win->addch(' ');
- ++x;
- }
-
- if(x < width)
- {
- win->addch(' ');
- ++x;
- }
-
- while(x < width && x < basex)
- {
- win->addch(' ');
- ++x;
- }
-
- win->apply_style(st+style_attrs_on(A_BOLD));
-
- aptitude_universe::version ver = get_ver();
-
- const char *name = ver.get_pkg().Name();
- while(x < width && *name)
- {
- win->addch(*name);
- ++name;
- ++x;
- }
-
- // Ensure that at least one space separates the two columns.
- if(x < width)
- {
- win->addch(' ');
- ++x;
- }
-
- win->apply_style(st);
- string righttext;
-
- pkgCache::VerIterator currver = ver.get_pkg().CurrentVer();
- if(currver.end() || ver.get_ver().end() || currver == ver.get_ver())
- {
- pkgCache::VerIterator dispv = currver;
-
- if(dispv.end())
- dispv = ver.get_ver();
-
- if(dispv.end())
- righttext = "[UNINST]";
- else
- righttext = ssprintf("[%s (%s)]",
- dispv.VerStr(), archives_text(dispv).c_str());
- }
- else
- {
- righttext = "[";
-
- if(currver.end())
- righttext += "UNINST";
- else
- {
- righttext += currver.VerStr();
- righttext += " ";
- righttext += archives_text(currver);
- }
-
- righttext += " -> ";
-
- if(ver.get_ver().end())
- righttext += "UNINST";
- else
- {
- righttext += ver.get_ver().VerStr();
- righttext += " ";
- righttext += archives_text(ver.get_ver());
- }
-
- righttext += "]";
- }
-
- unsigned int startx;
- if(x+righttext.size() >= width)
- startx = x;
- else
- startx = width-righttext.size();
- while(x < startx)
- {
- win->addch(' ');
- ++x;
- }
-
- unsigned int rightloc = 0;
- while(x < width && rightloc < righttext.size())
- {
- win->addch(righttext[rightloc]);
- ++rightloc;
- ++x;
- }
- }
-};
-
-class solution_unresolved_item : public solution_item
-{
- aptitude_universe::dep d;
-
- /** If \b true, then a brief explanation about what this item is
- * (suitable for inclusion in a list of alternatives) will be
- * displayed.
- */
- bool fully_explained;
-
- sigc::slot1<void, aptitude_resolver_dep> set_active_dep;
-public:
- solution_unresolved_item(const aptitude_universe::dep &_d,
- bool _fully_explained,
- const sigc::slot1<void, aptitude_resolver_dep> &_set_active_dep)
- :d(_d), fully_explained(_fully_explained), set_active_dep(_set_active_dep)
- {
- }
-
- bool is_rejected()
- {
- return resman->is_hardened(d);
- }
-
- bool is_mandatory()
- {
- return resman->is_forced_broken(d);
- }
-
- void highlighted(vs_tree *win)
- {
- set_active_dep(d);
- }
-
- void unhighlighted(vs_tree *win)
- {
- set_active_dep(aptitude_resolver_dep());
- }
-
- void reject()
- {
- resman->harden_dep(d);
- }
-
- void unreject()
- {
- resman->unharden_dep(d);
- }
-
- void mandate()
- {
- resman->force_break_dep(d);
- }
-
- void unmandate()
- {
- resman->unforce_break_dep(d);
- }
-
- void paint(vs_tree *win, int y, bool hierarchical, const style &st)
- {
- unsigned int basex = hierarchical ? 2*get_depth() : 0;
- unsigned int width = win->getmaxx();
-
- unsigned int x = 0;
-
- win->move(y, 0);
-
- if(x < width)
- {
- if(is_rejected())
- win->addch('R'); // For "reject"
- else if(is_mandatory())
- win->addch('A'); // For "accept"
- else
- win->addch(' ');
- ++x;
- }
-
- if(x < width)
- {
- win->addch(' ');
- ++x;
- }
-
- while(x < width && x < basex)
- {
- win->addch(' ');
- ++x;
- }
-
- wstring text;
-
- if(!fully_explained)
- text = swsprintf(transcode(_("%s recommends %s")).c_str(),
- d.get_dep().ParentPkg().Name(),
- dep_targets(d.get_dep()).c_str());
- else
- text = swsprintf(transcode(_("-> Leave the dependency \"%s recommends %s\" unresolved.")).c_str(),
- d.get_dep().ParentPkg().Name(),
- dep_targets(d.get_dep()).c_str());
-
- wstring::const_iterator loc = text.begin();
-
- while(loc != text.end() && x < width)
- {
- win->addch(*loc);
- x += wcwidth(*loc);
- ++loc;
- }
-
- while(x < width)
- {
- win->addch(' ');
- ++x;
- }
- }
-};
vs_subtree_generic *make_dep_solvers_tree(const aptitude_resolver_dep &d)
{
More information about the Aptitude-svn-commit
mailing list