/*------------------------------------------------------------------------- * Copyright (c) 2001-2005 Kenneth W. Sodemann (stuffle@mac.com) *------------------------------------------------------------------------- * prop_dlg * * Synopsis: * Properties Dlg * * $Id: props.c,v 1.25 2005/02/12 03:18:27 stuffle Exp $ * * 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 * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * *------------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H # include #endif #include #include "defs.h" #include "gtkutils.h" #include "props.h" #include "util.h" #define MIN_MINUTES 0 #define MAX_MINUTES 120 #define RESPONSE_HELP 1 #define GCONF_KEY "gc_key" /* * widgets */ #define PROP_DLG "prop_dlg" #define AUTO_REF_SPINNER "auto_ref_spinner" #define HTML_VIEWER_ENTRY "html_viewer_entry" #define TEXT_VIEWER_ENTRY "text_viewer_entry" #define SHOW_LOGIN_CB "show_login_cb" #define REMEMBER_WIN_SIZE_CB "remember_win_size_cb" #define NOTEBOOK "notebook" #define SHOW_INACTIVE_PRJ_CB "show_inactive_prj_cb" #define ATTR_SORT_USERDEF_RB "attr_sort_userdef_rb" #define ATTR_SORT_ALPHA_RB "attr_sort_alpha_rb" #define ATTR_SORT_NEW_FIRST_RB "attr_sort_new_first_rb" #define ATTR_SORT_OLD_FIRST_RB "attr_sort_old_first_rb" #define PRJ_SORT_ALPHA_RB "prj_sort_alpha_rb" #define PRJ_SORT_NEW_FIRST_RB "prj_sort_new_first_rb" #define PRJ_SORT_OLD_FIRST_RB "prj_sort_old_first_rb" #define PRJ_EXTRA_LBL "prj_extra_lbl" #define THE_SORT_ORDER "sortorder" static void on_prop_dlg_destroy (GtkWidget *widget, gpointer user_data) { } static void show_help (gint page_num) { GError *error = NULL; switch (page_num) { case 0: gnome_help_display ("preps.xml", NULL, &error); break; case 1: gnome_help_display ("preps.xml", NULL, &error); break; default: g_assert_not_reached(); } if (error != NULL) { g_warning (error->message); g_error_free (error); } } static void on_prop_dlg_response (GtkDialog *dlg, gint resp_id, gpointer user_data) { GtkNotebook *notebook; gint page; switch (resp_id) { case GTK_RESPONSE_CLOSE: gtk_widget_destroy (GTK_WIDGET (dlg)); break; case RESPONSE_HELP: notebook = GTK_NOTEBOOK (lookup_widget (GTK_WIDGET (dlg), NOTEBOOK)); g_assert (notebook != NULL); page = gtk_notebook_get_current_page (notebook); show_help (page); break; case GTK_RESPONSE_DELETE_EVENT: break; default: g_assert_not_reached(); } } static gboolean prefs_entry_commit (GtkWidget *widget, GdkEventFocus *event, gpointer user_data) { GConfClient *client; gchar *value; gchar *key; client = g_object_get_data (G_OBJECT (user_data), MY_GCONF_CLIENT); g_assert (client != NULL); key = g_object_get_data (G_OBJECT (widget), GCONF_KEY); g_assert (key != NULL); value = (gchar *)gtk_entry_get_text (GTK_ENTRY (widget)); if (value[0] != '\000') { gconf_client_set_string (client, key, value, NULL); } else { gconf_client_unset (client, key, NULL); } return FALSE; } static void prefs_spinner_commit (GtkWidget *widget, gpointer user_data) { GConfClient *client; gint value; gchar *key; client = g_object_get_data (G_OBJECT (user_data), MY_GCONF_CLIENT); g_assert (client != NULL); key = g_object_get_data (G_OBJECT (widget), GCONF_KEY); g_assert (key != NULL); value = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widget)); gconf_client_set_int (client, key, value, NULL); } static void prefs_toggle_commit (GtkWidget *widget, gpointer user_data) { GConfClient *client; gboolean value; gchar *key; client = g_object_get_data (G_OBJECT (user_data), MY_GCONF_CLIENT); g_assert (client != NULL); key = g_object_get_data (G_OBJECT (widget), GCONF_KEY); g_assert (key != NULL); value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); gconf_client_set_bool (client, key, value, NULL); } static void set_sort (GtkWidget *widget, GtkWidget *main_win, const gchar *sort_key) { GConfClient *client; SortType value; GString *key; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) { client = g_object_get_data (G_OBJECT (main_win), MY_GCONF_CLIENT); g_assert (client != NULL); key = g_string_new (""); g_string_printf (key, "%s/%s/%s", BASE_KEY, SORT_SECTION, sort_key); value = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), THE_SORT_ORDER)); gconf_client_set_int (client, key->str, value, NULL); g_string_free (key, TRUE); } } static void set_attribute_sort_order (GtkWidget *widget, gpointer user_data) { set_sort (widget, user_data, ATTR_SORT); } static void set_project_sort_order (GtkWidget *widget, gpointer user_data) { set_sort (widget, user_data, PRJ_SORT); } gboolean display_column_in_results (GConfClient *client, DisplayColumn col) { GError *error = NULL; GString *str; gboolean value; str = g_string_new (BASE_KEY); switch (col) { case ASSIGNEE_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, ASSIGNEE_STR); break; case PROBLEM_TYPE_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, PROBLEM_TYPE_STR); break; case PRJ_NAME_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, PRJ_NAME_STR); break; case PR_DESCR_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, PR_DESCR_STR); break; case PR_RPT_NUM_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, PR_RPT_NUM_STR); break; case SEVERITY_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, SEVERITY_STR); break; case STATUS_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, STATUS_STR); break; case SUBMISSION_DATE_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, SUBMISSION_DT_STR); break; case SUBMITTER_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, SUBMITTER_STR); break; case ARCH_COL: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, ARCH_STR); break; default: g_string_append_printf (str, "/%s/%s", MAIN_WIN_SECTION, "BOGUS"); g_assert_not_reached(); break; } value = gconf_client_get_bool (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); value = FALSE; } g_string_free (str, TRUE); return value; } gint auto_refresh_rate (GConfClient *client) { GError *error = NULL; GString *str; gint value; str = g_string_new (""); g_string_printf (str, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, AUTO_REF_RATE); value = gconf_client_get_int (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); value = 0; } g_string_free (str, TRUE); return value; } gchar * html_viewer (GConfClient *client) { GError *error = NULL; GString *str; gchar *buffer; str = g_string_new (""); g_string_printf (str, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, HTML_VIEWER); buffer = gconf_client_get_string (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); buffer = NULL; } g_string_free (str, TRUE); return buffer; } gchar * text_viewer (GConfClient *client) { GError *error = NULL; GString *str; gchar *buffer; str = g_string_new (""); g_string_printf (str, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, TEXT_VIEWER); buffer = gconf_client_get_string (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); buffer = NULL; } g_string_free (str, TRUE); return buffer; } gboolean show_login_dlg_on_startup (GConfClient *client) { GError *error = NULL; GString *str; gboolean flag; str = g_string_new (""); g_string_printf (str, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, SHOW_LOGIN); flag = gconf_client_get_bool (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); flag = FALSE; } g_string_free (str, TRUE); return flag; } gboolean show_inactive_projects_in_menu (GConfClient *client) { GError *error = NULL; GString *str; gboolean flag; str = g_string_new (""); g_string_printf (str, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, INACTIVE_PRJ_STR); flag = gconf_client_get_bool (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); flag = FALSE; } g_string_free (str, TRUE); return flag; } SortType attribute_sort_order (GConfClient *client) { GError *error = NULL; GString *str; gint sort_order; str = g_string_new (""); g_string_printf (str, "%s/%s/%s", BASE_KEY, SORT_SECTION, ATTR_SORT); sort_order = gconf_client_get_int (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); sort_order = SORT_USER_DEF; } g_string_free (str, TRUE); if (!(sort_order == SORT_USER_DEF || sort_order == SORT_ALPHA || sort_order == SORT_NEW_FIRST || sort_order == SORT_OLD_FIRST)) { sort_order = SORT_USER_DEF; } return sort_order; } SortType project_sort_order (GConfClient *client) { GError *error = NULL; GString *str; gint sort_order; str = g_string_new (""); g_string_printf (str, "%s/%s/%s", BASE_KEY, SORT_SECTION, PRJ_SORT); sort_order = gconf_client_get_int (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); sort_order = SORT_USER_DEF; } g_string_free (str, TRUE); if (!(sort_order == SORT_ALPHA || sort_order == SORT_NEW_FIRST || sort_order == SORT_OLD_FIRST)) { sort_order = SORT_ALPHA; } return sort_order; } gboolean remember_window_sizes (GConfClient *client) { GError *error = NULL; GString *str; gboolean flag; str = g_string_new (""); g_string_printf (str, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, REMEMBER_WIN_SIZES); flag = gconf_client_get_bool (client, str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); flag = FALSE; } g_string_free (str, TRUE); return flag; } static void create_general_tab (GtkWidget *prop_box, GtkNotebook *notebook) { GtkObject *adj; GtkWidget *tab_lbl; GtkWidget *mainvbox; GtkWidget *sectvbox; GtkWidget *spacehbox; GtkWidget *dtlvbox; GtkWidget *dtlhbox; GtkWidget *label; GtkWidget *spinner; GtkWidget *entry; GtkWidget *cb; GConfClient *client; gint value; gchar *buffer; GString *key; GtkSizeGroup *size_group; tab_lbl = gtk_label_new (_("General")); GLADE_HOOKUP_OBJECT (prop_box, tab_lbl, "general_tab_lbl"); gtk_widget_show (tab_lbl); mainvbox = gtk_vbox_new (FALSE, MAIN_VBOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, mainvbox, "general_vbox"); gtk_container_set_border_width (GTK_CONTAINER (mainvbox), STD_DLG_BORDER); key = g_string_new (""); client = g_object_get_data (G_OBJECT (prop_box), MY_GCONF_CLIENT); g_assert (client != NULL); /* * System Parameters */ sectvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, sectvbox, "sys_vbox"); gtk_box_pack_start (GTK_BOX (mainvbox), sectvbox, FALSE, FALSE, 0); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("System Parameters")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); GLADE_HOOKUP_OBJECT (prop_box, label, "viewer_label"); gtk_box_pack_start (GTK_BOX (sectvbox), label, FALSE, FALSE, 0); spacehbox = gtk_hbox_new (FALSE, STD_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, spacehbox, "sysspace_hbox"); gtk_box_pack_start (GTK_BOX (sectvbox), spacehbox, FALSE, FALSE, 0); label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (spacehbox), label, FALSE, FALSE, 0); dtlvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, dtlvbox, "sysdtl_vbox"); gtk_box_pack_start (GTK_BOX (spacehbox), dtlvbox, FALSE, FALSE, 0); dtlhbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, dtlhbox, "autoref_hbox"); gtk_box_pack_start (GTK_BOX (dtlvbox), dtlhbox, FALSE, FALSE, 0); label = gtk_label_new (_("Auto-Refresh Rate (minutes):")); GLADE_HOOKUP_OBJECT (prop_box, label, "auto_ref_label"); gtk_box_pack_start (GTK_BOX (dtlhbox), label, FALSE, FALSE, 0); value = auto_refresh_rate (client); adj = gtk_adjustment_new (value, MIN_MINUTES, MAX_MINUTES, 1, 10, 10); spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0); GLADE_HOOKUP_OBJECT (prop_box, spinner, AUTO_REF_SPINNER); g_string_printf (key, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, AUTO_REF_RATE); g_object_set_data_full (G_OBJECT (spinner), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (spinner, "changed", G_CALLBACK (prefs_spinner_commit), prop_box); gtk_box_pack_start (GTK_BOX (dtlhbox), spinner, FALSE, FALSE, 0); cb = gtk_check_button_new_with_label (_("Show login dialog on startup")); GLADE_HOOKUP_OBJECT (prop_box, cb, SHOW_LOGIN_CB); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), show_login_dlg_on_startup (client)); g_string_printf (key, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, SHOW_LOGIN); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_box_pack_start (GTK_BOX (dtlvbox), cb, FALSE, FALSE, 0); cb = gtk_check_button_new_with_label (_("Remember window sizes")); GLADE_HOOKUP_OBJECT (prop_box, cb, REMEMBER_WIN_SIZE_CB); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), remember_window_sizes (client)); g_string_printf (key, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, REMEMBER_WIN_SIZES); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_box_pack_start (GTK_BOX (dtlvbox), cb, FALSE, FALSE, 0); /* * Report Viewer preferences */ sectvbox = gtk_vbox_new (FALSE, STD_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, sectvbox, "viewer_vbox"); gtk_box_pack_start (GTK_BOX (mainvbox), sectvbox, FALSE, FALSE, 0); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("Report Viewers")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); GLADE_HOOKUP_OBJECT (prop_box, label, "viewer_label"); gtk_box_pack_start (GTK_BOX (sectvbox), label, FALSE, FALSE, 0); spacehbox = gtk_hbox_new (FALSE, STD_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, spacehbox, "viewerspace_hbox"); gtk_box_pack_start (GTK_BOX (sectvbox), spacehbox, FALSE, FALSE, 0); label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (spacehbox), label, FALSE, FALSE, 0); size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); dtlvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, dtlvbox, "viewerdtl_vbox"); gtk_box_pack_start (GTK_BOX (spacehbox), dtlvbox, FALSE, FALSE, 0); dtlhbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, dtlhbox, "html_hbox"); gtk_box_pack_start (GTK_BOX (dtlvbox), dtlhbox, FALSE, FALSE, 0); label = gtk_label_new (_("HTML:")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); GLADE_HOOKUP_OBJECT (prop_box, label, "html_label"); gtk_size_group_add_widget (size_group, label); gtk_box_pack_start (GTK_BOX (dtlhbox), label, FALSE, FALSE, 0); entry = gtk_entry_new (); GLADE_HOOKUP_OBJECT (prop_box, entry, HTML_VIEWER_ENTRY); gtk_box_pack_start (GTK_BOX (dtlhbox), entry, TRUE, TRUE, 0); buffer = html_viewer (client); gtk_entry_set_text (GTK_ENTRY (entry), buffer); g_free (buffer); g_string_printf (key, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, HTML_VIEWER); g_object_set_data_full (G_OBJECT (entry), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (entry, "focus_out_event", G_CALLBACK (prefs_entry_commit), prop_box); dtlhbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, dtlhbox, "text_hbox"); gtk_box_pack_start (GTK_BOX (dtlvbox), dtlhbox, FALSE, FALSE, 0); label = gtk_label_new (_("Text:")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); GLADE_HOOKUP_OBJECT (prop_box, label, "text_label"); gtk_size_group_add_widget (size_group, label); gtk_box_pack_start (GTK_BOX (dtlhbox), label, FALSE, FALSE, 0); entry = gtk_entry_new (); GLADE_HOOKUP_OBJECT (prop_box, entry, TEXT_VIEWER_ENTRY); gtk_box_pack_start (GTK_BOX (dtlhbox), entry, TRUE, TRUE, 0); buffer = text_viewer (client); gtk_entry_set_text (GTK_ENTRY (entry), buffer); g_free (buffer); g_string_printf (key, "%s/%s/%s", BASE_KEY, GENERAL_SECTION, TEXT_VIEWER); g_object_set_data_full (G_OBJECT (entry), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (entry, "focus_out_event", G_CALLBACK (prefs_entry_commit), prop_box); g_string_free (key, TRUE); gtk_widget_show_all (mainvbox); gtk_notebook_append_page (notebook, mainvbox, tab_lbl); } static void create_main_win_tab (GtkWidget *prop_box, GtkNotebook *notebook) { GtkWidget *tab_lbl; GtkWidget *table; GtkWidget *vbox; GtkWidget *cb; GtkWidget *label; GtkWidget *spacehbox; GtkWidget *sectvbox; GtkWidget *dtlvbox; GString *key; GConfClient *client; GtkSizeGroup *size_group; tab_lbl = gtk_label_new (_("Main Window")); GLADE_HOOKUP_OBJECT (prop_box, tab_lbl, "main_win_tab_lbl"); gtk_widget_show (tab_lbl); key = g_string_new (""); client = g_object_get_data (G_OBJECT (prop_box), MY_GCONF_CLIENT); g_assert (client != NULL); size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); /* * Main vbox */ vbox = gtk_vbox_new (FALSE, MAIN_VBOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, vbox, "main_win_vbox"); gtk_container_set_border_width (GTK_CONTAINER (vbox), STD_DLG_BORDER); gtk_widget_show (vbox); /* * General Main Window Options Section */ sectvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, sectvbox, "genopt_vbox"); gtk_box_pack_start (GTK_BOX (vbox), sectvbox, FALSE, FALSE, 0); gtk_widget_show (sectvbox); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("General Options")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); GLADE_HOOKUP_OBJECT (prop_box, label, "gen_opt_lbl"); gtk_box_pack_start (GTK_BOX (sectvbox), label, FALSE, FALSE, 0); gtk_widget_show (label); spacehbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, spacehbox, "gen_opt_hbox"); gtk_box_pack_start (GTK_BOX (sectvbox), spacehbox, FALSE, FALSE, 0); gtk_widget_show (spacehbox); label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (spacehbox), label, FALSE, FALSE, 0); gtk_size_group_add_widget (size_group, label); gtk_widget_show (label); dtlvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, dtlvbox, "genopt_dlt_vbox"); gtk_box_pack_start (GTK_BOX (spacehbox), dtlvbox, FALSE, FALSE, 0); gtk_widget_show (dtlvbox); cb = gtk_check_button_new_with_label (_("Show inactive projects in menu")); GLADE_HOOKUP_OBJECT (prop_box, cb, SHOW_INACTIVE_PRJ_CB); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), show_inactive_projects_in_menu (client)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, INACTIVE_PRJ_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_box_pack_start (GTK_BOX (dtlvbox), cb, FALSE, FALSE, 0); gtk_widget_show (cb); /* * Display Columns */ sectvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, sectvbox, "dispopt_vbox"); gtk_box_pack_start (GTK_BOX (vbox), sectvbox, FALSE, FALSE, 0); gtk_widget_show (sectvbox); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("Display Columns in Results")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); GLADE_HOOKUP_OBJECT (prop_box, label, "disp_lbl"); gtk_box_pack_start (GTK_BOX (sectvbox), label, FALSE, FALSE, 0); gtk_widget_show (label); table = gtk_table_new (5, 4, FALSE); GLADE_HOOKUP_OBJECT (prop_box, table, "disp_table"); gtk_box_pack_start (GTK_BOX (sectvbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings (GTK_TABLE (table), DTL_BOX_SPACING); gtk_table_set_col_spacings (GTK_TABLE (table), DTL_BOX_SPACING); gtk_widget_show (table); label = gtk_label_new (" "); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0); gtk_widget_show (label); gtk_size_group_add_widget (size_group, label); cb = gtk_check_button_new_with_label (_("Problem Report Number")); GLADE_HOOKUP_OBJECT (prop_box, cb, "pr_num_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, PR_RPT_NUM_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, PR_RPT_NUM_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Problem Report Description")); GLADE_HOOKUP_OBJECT (prop_box, cb, "pr_desc_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, PR_DESCR_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, PR_DESCR_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Problem Type")); GLADE_HOOKUP_OBJECT (prop_box, cb, "pr_type_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, PROBLEM_TYPE_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, PROBLEM_TYPE_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Status")); GLADE_HOOKUP_OBJECT (prop_box, cb, "status_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, STATUS_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, STATUS_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 1, 2, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Severity")); GLADE_HOOKUP_OBJECT (prop_box, cb, "severity_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, SEVERITY_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, SEVERITY_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 1, 2, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Project Name")); GLADE_HOOKUP_OBJECT (prop_box, cb, "prj_name_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, PRJ_NAME_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, PRJ_NAME_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Assignee")); GLADE_HOOKUP_OBJECT (prop_box, cb, "assignee_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, ASSIGNEE_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, ASSIGNEE_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Submitter")); GLADE_HOOKUP_OBJECT (prop_box, cb, "submitter_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, SUBMITTER_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, SUBMITTER_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Submission Date")); GLADE_HOOKUP_OBJECT (prop_box, cb, "sub_dt_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, SUBMISSION_DATE_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, SUBMISSION_DT_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 2, 3, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); cb = gtk_check_button_new_with_label (_("Archived")); GLADE_HOOKUP_OBJECT (prop_box, cb, "arch_cb"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), display_column_in_results (client, ARCH_COL)); g_string_printf (key, "%s/%s/%s", BASE_KEY, MAIN_WIN_SECTION, ARCH_STR); g_object_set_data_full (G_OBJECT (cb), GCONF_KEY, g_strdup (key->str), (GDestroyNotify) g_free); g_signal_connect (cb, "toggled", G_CALLBACK (prefs_toggle_commit), prop_box); gtk_table_attach (GTK_TABLE (table), cb, 2, 3, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_show (cb); g_string_free (key, TRUE); gtk_notebook_append_page (notebook, vbox, tab_lbl); } static void create_sorting_tab (GtkWidget *prop_box, GtkNotebook *notebook) { GtkWidget *tab_lbl; GtkWidget *vbox; GtkWidget *rb; GtkWidget *label; GtkWidget *spacehbox; GtkWidget *dtlhbox; GtkWidget *sectvbox; GtkWidget *dtlvbox; GString *key; GConfClient *client; GtkSizeGroup *size_group; GSList *grp = NULL; SortType sort_type; tab_lbl = gtk_label_new (_("Sorting")); GLADE_HOOKUP_OBJECT (prop_box, tab_lbl, "sorting_tab_lbl"); gtk_widget_show (tab_lbl); key = g_string_new (""); client = g_object_get_data (G_OBJECT (prop_box), MY_GCONF_CLIENT); g_assert (client != NULL); size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); /* * Main vbox */ vbox = gtk_vbox_new (FALSE, MAIN_VBOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, vbox, "sorting_vbox"); gtk_container_set_border_width (GTK_CONTAINER (vbox), STD_DLG_BORDER); gtk_widget_show (vbox); /* * Attribute Sorting Options Section */ sort_type = attribute_sort_order (client); sectvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, sectvbox, "attropt_vbox"); gtk_box_pack_start (GTK_BOX (vbox), sectvbox, FALSE, FALSE, 0); gtk_widget_show (sectvbox); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("Sort Attribute By")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); GLADE_HOOKUP_OBJECT (prop_box, label, "attr_opt_lbl"); gtk_box_pack_start (GTK_BOX (sectvbox), label, FALSE, FALSE, 0); gtk_widget_show (label); spacehbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, spacehbox, "attr_opt_hbox"); gtk_box_pack_start (GTK_BOX (sectvbox), spacehbox, FALSE, FALSE, 0); gtk_widget_show (spacehbox); label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (spacehbox), label, FALSE, FALSE, 0); gtk_widget_show (label); dtlvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, dtlvbox, "attropt_dtl_vbox"); gtk_box_pack_start (GTK_BOX (spacehbox), dtlvbox, FALSE, FALSE, 0); gtk_widget_show (dtlvbox); dtlhbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING * 2); gtk_box_pack_start (GTK_BOX (dtlvbox), dtlhbox, FALSE, FALSE, 0); gtk_widget_show (dtlhbox); rb = gtk_radio_button_new_with_label (grp, _("User Defined")); GLADE_HOOKUP_OBJECT (prop_box, rb, ATTR_SORT_USERDEF_RB); if (sort_type == SORT_USER_DEF) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); } g_object_set_data (G_OBJECT (rb), THE_SORT_ORDER, GINT_TO_POINTER (SORT_USER_DEF)); g_signal_connect (rb, "toggled", G_CALLBACK (set_attribute_sort_order), prop_box); gtk_box_pack_start (GTK_BOX (dtlhbox), rb, FALSE, FALSE, 0); grp = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb)); gtk_size_group_add_widget (size_group, rb); gtk_widget_show (rb); rb = gtk_radio_button_new_with_label (grp, _("Newest First")); GLADE_HOOKUP_OBJECT (prop_box, rb, ATTR_SORT_NEW_FIRST_RB); if (sort_type == SORT_NEW_FIRST) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); } g_object_set_data (G_OBJECT (rb), THE_SORT_ORDER, GINT_TO_POINTER (SORT_NEW_FIRST)); g_signal_connect (rb, "toggled", G_CALLBACK (set_attribute_sort_order), prop_box); gtk_box_pack_start (GTK_BOX (dtlhbox), rb, FALSE, FALSE, 0); grp = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb)); gtk_widget_show (rb); dtlhbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING * 2); gtk_box_pack_start (GTK_BOX (dtlvbox), dtlhbox, FALSE, FALSE, 0); gtk_widget_show (dtlhbox); rb = gtk_radio_button_new_with_label (grp, _("Alphabetical")); GLADE_HOOKUP_OBJECT (prop_box, rb, ATTR_SORT_ALPHA_RB); if (sort_type == SORT_ALPHA) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); } g_signal_connect (rb, "toggled", G_CALLBACK (set_attribute_sort_order), prop_box); g_object_set_data (G_OBJECT (rb), THE_SORT_ORDER, GINT_TO_POINTER (SORT_ALPHA)); gtk_box_pack_start (GTK_BOX (dtlhbox), rb, FALSE, FALSE, 0); grp = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb)); gtk_size_group_add_widget (size_group, rb); gtk_widget_show (rb); rb = gtk_radio_button_new_with_label (grp, _("Oldest First")); GLADE_HOOKUP_OBJECT (prop_box, rb, ATTR_SORT_OLD_FIRST_RB); if (sort_type == SORT_OLD_FIRST) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); } g_signal_connect (rb, "toggled", G_CALLBACK (set_attribute_sort_order), prop_box); g_object_set_data (G_OBJECT (rb), THE_SORT_ORDER, GINT_TO_POINTER (SORT_OLD_FIRST)); gtk_box_pack_start (GTK_BOX (dtlhbox), rb, FALSE, FALSE, 0); grp = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb)); gtk_widget_show (rb); /* * Project Sorting */ sort_type = project_sort_order (client); sectvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, sectvbox, "prj_opt_vbox"); gtk_box_pack_start (GTK_BOX (vbox), sectvbox, FALSE, FALSE, 0); gtk_widget_show (sectvbox); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("Sort Projects By")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); GLADE_HOOKUP_OBJECT (prop_box, label, "prj_lbl"); gtk_box_pack_start (GTK_BOX (sectvbox), label, FALSE, FALSE, 0); gtk_widget_show (label); spacehbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, spacehbox, "prj_opt_hbox"); gtk_box_pack_start (GTK_BOX (sectvbox), spacehbox, FALSE, FALSE, 0); gtk_widget_show (spacehbox); label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (spacehbox), label, FALSE, FALSE, 0); gtk_widget_show (label); dtlvbox = gtk_vbox_new (FALSE, DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_box, dtlvbox, "prj_dtl_vbox"); gtk_box_pack_start (GTK_BOX (spacehbox), dtlvbox, FALSE, FALSE, 0); gtk_widget_show (dtlvbox); dtlhbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING * 2); gtk_box_pack_start (GTK_BOX (dtlvbox), dtlhbox, FALSE, FALSE, 0); gtk_widget_show (dtlhbox); grp = NULL; rb = gtk_radio_button_new_with_label (grp, _("Alphabetical")); if (sort_type == SORT_ALPHA) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); } GLADE_HOOKUP_OBJECT (prop_box, rb, PRJ_SORT_ALPHA_RB); g_object_set_data (G_OBJECT (rb), THE_SORT_ORDER, GINT_TO_POINTER (SORT_ALPHA)); g_signal_connect (rb, "toggled", G_CALLBACK (set_project_sort_order), prop_box); gtk_box_pack_start (GTK_BOX (dtlhbox), rb, FALSE, FALSE, 0); grp = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb)); gtk_size_group_add_widget (size_group, rb); gtk_widget_show (rb); rb = gtk_radio_button_new_with_label (grp, _("Newest First")); if (sort_type == SORT_NEW_FIRST) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); } GLADE_HOOKUP_OBJECT (prop_box, rb, PRJ_SORT_NEW_FIRST_RB); g_object_set_data (G_OBJECT (rb), THE_SORT_ORDER, GINT_TO_POINTER (SORT_NEW_FIRST)); g_signal_connect (rb, "toggled", G_CALLBACK (set_project_sort_order), prop_box); gtk_box_pack_start (GTK_BOX (dtlhbox), rb, FALSE, FALSE, 0); grp = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb)); gtk_widget_show (rb); dtlhbox = gtk_hbox_new (FALSE, DTL_BOX_SPACING *2); gtk_box_pack_start (GTK_BOX (dtlvbox), dtlhbox, FALSE, FALSE, 0); gtk_widget_show (dtlhbox); label = gtk_label_new (NULL); GLADE_HOOKUP_OBJECT (prop_box, label, PRJ_EXTRA_LBL); gtk_box_pack_start (GTK_BOX (dtlhbox), label, FALSE, FALSE, 0); gtk_size_group_add_widget (size_group, label); gtk_widget_show (label); rb = gtk_radio_button_new_with_label (grp, _("Oldest First")); if (sort_type == SORT_OLD_FIRST) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); } GLADE_HOOKUP_OBJECT (prop_box, rb, PRJ_SORT_OLD_FIRST_RB); g_object_set_data (G_OBJECT (rb), THE_SORT_ORDER, GINT_TO_POINTER (SORT_OLD_FIRST)); g_signal_connect (rb, "toggled", G_CALLBACK (set_project_sort_order), prop_box); gtk_box_pack_start (GTK_BOX (dtlhbox), rb, FALSE, FALSE, 0); grp = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb)); gtk_widget_show (rb); g_string_free (key, TRUE); gtk_notebook_append_page (notebook, vbox, tab_lbl); } static GtkWidget * create_prop_dlg (GtkWidget *main_win) { GtkWidget *prop_dlg; GtkWidget *dialog_vbox; GtkWidget *notebook; GConfClient *client; prop_dlg = gtk_dialog_new_with_buttons (_("Preferences"), GTK_WINDOW (main_win), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_HELP, RESPONSE_HELP, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); GLADE_HOOKUP_OBJECT_NO_REF (prop_dlg, prop_dlg, "prop_dlg"); g_object_set_data (G_OBJECT (prop_dlg), MY_PARENT, main_win); g_object_set_data (G_OBJECT (prop_dlg), PROP_DLG, prop_dlg); g_signal_connect (prop_dlg, "destroy", G_CALLBACK (on_prop_dlg_destroy), NULL); g_signal_connect (prop_dlg, "response", G_CALLBACK (on_prop_dlg_response), NULL); gtk_dialog_set_response_sensitive (GTK_DIALOG (prop_dlg), GTK_RESPONSE_APPLY, FALSE); gtk_window_set_resizable (GTK_WINDOW (prop_dlg), FALSE); gtk_dialog_set_default_response (GTK_DIALOG (prop_dlg), GTK_RESPONSE_CLOSE); client = g_object_get_data (G_OBJECT (main_win), MY_GCONF_CLIENT); g_assert (client != NULL); g_object_set_data (G_OBJECT (prop_dlg), MY_GCONF_CLIENT, client); dialog_vbox = GTK_DIALOG (prop_dlg)->vbox; gtk_box_set_spacing (GTK_BOX (dialog_vbox), DTL_BOX_SPACING); GLADE_HOOKUP_OBJECT (prop_dlg, dialog_vbox, "dialog_vbox"); gtk_widget_show (dialog_vbox); notebook = gtk_notebook_new (); GLADE_HOOKUP_OBJECT (prop_dlg, notebook, NOTEBOOK); gtk_widget_show (notebook); gtk_box_pack_start (GTK_BOX (dialog_vbox), notebook, TRUE, TRUE, 0); create_general_tab (prop_dlg, GTK_NOTEBOOK (notebook)); create_main_win_tab (prop_dlg, GTK_NOTEBOOK (notebook)); create_sorting_tab (prop_dlg, GTK_NOTEBOOK (notebook)); return prop_dlg; } void show_prop_dlg (GtkWidget *main_win) { static GtkWidget *prop_dlg = NULL; if (prop_dlg) { gdk_window_show (prop_dlg->window); gdk_window_raise (prop_dlg->window); } else { prop_dlg = create_prop_dlg (main_win); /* * When the dialog is destroyed, call gtk_widget_destroyed(), which * will set the "user_data" (&prop_dlg in this case), to NULL. */ g_signal_connect (prop_dlg, "destroy", G_CALLBACK (gtk_widget_destroyed), &prop_dlg); gtk_widget_show (prop_dlg); } }