From 318c795c6880e620ce130457928b040492b3d2be Mon Sep 17 00:00:00 2001 From: Jesse van den Kieboom Date: Sun, 6 Nov 2005 16:25:23 +0000 Subject: [PATCH] Initial import --- src/dialogs/gm-preferences-dialog.c | 777 ++++++++++++++++++++++++++++ 1 file changed, 777 insertions(+) create mode 100644 src/dialogs/gm-preferences-dialog.c diff --git a/src/dialogs/gm-preferences-dialog.c b/src/dialogs/gm-preferences-dialog.c new file mode 100644 index 0000000..801a80d --- /dev/null +++ b/src/dialogs/gm-preferences-dialog.c @@ -0,0 +1,777 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "../gm-app.h" +#include "gm-preferences-dialog.h" +#include "../gm-support.h" +#include "../gm-debug.h" +#include "../gm-options.h" +#include "../gm-color-table.h" + +void gm_preferences_dialog_run_dialog(); + +void on_gm_preferences_dialog_check_button_embed_editor_clicked( + GtkButton *button, gpointer user_data); +void on_gm_preferences_dialog_check_button_alt_editor_clicked( + GtkButton *button, gpointer user_data); + +void on_gm_preferences_dialog_combo_box_scheme_changed(GtkComboBox *box, + gpointer user_data); +void on_gm_preferences_dialog_check_button_fg_clicked( + GtkButton *button, gpointer user_data); +void on_gm_preferences_dialog_check_button_bg_clicked( + GtkButton *button, gpointer user_data); +void on_gm_preferences_dialog_toggle_button_style_clicked( + GtkButton *button, gpointer user_data); + +void on_gm_preferences_dialog_tree_view_editor_colors_row_changed( + GtkTreeSelection *selection, gpointer data); +void on_gm_preferences_dialog_color_button_fg_color_set(GtkColorButton *widget, + gpointer data); +void on_gm_preferences_dialog_color_button_bg_color_set(GtkColorButton *widget, + gpointer data); +void on_gm_preferences_dialog_response(GtkDialog *dialog, gint response, + gpointer user_data); + +void gm_preferences_dialog_load_colors(); + +typedef struct _GmPreferencesDialog { + GladeXML *xml; + GtkWidget *dialog; + +} GmPreferencesDialog; + +static const GmKeyValuePair color_mapping[] = { + {"color_button_fg_default", "fg_default"}, + {"color_button_fg_default_h", "fg_default_h"}, + {"color_button_bg_default", "bg_default"}, + + {"color_button_fg_black", "fg_black"}, + {"color_button_fg_black_h", "fg_black_h"}, + {"color_button_fg_red", "fg_red"}, + {"color_button_fg_red_h", "fg_red_h"}, + {"color_button_fg_green", "fg_green"}, + {"color_button_fg_green_h", "fg_green_h"}, + {"color_button_fg_yellow", "fg_yellow"}, + {"color_button_fg_yellow_h", "fg_yellow_h"}, + {"color_button_fg_blue", "fg_blue"}, + {"color_button_fg_blue_h", "fg_blue_h"}, + {"color_button_fg_purple", "fg_purple"}, + {"color_button_fg_purple_h", "fg_purple_h"}, + {"color_button_fg_cyan", "fg_cyan"}, + {"color_button_fg_cyan_h", "fg_cyan_h"}, + {"color_button_fg_white", "fg_white"}, + {"color_button_fg_white_h", "fg_white_h"}, + + {"color_button_bg_black", "bg_black"}, + {"color_button_bg_red", "bg_red"}, + {"color_button_bg_green", "bg_green"}, + {"color_button_bg_yellow", "bg_yellow"}, + {"color_button_bg_blue", "bg_blue"}, + {"color_button_bg_purple", "bg_purple"}, + {"color_button_bg_cyan", "bg_cyan"}, + {"color_button_bg_white", "bg_white"} +}; + +static const GmKeyValuePair color_schemes[] = { + {N_("Default"), "default"}, + {N_("White on black"), "white_on_black"}, + {N_("User defined"), "user"}, + {NULL, NULL} +}; + +static GmPreferencesDialog *preferences = NULL; + +enum { + EDITOR_NAME, + EDITOR_STYLE, + EDITOR_ID, + EDITOR_N_COLUMNS +}; + +enum { + SCHEME_NAME, + SCHEME_OPTION, + SCHEME_N_COLUMNS +}; + +GtkWidget * +gm_preferences_dialog_widget(gchar *name) { + return glade_xml_get_widget(preferences->xml, name); +} + +void +gm_preferences_dialog_init_combo_box_scheme() { + GtkComboBox *box = GTK_COMBO_BOX(gm_preferences_dialog_widget( + "combo_box_scheme")); + GtkListStore *store = gtk_list_store_new(SCHEME_N_COLUMNS, G_TYPE_STRING, + G_TYPE_STRING); + GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); + GtkTreeIter iter; + int i, select = 0; + const gchar *scheme = gm_options_get(gm_app_options(gm_app_instance()), + "color_scheme"); + + gtk_cell_layout_clear(GTK_CELL_LAYOUT(box)); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(box), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(box), renderer, "text", + SCHEME_NAME, NULL); + + gtk_combo_box_set_model(box, GTK_TREE_MODEL(store)); + + i = 0; + + while (color_schemes[i].key != NULL) { + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, SCHEME_NAME, color_schemes[i].key, + SCHEME_OPTION, color_schemes[i].value, -1); + + if (scheme != NULL && strcasecmp(scheme, color_schemes[i].value) == 0) { + select = i; + } + + ++i; + } + + gtk_combo_box_set_active(box, select); +} + +void +gm_preferences_dialog_init_editor_colors_tree() { + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeView *tv = GTK_TREE_VIEW( + gm_preferences_dialog_widget("tree_view_editor_colors")); + GtkListStore *store = gtk_list_store_new(EDITOR_N_COLUMNS, G_TYPE_STRING, + GTK_TYPE_SOURCE_TAG_STYLE, G_TYPE_STRING); + GtkTreeModel *model = + gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(store)); + GtkTreeSelection *select; + + gtk_tree_view_set_model(tv, model); + select = gtk_tree_view_get_selection(tv); + + g_signal_connect(select, "changed", G_CALLBACK( + on_gm_preferences_dialog_tree_view_editor_colors_row_changed), + NULL); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Tag"), renderer, + "text", EDITOR_NAME, NULL); + gtk_tree_view_append_column(tv, column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Style"), renderer, + NULL); + gtk_tree_view_column_set_visible(column, FALSE); + + gtk_tree_view_append_column(tv, column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Id"), renderer, NULL); + gtk_tree_view_column_set_visible(column, FALSE); + + gtk_tree_view_append_column(tv, column); + + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), EDITOR_NAME, + GTK_SORT_ASCENDING); +} + +void +gm_preferences_dialog_init_editor_colors() { + GtkSourceTag *st; + GtkSourceTagStyle *sty; + + GSList *tags, *tag; + gchar *name, *id; + GtkTreeIter iter; + GtkListStore *store; + GtkSourceLanguage *lang = NULL; + + // TODO: Fix this! + // lang = editor_get_language(); + + // Create column ed + gm_preferences_dialog_init_editor_colors_tree(); + store = GTK_LIST_STORE(gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT( + gtk_tree_view_get_model(GTK_TREE_VIEW( + gm_preferences_dialog_widget("tree_view_editor_colors")))))); + + if (lang) { + tags = gtk_source_language_get_tags(lang); + + for (tag = tags; tag; tag = tag->next) { + st = GTK_SOURCE_TAG(tag->data); + sty = gtk_source_tag_get_style(st); + + g_object_get(G_OBJECT(st), "name", &name, "id", &id, NULL); + + gtk_list_store_prepend(store, &iter); + gtk_list_store_set(store, &iter, EDITOR_NAME, name, + EDITOR_STYLE, sty, EDITOR_ID, id, -1); + + g_free(name); + g_free(id); + } + + g_slist_free(tags); + } +} + +#define GM_PREFERENCES_DIALOG_XML \ + PACKAGE_DATA_DIR "/" PACKAGE "/ui/gm-preferences.glade" + +void +gm_preferences_dialog_run() { + const gchar *alt_editor; + GmOptions *options = gm_app_options(gm_app_instance()); + + if (preferences != NULL) { + gtk_window_present(GTK_WINDOW(preferences->dialog)); + return; + } else { + preferences = g_new0(GmPreferencesDialog, 1); + } + + preferences->xml = glade_xml_new(GM_PREFERENCES_DIALOG_XML, + "gm_preferences_dialog", NULL); + preferences->dialog = + gm_preferences_dialog_widget("gm_preferences_dialog"); + gm_preferences_dialog_init_editor_colors(); + gm_preferences_dialog_load_colors(); + gm_preferences_dialog_init_combo_box_scheme(); + + gtk_font_button_set_font_name(GTK_FONT_BUTTON( + gm_preferences_dialog_widget("font_button_font")), + gm_options_get(options, "font-family")); + + alt_editor = gm_options_get(options, "editor_alternative"); + + if (strcmp(alt_editor, "0") == 0) { + alt_editor = NULL; + } else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_alt_editor")), + TRUE); + gtk_entry_set_text(GTK_ENTRY( + gm_preferences_dialog_widget("entry_alt_editor")), + alt_editor); + } + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_embed_editor")), + gm_options_get_int(options, "editor_embed")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_needs_terminal")), + gm_options_get_int(options, "editor_needs_terminal")); + + gtk_widget_set_sensitive( + gm_preferences_dialog_widget("entry_alt_editor"), + alt_editor != NULL); + gtk_widget_set_sensitive( + gm_preferences_dialog_widget("check_button_embed_editor"), + alt_editor != NULL); + gtk_widget_set_sensitive( + gm_preferences_dialog_widget("check_button_needs_terminal"), + alt_editor != NULL + && gm_options_get_int(options, "editor_embed") == 0); + + glade_xml_signal_connect(preferences->xml, + "on_check_button_alt_editor_clicked", G_CALLBACK( + on_gm_preferences_dialog_check_button_alt_editor_clicked)); + glade_xml_signal_connect(preferences->xml, + "on_check_button_embed_editor_clicked", G_CALLBACK( + on_gm_preferences_dialog_check_button_embed_editor_clicked)); + glade_xml_signal_connect(preferences->xml, + "on_check_button_fg_clicked", G_CALLBACK( + on_gm_preferences_dialog_check_button_fg_clicked)); + glade_xml_signal_connect(preferences->xml, + "on_check_button_bg_clicked", G_CALLBACK( + on_gm_preferences_dialog_check_button_bg_clicked)); + + glade_xml_signal_connect(preferences->xml, + "on_combo_box_scheme_changed", G_CALLBACK( + on_gm_preferences_dialog_combo_box_scheme_changed)); + + glade_xml_signal_connect_data(preferences->xml, + "on_toggle_button_bold_clicked", G_CALLBACK( + on_gm_preferences_dialog_toggle_button_style_clicked), + GINT_TO_POINTER(1)); + glade_xml_signal_connect_data(preferences->xml, + "on_toggle_button_style_clicked", G_CALLBACK( + on_gm_preferences_dialog_toggle_button_style_clicked), + GINT_TO_POINTER(2)); + glade_xml_signal_connect_data(preferences->xml, + "on_toggle_button_underline_clicked", G_CALLBACK( + on_gm_preferences_dialog_toggle_button_style_clicked), + GINT_TO_POINTER(3)); + glade_xml_signal_connect_data(preferences->xml, + "on_toggle_button_strike_trough_clicked", G_CALLBACK( + on_gm_preferences_dialog_toggle_button_style_clicked), + GINT_TO_POINTER(4)); + + glade_xml_signal_connect(preferences->xml, + "on_color_button_fg_color_set", G_CALLBACK( + on_gm_preferences_dialog_color_button_fg_color_set)); + glade_xml_signal_connect(preferences->xml, + "on_color_button_bg_color_set", G_CALLBACK( + on_gm_preferences_dialog_color_button_bg_color_set)); + + gm_preferences_dialog_run_dialog(); +} + +void +gm_preferences_dialog_load_colors() { + int i; + GtkColorButton *but; + GdkColor col; + GmColorTable *color_table = gm_app_color_table(gm_app_instance()); + + for (i = 0; i < (int)(sizeof(color_mapping) / sizeof(GmKeyValuePair)); i++) { + but = GTK_COLOR_BUTTON(gm_preferences_dialog_widget( + color_mapping[i].key)); + + gm_color_table_get(color_table, color_mapping[i].value, &col); + gtk_color_button_set_color(but, &col); + } +} + +void +gm_preferences_dialog_save_colors() { + int i; + GtkColorButton *but; + GdkColor col; + GmColorTable *color_table = gm_app_color_table(gm_app_instance()); + gchar *col_str; + + for (i = 0; i < (int)(sizeof(color_mapping) / sizeof(GmKeyValuePair)); i++) { + but = GTK_COLOR_BUTTON(gm_preferences_dialog_widget( + color_mapping[i].key)); + + gtk_color_button_get_color(but, &col); + col_str = g_strdup_printf("#%04X%04X%04X", col.red, col.green, + col.blue); + + gm_color_table_set(color_table, color_mapping[i].value, col_str); + g_free(col_str); + } +} + +void +gm_preferences_dialog_save_editor_color(GtkTreeModel *model, + GtkTreeIter *iter) { + gchar *name, *id, *opt_key, *opt_value, *fg, *bg; + GtkSourceTagStyle *style; + GmOptions *options = gm_app_options(gm_app_instance()); + + gtk_tree_model_get(model, iter, EDITOR_NAME, &name, EDITOR_STYLE, &style, + EDITOR_ID, &id, -1); + + opt_key = g_strconcat("editor_", name, NULL); + + if (!(style->mask & GTK_SOURCE_TAG_STYLE_USE_FOREGROUND)) { + fg = g_strdup("0"); + } else { + fg = g_strdup_printf("#%04X%04X%04X", style->foreground.red, + style->foreground.green, style->foreground.blue); + } + + if (!(style->mask & GTK_SOURCE_TAG_STYLE_USE_BACKGROUND)) { + bg = g_strdup("0"); + } else { + bg = g_strdup_printf("#%04X%04X%04X", style->background.red, + style->background.green, style->background.blue); + } + + opt_value = g_strdup_printf("%s,%s,%d,%d,%d,%d", fg, bg, style->bold, + style->italic, style->underline, + style->strikethrough); + + debug_msg(1, "GmPreferencesDialog.SaveEditorColor %s to %s", opt_key, + opt_value); + + gm_options_set(options, opt_key, opt_value); + + // TODO: do something about this + //gtk_source_language_set_tag_style(editor_get_language(), id, style); + + g_free(opt_key); + g_free(opt_value); + g_free(id); + g_free(fg); + g_free(bg); + g_free(name); + + // CHECK this: + //gtk_source_tag_style_free(style); +} + +void +gm_preferences_dialog_save_editor_colors() { + GtkTreeIter iter; + GtkTreeView *vw = GTK_TREE_VIEW( + gm_preferences_dialog_widget("tree_view_editor_colors")); + GtkTreeModelSort *model = GTK_TREE_MODEL_SORT(gtk_tree_view_get_model(vw)); + GtkTreeModel *store = gtk_tree_model_sort_get_model(model); + + if (gtk_tree_model_get_iter_first(store, &iter)) { + do { + gm_preferences_dialog_save_editor_color(store, &iter); + } while (gtk_tree_model_iter_next(store, &iter)); + } +} + +gboolean +gm_preferences_dialog_check_values() { + const gchar *alt_editor = gtk_entry_get_text(GTK_ENTRY( + gm_preferences_dialog_widget("entry_alt_editor"))); + const gchar *font_description = gtk_font_button_get_font_name( + GTK_FONT_BUTTON(gm_preferences_dialog_widget("font_button_font"))); + gboolean use_alt_editor = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_alt_editor"))); + GmOptions *options = gm_app_options(gm_app_instance()); + + if (use_alt_editor && alt_editor[0] != '\0') { + gm_error_dialog(_("Editor can't be empty, enter a non empty command"), + GTK_WINDOW(preferences->dialog)); + gm_notebook_focus_from_label(GTK_NOTEBOOK(gm_preferences_dialog_widget( + "notebook_preferences")), _("Editor")); + gtk_widget_grab_focus(gm_preferences_dialog_widget("entry_alt_editor")); + + return FALSE; + } + + if (use_alt_editor) { + gm_options_set(options, "editor_alternative", alt_editor); + } else { + gm_options_set(options, "editor_alternative", "0"); + } + + gm_options_set_int(options, "editor_embed", gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(gm_preferences_dialog_widget + ("check_button_embed_editor")))); + gm_options_set_int(options, "editor_needs_terminal", + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_needs_terminal")))); + + gm_options_set(options, "font-family", font_description); + gm_preferences_dialog_save_colors(); + gm_preferences_dialog_save_editor_colors(); + + return TRUE; +} + +void +gm_preferences_dialog_run_dialog() { + g_signal_connect(preferences->dialog, "response", + G_CALLBACK(on_gm_preferences_dialog_response), NULL); + + gtk_widget_show(GTK_WIDGET(preferences->dialog)); +} + +/* CALLBACKS */ + +void +on_gm_preferences_dialog_response(GtkDialog *dialog, gint response, + gpointer user_data) { + gboolean is_okay = TRUE; + + switch (response) { + case GTK_RESPONSE_OK: case GTK_RESPONSE_APPLY: + if (gm_preferences_dialog_check_values()) { + gm_options_save(gm_app_options(gm_app_instance())); + + if (response == GTK_RESPONSE_APPLY) { + is_okay = FALSE; + } + } else { + is_okay = FALSE; + } + break; + default: + break; + } + + if (is_okay) { + gtk_widget_destroy(GTK_WIDGET(dialog)); + g_object_unref(preferences->xml); + g_free(preferences); + preferences = NULL; + } +} + +void +on_gm_preferences_dialog_check_button_embed_editor_clicked( + GtkButton *button, gpointer user_data) { + gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + GmOptions *options = gm_app_options(gm_app_instance()); + + if (active) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_needs_terminal")), + TRUE); + } else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_needs_terminal")), + gm_options_get_int(options, "editor_needs_terminal")); + } + + gtk_widget_set_sensitive(gm_preferences_dialog_widget( + "check_button_needs_terminal"), !active); +} + +void +on_gm_preferences_dialog_check_button_alt_editor_clicked( + GtkButton *button, gpointer user_data) { + gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + + if (!active) { + gtk_entry_set_text(GTK_ENTRY(gm_preferences_dialog_widget( + "entry_alt_editor")), ""); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_embed_editor")), + FALSE); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + gm_preferences_dialog_widget("check_button_needs_terminal")), + FALSE); + } + + gtk_widget_set_sensitive(gm_preferences_dialog_widget( + "entry_alt_editor"), active); + gtk_widget_set_sensitive(gm_preferences_dialog_widget( + "check_button_embed_editor"), active); + gtk_widget_set_sensitive(gm_preferences_dialog_widget( + "check_button_needs_terminal"), active); +} + +void +gm_preferences_dialog_editor_style_do_enable() { + gtk_widget_set_sensitive(gm_preferences_dialog_widget("check_button_fg"), + TRUE); + gtk_widget_set_sensitive(gm_preferences_dialog_widget("check_button_bg"), + TRUE); + gtk_widget_set_sensitive(gm_preferences_dialog_widget("toggle_button_bold"), + TRUE); + gtk_widget_set_sensitive(gm_preferences_dialog_widget( + "toggle_button_style"), TRUE); + gtk_widget_set_sensitive(gm_preferences_dialog_widget( + "toggle_button_underline"), TRUE); + gtk_widget_set_sensitive(gm_preferences_dialog_widget( + "toggle_button_strike_through"), TRUE); +} + +void +on_gm_preferences_dialog_tree_view_editor_colors_row_changed( + GtkTreeSelection *selection, gpointer data) { + GtkTreeIter iter; + GtkTreeModel *model; + GtkSourceTagStyle *style; + GtkColorButton *fg, *bg; + GtkToggleButton *fgt, *bgt; + GdkColor empty_col; + + gdk_color_parse("black", &empty_col); + + gtk_tree_selection_get_selected(selection, &model, &iter); + gtk_tree_model_get(model, &iter, EDITOR_STYLE, &style, -1); + + fg = GTK_COLOR_BUTTON(gm_preferences_dialog_widget("color_button_fg")); + bg = GTK_COLOR_BUTTON(gm_preferences_dialog_widget("color_button_bg")); + fgt = GTK_TOGGLE_BUTTON(gm_preferences_dialog_widget("check_button_fg")); + bgt = GTK_TOGGLE_BUTTON(gm_preferences_dialog_widget("check_button_bg")); + + if (style->mask & GTK_SOURCE_TAG_STYLE_USE_FOREGROUND) { + gtk_color_button_set_color(fg, &(style->foreground)); + gtk_widget_set_sensitive(GTK_WIDGET(fg), TRUE); + gtk_toggle_button_set_active(fgt, TRUE); + } else { + gtk_color_button_set_color(fg, &empty_col); + gtk_widget_set_sensitive(GTK_WIDGET(fg), FALSE); + gtk_toggle_button_set_active(fgt, FALSE); + } + + if (style->mask & GTK_SOURCE_TAG_STYLE_USE_BACKGROUND) { + gtk_color_button_set_color(bg, &(style->background)); + gtk_widget_set_sensitive(GTK_WIDGET(bg), TRUE); + gtk_toggle_button_set_active(bgt, TRUE); + } else { + gtk_color_button_set_color(bg, &empty_col); + gtk_widget_set_sensitive(GTK_WIDGET(bg), FALSE); + gtk_toggle_button_set_active(bgt, FALSE); + } + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gm_preferences_dialog_widget( + "check_button_bold")), style->bold); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gm_preferences_dialog_widget( + "check_button_style")), style->italic); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gm_preferences_dialog_widget( + "check_button_underline")), style->underline); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gm_preferences_dialog_widget( + "check_button_strike_through")), style->strikethrough); + gm_preferences_dialog_editor_style_do_enable(); +} + +typedef struct _GmSelectionInfo { + GtkTreeIter siter; + GtkTreeIter iter; + GtkListStore *store; + GtkTreeModel *model; + GtkSourceTagStyle *style; +} GmSelectionInfo; + +GmSelectionInfo +gm_preferences_dialog_get_selection_info() { + GtkTreeSelection *selection; + GmSelectionInfo info; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( + gm_preferences_dialog_widget("tree_view_editor_colors"))); + + gtk_tree_selection_get_selected(selection, &(info.model), &(info.siter)); + gtk_tree_model_get(info.model, &(info.siter), EDITOR_STYLE, &(info.style), + -1); + gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT( + info.model), &(info.iter), &(info.siter)); + + info.store = GTK_LIST_STORE(gtk_tree_model_sort_get_model( + GTK_TREE_MODEL_SORT(info.model))); + + return info; +} + +void +on_gm_preferences_dialog_check_button_fg_clicked(GtkButton *button, + gpointer user_data) { + GmSelectionInfo info; + gboolean tog = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + GtkWidget *clb = gm_preferences_dialog_widget("color_button_fg"); + GdkColor empty_col; + + info = gm_preferences_dialog_get_selection_info(); + gdk_color_parse("black", &empty_col); + + if (tog) { + info.style->mask = info.style->mask | + GTK_SOURCE_TAG_STYLE_USE_FOREGROUND; + } else { + info.style->mask = info.style->mask & + ~GTK_SOURCE_TAG_STYLE_USE_FOREGROUND; + gtk_color_button_set_color(GTK_COLOR_BUTTON(clb), &empty_col); + info.style->foreground = empty_col; + } + + gtk_list_store_set(info.store, &(info.iter), EDITOR_STYLE, info.style, -1); + gtk_source_tag_style_free(info.style); + + gtk_widget_set_sensitive(clb, tog); +} + +void +on_gm_preferences_dialog_check_button_bg_clicked(GtkButton *button, + gpointer user_data) { + GmSelectionInfo info; + gboolean tog = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + GtkWidget *clb = gm_preferences_dialog_widget("color_button_bg"); + GdkColor empty_col; + + info = gm_preferences_dialog_get_selection_info(); + gdk_color_parse("black", &empty_col); + + if (tog) { + info.style->mask = info.style->mask | + GTK_SOURCE_TAG_STYLE_USE_BACKGROUND; + } else { + info.style->mask = info.style->mask & + ~GTK_SOURCE_TAG_STYLE_USE_BACKGROUND; + gtk_color_button_set_color(GTK_COLOR_BUTTON(clb), &empty_col); + info.style->background = empty_col; + } + + gtk_list_store_set(info.store, &(info.iter), EDITOR_STYLE, info.style, -1); + gtk_source_tag_style_free(info.style); + + gtk_widget_set_sensitive(clb, tog); +} + +void +on_gm_preferences_dialog_toggle_button_style_clicked(GtkButton *button, + gpointer user_data) { + GmSelectionInfo info; + int type = GPOINTER_TO_INT(user_data); + gboolean tog = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + + info = gm_preferences_dialog_get_selection_info(); + + switch (type) { + case 1: /* bold */ + info.style->bold = tog; + break; + case 2: /* italic */ + info.style->italic = tog; + break; + case 3: /* underline */ + info.style->underline = tog; + break; + case 4: + info.style->strikethrough = tog; + break; + } + + gtk_list_store_set(info.store, &(info.iter), EDITOR_STYLE, info.style, -1); + gtk_source_tag_style_free(info.style); +} + +void +on_gm_preferences_dialog_color_button_fg_color_set(GtkColorButton *widget, + gpointer user_data) { + GmSelectionInfo info; + + info = gm_preferences_dialog_get_selection_info(); + gtk_color_button_get_color(widget, &(info.style->foreground)); + + gtk_list_store_set(info.store, &(info.iter), EDITOR_STYLE, info.style, -1); + gtk_source_tag_style_free(info.style); +} + +void +on_gm_preferences_dialog_color_button_bg_color_set(GtkColorButton *widget, + gpointer user_data) { + GmSelectionInfo info; + + info = gm_preferences_dialog_get_selection_info(); + gtk_color_button_get_color(widget, &(info.style->background)); + + gtk_list_store_set(info.store, &(info.iter), EDITOR_STYLE, info.style, -1); + gtk_source_tag_style_free(info.style); +} + +void +on_gm_preferences_dialog_combo_box_scheme_changed(GtkComboBox *box, + gpointer user_data) { + GtkTreeIter iter; + gchar *scheme; + GtkTreeModel *model = gtk_combo_box_get_model(box); + GmColorTable *color_table = gm_app_color_table(gm_app_instance()); + + gtk_combo_box_get_active_iter(box, &iter); + gtk_tree_model_get(model, &iter, SCHEME_OPTION, &scheme, -1); + gm_color_table_set_from_scheme_name(color_table, scheme); + + g_free(scheme); +}