1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 
5 #include "Elementary.h"
6 
7 #include "elm_code_private.h"
8 #include "elm_code_widget_legacy_eo.h"
9 
10 #define _ELM_CODE_DIFF_WIDGET_LEFT "diffwidgetleft"
11 #define _ELM_CODE_DIFF_WIDGET_RIGHT "diffwidgetright"
12 
13 #define _ELM_CODE_DIFF_WIDGET_TYPE_ADDED "added"
14 #define _ELM_CODE_DIFF_WIDGET_TYPE_REMOVED "removed"
15 #define _ELM_CODE_DIFF_WIDGET_TYPE_CHANGED "changed"
16 
17 static void
_elm_code_diff_widget_parse_diff_line(Elm_Code_Line * line,Elm_Code_File * left,Elm_Code_File * right)18 _elm_code_diff_widget_parse_diff_line(Elm_Code_Line *line, Elm_Code_File *left, Elm_Code_File *right)
19 {
20    const char *content;
21    unsigned int length;
22 
23    if (line->length < 1)
24      {
25         elm_code_file_line_append(left, "", 0, NULL);
26         elm_code_file_line_append(right, "", 0, NULL);
27      }
28 
29    content = elm_code_line_text_get(line, &length);
30    if (content[0] == '+')
31      {
32         elm_code_file_line_append(left, "", 0, NULL);
33         elm_code_file_line_append(right, content, length, NULL);
34      }
35    else if (content[0] == '-')
36      {
37         elm_code_file_line_append(left, content, length, NULL);
38         elm_code_file_line_append(right, "", 0, NULL);
39      }
40    else
41      {
42         elm_code_file_line_append(left, content, length, NULL);
43         elm_code_file_line_append(right, content, length, NULL);
44      }
45 }
46 
47 static void
_elm_code_diff_widget_parse_diff(Elm_Code_File * diff,Elm_Code_File * left,Elm_Code_File * right)48 _elm_code_diff_widget_parse_diff(Elm_Code_File *diff, Elm_Code_File *left, Elm_Code_File *right)
49 {
50    Eina_List *item;
51    Elm_Code_Line *line;
52    const char *content;
53    unsigned int offset, length;
54 
55    offset = 0;
56    EINA_LIST_FOREACH(diff->lines, item, line)
57      {
58         content = elm_code_line_text_get(line, &length);
59 
60         if (length > 0 && (content[0] == 'd' || content[0] == 'i' || content[0] == 'n'))
61           {
62              offset = 0;
63              elm_code_file_line_append(left, content, length, NULL);
64              elm_code_file_line_append(right, content, length, NULL);
65 
66              continue;
67           }
68 
69         if (offset == 0)
70           elm_code_file_line_append(left, content, length, NULL);
71         else if (offset == 1)
72           elm_code_file_line_append(right, content, length, NULL);
73         else
74           _elm_code_diff_widget_parse_diff_line(line, left, right);
75 
76         offset++;
77      }
78 
79    _elm_code_parse_file(left->parent, left);
80    _elm_code_parse_file(right->parent, right);
81 }
82 
83 EAPI Evas_Object *
elm_code_diff_widget_add(Evas_Object * parent,Elm_Code * code)84 elm_code_diff_widget_add(Evas_Object *parent, Elm_Code *code)
85 {
86    Elm_Code *wcode1, *wcode2;
87    Elm_Code_Widget *widget_left, *widget_right;
88    Evas_Object *hbox;
89 
90    hbox = elm_panes_add(parent);
91    evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
92    evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
93    elm_panes_horizontal_set(hbox, EINA_FALSE);
94    evas_object_show(hbox);
95 
96    // left side of diff
97    wcode1 = elm_code_create();
98    elm_code_parser_standard_add(wcode1, ELM_CODE_PARSER_STANDARD_DIFF);
99    widget_left = elm_legacy_add(ELM_CODE_WIDGET_LEGACY_CLASS, parent, efl_ui_code_widget_code_set(efl_added, wcode1));
100 
101    evas_object_size_hint_weight_set(widget_left, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
102    evas_object_size_hint_align_set(widget_left, EVAS_HINT_FILL, EVAS_HINT_FILL);
103    evas_object_show(widget_left);
104    evas_object_data_set(hbox, _ELM_CODE_DIFF_WIDGET_LEFT, widget_left);
105    elm_object_part_content_set(hbox, "left", widget_left);
106 
107    // right side of diff
108    wcode2 = elm_code_create();
109    elm_code_parser_standard_add(wcode2, ELM_CODE_PARSER_STANDARD_DIFF);
110    widget_right = elm_legacy_add(ELM_CODE_WIDGET_LEGACY_CLASS, parent, efl_ui_code_widget_code_set(efl_added, wcode2));
111 
112    evas_object_size_hint_weight_set(widget_right, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
113    evas_object_size_hint_align_set(widget_right, EVAS_HINT_FILL, EVAS_HINT_FILL);
114    evas_object_show(widget_right);
115    evas_object_data_set(hbox, _ELM_CODE_DIFF_WIDGET_RIGHT, widget_right);
116    elm_object_part_content_set(hbox, "right", widget_right);
117 
118    _elm_code_diff_widget_parse_diff(code->file, wcode1->file, wcode2->file);
119    return hbox;
120 }
121 
122 EAPI void
elm_code_diff_widget_font_set(Evas_Object * widget,const char * name,int size)123 elm_code_diff_widget_font_set(Evas_Object *widget, const char *name, int size)
124 {
125    Elm_Code_Widget *child;
126 
127    child = (Elm_Code_Widget *) evas_object_data_get(widget, _ELM_CODE_DIFF_WIDGET_LEFT);
128    efl_ui_code_widget_font_set(child, name, size);
129    child = (Elm_Code_Widget *) evas_object_data_get(widget, _ELM_CODE_DIFF_WIDGET_RIGHT);
130    efl_ui_code_widget_font_set(child, name, size);
131 }
132 
133