[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