1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "tx_api.h"
5 #include "gx_api.h"
6 #include "gx_system.h"
7 #include "gx_validation_utility.h"
8 
9 TEST_PARAM test_parameter = {
10     "guix_ml_text_input_select_copy_paste", /* Test name */
11     30, 120, 245, 330  /* Define the coordinates of the capture area.
12                          In this test, we only need to capture the multi
13                          line text input drawing area.  */
14 };
15 
16 static VOID      control_thread_entry(ULONG);
main(int argc,char ** argv)17 int main(int argc, char ** argv)
18 {
19     /* Parse the command line argument. */
20     gx_validation_setup(argc, argv);
21 
22     /* Start ThreadX system */
23     tx_kernel_enter();
24     return(0);
25 }
26 
tx_application_define(void * first_unused_memory)27 VOID tx_application_define(void *first_unused_memory)
28 {
29 
30     /* Create a dedicated thread to perform various operations
31        on the multi line text input example. These operations simulate
32        user input. */
33     gx_validation_control_thread_create(control_thread_entry);
34 
35     /* Terminate the test if it runs for more than 100 ticks */
36     /* This function is not implemented yet. */
37     gx_validation_watchdog_create(100);
38 
39     /* Call the actual multi line text input routine. */
40     gx_validation_application_define(first_unused_memory);
41 
42 }
43 
44 
45 /* Replace the default graphics driver with the validation driver. */
46 #ifdef win32_graphics_driver_setup_565rgb
47 #undef win32_graphics_driver_setup_565rgb
48 #endif
49 #define win32_graphics_driver_setup_565rgb  gx_validation_graphics_driver_setup_565rgb
50 
51 
52 #ifdef WIN32
53 #undef WIN32
54 #endif
55 
56 #include "gx_validation_wrapper.h"
57 
58 #include "demo_guix_ml_text_input_16bpp.c"
59 
60 GX_CHAR test_string[]=
61 "0 do you remember the day we used to be\r\r1\r2\r3\r4ABCDEFGHIJKLMN\r5\r6\r7\r8\r9\r\r\
62 0\r1\r2\r3\r4\r5OPQRSTUVWXYZ\r6\r7\r8\r9\r\
63 0\r1\r2\r3\r4\r5abcdefghijklmn\r6\r7\r8\r9\r0\r\
64 31\r32\r33\r34\r35\r36\r37ABCDEFG\r38abcdefghijk\r39ABCDEF\r40";
65 
66 char test_comment[256];
67 
68 typedef struct TEST_STRUCT{
69 INT event_type;
70 GX_VALUE key_value;
71 GX_VALUE point_x;
72 GX_VALUE point_y;
73 INT      scroll_value;
74 INT      repeat_times;
75 GX_CHAR *comment;
76 }TEST;
77 
78 TEST mark_left[]={
79 {GX_EVENT_PEN_DOWN,     0, 70, 266, 0, 1, "pen down on (70, 266)"},
80 {GX_EVENT_MARK_PREVIOUS,0, 0,  0,   0, 3, "mark previous" },
81 {0,                     0, 0,  0,   0, 0, ""}
82 };
83 
84 TEST mark_left_to_previous_line[]={
85 {GX_EVENT_PEN_DOWN,     0, 70, 266, 0, 1, "pen down on (70, 266)"},
86 {GX_EVENT_MARK_PREVIOUS,0, 0,  0,   0, 8, "mark previous" },
87 {0,                     0, 0,  0,   0, 0, ""}
88 };
89 
90 TEST mark_left_to_invisible_line[]={
91 {GX_EVENT_PEN_DOWN,     0, 62, 163, 0, 1, "pen down on (62, 163)"},
92 {GX_EVENT_MARK_PREVIOUS,0, 0,  0,   0, 9, "mark previous" },
93 {0,                     0, 0,  0,   0, 0, ""}
94 };
95 
96 TEST mark_right[]={
97 {GX_EVENT_PEN_DOWN,     0, 70, 266, 0, 1, "pen down on (70, 266)"},
98 {GX_EVENT_MARK_NEXT,    0, 0,  0,   0, 3, "mark next" },
99 {0,                     0, 0,  0,   0, 0, ""}
100 };
101 
102 TEST mark_right_to_next_line[]={
103 {GX_EVENT_PEN_DOWN,     0, 70, 266, 0, 1, "pen down on (70, 266)"},
104 {GX_EVENT_MARK_NEXT,    0, 0,  0,   0, 11, "mark next" },
105 {0,                     0, 0,  0,   0, 0, ""}
106 };
107 
108 TEST mark_right_to_invisible_line[]={
109 {GX_EVENT_VERTICAL_SCROLL, 0, 0, 0,125, 1, "scroll up"},
110 {GX_EVENT_PEN_DOWN,     0, 189, 263, 0, 1, "pen down on (189, 263)"},
111 {GX_EVENT_MARK_NEXT,    0, 0,  0,   0, 7, "mark next" },
112 {0,                     0, 0,  0,   0, 0, ""}
113 };
114 
115 TEST mark_up[]={
116 {GX_EVENT_PEN_DOWN,     0, 70, 266, 0, 1, "pen down on (70, 266)"},
117 {GX_EVENT_MARK_UP,      0, 0,  0,   0, 1, "mark up" },
118 {0,                     0, 0,  0,   0, 0, ""}
119 };
120 
121 TEST mark_up_to_invisible_line[]={
122 {GX_EVENT_PEN_DOWN,     0, 62, 163, 0, 1, "pen down on (62, 163)"},
123 {GX_EVENT_MARK_UP,      0, 0,  0,   0, 3, "mark up" },
124 {0,                     0, 0,  0,   0, 0, ""}
125 };
126 
127 TEST mark_down[]={
128 {GX_EVENT_VERTICAL_SCROLL, 0, 0, 0, 125, 1, "scroll up"},
129 {GX_EVENT_PEN_DOWN,     0, 189, 263, 0, 1, "pen down on (189, 263)"},
130 {GX_EVENT_MARK_DOWN,    0, 0,  0,    0, 1, "mark down" },
131 {0,                     0, 0,  0,    0, 0, ""}
132 };
133 
134 TEST mark_down_to_invisible_line[]={
135 {GX_EVENT_VERTICAL_SCROLL, 0, 0, 0, 125, 1, "scroll up"},
136 {GX_EVENT_PEN_DOWN,     0, 189, 263, 0, 1, "pen down on (189, 263)"},
137 {GX_EVENT_MARK_DOWN,    0, 0,  0,    0, 4, "mark down" },
138 {0,                     0, 0,  0,    0, 0, ""}
139 };
140 
141 TEST mark_home[]={
142 {GX_EVENT_PEN_DOWN,     0, 70, 266, 0, 1, "pen down on (70, 266)"},
143 {GX_EVENT_MARK_HOME,    0, 0, 0, 0, 1, "home key down"},
144 {0,                     0, 0,  0,    0, 0, ""}
145 };
146 
147 TEST mark_end[]={
148 {GX_EVENT_PEN_DOWN,     0, 70, 266, 0, 1, "pen down on (70, 266)"},
149 {GX_EVENT_MARK_END,     0, 0, 0, 0, 1, "end key down"},
150 {0,                     0, 0,  0,    0, 0, ""}
151 };
152 
153 typedef struct CASE_STRUCT{
154 TEST *test_list;
155 GX_CHAR *comment;
156 }CASE;
157 
158 CASE case_list[]={
159 {mark_left, "mark left"},
160 {mark_left_to_previous_line, "mark left to previous line"},
161 {mark_left_to_invisible_line, "mark left to invisible line"},
162 {mark_right, "mark right"},
163 {mark_right_to_next_line, "mark right to next line"},
164 {mark_right_to_invisible_line, "mark right to invisible line"},
165 {mark_up, "mark up"},
166 {mark_up_to_invisible_line, "mark up to invisible line"},
167 {mark_down, "mark down"},
168 {mark_down_to_invisible_line, "mark down to invisible line"},
169 {mark_home, "mark home"},
170 {mark_end, "mark end"},
171 {0, ""}
172 };
173 
174 TEST test_list[]={
175 {GX_EVENT_KEY_DOWN, GX_KEY_HOME,       0, 0, 0, 1, "home key down"},
176 {GX_EVENT_KEY_DOWN, GX_KEY_END,        0, 0, 0, 1, "end key down"},
177 {GX_EVENT_KEY_DOWN, GX_KEY_LEFT_ARROW, 0, 0, 0, 1, "left arrow down"},
178 {GX_EVENT_KEY_DOWN, GX_KEY_RIGHT_ARROW,0, 0, 0, 1, "right arrow down"},
179 {GX_EVENT_KEY_DOWN, GX_KEY_BACKSPACE,  0, 0, 0, 1, "backspace"},
180 {GX_EVENT_KEY_DOWN, GX_KEY_DELETE,     0, 0, 0, 1, "delete"},
181 {GX_EVENT_KEY_DOWN, 'I',               0, 0, 0, 1, "insert character I"},
182 {GX_EVENT_CUT,      0,                 0, 0, 0, 1, "cut"},
183 {GX_EVENT_PASTE,    0,                 0, 0, 0, 1, "paste"},
184 {0,                 0,                 0, 0, 0, 0, ""}
185 };
186 
187 typedef struct ALIGNMENT_STRUCT{
188 INT value;
189 GX_CHAR *text;
190 }ALIGNMENT;
191 
192 ALIGNMENT alignment_style_list[]={
193 {GX_STYLE_TEXT_LEFT, "left alignment"},
194 {GX_STYLE_TEXT_RIGHT, "right alignment"},
195 {GX_STYLE_TEXT_CENTER, "center alignment"},
196 {0, ""}
197 };
198 
run_case(GX_MULTI_LINE_TEXT_INPUT * input,CASE * case_entry,int frame_id)199 void run_case(GX_MULTI_LINE_TEXT_INPUT *input, CASE *case_entry, int frame_id)
200 {
201 INT repeat_times;
202 GX_EVENT my_event;
203 TEST *test;
204 GX_SCROLLBAR *scroll;
205 
206     gx_window_scrollbar_find((GX_WINDOW *)input, GX_TYPE_VERTICAL_SCROLL, &scroll);
207 
208     test = case_entry->test_list;
209     memset(&my_event, 0, sizeof(GX_EVENT));
210     my_event.gx_event_display_handle = 1;
211 
212     gx_multi_line_text_input_text_set(input, test_string);
213 
214     while(test->event_type)
215     {
216         repeat_times = test->repeat_times;
217 
218         while(repeat_times)
219         {
220             if((repeat_times == 1) && ((test + 1)->event_type == 0))
221             {
222                 gx_validation_set_frame_id(frame_id++);
223                 gx_validation_set_frame_comment(case_entry->comment);
224             }
225 
226             my_event.gx_event_type = test->event_type;
227             my_event.gx_event_target = (GX_WIDGET *)input;
228 
229             switch(test->event_type)
230             {
231             case GX_EVENT_KEY_DOWN:
232                 my_event.gx_event_payload.gx_event_ushortdata[0] = test->key_value;
233                 break;
234             case GX_EVENT_VERTICAL_SCROLL:
235                 my_event.gx_event_payload.gx_event_intdata[0] = test->scroll_value;
236                 my_event.gx_event_payload.gx_event_intdata[1] = scroll->gx_scrollbar_info.gx_scroll_value;
237                 break;
238             case GX_EVENT_PEN_DOWN:
239                 my_event.gx_event_payload.gx_event_pointdata.gx_point_x = test->point_x;
240                 my_event.gx_event_payload.gx_event_pointdata.gx_point_y = test->point_y;
241                 my_event.gx_event_target = 0;
242                 break;
243             }
244             gx_system_event_send(&my_event);
245             repeat_times--;
246         }
247         test++;
248     }
249 }
250 
251 /* This thread simulates user input.  Its priority is lower
252    than the GUIX thread, so that GUIX finishes an operation
253    before this thread is able to issue the next command. */
control_thread_entry(ULONG input)254 static VOID control_thread_entry(ULONG input)
255 {
256 int                       frame_id = 1;
257 GX_MULTI_LINE_TEXT_INPUT *text_input;
258 GX_EVENT                  my_event;
259 ALIGNMENT                *alignment = alignment_style_list;
260 CASE                     *case_entry;
261 TEST                     *test;
262 
263     text_input = &((WINDOW_CONTROL_BLOCK *)pMainScreen)->window_ml_text_input;
264 
265     memset(&my_event, 0, sizeof(GX_EVENT));
266     my_event.gx_event_display_handle = 1;
267     my_event.gx_event_target = (GX_WIDGET *)text_input;
268 
269      /* Remove the cursor blink flag. */
270     gx_multi_line_text_input_style_remove(text_input, GX_STYLE_CURSOR_BLINK);
271     gx_multi_line_text_view_whitespace_set((GX_MULTI_LINE_TEXT_VIEW *)text_input, 1);
272     while(alignment->value)
273     {
274         gx_widget_style_remove((GX_WIDGET *)text_input, GX_STYLE_TEXT_ALIGNMENT_MASK);
275         gx_widget_style_add((GX_WIDGET *)text_input, alignment->value);
276 
277         gx_validation_set_frame_id(frame_id++);
278         gx_validation_set_frame_comment(alignment->text);
279         gx_validation_screen_refresh();
280         alignment++;
281 
282         case_entry = case_list;
283 
284         while(case_entry->test_list)
285         {
286             test = test_list;
287             while(test->event_type)
288             {
289                 run_case(text_input, case_entry, frame_id);
290 
291                 gx_validation_current_frame_id_get(&frame_id);
292                 gx_validation_set_frame_id(frame_id++);
293                 gx_validation_set_frame_comment(test->comment);
294 
295                 my_event.gx_event_type = test->event_type;
296                 my_event.gx_event_payload.gx_event_ushortdata[0] = test->key_value;
297                 gx_system_event_send(&my_event);
298 
299                 test++;
300             }
301 
302             case_entry++;
303         }
304     }
305 
306     gx_validation_end();
307 
308     exit(0);
309 }
310