1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2006-2007 Imendio AB
4 * Copyright (C) 2007 Collabora Ltd.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
21 * Authors: Xavier Claessens <xclaesse@gmail.com>
22 * Martyn Russell <martyn@imendio.com>
30 #include <glib/gi18n.h>
32 #include <libmissioncontrol/mc-account.h>
33 #include <libmissioncontrol/mc-protocol.h>
35 #include <libempathy/empathy-debug.h>
37 #include "empathy-account-widget.h"
38 #include "empathy-ui-utils.h"
40 #define DEBUG_DOMAIN "AccountWidget"
43 account_widget_entry_focus_cb (GtkWidget *widget,
48 const gchar *param_name;
50 str = gtk_entry_get_text (GTK_ENTRY (widget));
51 param_name = g_object_get_data (G_OBJECT (widget), "param_name");
53 if (G_STR_EMPTY (str)) {
56 mc_account_unset_param (account, param_name);
57 mc_account_get_param_string (account, param_name, &value);
58 empathy_debug (DEBUG_DOMAIN, "Unset %s and restore to %s", param_name, value);
59 gtk_entry_set_text (GTK_ENTRY (widget), value ? value : "");
62 empathy_debug (DEBUG_DOMAIN, "Setting %s to %s", param_name, str);
63 mc_account_set_param_string (account, param_name, str);
70 account_widget_int_changed_cb (GtkWidget *widget,
73 const gchar *param_name;
76 value = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widget));
77 param_name = g_object_get_data (G_OBJECT (widget), "param_name");
80 mc_account_unset_param (account, param_name);
81 mc_account_get_param_int (account, param_name, &value);
82 empathy_debug (DEBUG_DOMAIN, "Unset %s and restore to %d", param_name, value);
83 gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value);
85 empathy_debug (DEBUG_DOMAIN, "Setting %s to %d", param_name, value);
86 mc_account_set_param_int (account, param_name, value);
91 account_widget_checkbutton_toggled_cb (GtkWidget *widget,
95 gboolean default_value;
96 const gchar *param_name;
98 value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
99 param_name = g_object_get_data (G_OBJECT (widget), "param_name");
101 /* FIXME: This is ugly! checkbox don't have a "not-set" value so we
102 * always unset the param and set the value if different from the
104 mc_account_unset_param (account, param_name);
105 mc_account_get_param_boolean (account, param_name, &default_value);
107 if (default_value == value) {
108 empathy_debug (DEBUG_DOMAIN, "Unset %s and restore to %d", param_name, default_value);
110 empathy_debug (DEBUG_DOMAIN, "Setting %s to %d", param_name, value);
111 mc_account_set_param_boolean (account, param_name, value);
116 account_widget_forget_clicked_cb (GtkWidget *button,
120 const gchar *param_name;
122 param_name = g_object_get_data (G_OBJECT (entry), "param_name");
123 account = g_object_get_data (G_OBJECT (entry), "account");
125 empathy_debug (DEBUG_DOMAIN, "Unset %s", param_name);
126 mc_account_unset_param (account, param_name);
127 gtk_entry_set_text (GTK_ENTRY (entry), "");
131 account_widget_password_changed_cb (GtkWidget *entry,
136 str = gtk_entry_get_text (GTK_ENTRY (entry));
137 gtk_widget_set_sensitive (button, !G_STR_EMPTY (str));
141 account_widget_jabber_ssl_toggled_cb (GtkWidget *checkbutton_ssl,
142 GtkWidget *spinbutton_port)
148 value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton_ssl));
149 account = g_object_get_data (G_OBJECT (spinbutton_port), "account");
150 mc_account_get_param_int (account, "port", &port);
153 if (port == 5222 || port == 0) {
157 if (port == 5223 || port == 0) {
162 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinbutton_port), port);
166 account_widget_setup_widget (GtkWidget *widget,
168 const gchar *param_name)
170 g_object_set_data_full (G_OBJECT (widget), "param_name",
171 g_strdup (param_name), g_free);
172 g_object_set_data_full (G_OBJECT (widget), "account",
173 g_object_ref (account), g_object_unref);
175 if (GTK_IS_SPIN_BUTTON (widget)) {
178 mc_account_get_param_int (account, param_name, &value);
179 gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value);
181 g_signal_connect (widget, "value-changed",
182 G_CALLBACK (account_widget_int_changed_cb),
185 else if (GTK_IS_ENTRY (widget)) {
188 mc_account_get_param_string (account, param_name, &str);
189 gtk_entry_set_text (GTK_ENTRY (widget), str ? str : "");
192 if (strstr (param_name, "password")) {
193 gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE);
196 g_signal_connect (widget, "focus-out-event",
197 G_CALLBACK (account_widget_entry_focus_cb),
200 else if (GTK_IS_TOGGLE_BUTTON (widget)) {
201 gboolean value = FALSE;
203 mc_account_get_param_boolean (account, param_name, &value);
204 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), value);
206 g_signal_connect (widget, "toggled",
207 G_CALLBACK (account_widget_checkbutton_toggled_cb),
210 empathy_debug (DEBUG_DOMAIN,
211 "Unknown type of widget for param %s",
217 account_widget_generic_format_param_name (const gchar *param_name)
222 str = g_strdup (param_name);
224 if (str && g_ascii_isalpha (str[0])) {
225 str[0] = g_ascii_toupper (str[0]);
228 while ((p = strchr (str, '-')) != NULL) {
229 if (p[1] != '\0' && g_ascii_isalpha (p[1])) {
231 p[1] = g_ascii_toupper (p[1]);
241 accounts_widget_generic_setup (McAccount *account,
242 GtkWidget *table_settings)
244 McProtocol *protocol;
249 profile = mc_account_get_profile (account);
250 protocol = mc_profile_get_protocol (profile);
253 /* The CM is not installed, MC shouldn't list them
254 * see SF bug #1688779
255 * FIXME: We should display something asking the user to
258 g_object_unref (profile);
262 params = mc_protocol_get_params (protocol);
264 for (l = params; l; l = l->next) {
265 McProtocolParam *param;
266 GtkWidget *widget = NULL;
267 gchar *param_name_formatted;
270 param_name_formatted = account_widget_generic_format_param_name (param->name);
271 gtk_table_resize (GTK_TABLE (table_settings), ++n_rows, 2);
273 if (param->signature[0] == 's') {
276 str = g_strdup_printf (_("%s:"), param_name_formatted);
277 widget = gtk_label_new (str);
278 gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
281 gtk_table_attach (GTK_TABLE (table_settings),
288 widget = gtk_entry_new ();
289 gtk_table_attach (GTK_TABLE (table_settings),
293 GTK_FILL | GTK_EXPAND, 0,
296 /* int types: ynqiuxt. double type is 'd' */
297 else if (param->signature[0] == 'y' ||
298 param->signature[0] == 'n' ||
299 param->signature[0] == 'q' ||
300 param->signature[0] == 'i' ||
301 param->signature[0] == 'u' ||
302 param->signature[0] == 'x' ||
303 param->signature[0] == 't' ||
304 param->signature[0] == 'd') {
310 switch (param->signature[0]) {
311 case 'y': minint = G_MININT8; maxint = G_MAXINT8; break;
312 case 'n': minint = G_MININT16; maxint = G_MAXINT16; break;
313 case 'q': minint = 0; maxint = G_MAXUINT16; break;
314 case 'i': minint = G_MININT32; maxint = G_MAXINT32; break;
315 case 'u': minint = 0; maxint = G_MAXUINT32; break;
316 case 'x': minint = G_MININT64; maxint = G_MAXINT64; break;
317 case 't': minint = 0; maxint = G_MAXUINT64; break;
318 case 'd': minint = G_MININT32; maxint = G_MAXINT32; step = 0.1; break;
321 str = g_strdup_printf (_("%s:"), param_name_formatted);
322 widget = gtk_label_new (str);
323 gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
326 gtk_table_attach (GTK_TABLE (table_settings),
333 widget = gtk_spin_button_new_with_range (minint, maxint, step);
334 gtk_table_attach (GTK_TABLE (table_settings),
338 GTK_FILL | GTK_EXPAND, 0,
341 else if (param->signature[0] == 'b') {
342 widget = gtk_check_button_new_with_label (param_name_formatted);
343 gtk_table_attach (GTK_TABLE (table_settings),
347 GTK_FILL | GTK_EXPAND, 0,
350 empathy_debug (DEBUG_DOMAIN,
351 "Unknown signature for param %s: %s",
352 param_name_formatted, param->signature);
356 account_widget_setup_widget (widget, account, param->name);
359 g_free (param_name_formatted);
362 g_slist_free (params);
363 g_object_unref (profile);
364 g_object_unref (protocol);
368 account_widget_handle_params_valist (McAccount *account,
370 const gchar *first_widget_name,
374 const gchar *widget_name;
376 for (widget_name = first_widget_name; widget_name; widget_name = va_arg (args, gchar*)) {
377 const gchar *param_name;
379 param_name = va_arg (args, gchar*);
381 widget = glade_xml_get_widget (gui, widget_name);
384 g_warning ("Glade is missing widget '%s'.", widget_name);
388 account_widget_setup_widget (widget, account, param_name);
393 empathy_account_widget_handle_params (McAccount *account,
395 const gchar *first_widget_name,
400 g_return_if_fail (MC_IS_ACCOUNT (account));
402 va_start (args, first_widget_name);
403 account_widget_handle_params_valist (account, gui,
410 emapthy_account_widget_add_forget_button (McAccount *account,
415 GtkWidget *button_forget;
416 GtkWidget *entry_password;
417 gchar *password = NULL;
419 button_forget = glade_xml_get_widget (glade, button);
420 entry_password = glade_xml_get_widget (glade, entry);
422 mc_account_get_param_string (account, "password", &password);
423 gtk_widget_set_sensitive (button_forget, !G_STR_EMPTY (password));
426 g_signal_connect (button_forget, "clicked",
427 G_CALLBACK (account_widget_forget_clicked_cb),
429 g_signal_connect (entry_password, "changed",
430 G_CALLBACK (account_widget_password_changed_cb),
435 empathy_account_widget_generic_new (McAccount *account)
437 GtkWidget *table_settings;
440 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
442 table_settings = gtk_table_new (0, 2, FALSE);
443 gtk_table_set_row_spacings (GTK_TABLE (table_settings), 6);
444 gtk_table_set_col_spacings (GTK_TABLE (table_settings), 6);
445 sw = gtk_scrolled_window_new (NULL, NULL);
446 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
447 GTK_POLICY_AUTOMATIC,
448 GTK_POLICY_AUTOMATIC);
449 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
452 accounts_widget_generic_setup (account, table_settings);
454 gtk_widget_show_all (sw);
460 empathy_account_widget_salut_new (McAccount *account)
465 glade = empathy_glade_get_file ("empathy-account-widget-salut.glade",
466 "vbox_salut_settings",
468 "vbox_salut_settings", &widget,
471 empathy_account_widget_handle_params (account, glade,
472 "entry_published", "published-name",
473 "entry_nickname", "nickname",
474 "entry_first_name", "first-name",
475 "entry_last_name", "last-name",
476 "entry_email", "email",
480 g_object_unref (glade);
482 gtk_widget_show (widget);
488 empathy_account_widget_msn_new (McAccount *account)
493 glade = empathy_glade_get_file ("empathy-account-widget-msn.glade",
496 "vbox_msn_settings", &widget,
499 empathy_account_widget_handle_params (account, glade,
500 "entry_id", "account",
501 "entry_password", "password",
502 "entry_server", "server",
503 "spinbutton_port", "port",
506 emapthy_account_widget_add_forget_button (account, glade,
510 g_object_unref (glade);
512 gtk_widget_show (widget);
518 empathy_account_widget_jabber_new (McAccount *account)
522 GtkWidget *spinbutton_port;
523 GtkWidget *checkbutton_ssl;
525 glade = empathy_glade_get_file ("empathy-account-widget-jabber.glade",
526 "vbox_jabber_settings",
528 "vbox_jabber_settings", &widget,
529 "spinbutton_port", &spinbutton_port,
530 "checkbutton_ssl", &checkbutton_ssl,
533 empathy_account_widget_handle_params (account, glade,
534 "entry_id", "account",
535 "entry_password", "password",
536 "entry_resource", "resource",
537 "entry_server", "server",
538 "spinbutton_port", "port",
539 "spinbutton_priority", "priority",
540 "checkbutton_ssl", "old-ssl",
541 "checkbutton_ignore_ssl_errors", "ignore-ssl-errors",
542 "checkbutton_encryption", "require-encryption",
545 emapthy_account_widget_add_forget_button (account, glade,
549 g_signal_connect (checkbutton_ssl, "toggled",
550 G_CALLBACK (account_widget_jabber_ssl_toggled_cb),
553 g_object_unref (glade);
555 gtk_widget_show (widget);