2 * Copyright (C) 2007-2008 Guillaume Desmottes
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 * Authors: Guillaume Desmottes <gdesmott@gnome.org>
27 #include <glib/gi18n-lib.h>
29 #include <glade/glade.h>
31 #include <libmissioncontrol/mc-account.h>
32 #include <libmissioncontrol/mc-protocol.h>
34 #include <libempathy/empathy-utils.h>
36 #include <libempathy/empathy-irc-network-manager.h>
37 #include "empathy-ui-utils.h"
38 #include "totem-subtitle-encoding.h"
40 #include "empathy-irc-network-dialog.h"
43 EmpathyIrcNetwork *network;
46 GtkWidget *button_close;
48 GtkWidget *entry_network;
49 GtkWidget *combobox_charset;
51 GtkWidget *treeview_servers;
52 GtkWidget *button_add;
53 GtkWidget *button_remove;
55 GtkWidget *button_down;
56 } EmpathyIrcNetworkDialog;
59 irc_network_dialog_destroy_cb (GtkWidget *widget,
60 EmpathyIrcNetworkDialog *dialog)
62 g_object_unref (dialog->network);
64 g_slice_free (EmpathyIrcNetworkDialog, dialog);
68 irc_network_dialog_close_clicked_cb (GtkWidget *widget,
69 EmpathyIrcNetworkDialog *dialog)
71 gtk_widget_destroy (dialog->dialog);
82 add_server_to_store (GtkListStore *store,
83 EmpathyIrcServer *server,
96 gtk_list_store_insert_with_values (store, iter, -1,
107 irc_network_dialog_setup (EmpathyIrcNetworkDialog *dialog)
109 gchar *name, *charset;
113 g_object_get (dialog->network,
117 gtk_entry_set_text (GTK_ENTRY (dialog->entry_network), name);
119 store = GTK_LIST_STORE (gtk_tree_view_get_model (
120 GTK_TREE_VIEW (dialog->treeview_servers)));
122 servers = empathy_irc_network_get_servers (dialog->network);
123 for (l = servers; l != NULL; l = g_slist_next (l))
125 EmpathyIrcServer *server = l->data;
128 add_server_to_store (store, server, &iter);
131 totem_subtitle_encoding_set (GTK_COMBO_BOX (dialog->combobox_charset),
134 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
135 g_slist_free (servers);
141 irc_network_dialog_address_edited_cb (GtkCellRendererText *renderer,
144 EmpathyIrcNetworkDialog *dialog)
146 EmpathyIrcServer *server;
148 GtkTreePath *treepath;
151 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
152 treepath = gtk_tree_path_new_from_string (path);
153 gtk_tree_model_get_iter (model, &iter, treepath);
154 gtk_tree_model_get (model, &iter,
155 COL_SRV_OBJ, &server,
157 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
161 g_object_set (server, "address", new_text, NULL);
163 gtk_tree_path_free (treepath);
164 g_object_unref (server);
168 irc_network_dialog_port_edited_cb (GtkCellRendererText *renderer,
171 EmpathyIrcNetworkDialog *dialog)
173 EmpathyIrcServer *server;
175 GtkTreePath *treepath;
179 port = strtoul (new_text, NULL, 10);
180 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
181 treepath = gtk_tree_path_new_from_string (path);
182 gtk_tree_model_get_iter (model, &iter, treepath);
183 gtk_tree_model_get (model, &iter,
184 COL_SRV_OBJ, &server,
186 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
190 g_object_set (server, "port", port, NULL);
192 gtk_tree_path_free (treepath);
193 g_object_unref (server);
197 irc_network_dialog_ssl_toggled_cb (GtkCellRendererText *renderer,
199 EmpathyIrcNetworkDialog *dialog)
201 EmpathyIrcServer *server;
203 GtkTreePath *treepath;
207 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
208 treepath = gtk_tree_path_new_from_string (path);
209 gtk_tree_model_get_iter (model, &iter, treepath);
210 gtk_tree_model_get (model, &iter,
211 COL_SRV_OBJ, &server,
215 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
219 g_object_set (server, "ssl", ssl, NULL);
221 gtk_tree_path_free (treepath);
222 g_object_unref (server);
226 irc_network_dialog_network_focus_cb (GtkWidget *widget,
227 GdkEventFocus *event,
228 EmpathyIrcNetworkDialog *dialog)
232 str = gtk_entry_get_text (GTK_ENTRY (widget));
234 g_object_set (dialog->network, "name", str, NULL);
240 irc_network_dialog_network_update_buttons (EmpathyIrcNetworkDialog *dialog)
242 GtkTreeSelection *selection;
246 gboolean can_remove = FALSE, can_move_up = FALSE, can_move_down = FALSE;
249 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (
250 dialog->treeview_servers));
252 if (gtk_tree_selection_get_selected (selection, &model, &iter))
254 path = gtk_tree_model_get_path (model, &iter);
256 selected = gtk_tree_path_get_indices (path)[0];
259 can_move_up = selected > 0;
261 selected < gtk_tree_model_iter_n_children (model, NULL) - 1;
263 gtk_tree_path_free (path);
266 gtk_widget_set_sensitive (dialog->button_remove, can_remove);
267 gtk_widget_set_sensitive (dialog->button_up, can_move_up);
268 gtk_widget_set_sensitive (dialog->button_down, can_move_down);
272 irc_network_dialog_button_add_clicked_cb (GtkWidget *widget,
273 EmpathyIrcNetworkDialog *dialog)
275 EmpathyIrcServer *server;
279 GtkTreeViewColumn *column;
281 store = GTK_LIST_STORE (gtk_tree_view_get_model (
282 GTK_TREE_VIEW (dialog->treeview_servers)));
284 server = empathy_irc_server_new (_("new server"), 6667, FALSE);
285 empathy_irc_network_append_server (dialog->network, server);
286 add_server_to_store (store, server, &iter);
288 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
289 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
291 gtk_tree_view_set_cursor (GTK_TREE_VIEW (dialog->treeview_servers), path,
294 irc_network_dialog_network_update_buttons (dialog);
296 gtk_tree_path_free (path);
297 g_object_unref (server);
301 irc_network_dialog_button_remove_clicked_cb (GtkWidget *widget,
302 EmpathyIrcNetworkDialog *dialog)
304 GtkTreeSelection *selection;
307 EmpathyIrcServer *server;
309 selection = gtk_tree_view_get_selection (
310 GTK_TREE_VIEW (dialog->treeview_servers));
312 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
315 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
317 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
318 empathy_irc_network_remove_server (dialog->network, server);
320 irc_network_dialog_network_update_buttons (dialog);
322 g_object_unref (server);
326 irc_network_dialog_button_up_clicked_cb (GtkWidget *widget,
327 EmpathyIrcNetworkDialog *dialog)
329 GtkTreeSelection *selection;
331 GtkTreeIter iter, iter_prev;
334 EmpathyIrcServer *server;
336 selection = gtk_tree_view_get_selection (
337 GTK_TREE_VIEW (dialog->treeview_servers));
339 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
342 path = gtk_tree_model_get_path (model, &iter);
344 if (!gtk_tree_path_prev (path))
346 gtk_tree_path_free (path);
350 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
352 gtk_tree_model_get_iter (model, &iter_prev, path);
353 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
355 pos = gtk_tree_path_get_indices (path);
356 empathy_irc_network_set_server_position (dialog->network, server, *pos);
358 irc_network_dialog_network_update_buttons (dialog);
360 g_object_unref (server);
361 gtk_tree_path_free (path);
365 irc_network_dialog_button_down_clicked_cb (GtkWidget *widget,
366 EmpathyIrcNetworkDialog *dialog)
368 GtkTreeSelection *selection;
370 GtkTreeIter iter, iter_prev;
372 EmpathyIrcServer *server;
375 selection = gtk_tree_view_get_selection (
376 GTK_TREE_VIEW (dialog->treeview_servers));
378 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
381 path = gtk_tree_model_get_path (model, &iter);
383 gtk_tree_path_next (path);
384 if (!gtk_tree_model_get_iter (model, &iter_prev, path))
386 gtk_tree_path_free (path);
390 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
392 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
394 pos = gtk_tree_path_get_indices (path);
395 empathy_irc_network_set_server_position (dialog->network, server, *pos);
397 irc_network_dialog_network_update_buttons (dialog);
399 gtk_tree_path_free (path);
403 irc_network_dialog_selection_changed_cb (GtkTreeSelection *treeselection,
404 EmpathyIrcNetworkDialog *dialog)
406 irc_network_dialog_network_update_buttons (dialog);
410 irc_network_dialog_combobox_charset_changed_cb (GtkWidget *combobox,
411 EmpathyIrcNetworkDialog *dialog)
413 const gchar *charset;
415 charset = totem_subtitle_encoding_get_selected (GTK_COMBO_BOX (combobox));
416 g_object_set (dialog->network, "charset", charset, NULL);
420 change_network (EmpathyIrcNetworkDialog *dialog,
421 EmpathyIrcNetwork *network)
425 if (dialog->network == network)
426 /* No need to change */
429 if (dialog->network != NULL)
431 g_object_unref (dialog->network);
434 dialog->network = network;
435 g_object_ref (network);
437 store = GTK_LIST_STORE (gtk_tree_view_get_model (
438 GTK_TREE_VIEW (dialog->treeview_servers)));
439 gtk_list_store_clear (store);
441 irc_network_dialog_setup (dialog);
445 * empathy_irc_network_dialog_show:
446 * @network: the #EmpathyIrcNetwork to configure
447 * @parent: the parent of this dialog
449 * Display a dialog to configure a given #EmpathyIrcNetwork.
450 * This function is a singleton so if a configuration dialog already
451 * exists we use this one to edit the network.
453 * Returns: The displayed #GtkDialog
456 empathy_irc_network_dialog_show (EmpathyIrcNetwork *network,
459 static EmpathyIrcNetworkDialog *dialog = NULL;
462 GtkCellRenderer *renderer;
463 GtkAdjustment *adjustment;
464 GtkTreeSelection *selection;
465 GtkTreeViewColumn *column;
468 g_return_val_if_fail (network != NULL, NULL);
472 change_network (dialog, network);
473 gtk_window_present (GTK_WINDOW (dialog->dialog));
475 return dialog->dialog;
478 dialog = g_slice_new0 (EmpathyIrcNetworkDialog);
480 dialog->network = network;
481 g_object_ref (dialog->network);
483 filename = empathy_file_lookup ("empathy-account-widget-irc.glade",
485 glade = empathy_glade_get_file (filename,
486 "irc_network_dialog",
488 "irc_network_dialog", &dialog->dialog,
489 "button_close", &dialog->button_close,
490 "entry_network", &dialog->entry_network,
491 "combobox_charset", &dialog->combobox_charset,
492 "treeview_servers", &dialog->treeview_servers,
493 "button_add", &dialog->button_add,
494 "button_remove", &dialog->button_remove,
495 "button_up", &dialog->button_up,
496 "button_down", &dialog->button_down,
500 store = gtk_list_store_new (4, G_TYPE_OBJECT, G_TYPE_STRING,
501 G_TYPE_UINT, G_TYPE_BOOLEAN);
502 gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeview_servers),
503 GTK_TREE_MODEL (store));
504 g_object_unref (store);
507 renderer = gtk_cell_renderer_text_new ();
508 g_object_set (renderer, "editable", TRUE, NULL);
509 g_signal_connect (renderer, "edited",
510 G_CALLBACK (irc_network_dialog_address_edited_cb), dialog);
511 gtk_tree_view_insert_column_with_attributes (
512 GTK_TREE_VIEW (dialog->treeview_servers),
513 -1, _("Server"), renderer, "text", COL_ADR,
517 adjustment = (GtkAdjustment *) gtk_adjustment_new (6667, 1, G_MAXUINT16,
519 renderer = gtk_cell_renderer_spin_new ();
520 g_object_set (renderer,
522 "adjustment", adjustment,
524 g_signal_connect (renderer, "edited",
525 G_CALLBACK (irc_network_dialog_port_edited_cb), dialog);
526 gtk_tree_view_insert_column_with_attributes (
527 GTK_TREE_VIEW (dialog->treeview_servers),
528 -1, _("Port"), renderer, "text", COL_PORT,
530 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
532 gtk_tree_view_column_set_expand (column, TRUE);
535 renderer = gtk_cell_renderer_toggle_new ();
536 g_object_set (renderer, "activatable", TRUE, NULL);
537 g_signal_connect (renderer, "toggled",
538 G_CALLBACK (irc_network_dialog_ssl_toggled_cb), dialog);
539 gtk_tree_view_insert_column_with_attributes (
540 GTK_TREE_VIEW (dialog->treeview_servers),
541 -1, _("SSL"), renderer, "active", COL_SSL,
544 selection = gtk_tree_view_get_selection (
545 GTK_TREE_VIEW (dialog->treeview_servers));
546 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
549 totem_subtitle_encoding_init (GTK_COMBO_BOX (dialog->combobox_charset));
551 irc_network_dialog_setup (dialog);
553 empathy_glade_connect (glade, dialog,
554 "irc_network_dialog", "destroy", irc_network_dialog_destroy_cb,
555 "button_close", "clicked", irc_network_dialog_close_clicked_cb,
556 "entry_network", "focus-out-event", irc_network_dialog_network_focus_cb,
557 "button_add", "clicked", irc_network_dialog_button_add_clicked_cb,
558 "button_remove", "clicked", irc_network_dialog_button_remove_clicked_cb,
559 "button_up", "clicked", irc_network_dialog_button_up_clicked_cb,
560 "button_down", "clicked", irc_network_dialog_button_down_clicked_cb,
561 "combobox_charset", "changed", irc_network_dialog_combobox_charset_changed_cb,
564 g_object_unref (glade);
566 g_object_add_weak_pointer (G_OBJECT (dialog->dialog),
569 g_signal_connect (selection, "changed",
570 G_CALLBACK (irc_network_dialog_selection_changed_cb),
573 gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog),
574 GTK_WINDOW (parent));
575 gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE);
577 irc_network_dialog_network_update_buttons (dialog);
579 return dialog->dialog;