[nautilus] New design for the connect to server dialog



commit 95d42ea01f7f9c60210b415554e7bbf6f4e1b334
Author: William Jon McCann <jmccann redhat com>
Date:   Sun Sep 2 19:23:29 2012 -0400

    New design for the connect to server dialog
    
    https://bugzilla.gnome.org/show_bug.cgi?id=682637

 src/Makefile.am                              |   14 -
 src/nautilus-application.c                   |  107 ++-
 src/nautilus-connect-server-dialog-main.c    |  159 ---
 src/nautilus-connect-server-dialog-nonmain.c |   86 --
 src/nautilus-connect-server-dialog.c         | 1476 +++++++++-----------------
 src/nautilus-connect-server-dialog.h         |   21 +-
 src/nautilus-connect-server-operation.c      |  151 ---
 src/nautilus-connect-server-operation.h      |   63 --
 8 files changed, 587 insertions(+), 1490 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 336c06f..0fc13ce 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,7 +3,6 @@ include $(top_srcdir)/Makefile.shared
 bin_PROGRAMS=					\
 	nautilus				\
 	nautilus-autorun-software		\
-	nautilus-connect-server			\
 	$(NULL)
 
 libexec_PROGRAMS=				\
@@ -135,9 +134,6 @@ nautilus_SOURCES = \
 	nautilus-canvas-view-container.h	\
 	nautilus-connect-server-dialog.c	\
 	nautilus-connect-server-dialog.h	\
-	nautilus-connect-server-dialog-nonmain.c \
-	nautilus-connect-server-operation.c	\
-	nautilus-connect-server-operation.h	\
 	nautilus-desktop-canvas-view.c		\
 	nautilus-desktop-canvas-view.h		\
 	nautilus-desktop-item-properties.c	\
@@ -227,16 +223,6 @@ nautilus_autorun_software_SOURCES= 			\
 	nautilus-autorun-software.c			\
 	$(NULL)
 
-nautilus_connect_server_SOURCES= \
-	nautilus-bookmark-list.c		\
-	nautilus-bookmark-list.h		\
-	nautilus-connect-server-dialog.c	\
-	nautilus-connect-server-dialog.h	\
-	nautilus-connect-server-dialog-main.c	\
-	nautilus-connect-server-operation.c     \
-	nautilus-connect-server-operation.h     \
-	$(NULL)
-
 nautilus_convert_metadata_SOURCES= \
 	nautilus-convert-metadata.c	\
 	$(NULL)
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index 5bab068..2722464 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -110,6 +110,8 @@ struct _NautilusApplicationPriv {
 	NotifyNotification *unmount_notify;
 
 	NautilusBookmarkList *bookmark_list;
+
+	GtkWidget *connect_server_window;
 };
 
 NautilusBookmarkList *
@@ -702,16 +704,115 @@ action_new_window (GSimpleAction *action,
 	nautilus_window_slot_go_home (nautilus_window_get_active_slot (window), 0);
 }
 
+static gboolean
+go_to_server_cb (NautilusWindow *window,
+		 GError         *error,
+		 gpointer        user_data)
+{
+	GFile *location = user_data;
+
+	if (error == NULL) {
+		GBookmarkFile *bookmarks;
+		GError *error = NULL;
+		char *datadir;
+		char *filename;
+		char *uri;
+		char *title;
+		NautilusFile *file;
+		gboolean safe_to_save = TRUE;
+
+		file = nautilus_file_get_existing (location);
+
+		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);
+		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);
+				safe_to_save = FALSE;
+			}
+			g_error_free (error);
+		}
+
+		if (safe_to_save) {
+			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);
+
+			g_bookmark_file_to_file (bookmarks, filename, NULL);
+		}
+
+		g_free (filename);
+		g_bookmark_file_free (bookmarks);
+	} else {
+		g_warning ("Unable to connect to server: %s\n", error->message);
+	}
+
+	g_object_unref (location);
+
+	return TRUE;
+}
+
+static void
+on_connect_server_response (GtkDialog      *dialog,
+			    int             response,
+			    GtkApplication *application)
+{
+	if (response == GTK_RESPONSE_OK) {
+		GFile *location;
+
+		location = nautilus_connect_server_dialog_get_location (NAUTILUS_CONNECT_SERVER_DIALOG (dialog));
+		if (location != NULL) {
+			nautilus_window_go_to_full (NAUTILUS_WINDOW (get_focus_window (application)),
+						    location,
+						    go_to_server_cb,
+						    location);
+		}
+	}
+
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+nautilus_application_connect_server (NautilusApplication *application,
+				     NautilusWindow      *window)
+{
+	GtkWidget *dialog;
+
+	dialog = application->priv->connect_server_window;
+
+	if (dialog == NULL) {
+		dialog = nautilus_connect_server_dialog_new (window);
+		g_signal_connect (dialog, "response", G_CALLBACK (on_connect_server_response), application);
+		application->priv->connect_server_window = GTK_WIDGET (dialog);
+
+		g_object_add_weak_pointer (G_OBJECT (dialog),
+					   (gpointer *) &application->priv->connect_server_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)));
+	gtk_window_present (GTK_WINDOW (dialog));
+}
+
 static void
 action_connect_to_server (GSimpleAction *action,
 			  GVariant *parameter,
 			  gpointer user_data)
 {
 	GtkApplication *application = user_data;
-	GtkWidget *dialog;
 
-	dialog = nautilus_connect_server_dialog_new (NAUTILUS_WINDOW (get_focus_window (application)));
-	gtk_widget_show (dialog);
+	nautilus_application_connect_server (NAUTILUS_APPLICATION (application), NAUTILUS_WINDOW (get_focus_window (application)));
 }
 
 static void
diff --git a/src/nautilus-connect-server-dialog.c b/src/nautilus-connect-server-dialog.c
index dcbc553..b5c7b4a 100644
--- a/src/nautilus-connect-server-dialog.c
+++ b/src/nautilus-connect-server-dialog.c
@@ -27,1104 +27,689 @@
 
 #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-bookmark-list.h"
-#include "nautilus-connect-server-operation.h"
 #include "nautilus-window.h"
 
-#include <libnautilus-private/nautilus-global-preferences.h>
-#include <libnautilus-private/nautilus-icon-names.h>
-
-/* TODO:
- * - name entry + pre-fill
- * - NetworkManager integration
- */
-
 struct _NautilusConnectServerDialogDetails {
+	GtkTreeView *view;
+	GtkListStore *store;
 	GtkWidget *primary_grid;
-	GtkWidget *user_details;
-	GtkWidget *port_spinbutton;
-
-	GtkWidget *info_bar;
-	GtkWidget *info_bar_content;
-	
-	GtkWidget *type_combo;
-	GtkWidget *server_entry;
-	GtkWidget *share_entry;
-	GtkWidget *folder_entry;
-	GtkWidget *domain_entry;
-	GtkWidget *user_entry;
-	GtkWidget *password_entry;
-	GtkWidget *remember_checkbox;
-	GtkWidget *connect_button;
-
-	GtkSizeGroup *labels_size_group;
-	GtkSizeGroup *contents_size_group;
-
-	GList *iconized_entries;
-
-	GSimpleAsyncResult *fill_details_res;
-	GAskPasswordFlags fill_details_flags;
-	GMountOperation *fill_operation;
-
-	gboolean last_password_set;
-	gulong password_sensitive_id;
-	gboolean should_destroy;
-
-	GCancellable *mount_cancellable;
-};
 
-G_DEFINE_TYPE (NautilusConnectServerDialog, nautilus_connect_server_dialog,
-	       GTK_TYPE_DIALOG)
+	GtkWidget *uri_entry;
+	GtkWidget *error_label;
 
-static void sensitive_entry_changed_callback (GtkEditable *editable,
-					      GtkWidget *widget);
-static void iconized_entry_changed_cb (GtkEditable *entry,
-				       NautilusConnectServerDialog *dialog);
+	GtkWidget *menu;
+	GtkWidget *remove_menu_item;
+	GtkWidget *clear_menu_item;
 
-enum {
-	RESPONSE_CONNECT
-};	
-
-struct MethodInfo {
-	const char *scheme;
-	guint flags;
-	guint default_port;
+	char **supported;
 };
 
-/* A collection of flags for MethodInfo.flags */
 enum {
-	DEFAULT_METHOD = (1 << 0),
-	
-	/* Widgets to display in connect_dialog_setup_for_type */
-	SHOW_SHARE     = (1 << 1),
-	SHOW_PORT      = (1 << 2),
-	SHOW_USER      = (1 << 3),
-	SHOW_DOMAIN    = (1 << 4),
-	
-	IS_ANONYMOUS   = (1 << 5)
+	COLUMN_NAME,
+	COLUMN_URI,
+	NUM_COLUMNS
 };
 
-/* Remember to fill in descriptions below */
-static struct MethodInfo methods[] = {
-	{ "afp", SHOW_SHARE | SHOW_USER, 548 },
-	/* FIXME: we need to alias ssh to sftp */
-	{ "sftp",  SHOW_PORT | SHOW_USER, 22 },
-	{ "ftp",  SHOW_PORT | SHOW_USER, 21 },
-	{ "ftp",  DEFAULT_METHOD | IS_ANONYMOUS | SHOW_PORT, 21 },
-	{ "smb",  SHOW_SHARE | SHOW_USER | SHOW_DOMAIN, 0 },
-	{ "dav",  SHOW_PORT | SHOW_USER, 80 },
-	/* FIXME: hrm, shouldn't it work? */
-	{ "davs", SHOW_PORT | SHOW_USER, 443 },
-};
 
-/* To get around non constant gettext strings */
-static const char*
-get_method_description (struct MethodInfo *meth)
-{
-	if (strcmp (meth->scheme, "sftp") == 0) {
-		return _("SSH");
-	} else if (strcmp (meth->scheme, "ftp") == 0) {
-		if (meth->flags & IS_ANONYMOUS) {
-			return _("Public FTP");
-		} else {
-			return _("FTP (with login)");
-		}
-	} else if (strcmp (meth->scheme, "smb") == 0) {
-		return _("Windows share");
-	} else if (strcmp (meth->scheme, "dav") == 0) {
-		return _("WebDAV (HTTP)");
-	} else if (strcmp (meth->scheme, "davs") == 0) {
-		return _("Secure WebDAV (HTTPS)");
-	} else if (strcmp (meth->scheme, "afp") == 0) {
-		return _("Apple Filing Protocol (AFP)");
-	} else {
-		/* No descriptive text */
-		return meth->scheme;
-	}
-}
+G_DEFINE_TYPE (NautilusConnectServerDialog, nautilus_connect_server_dialog,
+	       GTK_TYPE_DIALOG)
 
-static void
-connect_dialog_restore_info_bar (NautilusConnectServerDialog *dialog,
-				 GtkMessageType message_type)
+GFile *
+nautilus_connect_server_dialog_get_location (NautilusConnectServerDialog *dialog)
 {
-	if (dialog->details->info_bar_content != NULL) {
-		gtk_widget_destroy (dialog->details->info_bar_content);
-		dialog->details->info_bar_content = NULL;
+	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);
 	}
 
-	gtk_info_bar_set_message_type (GTK_INFO_BAR (dialog->details->info_bar),
-				       message_type);
+	return file;
 }
 
 static void
-connect_dialog_set_connecting (NautilusConnectServerDialog *dialog)
+nautilus_connect_server_dialog_response (GtkDialog *dialog,
+					 int        response_id,
+					 gpointer   data)
 {
-	GtkWidget *hbox;
-	GtkWidget *widget;
-	GtkWidget *content_area;
-	gint width, height;
-
-	connect_dialog_restore_info_bar (dialog, GTK_MESSAGE_INFO);
-	gtk_widget_show (dialog->details->info_bar);	
-
-	content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (dialog->details->info_bar));
-
-	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-	gtk_container_add (GTK_CONTAINER (content_area), hbox);
-	gtk_widget_show (hbox);
-
-	dialog->details->info_bar_content = hbox;
-
-	widget = gtk_spinner_new ();
-	gtk_icon_size_lookup (GTK_ICON_SIZE_SMALL_TOOLBAR, &width, &height);
-	gtk_widget_set_size_request (widget, width, height);
-	gtk_spinner_start (GTK_SPINNER (widget));
-	gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 6);
-	gtk_widget_show (widget);
-
-	widget = gtk_label_new (_("Connecting..."));
-	gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 6);
-	gtk_widget_show (widget);
+	GError *error;
+	NautilusConnectServerDialog *cs_dialog = NAUTILUS_CONNECT_SERVER_DIALOG (dialog);
 
-	gtk_widget_set_sensitive (dialog->details->connect_button, FALSE);
+	switch (response_id) {
+	case GTK_RESPONSE_ACCEPT:
+		g_signal_stop_emission_by_name (dialog, "response");
+		gtk_entry_set_text (GTK_ENTRY (cs_dialog->details->uri_entry), "network:///");
+		gtk_dialog_response (dialog, GTK_RESPONSE_OK);
+		break;
+	case GTK_RESPONSE_HELP:
+		error = NULL;
+		gtk_show_uri (gtk_window_get_screen (GTK_WINDOW (dialog)),
+			      "help:gnome-help/nautilus-connect",
+			      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);
+		}
+		g_signal_stop_emission_by_name (dialog, "response");
+		break;
+	default :
+		break;
+	}
 }
 
-static void
-connect_dialog_gvfs_error (NautilusConnectServerDialog *dialog)
+static gboolean
+is_scheme_supported (NautilusConnectServerDialog *dialog,
+		     const char                  *scheme)
 {
-	GtkWidget *hbox, *image, *content_area, *label;
+	int i;
 
-	connect_dialog_restore_info_bar (dialog, GTK_MESSAGE_ERROR);
+	if (dialog->details->supported == NULL) {
+		return FALSE;
+	}
 
-	content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (dialog->details->info_bar));
+	for (i = 0; dialog->details->supported[i] != NULL; i++) {
+		if (strcmp (scheme, dialog->details->supported[i]) == 0) {
+			return TRUE;
+		}
+	}
 
-	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-	gtk_container_add (GTK_CONTAINER (content_area), hbox);
-	gtk_widget_show (hbox);
+	return FALSE;
+}
 
-	image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_SMALL_TOOLBAR);
-	gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 6);
-	gtk_widget_show (image);
-	
-	label = gtk_label_new (_("Can't load the supported server method list.\n"
-				 "Please check your gvfs installation."));
-	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
-	gtk_widget_show (label);
+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,
+					     _("Don't recognize this file server type."));
+		}
+		g_free (scheme);
+	} else {
+		g_set_error_literal (error,
+				     G_IO_ERROR,
+				     G_IO_ERROR_INVALID_ARGUMENT,
+				     _("This doesn't look like an address."));
 
-	gtk_widget_set_sensitive (dialog->details->connect_button, FALSE);
-	gtk_widget_set_sensitive (dialog->details->primary_grid, FALSE);
+	}
 
-	gtk_widget_show (dialog->details->info_bar);
+	return valid;
 }
 
 static void
-iconized_entry_restore (gpointer data,
-			gpointer user_data)
+on_uri_entry_clear (GtkEntry                    *entry,
+		    NautilusConnectServerDialog *dialog)
 {
-	GtkEntry *entry;
-	NautilusConnectServerDialog *dialog;
-
-	entry = data;
-	dialog = user_data;
-
-	gtk_entry_set_icon_from_stock (GTK_ENTRY (entry),
-				       GTK_ENTRY_ICON_SECONDARY,
-				       NULL);
-
-	g_signal_handlers_disconnect_by_func (entry,
-					      iconized_entry_changed_cb,
-					      dialog);	
+	gtk_entry_set_text (entry, "");
 }
 
-static void
-iconized_entry_changed_cb (GtkEditable *entry,
-			   NautilusConnectServerDialog *dialog)
+static const char *
+get_default_scheme (NautilusConnectServerDialog *dialog)
 {
-	dialog->details->iconized_entries =
-		g_list_remove (dialog->details->iconized_entries, entry);
+	if (dialog->details->supported == NULL) {
+		return NULL;
+	}
 
-	iconized_entry_restore (entry, dialog);
+	return dialog->details->supported[0];
 }
 
-static void
-iconize_entry (NautilusConnectServerDialog *dialog,
-	       GtkWidget *entry)
+static int
+get_index (const char **names,
+	   const char  *needle)
 {
-	if (!g_list_find (dialog->details->iconized_entries, entry)) {
-		dialog->details->iconized_entries =
-			g_list_prepend (dialog->details->iconized_entries, entry);
-
-		gtk_entry_set_icon_from_stock (GTK_ENTRY (entry),
-					       GTK_ENTRY_ICON_SECONDARY,
-					       GTK_STOCK_DIALOG_WARNING);
+	int i;
+	int index = G_MAXINT;
+	for (i = 0; names[i] != NULL; i++) {
+		if (strcmp (needle, names[i]) == 0) {
+			index = i;
+			break;
+		}
+	}
 
-		gtk_widget_grab_focus (entry);
+	return index;
+}
 
-		g_signal_connect (entry, "changed",
-				  G_CALLBACK (iconized_entry_changed_cb), dialog);
+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
-connect_dialog_set_info_bar_error (NautilusConnectServerDialog *dialog,
-				   GError *error)
+populate_supported_list (NautilusConnectServerDialog *dialog)
 {
-	GtkWidget *content_area, *label, *entry, *hbox, *icon;
-	gchar *str;
-	const gchar *folder, *server;
-
-	connect_dialog_restore_info_bar (dialog, GTK_MESSAGE_WARNING);
-
-	content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (dialog->details->info_bar));
-	entry = NULL;
+	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 };
 
-	switch (error->code) {
-	case G_IO_ERROR_FAILED_HANDLED:
+	supported = g_vfs_get_supported_uri_schemes (g_vfs_get_default ());
+	if (supported == NULL) {
 		return;
-	case G_IO_ERROR_NOT_FOUND:
-		folder = gtk_entry_get_text (GTK_ENTRY (dialog->details->folder_entry));
-		server = gtk_entry_get_text (GTK_ENTRY (dialog->details->server_entry));
-		str = g_strdup_printf (_("The folder â%sâ cannot be opened on â%sâ."),
-				       folder, server);
-		label = gtk_label_new (str);
-		entry = dialog->details->folder_entry;
-
-		g_free (str);
-
-		break;
-	case G_IO_ERROR_HOST_NOT_FOUND:
-		server = gtk_entry_get_text (GTK_ENTRY (dialog->details->server_entry));
-		str = g_strdup_printf (_("The server at â%sâ cannot be found."), server);
-		label = gtk_label_new (str);
-		entry = dialog->details->server_entry;
-
-		g_free (str);
-
-		break;		
-	case G_IO_ERROR_FAILED:
-	default:
-		label = gtk_label_new (error->message);
-		break;
 	}
 
-	gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
-	gtk_widget_show (dialog->details->info_bar);
-
-	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-	gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 6);
-	gtk_widget_show (hbox);
-
-	icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
-					 GTK_ICON_SIZE_SMALL_TOOLBAR);
-	gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 6);
-	gtk_widget_show (icon);
-
-	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
-	gtk_widget_show (label);
-
-	if (entry != NULL) {
-		iconize_entry (dialog, entry);
+	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);
 
-	dialog->details->info_bar_content = hbox;
+	g_ptr_array_add (good, NULL);
 
-	gtk_button_set_label (GTK_BUTTON (dialog->details->connect_button),
-			      _("Try Again"));
-	gtk_widget_set_sensitive (dialog->details->connect_button, TRUE);
+	dialog->details->supported = (char **)g_ptr_array_free (good, FALSE);
 }
 
 static void
-connect_dialog_finish_fill (NautilusConnectServerDialog *dialog)
+reset_example_label (NautilusConnectServerDialog *dialog)
 {
-	GAskPasswordFlags flags;
-	GMountOperation *op;
-
-	flags = dialog->details->fill_details_flags;
-	op = G_MOUNT_OPERATION (dialog->details->fill_operation);
+	char *text;
+	char *uri;
 
-	if (flags & G_ASK_PASSWORD_NEED_PASSWORD) {
-		g_mount_operation_set_password (op, gtk_entry_get_text (GTK_ENTRY (dialog->details->password_entry)));
-	}
+	uri = g_strdup_printf ("%s://foo.example.com", get_default_scheme (dialog));
+	/* Translators: %s is a URI of the form "smb://foo.example.com" */
+	text = g_strdup_printf (_("For example, %s"), uri);
+	g_free (uri);
+	gtk_label_set_text (GTK_LABEL (dialog->details->error_label), text);
+	g_free (text);
+}
 
-	if (flags & G_ASK_PASSWORD_NEED_USERNAME) {
-		g_mount_operation_set_username (op, gtk_entry_get_text (GTK_ENTRY (dialog->details->user_entry)));
+static void
+check_uri_entry (NautilusConnectServerDialog *dialog)
+{
+	guint length;
+	gboolean active = FALSE;
+	const char *text = NULL;
+	const char *icon_name = 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));
+		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);
 	}
 
-	if (flags & G_ASK_PASSWORD_NEED_DOMAIN) {
-		g_mount_operation_set_domain (op, gtk_entry_get_text (GTK_ENTRY (dialog->details->domain_entry)));
-	}
+	gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, active);
 
-	if (flags & G_ASK_PASSWORD_SAVING_SUPPORTED &&
-	    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->details->remember_checkbox))) {
-		g_mount_operation_set_password_save (op, G_PASSWORD_SAVE_PERMANENTLY);
+	if (length > 0) {
+		icon_name = "edit-clear-symbolic";
 	}
 
-	connect_dialog_set_connecting (dialog);
-
-	g_simple_async_result_set_op_res_gboolean (dialog->details->fill_details_res, TRUE);
-	g_simple_async_result_complete (dialog->details->fill_details_res);
-
-	g_object_unref (dialog->details->fill_details_res);
-	dialog->details->fill_details_res = NULL;
-
-	g_object_unref (dialog->details->fill_operation);
-	dialog->details->fill_operation = NULL;
+	g_object_set (dialog->details->uri_entry,
+		      "secondary-icon-name", icon_name,
+		      "secondary-icon-activatable", active,
+		      "secondary-icon-sensitive", active,
+		      NULL);
 }
 
 static void
-connect_dialog_request_additional_details (NautilusConnectServerDialog *self,
-					   GAskPasswordFlags flags,
-					   const gchar *default_user,
-					   const gchar *default_domain)
+on_uri_entry_changed (GtkEditable                 *editable,
+		      NautilusConnectServerDialog *dialog)
 {
-	GtkWidget *content_area, *label, *hbox, *icon;
-
-	self->details->fill_details_flags = flags;
+	GtkTreeSelection *selection;
 
-	connect_dialog_restore_info_bar (self, GTK_MESSAGE_WARNING);
-
-	content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (self->details->info_bar));
-
-	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-	gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 6);
-	gtk_widget_show (hbox);
-
-	icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
-					 GTK_ICON_SIZE_SMALL_TOOLBAR);
-	gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 6);
-	gtk_widget_show (icon);
-
-	label = gtk_label_new (_("Please verify your user details."));
-	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
-	gtk_widget_show (label);
+	/* 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);
 
-	if (flags & G_ASK_PASSWORD_NEED_PASSWORD) {
-		iconize_entry (self, self->details->password_entry);
-	}
+	check_uri_entry (dialog);
+}
 
-	if (flags & G_ASK_PASSWORD_NEED_USERNAME) {
-		if (default_user != NULL && g_strcmp0 (default_user, "") != 0) {
-			gtk_entry_set_text (GTK_ENTRY (self->details->user_entry),
-					    default_user);
-		} else {
-			iconize_entry (self, self->details->user_entry);
-		}
-	}
+static char *
+get_selected (NautilusConnectServerDialog *dialog,
+	      GtkTreeIter                 *iter_out)
+{
+	GtkTreeSelection *selection;
+	GtkTreeIter iter;
+	char *uri = NULL;
 
-	if (flags & G_ASK_PASSWORD_NEED_DOMAIN) {
-		if (default_domain != NULL && g_strcmp0 (default_domain, "") != 0) {
-			gtk_entry_set_text (GTK_ENTRY (self->details->domain_entry),
-					    default_domain);
-		} else {
-			iconize_entry (self, self->details->domain_entry);
+	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;
 		}
 	}
 
-	self->details->info_bar_content = hbox;
-
-	gtk_widget_set_sensitive (self->details->connect_button, TRUE);
-	gtk_button_set_label (GTK_BUTTON (self->details->connect_button),
-			      _("Continue"));
-
-	if (!(flags & G_ASK_PASSWORD_SAVING_SUPPORTED)) {
-		g_signal_handler_disconnect (self->details->password_entry,
-					     self->details->password_sensitive_id);
-		self->details->password_sensitive_id = 0;
-
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->details->remember_checkbox),
-					      FALSE);
-		gtk_widget_set_sensitive (self->details->remember_checkbox, FALSE);
-	}
+	return uri;
 }
 
 static void
-display_location_async_cb (GObject *source,
-			   GAsyncResult *res,
-			   gpointer user_data)
+on_selection_changed (GtkTreeSelection            *selection,
+		      NautilusConnectServerDialog *dialog)
 {
-	NautilusConnectServerDialog *dialog;
-	GError *error;
-
-	dialog = NAUTILUS_CONNECT_SERVER_DIALOG (source);
-	error = NULL;
-
-	nautilus_connect_server_dialog_display_location_finish (dialog,
-								res, &error);
-
-	if (error != NULL) {
-		connect_dialog_set_info_bar_error (dialog, error);
-		g_error_free (error);
+	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_destroy (GTK_WIDGET (dialog));
+		gtk_widget_set_sensitive (dialog->details->remove_menu_item, FALSE);
 	}
 }
 
-static void
-mount_enclosing_ready_cb (GObject *source,
-			  GAsyncResult *res,
-			  gpointer user_data)
+static GBookmarkFile *
+server_list_load (NautilusConnectServerDialog *dialog)
 {
-	GFile *location;
-	NautilusConnectServerDialog *dialog;
-	GError *error;
-
-	error = NULL;
-	location = G_FILE (source);
-	dialog = user_data;
-
-	g_file_mount_enclosing_volume_finish (location, res, &error);
-
-	if (!error || g_error_matches (error, G_IO_ERROR, G_IO_ERROR_ALREADY_MOUNTED)) {
-		/* volume is mounted, show it */
-		nautilus_connect_server_dialog_display_location_async (dialog, location,
-								       display_location_async_cb, NULL);
-	} else {
-		if (dialog->details->should_destroy) {
-			gtk_widget_destroy (GTK_WIDGET (dialog));
-		} else {
-			connect_dialog_set_info_bar_error (dialog, error);
-		}
-	}
-
-	g_clear_object (&dialog->details->mount_cancellable);
-
+	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
-connect_dialog_present_uri_async (NautilusConnectServerDialog *self,
-				  GFile *location)
+server_list_save (NautilusConnectServerDialog *dialog,
+		  GBookmarkFile               *bookmarks)
 {
-	GMountOperation *op;
-
-	self->details->mount_cancellable = g_cancellable_new ();
+	char *filename;
 
-	op = nautilus_connect_server_operation_new (self);
-	g_file_mount_enclosing_volume (location,
-				       0, op, self->details->mount_cancellable,
-				       mount_enclosing_ready_cb, self);
-	g_object_unref (op);
+	filename = g_build_filename (g_get_user_config_dir (), "nautilus", "servers", NULL);
+	g_bookmark_file_to_file (bookmarks, filename, NULL);
 }
 
 static void
-connect_dialog_connect_to_server (NautilusConnectServerDialog *dialog)
+populate_server_list (NautilusConnectServerDialog *dialog)
 {
-	struct MethodInfo *meth;
-	GFile *location;
-	int index;
+	GBookmarkFile *bookmarks;
 	GtkTreeIter iter;
-	char *user, *initial_path, *server, *folder, *domain, *port_str;
-	char *t, *join, *uri;
-	char *temp, *stripped_server;
-	double port;
-
-	/* Get our method info */
-	gtk_combo_box_get_active_iter (GTK_COMBO_BOX (dialog->details->type_combo), &iter);
-	gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (dialog->details->type_combo)),
-			    &iter, 0, &index, -1);
-	g_assert (index < G_N_ELEMENTS (methods) && index >= 0);
-	meth = &(methods[index]);
-
-	server = gtk_editable_get_chars (GTK_EDITABLE (dialog->details->server_entry), 0, -1);
-
-	temp = g_strconcat (meth->scheme, "://", NULL);
-	if (g_str_has_prefix (server, temp)) {
-		stripped_server = g_strdup (server + strlen (temp));
-		g_free (server);
-		server = stripped_server;
-	}
-	g_free (temp);
-
-	user = NULL;
-	initial_path = g_strdup ("");
-	domain = NULL;
-	folder = NULL;
-
-	if (meth->flags & IS_ANONYMOUS) {
-		/* FTP special case */
-		user = g_strdup ("anonymous");
-	} else if ((strcmp (meth->scheme, "smb") == 0) ||
-		   (strcmp (meth->scheme, "afp") == 0)){
-		/* SMB/AFP special case */
-		g_free (initial_path);
-
-		t = gtk_editable_get_chars (GTK_EDITABLE (dialog->details->share_entry), 0, -1);
-		initial_path = g_strconcat ("/", t, NULL);
-
-		g_free (t);
-	}
-
-	/* username */
-	if (!user) {
-		t = gtk_editable_get_chars (GTK_EDITABLE (dialog->details->user_entry), 0, -1);
-		user = g_uri_escape_string (t, G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO, FALSE);
-		g_free (t);
-	}
-
-	/* domain */
-	domain = gtk_editable_get_chars (GTK_EDITABLE (dialog->details->domain_entry), 0, -1);
-			
-	if (strlen (domain) != 0) {
-		t = user;
+	char **uris;
+	int i;
 
-		user = g_strconcat (domain , ";" , t, NULL);
-		g_free (t);
+	bookmarks = server_list_load (dialog);
+	if (bookmarks == NULL) {
+		return;
 	}
-
-	/* folder */
-	folder = gtk_editable_get_chars (GTK_EDITABLE (dialog->details->folder_entry), 0, -1);
-
-	if (folder[0] != 0 &&
-	    folder[0] != '/') {
-		join = "/";
+	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 {
-		join = "";
+		gtk_widget_set_sensitive (dialog->details->clear_menu_item, FALSE);
 	}
 
-	t = folder;
-	folder = g_strconcat (initial_path, join, t, NULL);
-	g_free (t);
-
-	t = folder;
-	folder = g_uri_escape_string (t, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, FALSE);
-	g_free (t);
+	g_bookmark_file_free (bookmarks);
+}
 
-	/* port */
-	port = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->details->port_spinbutton));
+static void
+server_list_remove (NautilusConnectServerDialog *dialog,
+		    const char                  *uri)
+{
+	GBookmarkFile *bookmarks;
 
-	if (port != 0 && port != meth->default_port) {
-		port_str = g_strdup_printf ("%d", (int) port);
-	} else {
-		port_str = NULL;
+	bookmarks = server_list_load (dialog);
+	if (bookmarks == NULL) {
+		return;
 	}
 
-	/* final uri */
-	uri = g_strdup_printf ("%s://%s%s%s%s%s%s",
-			       meth->scheme,
-			       (user != NULL) ? user : "",
-			       (user[0] != 0) ? "@" : "",
-			       server,
-			       (port_str != NULL) ? ":" : "",
-			       (port_str != NULL) ? port_str : "",
-			       (folder != NULL) ? folder : "");
-
-	g_free (initial_path);
-	g_free (server);
-	g_free (folder);
-	g_free (user);
-	g_free (domain);
-	g_free (port_str);
-
-	location = g_file_new_for_uri (uri);
-	g_free (uri);
-
-	connect_dialog_set_connecting (dialog);
-	connect_dialog_present_uri_async (dialog,
-					  location);
-
-	g_object_unref (location);
+	g_bookmark_file_remove_item (bookmarks, uri, NULL);
+	server_list_save (dialog, bookmarks);
+	g_bookmark_file_free (bookmarks);
 }
 
 static void
-connect_to_server_or_finish_fill (NautilusConnectServerDialog *dialog)
+server_list_remove_all (NautilusConnectServerDialog *dialog)
 {
-	if (dialog->details->fill_details_res != NULL) {
-		connect_dialog_finish_fill (dialog);
-	} else {
-		connect_dialog_connect_to_server (dialog);
+	GBookmarkFile *bookmarks;
+
+	bookmarks = g_bookmark_file_new ();
+	if (bookmarks == NULL) {
+		return;
 	}
+	server_list_save (dialog, bookmarks);
+	g_bookmark_file_free (bookmarks);
 }
 
-static gboolean
-connect_dialog_abort_mount_operation (NautilusConnectServerDialog *dialog)
+static void
+boldify_label (GtkLabel *label)
 {
-	gboolean retval = FALSE;
-
-	if (dialog->details->mount_cancellable != NULL) {
-		g_cancellable_cancel (dialog->details->mount_cancellable);
-		retval = TRUE;
-	} else if (dialog->details->fill_details_res != NULL) {
-		g_simple_async_result_set_op_res_gboolean (dialog->details->fill_details_res, FALSE);
-		g_simple_async_result_complete (dialog->details->fill_details_res);
-
-		g_object_unref (dialog->details->fill_details_res);
-		dialog->details->fill_details_res = NULL;
-
-		if (dialog->details->fill_operation) {
-			g_object_unref (dialog->details->fill_operation);
-			dialog->details->fill_operation = NULL;
-		}
-
-		retval = TRUE;
-	}
-
-	return retval;
+	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
-connect_dialog_destroy (NautilusConnectServerDialog *dialog)
+on_clear_item_activated (GtkMenuItem                 *item,
+			 NautilusConnectServerDialog *dialog)
 {
-	if (connect_dialog_abort_mount_operation (dialog)) {
-		dialog->details->should_destroy = TRUE;
-		gtk_widget_hide (GTK_WIDGET (dialog));
-	} else {
-		gtk_widget_destroy (GTK_WIDGET (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
-connect_dialog_response_cb (NautilusConnectServerDialog *dialog,
-			    int response_id,
-			    gpointer data)
+on_remove_item_activated (GtkMenuItem                 *item,
+			  NautilusConnectServerDialog *dialog)
 {
-	GError *error;
+	char *uri;
+	GtkTreeIter iter;
 
-	switch (response_id) {
-	case RESPONSE_CONNECT:
-		connect_to_server_or_finish_fill (dialog);
-		break;
-	case GTK_RESPONSE_NONE:
-	case GTK_RESPONSE_DELETE_EVENT:
-	case GTK_RESPONSE_CANCEL:
-		connect_dialog_destroy (dialog);
-		break;
-	case GTK_RESPONSE_HELP :
-		error = NULL;
-		gtk_show_uri (gtk_window_get_screen (GTK_WINDOW (dialog)),
-			      "help:gnome-help/nautilus-connect",
-			      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 ();
+	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
-connect_dialog_cleanup (NautilusConnectServerDialog *dialog)
+on_row_activated (GtkTreeView                 *tree_view,
+		  GtkTreePath                 *path,
+		  GtkTreeViewColumn           *column,
+		  NautilusConnectServerDialog *dialog)
 {
-	/* hide the infobar */
-	gtk_widget_hide (dialog->details->info_bar);
-
-	/* set the connect button label back to 'Connect' */
-	gtk_button_set_label (GTK_BUTTON (dialog->details->connect_button),
-			      _("C_onnect"));
-
-	/* if there was a pending mount operation, cancel it. */
-	connect_dialog_abort_mount_operation (dialog);
-
-	/* restore password checkbox sensitivity */
-	if (dialog->details->password_sensitive_id == 0) {
-		dialog->details->password_sensitive_id =
-			g_signal_connect (dialog->details->password_entry, "changed",
-					  G_CALLBACK (sensitive_entry_changed_callback),
-					  dialog->details->remember_checkbox);
-		sensitive_entry_changed_callback (GTK_EDITABLE (dialog->details->password_entry),
-						  dialog->details->remember_checkbox);
-	}
-
-	/* remove icons on the entries */
-	g_list_foreach (dialog->details->iconized_entries,
-			(GFunc) iconized_entry_restore, dialog);
-	g_list_free (dialog->details->iconized_entries);
-	dialog->details->iconized_entries = NULL;
-
-	dialog->details->last_password_set = FALSE;
+	gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
 }
 
-
 static void
-connect_dialog_setup_for_type (NautilusConnectServerDialog *dialog)
+on_popup_menu_detach (GtkWidget *attach_widget,
+		      GtkMenu   *menu)
 {
-	struct MethodInfo *meth;
-	int index;;
-	GtkTreeIter iter;
+	NautilusConnectServerDialog *dialog = NAUTILUS_CONNECT_SERVER_DIALOG (attach_widget);
 
-	connect_dialog_cleanup (dialog);
+	dialog->details->menu = NULL;
+	dialog->details->remove_menu_item = NULL;
+	dialog->details->clear_menu_item = NULL;
+}
 
-	/* get our method info */
-	if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (dialog->details->type_combo),
-					    &iter)) {
-		/* there are no entries in the combo, something is wrong
-		 * with our GVfs installation.
-		 */
-		connect_dialog_gvfs_error (dialog);
+static void
+create_popup_menu (NautilusConnectServerDialog *dialog)
+{
+	GtkWidget *menu;
+	GtkWidget *item;
 
+	if (dialog->details->menu != NULL) {
 		return;
 	}
 
-	gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (dialog->details->type_combo)),
-			    &iter, 0, &index, -1);
-	g_assert (index < G_N_ELEMENTS (methods) && index >= 0);
-	meth = &(methods[index]);
+	menu = gtk_menu_new ();
+	dialog->details->menu = menu;
+	gtk_menu_attach_to_widget (GTK_MENU (menu),
+			           GTK_WIDGET (dialog),
+			           on_popup_menu_detach);
 
-	g_object_set (dialog->details->share_entry,
-		      "visible",
-		      (meth->flags & SHOW_SHARE) != 0,
-		      NULL);
+	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);
 
-	g_object_set (dialog->details->port_spinbutton,
-		      "sensitive",
-		      (meth->flags & SHOW_PORT) != 0,
-		      "value", (gdouble) meth->default_port,
-		      NULL);
-
-	g_object_set (dialog->details->user_details,
-		      "visible",
-		      (meth->flags & SHOW_USER) != 0 ||
-		      (meth->flags & SHOW_DOMAIN) != 0,
-		      NULL);
-
-	g_object_set (dialog->details->user_entry,
-		      "visible",
-		      (meth->flags & SHOW_USER) != 0,
-		      NULL);
-
-	g_object_set (dialog->details->password_entry,
-		      "visible",
-		      (meth->flags & SHOW_USER) != 0,
-		      NULL);
+	eel_gtk_menu_append_separator (GTK_MENU (menu));
 
-	g_object_set (dialog->details->domain_entry,
-		      "visible",
-		      (meth->flags & SHOW_DOMAIN) != 0,
-		      NULL);
+	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
-sensitive_entry_changed_callback (GtkEditable *editable,
-				  GtkWidget *widget)
+history_popup_menu (NautilusConnectServerDialog *dialog)
 {
-	guint length;
-
-	length = gtk_entry_get_text_length (GTK_ENTRY (editable));
-
-	gtk_widget_set_sensitive (widget, length > 0);
+	create_popup_menu (dialog);
+	eel_pop_up_context_menu (GTK_MENU (dialog->details->menu), NULL);
 }
 
-static void
-bind_visibility (NautilusConnectServerDialog *dialog,
-		 GtkWidget *source,
-		 GtkWidget *dest)
+static gboolean
+on_popup_menu (GtkWidget                   *widget,
+	       NautilusConnectServerDialog *dialog)
 {
-	g_object_bind_property (source,
-				"visible",
-				dest,
-				"visible",
-				G_BINDING_DEFAULT);
+	history_popup_menu (dialog);
+	return TRUE;
 }
 
 static void
 nautilus_connect_server_dialog_init (NautilusConnectServerDialog *dialog)
 {
 	GtkWidget *label;
-	GtkWidget *alignment;
+	GtkWidget *button;
+	GtkWidget *sw;
+	GtkWidget *view;
+	GtkWidget *box;
 	GtkWidget *content_area;
-	GtkWidget *combo, *grid;
-	GtkWidget *hbox, *connect_button, *checkbox;
+	GtkWidget *grid;
+	int row;
+	GtkCellRenderer *cell;
+	GtkTreeSelection *selection;
 	GtkListStore *store;
-	GtkCellRenderer *renderer;
-	gchar *str;
-	int i;
-	
+
 	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), 6);
-	gtk_box_set_spacing (GTK_BOX (content_area), 2);
-	gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
-
-	/* create the size group */
-	dialog->details->labels_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-	dialog->details->contents_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-
-	/* infobar */
-	dialog->details->info_bar = gtk_info_bar_new ();
-	gtk_info_bar_set_message_type (GTK_INFO_BAR (dialog->details->info_bar),
-				       GTK_MESSAGE_INFO);
-	gtk_box_pack_start (GTK_BOX (content_area), dialog->details->info_bar,
-			    FALSE, FALSE, 6);
-
-	/* server settings label */
-	label = gtk_label_new (NULL);
-	str = g_strdup_printf ("<b>%s</b>", _("Server Details"));
-	gtk_label_set_markup (GTK_LABEL (label), str);
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_box_pack_start (GTK_BOX (content_area), label, FALSE, FALSE, 6);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
-	gtk_widget_show (label);
-
-	/* server settings alignment */
-	alignment = gtk_alignment_new (0, 0, 0, 0);
-	gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
-				   0, 0, 12, 0);
-	gtk_box_pack_start (GTK_BOX (content_area), alignment, TRUE, TRUE, 0);
-	gtk_widget_show (alignment);
+	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), 3);
-	gtk_container_add (GTK_CONTAINER (alignment), grid);
+	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;
 
-	/* first row: server entry + port spinbutton */
-	label = gtk_label_new_with_mnemonic (_("_Server:"));
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_container_add (GTK_CONTAINER (grid), label);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
-	gtk_widget_show (label);
+	row = 0;
 
-	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-	gtk_widget_show (hbox);
-	gtk_grid_attach_next_to (GTK_GRID (grid), hbox, label,
-				 GTK_POS_RIGHT,
-				 1, 1);
-	gtk_size_group_add_widget (dialog->details->contents_size_group, hbox);
-
-	dialog->details->server_entry = gtk_entry_new ();
-	gtk_entry_set_activates_default (GTK_ENTRY (dialog->details->server_entry), TRUE);
-	gtk_box_pack_start (GTK_BOX (hbox), dialog->details->server_entry, FALSE, FALSE, 0);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->server_entry);
-	gtk_widget_show (dialog->details->server_entry);
-
-	/* port */
-	label = gtk_label_new_with_mnemonic (_("_Port:"));
+	label = gtk_label_new_with_mnemonic (_("_Server Address"));
+	boldify_label (GTK_LABEL (label));
 	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+	gtk_grid_attach (GTK_GRID (grid), label, 0, row++, 1, 1);
 	gtk_widget_show (label);
 
-	dialog->details->port_spinbutton =
-		gtk_spin_button_new_with_range (0.0, 65535.0, 1.0);
-	g_object_set (dialog->details->port_spinbutton,
-		      "digits", 0,
-		      "numeric", TRUE,
-		      "update-policy", GTK_UPDATE_IF_VALID,
-		      NULL);
-	gtk_box_pack_start (GTK_BOX (hbox), dialog->details->port_spinbutton,
-			    FALSE, FALSE, 0);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->port_spinbutton);
-	gtk_widget_show (dialog->details->port_spinbutton);
+	dialog->details->uri_entry = gtk_entry_new ();
 
-	/* second row: type combobox */
-	label = gtk_label_new_with_mnemonic (_("_Type:"));
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_container_add (GTK_CONTAINER (grid), label);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
-	gtk_widget_show (label);
+	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);
 
-	dialog->details->type_combo = combo = gtk_combo_box_new ();
-	gtk_size_group_add_widget (dialog->details->contents_size_group, dialog->details->type_combo);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->type_combo);
+	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->uri_entry);
+	gtk_widget_show (dialog->details->uri_entry);
 
-	/* each row contains: method index, textual description */
-	store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
-	gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (store));
-	g_object_unref (store);
-
-	renderer = gtk_cell_renderer_text_new ();
-	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
-	gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), renderer, "text", 1);
-
-	for (i = 0; i < G_N_ELEMENTS (methods); i++) {
-		GtkTreeIter iter;
-		const gchar * const *supported;
-		int j;
-
-		/* skip methods that don't have corresponding gvfs uri schemes */
-		supported = g_vfs_get_supported_uri_schemes (g_vfs_get_default ());
-
-		if (methods[i].scheme != NULL) {
-			gboolean found;
-
-			found = FALSE;
-			for (j = 0; supported[j] != NULL; j++) {
-				if (strcmp (methods[i].scheme, supported[j]) == 0) {
-					found = TRUE;
-					break;
-				}
-			}
-
-			if (!found) {
-				continue;
-			}
-		}
-
-		gtk_list_store_append (store, &iter);
-		gtk_list_store_set (store, &iter,
-				    0, i,
-				    1, get_method_description (&(methods[i])),
-				    -1);
-
-
-		if (methods[i].flags & DEFAULT_METHOD) {
-			gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
-		}
-	}
-
-	if (gtk_combo_box_get_active (GTK_COMBO_BOX (combo)) < 0) {
-		/* default method not available, use any other */
-		gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
-	}
-
-	gtk_widget_show (combo);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
-	gtk_grid_attach_next_to (GTK_GRID (grid), combo, label,
-				 GTK_POS_RIGHT, 1, 1);
-	g_signal_connect_swapped (combo, "changed",
-				  G_CALLBACK (connect_dialog_setup_for_type),
-				  dialog);
-
-	/* third row: share entry */
-	label = gtk_label_new_with_mnemonic (_("Sh_are:"));
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_container_add (GTK_CONTAINER (grid), label);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
-
-	dialog->details->share_entry = gtk_entry_new ();
-	gtk_entry_set_activates_default (GTK_ENTRY (dialog->details->share_entry), TRUE);
-	gtk_grid_attach_next_to (GTK_GRID (grid), dialog->details->share_entry, label,
-				 GTK_POS_RIGHT, 1, 1);
-	gtk_size_group_add_widget (dialog->details->contents_size_group, dialog->details->share_entry);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->share_entry);
-
-	bind_visibility (dialog, dialog->details->share_entry, label);
-
-	/* fourth row: folder entry */
-	label = gtk_label_new_with_mnemonic (_("_Folder:"));
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_container_add (GTK_CONTAINER (grid), label);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->share_entry);
-	gtk_widget_show (label);
-
-	dialog->details->folder_entry = gtk_entry_new ();
-	gtk_entry_set_text (GTK_ENTRY (dialog->details->folder_entry), "/");
-	gtk_entry_set_activates_default (GTK_ENTRY (dialog->details->folder_entry), TRUE);
-	gtk_grid_attach_next_to (GTK_GRID (grid), dialog->details->folder_entry, label,
-				 GTK_POS_RIGHT, 1, 1);
-	gtk_size_group_add_widget (dialog->details->contents_size_group, dialog->details->folder_entry);
-	gtk_widget_show (dialog->details->folder_entry);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->folder_entry);
-
-	/* user details label */
 	label = gtk_label_new (NULL);
-	str = g_strdup_printf ("<b>%s</b>", _("User Details"));
-	gtk_label_set_markup (GTK_LABEL (label), str);
 	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
-	gtk_box_pack_start (GTK_BOX (content_area), label, FALSE, FALSE, 6);
-
-	/* user details alignment */
-	alignment = gtk_alignment_new (0, 0, 0, 0);
-	gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
-				   0, 0, 12, 0);
-	gtk_box_pack_start (GTK_BOX (content_area), alignment, TRUE, TRUE, 0);
-
-	bind_visibility (dialog, alignment, label);
-	dialog->details->user_details = alignment;
-
-	grid = gtk_grid_new ();
-	gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
-	gtk_grid_set_column_spacing (GTK_GRID (grid), 3);
-	gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_VERTICAL);
-	gtk_container_add (GTK_CONTAINER (alignment), grid);
-	gtk_widget_show (grid);
+	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");
 
-	/* first row: domain entry */
-	label = gtk_label_new_with_mnemonic (_("_Domain name:"));
+	label = gtk_label_new_with_mnemonic (_("_Recent Servers"));
+	boldify_label (GTK_LABEL (label));
 	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_container_add (GTK_CONTAINER (grid), label);
+	gtk_grid_attach (GTK_GRID (grid), label, 0, row++, 1, 1);
+	gtk_widget_show (label);
 
-	dialog->details->domain_entry = gtk_entry_new ();
-	gtk_entry_set_activates_default (GTK_ENTRY (dialog->details->domain_entry), TRUE);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
-	gtk_grid_attach_next_to (GTK_GRID (grid), dialog->details->domain_entry, label,
-				 GTK_POS_RIGHT, 1, 1);
+	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);
 
-	gtk_size_group_add_widget (dialog->details->contents_size_group, dialog->details->domain_entry);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->domain_entry);
-	bind_visibility (dialog, dialog->details->domain_entry, label);
+	store = gtk_list_store_new (NUM_COLUMNS,
+				    G_TYPE_STRING,
+				    G_TYPE_STRING);
 
-	/* second row: username entry */
-	label = gtk_label_new_with_mnemonic (_("_User name:"));
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_container_add (GTK_CONTAINER (grid), label);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
+	gtk_tree_view_set_model (GTK_TREE_VIEW (view),
+				 GTK_TREE_MODEL (store));
+	g_object_unref (store);
 
-	dialog->details->user_entry = gtk_entry_new ();
-	gtk_entry_set_activates_default (GTK_ENTRY (dialog->details->user_entry), TRUE);
-	gtk_grid_attach_next_to (GTK_GRID (grid), dialog->details->user_entry, label,
-				 GTK_POS_RIGHT, 1, 1);
-	gtk_size_group_add_widget (dialog->details->contents_size_group, dialog->details->user_entry);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->user_entry);
+	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+	g_signal_connect (selection, "changed",
+			  G_CALLBACK (on_selection_changed),
+			  dialog);
 
-	bind_visibility (dialog, dialog->details->user_entry, label);
+	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;
+
+	button = gtk_dialog_add_button (GTK_DIALOG (dialog),
+					_("_Browse"),
+					GTK_RESPONSE_ACCEPT);
+	gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog))),
+					    button, TRUE);
 
-	/* third row: password entry */
-	label = gtk_label_new_with_mnemonic (_("Pass_word:"));
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_container_add (GTK_CONTAINER (grid), label);
-	gtk_size_group_add_widget (dialog->details->labels_size_group, label);
-
-	dialog->details->password_entry = gtk_entry_new ();
-	gtk_entry_set_activates_default (GTK_ENTRY (dialog->details->password_entry), TRUE);
-	gtk_entry_set_visibility (GTK_ENTRY (dialog->details->password_entry), FALSE);
-	gtk_grid_attach_next_to (GTK_GRID (grid), dialog->details->password_entry, label,
-				 GTK_POS_RIGHT, 1, 1);
-	gtk_size_group_add_widget (dialog->details->contents_size_group, dialog->details->password_entry);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->details->password_entry);
-
-	bind_visibility (dialog, dialog->details->password_entry, label);
-
-	/* fourth row: remember checkbox */
-	checkbox = gtk_check_button_new_with_mnemonic (_("_Remember this password"));
-	gtk_grid_attach_next_to (GTK_GRID (grid), checkbox, dialog->details->password_entry,
-				 GTK_POS_BOTTOM, 1, 1);
-	dialog->details->remember_checkbox = checkbox;
-
-	bind_visibility (dialog, dialog->details->password_entry, checkbox);
-
-        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);
-	connect_button = gtk_dialog_add_button (GTK_DIALOG (dialog),
-						_("C_onnect"),
-						RESPONSE_CONNECT);
+	gtk_dialog_add_button (GTK_DIALOG (dialog),
+			       _("C_onnect"),
+			       GTK_RESPONSE_OK);
 	gtk_dialog_set_default_response (GTK_DIALOG (dialog),
-					 RESPONSE_CONNECT);
-	dialog->details->connect_button = connect_button;
+					 GTK_RESPONSE_OK);
+	gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
+					   GTK_RESPONSE_OK,
+					   FALSE);
 
-	g_signal_connect (dialog->details->server_entry, "changed",
-			  G_CALLBACK (sensitive_entry_changed_callback),
-			  connect_button);
-	sensitive_entry_changed_callback (GTK_EDITABLE (dialog->details->server_entry),
-					  connect_button);
+	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);
 
 	g_signal_connect (dialog, "response",
-			  G_CALLBACK (connect_dialog_response_cb),
-			  dialog);
+			  G_CALLBACK (nautilus_connect_server_dialog_response),
+			  NULL);
 
-	connect_dialog_setup_for_type (dialog);
+	create_popup_menu (dialog);
+	populate_server_list (dialog);
 }
 
 static void
@@ -1134,12 +719,7 @@ nautilus_connect_server_dialog_finalize (GObject *object)
 
 	dialog = NAUTILUS_CONNECT_SERVER_DIALOG (object);
 
-	connect_dialog_abort_mount_operation (dialog);
-
-	if (dialog->details->iconized_entries != NULL) {
-		g_list_free (dialog->details->iconized_entries);
-		dialog->details->iconized_entries = NULL;
-	}
+	g_strfreev (dialog->details->supported);
 
 	G_OBJECT_CLASS (nautilus_connect_server_dialog_parent_class)->finalize (object);
 }
@@ -1169,97 +749,3 @@ nautilus_connect_server_dialog_new (NautilusWindow *window)
 
 	return dialog;
 }
-
-gboolean
-nautilus_connect_server_dialog_fill_details_finish (NautilusConnectServerDialog *self,
-						    GAsyncResult *result)
-{
-	return g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (result));
-}
-
-void
-nautilus_connect_server_dialog_fill_details_async (NautilusConnectServerDialog *self,
-						   GMountOperation *operation,
-						   const gchar *default_user,
-						   const gchar *default_domain,
-						   GAskPasswordFlags flags,
-						   GAsyncReadyCallback callback,
-						   gpointer user_data)
-{
-	GSimpleAsyncResult *fill_details_res;
-	const gchar *str;
-	GAskPasswordFlags set_flags;
-
-	if (g_cancellable_is_cancelled (self->details->mount_cancellable)) {
-		g_simple_async_report_error_in_idle (G_OBJECT (self),
-						     callback, user_data,
-						     G_IO_ERROR, G_IO_ERROR_CANCELLED,
-						     "%s", _("Operation cancelled"));
-
-		return;
-	}
-
-	fill_details_res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-						      nautilus_connect_server_dialog_fill_details_async);
-
-	self->details->fill_details_res = fill_details_res;
-	set_flags = (flags & G_ASK_PASSWORD_NEED_PASSWORD) |
-		(flags & G_ASK_PASSWORD_NEED_USERNAME) |
-		(flags & G_ASK_PASSWORD_NEED_DOMAIN);
-
-	if (set_flags & G_ASK_PASSWORD_NEED_PASSWORD) {
-		/* provide the password */
-		str = gtk_entry_get_text (GTK_ENTRY (self->details->password_entry));
-
-		if (str != NULL && g_strcmp0 (str, "") != 0 &&
-		    !self->details->last_password_set) {
-			g_mount_operation_set_password (G_MOUNT_OPERATION (operation),
-							str);
-			set_flags ^= G_ASK_PASSWORD_NEED_PASSWORD;
-			
-			if (flags & G_ASK_PASSWORD_SAVING_SUPPORTED &&
-			    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->details->remember_checkbox))) {
-				g_mount_operation_set_password_save (G_MOUNT_OPERATION (operation),
-								     G_PASSWORD_SAVE_PERMANENTLY);
-			}
-
-			self->details->last_password_set = TRUE;
-		}
-	}
-
-	if (set_flags & G_ASK_PASSWORD_NEED_USERNAME) {
-		/* see if the default username is different from ours */
-		str = gtk_entry_get_text (GTK_ENTRY (self->details->user_entry));
-
-		if (str != NULL && g_strcmp0 (str, "") != 0 &&
-		    g_strcmp0 (str, default_user) != 0) {
-			g_mount_operation_set_username (G_MOUNT_OPERATION (operation),
-							str);
-			set_flags ^= G_ASK_PASSWORD_NEED_USERNAME;
-		}
-	}
-
-	if (set_flags & G_ASK_PASSWORD_NEED_DOMAIN) {
-		/* see if the default domain is different from ours */
-		str = gtk_entry_get_text (GTK_ENTRY (self->details->domain_entry));
-
-		if (str != NULL && g_strcmp0 (str, "") &&
-		    g_strcmp0 (str, default_domain) != 0) {
-			g_mount_operation_set_domain (G_MOUNT_OPERATION (operation),
-						      str);
-			set_flags ^= G_ASK_PASSWORD_NEED_DOMAIN;
-		}
-	}
-
-	if (set_flags != 0) {
-		set_flags |= (flags & G_ASK_PASSWORD_SAVING_SUPPORTED);
-		self->details->fill_operation = g_object_ref (operation);
-		connect_dialog_request_additional_details (self, set_flags, default_user, default_domain);
-	} else {
-		g_simple_async_result_set_op_res_gboolean (fill_details_res, TRUE);
-		g_simple_async_result_complete (fill_details_res);
-		g_object_unref (self->details->fill_details_res);
-
-		self->details->fill_details_res = NULL;
-	}
-}
diff --git a/src/nautilus-connect-server-dialog.h b/src/nautilus-connect-server-dialog.h
index bd2dc3d..e42c4b8 100644
--- a/src/nautilus-connect-server-dialog.h
+++ b/src/nautilus-connect-server-dialog.h
@@ -56,24 +56,7 @@ struct _NautilusConnectServerDialogClass {
 
 GType nautilus_connect_server_dialog_get_type (void);
 
-GtkWidget* nautilus_connect_server_dialog_new (NautilusWindow *window);
-
-void nautilus_connect_server_dialog_display_location_async (NautilusConnectServerDialog *self,
-							    GFile *location,
-							    GAsyncReadyCallback callback,
-							    gpointer user_data);
-gboolean nautilus_connect_server_dialog_display_location_finish (NautilusConnectServerDialog *self,
-								 GAsyncResult *result,
-								 GError **error);
-
-void nautilus_connect_server_dialog_fill_details_async (NautilusConnectServerDialog *self,
-							GMountOperation *operation,
-							const gchar *default_user,
-							const gchar *default_domain,
-							GAskPasswordFlags flags,
-							GAsyncReadyCallback callback,
-							gpointer user_data);
-gboolean nautilus_connect_server_dialog_fill_details_finish (NautilusConnectServerDialog *self,
-							     GAsyncResult *result);
+GtkWidget * nautilus_connect_server_dialog_new          (NautilusWindow *window);
+GFile *     nautilus_connect_server_dialog_get_location (NautilusConnectServerDialog *dialog);
 
 #endif /* NAUTILUS_CONNECT_SERVER_DIALOG_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]