#include <glib/gi18n-lib.h>
#include <gtk/gtk.h>
-#include <libmissioncontrol/mc-account.h>
-#include <libmissioncontrol/mc-protocol.h>
-
#include <libempathy/empathy-utils.h>
-#include <libempathy/empathy-irc-network-manager.h>
#include "empathy-irc-network-dialog.h"
+#include "empathy-irc-network-chooser.h"
#include "empathy-account-widget.h"
+#include "empathy-account-widget-private.h"
#include "empathy-account-widget-irc.h"
#include "empathy-ui-utils.h"
#define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
#include <libempathy/empathy-debug.h>
-#define IRC_NETWORKS_FILENAME "irc-networks.xml"
-
typedef struct {
- McAccount *account;
- EmpathyIrcNetworkManager *network_manager;
+ EmpathyAccountWidget *self;
GtkWidget *vbox_settings;
- GtkWidget *combobox_network;
+ GtkWidget *network_chooser;
} EmpathyAccountWidgetIrc;
-enum {
- COL_NETWORK_OBJ,
- COL_NETWORK_NAME,
-};
-
static void
account_widget_irc_destroy_cb (GtkWidget *widget,
EmpathyAccountWidgetIrc *settings)
{
- g_object_unref (settings->network_manager);
- g_object_unref (settings->account);
g_slice_free (EmpathyAccountWidgetIrc, settings);
}
static void
-unset_server_params (EmpathyAccountWidgetIrc *settings)
-{
- DEBUG ("Unset server, port and use-ssl");
- mc_account_unset_param (settings->account, "server");
- mc_account_unset_param (settings->account, "port");
- mc_account_unset_param (settings->account, "use-ssl");
-}
-
-static void
-update_server_params (EmpathyAccountWidgetIrc *settings)
+account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
{
- GtkTreeIter iter;
- GtkTreeModel *model;
- EmpathyIrcNetwork *network;
- GSList *servers;
- gchar *charset;
-
- if (!gtk_combo_box_get_active_iter (
- GTK_COMBO_BOX (settings->combobox_network), &iter))
- {
- unset_server_params (settings);
- return;
- }
+ const gchar *nick = NULL;
+ const gchar *fullname = NULL;
+ EmpathyAccountSettings *ac_settings;
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
- gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
+ g_object_get (settings->self, "settings", &ac_settings, NULL);
- g_assert (network != NULL);
+ nick = empathy_account_settings_get_string (ac_settings, "account");
+ fullname = empathy_account_settings_get_string (ac_settings,
+ "fullname");
- g_object_get (network, "charset", &charset, NULL);
- DEBUG ("Setting charset to %s", charset);
- mc_account_set_param_string (settings->account, "charset", charset);
- g_free (charset);
-
- servers = empathy_irc_network_get_servers (network);
- if (g_slist_length (servers) > 0)
+ if (!nick)
{
- /* set the first server as CM server */
- EmpathyIrcServer *server = servers->data;
- gchar *address;
- guint port;
- gboolean ssl;
-
- g_object_get (server,
- "address", &address,
- "port", &port,
- "ssl", &ssl,
- NULL);
-
- DEBUG ("Setting server to %s", address);
- mc_account_set_param_string (settings->account, "server", address);
- DEBUG ("Setting port to %u", port);
- mc_account_set_param_int (settings->account, "port", port);
- DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" );
- mc_account_set_param_boolean (settings->account, "use-ssl", ssl);
-
- g_free (address);
+ nick = g_strdup (g_get_user_name ());
+ empathy_account_settings_set_string (ac_settings,
+ "account", nick);
}
- else
+
+ if (!fullname)
{
- /* No server. Unset values */
- unset_server_params (settings);
+ fullname = g_strdup (g_get_real_name ());
+ if (!fullname)
+ {
+ fullname = g_strdup (nick);
+ }
+ empathy_account_settings_set_string (ac_settings,
+ "fullname", fullname);
}
-
- g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
- g_slist_free (servers);
- g_object_unref (network);
-}
-
-static void
-irc_network_dialog_destroy_cb (GtkWidget *widget,
- EmpathyAccountWidgetIrc *settings)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- EmpathyIrcNetwork *network;
- gchar *name;
-
- /* name could be changed */
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
- &iter);
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
- gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
-
- g_object_get (network, "name", &name, NULL);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
- COL_NETWORK_NAME, name, -1);
-
- update_server_params (settings);
-
- g_object_unref (network);
- g_free (name);
-}
-
-static void
-display_irc_network_dialog (EmpathyAccountWidgetIrc *settings,
- EmpathyIrcNetwork *network)
-{
- GtkWindow *window;
- GtkWidget *dialog;
-
- window = empathy_get_toplevel_window (settings->vbox_settings);
- dialog = empathy_irc_network_dialog_show (network, GTK_WIDGET (window));
- g_signal_connect (dialog, "destroy",
- G_CALLBACK (irc_network_dialog_destroy_cb), settings);
}
static void
-account_widget_irc_button_edit_network_clicked_cb (
- GtkWidget *button,
+network_changed_cb (EmpathyIrcNetworkChooser *chooser,
EmpathyAccountWidgetIrc *settings)
{
- GtkTreeIter iter;
- GtkTreeModel *model;
- EmpathyIrcNetwork *network;
-
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
- &iter);
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
- gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
-
- g_assert (network != NULL);
-
- display_irc_network_dialog (settings, network);
-
- g_object_unref (network);
+ empathy_account_widget_changed (settings->self);
}
-static void
-account_widget_irc_button_remove_clicked_cb (GtkWidget *button,
- EmpathyAccountWidgetIrc *settings)
+/**
+ * set_password_prompt_if_needed:
+ *
+ * If @password is not empty, this function sets the 'password-prompt' param
+ * on @ac_settings. This will ensure that Idle actually asks for the password
+ * when connecting.
+ *
+ * Return: %TRUE if the password-prompt param has been changed
+ */
+static gboolean
+set_password_prompt_if_needed (EmpathyAccountSettings *ac_settings,
+ const gchar *password)
{
- EmpathyIrcNetwork *network;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *name;
-
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
- &iter);
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
- gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
+ gboolean prompt;
- g_assert (network != NULL);
+ prompt = !tp_str_empty (password);
- g_object_get (network, "name", &name, NULL);
- DEBUG ("Remove network %s", name);
+ if (prompt == empathy_account_settings_get_boolean (ac_settings,
+ "password-prompt"))
+ return FALSE;
- gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
- empathy_irc_network_manager_remove (settings->network_manager, network);
+ empathy_account_settings_set_boolean (ac_settings, "password-prompt",
+ prompt);
- /* Select the first network */
- if (gtk_tree_model_get_iter_first (model, &iter))
- {
- gtk_combo_box_set_active_iter (
- GTK_COMBO_BOX (settings->combobox_network), &iter);
- }
-
- g_free (name);
- g_object_unref (network);
+ return TRUE;
}
static void
-account_widget_irc_button_add_network_clicked_cb (GtkWidget *button,
- EmpathyAccountWidgetIrc *settings)
+entry_password_changed_cb (GtkEntry *entry,
+ EmpathyAccountWidgetIrc *settings)
{
- EmpathyIrcNetwork *network;
- GtkTreeModel *model;
- GtkListStore *store;
- gchar *name;
- GtkTreeIter iter;
-
- network = empathy_irc_network_new (_("New Network"));
- empathy_irc_network_manager_add (settings->network_manager, network);
-
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
- store = GTK_LIST_STORE (model);
+ const gchar *password;
+ EmpathyAccountSettings *ac_settings;
- g_object_get (network, "name", &name, NULL);
+ g_object_get (settings->self, "settings", &ac_settings, NULL);
- gtk_list_store_insert_with_values (store, &iter, -1,
- COL_NETWORK_OBJ, network,
- COL_NETWORK_NAME, name,
- -1);
+ password = gtk_entry_get_text (entry);
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (settings->combobox_network),
- &iter);
+ set_password_prompt_if_needed (ac_settings, password);
- display_irc_network_dialog (settings, network);
-
- g_free (name);
- g_object_unref (network);
+ g_object_unref (ac_settings);
}
-static void
-account_widget_irc_combobox_network_changed_cb (GtkWidget *combobox,
- EmpathyAccountWidgetIrc *settings)
+EmpathyIrcNetworkChooser *
+empathy_account_widget_irc_build (EmpathyAccountWidget *self,
+ const char *filename,
+ GtkWidget **table_common_settings)
{
- update_server_params (settings);
-}
-
-static void
-fill_networks_model (EmpathyAccountWidgetIrc *settings,
- EmpathyIrcNetwork *network_to_select)
-{
- GSList *networks, *l;
- GtkTreeModel *model;
- GtkListStore *store;
-
- networks = empathy_irc_network_manager_get_networks (
- settings->network_manager);
+ EmpathyAccountWidgetIrc *settings;
+ EmpathyAccountSettings *ac_settings;
+ GtkWidget *entry_password;
+ const gchar *password;
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
- store = GTK_LIST_STORE (model);
+ settings = g_slice_new0 (EmpathyAccountWidgetIrc);
+ settings->self = self;
- for (l = networks; l != NULL; l = g_slist_next (l))
- {
- gchar *name;
- EmpathyIrcNetwork *network = l->data;
- GtkTreeIter iter;
+ self->ui_details->gui = empathy_builder_get_file (filename,
+ "table_irc_settings", table_common_settings,
+ "vbox_irc", &self->ui_details->widget,
+ "table_irc_settings", &settings->vbox_settings,
+ "entry_password", &entry_password,
+ NULL);
- g_object_get (network, "name", &name, NULL);
+ /* Add network chooser button */
+ g_object_get (settings->self, "settings", &ac_settings, NULL);
- gtk_list_store_insert_with_values (store, &iter, -1,
- COL_NETWORK_OBJ, network,
- COL_NETWORK_NAME, name,
- -1);
+ settings->network_chooser = empathy_irc_network_chooser_new (ac_settings);
- if (network == network_to_select)
- {
- gtk_combo_box_set_active_iter (
- GTK_COMBO_BOX (settings->combobox_network), &iter);
- }
+ g_signal_connect (settings->network_chooser, "changed",
+ G_CALLBACK (network_changed_cb), settings);
- g_free (name);
- g_object_unref (network);
- }
+ gtk_grid_attach (GTK_GRID (*table_common_settings),
+ settings->network_chooser, 1, 0, 1, 1);
- if (network_to_select == NULL)
- {
- /* Select the first network */
- GtkTreeIter iter;
+ gtk_widget_show (settings->network_chooser);
- if (gtk_tree_model_get_iter_first (model, &iter))
- {
- gtk_combo_box_set_active_iter (
- GTK_COMBO_BOX (settings->combobox_network), &iter);
+ account_widget_irc_setup (settings);
- update_server_params (settings);
- }
- }
+ empathy_account_widget_handle_params (self,
+ "entry_nick", "account",
+ "entry_fullname", "fullname",
+ "entry_password", "password",
+ "entry_quit_message", "quit-message",
+ "entry_username", "username",
+ NULL);
- g_slist_free (networks);
-}
+ empathy_builder_connect (self->ui_details->gui, settings,
+ "table_irc_settings", "destroy", account_widget_irc_destroy_cb,
+ NULL);
-static void
-account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
-{
- gchar *nick = NULL;
- gchar *fullname = NULL;
- gchar *server = NULL;
- gint port = 6667;
- gchar *charset;
- gboolean ssl = FALSE;
- EmpathyIrcNetwork *network = NULL;
-
- mc_account_get_param_string (settings->account, "account", &nick);
- mc_account_get_param_string (settings->account, "fullname", &fullname);
- mc_account_get_param_string (settings->account, "server", &server);
- mc_account_get_param_string (settings->account, "charset", &charset);
- mc_account_get_param_int (settings->account, "port", &port);
- mc_account_get_param_boolean (settings->account, "use-ssl", &ssl);
+ self->ui_details->default_focus = g_strdup ("entry_nick");
- if (!nick)
- {
- nick = g_strdup (g_get_user_name ());
- mc_account_set_param_string (settings->account, "account", nick);
- }
+ g_object_unref (ac_settings);
- if (!fullname)
- {
- fullname = g_strdup (g_get_real_name ());
- if (!fullname)
- {
- fullname = g_strdup (nick);
- }
- mc_account_set_param_string (settings->account, "fullname", fullname);
- }
+ /* Automatically set password-prompt when needed */
+ password = empathy_account_settings_get_string (ac_settings, "password");
- if (server != NULL)
+ if (set_password_prompt_if_needed (ac_settings, password))
{
- GtkListStore *store;
-
- network = empathy_irc_network_manager_find_network_by_address (
- settings->network_manager, server);
-
-
- store = GTK_LIST_STORE (gtk_combo_box_get_model (
- GTK_COMBO_BOX (settings->combobox_network)));
-
- if (network != NULL)
- {
- gchar *name;
-
- g_object_set (network, "charset", charset, NULL);
-
- g_object_get (network, "name", &name, NULL);
- DEBUG ("Account use network %s", name);
-
- g_free (name);
- }
- else
- {
- /* We don't have this network. Let's create it */
- EmpathyIrcServer *srv;
- GtkTreeIter iter;
-
- DEBUG ("Create a network %s", server);
- network = empathy_irc_network_new (server);
- srv = empathy_irc_server_new (server, port, ssl);
-
- empathy_irc_network_append_server (network, srv);
- empathy_irc_network_manager_add (settings->network_manager, network);
-
- gtk_list_store_insert_with_values (store, &iter, -1,
- COL_NETWORK_OBJ, network,
- COL_NETWORK_NAME, server,
- -1);
-
- gtk_combo_box_set_active_iter (
- GTK_COMBO_BOX (settings->combobox_network), &iter);
-
- g_object_unref (srv);
- g_object_unref (network);
- }
+ /* Apply right now to save password-prompt */
+ empathy_account_settings_apply_async (ac_settings, NULL, NULL);
}
+ g_signal_connect (entry_password, "changed",
+ G_CALLBACK (entry_password_changed_cb), settings);
- fill_networks_model (settings, network);
-
- g_free (nick);
- g_free (fullname);
- g_free (server);
- g_free (charset);
+ return EMPATHY_IRC_NETWORK_CHOOSER (settings->network_chooser);
}
-/**
- * empathy_account_widget_irc_new:
- * @account: the #McAccount to configure
- *
- * Creates a new IRC account widget to configure a given #McAccount
- *
- * Returns: The toplevel container of the configuration widget
- */
-GtkWidget *
-empathy_account_widget_irc_new (McAccount *account)
+EmpathyIrcNetworkChooser *
+empathy_account_widget_irc_build_simple (EmpathyAccountWidget *self,
+ const char *filename)
{
EmpathyAccountWidgetIrc *settings;
- gchar *dir, *user_file_with_path, *global_file_with_path;
- GtkBuilder *gui;
- GtkListStore *store;
- GtkCellRenderer *renderer;
- gchar *filename;
+ EmpathyAccountSettings *ac_settings;
+ GtkAlignment *alignment;
settings = g_slice_new0 (EmpathyAccountWidgetIrc);
- settings->account = g_object_ref (account);
+ settings->self = self;
- dir = g_build_filename (g_get_home_dir (), ".gnome2", PACKAGE_NAME, NULL);
- g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
- user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL);
- g_free (dir);
-
- global_file_with_path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"),
- "libempathy-gtk", IRC_NETWORKS_FILENAME, NULL);
- if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS))
- {
- g_free (global_file_with_path);
- global_file_with_path = g_build_filename (DATADIR, "empathy",
- IRC_NETWORKS_FILENAME, NULL);
- }
+ self->ui_details->gui = empathy_builder_get_file (filename,
+ "vbox_irc_simple", &self->ui_details->widget,
+ "alignment_network_simple", &alignment,
+ NULL);
- settings->network_manager = empathy_irc_network_manager_new (
- global_file_with_path,
- user_file_with_path);
+ /* Add network chooser button */
+ g_object_get (settings->self, "settings", &ac_settings, NULL);
- g_free (global_file_with_path);
- g_free (user_file_with_path);
+ settings->network_chooser = empathy_irc_network_chooser_new (ac_settings);
- filename = empathy_file_lookup ("empathy-account-widget-irc.ui",
- "libempathy-gtk");
- gui = empathy_builder_get_file (filename,
- "vbox_irc_settings", &settings->vbox_settings,
- "combobox_network", &settings->combobox_network,
- NULL);
- g_free (filename);
-
- /* Fill the networks combobox */
- store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
-
- gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network));
- renderer = gtk_cell_renderer_text_new ();
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (settings->combobox_network),
- renderer, TRUE);
- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network),
- renderer,
- "text", COL_NETWORK_NAME,
- NULL);
+ g_signal_connect (settings->network_chooser, "changed",
+ G_CALLBACK (network_changed_cb), settings);
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
- COL_NETWORK_NAME,
- GTK_SORT_ASCENDING);
+ gtk_container_add (GTK_CONTAINER (alignment), settings->network_chooser);
- gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network),
- GTK_TREE_MODEL (store));
- g_object_unref (store);
+ gtk_widget_show (settings->network_chooser);
- account_widget_irc_setup (settings);
-
- empathy_account_widget_handle_params (account, gui,
- "entry_nick", "account",
- "entry_fullname", "fullname",
- "entry_password", "password",
- "entry_quit_message", "quit-message",
+ empathy_account_widget_handle_params (self,
+ "entry_nick_simple", "account",
NULL);
- empathy_builder_connect (gui, settings,
- "vbox_irc_settings", "destroy", account_widget_irc_destroy_cb,
- "button_network", "clicked", account_widget_irc_button_edit_network_clicked_cb,
- "button_add_network", "clicked", account_widget_irc_button_add_network_clicked_cb,
- "button_remove_network", "clicked", account_widget_irc_button_remove_clicked_cb,
- "combobox_network", "changed", account_widget_irc_combobox_network_changed_cb,
+ empathy_builder_connect (self->ui_details->gui, settings,
+ "vbox_irc_simple", "destroy", account_widget_irc_destroy_cb,
NULL);
- empathy_account_widget_set_default_focus (gui, "entry_nick");
+ self->ui_details->default_focus = g_strdup ("entry_nick_simple");
+
+ g_object_unref (ac_settings);
- return empathy_builder_unref_and_keep_widget (gui, settings->vbox_settings);
+ return EMPATHY_IRC_NETWORK_CHOOSER (settings->network_chooser);
}