summaryrefslogtreecommitdiff
path: root/src/caja-window-bookmarks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/caja-window-bookmarks.c')
-rw-r--r--src/caja-window-bookmarks.c295
1 files changed, 295 insertions, 0 deletions
diff --git a/src/caja-window-bookmarks.c b/src/caja-window-bookmarks.c
new file mode 100644
index 00000000..d16f04e9
--- /dev/null
+++ b/src/caja-window-bookmarks.c
@@ -0,0 +1,295 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/*
+ * Caja
+ *
+ * Copyright (C) 2000, 2001 Eazel, Inc.
+ * Copyright (C) 2005 Red Hat, 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]>
+ * Alexander Larsson <[email protected]>
+ */
+
+#include <config.h>
+
+#include <locale.h>
+
+#include "caja-actions.h"
+#include "caja-bookmark-list.h"
+#include "caja-bookmarks-window.h"
+#include "caja-window-bookmarks.h"
+#include "caja-window-private.h"
+#include <libcaja-private/caja-undo-manager.h>
+#include <eel/eel-debug.h>
+#include <eel/eel-stock-dialogs.h>
+#include <eel/eel-vfs-extensions.h>
+#include <eel/eel-gtk-extensions.h>
+#include <glib/gi18n.h>
+
+#define MENU_ITEM_MAX_WIDTH_CHARS 32
+
+static GtkWindow *bookmarks_window = NULL;
+
+static void refresh_bookmarks_menu (CajaWindow *window);
+
+static void
+remove_bookmarks_for_uri_if_yes (GtkDialog *dialog, int response, gpointer callback_data)
+{
+ const char *uri;
+ CajaWindow *window;
+
+ g_assert (GTK_IS_DIALOG (dialog));
+ g_assert (callback_data != NULL);
+
+ window = callback_data;
+
+ if (response == GTK_RESPONSE_YES)
+ {
+ uri = g_object_get_data (G_OBJECT (dialog), "uri");
+ caja_bookmark_list_delete_items_with_uri (window->details->bookmark_list, uri);
+ }
+
+ gtk_object_destroy (GTK_OBJECT (dialog));
+}
+
+static void
+show_bogus_bookmark_window (CajaWindow *window,
+ CajaBookmark *bookmark)
+{
+ GtkDialog *dialog;
+ GFile *location;
+ char *uri_for_display;
+ char *prompt;
+ char *detail;
+
+ location = caja_bookmark_get_location (bookmark);
+ uri_for_display = g_file_get_parse_name (location);
+
+ prompt = _("Do you want to remove any bookmarks with the "
+ "non-existing location from your list?");
+ detail = g_strdup_printf (_("The location \"%s\" does not exist."), uri_for_display);
+
+ dialog = eel_show_yes_no_dialog (prompt, detail,
+ _("Bookmark for Nonexistent Location"),
+ GTK_STOCK_CANCEL,
+ GTK_WINDOW (window));
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (remove_bookmarks_for_uri_if_yes), window);
+ g_object_set_data_full (G_OBJECT (dialog), "uri", g_file_get_uri (location), g_free);
+
+ gtk_dialog_set_default_response (dialog, GTK_RESPONSE_NO);
+
+ g_object_unref (location);
+ g_free (uri_for_display);
+ g_free (detail);
+}
+
+static GtkWindow *
+get_or_create_bookmarks_window (CajaWindow *window)
+{
+ GObject *undo_manager_source;
+
+ undo_manager_source = G_OBJECT (window);
+
+ if (bookmarks_window == NULL)
+ {
+ bookmarks_window = create_bookmarks_window (window->details->bookmark_list,
+ undo_manager_source);
+ }
+ else
+ {
+ edit_bookmarks_dialog_set_signals (undo_manager_source);
+ }
+
+ return bookmarks_window;
+}
+
+/**
+ * caja_bookmarks_exiting:
+ *
+ * Last chance to save state before app exits.
+ * Called when application exits; don't call from anywhere else.
+ **/
+void
+caja_bookmarks_exiting (void)
+{
+ if (bookmarks_window != NULL)
+ {
+ caja_bookmarks_window_save_geometry (bookmarks_window);
+ gtk_widget_destroy (GTK_WIDGET (bookmarks_window));
+ }
+}
+
+/**
+ * add_bookmark_for_current_location
+ *
+ * Add a bookmark for the displayed location to the bookmarks menu.
+ * Does nothing if there's already a bookmark for the displayed location.
+ */
+void
+caja_window_add_bookmark_for_current_location (CajaWindow *window)
+{
+ CajaBookmark *bookmark;
+ CajaWindowSlot *slot;
+ CajaBookmarkList *list;
+
+ g_assert (CAJA_IS_WINDOW (window));
+
+ slot = window->details->active_pane->active_slot;
+ bookmark = slot->current_location_bookmark;
+ list = window->details->bookmark_list;
+
+ if (!caja_bookmark_list_contains (list, bookmark))
+ {
+ caja_bookmark_list_append (list, bookmark);
+ }
+}
+
+void
+caja_window_edit_bookmarks (CajaWindow *window)
+{
+ GtkWindow *dialog;
+
+ dialog = get_or_create_bookmarks_window (window);
+
+ gtk_window_set_screen (
+ dialog, gtk_window_get_screen (GTK_WINDOW (window)));
+ gtk_window_present (dialog);
+}
+
+static void
+remove_bookmarks_menu_items (CajaWindow *window)
+{
+ GtkUIManager *ui_manager;
+
+ ui_manager = caja_window_get_ui_manager (window);
+ if (window->details->bookmarks_merge_id != 0)
+ {
+ gtk_ui_manager_remove_ui (ui_manager,
+ window->details->bookmarks_merge_id);
+ window->details->bookmarks_merge_id = 0;
+ }
+ if (window->details->bookmarks_action_group != NULL)
+ {
+ gtk_ui_manager_remove_action_group (ui_manager,
+ window->details->bookmarks_action_group);
+ window->details->bookmarks_action_group = NULL;
+ }
+}
+
+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 void
+update_bookmarks (CajaWindow *window)
+{
+ CajaBookmarkList *bookmarks;
+ CajaBookmark *bookmark;
+ guint bookmark_count;
+ guint index;
+ GtkUIManager *ui_manager;
+
+ g_assert (CAJA_IS_WINDOW (window));
+ g_assert (window->details->bookmarks_merge_id == 0);
+ g_assert (window->details->bookmarks_action_group == NULL);
+
+ if (window->details->bookmark_list == NULL)
+ {
+ window->details->bookmark_list = caja_bookmark_list_new ();
+ }
+
+ bookmarks = window->details->bookmark_list;
+
+ ui_manager = caja_window_get_ui_manager (CAJA_WINDOW (window));
+
+ window->details->bookmarks_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
+ window->details->bookmarks_action_group = gtk_action_group_new ("BookmarksGroup");
+ g_signal_connect (window->details->bookmarks_action_group, "connect-proxy",
+ G_CALLBACK (connect_proxy_cb), NULL);
+
+ gtk_ui_manager_insert_action_group (ui_manager,
+ window->details->bookmarks_action_group,
+ -1);
+ g_object_unref (window->details->bookmarks_action_group);
+
+ /* append new set of bookmarks */
+ bookmark_count = caja_bookmark_list_length (bookmarks);
+ for (index = 0; index < bookmark_count; ++index)
+ {
+ bookmark = caja_bookmark_list_item_at (bookmarks, index);
+
+ if (caja_bookmark_uri_known_not_to_exist (bookmark))
+ {
+ continue;
+ }
+
+ caja_menus_append_bookmark_to_menu
+ (CAJA_WINDOW (window),
+ bookmark,
+ CAJA_WINDOW_GET_CLASS (window)->bookmarks_placeholder,
+ "dynamic",
+ index,
+ window->details->bookmarks_action_group,
+ window->details->bookmarks_merge_id,
+ G_CALLBACK (refresh_bookmarks_menu),
+ show_bogus_bookmark_window);
+ }
+}
+
+static void
+refresh_bookmarks_menu (CajaWindow *window)
+{
+ g_assert (CAJA_IS_WINDOW (window));
+
+ remove_bookmarks_menu_items (window);
+ update_bookmarks (window);
+}
+
+/**
+ * caja_window_initialize_bookmarks_menu
+ *
+ * Fill in bookmarks menu with stored bookmarks, and wire up signals
+ * so we'll be notified when bookmark list changes.
+ */
+void
+caja_window_initialize_bookmarks_menu (CajaWindow *window)
+{
+ g_assert (CAJA_IS_WINDOW (window));
+
+ refresh_bookmarks_menu (window);
+
+ /* Recreate dynamic part of menu if bookmark list changes */
+ g_signal_connect_object (window->details->bookmark_list, "contents_changed",
+ G_CALLBACK (refresh_bookmarks_menu),
+ window, G_CONNECT_SWAPPED);
+}