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-lib.h>
30 #include <libempathy/empathy-utils.h>
32 #include <libempathy/empathy-irc-network-manager.h>
33 #include "empathy-ui-utils.h"
34 #include "totem-subtitle-encoding.h"
36 #include "empathy-irc-network-dialog.h"
39 EmpathyIrcNetwork
*network
;
42 GtkWidget
*button_close
;
44 GtkWidget
*entry_network
;
45 GtkWidget
*combobox_charset
;
47 GtkWidget
*treeview_servers
;
48 GtkWidget
*button_add
;
49 GtkWidget
*button_remove
;
51 GtkWidget
*button_down
;
52 } EmpathyIrcNetworkDialog
;
55 irc_network_dialog_destroy_cb (GtkWidget
*widget
,
56 EmpathyIrcNetworkDialog
*dialog
)
58 g_object_unref (dialog
->network
);
60 g_slice_free (EmpathyIrcNetworkDialog
, dialog
);
64 irc_network_dialog_close_clicked_cb (GtkWidget
*widget
,
65 EmpathyIrcNetworkDialog
*dialog
)
67 gtk_widget_destroy (dialog
->dialog
);
78 add_server_to_store (GtkListStore
*store
,
79 EmpathyIrcServer
*server
,
92 gtk_list_store_insert_with_values (store
, iter
, -1,
103 irc_network_dialog_setup (EmpathyIrcNetworkDialog
*dialog
)
105 gchar
*name
, *charset
;
109 g_object_get (dialog
->network
,
113 gtk_entry_set_text (GTK_ENTRY (dialog
->entry_network
), name
);
115 store
= GTK_LIST_STORE (gtk_tree_view_get_model (
116 GTK_TREE_VIEW (dialog
->treeview_servers
)));
118 servers
= empathy_irc_network_get_servers (dialog
->network
);
119 for (l
= servers
; l
!= NULL
; l
= g_slist_next (l
))
121 EmpathyIrcServer
*server
= l
->data
;
124 add_server_to_store (store
, server
, &iter
);
127 totem_subtitle_encoding_set (GTK_COMBO_BOX (dialog
->combobox_charset
),
130 g_slist_foreach (servers
, (GFunc
) g_object_unref
, NULL
);
131 g_slist_free (servers
);
137 irc_network_dialog_address_edited_cb (GtkCellRendererText
*renderer
,
140 EmpathyIrcNetworkDialog
*dialog
)
142 EmpathyIrcServer
*server
;
144 GtkTreePath
*treepath
;
147 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (dialog
->treeview_servers
));
148 treepath
= gtk_tree_path_new_from_string (path
);
149 gtk_tree_model_get_iter (model
, &iter
, treepath
);
150 gtk_tree_model_get (model
, &iter
,
151 COL_SRV_OBJ
, &server
,
153 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
157 g_object_set (server
, "address", new_text
, NULL
);
159 gtk_tree_path_free (treepath
);
160 g_object_unref (server
);
164 irc_network_dialog_port_edited_cb (GtkCellRendererText
*renderer
,
167 EmpathyIrcNetworkDialog
*dialog
)
169 EmpathyIrcServer
*server
;
171 GtkTreePath
*treepath
;
175 port
= strtoul (new_text
, NULL
, 10);
176 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (dialog
->treeview_servers
));
177 treepath
= gtk_tree_path_new_from_string (path
);
178 gtk_tree_model_get_iter (model
, &iter
, treepath
);
179 gtk_tree_model_get (model
, &iter
,
180 COL_SRV_OBJ
, &server
,
182 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
186 g_object_set (server
, "port", port
, NULL
);
188 gtk_tree_path_free (treepath
);
189 g_object_unref (server
);
193 irc_network_dialog_ssl_toggled_cb (GtkCellRendererText
*renderer
,
195 EmpathyIrcNetworkDialog
*dialog
)
197 EmpathyIrcServer
*server
;
199 GtkTreePath
*treepath
;
203 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (dialog
->treeview_servers
));
204 treepath
= gtk_tree_path_new_from_string (path
);
205 gtk_tree_model_get_iter (model
, &iter
, treepath
);
206 gtk_tree_model_get (model
, &iter
,
207 COL_SRV_OBJ
, &server
,
211 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
215 g_object_set (server
, "ssl", ssl
, NULL
);
217 gtk_tree_path_free (treepath
);
218 g_object_unref (server
);
222 irc_network_dialog_network_focus_cb (GtkWidget
*widget
,
223 GdkEventFocus
*event
,
224 EmpathyIrcNetworkDialog
*dialog
)
228 str
= gtk_entry_get_text (GTK_ENTRY (widget
));
230 g_object_set (dialog
->network
, "name", str
, NULL
);
236 irc_network_dialog_network_update_buttons (EmpathyIrcNetworkDialog
*dialog
)
238 GtkTreeSelection
*selection
;
242 gboolean can_remove
= FALSE
, can_move_up
= FALSE
, can_move_down
= FALSE
;
245 selection
= gtk_tree_view_get_selection (GTK_TREE_VIEW (
246 dialog
->treeview_servers
));
248 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
250 path
= gtk_tree_model_get_path (model
, &iter
);
252 selected
= gtk_tree_path_get_indices (path
)[0];
255 can_move_up
= selected
> 0;
257 selected
< gtk_tree_model_iter_n_children (model
, NULL
) - 1;
259 gtk_tree_path_free (path
);
262 gtk_widget_set_sensitive (dialog
->button_remove
, can_remove
);
263 gtk_widget_set_sensitive (dialog
->button_up
, can_move_up
);
264 gtk_widget_set_sensitive (dialog
->button_down
, can_move_down
);
268 irc_network_dialog_button_add_clicked_cb (GtkWidget
*widget
,
269 EmpathyIrcNetworkDialog
*dialog
)
271 EmpathyIrcServer
*server
;
275 GtkTreeViewColumn
*column
;
277 store
= GTK_LIST_STORE (gtk_tree_view_get_model (
278 GTK_TREE_VIEW (dialog
->treeview_servers
)));
280 server
= empathy_irc_server_new (_("new server"), 6667, FALSE
);
281 empathy_irc_network_append_server (dialog
->network
, server
);
282 add_server_to_store (store
, server
, &iter
);
284 path
= gtk_tree_model_get_path (GTK_TREE_MODEL (store
), &iter
);
285 column
= gtk_tree_view_get_column (GTK_TREE_VIEW (dialog
->treeview_servers
),
287 gtk_tree_view_set_cursor (GTK_TREE_VIEW (dialog
->treeview_servers
), path
,
290 irc_network_dialog_network_update_buttons (dialog
);
292 gtk_tree_path_free (path
);
293 g_object_unref (server
);
297 irc_network_dialog_button_remove_clicked_cb (GtkWidget
*widget
,
298 EmpathyIrcNetworkDialog
*dialog
)
300 GtkTreeSelection
*selection
;
303 EmpathyIrcServer
*server
;
305 selection
= gtk_tree_view_get_selection (
306 GTK_TREE_VIEW (dialog
->treeview_servers
));
308 if (!gtk_tree_selection_get_selected (selection
, &model
, &iter
))
311 gtk_tree_model_get (model
, &iter
, COL_SRV_OBJ
, &server
, -1);
313 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
314 empathy_irc_network_remove_server (dialog
->network
, server
);
316 irc_network_dialog_network_update_buttons (dialog
);
318 g_object_unref (server
);
322 irc_network_dialog_button_up_clicked_cb (GtkWidget
*widget
,
323 EmpathyIrcNetworkDialog
*dialog
)
325 GtkTreeSelection
*selection
;
327 GtkTreeIter iter
, iter_prev
;
330 EmpathyIrcServer
*server
;
332 selection
= gtk_tree_view_get_selection (
333 GTK_TREE_VIEW (dialog
->treeview_servers
));
335 if (!gtk_tree_selection_get_selected (selection
, &model
, &iter
))
338 path
= gtk_tree_model_get_path (model
, &iter
);
340 if (!gtk_tree_path_prev (path
))
342 gtk_tree_path_free (path
);
346 gtk_tree_model_get (model
, &iter
, COL_SRV_OBJ
, &server
, -1);
348 gtk_tree_model_get_iter (model
, &iter_prev
, path
);
349 gtk_list_store_swap (GTK_LIST_STORE (model
), &iter_prev
, &iter
);
351 pos
= gtk_tree_path_get_indices (path
);
352 empathy_irc_network_set_server_position (dialog
->network
, server
, *pos
);
354 irc_network_dialog_network_update_buttons (dialog
);
356 g_object_unref (server
);
357 gtk_tree_path_free (path
);
361 irc_network_dialog_button_down_clicked_cb (GtkWidget
*widget
,
362 EmpathyIrcNetworkDialog
*dialog
)
364 GtkTreeSelection
*selection
;
366 GtkTreeIter iter
, iter_prev
;
368 EmpathyIrcServer
*server
;
371 selection
= gtk_tree_view_get_selection (
372 GTK_TREE_VIEW (dialog
->treeview_servers
));
374 if (!gtk_tree_selection_get_selected (selection
, &model
, &iter
))
377 path
= gtk_tree_model_get_path (model
, &iter
);
379 gtk_tree_path_next (path
);
380 if (!gtk_tree_model_get_iter (model
, &iter_prev
, path
))
382 gtk_tree_path_free (path
);
386 gtk_tree_model_get (model
, &iter
, COL_SRV_OBJ
, &server
, -1);
388 gtk_list_store_swap (GTK_LIST_STORE (model
), &iter_prev
, &iter
);
390 pos
= gtk_tree_path_get_indices (path
);
391 empathy_irc_network_set_server_position (dialog
->network
, server
, *pos
);
393 irc_network_dialog_network_update_buttons (dialog
);
395 gtk_tree_path_free (path
);
399 irc_network_dialog_selection_changed_cb (GtkTreeSelection
*treeselection
,
400 EmpathyIrcNetworkDialog
*dialog
)
402 irc_network_dialog_network_update_buttons (dialog
);
406 irc_network_dialog_combobox_charset_changed_cb (GtkWidget
*combobox
,
407 EmpathyIrcNetworkDialog
*dialog
)
409 const gchar
*charset
;
411 charset
= totem_subtitle_encoding_get_selected (GTK_COMBO_BOX (combobox
));
412 g_object_set (dialog
->network
, "charset", charset
, NULL
);
416 change_network (EmpathyIrcNetworkDialog
*dialog
,
417 EmpathyIrcNetwork
*network
)
421 if (dialog
->network
== network
)
422 /* No need to change */
425 if (dialog
->network
!= NULL
)
427 g_object_unref (dialog
->network
);
430 dialog
->network
= network
;
431 g_object_ref (network
);
433 store
= GTK_LIST_STORE (gtk_tree_view_get_model (
434 GTK_TREE_VIEW (dialog
->treeview_servers
)));
435 gtk_list_store_clear (store
);
437 irc_network_dialog_setup (dialog
);
441 * empathy_irc_network_dialog_show:
442 * @network: the #EmpathyIrcNetwork to configure
443 * @parent: the parent of this dialog
445 * Display a dialog to configure a given #EmpathyIrcNetwork.
446 * This function is a singleton so if a configuration dialog already
447 * exists we use this one to edit the network.
449 * Returns: The displayed #GtkDialog
452 empathy_irc_network_dialog_show (EmpathyIrcNetwork
*network
,
455 static EmpathyIrcNetworkDialog
*dialog
= NULL
;
458 GtkCellRenderer
*renderer
;
459 GtkAdjustment
*adjustment
;
460 GtkTreeSelection
*selection
;
461 GtkTreeViewColumn
*column
;
464 g_return_val_if_fail (network
!= NULL
, NULL
);
468 change_network (dialog
, network
);
469 gtk_window_present (GTK_WINDOW (dialog
->dialog
));
471 return dialog
->dialog
;
474 dialog
= g_slice_new0 (EmpathyIrcNetworkDialog
);
476 dialog
->network
= network
;
477 g_object_ref (dialog
->network
);
479 filename
= empathy_file_lookup ("empathy-account-widget-irc.ui",
481 gui
= empathy_builder_get_file (filename
,
482 "irc_network_dialog", &dialog
->dialog
,
483 "button_close", &dialog
->button_close
,
484 "entry_network", &dialog
->entry_network
,
485 "combobox_charset", &dialog
->combobox_charset
,
486 "treeview_servers", &dialog
->treeview_servers
,
487 "button_add", &dialog
->button_add
,
488 "button_remove", &dialog
->button_remove
,
489 "button_up", &dialog
->button_up
,
490 "button_down", &dialog
->button_down
,
494 store
= gtk_list_store_new (4, G_TYPE_OBJECT
, G_TYPE_STRING
,
495 G_TYPE_UINT
, G_TYPE_BOOLEAN
);
496 gtk_tree_view_set_model (GTK_TREE_VIEW (dialog
->treeview_servers
),
497 GTK_TREE_MODEL (store
));
498 g_object_unref (store
);
501 renderer
= gtk_cell_renderer_text_new ();
502 g_object_set (renderer
, "editable", TRUE
, NULL
);
503 g_signal_connect (renderer
, "edited",
504 G_CALLBACK (irc_network_dialog_address_edited_cb
), dialog
);
505 gtk_tree_view_insert_column_with_attributes (
506 GTK_TREE_VIEW (dialog
->treeview_servers
),
507 -1, _("Server"), renderer
, "text", COL_ADR
,
511 adjustment
= (GtkAdjustment
*) gtk_adjustment_new (6667, 1, G_MAXUINT16
,
513 renderer
= gtk_cell_renderer_spin_new ();
514 g_object_set (renderer
,
516 "adjustment", adjustment
,
518 g_signal_connect (renderer
, "edited",
519 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
,
524 column
= gtk_tree_view_get_column (GTK_TREE_VIEW (dialog
->treeview_servers
),
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
);
543 totem_subtitle_encoding_init (GTK_COMBO_BOX (dialog
->combobox_charset
));
545 irc_network_dialog_setup (dialog
);
547 empathy_builder_connect (gui
, dialog
,
548 "irc_network_dialog", "destroy", irc_network_dialog_destroy_cb
,
549 "button_close", "clicked", irc_network_dialog_close_clicked_cb
,
550 "entry_network", "focus-out-event", irc_network_dialog_network_focus_cb
,
551 "button_add", "clicked", irc_network_dialog_button_add_clicked_cb
,
552 "button_remove", "clicked", irc_network_dialog_button_remove_clicked_cb
,
553 "button_up", "clicked", irc_network_dialog_button_up_clicked_cb
,
554 "button_down", "clicked", irc_network_dialog_button_down_clicked_cb
,
555 "combobox_charset", "changed", irc_network_dialog_combobox_charset_changed_cb
,
558 g_object_unref (gui
);
560 g_object_add_weak_pointer (G_OBJECT (dialog
->dialog
),
563 g_signal_connect (selection
, "changed",
564 G_CALLBACK (irc_network_dialog_selection_changed_cb
),
567 gtk_window_set_transient_for (GTK_WINDOW (dialog
->dialog
),
568 GTK_WINDOW (parent
));
569 gtk_window_set_modal (GTK_WINDOW (dialog
->dialog
), TRUE
);
571 irc_network_dialog_network_update_buttons (dialog
);
572 gtk_widget_show_all (dialog
->dialog
);
574 return dialog
->dialog
;