diff options
author | Alexander Larsson <alexl@src.gnome.org> | 2005-12-12 16:59:19 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2005-12-12 16:59:19 +0000 |
commit | 671e4bdaa4d07b039015bedfcb5d42026e5d099e (patch) | |
tree | 7e983d1089740a57bc6e8848219aa3032c4e9056 /src/nautilus-navigation-window.c | |
parent | f03608b0904ed20850e7ba49d397a7d41330a298 (diff) | |
download | nautilus-671e4bdaa4d07b039015bedfcb5d42026e5d099e.tar.gz |
--- Merged the nautilus-search2 branch ---
Diffstat (limited to 'src/nautilus-navigation-window.c')
-rw-r--r-- | src/nautilus-navigation-window.c | 257 |
1 files changed, 230 insertions, 27 deletions
diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index b18886968..d5dc20881 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -38,6 +38,8 @@ #include "nautilus-signaller.h" #include "nautilus-location-bar.h" #include "nautilus-pathbar.h" +#include "nautilus-query-editor.h" +#include "nautilus-search-bar.h" #include "nautilus-window-manage-views.h" #include "nautilus-zoom-control.h" #include <eel/eel-accessibility.h> @@ -48,6 +50,7 @@ #include <eel/eel-gtk-macros.h> #include <eel/eel-stock-dialogs.h> #include <eel/eel-string.h> +#include <eel/eel-vfs-extensions.h> #include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk/gdkx.h> #include <gtk/gtkmain.h> @@ -81,6 +84,7 @@ #include <libnautilus-private/nautilus-undo.h> #include <libnautilus-private/nautilus-module.h> #include <libnautilus-private/nautilus-sidebar-provider.h> +#include <libnautilus-private/nautilus-search-directory.h> #include <math.h> #include <sys/time.h> @@ -99,6 +103,12 @@ #define MENU_PATH_BOOKMARKS_PLACEHOLDER "/MenuBar/Other Menus/Bookmarks/Bookmarks Placeholder" +typedef enum { + NAUTILUS_BAR_PATH, + NAUTILUS_BAR_NAVIGATION, + NAUTILUS_BAR_SEARCH +} NautilusBarMode; + enum { ARG_0, ARG_APP_ID, @@ -121,6 +131,14 @@ static void path_bar_location_changed_callback (GtkWidget * NautilusNavigationWindow *window); static void always_use_location_entry_changed (gpointer callback_data); +static void nautilus_navigation_window_set_bar_mode (NautilusNavigationWindow *window, + NautilusBarMode mode); +static void search_bar_activate_callback (NautilusSearchBar *bar, + NautilusWindow *window); +static void search_bar_cancel_callback (GtkWidget *widget, + NautilusNavigationWindow *window); + +static void nautilus_navigation_window_show_location_bar_temporarily (NautilusNavigationWindow *window); GNOME_CLASS_BOILERPLATE (NautilusNavigationWindow, nautilus_navigation_window, NautilusWindow, NAUTILUS_TYPE_WINDOW) @@ -133,7 +151,7 @@ nautilus_navigation_window_instance_init (NautilusNavigationWindow *window) GtkWidget *location_bar; GtkWidget *view_as_menu_vbox; GtkToolItem *item; - GtkWidget *hbox; + GtkWidget *hbox, *vbox, *eventbox, *extras_vbox; window->details = g_new0 (NautilusNavigationWindowDetails, 1); @@ -150,6 +168,25 @@ nautilus_navigation_window_instance_init (NautilusNavigationWindow *window) 0, 0); gtk_widget_show (window->details->content_paned); + vbox = gtk_vbox_new (FALSE, 0); + nautilus_horizontal_splitter_pack2 ( + NAUTILUS_HORIZONTAL_SPLITTER (window->details->content_paned), + vbox); + gtk_widget_show (vbox); + + eventbox = gtk_event_box_new (); + gtk_widget_set_name (eventbox, "nautilus-extra-view-widget"); + gtk_box_pack_start (GTK_BOX (vbox), eventbox, FALSE, FALSE, 0); + gtk_widget_show (eventbox); + + extras_vbox = gtk_vbox_new (FALSE, 0); + NAUTILUS_WINDOW (window)->details->extra_location_widgets = extras_vbox; + gtk_container_add (GTK_CONTAINER (eventbox), extras_vbox); + + window->details->content_box = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), window->details->content_box, TRUE, TRUE, 0); + gtk_widget_show (window->details->content_box); + nautilus_navigation_window_initialize_actions (window); nautilus_navigation_window_initialize_menus (window); @@ -207,6 +244,15 @@ nautilus_navigation_window_instance_init (NautilusNavigationWindow *window) window->navigation_bar, TRUE, TRUE, 0); + window->search_bar = nautilus_search_bar_new (); + g_signal_connect_object (window->search_bar, "activate", + G_CALLBACK (search_bar_activate_callback), window, 0); + g_signal_connect_object (window->search_bar, "cancel", + G_CALLBACK (search_bar_cancel_callback), window, 0); + gtk_box_pack_start (GTK_BOX (hbox), + window->search_bar, + TRUE, TRUE, 0); + /* Option menu for content view types; it's empty here, filled in when a uri is set. * Pack it into vbox so it doesn't grow vertically when location bar does. */ @@ -270,9 +316,9 @@ always_use_location_entry_changed (gpointer callback_data) window = NAUTILUS_NAVIGATION_WINDOW (callback_data); if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY)) { - nautilus_navigation_window_hide_path_bar (window); + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_NAVIGATION); } else { - nautilus_navigation_window_show_path_bar (window); + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_PATH); } } @@ -331,11 +377,23 @@ hide_temporary_bars (NautilusNavigationWindow *window) window->details->temporary_location_bar = FALSE; } if (window->details->temporary_navigation_bar) { - if (!eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY)) { - nautilus_navigation_window_show_path_bar (window); + if (NAUTILUS_WINDOW (window)->details->search_mode) { + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_SEARCH); + } else { + if (!eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY)) { + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_PATH); + } } window->details->temporary_navigation_bar = FALSE; } + if (window->details->temporary_search_bar) { + if (!eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY)) { + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_PATH); + } else { + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_NAVIGATION); + } + window->details->temporary_search_bar = FALSE; + } } static void @@ -843,9 +901,8 @@ real_set_content_view_widget (NautilusWindow *nautilus_window, connect_view (window, new_view); - nautilus_horizontal_splitter_pack2 ( - NAUTILUS_HORIZONTAL_SPLITTER (window->details->content_paned), - GTK_WIDGET (new_view)); + gtk_container_add (GTK_CONTAINER (window->details->content_box), + GTK_WIDGET (new_view)); if (new_view != NULL && nautilus_view_supports_zooming (new_view)) { gtk_widget_show (window->zoom_control); @@ -871,15 +928,20 @@ real_set_throbber_active (NautilusWindow *window, gboolean active) } static void -nautilus_navigation_window_show_location_bar_temporarily (NautilusNavigationWindow *window, - gboolean in_search_mode) +nautilus_navigation_window_show_location_bar_temporarily (NautilusNavigationWindow *window) { if (!nautilus_navigation_window_location_bar_showing (window)) { nautilus_navigation_window_show_location_bar (window, FALSE); window->details->temporary_location_bar = TRUE; } - if (nautilus_navigation_window_path_bar_showing (window)) { - nautilus_navigation_window_hide_path_bar (window); +} + +static void +nautilus_navigation_window_show_navigation_bar_temporarily (NautilusNavigationWindow *window) +{ + if (nautilus_navigation_window_path_bar_showing (window) + || nautilus_navigation_window_search_bar_showing (window)) { + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_NAVIGATION); window->details->temporary_navigation_bar = TRUE; } nautilus_navigation_bar_activate @@ -889,13 +951,132 @@ nautilus_navigation_window_show_location_bar_temporarily (NautilusNavigationWind static void real_prompt_for_location (NautilusWindow *window, const char *initial) { - nautilus_navigation_window_show_location_bar_temporarily (NAUTILUS_NAVIGATION_WINDOW (window), FALSE); - + nautilus_navigation_window_show_location_bar_temporarily (NAUTILUS_NAVIGATION_WINDOW (window)); + nautilus_navigation_window_show_navigation_bar_temporarily (NAUTILUS_NAVIGATION_WINDOW (window)); + if (initial) { nautilus_navigation_bar_set_location (NAUTILUS_NAVIGATION_BAR (NAUTILUS_NAVIGATION_WINDOW (window)->navigation_bar), initial); } - +} + +static void +search_bar_activate_callback (NautilusSearchBar *bar, + NautilusWindow *window) +{ + char *uri, *home_uri; + NautilusDirectory *directory; + NautilusSearchDirectory *search_directory; + NautilusQuery *query; + + uri = nautilus_search_directory_generate_new_uri (); + directory = nautilus_directory_get (uri); + + g_assert (NAUTILUS_IS_SEARCH_DIRECTORY (directory)); + + search_directory = NAUTILUS_SEARCH_DIRECTORY (directory); + + query = nautilus_search_bar_get_query (NAUTILUS_SEARCH_BAR (NAUTILUS_NAVIGATION_WINDOW (window)->search_bar)); + if (query != NULL) { + if (!nautilus_search_directory_is_indexed (search_directory)) { + home_uri = nautilus_get_home_directory_uri (); + nautilus_query_set_location (query, home_uri); + g_free (home_uri); + } + nautilus_search_directory_set_query (search_directory, query); + g_object_unref (query); + } + + nautilus_window_go_to (window, uri); + + nautilus_directory_unref (directory); + g_free (uri); +} + +static void +search_bar_cancel_callback (GtkWidget *widget, + NautilusNavigationWindow *window) +{ + hide_temporary_bars (window); +} + +void +nautilus_navigation_window_show_search (NautilusNavigationWindow *window) +{ + if (!nautilus_navigation_window_search_bar_showing (window)) { + nautilus_navigation_window_show_location_bar_temporarily (window); + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_SEARCH); + window->details->temporary_search_bar = TRUE; + nautilus_search_bar_clear (NAUTILUS_SEARCH_BAR (window->search_bar)); + } + + nautilus_search_bar_grab_focus (NAUTILUS_SEARCH_BAR (window->search_bar)); +} + +static void +query_editor_changed_callback (NautilusSearchBar *bar, + NautilusQuery *query, + gboolean reload, + NautilusWindow *window) +{ + NautilusDirectory *directory; + + directory = nautilus_directory_get_for_file (window->details->viewed_file); + g_assert (NAUTILUS_IS_SEARCH_DIRECTORY (directory)); + + nautilus_search_directory_set_query (NAUTILUS_SEARCH_DIRECTORY (directory), + query); + if (reload) { + nautilus_window_reload (window); + } + + nautilus_directory_unref (directory); +} + +static void +real_set_search_mode (NautilusWindow *window, gboolean search_mode, + NautilusSearchDirectory *search_directory) +{ + NautilusNavigationWindow *nav_window; + GtkWidget *query_editor; + NautilusQuery *query; + + nav_window = NAUTILUS_NAVIGATION_WINDOW (window); + + if (!search_mode) { + nav_window->details->temporary_search_bar = TRUE; + hide_temporary_bars (nav_window); + return; + } + + if (nautilus_search_directory_is_saved_search (search_directory)) { + query_editor = nautilus_query_editor_new (TRUE, + nautilus_search_directory_is_indexed (search_directory)); + } else { + nautilus_navigation_window_show_location_bar_temporarily (nav_window); + nautilus_navigation_window_set_bar_mode (nav_window, NAUTILUS_BAR_SEARCH); + nav_window->details->temporary_search_bar = FALSE; + + query_editor = nautilus_query_editor_new_with_bar (FALSE, + nautilus_search_directory_is_indexed (search_directory), + NAUTILUS_SEARCH_BAR (nav_window->search_bar)); + } + + g_signal_connect_object (query_editor, "changed", + G_CALLBACK (query_editor_changed_callback), window, 0); + + query = nautilus_search_directory_get_query (search_directory); + if (query != NULL) { + nautilus_query_editor_set_query (NAUTILUS_QUERY_EDITOR (query_editor), + query); + g_object_unref (query); + }else { + nautilus_query_editor_set_default_query (NAUTILUS_QUERY_EDITOR (query_editor)); + } + + nautilus_window_add_extra_location_widget (window, query_editor); + gtk_widget_show (query_editor); + nautilus_query_editor_grab_focus (NAUTILUS_QUERY_EDITOR (query_editor)); } void @@ -1004,19 +1185,40 @@ nautilus_navigation_window_location_bar_showing (NautilusNavigationWindow *windo return TRUE; } -void -nautilus_navigation_window_hide_path_bar (NautilusNavigationWindow *window) +gboolean +nautilus_navigation_window_search_bar_showing (NautilusNavigationWindow *window) { - window->details->temporary_navigation_bar = FALSE; - gtk_widget_hide (window->path_bar); - gtk_widget_show (window->navigation_bar); + if (window->search_bar != NULL) { + return GTK_WIDGET_VISIBLE (window->search_bar); + } + /* If we're not visible yet we haven't changed visibility, so its TRUE */ + return TRUE; } -void -nautilus_navigation_window_show_path_bar (NautilusNavigationWindow *window) +static void +nautilus_navigation_window_set_bar_mode (NautilusNavigationWindow *window, + NautilusBarMode mode) { - gtk_widget_show (window->path_bar); - gtk_widget_hide (window->navigation_bar); + switch (mode) { + + case NAUTILUS_BAR_PATH: + gtk_widget_show (window->path_bar); + gtk_widget_hide (window->navigation_bar); + gtk_widget_hide (window->search_bar); + break; + + case NAUTILUS_BAR_NAVIGATION: + gtk_widget_show (window->navigation_bar); + gtk_widget_hide (window->path_bar); + gtk_widget_hide (window->search_bar); + break; + + case NAUTILUS_BAR_SEARCH: + gtk_widget_show (window->search_bar); + gtk_widget_hide (window->path_bar); + gtk_widget_hide (window->navigation_bar); + break; + } } gboolean @@ -1196,9 +1398,9 @@ nautilus_navigation_window_show (GtkWidget *widget) } if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY)) { - nautilus_navigation_window_hide_path_bar (window); + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_NAVIGATION); } else { - nautilus_navigation_window_show_path_bar (window); + nautilus_navigation_window_set_bar_mode (window, NAUTILUS_BAR_PATH); } if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_START_WITH_SIDEBAR)) { @@ -1271,8 +1473,9 @@ nautilus_navigation_window_class_init (NautilusNavigationWindowClass *class) NAUTILUS_WINDOW_CLASS (class)->set_content_view_widget = real_set_content_view_widget; NAUTILUS_WINDOW_CLASS (class)->set_throbber_active = real_set_throbber_active; NAUTILUS_WINDOW_CLASS (class)->prompt_for_location = real_prompt_for_location; + NAUTILUS_WINDOW_CLASS (class)->set_search_mode = real_set_search_mode; NAUTILUS_WINDOW_CLASS (class)->set_title = real_set_title; NAUTILUS_WINDOW_CLASS (class)->get_icon_name = real_get_icon_name; - NAUTILUS_WINDOW_CLASS(class)->get_default_size = real_get_default_size; + NAUTILUS_WINDOW_CLASS (class)->get_default_size = real_get_default_size; NAUTILUS_WINDOW_CLASS (class)->close = real_window_close; } |