SF.net SVN: geany: [2605] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Wed May 21 14:00:27 UTC 2008


Revision: 2605
          http://geany.svn.sourceforge.net/geany/?rev=2605&view=rev
Author:   ntrel
Date:     2008-05-21 07:00:27 -0700 (Wed, 21 May 2008)

Log Message:
-----------
Refactor editor_auto_line_indentation().
Make auto-line indentation set the cursor to the beginning of
indentation for single line selections, so the user can fine-tune
indentation if necessary. For multiple line selections, select all
the lines after indenting.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/editor.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-05-19 15:22:56 UTC (rev 2604)
+++ trunk/ChangeLog	2008-05-21 14:00:27 UTC (rev 2605)
@@ -1,3 +1,13 @@
+2008-05-21  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/editor.c:
+   Refactor editor_auto_line_indentation().
+   Make auto-line indentation set the cursor to the beginning of
+   indentation for single line selections, so the user can fine-tune
+   indentation if necessary. For multiple line selections, select all
+   the lines after indenting.
+
+
 2008-05-19  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
 
  * src/plugindata.h, src/plugins.c, doc/plugin-symbols.c,

Modified: trunk/src/editor.c
===================================================================
--- trunk/src/editor.c	2008-05-19 15:22:56 UTC (rev 2604)
+++ trunk/src/editor.c	2008-05-21 14:00:27 UTC (rev 2605)
@@ -2671,11 +2671,36 @@
 }
 
 
-/* simple auto indentation to indent the current line with the same indent as the previous one */
+/* simple indentation to indent the current line with the same indent as the previous one */
+static void auto_line_indentation(gint idx, gint first_line, gint last_line)
+{
+	gint i, sel_start = 0, sel_end = 0;
+
+	for (i = first_line; i <= last_line; i++)
+	{
+		/* skip the first line or if the indentation of the previous and current line are equal */
+		if (i == 0 ||
+			SSM(doc_list[idx].sci, SCI_GETLINEINDENTATION, i - 1, 0) ==
+			SSM(doc_list[idx].sci, SCI_GETLINEINDENTATION, i, 0))
+			continue;
+
+		sel_start = SSM(doc_list[idx].sci, SCI_POSITIONFROMLINE, i, 0);
+		sel_end = SSM(doc_list[idx].sci, SCI_GETLINEINDENTPOSITION, i, 0);
+		if (sel_start < sel_end)
+		{
+			SSM(doc_list[idx].sci, SCI_SETSEL, sel_start, sel_end);
+			sci_replace_sel(doc_list[idx].sci, "");
+		}
+		sci_insert_text(doc_list[idx].sci, sel_start, indent);
+	}
+}
+
+
+/* simple indentation to indent the current line with the same indent as the previous one */
 void editor_auto_line_indentation(gint idx, gint pos)
 {
-	gint i, first_line, last_line;
-	gint first_sel_start, first_sel_end, sel_start = 0, sel_end = 0;
+	gint first_line, last_line;
+	gint first_sel_start, first_sel_end;
 
 	g_return_if_fail(DOC_IDX_VALID(idx));
 
@@ -2691,35 +2716,31 @@
 	if (pos == -1)
 		pos = first_sel_start;
 
+	SSM(doc_list[idx].sci, SCI_BEGINUNDOACTION, 0, 0);
+
 	/* get previous line and use it for get_indent to use that line
 	 * (otherwise it would fail on a line only containing "{" in advanced indentation mode) */
 	get_indent(&doc_list[idx],
 		sci_get_position_from_line(doc_list[idx].sci, first_line - 1), TRUE);
-	SSM(doc_list[idx].sci, SCI_BEGINUNDOACTION, 0, 0);
 
-	for (i = first_line; i <= last_line; i++)
+	auto_line_indentation(idx, first_line, last_line);
+
+	/* set cursor position if there was no selection */
+	if (first_sel_start == first_sel_end)
 	{
-		/* skip the first line or if the indentation of the previous and current line are equal */
-		if (i == 0 ||
-			SSM(doc_list[idx].sci, SCI_GETLINEINDENTATION, i - 1, 0) ==
-			SSM(doc_list[idx].sci, SCI_GETLINEINDENTATION, i, 0))
-			continue;
+		gint indent_pos = SSM(doc_list[idx].sci, SCI_GETLINEINDENTPOSITION, first_line, 0);
 
-		sel_start = SSM(doc_list[idx].sci, SCI_POSITIONFROMLINE, i, 0);
-		sel_end = SSM(doc_list[idx].sci, SCI_GETLINEINDENTPOSITION, i, 0);
-		if (sel_start < sel_end)
-		{
-			SSM(doc_list[idx].sci, SCI_SETSEL, sel_start, sel_end);
-			sci_replace_sel(doc_list[idx].sci, "");
-		}
-		sci_insert_text(doc_list[idx].sci, sel_start, indent);
+		/* use indent position as user may wish to change indentation afterwards */
+		sci_set_current_position(doc_list[idx].sci, indent_pos, FALSE);
 	}
+	else
+	{
+		ScintillaObject *sci = doc_list[idx].sci;
 
-	/* set cursor position if there was no selection */
-	/* TODO: implement selection handling if there was a selection */
-	if (first_sel_start == first_sel_end)
-		sci_set_current_position(doc_list[idx].sci,
-			pos - (sel_end - sel_start) + strlen(indent), FALSE);
+		/* fully select all the lines affected */
+		sci_set_selection_start(sci, sci_get_position_from_line(sci, first_line));
+		sci_set_selection_end(sci, sci_get_position_from_line(sci, last_line + 1));
+	}
 
 	SSM(doc_list[idx].sci, SCI_ENDUNDOACTION, 0, 0);
 }


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