[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