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>
23 #include <glib/gi18n-lib.h>
25 #include <libempathy/empathy-utils.h>
27 #include "empathy-ui-utils.h"
28 #include "totem-subtitle-encoding.h"
30 #include "empathy-irc-network-dialog.h"
33 EmpathyIrcNetwork *network;
36 GtkWidget *button_close;
38 GtkWidget *entry_network;
39 GtkWidget *combobox_charset;
41 GtkWidget *treeview_servers;
42 GtkWidget *button_add;
43 GtkWidget *button_remove;
45 GtkWidget *button_down;
46 } EmpathyIrcNetworkDialog;
49 irc_network_dialog_destroy_cb (GtkWidget *widget,
50 EmpathyIrcNetworkDialog *dialog)
52 g_object_unref (dialog->network);
54 g_slice_free (EmpathyIrcNetworkDialog, dialog);
58 irc_network_dialog_close_clicked_cb (GtkWidget *widget,
59 EmpathyIrcNetworkDialog *dialog)
61 gtk_widget_destroy (dialog->dialog);
72 add_server_to_store (GtkListStore *store,
73 EmpathyIrcServer *server,
86 gtk_list_store_insert_with_values (store, iter, -1,
97 irc_network_dialog_setup (EmpathyIrcNetworkDialog *dialog)
99 gchar *name, *charset;
103 g_object_get (dialog->network,
107 gtk_entry_set_text (GTK_ENTRY (dialog->entry_network), name);
109 store = GTK_LIST_STORE (gtk_tree_view_get_model (
110 GTK_TREE_VIEW (dialog->treeview_servers)));
112 servers = empathy_irc_network_get_servers (dialog->network);
113 for (l = servers; l != NULL; l = g_slist_next (l))
115 EmpathyIrcServer *server = l->data;
118 add_server_to_store (store, server, &iter);
121 totem_subtitle_encoding_set (GTK_COMBO_BOX (dialog->combobox_charset),
124 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
125 g_slist_free (servers);
131 irc_network_dialog_address_edited_cb (GtkCellRendererText *renderer,
134 EmpathyIrcNetworkDialog *dialog)
136 EmpathyIrcServer *server;
138 GtkTreePath *treepath;
141 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
142 treepath = gtk_tree_path_new_from_string (path);
143 gtk_tree_model_get_iter (model, &iter, treepath);
144 gtk_tree_model_get (model, &iter,
145 COL_SRV_OBJ, &server,
147 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
151 g_object_set (server, "address", new_text, NULL);
153 gtk_tree_path_free (treepath);
154 g_object_unref (server);
158 irc_network_dialog_port_edited_cb (GtkCellRendererText *renderer,
161 EmpathyIrcNetworkDialog *dialog)
163 EmpathyIrcServer *server;
165 GtkTreePath *treepath;
169 port = strtoul (new_text, NULL, 10);
170 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
171 treepath = gtk_tree_path_new_from_string (path);
172 gtk_tree_model_get_iter (model, &iter, treepath);
173 gtk_tree_model_get (model, &iter,
174 COL_SRV_OBJ, &server,
176 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
180 g_object_set (server, "port", port, NULL);
182 gtk_tree_path_free (treepath);
183 g_object_unref (server);
187 irc_network_dialog_ssl_toggled_cb (GtkCellRendererText *renderer,
189 EmpathyIrcNetworkDialog *dialog)
191 EmpathyIrcServer *server;
193 GtkTreePath *treepath;
197 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
198 treepath = gtk_tree_path_new_from_string (path);
199 gtk_tree_model_get_iter (model, &iter, treepath);
200 gtk_tree_model_get (model, &iter,
201 COL_SRV_OBJ, &server,
205 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
209 g_object_set (server, "ssl", ssl, NULL);
211 gtk_tree_path_free (treepath);
212 g_object_unref (server);
216 irc_network_dialog_network_focus_cb (GtkWidget *widget,
217 GdkEventFocus *event,
218 EmpathyIrcNetworkDialog *dialog)
222 str = gtk_entry_get_text (GTK_ENTRY (widget));
224 g_object_set (dialog->network, "name", str, NULL);
230 irc_network_dialog_network_update_buttons (EmpathyIrcNetworkDialog *dialog)
232 GtkTreeSelection *selection;
236 gboolean can_remove = FALSE, can_move_up = FALSE, can_move_down = FALSE;
239 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (
240 dialog->treeview_servers));
242 if (gtk_tree_selection_get_selected (selection, &model, &iter))
244 path = gtk_tree_model_get_path (model, &iter);
246 selected = gtk_tree_path_get_indices (path)[0];
249 can_move_up = selected > 0;
251 selected < gtk_tree_model_iter_n_children (model, NULL) - 1;
253 gtk_tree_path_free (path);
256 gtk_widget_set_sensitive (dialog->button_remove, can_remove);
257 gtk_widget_set_sensitive (dialog->button_up, can_move_up);
258 gtk_widget_set_sensitive (dialog->button_down, can_move_down);
262 irc_network_dialog_button_add_clicked_cb (GtkWidget *widget,
263 EmpathyIrcNetworkDialog *dialog)
265 EmpathyIrcServer *server;
269 GtkTreeViewColumn *column;
271 store = GTK_LIST_STORE (gtk_tree_view_get_model (
272 GTK_TREE_VIEW (dialog->treeview_servers)));
274 server = empathy_irc_server_new (_("new server"), 6667, FALSE);
275 empathy_irc_network_append_server (dialog->network, server);
276 add_server_to_store (store, server, &iter);
278 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
279 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
281 gtk_tree_view_set_cursor (GTK_TREE_VIEW (dialog->treeview_servers), path,
284 irc_network_dialog_network_update_buttons (dialog);
286 gtk_tree_path_free (path);
287 g_object_unref (server);
291 irc_network_dialog_button_remove_clicked_cb (GtkWidget *widget,
292 EmpathyIrcNetworkDialog *dialog)
294 GtkTreeSelection *selection;
297 EmpathyIrcServer *server;
299 selection = gtk_tree_view_get_selection (
300 GTK_TREE_VIEW (dialog->treeview_servers));
302 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
305 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
307 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
308 empathy_irc_network_remove_server (dialog->network, server);
310 irc_network_dialog_network_update_buttons (dialog);
312 g_object_unref (server);
316 irc_network_dialog_button_up_clicked_cb (GtkWidget *widget,
317 EmpathyIrcNetworkDialog *dialog)
319 GtkTreeSelection *selection;
321 GtkTreeIter iter, iter_prev;
324 EmpathyIrcServer *server;
326 selection = gtk_tree_view_get_selection (
327 GTK_TREE_VIEW (dialog->treeview_servers));
329 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
332 path = gtk_tree_model_get_path (model, &iter);
334 if (!gtk_tree_path_prev (path))
336 gtk_tree_path_free (path);
340 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
342 gtk_tree_model_get_iter (model, &iter_prev, path);
343 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
345 pos = gtk_tree_path_get_indices (path);
346 empathy_irc_network_set_server_position (dialog->network, server, *pos);
348 irc_network_dialog_network_update_buttons (dialog);
350 g_object_unref (server);
351 gtk_tree_path_free (path);
355 irc_network_dialog_button_down_clicked_cb (GtkWidget *widget,
356 EmpathyIrcNetworkDialog *dialog)
358 GtkTreeSelection *selection;
360 GtkTreeIter iter, iter_prev;
362 EmpathyIrcServer *server;
365 selection = gtk_tree_view_get_selection (
366 GTK_TREE_VIEW (dialog->treeview_servers));
368 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
371 path = gtk_tree_model_get_path (model, &iter);
373 gtk_tree_path_next (path);
374 if (!gtk_tree_model_get_iter (model, &iter_prev, path))
376 gtk_tree_path_free (path);
380 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
382 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
384 pos = gtk_tree_path_get_indices (path);
385 empathy_irc_network_set_server_position (dialog->network, server, *pos);
387 irc_network_dialog_network_update_buttons (dialog);
389 gtk_tree_path_free (path);
393 irc_network_dialog_selection_changed_cb (GtkTreeSelection *treeselection,
394 EmpathyIrcNetworkDialog *dialog)
396 irc_network_dialog_network_update_buttons (dialog);
400 irc_network_dialog_combobox_charset_changed_cb (GtkWidget *combobox,
401 EmpathyIrcNetworkDialog *dialog)
403 const gchar *charset;
405 charset = totem_subtitle_encoding_get_selected (GTK_COMBO_BOX (combobox));
406 g_object_set (dialog->network, "charset", charset, NULL);
410 change_network (EmpathyIrcNetworkDialog *dialog,
411 EmpathyIrcNetwork *network)
415 if (dialog->network == network)
416 /* No need to change */
419 if (dialog->network != NULL)
421 g_object_unref (dialog->network);
424 dialog->network = network;
425 g_object_ref (network);
427 store = GTK_LIST_STORE (gtk_tree_view_get_model (
428 GTK_TREE_VIEW (dialog->treeview_servers)));
429 gtk_list_store_clear (store);
431 irc_network_dialog_setup (dialog);
435 * empathy_irc_network_dialog_show:
436 * @network: the #EmpathyIrcNetwork to configure
437 * @parent: the parent of this dialog
439 * Display a dialog to configure a given #EmpathyIrcNetwork.
440 * This function is a singleton so if a configuration dialog already
441 * exists we use this one to edit the network.
443 * Returns: The displayed #GtkDialog
446 empathy_irc_network_dialog_show (EmpathyIrcNetwork *network,
449 static EmpathyIrcNetworkDialog *dialog = NULL;
452 GtkCellRenderer *renderer;
453 GtkAdjustment *adjustment;
454 GtkTreeSelection *selection;
455 GtkTreeViewColumn *column;
456 GtkWidget *sw, *toolbar;
457 GtkStyleContext *context;
459 g_return_val_if_fail (network != NULL, NULL);
463 change_network (dialog, network);
464 gtk_window_present (GTK_WINDOW (dialog->dialog));
466 return dialog->dialog;
469 dialog = g_slice_new0 (EmpathyIrcNetworkDialog);
471 dialog->network = network;
472 g_object_ref (dialog->network);
474 gui = empathy_builder_get_resource (ACCOUNT_WIDGETS_RESOURCES_PREFIX "/empathy-account-widget-irc.ui",
475 "irc_network_dialog", &dialog->dialog,
476 "button_close", &dialog->button_close,
477 "entry_network", &dialog->entry_network,
478 "combobox_charset", &dialog->combobox_charset,
479 "treeview_servers", &dialog->treeview_servers,
480 "button_add", &dialog->button_add,
481 "button_remove", &dialog->button_remove,
482 "button_up", &dialog->button_up,
483 "button_down", &dialog->button_down,
484 "scrolledwindow_network_server", &sw,
485 "toolbar_network_server", &toolbar,
488 store = gtk_list_store_new (4, G_TYPE_OBJECT, G_TYPE_STRING,
489 G_TYPE_UINT, G_TYPE_BOOLEAN);
490 gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeview_servers),
491 GTK_TREE_MODEL (store));
492 g_object_unref (store);
495 renderer = gtk_cell_renderer_text_new ();
496 g_object_set (renderer, "editable", TRUE, NULL);
497 g_signal_connect (renderer, "edited",
498 G_CALLBACK (irc_network_dialog_address_edited_cb), dialog);
499 gtk_tree_view_insert_column_with_attributes (
500 GTK_TREE_VIEW (dialog->treeview_servers),
501 -1, _("Server"), renderer, "text", COL_ADR,
503 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
506 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
507 gtk_tree_view_column_set_expand (column, TRUE);
510 adjustment = (GtkAdjustment *) gtk_adjustment_new (6667, 1, G_MAXUINT16,
512 renderer = gtk_cell_renderer_spin_new ();
513 g_object_set (renderer,
515 "adjustment", adjustment,
517 g_signal_connect (renderer, "edited",
518 G_CALLBACK (irc_network_dialog_port_edited_cb), dialog);
520 gtk_tree_view_insert_column_with_attributes (
521 GTK_TREE_VIEW (dialog->treeview_servers),
522 -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_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
528 gtk_tree_view_column_set_expand (column, TRUE);
531 renderer = gtk_cell_renderer_toggle_new ();
532 g_object_set (renderer, "activatable", TRUE, NULL);
533 g_signal_connect (renderer, "toggled",
534 G_CALLBACK (irc_network_dialog_ssl_toggled_cb), dialog);
535 gtk_tree_view_insert_column_with_attributes (
536 GTK_TREE_VIEW (dialog->treeview_servers),
537 -1, _("SSL"), renderer, "active", COL_SSL,
540 selection = gtk_tree_view_get_selection (
541 GTK_TREE_VIEW (dialog->treeview_servers));
542 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
544 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
546 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
548 gtk_tree_view_column_set_expand (column, TRUE);
550 totem_subtitle_encoding_init (GTK_COMBO_BOX (dialog->combobox_charset));
552 irc_network_dialog_setup (dialog);
554 empathy_builder_connect (gui, dialog,
555 "irc_network_dialog", "destroy", irc_network_dialog_destroy_cb,
556 "button_close", "clicked", irc_network_dialog_close_clicked_cb,
557 "entry_network", "focus-out-event", irc_network_dialog_network_focus_cb,
558 "button_add", "clicked", irc_network_dialog_button_add_clicked_cb,
559 "button_remove", "clicked", irc_network_dialog_button_remove_clicked_cb,
560 "button_up", "clicked", irc_network_dialog_button_up_clicked_cb,
561 "button_down", "clicked", irc_network_dialog_button_down_clicked_cb,
562 "combobox_charset", "changed", irc_network_dialog_combobox_charset_changed_cb,
565 g_object_unref (gui);
567 g_object_add_weak_pointer (G_OBJECT (dialog->dialog),
570 g_signal_connect (selection, "changed",
571 G_CALLBACK (irc_network_dialog_selection_changed_cb),
574 gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog),
575 GTK_WINDOW (parent));
576 gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE);
578 /* join the add/remove toolbar to the treeview */
579 context = gtk_widget_get_style_context (sw);
580 gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
582 context = gtk_widget_get_style_context (toolbar);
583 gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
585 irc_network_dialog_network_update_buttons (dialog);
586 gtk_widget_show_all (dialog->dialog);
588 gtk_window_set_resizable (GTK_WINDOW (dialog->dialog), FALSE);
590 return dialog->dialog;