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 "totem-subtitle-encoding.h"
30 EmpathyIrcNetwork *network;
33 GtkWidget *button_close;
35 GtkWidget *entry_network;
36 GtkWidget *combobox_charset;
38 GtkWidget *treeview_servers;
39 GtkWidget *button_add;
40 GtkWidget *button_remove;
42 GtkWidget *button_down;
43 } EmpathyIrcNetworkDialog;
46 irc_network_dialog_destroy_cb (GtkWidget *widget,
47 EmpathyIrcNetworkDialog *dialog)
49 g_object_unref (dialog->network);
51 g_slice_free (EmpathyIrcNetworkDialog, dialog);
55 irc_network_dialog_close_clicked_cb (GtkWidget *widget,
56 EmpathyIrcNetworkDialog *dialog)
58 gtk_widget_destroy (dialog->dialog);
69 add_server_to_store (GtkListStore *store,
70 EmpathyIrcServer *server,
83 gtk_list_store_insert_with_values (store, iter, -1,
94 irc_network_dialog_setup (EmpathyIrcNetworkDialog *dialog)
96 gchar *name, *charset;
100 g_object_get (dialog->network,
104 gtk_entry_set_text (GTK_ENTRY (dialog->entry_network), name);
106 store = GTK_LIST_STORE (gtk_tree_view_get_model (
107 GTK_TREE_VIEW (dialog->treeview_servers)));
109 servers = empathy_irc_network_get_servers (dialog->network);
110 for (l = servers; l != NULL; l = g_slist_next (l))
112 EmpathyIrcServer *server = l->data;
115 add_server_to_store (store, server, &iter);
118 totem_subtitle_encoding_set (GTK_COMBO_BOX (dialog->combobox_charset),
121 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
122 g_slist_free (servers);
128 irc_network_dialog_address_edited_cb (GtkCellRendererText *renderer,
131 EmpathyIrcNetworkDialog *dialog)
133 EmpathyIrcServer *server;
135 GtkTreePath *treepath;
138 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
139 treepath = gtk_tree_path_new_from_string (path);
140 gtk_tree_model_get_iter (model, &iter, treepath);
141 gtk_tree_model_get (model, &iter,
142 COL_SRV_OBJ, &server,
144 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
148 g_object_set (server, "address", new_text, NULL);
150 gtk_tree_path_free (treepath);
151 g_object_unref (server);
155 irc_network_dialog_port_edited_cb (GtkCellRendererText *renderer,
158 EmpathyIrcNetworkDialog *dialog)
160 EmpathyIrcServer *server;
162 GtkTreePath *treepath;
166 port = strtoul (new_text, NULL, 10);
167 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
168 treepath = gtk_tree_path_new_from_string (path);
169 gtk_tree_model_get_iter (model, &iter, treepath);
170 gtk_tree_model_get (model, &iter,
171 COL_SRV_OBJ, &server,
173 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
177 g_object_set (server, "port", port, NULL);
179 gtk_tree_path_free (treepath);
180 g_object_unref (server);
184 irc_network_dialog_ssl_toggled_cb (GtkCellRendererText *renderer,
186 EmpathyIrcNetworkDialog *dialog)
188 EmpathyIrcServer *server;
190 GtkTreePath *treepath;
194 model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_servers));
195 treepath = gtk_tree_path_new_from_string (path);
196 gtk_tree_model_get_iter (model, &iter, treepath);
197 gtk_tree_model_get (model, &iter,
198 COL_SRV_OBJ, &server,
202 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
206 g_object_set (server, "ssl", ssl, NULL);
208 gtk_tree_path_free (treepath);
209 g_object_unref (server);
213 irc_network_dialog_network_focus_cb (GtkWidget *widget,
214 GdkEventFocus *event,
215 EmpathyIrcNetworkDialog *dialog)
219 str = gtk_entry_get_text (GTK_ENTRY (widget));
221 g_object_set (dialog->network, "name", str, NULL);
227 irc_network_dialog_network_update_buttons (EmpathyIrcNetworkDialog *dialog)
229 GtkTreeSelection *selection;
233 gboolean can_remove = FALSE, can_move_up = FALSE, can_move_down = FALSE;
236 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (
237 dialog->treeview_servers));
239 if (gtk_tree_selection_get_selected (selection, &model, &iter))
241 path = gtk_tree_model_get_path (model, &iter);
243 selected = gtk_tree_path_get_indices (path)[0];
246 can_move_up = selected > 0;
248 selected < gtk_tree_model_iter_n_children (model, NULL) - 1;
250 gtk_tree_path_free (path);
253 gtk_widget_set_sensitive (dialog->button_remove, can_remove);
254 gtk_widget_set_sensitive (dialog->button_up, can_move_up);
255 gtk_widget_set_sensitive (dialog->button_down, can_move_down);
259 irc_network_dialog_button_add_clicked_cb (GtkWidget *widget,
260 EmpathyIrcNetworkDialog *dialog)
262 EmpathyIrcServer *server;
266 GtkTreeViewColumn *column;
268 store = GTK_LIST_STORE (gtk_tree_view_get_model (
269 GTK_TREE_VIEW (dialog->treeview_servers)));
271 server = empathy_irc_server_new (_("new server"), 6667, FALSE);
272 empathy_irc_network_append_server (dialog->network, server);
273 add_server_to_store (store, server, &iter);
275 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
276 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
278 gtk_tree_view_set_cursor (GTK_TREE_VIEW (dialog->treeview_servers), path,
281 irc_network_dialog_network_update_buttons (dialog);
283 gtk_tree_path_free (path);
284 g_object_unref (server);
288 irc_network_dialog_button_remove_clicked_cb (GtkWidget *widget,
289 EmpathyIrcNetworkDialog *dialog)
291 GtkTreeSelection *selection;
294 EmpathyIrcServer *server;
296 selection = gtk_tree_view_get_selection (
297 GTK_TREE_VIEW (dialog->treeview_servers));
299 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
302 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
304 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
305 empathy_irc_network_remove_server (dialog->network, server);
307 irc_network_dialog_network_update_buttons (dialog);
309 g_object_unref (server);
313 irc_network_dialog_button_up_clicked_cb (GtkWidget *widget,
314 EmpathyIrcNetworkDialog *dialog)
316 GtkTreeSelection *selection;
318 GtkTreeIter iter, iter_prev;
321 EmpathyIrcServer *server;
323 selection = gtk_tree_view_get_selection (
324 GTK_TREE_VIEW (dialog->treeview_servers));
326 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
329 path = gtk_tree_model_get_path (model, &iter);
331 if (!gtk_tree_path_prev (path))
333 gtk_tree_path_free (path);
337 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
339 gtk_tree_model_get_iter (model, &iter_prev, path);
340 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
342 pos = gtk_tree_path_get_indices (path);
343 empathy_irc_network_set_server_position (dialog->network, server, *pos);
345 irc_network_dialog_network_update_buttons (dialog);
347 g_object_unref (server);
348 gtk_tree_path_free (path);
352 irc_network_dialog_button_down_clicked_cb (GtkWidget *widget,
353 EmpathyIrcNetworkDialog *dialog)
355 GtkTreeSelection *selection;
357 GtkTreeIter iter, iter_prev;
359 EmpathyIrcServer *server;
362 selection = gtk_tree_view_get_selection (
363 GTK_TREE_VIEW (dialog->treeview_servers));
365 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
368 path = gtk_tree_model_get_path (model, &iter);
370 gtk_tree_path_next (path);
371 if (!gtk_tree_model_get_iter (model, &iter_prev, path))
373 gtk_tree_path_free (path);
377 gtk_tree_model_get (model, &iter, COL_SRV_OBJ, &server, -1);
379 gtk_list_store_swap (GTK_LIST_STORE (model), &iter_prev, &iter);
381 pos = gtk_tree_path_get_indices (path);
382 empathy_irc_network_set_server_position (dialog->network, server, *pos);
384 irc_network_dialog_network_update_buttons (dialog);
386 gtk_tree_path_free (path);
390 irc_network_dialog_selection_changed_cb (GtkTreeSelection *treeselection,
391 EmpathyIrcNetworkDialog *dialog)
393 irc_network_dialog_network_update_buttons (dialog);
397 irc_network_dialog_combobox_charset_changed_cb (GtkWidget *combobox,
398 EmpathyIrcNetworkDialog *dialog)
400 const gchar *charset;
402 charset = totem_subtitle_encoding_get_selected (GTK_COMBO_BOX (combobox));
403 g_object_set (dialog->network, "charset", charset, NULL);
407 change_network (EmpathyIrcNetworkDialog *dialog,
408 EmpathyIrcNetwork *network)
412 if (dialog->network == network)
413 /* No need to change */
416 if (dialog->network != NULL)
418 g_object_unref (dialog->network);
421 dialog->network = network;
422 g_object_ref (network);
424 store = GTK_LIST_STORE (gtk_tree_view_get_model (
425 GTK_TREE_VIEW (dialog->treeview_servers)));
426 gtk_list_store_clear (store);
428 irc_network_dialog_setup (dialog);
432 * empathy_irc_network_dialog_show:
433 * @network: the #EmpathyIrcNetwork to configure
434 * @parent: the parent of this dialog
436 * Display a dialog to configure a given #EmpathyIrcNetwork.
437 * This function is a singleton so if a configuration dialog already
438 * exists we use this one to edit the network.
440 * Returns: The displayed #GtkDialog
443 empathy_irc_network_dialog_show (EmpathyIrcNetwork *network,
446 static EmpathyIrcNetworkDialog *dialog = NULL;
449 GtkCellRenderer *renderer;
450 GtkAdjustment *adjustment;
451 GtkTreeSelection *selection;
452 GtkTreeViewColumn *column;
453 GtkWidget *sw, *toolbar;
454 GtkStyleContext *context;
456 g_return_val_if_fail (network != NULL, NULL);
460 change_network (dialog, network);
461 gtk_window_present (GTK_WINDOW (dialog->dialog));
463 return dialog->dialog;
466 dialog = g_slice_new0 (EmpathyIrcNetworkDialog);
468 dialog->network = network;
469 g_object_ref (dialog->network);
471 gui = empathy_builder_get_resource (ACCOUNT_WIDGETS_RESOURCES_PREFIX "/empathy-account-widget-irc.ui",
472 "irc_network_dialog", &dialog->dialog,
473 "button_close", &dialog->button_close,
474 "entry_network", &dialog->entry_network,
475 "combobox_charset", &dialog->combobox_charset,
476 "treeview_servers", &dialog->treeview_servers,
477 "button_add", &dialog->button_add,
478 "button_remove", &dialog->button_remove,
479 "button_up", &dialog->button_up,
480 "button_down", &dialog->button_down,
481 "scrolledwindow_network_server", &sw,
482 "toolbar_network_server", &toolbar,
485 store = gtk_list_store_new (4, G_TYPE_OBJECT, G_TYPE_STRING,
486 G_TYPE_UINT, G_TYPE_BOOLEAN);
487 gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeview_servers),
488 GTK_TREE_MODEL (store));
489 g_object_unref (store);
492 renderer = gtk_cell_renderer_text_new ();
493 g_object_set (renderer, "editable", TRUE, NULL);
494 g_signal_connect (renderer, "edited",
495 G_CALLBACK (irc_network_dialog_address_edited_cb), dialog);
496 gtk_tree_view_insert_column_with_attributes (
497 GTK_TREE_VIEW (dialog->treeview_servers),
498 -1, _("Server"), renderer, "text", COL_ADR,
500 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
503 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
504 gtk_tree_view_column_set_expand (column, TRUE);
507 adjustment = (GtkAdjustment *) gtk_adjustment_new (6667, 1, G_MAXUINT16,
509 renderer = gtk_cell_renderer_spin_new ();
510 g_object_set (renderer,
512 "adjustment", adjustment,
514 g_signal_connect (renderer, "edited",
515 G_CALLBACK (irc_network_dialog_port_edited_cb), dialog);
517 gtk_tree_view_insert_column_with_attributes (
518 GTK_TREE_VIEW (dialog->treeview_servers),
519 -1, _("Port"), renderer, "text", COL_PORT,
522 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
524 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
525 gtk_tree_view_column_set_expand (column, TRUE);
528 renderer = gtk_cell_renderer_toggle_new ();
529 g_object_set (renderer, "activatable", TRUE, NULL);
530 g_signal_connect (renderer, "toggled",
531 G_CALLBACK (irc_network_dialog_ssl_toggled_cb), dialog);
532 gtk_tree_view_insert_column_with_attributes (
533 GTK_TREE_VIEW (dialog->treeview_servers),
534 -1, _("SSL"), renderer, "active", COL_SSL,
537 selection = gtk_tree_view_get_selection (
538 GTK_TREE_VIEW (dialog->treeview_servers));
539 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
541 column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
543 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
545 gtk_tree_view_column_set_expand (column, TRUE);
547 totem_subtitle_encoding_init (GTK_COMBO_BOX (dialog->combobox_charset));
549 irc_network_dialog_setup (dialog);
551 empathy_builder_connect (gui, dialog,
552 "irc_network_dialog", "destroy", irc_network_dialog_destroy_cb,
553 "button_close", "clicked", irc_network_dialog_close_clicked_cb,
554 "entry_network", "focus-out-event", irc_network_dialog_network_focus_cb,
555 "button_add", "clicked", irc_network_dialog_button_add_clicked_cb,
556 "button_remove", "clicked", irc_network_dialog_button_remove_clicked_cb,
557 "button_up", "clicked", irc_network_dialog_button_up_clicked_cb,
558 "button_down", "clicked", irc_network_dialog_button_down_clicked_cb,
559 "combobox_charset", "changed", irc_network_dialog_combobox_charset_changed_cb,
562 g_object_unref (gui);
564 g_object_add_weak_pointer (G_OBJECT (dialog->dialog),
567 g_signal_connect (selection, "changed",
568 G_CALLBACK (irc_network_dialog_selection_changed_cb),
571 gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog),
572 GTK_WINDOW (parent));
573 gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE);
575 /* join the add/remove toolbar to the treeview */
576 context = gtk_widget_get_style_context (sw);
577 gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
579 context = gtk_widget_get_style_context (toolbar);
580 gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
582 irc_network_dialog_network_update_buttons (dialog);
583 gtk_widget_show_all (dialog->dialog);
585 gtk_window_set_resizable (GTK_WINDOW (dialog->dialog), FALSE);
587 return dialog->dialog;