SF.net SVN: geany: [600] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sat Jul 22 01:29:34 UTC 2006


Revision: 600
Author:   eht16
Date:     2006-07-21 18:29:10 -0700 (Fri, 21 Jul 2006)
ViewCVS:  http://svn.sourceforge.net/geany/?rev=600&view=rev

Log Message:
-----------
Added Unicode BOM detection.
Added "Reload as" menu item to force opening a file with a specified encoding(both were patches from Stefan Oltmanns).

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/geany.glade
    trunk/src/callbacks.c
    trunk/src/dialogs.c
    trunk/src/document.c
    trunk/src/encodings.c
    trunk/src/geany.h
    trunk/src/interface.c
    trunk/src/keyfile.c
    trunk/src/main.c
    trunk/src/sci_cb.c
    trunk/src/utils.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/ChangeLog	2006-07-22 01:29:10 UTC (rev 600)
@@ -1,3 +1,13 @@
+2006-07-22  Enrico Tröger  <enrico.troeger at uvena.de>
+
+ * src/callbacks.c, src/utils.c, src/document.c, src/encodings.c,
+   src/geany.h, src/main.c, src/dialogs.c, geany.glade,
+   src/interface.c, src/sci_cb.c, src/keyfile.c:
+   Added Unicode BOM detection.
+   Added "Reload as" menu item to force opening a file with a specified
+   encoding(both were patches from Stefan Oltmanns).
+
+
 2006-07-21  Nick Treleaven  <nick.treleaven at btinternet.com>
 
  * src/dialogs.c: Prevent using Find in files for unnamed files.
@@ -7,7 +17,7 @@
 
  * src/geany.h, src/main.c, src/callbacks.c:
    Introduced app->ignore_callback to ignore callback actions when
-   changing the state of GUI elements(as a workaround).
+   changing the state of GUI elements.
  * geany.glade, src/interface.c, src/main.c, src/callbacks.c,
    src/utils.c, src/prefs.c, src/keybindings.c:
    Added menu item View->Show Sidebar and improved code around it.

Modified: trunk/geany.glade
===================================================================
--- trunk/geany.glade	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/geany.glade	2006-07-22 01:29:10 UTC (rev 600)
@@ -57,7 +57,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image857">
+			<widget class="GtkImage" id="image881">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-new</property>
 			  <property name="icon_size">1</property>
@@ -150,7 +150,7 @@
 		      <signal name="activate" handler="on_save_all1_activate" last_modification_time="Thu, 02 Jun 2005 14:15:30 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image858">
+			<widget class="GtkImage" id="image882">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-save</property>
 			  <property name="icon_size">1</property>
@@ -188,6 +188,27 @@
 		  </child>
 
 		  <child>
+		    <widget class="GtkMenuItem" id="reload_as1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Reload as</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_reload_as_activate" last_modification_time="Fri, 21 Jul 2006 18:00:16 GMT"/>
+
+		      <child>
+			<widget class="GtkMenu" id="reload_as1_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="invisible7">
+			      <property name="label" translatable="yes">invisible</property>
+			      <property name="use_underline">True</property>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
 		    <widget class="GtkSeparatorMenuItem" id="separator24">
 		      <property name="visible">True</property>
 		    </widget>
@@ -227,7 +248,7 @@
 		      <signal name="activate" handler="on_close_all1_activate" last_modification_time="Thu, 02 Jun 2005 14:15:30 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image859">
+			<widget class="GtkImage" id="image883">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-close</property>
 			  <property name="icon_size">1</property>
@@ -358,7 +379,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image860">
+			<widget class="GtkImage" id="image884">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-add</property>
 			  <property name="icon_size">1</property>
@@ -390,7 +411,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image861">
+			<widget class="GtkImage" id="image885">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-add</property>
 			  <property name="icon_size">1</property>
@@ -568,7 +589,7 @@
 		      <signal name="activate" handler="on_replace1_activate" last_modification_time="Sun, 23 Oct 2005 13:22:36 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image862">
+			<widget class="GtkImage" id="image886">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-find-and-replace</property>
 			  <property name="icon_size">1</property>
@@ -610,7 +631,7 @@
 		      <signal name="activate" handler="on_go_to_line1_activate" last_modification_time="Tue, 23 May 2006 17:10:49 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image863">
+			<widget class="GtkImage" id="image887">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-jump-to</property>
 			  <property name="icon_size">1</property>
@@ -645,7 +666,7 @@
 		      <signal name="activate" handler="on_change_font1_activate" last_modification_time="Fri, 22 Apr 2005 18:58:45 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image864">
+			<widget class="GtkImage" id="image888">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-select-font</property>
 			  <property name="icon_size">1</property>
@@ -667,7 +688,7 @@
 		      <signal name="activate" handler="on_show_color_chooser1_activate" last_modification_time="Wed, 22 Jun 2005 18:10:21 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image865">
+			<widget class="GtkImage" id="image889">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-select-color</property>
 			  <property name="icon_size">1</property>

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/callbacks.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -519,7 +519,7 @@
 				 ("Are you sure you want to reload '%s'?\nAny unsaved changes will be lost."),
 				 basename))
 	{
-		document_reload_file(idx);
+		document_reload_file(idx, NULL);
 	}
 
 	g_free(basename);
@@ -840,7 +840,7 @@
 			{
 				if (g_file_test((gchar*) flist->data, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK))
 				{
-					document_open_file(-1, (gchar*) flist->data, 0, ro, ft);
+					document_open_file(-1, (gchar*) flist->data, 0, ro, ft, NULL);
 				}
 			}
 			else
@@ -2489,7 +2489,7 @@
 
 	if (locale_filename == NULL) locale_filename = g_strdup((gchar*) user_data);
 
-	document_open_file(-1, locale_filename, 0, FALSE, NULL);
+	document_open_file(-1, locale_filename, 0, FALSE, NULL, NULL);
 
 	g_free(locale_filename);
 }
@@ -2578,6 +2578,29 @@
 
 
 void
+on_reload_as_activate                  (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+	gint idx = document_get_cur_idx();
+	gchar *basename;
+	guint i = GPOINTER_TO_INT(user_data);
+
+	if (idx < 0 || ! doc_list[idx].is_valid || doc_list[idx].file_name == NULL ||
+		i < 0 || i >= GEANY_ENCODINGS_MAX || encodings[i].charset == NULL)
+		return;
+
+	basename = g_path_get_basename(doc_list[idx].file_name);
+	if (dialogs_show_question(_
+				 ("Are you sure you want to reload '%s'?\nAny unsaved changes will be lost."),
+				 basename))
+	{
+		document_reload_file(idx, encodings[i].charset);
+		utils_update_statusbar(idx, -1);
+	}
+	g_free(basename);
+}
+
+void
 on_print1_activate                     (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
@@ -2608,5 +2631,3 @@
 	app->sidebar_visible = ! app->sidebar_visible;
 	utils_treeviews_showhide(TRUE);
 }
-
-

Modified: trunk/src/dialogs.c
===================================================================
--- trunk/src/dialogs.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/dialogs.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -1394,7 +1394,7 @@
 void dialogs_show_file_properties(gint idx)
 {
 	GtkWidget *dialog, *label, *table, *hbox, *image, *perm_table, *check;
-	gchar *file_size, *title, *base_name, *time_changed, *time_modified, *time_accessed;
+	gchar *file_size, *title, *base_name, *time_changed, *time_modified, *time_accessed, *enctext;
 #if defined(HAVE_SYS_STAT_H) && defined(HAVE_SYS_TYPES_H)
 	struct stat st;
 	off_t filesize;
@@ -1548,7 +1548,13 @@
 	gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0);
 
-	label = gtk_label_new(doc_list[idx].encoding);
+	enctext = g_strdup_printf("%s %s",
+	doc_list[idx].encoding,
+	(utils_is_unicode_charset(doc_list[idx].encoding)) ? ((doc_list[idx].unicode_bom) ? _("(with BOM)") : _("(without BOM)")) : "");
+
+	label = gtk_label_new(enctext);
+	g_free(enctext);
+
 	gtk_table_attach(GTK_TABLE(table), label, 1, 2, 4, 5,
 					(GtkAttachOptions) (GTK_FILL),
 					(GtkAttachOptions) (0), 0, 0);

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/document.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -193,6 +193,7 @@
 		doc_list[i].file_type = NULL;
 		doc_list[i].tm_file = NULL;
 		doc_list[i].encoding = NULL;
+		doc_list[i].unicode_bom = FALSE;
 		doc_list[i].sci = NULL;
 	}
 }
@@ -207,9 +208,13 @@
 	gchar *title, *fname;
 	GtkTreeIter iter;
 	gint new_idx = document_get_new_idx();
-	document *this = &(doc_list[new_idx]);
+	document *this;
 	gint tabnum;
 
+	if (new_idx == -1) return -1;
+
+	this = &(doc_list[new_idx]);
+
 	/* SCI - Code */
 	sci = SCINTILLA(scintilla_new());
 	scintilla_set_id(sci, new_idx);
@@ -314,6 +319,7 @@
 		doc_list[idx].file_name = NULL;
 		doc_list[idx].file_type = NULL;
 		doc_list[idx].encoding = NULL;
+		doc_list[idx].unicode_bom = FALSE;
 		doc_list[idx].tm_file = NULL;
 		if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)) == 0)
 		{
@@ -340,6 +346,12 @@
 		gint idx = document_create_new_sci(NULL);
 		gchar *template = document_prepare_template(ft);
 
+		if (idx == -1)
+		{
+			dialogs_show_file_open_error();
+			return;
+		}
+
 		sci_clear_all(doc_list[idx].sci);
 		sci_set_text(doc_list[idx].sci, template);
 		g_free(template);
@@ -373,12 +385,14 @@
  * idx and set the cursor to position 0. In this case, filename should be NULL
  * It returns the idx of the opened file or -1 if an error occurred.
  */
-int document_open_file(gint idx, const gchar *filename, gint pos, gboolean readonly, filetype *ft)
+int document_open_file(gint idx, const gchar *filename, gint pos, gboolean readonly, filetype *ft,
+					   const gchar *forced_enc)
 {
 	gint editor_mode;
 	gsize size;
 	gboolean reload = (idx == -1) ? FALSE : TRUE;
 	struct stat st;
+	gboolean bom = FALSE;
 	gchar *enc = NULL;
 	gchar *utf8_filename = NULL;
 	gchar *locale_filename = NULL;
@@ -452,21 +466,30 @@
 	}
 
 	/* Determine character encoding and convert to utf-8*/
-	if (size > 0)
-	{
-		if (g_utf8_validate(data, size, NULL))
+	if (reload && forced_enc != NULL)
+	{	// reload file with specified encoding
+		if (utils_strcmp(forced_enc, "UTF-8"))
 		{
-			enc = g_strdup("UTF-8");
+			if (! g_utf8_validate(data, size, NULL))
+			{
+				msgwin_status_add(_("The file \"%s\" is not valid %s."), utf8_filename, "UTF-8");
+				utils_beep();
+				g_free(data);
+				g_free(utf8_filename);
+				g_free(locale_filename);
+				return -1;
+			}
+			else
+			{
+				bom = utils_strcmp(utils_scan_unicode_bom(data), "UTF-8");
+			}
 		}
 		else
 		{
-			gchar *converted_text = utils_convert_to_utf8(data, size, &enc);
-
+			gchar *converted_text = utils_convert_to_utf8_from_charset(data, size, forced_enc);
 			if (converted_text == NULL)
 			{
-				msgwin_status_add(
-	_("The file \"%s\" does not look like a text file or the file encoding is not supported."),
-									utf8_filename);
+				msgwin_status_add(_("The file \"%s\" is not valid %s."), utf8_filename, forced_enc);
 				utils_beep();
 				g_free(data);
 				g_free(utf8_filename);
@@ -478,15 +501,82 @@
 				g_free(data);
 				data = (void*)converted_text;
 				size = strlen(converted_text);
+				/// TODO should it not be UTF-* ?
+				bom = utils_strcmp(utils_scan_unicode_bom(data), "UTF-8");
 			}
 		}
 	}
+	else if (size > 0)
+	{	// the usual way to detect encoding and convert to UTF-8
+		if (size >= 4)
+		{
+			enc = utils_scan_unicode_bom(data);
+		}
+		if (enc != NULL)
+		{
+			bom = TRUE;
+			if (enc[4] != '8') // the BOM indicated something else than UTF-8
+			{
+				gchar *converted_text = utils_convert_to_utf8_from_charset(data, size, enc);
+				if (converted_text == NULL)
+				{
+					g_free(enc);
+					enc = NULL;
+					bom = FALSE;
+				}
+				else
+				{
+					g_free(data);
+					data = (void*)converted_text;
+					size = strlen(converted_text);
+				}
+			}
+		}
+		else
+		{
+			if (g_utf8_validate(data, size, NULL))
+			{
+				enc = g_strdup("UTF-8");
+			}
+			else
+			{
+				gchar *converted_text = utils_convert_to_utf8(data, size, &enc);
+
+				if (converted_text == NULL)
+				{
+					msgwin_status_add(
+		_("The file \"%s\" does not look like a text file or the file encoding is not supported."),
+										utf8_filename);
+					utils_beep();
+					g_free(data);
+					g_free(utf8_filename);
+					g_free(locale_filename);
+					return -1;
+				}
+				else
+				{
+					g_free(data);
+					data = (void*)converted_text;
+					size = strlen(converted_text);
+				}
+			}
+		}
+	}
 	else
 	{
 		enc = g_strdup("UTF-8");
 	}
 
+	if (bom)
+	{
+		gchar *data_without_bom;
+		data_without_bom = g_strdup(data + 3);
+		g_free(data);
+		data = data_without_bom;
+	}
+
 	if (! reload) idx = document_create_new_sci(utf8_filename);
+	if (idx == -1) return -1;	// really should not happen
 
 	// set editor mode and add the text to the ScintillaObject
 	sci_set_text(doc_list[idx].sci, data); // NULL terminated data; avoids Unsaved
@@ -500,7 +590,8 @@
 	doc_list[idx].mtime = st.st_mtime;
 	doc_list[idx].changed = FALSE;
 	doc_list[idx].file_name = g_strdup(utf8_filename);
-	doc_list[idx].encoding = enc;
+	doc_list[idx].encoding = g_strdup(enc);
+	doc_list[idx].unicode_bom = bom;
 
 	sci_goto_pos(doc_list[idx].sci, pos, TRUE);
 
@@ -565,16 +656,17 @@
 }
 
 
-int document_reload_file(gint idx)
+gint document_reload_file(gint idx, const gchar *forced_enc)
 {
 	gint pos = 0;
+
 	if (idx < 0 || ! doc_list[idx].is_valid)
 		return -1;
 
 	// try to set the cursor to the position before reloading
 	pos = sci_get_current_position(doc_list[idx].sci);
 	return document_open_file(idx, NULL, pos, doc_list[idx].readonly,
-		doc_list[idx].file_type);
+					doc_list[idx].file_type, forced_enc);
 }
 
 
@@ -586,7 +678,7 @@
 	gint bytes_written, len;
 	gchar *locale_filename = NULL;
 
-	if (idx == -1) return;
+	if (idx == -1 || ! doc_list[idx].changed) return;
 
 	if (doc_list[idx].file_name == NULL)
 	{
@@ -605,24 +697,37 @@
 	sci_convert_eols(doc_list[idx].sci, sci_get_eol_mode(doc_list[idx].sci));
 
 	len = sci_get_length(doc_list[idx].sci) + 1;
-	data = (gchar*) g_malloc(len);
-	sci_get_text(doc_list[idx].sci, len, data);
+	if (doc_list[idx].unicode_bom && utils_is_unicode_charset(doc_list[idx].encoding))
+	{
+		data = (gchar*) g_malloc(len + 4);	// 3 chars for BOM, 1 for \0
+		data[0] = 0xef;
+		data[1] = 0xbb;
+		data[2] = 0xbf;
+		sci_get_text(doc_list[idx].sci, len, data + 3);
+		len += 3;
+	}
+	else
+	{
+		data = (gchar*) g_malloc(len + 1);
+		sci_get_text(doc_list[idx].sci, len, data);
+	}
 
-	// save in original encoding , skip when it is already UTF-8)
+	// save in original encoding, skip when it is already UTF-8
 	if (doc_list[idx].encoding != NULL && ! utils_strcmp(doc_list[idx].encoding, "UTF-8"))
 	{
 		GError *conv_error = NULL;
 		gchar* conv_file_contents = NULL;
+		gsize conv_len;
 
 		// try to convert it from UTF-8 to original encoding
-		conv_file_contents = g_convert(data, len-1, doc_list[idx].encoding, "UTF-8",
-													NULL, NULL, &conv_error);
+		conv_file_contents = g_convert(data, len, doc_list[idx].encoding, "UTF-8",
+													NULL, &conv_len, &conv_error);
 
 		if (conv_error != NULL)
 		{
 			dialogs_show_error(
-			_("An error occurred while converting the file from UTF-8 in \"%s\". The file remains unsaved."
-			  "\nError message: %s\n"),
+	_("An error occurred while converting the file from UTF-8 in \"%s\". The file remains unsaved."
+	  "\nError message: %s\n"),
 			doc_list[idx].encoding, conv_error->message);
 			geany_debug("encoding error: %s)", conv_error->message);
 			g_error_free(conv_error);
@@ -633,10 +738,13 @@
 		{
 			g_free(data);
 			data = conv_file_contents;
-			len = strlen(conv_file_contents);
+			len = conv_len;
 		}
 	}
 
+	// len is too long and so 0x00 is written at the end which is not good w/o BOM
+	len--;
+
 	locale_filename = g_locale_from_utf8(doc_list[idx].file_name, -1, NULL, NULL, NULL);
 	fp = fopen(locale_filename, "w");
 	if (fp == NULL)
@@ -652,7 +760,6 @@
 	if (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) sci_convert_eols(doc_list[idx].sci, SC_EOL_CRLF);
 #endif
 
-	len = strlen(data);
 	bytes_written = fwrite(data, sizeof (gchar), len, fp);
 	fclose (fp);
 
@@ -799,7 +906,7 @@
 	else
 		sci_goto_pos(doc_list[idx].sci, selection_start, TRUE);
 
-	search_pos = document_find_text(idx, find_text, flags, search_backwards);	
+	search_pos = document_find_text(idx, find_text, flags, search_backwards);
 	// return if the original selected text did not match (at the start of the selection)
 	if (search_pos != selection_start) return;
 

Modified: trunk/src/encodings.c
===================================================================
--- trunk/src/encodings.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/encodings.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -91,10 +91,14 @@
 	fill(7, ASIAN, GEANY_ENCODING_VISCII, "VISCII", _("Vietnamese"));
 	fill(8, ASIAN, GEANY_ENCODING_WINDOWS_1258, "WINDOWS-1258", _("Vietnamese"));
 
-	fill(0, UNICODE, GEANY_ENCODING_UTF_8, "UTF-8", _("Unicode"));
-	fill(1, UNICODE, GEANY_ENCODING_UTF_16, "UTF-16", _("Unicode"));
-	fill(2, UNICODE, GEANY_ENCODING_UCS_2, "UCS-2", _("Unicode"));
-	fill(3, UNICODE, GEANY_ENCODING_UCS_4, "UCS-4", _("Unicode"));
+	fill(0, UNICODE, GEANY_ENCODING_UTF_7, "UTF-7", _("Unicode"));
+	fill(1, UNICODE, GEANY_ENCODING_UTF_8, "UTF-8", _("Unicode"));
+	fill(2, UNICODE, GEANY_ENCODING_UTF_16LE, "UTF-16LE", _("Unicode"));
+	fill(3, UNICODE, GEANY_ENCODING_UTF_16BE, "UTF-16BE", _("Unicode"));
+	fill(4, UNICODE, GEANY_ENCODING_UCS_2LE, "UCS-2LE", _("Unicode"));
+	fill(5, UNICODE, GEANY_ENCODING_UCS_2BE, "UCS-2BE", _("Unicode"));
+	fill(6, UNICODE, GEANY_ENCODING_UTF_32LE, "UTF-32LE", _("Unicode"));
+	fill(7, UNICODE, GEANY_ENCODING_UTF_32BE, "UTF-32BE", _("Unicode"));
 
 	fill(0, EASTASIAN, GEANY_ENCODING_GB18030, "GB18030", _("Chinese Simplified"));
 	fill(1, EASTASIAN, GEANY_ENCODING_GB2312, "GB2312", _("Chinese Simplified"));
@@ -160,85 +164,92 @@
 
 void encodings_init(void)
 {
-	GtkWidget *item, *menu, *submenu, *menu_westeuro, *menu_easteuro, *menu_eastasian, *menu_asian,
+	GtkWidget *item, *menu[2], *submenu, *menu_westeuro, *menu_easteuro, *menu_eastasian, *menu_asian,
 			  *menu_utf8, *menu_middleeast, *item_westeuro, *item_easteuro, *item_eastasian,
 			  *item_asian, *item_utf8, *item_middleeast;
+	GCallback cb_func[2];
 	gchar *label;
-	guint i, j, order, group_size;
+	guint i, j, k, order, group_size;
 
 	init_encodings();
 
 	// create encodings submenu in document menu
-	menu = lookup_widget(app->window, "set_encoding1_menu");
+	menu[0] = lookup_widget(app->window, "set_encoding1_menu");
+	menu[1] = lookup_widget(app->window, "menu_reload_as1_menu");
+	cb_func[0] = G_CALLBACK(on_encoding_change);
+	cb_func[1] = G_CALLBACK(on_reload_as_activate);
 
-	menu_westeuro = gtk_menu_new();
-	item_westeuro = gtk_menu_item_new_with_mnemonic(_("_West European"));
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_westeuro), menu_westeuro);
-	gtk_container_add(GTK_CONTAINER(menu), item_westeuro);
-	gtk_widget_show_all(item_westeuro);
+	for (k = 0; k < 2; k++)
+	{
+		menu_westeuro = gtk_menu_new();
+		item_westeuro = gtk_menu_item_new_with_mnemonic(_("_West European"));
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_westeuro), menu_westeuro);
+		gtk_container_add(GTK_CONTAINER(menu[k]), item_westeuro);
+		gtk_widget_show_all(item_westeuro);
 
-	menu_easteuro = gtk_menu_new();
-	item_easteuro = gtk_menu_item_new_with_mnemonic(_("_East European"));
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_easteuro), menu_easteuro);
-	gtk_container_add(GTK_CONTAINER(menu), item_easteuro);
-	gtk_widget_show_all(item_easteuro);
+		menu_easteuro = gtk_menu_new();
+		item_easteuro = gtk_menu_item_new_with_mnemonic(_("_East European"));
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_easteuro), menu_easteuro);
+		gtk_container_add(GTK_CONTAINER(menu[k]), item_easteuro);
+		gtk_widget_show_all(item_easteuro);
 
-	menu_eastasian = gtk_menu_new();
-	item_eastasian = gtk_menu_item_new_with_mnemonic(_("East _Asian"));
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_eastasian), menu_eastasian);
-	gtk_container_add(GTK_CONTAINER(menu), item_eastasian);
-	gtk_widget_show_all(item_eastasian);
+		menu_eastasian = gtk_menu_new();
+		item_eastasian = gtk_menu_item_new_with_mnemonic(_("East _Asian"));
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_eastasian), menu_eastasian);
+		gtk_container_add(GTK_CONTAINER(menu[k]), item_eastasian);
+		gtk_widget_show_all(item_eastasian);
 
-	menu_asian = gtk_menu_new();
-	item_asian = gtk_menu_item_new_with_mnemonic(_("_SE & SW Asian"));
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_asian), menu_asian);
-	gtk_container_add(GTK_CONTAINER(menu), item_asian);
-	gtk_widget_show_all(item_asian);
+		menu_asian = gtk_menu_new();
+		item_asian = gtk_menu_item_new_with_mnemonic(_("_SE & SW Asian"));
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_asian), menu_asian);
+		gtk_container_add(GTK_CONTAINER(menu[k]), item_asian);
+		gtk_widget_show_all(item_asian);
 
-	menu_middleeast = gtk_menu_new();
-	item_middleeast = gtk_menu_item_new_with_mnemonic(_("_Middle Eastern"));
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_middleeast), menu_middleeast);
-	gtk_container_add(GTK_CONTAINER(menu), item_middleeast);
-	gtk_widget_show_all(item_middleeast);
+		menu_middleeast = gtk_menu_new();
+		item_middleeast = gtk_menu_item_new_with_mnemonic(_("_Middle Eastern"));
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_middleeast), menu_middleeast);
+		gtk_container_add(GTK_CONTAINER(menu[k]), item_middleeast);
+		gtk_widget_show_all(item_middleeast);
 
-	menu_utf8 = gtk_menu_new();
-	item_utf8 = gtk_menu_item_new_with_mnemonic(_("_Unicode"));
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_utf8), menu_utf8);
-	gtk_container_add(GTK_CONTAINER(menu), item_utf8);
-	gtk_widget_show_all(item_utf8);
+		menu_utf8 = gtk_menu_new();
+		item_utf8 = gtk_menu_item_new_with_mnemonic(_("_Unicode"));
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_utf8), menu_utf8);
+		gtk_container_add(GTK_CONTAINER(menu[k]), item_utf8);
+		gtk_widget_show_all(item_utf8);
 
-	/// TODO can it be optimized? ATM 1583 runs at line 233
-	for (i = 0; i < GEANY_ENCODING_GROUPS_MAX - 1; i++)
-	{
-		order = 0;
-		switch (i)
+		/// TODO can it be optimized? ATM 3782 runs at line 239
+		for (i = 0; i < GEANY_ENCODING_GROUPS_MAX; i++)
 		{
-			case WESTEUROPEAN: submenu = menu_westeuro; group_size = 9; break;
-			case EASTEUROPEAN: submenu = menu_easteuro; group_size = 14; break;
-			case EASTASIAN: submenu = menu_eastasian; group_size = 14; break;
-			case ASIAN: submenu = menu_asian; group_size = 9; break;
-			case MIDDLEEASTERN: submenu = menu_middleeast; group_size = 7; break;
-			case UNICODE: submenu = menu_utf8; group_size = 4; break;
-			default: submenu = menu; group_size = 0;
-		}
+			order = 0;
+			switch (i)
+			{
+				case WESTEUROPEAN: submenu = menu_westeuro; group_size = 9; break;
+				case EASTEUROPEAN: submenu = menu_easteuro; group_size = 14; break;
+				case EASTASIAN: submenu = menu_eastasian; group_size = 14; break;
+				case ASIAN: submenu = menu_asian; group_size = 9; break;
+				case MIDDLEEASTERN: submenu = menu_middleeast; group_size = 7; break;
+				case UNICODE: submenu = menu_utf8; group_size = 8; break;
+				default: submenu = menu[k]; group_size = 0;
+			}
 
-		while (order < group_size)	// the biggest group has 13 elements
-		{
-			for (j = 0; j < GEANY_ENCODINGS_MAX; j++)
+			while (order < group_size)	// the biggest group has 13 elements
 			{
-				if (encodings[j].group == i && encodings[j].order == order)
+				for (j = 0; j < GEANY_ENCODINGS_MAX; j++)
 				{
-					label = encodings_to_string(&encodings[j]);
-					item = gtk_menu_item_new_with_label(label);
-					gtk_widget_show(item);
-					gtk_container_add(GTK_CONTAINER(submenu), item);
-					g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_encoding_change),
-															GINT_TO_POINTER(encodings[j].idx));
-					g_free(label);
-					break;
+					if (encodings[j].group == i && encodings[j].order == order)
+					{
+						label = encodings_to_string(&encodings[j]);
+						item = gtk_menu_item_new_with_label(label);
+						gtk_widget_show(item);
+						gtk_container_add(GTK_CONTAINER(submenu), item);
+						g_signal_connect((gpointer) item, "activate",
+										cb_func[k], GINT_TO_POINTER(encodings[j].idx));
+						g_free(label);
+						break;
+					}
 				}
+				order++;
 			}
-			order++;
 		}
 	}
 }

Modified: trunk/src/geany.h
===================================================================
--- trunk/src/geany.h	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/geany.h	2006-07-22 01:29:10 UTC (rev 600)
@@ -97,6 +97,7 @@
 	// the filename is encoded in UTF-8, but every GLibC function expect the locale representation
 	gchar 			*file_name;
 	gchar 			*encoding;
+	gboolean		 unicode_bom;
 	filetype		*file_type;
 	TMWorkObject	*tm_file;
 	ScintillaObject	*sci;
@@ -226,7 +227,7 @@
 	GtkWidget			*redo_items[3];
 	GtkWidget			*undo_items[3];
 	GtkWidget			*save_buttons[2];
-	GtkWidget			*sensitive_buttons[33];
+	GtkWidget			*sensitive_buttons[34];
 	GtkWidget			*open_colorsel;
 	GtkWidget			*open_fontsel;
 	GtkWidget			*open_filesel;

Modified: trunk/src/interface.c
===================================================================
--- trunk/src/interface.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/interface.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -37,7 +37,7 @@
   GtkWidget *menuitem1_menu;
   GtkWidget *menu_new1;
   GtkWidget *menu_new_with_template1;
-  GtkWidget *image857;
+  GtkWidget *image956;
   GtkWidget *menu_new_with_template1_menu;
   GtkWidget *invisible2;
   GtkWidget *separator12;
@@ -49,8 +49,13 @@
   GtkWidget *menu_save1;
   GtkWidget *menu_save_as1;
   GtkWidget *menu_save_all1;
-  GtkWidget *image858;
-  GtkWidget *revert1;
+  GtkWidget *image957;
+  GtkWidget *menu_reload1;
+  GtkWidget *image958;
+  GtkWidget *menu_reload_as1;
+  GtkWidget *image959;
+  GtkWidget *menu_reload_as1_menu;
+  GtkWidget *invisible7;
   GtkWidget *separator21;
   GtkWidget *preferences2;
   GtkWidget *separator24;
@@ -58,7 +63,7 @@
   GtkWidget *separator14;
   GtkWidget *menu_close1;
   GtkWidget *menu_close_all1;
-  GtkWidget *image859;
+  GtkWidget *image960;
   GtkWidget *menu_separatormenuitem1;
   GtkWidget *menu_quit1;
   GtkWidget *edit1;
@@ -74,11 +79,11 @@
   GtkWidget *menu_select_all1;
   GtkWidget *separator25;
   GtkWidget *insert_include2;
-  GtkWidget *image860;
+  GtkWidget *image961;
   GtkWidget *insert_include2_menu;
   GtkWidget *invisible4;
   GtkWidget *add_comments1;
-  GtkWidget *image861;
+  GtkWidget *image962;
   GtkWidget *add_comments1_menu;
   GtkWidget *menu_add_changelog_entry1;
   GtkWidget *insert_file_header1;
@@ -99,18 +104,18 @@
   GtkWidget *find_next1;
   GtkWidget *find_previous1;
   GtkWidget *replace1;
-  GtkWidget *image862;
+  GtkWidget *image963;
   GtkWidget *separator27;
   GtkWidget *find_in_files1;
   GtkWidget *separator11;
   GtkWidget *go_to_line1;
-  GtkWidget *image863;
+  GtkWidget *image964;
   GtkWidget *menuitem3;
   GtkWidget *menuitem3_menu;
   GtkWidget *menu_change_font1;
-  GtkWidget *image864;
+  GtkWidget *image965;
   GtkWidget *menu_choose_color1;
-  GtkWidget *image865;
+  GtkWidget *image966;
   GtkWidget *menu_separator4;
   GtkWidget *menu_fullscreen1;
   GtkWidget *menu_show_messages_window1;
@@ -245,9 +250,9 @@
   gtk_widget_show (menu_new_with_template1);
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_new_with_template1);
 
-  image857 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image857);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_new_with_template1), image857);
+  image956 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image956);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_new_with_template1), image956);
 
   menu_new_with_template1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_new_with_template1), menu_new_with_template1_menu);
@@ -292,14 +297,34 @@
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_save_all1);
   gtk_tooltips_set_tip (tooltips, menu_save_all1, _("Saves all open files"), NULL);
 
-  image858 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image858);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_save_all1), image858);
+  image957 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image957);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_save_all1), image957);
 
-  revert1 = gtk_image_menu_item_new_from_stock ("gtk-revert-to-saved", accel_group);
-  gtk_widget_show (revert1);
-  gtk_container_add (GTK_CONTAINER (menuitem1_menu), revert1);
+  menu_reload1 = gtk_image_menu_item_new_with_mnemonic (_("_Reload"));
+  gtk_widget_show (menu_reload1);
+  gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_reload1);
+  gtk_tooltips_set_tip (tooltips, menu_reload1, _("Reload the current file from disk"), NULL);
 
+  image958 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image958);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload1), image958);
+
+  menu_reload_as1 = gtk_image_menu_item_new_with_mnemonic (_("R_eload as"));
+  gtk_widget_show (menu_reload_as1);
+  gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_reload_as1);
+  gtk_tooltips_set_tip (tooltips, menu_reload_as1, _("Reloads the current file with the specified encoding"), NULL);
+
+  image959 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image959);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload_as1), image959);
+
+  menu_reload_as1_menu = gtk_menu_new ();
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_reload_as1), menu_reload_as1_menu);
+
+  invisible7 = gtk_menu_item_new_with_mnemonic (_("invisible"));
+  gtk_container_add (GTK_CONTAINER (menu_reload_as1_menu), invisible7);
+
   separator21 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator21);
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), separator21);
@@ -333,9 +358,9 @@
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_close_all1);
   gtk_tooltips_set_tip (tooltips, menu_close_all1, _("Closes all open files"), NULL);
 
-  image859 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image859);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_close_all1), image859);
+  image960 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image960);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_close_all1), image960);
 
   menu_separatormenuitem1 = gtk_separator_menu_item_new ();
   gtk_widget_show (menu_separatormenuitem1);
@@ -401,9 +426,9 @@
   gtk_widget_show (insert_include2);
   gtk_container_add (GTK_CONTAINER (edit1_menu), insert_include2);
 
-  image860 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image860);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include2), image860);
+  image961 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image961);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include2), image961);
 
   insert_include2_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_include2), insert_include2_menu);
@@ -415,9 +440,9 @@
   gtk_widget_show (add_comments1);
   gtk_container_add (GTK_CONTAINER (edit1_menu), add_comments1);
 
-  image861 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image861);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_comments1), image861);
+  image962 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image962);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_comments1), image962);
 
   add_comments1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (add_comments1), add_comments1_menu);
@@ -504,9 +529,9 @@
   gtk_widget_show (replace1);
   gtk_container_add (GTK_CONTAINER (search1_menu), replace1);
 
-  image862 = gtk_image_new_from_stock ("gtk-find-and-replace", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image862);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (replace1), image862);
+  image963 = gtk_image_new_from_stock ("gtk-find-and-replace", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image963);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (replace1), image963);
 
   separator27 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator27);
@@ -526,9 +551,9 @@
   gtk_widget_show (go_to_line1);
   gtk_container_add (GTK_CONTAINER (search1_menu), go_to_line1);
 
-  image863 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image863);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line1), image863);
+  image964 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image964);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line1), image964);
 
   menuitem3 = gtk_menu_item_new_with_mnemonic (_("_View"));
   gtk_widget_show (menuitem3);
@@ -542,18 +567,18 @@
   gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_change_font1);
   gtk_tooltips_set_tip (tooltips, menu_change_font1, _("Change the default font"), NULL);
 
-  image864 = gtk_image_new_from_stock ("gtk-select-font", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image864);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_change_font1), image864);
+  image965 = gtk_image_new_from_stock ("gtk-select-font", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image965);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_change_font1), image965);
 
   menu_choose_color1 = gtk_image_menu_item_new_with_mnemonic (_("Show _Colour Chooser"));
   gtk_widget_show (menu_choose_color1);
   gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_choose_color1);
   gtk_tooltips_set_tip (tooltips, menu_choose_color1, _("Open a color chooser dialog, to interactively pick colors from a palette."), NULL);
 
-  image865 = gtk_image_new_from_stock ("gtk-select-color", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image865);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_choose_color1), image865);
+  image966 = gtk_image_new_from_stock ("gtk-select-color", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image966);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_choose_color1), image966);
 
   menu_separator4 = gtk_separator_menu_item_new ();
   gtk_widget_show (menu_separator4);
@@ -1031,7 +1056,7 @@
   g_signal_connect ((gpointer) menu_save_all1, "activate",
                     G_CALLBACK (on_save_all1_activate),
                     NULL);
-  g_signal_connect ((gpointer) revert1, "activate",
+  g_signal_connect ((gpointer) menu_reload1, "activate",
                     G_CALLBACK (on_toolbutton23_clicked),
                     NULL);
   g_signal_connect ((gpointer) preferences2, "activate",
@@ -1272,7 +1297,7 @@
   GLADE_HOOKUP_OBJECT (window1, menuitem1_menu, "menuitem1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_new1, "menu_new1");
   GLADE_HOOKUP_OBJECT (window1, menu_new_with_template1, "menu_new_with_template1");
-  GLADE_HOOKUP_OBJECT (window1, image857, "image857");
+  GLADE_HOOKUP_OBJECT (window1, image956, "image956");
   GLADE_HOOKUP_OBJECT (window1, menu_new_with_template1_menu, "menu_new_with_template1_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible2, "invisible2");
   GLADE_HOOKUP_OBJECT (window1, separator12, "separator12");
@@ -1284,8 +1309,13 @@
   GLADE_HOOKUP_OBJECT (window1, menu_save1, "menu_save1");
   GLADE_HOOKUP_OBJECT (window1, menu_save_as1, "menu_save_as1");
   GLADE_HOOKUP_OBJECT (window1, menu_save_all1, "menu_save_all1");
-  GLADE_HOOKUP_OBJECT (window1, image858, "image858");
-  GLADE_HOOKUP_OBJECT (window1, revert1, "revert1");
+  GLADE_HOOKUP_OBJECT (window1, image957, "image957");
+  GLADE_HOOKUP_OBJECT (window1, menu_reload1, "menu_reload1");
+  GLADE_HOOKUP_OBJECT (window1, image958, "image958");
+  GLADE_HOOKUP_OBJECT (window1, menu_reload_as1, "menu_reload_as1");
+  GLADE_HOOKUP_OBJECT (window1, image959, "image959");
+  GLADE_HOOKUP_OBJECT (window1, menu_reload_as1_menu, "menu_reload_as1_menu");
+  GLADE_HOOKUP_OBJECT (window1, invisible7, "invisible7");
   GLADE_HOOKUP_OBJECT (window1, separator21, "separator21");
   GLADE_HOOKUP_OBJECT (window1, preferences2, "preferences2");
   GLADE_HOOKUP_OBJECT (window1, separator24, "separator24");
@@ -1293,7 +1323,7 @@
   GLADE_HOOKUP_OBJECT (window1, separator14, "separator14");
   GLADE_HOOKUP_OBJECT (window1, menu_close1, "menu_close1");
   GLADE_HOOKUP_OBJECT (window1, menu_close_all1, "menu_close_all1");
-  GLADE_HOOKUP_OBJECT (window1, image859, "image859");
+  GLADE_HOOKUP_OBJECT (window1, image960, "image960");
   GLADE_HOOKUP_OBJECT (window1, menu_separatormenuitem1, "menu_separatormenuitem1");
   GLADE_HOOKUP_OBJECT (window1, menu_quit1, "menu_quit1");
   GLADE_HOOKUP_OBJECT (window1, edit1, "edit1");
@@ -1309,11 +1339,11 @@
   GLADE_HOOKUP_OBJECT (window1, menu_select_all1, "menu_select_all1");
   GLADE_HOOKUP_OBJECT (window1, separator25, "separator25");
   GLADE_HOOKUP_OBJECT (window1, insert_include2, "insert_include2");
-  GLADE_HOOKUP_OBJECT (window1, image860, "image860");
+  GLADE_HOOKUP_OBJECT (window1, image961, "image961");
   GLADE_HOOKUP_OBJECT (window1, insert_include2_menu, "insert_include2_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible4, "invisible4");
   GLADE_HOOKUP_OBJECT (window1, add_comments1, "add_comments1");
-  GLADE_HOOKUP_OBJECT (window1, image861, "image861");
+  GLADE_HOOKUP_OBJECT (window1, image962, "image962");
   GLADE_HOOKUP_OBJECT (window1, add_comments1_menu, "add_comments1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_add_changelog_entry1, "menu_add_changelog_entry1");
   GLADE_HOOKUP_OBJECT (window1, insert_file_header1, "insert_file_header1");
@@ -1334,18 +1364,18 @@
   GLADE_HOOKUP_OBJECT (window1, find_next1, "find_next1");
   GLADE_HOOKUP_OBJECT (window1, find_previous1, "find_previous1");
   GLADE_HOOKUP_OBJECT (window1, replace1, "replace1");
-  GLADE_HOOKUP_OBJECT (window1, image862, "image862");
+  GLADE_HOOKUP_OBJECT (window1, image963, "image963");
   GLADE_HOOKUP_OBJECT (window1, separator27, "separator27");
   GLADE_HOOKUP_OBJECT (window1, find_in_files1, "find_in_files1");
   GLADE_HOOKUP_OBJECT (window1, separator11, "separator11");
   GLADE_HOOKUP_OBJECT (window1, go_to_line1, "go_to_line1");
-  GLADE_HOOKUP_OBJECT (window1, image863, "image863");
+  GLADE_HOOKUP_OBJECT (window1, image964, "image964");
   GLADE_HOOKUP_OBJECT (window1, menuitem3, "menuitem3");
   GLADE_HOOKUP_OBJECT (window1, menuitem3_menu, "menuitem3_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_change_font1, "menu_change_font1");
-  GLADE_HOOKUP_OBJECT (window1, image864, "image864");
+  GLADE_HOOKUP_OBJECT (window1, image965, "image965");
   GLADE_HOOKUP_OBJECT (window1, menu_choose_color1, "menu_choose_color1");
-  GLADE_HOOKUP_OBJECT (window1, image865, "image865");
+  GLADE_HOOKUP_OBJECT (window1, image966, "image966");
   GLADE_HOOKUP_OBJECT (window1, menu_separator4, "menu_separator4");
   GLADE_HOOKUP_OBJECT (window1, menu_fullscreen1, "menu_fullscreen1");
   GLADE_HOOKUP_OBJECT (window1, menu_show_messages_window1, "menu_show_messages_window1");

Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/keyfile.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -288,8 +288,8 @@
 
 
 	app->pref_editor_tab_width = utils_get_setting_integer(config, PACKAGE, "pref_editor_tab_width", 4);
-	// set default encoding to UTF8 (Unicode) - index 15
-	app->pref_editor_default_encoding = utils_get_setting_integer(config, PACKAGE, "pref_editor_default_encoding", 15);
+	// set default encoding to UTF8 (Unicode) - index 16
+	app->pref_editor_default_encoding = utils_get_setting_integer(config, PACKAGE, "pref_editor_default_encoding", 16);
 	app->pref_main_confirm_exit = utils_get_setting_boolean(config, PACKAGE, "pref_main_confirm_exit", TRUE);
 	app->pref_main_load_session = utils_get_setting_boolean(config, PACKAGE, "pref_main_load_session", TRUE);
 	app->pref_main_save_winpos = utils_get_setting_boolean(config, PACKAGE, "pref_main_save_winpos", TRUE);
@@ -414,7 +414,7 @@
 			if (g_file_test(locale_filename, G_FILE_TEST_IS_REGULAR || G_FILE_TEST_IS_SYMLINK))
 			{
 				document_open_file(-1, locale_filename, pos, FALSE,
-					(ft_id == GEANY_MAX_FILE_TYPES) ? NULL : filetypes[ft_id]);
+					(ft_id == GEANY_MAX_FILE_TYPES) ? NULL : filetypes[ft_id], NULL);
 				ret = TRUE;
 			}
 			g_free(locale_filename);

Modified: trunk/src/main.c
===================================================================
--- trunk/src/main.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/main.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -288,7 +288,7 @@
 	app->sensitive_buttons[17] = lookup_widget(app->window, "menu_paste1");
 	app->sensitive_buttons[18] = lookup_widget(app->window, "menu_undo2");
 	app->sensitive_buttons[19] = lookup_widget(app->window, "preferences2");
-	app->sensitive_buttons[20] = lookup_widget(app->window, "revert1");
+	app->sensitive_buttons[20] = lookup_widget(app->window, "menu_reload1");
 	app->sensitive_buttons[21] = lookup_widget(app->window, "menu_item4");
 	app->sensitive_buttons[22] = lookup_widget(app->window, "menu_markers_margin1");
 	app->sensitive_buttons[23] = lookup_widget(app->window, "menu_linenumber_margin1");
@@ -301,6 +301,7 @@
 	app->sensitive_buttons[30] = lookup_widget(app->window, "entry_goto_line");
 	app->sensitive_buttons[31] = lookup_widget(app->window, "treeview6");
 	app->sensitive_buttons[32] = lookup_widget(app->window, "print1");
+	app->sensitive_buttons[33] = lookup_widget(app->window, "menu_reload_as1");
 	app->redo_items[0] = lookup_widget(app->popup_menu, "redo1");
 	app->redo_items[1] = lookup_widget(app->window, "menu_redo2");
 	app->redo_items[2] = lookup_widget(app->window, "toolbutton_redo");
@@ -346,7 +347,7 @@
 	// try to interpret the received data as a filename, otherwise do nothing
 	if (g_file_test(buffer, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK))
 	{
-		document_open_file(-1, buffer, 0, FALSE, NULL);
+		document_open_file(-1, buffer, 0, FALSE, NULL, NULL);
 		gtk_window_deiconify(GTK_WINDOW(app->window));
 	}
 	else
@@ -563,7 +564,7 @@
 				if (opened < GEANY_MAX_OPEN_FILES)
 				{
 					gchar *filename = get_argv_filename(argv[i]);
-					document_open_file(-1, filename, 0, FALSE, NULL);
+					document_open_file(-1, filename, 0, FALSE, NULL, NULL);
 					g_free(filename);
 					opened++;
 				}
@@ -612,6 +613,12 @@
 
 	configuration_apply_settings();
 
+	dialogs_show_info(
+	"Please use this SVN version not for production use!\nWe added recently some experimental features which"
+	" can really damage your files when saving or make cofusing things with your file when opening.\n"
+	"Read the mailing list for more information. I'm very sorry, please be patient.\n\n"
+	"(to disable this message, edit src/main.c at line 616).");
+
 	//g_timeout_add(0, (GSourceFunc)destroyapp, NULL); // useful for start time tests
 	gtk_main();
 	return 0;

Modified: trunk/src/sci_cb.c
===================================================================
--- trunk/src/sci_cb.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/sci_cb.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -238,7 +238,7 @@
 					if (list[i] == NULL) break;
 					filename = g_filename_from_uri(list[i], NULL, NULL);
 					if (filename == NULL) continue;
-					document_open_file(-1, filename, 0, FALSE, NULL);
+					document_open_file(-1, filename, 0, FALSE, NULL, NULL);
 					g_free(filename);
 				}
 
@@ -471,6 +471,7 @@
 
 		if (! force)
 		{	// force is set when called by keyboard shortcut, otherwise start after at third char
+			/// TODO g_ascii_isspace is not the best choise because it allows öprin...
 			while ((line_pos - i >= 0) && ! g_ascii_isspace(linebuf[line_pos - i])) i++;
 			if (i < 4)
 			{	// go home if typed less than 4 chars

Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c	2006-07-21 19:35:33 UTC (rev 599)
+++ trunk/src/utils.c	2006-07-22 01:29:10 UTC (rev 600)
@@ -132,7 +132,7 @@
 		line = sci_get_line_from_position(doc_list[idx].sci, pos);
 		col = sci_get_col_from_position(doc_list[idx].sci, pos);
 
-		text = g_strdup_printf(_("%c  line: % 4d column: % 3d  selection: % 4d   %s      mode: %s%s      cur. function: %s      encoding: %s      filetype: %s"),
+		text = g_strdup_printf(_("%c  line: % 4d column: % 3d  selection: % 4d   %s      mode: %s%s      cur. function: %s      encoding: %s %s     filetype: %s"),
 			(doc_list[idx].changed) ? 42 : 32,
 			(line + 1), (col + 1),
 			sci_get_selected_text_length(doc_list[idx].sci) - 1,
@@ -141,6 +141,7 @@
 			(doc_list[idx].readonly) ? ", read only" : "",
 			cur_tag,
 			(doc_list[idx].encoding) ? doc_list[idx].encoding : _("unknown"),
+			(utils_is_unicode_charset(doc_list[idx].encoding)) ? ((doc_list[idx].unicode_bom) ? _("(with BOM)") : _("(without BOM)")) : "",
 			(doc_list[idx].file_type) ? doc_list[idx].file_type->title : _("unknown"));
 		utils_set_statusbar(text, TRUE); //can be overridden by status messages
 		g_free(text);
@@ -977,7 +978,7 @@
 					 ("The file '%s' on the disk is more recent than\n"
 					  "the current buffer.\nDo you want to reload it?"), basename))
 		{
-			document_reload_file(idx);
+			document_reload_file(idx, NULL);
 			doc_list[idx].last_check = t;
 		}
 		else
@@ -2570,3 +2571,46 @@
 	return TRUE;
 }
 
+
+gchar *utils_scan_unicode_bom(gchar *string)
+{
+	if ((unsigned char)string[0] == 0xef && (unsigned char)string[1] == 0xbb &&
+		(unsigned char)string[2] == 0xbf)
+	{
+		return g_strdup("UTF-8");
+	}
+	else if ((unsigned char)string[0] == 0x00 && (unsigned char)string[1] == 0x00 &&
+			 (unsigned char)string[2] == 0xfe && (unsigned char)string[3] == 0xff)
+	{
+		return g_strdup("UTF-32BE"); // Big endian
+	}
+	else if ((unsigned char)string[0] == 0xff && (unsigned char)string[1] == 0xfe &&
+			 (unsigned char)string[2] == 0x00 && (unsigned char)string[3] == 0x00)
+	{
+		return g_strdup("UTF-32LE"); // Little endian
+	}
+	else if ((unsigned char)string[0]==0xfe && (unsigned char)string[1] == 0xff)
+	{
+		return g_strdup("UTF-16BE"); // Big endian
+	}
+	else if ((unsigned char)string[0] == 0xff && (unsigned char)string[1] == 0xfe)
+	{
+		return g_strdup("UTF-16LE"); // Little endian
+	}
+	else if ((string[0] == 0x2b && string[1] == 0x2f && string[2] == 0x76) &&
+			 (string[3] == 0x38 || string[3] == 0x39 || string[3] == 0x2b || string[3] == 0x2f))
+	{
+		 return g_strdup("UTF-7");
+	}
+	return NULL;
+}
+
+
+gboolean utils_is_unicode_charset(gchar *string)
+{
+	if (string != NULL && (strncmp(string, "UTF", 3) == 0 || strncmp(string, "UCS", 3) == 0))
+	{
+		return TRUE;
+	}
+	return FALSE;
+}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Commits mailing list