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>
22 #include "empathy-irc-network-dialog.h"
24 #include <glib/gi18n-lib.h>
26 #include "empathy-ui-utils.h"
27 #include "empathy-utils.h"
28 #include "totem-subtitle-encoding.h"
31 EmpathyIrcNetwork *network;
34 GtkWidget *button_close;
36 GtkWidget *entry_network;
37 GtkWidget *combobox_charset;
39 GtkWidget *treeview_servers;
40 GtkWidget *button_add;
41 GtkWidget *button_remove;
43 GtkWidget *button_down;
44 } EmpathyIrcNetworkDialog;
47 irc_network_dialog_destroy_cb (GtkWidget *widget,
48 EmpathyIrcNetworkDialog *dialog)
50 g_object_unref (dialog->network);
52 g_slice_free (EmpathyIrcNetworkDialog, dialog);
56 irc_network_dialog_close_clicked_cb (GtkWidget *widget,
57 EmpathyIrcNetworkDialog *dialog)
59 gtk_widget_destroy (dialog->dialog);
70 add_server_to_store (GtkListStore *store,
71 EmpathyIrcServer *server,
84 gtk_list_store_insert_with_values (store, iter, -1,
95 irc_network_dialog_setup (EmpathyIrcNetworkDialog *dialog)
97 gchar *name, *charset;
101 g_object_get (dialog->network,
105 gtk_entry_set_text (GTK_ENTRY (dialog->entry_network), name);
107 store = GTK_LIST_STORE (gtk_tree_view_get_model (
108 GTK_TREE_VIEW (dialog->treeview_servers)));
110 servers = empathy_irc_network_get_servers (dialog->network);
111 for (l = servers; l != NULL; l = g_slist_next (l))
113 EmpathyIrcServer *server = l->data;
116 add_server_to_store (store, server, &iter);
119 totem_subtitle_encoding_set (GTK_COMBO_BOX (dialog->combobox_charset),
122 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
123 g_slist_free (servers);
129 irc_network_dialog_address_edited_cb (GtkCellRendererText *renderer,
132 EmpathyIrcNetworkDialog *dialog)
134 EmpathyIrcServer *server;
136 GtkTreePath *treepath;
139 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
140 treepath = gtk_tree_path_new_from_string (path);
141 gtk_tree_model_get_iter (model, &iter, treepath);
142 gtk_tree_model_get (model, &iter,
143 COL_SRV_OBJ, &server,
145 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
149 g_object_set (server, "address", new_text, NULL);
151 gtk_tree_path_free (treepath);
152 g_object_unref (server);
156 irc_network_dialog_port_edited_cb (GtkCellRendererText *renderer,
159 EmpathyIrcNetworkDialog *dialog)
161 EmpathyIrcServer *server;
163 GtkTreePath *treepath;
167 port = strtoul (new_text, NULL, 10);
168 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
169 treepath = gtk_tree_path_new_from_string (path);
170 gtk_tree_model_get_iter (model, &iter, treepath);
171 gtk_tree_model_get (model, &iter,
172 COL_SRV_OBJ, &server,
174 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
178 g_object_set (server, "port", port, NULL);
180 gtk_tree_path_free (treepath);
181 g_object_unref (server);
185 irc_network_dialog_ssl_toggled_cb (GtkCellRendererText *renderer,
187 EmpathyIrcNetworkDialog *dialog)
189 EmpathyIrcServer *server;
191 GtkTreePath *treepath;
195 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
196 treepath = gtk_tree_path_new_from_string (path);
197 gtk_tree_model_get_iter (model, &iter, treepath);
198 gtk_tree_model_get (model, &iter,
199 COL_SRV_OBJ, &server,
203 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
207 g_object_set (server, "ssl", ssl, NULL);
209 gtk_tree_path_free (treepath);
210 g_object_unref (server);
214 irc_network_dialog_network_focus_cb (GtkWidget *widget,
215 GdkEventFocus *event,
216 EmpathyIrcNetworkDialog *dialog)
220 str = gtk_entry_get_text (GTK_ENTRY (widget));
222 g_object_set (dialog->network, "name", str, NULL);
228 irc_network_dialog_network_update_buttons (EmpathyIrcNetworkDialog *dialog)
230 GtkTreeSelection *selection;
234 gboolean can_remove = FALSE, can_move_up = FALSE, can_move_down = FALSE;
237 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (
238 dialog->treeview_servers));
240 if (gtk_tree_selection_get_selected (selection, &model, &iter))
242 path = gtk_tree_model_get_path (model, &iter);
244 selected = gtk_tree_path_get_indices (path)[0];
247 can_move_up = selected > 0;
249 selected < gtk_tree_model_iter_n_children (model, NULL) - 1;
251 gtk_tree_path_free (path);
254 gtk_widget_set_sensitive (dialog->button_remove, can_remove);
255 gtk_widget_set_sensitive (dialog->button_up, can_move_up);
256 gtk_widget_set_sensitive (dialog->button_down, can_move_down);
260 irc_network_dialog_button_add_clicked_cb (GtkWidget *widget,
261 EmpathyIrcNetworkDialog *dialog)
263 EmpathyIrcServer *server;
267 GtkTreeViewColumn *column;
269 store = GTK_LIST_STORE (gtk_tree_view_get_model (
270 GTK_TREE_VIEW (dialog->treeview_servers)));
272 server = empathy_irc_server_new (_("new server"), 6667, FALSE);
273 empathy_irc_network_append_server (dialog->network, server);
274 add_server_to_store (store, server, &iter);
276 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
277 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
279 gtk_tree_view_set_cursor (GTK_TREE_VIEW (dialog->treeview_servers), path,
282 irc_network_dialog_network_update_buttons (dialog);
284 gtk_tree_path_free (path);
285 g_object_unref (server);
289 irc_network_dialog_button_remove_clicked_cb (GtkWidget *widget,
290 EmpathyIrcNetworkDialog *dialog)
292 GtkTreeSelection *selection;
295 EmpathyIrcServer *server;
297 selection = gtk_tree_view_get_selection (
298 GTK_TREE_VIEW (dialog->treeview_servers));
300 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
303 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
305 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
306 empathy_irc_network_remove_server (dialog->network, server);
308 irc_network_dialog_network_update_buttons (dialog);
310 g_object_unref (server);
314 irc_network_dialog_button_up_clicked_cb (GtkWidget *widget,
315 EmpathyIrcNetworkDialog *dialog)
317 GtkTreeSelection *selection;
319 GtkTreeIter iter, iter_prev;
322 EmpathyIrcServer *server;
324 selection = gtk_tree_view_get_selection (
325 GTK_TREE_VIEW (dialog->treeview_servers));
327 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
330 path = gtk_tree_model_get_path (model, &iter);
332 if (!gtk_tree_path_prev (path))
334 gtk_tree_path_free (path);
338 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
340 gtk_tree_model_get_iter (model, &iter_prev, path);
341 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
343 pos = gtk_tree_path_get_indices (path);
344 empathy_irc_network_set_server_position (dialog->network, server, *pos);
346 irc_network_dialog_network_update_buttons (dialog);
348 g_object_unref (server);
349 gtk_tree_path_free (path);
353 irc_network_dialog_button_down_clicked_cb (GtkWidget *widget,
354 EmpathyIrcNetworkDialog *dialog)
356 GtkTreeSelection *selection;
358 GtkTreeIter iter, iter_prev;
360 EmpathyIrcServer *server;
363 selection = gtk_tree_view_get_selection (
364 GTK_TREE_VIEW (dialog->treeview_servers));
366 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
369 path = gtk_tree_model_get_path (model, &iter);
371 gtk_tree_path_next (path);
372 if (!gtk_tree_model_get_iter (model, &iter_prev, path))
374 gtk_tree_path_free (path);
378 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
380 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
382 pos = gtk_tree_path_get_indices (path);
383 empathy_irc_network_set_server_position (dialog->network, server, *pos);
385 irc_network_dialog_network_update_buttons (dialog);
387 gtk_tree_path_free (path);
391 irc_network_dialog_selection_changed_cb (GtkTreeSelection *treeselection,
392 EmpathyIrcNetworkDialog *dialog)
394 irc_network_dialog_network_update_buttons (dialog);
398 irc_network_dialog_combobox_charset_changed_cb (GtkWidget *combobox,
399 EmpathyIrcNetworkDialog *dialog)
401 const gchar *charset;
403 charset = totem_subtitle_encoding_get_selected (GTK_COMBO_BOX (combobox));
404 g_object_set (dialog->network, "charset", charset, NULL);
408 change_network (EmpathyIrcNetworkDialog *dialog,
409 EmpathyIrcNetwork *network)
413 if (dialog->network == network)
414 /* No need to change */
417 if (dialog->network != NULL)
419 g_object_unref (dialog->network);
422 dialog->network = network;
423 g_object_ref (network);
425 store = GTK_LIST_STORE (gtk_tree_view_get_model (
426 GTK_TREE_VIEW (dialog->treeview_servers)));
427 gtk_list_store_clear (store);
429 irc_network_dialog_setup (dialog);
433 * empathy_irc_network_dialog_show:
434 * @network: the #EmpathyIrcNetwork to configure
435 * @parent: the parent of this dialog
437 * Display a dialog to configure a given #EmpathyIrcNetwork.
438 * This function is a singleton so if a configuration dialog already
439 * exists we use this one to edit the network.
441 * Returns: The displayed #GtkDialog
444 empathy_irc_network_dialog_show (EmpathyIrcNetwork *network,
447 static EmpathyIrcNetworkDialog *dialog = NULL;
450 GtkCellRenderer *renderer;
451 GtkAdjustment *adjustment;
452 GtkTreeSelection *selection;
453 GtkTreeViewColumn *column;
454 GtkWidget *sw, *toolbar;
455 GtkStyleContext *context;
457 g_return_val_if_fail (network != NULL, NULL);
461 change_network (dialog, network);
462 gtk_window_present (GTK_WINDOW (dialog->dialog));
464 return dialog->dialog;
467 dialog = g_slice_new0 (EmpathyIrcNetworkDialog);
469 dialog->network = network;
470 g_object_ref (dialog->network);
472 gui = empathy_builder_get_resource (ACCOUNT_WIDGETS_RESOURCES_PREFIX "/empathy-account-widget-irc.ui",
473 "irc_network_dialog", &dialog->dialog,
474 "button_close", &dialog->button_close,
475 "entry_network", &dialog->entry_network,
476 "combobox_charset", &dialog->combobox_charset,
477 "treeview_servers", &dialog->treeview_servers,
478 "button_add", &dialog->button_add,
479 "button_remove", &dialog->button_remove,
480 "button_up", &dialog->button_up,
481 "button_down", &dialog->button_down,
482 "scrolledwindow_network_server", &sw,
483 "toolbar_network_server", &toolbar,
486 store = gtk_list_store_new (4, G_TYPE_OBJECT, G_TYPE_STRING,
487 G_TYPE_UINT, G_TYPE_BOOLEAN);
488 gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeview_servers),
489 GTK_TREE_MODEL (store));
490 g_object_unref (store);
493 renderer = gtk_cell_renderer_text_new ();
494 g_object_set (renderer, "editable", TRUE, NULL);
495 g_signal_connect (renderer, "edited",
496 G_CALLBACK (irc_network_dialog_address_edited_cb), dialog);
497 gtk_tree_view_insert_column_with_attributes (
498 GTK_TREE_VIEW (dialog->treeview_servers),
499 -1, _("Server"), renderer, "text", COL_ADR,
501 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
504 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
505 gtk_tree_view_column_set_expand (column, TRUE);
508 adjustment = (GtkAdjustment *) gtk_adjustment_new (6667, 1, G_MAXUINT16,
510 renderer = gtk_cell_renderer_spin_new ();
511 g_object_set (renderer,
513 "adjustment", adjustment,
515 g_signal_connect (renderer, "edited",
516 G_CALLBACK (irc_network_dialog_port_edited_cb), dialog);
518 gtk_tree_view_insert_column_with_attributes (
519 GTK_TREE_VIEW (dialog->treeview_servers),
520 -1, _("Port"), renderer, "text", COL_PORT,
523 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
525 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
526 gtk_tree_view_column_set_expand (column, TRUE);
529 renderer = gtk_cell_renderer_toggle_new ();
530 g_object_set (renderer, "activatable", TRUE, NULL);
531 g_signal_connect (renderer, "toggled",
532 G_CALLBACK (irc_network_dialog_ssl_toggled_cb), dialog);
533 gtk_tree_view_insert_column_with_attributes (
534 GTK_TREE_VIEW (dialog->treeview_servers),
535 -1, _("SSL"), renderer, "active", COL_SSL,
538 selection = gtk_tree_view_get_selection (
539 GTK_TREE_VIEW (dialog->treeview_servers));
540 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
542 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
544 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
546 gtk_tree_view_column_set_expand (column, TRUE);
548 totem_subtitle_encoding_init (GTK_COMBO_BOX (dialog->combobox_charset));
550 irc_network_dialog_setup (dialog);
552 empathy_builder_connect (gui, dialog,
553 "irc_network_dialog", "destroy", irc_network_dialog_destroy_cb,
554 "button_close", "clicked", irc_network_dialog_close_clicked_cb,
555 "entry_network", "focus-out-event", irc_network_dialog_network_focus_cb,
556 "button_add", "clicked", irc_network_dialog_button_add_clicked_cb,
557 "button_remove", "clicked", irc_network_dialog_button_remove_clicked_cb,
558 "button_up", "clicked", irc_network_dialog_button_up_clicked_cb,
559 "button_down", "clicked", irc_network_dialog_button_down_clicked_cb,
560 "combobox_charset", "changed", irc_network_dialog_combobox_charset_changed_cb,
563 g_object_unref (gui);
565 g_object_add_weak_pointer (G_OBJECT (dialog->dialog),
568 g_signal_connect (selection, "changed",
569 G_CALLBACK (irc_network_dialog_selection_changed_cb),
572 gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog),
573 GTK_WINDOW (parent));
574 gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE);
576 /* join the add/remove toolbar to the treeview */
577 context = gtk_widget_get_style_context (sw);
578 gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
580 context = gtk_widget_get_style_context (toolbar);
581 gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
583 irc_network_dialog_network_update_buttons (dialog);
584 gtk_widget_show_all (dialog->dialog);
586 gtk_window_set_resizable (GTK_WINDOW (dialog->dialog), FALSE);
588 return dialog->dialog;