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

Daniel Burrows dburrows at costa.debian.org
Thu Sep 22 23:26:59 UTC 2005


Author: dburrows
Date: Thu Sep 22 23:26:56 2005
New Revision: 4193

Added:
   branches/aptitude-0.3/aptitude/src/menu_tree.cc
   branches/aptitude-0.3/aptitude/src/menu_tree.h
Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/Makefile.am
   branches/aptitude-0.3/aptitude/src/apt_info_tree.h
   branches/aptitude-0.3/aptitude/src/load_grouppolicy.cc
   branches/aptitude-0.3/aptitude/src/pkg_tree.cc
   branches/aptitude-0.3/aptitude/src/pkg_tree.h
   branches/aptitude-0.3/aptitude/src/solution_screen.cc
   branches/aptitude-0.3/aptitude/src/ui.cc
Log:
Rename pkg_menu_tree to menu_tree and split it from pkg_tree.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Thu Sep 22 23:26:56 2005
@@ -1,5 +1,10 @@
 2005-09-22  Daniel Burrows  <dburrows at debian.org>
 
+	* src/Makefile.am, src/apt_info_tree.h, src/load_grouppolicy.cc, src/menu_tree.cc, src/menu_tree.h, src/pkg_tree.cc, src/pkg_tree.h, src/solution_screen.cc, src/ui.cc:
+
+	  Rename pkg_menu_tree to menu_tree and split it into a separate
+	  file from pkg_tree.
+
 	* src/solution_screen.cc:
 
 	  Use a pkg_menu_tree instead of a vs_tree to build the solution

Modified: branches/aptitude-0.3/aptitude/src/Makefile.am
==============================================================================
--- branches/aptitude-0.3/aptitude/src/Makefile.am	(original)
+++ branches/aptitude-0.3/aptitude/src/Makefile.am	Thu Sep 22 23:26:56 2005
@@ -53,6 +53,8 @@
 	load_sortpolicy.h\
 	menu_redirect.cc\
 	menu_redirect.h\
+	menu_tree.cc\
+	menu_tree.h\
 	pkg_columnizer.cc\
 	pkg_columnizer.h\
 	pkg_info_screen.cc\

Modified: branches/aptitude-0.3/aptitude/src/apt_info_tree.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/apt_info_tree.h	(original)
+++ branches/aptitude-0.3/aptitude/src/apt_info_tree.h	Thu Sep 22 23:26:56 2005
@@ -30,12 +30,12 @@
 #ifndef APT_INFO_TREE_H
 #define APT_INFO_TREE_H
 
-#include "pkg_tree.h"
+#include "menu_tree.h"
 
 #include <apt-pkg/pkgcache.h>
 #include <string>
 
-class apt_info_tree:public pkg_menu_tree
+class apt_info_tree:public menu_tree
 {
   std::string package, version;
   // The package that should be used as the root, and the version to use

Modified: branches/aptitude-0.3/aptitude/src/load_grouppolicy.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/load_grouppolicy.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/load_grouppolicy.cc	Thu Sep 22 23:26:56 2005
@@ -24,6 +24,7 @@
 
 #include "load_grouppolicy.h"
 
+#include <generic/matchers.h>
 #include <generic/pkg_hier.h>
 #include <generic/util.h>
 

Added: branches/aptitude-0.3/aptitude/src/menu_tree.cc
==============================================================================
--- (empty file)
+++ branches/aptitude-0.3/aptitude/src/menu_tree.cc	Thu Sep 22 23:26:56 2005
@@ -0,0 +1,510 @@
+// menu_tree.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 "menu_tree.h"
+
+#include "aptitude.h"
+
+#include "pkg_item.h"
+#include "pkg_tree.h" // For pkg_tree::bindings(?!?!)
+#include "pkg_ver_item.h"
+#include "ui.h"
+#include "view_changelog.h"
+
+#include <generic/apt.h>
+#include <generic/apt_undo_group.h>
+#include <generic/config_signal.h>
+#include <generic/matchers.h>
+#include <generic/undo.h>
+
+#include <sigc++/adaptors/bind.h>
+
+vs_editline::history_list menu_tree::search_history;
+
+class pkg_matcher_search:public vs_tree_search_func
+{
+  pkg_matcher *matcher;
+public:
+  pkg_matcher_search(pkg_matcher *_matcher):matcher(_matcher) {}
+
+  bool operator()(const vs_treeitem &item)
+  {
+    // EWW
+    const pkg_item *pitem=dynamic_cast<const pkg_item *>(&item);
+    if(pitem)
+      return matcher->matches(pitem->get_package(), pitem->visible_version());
+    else {
+      const pkg_ver_item *pvitem=dynamic_cast<const pkg_ver_item *>(&item);
+
+      if(pvitem)
+	return matcher->matches(pvitem->get_package(),
+				pvitem->get_version());
+      else
+	return false;
+    }
+  }
+};
+
+menu_tree::menu_tree()
+  :last_search_matcher(NULL), doing_incsearch(false),
+   pre_incsearch_selected(get_end())
+{
+  aptcfg->connect(PACKAGE "::UI::Incremental-Search",
+		  sigc::mem_fun(*this, &menu_tree::do_cancel_incsearch));
+}
+
+menu_tree::~menu_tree()
+{
+  delete last_search_matcher;
+}
+
+pkg_tree_node *menu_tree::selection()
+{
+  vs_treeiterator i=get_selected();
+
+  if(i==get_end())
+    return NULL;
+  else
+    return dynamic_cast<pkg_tree_node *>(&*i);
+}
+
+bool menu_tree::pkg_or_ver_selected()
+{
+  pkg_tree_node *curr=selection();
+
+  if(curr && (dynamic_cast<pkg_item*>(curr) ||
+	      dynamic_cast<pkg_ver_item*>(curr)))
+    return true;
+  else
+    return false;
+}
+
+bool menu_tree::package_enabled()
+{
+  return get_visible() && selection()!=NULL;
+}
+
+bool menu_tree::package_action(void (pkg_tree_node::* action)(undo_group *))
+{
+  if(!get_visible())
+    return false;
+
+  pkg_tree_node *curr=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;
+}
+
+bool menu_tree::package_install()
+{
+  return package_action(&pkg_tree_node::select);
+}
+
+bool menu_tree::package_remove()
+{
+  return package_action(&pkg_tree_node::remove);
+}
+
+bool menu_tree::package_purge()
+{
+  return package_action(&pkg_tree_node::purge);
+}
+
+bool menu_tree::package_keep()
+{
+  return package_action(&pkg_tree_node::keep);
+}
+
+bool menu_tree::package_hold()
+{
+  return package_action(&pkg_tree_node::hold);
+}
+
+bool menu_tree::package_mark_auto()
+{
+  return package_action(&pkg_tree_node::mark_auto);
+}
+
+bool menu_tree::package_unmark_auto()
+{
+  return package_action(&pkg_tree_node::unmark_auto);
+}
+
+bool menu_tree::package_forbid_enabled()
+{
+  return get_visible() && pkg_or_ver_selected();
+}
+
+bool menu_tree::package_forbid()
+{
+  if(!get_visible())
+    return false;
+
+  pkg_tree_node *curr=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;
+    }
+}
+
+bool menu_tree::package_changelog_enabled()
+{
+  return get_visible() && pkg_or_ver_selected();
+}
+
+bool menu_tree::package_changelog()
+{
+  if(!get_visible())
+    return false;
+
+  pkg_tree_node *curr=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;
+    }
+}
+
+bool menu_tree::package_information_enabled()
+{
+  return get_visible() && pkg_or_ver_selected();
+}
+
+bool menu_tree::package_information()
+{
+  if(!get_visible())
+    return false;
+
+  pkg_tree_node *curr=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;
+    }
+}
+
+
+bool menu_tree::resolver_toggle_rejected()
+{
+  return false;
+}
+
+bool menu_tree::resolver_toggle_rejected_enabled()
+{
+  return false;
+}
+
+bool menu_tree::resolver_toggle_approved()
+{
+  return false;
+}
+
+bool menu_tree::resolver_toggle_approved_enabled()
+{
+  return false;
+}
+
+bool menu_tree::resolver_view_target()
+{
+  return false;
+}
+
+bool menu_tree::resolver_view_target_enabled()
+{
+  return false;
+}
+
+
+bool menu_tree::find_search_enabled()
+{
+  return get_visible();
+}
+
+bool menu_tree::find_search()
+{
+  prompt_string(_("Search for: "),
+		"",
+		arg(sigc::bind(sigc::mem_fun(*this, &menu_tree::do_search), false)),
+		arg(sigc::mem_fun(*this, &menu_tree::do_cancel_incsearch)),
+		arg(sigc::bind(sigc::mem_fun(*this, &menu_tree::do_incsearch), false)),
+		&search_history);
+
+  return true;
+}
+
+bool menu_tree::find_search_back_enabled()
+{
+  return get_visible();
+}
+
+bool menu_tree::find_search_back()
+{
+  prompt_string(_("Search back for: "),
+		"",
+		arg(sigc::bind(sigc::mem_fun(*this, &menu_tree::do_search), true)),
+		arg(sigc::mem_fun(*this, &menu_tree::do_cancel_incsearch)),
+		arg(sigc::bind(sigc::mem_fun(*this, &menu_tree::do_incsearch), true)),
+		&search_history);
+
+  return true;
+}
+
+bool menu_tree::find_research_enabled()
+{
+  return last_search_matcher!=NULL;
+}
+
+bool menu_tree::find_research()
+{
+  if(last_search_matcher)
+    {
+      pkg_matcher_search searcher(last_search_matcher);
+      if(last_search_backwards)
+	search_back_for(searcher);
+      else
+	search_for(searcher);
+
+      return true;
+    }
+  else
+    {
+      beep();
+      return true;
+    }
+
+}
+
+bool menu_tree::find_limit_enabled()
+{
+  return false;
+}
+
+bool menu_tree::find_limit()
+{
+  return false;
+}
+
+bool menu_tree::find_reset_limit_enabled()
+{
+  return false;
+}
+
+bool menu_tree::find_reset_limit()
+{
+  return false;
+}
+
+bool menu_tree::find_broken_enabled()
+{
+  return get_visible();
+}
+
+bool menu_tree::find_broken()
+{
+  if(!get_visible())
+    return false;
+
+  do_search(L"~b", false);
+
+  return true;
+}
+
+void menu_tree::do_search(std::wstring s, bool backward)
+{
+  if(s.size()!=0)
+    {
+      delete last_search_matcher;
+      last_search_term=s;
+      last_search_matcher=parse_pattern(transcode(s));
+    }
+
+  if(doing_incsearch)
+    doing_incsearch=false;
+  else
+    {
+      if(last_search_term.size()!=0 && last_search_matcher)
+	{
+	  last_search_backwards = backward;
+
+	  pkg_matcher_search searcher(last_search_matcher);
+	  if(backward)
+	    search_back_for(searcher);
+	  else
+	    search_for(searcher);
+	}
+      else
+	beep();
+    }
+}
+
+void menu_tree::do_incsearch(std::wstring s, bool backward)
+{
+  if(!aptcfg->FindB(PACKAGE "::UI::Incremental-Search", true))
+    return;
+
+  if(!doing_incsearch)
+    {
+      doing_incsearch=true;
+      pre_incsearch_selected=get_selected();
+    }
+
+  pkg_matcher *m=parse_pattern(transcode(s), false, false);
+
+  set_selection(pre_incsearch_selected);
+
+  if(m)
+    {
+      pkg_matcher_search searcher(m);
+      last_search_backwards = backward;
+      if(backward)
+	search_back_for(searcher);
+      else
+	search_for(searcher);
+    }
+
+  delete m;
+}
+
+void menu_tree::do_cancel_incsearch()
+{
+  if(doing_incsearch)
+    {
+      set_selection(pre_incsearch_selected);
+      doing_incsearch=false;
+    }
+}
+
+void menu_tree::reset_incsearch()
+{
+  doing_incsearch=false;
+  pre_incsearch_selected=get_end();
+}
+
+bool menu_tree::handle_key(const key &k)
+{
+  // ick -- but having our own bindings is also ugly. hm.
+  if(pkg_tree::bindings->key_matches(k, "Search"))
+    find_search();
+  else if(pkg_tree::bindings->key_matches(k, "SearchBack"))
+    find_search_back();
+  else if(pkg_tree::bindings->key_matches(k, "ReSearch"))
+    find_research();
+  else if(pkg_tree::bindings->key_matches(k, "SearchBroken"))
+    find_broken();
+  else
+    return vs_tree::handle_key(k);
+
+  return true;
+}

Added: branches/aptitude-0.3/aptitude/src/menu_tree.h
==============================================================================
--- (empty file)
+++ branches/aptitude-0.3/aptitude/src/menu_tree.h	Thu Sep 22 23:26:56 2005
@@ -0,0 +1,196 @@
+// menu_tree.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.
+//
+// A vs_tree augmented with the ability to act as a menu redirector.
+
+#ifndef MENU_TREE
+#define MENU_TREE
+
+#include "menu_redirect.h"
+
+#include <vscreen/vs_editline.h>
+
+#include <vscreen/vs_tree.h>
+
+class pkg_matcher;
+class pkg_tree_node;
+class undo_group;
+
+/** A vs_tree that can be generically used as a menu redirector.  All
+ *  the menu redirection routines are filled in; case analysis on the
+ *  currently selected tree item is used to implement them.  In
+ *  addition, the tree will pop up a search dialog in response to
+ *  either the Search menu command or the corresponding keybinding.
+ */
+class menu_tree:public vs_tree, public menu_redirect
+{
+  /** Return the selected node, if any, or \b NULL if no node is selected. */
+  pkg_tree_node *selection();
+
+  /** A precompiled matcher representing the last search that was performed. */
+  pkg_matcher *last_search_matcher;
+
+  /** The string that was compiled to produce the above matcher. */
+  std::wstring last_search_term;
+
+  /** If \b true, the last search was a backwards search. */
+  bool last_search_backwards;
+
+  /** \b true if an incremental search is in progress. */
+  bool doing_incsearch;
+
+  /** The iterator that was selected prior to the incremental search. */
+  vs_treeiterator pre_incsearch_selected;
+
+  void do_search(std::wstring s, bool backward);
+  void do_incsearch(std::wstring s, bool backward);
+  void do_cancel_incsearch();
+
+  /** Execute the given action; this is needed because some "wrapper"
+   *  code is used to handle undo and so on.
+   */
+  bool package_action(void (pkg_tree_node::* action)(undo_group *));
+
+  /** \return \b true if a package or a package version is selected. */
+  bool pkg_or_ver_selected();
+
+  static vs_editline::history_list search_history;
+protected:
+  /** Reset all information about the incremental search.  This must be
+   *  performed whenever the root is changed.
+   */
+  void reset_incsearch();
+
+  menu_tree();
+public:
+  static ref_ptr<menu_tree> create()
+  {
+    ref_ptr<menu_tree> rval(new menu_tree);
+    rval->decref();
+    return rval;
+  }
+
+  ~menu_tree();
+
+  /** \return \b true iff a pkg_node descendant is currently selected. */
+  bool package_enabled();
+
+  /** If a pkg_node is currently selected, execute its "install" operation. */
+  bool package_install();
+
+  /** If a pkg_node is currently selected, execute its "remove" operation. */
+  bool package_remove();
+
+  /** If a pkg_node is currently selected, execute its "purge" operation. */
+  bool package_purge();
+
+  /** If a pkg_node is currently selected, execute its "keep" operation. */
+  bool package_keep();
+
+  /** If a pkg_node is currently selected, execute its "hold" operation. */
+  bool package_hold();
+
+  /** If a pkg_node is currently selected, execute its "set auto" operation. */
+  bool package_mark_auto();
+
+  /** If a pkg_node is currently selected, execute its "set manual" operation. */
+  bool package_unmark_auto();
+
+  /** \return \b true if a package or a package version is selected. */
+  bool package_forbid_enabled();
+
+  /** If a package or a version is selected, perform a "forbid"
+   *  operation on it.
+   */
+  bool package_forbid();
+
+  /** \return \b true if a package or a package version is selected. */
+  bool package_changelog_enabled();
+
+  /** If a package or version is selected, show its changelog. */
+  bool package_changelog();
+
+  /** \return \b true if a package or a package version is selected. */
+  bool package_information_enabled();
+
+  /** If a package or version is selected, show its information. */
+  bool package_information();
+
+
+  /** If a solution item is selected, toggle whether it is rejected. */
+  bool resolver_toggle_rejected();
+
+  /** \return \b true if a solution item is selected. */
+  bool resolver_toggle_rejected_enabled();
+
+  /** If a solution item is selected, toggle whether it is approved. */
+  bool resolver_toggle_approved();
+
+  /** \return \b true if a solution item is selected. */
+  bool resolver_toggle_approved_enabled();
+
+  /** If a solution item is selected, view its target. */
+  bool resolver_view_target();
+
+  /** \return \b true if a solution item is selected. */
+  bool resolver_view_target_enabled();
+
+
+  /** \return \b true; all package trees know how to search. */
+  bool find_search_enabled();
+
+  /** \return \b true; all package trees know how to search. */
+  bool find_search_back_enabled();
+
+  /** Execute the 'search' menu command. */
+  bool find_search();
+
+  /** Execute the 'search backwards' menu command. */
+  bool find_search_back();
+
+  /** \return \b true if there is a "previous search". */
+  bool find_research_enabled();
+
+  /** Execute the 're-search' menu command. */
+  bool find_research();
+
+  /** \return \b false. */
+  bool find_limit_enabled();
+
+  /** Does nothing. */
+  bool find_limit();
+
+  /** \return \b false. */
+  bool find_reset_limit_enabled();
+
+  /** Does nothing. */
+  bool find_reset_limit();
+
+  /** \return \b true if this view is active. */
+  bool find_broken_enabled();
+
+  /** Find the next broken package (searches for '~b'). */
+  bool find_broken();
+
+  bool handle_key(const key &k);
+};
+
+typedef ref_ptr<menu_tree> menu_tree_ref;
+
+#endif

Modified: branches/aptitude-0.3/aptitude/src/pkg_tree.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_tree.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_tree.cc	Thu Sep 22 23:26:56 2005
@@ -19,516 +19,39 @@
 //
 //  A package-tree displayer.
 
-#include "aptitude.h"
-
 #include "pkg_tree.h"
 
+#include "aptitude.h"
 #include "download.h"
 #include "load_grouppolicy.h"
 #include "load_sortpolicy.h"
 #include "pkg_columnizer.h"
 #include "pkg_grouppolicy.h"
-#include "pkg_item.h"
 #include "pkg_node.h"
 #include "pkg_sortpolicy.h"
 #include "pkg_subtree.h"
-#include "pkg_ver_item.h"
 #include "ui.h"
-#include "view_changelog.h"
 #include "vs_progress.h"
 
 #include <vscreen/columnify.h>
+#include <vscreen/transcode.h>
 #include <vscreen/vs_treeitem.h>
 
 #include <generic/apt.h>
-#include <generic/apt_undo_group.h>
 #include <generic/config_signal.h>
-#include <generic/undo.h>
+#include <generic/matchers.h>
 
 #include <apt-pkg/progress.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/algorithms.h>
 
-#include <sigc++/adaptors/bind.h>
 #include <sigc++/adaptors/retype_return.h>
 #include <sigc++/functors/mem_fun.h>
 
 keybindings *pkg_tree::bindings=NULL;
 
 vs_editline::history_list pkg_tree::limit_history, pkg_tree::grouping_history,
-  pkg_tree::sorting_history, pkg_menu_tree::search_history;
-
-class pkg_matcher_search:public vs_tree_search_func
-{
-  pkg_matcher *matcher;
-public:
-  pkg_matcher_search(pkg_matcher *_matcher):matcher(_matcher) {}
-
-  bool operator()(const vs_treeitem &item)
-  {
-    // EWW
-    const pkg_item *pitem=dynamic_cast<const pkg_item *>(&item);
-    if(pitem)
-      return matcher->matches(pitem->get_package(), pitem->visible_version());
-    else {
-      const pkg_ver_item *pvitem=dynamic_cast<const pkg_ver_item *>(&item);
-
-      if(pvitem)
-	return matcher->matches(pvitem->get_package(),
-				pvitem->get_version());
-      else
-	return false;
-    }
-  }
-};
-
-pkg_menu_tree::pkg_menu_tree()
-  :last_search_matcher(NULL), doing_incsearch(false),
-   pre_incsearch_selected(get_end())
-{
-  aptcfg->connect(PACKAGE "::UI::Incremental-Search",
-		  sigc::mem_fun(*this, &pkg_tree::do_cancel_incsearch));
-}
-
-pkg_menu_tree::~pkg_menu_tree()
-{
-  delete last_search_matcher;
-}
-
-pkg_tree_node *pkg_menu_tree::selection()
-{
-  vs_treeiterator i=get_selected();
-
-  if(i==get_end())
-    return NULL;
-  else
-    return dynamic_cast<pkg_tree_node *>(&*i);
-}
-
-bool pkg_menu_tree::pkg_or_ver_selected()
-{
-  pkg_tree_node *curr=selection();
-
-  if(curr && (dynamic_cast<pkg_item*>(curr) ||
-	      dynamic_cast<pkg_ver_item*>(curr)))
-    return true;
-  else
-    return false;
-}
-
-bool pkg_menu_tree::package_enabled()
-{
-  return get_visible() && selection()!=NULL;
-}
-
-bool pkg_menu_tree::package_action(void (pkg_tree_node::* action)(undo_group *))
-{
-  if(!get_visible())
-    return false;
-
-  pkg_tree_node *curr=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;
-}
-
-bool pkg_menu_tree::package_install()
-{
-  return package_action(&pkg_tree_node::select);
-}
-
-bool pkg_menu_tree::package_remove()
-{
-  return package_action(&pkg_tree_node::remove);
-}
-
-bool pkg_menu_tree::package_purge()
-{
-  return package_action(&pkg_tree_node::purge);
-}
-
-bool pkg_menu_tree::package_keep()
-{
-  return package_action(&pkg_tree_node::keep);
-}
-
-bool pkg_menu_tree::package_hold()
-{
-  return package_action(&pkg_tree_node::hold);
-}
-
-bool pkg_menu_tree::package_mark_auto()
-{
-  return package_action(&pkg_tree_node::mark_auto);
-}
-
-bool pkg_menu_tree::package_unmark_auto()
-{
-  return package_action(&pkg_tree_node::unmark_auto);
-}
-
-bool pkg_menu_tree::package_forbid_enabled()
-{
-  return get_visible() && pkg_or_ver_selected();
-}
-
-bool pkg_menu_tree::package_forbid()
-{
-  if(!get_visible())
-    return false;
-
-  pkg_tree_node *curr=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;
-    }
-}
-
-bool pkg_menu_tree::package_changelog_enabled()
-{
-  return get_visible() && pkg_or_ver_selected();
-}
-
-bool pkg_menu_tree::package_changelog()
-{
-  if(!get_visible())
-    return false;
-
-  pkg_tree_node *curr=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;
-    }
-}
-
-bool pkg_menu_tree::package_information_enabled()
-{
-  return get_visible() && pkg_or_ver_selected();
-}
-
-bool pkg_menu_tree::package_information()
-{
-  if(!get_visible())
-    return false;
-
-  pkg_tree_node *curr=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;
-    }
-}
-
-
-bool pkg_menu_tree::resolver_toggle_rejected()
-{
-  return false;
-}
-
-bool pkg_menu_tree::resolver_toggle_rejected_enabled()
-{
-  return false;
-}
-
-bool pkg_menu_tree::resolver_toggle_approved()
-{
-  return false;
-}
-
-bool pkg_menu_tree::resolver_toggle_approved_enabled()
-{
-  return false;
-}
-
-bool pkg_menu_tree::resolver_view_target()
-{
-  return false;
-}
-
-bool pkg_menu_tree::resolver_view_target_enabled()
-{
-  return false;
-}
-
-
-bool pkg_menu_tree::find_search_enabled()
-{
-  return get_visible();
-}
-
-bool pkg_menu_tree::find_search()
-{
-  prompt_string(_("Search for: "),
-		"",
-		arg(sigc::bind(sigc::mem_fun(*this, &pkg_tree::do_search), false)),
-		arg(sigc::mem_fun(*this, &pkg_tree::do_cancel_incsearch)),
-		arg(sigc::bind(sigc::mem_fun(*this, &pkg_tree::do_incsearch), false)),
-		&search_history);
-
-  return true;
-}
-
-bool pkg_menu_tree::find_search_back_enabled()
-{
-  return get_visible();
-}
-
-bool pkg_menu_tree::find_search_back()
-{
-  prompt_string(_("Search back for: "),
-		"",
-		arg(sigc::bind(sigc::mem_fun(*this, &pkg_tree::do_search), true)),
-		arg(sigc::mem_fun(*this, &pkg_tree::do_cancel_incsearch)),
-		arg(sigc::bind(sigc::mem_fun(*this, &pkg_tree::do_incsearch), true)),
-		&search_history);
-
-  return true;
-}
-
-bool pkg_menu_tree::find_research_enabled()
-{
-  return last_search_matcher!=NULL;
-}
-
-bool pkg_menu_tree::find_research()
-{
-  if(last_search_matcher)
-    {
-      pkg_matcher_search searcher(last_search_matcher);
-      if(last_search_backwards)
-	search_back_for(searcher);
-      else
-	search_for(searcher);
-
-      return true;
-    }
-  else
-    {
-      beep();
-      return true;
-    }
-
-}
-
-bool pkg_menu_tree::find_limit_enabled()
-{
-  return false;
-}
-
-bool pkg_menu_tree::find_limit()
-{
-  return false;
-}
-
-bool pkg_menu_tree::find_reset_limit_enabled()
-{
-  return false;
-}
-
-bool pkg_menu_tree::find_reset_limit()
-{
-  return false;
-}
-
-bool pkg_menu_tree::find_broken_enabled()
-{
-  return get_visible();
-}
-
-bool pkg_menu_tree::find_broken()
-{
-  if(!get_visible())
-    return false;
-
-  do_search(L"~b", false);
-
-  return true;
-}
-
-void pkg_menu_tree::do_search(std::wstring s, bool backward)
-{
-  if(s.size()!=0)
-    {
-      delete last_search_matcher;
-      last_search_term=s;
-      last_search_matcher=parse_pattern(transcode(s));
-    }
-
-  if(doing_incsearch)
-    doing_incsearch=false;
-  else
-    {
-      if(last_search_term.size()!=0 && last_search_matcher)
-	{
-	  last_search_backwards = backward;
-
-	  pkg_matcher_search searcher(last_search_matcher);
-	  if(backward)
-	    search_back_for(searcher);
-	  else
-	    search_for(searcher);
-	}
-      else
-	beep();
-    }
-}
-
-void pkg_menu_tree::do_incsearch(std::wstring s, bool backward)
-{
-  if(!aptcfg->FindB(PACKAGE "::UI::Incremental-Search", true))
-    return;
-
-  if(!doing_incsearch)
-    {
-      doing_incsearch=true;
-      pre_incsearch_selected=get_selected();
-    }
-
-  pkg_matcher *m=parse_pattern(transcode(s), false, false);
-
-  set_selection(pre_incsearch_selected);
-
-  if(m)
-    {
-      pkg_matcher_search searcher(m);
-      last_search_backwards = backward;
-      if(backward)
-	search_back_for(searcher);
-      else
-	search_for(searcher);
-    }
-
-  delete m;
-}
-
-void pkg_menu_tree::do_cancel_incsearch()
-{
-  if(doing_incsearch)
-    {
-      set_selection(pre_incsearch_selected);
-      doing_incsearch=false;
-    }
-}
-
-void pkg_menu_tree::reset_incsearch()
-{
-  doing_incsearch=false;
-  pre_incsearch_selected=get_end();
-}
-
-bool pkg_menu_tree::handle_key(const key &k)
-{
-  // ick -- but having our own bindings is also ugly. hm.
-  if(pkg_tree::bindings->key_matches(k, "Search"))
-    find_search();
-  else if(pkg_tree::bindings->key_matches(k, "SearchBack"))
-    find_search_back();
-  else if(pkg_tree::bindings->key_matches(k, "ReSearch"))
-    find_research();
-  else if(pkg_tree::bindings->key_matches(k, "SearchBroken"))
-    find_broken();
-  else
-    return vs_tree::handle_key(k);
-
-  return true;
-}
+  pkg_tree::sorting_history;
 
 void pkg_tree::init_bindings()
 {
@@ -784,7 +307,7 @@
 		  NULL,
 		  &sorting_history);
   else
-    return pkg_menu_tree::handle_key(k);
+    return menu_tree::handle_key(k);
 
   return true;
 }

Modified: branches/aptitude-0.3/aptitude/src/pkg_tree.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_tree.h	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_tree.h	Thu Sep 22 23:26:56 2005
@@ -24,12 +24,9 @@
 #ifndef PKG_TREE_H
 #define PKG_TREE_H
 
-#include "menu_redirect.h"
+#include "menu_tree.h"
 
-#include <vscreen/vs_tree.h>
-#include <vscreen/vs_editline.h>
-
-#include "generic/matchers.h"
+#include <apt-pkg/pkgcache.h>
 
 class OpProgress;
 
@@ -39,165 +36,7 @@
 class pkg_tree_node;
 class undo_group;
 
-/** Provides some routines that can be used to connect to the Package
- *  menu.
- */
-class pkg_menu_tree:public vs_tree, public menu_redirect
-{
-  /** Return the selected node, if any, or \b NULL if no node is selected. */
-  pkg_tree_node *selection();
-
-  /** A precompiled matcher representing the last search that was performed. */
-  pkg_matcher *last_search_matcher;
-
-  /** The string that was compiled to produce the above matcher. */
-  std::wstring last_search_term;
-
-  /** If \b true, the last search was a backwards search. */
-  bool last_search_backwards;
-
-  /** \b true if an incremental search is in progress. */
-  bool doing_incsearch;
-
-  /** The iterator that was selected prior to the incremental search. */
-  vs_treeiterator pre_incsearch_selected;
-
-  void do_search(std::wstring s, bool backward);
-  void do_incsearch(std::wstring s, bool backward);
-  void do_cancel_incsearch();
-
-  /** Execute the given action; this is needed because some "wrapper"
-   *  code is used to handle undo and so on.
-   */
-  bool package_action(void (pkg_tree_node::* action)(undo_group *));
-
-  /** \return \b true if a package or a package version is selected. */
-  bool pkg_or_ver_selected();
-
-  static vs_editline::history_list search_history;
-protected:
-  /** Reset all information about the incremental search.  This must be
-   *  performed whenever the root is changed.
-   */
-  void reset_incsearch();
-
-  pkg_menu_tree();
-public:
-  static ref_ptr<pkg_menu_tree> create()
-  {
-    ref_ptr<pkg_menu_tree> rval(new pkg_menu_tree);
-    rval->decref();
-    return rval;
-  }
-
-  ~pkg_menu_tree();
-
-  /** \return \b true iff a pkg_node descendant is currently selected. */
-  bool package_enabled();
-
-  /** If a pkg_node is currently selected, execute its "install" operation. */
-  bool package_install();
-
-  /** If a pkg_node is currently selected, execute its "remove" operation. */
-  bool package_remove();
-
-  /** If a pkg_node is currently selected, execute its "purge" operation. */
-  bool package_purge();
-
-  /** If a pkg_node is currently selected, execute its "keep" operation. */
-  bool package_keep();
-
-  /** If a pkg_node is currently selected, execute its "hold" operation. */
-  bool package_hold();
-
-  /** If a pkg_node is currently selected, execute its "set auto" operation. */
-  bool package_mark_auto();
-
-  /** If a pkg_node is currently selected, execute its "set manual" operation. */
-  bool package_unmark_auto();
-
-  /** \return \b true if a package or a package version is selected. */
-  bool package_forbid_enabled();
-
-  /** If a package or a version is selected, perform a "forbid"
-   *  operation on it.
-   */
-  bool package_forbid();
-
-  /** \return \b true if a package or a package version is selected. */
-  bool package_changelog_enabled();
-
-  /** If a package or version is selected, show its changelog. */
-  bool package_changelog();
-
-  /** \return \b true if a package or a package version is selected. */
-  bool package_information_enabled();
-
-  /** If a package or version is selected, show its information. */
-  bool package_information();
-
-
-  /** If a solution item is selected, toggle whether it is rejected. */
-  bool resolver_toggle_rejected();
-
-  /** \return \b true if a solution item is selected. */
-  bool resolver_toggle_rejected_enabled();
-
-  /** If a solution item is selected, toggle whether it is approved. */
-  bool resolver_toggle_approved();
-
-  /** \return \b true if a solution item is selected. */
-  bool resolver_toggle_approved_enabled();
-
-  /** If a solution item is selected, view its target. */
-  bool resolver_view_target();
-
-  /** \return \b true if a solution item is selected. */
-  bool resolver_view_target_enabled();
-
-
-  /** \return \b true; all package trees know how to search. */
-  bool find_search_enabled();
-
-  /** \return \b true; all package trees know how to search. */
-  bool find_search_back_enabled();
-
-  /** Execute the 'search' menu command. */
-  bool find_search();
-
-  /** Execute the 'search backwards' menu command. */
-  bool find_search_back();
-
-  /** \return \b true if there is a "previous search". */
-  bool find_research_enabled();
-
-  /** Execute the 're-search' menu command. */
-  bool find_research();
-
-  /** \return \b false. */
-  bool find_limit_enabled();
-
-  /** Does nothing. */
-  bool find_limit();
-
-  /** \return \b false. */
-  bool find_reset_limit_enabled();
-
-  /** Does nothing. */
-  bool find_reset_limit();
-
-  /** \return \b true if this view is active. */
-  bool find_broken_enabled();
-
-  /** Find the next broken package (searches for '~b'). */
-  bool find_broken();
-
-  bool handle_key(const key &k);
-};
-
-typedef ref_ptr<pkg_menu_tree> pkg_menu_tree_ref;
-
-class pkg_tree:public pkg_menu_tree
+class pkg_tree:public menu_tree
 {
   /** If \b true, the tree is fully initialized: in particular,
    *  the cache-reload signals are connected up.

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 23:26:56 2005
@@ -21,7 +21,7 @@
 
 #include "aptitude.h"
 #include "menu_redirect.h"
-#include "pkg_tree.h"
+#include "menu_tree.h"
 #include "solution_fragment.h"
 #include "solution_item.h"
 
@@ -511,7 +511,7 @@
   vs_table_ref rval     = vs_table::create();
 
   vs_label_ref l        = vs_label::create(L"");
-  pkg_menu_tree_ref info_tree = pkg_menu_tree::create();
+  menu_tree_ref info_tree = menu_tree::create();
 
   create_menu_bindings(info_tree.unsafe_get_ref(), rval);
 

Modified: branches/aptitude-0.3/aptitude/src/ui.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/ui.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/ui.cc	Thu Sep 22 23:26:56 2005
@@ -92,6 +92,7 @@
 #include "download_manager.h"
 #include "download_screen.h"
 #include "download_thread.h"
+#include "menu_tree.h"
 #include "pkg_columnizer.h"
 #include "pkg_grouppolicy.h"
 #include "pkg_info_screen.h"
@@ -513,7 +514,7 @@
 	       NULL);
 }
 
-static vs_widget_ref make_default_view(const pkg_menu_tree_ref &mainwidget,
+static vs_widget_ref make_default_view(const menu_tree_ref &mainwidget,
 				       pkg_signal *sig,
 				       desc_signal *desc_sig,
 				       bool allow_visible_desc=true,



More information about the Aptitude-svn-commit mailing list