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.h>
29 #include <glade/glade.h>
31 #include <libmissioncontrol/mc-account.h>
32 #include <libmissioncontrol/mc-protocol.h>
34 #include <libempathy/empathy-utils.h>
35 #include <libempathy/empathy-debug.h>
37 #include <libempathy/empathy-irc-network-manager.h>
38 #include "empathy-ui-utils.h"
39 #include "totem-subtitle-encoding.h"
41 #include "empathy-irc-network-dialog.h"
43 #define DEBUG_DOMAIN "AccountWidgetIRC"
46 EmpathyIrcNetwork *network;
49 GtkWidget *button_close;
51 GtkWidget *entry_network;
52 GtkWidget *combobox_charset;
54 GtkWidget *treeview_servers;
55 GtkWidget *button_add;
56 GtkWidget *button_remove;
58 GtkWidget *button_down;
59 } EmpathyIrcNetworkDialog;
62 irc_network_dialog_destroy_cb (GtkWidget *widget,
63 EmpathyIrcNetworkDialog *dialog)
65 g_object_unref (dialog->network);
67 g_slice_free (EmpathyIrcNetworkDialog, dialog);
71 irc_network_dialog_close_clicked_cb (GtkWidget *widget,
72 EmpathyIrcNetworkDialog *dialog)
74 gtk_widget_destroy (dialog->dialog);
85 add_server_to_store (GtkListStore *store,
86 EmpathyIrcServer *server,
99 gtk_list_store_insert_with_values (store, iter, -1,
110 irc_network_dialog_setup (EmpathyIrcNetworkDialog *dialog)
112 gchar *name, *charset;
116 g_object_get (dialog->network,
120 gtk_entry_set_text (GTK_ENTRY (dialog->entry_network), name);
122 store = GTK_LIST_STORE (gtk_tree_view_get_model (
123 GTK_TREE_VIEW (dialog->treeview_servers)));
125 servers = empathy_irc_network_get_servers (dialog->network);
126 for (l = servers; l != NULL; l = g_slist_next (l))
128 EmpathyIrcServer *server = l->data;
131 add_server_to_store (store, server, &iter);
134 totem_subtitle_encoding_set (GTK_COMBO_BOX (dialog->combobox_charset),
137 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
138 g_slist_free (servers);
144 irc_network_dialog_address_edited_cb (GtkCellRendererText *renderer,
147 EmpathyIrcNetworkDialog *dialog)
149 EmpathyIrcServer *server;
151 GtkTreePath *treepath;
154 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
155 treepath = gtk_tree_path_new_from_string (path);
156 gtk_tree_model_get_iter (model, &iter, treepath);
157 gtk_tree_model_get (model, &iter,
158 COL_SRV_OBJ, &server,
160 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
164 g_object_set (server, "address", new_text, NULL);
166 gtk_tree_path_free (treepath);
167 g_object_unref (server);
171 irc_network_dialog_port_edited_cb (GtkCellRendererText *renderer,
174 EmpathyIrcNetworkDialog *dialog)
176 EmpathyIrcServer *server;
178 GtkTreePath *treepath;
182 port = strtoul (new_text, NULL, 10);
183 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
184 treepath = gtk_tree_path_new_from_string (path);
185 gtk_tree_model_get_iter (model, &iter, treepath);
186 gtk_tree_model_get (model, &iter,
187 COL_SRV_OBJ, &server,
189 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
193 g_object_set (server, "port", port, NULL);
195 gtk_tree_path_free (treepath);
196 g_object_unref (server);
200 irc_network_dialog_ssl_toggled_cb (GtkCellRendererText *renderer,
202 EmpathyIrcNetworkDialog *dialog)
204 EmpathyIrcServer *server;
206 GtkTreePath *treepath;
210 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
211 treepath = gtk_tree_path_new_from_string (path);
212 gtk_tree_model_get_iter (model, &iter, treepath);
213 gtk_tree_model_get (model, &iter,
214 COL_SRV_OBJ, &server,
218 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
222 g_object_set (server, "ssl", ssl, NULL);
224 gtk_tree_path_free (treepath);
225 g_object_unref (server);
229 irc_network_dialog_network_focus_cb (GtkWidget *widget,
230 GdkEventFocus *event,
231 EmpathyIrcNetworkDialog *dialog)
235 str = gtk_entry_get_text (GTK_ENTRY (widget));
237 g_object_set (dialog->network, "name", str, NULL);
243 irc_network_dialog_network_update_buttons (EmpathyIrcNetworkDialog *dialog)
245 GtkTreeSelection *selection;
249 gboolean can_remove = FALSE, can_move_up = FALSE, can_move_down = FALSE;
252 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (
253 dialog->treeview_servers));
255 if (gtk_tree_selection_get_selected (selection, &model, &iter))
257 path = gtk_tree_model_get_path (model, &iter);
259 selected = gtk_tree_path_get_indices (path)[0];
262 can_move_up = selected > 0;
264 selected < gtk_tree_model_iter_n_children (model, NULL) - 1;
266 gtk_tree_path_free (path);
269 gtk_widget_set_sensitive (dialog->button_remove, can_remove);
270 gtk_widget_set_sensitive (dialog->button_up, can_move_up);
271 gtk_widget_set_sensitive (dialog->button_down, can_move_down);
275 irc_network_dialog_button_add_clicked_cb (GtkWidget *widget,
276 EmpathyIrcNetworkDialog *dialog)
278 EmpathyIrcServer *server;
282 GtkTreeViewColumn *column;
284 store = GTK_LIST_STORE (gtk_tree_view_get_model (
285 GTK_TREE_VIEW (dialog->treeview_servers)));
287 server = empathy_irc_server_new (_("new server"), 6667, FALSE);
288 empathy_irc_network_append_server (dialog->network, server);
289 add_server_to_store (store, server, &iter);
291 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
292 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
294 gtk_tree_view_set_cursor (GTK_TREE_VIEW (dialog->treeview_servers), path,
297 irc_network_dialog_network_update_buttons (dialog);
299 gtk_tree_path_free (path);
300 g_object_unref (server);
304 irc_network_dialog_button_remove_clicked_cb (GtkWidget *widget,
305 EmpathyIrcNetworkDialog *dialog)
307 GtkTreeSelection *selection;
310 EmpathyIrcServer *server;
312 selection = gtk_tree_view_get_selection (
313 GTK_TREE_VIEW (dialog->treeview_servers));
315 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
318 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
320 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
321 empathy_irc_network_remove_server (dialog->network, server);
323 irc_network_dialog_network_update_buttons (dialog);
325 g_object_unref (server);
329 irc_network_dialog_button_up_clicked_cb (GtkWidget *widget,
330 EmpathyIrcNetworkDialog *dialog)
332 GtkTreeSelection *selection;
334 GtkTreeIter iter, iter_prev;
337 EmpathyIrcServer *server;
339 selection = gtk_tree_view_get_selection (
340 GTK_TREE_VIEW (dialog->treeview_servers));
342 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
345 path = gtk_tree_model_get_path (model, &iter);
347 if (!gtk_tree_path_prev (path))
349 gtk_tree_path_free (path);
353 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
355 gtk_tree_model_get_iter (model, &iter_prev, path);
356 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
358 pos = gtk_tree_path_get_indices (path);
359 empathy_irc_network_set_server_position (dialog->network, server, *pos);
361 irc_network_dialog_network_update_buttons (dialog);
363 g_object_unref (server);
364 gtk_tree_path_free (path);
368 irc_network_dialog_button_down_clicked_cb (GtkWidget *widget,
369 EmpathyIrcNetworkDialog *dialog)
371 GtkTreeSelection *selection;
373 GtkTreeIter iter, iter_prev;
375 EmpathyIrcServer *server;
378 selection = gtk_tree_view_get_selection (
379 GTK_TREE_VIEW (dialog->treeview_servers));
381 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
384 path = gtk_tree_model_get_path (model, &iter);
386 gtk_tree_path_next (path);
387 if (!gtk_tree_model_get_iter (model, &iter_prev, path))
389 gtk_tree_path_free (path);
393 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
395 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
397 pos = gtk_tree_path_get_indices (path);
398 empathy_irc_network_set_server_position (dialog->network, server, *pos);
400 irc_network_dialog_network_update_buttons (dialog);
402 gtk_tree_path_free (path);
406 irc_network_dialog_selection_changed_cb (GtkTreeSelection *treeselection,
407 EmpathyIrcNetworkDialog *dialog)
409 irc_network_dialog_network_update_buttons (dialog);
413 irc_network_dialog_combobox_charset_changed_cb (GtkWidget *combobox,
414 EmpathyIrcNetworkDialog *dialog)
416 const gchar *charset;
418 charset = totem_subtitle_encoding_get_selected (GTK_COMBO_BOX (combobox));
419 g_object_set (dialog->network, "charset", charset, NULL);
423 change_network (EmpathyIrcNetworkDialog *dialog,
424 EmpathyIrcNetwork *network)
428 if (dialog->network == network)
429 /* No need to change */
432 if (dialog->network != NULL)
434 g_object_unref (dialog->network);
437 dialog->network = network;
438 g_object_ref (network);
440 store = GTK_LIST_STORE (gtk_tree_view_get_model (
441 GTK_TREE_VIEW (dialog->treeview_servers)));
442 gtk_list_store_clear (store);
444 irc_network_dialog_setup (dialog);
448 * empathy_irc_network_dialog_show:
449 * @network: the #EmpathyIrcNetwork to configure
450 * @parent: the parent of this dialog
452 * Display a dialog to configure a given #EmpathyIrcNetwork.
453 * This function is a singleton so if a configuration dialog already
454 * exists we use this one to edit the network.
456 * Returns: The displayed #GtkDialog
459 empathy_irc_network_dialog_show (EmpathyIrcNetwork *network,
462 static EmpathyIrcNetworkDialog *dialog = NULL;
465 GtkCellRenderer *renderer;
466 GtkAdjustment *adjustment;
467 GtkTreeSelection *selection;
468 GtkTreeViewColumn *column;
471 g_return_val_if_fail (network != NULL, NULL);
475 change_network (dialog, network);
476 gtk_window_present (GTK_WINDOW (dialog->dialog));
478 return dialog->dialog;
481 dialog = g_slice_new0 (EmpathyIrcNetworkDialog);
483 dialog->network = network;
484 g_object_ref (dialog->network);
486 filename = empathy_file_lookup ("empathy-account-widget-irc.glade",
488 glade = empathy_glade_get_file (filename,
489 "irc_network_dialog",
491 "irc_network_dialog", &dialog->dialog,
492 "button_close", &dialog->button_close,
493 "entry_network", &dialog->entry_network,
494 "combobox_charset", &dialog->combobox_charset,
495 "treeview_servers", &dialog->treeview_servers,
496 "button_add", &dialog->button_add,
497 "button_remove", &dialog->button_remove,
498 "button_up", &dialog->button_up,
499 "button_down", &dialog->button_down,
503 store = gtk_list_store_new (4, G_TYPE_OBJECT, G_TYPE_STRING,
504 G_TYPE_UINT, G_TYPE_BOOLEAN);
505 gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeview_servers),
506 GTK_TREE_MODEL (store));
507 g_object_unref (store);
510 renderer = gtk_cell_renderer_text_new ();
511 g_object_set (renderer, "editable", TRUE, NULL);
512 g_signal_connect (renderer, "edited",
513 G_CALLBACK (irc_network_dialog_address_edited_cb), dialog);
514 gtk_tree_view_insert_column_with_attributes (
515 GTK_TREE_VIEW (dialog->treeview_servers),
516 -1, _("Server"), renderer, "text", COL_ADR,
520 adjustment = (GtkAdjustment *) gtk_adjustment_new (6667, 1, G_MAXUINT16,
522 renderer = gtk_cell_renderer_spin_new ();
523 g_object_set (renderer,
525 "adjustment", adjustment,
527 g_signal_connect (renderer, "edited",
528 G_CALLBACK (irc_network_dialog_port_edited_cb), dialog);
529 gtk_tree_view_insert_column_with_attributes (
530 GTK_TREE_VIEW (dialog->treeview_servers),
531 -1, _("Port"), renderer, "text", COL_PORT,
533 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
535 gtk_tree_view_column_set_expand (column, TRUE);
538 renderer = gtk_cell_renderer_toggle_new ();
539 g_object_set (renderer, "activatable", TRUE, NULL);
540 g_signal_connect (renderer, "toggled",
541 G_CALLBACK (irc_network_dialog_ssl_toggled_cb), dialog);
542 gtk_tree_view_insert_column_with_attributes (
543 GTK_TREE_VIEW (dialog->treeview_servers),
544 -1, _("SSL"), renderer, "active", COL_SSL,
547 selection = gtk_tree_view_get_selection (
548 GTK_TREE_VIEW (dialog->treeview_servers));
549 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
552 totem_subtitle_encoding_init (GTK_COMBO_BOX (dialog->combobox_charset));
554 irc_network_dialog_setup (dialog);
556 empathy_glade_connect (glade, dialog,
557 "irc_network_dialog", "destroy", irc_network_dialog_destroy_cb,
558 "button_close", "clicked", irc_network_dialog_close_clicked_cb,
559 "entry_network", "focus-out-event", irc_network_dialog_network_focus_cb,
560 "button_add", "clicked", irc_network_dialog_button_add_clicked_cb,
561 "button_remove", "clicked", irc_network_dialog_button_remove_clicked_cb,
562 "button_up", "clicked", irc_network_dialog_button_up_clicked_cb,
563 "button_down", "clicked", irc_network_dialog_button_down_clicked_cb,
564 "combobox_charset", "changed", irc_network_dialog_combobox_charset_changed_cb,
567 g_object_unref (glade);
569 g_object_add_weak_pointer (G_OBJECT (dialog->dialog),
572 g_signal_connect (selection, "changed",
573 G_CALLBACK (irc_network_dialog_selection_changed_cb),
576 gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog),
577 GTK_WINDOW (parent));
578 gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE);
580 irc_network_dialog_network_update_buttons (dialog);
582 return dialog->dialog;