Revision: 4845 http://geany.svn.sourceforge.net/geany/?rev=4845&view=rev Author: ntrel Date: 2010-04-21 17:04:31 +0000 (Wed, 21 Apr 2010)
Log Message: ----------- Fix Class Builder plugin to use correct indentation instead of always tabs. Make editor_insert_text_block() only replace leading tabs for the 'Tabs' indent type; also group edits for undo.
Modified Paths: -------------- trunk/ChangeLog trunk/plugins/classbuilder.c trunk/src/editor.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2010-04-21 16:58:02 UTC (rev 4844) +++ trunk/ChangeLog 2010-04-21 17:04:31 UTC (rev 4845) @@ -1,3 +1,16 @@ +2010-04-21 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/templates.c, doc/geany.txt, doc/geany.html: + Support {ob} and {cb} in fileheader and file templates; they are + replaced last with { and }. This allows 'escaping' of wildcard + strings (fixes #2937008). + * src/editor.c, plugins/classbuilder.c: + Fix Class Builder plugin to use correct indentation instead of + always tabs. + Make editor_insert_text_block() only replace leading tabs for the + 'Tabs' indent type; also group edits for undo. + + 2010-04-19 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* tagmanager/pascal.c:
Modified: trunk/plugins/classbuilder.c =================================================================== --- trunk/plugins/classbuilder.c 2010-04-21 16:58:02 UTC (rev 4844) +++ trunk/plugins/classbuilder.c 2010-04-21 17:04:31 UTC (rev 4845) @@ -704,7 +704,7 @@ { text = get_template_class_source(class_info); doc = document_new_file(class_info->source, NULL, NULL); - sci_set_text(doc->editor->sci, text); + editor_insert_text_block(doc->editor, text, 0, -1, 0, TRUE); g_free(text); }
@@ -712,7 +712,7 @@ { text = get_template_class_header(class_info); doc = document_new_file(class_info->header, NULL, NULL); - sci_set_text(doc->editor->sci, text); + editor_insert_text_block(doc->editor, text, 0, -1, 0, TRUE); g_free(text); }
Modified: trunk/src/editor.c =================================================================== --- trunk/src/editor.c 2010-04-21 16:58:02 UTC (rev 4844) +++ trunk/src/editor.c 2010-04-21 17:04:31 UTC (rev 4845) @@ -44,6 +44,12 @@ #include "SciLexer.h" #include "geany.h"
+#ifdef HAVE_REGEX_H +# include <regex.h> +#else +# include "gnuregex.h" +#endif + #include "support.h" #include "editor.h" #include "document.h" @@ -2112,9 +2118,40 @@ }
-/** Inserts text, replacing \t tab chars (@c 0x9) with the correct indent - * width, and \n newline chars (@c 0xA) with the correct line ending string - * for the document. +static void replace_leading_tabs(GString *str, const gchar *whitespace) +{ + regex_t regex; + gssize pos; + regmatch_t matches[2]; + gchar *ptr; + + if (regcomp(®ex, "^ *(\t)", 0) != 0) + { + g_return_if_fail(FALSE); + } + ptr = str->str; + while (ptr) + { + if (regexec(®ex, ptr, + G_N_ELEMENTS(matches), matches, 0) != 0) + break; + + pos = matches[1].rm_so; + g_return_if_fail(pos >= 0); + pos += ptr - str->str; + g_string_erase(str, pos, 1); + g_string_insert(str, pos, whitespace); + ptr = str->str + pos + strlen(whitespace); + } + regfree(®ex); +} + + +/** Inserts text, replacing \t tab chars (@c 0x9) and \n newline chars (@c 0xA) + * accordingly for the document. + * - Leading tabs are replaced with the correct indentation. + * - Non-leading tabs are replaced with spaces (except when using 'Tabs' indent type). + * - Newline chars are replaced with the correct line ending string. * This is very useful for inserting code without having to handle the indent * type yourself (Tabs & Spaces mode can be tricky). * @param editor Editor. @@ -2123,11 +2160,10 @@ * @param cursor_index If >= 0, the index into @a text to place the cursor. * @param newline_indent_size Indentation size (in spaces) to insert for each newline; use * -1 to read the indent size from the line with @a insert_pos on it. - * @param replace_newlines Whether to replace newlines in text or not. If - * newlines have been replaced before, this should be false, to avoid multiple - * replacements of newlines, which is error prone on Windows. - * @warning Make sure all \t tab chars in @a text are intended as indent widths, - * not hard tabs, as these might not be preserved. + * @param replace_newlines Whether to replace newlines. If + * newlines have been replaced already, this should be false, to avoid errors e.g. on Windows. + * @warning Make sure all \t tab chars in @a text are intended as indent widths or alignment, + * not hard tabs, as those won't be preserved. * @note This doesn't scroll the cursor in view afterwards. **/ void editor_insert_text_block(GeanyEditor *editor, const gchar *text, gint insert_pos, gint cursor_index, gint newline_indent_size, gboolean replace_newlines) @@ -2139,6 +2175,7 @@ GString *buf; const gchar cur_marker[] = "__GEANY_CURSOR_MARKER__"; const gchar *eol = editor_get_eol_char(editor); + const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
g_return_if_fail(text); g_return_if_fail(editor != NULL); @@ -2173,11 +2210,16 @@ if (replace_newlines) utils_string_replace_all(buf, "\n", eol);
- /* transform tabs into indent widths (in spaces) */ - whitespace = g_strnfill(editor_get_indent_prefs(editor)->width, ' '); - utils_string_replace_all(buf, "\t", whitespace); + /* transform leading tabs into indent widths (in spaces) */ + whitespace = g_strnfill(iprefs->width, ' '); + replace_leading_tabs(buf, whitespace); + /* remaining tabs are for alignment */ + if (iprefs->type != GEANY_INDENT_TYPE_TABS) + utils_string_replace_all(buf, "\t", whitespace); g_free(whitespace);
+ sci_start_undo_action(sci); + if (cursor_index >= 0) { gint idx = utils_strpos(buf->str, cur_marker); @@ -2195,6 +2237,7 @@ fix_line_indents(editor, line_start, line_end); snippet_cursor_insert_pos = sci_get_current_position(sci);
+ sci_end_undo_action(sci); g_string_free(buf, TRUE); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.