diff options
author | Perberos <[email protected]> | 2011-12-01 22:24:23 -0300 |
---|---|---|
committer | Perberos <[email protected]> | 2011-12-01 22:24:23 -0300 |
commit | 0e004c696b0e68b2cff37a4c3315b022a35eaf43 (patch) | |
tree | 43261e815529cb9518ed7be37af13b846af8b26b /src/caja-navigation-window-menus.c | |
download | caja-0e004c696b0e68b2cff37a4c3315b022a35eaf43.tar.bz2 caja-0e004c696b0e68b2cff37a4c3315b022a35eaf43.tar.xz |
moving from https://github.com/perberos/mate-desktop-environment
Diffstat (limited to 'src/caja-navigation-window-menus.c')
-rw-r--r-- | src/caja-navigation-window-menus.c | 1099 |
1 files changed, 1099 insertions, 0 deletions
diff --git a/src/caja-navigation-window-menus.c b/src/caja-navigation-window-menus.c new file mode 100644 index 00000000..9e395bef --- /dev/null +++ b/src/caja-navigation-window-menus.c @@ -0,0 +1,1099 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* + * Caja + * + * Copyright (C) 2000, 2001 Eazel, Inc. + * + * Caja 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. + * + * Caja 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: John Sullivan <[email protected]> + */ + +/* caja-window-menus.h - implementation of caja window menu operations, + * split into separate file just for convenience. + */ +#include <config.h> + +#include <locale.h> + +#include "caja-actions.h" +#include "caja-notebook.h" +#include "caja-navigation-action.h" +#include "caja-zoom-action.h" +#include "caja-view-as-action.h" +#include "caja-application.h" +#include "caja-bookmark-list.h" +#include "caja-bookmarks-window.h" +#include "caja-file-management-properties.h" +#include "caja-property-browser.h" +#include "caja-window-manage-views.h" +#include "caja-window-private.h" +#include "caja-window-bookmarks.h" +#include "caja-navigation-window-pane.h" +#include <eel/eel-glib-extensions.h> +#include <eel/eel-mate-extensions.h> +#include <eel/eel-stock-dialogs.h> +#include <eel/eel-string.h> +#include <eel/eel-xml-extensions.h> +#include <libxml/parser.h> +#include <gtk/gtk.h> +#include <glib/gi18n.h> +#include <libcaja-private/caja-file-utilities.h> +#include <libcaja-private/caja-global-preferences.h> +#include <libcaja-private/caja-ui-utilities.h> +#include <libcaja-private/caja-undo-manager.h> +#include <libcaja-private/caja-search-engine.h> +#include <libcaja-private/caja-signaller.h> + +#define MENU_PATH_HISTORY_PLACEHOLDER "/MenuBar/Other Menus/Go/History Placeholder" + +#define RESPONSE_FORGET 1000 +#define MENU_ITEM_MAX_WIDTH_CHARS 32 + +static void schedule_refresh_go_menu (CajaNavigationWindow *window); + +static void +action_close_all_windows_callback (GtkAction *action, + gpointer user_data) +{ + caja_application_close_all_navigation_windows (); +} + +static gboolean +should_open_in_new_tab (void) +{ + /* FIXME this is duplicated */ + GdkEvent *event; + + event = gtk_get_current_event (); + + if (event == NULL) + { + return FALSE; + } + + if (event->type == GDK_BUTTON_PRESS || event->type == GDK_BUTTON_RELEASE) + { + return event->button.button == 2; + } + + gdk_event_free (event); + + return FALSE; +} + +static void +action_back_callback (GtkAction *action, + gpointer user_data) +{ + caja_navigation_window_back_or_forward (CAJA_NAVIGATION_WINDOW (user_data), + TRUE, 0, should_open_in_new_tab ()); +} + +static void +action_forward_callback (GtkAction *action, + gpointer user_data) +{ + caja_navigation_window_back_or_forward (CAJA_NAVIGATION_WINDOW (user_data), + FALSE, 0, should_open_in_new_tab ()); +} + +static void +forget_history_if_yes (GtkDialog *dialog, int response, gpointer callback_data) +{ + if (response == RESPONSE_FORGET) + { + caja_forget_history (); + } + gtk_object_destroy (GTK_OBJECT (dialog)); +} + +static void +forget_history_if_confirmed (CajaWindow *window) +{ + GtkDialog *dialog; + + dialog = eel_create_question_dialog (_("Are you sure you want to clear the list " + "of locations you have visited?"), + NULL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_CLEAR, RESPONSE_FORGET, + GTK_WINDOW (window)); + + gtk_widget_show (GTK_WIDGET (dialog)); + + g_signal_connect (dialog, "response", + G_CALLBACK (forget_history_if_yes), NULL); + + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_CANCEL); +} + +static void +action_clear_history_callback (GtkAction *action, + gpointer user_data) +{ + forget_history_if_confirmed (CAJA_WINDOW (user_data)); +} + +static void +action_split_view_switch_next_pane_callback(GtkAction *action, + gpointer user_data) +{ + caja_window_pane_switch_to (caja_window_get_next_pane (CAJA_WINDOW (user_data))); +} + +static void +action_split_view_same_location_callback (GtkAction *action, + gpointer user_data) +{ + CajaWindow *window; + CajaWindowPane *next_pane; + GFile *location; + + window = CAJA_WINDOW (user_data); + next_pane = caja_window_get_next_pane (window); + + if (!next_pane) + { + return; + } + location = caja_window_slot_get_location (next_pane->active_slot); + if (location) + { + caja_window_slot_go_to (window->details->active_pane->active_slot, location, FALSE); + g_object_unref (location); + } +} + +static void +action_show_hide_toolbar_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindow *window; + + window = CAJA_NAVIGATION_WINDOW (user_data); + + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) + { + caja_navigation_window_show_toolbar (window); + } + else + { + caja_navigation_window_hide_toolbar (window); + } +} + + + +static void +action_show_hide_sidebar_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindow *window; + + window = CAJA_NAVIGATION_WINDOW (user_data); + + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) + { + caja_navigation_window_show_sidebar (window); + } + else + { + caja_navigation_window_hide_sidebar (window); + } +} + +static void +pane_show_hide_location_bar (CajaNavigationWindowPane *pane, gboolean is_active) +{ + if (caja_navigation_window_pane_location_bar_showing (pane) != is_active) + { + if (is_active) + { + caja_navigation_window_pane_show_location_bar (pane, TRUE); + } + else + { + caja_navigation_window_pane_hide_location_bar (pane, TRUE); + } + } +} + +static void +action_show_hide_location_bar_callback (GtkAction *action, + gpointer user_data) +{ + CajaWindow *window; + GList *walk; + gboolean is_active; + + window = CAJA_WINDOW (user_data); + + is_active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + + /* Do the active pane first, because this will trigger an update of the menu items, + * which in turn relies on the active pane. */ + pane_show_hide_location_bar (CAJA_NAVIGATION_WINDOW_PANE (window->details->active_pane), is_active); + + for (walk = window->details->panes; walk; walk = walk->next) + { + pane_show_hide_location_bar (CAJA_NAVIGATION_WINDOW_PANE (walk->data), is_active); + } +} + +static void +action_show_hide_statusbar_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindow *window; + + window = CAJA_NAVIGATION_WINDOW (user_data); + + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) + { + caja_navigation_window_show_status_bar (window); + } + else + { + caja_navigation_window_hide_status_bar (window); + } +} + +static void +action_split_view_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindow *window; + gboolean is_active; + + window = CAJA_NAVIGATION_WINDOW (user_data); + + is_active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + if (is_active != caja_navigation_window_split_view_showing (window)) + { + CajaWindow *caja_window; + + if (is_active) + { + caja_navigation_window_split_view_on (window); + } + else + { + caja_navigation_window_split_view_off (window); + } + caja_window = CAJA_WINDOW (window); + if (caja_window->details->active_pane && caja_window->details->active_pane->active_slot) + { + caja_view_update_menus (caja_window->details->active_pane->active_slot->content_view); + } + } +} + +void +caja_navigation_window_update_show_hide_menu_items (CajaNavigationWindow *window) +{ + GtkAction *action; + + g_assert (CAJA_IS_NAVIGATION_WINDOW (window)); + + action = gtk_action_group_get_action (window->details->navigation_action_group, + CAJA_ACTION_SHOW_HIDE_TOOLBAR); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + caja_navigation_window_toolbar_showing (window)); + + action = gtk_action_group_get_action (window->details->navigation_action_group, + CAJA_ACTION_SHOW_HIDE_SIDEBAR); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + caja_navigation_window_sidebar_showing (window)); + + action = gtk_action_group_get_action (window->details->navigation_action_group, + CAJA_ACTION_SHOW_HIDE_LOCATION_BAR); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + caja_navigation_window_pane_location_bar_showing (CAJA_NAVIGATION_WINDOW_PANE (CAJA_WINDOW (window)->details->active_pane))); + + action = gtk_action_group_get_action (window->details->navigation_action_group, + CAJA_ACTION_SHOW_HIDE_STATUSBAR); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + caja_navigation_window_status_bar_showing (window)); + + action = gtk_action_group_get_action (window->details->navigation_action_group, + CAJA_ACTION_SHOW_HIDE_EXTRA_PANE); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + caja_navigation_window_split_view_showing (window)); +} + +void +caja_navigation_window_update_spatial_menu_item (CajaNavigationWindow *window) +{ + GtkAction *action; + + g_assert (CAJA_IS_NAVIGATION_WINDOW (window)); + + action = gtk_action_group_get_action (window->details->navigation_action_group, + CAJA_ACTION_FOLDER_WINDOW); + gtk_action_set_visible (action, + !eel_preferences_get_boolean (CAJA_PREFERENCES_ALWAYS_USE_BROWSER)); +} + +static void +action_add_bookmark_callback (GtkAction *action, + gpointer user_data) +{ + caja_window_add_bookmark_for_current_location (CAJA_WINDOW (user_data)); +} + +static void +action_edit_bookmarks_callback (GtkAction *action, + gpointer user_data) +{ + caja_window_edit_bookmarks (CAJA_WINDOW (user_data)); +} + +void +caja_navigation_window_remove_go_menu_callback (CajaNavigationWindow *window) +{ + if (window->details->refresh_go_menu_idle_id != 0) + { + g_source_remove (window->details->refresh_go_menu_idle_id); + window->details->refresh_go_menu_idle_id = 0; + } +} + +void +caja_navigation_window_remove_go_menu_items (CajaNavigationWindow *window) +{ + GtkUIManager *ui_manager; + + ui_manager = caja_window_get_ui_manager (CAJA_WINDOW (window)); + if (window->details->go_menu_merge_id != 0) + { + gtk_ui_manager_remove_ui (ui_manager, + window->details->go_menu_merge_id); + window->details->go_menu_merge_id = 0; + } + if (window->details->go_menu_action_group != NULL) + { + gtk_ui_manager_remove_action_group (ui_manager, + window->details->go_menu_action_group); + window->details->go_menu_action_group = NULL; + } +} + +static void +show_bogus_history_window (CajaWindow *window, + CajaBookmark *bookmark) +{ + GFile *file; + char *uri_for_display; + char *detail; + + file = caja_bookmark_get_location (bookmark); + uri_for_display = g_file_get_parse_name (file); + + detail = g_strdup_printf (_("The location \"%s\" does not exist."), uri_for_display); + + eel_show_warning_dialog (_("The history location doesn't exist."), + detail, + GTK_WINDOW (window)); + + g_object_unref (file); + g_free (uri_for_display); + g_free (detail); +} + +static void +connect_proxy_cb (GtkActionGroup *action_group, + GtkAction *action, + GtkWidget *proxy, + gpointer dummy) +{ + GtkLabel *label; + + if (!GTK_IS_MENU_ITEM (proxy)) + return; + + label = GTK_LABEL (gtk_bin_get_child (GTK_BIN (proxy))); + + gtk_label_set_use_underline (label, FALSE); + gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END); + gtk_label_set_max_width_chars (label, MENU_ITEM_MAX_WIDTH_CHARS); +} + +static const char* icon_entries[] = +{ + "/MenuBar/Other Menus/Go/Home", + "/MenuBar/Other Menus/Go/Computer", + "/MenuBar/Other Menus/Go/Go to Templates", + "/MenuBar/Other Menus/Go/Go to Trash", + "/MenuBar/Other Menus/Go/Go to Network", + "/MenuBar/Other Menus/Go/Go to Location" +}; + +/** + * refresh_go_menu: + * + * Refresh list of bookmarks at end of Go menu to match centralized history list. + * @window: The CajaWindow whose Go menu will be refreshed. + **/ +static void +refresh_go_menu (CajaNavigationWindow *window) +{ + GtkUIManager *ui_manager; + GList *node; + GtkWidget *menuitem; + int index; + int i; + + g_assert (CAJA_IS_NAVIGATION_WINDOW (window)); + + /* Unregister any pending call to this function. */ + caja_navigation_window_remove_go_menu_callback (window); + + /* Remove old set of history items. */ + caja_navigation_window_remove_go_menu_items (window); + + ui_manager = caja_window_get_ui_manager (CAJA_WINDOW (window)); + + window->details->go_menu_merge_id = gtk_ui_manager_new_merge_id (ui_manager); + window->details->go_menu_action_group = gtk_action_group_new ("GoMenuGroup"); + g_signal_connect (window->details->go_menu_action_group, "connect-proxy", + G_CALLBACK (connect_proxy_cb), NULL); + + gtk_ui_manager_insert_action_group (ui_manager, + window->details->go_menu_action_group, + -1); + g_object_unref (window->details->go_menu_action_group); + + for (i = 0; i < G_N_ELEMENTS (icon_entries); i++) + { + menuitem = gtk_ui_manager_get_widget ( + ui_manager, + icon_entries[i]); + + gtk_image_menu_item_set_always_show_image ( + GTK_IMAGE_MENU_ITEM (menuitem), TRUE); + } + + /* Add in a new set of history items. */ + for (node = caja_get_history_list (), index = 0; + node != NULL && index < 10; + node = node->next, index++) + { + caja_menus_append_bookmark_to_menu + (CAJA_WINDOW (window), + CAJA_BOOKMARK (node->data), + MENU_PATH_HISTORY_PLACEHOLDER, + "history", + index, + window->details->go_menu_action_group, + window->details->go_menu_merge_id, + G_CALLBACK (schedule_refresh_go_menu), + show_bogus_history_window); + } +} + +static gboolean +refresh_go_menu_idle_callback (gpointer data) +{ + g_assert (CAJA_IS_NAVIGATION_WINDOW (data)); + + refresh_go_menu (CAJA_NAVIGATION_WINDOW (data)); + + /* Don't call this again (unless rescheduled) */ + return FALSE; +} + +static void +schedule_refresh_go_menu (CajaNavigationWindow *window) +{ + g_assert (CAJA_IS_NAVIGATION_WINDOW (window)); + + if (window->details->refresh_go_menu_idle_id == 0) + { + window->details->refresh_go_menu_idle_id + = g_idle_add (refresh_go_menu_idle_callback, + window); + } +} + +/** + * caja_navigation_window_initialize_go_menu + * + * Wire up signals so we'll be notified when history list changes. + */ +static void +caja_navigation_window_initialize_go_menu (CajaNavigationWindow *window) +{ + /* Recreate bookmarks part of menu if history list changes + */ + g_signal_connect_object (caja_signaller_get_current (), "history_list_changed", + G_CALLBACK (schedule_refresh_go_menu), window, G_CONNECT_SWAPPED); +} + +void +caja_navigation_window_update_split_view_actions_sensitivity (CajaNavigationWindow *window) +{ + CajaWindow *win; + GtkActionGroup *action_group; + GtkAction *action; + gboolean have_multiple_panes; + gboolean next_pane_is_in_same_location; + GFile *active_pane_location; + GFile *next_pane_location; + CajaWindowPane *next_pane; + + g_assert (CAJA_IS_NAVIGATION_WINDOW (window)); + + action_group = window->details->navigation_action_group; + win = CAJA_WINDOW (window); + + /* collect information */ + have_multiple_panes = (win->details->panes && win->details->panes->next); + if (win->details->active_pane->active_slot) + { + active_pane_location = caja_window_slot_get_location (win->details->active_pane->active_slot); + } + else + { + active_pane_location = NULL; + } + next_pane = caja_window_get_next_pane (win); + if (next_pane && next_pane->active_slot) + { + next_pane_location = caja_window_slot_get_location (next_pane->active_slot); + next_pane_is_in_same_location = (active_pane_location && next_pane_location && + g_file_equal (active_pane_location, next_pane_location)); + } + else + { + next_pane_location = NULL; + next_pane_is_in_same_location = FALSE; + } + + /* switch to next pane */ + action = gtk_action_group_get_action (action_group, "SplitViewNextPane"); + gtk_action_set_sensitive (action, have_multiple_panes); + + /* same location */ + action = gtk_action_group_get_action (action_group, "SplitViewSameLocation"); + gtk_action_set_sensitive (action, have_multiple_panes && !next_pane_is_in_same_location); + + /* clean up */ + if (active_pane_location) + { + g_object_unref (active_pane_location); + } + if (next_pane_location) + { + g_object_unref (next_pane_location); + } +} + +static void +action_new_window_callback (GtkAction *action, + gpointer user_data) +{ + CajaWindow *current_window; + CajaWindow *new_window; + + current_window = CAJA_WINDOW (user_data); + new_window = caja_application_create_navigation_window ( + current_window->application, + NULL, + gtk_window_get_screen (GTK_WINDOW (current_window))); + caja_window_go_home (new_window); +} + +static void +action_new_tab_callback (GtkAction *action, + gpointer user_data) +{ + CajaWindow *window; + CajaWindowSlot *current_slot; + CajaWindowSlot *new_slot; + CajaWindowOpenFlags flags; + GFile *location; + int new_slot_position; + char *scheme; + + window = CAJA_WINDOW (user_data); + current_slot = window->details->active_pane->active_slot; + location = caja_window_slot_get_location (current_slot); + + if (location != NULL) + { + flags = 0; + + new_slot_position = eel_preferences_get_enum (CAJA_PREFERENCES_NEW_TAB_POSITION); + if (new_slot_position == CAJA_NEW_TAB_POSITION_END) + { + flags = CAJA_WINDOW_OPEN_SLOT_APPEND; + } + + scheme = g_file_get_uri_scheme (location); + if (!strcmp (scheme, "x-caja-search")) + { + g_object_unref (location); + location = g_file_new_for_path (g_get_home_dir ()); + } + g_free (scheme); + + new_slot = caja_window_open_slot (current_slot->pane, flags); + caja_window_set_active_slot (window, new_slot); + caja_window_slot_go_to (new_slot, location, FALSE); + g_object_unref (location); + } +} + +static void +action_folder_window_callback (GtkAction *action, + gpointer user_data) +{ + CajaWindow *current_window; + CajaWindowSlot *slot; + GFile *current_location; + + current_window = CAJA_WINDOW (user_data); + slot = current_window->details->active_pane->active_slot; + current_location = caja_window_slot_get_location (slot); + caja_application_present_spatial_window ( + current_window->application, + current_window, + NULL, + current_location, + gtk_window_get_screen (GTK_WINDOW (current_window))); + if (current_location != NULL) + { + g_object_unref (current_location); + } +} + +static void +action_go_to_location_callback (GtkAction *action, + gpointer user_data) +{ + CajaWindow *window; + + window = CAJA_WINDOW (user_data); + + caja_window_prompt_for_location (window, NULL); +} + +/* The ctrl-f Keyboard shortcut always enables, rather than toggles + the search mode */ +static void +action_show_search_callback (GtkAction *action, + gpointer user_data) +{ + GtkAction *search_action; + CajaNavigationWindow *window; + + window = CAJA_NAVIGATION_WINDOW (user_data); + + search_action = + gtk_action_group_get_action (window->details->navigation_action_group, + CAJA_ACTION_SEARCH); + + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (search_action))) + { + /* Already visible, just show it */ + caja_navigation_window_show_search (window); + } + else + { + /* Otherwise, enable */ + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (search_action), + TRUE); + } +} + +static void +action_show_hide_search_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindow *window; + + /* This is used when toggling the action for updating the UI + state only, not actually activating the action */ + if (g_object_get_data (G_OBJECT (action), "blocked") != NULL) + { + return; + } + + window = CAJA_NAVIGATION_WINDOW (user_data); + + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) + { + caja_navigation_window_show_search (window); + } + else + { + CajaWindowSlot *slot; + GFile *location = NULL; + + slot = CAJA_WINDOW (window)->details->active_pane->active_slot; + + /* Use the location bar as the return location */ + if (slot->query_editor == NULL) + { + location = caja_window_slot_get_location (slot); + /* Use the search location as the return location */ + } + else + { + CajaQuery *query; + char *uri; + + query = caja_query_editor_get_query (slot->query_editor); + if (query != NULL) + { + uri = caja_query_get_location (query); + if (uri != NULL) + { + location = g_file_new_for_uri (uri); + g_free (uri); + } + g_object_unref (query); + } + } + + /* Last try: use the home directory as the return location */ + if (location == NULL) + { + location = g_file_new_for_path (g_get_home_dir ()); + } + + caja_window_go_to (CAJA_WINDOW (window), location); + g_object_unref (location); + + caja_navigation_window_hide_search (window); + } +} + +static void +action_tabs_previous_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindowPane *pane; + + pane = CAJA_NAVIGATION_WINDOW_PANE (CAJA_WINDOW (user_data)->details->active_pane); + caja_notebook_set_current_page_relative (CAJA_NOTEBOOK (pane->notebook), -1); +} + +static void +action_tabs_next_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindowPane *pane; + + pane = CAJA_NAVIGATION_WINDOW_PANE (CAJA_WINDOW (user_data)->details->active_pane); + caja_notebook_set_current_page_relative (CAJA_NOTEBOOK (pane->notebook), 1); +} + +static void +action_tabs_move_left_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindowPane *pane; + + pane = CAJA_NAVIGATION_WINDOW_PANE (CAJA_WINDOW (user_data)->details->active_pane); + caja_notebook_reorder_current_child_relative (CAJA_NOTEBOOK (pane->notebook), -1); +} + +static void +action_tabs_move_right_callback (GtkAction *action, + gpointer user_data) +{ + CajaNavigationWindowPane *pane; + + pane = CAJA_NAVIGATION_WINDOW_PANE (CAJA_WINDOW (user_data)->details->active_pane); + caja_notebook_reorder_current_child_relative (CAJA_NOTEBOOK (pane->notebook), 1); +} + +static void +action_tab_change_action_activate_callback (GtkAction *action, gpointer user_data) +{ + CajaWindow *window; + + window = CAJA_WINDOW (user_data); + if (window && window->details->active_pane) + { + GtkNotebook *notebook; + notebook = GTK_NOTEBOOK (CAJA_NAVIGATION_WINDOW_PANE (window->details->active_pane)->notebook); + if (notebook) + { + int num; + num = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action), "num")); + if (num < gtk_notebook_get_n_pages (notebook)) + { + gtk_notebook_set_current_page (notebook, num); + } + } + } +} + +static const GtkActionEntry navigation_entries[] = +{ + /* name, stock id, label */ { "Go", NULL, N_("_Go") }, + /* name, stock id, label */ { "Bookmarks", NULL, N_("_Bookmarks") }, + /* name, stock id, label */ { "Tabs", NULL, N_("_Tabs") }, + /* name, stock id, label */ { "New Window", "window-new", N_("New _Window"), + "<control>N", N_("Open another Caja window for the displayed location"), + G_CALLBACK (action_new_window_callback) + }, + /* name, stock id, label */ { "New Tab", "tab-new", N_("New _Tab"), + "<control>T", N_("Open another tab for the displayed location"), + G_CALLBACK (action_new_tab_callback) + }, + /* name, stock id, label */ { "Folder Window", "folder", N_("Open Folder W_indow"), + NULL, N_("Open a folder window for the displayed location"), + G_CALLBACK (action_folder_window_callback) + }, + /* name, stock id, label */ { "Close All Windows", NULL, N_("Close _All Windows"), + "<control>Q", N_("Close all Navigation windows"), + G_CALLBACK (action_close_all_windows_callback) + }, + /* name, stock id, label */ { "Go to Location", NULL, N_("_Location..."), + "<control>L", N_("Specify a location to open"), + G_CALLBACK (action_go_to_location_callback) + }, + /* name, stock id, label */ { "Clear History", NULL, N_("Clea_r History"), + NULL, N_("Clear contents of Go menu and Back/Forward lists"), + G_CALLBACK (action_clear_history_callback) + }, + /* name, stock id, label */ { "SplitViewNextPane", NULL, N_("S_witch to Other Pane"), + "F6", N_("Move focus to the other pane in a split view window"), + G_CALLBACK (action_split_view_switch_next_pane_callback) + }, + /* name, stock id, label */ { "SplitViewSameLocation", NULL, N_("Sa_me Location as Other Pane"), + NULL, N_("Go to the same location as in the extra pane"), + G_CALLBACK (action_split_view_same_location_callback) + }, + /* name, stock id, label */ { "Add Bookmark", GTK_STOCK_ADD, N_("_Add Bookmark"), + "<control>d", N_("Add a bookmark for the current location to this menu"), + G_CALLBACK (action_add_bookmark_callback) + }, + /* name, stock id, label */ { "Edit Bookmarks", NULL, N_("_Edit Bookmarks..."), + "<control>b", N_("Display a window that allows editing the bookmarks in this menu"), + G_CALLBACK (action_edit_bookmarks_callback) + }, + { + "TabsPrevious", NULL, N_("_Previous Tab"), "<control>Page_Up", + N_("Activate previous tab"), + G_CALLBACK (action_tabs_previous_callback) + }, + { + "TabsNext", NULL, N_("_Next Tab"), "<control>Page_Down", + N_("Activate next tab"), + G_CALLBACK (action_tabs_next_callback) + }, + { + "TabsMoveLeft", NULL, N_("Move Tab _Left"), "<shift><control>Page_Up", + N_("Move current tab to left"), + G_CALLBACK (action_tabs_move_left_callback) + }, + { + "TabsMoveRight", NULL, N_("Move Tab _Right"), "<shift><control>Page_Down", + N_("Move current tab to right"), + G_CALLBACK (action_tabs_move_right_callback) + }, + { + "ShowSearch", NULL, N_("S_how Search"), "<control>f", + N_("Show search"), + G_CALLBACK (action_show_search_callback) + } +}; + +static const GtkToggleActionEntry navigation_toggle_entries[] = +{ + /* name, stock id */ { "Show Hide Toolbar", NULL, + /* label, accelerator */ N_("_Main Toolbar"), NULL, + /* tooltip */ N_("Change the visibility of this window's main toolbar"), + G_CALLBACK (action_show_hide_toolbar_callback), + /* is_active */ TRUE + }, + /* name, stock id */ { "Show Hide Sidebar", NULL, + /* label, accelerator */ N_("_Side Pane"), "F9", + /* tooltip */ N_("Change the visibility of this window's side pane"), + G_CALLBACK (action_show_hide_sidebar_callback), + /* is_active */ TRUE + }, + /* name, stock id */ { "Show Hide Location Bar", NULL, + /* label, accelerator */ N_("Location _Bar"), NULL, + /* tooltip */ N_("Change the visibility of this window's location bar"), + G_CALLBACK (action_show_hide_location_bar_callback), + /* is_active */ TRUE + }, + /* name, stock id */ { "Show Hide Statusbar", NULL, + /* label, accelerator */ N_("St_atusbar"), NULL, + /* tooltip */ N_("Change the visibility of this window's statusbar"), + G_CALLBACK (action_show_hide_statusbar_callback), + /* is_active */ TRUE + }, + /* name, stock id */ { "Search", "gtk-find", + /* label, accelerator */ N_("_Search for Files..."), + /* Accelerator is in ShowSearch */"", + /* tooltip */ N_("Search documents and folders by name"), + G_CALLBACK (action_show_hide_search_callback), + /* is_active */ FALSE + }, + /* name, stock id */ { + CAJA_ACTION_SHOW_HIDE_EXTRA_PANE, NULL, + /* label, accelerator */ N_("E_xtra Pane"), "F3", + /* tooltip */ N_("Open an extra folder view side-by-side"), + G_CALLBACK (action_split_view_callback), + /* is_active */ FALSE + }, +}; + +void +caja_navigation_window_initialize_actions (CajaNavigationWindow *window) +{ + GtkActionGroup *action_group; + GtkUIManager *ui_manager; + GtkAction *action; + int i; + + action_group = gtk_action_group_new ("NavigationActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + window->details->navigation_action_group = action_group; + gtk_action_group_add_actions (action_group, + navigation_entries, G_N_ELEMENTS (navigation_entries), + window); + gtk_action_group_add_toggle_actions (action_group, + navigation_toggle_entries, G_N_ELEMENTS (navigation_toggle_entries), + window); + + action = g_object_new (CAJA_TYPE_NAVIGATION_ACTION, + "name", "Back", + "label", _("_Back"), + "stock_id", GTK_STOCK_GO_BACK, + "tooltip", _("Go to the previous visited location"), + "arrow-tooltip", _("Back history"), + "window", window, + "direction", CAJA_NAVIGATION_DIRECTION_BACK, + "is_important", TRUE, + NULL); + g_signal_connect (action, "activate", + G_CALLBACK (action_back_callback), window); + gtk_action_group_add_action_with_accel (action_group, + action, + "<alt>Left"); + g_object_unref (action); + + action = g_object_new (CAJA_TYPE_NAVIGATION_ACTION, + "name", "Forward", + "label", _("_Forward"), + "stock_id", GTK_STOCK_GO_FORWARD, + "tooltip", _("Go to the next visited location"), + "arrow-tooltip", _("Forward history"), + "window", window, + "direction", CAJA_NAVIGATION_DIRECTION_FORWARD, + "is_important", TRUE, + NULL); + g_signal_connect (action, "activate", + G_CALLBACK (action_forward_callback), window); + gtk_action_group_add_action_with_accel (action_group, + action, + "<alt>Right"); + + g_object_unref (action); + + action = g_object_new (CAJA_TYPE_ZOOM_ACTION, + "name", "Zoom", + "label", _("_Zoom"), + "window", window, + "is_important", FALSE, + NULL); + gtk_action_group_add_action (action_group, + action); + g_object_unref (action); + + action = g_object_new (CAJA_TYPE_VIEW_AS_ACTION, + "name", "ViewAs", + "label", _("_View As"), + "window", window, + "is_important", FALSE, + NULL); + gtk_action_group_add_action (action_group, + action); + g_object_unref (action); + + ui_manager = caja_window_get_ui_manager (CAJA_WINDOW (window)); + + /* Alt+N for the first 10 tabs */ + for (i = 0; i < 10; ++i) + { + gchar action_name[80]; + gchar accelerator[80]; + + snprintf(action_name, sizeof (action_name), "Tab%d", i); + action = gtk_action_new (action_name, NULL, NULL, NULL); + g_object_set_data (G_OBJECT (action), "num", GINT_TO_POINTER (i)); + g_signal_connect (action, "activate", + G_CALLBACK (action_tab_change_action_activate_callback), window); + snprintf(accelerator, sizeof (accelerator), "<alt>%d", (i+1)%10); + gtk_action_group_add_action_with_accel (action_group, action, accelerator); + g_object_unref (action); + gtk_ui_manager_add_ui (ui_manager, + gtk_ui_manager_new_merge_id (ui_manager), + "/", + action_name, + action_name, + GTK_UI_MANAGER_ACCELERATOR, + FALSE); + + } + + action = gtk_action_group_get_action (action_group, CAJA_ACTION_SEARCH); + g_object_set (action, "short_label", _("_Search"), NULL); + + action = gtk_action_group_get_action (action_group, "ShowSearch"); + gtk_action_set_sensitive (action, TRUE); + + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui_manager */ + + g_signal_connect (window, "loading_uri", + G_CALLBACK (caja_navigation_window_update_split_view_actions_sensitivity), + NULL); + + caja_navigation_window_update_split_view_actions_sensitivity (window); +} + + +/** + * caja_window_initialize_menus + * + * Create and install the set of menus for this window. + * @window: A recently-created CajaWindow. + */ +void +caja_navigation_window_initialize_menus (CajaNavigationWindow *window) +{ + GtkUIManager *ui_manager; + const char *ui; + + ui_manager = caja_window_get_ui_manager (CAJA_WINDOW (window)); + + ui = caja_ui_string_get ("caja-navigation-window-ui.xml"); + gtk_ui_manager_add_ui_from_string (ui_manager, ui, -1, NULL); + + caja_navigation_window_update_show_hide_menu_items (window); + caja_navigation_window_update_spatial_menu_item (window); + + caja_navigation_window_initialize_go_menu (window); +} |