diff options
author | YeongJong Lee <cleanlyj@naver.com> | 2017-01-31 19:04:33 +0000 |
---|---|---|
committer | Andy Williams <andy@andywilliams.me> | 2017-01-31 19:40:20 +0000 |
commit | 928091bedbcb1bb3166f680bcd192ef32677fc3b (patch) | |
tree | c30c1b6ac8d49530b6482c9193d539e03ec22bb4 | |
parent | e483e35f3dd898085eadf1f70a94e80bbd987759 (diff) | |
download | efl-928091bedbcb1bb3166f680bcd192ef32677fc3b.tar.gz |
elm_code: fix that selected code can't undo
Summary: Change some undo logic and remove unused function
Test Plan:
1. elementary_test - Code Editor
2. Select lines.
3. Remove selected lines.
4. undo removed lines(<Ctrl> + <z>)
Reviewers: ajwillia.ms
Reviewed By: ajwillia.ms
Subscribers: cedric, jpeg
Differential Revision: https://phab.enlightenment.org/D4631
-rw-r--r-- | src/lib/elementary/elm_code_widget.c | 83 | ||||
-rw-r--r-- | src/lib/elementary/elm_code_widget_selection.c | 23 | ||||
-rw-r--r-- | src/lib/elementary/elm_code_widget_selection.h | 2 | ||||
-rw-r--r-- | src/lib/elementary/elm_code_widget_undo.c | 37 |
4 files changed, 118 insertions, 27 deletions
diff --git a/src/lib/elementary/elm_code_widget.c b/src/lib/elementary/elm_code_widget.c index 98799d5f49..6d17db2baa 100644 --- a/src/lib/elementary/elm_code_widget.c +++ b/src/lib/elementary/elm_code_widget.c @@ -1206,25 +1206,6 @@ _elm_code_widget_cursor_move_pagedown(Elm_Code_Widget *widget) _elm_code_widget_cursor_move(widget, pd, col, row, EINA_TRUE); } -static Eina_Bool -_elm_code_widget_delete_selection(Elm_Code_Widget *widget) -{ - Elm_Code_Widget_Data *pd; - Elm_Code_Widget_Selection_Data *selection; - - pd = efl_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); - - if (!pd->selection) - return EINA_FALSE; - - selection = elm_code_widget_selection_normalized_get(widget); - elm_code_widget_selection_delete(widget); - elm_code_widget_cursor_position_set(widget, selection->start_line, selection->start_col); - free(selection); - - return EINA_TRUE; -} - static Elm_Code_Widget_Change_Info * _elm_code_widget_change_create(unsigned int start_col, unsigned int start_line, unsigned int end_col, unsigned int end_line, @@ -1256,6 +1237,32 @@ _elm_code_widget_change_free(Elm_Code_Widget_Change_Info *info) } void +_elm_code_widget_change_selection_add(Evas_Object *widget) +{ + Elm_Code_Widget_Change_Info *change; + Elm_Code_Widget_Selection_Data *selection; + char *selection_text; + + if (elm_code_widget_selection_is_empty(widget)) + return; + + selection_text = elm_code_widget_selection_text_get(widget); + selection = elm_code_widget_selection_normalized_get(widget); + + change = _elm_code_widget_change_create(selection->start_col, + selection->start_line, + selection->end_col, + selection->end_line, + selection_text, + strlen(selection_text), + EINA_FALSE); + _elm_code_widget_undo_change_add(widget, change); + _elm_code_widget_change_free(change); + free(selection_text); + free(selection); +} + +void _elm_code_widget_text_at_cursor_insert_do(Elm_Code_Widget *widget, const char *text, int length, Eina_Bool undo) { Elm_Code *code; @@ -1264,7 +1271,12 @@ _elm_code_widget_text_at_cursor_insert_do(Elm_Code_Widget *widget, const char *t unsigned int row, col, position, col_width, curlen, indent; const char *curtext, *indent_text; - _elm_code_widget_delete_selection(widget); + if (undo) + { + _elm_code_widget_change_selection_add(widget); + elm_code_widget_selection_delete(widget); + } + code = elm_obj_code_widget_code_get(widget); elm_obj_code_widget_cursor_position_get(widget, &row, &col); line = elm_code_file_line_get(code->file, row); @@ -1353,7 +1365,9 @@ _elm_code_widget_newline(Elm_Code_Widget *widget) unsigned int row, col, position, oldlen, width, indent; char *oldtext, *leading; - _elm_code_widget_delete_selection(widget); + _elm_code_widget_change_selection_add(widget); + elm_code_widget_selection_delete(widget); + code = elm_obj_code_widget_code_get(widget); elm_obj_code_widget_cursor_position_get(widget, &row, &col); line = elm_code_file_line_get(code->file, row); @@ -1400,18 +1414,27 @@ _elm_code_widget_backspaceline(Elm_Code_Widget *widget, Eina_Bool nextline) if (nextline) { + elm_code_widget_selection_start(widget, row, col); + elm_code_widget_selection_end(widget, row + 1, 0); + _elm_code_widget_change_selection_add(widget); + elm_code_line_merge_down(line); } else { oldline = elm_code_file_line_get(code->file, row - 1); elm_code_line_text_get(oldline, &oldlength); - elm_code_line_merge_up(line); position = elm_code_widget_line_text_column_width_to_position(widget, oldline, oldlength); + elm_code_widget_selection_start(widget, row - 1, position); + elm_code_widget_selection_end(widget, row, 0); + _elm_code_widget_change_selection_add(widget); + + elm_code_line_merge_up(line); elm_obj_code_widget_cursor_position_set(widget, row - 1, position); } + elm_code_widget_selection_clear(widget); // TODO construct and pass a change object efl_event_callback_legacy_call(widget, ELM_OBJ_CODE_WIDGET_EVENT_CHANGED_USER, NULL); } @@ -1425,8 +1448,12 @@ _elm_code_widget_backspace(Elm_Code_Widget *widget) unsigned int row, col, position, start_col, end_col, char_width; const char *text; - if (_elm_code_widget_delete_selection(widget)) - return; // TODO fire the change and log it + if (!elm_code_widget_selection_is_empty(widget)) + { + _elm_code_widget_change_selection_add(widget); + elm_code_widget_selection_delete(widget); + return; + } code = elm_obj_code_widget_code_get(widget); elm_obj_code_widget_cursor_position_get(widget, &row, &col); @@ -1468,8 +1495,12 @@ _elm_code_widget_delete(Elm_Code_Widget *widget) unsigned int row, col, position, char_width, start_col, end_col; const char *text; - if (_elm_code_widget_delete_selection(widget)) - return; // TODO fire the change and log it + if (!elm_code_widget_selection_is_empty(widget)) + { + _elm_code_widget_change_selection_add(widget); + elm_code_widget_selection_delete(widget); + return; + } code = elm_obj_code_widget_code_get(widget); elm_obj_code_widget_cursor_position_get(widget, &row, &col); diff --git a/src/lib/elementary/elm_code_widget_selection.c b/src/lib/elementary/elm_code_widget_selection.c index 4a92b49eba..6f4357f1e5 100644 --- a/src/lib/elementary/elm_code_widget_selection.c +++ b/src/lib/elementary/elm_code_widget_selection.c @@ -459,3 +459,26 @@ elm_code_widget_selection_paste(Evas_Object *widget) elm_cnp_selection_get(widget, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, _selection_paste_cb, widget); } + +EAPI Eina_Bool +elm_code_widget_selection_is_empty(Evas_Object *widget) +{ + Elm_Code_Widget_Data *pd; + Elm_Code_Widget_Selection_Data *selection; + Eina_Bool ret = EINA_FALSE; + + pd = efl_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); + + if (!pd->selection) + return EINA_TRUE; + + selection = elm_code_widget_selection_normalized_get(widget); + + if (selection->start_col == selection->end_col && + selection->start_line == selection->end_line) + ret = EINA_TRUE; + + free(selection); + + return ret; +} diff --git a/src/lib/elementary/elm_code_widget_selection.h b/src/lib/elementary/elm_code_widget_selection.h index b79abc763f..9fe7e5c588 100644 --- a/src/lib/elementary/elm_code_widget_selection.h +++ b/src/lib/elementary/elm_code_widget_selection.h @@ -33,6 +33,8 @@ EAPI void elm_code_widget_selection_cut(Evas_Object *widget); EAPI void elm_code_widget_selection_copy(Evas_Object *widget); EAPI void elm_code_widget_selection_paste(Evas_Object *widget); +EAPI Eina_Bool elm_code_widget_selection_is_empty(Evas_Object *widget); + /** * @} */ diff --git a/src/lib/elementary/elm_code_widget_undo.c b/src/lib/elementary/elm_code_widget_undo.c index d7806edc15..ed0b8f2f01 100644 --- a/src/lib/elementary/elm_code_widget_undo.c +++ b/src/lib/elementary/elm_code_widget_undo.c @@ -37,6 +37,12 @@ static void _elm_code_widget_undo_change(Evas_Object *widget, Elm_Code_Widget_Change_Info *info) { + Elm_Code_Widget_Data *pd; + unsigned int textlen, position, row, col; + short nllen; + Elm_Code_Line *line; + pd = efl_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); + if (info->insert) { elm_code_widget_selection_start(widget, info->start_line, info->start_col); @@ -45,8 +51,37 @@ _elm_code_widget_undo_change(Evas_Object *widget, } else { + elm_code_widget_selection_clear(widget); elm_code_widget_cursor_position_set(widget, info->start_line, info->start_col); - _elm_code_widget_text_at_cursor_insert_no_undo(widget, info->content, info->length); + unsigned int newrow = info->start_line; + while (newrow <= info->end_line) + { + line = elm_code_file_line_get(pd->code->file, newrow); + if (newrow != info->end_line) + { + textlen = info->length; + textlen = elm_code_text_newlinenpos(info->content, info->length, &nllen); + info->length -= textlen + nllen; + _elm_code_widget_text_at_cursor_insert_no_undo(widget, + info->content, + textlen); + elm_obj_code_widget_cursor_position_get(widget, &row, &col); + position = elm_code_widget_line_text_position_for_column_get(widget, line, col); + elm_code_line_split_at(line, position); + elm_code_widget_cursor_position_set(widget, newrow + 1, 1); + info->content += textlen + nllen; + } + else + { + _elm_code_widget_text_at_cursor_insert_no_undo(widget, + info->content, + info->length); + } + newrow++; + } + if (info->end_col < 1) + info->end_col = 1; + elm_code_widget_cursor_position_set(widget, info->end_line, info->end_col); } } |