Revision: 2894 http://geany.svn.sourceforge.net/geany/?rev=2894&view=rev Author: ntrel Date: 2008-08-18 15:58:36 +0000 (Mon, 18 Aug 2008)
Log Message: ----------- Support detecting 'Tabs and Spaces' indent mode when opening a file.
Modified Paths: -------------- trunk/ChangeLog trunk/src/document.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-08-18 10:36:15 UTC (rev 2893) +++ trunk/ChangeLog 2008-08-18 15:58:36 UTC (rev 2894) @@ -1,3 +1,9 @@ +2008-08-18 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/document.c: + Support detecting 'Tabs and Spaces' indent mode when opening a file. + + 2008-08-18 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* scintilla/Makefile.am:
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2008-08-18 10:36:15 UTC (rev 2893) +++ trunk/src/document.c 2008-08-18 15:58:36 UTC (rev 2894) @@ -883,6 +883,36 @@ }
+/* Count lines that start with a hard tab then a soft tab. */ +static gboolean detect_tabs_and_spaces(GeanyEditor *editor) +{ + const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor); + ScintillaObject *sci = editor->sci; + gsize count = 0; + struct TextToFind ttf; + gchar *soft_tab = g_strnfill(iprefs->width, ' '); + gchar *regex = g_strconcat("^\t", soft_tab, NULL); + + g_free(soft_tab); + + ttf.chrg.cpMin = 0; + ttf.chrg.cpMax = sci_get_length(sci); + ttf.lpstrText = regex; + while (1) + { + gint pos; + + pos = sci_find_text(sci, SCFIND_REGEXP, &ttf); + if (pos == -1) + break; /* no more matches */ + count++; + ttf.chrg.cpMin = ttf.chrgText.cpMax + 1; /* search after this match */ + } + g_free(regex); + return count > sci_get_line_count(sci) * 0.02; +} + + static GeanyIndentType detect_indent_type(GeanyEditor *editor) { const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor); @@ -891,8 +921,7 @@ gboolean use_tabs; gsize tabs = 0, spaces = 0;
- /* TODO: tabs & spaces detection */ - if (iprefs->type == GEANY_INDENT_TYPE_BOTH) + if (detect_tabs_and_spaces(editor)) return GEANY_INDENT_TYPE_BOTH;
for (line = 0; line < sci_get_line_count(sci); line++) @@ -933,21 +962,36 @@ case GEANY_FILETYPES_MAKE: /* force using tabs for indentation for Makefiles */ editor_set_indent_type(editor, GEANY_INDENT_TYPE_TABS); - break; + return; case GEANY_FILETYPES_F77: /* force using spaces for indentation for Fortran 77 */ editor_set_indent_type(editor, GEANY_INDENT_TYPE_SPACES); - break; - default: - if (iprefs->detect_type) - { /* detect & set tabs/spaces */ - GeanyIndentType type = detect_indent_type(editor); + return; + } + if (iprefs->detect_type) + { + GeanyIndentType type = detect_indent_type(editor);
- if (type != iprefs->type) - ui_set_statusbar(TRUE, _("Setting %s indentation mode."), - (type == GEANY_INDENT_TYPE_TABS) ? _("Tabs") : _("Spaces")); - editor_set_indent_type(editor, type); + if (type != iprefs->type) + { + const gchar *name = NULL; + + switch (type) + { + case GEANY_INDENT_TYPE_SPACES: + name = _("Spaces"); + break; + case GEANY_INDENT_TYPE_TABS: + name = _("Tabs"); + break; + case GEANY_INDENT_TYPE_BOTH: + name = _("Tabs and Spaces"); + break; } + ui_set_statusbar(TRUE, _("Setting %s indentation mode for %s."), name, + DOC_FILENAME(editor->document)); + } + editor_set_indent_type(editor, type); } }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.