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