diff --git a/src/lib/syntax_indent.c b/src/lib/syntax_indent.c index f040c43..176e643 100644 --- a/src/lib/syntax_indent.c +++ b/src/lib/syntax_indent.c @@ -94,6 +94,75 @@ indent_insert_br_case(indent_data *id) elm_entry_entry_insert(entry, p); } +static void +indent_insert_tab_case(indent_data *id) +{ + Evas_Object *entry = id->entry; + Evas_Object *tb = elm_entry_textblock_get(entry); + Evas_Textblock_Cursor *cur_orig = evas_object_textblock_cursor_get(tb); + Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_new(tb); + char *utf8 = NULL; + int utf8_len = 0; + char *p = NULL; + Eina_Bool insert_indent_space = EINA_FALSE; + + //Remove inserted "". + evas_textblock_cursor_pos_set(cur, evas_textblock_cursor_pos_get(cur_orig)); + evas_textblock_cursor_char_prev(cur); + if (!strncmp(evas_textblock_cursor_content_get(cur), TAB, TAB_LEN)) + { + //Cancel added "" from redoundo. + redoundo_n_diff_cancel(id->rd, 1); + evas_textblock_cursor_char_delete(cur); + } + evas_textblock_cursor_pos_set(cur, evas_textblock_cursor_pos_get(cur_orig)); + + /* Spaces for indent are not required. + Insert spaces for tab. */ + int space = indent_space_get(id); + if (space <= 0) goto end; + + evas_textblock_cursor_paragraph_prev(cur); + evas_textblock_cursor_paragraph_next(cur); + utf8 = evas_textblock_cursor_range_text_get(cur, cur_orig, + EVAS_TEXTBLOCK_TEXT_PLAIN); + /* There is no paragraph. + Insert spaces for indent. */ + if (!utf8) + { + insert_indent_space = EINA_TRUE; + goto end; + } + + utf8_len = strlen(utf8); + /* Paragraph is shorter than spaces for indent. + Insert spaces for indent. */ + if (utf8_len < space) + insert_indent_space = EINA_TRUE; + +end: + if (insert_indent_space) + { + //Allocate spaces for indent. + p = alloca(space - utf8_len + 1); + memset(p, ' ', space - utf8_len); + p[space - utf8_len] = '\0'; + } + else + { + //Allocate spaces for tab. + p = alloca(TAB_SPACE + 1); + memset(p, ' ', TAB_SPACE); + p[TAB_SPACE] = '\0'; + } + + redoundo_text_push(id->rd, p, elm_entry_cursor_pos_get(entry), 0, EINA_TRUE); + elm_entry_entry_insert(entry, p); + + if (utf8) free(utf8); + evas_textblock_cursor_free(cur); +} + static void indent_insert_bracket_case(indent_data *id, int cur_line) { @@ -941,6 +1010,11 @@ indent_insert_apply(indent_data *id, const char *insert, int cur_line) indent_insert_br_case(id); return 1; } + else if (!strcmp(insert, TAB)) + { + indent_insert_tab_case(id); + return 0; + } else if (!strcmp(insert, QUOT)) return 0; else if (!strcmp(insert, LESS))