summaryrefslogtreecommitdiff
path: root/src/nautilus-connect-server-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-connect-server-dialog.c')
-rw-r--r--src/nautilus-connect-server-dialog.c729
1 files changed, 0 insertions, 729 deletions
diff --git a/src/nautilus-connect-server-dialog.c b/src/nautilus-connect-server-dialog.c
deleted file mode 100644
index 1c1a3628a..000000000
--- a/src/nautilus-connect-server-dialog.c
+++ /dev/null
@@ -1,729 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Nautilus
- *
- * Copyright (C) 2003 Red Hat, Inc.
- * Copyright (C) 2010 Cosimo Cecchi <cosimoc@gnome.org>
- *
- * Nautilus 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.
- *
- * Nautilus 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,
- * see <http://www.gnu.org/licenses/>.
- */
-
-#include <config.h>
-
-#include "nautilus-connect-server-dialog.h"
-
-#include <string.h>
-#include <eel/eel-stock-dialogs.h>
-#include <eel/eel-gtk-extensions.h>
-#include <glib/gi18n.h>
-#include <gio/gio.h>
-#include <gtk/gtk.h>
-
-#include "nautilus-window.h"
-
-struct _NautilusConnectServerDialogDetails {
- GtkTreeView *view;
- GtkListStore *store;
- GtkWidget *primary_grid;
-
- GtkWidget *uri_entry;
- GtkWidget *error_label;
-
- GtkWidget *menu;
- GtkWidget *remove_menu_item;
- GtkWidget *clear_menu_item;
-
- char **supported;
-};
-
-enum {
- COLUMN_NAME,
- COLUMN_URI,
- NUM_COLUMNS
-};
-
-
-G_DEFINE_TYPE (NautilusConnectServerDialog, nautilus_connect_server_dialog,
- GTK_TYPE_DIALOG)
-
-GFile *
-nautilus_connect_server_dialog_get_location (NautilusConnectServerDialog *dialog)
-{
- const char *uri;
- GFile *file = NULL;
-
- uri = gtk_entry_get_text (GTK_ENTRY (dialog->details->uri_entry));
- if (uri != NULL && uri[0] != '\0') {
- file = g_file_new_for_commandline_arg (uri);
- }
-
- return file;
-}
-
-static gboolean
-is_scheme_supported (NautilusConnectServerDialog *dialog,
- const char *scheme)
-{
- int i;
-
- if (dialog->details->supported == NULL) {
- return FALSE;
- }
-
- for (i = 0; dialog->details->supported[i] != NULL; i++) {
- if (strcmp (scheme, dialog->details->supported[i]) == 0) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static gboolean
-validate_uri (NautilusConnectServerDialog *dialog,
- const char *uri,
- GError **error)
-{
- gboolean valid = FALSE;
- char *scheme;
-
- scheme = g_uri_parse_scheme (uri);
- if (scheme != NULL) {
- valid = is_scheme_supported (dialog, scheme);
- if (! valid) {
- g_set_error_literal (error,
- G_IO_ERROR,
- G_IO_ERROR_NOT_SUPPORTED,
- _("This file server type is not recognized."));
- }
- g_free (scheme);
- } else {
- g_set_error_literal (error,
- G_IO_ERROR,
- G_IO_ERROR_INVALID_ARGUMENT,
- _("This doesn't look like an address."));
-
- }
-
- return valid;
-}
-
-static void
-on_uri_entry_clear (GtkEntry *entry,
- NautilusConnectServerDialog *dialog)
-{
- gtk_entry_set_text (entry, "");
-}
-
-static const char *
-get_default_schema (NautilusConnectServerDialog *dialog)
-{
- if (dialog->details->supported == NULL) {
- return NULL;
- }
-
- return dialog->details->supported[0];
-}
-
-static int
-get_index (const char **names,
- const char *needle)
-{
- int i;
- int index = G_MAXINT;
- for (i = 0; names[i] != NULL; i++) {
- if (strcmp (needle, names[i]) == 0) {
- index = i;
- break;
- }
- }
-
- return index;
-}
-
-static int
-sort_supported (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- const char **preferred = user_data;
- const char *s_a = *((char **)a);
- const char *s_b = *((char **)b);
- int i_a;
- int i_b;
-
- i_a = get_index (preferred, s_a);
- i_b = get_index (preferred, s_b);
-
- if (i_b == i_a) {
- return 0;
- } else if (i_a > i_b) {
- return 1;
- } else {
- return -1;
- }
-}
-
-static void
-populate_supported_list (NautilusConnectServerDialog *dialog)
-{
- const char * const *supported;
- GPtrArray *good;
- int i;
- int j;
- const char * unsupported[] = { "file", "afc", "obex", "http", "trash", "burn", "computer", "archive", "recent", "localtest", NULL };
- const char * preferred[] = { "smb", "afp", "sftp", "ssh", "davs", "dav", "ftp", NULL };
-
- supported = g_vfs_get_supported_uri_schemes (g_vfs_get_default ());
- if (supported == NULL) {
- return;
- }
-
- good = g_ptr_array_new ();
- for (i = 0; supported[i] != NULL; i++) {
- gboolean support = TRUE;
- for (j = 0; unsupported[j] != NULL; j++) {
- if (strcmp (supported[i], unsupported[j]) == 0) {
- support = FALSE;
- break;
- }
- }
- if (support) {
- g_ptr_array_add (good, g_strdup (supported[i]));
- }
- }
- g_ptr_array_sort_with_data (good, sort_supported, preferred);
-
- g_ptr_array_add (good, NULL);
-
- dialog->details->supported = (char **)g_ptr_array_free (good, FALSE);
-}
-
-static void
-reset_example_label (NautilusConnectServerDialog *dialog)
-{
- char *text;
- char *uri;
- const char *schema;
-
- schema = get_default_schema (dialog);
- if (schema != NULL) {
- uri = g_strdup_printf ("%s://foo.example.org", schema);
- /* Translators: %s is a URI of the form "smb://foo.example.com" */
- text = g_strdup_printf (_("For example, %s"), uri);
- g_free (uri);
- } else {
- text = g_strdup ("");
- }
- gtk_label_set_text (GTK_LABEL (dialog->details->error_label), text);
- g_free (text);
-}
-
-static void
-check_uri_entry (NautilusConnectServerDialog *dialog)
-{
- guint length;
- gboolean button_active = FALSE;
- gboolean icon_active = FALSE;
- const char *text = NULL;
-
- length = gtk_entry_get_text_length (GTK_ENTRY (dialog->details->uri_entry));
- if (length > 0) {
- GError *error = NULL;
-
- text = gtk_entry_get_text (GTK_ENTRY (dialog->details->uri_entry));
- button_active = validate_uri (dialog, text, &error);
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED)) {
- gtk_label_set_text (GTK_LABEL (dialog->details->error_label), error->message);
- } else {
- reset_example_label (dialog);
- }
- g_clear_error (&error);
- icon_active = TRUE;
- }
-
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, button_active);
-
- g_object_set (dialog->details->uri_entry,
- "secondary-icon-name", icon_active ? ("edit-clear-symbolic") : NULL,
- "secondary-icon-activatable", icon_active,
- "secondary-icon-sensitive", icon_active,
- NULL);
-}
-
-static void
-on_uri_entry_changed (GtkEditable *editable,
- NautilusConnectServerDialog *dialog)
-{
- GtkTreeSelection *selection;
-
- /* if the uri is changed at all it isn't the selected on anymore */
- selection = gtk_tree_view_get_selection (dialog->details->view);
- gtk_tree_selection_unselect_all (selection);
-
- check_uri_entry (dialog);
-}
-
-static char *
-get_selected (NautilusConnectServerDialog *dialog,
- GtkTreeIter *iter_out)
-{
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- char *uri = NULL;
-
- selection = gtk_tree_view_get_selection (dialog->details->view);
- if (gtk_tree_selection_get_selected (selection, NULL, &iter)) {
- gtk_tree_model_get (GTK_TREE_MODEL (dialog->details->store),
- &iter,
- COLUMN_URI, &uri,
- -1);
- if (iter_out) {
- *iter_out = iter;
- }
- }
-
- return uri;
-}
-
-static void
-on_selection_changed (GtkTreeSelection *selection,
- NautilusConnectServerDialog *dialog)
-{
- char *uri;
-
- uri = get_selected (dialog, NULL);
- if (uri != NULL) {
- g_signal_handlers_block_by_func (dialog->details->uri_entry, on_uri_entry_changed, dialog);
- gtk_entry_set_text (GTK_ENTRY (dialog->details->uri_entry), uri);
- g_signal_handlers_unblock_by_func (dialog->details->uri_entry, on_uri_entry_changed, dialog);
- check_uri_entry (dialog);
- g_free (uri);
- gtk_widget_set_sensitive (dialog->details->remove_menu_item, TRUE);
- } else {
- gtk_widget_set_sensitive (dialog->details->remove_menu_item, FALSE);
- }
-}
-
-static GBookmarkFile *
-server_list_load (void)
-{
- GBookmarkFile *bookmarks;
- GError *error = NULL;
- char *datadir;
- char *filename;
-
- bookmarks = g_bookmark_file_new ();
- datadir = g_build_filename (g_get_user_config_dir (), "nautilus", NULL);
- filename = g_build_filename (datadir, "servers", NULL);
- g_mkdir_with_parents (datadir, 0700);
- g_free (datadir);
- g_bookmark_file_load_from_file (bookmarks,
- filename,
- &error);
- g_free (filename);
- if (error != NULL) {
- if (! g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) {
- /* only warn if the file exists */
- g_warning ("Unable to open server bookmarks: %s", error->message);
- }
- g_error_free (error);
- g_bookmark_file_free (bookmarks);
- bookmarks = NULL;
- }
-
- return bookmarks;
-}
-
-static void
-server_list_save (GBookmarkFile *bookmarks)
-{
- char *filename;
-
- filename = g_build_filename (g_get_user_config_dir (), "nautilus", "servers", NULL);
- g_bookmark_file_to_file (bookmarks, filename, NULL);
- g_free (filename);
-}
-
-static void
-populate_server_list (NautilusConnectServerDialog *dialog)
-{
- GBookmarkFile *bookmarks;
- GtkTreeIter iter;
- char **uris;
- int i;
-
- bookmarks = server_list_load ();
- if (bookmarks == NULL) {
- return;
- }
- uris = g_bookmark_file_get_uris (bookmarks, NULL);
- if (uris != NULL) {
- for (i = 0; uris[i] != NULL; i++) {
- char *name;
-
- name = g_bookmark_file_get_title (bookmarks, uris[i], NULL);
- gtk_list_store_append (dialog->details->store, &iter);
- gtk_list_store_set (dialog->details->store, &iter,
- COLUMN_URI, uris[i],
- COLUMN_NAME, name,
- -1);
- g_free (name);
- }
- g_strfreev (uris);
- gtk_widget_set_sensitive (dialog->details->clear_menu_item, TRUE);
- } else {
- gtk_widget_set_sensitive (dialog->details->clear_menu_item, FALSE);
- }
-
- g_bookmark_file_free (bookmarks);
-}
-
-static void
-server_list_remove (NautilusConnectServerDialog *dialog,
- const char *uri)
-{
- GBookmarkFile *bookmarks;
-
- bookmarks = server_list_load ();
- if (bookmarks == NULL) {
- return;
- }
-
- g_bookmark_file_remove_item (bookmarks, uri, NULL);
- server_list_save (bookmarks);
- g_bookmark_file_free (bookmarks);
-}
-
-static void
-server_list_remove_all (NautilusConnectServerDialog *dialog)
-{
- GBookmarkFile *bookmarks;
-
- bookmarks = g_bookmark_file_new ();
- if (bookmarks == NULL) {
- return;
- }
- server_list_save (bookmarks);
- g_bookmark_file_free (bookmarks);
-}
-
-static void
-boldify_label (GtkLabel *label)
-{
- PangoAttrList *attrs;
- attrs = pango_attr_list_new ();
- pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
- gtk_label_set_attributes (label, attrs);
- pango_attr_list_unref (attrs);
-}
-
-static void
-on_clear_item_activated (GtkMenuItem *item,
- NautilusConnectServerDialog *dialog)
-{
- server_list_remove_all (dialog);
- gtk_list_store_clear (dialog->details->store);
- gtk_widget_set_sensitive (dialog->details->clear_menu_item, FALSE);
-}
-
-static void
-on_remove_item_activated (GtkMenuItem *item,
- NautilusConnectServerDialog *dialog)
-{
- char *uri;
- GtkTreeIter iter;
-
- uri = get_selected (dialog, &iter);
- if (uri != NULL) {
- server_list_remove (dialog, uri);
- gtk_list_store_remove (dialog->details->store, &iter);
- g_free (uri);
- }
-}
-
-static void
-on_row_activated (GtkTreeView *tree_view,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- NautilusConnectServerDialog *dialog)
-{
- gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
-}
-
-static void
-on_popup_menu_detach (GtkWidget *attach_widget,
- GtkMenu *menu)
-{
- NautilusConnectServerDialog *dialog = NAUTILUS_CONNECT_SERVER_DIALOG (attach_widget);
-
- dialog->details->menu = NULL;
- dialog->details->remove_menu_item = NULL;
- dialog->details->clear_menu_item = NULL;
-}
-
-static void
-create_popup_menu (NautilusConnectServerDialog *dialog)
-{
- GtkWidget *menu;
- GtkWidget *item;
-
- if (dialog->details->menu != NULL) {
- return;
- }
-
- menu = gtk_menu_new ();
- dialog->details->menu = menu;
- gtk_menu_attach_to_widget (GTK_MENU (menu),
- GTK_WIDGET (dialog),
- on_popup_menu_detach);
-
- item = gtk_menu_item_new_with_mnemonic (_("_Remove"));
- dialog->details->remove_menu_item = item;
- g_signal_connect (item, "activate",
- G_CALLBACK (on_remove_item_activated), dialog);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- eel_gtk_menu_append_separator (GTK_MENU (menu));
-
- item = gtk_menu_item_new_with_mnemonic (_("_Clear All"));
- dialog->details->clear_menu_item = item;
- g_signal_connect (item, "activate",
- G_CALLBACK (on_clear_item_activated), dialog);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-}
-
-static void
-history_popup_menu (NautilusConnectServerDialog *dialog)
-{
- create_popup_menu (dialog);
- eel_pop_up_context_menu (GTK_MENU (dialog->details->menu), NULL);
-}
-
-static gboolean
-on_popup_menu (GtkWidget *widget,
- NautilusConnectServerDialog *dialog)
-{
- history_popup_menu (dialog);
- return TRUE;
-}
-
-static void
-nautilus_connect_server_dialog_init (NautilusConnectServerDialog *dialog)
-{
- GtkWidget *label;
- GtkWidget *sw;
- GtkWidget *view;
- GtkWidget *box;
- GtkWidget *content_area;
- GtkWidget *grid;
- int row;
- GtkCellRenderer *cell;
- GtkTreeSelection *selection;
- GtkListStore *store;
-
- dialog->details = G_TYPE_INSTANCE_GET_PRIVATE (dialog, NAUTILUS_TYPE_CONNECT_SERVER_DIALOG,
- NautilusConnectServerDialogDetails);
-
- populate_supported_list (dialog);
-
- content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
-
- /* set dialog properties */
- gtk_window_set_title (GTK_WINDOW (dialog), _("Connect to Server"));
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
-
- grid = gtk_grid_new ();
- gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_VERTICAL);
- gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
- gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
- gtk_widget_set_margin_bottom (grid, 12);
- gtk_container_set_border_width (GTK_CONTAINER (grid), 5);
- gtk_container_add (GTK_CONTAINER (content_area), grid);
- gtk_widget_show (grid);
-
- dialog->details->primary_grid = grid;
-
- row = 0;
-
- label = gtk_label_new_with_mnemonic (_("_Server Address"));
- boldify_label (GTK_LABEL (label));
- gtk_label_set_xalign (GTK_LABEL (label), 0);
- gtk_grid_attach (GTK_GRID (grid), label, 0, row++, 1, 1);
- gtk_widget_show (label);
-
- dialog->details->uri_entry = gtk_entry_new ();
-
- gtk_widget_set_hexpand (dialog->details->uri_entry, TRUE);
- gtk_entry_set_activates_default (GTK_ENTRY (dialog->details->uri_entry), TRUE);
- gtk_grid_attach (GTK_GRID (grid), dialog->details->uri_entry, 0, row++, 1, 1);
-
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->uri_entry);
- gtk_widget_show (dialog->details->uri_entry);
-
- label = gtk_label_new (NULL);
- gtk_label_set_xalign (GTK_LABEL (label), 0);
- gtk_grid_attach (GTK_GRID (grid), label, 0, row++, 1, 1);
- gtk_widget_show (label);
- dialog->details->error_label = label;
- reset_example_label (dialog);
- gtk_widget_set_margin_bottom (label, 12);
- gtk_style_context_add_class (gtk_widget_get_style_context (label), "dim-label");
-
- label = gtk_label_new_with_mnemonic (_("_Recent Servers"));
- boldify_label (GTK_LABEL (label));
- gtk_label_set_xalign (GTK_LABEL (label), 0);
- gtk_grid_attach (GTK_GRID (grid), label, 0, row++, 1, 1);
- gtk_widget_show (label);
-
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_set_hexpand (box, TRUE);
- gtk_widget_set_vexpand (box, TRUE);
- gtk_grid_attach (GTK_GRID (grid), box, 0, row++, 1, 1);
- gtk_widget_show (box);
-
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
- GTK_POLICY_NEVER,
- GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request (sw, 400, 150);
- gtk_widget_show (sw);
- gtk_widget_set_hexpand (sw, TRUE);
- gtk_widget_set_vexpand (sw, TRUE);
- gtk_container_add (GTK_CONTAINER (box), sw);
-
- view = gtk_tree_view_new ();
- gtk_widget_show (view);
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE);
- gtk_container_add (GTK_CONTAINER (sw), view);
-
- g_signal_connect (view, "row-activated",
- G_CALLBACK (on_row_activated),
- dialog);
- g_signal_connect (view, "popup-menu",
- G_CALLBACK (on_popup_menu),
- dialog);
-
- store = gtk_list_store_new (NUM_COLUMNS,
- G_TYPE_STRING,
- G_TYPE_STRING);
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (view),
- GTK_TREE_MODEL (store));
- g_object_unref (store);
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
- g_signal_connect (selection, "changed",
- G_CALLBACK (on_selection_changed),
- dialog);
-
- cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view),
- -1,
- NULL,
- cell,
- "text", COLUMN_NAME,
- NULL);
- cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view),
- -1,
- NULL,
- cell,
- "text", COLUMN_URI,
- NULL);
- dialog->details->view = GTK_TREE_VIEW (view);
- dialog->details->store = store;
-
- gtk_dialog_add_button (GTK_DIALOG (dialog),
- _("_Cancel"),
- GTK_RESPONSE_CANCEL);
- gtk_dialog_add_button (GTK_DIALOG (dialog),
- _("C_onnect"),
- GTK_RESPONSE_OK);
- gtk_dialog_set_default_response (GTK_DIALOG (dialog),
- GTK_RESPONSE_OK);
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
- GTK_RESPONSE_OK,
- FALSE);
-
- g_signal_connect (dialog->details->uri_entry, "changed",
- G_CALLBACK (on_uri_entry_changed),
- dialog);
- g_signal_connect (dialog->details->uri_entry, "icon-release",
- G_CALLBACK (on_uri_entry_clear),
- dialog);
-
- create_popup_menu (dialog);
- populate_server_list (dialog);
-}
-
-static void
-nautilus_connect_server_dialog_finalize (GObject *object)
-{
- NautilusConnectServerDialog *dialog;
-
- dialog = NAUTILUS_CONNECT_SERVER_DIALOG (object);
-
- g_strfreev (dialog->details->supported);
-
- G_OBJECT_CLASS (nautilus_connect_server_dialog_parent_class)->finalize (object);
-}
-
-static void
-nautilus_connect_server_dialog_class_init (NautilusConnectServerDialogClass *class)
-{
- GObjectClass *oclass;
-
- oclass = G_OBJECT_CLASS (class);
- oclass->finalize = nautilus_connect_server_dialog_finalize;
-
- g_type_class_add_private (class, sizeof (NautilusConnectServerDialogDetails));
-}
-
-GtkWidget *
-nautilus_connect_server_dialog_new (NautilusWindow *window)
-{
- return g_object_new (NAUTILUS_TYPE_CONNECT_SERVER_DIALOG,
- "transient-for", window,
- "use-header-bar", TRUE,
- NULL);
-}
-
-void
-nautilus_connect_server_dialog_add_server (NautilusFile *file)
-{
- GBookmarkFile *bookmarks;
- char *uri;
- char *title;
-
- bookmarks = server_list_load ();
- if (bookmarks == NULL) {
- return;
- }
-
- uri = nautilus_file_get_uri (file);
- title = nautilus_file_get_display_name (file);
- g_bookmark_file_set_title (bookmarks, uri, title);
- g_bookmark_file_set_visited (bookmarks, uri, -1);
- g_bookmark_file_add_application (bookmarks, uri, NULL, NULL);
- g_free (uri);
- g_free (title);
-
- server_list_save (bookmarks);
- g_bookmark_file_free (bookmarks);
-}