Revision: 932 http://svn.sourceforge.net/geany/?rev=932&view=rev Author: ntrel Date: 2006-10-25 10:03:24 -0700 (Wed, 25 Oct 2006)
Log Message: ----------- When replacing tabs by space, prevent the scroll position changing, and fix a possible change of cursor position.
Modified Paths: -------------- trunk/ChangeLog trunk/src/document.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-10-25 14:48:07 UTC (rev 931) +++ trunk/ChangeLog 2006-10-25 17:03:24 UTC (rev 932) @@ -1,3 +1,10 @@ +2006-10-25 Nick Treleaven nick.treleaven@btinternet.com + + * src/document.c: + When replacing tabs by space, prevent the scroll position changing, + and fix a possible change of cursor position. + + 2006-10-25 Enrico Tröger enrico.troeger@uvena.de
* src/dialogs.c, src/dialogs.h, src/build.c, src/prefs.c, src/win32.c
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2006-10-25 14:48:07 UTC (rev 931) +++ trunk/src/document.c 2006-10-25 17:03:24 UTC (rev 932) @@ -1477,52 +1477,32 @@
void document_replace_tabs(gint idx) { - gint i, len, j = 0, k, tabs_amount = 0, tab_w, pos; - gchar *data, *text; + gint search_pos; + gint tab_len = sci_get_tab_width(doc_list[idx].sci); + gchar *tab_str; + struct TextToFind ttf;
- if (idx < 0 || ! doc_list[idx].is_valid) return; + if (! DOC_IDX_VALID(idx)) return;
- pos = sci_get_current_position(doc_list[idx].sci); - tab_w = sci_get_tab_width(doc_list[idx].sci); + sci_start_undo_action(doc_list[idx].sci); + ttf.chrg.cpMin = 0; + ttf.chrg.cpMax = sci_get_length(doc_list[idx].sci); + ttf.lpstrText = (gchar*)"\t"; + tab_str = g_strnfill(tab_len, ' ');
- // get the text - len = sci_get_length(doc_list[idx].sci) + 1; - data = g_malloc(len); - sci_get_text(doc_list[idx].sci, len, data); - - for (i = 0; i < len; i++) if (data[i] == 9) tabs_amount++; - - // if there are no tabs, just return and leave the content untouched - if (tabs_amount == 0) + while (TRUE) { - g_free(data); - return; - } + search_pos = sci_find_text(doc_list[idx].sci, SCFIND_MATCHCASE, &ttf); + if (search_pos == -1) break;
- text = g_malloc(len + (tabs_amount * (tab_w - 1)) + 1); - - for (i = 0; i < len; i++) - { - if (data[i] == 9) - { - // increase cursor position to keep it at same position - if (pos > i) pos += 3; - - for (k = 0; k < tab_w; k++) text[j++] = 32; - } - else - { - text[j++] = data[i]; - } + sci_target_start(doc_list[idx].sci, search_pos); + sci_target_end(doc_list[idx].sci, search_pos + 1); + sci_target_replace(doc_list[idx].sci, tab_str, FALSE); + ttf.chrg.cpMin = search_pos + tab_len - 1; // next search starts after replacement + ttf.chrg.cpMax += tab_len - 1; // update end of range now text has changed } - text[j] = '\0'; - - geany_debug("Replacing Tabs: tabs_amount: %d, text len: %d, j: %d", tabs_amount, len, j); - sci_set_text(doc_list[idx].sci, text); - sci_set_current_position(doc_list[idx].sci, pos); - - g_free(data); - g_free(text); + sci_end_undo_action(doc_list[idx].sci); + g_free(tab_str); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.