[Gtk-sharp-list] Re: A larger patch for the monodoc-browser

Philip Van Hoof spamfrommailing@freax.org
17 May 2003 13:15:01 +0200


--=-crlaS6RMhfdJjxfiVDwd
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

On Fri, 2003-05-16 at 19:08, Miguel de Icaza wrote:

> > I have a patch (not yet ready to check in) for doing searches, by
> > creating a table of contents and searching there.  Your code has the
> > disadvantage of doing a linear search on all the nodes, and am afraid
> > that might be a bit too slow.  But I will check it once I get back home.
> > 


Okay,

Well.. this is what I have so far (attached) so that you can compare and
try it ;).



-- 
Philip Van Hoof a.k.a. freax
me at freax dot org
http://www.freax.be -- http://www.freax.eu.org -- http://www.freax.org



--=-crlaS6RMhfdJjxfiVDwd
Content-Disposition: attachment; filename=monodoc_browser.diff
Content-Type: text/plain; name=monodoc_browser.diff; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

? Makefile.in
? autom4te.cache
? file.zip
? mod
? browser/Makefile.in
? browser/browser.cs.freax
? browser/browser.gladep
? browser/tree.zip
? class/Makefile.in
? class/tmp
? extras/Makefile.in
? extras/filesource
? extras/filetree
? extras/filezip
Index: AUTHORS
===================================================================
RCS file: /mono/monodoc/AUTHORS,v
retrieving revision 1.1
diff -u -u -r1.1 AUTHORS
--- AUTHORS	4 Apr 2003 04:33:59 -0000	1.1
+++ AUTHORS	17 May 2003 11:12:49 -0000
@@ -1,2 +1,3 @@
 Miguel de Icaza (miguel@ximian.com)
 Duncan Mak (duncan@ximian.com)
+Philip Van Hoof (me@freax.org)
Index: ChangeLog
===================================================================
RCS file: /mono/monodoc/ChangeLog,v
retrieving revision 1.3
diff -u -u -r1.3 ChangeLog
--- ChangeLog	14 Apr 2003 22:34:48 -0000	1.3
+++ ChangeLog	17 May 2003 11:12:49 -0000
@@ -1,3 +1,8 @@
+2003-04-14  Philip Van Hoof  <me@freax.org>
+	* Added some menus
+	* Finished the "Look For"-tabpage
+	* Cleanup
+
 2003-04-14  Miguel de Icaza  <miguel@ximian.com>
 
 	* Makefile.am (bin_SCRIPTS): Install a script `mod' that can be
Index: browser/Makefile.am
===================================================================
RCS file: /mono/monodoc/browser/Makefile.am,v
retrieving revision 1.8
diff -u -u -r1.8 Makefile.am
--- browser/Makefile.am	19 Apr 2003 22:52:22 -0000	1.8
+++ browser/Makefile.am	17 May 2003 11:12:49 -0000
@@ -6,7 +6,7 @@
 assembler_sources = $(srcdir)/assembler.cs $(shared_sources)
 dump_sources      = $(srcdir)/dump.cs $(shared_sources)
 browser_sources   = $(srcdir)/browser.cs $(srcdir)/history.cs $(shared_sources)
-browser_assemblies = -r:gtk-sharp.dll -r:glade-sharp.dll -r:glib-sharp.dll -r:ICSharpCode.SharpZipLib.dll
+browser_assemblies = -r:gtk-sharp.dll -r:gdk-sharp.dll -r:glade-sharp.dll -r:glib-sharp.dll -r:gnome-sharp.dll -r:ICSharpCode.SharpZipLib.dll
 
 EXTRA_DIST = $(assembler_sources) $(dump_sources) $(browser_sources) browser.glade monodoc.xml mono-ecma.xsl
 
Index: browser/browser.cs
===================================================================
RCS file: /mono/monodoc/browser/browser.cs,v
retrieving revision 1.21
diff -u -u -r1.21 browser.cs
--- browser/browser.cs	15 Apr 2003 05:23:52 -0000	1.21
+++ browser/browser.cs	17 May 2003 11:12:49 -0000
@@ -14,10 +14,15 @@
 //
 using GLib;
 using Gtk;
+using Gnome;
+using Gdk;
 using GtkSharp;
 using Glade;
 using System;
+using System.IO;
 using System.Collections;
+using System.Text.RegularExpressions;
+using System.Text;
 
 class Browser {
 	Glade.XML ui;
@@ -67,6 +72,21 @@
 	TreeView reference_tree;
 
 	[Glade.Widget]
+	Label lookfor_label;
+
+	[Glade.Widget]
+	Label searchfor_label;
+
+	[Glade.Widget]
+	Gtk.Entry search_entry;
+
+	[Glade.Widget]
+	TreeView searchfor_tree;
+
+	[Glade.Widget]
+	TreeView lookfor_tree;
+
+	[Glade.Widget]
 	Box help_container;
 
 	[Glade.Widget]
@@ -81,6 +101,9 @@
 	[Glade.Widget]
 	Button forward_button;
 
+	[Glade.Widget]
+	Gtk.Entry index_entry;
+
 	public History history;
 	
 	HTML html;
@@ -105,7 +128,7 @@
 		//html_container = (ScrolledWindow) ui ["html_container"];
 
 		help_tree = RootTree.LoadTree ();
-		tree_browser = new TreeBrowser (help_tree, reference_tree, this);
+		tree_browser = new TreeBrowser (help_tree, reference_tree, lookfor_tree, searchfor_tree, this);
 
 		html = new HTML ();
 		html.Show ();
@@ -136,7 +159,7 @@
 		}
 	}
 	
-        void LinkClicked (object o, LinkClickedArgs args)
+	void LinkClicked (object o, LinkClickedArgs args)
 	{
 		LoadUrl (args.Url);
 	}
@@ -207,54 +230,160 @@
 	{
 		Application.Quit ();
 	}
-}
+	
+	public void on_quit_activate (object o, EventArgs e)
+	{
+		Application.Quit ();
+	}
 
-//
-// This class implements the tree browser
-//
-class TreeBrowser {
-	Browser browser;
+	public void on_copy_activate (object o, EventArgs e)
+	{
+		this.html.Copy ();
+	}
+
+	public void on_about_activate (object o, EventArgs e)
+	{
+		string[] authors = {
+			"Miguel De Icaza <miguel@ximian.com>",
+			"Duncan Mak <duncan@ximian.com>",
+			"Philip Van Hoof <me@freax.org>"
+		};
+		string[] documenters = {};
+		Pixbuf logo = new Pixbuf ("/usr/share/pixmaps/gnome-about-logo.png");
+		// TODO: I have no idea how to do this correctly (how do I know what the --prefix was
+		// and stuff like that?)
+		// Pixbuf logo = new Pixbuf ("pixmaps" + Path.DirectorySeparatorChar + "monodoc-logo.png");
+		About about = new About("MonoDoc-browser", "CVS", "Copyright (C) 2003", 
+		"This tool displays documentation in the format used by the ECMA specification",
+		authors, documenters, "", logo);
+		about.Show ();
+	}
+
+	public void on_select_all_activate (object o, EventArgs e) 
+	{
+		this.html.SelectAll ();
+	}
+
+	public void on_expand_all_activate (object o, EventArgs e)
+	{
+		tree_browser.ExpandAll ();
+		this.reference_tree.ExpandAll ();
+	}
+
+	public void on_collapse_all_activate (object o, EventArgs e)
+	{
+		this.reference_tree.CollapseAll ();
+	}
+
+	public void on_index_entry_activate (object o, EventArgs e)
+	{
+		bool message = !(tree_browser.all_expanded);
+		uint context_id=0;
+
+		if (message) {
+			context_id = statusbar.Push (1, "A full classlist will be loaded first");
+			Application.EventsPending ();
+			Application.RunIteration ();
+		}
 
-	TreeView tree_view;
+		tree_browser.LookFor(index_entry.Text);
+
+		if (message)
+			statusbar.Remove(1, context_id);
+	}
 	
-	TreeStore store;
-	RootTree help_tree;
-	TreeIter root_iter;
+	
+	public void on_search_entry_activate (object o, EventArgs e)
+	{
+		bool message = !(tree_browser.all_expanded);
+		uint context_id=0;
 
-	//
+		if (message) {
+			context_id = statusbar.Push (1, "A full classlist will be loaded first");
+			Application.EventsPending ();
+			Application.RunIteration ();
+		}
+
+		tree_browser.SearchFor(search_entry.Text);
+
+		if (message)
+			statusbar.Remove(1, context_id);
+	}
+}
+
+
+
+// This class implements the tree browser
+class TreeBrowser {
+	private Browser browser;
+	private TreeView tree_view;
+	private TreeView lookfor_tree;
+	private TreeView searchfor_tree;
+	private TreeStore store;
+	private RootTree help_tree;
+	private TreeIter root_iter;
+	public bool all_expanded=false;
 	// This hashtable maps an iter to its node.
-	//
-	Hashtable iter_to_node;
+	private Hashtable iter_to_node;
 
-	//
 	// This hashtable maps the node to its iter
-	//
-	Hashtable node_to_iter;
+	private Hashtable node_to_iter;
 
-	//
 	// Maps a node to its TreeIter parent
-	//
-	Hashtable node_parent;
+	private Hashtable node_parent;
+
+	// This hashtable maps an iter to its node (for the lookfor-treeview).
+	private Hashtable iter_to_lookfornode;
+
+	// This hashtable maps an iter to its node (for the searchfor-treeview).
+	private Hashtable iter_to_searchfornode;
 
-	public TreeBrowser (RootTree help_tree, TreeView reference_tree, Browser browser)
+	private Hashtable populated = new Hashtable ();
+	private bool IgnoreRowActivated = false;
+
+	public TreeBrowser (RootTree help_tree, TreeView reference_tree, TreeView lookfor_tree, TreeView searchfor_tree, Browser browser)
 	{
 		this.browser = browser;
-		tree_view = reference_tree;
+		this.tree_view = reference_tree;
+		this.lookfor_tree = lookfor_tree;
+		this.searchfor_tree = searchfor_tree;
 		iter_to_node = new Hashtable ();
 		node_to_iter = new Hashtable ();
 		node_parent = new Hashtable ();
+		iter_to_lookfornode = new Hashtable ();
+		iter_to_searchfornode = new Hashtable ();
 
-		// Setup the TreeView
+		// Setup the normal TreeView
 		TreeViewColumn name_col = new TreeViewColumn ();
 		CellRenderer name_render = new CellRendererText ();
 		name_col.PackStart (name_render, true);
 		name_col.AddAttribute (name_render, "text", 0);
 		tree_view.AppendColumn (name_col);
 
-		// Bind events
+		// Setup the LookFor-TreeView
+		TreeViewColumn lname_col = new TreeViewColumn ();
+		CellRenderer lname_render = new CellRendererText ();
+		lname_col.PackStart (lname_render, true);
+		lname_col.AddAttribute (lname_render, "text", 0);
+		lookfor_tree.AppendColumn (lname_col);
+
+		// Setup the SearchFor-TreeView
+		TreeViewColumn sname_col = new TreeViewColumn ();
+		CellRenderer sname_render = new CellRendererText ();
+		sname_col.PackStart (sname_render, true);
+		sname_col.AddAttribute (sname_render, "text", 0);
+		searchfor_tree.AppendColumn (sname_col);
+
+		// Bind events for the normal TreeView
 		tree_view.RowExpanded += new GtkSharp.RowExpandedHandler (RowExpanded);
 		tree_view.Selection.Changed += new EventHandler (RowActivated);
 
+		// Bind events for the LookFor-TreeView
+		// This TreeView will be a simple ListBox, so a RowExpanded-handler is not needed
+		// lookfor_tree.RowExpanded += new GtkSharp.RowExpandedHandler (RowExpanded);
+		lookfor_tree.Selection.Changed += new EventHandler (LookForRowActivated);
+		searchfor_tree.Selection.Changed += new EventHandler (SearchForRowActivated);
+
 		// Setup the model
 		this.help_tree = help_tree;
 		store = new TreeStore ((int) TypeFundamentals.TypeString);
@@ -283,12 +412,9 @@
 		}
 	}
 
-	Hashtable populated = new Hashtable ();
-	
 	void RowExpanded (object o, GtkSharp.RowExpandedArgs args)
 	{
 		Node result = iter_to_node [args.Iter] as Node;
-
 		Open (result);
 	}
 
@@ -301,10 +427,8 @@
 
 		if (populated.Contains (node))
 			return;
-		
-		//
+
 		// We need to populate data on a second level
-		//
 		if (node.Nodes == null)
 			return;
 
@@ -313,7 +437,7 @@
 		}
 		populated [node] = true;
 	}
-	
+
 	void PopulateTreeFor (Node n)
 	{
 		if (populated [n] == null){
@@ -331,7 +455,7 @@
 		TreeIter iter = (TreeIter) node_to_iter [n];
 		TreePath path = store.GetPath (iter);
 	}
-	
+
 	public void ShowNode (Node n)
 	{
 		if (node_to_iter [n] == null){
@@ -345,9 +469,7 @@
 		TreeIter iter = (TreeIter) node_to_iter [n];
 		TreePath path = store.GetPath (iter);
 
-		//
 		// HACK until we upgrade Gtk# to Gtk 2.2
-		//
 		int depth = path.Depth;
 		for (int i = 0; i < depth; i++){
 			TreePath p = store.GetPath (iter);
@@ -364,7 +486,8 @@
 		tree_view.ScrollToCell (path, null, true, 0.5f, 0.5f);
 	}
 	
-	class NodePageVisit : PageVisit {
+	class NodePageVisit : PageVisit
+	{
 		Browser browser;
 		Node n;
 		string url;
@@ -388,53 +511,157 @@
 		}
 	}
 
-	bool IgnoreRowActivated = false;
-	
-	//
 	// This has to handle two kinds of urls: those encoded in the tree
 	// file, which are used to quickly lookup information precisely
 	// (things like "ecma:0"), and if that fails, it uses the more expensive
 	// mechanism that walks trees to find matches
-	//
-	void RowActivated  (object sender, EventArgs a)
+	void LoadNode (Node n)
+	{
+		Console.Error.WriteLine ("Loading url: " + n.URL);
+		if (n.tree.HelpSource == null)
+			return;
+
+		string url = n.URL;
+
+		// Try the tree-based urls first.
+		Node match;
+		string s = n.tree.HelpSource.GetText (url, out match);
+		if (s != null){
+			((Browser)browser).Render (s, match, url);
+			browser.history.AppendHistory (new NodePageVisit (browser, n, url));
+			return;
+		}
+
+		// Try the url resolver next
+		s = help_tree.RenderUrl (url, out match);
+		if (s != null){
+			((Browser)browser).Render (s, match, url);
+			browser.history.AppendHistory (new Browser.LinkPageVisit (browser, url));
+			return;
+		}
+
+		((Browser)browser).Render ("<b>Unhandled URL</b> " + n.URL, null, url);
+	}
+
+	void RowActivated (object sender, EventArgs a)
 	{
 		if (IgnoreRowActivated)
 			return;
-		
+
 		Gtk.TreeIter iter = new Gtk.TreeIter ();
 		Gtk.TreeModel model;
 
-		if (tree_view.Selection.GetSelected (out model, ref iter)){
+		if (tree_view.Selection.GetSelected (out model, ref iter)) {
 			Node n = (Node) iter_to_node [iter];
+			if (n != null)
+				this.LoadNode(n);
+		}
+	}
 
-			Console.Error.WriteLine ("Loading url: " + n.URL);
-			if (n.tree.HelpSource == null)
-				return;
+	void LookForRowActivated (object sender, EventArgs a)
+	{
+		if (IgnoreRowActivated)
+			return;
+
+		Gtk.TreeIter iter = new Gtk.TreeIter ();
+		Gtk.TreeModel model;
+
+		if (lookfor_tree.Selection.GetSelected (out model, ref iter)) {
+			Node n = (Node) iter_to_lookfornode [iter];
+			if (n != null)
+				this.LoadNode(n);
+		}
+	}
+
+	void SearchForRowActivated (object sender, EventArgs a)
+	{
+		if (IgnoreRowActivated)
+			return;
+
+		Gtk.TreeIter iter = new Gtk.TreeIter ();
+		Gtk.TreeModel model;
+
+		if (searchfor_tree.Selection.GetSelected (out model, ref iter)) {
+			Node n = (Node) iter_to_searchfornode [iter];
+			if (n != null)
+				this.LoadNode(n);
+		}
+	}
+
+	public void SearchFor (string searchfor)
+	{
+		// We need to expand-all first to fill the "iter_to_node"-hashtable
+		this.ExpandAll ();
+
+		// Compile a regular expression for this search
+		Regex regex = new Regex(".*"+searchfor+".*");
+
+		TreeStore mystore = new TreeStore ((int) TypeFundamentals.TypeString);
+
+		IDictionaryEnumerator en = iter_to_node.GetEnumerator();
+		while (en.MoveNext())
+		{
+			Node n = (Node)en.Value;
+			if (regex.Match(n.Caption).Success) {
+				TreeIter myiter;
+				mystore.Append (out myiter);
+				mystore.SetValue (myiter, 0, new Value (n.Caption));
+				iter_to_searchfornode [myiter] = n;
+			} //else if (regex.Match(n.Caption).Success) {
+				//TreeIter myiter;
+				//mystore.Append (out myiter);
+				//mystore.SetValue (myiter, 0, new Value (n.Caption));
+				//iter_to_searchfornode [myiter] = n;
+			//}
 
-			string url = n.URL;
 			
-			//
-			// Try the tree-based urls first.
-			//
-			Node match;
-			string s = n.tree.HelpSource.GetText (url, out match);
-			if (s != null){
-				((Browser)browser).Render (s, match, url);
-				browser.history.AppendHistory (new NodePageVisit (browser, n, url));
-				return;
-			}
+		}
+		searchfor_tree.Model = mystore;
+	}
 
-			//
-			// Try the url resolver next
-			//
-			s = help_tree.RenderUrl (url, out match);
-			if (s != null){
-				((Browser)browser).Render (s, match, url);
-				browser.history.AppendHistory (new Browser.LinkPageVisit (browser, url));
-				return;
+	public void LookFor (string searchfor)
+	{
+		// We need to expand-all first to fill the "iter_to_node"-hashtable
+		this.ExpandAll ();
+
+		// Compile a regular expression for this search
+		Regex regex = new Regex(".*"+searchfor+".*");
+
+		TreeStore mystore = new TreeStore ((int) TypeFundamentals.TypeString);
+
+		IDictionaryEnumerator en = iter_to_node.GetEnumerator();
+		while (en.MoveNext())
+		{
+			Node n = (Node)en.Value;
+			// We exclude Methods and Properties
+			if (!n.IsLeaf) {
+				if (regex.Match(n.Caption).Success) {
+					TreeIter myiter;
+					mystore.Append (out myiter);
+					mystore.SetValue (myiter, 0, new Value (n.Caption));
+					iter_to_lookfornode [myiter] = n;
+				}
 			}
+		}
+		lookfor_tree.Model = mystore;
+	}
+
+	public bool on_expandall_treeview_foreach (Gtk.TreeModel model, Gtk.TreePath path, Gtk.TreeIter iter)
+	{
+		Open ((Node) iter_to_node [iter]);
+		return false; // this means: keep on looping
+	}
 
-			((Browser)browser).Render ("<b>Unhandled URL</b> " + n.URL, null, url);
+	public void ExpandAll ()
+	{
+		if (this.all_expanded == false) {
+			
+			// I cannot use a Thread here: Gtk+ is not threadsafe :(
+			// but we do know that we don't have to expand-all twice :)!
+			// so thats why this stupid flag (all_expanded)
+			this.all_expanded = true;
+			
+			((TreeModel)this.store).Foreach(new TreeModelForeachFunc (on_expandall_treeview_foreach));
 		}
 	}
 }
Index: browser/browser.glade
===================================================================
RCS file: /mono/monodoc/browser/browser.glade,v
retrieving revision 1.9
diff -u -u -r1.9 browser.glade
--- browser/browser.glade	4 Apr 2003 23:49:39 -0000	1.9
+++ browser/browser.glade	17 May 2003 11:12:49 -0000
@@ -2,6 +2,7 @@
 <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
 
 <glade-interface>
+<requires lib="gnome"/>
 
 <widget class="GtkWindow" id="window1">
   <property name="visible">True</property>
@@ -29,6 +30,19 @@
 	      <property name="visible">True</property>
 	      <property name="label" translatable="yes">_File</property>
 	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="menuitem4_menu">
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="quit">
+		      <property name="visible">True</property>
+		      <property name="stock_item">GNOMEUIINFO_MENU_EXIT_ITEM</property>
+		      <signal name="activate" handler="on_quit_activate" last_modification_time="Wed, 14 May 2003 11:12:29 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
 	    </widget>
 	  </child>
 
@@ -37,6 +51,27 @@
 	      <property name="visible">True</property>
 	      <property name="label" translatable="yes">_Edit</property>
 	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="menuitem5_menu">
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="copy">
+		      <property name="visible">True</property>
+		      <property name="stock_item">GNOMEUIINFO_MENU_COPY_ITEM</property>
+		      <signal name="activate" handler="on_copy_activate" last_modification_time="Wed, 14 May 2003 11:12:29 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="select_all">
+		      <property name="visible">True</property>
+		      <property name="stock_item">GNOMEUIINFO_MENU_SELECT_ALL_ITEM</property>
+		      <signal name="activate" handler="on_select_all_activate" last_modification_time="Wed, 14 May 2003 11:12:29 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
 	    </widget>
 	  </child>
 
@@ -45,6 +80,29 @@
 	      <property name="visible">True</property>
 	      <property name="label" translatable="yes">_View</property>
 	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="menuitem6_menu">
+
+		  <child>
+		    <widget class="GtkMenuItem" id="collapse_all">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Collapse All</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_collapse_all_activate" last_modification_time="Wed, 14 May 2003 12:06:22 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="expand_all">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Expand All</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_expand_all_activate" last_modification_time="Wed, 14 May 2003 12:07:02 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
 	    </widget>
 	  </child>
 
@@ -53,6 +111,19 @@
 	      <property name="visible">True</property>
 	      <property name="label" translatable="yes">_Help</property>
 	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="menuitem7_menu">
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="about">
+		      <property name="visible">True</property>
+		      <property name="stock_item">GNOMEUIINFO_MENU_ABOUT_ITEM</property>
+		      <signal name="activate" handler="on_about_activate" last_modification_time="Wed, 14 May 2003 11:12:29 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
 	    </widget>
 	  </child>
 	</widget>
@@ -165,7 +236,7 @@
 		  <property name="spacing">0</property>
 
 		  <child>
-		    <widget class="GtkLabel" id="label">
+		    <widget class="GtkLabel" id="lookfor_label">
 		      <property name="visible">True</property>
 		      <property name="label" translatable="yes">_Look for:</property>
 		      <property name="use_underline">True</property>
@@ -197,6 +268,7 @@
 		      <property name="has_frame">True</property>
 		      <property name="invisible_char" translatable="yes">*</property>
 		      <property name="activates_default">False</property>
+		      <signal name="activate" handler="on_index_entry_activate" last_modification_time="Wed, 14 May 2003 16:16:12 GMT"/>
 		    </widget>
 		    <packing>
 		      <property name="padding">4</property>
@@ -215,7 +287,7 @@
 		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
 
 		      <child>
-			<widget class="GtkTreeView" id="treeview1">
+			<widget class="GtkTreeView" id="lookfor_tree">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="headers_visible">False</property>
@@ -258,18 +330,79 @@
 	      </child>
 
 	      <child>
-		<widget class="GtkLabel" id="label5">
+		<widget class="GtkVBox" id="vbox3">
 		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">label5</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="searchfor_label">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Search for:</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">index_entry</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkEntry" id="search_entry">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char" translatable="yes">*</property>
+		      <property name="activates_default">False</property>
+		      <signal name="activate" handler="on_search_entry_activate" last_modification_time="Fri, 16 May 2003 01:27:20 GMT"/>
+		    </widget>
+		    <packing>
+		      <property name="padding">4</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="scrolledwindow3">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_NONE</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<widget class="GtkTreeView" id="searchfor_tree">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="headers_visible">False</property>
+			  <property name="rules_hint">False</property>
+			  <property name="reorderable">False</property>
+			  <property name="enable_search">True</property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
 		</widget>
 		<packing>
 		  <property name="tab_expand">False</property>

--=-crlaS6RMhfdJjxfiVDwd--