Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Fri, 28 Sep 2012 14:19:06 Commit: 972b34e49ab5db30ae07b099e89c19607e5f581b https://github.com/geany/geany/commit/972b34e49ab5db30ae07b099e89c19607e5f58...
Log Message: ----------- Keep caret and anchor position upon indent and unindent
Closes #3167355.
Modified Paths: -------------- src/editor.c
Modified: src/editor.c 68 files changed, 40 insertions(+), 28 deletions(-) =================================================================== @@ -4983,42 +4983,54 @@ static void editor_change_line_indent(GeanyEditor *editor, gint line, gboolean i void editor_indent(GeanyEditor *editor, gboolean increase) { ScintillaObject *sci = editor->sci; - gint start, end; - gint line, lstart, lend; + gint caret_pos, caret_line, caret_offset, caret_indent_pos, caret_line_len; + gint anchor_pos, anchor_line, anchor_offset, anchor_indent_pos, anchor_line_len; + + /* backup information needed to restore caret and anchor */ + caret_pos = sci_get_current_position(sci); + anchor_pos = SSM(sci, SCI_GETANCHOR, 0, 0); + caret_line = sci_get_line_from_position(sci, caret_pos); + anchor_line = sci_get_line_from_position(sci, anchor_pos); + caret_offset = caret_pos - sci_get_position_from_line(sci, caret_line); + anchor_offset = anchor_pos - sci_get_position_from_line(sci, anchor_line); + caret_indent_pos = sci_get_line_indent_position(sci, caret_line); + anchor_indent_pos = sci_get_line_indent_position(sci, anchor_line); + caret_line_len = sci_get_line_length(sci, caret_line); + anchor_line_len = sci_get_line_length(sci, anchor_line);
if (sci_get_lines_selected(sci) <= 1) { - line = sci_get_current_line(sci); - editor_change_line_indent(editor, line, increase); - return; + editor_change_line_indent(editor, sci_get_current_line(sci), increase); } - 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); - if (end == sci_get_length(sci)) - lend++; /* for last line with text on it */ - - sci_start_undo_action(sci); - for (line = lstart; line < lend; line++) + else { - editor_change_line_indent(editor, line, increase); - } - sci_end_undo_action(sci); + gint start, end; + gint line, lstart, lend;
- /* set cursor/selection */ - 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); + 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); + if (end == sci_get_length(sci)) + lend++; /* for last line with text on it */ + + sci_start_undo_action(sci); + for (line = lstart; line < lend; line++) + { + editor_change_line_indent(editor, line, increase); + } + sci_end_undo_action(sci); } - else - { - sci_set_current_line(sci, lstart); - } + + /* restore caret and anchor position */ + if (caret_pos >= caret_indent_pos) + caret_offset += sci_get_line_length(sci, caret_line) - caret_line_len; + if (anchor_pos >= anchor_indent_pos) + anchor_offset += sci_get_line_length(sci, anchor_line) - anchor_line_len; + + SSM(sci, SCI_SETCURRENTPOS, sci_get_position_from_line(sci, caret_line) + caret_offset, 0); + SSM(sci, SCI_SETANCHOR, sci_get_position_from_line(sci, anchor_line) + anchor_offset, 0); }
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: TBD).