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

ntrel at users.sourceforge.net ntrel at xxxxx
Tue Aug 5 14:46:28 UTC 2008


Revision: 2857
          http://geany.svn.sourceforge.net/geany/?rev=2857&view=rev
Author:   ntrel
Date:     2008-08-05 14:46:27 +0000 (Tue, 05 Aug 2008)

Log Message:
-----------
Add get_indent_size_after_line() to replace get_indent() for
clarity, and to fix Tabs & Spaces auto-indentation > basic.
Change editor_close_block() to use sci_get_line_indentation() for
clarity.
Make editor_close_block() static.

Modified Paths:
--------------
    branches/custom-tab-width/ChangeLog
    branches/custom-tab-width/src/editor.c
    branches/custom-tab-width/src/editor.h

Modified: branches/custom-tab-width/ChangeLog
===================================================================
--- branches/custom-tab-width/ChangeLog	2008-08-05 08:54:02 UTC (rev 2856)
+++ branches/custom-tab-width/ChangeLog	2008-08-05 14:46:27 UTC (rev 2857)
@@ -1,3 +1,13 @@
+2008-08-05  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/editor.c, src/editor.h:
+   Add get_indent_size_after_line() to replace get_indent() for
+   clarity, and to fix Tabs & Spaces auto-indentation > basic.
+   Change editor_close_block() to use sci_get_line_indentation() for
+   clarity.
+   Make editor_close_block() static.
+
+
 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,

Modified: branches/custom-tab-width/src/editor.c
===================================================================
--- branches/custom-tab-width/src/editor.c	2008-08-05 08:54:02 UTC (rev 2856)
+++ branches/custom-tab-width/src/editor.c	2008-08-05 14:46:27 UTC (rev 2857)
@@ -75,13 +75,14 @@
 static void on_new_line_added(GeanyEditor *editor);
 static gboolean handle_xml(GeanyEditor *editor, gchar ch);
 static void get_indent(GeanyEditor *editor, gint pos, gboolean use_this_line);
+static void insert_indent_after_line(GeanyEditor *editor, gint line);
 static void auto_multiline(GeanyEditor *editor, gint pos);
 static gboolean is_comment(gint lexer, gint prev_style, gint style);
 static void auto_close_bracket(ScintillaObject *sci, gint pos, gchar c);
 static void auto_table(GeanyEditor *editor, gint pos);
+static void close_block(GeanyEditor *editor, gint pos);
 
 
-
 void editor_snippets_free()
 {
 	g_hash_table_destroy(editor_prefs.snippets);
@@ -437,7 +438,7 @@
 		case '}':
 		{	/* closing bracket handling */
 			if (editor->auto_indent)
-				editor_close_block(editor->document, pos - 1);
+				close_block(editor, pos - 1);
 			break;
 		}
 		default:
@@ -722,8 +723,11 @@
 static gchar *
 get_whitespace(const GeanyIndentPrefs *iprefs, gint width)
 {
-	g_return_val_if_fail(width > 0, NULL);
+	g_return_val_if_fail(width >= 0, NULL);
 
+	if (width == 0)
+		return g_strdup("");
+
 	if (iprefs->type == GEANY_INDENT_TYPE_SPACES)
 	{
 		return g_strnfill(width, ' ');
@@ -782,24 +786,6 @@
 }
 
 
-static void check_python_indent(GeanyEditor *editor, gint pos)
-{
-	ScintillaObject *sci = editor->sci;
-	gint last_char = pos - editor_get_eol_char_len(editor->document) - 1;
-
-	/* add extra indentation for Python after colon */
-	if (sci_get_char_at(sci, last_char) == ':' &&
-		sci_get_style_at(sci, last_char) == SCE_P_OPERATOR)
-	{
-		/* creates and inserts one tab char or
-		 * whitespace of the amount of the tab width */
-		gchar *text = get_single_indent(editor);
-		sci_add_text(sci, text);
-		g_free(text);
-	}
-}
-
-
 static void on_new_line_added(GeanyEditor *editor)
 {
 	ScintillaObject *sci = editor->sci;
@@ -809,14 +795,7 @@
 	/* 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 (auto_indent_mode > GEANY_AUTOINDENT_BASIC &&
-			FILETYPE_ID(editor->document->file_type) == GEANY_FILETYPES_PYTHON)
-			check_python_indent(editor, pos);
+		insert_indent_after_line(editor, line - 1);
 	}
 
 	if (editor_prefs.auto_continue_multiline)
@@ -880,7 +859,7 @@
 
 
 /* "use_this_line" to auto-indent only if it is a real new line
- * and ignore the case of editor_close_block */
+ * and ignore the case of close_block */
 static void get_indent(GeanyEditor *editor, gint pos, gboolean use_this_line)
 {
 	ScintillaObject *sci = editor->sci;
@@ -904,7 +883,7 @@
 			break;
 		else if (use_this_line)
 			break;
-		else	/* editor_close_block */
+		else	/* close_block */
 		{
 			if (! lexer_has_braces(sci))
 				break;
@@ -937,6 +916,97 @@
 }
 
 
+static gint get_brace_indent(ScintillaObject *sci, gint line)
+{
+	guint i, len;
+	gint ret = 0;
+	gchar *linebuf;
+
+	len = sci_get_line_length(sci, line);
+	linebuf = sci_get_line(sci, line);
+
+	for (i = 0; i < len; i++)
+	{
+		/* i == (len - 1) prevents wrong indentation after lines like
+		 * "	{ return bless({}, shift); }" (Perl) */
+		if (linebuf[i] == '{' && i == (len - 1))
+		{
+			ret++;
+			break;
+		}
+		else
+		{
+			gint k = len - 1;
+
+			while (k > 0 && isspace(linebuf[k])) k--;
+
+			/* if last non-whitespace character is a { increase indentation by a tab
+			 * e.g. for (...) { */
+			if (linebuf[k] == '{')
+			{
+				ret++;
+			}
+			break;
+		}
+	}
+	g_free(linebuf);
+	return ret;
+}
+
+
+static gint get_python_indent(ScintillaObject *sci, gint line)
+{
+	gint last_char = sci_get_line_end_position(sci, line) - 1;
+
+	/* add extra indentation for Python after colon */
+	if (sci_get_char_at(sci, last_char) == ':' &&
+		sci_get_style_at(sci, last_char) == SCE_P_OPERATOR)
+	{
+		return 1;
+	}
+	return 0;
+}
+
+
+static gint get_indent_size_after_line(GeanyEditor *editor, gint line)
+{
+	ScintillaObject *sci = editor->sci;
+	gint size;
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
+
+	g_return_val_if_fail(line >= 0, 0);
+
+	size = sci_get_line_indentation(sci, line);
+
+	if (iprefs->auto_indent_mode > GEANY_AUTOINDENT_BASIC)
+	{
+		if (lexer_has_braces(sci))
+			size += iprefs->width * get_brace_indent(sci, line);
+		else
+		if (FILETYPE_ID(editor->document->file_type) == GEANY_FILETYPES_PYTHON)
+			size += iprefs->width * get_python_indent(sci, line);
+	}
+	return size;
+}
+
+
+static void insert_indent_after_line(GeanyEditor *editor, gint line)
+{
+	ScintillaObject *sci = editor->sci;
+	gint size = get_indent_size_after_line(editor, line);
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
+
+	if (size > 0)
+	{
+		gchar *text;
+
+		text = get_whitespace(iprefs, size);
+		sci_add_text(sci, text);
+		g_free(text);
+	}
+}
+
+
 static void auto_close_bracket(ScintillaObject *sci, gint pos, gchar c)
 {
 	if (! editor_prefs.complete_snippets || SSM(sci, SCI_GETLEXER, 0, 0) != SCLEX_LATEX)
@@ -956,7 +1026,7 @@
 
 /* Finds a corresponding matching brace to the given pos
  * (this is taken from Scintilla Editor.cxx,
- * fit to work with editor_close_block) */
+ * fit to work with close_block) */
 static gint brace_match(ScintillaObject *sci, gint pos)
 {
 	gchar chBrace = sci_get_char_at(sci, pos);
@@ -994,9 +1064,10 @@
 
 
 /* Called after typing '}'. */
-void editor_close_block(GeanyDocument *doc, gint pos)
+static void close_block(GeanyEditor *editor, gint pos)
 {
-	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(doc->editor);
+	GeanyDocument *doc = editor->document;
+	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
 	gint x = 0, cnt = 0;
 	gint line, line_len, eol_char_len;
 	gchar *text, *line_buf;
@@ -1039,13 +1110,16 @@
 		if (start_brace >= 0)
 		{
 			gint line_start;
+			gint brace_line = sci_get_line_from_position(sci, start_brace);
+			gint size = sci_get_line_indentation(sci, brace_line);
+			gchar *ind = get_whitespace(iprefs, size);
 
-			get_indent(doc->editor, start_brace, TRUE);
-			text = g_strconcat(indent, "}", NULL);
+			text = g_strconcat(ind, "}", NULL);
 			line_start = sci_get_position_from_line(sci, line);
 			sci_set_anchor(sci, line_start);
 			SSM(sci, SCI_REPLACESEL, 0, (sptr_t) text);
 			g_free(text);
+			g_free(ind);
 			return;
 		}
 		/* fall through - unmatched brace (possibly because of TCL, PHP lexer bugs) */

Modified: branches/custom-tab-width/src/editor.h
===================================================================
--- branches/custom-tab-width/src/editor.h	2008-08-05 08:54:02 UTC (rev 2856)
+++ branches/custom-tab-width/src/editor.h	2008-08-05 14:46:27 UTC (rev 2857)
@@ -150,8 +150,6 @@
 
 gboolean editor_start_auto_complete(GeanyDocument *doc, gint pos, gboolean force);
 
-void editor_close_block(GeanyDocument *doc, gint pos);
-
 gboolean editor_complete_snippet(GeanyDocument *doc, gint pos);
 
 void editor_auto_latex(GeanyDocument *doc, gint pos);


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