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>
30 #include <libempathy/empathy-utils.h>
31 #include <libempathy/empathy-account.h>
33 #include <libempathy/empathy-irc-network-manager.h>
34 #include "empathy-ui-utils.h"
35 #include "totem-subtitle-encoding.h"
37 #include "empathy-irc-network-dialog.h"
40 EmpathyIrcNetwork *network;
43 GtkWidget *button_close;
45 GtkWidget *entry_network;
46 GtkWidget *combobox_charset;
48 GtkWidget *treeview_servers;
49 GtkWidget *button_add;
50 GtkWidget *button_remove;
52 GtkWidget *button_down;
53 } EmpathyIrcNetworkDialog;
56 irc_network_dialog_destroy_cb (GtkWidget *widget,
57 EmpathyIrcNetworkDialog *dialog)
59 g_object_unref (dialog->network);
61 g_slice_free (EmpathyIrcNetworkDialog, dialog);
65 irc_network_dialog_close_clicked_cb (GtkWidget *widget,
66 EmpathyIrcNetworkDialog *dialog)
68 gtk_widget_destroy (dialog->dialog);
79 add_server_to_store (GtkListStore *store,
80 EmpathyIrcServer *server,
93 gtk_list_store_insert_with_values (store, iter, -1,
104 irc_network_dialog_setup (EmpathyIrcNetworkDialog *dialog)
106 gchar *name, *charset;
110 g_object_get (dialog->network,
114 gtk_entry_set_text (GTK_ENTRY (dialog->entry_network), name);
116 store = GTK_LIST_STORE (gtk_tree_view_get_model (
117 GTK_TREE_VIEW (dialog->treeview_servers)));
119 servers = empathy_irc_network_get_servers (dialog->network);
120 for (l = servers; l != NULL; l = g_slist_next (l))
122 EmpathyIrcServer *server = l->data;
125 add_server_to_store (store, server, &iter);
128 totem_subtitle_encoding_set (GTK_COMBO_BOX (dialog->combobox_charset),
131 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
132 g_slist_free (servers);
138 irc_network_dialog_address_edited_cb (GtkCellRendererText *renderer,
141 EmpathyIrcNetworkDialog *dialog)
143 EmpathyIrcServer *server;
145 GtkTreePath *treepath;
148 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
149 treepath = gtk_tree_path_new_from_string (path);
150 gtk_tree_model_get_iter (model, &iter, treepath);
151 gtk_tree_model_get (model, &iter,
152 COL_SRV_OBJ, &server,
154 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
158 g_object_set (server, "address", new_text, NULL);
160 gtk_tree_path_free (treepath);
161 g_object_unref (server);
165 irc_network_dialog_port_edited_cb (GtkCellRendererText *renderer,
168 EmpathyIrcNetworkDialog *dialog)
170 EmpathyIrcServer *server;
172 GtkTreePath *treepath;
176 port = strtoul (new_text, NULL, 10);
177 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
178 treepath = gtk_tree_path_new_from_string (path);
179 gtk_tree_model_get_iter (model, &iter, treepath);
180 gtk_tree_model_get (model, &iter,
181 COL_SRV_OBJ, &server,
183 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
187 g_object_set (server, "port", port, NULL);
189 gtk_tree_path_free (treepath);
190 g_object_unref (server);
194 irc_network_dialog_ssl_toggled_cb (GtkCellRendererText *renderer,
196 EmpathyIrcNetworkDialog *dialog)
198 EmpathyIrcServer *server;
200 GtkTreePath *treepath;
204 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
205 treepath = gtk_tree_path_new_from_string (path);
206 gtk_tree_model_get_iter (model, &iter, treepath);
207 gtk_tree_model_get (model, &iter,
208 COL_SRV_OBJ, &server,
212 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
216 g_object_set (server, "ssl", ssl, NULL);
218 gtk_tree_path_free (treepath);
219 g_object_unref (server);
223 irc_network_dialog_network_focus_cb (GtkWidget *widget,
224 GdkEventFocus *event,
225 EmpathyIrcNetworkDialog *dialog)
229 str = gtk_entry_get_text (GTK_ENTRY (widget));
231 g_object_set (dialog->network, "name", str, NULL);
237 irc_network_dialog_network_update_buttons (EmpathyIrcNetworkDialog *dialog)
239 GtkTreeSelection *selection;
243 gboolean can_remove = FALSE, can_move_up = FALSE, can_move_down = FALSE;
246 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (
247 dialog->treeview_servers));
249 if (gtk_tree_selection_get_selected (selection, &model, &iter))
251 path = gtk_tree_model_get_path (model, &iter);
253 selected = gtk_tree_path_get_indices (path)[0];
256 can_move_up = selected > 0;
258 selected < gtk_tree_model_iter_n_children (model, NULL) - 1;
260 gtk_tree_path_free (path);
263 gtk_widget_set_sensitive (dialog->button_remove, can_remove);
264 gtk_widget_set_sensitive (dialog->button_up, can_move_up);
265 gtk_widget_set_sensitive (dialog->button_down, can_move_down);
269 irc_network_dialog_button_add_clicked_cb (GtkWidget *widget,
270 EmpathyIrcNetworkDialog *dialog)
272 EmpathyIrcServer *server;
276 GtkTreeViewColumn *column;
278 store = GTK_LIST_STORE (gtk_tree_view_get_model (
279 GTK_TREE_VIEW (dialog->treeview_servers)));
281 server = empathy_irc_server_new (_("new server"), 6667, FALSE);
282 empathy_irc_network_append_server (dialog->network, server);
283 add_server_to_store (store, server, &iter);
285 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
286 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
288 gtk_tree_view_set_cursor (GTK_TREE_VIEW (dialog->treeview_servers), path,
291 irc_network_dialog_network_update_buttons (dialog);
293 gtk_tree_path_free (path);
294 g_object_unref (server);
298 irc_network_dialog_button_remove_clicked_cb (GtkWidget *widget,
299 EmpathyIrcNetworkDialog *dialog)
301 GtkTreeSelection *selection;
304 EmpathyIrcServer *server;
306 selection = gtk_tree_view_get_selection (
307 GTK_TREE_VIEW (dialog->treeview_servers));
309 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
312 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
314 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
315 empathy_irc_network_remove_server (dialog->network, server);
317 irc_network_dialog_network_update_buttons (dialog);
319 g_object_unref (server);
323 irc_network_dialog_button_up_clicked_cb (GtkWidget *widget,
324 EmpathyIrcNetworkDialog *dialog)
326 GtkTreeSelection *selection;
328 GtkTreeIter iter, iter_prev;
331 EmpathyIrcServer *server;
333 selection = gtk_tree_view_get_selection (
334 GTK_TREE_VIEW (dialog->treeview_servers));
336 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
339 path = gtk_tree_model_get_path (model, &iter);
341 if (!gtk_tree_path_prev (path))
343 gtk_tree_path_free (path);
347 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
349 gtk_tree_model_get_iter (model, &iter_prev, path);
350 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
352 pos = gtk_tree_path_get_indices (path);
353 empathy_irc_network_set_server_position (dialog->network, server, *pos);
355 irc_network_dialog_network_update_buttons (dialog);
357 g_object_unref (server);
358 gtk_tree_path_free (path);
362 irc_network_dialog_button_down_clicked_cb (GtkWidget *widget,
363 EmpathyIrcNetworkDialog *dialog)
365 GtkTreeSelection *selection;
367 GtkTreeIter iter, iter_prev;
369 EmpathyIrcServer *server;
372 selection = gtk_tree_view_get_selection (
373 GTK_TREE_VIEW (dialog->treeview_servers));
375 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
378 path = gtk_tree_model_get_path (model, &iter);
380 gtk_tree_path_next (path);
381 if (!gtk_tree_model_get_iter (model, &iter_prev, path))
383 gtk_tree_path_free (path);
387 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
389 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
391 pos = gtk_tree_path_get_indices (path);
392 empathy_irc_network_set_server_position (dialog->network, server, *pos);
394 irc_network_dialog_network_update_buttons (dialog);
396 gtk_tree_path_free (path);
400 irc_network_dialog_selection_changed_cb (GtkTreeSelection *treeselection,
401 EmpathyIrcNetworkDialog *dialog)
403 irc_network_dialog_network_update_buttons (dialog);
407 irc_network_dialog_combobox_charset_changed_cb (GtkWidget *combobox,
408 EmpathyIrcNetworkDialog *dialog)
410 const gchar *charset;
412 charset = totem_subtitle_encoding_get_selected (GTK_COMBO_BOX (combobox));
413 g_object_set (dialog->network, "charset", charset, NULL);
417 change_network (EmpathyIrcNetworkDialog *dialog,
418 EmpathyIrcNetwork *network)
422 if (dialog->network == network)
423 /* No need to change */
426 if (dialog->network != NULL)
428 g_object_unref (dialog->network);
431 dialog->network = network;
432 g_object_ref (network);
434 store = GTK_LIST_STORE (gtk_tree_view_get_model (
435 GTK_TREE_VIEW (dialog->treeview_servers)));
436 gtk_list_store_clear (store);
438 irc_network_dialog_setup (dialog);
442 * empathy_irc_network_dialog_show:
443 * @network: the #EmpathyIrcNetwork to configure
444 * @parent: the parent of this dialog
446 * Display a dialog to configure a given #EmpathyIrcNetwork.
447 * This function is a singleton so if a configuration dialog already
448 * exists we use this one to edit the network.
450 * Returns: The displayed #GtkDialog
453 empathy_irc_network_dialog_show (EmpathyIrcNetwork *network,
456 static EmpathyIrcNetworkDialog *dialog = NULL;
459 GtkCellRenderer *renderer;
460 GtkAdjustment *adjustment;
461 GtkTreeSelection *selection;
462 GtkTreeViewColumn *column;
465 g_return_val_if_fail (network != NULL, NULL);
469 change_network (dialog, network);
470 gtk_window_present (GTK_WINDOW (dialog->dialog));
472 return dialog->dialog;
475 dialog = g_slice_new0 (EmpathyIrcNetworkDialog);
477 dialog->network = network;
478 g_object_ref (dialog->network);
480 filename = empathy_file_lookup ("empathy-account-widget-irc.ui",
482 gui = empathy_builder_get_file (filename,
483 "irc_network_dialog", &dialog->dialog,
484 "button_close", &dialog->button_close,
485 "entry_network", &dialog->entry_network,
486 "combobox_charset", &dialog->combobox_charset,
487 "treeview_servers", &dialog->treeview_servers,
488 "button_add", &dialog->button_add,
489 "button_remove", &dialog->button_remove,
490 "button_up", &dialog->button_up,
491 "button_down", &dialog->button_down,
495 store = gtk_list_store_new (4, G_TYPE_OBJECT, G_TYPE_STRING,
496 G_TYPE_UINT, G_TYPE_BOOLEAN);
497 gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeview_servers),
498 GTK_TREE_MODEL (store));
499 g_object_unref (store);
502 renderer = gtk_cell_renderer_text_new ();
503 g_object_set (renderer, "editable", TRUE, NULL);
504 g_signal_connect (renderer, "edited",
505 G_CALLBACK (irc_network_dialog_address_edited_cb), dialog);
506 gtk_tree_view_insert_column_with_attributes (
507 GTK_TREE_VIEW (dialog->treeview_servers),
508 -1, _("Server"), renderer, "text", COL_ADR,
512 adjustment = (GtkAdjustment *) gtk_adjustment_new (6667, 1, G_MAXUINT16,
514 renderer = gtk_cell_renderer_spin_new ();
515 g_object_set (renderer,
517 "adjustment", adjustment,
519 g_signal_connect (renderer, "edited",
520 G_CALLBACK (irc_network_dialog_port_edited_cb), dialog);
521 gtk_tree_view_insert_column_with_attributes (
522 GTK_TREE_VIEW (dialog->treeview_servers),
523 -1, _("Port"), renderer, "text", COL_PORT,
525 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
527 gtk_tree_view_column_set_expand (column, TRUE);
530 renderer = gtk_cell_renderer_toggle_new ();
531 g_object_set (renderer, "activatable", TRUE, NULL);
532 g_signal_connect (renderer, "toggled",
533 G_CALLBACK (irc_network_dialog_ssl_toggled_cb), dialog);
534 gtk_tree_view_insert_column_with_attributes (
535 GTK_TREE_VIEW (dialog->treeview_servers),
536 -1, _("SSL"), renderer, "active", COL_SSL,
539 selection = gtk_tree_view_get_selection (
540 GTK_TREE_VIEW (dialog->treeview_servers));
541 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
544 totem_subtitle_encoding_init (GTK_COMBO_BOX (dialog->combobox_charset));
546 irc_network_dialog_setup (dialog);
548 empathy_builder_connect (gui, dialog,
549 "irc_network_dialog", "destroy", irc_network_dialog_destroy_cb,
550 "button_close", "clicked", irc_network_dialog_close_clicked_cb,
551 "entry_network", "focus-out-event", irc_network_dialog_network_focus_cb,
552 "button_add", "clicked", irc_network_dialog_button_add_clicked_cb,
553 "button_remove", "clicked", irc_network_dialog_button_remove_clicked_cb,
554 "button_up", "clicked", irc_network_dialog_button_up_clicked_cb,
555 "button_down", "clicked", irc_network_dialog_button_down_clicked_cb,
556 "combobox_charset", "changed", irc_network_dialog_combobox_charset_changed_cb,
559 g_object_unref (gui);
561 g_object_add_weak_pointer (G_OBJECT (dialog->dialog),
564 g_signal_connect (selection, "changed",
565 G_CALLBACK (irc_network_dialog_selection_changed_cb),
568 gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog),
569 GTK_WINDOW (parent));
570 gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE);
572 irc_network_dialog_network_update_buttons (dialog);
573 gtk_widget_show_all (dialog->dialog);
575 return dialog->dialog;