summaryrefslogtreecommitdiff
path: root/src/nautilus-navigation-window.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@src.gnome.org>2005-12-12 16:59:19 +0000
committerAlexander Larsson <alexl@src.gnome.org>2005-12-12 16:59:19 +0000
commit671e4bdaa4d07b039015bedfcb5d42026e5d099e (patch)
tree7e983d1089740a57bc6e8848219aa3032c4e9056 /src/nautilus-navigation-window.c
parentf03608b0904ed20850e7ba49d397a7d41330a298 (diff)
downloadnautilus-671e4bdaa4d07b039015bedfcb5d42026e5d099e.tar.gz
--- Merged the nautilus-search2 branch ---
Diffstat (limited to 'src/nautilus-navigation-window.c')
-rw-r--r--src/nautilus-navigation-window.c257
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;
}