[Aptitude-svn-commit] r4197 - in branches/aptitude-0.3/aptitude: . src

Daniel Burrows dburrows at costa.debian.org
Fri Sep 23 01:42:59 UTC 2005


Author: dburrows
Date: Fri Sep 23 01:42:55 2005
New Revision: 4197

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/menu_tree.cc
   branches/aptitude-0.3/aptitude/src/menu_tree.h
   branches/aptitude-0.3/aptitude/src/pkg_item.cc
   branches/aptitude-0.3/aptitude/src/pkg_item.h
   branches/aptitude-0.3/aptitude/src/pkg_node.cc
   branches/aptitude-0.3/aptitude/src/pkg_node.h
   branches/aptitude-0.3/aptitude/src/pkg_ver_item.cc
   branches/aptitude-0.3/aptitude/src/pkg_ver_item.h
   branches/aptitude-0.3/aptitude/src/solution_item.cc
   branches/aptitude-0.3/aptitude/src/solution_item.h
Log:
Split up the monstrosity of menu_tree and make it much saner.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Fri Sep 23 01:42:55 2005
@@ -1,5 +1,12 @@
 2005-09-22  Daniel Burrows  <dburrows at debian.org>
 
+	* src/menu_tree.cc, src/menu_tree.h, src/pkg_item.cc, src/pkg_item.h, src/pkg_node.cc, src/pkg_node.h, src/pkg_ver_item.cc, src/pkg_ver_item.h, src/solution_item.cc, src/solution_item.h:
+
+	  Split up the menu_tree monstrosity and eliminate most of the
+	  dynamic_casts.  Now it just does a single dynamic_cast of the
+	  currently selected item to the menu_redirect interface; if the
+	  cast succeeds, it just proxies for the result.
+
 	* src/solution_screen.cc:
 
 	  D'oh, connect up the bindings to the examiner, not the info

Modified: branches/aptitude-0.3/aptitude/src/menu_tree.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/menu_tree.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/menu_tree.cc	Fri Sep 23 01:42:55 2005
@@ -75,304 +75,124 @@
   delete last_search_matcher;
 }
 
-pkg_tree_node *menu_tree::pkg_node_selection()
+bool menu_tree::proxy_redirect(bool (menu_redirect::*call)())
 {
-  vs_treeiterator i=get_selected();
-
-  if(i==get_end())
-    return NULL;
-  else
-    return dynamic_cast<pkg_tree_node *>(&*i);
-}
-
-solution_item *menu_tree::solution_selection()
-{
-  vs_treeiterator i = get_selected();
-
-  if(i == get_end())
-    return NULL;
-  else
-    return dynamic_cast<solution_item *>(&*i);
-}
+  if(!get_visible())
+    return false;
 
-bool menu_tree::pkg_or_ver_selected()
-{
-  pkg_tree_node *curr = pkg_node_selection();
+  vs_treeiterator curr = get_selected();
+  if(curr == get_end())
+    return false;
 
-  if(curr && (dynamic_cast<pkg_item*>(curr) ||
-	      dynamic_cast<pkg_ver_item*>(curr)))
-    return true;
-  else
+  menu_redirect *proxied = dynamic_cast<menu_redirect *>(&*curr);
+  if(proxied == NULL)
     return false;
+
+  return (proxied->*call)();
 }
 
 bool menu_tree::package_enabled()
 {
-  return get_visible() && pkg_node_selection()!=NULL;
-}
-
-bool menu_tree::package_action(void (pkg_tree_node::* action)(undo_group *))
-{
-  if(!get_visible())
-    return false;
-
-  pkg_tree_node *curr = pkg_node_selection();
-
-  if(curr)
-    {
-      undo_group *grp=new apt_undo_group;
-
-      (curr->*action)(grp);
-
-      if(!grp->empty())
-	apt_undos->add_item(grp);
-      else
-	delete grp;
-
-      if(aptcfg->FindB(PACKAGE "::UI::Advance-On-Action", false))
-	level_line_down();
-
-      package_states_changed();
-
-      return true;
-    }
-  else
-    return false;
+  return proxy_redirect(&menu_redirect::package_enabled);
 }
 
 bool menu_tree::package_install()
 {
-  return package_action(&pkg_tree_node::select);
+  return proxy_redirect(&menu_redirect::package_install);
 }
 
 bool menu_tree::package_remove()
 {
-  return package_action(&pkg_tree_node::remove);
+  return proxy_redirect(&menu_redirect::package_remove);
 }
 
 bool menu_tree::package_purge()
 {
-  return package_action(&pkg_tree_node::purge);
+  return proxy_redirect(&menu_redirect::package_purge);
 }
 
 bool menu_tree::package_keep()
 {
-  return package_action(&pkg_tree_node::keep);
+  return proxy_redirect(&menu_redirect::package_keep);
 }
 
 bool menu_tree::package_hold()
 {
-  return package_action(&pkg_tree_node::hold);
+  return proxy_redirect(&menu_redirect::package_hold);
 }
 
 bool menu_tree::package_mark_auto()
 {
-  return package_action(&pkg_tree_node::mark_auto);
+  return proxy_redirect(&menu_redirect::package_mark_auto);
 }
 
 bool menu_tree::package_unmark_auto()
 {
-  return package_action(&pkg_tree_node::unmark_auto);
+  return proxy_redirect(&menu_redirect::package_unmark_auto);
 }
 
 bool menu_tree::package_forbid_enabled()
 {
-  return get_visible() && pkg_or_ver_selected();
+  return proxy_redirect(&menu_redirect::package_forbid_enabled);
 }
 
 bool menu_tree::package_forbid()
 {
-  if(!get_visible())
-    return false;
-
-  pkg_tree_node *curr = pkg_node_selection();
-
-  if(!curr)
-    return false;
-
-  pkg_item *pitem=dynamic_cast<pkg_item*>(curr);
-  if(pitem)
-    {
-      undo_group *grp=new apt_undo_group;
-
-      pitem->forbid_upgrade(grp);
-
-      if(!grp->empty())
-	apt_undos->add_item(grp);
-      else
-	delete grp;
-
-      if(aptcfg->FindB(PACKAGE "::UI::Advance-On-Action", false))
-	level_line_down();
-
-      package_states_changed();
-
-      return true;
-    }
-  else
-    {
-      pkg_ver_item *pvitem=dynamic_cast<pkg_ver_item*>(curr);
-
-      if(pvitem)
-	{
-	  undo_group *grp=new apt_undo_group;
-
-	  pvitem->forbid_version(grp);
-
-	  if(!grp->empty())
-	    apt_undos->add_item(grp);
-	  else
-	    delete grp;
-
-	  if(aptcfg->FindB(PACKAGE "::UI::Advance-On-Action", false))
-	    level_line_down();
-
-	  package_states_changed();
-
-	  return true;
-	}
-      else
-	return false;
-    }
+  return proxy_redirect(&menu_redirect::package_forbid);
 }
 
 bool menu_tree::package_changelog_enabled()
 {
-  return get_visible() && pkg_or_ver_selected();
+  return proxy_redirect(&menu_redirect::package_changelog_enabled);
 }
 
 bool menu_tree::package_changelog()
 {
-  if(!get_visible())
-    return false;
-
-  pkg_tree_node *curr = pkg_node_selection();  
-
-  if(!curr)
-    return false;
-
-  pkg_item *pitem=dynamic_cast<pkg_item*>(curr);
-  if(pitem)
-    {
-      pitem->show_changelog();
-      return true;
-    }
-  else
-    {
-      pkg_ver_item *pvitem=dynamic_cast<pkg_ver_item*>(curr);
-
-      if(pvitem)
-	{
-	  view_changelog(pvitem->get_version());
-	  return true;
-	}
-      else
-	return false;
-    }
+  return proxy_redirect(&menu_redirect::package_changelog);
 }
 
 bool menu_tree::package_information_enabled()
 {
-  return get_visible() && pkg_or_ver_selected();
+  return proxy_redirect(&menu_redirect::package_information_enabled);
 }
 
 bool menu_tree::package_information()
 {
-  if(!get_visible())
-    return false;
-
-  pkg_tree_node *curr = pkg_node_selection();  
-
-  if(!curr)
-    return false;
-
-  pkg_item *pitem=dynamic_cast<pkg_item*>(curr);
-  if(pitem)
-    {
-      pitem->show_information();
-      return true;
-    }
-  else
-    {
-      pkg_ver_item *pvitem=dynamic_cast<pkg_ver_item*>(curr);
-
-      if(pvitem)
-	{
-	  pvitem->show_information();
-	  return true;
-	}
-      else
-	return false;
-    }
+  return proxy_redirect(&menu_redirect::package_information);
 }
 
-
 bool menu_tree::resolver_toggle_rejected()
 {
-  if(!get_visible())
-    return false;
-
-  solution_item *item = solution_selection();
-  if(item == NULL)
-    return false;
-
-  item->toggle_rejected();
-  return true;
+  return proxy_redirect(&menu_redirect::resolver_toggle_rejected);
 }
 
 bool menu_tree::resolver_toggle_rejected_enabled()
 {
-  return get_visible() && solution_selection() != NULL;
+  return proxy_redirect(&menu_redirect::resolver_toggle_rejected_enabled);
 }
 
 bool menu_tree::resolver_toggle_approved()
 {
-  if(!get_visible())
-    return false;
-
-  solution_item *item = solution_selection();
-  if(item == NULL)
-    return false;
-
-  item->toggle_mandated();
-  return true;
+  return proxy_redirect(&menu_redirect::resolver_toggle_approved);
 }
 
-/// \todo eliminate casts as described in the .h
 bool menu_tree::resolver_toggle_approved_enabled()
 {
-  return get_visible() && solution_selection() != NULL;
+  return proxy_redirect(&menu_redirect::resolver_toggle_approved_enabled);
 }
 
 bool menu_tree::resolver_view_target()
 {
-  vs_treeiterator i = get_selected();
-
-  if(i == get_end())
-    return false;
-
-  solution_act_item *item = dynamic_cast<solution_act_item *>(&*i);
-
-  if(item == NULL)
-    return false;
-
-  item->show_target_info();
-  return true;
+  return proxy_redirect(&menu_redirect::resolver_view_target);
 }
 
 bool menu_tree::resolver_view_target_enabled()
 {
-  vs_treeiterator i = get_selected();
-
-  if(i == get_end())
-    return false;
-
-  solution_act_item *item = dynamic_cast<solution_act_item *>(&*i);
-
-  return item != NULL;
+  return proxy_redirect(&menu_redirect::resolver_view_target_enabled);
 }
 
 
+
 bool menu_tree::find_search_enabled()
 {
   return get_visible();

Modified: branches/aptitude-0.3/aptitude/src/menu_tree.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/menu_tree.h	(original)
+++ branches/aptitude-0.3/aptitude/src/menu_tree.h	Fri Sep 23 01:42:55 2005
@@ -46,6 +46,11 @@
  */
 class menu_tree:public vs_tree, public menu_redirect
 {
+  /** Proxy the given call to the currently selected item, if it
+   *  implements the menu_redirect interface.
+   */
+  bool proxy_redirect(bool (menu_redirect::*)());
+
   /** Return the selected node, if any, or \b NULL if no node is selected. */
   pkg_tree_node *pkg_node_selection();
 

Modified: branches/aptitude-0.3/aptitude/src/pkg_item.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_item.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_item.cc	Fri Sep 23 01:42:55 2005
@@ -524,3 +524,48 @@
 {
   return visible_version(package);
 }
+
+//////////////////////// Menu redirections: /////////////////////////////
+
+bool pkg_item::package_forbid_enabled()
+{
+  return true;
+}
+
+bool pkg_item::package_forbid()
+{
+  undo_group *grp=new apt_undo_group;
+
+  forbid_upgrade(grp);
+
+  if(!grp->empty())
+    apt_undos->add_item(grp);
+  else
+    delete grp;
+
+  package_states_changed();
+
+  return true;
+}
+
+bool pkg_item::package_changelog_enabled()
+{
+  return true;
+}
+
+bool pkg_item::package_changelog()
+{
+  show_changelog();
+  return true;
+}
+
+bool pkg_item::package_information_enabled()
+{
+  return true;
+}
+
+bool pkg_item::package_information()
+{
+  show_information();
+  return true;
+}

Modified: branches/aptitude-0.3/aptitude/src/pkg_item.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_item.h	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_item.h	Fri Sep 23 01:42:55 2005
@@ -88,6 +88,14 @@
    *  \param highlighted if \b true, the package is highlighted
    */
   static style pkg_style(pkgCache::PkgIterator package, bool highlighted);
+
+  // Menu redirections:
+  bool package_forbid_enabled();
+  bool package_forbid();
+  bool package_changelog_enabled();
+  bool package_changelog();
+  bool package_information_enabled();
+  bool package_information();
 };
 
 #endif

Modified: branches/aptitude-0.3/aptitude/src/pkg_node.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_node.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_node.cc	Fri Sep 23 01:42:55 2005
@@ -80,3 +80,180 @@
 
   return true;
 }
+
+//////////////////////////// Menu Redirections //////////////////////////
+
+bool pkg_tree_node::package_action(void (pkg_tree_node::* action)(undo_group *))
+{
+  undo_group *grp = new apt_undo_group;
+  (this->*action)(grp);
+  if(!grp->empty())
+    apt_undos->add_item(grp);
+  else
+    delete grp;
+
+  package_states_changed();
+
+  return true;
+}
+
+bool pkg_tree_node::package_enabled()
+{
+  return true;
+}
+
+bool pkg_tree_node::package_install()
+{
+  return package_action(&pkg_tree_node::select);
+
+}
+
+bool pkg_tree_node::package_remove()
+{
+  return package_action(&pkg_tree_node::remove);
+}
+
+bool pkg_tree_node::package_purge()
+{
+  return package_action(&pkg_tree_node::purge);
+}
+
+bool pkg_tree_node::package_keep()
+{
+  return package_action(&pkg_tree_node::keep);
+}
+
+bool pkg_tree_node::package_hold()
+{
+  return package_action(&pkg_tree_node::hold);
+}
+
+bool pkg_tree_node::package_mark_auto()
+{
+  return package_action(&pkg_tree_node::mark_auto);
+}
+
+bool pkg_tree_node::package_unmark_auto()
+{
+  return package_action(&pkg_tree_node::unmark_auto);
+}
+
+bool pkg_tree_node::package_forbid_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::package_forbid()
+{
+  return false;
+}
+
+bool pkg_tree_node::package_changelog_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::package_changelog()
+{
+  return false;
+}
+
+bool pkg_tree_node::package_information_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::package_information()
+{
+  return false;
+}
+
+bool pkg_tree_node::resolver_toggle_rejected()
+{
+  return false;
+}
+
+bool pkg_tree_node::resolver_toggle_rejected_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::resolver_toggle_approved()
+{
+  return false;
+}
+
+bool pkg_tree_node::resolver_toggle_approved_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::resolver_view_target()
+{
+  return false;
+}
+
+bool pkg_tree_node::resolver_view_target_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_search_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_search()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_search_back_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_search_back()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_research_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_research()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_limit_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_limit()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_reset_limit_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_reset_limit()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_broken_enabled()
+{
+  return false;
+}
+
+bool pkg_tree_node::find_broken()
+{
+  return false;
+}

Modified: branches/aptitude-0.3/aptitude/src/pkg_node.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_node.h	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_node.h	Fri Sep 23 01:42:55 2005
@@ -23,15 +23,21 @@
 #ifndef PKG_NODE_H
 #define PKG_NODE_H
 
+#include "menu_redirect.h"
+
 #include <vscreen/vs_treeitem.h>
 #include <generic/undo.h>
 
 class undo_group;
 class keybindings;
 
-class pkg_tree_node:virtual public vs_treeitem
+class pkg_tree_node:virtual public vs_treeitem, public menu_redirect
 // Provides some extra package-related interfaces.
 {
+  /** Used to convert calls via the menu interface to wrapped
+   *  invocations of the low-level action methods.
+   */
+  bool package_action(void (pkg_tree_node::* action)(undo_group *));
 public:
   virtual void select(undo_group *undo)=0;
   virtual void hold(undo_group *undo)=0;
@@ -51,6 +57,40 @@
 
   static keybindings *bindings;
   static void init_bindings();
+
+  // Menu redirections:
+  bool package_enabled();
+  bool package_install();
+  bool package_remove();
+  bool package_purge();
+  bool package_hold();
+  bool package_keep();
+  bool package_mark_auto();
+  bool package_unmark_auto();
+  bool package_forbid_enabled();
+  bool package_forbid();
+  bool package_information_enabled();
+  bool package_information();
+  bool package_changelog_enabled();
+  bool package_changelog();
+  bool resolver_toggle_approved();
+  bool resolver_toggle_approved_enabled();
+  bool resolver_toggle_rejected();
+  bool resolver_toggle_rejected_enabled();
+  bool resolver_view_target();
+  bool resolver_view_target_enabled();
+  bool find_search_enabled();
+  bool find_search();
+  bool find_search_back_enabled();
+  bool find_search_back();
+  bool find_research_enabled();
+  bool find_research();
+  bool find_limit_enabled();
+  bool find_limit();
+  bool find_reset_limit_enabled();
+  bool find_reset_limit();
+  bool find_broken_enabled();
+  bool find_broken();  
 };
 
 #endif

Modified: branches/aptitude-0.3/aptitude/src/pkg_ver_item.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_ver_item.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_ver_item.cc	Fri Sep 23 01:42:55 2005
@@ -753,3 +753,49 @@
   else
     return pkg_tree_node::dispatch_key(k, owner);
 }
+
+
+////////////////////////// Menu redirections: ////////////////////////////
+
+bool pkg_ver_item::package_forbid_enabled()
+{
+  return true;
+}
+
+bool pkg_ver_item::package_forbid()
+{
+  undo_group *grp = new apt_undo_group;
+
+  forbid_version(grp);
+
+  if(!grp->empty())
+    apt_undos->add_item(grp);
+  else
+    delete grp;
+
+  package_states_changed();
+  return true;
+}
+
+bool pkg_ver_item::package_changelog_enabled()
+{
+  return true;
+}
+
+bool pkg_ver_item::package_changelog()
+{
+  view_changelog(get_version());
+  return true;
+}
+
+bool pkg_ver_item::package_information_enabled()
+{
+  return true;
+}
+
+bool pkg_ver_item::package_information()
+{
+  show_information();
+  return true;
+}
+

Modified: branches/aptitude-0.3/aptitude/src/pkg_ver_item.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_ver_item.h	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_ver_item.h	Fri Sep 23 01:42:55 2005
@@ -79,6 +79,15 @@
   pkg_ver_item *get_sig();
 
   static style ver_style(pkgCache::VerIterator version);
+
+
+  // Menu redirections:
+  bool package_forbid_enabled();
+  bool package_forbid();
+  bool package_changelog_enabled();
+  bool package_changelog();
+  bool package_information_enabled();
+  bool package_information();
 };
 
 class versort:public sortpolicy

Modified: branches/aptitude-0.3/aptitude/src/solution_item.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/solution_item.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/solution_item.cc	Fri Sep 23 01:42:55 2005
@@ -169,6 +169,72 @@
   return true;
 }
 
+
+//////////////////////////// Menu Redirections //////////////////////////
+
+bool solution_item::package_enabled() { return false; }
+bool solution_item::package_install() { return false; }
+bool solution_item::package_remove() { return false; }
+bool solution_item::package_purge() { return false; }
+bool solution_item::package_hold() { return false; }
+bool solution_item::package_keep() { return false; }
+bool solution_item::package_mark_auto() { return false; }
+bool solution_item::package_unmark_auto() { return false; }
+bool solution_item::package_forbid_enabled() { return false; }
+bool solution_item::package_forbid() { return false; }
+bool solution_item::package_information_enabled() { return false; }
+bool solution_item::package_information() { return false; }
+bool solution_item::package_changelog_enabled() { return false; }
+bool solution_item::package_changelog() { return false; }
+
+bool solution_item::resolver_toggle_approved()
+{
+  toggle_mandated();
+  return true;
+}
+
+bool solution_item::resolver_toggle_approved_enabled()
+{
+  return true;
+}
+
+bool solution_item::resolver_toggle_rejected()
+{
+  toggle_rejected();
+  return true;
+}
+
+bool solution_item::resolver_toggle_rejected_enabled()
+{
+  return true;
+}
+
+bool solution_item::resolver_view_target()
+{
+  return false;
+}
+
+bool solution_item::resolver_view_target_enabled()
+{
+  return false;
+}
+
+bool solution_item::find_search_enabled() { return false; }
+bool solution_item::find_search() { return false; }
+bool solution_item::find_search_back_enabled() { return false; }
+bool solution_item::find_search_back() { return false; }
+bool solution_item::find_research_enabled() { return false; }
+bool solution_item::find_research() { return false; }
+bool solution_item::find_limit_enabled() { return false; }
+bool solution_item::find_limit() { return false; }
+bool solution_item::find_reset_limit_enabled() { return false; }
+bool solution_item::find_reset_limit() { return false; }
+bool solution_item::find_broken_enabled() { return false; }
+bool solution_item::find_broken() { return false; }
+
+
+/////////////////////////////////////////////////////////////////////////
+
 bool solution_act_item::is_rejected()
 {
   assert(resman->resolver_exists());
@@ -336,6 +402,20 @@
     }
 }
 
+bool solution_act_item::view_target_enabled()
+{
+  return true;
+}
+
+bool solution_act_item::view_target()
+{
+  show_target_info();
+  return true;
+}
+
+
+
+
 void solution_act_item_bare::paint(vs_tree *win, int y, bool hierarchical, const style &st)
 {
   unsigned int basex = hierarchical ? 2*get_depth() : 0;

Modified: branches/aptitude-0.3/aptitude/src/solution_item.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/solution_item.h	(original)
+++ branches/aptitude-0.3/aptitude/src/solution_item.h	Fri Sep 23 01:42:55 2005
@@ -22,6 +22,8 @@
 #ifndef SOLUTION_ITEM_H
 #define SOLUTION_ITEM_H
 
+#include "menu_redirect.h"
+
 #include <sigc++/slot.h>
 
 #include <generic/aptitude_resolver_universe.h>
@@ -31,7 +33,7 @@
 
 class fragment;
 
-class solution_item : public vs_treeitem
+class solution_item : public vs_treeitem, public menu_redirect
 {
 public:
   const wchar_t *tag();
@@ -75,6 +77,40 @@
   style get_normal_style();
 
   bool dispatch_key(const key &k, vs_tree *owner);
+
+  // Menu redirections:
+  bool package_enabled();
+  bool package_install();
+  bool package_remove();
+  bool package_purge();
+  bool package_hold();
+  bool package_keep();
+  bool package_mark_auto();
+  bool package_unmark_auto();
+  bool package_forbid_enabled();
+  bool package_forbid();
+  bool package_information_enabled();
+  bool package_information();
+  bool package_changelog_enabled();
+  bool package_changelog();
+  bool resolver_toggle_approved();
+  bool resolver_toggle_approved_enabled();
+  bool resolver_toggle_rejected();
+  bool resolver_toggle_rejected_enabled();
+  bool resolver_view_target();
+  bool resolver_view_target_enabled();
+  bool find_search_enabled();
+  bool find_search();
+  bool find_search_back_enabled();
+  bool find_search_back();
+  bool find_research_enabled();
+  bool find_research();
+  bool find_limit_enabled();
+  bool find_limit();
+  bool find_reset_limit_enabled();
+  bool find_reset_limit();
+  bool find_broken_enabled();
+  bool find_broken();  
 };
 
 class solution_act_item : public solution_item
@@ -135,6 +171,11 @@
   bool dispatch_key(const key &k, vs_tree *owner);
 
   void paint(vs_tree *win, int y, bool hierarchical, const style &st);
+
+
+  // Menu redirections.
+  bool view_target_enabled();
+  bool view_target();
 };
 
 /** Like a solution_act_item, but the display doesn't include the



More information about the Aptitude-svn-commit mailing list