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