summaryrefslogtreecommitdiff
path: root/src/caja-location-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/caja-location-dialog.c')
-rw-r--r--src/caja-location-dialog.c275
1 files changed, 275 insertions, 0 deletions
diff --git a/src/caja-location-dialog.c b/src/caja-location-dialog.c
new file mode 100644
index 00000000..d0dcaf5f
--- /dev/null
+++ b/src/caja-location-dialog.c
@@ -0,0 +1,275 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/*
+ * Caja
+ *
+ * Copyright (C) 2003 Ximian, 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; see the file COPYING. If not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include "caja-location-dialog.h"
+
+#include <eel/eel-gtk-macros.h>
+#include <eel/eel-stock-dialogs.h>
+#include <gtk/gtk.h>
+#include <libcaja-private/caja-file-utilities.h>
+#include "caja-location-entry.h"
+#include "caja-desktop-window.h"
+#include <glib/gi18n.h>
+
+struct _CajaLocationDialogDetails
+{
+ GtkWidget *entry;
+ CajaWindow *window;
+};
+
+static void caja_location_dialog_class_init (CajaLocationDialogClass *class);
+static void caja_location_dialog_init (CajaLocationDialog *dialog);
+
+EEL_CLASS_BOILERPLATE (CajaLocationDialog,
+ caja_location_dialog,
+ GTK_TYPE_DIALOG)
+enum
+{
+ RESPONSE_OPEN
+};
+
+static void
+caja_location_dialog_finalize (GObject *object)
+{
+ CajaLocationDialog *dialog;
+
+ dialog = CAJA_LOCATION_DIALOG (object);
+
+ g_free (dialog->details);
+
+ EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static void
+caja_location_dialog_destroy (GtkObject *object)
+{
+ CajaLocationDialog *dialog;
+
+ dialog = CAJA_LOCATION_DIALOG (object);
+
+ EEL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object));
+}
+
+static void
+open_current_location (CajaLocationDialog *dialog)
+{
+ GFile *location;
+ char *user_location;
+
+ user_location = gtk_editable_get_chars (GTK_EDITABLE (dialog->details->entry), 0, -1);
+ location = g_file_parse_name (user_location);
+ caja_window_go_to (dialog->details->window, location);
+ g_object_unref (location);
+ g_free (user_location);
+}
+
+static void
+response_callback (CajaLocationDialog *dialog,
+ int response_id,
+ gpointer data)
+{
+ GError *error;
+
+ switch (response_id)
+ {
+ case RESPONSE_OPEN :
+ open_current_location (dialog);
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ break;
+ case GTK_RESPONSE_NONE :
+ case GTK_RESPONSE_DELETE_EVENT :
+ case GTK_RESPONSE_CANCEL :
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ break;
+ case GTK_RESPONSE_HELP :
+ error = NULL;
+ gtk_show_uri (gtk_window_get_screen (GTK_WINDOW (dialog)),
+ "ghelp:user-guide#caja-open-location",
+ gtk_get_current_event_time (), &error);
+ if (error)
+ {
+ eel_show_error_dialog (_("There was an error displaying help."), error->message,
+ GTK_WINDOW (dialog));
+ g_error_free (error);
+ }
+ break;
+ default :
+ g_assert_not_reached ();
+ }
+}
+
+static void
+entry_activate_callback (GtkEntry *entry,
+ gpointer user_data)
+{
+ CajaLocationDialog *dialog;
+
+ dialog = CAJA_LOCATION_DIALOG (user_data);
+
+ if (gtk_entry_get_text_length (GTK_ENTRY (dialog->details->entry)) != 0)
+ {
+ gtk_dialog_response (GTK_DIALOG (dialog), RESPONSE_OPEN);
+ }
+}
+
+static void
+caja_location_dialog_class_init (CajaLocationDialogClass *class)
+{
+ GObjectClass *gobject_class;
+ GtkObjectClass *object_class;
+
+ gobject_class = G_OBJECT_CLASS (class);
+ gobject_class->finalize = caja_location_dialog_finalize;
+
+ object_class = GTK_OBJECT_CLASS (class);
+ object_class->destroy = caja_location_dialog_destroy;
+}
+
+static void
+entry_text_changed (GObject *object, GParamSpec *spec, gpointer user_data)
+{
+ CajaLocationDialog *dialog;
+
+ dialog = CAJA_LOCATION_DIALOG (user_data);
+
+ if (gtk_entry_get_text_length (GTK_ENTRY (dialog->details->entry)) != 0)
+ {
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), RESPONSE_OPEN, TRUE);
+ }
+ else
+ {
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), RESPONSE_OPEN, FALSE);
+ }
+}
+
+static void
+caja_location_dialog_init (CajaLocationDialog *dialog)
+{
+ GtkWidget *box;
+ GtkWidget *label;
+
+ dialog->details = g_new0 (CajaLocationDialogDetails, 1);
+
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Open Location"));
+ gtk_window_set_default_size (GTK_WINDOW (dialog), 300, -1);
+ gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+ gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 2);
+
+ box = gtk_hbox_new (FALSE, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (box), 5);
+ gtk_widget_show (box);
+
+ label = gtk_label_new_with_mnemonic (_("_Location:"));
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+
+ dialog->details->entry = caja_location_entry_new ();
+ gtk_entry_set_width_chars (GTK_ENTRY (dialog->details->entry), 30);
+ g_signal_connect_after (dialog->details->entry,
+ "activate",
+ G_CALLBACK (entry_activate_callback),
+ dialog);
+
+ gtk_widget_show (dialog->details->entry);
+
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->entry);
+
+ gtk_box_pack_start (GTK_BOX (box), dialog->details->entry,
+ TRUE, TRUE, 0);
+
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+ box, FALSE, TRUE, 0);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ GTK_STOCK_HELP,
+ GTK_RESPONSE_HELP);
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL);
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ GTK_STOCK_OPEN,
+ RESPONSE_OPEN);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog),
+ RESPONSE_OPEN);
+
+ g_signal_connect (dialog->details->entry, "notify::text",
+ G_CALLBACK (entry_text_changed), dialog);
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (response_callback),
+ dialog);
+}
+
+GtkWidget *
+caja_location_dialog_new (CajaWindow *window)
+{
+ CajaWindowSlot *slot;
+ CajaLocationDialog *loc_dialog;
+ GtkWidget *dialog;
+ GFile *location;
+ char *formatted_location;
+
+ dialog = gtk_widget_new (CAJA_TYPE_LOCATION_DIALOG, NULL);
+ loc_dialog = CAJA_LOCATION_DIALOG (dialog);
+
+ if (window)
+ {
+ gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_window_get_screen (GTK_WINDOW (window)));
+ loc_dialog->details->window = window;
+ }
+
+ slot = window->details->active_pane->active_slot;
+
+ location = slot->location;
+ if (location != NULL)
+ {
+ if (CAJA_IS_DESKTOP_WINDOW (window))
+ {
+ formatted_location = g_strdup_printf ("%s/", g_get_home_dir ());
+ }
+ else
+ {
+ formatted_location = g_file_get_parse_name (location);
+ }
+ caja_location_entry_update_current_location (CAJA_LOCATION_ENTRY (loc_dialog->details->entry),
+ formatted_location);
+ g_free (formatted_location);
+ }
+
+ gtk_widget_grab_focus (loc_dialog->details->entry);
+
+ return dialog;
+}
+
+void
+caja_location_dialog_set_location (CajaLocationDialog *dialog,
+ const char *location)
+{
+ caja_location_entry_update_current_location (CAJA_LOCATION_ENTRY (dialog->details->entry),
+ location);
+}