Index: src/nautilus-window-menus.c
===================================================================
--- src/nautilus-window-menus.c	(revisión: 14727)
+++ src/nautilus-window-menus.c	(copia de trabajo)
@@ -462,6 +462,19 @@ show_hidden_files_preference_callback (g
 }
 
 static void
+action_interactive_search_spatial_callback (GtkAction *action,
+					    gpointer   user_data)
+{	
+	NautilusWindow *window;
+	NautilusWindowSlot *slot;
+
+	window = NAUTILUS_WINDOW (user_data);
+	slot = nautilus_window_get_active_slot (window);
+
+	nautilus_view_start_interactive_search (slot->content_view);
+}
+
+static void
 preferences_respond_callback (GtkDialog *dialog,
 			      gint response_id)
 {
@@ -876,6 +889,10 @@ static const GtkActionEntry main_entries
   /* label, accelerator */       N_("CD/_DVD Creator"), NULL,
   /* tooltip */                  N_("Open a folder into which you can drag files to burn to a CD or DVD"),
                                  G_CALLBACK (action_go_to_burn_cd_callback) },
+  /* name, stock id */         { "Interactive Search", GTK_STOCK_FIND,
+  /* label, accelerator */       N_("Find in this folder"), "<control>J",
+  /* tooltip */                  N_("Lets you perform a quick search for files in the current folder"),
+                                 G_CALLBACK (action_interactive_search_spatial_callback) },
 };
 
 static const GtkToggleActionEntry main_toggle_entries[] = {
Index: src/nautilus-navigation-window-ui.xml
===================================================================
--- src/nautilus-navigation-window-ui.xml	(revisión: 14727)
+++ src/nautilus-navigation-window-ui.xml	(copia de trabajo)
@@ -20,6 +20,11 @@
 			<menuitem name="Show Hide Statusbar" action="Show Hide Statusbar"/>
 		</placeholder>
 	</menu>
+	<menu action="Edit">
+		<placeholder name="Select Items">
+			<menuitem name="Find" action="Interactive Search"/>
+		</placeholder>
+	</menu>
         <placeholder name="Other Menus">
 	        <menu action="Go">
                         <placeholder name="Navigation Items">
Index: src/file-manager/fm-icon-view.c
===================================================================
--- src/file-manager/fm-icon-view.c	(revisión: 14727)
+++ src/file-manager/fm-icon-view.c	(copia de trabajo)
@@ -168,6 +168,7 @@ static void                 fm_icon_view
 								       gboolean              tighter_layout);
 static gboolean              fm_icon_view_supports_manual_layout      (FMIconView           *icon_view);
 static void                 fm_icon_view_reveal_selection             (FMDirectoryView      *view);
+static void                 fm_icon_view_start_interactive_search     (NautilusView         *view);
 static const SortCriterion *get_sort_criterion_by_sort_type           (NautilusFileSortType  sort_type);
 static void                 set_sort_criterion_by_sort_type           (FMIconView           *icon_view,
 								       NautilusFileSortType  sort_type);
@@ -2497,6 +2498,21 @@ all_columns_same_width_changed_callback 
 	set_columns_same_width (icon_view);
 }
 
+static void
+fm_icon_view_start_interactive_search (NautilusView *view)
+{
+	NautilusIconContainer  *icon_container;
+	gboolean ret;
+
+	icon_container = NAUTILUS_ICON_CONTAINER (GTK_BIN (FM_ICON_VIEW (view))->child);
+	if (!GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (icon_container))) {
+		gtk_widget_grab_focus (GTK_WIDGET (icon_container));
+	}
+
+	ret = EEL_CALL_METHOD_WITH_RETURN_VALUE
+		(NAUTILUS_ICON_CONTAINER_CLASS, icon_container,
+		 start_interactive_search, (icon_container));
+}
 
 static void
 fm_icon_view_sort_directories_first_changed (FMDirectoryView *directory_view)
@@ -2882,6 +2898,7 @@ fm_icon_view_iface_init (NautilusViewIfa
 	iface->get_first_visible_file = icon_view_get_first_visible_file;
 	iface->scroll_to_file = icon_view_scroll_to_file;
 	iface->get_title = NULL;
+	iface->start_interactive_search = fm_icon_view_start_interactive_search;
 }
 
 static void
Index: src/file-manager/fm-list-view.c
===================================================================
--- src/file-manager/fm-list-view.c	(revisión: 14727)
+++ src/file-manager/fm-list-view.c	(copia de trabajo)
@@ -135,6 +135,12 @@ static GdkCursor *              hand_cur
 
 static GtkTargetList *          source_target_list = NULL;
 
+static gboolean interactive_search_equal_func (GtkTreeModel  *model,
+						gint 		column,
+						const gchar	*key,
+						GtkTreeIter	*iter,
+						gpointer	search_data);
+static void   fm_list_view_start_interactive_search	   (NautilusView      *view);
 static GList *fm_list_view_get_selection                   (FMDirectoryView   *view);
 static GList *fm_list_view_get_selection_for_file_transfer (FMDirectoryView   *view);
 static void   fm_list_view_set_zoom_level                  (FMListView        *view,
@@ -266,6 +272,82 @@ button_event_modifies_selection (GdkEven
 	return (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0;
 }
 
+static gboolean
+interactive_search_equal_func (GtkTreeModel *model,
+				 gint          column,
+				 const gchar  *key,
+				 GtkTreeIter  *iter,
+				 gpointer      search_data)
+{
+	gboolean retval;
+	const gchar *str;
+	gchar *normalized_string;
+	gchar *normalized_key;
+	gchar *case_normalized_string;
+	gchar *case_normalized_key;
+	GValue value = {0,};
+	GValue transformed = {0,};
+
+	gtk_tree_model_get_value (model, iter, column, &value);
+
+	g_value_init (&transformed, G_TYPE_STRING);
+	
+	if (!g_value_transform (&value, &transformed)) {
+		g_value_unset (&value);
+		return TRUE;
+	}
+
+	g_value_unset (&value);
+	
+	str = g_value_get_string (&transformed);
+	if (str == NULL) {
+		g_value_unset (&transformed);
+		return TRUE;
+	}
+
+	normalized_string = g_utf8_normalize (str, -1, G_NORMALIZE_ALL);
+	normalized_key = g_utf8_normalize (key, -1, G_NORMALIZE_ALL);
+	
+	case_normalized_string = NULL;
+	case_normalized_key = NULL;
+	retval = TRUE;
+	if (normalized_string && normalized_key) {
+		case_normalized_string = g_utf8_casefold (normalized_string, -1);
+		case_normalized_key = g_utf8_casefold (normalized_key, -1);
+		
+		if (strstr (case_normalized_string, case_normalized_key) != NULL) {
+			retval = FALSE;
+		}
+	}
+	
+	g_value_unset (&transformed);
+	g_free (normalized_key);
+	g_free (normalized_string);
+	g_free (case_normalized_key);
+	g_free (case_normalized_string);
+	
+	return retval;
+}
+
+static void
+fm_list_view_start_interactive_search (NautilusView *view)
+{
+	GtkTreeView *tv;
+	gboolean ret;
+	FMListView *listview;
+
+	listview = FM_LIST_VIEW (view);
+	tv = listview->details->tree_view;
+	
+	if (!GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (tv))) {
+		gtk_widget_grab_focus (GTK_WIDGET (tv));
+	}
+
+	ret = EEL_CALL_METHOD_WITH_RETURN_VALUE
+		(GTK_TREE_VIEW_CLASS, tv,
+		 start_interactive_search, (tv));
+}
+
 static void
 fm_list_view_did_not_drag (FMListView *view,
 			   GdkEventButton *event)
@@ -2847,6 +2929,7 @@ fm_list_view_iface_init (NautilusViewIfa
 	iface->scroll_to_file = list_view_scroll_to_file;
 	iface->get_title = NULL;
 	iface->grab_focus = fm_list_view_grab_focus;
+	iface->start_interactive_search = fm_list_view_start_interactive_search;
 }
 
 
@@ -2857,6 +2940,10 @@ fm_list_view_init (FMListView *list_view
 
 	create_and_set_up_tree_view (list_view);
 
+	gtk_tree_view_set_search_equal_func (list_view->details->tree_view,
+					     interactive_search_equal_func,
+					     NULL, NULL);
+
 	eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_SORT_ORDER,
 						  default_sort_order_changed_callback,
 						  list_view, G_OBJECT (list_view));
Index: src/nautilus-spatial-window-ui.xml
===================================================================
--- src/nautilus-spatial-window-ui.xml	(revisión: 14727)
+++ src/nautilus-spatial-window-ui.xml	(copia de trabajo)
@@ -10,6 +10,11 @@
 			<menuitem name="Close All Folders" action="Close All Folders"/>
 		</placeholder>
 	</menu>
+	<menu action="Edit">
+		<placeholder name="Select Items">
+			<menuitem name="Find" action="Interactive Search"/>
+		</placeholder>
+	</menu>
         <placeholder name="Other Menus">
 	        <menu action="Places">
 		      <menuitem name="Home" action="Home"/>
Index: libnautilus-private/nautilus-icon-container.c
===================================================================
--- libnautilus-private/nautilus-icon-container.c	(revisión: 14727)
+++ libnautilus-private/nautilus-icon-container.c	(copia de trabajo)
@@ -4895,8 +4895,11 @@ nautilus_icon_container_search_iter (Nau
 {
 	GList *p;
 	NautilusIcon *icon;
+	NautilusIcon *icon_strstr;
+	gboolean strstr_matched;
 	const char *name;
 	int count;
+	int count2;
 	char *normalized_key, *case_normalized_key;
 	char *normalized_name, *case_normalized_name;
 	
@@ -4914,7 +4917,10 @@ nautilus_icon_container_search_iter (Nau
 	}
 	
 	icon = NULL;
+	icon_strstr = NULL;
+	strstr_matched = FALSE;
 	count = 0;
+	count2 = 0;
 	for (p = container->details->icons; p != NULL && count != n; p = p->next) {
 		icon = p->data;
 		name = nautilus_icon_canvas_item_get_editable_text (icon->item);
@@ -4942,6 +4948,16 @@ nautilus_icon_container_search_iter (Nau
 			count++;
 		}
 
+		if (! strstr_matched) {
+			if (strstr (case_normalized_name, case_normalized_key)) {
+				count2++;
+				if (count2 == n) {
+					icon_strstr = p->data;
+					strstr_matched = TRUE;
+				}
+			}
+		}
+
 		g_free (case_normalized_name);
 	}
 
@@ -4955,6 +4971,14 @@ nautilus_icon_container_search_iter (Nau
 		
 		return TRUE;
 	}
+	else if (strstr_matched) {
+		if (select_one_unselect_others (container, icon_strstr)) {
+			g_signal_emit (container, signals[SELECTION_CHANGED], 0);
+		}
+		schedule_keyboard_icon_reveal (container, icon_strstr);
+		
+		return TRUE;
+	}
 	
 	return FALSE;
 }
Index: libnautilus-private/nautilus-view.c
===================================================================
--- libnautilus-private/nautilus-view.c	(revisión: 14727)
+++ libnautilus-private/nautilus-view.c	(copia de trabajo)
@@ -295,4 +295,14 @@ nautilus_view_drop_proxy_received_netsca
 	}
 }
 
+void
+nautilus_view_start_interactive_search (NautilusView   *view)
+{
+	g_return_if_fail (NAUTILUS_IS_VIEW (view));
+
+	if (NAUTILUS_VIEW_GET_IFACE (view)->start_interactive_search != NULL) {
+		(* NAUTILUS_VIEW_GET_IFACE (view)->start_interactive_search) (view);
+	}
+}
+
 
Index: libnautilus-private/nautilus-view.h
===================================================================
--- libnautilus-private/nautilus-view.h	(revisión: 14727)
+++ libnautilus-private/nautilus-view.h	(copia de trabajo)
@@ -130,6 +130,9 @@ struct _NautilusViewIface 
 							     const char           *target_location,
 							     GdkDragAction         action);
 
+	/* Request popup the interactive search dialog (aka typeahead) */
+	void           (* start_interactive_search) (NautilusView        *view);
+
 	/* Padding for future expansion */
 	void (*_reserved1) (void);
 	void (*_reserved2) (void);
@@ -137,7 +140,6 @@ struct _NautilusViewIface 
 	void (*_reserved4) (void);
 	void (*_reserved5) (void);
 	void (*_reserved6) (void);
-	void (*_reserved7) (void);
 };
 
 GType             nautilus_view_get_type             (void);
@@ -177,6 +179,8 @@ void              nautilus_view_drop_pro
 								  const char           *source_url,
 								  const char           *target_location,
 								  GdkDragAction         action);
+void              nautilus_view_start_interactive_search   (NautilusView      *view);
+  
 
 G_END_DECLS
 
