From ac6cad2e0f7d045a70f0664e11d6c730f96cf4e0 Mon Sep 17 00:00:00 2001
From: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
Date: Thu, 8 Jul 2010 15:10:27 -0400
Subject: [PATCH] [#3681] Browse preferences section with an icon view

---
 sflphone-client-gnome/src/config/audioconf.c  |  73 +--
 .../src/config/preferencesdialog.c            | 521 +++++++++++-------
 .../src/config/preferencesdialog.h            |   2 +
 .../src/icons/icon_factory.c                  |   7 +
 .../src/icons/icon_factory.h                  |   2 +
 5 files changed, 350 insertions(+), 255 deletions(-)

diff --git a/sflphone-client-gnome/src/config/audioconf.c b/sflphone-client-gnome/src/config/audioconf.c
index bcf82af8b0..b96532e442 100644
--- a/sflphone-client-gnome/src/config/audioconf.c
+++ b/sflphone-client-gnome/src/config/audioconf.c
@@ -927,44 +927,6 @@ GtkWidget* alsa_box()
 	return ret;
 }
 
-GtkWidget* noise_box()
-{
-	GtkWidget *ret;
-	GtkWidget *enableEchoCancel;
-	GtkWidget *enableNoiseReduction;
-	gboolean echocancelActive, noisesuppressActive;
-	gchar *state;
-
-	ret = gtk_hbox_new( TRUE , 1);
-	
-	enableEchoCancel = gtk_check_button_new_with_mnemonic( _("_Echo Suppression"));
-	state = dbus_get_echo_cancel_state();
-	echocancelActive = FALSE;
-        if(strcmp(state, "enabled") == 0)
-	  echocancelActive = TRUE;
-	else
-	  echocancelActive = FALSE;
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(enableEchoCancel), echocancelActive);
-	g_signal_connect(G_OBJECT(enableEchoCancel), "clicked", active_echo_cancel, NULL);
-
-	gtk_box_pack_start( GTK_BOX(ret), enableEchoCancel, TRUE , TRUE , 1);
-
-
-	enableNoiseReduction = gtk_check_button_new_with_mnemonic( _("_Noise Reduction"));
-	state = dbus_get_noise_suppress_state();
-	noisesuppressActive = FALSE;
-	if(strcmp(state, "enabled") == 0)
-	  noisesuppressActive = TRUE;
-	else
-	  noisesuppressActive = FALSE;
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(enableNoiseReduction), noisesuppressActive);
-	gtk_box_pack_start( GTK_BOX(ret) , enableNoiseReduction , TRUE , TRUE , 1);
-
-	g_signal_connect(G_OBJECT(enableNoiseReduction), "clicked", active_noise_suppress, NULL);
-
-	return ret;
-}
-
 static void record_path_changed( GtkFileChooser *chooser , GtkLabel *label UNUSED)
 {
 	DEBUG("record_path_changed");
@@ -982,6 +944,10 @@ GtkWidget* create_audio_configuration()
 	// Sub boxes
 	GtkWidget *box;
 	GtkWidget *frame;
+	GtkWidget *enableEchoCancel;
+	GtkWidget *enableNoiseReduction;
+	gboolean echocancelActive, noisesuppressActive;
+	gchar *state;
 
 	ret = gtk_vbox_new(FALSE, 10);
 	gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
@@ -1068,14 +1034,31 @@ GtkWidget* create_audio_configuration()
 	gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fileChooser ) , filter);
 	gtk_table_attach ( GTK_TABLE( table ), fileChooser, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
 
-	gnome_main_section_new (_("Voice enhancement settings"), &noise_conf);
-	gtk_box_pack_start(GTK_BOX(ret), noise_conf, FALSE, FALSE, 0);
-	gtk_widget_show( noise_conf );
-
 	// Box for the voice enhancement configuration
-	noisebox = noise_box();
-	gtk_container_add( GTK_CONTAINER(noise_conf) , noisebox );
-	
+	gnome_main_section_new_with_table (_("Voice enhancement settings"), &frame, &table, 2, 1);
+    gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0);
+
+	enableEchoCancel = gtk_check_button_new_with_mnemonic( _("_Echo Suppression"));
+    state = dbus_get_echo_cancel_state();
+    echocancelActive = FALSE;
+        if(strcmp(state, "enabled") == 0)
+      echocancelActive = TRUE;
+    else
+      echocancelActive = FALSE;
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(enableEchoCancel), echocancelActive);
+    g_signal_connect(G_OBJECT(enableEchoCancel), "clicked", active_echo_cancel, NULL);
+	gtk_table_attach ( GTK_TABLE(table), enableEchoCancel, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+
+    enableNoiseReduction = gtk_check_button_new_with_mnemonic( _("_Noise Reduction"));
+    state = dbus_get_noise_suppress_state();
+    noisesuppressActive = FALSE;
+    if(strcmp(state, "enabled") == 0)
+      noisesuppressActive = TRUE;
+    else
+      noisesuppressActive = FALSE;
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(enableNoiseReduction), noisesuppressActive);
+    g_signal_connect(G_OBJECT(enableNoiseReduction), "clicked", active_noise_suppress, NULL);
+	gtk_table_attach ( GTK_TABLE(table), enableNoiseReduction, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
 
 	gtk_widget_show_all(ret);
 
diff --git a/sflphone-client-gnome/src/config/preferencesdialog.c b/sflphone-client-gnome/src/config/preferencesdialog.c
index ff68a31c7a..9dd08ccd81 100644
--- a/sflphone-client-gnome/src/config/preferencesdialog.c
+++ b/sflphone-client-gnome/src/config/preferencesdialog.c
@@ -32,22 +32,14 @@
  */
 
 #include <gtk/gtk.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
 
-#include <accountlist.h>
 #include <accountconfigdialog.h>
-#include <actions.h>
-#include <config.h>
-#include <dbus/dbus.h>
-#include <mainwindow.h>
-#include <audioconf.h>
 #include <addressbook-config.h>
 #include <shortcuts-config.h>
 #include <hooks-config.h>
-#include <utils.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
 
 /**
  * Local variables
@@ -56,37 +48,54 @@ gboolean accDialogOpen = FALSE;
 gboolean dialogOpen = FALSE;
 gboolean ringtoneEnabled = TRUE;
 
-GtkWidget * localPortSpinBox;
-GtkWidget * localAddressCombo;
-
-GtkWidget * history_value;
 
 GtkWidget * status;
+GtkWidget * history_value;
 
-GtkWidget *showstatusicon;
 GtkWidget *starthidden;
 GtkWidget *popupwindow;
 GtkWidget *neverpopupwindow;
 
+GtkWidget *treeView;
+GtkWidget *iconview;
+GtkCellRenderer *renderer;
+GtkTreeViewColumn *column;
+GtkTreeSelection *selection;
+GtkWidget * notebook;
+
+
+enum {
+	PIXBUF_COL,
+	TEXT_COL,
+	PAGE_NUMBER
+};
+
+typedef struct {
+	gchar* icon_descr;
+	gchar* icon_name;
+	gint page_number;
+} browser_t;
+
+
 static int history_limit;
 static gboolean history_enabled = TRUE;
 
-static void
+	static void
 set_md5_hash_cb (GtkWidget *widget UNUSED, gpointer data UNUSED)
 {
 
-  gboolean enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
-  dbus_set_md5_credential_hashing (enabled);
+	gboolean enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
+	dbus_set_md5_credential_hashing (enabled);
 }
 
-static void
+	static void
 start_hidden (void)
 {
 	gboolean currentstate = eel_gconf_get_integer (START_HIDDEN);
 	eel_gconf_set_integer (START_HIDDEN, !currentstate);
 }
 
-static void
+	static void
 set_popup_mode (GtkWidget *widget, gpointer *userdata)
 {
 	gboolean currentstate = eel_gconf_get_integer (POPUP_ON_CALL);
@@ -95,248 +104,340 @@ set_popup_mode (GtkWidget *widget, gpointer *userdata)
 	}
 }
 
-void
+	void
 set_notif_level ()
 {
 	gboolean current_state = eel_gconf_get_integer (NOTIFY_ALL);
 	eel_gconf_set_integer (NOTIFY_ALL, !current_state);
 }
 
-static void
+	static void
 history_limit_cb (GtkSpinButton *button, void *ptr)
 {
-  history_limit = gtk_spin_button_get_value_as_int ((GtkSpinButton *) (ptr));
+	history_limit = gtk_spin_button_get_value_as_int ((GtkSpinButton *) (ptr));
 }
 
-static void
+	static void
 history_enabled_cb (GtkWidget *widget)
 {
-  history_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
-  gtk_widget_set_sensitive (GTK_WIDGET (history_value), history_enabled);
+	history_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+	gtk_widget_set_sensitive (GTK_WIDGET (history_value), history_enabled);
 
-  // Toggle it through D-Bus
-  eel_gconf_set_integer (HISTORY_ENABLED, !eel_gconf_get_integer (HISTORY_ENABLED));
+	// Toggle it through D-Bus
+	eel_gconf_set_integer (HISTORY_ENABLED, !eel_gconf_get_integer (HISTORY_ENABLED));
 }
 
-void
+	void
 clean_history (void)
 {
-  calllist_clean_history ();
+	calllist_clean_history ();
 }
 
 void showstatusicon_cb (GtkWidget *widget, gpointer data) {
 
-  gboolean currentstatus = FALSE;
+	gboolean currentstatus = FALSE;
 
-  // data contains the previous value of dbus_is_status_icon_enabled () - ie before the click.
-  currentstatus = (gboolean) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+	// data contains the previous value of dbus_is_status_icon_enabled () - ie before the click.
+	currentstatus = (gboolean) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
 
-  // Update the widget states
-  gtk_widget_set_sensitive (GTK_WIDGET (popupwindow), currentstatus);
-  gtk_widget_set_sensitive (GTK_WIDGET (neverpopupwindow), currentstatus);
-  gtk_widget_set_sensitive (GTK_WIDGET (starthidden), currentstatus);
+	// Update the widget states
+	gtk_widget_set_sensitive (GTK_WIDGET (popupwindow), currentstatus);
+	gtk_widget_set_sensitive (GTK_WIDGET (neverpopupwindow), currentstatus);
+	gtk_widget_set_sensitive (GTK_WIDGET (starthidden), currentstatus);
 
-  currentstatus ?       show_status_icon () : hide_status_icon ();
+	currentstatus ?       show_status_icon () : hide_status_icon ();
 
 	// Update through D-Bus
 	eel_gconf_set_integer (SHOW_STATUSICON, currentstatus);
 }
 
 
-GtkWidget*
+	GtkWidget*
 create_general_settings ()
 {
 
-  GtkWidget *ret, *notifAll, *trayItem, *frame, *checkBoxWidget, *label, *table;
-  gboolean statusicon;
-
-  // Load history configuration
-  history_load_configuration ();
-
-  // Main widget
-  ret = gtk_vbox_new (FALSE, 10);
-  gtk_container_set_border_width (GTK_CONTAINER(ret), 10);
-
-  // Notifications Frame
-  gnome_main_section_new_with_table (_("Desktop Notifications"), &frame,
-      &table, 2, 1);
-  gtk_box_pack_start (GTK_BOX(ret), frame, FALSE, FALSE, 0);
-
-  // Notification All
-  notifAll = gtk_check_button_new_with_mnemonic (_("_Enable notifications"));
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(notifAll), eel_gconf_get_integer (NOTIFY_ALL));
-  g_signal_connect(G_OBJECT( notifAll ) , "clicked" , G_CALLBACK( set_notif_level ) , NULL );
-  gtk_table_attach (GTK_TABLE(table), notifAll, 0, 1, 0, 1, GTK_EXPAND
-      | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
-
-  // System Tray option frame
-  gnome_main_section_new_with_table (_("System Tray Icon"), &frame, &table, 4,
-      1);
-  gtk_box_pack_start (GTK_BOX(ret), frame, FALSE, FALSE, 0);
-
-  // Whether or not displaying an icon in the system tray
-  statusicon = eel_gconf_get_integer (SHOW_STATUSICON);
-
-  showstatusicon = gtk_check_button_new_with_mnemonic (
-      _("Show SFLphone in the system tray"));
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(showstatusicon), statusicon);
-  g_signal_connect (G_OBJECT (showstatusicon) , "clicked" , G_CALLBACK (showstatusicon_cb), NULL);
-  gtk_table_attach (GTK_TABLE (table), showstatusicon, 0, 1, 0, 1, GTK_EXPAND
-      | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
-
-  popupwindow = gtk_radio_button_new_with_mnemonic (NULL,
-      _("_Popup main window on incoming call"));
-  g_signal_connect(G_OBJECT (popupwindow), "toggled", G_CALLBACK (set_popup_mode), NULL);
-  gtk_table_attach (GTK_TABLE(table), popupwindow, 0, 1, 1, 2, GTK_EXPAND
-      | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
-
-  neverpopupwindow = gtk_radio_button_new_with_mnemonic_from_widget (
-      GTK_RADIO_BUTTON (popupwindow), _("Ne_ver popup main window"));
-  gtk_table_attach (GTK_TABLE(table), neverpopupwindow, 0, 1, 2, 3, GTK_EXPAND
-      | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
+	GtkWidget *ret, *notifAll, *trayItem, *frame, *checkBoxWidget, *label, *table, *showstatusicon;
+	gboolean statusicon;
+
+	// Load history configuration
+	history_load_configuration ();
+
+	// Main widget
+	ret = gtk_vbox_new (FALSE, 10);
+	gtk_container_set_border_width (GTK_CONTAINER(ret), 10);
+
+	// Notifications Frame
+	gnome_main_section_new_with_table (_("Desktop Notifications"), &frame,
+			&table, 2, 1);
+	gtk_box_pack_start (GTK_BOX(ret), frame, FALSE, FALSE, 0);
+
+	// Notification All
+	notifAll = gtk_check_button_new_with_mnemonic (_("_Enable notifications"));
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(notifAll), eel_gconf_get_integer (NOTIFY_ALL));
+	g_signal_connect(G_OBJECT( notifAll ) , "clicked" , G_CALLBACK( set_notif_level ) , NULL );
+	gtk_table_attach (GTK_TABLE(table), notifAll, 0, 1, 0, 1, GTK_EXPAND
+			| GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
+
+	// System Tray option frame
+	gnome_main_section_new_with_table (_("System Tray Icon"), &frame, &table, 4,
+			1);
+	gtk_box_pack_start (GTK_BOX(ret), frame, FALSE, FALSE, 0);
+
+	// Whether or not displaying an icon in the system tray
+	statusicon = eel_gconf_get_integer (SHOW_STATUSICON);
+
+	showstatusicon = gtk_check_button_new_with_mnemonic (
+			_("Show SFLphone in the system tray"));
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(showstatusicon), statusicon);
+	g_signal_connect (G_OBJECT (showstatusicon) , "clicked" , G_CALLBACK (showstatusicon_cb), NULL);
+	gtk_table_attach (GTK_TABLE (table), showstatusicon, 0, 1, 0, 1, GTK_EXPAND
+			| GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
+
+	popupwindow = gtk_radio_button_new_with_mnemonic (NULL,
+			_("_Popup main window on incoming call"));
+	g_signal_connect(G_OBJECT (popupwindow), "toggled", G_CALLBACK (set_popup_mode), NULL);
+	gtk_table_attach (GTK_TABLE(table), popupwindow, 0, 1, 1, 2, GTK_EXPAND
+			| GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
+
+	neverpopupwindow = gtk_radio_button_new_with_mnemonic_from_widget (
+			GTK_RADIO_BUTTON (popupwindow), _("Ne_ver popup main window"));
+	gtk_table_attach (GTK_TABLE(table), neverpopupwindow, 0, 1, 2, 3, GTK_EXPAND
+			| GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
 
 	// Toggle according to the user configuration
 	eel_gconf_get_integer (POPUP_ON_CALL) ? gtk_toggle_button_set_active (
-												GTK_TOGGLE_BUTTON (popupwindow), 
-												TRUE) : 
-											gtk_toggle_button_set_active (
-												GTK_TOGGLE_BUTTON (neverpopupwindow), 
-												TRUE);
-
-  starthidden = gtk_check_button_new_with_mnemonic (
-      _("Hide SFLphone window on _startup"));
-
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(starthidden),
-      eel_gconf_get_integer (START_HIDDEN));
-  g_signal_connect(G_OBJECT (starthidden) , "clicked" , G_CALLBACK( start_hidden ) , NULL);
-  gtk_table_attach (GTK_TABLE(table), starthidden, 0, 1, 3, 4, GTK_EXPAND
-      | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
-
-  // Update the widget states
-  gtk_widget_set_sensitive (GTK_WIDGET (popupwindow),statusicon);
-  gtk_widget_set_sensitive (GTK_WIDGET (neverpopupwindow),statusicon);
-  gtk_widget_set_sensitive (GTK_WIDGET (starthidden),statusicon);
-
-  // HISTORY CONFIGURATION
-  gnome_main_section_new_with_table (_("Calls History"), &frame, &table, 3, 1);
-  gtk_box_pack_start (GTK_BOX(ret), frame, FALSE, FALSE, 0);
-
-  checkBoxWidget = gtk_check_button_new_with_mnemonic (
-      _("_Keep my history for at least"));
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkBoxWidget),
-      history_enabled);
-  g_signal_connect (G_OBJECT (checkBoxWidget) , "clicked" , G_CALLBACK (history_enabled_cb) , NULL);
-  gtk_table_attach (GTK_TABLE(table), checkBoxWidget, 0, 1, 0, 1, GTK_EXPAND
-      | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
-
-  history_value = gtk_spin_button_new_with_range (1, 99, 1);
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON(history_value), history_limit);
-  g_signal_connect( G_OBJECT (history_value) , "value-changed" , G_CALLBACK (history_limit_cb) , history_value);
-  gtk_widget_set_sensitive (GTK_WIDGET (history_value),
-      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkBoxWidget)));
-  gtk_table_attach (GTK_TABLE(table), history_value, 1, 2, 0, 1, GTK_EXPAND
-      | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
-
-  label = gtk_label_new (_("days"));
-  gtk_table_attach (GTK_TABLE(table), label, 2, 3, 0, 1, GTK_EXPAND | GTK_FILL,
-      GTK_EXPAND | GTK_FILL, 0, 5);
-
-  gtk_widget_show_all (ret);
-
-  return ret;
+			GTK_TOGGLE_BUTTON (popupwindow), 
+			TRUE) : 
+		gtk_toggle_button_set_active (
+				GTK_TOGGLE_BUTTON (neverpopupwindow), 
+				TRUE);
+
+	starthidden = gtk_check_button_new_with_mnemonic (
+			_("Hide SFLphone window on _startup"));
+
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(starthidden),
+			eel_gconf_get_integer (START_HIDDEN));
+	g_signal_connect(G_OBJECT (starthidden) , "clicked" , G_CALLBACK( start_hidden ) , NULL);
+	gtk_table_attach (GTK_TABLE(table), starthidden, 0, 1, 3, 4, GTK_EXPAND
+			| GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
+
+	// Update the widget states
+	gtk_widget_set_sensitive (GTK_WIDGET (popupwindow),statusicon);
+	gtk_widget_set_sensitive (GTK_WIDGET (neverpopupwindow),statusicon);
+	gtk_widget_set_sensitive (GTK_WIDGET (starthidden),statusicon);
+
+	// HISTORY CONFIGURATION
+	gnome_main_section_new_with_table (_("Calls History"), &frame, &table, 3, 1);
+	gtk_box_pack_start (GTK_BOX(ret), frame, FALSE, FALSE, 0);
+
+	checkBoxWidget = gtk_check_button_new_with_mnemonic (
+			_("_Keep my history for at least"));
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkBoxWidget),
+			history_enabled);
+	g_signal_connect (G_OBJECT (checkBoxWidget) , "clicked" , G_CALLBACK (history_enabled_cb) , NULL);
+	gtk_table_attach (GTK_TABLE(table), checkBoxWidget, 0, 1, 0, 1, GTK_EXPAND
+			| GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
+
+	history_value = gtk_spin_button_new_with_range (1, 99, 1);
+	gtk_spin_button_set_value (GTK_SPIN_BUTTON(history_value), history_limit);
+	g_signal_connect( G_OBJECT (history_value) , "value-changed" , G_CALLBACK (history_limit_cb) , history_value);
+	gtk_widget_set_sensitive (GTK_WIDGET (history_value),
+			gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkBoxWidget)));
+	gtk_table_attach (GTK_TABLE(table), history_value, 1, 2, 0, 1, GTK_EXPAND
+			| GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5);
+
+	label = gtk_label_new (_("days"));
+	gtk_table_attach (GTK_TABLE(table), label, 2, 3, 0, 1, GTK_EXPAND | GTK_FILL,
+			GTK_EXPAND | GTK_FILL, 0, 5);
+
+	gtk_widget_show_all (ret);
+
+	return ret;
 }
 
-void
+	void
 save_configuration_parameters (void)
 {
 
-  // Address book config
-  addressbook_config_save_parameters ();
-  hooks_save_parameters ();
+	// Address book config
+	addressbook_config_save_parameters ();
+	hooks_save_parameters ();
 
-  // History config
-  dbus_set_history_limit (history_limit);
+	// History config
+	dbus_set_history_limit (history_limit);
 
-  // Direct IP calls config
-  // dbus_set_ip2ip_details (directIpCallsProperties);
+	// Direct IP calls config
+	// dbus_set_ip2ip_details (directIpCallsProperties);
 }
 
-void
+	void
 history_load_configuration ()
 {
-  history_limit = dbus_get_history_limit ();
-  history_enabled = eel_gconf_get_integer (HISTORY_ENABLED); 
+	history_limit = dbus_get_history_limit ();
+	history_enabled = eel_gconf_get_integer (HISTORY_ENABLED); 
 }
 
+
+gboolean selection_changed_cb (GtkIconView *view, gpointer user_data) {
+
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	GList *list;
+	gint page;
+
+	model = gtk_icon_view_get_model (view);
+	list = gtk_icon_view_get_selected_items (view);
+	
+	if (list == NULL) 
+		return;
+
+	if (g_list_length (list) > 1)
+		return;
+
+	gtk_tree_model_get_iter (model, &iter, list->data);
+	gtk_tree_model_get (model, &iter, PAGE_NUMBER, &page, -1);
+
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), page);
+	g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free (list);
+}
+
+
+
 /**
  * Show configuration window with tabs
  */
-void
+	void
 show_preferences_dialog ()
 {
-  GtkDialog * dialog;
-  GtkWidget * notebook;
-  GtkWidget * tab;
-  guint result;
-
-  dialogOpen = TRUE;
-
-  dialog = GTK_DIALOG(gtk_dialog_new_with_buttons (_("Preferences"),
-          GTK_WINDOW(get_main_window()),
-          GTK_DIALOG_DESTROY_WITH_PARENT,
-          GTK_STOCK_CLOSE,
-          GTK_RESPONSE_ACCEPT,
-          NULL));
-
-  // Set window properties
-  gtk_dialog_set_has_separator (dialog, FALSE);
-  gtk_window_set_default_size (GTK_WINDOW(dialog), 600, 400);
-  gtk_container_set_border_width (GTK_CONTAINER(dialog), 0);
-
-  // Create tabs container
-  notebook = gtk_notebook_new ();
-  gtk_box_pack_start (GTK_BOX (dialog->vbox), notebook, TRUE, TRUE, 0);
-  gtk_container_set_border_width (GTK_CONTAINER(notebook), 10);
-  gtk_widget_show (notebook);
-
-  // General settings tab
-  tab = create_general_settings ();
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tab, gtk_label_new (
-      _("General")));
-  gtk_notebook_page_num (GTK_NOTEBOOK(notebook), tab);
-
-  // Audio tab
-  tab = create_audio_configuration ();
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tab, gtk_label_new (
-      _("Audio")));
-  gtk_notebook_page_num (GTK_NOTEBOOK(notebook), tab);
-
-  // Addressbook tab
-  tab = create_addressbook_settings ();
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tab, gtk_label_new (
-      _("Address Book")));
-  gtk_notebook_page_num (GTK_NOTEBOOK(notebook), tab);
-
-  // Hooks tab
-  tab = create_hooks_settings ();
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tab, gtk_label_new (
-      _("Hooks")));
-  gtk_notebook_page_num (GTK_NOTEBOOK(notebook), tab);
-
-  // Shortcuts tab
-  tab = create_shortcuts_settings();
-  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Shortcuts")));
-  gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
-
-  gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 0);
-
-  result = gtk_dialog_run (dialog);
-
-  save_configuration_parameters ();
-  update_actions ();
-
-  dialogOpen = FALSE;
-
-  gtk_widget_destroy (GTK_WIDGET(dialog));
+	GtkDialog * dialog;
+	GtkWidget * hbox;
+	GtkWidget * tab;
+	guint result;
+
+	dialogOpen = TRUE;
+
+	dialog = GTK_DIALOG(gtk_dialog_new_with_buttons (_("Preferences"),
+				GTK_WINDOW(get_main_window()),
+				GTK_DIALOG_DESTROY_WITH_PARENT,
+				GTK_STOCK_CLOSE,
+				GTK_RESPONSE_ACCEPT,
+				NULL));
+
+	// Set window properties
+	gtk_dialog_set_has_separator (dialog, FALSE);
+	gtk_window_set_default_size (GTK_WINDOW(dialog), 600, 400);
+	gtk_container_set_border_width (GTK_CONTAINER(dialog), 0);
+
+
+	hbox = gtk_hbox_new(FALSE, 10);
+
+	// Create tree view
+	iconview = gtk_icon_view_new_with_model (createModel ());
+	g_object_set (iconview, 
+					"selection-mode", GTK_SELECTION_BROWSE,
+					"text-column", TEXT_COL,
+					"pixbuf-column", PIXBUF_COL,
+					"columns", 1,
+					"margin", 10,
+					NULL);
+	// Connect the callback when clicking on an item
+	g_signal_connect(G_OBJECT (iconview), "selection-changed", G_CALLBACK (selection_changed_cb), NULL);
+	gtk_box_pack_start (GTK_BOX (hbox), iconview, TRUE, TRUE, 0);
+
+	// Create tabs container
+	notebook = gtk_notebook_new ();
+	gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
+	gtk_box_pack_end (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (dialog->vbox), hbox, TRUE, TRUE, 0);
+	gtk_widget_show_all(dialog->vbox);
+	gtk_container_set_border_width (GTK_CONTAINER(notebook), 10);
+	gtk_widget_show (notebook);
+
+	// General settings tab
+	tab = create_general_settings ();
+	gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tab, gtk_label_new (
+				_("General")));
+	gtk_notebook_page_num (GTK_NOTEBOOK(notebook), tab);
+
+	// Audio tab
+	tab = create_audio_configuration ();
+	gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tab, gtk_label_new (
+				_("Audio")));
+	gtk_notebook_page_num (GTK_NOTEBOOK(notebook), tab);
+
+	// Addressbook tab
+	tab = create_addressbook_settings ();
+	gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tab, gtk_label_new (
+				_("Address Book")));
+	gtk_notebook_page_num (GTK_NOTEBOOK(notebook), tab);
+
+	// Hooks tab
+	tab = create_hooks_settings ();
+	gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tab, gtk_label_new (
+				_("Hooks")));
+	gtk_notebook_page_num (GTK_NOTEBOOK(notebook), tab);
+
+	// Shortcuts tab
+	tab = create_shortcuts_settings();
+	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Shortcuts")));
+	gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
+
+	// By default, general settings
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 0);
+	// Highlight the corresponding icon
+	gtk_icon_view_select_path (iconview, gtk_tree_path_new_first ());
+
+	result = gtk_dialog_run (dialog);
+
+	save_configuration_parameters ();
+	update_actions ();
+
+	dialogOpen = FALSE;
+
+	gtk_widget_destroy (GTK_WIDGET(dialog));
 }
 
+
+GtkTreeModel* createModel() {
+
+	browser_t browser_entries[5] = {
+		{_("General"), "start-here", 0},
+		{_("Audio"), "multimedia-volume-control", 1},
+		{_("Address Book"), "address-book-new", 2},
+		{_("Hooks"), "gnome-globe", 3},
+		{_("Shortcuts"), "preferences-desktop-keyboard", 4}
+	};
+
+	GdkPixbuf *pixbuf;
+	GtkTreeIter iter;
+	GtkListStore *store;
+	GError *error = NULL;
+	GtkIconSet *icon = NULL;
+	gint i;
+
+	store = gtk_list_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT);
+	GtkIconTheme* theme = gtk_icon_theme_get_default();
+
+	for(i = 0; i < 5; i++) {
+
+		gtk_list_store_append(store, &iter);
+
+		pixbuf = gtk_icon_theme_load_icon (theme, browser_entries[i].icon_name, 48, 0, &error);
+
+		gtk_list_store_set(store, &iter,
+				PIXBUF_COL, pixbuf,
+				TEXT_COL, browser_entries[i].icon_descr,
+				PAGE_NUMBER, browser_entries[i].page_number,
+				-1);
+
+		if (pixbuf != NULL) {
+			gdk_pixbuf_unref (pixbuf);
+		} else {
+			DEBUG("Couldn't load icon: %s", error->message);
+			g_error_free (error);
+		}
+	}
+
+	return GTK_TREE_MODEL(store);
+}
diff --git a/sflphone-client-gnome/src/config/preferencesdialog.h b/sflphone-client-gnome/src/config/preferencesdialog.h
index e14a240111..7f7db4d26e 100644
--- a/sflphone-client-gnome/src/config/preferencesdialog.h
+++ b/sflphone-client-gnome/src/config/preferencesdialog.h
@@ -121,4 +121,6 @@ void save_configuration_parameters (void);
 
 void history_load_configuration (void);
 
+GtkTreeModel* createModel();
+
 #endif 
diff --git a/sflphone-client-gnome/src/icons/icon_factory.c b/sflphone-client-gnome/src/icons/icon_factory.c
index c18e038b0a..2d2d944fdb 100644
--- a/sflphone-client-gnome/src/icons/icon_factory.c
+++ b/sflphone-client-gnome/src/icons/icon_factory.c
@@ -29,6 +29,8 @@
  */
 
 #include "icon_factory.h"
+#include "icons/pixmap_data.h"
+
 
 static GtkIconFactory *icon_factory = NULL;
 
@@ -59,6 +61,11 @@ void add_icon (GtkIconFactory *factory, const gchar *stock_id, const guint8 *ico
 		DEBUG ("Icon %s already exists in factory\n", stock_id);
 }
 
+GtkIconSet* lookup_sflphone_factory (const gchar *stock_id) {
+
+	return gtk_icon_factory_lookup (icon_factory, stock_id);
+}
+
 void register_sflphone_stock_icons (GtkIconFactory *factory)
 {
 	add_icon (factory, GTK_STOCK_PICKUP, gnome_stock_pickup, GTK_ICON_SIZE_SMALL_TOOLBAR);	
diff --git a/sflphone-client-gnome/src/icons/icon_factory.h b/sflphone-client-gnome/src/icons/icon_factory.h
index 6392832ac6..b31c1b89a2 100644
--- a/sflphone-client-gnome/src/icons/icon_factory.h
+++ b/sflphone-client-gnome/src/icons/icon_factory.h
@@ -49,6 +49,8 @@ G_BEGIN_DECLS
 
 void init_icon_factory (void);
 
+GtkIconSet* lookup_sflphone_factory (const gchar *stock_id);
+
 G_END_DECLS
 
 #endif
-- 
GitLab