SF.net SVN: geany:[2853] branches/custom-tab-width

ntrel at users.sourceforge.net ntrel at xxxxx
Mon Aug 4 14:07:51 UTC 2008


Revision: 2853
          http://geany.svn.sourceforge.net/geany/?rev=2853&view=rev
Author:   ntrel
Date:     2008-08-04 14:07:49 +0000 (Mon, 04 Aug 2008)

Log Message:
-----------
Fix build; currently auto-indentation doesn't support inserting tabs
and spaces, only spaces. Also Tabs & Spaces cannot be detected yet
when opening files. Default file templates still only use tabs.
Add editor_get_indent_prefs() which should be used to get the right
settings for a document/editor instead of reading any default prefs.
This could also support project/filetype indentation prefs quite
easily.
Don't change per-document auto-indent setting after changing default
auto-indentation type.
Remove ui_radio_menu_item_*(), not good to use as they depended on
the order of widget creation, so don't work well with Glade. Use
RadioPrefEntry array instead.

Modified Paths:
--------------
    branches/custom-tab-width/ChangeLog
    branches/custom-tab-width/src/callbacks.c
    branches/custom-tab-width/src/callbacks.h
    branches/custom-tab-width/src/document.c
    branches/custom-tab-width/src/editor.c
    branches/custom-tab-width/src/editor.h
    branches/custom-tab-width/src/keyfile.c
    branches/custom-tab-width/src/main.c
    branches/custom-tab-width/src/prefs.c
    branches/custom-tab-width/src/ui_utils.c
    branches/custom-tab-width/src/ui_utils.h

Modified: branches/custom-tab-width/ChangeLog
===================================================================
--- branches/custom-tab-width/ChangeLog	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/ChangeLog	2008-08-04 14:07:49 UTC (rev 2853)
@@ -1,3 +1,22 @@
+2008-08-04  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/ui_utils.h, src/prefs.c, src/callbacks.c, src/callbacks.h,
+   src/keyfile.c, src/document.c, src/main.c, src/editor.c,
+   src/editor.h, src/ui_utils.c:
+   Fix build; currently auto-indentation doesn't support inserting tabs
+   and spaces, only spaces. Also Tabs & Spaces cannot be detected yet
+   when opening files. Default file templates still only use tabs.
+   Add editor_get_indent_prefs() which should be used to get the right
+   settings for a document/editor instead of reading any default prefs.
+   This could also support project/filetype indentation prefs quite
+   easily.
+   Don't change per-document auto-indent setting after changing default
+   auto-indentation type.
+   Remove ui_radio_menu_item_*(), not good to use as they depended on
+   the order of widget creation, so don't work well with Glade. Use
+   RadioPrefEntry array instead.
+
+
 2008-07-31  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
 
  * src/interface.c, src/editor.h, geany.glade:

Modified: branches/custom-tab-width/src/callbacks.c
===================================================================
--- branches/custom-tab-width/src/callbacks.c	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/callbacks.c	2008-08-04 14:07:49 UTC (rev 2853)
@@ -1701,6 +1701,18 @@
 }
 
 
+static void change_line_indent(GeanyEditor *editor, gboolean increase)
+{
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
+	ScintillaObject	*sci = editor->sci;
+	gint line = sci_get_current_line(sci);
+	gint width = sci_get_line_indentation(sci, line);
+
+	width += increase ? iprefs->width : -iprefs->width;
+	sci_set_line_indentation(sci, line, width);
+}
+
+
 void
 on_menu_increase_indent1_activate      (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
@@ -1715,18 +1727,7 @@
 	}
 	else
 	{
-		gint line, ind_pos, old_pos, new_pos, step;
-
-		old_pos = sci_get_current_position(doc->editor->sci);
-		line = sci_get_line_from_position(doc->editor->sci, old_pos);
-		ind_pos = sci_get_line_indent_position(doc->editor->sci, line);
-		/* when using tabs increase cur pos by 1, when using space increase it by tab_width */
-		step = (doc->editor->use_tabs) ? 1 : editor_prefs.tab_width;
-		new_pos = (old_pos > ind_pos) ? old_pos + step : old_pos;
-
-		sci_set_current_position(doc->editor->sci, ind_pos, TRUE);
-		sci_cmd(doc->editor->sci, SCI_TAB);
-		sci_set_current_position(doc->editor->sci, new_pos, TRUE);
+		change_line_indent(doc->editor, TRUE);
 	}
 }
 
@@ -1745,25 +1746,7 @@
 	}
 	else
 	{
-		gint line, ind_pos, old_pos, new_pos, step, indent;
-
-		old_pos = sci_get_current_position(doc->editor->sci);
-		line = sci_get_line_from_position(doc->editor->sci, old_pos);
-		ind_pos = sci_get_line_indent_position(doc->editor->sci, line);
-		step = (doc->editor->use_tabs) ? 1 : editor_prefs.tab_width;
-		new_pos = (old_pos >= ind_pos) ? old_pos - step : old_pos;
-
-		if (ind_pos == sci_get_position_from_line(doc->editor->sci, line))
-			return;
-
-		sci_set_current_position(doc->editor->sci, ind_pos, TRUE);
-		indent = sci_get_line_indentation(doc->editor->sci, line);
-		indent -= editor_prefs.tab_width;
-		if (indent < 0)
-			indent = 0;
-		sci_set_line_indentation(doc->editor->sci, line, indent);
-
-		sci_set_current_position(doc->editor->sci, new_pos, TRUE);
+		change_line_indent(doc->editor, FALSE);
 	}
 }
 
@@ -2079,31 +2062,39 @@
 }
 
 
-void
-on_tabs1_activate                      (GtkMenuItem     *menuitem,
-                                        gpointer         user_data)
+static void set_indent_type(GeanyIndentType type)
 {
 	GeanyDocument *doc = document_get_current();
 
 	if (doc == NULL || ignore_callback)
 		return;
 
-	editor_set_use_tabs(doc->editor, TRUE);
+	editor_set_indent_type(doc->editor, type);
 	ui_update_statusbar(doc, -1);
 }
 
 
 void
+on_tabs1_activate                      (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+	set_indent_type(GEANY_INDENT_TYPE_TABS);
+}
+
+
+void
 on_spaces1_activate                    (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-	GeanyDocument *doc = document_get_current();
+	set_indent_type(GEANY_INDENT_TYPE_SPACES);
+}
 
-	if (doc == NULL || ignore_callback)
-		return;
 
-	editor_set_use_tabs(doc->editor, FALSE);
-	ui_update_statusbar(doc, -1);
+void
+on_tabs_and_spaces1_activate           (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+	set_indent_type(GEANY_INDENT_TYPE_BOTH);
 }
 
 

Modified: branches/custom-tab-width/src/callbacks.h
===================================================================
--- branches/custom-tab-width/src/callbacks.h	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/callbacks.h	2008-08-04 14:07:49 UTC (rev 2853)
@@ -626,3 +626,7 @@
 void
 on_find_document_usage1_activate       (GtkMenuItem     *menuitem,
                                         gpointer         user_data);
+
+void
+on_tabs_and_spaces1_activate           (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);

Modified: branches/custom-tab-width/src/document.c
===================================================================
--- branches/custom-tab-width/src/document.c	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/document.c	2008-08-04 14:07:49 UTC (rev 2853)
@@ -303,15 +303,18 @@
 void document_apply_update_prefs(GeanyDocument *doc)
 {
 	ScintillaObject *sci;
+	GeanyEditor *editor;
 
 	g_return_if_fail(doc != NULL);
 
-	sci = doc->editor->sci;
+	editor = doc->editor;
+	sci = editor->sci;
 
 	sci_set_mark_long_lines(sci, editor_prefs.long_line_type,
 		editor_prefs.long_line_column, editor_prefs.long_line_color);
 
-	sci_set_tab_width(sci, editor_prefs.tab_width);
+	/* update indent width, tab width */
+	editor_set_indent_type(editor, editor->indent_type);
 
 	sci_set_autoc_max_height(sci, editor_prefs.symbolcompletion_max_height);
 
@@ -321,8 +324,6 @@
 
 	sci_set_folding_margin_visible(sci, editor_prefs.folding);
 
-	doc->editor->auto_indent = (editor_prefs.indent_mode != INDENT_NONE);
-
 	sci_assign_cmdkey(sci, SCK_HOME,
 		editor_prefs.smart_home_key ? SCI_VCHOMEWRAP : SCI_HOMEWRAP);
 	sci_assign_cmdkey(sci, SCK_END,  SCI_LINEENDWRAP);
@@ -571,7 +572,6 @@
 	if (text != NULL)
 		sci_convert_eols(doc->editor->sci, file_prefs.default_eol_character);
 
-	editor_set_use_tabs(doc->editor, editor_prefs.use_tabs);
 	sci_set_undo_collection(doc->editor->sci, TRUE);
 	sci_empty_undo_buffer(doc->editor->sci);
 
@@ -883,11 +883,18 @@
 }
 
 
-static gboolean detect_use_tabs(ScintillaObject *sci)
+static GeanyIndentType detect_indent_type(GeanyEditor *editor)
 {
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
+	ScintillaObject *sci = editor->sci;
 	gint line;
+	gboolean use_tabs;
 	gsize tabs = 0, spaces = 0;
 
+	/* TODO: tabs & spaces detection */
+	if (iprefs->type == GEANY_INDENT_TYPE_BOTH)
+		return GEANY_INDENT_TYPE_BOTH;
+
 	for (line = 0; line < sci_get_line_count(sci); line++)
 	{
 		gint pos = sci_get_position_from_line(sci, line);
@@ -905,34 +912,42 @@
 		}
 	}
 	if (spaces == 0 && tabs == 0)
-		return editor_prefs.use_tabs;
+		return iprefs->type;
 
 	/* Skew comparison by a factor of 2 in favour of default editor pref */
-	if (editor_prefs.use_tabs)
-		return ! (spaces > tabs * 2);
+	if (iprefs->type == GEANY_INDENT_TYPE_TABS)
+		use_tabs = ! (spaces > tabs * 2);
 	else
-		return (tabs > spaces * 2);
+		use_tabs = (tabs > spaces * 2);
+
+	return use_tabs ? GEANY_INDENT_TYPE_TABS : GEANY_INDENT_TYPE_SPACES;
 }
 
 
-static void set_indentation(GeanyDocument *doc)
+static void set_indentation(GeanyEditor *editor)
 {
-	/* force using tabs for indentation for Makefiles */
-	if (FILETYPE_ID(doc->file_type) == GEANY_FILETYPES_MAKE)
-		editor_set_use_tabs(doc->editor, TRUE);
-	/* force using spaces for indentation for Fortran 77 */
-	else if (FILETYPE_ID(doc->file_type) == GEANY_FILETYPES_F77)
-		editor_set_use_tabs(doc->editor, FALSE);
-	else if (! editor_prefs.detect_tab_mode)
-		editor_set_use_tabs(doc->editor, editor_prefs.use_tabs);
-	else
-	{	/* detect & set tabs/spaces */
-		gboolean use_tabs = detect_use_tabs(doc->editor->sci);
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
 
-		if (use_tabs != editor_prefs.use_tabs)
-			ui_set_statusbar(TRUE, _("Setting %s indentation mode."),
-				(use_tabs) ? _("Tabs") : _("Spaces"));
-		editor_set_use_tabs(doc->editor, use_tabs);
+	switch (FILETYPE_ID(editor->document->file_type))
+	{
+		case GEANY_FILETYPES_MAKE:
+			/* force using tabs for indentation for Makefiles */
+			editor_set_indent_type(editor, GEANY_INDENT_TYPE_TABS);
+			break;
+		case GEANY_FILETYPES_F77:
+			/* force using spaces for indentation for Fortran 77 */
+			editor_set_indent_type(editor, GEANY_INDENT_TYPE_SPACES);
+			break;
+		default:
+			if (iprefs->detect_type)
+			{	/* detect & set tabs/spaces */
+				GeanyIndentType type = detect_indent_type(editor);
+
+				if (type != iprefs->type)
+					ui_set_statusbar(TRUE, _("Setting %s indentation mode."),
+						(type == GEANY_INDENT_TYPE_TABS) ? _("Tabs") : _("Spaces"));
+				editor_set_indent_type(editor, type);
+			}
 	}
 }
 
@@ -1061,9 +1076,9 @@
 
 	/* set indentation settings after setting the filetype */
 	if (reload)
-		editor_set_use_tabs(doc->editor, doc->editor->use_tabs); /* resetup sci */
+		editor_set_indent_type(doc->editor, doc->editor->indent_type); /* resetup sci */
 	else
-		set_indentation(doc);
+		set_indentation(doc->editor);
 
 	document_set_text_changed(doc, FALSE);	/* also updates tab state */
 	ui_document_show_hide(doc);	/* update the document menu */

Modified: branches/custom-tab-width/src/editor.c
===================================================================
--- branches/custom-tab-width/src/editor.c	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/editor.c	2008-08-04 14:07:49 UTC (rev 2853)
@@ -706,36 +706,82 @@
 }
 
 
+static gint get_tab_width(const GeanyIndentPrefs *indent_prefs)
+{
+	if (indent_prefs->type == GEANY_INDENT_TYPE_BOTH)
+		return indent_prefs->tab_width;
+
+	return indent_prefs->width;	/* tab width = indent width */
+}
+
+
 /* Returns a string containing width chars of whitespace, filled with simple space
- * characters or with the right number of tab characters, according to the
- * use_tabs setting. (Result is filled with tabs *and* spaces if width isn't a multiple of
+ * characters or with the right number of tab characters, according to the indent prefs.
+ * (Result is filled with tabs *and* spaces if width isn't a multiple of
  * editor_prefs.tab_width). */
 static gchar *
-get_whitespace(gint width, gboolean use_tabs)
+get_whitespace(const GeanyIndentPrefs *iprefs, gint width)
 {
-	gchar *str;
-
 	g_return_val_if_fail(width > 0, NULL);
 
-	if (use_tabs)
+	if (iprefs->type == GEANY_INDENT_TYPE_SPACES)
+	{
+		return g_strnfill(width, ' ');
+	}
+	else
 	{	/* first fill text with tabs and fill the rest with spaces */
-		gint tabs = width / editor_prefs.tab_width;
-		gint spaces = width % editor_prefs.tab_width;
+		const gint tab_width = get_tab_width(iprefs);
+		gint tabs = width / tab_width;
+		gint spaces = width % tab_width;
 		gint len = tabs + spaces;
+		gchar *str;
 
 		str = g_malloc(len + 1);
 
 		memset(str, '\t', tabs);
 		memset(str + tabs, ' ', spaces);
 		str[len] = '\0';
+		return str;
  	}
-	else
-		str = g_strnfill(width, ' ');
+}
 
-	return str;
+
+static const GeanyIndentPrefs *
+get_default_indent_prefs(void)
+{
+	/* In future this might depend on project or filetype. */
+	return editor_prefs.indentation;
 }
 
 
+/** Get the indentation prefs for the editor.
+ * In future, the prefs might be different according to project or filetype.
+ * @warning Always get a fresh result instead of keeping a pointer to it if the editor
+ * settings may have changed, or if this function has been called for a different @a editor. */
+const GeanyIndentPrefs *
+editor_get_indent_prefs(GeanyEditor *editor)
+{
+	static GeanyIndentPrefs iprefs;
+
+	g_return_val_if_fail(editor != NULL, NULL);
+
+	iprefs = *get_default_indent_prefs();
+
+	iprefs.type = editor->indent_type;
+	if (!editor->auto_indent)
+		iprefs.auto_indent_mode = GEANY_AUTOINDENT_NONE;
+	return &iprefs;
+}
+
+
+static gchar *get_single_indent(GeanyEditor *editor)
+{
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
+
+	return get_whitespace(iprefs, iprefs->width);
+}
+
+
 static void check_python_indent(GeanyEditor *editor, gint pos)
 {
 	ScintillaObject *sci = editor->sci;
@@ -745,9 +791,9 @@
 	if (sci_get_char_at(sci, last_char) == ':' &&
 		sci_get_style_at(sci, last_char) == SCE_P_OPERATOR)
 	{
-		/* creates and inserts one tabulator sign or
+		/* creates and inserts one tab char or
 		 * whitespace of the amount of the tab width */
-		gchar *text = get_whitespace(editor_prefs.tab_width, editor->use_tabs);
+		gchar *text = get_single_indent(editor);
 		sci_add_text(sci, text);
 		g_free(text);
 	}
@@ -763,10 +809,12 @@
 	/* simple indentation */
 	if (editor->auto_indent)
 	{
+		gint auto_indent_mode = editor_get_indent_prefs(editor)->auto_indent_mode;
+
 		get_indent(editor, pos, FALSE);
 		sci_add_text(sci, indent);
 
-		if (editor_prefs.indent_mode > INDENT_BASIC &&
+		if (auto_indent_mode > GEANY_AUTOINDENT_BASIC &&
 			FILETYPE_ID(editor->document->file_type) == GEANY_FILETYPES_PYTHON)
 			check_python_indent(editor, pos);
 	}
@@ -808,20 +856,23 @@
 }
 
 
-/* in place indentation of one tab or equivalent spaces */
-static void do_indent(gchar *buf, gsize len, guint *idx, gboolean use_tabs)
+/* in place indentation of one tab or equivalent spaces.
+ * idx is the index into buf. */
+static void do_indent(const GeanyIndentPrefs *iprefs, gchar *buf, gsize len, guint *idx)
 {
 	guint j = *idx;
 
-	if (use_tabs)
+	if (iprefs->type == GEANY_INDENT_TYPE_TABS)
 	{
 		if (j < len - 1)	/* leave room for a \0 terminator. */
 			buf[j++] = '\t';
 	}
 	else
-	{	/* insert as many spaces as a tab would take */
+	{
+		/* insert as many spaces as an indent takes.
+		 * TODO: insert tabs for GEANY_INDENT_TYPE_BOTH */
 		guint k;
-		for (k = 0; k < (guint) editor_prefs.tab_width && k < len - 1; k++)
+		for (k = 0; k < (guint) iprefs->width && k < len - 1; k++)
 			buf[j++] = ' ';
 	}
 	*idx = j;
@@ -836,6 +887,7 @@
 	guint i, len, j = 0;
 	gint prev_line;
 	gchar *linebuf;
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
 
 	prev_line = sci_get_line_from_position(sci, pos);
 
@@ -848,7 +900,7 @@
 	{
 		if (linebuf[i] == ' ' || linebuf[i] == '\t')	/* simple indentation */
 			indent[j++] = linebuf[i];
-		else if (editor_prefs.indent_mode <= INDENT_BASIC)
+		else if (iprefs->auto_indent_mode <= GEANY_AUTOINDENT_BASIC)
 			break;
 		else if (use_this_line)
 			break;
@@ -861,7 +913,7 @@
 			 * "	{ return bless({}, shift); }" (Perl) */
 			if (linebuf[i] == '{' && i == (len - 1))
 			{
-				do_indent(indent, sizeof(indent), &j, editor->use_tabs);
+				do_indent(iprefs, indent, sizeof(indent), &j);
 				break;
 			}
 			else
@@ -874,7 +926,7 @@
 				 * e.g. for (...) { */
 				if (linebuf[k] == '{')
 				{
-					do_indent(indent, sizeof(indent), &j, editor->use_tabs);
+					do_indent(iprefs, indent, sizeof(indent), &j);
 				}
 				break;
 			}
@@ -944,13 +996,14 @@
 /* Called after typing '}'. */
 void editor_close_block(GeanyDocument *doc, gint pos)
 {
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(doc->editor);
 	gint x = 0, cnt = 0;
 	gint line, line_len, eol_char_len;
 	gchar *text, *line_buf;
 	ScintillaObject *sci;
 	gint line_indent, last_indent;
 
-	if (editor_prefs.indent_mode < INDENT_CURRENTCHARS)
+	if (iprefs->auto_indent_mode < GEANY_AUTOINDENT_CURRENTCHARS)
 		return;
 	if (doc == NULL || doc->file_type == NULL)
 		return;
@@ -979,7 +1032,7 @@
 	if ((line_len - eol_char_len - 1) != cnt)
 		return;
 
-	if (editor_prefs.indent_mode == INDENT_MATCHBRACES)
+	if (iprefs->auto_indent_mode == GEANY_AUTOINDENT_MATCHBRACES)
 	{
 		gint start_brace = brace_match(sci, pos);
 
@@ -998,13 +1051,13 @@
 		/* fall through - unmatched brace (possibly because of TCL, PHP lexer bugs) */
 	}
 
-	/* INDENT_CURRENTCHARS */
+	/* GEANY_AUTOINDENT_CURRENTCHARS */
 	line_indent = sci_get_line_indentation(sci, line);
 	last_indent = sci_get_line_indentation(sci, line - 1);
 
 	if (line_indent < last_indent)
 		return;
-	line_indent -= editor_prefs.tab_width;
+	line_indent -= iprefs->width;
 	line_indent = MAX(0, line_indent);
 	sci_set_line_indentation(sci, line, line_indent);
 }
@@ -1578,7 +1631,7 @@
 
 	get_indent(editor, pos, TRUE);
 	lindent = g_strconcat(editor_get_eol_char(editor->document), indent, NULL);
-	whitespace = get_whitespace(editor_prefs.tab_width, editor->use_tabs);
+	whitespace = get_single_indent(editor);
 
 	/* remove the typed word, it will be added again by the used auto completion
 	 * (not really necessary but this makes the auto completion more flexible,
@@ -1825,10 +1878,10 @@
 	}
 
 	/* get indent string for generated code */
-	if (editor_prefs.indent_mode == INDENT_NONE)
+	if (editor->auto_indent)
 		indent_str = g_strdup("");
 	else
-		indent_str = get_whitespace(editor_prefs.tab_width, editor->use_tabs);
+		indent_str = get_single_indent(editor);
 
 	table = g_strconcat("\n", indent, indent_str, "<tr>\n",
 						indent, indent_str, indent_str, "<td>\n",
@@ -2435,10 +2488,11 @@
 			gint cur_line = sci_get_current_line(sci);
 			gint indent_pos = sci_get_line_indent_position(sci, cur_line);
 			gint indent_len = sci_get_col_from_position(sci, indent_pos);
+			gint indent_width = editor_get_indent_prefs(editor)->width;
 
 			/* if there is one too many spaces, delete the last space,
 			 * to return to the indent used before the multiline comment was started. */
-			if (indent_len % editor_prefs.tab_width == 1)
+			if (indent_len % indent_width == 1)
 				SSM(sci, SCI_DELETEBACKNOTLINE, 0, 0);	/* remove whitespace indent */
 			g_free(previous_line);
 			return;
@@ -2765,10 +2819,23 @@
 }
 
 
+/* creates and inserts one tab or whitespace of the amount of the tab width */
 void editor_insert_alternative_whitespace(GeanyEditor *editor)
 {
-	/* creates and inserts one tab or whitespace of the amount of the tab width */
-	gchar *text = get_whitespace(editor_prefs.tab_width, ! editor->use_tabs);
+	gchar *text;
+	GeanyIndentPrefs iprefs = *editor_get_indent_prefs(editor);
+
+	switch (iprefs.type)
+	{
+		case GEANY_INDENT_TYPE_TABS:
+			iprefs.type = GEANY_INDENT_TYPE_SPACES;
+			break;
+		case GEANY_INDENT_TYPE_SPACES:
+		case GEANY_INDENT_TYPE_BOTH:	/* most likely we want a tab */
+			iprefs.type = GEANY_INDENT_TYPE_TABS;
+			break;
+	}
+	text = get_whitespace(&iprefs, iprefs.width);
 	sci_add_text(editor->sci, text);
 	g_free(text);
 }
@@ -3490,14 +3557,24 @@
 }
 
 
-void editor_set_use_tabs(GeanyEditor *editor, gboolean use_tabs)
+/* Also sets indent width, tab width. */
+void editor_set_indent_type(GeanyEditor *editor, GeanyIndentType type)
 {
-	g_return_if_fail(editor != NULL);
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
+	ScintillaObject *sci = editor->sci;
+	gboolean use_tabs = type != GEANY_INDENT_TYPE_SPACES;
 
-	editor->use_tabs = use_tabs;
-	sci_set_use_tabs(editor->sci, use_tabs);
-	/* remove indent spaces on backspace, if using spaces to indent */
-	SSM(editor->sci, SCI_SETBACKSPACEUNINDENTS, ! use_tabs, 0);
+	editor->indent_type = type;
+	sci_set_use_tabs(sci, use_tabs);
+
+	if (type == GEANY_INDENT_TYPE_BOTH)
+		sci_set_tab_width(sci, iprefs->tab_width);
+	else
+		sci_set_tab_width(sci, iprefs->width);
+	SSM(sci, SCI_SETINDENT, iprefs->width, 0);
+
+	/* remove indent spaces on backspace, if using any spaces to indent */
+	SSM(sci, SCI_SETBACKSPACEUNINDENTS, type != GEANY_INDENT_TYPE_TABS, 0);
 }
 
 
@@ -3648,17 +3725,19 @@
 
 GeanyEditor *editor_create(GeanyDocument *doc)
 {
+	const GeanyIndentPrefs *iprefs = get_default_indent_prefs();
 	GeanyEditor *editor = g_new0(GeanyEditor, 1);
 
 	editor->document = doc;
 
-	editor->auto_indent = (editor_prefs.indent_mode != INDENT_NONE);
+	editor->sci = create_new_sci(doc);
+	editor_set_indent_type(editor, iprefs->type);
+	editor_set_font(editor, interface_prefs.editor_font);
+
+	editor->auto_indent = (iprefs->auto_indent_mode != GEANY_AUTOINDENT_NONE);
 	editor->line_wrapping = editor_prefs.line_wrapping;
 	editor->scroll_percent = -1.0F;
 	editor->line_breaking = FALSE;
-
-	editor->sci = create_new_sci(doc);
-	editor_set_font(editor, interface_prefs.editor_font);
 	return editor;
 }
 
@@ -3668,7 +3747,7 @@
 	static GeanyIndentPrefs indent_prefs;
 
 	memset(&editor_prefs, 0, sizeof(GeanyEditorPrefs));
-	memset(&indent_prefs, 0, sizeof GeanyIndentPrefs);
-	editor_prefs->indentation = &indent_prefs;
+	memset(&indent_prefs, 0, sizeof(GeanyIndentPrefs));
+	editor_prefs.indentation = &indent_prefs;
 }
 

Modified: branches/custom-tab-width/src/editor.h
===================================================================
--- branches/custom-tab-width/src/editor.h	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/editor.h	2008-08-04 14:07:49 UTC (rev 2853)
@@ -48,8 +48,8 @@
 /** Whether to use tabs, spaces or both to indent. */
 typedef enum
 {
+	GEANY_INDENT_TYPE_SPACES,	/**< Spaces. */
 	GEANY_INDENT_TYPE_TABS,		/**< Tabs. */
-	GEANY_INDENT_TYPE_SPACES,	/**< Spaces. */
 	GEANY_INDENT_TYPE_BOTH		/**< Both. */
 }
 GeanyIndentType;

Modified: branches/custom-tab-width/src/keyfile.c
===================================================================
--- branches/custom-tab-width/src/keyfile.c	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/keyfile.c	2008-08-04 14:07:49 UTC (rev 2853)
@@ -230,7 +230,7 @@
 		ft->name,
 		doc->readonly,
 		encodings_get_idx_from_charset(doc->encoding),
-		doc->editor->use_tabs,
+		doc->editor->indent_type,
 		doc->editor->auto_indent,
 		doc->editor->line_wrapping,
 		doc->file_name);
@@ -923,15 +923,15 @@
 	guint pos;
 	const gchar *ft_name;
 	gchar *locale_filename;
-	gint enc_idx;
-	gboolean ro, use_tabs, auto_indent, line_wrapping;
+	gint enc_idx, indent_type;
+	gboolean ro, auto_indent, line_wrapping;
 	gboolean ret = FALSE;
 
 	pos = atoi(tmp[0]);
 	ft_name = tmp[1];
 	ro = atoi(tmp[2]);
 	enc_idx = atoi(tmp[3]);
-	use_tabs = atoi(tmp[4]);
+	indent_type = atoi(tmp[4]);
 	auto_indent = atoi(tmp[5]);
 	line_wrapping = atoi(tmp[6]);
 	/* try to get the locale equivalent for the filename */
@@ -947,7 +947,7 @@
 
 		if (doc)
 		{
-			editor_set_use_tabs(doc->editor, use_tabs);
+			editor_set_indent_type(doc->editor, indent_type);
 			editor_set_line_wrapping(doc->editor, line_wrapping);
 			doc->editor->auto_indent = auto_indent;
 			ret = TRUE;

Modified: branches/custom-tab-width/src/main.c
===================================================================
--- branches/custom-tab-width/src/main.c	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/main.c	2008-08-04 14:07:49 UTC (rev 2853)
@@ -252,14 +252,6 @@
 		gtk_widget_hide(ui_widgets.statusbar);
 	}
 
-	ignore_callback = TRUE;
-	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
-				lookup_widget(main_widgets.window, "menu_line_wrapping1")), editor_prefs.line_wrapping);
-	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
-				lookup_widget(main_widgets.window, "menu_use_auto_indentation1")),
-				(editor_prefs.indent_mode != INDENT_NONE));
-	ignore_callback = FALSE;
-
 	/* connect the toolbar dropdown menu for the new button */
 	gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(
 			lookup_widget(main_widgets.window, "menutoolbutton1")), ui_widgets.new_file_menu);
@@ -794,12 +786,13 @@
 	main_init();
 	gtk_widget_set_size_request(main_widgets.window, GEANY_WINDOW_MINIMAL_WIDTH, GEANY_WINDOW_MINIMAL_HEIGHT);
 	gtk_window_set_default_size(GTK_WINDOW(main_widgets.window), GEANY_WINDOW_DEFAULT_WIDTH, GEANY_WINDOW_DEFAULT_HEIGHT);
+
 	encodings_init();
+	editor_init();
 
 	load_settings();
 
 	msgwin_init();
-	editor_init();
 	build_init();
 	search_init();
 	ui_create_insert_menu_items();

Modified: branches/custom-tab-width/src/prefs.c
===================================================================
--- branches/custom-tab-width/src/prefs.c	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/prefs.c	2008-08-04 14:07:49 UTC (rev 2853)
@@ -166,29 +166,39 @@
 }
 
 
+typedef struct RadioPrefEntry
+{
+	const gchar *widget_name;
+	gpointer setting;
+	gint value;
+}
+RadioPrefEntry;
+
 static void radio_prefs_foreach(PrefCallbackAction action)
 {
 	guint i;
-	/* Only add one widget per radio-group; the setting is the index of the selected radio item
-	 * in the group. */
-	PrefEntry items[] =
+	RadioPrefEntry items[] =
 	{
-		{"radio_indent_spaces", &editor_prefs.indentation->type},
+		{"radio_indent_spaces", &editor_prefs.indentation->type, GEANY_INDENT_TYPE_SPACES},
+		{"radio_indent_tabs", &editor_prefs.indentation->type, GEANY_INDENT_TYPE_TABS},
+		{"radio_indent_both", &editor_prefs.indentation->type, GEANY_INDENT_TYPE_BOTH},
 	};
 
 	for (i = 0; i < G_N_ELEMENTS(items); i++)
 	{
-		PrefEntry *pe = &items[i];
+		RadioPrefEntry *pe = &items[i];
 		GtkWidget *widget = lookup_widget(ui_widgets.prefs_dialog, pe->widget_name);
 		gint *setting = pe->setting;
 
 		switch (action)
 		{
 			case PREF_DISPLAY:
-				ui_radio_menu_item_set_active_index(GTK_RADIO_MENU_ITEM(widget), *setting);
+				if (*setting == pe->value)
+					gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
 				break;
 			case PREF_UPDATE:
-				*setting = ui_radio_menu_item_get_active_index(GTK_RADIO_MENU_ITEM(widget));
+				if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+					*setting = pe->value;
 				break;
 		}
 	}
@@ -200,7 +210,7 @@
 	guint i;
 	PrefEntry items[] =
 	{
-		{"combo_auto_indent_mode", &editor_prefs.indentation->type},
+		{"combo_auto_indent_mode", &editor_prefs.indentation->auto_indent_mode},
 	};
 
 	for (i = 0; i < G_N_ELEMENTS(items); i++)

Modified: branches/custom-tab-width/src/ui_utils.c
===================================================================
--- branches/custom-tab-width/src/ui_utils.c	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/ui_utils.c	2008-08-04 14:07:49 UTC (rev 2853)
@@ -174,8 +174,19 @@
 				/* OVR = overwrite/overtype, INS = insert */
 				(sci_get_overtype(doc->editor->sci) ? _("OVR") : _("INS")));
 		g_string_append(stats_str, sp);
-		g_string_append(stats_str,
-			(doc->editor->use_tabs) ? _("TAB") : _("SP "));	/* SP = space */
+
+		switch (editor_get_indent_prefs(doc->editor)->type)
+		{
+			case GEANY_INDENT_TYPE_TABS:
+				g_string_append(stats_str, _("TAB"));
+				break;
+			case GEANY_INDENT_TYPE_SPACES:
+				g_string_append(stats_str, _("SP"));	/* SP = space */
+				break;
+			case GEANY_INDENT_TYPE_BOTH:
+				g_string_append(stats_str, _("T/S"));	/* T/S = tabs and spaces */
+				break;
+		}
 		g_string_append(stats_str, sp);
 		g_string_append_printf(stats_str, _("mode: %s"),
 			editor_get_eol_char_name(doc));
@@ -687,6 +698,7 @@
 {
 	gchar *widget_name;
 	GtkWidget *item;
+	const GeanyIndentPrefs *iprefs;
 
 	if (doc == NULL)
 		doc = document_get_current();
@@ -704,12 +716,23 @@
 			GTK_CHECK_MENU_ITEM(lookup_widget(main_widgets.window, "line_breaking1")),
 			doc->editor->line_breaking);
 
+	iprefs = editor_get_indent_prefs(doc->editor);
+
 	item = lookup_widget(main_widgets.window, "menu_use_auto_indentation1");
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), doc->editor->auto_indent);
 	gtk_widget_set_sensitive(item,
-		editor_prefs.indentation->auto_indent_mode != GEANY_AUTOINDENT_NONE);
+		iprefs->auto_indent_mode != GEANY_AUTOINDENT_NONE);
 
-	item = lookup_widget(main_widgets.window, doc->editor->use_tabs ? "tabs1" : "spaces1");
+	switch (iprefs->type)
+	{
+		case GEANY_INDENT_TYPE_SPACES:
+			widget_name = "spaces1"; break;
+		case GEANY_INDENT_TYPE_TABS:
+			widget_name = "tabs1"; break;
+		case GEANY_INDENT_TYPE_BOTH:
+			widget_name = "tabs_and_spaces1"; break;
+	}
+	item = lookup_widget(main_widgets.window, widget_name);
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
 
 	gtk_check_menu_item_set_active(
@@ -1508,41 +1531,3 @@
 }
 
 
-void ui_radio_menu_item_set_active_index(GtkRadioMenuItem *widget, guint idx)
-{
-	GSList *item = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(widget));
-	guint i;
-
-	for (i = 0; item != NULL; item = g_slist_next(item), i++)
-	{
-		if (i == idx)
-		{
-			GtkCheckMenuItem *radio = item->data;
-
-			gtk_check_menu_item_set_active(radio, TRUE);
-			return;
-		}
-	}
-	g_warning("Index %u is out of range for group of widget %s",
-		idx, gtk_widget_get_name(GTK_WIDGET(widget)));
-}
-
-
-guint ui_radio_menu_item_get_active_index(GtkRadioMenuItem *widget)
-{
-	GSList *item = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(widget));
-	guint i;
-
-	for (i = 0; item != NULL; item = g_slist_next(item), i++)
-	{
-		GtkCheckMenuItem *radio = item->data;
-
-		if (gtk_check_menu_item_get_active(radio))
-			return i;
-	}
-	g_warning("No active group item for widget %s",
-		gtk_widget_get_name(GTK_WIDGET(widget)));
-	return 0;
-}
-
-

Modified: branches/custom-tab-width/src/ui_utils.h
===================================================================
--- branches/custom-tab-width/src/ui_utils.h	2008-08-04 08:53:21 UTC (rev 2852)
+++ branches/custom-tab-width/src/ui_utils.h	2008-08-04 14:07:49 UTC (rev 2853)
@@ -151,10 +151,6 @@
 
 void ui_table_add_row(GtkTable *table, gint row, ...) G_GNUC_NULL_TERMINATED;
 
-void ui_radio_menu_item_set_active_index(GtkRadioMenuItem *widget, guint index);
-
-guint ui_radio_menu_item_get_active_index(GtkRadioMenuItem *widget);
-
 /* End of 'generic' functions */
 
 


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