ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=ad5bce5cbdd5a332c2568c75d5404c3e22613b4c

commit ad5bce5cbdd5a332c2568c75d5404c3e22613b4c
Author: Andy Williams <a...@andywilliams.me>
Date:   Sat Dec 3 00:55:02 2016 +0000

    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
---
 src/lib/elementary/elm_code_indent.c        | 40 +++++++++++++++++++++++++++++
 src/lib/elementary/elm_code_indent.h        |  2 ++
 src/lib/elementary/elm_code_widget.c        | 32 +++++++++++++++++++++--
 src/tests/elementary/elm_code_test_indent.c | 38 +++++++++++++++++++++++++++
 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 7b3d8b1..b1b13d3 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 2bbb5a1..1cf8891 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 cca8465..a05cf32 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 38ee360..4b71556 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);
 }

-- 


Reply via email to