From 67709ae5360fdd565c6ddc3ed9c60680f0e5994a Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 5 Apr 2017 21:57:06 +0100 Subject: [PATCH] searchpanel: Update render to give more space for results Decouple the parsing from render a little bit more --- src/bin/edi_searchpanel.c | 169 +++++++++++++++++--------------------- 1 file changed, 77 insertions(+), 92 deletions(-) diff --git a/src/bin/edi_searchpanel.c b/src/bin/edi_searchpanel.c index 53434a6..60cdf71 100644 --- a/src/bin/edi_searchpanel.c +++ b/src/bin/edi_searchpanel.c @@ -21,17 +21,6 @@ static Ecore_Thread *_search_thread = NULL; static Eina_Bool _searching = EINA_FALSE; static char *_search_text = NULL; -static void -_edi_searchpanel_line_cb(void *data EINA_UNUSED, const Efl_Event *event) -{ - Elm_Code_Line *line; - - line = (Elm_Code_Line *)event->info; - - if (line->data) - line->status = ELM_CODE_STATUS_TYPE_ERROR; -} - static Eina_Bool _edi_searchpanel_config_changed_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) { @@ -46,73 +35,85 @@ _edi_searchpanel_line_clicked_cb(void *data EINA_UNUSED, const Efl_Event *event) Elm_Code_Line *line; const char *content; unsigned int length; - char *filename, *filename_end; - char *line_start, *line_end; - Eina_Bool success = EINA_FALSE; + int numlen; + char *path, *filename_end; + char *line_start, *line_end, *numstr; - filename_end = line_start = line_end = NULL; + line = (Elm_Code_Line *) event->info; + filename_end = line_start = NULL; + + path = strdup(line->data); + if (!path) return; - line = (Elm_Code_Line *)event->info; - if (!line) return; content = elm_code_line_text_get(line, &length); - if (!content) return; + if (!content) + return; - filename = strdup(content); - if (!filename) return; + filename_end = strchr(content, ':'); + if (!filename_end) + return; - filename_end = strchr(filename, ':'); - if (filename_end) - line_start = filename_end + 1; - if (line_start) - line_end = strchr(line_start, ' '); - if (line_end) - { - *filename_end = '\0'; - *line_end = '\0'; - success = EINA_TRUE; - } + line_start = filename_end + 1; + line_end = strchr(line_start, ' '); + if (!line_end) + return; - if (success) - { - edi_mainview_open_path(filename); - edi_mainview_goto(atoi(line_start)); - } - - free(filename); + numlen = line_end - line_start; + numstr = malloc((numlen + 1) * sizeof(char)); + strncpy(numstr, line_start, numlen); + numstr[numlen] = '\0'; + + edi_mainview_open_path(path); + edi_mainview_goto(atoi(numstr)); + + free(numstr); } -void _edi_searchpanel_search_project_file(const char *filename, const char *search_term) +char * +_edi_searchpanel_line_render(Elm_Code_Line *line, const char *path) { - Elm_Code *code; - Elm_Code_File *code_file; - Eina_List *item; - Elm_Code_Line *line; unsigned int len; const char *text; - char *tmp; + static char buf[1024]; static char data[1024]; + text = elm_code_line_text_get(line, &len); + if (!text) + return NULL; + + len++; + if (len > sizeof(data)) + len = sizeof(data); + + snprintf(data, len, "%s", text); + snprintf(buf, sizeof(buf), "%s:%d -> %s", ecore_file_file_get(path), line->number, data); + + return strdup(buf); +} + +void +_edi_searchpanel_search_project_file(const char *path, const char *search_term, Elm_Code *logger) +{ + Elm_Code *code; + Elm_Code_File *code_file; + Eina_List *item; + Elm_Code_Line *line; + char *text; + code = elm_code_create(); - code_file = elm_code_file_open(code, filename); + code_file = elm_code_file_open(code, path); EINA_LIST_FOREACH(code->file->lines, item, line) { int found = elm_code_line_text_strpos(line, search_term, 0); - if (found != ELM_CODE_TEXT_NOT_FOUND) + if (found != ELM_CODE_TEXT_NOT_FOUND) { - text = elm_code_line_text_get(line, &len); - if (text) - { - if (line->length >= sizeof(data)) - len = sizeof(data); - else - len = line->length + 1; - snprintf(data, len, "%s", text); - snprintf(buf, sizeof(buf), "%s:%d -> %s", filename, line->number, data); - tmp = strdup(buf); - ecore_thread_feedback(_search_thread, tmp); - } + text = _edi_searchpanel_line_render(line, path); + ecore_thread_main_loop_begin(); + elm_code_file_line_append(logger->file, text, strlen(text), strdup(path)); + ecore_thread_main_loop_end(); + free(text); } } @@ -139,7 +140,7 @@ _file_ignore(const char *filename) } void -_edi_searchpanel_search_project(const char *directory, const char *search_term) +_edi_searchpanel_search_project(const char *directory, const char *search_term, Elm_Code *logger) { Eina_List *files, *item; char *file; @@ -155,9 +156,9 @@ _edi_searchpanel_search_project(const char *directory, const char *search_term) if (!edi_file_path_hidden(path)) { if (ecore_file_is_dir(path)) - _edi_searchpanel_search_project(path, search_term); + _edi_searchpanel_search_project(path, search_term, logger); else - _edi_searchpanel_search_project_file(path, search_term); + _edi_searchpanel_search_project_file(path, search_term, logger); } free (path); @@ -165,15 +166,6 @@ _edi_searchpanel_search_project(const char *directory, const char *search_term) } } -static void -_search_feedback_cb(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED, void *msg) -{ - char *text = msg; - - elm_code_file_line_append(_elm_code->file, text, strlen(text), NULL); - free(text); -} - static void _search_end_cb(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED) { @@ -195,12 +187,13 @@ _search_begin_cb(void *data, Ecore_Thread *thread EINA_UNUSED) _searching = EINA_TRUE; - _edi_searchpanel_search_project(path, _search_text); + _edi_searchpanel_search_project(path, _search_text, _elm_code); if (ecore_thread_check(_search_thread)) return; } -void edi_searchpanel_find(const char *text) +void +edi_searchpanel_find(const char *text) { const char *path; @@ -215,12 +208,13 @@ void edi_searchpanel_find(const char *text) elm_code_file_clear(_elm_code->file); - _search_thread = ecore_thread_feedback_run(_search_begin_cb, _search_feedback_cb, + _search_thread = ecore_thread_feedback_run(_search_begin_cb, NULL, _search_end_cb, _search_cancel_cb, path, EINA_FALSE); } -void edi_searchpanel_add(Evas_Object *parent) +void +edi_searchpanel_add(Evas_Object *parent) { Elm_Code_Widget *widget; Elm_Code *code; @@ -228,7 +222,6 @@ void edi_searchpanel_add(Evas_Object *parent) widget = elm_code_widget_add(parent, code); elm_obj_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); elm_obj_code_widget_gravity_set(widget, 0.0, 1.0); - efl_event_callback_add(widget, &ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_searchpanel_line_cb, NULL); efl_event_callback_add(widget, ELM_OBJ_CODE_WIDGET_EVENT_LINE_CLICKED, _edi_searchpanel_line_clicked_cb, NULL); 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); @@ -248,8 +241,7 @@ _edi_taskspanel_line_cb(void *data EINA_UNUSED, const Efl_Event *event) line = (Elm_Code_Line *)event->info; - if (line->data) - line->status = ELM_CODE_STATUS_TYPE_ERROR; + line->status = ELM_CODE_STATUS_TYPE_TODO; } static Eina_Bool @@ -262,29 +254,21 @@ _edi_taskspanel_config_changed_cb(void *data EINA_UNUSED, int type EINA_UNUSED, #define _edi_taskspanel_line_clicked_cb _edi_searchpanel_line_clicked_cb -static void -_tasks_feedback_cb(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED, void *msg) -{ - char *text = msg; - - elm_code_file_line_append(_tasks_code->file, text, strlen(text), NULL); - free(text); -} - static void _tasks_begin_cb(void *data, Ecore_Thread *thread EINA_UNUSED) { const char *path = data; - _edi_searchpanel_search_project(path, "TODO"); + _edi_searchpanel_search_project(path, "TODO", _tasks_code); if (ecore_thread_check(_search_thread)) return; - _edi_searchpanel_search_project(path, "FIXME"); + _edi_searchpanel_search_project(path, "FIXME", _tasks_code); if (ecore_thread_check(_search_thread)) return; - _edi_searchpanel_search_project(path, "XXX"); + _edi_searchpanel_search_project(path, "XXX", _tasks_code); if (ecore_thread_check(_search_thread)) return; } -void edi_taskspanel_find(void) +void +edi_taskspanel_find(void) { const char *path; if (_searching) return; @@ -293,12 +277,13 @@ void edi_taskspanel_find(void) path = edi_project_get(); - _search_thread = ecore_thread_feedback_run(_tasks_begin_cb, _tasks_feedback_cb, + _search_thread = ecore_thread_feedback_run(_tasks_begin_cb, NULL, _search_end_cb, _search_cancel_cb, path, EINA_FALSE); } -void edi_taskspanel_add(Evas_Object *parent) +void +edi_taskspanel_add(Evas_Object *parent) { Elm_Code_Widget *widget; Elm_Code *code;