ajwillia-ms pushed a commit to branch master.

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

commit 251469e2fecdecd338262ed93919cea4100bdd11
Author: YeongJong Lee <[email protected]>
Date:   Wed Feb 1 09:08:14 2017 +0000

    elm_code: add copy/paste/cut undo
    
    Summary: The patch for supporting copy,paste and cut undo
    
    Test Plan:
    1. elementary_test - Code Editor
    2. Check that undo work correctly when copy,paste and cut
    
    Reviewers: ajwillia.ms
    
    Reviewed By: ajwillia.ms
    
    Subscribers: cedric, jpeg
    
    Differential Revision: https://phab.enlightenment.org/D4636
---
 src/lib/elementary/elm_code_widget.c           |  6 ++---
 src/lib/elementary/elm_code_widget_private.h   |  2 ++
 src/lib/elementary/elm_code_widget_selection.c | 32 +++++++++++++++++++++++---
 3 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/src/lib/elementary/elm_code_widget.c 
b/src/lib/elementary/elm_code_widget.c
index 6d17db2..199d19a 100644
--- a/src/lib/elementary/elm_code_widget.c
+++ b/src/lib/elementary/elm_code_widget.c
@@ -1221,9 +1221,7 @@ _elm_code_widget_change_create(unsigned int start_col, 
unsigned int start_line,
    info->end_col = end_col;
    info->end_line = end_line;
 
-   info->content = malloc((length + 1) * sizeof(char));
-   strncpy(info->content, text, length);
-   info->content[length] = '\0';
+   info->content = strndup(text, length);
    info->length = length;
 
    return info;
@@ -1251,7 +1249,7 @@ _elm_code_widget_change_selection_add(Evas_Object *widget)
 
    change = _elm_code_widget_change_create(selection->start_col,
                                            selection->start_line,
-                                           selection->end_col,
+                                           selection->end_col + 1,
                                            selection->end_line,
                                            selection_text,
                                            strlen(selection_text),
diff --git a/src/lib/elementary/elm_code_widget_private.h 
b/src/lib/elementary/elm_code_widget_private.h
index 42ed274..9364eff 100644
--- a/src/lib/elementary/elm_code_widget_private.h
+++ b/src/lib/elementary/elm_code_widget_private.h
@@ -68,4 +68,6 @@ EAPI Elm_Code_Widget_Selection_Data 
*elm_code_widget_selection_normalized_get(Ev
 
 void _elm_code_widget_undo_change_add(Evas_Object *widget, 
Elm_Code_Widget_Change_Info *info);
 
+void _elm_code_widget_change_selection_add(Evas_Object *widget);
+
 #endif
diff --git a/src/lib/elementary/elm_code_widget_selection.c 
b/src/lib/elementary/elm_code_widget_selection.c
index 6f4357f..1c4ecde 100644
--- a/src/lib/elementary/elm_code_widget_selection.c
+++ b/src/lib/elementary/elm_code_widget_selection.c
@@ -356,14 +356,17 @@ elm_code_widget_selection_cut(Evas_Object *widget)
 {
    char *text;
 
+   if (elm_code_widget_selection_is_empty(widget))
+     return;
+
    text = elm_code_widget_selection_text_get(widget);
    elm_cnp_selection_set(widget, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, 
text, strlen(text));
    elm_cnp_selection_loss_callback_set(widget, ELM_SEL_TYPE_CLIPBOARD, 
_selection_loss_cb, widget);
    free(text);
 
+   _elm_code_widget_change_selection_add(widget);
    elm_code_widget_selection_delete(widget);
 
-   // TODO construct and pass a change object for cut and paste
    efl_event_callback_legacy_call(widget, 
ELM_OBJ_CODE_WIDGET_EVENT_CHANGED_USER, NULL);
 }
 
@@ -372,6 +375,9 @@ elm_code_widget_selection_copy(Evas_Object *widget)
 {
    char *text;
 
+   if (elm_code_widget_selection_is_empty(widget))
+     return;
+
    text = elm_code_widget_selection_text_get(widget);
    elm_cnp_selection_set(widget, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, 
text, strlen(text));
    elm_cnp_selection_loss_callback_set(widget, ELM_SEL_TYPE_CLIPBOARD, 
_selection_loss_cb, widget);
@@ -429,8 +435,10 @@ static Eina_Bool
 _selection_paste_cb(void *data, Evas_Object *obj EINA_UNUSED, 
Elm_Selection_Data *ev)
 {
    Elm_Code *code;
+   Elm_Code_Line *line;
    Elm_Code_Widget *widget;
-   unsigned int row, col;
+   Elm_Code_Widget_Change_Info *change;
+   unsigned int row, col, end_row, end_col, position;
 
    widget = (Elm_Code_Widget *)data;
 
@@ -447,7 +455,24 @@ _selection_paste_cb(void *data, Evas_Object *obj 
EINA_UNUSED, Elm_Selection_Data
    else
      _selection_paste_multi(widget, code, col, row, ev->data, ev->len - 1);
 
-   // TODO construct and pass a change object for cut and paste
+   elm_obj_code_widget_cursor_position_get(widget, &end_row, &end_col);
+
+   line = elm_code_file_line_get(code->file, end_row);
+   position = elm_code_widget_line_text_position_for_column_get(widget, line, 
end_col);
+
+   change = calloc(1, sizeof(Elm_Code_Widget_Change_Info));
+   change->insert = EINA_TRUE;
+   change->start_col = col;
+   change->start_line = row;
+   change->end_col = position;
+   change->end_line = end_row;
+   change->content = strndup(ev->data, ev->len);
+   change->length = ev->len;
+
+   _elm_code_widget_undo_change_add(widget, change);
+   free((char *)change->content);
+   free(change);
+
    efl_event_callback_legacy_call(widget, 
ELM_OBJ_CODE_WIDGET_EVENT_CHANGED_USER, NULL);
    return EINA_TRUE;
 }
@@ -455,6 +480,7 @@ _selection_paste_cb(void *data, Evas_Object *obj 
EINA_UNUSED, Elm_Selection_Data
 EAPI void
 elm_code_widget_selection_paste(Evas_Object *widget)
 {
+   _elm_code_widget_change_selection_add(widget);
    elm_code_widget_selection_delete(widget);
 
    elm_cnp_selection_get(widget, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, 
_selection_paste_cb, widget);

-- 


Reply via email to