ajwillia-ms pushed a commit to branch master.

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

commit 1485cf9df5f0a601fdfb17c9647168b8a47ef07f
Author: Andy Williams <a...@andywilliams.me>
Date:   Sat Mar 24 10:39:32 2018 +0000

    elm_code: (cherry-pick) Support indentation styles that are purely tab based
    
    read: Allow non-EFL style indentation.
    This is off by default but is switched on if you turn 'tabs insert spaces' 
off
---
 src/bin/elementary/test.c                   |  6 ++-
 src/bin/elementary/test_code.c              | 50 +++++++++++++++++++++++
 src/lib/elementary/elm_code.c               |  1 +
 src/lib/elementary/elm_code_common.h        |  1 +
 src/lib/elementary/elm_code_indent.c        | 25 +++++++-----
 src/lib/elementary/elm_code_widget.c        |  2 +
 src/tests/elementary/elm_code_test_indent.c | 61 ++++++++++++++++++++++++++++-
 7 files changed, 133 insertions(+), 13 deletions(-)

diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c
index e4c65b13b9..8d8d9701d5 100644
--- a/src/bin/elementary/test.c
+++ b/src/bin/elementary/test.c
@@ -332,6 +332,7 @@ void test_colorclass(void *data, Evas_Object *obj, void 
*event_info);
 void test_code_welcome(void *data, Evas_Object *obj, void *event_info);
 void test_code_editor(void *data, Evas_Object *obj, void *event_info);
 void test_code_syntax(void *data, Evas_Object *obj, void *event_info);
+void test_code_syntax_tabbed(void *data, Evas_Object *obj, void *event_info);
 void test_code_mirror(void *data, Evas_Object *obj, void *event_info);
 void test_code_log(void *data, Evas_Object *obj, void *event_info);
 void test_code_diff(void *data, Evas_Object *obj, void *event_info);
@@ -848,9 +849,10 @@ add_tests:
    ADD_TEST_EO(NULL, "Entries", "Efl.Ui.Tags", test_ui_tags);
 
    //------------------------------//
+   ADD_TEST(NULL, "Advanced Entries", "Code Entry Markup", test_code_welcome);
+   ADD_TEST(NULL, "Advanced Entries", "Code Editor", test_code_editor);
    ADD_TEST(NULL, "Advanced Entries", "Code Syntax", test_code_syntax);
-   ADD_TEST(NULL, "Advanced Entries", "Entry Markup", test_code_welcome);
-   ADD_TEST(NULL, "Advanced Entries", "Text Editor", test_code_editor);
+   ADD_TEST(NULL, "Advanced Entries", "Code Syntax (Tabbed)", 
test_code_syntax_tabbed);
    ADD_TEST(NULL, "Advanced Entries", "Mirrored Editor", test_code_mirror);
    ADD_TEST(NULL, "Advanced Entries", "Logger", test_code_log);
    ADD_TEST(NULL, "Advanced Entries", "Diff Comparison", test_code_diff);
diff --git a/src/bin/elementary/test_code.c b/src/bin/elementary/test_code.c
index b6dad3ea2f..bb010ce5e6 100644
--- a/src/bin/elementary/test_code.c
+++ b/src/bin/elementary/test_code.c
@@ -156,6 +156,40 @@ _elm_code_test_syntax_setup(Evas_Object *parent)
 }
 
 static Evas_Object *
+_elm_code_test_syntax_tabbed_setup(Evas_Object *parent)
+{
+   Elm_Code *code;
+   Elm_Code_Widget *widget;
+
+   code = elm_code_create();
+   code->config.indent_style_efl = EINA_FALSE;
+   widget = efl_add(ELM_CODE_WIDGET_CLASS, parent, 
elm_obj_code_widget_code_set(efl_added, code));
+   elm_obj_code_widget_editable_set(widget, EINA_TRUE);
+   elm_obj_code_widget_syntax_enabled_set(widget, EINA_TRUE);
+   elm_obj_code_widget_code_get(widget)->file->mime = "text/x-csrc";
+   elm_obj_code_widget_show_whitespace_set(widget, EINA_TRUE);
+   elm_obj_code_widget_line_numbers_set(widget, EINA_TRUE);
+   elm_obj_code_widget_tab_inserts_spaces_set(widget, EINA_FALSE);
+
+   _append_line(code->file, "#include <stdio.h>");
+   _append_line(code->file, "int main(int argc, char **argv)");
+   _append_line(code->file, "{");
+   _append_line(code->file, "\t// display a welcome greeting");
+   _append_line(code->file, "\tif (argc > 0)");
+   _append_line(code->file, "\t\tprintf(\"Hello, %s!\\n\", argv[0]);");
+   _append_line(code->file, "\telse");
+   _append_line(code->file, "\t\tprintf(\"Hello, World!\\n\");");
+   _append_line(code->file, "\treturn 0;");
+   _append_line(code->file, "}");
+
+   evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(widget);
+
+   return widget;
+}
+
+static Evas_Object *
 _elm_code_test_mirror_setup(Elm_Code *code, char *font_name, Evas_Object 
*parent)
 {
    Elm_Code_Widget *widget;
@@ -263,6 +297,22 @@ test_code_syntax(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *eve
 }
 
 void
+test_code_syntax_tabbed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UNUSED)
+{
+   Evas_Object *win, *screen;
+
+   win = _test_code_win_create("code-syntax-tabbed", "Code Syntax (Tabbed)");
+   screen = elm_box_add(win);
+   evas_object_size_hint_weight_set(screen, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+   elm_box_pack_end(screen, _elm_code_test_syntax_tabbed_setup(screen));
+   elm_win_resize_object_add(win, screen);
+   evas_object_show(screen);
+
+   evas_object_show(win);
+}
+
+
+void
 test_code_log(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
    Evas_Object *win, *screen, *o, *code;
diff --git a/src/lib/elementary/elm_code.c b/src/lib/elementary/elm_code.c
index 38017b7cfb..cfe1f7edf3 100644
--- a/src/lib/elementary/elm_code.c
+++ b/src/lib/elementary/elm_code.c
@@ -21,6 +21,7 @@ elm_code_create(void)
    Elm_Code *ret;
 
    ret = calloc(1, sizeof(Elm_Code));
+   ret->config.indent_style_efl = EINA_TRUE;
 
    // create an in-memory backing for this elm_code by default
    elm_code_file_new(ret);
diff --git a/src/lib/elementary/elm_code_common.h 
b/src/lib/elementary/elm_code_common.h
index 2c0c88e922..925721f9c6 100644
--- a/src/lib/elementary/elm_code_common.h
+++ b/src/lib/elementary/elm_code_common.h
@@ -67,6 +67,7 @@ extern "C" {
 struct _Elm_Code_Config
 {
    Eina_Bool trim_whitespace;
+   Eina_Bool indent_style_efl;
 };
 
 struct _Elm_Code
diff --git a/src/lib/elementary/elm_code_indent.c 
b/src/lib/elementary/elm_code_indent.c
index 756186823b..9ce4cb0962 100644
--- a/src/lib/elementary/elm_code_indent.c
+++ b/src/lib/elementary/elm_code_indent.c
@@ -41,6 +41,8 @@ elm_code_line_indent_get(Elm_Code_Line *line)
    unsigned int prevlength, count = 0;
    char *buf, *ptr;
    char next, last;
+   const char *indent = "\t";
+   Eina_Bool eflindent = ((Elm_Code 
*)line->file->parent)->config.indent_style_efl;
 
    if (line->number <= 1)
      return strdup("");
@@ -62,10 +64,14 @@ elm_code_line_indent_get(Elm_Code_Line *line)
    strncpy(buf, prevtext, count);
    buf[count] = '\0';
 
-   if (elm_code_line_indent_startswith_keyword(prevline))
+   if (eflindent)
      {
-        strcpy(buf + count, "  ");
-        count += 2;
+        indent = "   ";
+        if (elm_code_line_indent_startswith_keyword(prevline))
+          {
+             strcpy(buf + count, "  ");
+             count += 2;
+          }
      }
 
    if (count < prevlength)
@@ -97,17 +103,16 @@ elm_code_line_indent_get(Elm_Code_Line *line)
              else
                strcpy(buf + count, "*");
           }
-        // VERY simple handling of braces
-        else if (last == '{')
+        // Simple handling of braces
+        else if (last == '{' || (!eflindent && 
elm_code_line_indent_startswith_keyword(prevline)))
           {
-             strcpy(buf + count, "   ");
+             strcpy(buf + count, indent);
           }
         else if (last == '}')
           {
-             if (count >= 2)
-               buf[count-2] = '\0';
-             else if (count >= 1)
-               buf[count-1] = '\0';
+             unsigned int offset = strlen(indent) - 1;
+             if (count >= offset)
+               buf[count-offset] = '\0';
           }
      }
    return buf;
diff --git a/src/lib/elementary/elm_code_widget.c 
b/src/lib/elementary/elm_code_widget.c
index c39ffe6f9d..d34b40379e 100644
--- a/src/lib/elementary/elm_code_widget.c
+++ b/src/lib/elementary/elm_code_widget.c
@@ -2231,6 +2231,8 @@ _elm_code_widget_tab_inserts_spaces_set(Eo *obj 
EINA_UNUSED, Elm_Code_Widget_Dat
                                         Eina_Bool spaces)
 {
    pd->tab_inserts_spaces = spaces;
+   if (!spaces)
+     elm_code_widget_code_get(obj)->config.indent_style_efl = EINA_FALSE;
 }
 
 EOLIAN static Eina_Bool
diff --git a/src/tests/elementary/elm_code_test_indent.c 
b/src/tests/elementary/elm_code_test_indent.c
index 78c9160ede..6b564420f0 100644
--- a/src/tests/elementary/elm_code_test_indent.c
+++ b/src/tests/elementary/elm_code_test_indent.c
@@ -77,6 +77,7 @@ EFL_START_TEST (elm_code_indent_simple_braces)
    elm_init(1, args);
    code = elm_code_create();
    file = elm_code_file_new(code);
+   code->config.indent_style_efl = EINA_TRUE;
 
    _indent_check(file, "if() {", "     ");
    _indent_check(file, "}", "");
@@ -88,6 +89,26 @@ EFL_START_TEST (elm_code_indent_simple_braces)
 }
 EFL_END_TEST
 
+EFL_START_TEST (elm_code_indent_tab_simple_braces)
+{
+   Elm_Code *code;
+   Elm_Code_File *file;
+
+   elm_init(1, NULL);
+   code = elm_code_create();
+   file = elm_code_file_new(code);
+   code->config.indent_style_efl = EINA_FALSE;
+
+   _indent_check(file, "if() {", "\t");
+   _indent_check(file, "}", "");
+
+   _indent_check(file, "\t{", "\t\t");
+   _indent_check(file, "\t}", "\t");
+
+   elm_shutdown();
+}
+EFL_END_TEST
+
 EFL_START_TEST (elm_code_indent_matching_braces)
 {
    Elm_Code_File *file;
@@ -101,7 +122,7 @@ EFL_START_TEST (elm_code_indent_matching_braces)
    code = elm_code_create();
    file = elm_code_file_new(code);
 
-   elm_code_file_line_append(file, "", 8, NULL);
+   elm_code_file_line_append(file, "", 0, NULL);
    line = elm_code_file_line_get(file, 1);
 
    elm_code_file_line_insert(file, 1, "   if ()", 8, NULL);
@@ -110,14 +131,17 @@ EFL_START_TEST (elm_code_indent_matching_braces)
 
    elm_code_file_line_insert(file, 2, "     {", 6, NULL);
    str = elm_code_line_indent_matching_braces_get(line, &str_len);
+   ck_assert_int_eq(str_len, 5);
    ck_assert_strn_eq(str, "     ", str_len);
 
    elm_code_file_line_insert(file, 3, "        if (){", 14, NULL);
    str = elm_code_line_indent_matching_braces_get(line, &str_len);
+   ck_assert_int_eq(str_len, 8);
    ck_assert_strn_eq(str, "        ", str_len);
 
    elm_code_file_line_insert(file, 4, "        }", 9, NULL);
    str = elm_code_line_indent_matching_braces_get(line, &str_len);
+   ck_assert_int_eq(str_len, 5);
    ck_assert_strn_eq(str, "     ", str_len);
 
    elm_code_file_line_insert(file, 5, "     }", 6, NULL);
@@ -129,6 +153,39 @@ EFL_START_TEST (elm_code_indent_matching_braces)
 }
 EFL_END_TEST
 
+EFL_START_TEST (elm_code_indent_tab_matching_braces)
+{
+   Elm_Code_File *file;
+   Elm_Code_Line *line;
+   Elm_Code *code;
+   const char *str;
+   unsigned int str_len;
+
+   elm_init(1, NULL);
+   code = elm_code_create();
+   file = elm_code_file_new(code);
+
+   elm_code_file_line_append(file, "", 0, NULL);
+   line = elm_code_file_line_get(file, 1);
+
+   elm_code_file_line_insert(file, 1, "\tif ()", 6, NULL);
+   str = elm_code_line_indent_matching_braces_get(line, &str_len);
+   ck_assert_strn_eq(str, "", str_len);
+
+   elm_code_file_line_insert(file, 2, "\t{", 2, NULL);
+   str = elm_code_line_indent_matching_braces_get(line, &str_len);
+   ck_assert_int_eq(str_len, 1);
+   ck_assert_strn_eq(str, "\t", str_len);
+
+   elm_code_file_line_insert(file, 3, "\t}", 2, NULL);
+   str = elm_code_line_indent_matching_braces_get(line, &str_len);
+   ck_assert_strn_eq(str, "", str_len);
+
+   elm_code_free(code);
+   elm_shutdown();
+}
+END_TEST
+
 EFL_START_TEST (elm_code_indent_startswith_keyword)
 {
    Elm_Code_File *file;
@@ -170,7 +227,9 @@ 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_tab_simple_braces);
    tcase_add_test(tc, elm_code_indent_simple_braces);
    tcase_add_test(tc, elm_code_indent_matching_braces);
+   tcase_add_test(tc, elm_code_indent_tab_matching_braces);
    tcase_add_test(tc, elm_code_indent_startswith_keyword);
 }

-- 


Reply via email to