From 80918e9f0357510133d89d8bfaebcf8ed797d168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Tr=C3=B6ger?= Date: Tue, 26 Jun 2007 15:41:27 +0000 Subject: [PATCH] Add option to set a default encoding when opening files and disable auto detection of the file encoding. git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@1641 ea778897-0a13-0410-b9d1-a72fbfd435f5 --- ChangeLog | 8 +++ geany.glade | 146 ++++++++++++++++++++++++++++++++++++------------ src/document.c | 6 +- src/editor.h | 3 +- src/interface.c | 79 ++++++++++++++++++-------- src/keyfile.c | 25 +++++++-- src/prefs.c | 53 +++++++++++++++--- 7 files changed, 247 insertions(+), 73 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3cc0d1a1a..c9acba4fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-06-26 Enrico Tröger + + * geany.glade, src/document.c, src/editor.h, src/interface.c, + src/keyfile.c, src/prefs.c: + Add option to set a default encoding when opening files and disable + auto detection of the file encoding. + + 2007-06-25 Enrico Tröger * src/main.c: Use setlocale to enable translation of strings before diff --git a/geany.glade b/geany.glade index ff32ed43d..d65f84aed 100644 --- a/geany.glade +++ b/geany.glade @@ -4970,12 +4970,65 @@ Bottom True - 2 + 4 2 False 3 25 + + + True + Sets the default encoding for newly created files. + True + False + + + + True + False + True + + + + + 1 + 2 + 0 + 1 + fill + fill + + + + + + True + Default encoding (new files): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + True @@ -4997,38 +5050,13 @@ Bottom 0 1 - 1 - 2 + 3 + 4 fill - - - True - Sets the default encoding for newly created files. - True - False - - - - True - False - True - - - - - 1 - 2 - 0 - 1 - fill - fill - - - True @@ -5045,23 +5073,22 @@ Bottom 1 2 - 1 - 2 - fill + 3 + 4 - + True - Default encoding: + Default encoding (existing files): False False GTK_JUSTIFY_LEFT False False - 0.5 + 0 0.5 0 0 @@ -5073,12 +5100,59 @@ Bottom 0 1 - 0 - 1 + 2 + 3 fill + + + + True + This option disables the automatic detection of the file encoding when opening files and opens the file with the specified encoding (usually not needed). + True + Use fixed encoding when opening files + True + GTK_RELIEF_NORMAL + False + False + False + True + + + 0 + 2 + 1 + 2 + + + + + + + True + Sets the default encoding for opening existing files. + True + False + + + + True + False + True + + + + + 1 + 2 + 2 + 3 + fill + fill + + 0 diff --git a/src/document.c b/src/document.c index 86beb324c..dc2f2a3d5 100644 --- a/src/document.c +++ b/src/document.c @@ -442,7 +442,7 @@ gint document_new_file(const gchar *filename, filetype *ft) sci_set_undo_collection(doc_list[idx].sci, TRUE); sci_empty_undo_buffer(doc_list[idx].sci); - doc_list[idx].encoding = g_strdup(encodings[editor_prefs.default_encoding].charset); + doc_list[idx].encoding = g_strdup(encodings[editor_prefs.default_new_encoding].charset); // store the opened encoding for undo/redo store_saved_encoding(idx); @@ -783,6 +783,10 @@ gint document_open_file(gint idx, const gchar *filename, gint pos, gboolean read } } + // if default encoding for opening files is set, use it if no forced encoding is set + if (editor_prefs.default_open_encoding >= 0 && forced_enc == NULL) + forced_enc = encodings[editor_prefs.default_open_encoding].charset; + if (! load_text_file(locale_filename, utf8_filename, &filedata, forced_enc)) { g_free(utf8_filename); diff --git a/src/editor.h b/src/editor.h index 325194c66..b03d6abc1 100644 --- a/src/editor.h +++ b/src/editor.h @@ -61,7 +61,8 @@ typedef struct gint tab_width; gint caret_blink_time; gboolean use_tabs; - gint default_encoding; + gint default_new_encoding; + gint default_open_encoding; gboolean new_line; gboolean replace_tabs; gboolean trail_space; diff --git a/src/interface.c b/src/interface.c index 3437ebc89..802c1e9cb 100644 --- a/src/interface.c +++ b/src/interface.c @@ -2535,12 +2535,16 @@ create_prefs_dialog (void) GtkWidget *alignment7; GtkWidget *vbox8; GtkWidget *table5; - GtkWidget *label116; GtkWidget *eventbox1; - GtkWidget *combo_encoding; + GtkWidget *combo_new_encoding; + GtkWidget *label153; + GtkWidget *label116; GtkObject *spin_tab_width_adj; GtkWidget *spin_tab_width; - GtkWidget *label153; + GtkWidget *label_open_encoding; + GtkWidget *check_open_encoding; + GtkWidget *eventbox3; + GtkWidget *combo_open_encoding; GtkWidget *label109; GtkWidget *frame2; GtkWidget *alignment3; @@ -3301,19 +3305,12 @@ create_prefs_dialog (void) gtk_widget_show (vbox8); gtk_container_add (GTK_CONTAINER (alignment7), vbox8); - table5 = gtk_table_new (2, 2, FALSE); + table5 = gtk_table_new (4, 2, FALSE); gtk_widget_show (table5); gtk_box_pack_start (GTK_BOX (vbox8), table5, FALSE, TRUE, 0); gtk_table_set_row_spacings (GTK_TABLE (table5), 3); gtk_table_set_col_spacings (GTK_TABLE (table5), 25); - label116 = gtk_label_new (_("Tab Width:")); - gtk_widget_show (label116); - gtk_table_attach (GTK_TABLE (table5), label116, 0, 1, 1, 2, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_misc_set_alignment (GTK_MISC (label116), 0, 0.5); - eventbox1 = gtk_event_box_new (); gtk_widget_show (eventbox1); gtk_table_attach (GTK_TABLE (table5), eventbox1, 1, 2, 0, 1, @@ -3321,26 +3318,60 @@ create_prefs_dialog (void) (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_tooltips_set_tip (tooltips, eventbox1, _("Sets the default encoding for newly created files."), NULL); - combo_encoding = gtk_combo_box_new_text (); - gtk_widget_show (combo_encoding); - gtk_container_add (GTK_CONTAINER (eventbox1), combo_encoding); + combo_new_encoding = gtk_combo_box_new_text (); + gtk_widget_show (combo_new_encoding); + gtk_container_add (GTK_CONTAINER (eventbox1), combo_new_encoding); + + label153 = gtk_label_new (_("Default encoding (new files):")); + gtk_widget_show (label153); + gtk_table_attach (GTK_TABLE (table5), label153, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (label153), 0, 0.5); + + label116 = gtk_label_new (_("Tab Width:")); + gtk_widget_show (label116); + gtk_table_attach (GTK_TABLE (table5), label116, 0, 1, 3, 4, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (label116), 0, 0.5); spin_tab_width_adj = gtk_adjustment_new (-1, 1, 99, 1, 10, 10); spin_tab_width = gtk_spin_button_new (GTK_ADJUSTMENT (spin_tab_width_adj), 1, 0); gtk_widget_show (spin_tab_width); - gtk_table_attach (GTK_TABLE (table5), spin_tab_width, 1, 2, 1, 2, - (GtkAttachOptions) (GTK_FILL), + gtk_table_attach (GTK_TABLE (table5), spin_tab_width, 1, 2, 3, 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_tooltips_set_tip (tooltips, spin_tab_width, _("The width in chars, which one tab character will take"), NULL); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin_tab_width), TRUE); gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spin_tab_width), GTK_UPDATE_IF_VALID); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spin_tab_width), TRUE); - label153 = gtk_label_new (_("Default encoding:")); - gtk_widget_show (label153); - gtk_table_attach (GTK_TABLE (table5), label153, 0, 1, 0, 1, + label_open_encoding = gtk_label_new (_("Default encoding (existing files):")); + gtk_widget_show (label_open_encoding); + gtk_table_attach (GTK_TABLE (table5), label_open_encoding, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (label_open_encoding), 0, 0.5); + + check_open_encoding = gtk_check_button_new_with_mnemonic (_("Use fixed encoding when opening files")); + gtk_widget_show (check_open_encoding); + gtk_table_attach (GTK_TABLE (table5), check_open_encoding, 0, 2, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_tooltips_set_tip (tooltips, check_open_encoding, _("This option disables the automatic detection of the file encoding when opening files and opens the file with the specified encoding (usually not needed)."), NULL); + gtk_button_set_focus_on_click (GTK_BUTTON (check_open_encoding), FALSE); + + eventbox3 = gtk_event_box_new (); + gtk_widget_show (eventbox3); + gtk_table_attach (GTK_TABLE (table5), eventbox3, 1, 2, 2, 3, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox3, _("Sets the default encoding for opening existing files."), NULL); + + combo_open_encoding = gtk_combo_box_new_text (); + gtk_widget_show (combo_open_encoding); + gtk_container_add (GTK_CONTAINER (eventbox3), combo_open_encoding); label109 = gtk_label_new (_("New files")); gtk_widget_show (label109); @@ -4169,11 +4200,15 @@ create_prefs_dialog (void) GLADE_HOOKUP_OBJECT (prefs_dialog, alignment7, "alignment7"); GLADE_HOOKUP_OBJECT (prefs_dialog, vbox8, "vbox8"); GLADE_HOOKUP_OBJECT (prefs_dialog, table5, "table5"); - GLADE_HOOKUP_OBJECT (prefs_dialog, label116, "label116"); GLADE_HOOKUP_OBJECT (prefs_dialog, eventbox1, "eventbox1"); - GLADE_HOOKUP_OBJECT (prefs_dialog, combo_encoding, "combo_encoding"); - GLADE_HOOKUP_OBJECT (prefs_dialog, spin_tab_width, "spin_tab_width"); + GLADE_HOOKUP_OBJECT (prefs_dialog, combo_new_encoding, "combo_new_encoding"); GLADE_HOOKUP_OBJECT (prefs_dialog, label153, "label153"); + GLADE_HOOKUP_OBJECT (prefs_dialog, label116, "label116"); + GLADE_HOOKUP_OBJECT (prefs_dialog, spin_tab_width, "spin_tab_width"); + GLADE_HOOKUP_OBJECT (prefs_dialog, label_open_encoding, "label_open_encoding"); + GLADE_HOOKUP_OBJECT (prefs_dialog, check_open_encoding, "check_open_encoding"); + GLADE_HOOKUP_OBJECT (prefs_dialog, eventbox3, "eventbox3"); + GLADE_HOOKUP_OBJECT (prefs_dialog, combo_open_encoding, "combo_open_encoding"); GLADE_HOOKUP_OBJECT (prefs_dialog, label109, "label109"); GLADE_HOOKUP_OBJECT (prefs_dialog, frame2, "frame2"); GLADE_HOOKUP_OBJECT (prefs_dialog, alignment3, "alignment3"); diff --git a/src/keyfile.c b/src/keyfile.c index 07e15a643..8557a4279 100644 --- a/src/keyfile.c +++ b/src/keyfile.c @@ -268,7 +268,11 @@ void configuration_save() g_key_file_set_boolean(config, PACKAGE, "pref_editor_replace_tabs", editor_prefs.replace_tabs); g_key_file_set_boolean(config, PACKAGE, "pref_editor_trail_space", editor_prefs.trail_space); g_key_file_set_boolean(config, PACKAGE, "pref_editor_disable_dnd", editor_prefs.disable_dnd); - g_key_file_set_string(config, PACKAGE, "pref_editor_default_encoding", encodings[editor_prefs.default_encoding].charset); + g_key_file_set_string(config, PACKAGE, "pref_editor_default_new_encoding", encodings[editor_prefs.default_new_encoding].charset); + if (editor_prefs.default_open_encoding == -1) + g_key_file_set_string(config, PACKAGE, "pref_editor_default_open_encoding", "none"); + else + g_key_file_set_string(config, PACKAGE, "pref_editor_default_open_encoding", encodings[editor_prefs.default_open_encoding].charset); g_key_file_set_string(config, PACKAGE, "pref_template_developer", app->pref_template_developer); g_key_file_set_string(config, PACKAGE, "pref_template_company", app->pref_template_company); g_key_file_set_string(config, PACKAGE, "pref_template_mail", app->pref_template_mail); @@ -443,17 +447,28 @@ gboolean configuration_load() editor_prefs.tab_width = utils_get_setting_integer(config, PACKAGE, "pref_editor_tab_width", 4); editor_prefs.use_tabs = utils_get_setting_boolean(config, PACKAGE, "pref_editor_use_tabs", TRUE); - // use current locale encoding as default for new files (should be in most cases UTF-8) + // use current locale encoding as default for new files (should be UTF-8 in most cases) g_get_charset(&default_charset); - tmp_string = utils_get_setting_string(config, PACKAGE, "pref_editor_default_encoding", + tmp_string = utils_get_setting_string(config, PACKAGE, "pref_editor_default_new_encoding", default_charset); if (tmp_string) { const GeanyEncoding *enc = encodings_get_from_charset(tmp_string); if (enc != NULL) - editor_prefs.default_encoding = enc->idx; + editor_prefs.default_new_encoding = enc->idx; else - editor_prefs.default_encoding = GEANY_ENCODING_UTF_8; + editor_prefs.default_new_encoding = GEANY_ENCODING_UTF_8; + + g_free(tmp_string); + } + tmp_string = utils_get_setting_string(config, PACKAGE, "pref_editor_default_open_encoding", "none"); + if (tmp_string) + { + const GeanyEncoding *enc = encodings_get_from_charset(tmp_string); + if (enc != NULL) + editor_prefs.default_open_encoding = enc->idx; + else + editor_prefs.default_open_encoding = -1; g_free(tmp_string); } diff --git a/src/prefs.c b/src/prefs.c index aaf6ec9ad..c7c887a96 100644 --- a/src/prefs.c +++ b/src/prefs.c @@ -70,6 +70,7 @@ static void on_toolbar_show_toggled(GtkToggleButton *togglebutton, gpointer user static void on_show_notebook_tabs_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void on_use_folding_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void on_symbol_auto_completion_toggled(GtkToggleButton *togglebutton, gpointer user_data); +static void on_open_encoding_toggled(GtkToggleButton *togglebutton, gpointer user_data); void prefs_init_dialog(void) @@ -231,9 +232,22 @@ void prefs_init_dialog(void) widget = lookup_widget(app->prefs_dialog, "spin_tab_width"); gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), editor_prefs.tab_width); - widget = lookup_widget(app->prefs_dialog, "combo_encoding"); + widget = lookup_widget(app->prefs_dialog, "combo_new_encoding"); // luckily the index of the combo box items match the index of the encodings array - gtk_combo_box_set_active(GTK_COMBO_BOX(widget), editor_prefs.default_encoding); + gtk_combo_box_set_active(GTK_COMBO_BOX(widget), editor_prefs.default_new_encoding); + + widget = lookup_widget(app->prefs_dialog, "check_open_encoding"); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), + (editor_prefs.default_open_encoding >= 0) ? TRUE : FALSE); + on_open_encoding_toggled(GTK_TOGGLE_BUTTON(widget), NULL); + + widget = lookup_widget(app->prefs_dialog, "combo_open_encoding"); + if (editor_prefs.default_open_encoding >= 0) + { + gtk_combo_box_set_active(GTK_COMBO_BOX(widget), editor_prefs.default_open_encoding); + } + else + gtk_combo_box_set_active(GTK_COMBO_BOX(widget), GEANY_ENCODING_UTF_8); widget = lookup_widget(app->prefs_dialog, "check_trailing_spaces"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.trail_space); @@ -561,8 +575,17 @@ void on_prefs_button_clicked(GtkDialog *dialog, gint response, gpointer user_dat widget = lookup_widget(app->prefs_dialog, "spin_tab_width"); editor_prefs.tab_width = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); - widget = lookup_widget(app->prefs_dialog, "combo_encoding"); - editor_prefs.default_encoding = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); + widget = lookup_widget(app->prefs_dialog, "combo_new_encoding"); + editor_prefs.default_new_encoding = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); + + widget = lookup_widget(app->prefs_dialog, "check_open_encoding"); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) + { + widget = lookup_widget(app->prefs_dialog, "combo_open_encoding"); + editor_prefs.default_open_encoding = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); + } + else + editor_prefs.default_open_encoding = -1; widget = lookup_widget(app->prefs_dialog, "check_trailing_spaces"); editor_prefs.trail_space = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); @@ -1018,11 +1041,20 @@ static void on_symbol_auto_completion_toggled(GtkToggleButton *togglebutton, gpo } +static void on_open_encoding_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + gboolean sens = gtk_toggle_button_get_active(togglebutton); + + gtk_widget_set_sensitive(lookup_widget(app->prefs_dialog, "eventbox3"), sens); + gtk_widget_set_sensitive(lookup_widget(app->prefs_dialog, "label_open_encoding"), sens); +} + + void prefs_show_dialog(void) { if (app->prefs_dialog == NULL) { - GtkWidget *combo; + GtkWidget *combo_new, *combo_open; guint i; gchar *encoding_string; @@ -1031,12 +1063,15 @@ void prefs_show_dialog(void) gtk_window_set_transient_for(GTK_WINDOW(app->prefs_dialog), GTK_WINDOW(app->window)); // init the default file encoding combo box - combo = lookup_widget(app->prefs_dialog, "combo_encoding"); - gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(combo), 3); + combo_new = lookup_widget(app->prefs_dialog, "combo_new_encoding"); + combo_open = lookup_widget(app->prefs_dialog, "combo_open_encoding"); + gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(combo_new), 3); + gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(combo_open), 3); for (i = 0; i < GEANY_ENCODINGS_MAX; i++) { encoding_string = encodings_to_string(&encodings[i]); - gtk_combo_box_append_text(GTK_COMBO_BOX(combo), encoding_string); + gtk_combo_box_append_text(GTK_COMBO_BOX(combo_new), encoding_string); + gtk_combo_box_append_text(GTK_COMBO_BOX(combo_open), encoding_string); g_free(encoding_string); } @@ -1080,6 +1115,8 @@ void prefs_show_dialog(void) "toggled", G_CALLBACK(on_use_folding_toggled), NULL); g_signal_connect((gpointer) lookup_widget(app->prefs_dialog, "check_symbol_auto_completion"), "toggled", G_CALLBACK(on_symbol_auto_completion_toggled), NULL); + g_signal_connect((gpointer) lookup_widget(app->prefs_dialog, "check_open_encoding"), + "toggled", G_CALLBACK(on_open_encoding_toggled), NULL); } prefs_init_dialog();