Revision: 3802 http://geany.svn.sourceforge.net/geany/?rev=3802&view=rev Author: ntrel Date: 2009-05-18 15:17:48 +0000 (Mon, 18 May 2009)
Log Message: ----------- Make indenting with the Tabs indent type preserve spaces on the line, so it works for the 'tab indents, space aligns' formatting style.
Modified Paths: -------------- trunk/ChangeLog trunk/src/callbacks.c trunk/src/editor.c trunk/src/editor.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-05-18 15:01:21 UTC (rev 3801) +++ trunk/ChangeLog 2009-05-18 15:17:48 UTC (rev 3802) @@ -4,6 +4,9 @@ Add sci_set_selection(). * doc/geany.txt, doc/geany.html: Update manual for MRU switching. + * src/callbacks.c, src/editor.c, src/editor.h: + Make indenting with the Tabs indent type preserve spaces on the line, + so it works for the 'tab indents, space aligns' formatting style.
2009-05-17 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/src/callbacks.c =================================================================== --- trunk/src/callbacks.c 2009-05-18 15:01:21 UTC (rev 3801) +++ trunk/src/callbacks.c 2009-05-18 15:17:48 UTC (rev 3802) @@ -1713,18 +1713,6 @@ }
-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) @@ -1732,14 +1720,7 @@ GeanyDocument *doc = document_get_current(); g_return_if_fail(doc != NULL);
- if (sci_get_lines_selected(doc->editor->sci) > 1) - { - sci_send_command(doc->editor->sci, SCI_TAB); - } - else - { - change_line_indent(doc->editor, TRUE); - } + editor_indent(doc->editor, TRUE); }
@@ -1750,14 +1731,7 @@ GeanyDocument *doc = document_get_current(); g_return_if_fail(doc != NULL);
- if (sci_get_lines_selected(doc->editor->sci) > 1) - { - sci_send_command(doc->editor->sci, SCI_BACKTAB); - } - else - { - change_line_indent(doc->editor, FALSE); - } + editor_indent(doc->editor, FALSE); }
Modified: trunk/src/editor.c =================================================================== --- trunk/src/editor.c 2009-05-18 15:01:21 UTC (rev 3801) +++ trunk/src/editor.c 2009-05-18 15:17:48 UTC (rev 3802) @@ -4480,3 +4480,78 @@ editor_prefs.smart_home_key ? SCI_VCHOMEWRAP : SCI_HOMEWRAP); sci_assign_cmdkey(sci, SCK_END, SCI_LINEENDWRAP); } + + +/* This is for tab-indents, space aligns formatted code. Spaces should be preserved. */ +static void change_tab_indentation(ScintillaObject *sci, gint line, gboolean increase) +{ + gint pos = sci_get_position_from_line(sci, line); + + if (increase) + { + sci_insert_text(sci, pos, "\t"); + } + else + { + if (sci_get_char_at(sci, pos) == '\t') + { + sci_set_selection(sci, pos, pos + 1); + sci_replace_sel(sci, ""); + } + } +} + + +static void editor_change_line_indent(GeanyEditor *editor, gint line, gboolean increase) +{ + const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor); + ScintillaObject *sci = editor->sci; + + if (iprefs->type == GEANY_INDENT_TYPE_TABS /* && iprefs->ignore_spaces */) + change_tab_indentation(sci, line, increase); + else + { + gint width = sci_get_line_indentation(sci, line); + + width += increase ? iprefs->width : -iprefs->width; + sci_set_line_indentation(sci, line, width); + } +} + + +void editor_indent(GeanyEditor *editor, gboolean increase) +{ + ScintillaObject *sci = editor->sci; + gint start, end; + gint line, lstart, lend; + + if (sci_get_lines_selected(sci) <= 1) + { + line = sci_get_current_line(sci); + editor_change_line_indent(editor, line, increase); + return; + } + editor_select_lines(editor, FALSE); + start = sci_get_selection_start(sci); + end = sci_get_selection_end(sci); + lstart = sci_get_line_from_position(sci, start); + lend = sci_get_line_from_position(sci, end); + + for (line = lstart; line < lend; line++) + { + editor_change_line_indent(editor, line, increase); + } + if (lend > lstart) + { + sci_set_selection_start(sci, start); + end = sci_get_position_from_line(sci, lend); + sci_set_selection_end(sci, end); + editor_select_lines(editor, FALSE); + } + else + { + sci_set_current_line(sci, lstart); + } +} + +
Modified: trunk/src/editor.h =================================================================== --- trunk/src/editor.h 2009-05-18 15:01:21 UTC (rev 3801) +++ trunk/src/editor.h 2009-05-18 15:17:48 UTC (rev 3802) @@ -195,6 +195,8 @@
void editor_insert_alternative_whitespace(GeanyEditor *editor);
+void editor_indent(GeanyEditor *editor, gboolean increase); + void editor_smart_line_indentation(GeanyEditor *editor, gint pos);
void editor_indentation_by_one_space(GeanyEditor *editor, gint pos, gboolean decrease);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.