diff options
Diffstat (limited to 'src/caja-navigation-window-slot.c')
-rw-r--r-- | src/caja-navigation-window-slot.c | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/src/caja-navigation-window-slot.c b/src/caja-navigation-window-slot.c new file mode 100644 index 00000000..4bf28447 --- /dev/null +++ b/src/caja-navigation-window-slot.c @@ -0,0 +1,241 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- + + caja-navigation-window-slot.c: Caja navigation window slot + + Copyright (C) 2008 Free Software Foundation, Inc. + + 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; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: Christian Neumair <[email protected]> +*/ + +#include "caja-window-slot.h" +#include "caja-navigation-window-slot.h" +#include "caja-window-private.h" +#include "caja-search-bar.h" +#include "caja-navigation-window-pane.h" +#include <libcaja-private/caja-window-slot-info.h> +#include <libcaja-private/caja-file.h> +#include <eel/eel-gtk-macros.h> + +static void caja_navigation_window_slot_init (CajaNavigationWindowSlot *slot); +static void caja_navigation_window_slot_class_init (CajaNavigationWindowSlotClass *class); + +G_DEFINE_TYPE (CajaNavigationWindowSlot, caja_navigation_window_slot, CAJA_TYPE_WINDOW_SLOT) +#define parent_class caja_navigation_window_slot_parent_class + +gboolean +caja_navigation_window_slot_should_close_with_mount (CajaNavigationWindowSlot *slot, + GMount *mount) +{ + CajaBookmark *bookmark; + GFile *mount_location, *bookmark_location; + GList *l; + gboolean close_with_mount; + + if (slot->parent.pane->window->details->initiated_unmount) + { + return FALSE; + } + + mount_location = g_mount_get_root (mount); + + close_with_mount = TRUE; + + for (l = slot->back_list; l != NULL; l = l->next) + { + bookmark = CAJA_BOOKMARK (l->data); + + bookmark_location = caja_bookmark_get_location (bookmark); + close_with_mount &= g_file_has_prefix (bookmark_location, mount_location) || + g_file_equal (bookmark_location, mount_location); + g_object_unref (bookmark_location); + + if (!close_with_mount) + { + break; + } + } + + close_with_mount &= g_file_has_prefix (CAJA_WINDOW_SLOT (slot)->location, mount_location) || + g_file_equal (CAJA_WINDOW_SLOT (slot)->location, mount_location); + + /* we could also consider the forward list here, but since the “go home” request + * in caja-window-manager-views.c:mount_removed_callback() would discard those + * anyway, we don't consider them. + */ + + g_object_unref (mount_location); + + return close_with_mount; +} + +void +caja_navigation_window_slot_clear_forward_list (CajaNavigationWindowSlot *slot) +{ + g_assert (CAJA_IS_NAVIGATION_WINDOW_SLOT (slot)); + + eel_g_object_list_free (slot->forward_list); + slot->forward_list = NULL; +} + +void +caja_navigation_window_slot_clear_back_list (CajaNavigationWindowSlot *slot) +{ + g_assert (CAJA_IS_NAVIGATION_WINDOW_SLOT (slot)); + + eel_g_object_list_free (slot->back_list); + slot->back_list = NULL; +} + +static void +query_editor_changed_callback (CajaSearchBar *bar, + CajaQuery *query, + gboolean reload, + CajaWindowSlot *slot) +{ + CajaDirectory *directory; + + g_assert (CAJA_IS_FILE (slot->viewed_file)); + + directory = caja_directory_get_for_file (slot->viewed_file); + g_assert (CAJA_IS_SEARCH_DIRECTORY (directory)); + + caja_search_directory_set_query (CAJA_SEARCH_DIRECTORY (directory), + query); + if (reload) + { + caja_window_slot_reload (slot); + } + + caja_directory_unref (directory); +} + + +static void +caja_navigation_window_slot_update_query_editor (CajaWindowSlot *slot) +{ + CajaDirectory *directory; + CajaSearchDirectory *search_directory; + CajaQuery *query; + CajaNavigationWindow *navigation_window; + GtkWidget *query_editor; + + g_assert (slot->pane->window != NULL); + navigation_window = CAJA_NAVIGATION_WINDOW (slot->pane->window); + + query_editor = NULL; + + directory = caja_directory_get (slot->location); + if (CAJA_IS_SEARCH_DIRECTORY (directory)) + { + search_directory = CAJA_SEARCH_DIRECTORY (directory); + + if (caja_search_directory_is_saved_search (search_directory)) + { + query_editor = caja_query_editor_new (TRUE, + caja_search_directory_is_indexed (search_directory)); + } + else + { + query_editor = caja_query_editor_new_with_bar (FALSE, + caja_search_directory_is_indexed (search_directory), + slot->pane->window->details->active_pane->active_slot == slot, + CAJA_SEARCH_BAR (CAJA_NAVIGATION_WINDOW_PANE (slot->pane)->search_bar), + slot); + } + } + + slot->query_editor = CAJA_QUERY_EDITOR (query_editor); + + if (query_editor != NULL) + { + g_signal_connect_object (query_editor, "changed", + G_CALLBACK (query_editor_changed_callback), slot, 0); + + query = caja_search_directory_get_query (search_directory); + if (query != NULL) + { + caja_query_editor_set_query (CAJA_QUERY_EDITOR (query_editor), + query); + g_object_unref (query); + } + else + { + caja_query_editor_set_default_query (CAJA_QUERY_EDITOR (query_editor)); + } + + caja_window_slot_add_extra_location_widget (slot, query_editor); + gtk_widget_show (query_editor); + caja_query_editor_grab_focus (CAJA_QUERY_EDITOR (query_editor)); + } + + caja_directory_unref (directory); +} + +static void +caja_navigation_window_slot_active (CajaWindowSlot *slot) +{ + CajaNavigationWindow *window; + CajaNavigationWindowSlot *navigation_slot; + CajaNavigationWindowPane *pane; + int page_num; + + navigation_slot = CAJA_NAVIGATION_WINDOW_SLOT (slot); + pane = CAJA_NAVIGATION_WINDOW_PANE (slot->pane); + window = CAJA_NAVIGATION_WINDOW (slot->pane->window); + + page_num = gtk_notebook_page_num (GTK_NOTEBOOK (pane->notebook), + slot->content_box); + g_assert (page_num >= 0); + + gtk_notebook_set_current_page (GTK_NOTEBOOK (pane->notebook), page_num); + + EEL_CALL_PARENT (CAJA_WINDOW_SLOT_CLASS, active, (slot)); + + if (slot->viewed_file != NULL) + { + caja_navigation_window_load_extension_toolbar_items (window); + } +} + +static void +caja_navigation_window_slot_dispose (GObject *object) +{ + CajaNavigationWindowSlot *slot; + + slot = CAJA_NAVIGATION_WINDOW_SLOT (object); + + caja_navigation_window_slot_clear_forward_list (slot); + caja_navigation_window_slot_clear_back_list (slot); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +caja_navigation_window_slot_init (CajaNavigationWindowSlot *slot) +{ +} + +static void +caja_navigation_window_slot_class_init (CajaNavigationWindowSlotClass *class) +{ + CAJA_WINDOW_SLOT_CLASS (class)->active = caja_navigation_window_slot_active; + CAJA_WINDOW_SLOT_CLASS (class)->update_query_editor = caja_navigation_window_slot_update_query_editor; + + G_OBJECT_CLASS (class)->dispose = caja_navigation_window_slot_dispose; +} + |