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;
470
g_return_val_if_fail (network != NULL, NULL);
474
change_network (dialog, network);
475
gtk_window_present (GTK_WINDOW (dialog->dialog));
477
return dialog->dialog;
480
dialog = g_slice_new0 (EmpathyIrcNetworkDialog);
482
dialog->network = network;
483
g_object_ref (dialog->network);
485
glade = empathy_glade_get_file ("empathy-account-widget-irc.glade",
486
"irc_network_dialog",
488
"irc_network_dialog", &dialog->dialog,
489
"button_close", &dialog->button_close,
490
"entry_network", &dialog->entry_network,
491
"combobox_charset", &dialog->combobox_charset,
492
"treeview_servers", &dialog->treeview_servers,
493
"button_add", &dialog->button_add,
494
"button_remove", &dialog->button_remove,
495
"button_up", &dialog->button_up,
496
"button_down", &dialog->button_down,
499
store = gtk_list_store_new (4, G_TYPE_OBJECT, G_TYPE_STRING,
500
G_TYPE_UINT, G_TYPE_BOOLEAN);
501
gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeview_servers),
502
GTK_TREE_MODEL (store));
503
g_object_unref (store);
506
renderer = gtk_cell_renderer_text_new ();
507
g_object_set (renderer, "editable", TRUE, NULL);
508
g_signal_connect (renderer, "edited",
509
G_CALLBACK (irc_network_dialog_address_edited_cb), dialog);
510
gtk_tree_view_insert_column_with_attributes (
511
GTK_TREE_VIEW (dialog->treeview_servers),
512
-1, _("Server"), renderer, "text", COL_ADR,
516
adjustment = (GtkAdjustment *) gtk_adjustment_new (6667, 1, G_MAXUINT16,
518
renderer = gtk_cell_renderer_spin_new ();
519
g_object_set (renderer,
521
"adjustment", adjustment,
523
g_signal_connect (renderer, "edited",
524
G_CALLBACK (irc_network_dialog_port_edited_cb), dialog);
525
gtk_tree_view_insert_column_with_attributes (
526
GTK_TREE_VIEW (dialog->treeview_servers),
527
-1, _("Port"), renderer, "text", COL_PORT,
529
column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_servers),
531
gtk_tree_view_column_set_expand (column, TRUE);
534
renderer = gtk_cell_renderer_toggle_new ();
535
g_object_set (renderer, "activatable", TRUE, NULL);
536
g_signal_connect (renderer, "toggled",
537
G_CALLBACK (irc_network_dialog_ssl_toggled_cb), dialog);
538
gtk_tree_view_insert_column_with_attributes (
539
GTK_TREE_VIEW (dialog->treeview_servers),
540
-1, _("SSL"), renderer, "active", COL_SSL,
543
selection = gtk_tree_view_get_selection (
544
GTK_TREE_VIEW (dialog->treeview_servers));
545
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
548
totem_subtitle_encoding_init (GTK_COMBO_BOX (dialog->combobox_charset));
550
irc_network_dialog_setup (dialog);
552
empathy_glade_connect (glade, 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 (glade);
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
irc_network_dialog_network_update_buttons (dialog);
578
return dialog->dialog;