summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Williams <andy@andywilliams.me>2016-12-03 00:55:02 +0000
committerAndy Williams <andy@andywilliams.me>2016-12-03 00:56:25 +0000
commitad5bce5cbdd5a332c2568c75d5404c3e22613b4c (patch)
tree01902c653f7439e05a768989baae7dc0a05dc845
parent6e8280a54056ee173f336b9d0c0a67b851abc57a (diff)
downloadefl-ad5bce5cbdd5a332c2568c75d5404c3e22613b4c.tar.gz
elm_code: Add indentation for matching braces
Summary: when type closing brace, it find matching braces and then indent. Test Plan: 1. run elementry_test - Code Editor or Edi. 2. Type some code with braces. 3. Check that closing braces have correct indent. Reviewers: ajwillia.ms Subscribers: cedric, jpeg Differential Revision: https://phab.enlightenment.org/D4444
-rw-r--r--src/lib/elementary/elm_code_indent.c40
-rw-r--r--src/lib/elementary/elm_code_indent.h2
-rw-r--r--src/lib/elementary/elm_code_widget.c32
-rw-r--r--src/tests/elementary/elm_code_test_indent.c38
4 files changed, 110 insertions, 2 deletions
diff --git a/src/lib/elementary/elm_code_indent.c b/src/lib/elementary/elm_code_indent.c
index 7b3d8b11ac..b1b13d32b6 100644
--- a/src/lib/elementary/elm_code_indent.c
+++ b/src/lib/elementary/elm_code_indent.c
@@ -70,3 +70,43 @@ elm_code_line_indent_get(const char *prevtext, unsigned int prevlength)
return buf;
}
+EAPI char *
+elm_code_line_indent_matching_braces_get(Elm_Code_Line *line)
+{
+ Elm_Code_File *file;
+ int stack, row;
+ unsigned int length, count = 0;
+ const char *content;
+ char *buf, *ptr;
+
+ file = line->file;
+ stack = 0;
+ row = line->number - 1;
+ while (row > 0)
+ {
+ line = elm_code_file_line_get(file, row);
+ content = elm_code_line_text_get(line, &length);
+ if (memchr(content, '{', length)) stack--;
+ else if (memchr(content, '}', length)) stack++;
+
+ if (stack < 0)
+ {
+ if (length == 0) return strdup("");
+ ptr = (char *)content;
+ while (count < length)
+ {
+ if (!_elm_code_text_char_is_whitespace(*ptr))
+ break;
+
+ count++;
+ ptr++;
+ }
+ buf = malloc(sizeof(char) * (count + 1));
+ memset(buf, ' ', count);
+ buf[count] = '\0';
+ return buf;
+ }
+ row--;
+ }
+ return strdup("");
+}
diff --git a/src/lib/elementary/elm_code_indent.h b/src/lib/elementary/elm_code_indent.h
index 2bbb5a105c..1cf889123b 100644
--- a/src/lib/elementary/elm_code_indent.h
+++ b/src/lib/elementary/elm_code_indent.h
@@ -22,6 +22,8 @@ extern "C" {
EAPI char *elm_code_line_indent_get(const char *prevtext, unsigned int prevlength);
+EAPI char *elm_code_line_indent_matching_braces_get(Elm_Code_Line *line);
+
/**
* @}
*/
diff --git a/src/lib/elementary/elm_code_widget.c b/src/lib/elementary/elm_code_widget.c
index cca84656f9..a05cf32591 100644
--- a/src/lib/elementary/elm_code_widget.c
+++ b/src/lib/elementary/elm_code_widget.c
@@ -775,7 +775,7 @@ _popup_menu_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
(pd->hoversel, "Copy", NULL, ELM_ICON_NONE,
_popup_menu_copy_cb, obj);
if (pd->editable)
- {
+ {
elm_hoversel_item_add
(pd->hoversel, "Paste", NULL, ELM_ICON_NONE,
_popup_menu_paste_cb, obj);
@@ -1217,7 +1217,8 @@ _elm_code_widget_text_at_cursor_insert_do(Elm_Code_Widget *widget, const char *t
Elm_Code *code;
Elm_Code_Line *line;
Elm_Code_Widget_Change_Info *change;
- unsigned int row, col, position, col_width;
+ unsigned int row, col, position, col_width, curlen, indent, count;
+ char *curtext, *leading;
_elm_code_widget_delete_selection(widget);
code = elm_obj_code_widget_code_get(widget);
@@ -1229,6 +1230,33 @@ _elm_code_widget_text_at_cursor_insert_do(Elm_Code_Widget *widget, const char *t
row = elm_code_file_lines_get(code->file);
line = elm_code_file_line_get(code->file, row);
}
+ if (text[0] == '}')
+ {
+ curtext = (char *)elm_code_line_text_get(line, &curlen);
+
+ count = 0;
+ while (count < curlen)
+ {
+ if (!_elm_code_text_char_is_whitespace(*curtext))
+ break;
+
+ count++;
+ curtext++;
+ }
+
+ if (count + 1 == col)
+ {
+ leading = elm_code_line_indent_matching_braces_get(line);
+ elm_code_line_text_leading_whitespace_strip(line);
+ elm_code_line_text_insert(line, 0, leading, strlen(leading));
+
+ indent = elm_obj_code_widget_line_text_column_width_to_position(
+ widget, line, strlen(leading));
+ elm_obj_code_widget_cursor_position_set(widget, indent, row);
+ elm_obj_code_widget_cursor_position_get(widget, &col, &row);
+ free(leading);
+ }
+ }
position = elm_code_widget_line_text_position_for_column_get(widget, line, col);
elm_code_line_text_insert(line, position, text, length);
diff --git a/src/tests/elementary/elm_code_test_indent.c b/src/tests/elementary/elm_code_test_indent.c
index 38ee360cc7..4b71556b37 100644
--- a/src/tests/elementary/elm_code_test_indent.c
+++ b/src/tests/elementary/elm_code_test_indent.c
@@ -60,9 +60,47 @@ START_TEST (elm_code_indent_simple_braces)
}
END_TEST
+START_TEST (elm_code_indent_matching_braces)
+{
+ Elm_Code_File *file;
+ Elm_Code_Line *line;
+ Elm_Code *code;
+ const char *str;
+ unsigned int row;
+
+ elm_init(1, NULL);
+ code = elm_code_create();
+ file = elm_code_file_new(code);
+
+ line = elm_code_file_line_append(file, " if ()", 8, NULL);
+ str = elm_code_line_indent_matching_braces_get(line);
+ ck_assert_str_eq("", str);
+
+ line = elm_code_file_line_append(file, " {", 6, NULL);
+ str = elm_code_line_indent_matching_braces_get(line);
+ ck_assert_str_eq(" ", str);
+
+ line = elm_code_file_line_append(file, " if (){", 14, NULL);
+ str = elm_code_line_indent_matching_braces_get(line;
+ ck_assert_str_eq(" ", str);
+
+ line = elm_code_file_line_append(file, " }", 9, NULL);
+ str = elm_code_line_indent_matching_braces_get(line);
+ ck_assert_str_eq(" ", str);
+
+ line = elm_code_file_line_append(file, " }", 6, NULL);
+ str = elm_code_line_indent_matching_braces_get(line);
+ ck_assert_str_eq("", str);
+
+ elm_code_free(code);
+ elm_shutdown();
+}
+END_TEST
+
void elm_code_test_indent(TCase *tc)
{
tcase_add_test(tc, elm_code_indent_whitespace_test);
tcase_add_test(tc, elm_code_indent_comments_test);
tcase_add_test(tc, elm_code_indent_simple_braces);
+ tcase_add_test(tc, elm_code_indent_matching_braces);
}