/*
  COnfigurator for Gnome
  Copyright (C) 2002 Mads Villadsen <maxximum@krakoa.dk>
   
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <glib.h>
#include <gnome.h>
#include <glade/glade.h>
#include "setup-panel.h"
#include "gconf-convenience.h"
#include "debug.h"

/* copied from gnome-panel/menu.h */
enum {
        MAIN_MENU_SYSTEM = 1<<2,
        MAIN_MENU_SYSTEM_SUB = 1<<3,
        MAIN_MENU_DISTRIBUTION = 1<<4,
        MAIN_MENU_DISTRIBUTION_SUB = 1<<5,
        MAIN_MENU_KDE = 1<<6,
        MAIN_MENU_KDE_SUB = 1<<7,
        MAIN_MENU_PANEL_SUB = 1<<13,
        MAIN_MENU_DESKTOP = 1<<14,
        MAIN_MENU_DESKTOP_SUB = 1<<15
};

extern GString *GLADE_FILE;
extern GladeXML *main_window_xml;

void int_hscale_config_notify (GConfClient *client,
			       guint        cnxn_id,
			       GConfEntry  *entry,
			       gpointer     user_data)
{
  GtkWidget *w = user_data;
 
  gtk_range_set_value (GTK_RANGE(w), gconf_value_get_int (gconf_entry_get_value (entry)));
}

void entry_hscale_value_changed_callback (GtkWidget* w, gpointer user_data)
{
  GConfClient *client;
  gint i;

  client = GCONF_CLIENT(g_object_get_data (G_OBJECT (w), "client"));
  i = gtk_range_get_value (GTK_RANGE(w));

  gconf_client_set_int (client, (gchar *) user_data, i, NULL);
}




void int_main_menu_generic_config_notify (GConfClient *client,
					 guint        cnxn_id,
					 GConfEntry  *entry,
					 gpointer     user_data,
					 gint         BIT)
{
  GtkWidget *w = user_data;
  gint i;
  gboolean b;

  i = gconf_value_get_int (gconf_entry_get_value (entry));
  b = i & BIT;

  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), b);
}

void entry_bool_toggled_main_menu_generic_callback (GtkWidget* w, gpointer user_data, gint BIT)
{
  GConfClient *client;
  gboolean b;
  gint i;

  client = GCONF_CLIENT(g_object_get_data (G_OBJECT (w), "client"));
  b = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(w));
  i = gconf_client_get_int (client, (gchar *) user_data, NULL);

  if (b) {
    i |= BIT;
  }
  else {
    i &= ~BIT;
  }

  gconf_client_set_int (client, (gchar *) user_data, i, NULL);
}


void int_main_menu_system_config_notify (GConfClient *client,
					 guint        cnxn_id,
					 GConfEntry  *entry,
					 gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_SYSTEM);
}

void entry_bool_toggled_main_menu_system_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_SYSTEM);
}

void int_main_menu_system_sub_config_notify (GConfClient *client,
					     guint        cnxn_id,
					     GConfEntry  *entry,
					     gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_SYSTEM_SUB);
}

void entry_bool_toggled_main_menu_system_sub_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_SYSTEM_SUB);
}

void int_main_menu_distribution_config_notify (GConfClient *client,
					       guint        cnxn_id,
					       GConfEntry  *entry,
					       gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_DISTRIBUTION);
}

void entry_bool_toggled_main_menu_distribution_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_DISTRIBUTION);
}

void int_main_menu_distribution_sub_config_notify (GConfClient *client,
						   guint        cnxn_id,
						   GConfEntry  *entry,
						   gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_DISTRIBUTION_SUB);
}

void entry_bool_toggled_main_menu_distribution_sub_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_DISTRIBUTION_SUB);
}

void int_main_menu_kde_config_notify (GConfClient *client,
				      guint        cnxn_id,
				      GConfEntry  *entry,
				      gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_KDE);
}

void entry_bool_toggled_main_menu_kde_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_KDE);
}

void int_main_menu_kde_sub_config_notify (GConfClient *client,
					  guint        cnxn_id,
					  GConfEntry  *entry,
					  gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_KDE_SUB);
}

void entry_bool_toggled_main_menu_kde_sub_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_KDE_SUB);
}

void int_main_menu_panel_sub_config_notify (GConfClient *client,
					    guint        cnxn_id,
					    GConfEntry  *entry,
					    gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_PANEL_SUB);
}

void entry_bool_toggled_main_menu_panel_sub_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_PANEL_SUB);
}

void int_main_menu_desktop_config_notify (GConfClient *client,
					  guint        cnxn_id,
					  GConfEntry  *entry,
					  gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_DESKTOP);
}

void entry_bool_toggled_main_menu_desktop_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_DESKTOP);
}

void int_main_menu_desktop_sub_config_notify (GConfClient *client,
					      guint        cnxn_id,
					      GConfEntry  *entry,
					      gpointer     user_data)
{
  int_main_menu_generic_config_notify (client, cnxn_id, entry, user_data, MAIN_MENU_DESKTOP_SUB);
}

void entry_bool_toggled_main_menu_desktop_sub_callback (GtkWidget* w, gpointer user_data)
{
  entry_bool_toggled_main_menu_generic_callback (w, user_data, MAIN_MENU_DESKTOP_SUB);
}



gchar *get_main_menu_flags_gconf_key (gchar *root, gchar *profile)
{
  GConfClient *client;

  gchar *objects_root = NULL;
  GSList *l = NULL;

  gboolean b;
  gchar *gconf_key = NULL;
  gchar *return_val = NULL;

  /* Get the default client */
  client = gconf_client_get_default ();
  objects_root = g_strconcat (root, "/", profile, "/objects", NULL);
  l = gconf_client_all_dirs (client, objects_root, NULL);

  while (l != NULL)
    {
      /* find all objects with main-menu == true */
      gconf_key = g_strconcat (l->data, "/main-menu", NULL);
      b = gconf_client_get_bool (client, gconf_key, NULL);
      if (b) {
	return_val = g_strconcat(l->data, "/main-menu-flags", NULL);
      }
      l = g_list_next (l);
    }

  return return_val;
}


void setup_panel ()
{
  GtkWidget *w;
  gchar *gconf_key;

  /* FIXME - make this work for other profiles */ 
  gchar *current_panel_profile = "default";
  gchar *main_menu_flags_gconf_key = NULL;

  main_menu_flags_gconf_key = get_main_menu_flags_gconf_key ("/apps/panel/profiles", current_panel_profile);

  gconf_key = "/apps/panel/global/highlight_launchers_on_mouseover";
  w = glade_xml_get_widget (main_window_xml, "highlight_launchers_checkbutton");

  if (!gconf_key_is_bool (gconf_key))
    {
      gtk_widget_set_sensitive (w, FALSE);
    }
  else
    {
      setup_setting_widget (w, gconf_key, bool_config_notify);
      g_signal_connect (G_OBJECT (w), "toggled",
			G_CALLBACK (entry_bool_toggled_callback),
			gconf_key);
      /* Set correct initial value of widget */
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), gconf_key_get_bool (gconf_key));
    }

  gconf_key = "/apps/panel/global/tooltips_enabled";
  w = glade_xml_get_widget (main_window_xml, "tooltip_checkbutton");

  if (!gconf_key_is_bool (gconf_key))
    {
      gtk_widget_set_sensitive (w, FALSE);
    }
  else
    {
      setup_setting_widget (w, gconf_key, bool_config_notify);
      g_signal_connect (G_OBJECT (w), "toggled",
			G_CALLBACK (entry_bool_toggled_callback),
			gconf_key);
      /* Set correct initial value of widget */
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), gconf_key_get_bool (gconf_key));
    }

  gconf_key = "/apps/panel/global/confirm_panel_remove";
  w = glade_xml_get_widget (main_window_xml, "confirm_remove_checkbutton");

  if (!gconf_key_is_bool (gconf_key))
    {
      gtk_widget_set_sensitive (w, FALSE);
    }
  else
    {
      setup_setting_widget (w, gconf_key, bool_config_notify);
      g_signal_connect (G_OBJECT (w), "toggled",
			G_CALLBACK (entry_bool_toggled_callback),
			gconf_key);
      /* Set correct initial value of widget */
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), gconf_key_get_bool (gconf_key));
    }

  gconf_key = "/apps/panel/global/panel_hide_delay";
  w = glade_xml_get_widget (main_window_xml, "hide_delay_hscale");

  if (!gconf_key_is_int (gconf_key))
    {
      gtk_widget_set_sensitive (w, FALSE);
    }
  else
    {
      setup_setting_widget (w, gconf_key, int_hscale_config_notify);
      g_signal_connect (G_OBJECT (w), "value_changed",
			G_CALLBACK (entry_hscale_value_changed_callback),
			gconf_key);
      /* Set correct initial value of widget */
      gtk_range_set_value (GTK_RANGE(w), gconf_key_get_int (gconf_key));
    }

  gconf_key = "/apps/panel/global/panel_show_delay";
  w = glade_xml_get_widget (main_window_xml, "show_delay_hscale");

  if (!gconf_key_is_int (gconf_key))
    {
      gtk_widget_set_sensitive (w, FALSE);
    }
  else
    {
      setup_setting_widget (w, gconf_key, int_hscale_config_notify);
      g_signal_connect (G_OBJECT (w), "value_changed",
			G_CALLBACK (entry_hscale_value_changed_callback),
			gconf_key);
      /* Set correct initial value of widget */
      gtk_range_set_value (GTK_RANGE(w), gconf_key_get_int (gconf_key));
    }

  gconf_key = "/apps/panel/global/panel_minimized_size";
  w = glade_xml_get_widget (main_window_xml, "minimized_panel_size_spinbutton");

  if (!gconf_key_is_int (gconf_key))
    {
      gtk_widget_set_sensitive (w, FALSE);
    }
  else
    {
      setup_setting_widget (w, gconf_key, int_spin_button_config_notify);
      g_signal_connect (G_OBJECT (w), "value_changed",
			G_CALLBACK (entry_spin_button_value_changed_callback),
			gconf_key);
      /* Set correct initial value of widget */
      gtk_spin_button_set_value (GTK_SPIN_BUTTON(w), gconf_key_get_int (gconf_key));
    }


  
/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_system_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_system_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_system_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_SYSTEM)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_system_sub_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_system_sub_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_system_sub_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_SYSTEM_SUB)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_distribution_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_distribution_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_distribution_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_DISTRIBUTION)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_distribution_sub_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_distribution_sub_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_distribution_sub_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_DISTRIBUTION_SUB)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_desktop_sub_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_desktop_sub_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_desktop_sub_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_DESKTOP_SUB)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_kde_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_kde_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_kde_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_KDE)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_kde_sub_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_kde_sub_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_kde_sub_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_KDE_SUB)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_panel_sub_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_panel_sub_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_panel_sub_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_PANEL_SUB)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_desktop_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_desktop_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_desktop_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_DESKTOP)); */
/*     } */

/*   gconf_key = main_menu_flags_gconf_key; */
/*   w = glade_xml_get_widget (main_window_xml, "main_menu_desktop_sub_checkbutton"); */

/*   if (!gconf_key_is_int (gconf_key)) */
/*     { */
/*       gtk_widget_set_sensitive (w, FALSE); */
/*     } */
/*   else */
/*     { */
/*       setup_setting_widget (w, gconf_key, int_main_menu_desktop_sub_config_notify); */
/*       g_signal_connect (G_OBJECT (w), "toggled", */
/* 			G_CALLBACK (entry_bool_toggled_main_menu_desktop_sub_callback), */
/* 			gconf_key); */
/*       /\* Set correct initial value of widget *\/ */
/*       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), (gboolean)(gconf_key_get_int (gconf_key) & MAIN_MENU_DESKTOP_SUB)); */
/*     } */

}


syntax highlighted by Code2HTML, v. 0.9.1