1 class ExitNodeDialog : Gtk.Dialog {
2 private const string GCONF_DIR_TOR = "/apps/maemo/tor";
3 private const string GCONF_KEY_EXITNODES = GCONF_DIR_TOR + "/exit_nodes";
6 Gtk.ListStore list_store;
9 * Show the exit node configuration dialog
11 private const int RESPONSE_NEW = 1;
12 public ExitNodeDialog (TorControl.Connection? tor_control = null) {
13 var content = (Gtk.VBox) get_content_area ();
14 content.set_size_request (-1, 5*70);
16 set_title (_("Exit nodes"));
18 gconf = GConf.Client.get_default ();
19 var exit_nodes = new SList<string> ();
21 exit_nodes = gconf.get_list (GCONF_KEY_EXITNODES, GConf.ValueType.STRING);
23 Hildon.Banner.show_information (this, null, "Error loading exit nodes: %s".printf (e.message));
26 list_store = new Gtk.ListStore (1, typeof (string));
28 foreach (string exit_node in exit_nodes) {
29 list_store.append (out iter);
30 list_store.@set (iter, 0, exit_node);
33 var pannable_area = new Hildon.PannableArea ();
34 var tree_view = new Gtk.TreeView.with_model (list_store);
35 var renderer = new Gtk.CellRendererText ();
36 var column = new Gtk.TreeViewColumn.with_attributes ("IP", renderer, "text", 0);
37 tree_view.append_column (column);
38 pannable_area.add (tree_view);
39 content.pack_start (pannable_area, true, true, 0);
41 tree_view.row_activated.connect ((path, column) => {
42 exit_node_edit_dialog (list_store, path);
45 add_button (_("New"), RESPONSE_NEW);
46 response.connect ((response_id) => {
47 if (response_id == RESPONSE_NEW) {
48 exit_node_edit_dialog (list_store, null);
56 * Show the exit node edit dialog
58 private const int RESPONSE_DELETE = 1;
59 private void exit_node_edit_dialog (Gtk.ListStore store, Gtk.TreePath? path) {
60 var dialog = new Gtk.Dialog ();
61 var content = (Gtk.VBox) dialog.get_content_area ();
64 dialog.set_title (_("New exit node"));
66 dialog.set_title (_("Edit exit node"));
68 var size_group = new Gtk.SizeGroup (Gtk.SizeGroupMode.HORIZONTAL);
70 var hbox = new Gtk.HBox (false, Hildon.MARGIN_DOUBLE);
71 var label = new Gtk.Label (_("Name"));
72 label.set_alignment (0, 0.5f);
73 size_group.add_widget (label);
74 hbox.pack_start (label, false, false, 0);
75 var name_entry = new Hildon.Entry (Hildon.SizeType.FINGER_HEIGHT);
76 hbox.pack_start (name_entry, true, true, 0);
77 content.pack_start (hbox, false, false, 0);
79 var iter = Gtk.TreeIter ();
80 if (path != null && store.get_iter (out iter, path)) {
82 store.@get (iter, 0, out tmp);
83 name_entry.set_text (tmp);
85 dialog.add_button (_("Delete"), RESPONSE_DELETE);
87 dialog.add_button (_("Save"), Gtk.ResponseType.OK);
88 dialog.response.connect ((response_id) => {
89 var exit_nodes = new SList<string> ();
91 if (response_id == RESPONSE_DELETE) {
94 store.get_iter (out iter2, path);
97 if (store.get_iter_first (out iter2)) do {
98 store.@get (iter2, 0, out exit_node);
99 exit_nodes.append (exit_node);
100 } while (store.iter_next (ref iter2));
102 gconf.set_list (GCONF_KEY_EXITNODES,
103 GConf.ValueType.STRING,
106 Hildon.Banner.show_information (dialog, null,
107 "Failed to save exit node list: %s".printf (e.message));
112 if (response_id == Gtk.ResponseType.OK) {
115 store.append (out iter2);
117 store.get_iter (out iter2, path);
119 store.@set (iter2, 0, name_entry.get_text ());
121 exit_nodes = gconf.get_list (GCONF_KEY_EXITNODES,
122 GConf.ValueType.STRING);
124 Hildon.Banner.show_information (null, null,
125 "Error loading exit nodes: %s".printf (e.message));
128 exit_nodes.append (name_entry.get_text ());
132 if (store.get_iter_first (out iter2)) do {
133 store.@get (iter2, 0, out exit_node);
134 exit_nodes.append (exit_node);
135 } while (store.iter_next (ref iter2));
138 gconf.set_list (GCONF_KEY_EXITNODES,
139 GConf.ValueType.STRING,
142 Hildon.Banner.show_information (dialog, null,
143 "Failed to save exit node list: %s".printf (e.message));