comparison syl_window.cpp @ 0:76568becd6d6

Rhope Alpha 2a source import
author Mike Pavone <pavone@retrodev.com>
date Tue, 28 Apr 2009 23:06:07 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:76568becd6d6
1 #include <util/application.h>
2 #include <util/message.h>
3 #include <gui/button.h>
4 #include <gui/textview.h>
5 #include <gui/control.h>
6 #include <gui/checkbox.h>
7 #include <gui/dropdownmenu.h>
8 #include <atheos/threads.h>
9 #include <unistd.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include "syl_window.h"
13 #include "structs.h"
14 #include "debugmacros.h"
15 #include "syl_generic.h"
16
17 os::Application *app;
18
19 extern "C" {
20
21
22 void app_thread(void * param)
23 {
24 DEBUGPUTS("Before app->Run()\n");
25 app->Run();
26 DEBUGPUTS("After app->Run()\n");
27 }
28
29 //VIS_CRITICAL_SECTION_EXTERN(app_lock)
30 extern short app_lock;
31
32 void check_create_app()
33 {
34 VIS_EnterCriticalSection(app_lock);
35 if(!app)
36 {
37
38 app = new os::Application("mime type goes here");
39 resume_thread(spawn_thread("vis_app", (void *)app_thread, 1, 0, NULL));
40 DEBUGPUTS("Created application object\n");
41 }
42 VIS_LeaveCriticalSection(app_lock);
43 }
44
45 int vis_window_get_value(datum ** inputlist, queue_entry * worker_entry)
46 {
47 datum * output = NULL, *name;
48 os::String val;
49 os::Control * control = NULL;
50 os::DropdownMenu * drop;
51 vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data);
52 name = add_ref(inputlist[1]);
53 inputlist[2] = inputlist[1];
54
55 DEBUGPUTS("Entering window lock\n");
56 VIS_EnterCriticalSection(window->lock);
57 inputlist[1] = add_ref(window->widget_types);
58 vis_dict_index(inputlist+1, worker_entry);
59 if(inputlist[1])
60 {
61 switch(inputlist[1]->c.integers.num_a)
62 {
63 case BUILTIN_TYPE_INPUTBOX:
64 control = (os::Control *)(window->wind->FindView((char *)(name->c.generic.data)));
65 if(control)
66 {
67 DEBUGPUTS("Before GetValue\n");
68 val = control->GetValue().AsString();
69 output = make_string(val.c_str(), val.CountChars(), worker_entry->instance->def->prog);
70 }
71 break;
72 case BUILTIN_TYPE_CHECKBOX:
73 control = (os::Control *)(window->wind->FindView((char *)(name->c.generic.data)));
74 if(control)
75 {
76 output = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->prog);
77 output->c.integers.num_a = control->GetValue().AsBool();
78 }
79 break;
80 case BUILTIN_TYPE_DROPDOWN:
81 drop = (os::DropdownMenu *)(window->wind->FindView((char *)(name->c.generic.data)));
82 if(drop)
83 {
84 val = drop->GetCurrentString();
85 output = make_string(val.c_str(), val.CountChars(), worker_entry->instance->def->prog);
86 }
87 break;
88 default:
89 printf("Unsupported widget type %d for Get Value\n", inputlist[1]->c.integers.num_a);
90 break;
91 }
92 }
93
94 VIS_LeaveCriticalSection(window->lock);
95 DEBUGPUTS("Leaving window lock\n");
96 DEBUGPRINTF("window->wind: %X\n", window->wind);
97 DEBUGPRINTF("window->title: %X\n", window->title);
98 release_ref(inputlist[0]);
99 release_ref(inputlist[1]);
100 release_ref(name);
101 inputlist[0] = output;
102 return 0;
103 }
104
105 int vis_window_set_value(datum ** inputlist, queue_entry * worker_entry)
106 {
107 datum *name, *value;
108 worker_def * converter;
109 os::String val;
110 os::Control * control = NULL;
111 os::DropdownMenu * drop;
112 vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data);
113 name = add_ref(inputlist[1]);
114 value = inputlist[2];
115 inputlist[2] = inputlist[1];
116
117 DEBUGPUTS("Entering window lock\n");
118 VIS_EnterCriticalSection(window->lock);
119 inputlist[1] = add_ref(window->widget_types);
120 vis_dict_index(inputlist+1, worker_entry);
121 if(inputlist[1])
122 {
123 switch(inputlist[1]->c.integers.num_a)
124 {
125 case BUILTIN_TYPE_INPUTBOX:
126 control = (os::Control *)(window->wind->FindView((char *)(name->c.generic.data)));
127 if(control)
128 {
129 if(value->company->type_id != BUILTIN_TYPE_STRING)
130 {
131 converter = find_converter_method(BUILTIN_TYPE_STRING, value->company->type_id, worker_entry->instance->def->prog);
132 if(!converter)
133 {
134 if(worker_entry->instance) {
135 ERRORPRINTF("Error: Needed conversion from %s to %s for input %d of %s in worker %s\n", value->company->name, worker_entry->instance->def->prog->companylist[BUILTIN_TYPE_STRING].name, 2, "Set Value@Screen Window", worker_entry->instance->def->name);
136 } else {
137 ERRORPRINTF("Error: Needed conversion from %s to %s for input %d of %s\n", value->company->name, worker_entry->instance->def->prog->companylist[BUILTIN_TYPE_STRING].name, 2, "Set Value@Screen Window");
138 }
139 execute_active = FALSE;
140 VIS_PROFILE_END(PROF_PROCESS_WORKER);
141 return -3;
142 }
143 ((worker_impl)(converter->implement_func))(&value, worker_entry);
144 }
145 control->SetValue(os::String((char *)(value->c.generic.data)), false);
146 }
147 break;
148 case BUILTIN_TYPE_CHECKBOX:
149 control = (os::Control *)(window->wind->FindView((char *)(name->c.generic.data)));
150 if(control)
151 {
152 if(value->company->type_id != BUILTIN_TYPE_YESNO)
153 {
154 converter = find_converter_method(BUILTIN_TYPE_YESNO, value->company->type_id, worker_entry->instance->def->prog);
155 if(!converter)
156 {
157 if(worker_entry->instance) {
158 ERRORPRINTF("Error: Needed conversion from %s to %s for input %d of %s in worker %s\n", value->company->name, worker_entry->instance->def->prog->companylist[BUILTIN_TYPE_YESNO].name, 2, "Set Value@Screen Window", worker_entry->instance->def->name);
159 } else {
160 ERRORPRINTF("Error: Needed conversion from %s to %s for input %d of %s\n", value->company->name, worker_entry->instance->def->prog->companylist[BUILTIN_TYPE_YESNO].name, 2, "Set Value@Screen Window");
161 }
162 execute_active = FALSE;
163 VIS_PROFILE_END(PROF_PROCESS_WORKER);
164 return -3;
165 }
166 ((worker_impl)(converter->implement_func))(&value, worker_entry);
167 }
168 control->SetValue((bool)(value->c.integers.num_a), false);
169 }
170 break;
171 case BUILTIN_TYPE_DROPDOWN:
172 drop = (os::DropdownMenu *)(window->wind->FindView((char *)(name->c.generic.data)));
173 if(drop)
174 {
175 if(value->company->type_id != BUILTIN_TYPE_STRING)
176 {
177 converter = find_converter_method(BUILTIN_TYPE_STRING, value->company->type_id, worker_entry->instance->def->prog);
178 if(!converter)
179 {
180 if(worker_entry->instance) {
181 ERRORPRINTF("Error: Needed conversion from %s to %s for input %d of %s in worker %s\n", value->company->name, worker_entry->instance->def->prog->companylist[BUILTIN_TYPE_STRING].name, 2, "Set Value@Screen Window", worker_entry->instance->def->name);
182 } else {
183 ERRORPRINTF("Error: Needed conversion from %s to %s for input %d of %s\n", value->company->name, worker_entry->instance->def->prog->companylist[BUILTIN_TYPE_STRING].name, 2, "Set Value@Screen Window");
184 }
185 execute_active = FALSE;
186 VIS_PROFILE_END(PROF_PROCESS_WORKER);
187 return -3;
188 }
189 ((worker_impl)(converter->implement_func))(&value, worker_entry);
190 }
191 drop->SetCurrentString(os::String((char *)(value->c.generic.data)));
192 }
193 break;
194 default:
195 printf("Unsupported widget type %d for Get Value\n", inputlist[1]->c.integers.num_a);
196 break;
197 }
198 }
199
200 VIS_LeaveCriticalSection(window->lock);
201
202 release_ref(inputlist[1]);
203 release_ref(value);
204 return 0;
205 }
206
207 os::Message * handler_widget_to_window(vis_widget * widget, vis_window_shown * window_show, char * handler_name, queue_entry * entry, bool make_message)
208 {
209 datum * params[3];
210 params[0] = add_ref(widget->handler_dict);
211 params[1] = make_string(handler_name, -1, entry->instance->def->prog);
212 DEBUGPUTS("Looking up click handler\n");
213 vis_dict_index(params, entry);
214 //if no handler is found, make sure to release output 2
215 if(params[1])
216 release_ref(params[1]);
217 if(params[0] || !make_message)
218 {
219 DEBUGPRINTF("Appending %X to handler list\n", params[0]);
220 params[1] = params[0];
221 params[0] = window_show->handler_list;
222 vis_list_append(params, NULL);
223 window_show->handler_list = params[0];
224 if(make_message)
225 return new os::Message(window_show->next_msg_code++);
226 }
227 return NULL;
228 }
229
230 void add_widget_shared(vis_window_shown * window_show, datum * widget_datum, char * name, double xpos, double ypos, queue_entry * worker_entry, os::View * parent_view = NULL)
231 {
232 datum * index;
233 os::View * widget_view;
234 os::TextView * text_view;
235 os::DropdownMenu * drop_view;
236 os::Message * msg;
237 vis_widget * widget;
238 datum * params[3];
239 params[0] = window_show->widget_types;
240 params[1] = make_string(name, -1, worker_entry->instance->def->prog);
241 params[2] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->prog);
242 params[2]->c.integers.num_a = widget_datum->company->type_id;
243 vis_dict_set(params, worker_entry);
244 window_show->widget_types = params[0];
245 widget = (vis_widget *)(widget_datum->c.generic.data);
246 DEBUGPUTS("Instantiating OS native widget object\n");
247 switch(widget_datum->company->type_id)
248 {
249 case BUILTIN_TYPE_BUTTON:
250 DEBUGPUTS("new os::Button()\n");
251 widget_view = new os::Button(
252 os::Rect(
253 xpos, ypos,
254 xpos+widget->width, ypos+widget->height
255 ),
256 name,
257 (char *)(widget->label->c.generic.data),
258 new os::Message(window_show->next_msg_code++)
259 );
260 /*params[0] = add_ref(widget->handler_dict);
261 params[1] = new_datum(BUILTIN_TYPE_STRING, 1, 6, worker_entry->instance->def->prog);//click
262 strcpy((char *)(params[1]->c.generic.data), "click");
263 DEBUGPUTS("Looking up click handler\n");
264 vis_dict_index(params, worker_entry);
265 if(params[1])
266 release_ref(params[1]);
267 DEBUGPRINTF("Appending %X to handler list\n", params[0]);
268 params[1] = params[0];
269 params[0] = window_show->handler_list;
270 vis_list_append(params, worker_entry);
271 window_show->handler_list = params[0];*/
272 handler_widget_to_window(widget, window_show, "click", worker_entry, false);
273 break;
274 case BUILTIN_TYPE_INPUTBOX:
275 text_view = new os::TextView(
276 os::Rect(
277 xpos, ypos,
278 xpos+widget->width, ypos+widget->height
279 ),
280 name,
281 (char *)(widget->value->c.generic.data)
282 );
283 switch(widget->flags)
284 {
285 case 1:
286 text_view->SetMultiLine();
287 break;
288 case 2:
289 text_view->SetNumeric(true);
290 break;
291 case 3:
292 text_view->SetPasswordMode();
293 break;
294 case 4:
295 text_view->SetReadOnly();
296 break;
297 default:
298 break;
299 }
300 widget_view = text_view;
301 break;
302 case BUILTIN_TYPE_CUSTOM_WIDGET:
303 DEBUGPUTS("Creating custom widget\n");
304 widget_view = new GenericView(
305 os::Rect(
306 xpos, ypos,
307 xpos+widget->width, ypos+widget->height
308 ),
309 name,
310 add_ref(widget_datum),
311 &(window_show->instance));
312 DEBUGPRINTF("Widget view: %X\n", widget_view);
313 break;
314 case BUILTIN_TYPE_CHECKBOX:
315 widget_view = new os::CheckBox(
316 os::Rect(
317 xpos, ypos,
318 xpos+widget->width, ypos+widget->height
319 ),
320 name,
321 (char *)(widget->label->c.generic.data),
322 new os::Message(window_show->next_msg_code++)
323 );
324 handler_widget_to_window(widget, window_show, "click", worker_entry, false);
325 break;
326 case BUILTIN_TYPE_DROPDOWN:
327 drop_view = new os::DropdownMenu(
328 os::Rect(
329 xpos, ypos,
330 xpos+widget->width, ypos+widget->height
331 ),
332 name
333 );
334 params[0] = add_ref(widget->label);
335 vis_list_first(params, worker_entry);
336 index = params[0];
337 while(index)
338 {
339 params[1] = add_ref(index);
340 params[0] = add_ref(widget->label);
341 vis_list_index(params, worker_entry);
342 if(params[0] && params[0]->company->type_id == BUILTIN_TYPE_STRING)
343 drop_view->AppendItem((char *)(params[0]->c.generic.data));
344 params[1] = index;
345 params[0] = add_ref(widget->label);
346 vis_list_next(params, worker_entry);
347 index = params[0];
348 }
349 release_ref(params[1]);
350 if(widget->selected_index >= 0)
351 drop_view->SetSelection(widget->selected_index, false);
352 else if(widget->value && widget->value->company->type_id == BUILTIN_TYPE_STRING)
353 drop_view->SetCurrentString((char *)(widget->value->c.generic.data));
354 drop_view->SetSendIntermediateMsg(true);
355 msg = handler_widget_to_window(widget, window_show, "change", worker_entry, true);
356 if(msg)
357 drop_view->SetEditMessage(msg);
358 msg = handler_widget_to_window(widget, window_show, "select", worker_entry, true);
359 if(msg)
360 drop_view->SetSelectionMessage(msg);
361 drop_view->SetTarget(window_show->wind);
362 widget_view = drop_view;
363 break;
364 default:
365 //Do error crap here
366 break;
367 }
368 if(parent_view) {
369 //widget_view->SetFlags(widget_view->GetFlags() | os::WID_TRANSPARENT);
370 parent_view->AddChild(widget_view);
371 } else {
372 DEBUGPUTS("Adding OS native object to window\n");
373 window_show->wind->AddChild(widget_view);
374 }
375
376 }
377
378 int vis_window_shown_addwidget(datum ** inputlist, queue_entry * worker_entry)
379 {
380 vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data);
381 window->wind->Lock();
382 add_widget_shared(window, inputlist[2], (char *)(inputlist[1]->c.generic.data), inputlist[3]->c.real, inputlist[4]->c.real, worker_entry, NULL);
383 window->wind->Unlock();
384 release_ref(inputlist[1]);
385 release_ref(inputlist[2]);
386 release_ref(inputlist[3]);
387 release_ref(inputlist[4]);
388 return 0;
389 }
390
391 int vis_window_show(datum ** inputlist, queue_entry * worker_entry)
392 {
393 vis_window * window = (vis_window *)(inputlist[0]->c.generic.data);
394 vis_window_shown * window_show;
395 list_data * list;
396 int i;
397 datum * params[2];
398 double xpos, ypos;
399 datum * widget_datum;
400 vis_widget * widget;
401 datum * show_datum = new_datum(BUILTIN_TYPE_WINDOW_SHOWN, 1, sizeof(vis_window_shown), worker_entry->instance->def->prog);
402 window_show = (vis_window_shown *)(show_datum->c.generic.data);
403 window_show->title = add_ref(window->title);
404 window_show->width = window->width;
405 window_show->height = window->height;
406 window_show->xpos = inputlist[1]->c.real;
407 release_ref(inputlist[1]);
408 window_show->ypos = inputlist[2]->c.real;
409 release_ref(inputlist[2]);
410 window_show->is_open = TRUE;
411 window_show->wait_entry = NULL;
412 window_show->next_msg_code = 0;
413 window_show->instance.def = worker_entry->instance->def;
414 window_show->widget_types = create_dict(worker_entry->instance->def->prog);
415
416 check_create_app();
417 VIS_InitializeCriticalSection(window_show->lock);
418 window_show->wind = new os_window(add_ref(show_datum));
419
420 window_show->handler_list = create_list(worker_entry->instance->def->prog);
421 list = (list_data *)(window->id_list->c.generic.data);
422 for(i = 0; i < list->num_entries; ++i)
423 {
424 DEBUGPRINTF("Retrieving widget %d\n", i);
425 params[0] = add_ref(window->widget_dict);
426 params[1] = add_ref(list->entries[i]);
427 vis_dict_index(params, NULL);
428 widget_datum = params[0];
429 DEBUGPRINTF("Retrieving xpos for widget: %d\n", i);
430 params[0] = add_ref(window->widget_xpos);
431 params[1] = add_ref(list->entries[i]);
432 DEBUGPUTS("Calling vis_dict_index(params, NULL) for xpos\n");
433 vis_dict_index(params, NULL);
434 DEBUGPUTS("After vis_dict_index\n");
435 xpos = params[0]->c.real;
436 DEBUGPUTS("Releasing xpos datum\n");
437 release_ref(params[0]);
438 DEBUGPRINTF("Retrieving ypos for widget: %d\n", i);
439 params[0] = add_ref(window->widget_ypos);
440 params[1] = add_ref(list->entries[i]);
441 DEBUGPUTS("Calling vis_dict_index(params, NULL) for ypos\n");
442 vis_dict_index(params, NULL);
443 DEBUGPUTS("After vis_dict_index\n");
444 ypos = params[0]->c.real;
445 DEBUGPUTS("Releasing ypos datum\n");
446 release_ref(params[0]);
447 add_widget_shared(window_show, widget_datum, (char *)(list->entries[i]->c.generic.data), xpos, ypos, worker_entry, NULL);
448 }
449
450 DEBUGPUTS("Showing window\n");
451 window_show->wind->MakeFocus();
452 window_show->wind->Show();
453 //resume_thread(spawn_thread("vis_mem_check", (void *)vis_mem_check, 1, 0, (void *)window_show));
454 //sleep(5);
455 release_ref(inputlist[0]);
456 inputlist[0] = show_datum;
457 return 0;
458 }
459
460
461 }
462
463 os_window::os_window(datum * vis_wind) : os::Window(
464 os::Rect(
465 ((vis_window_shown *)(vis_wind->c.generic.data))->xpos,
466 ((vis_window_shown *)(vis_wind->c.generic.data))->ypos,
467 ((vis_window_shown *)(vis_wind->c.generic.data))->xpos+((vis_window_shown *)(vis_wind->c.generic.data))->width,
468 ((vis_window_shown *)(vis_wind->c.generic.data))->ypos+((vis_window_shown *)(vis_wind->c.generic.data))->height),
469 "vis_wnd",
470 (char *)(((vis_window_shown *)(vis_wind->c.generic.data))->title->c.generic.data))
471 {
472 //DEBUGPRINTF("vis_wind lock: %d\n", ((vis_window_shown *)(vis_wind->c.generic.data))->lock);
473 this->vis_wind = vis_wind;
474 // this->current_focus = NULL;
475 }
476 os_window::~os_window()
477 {
478 vis_window_closed(this->vis_wind);
479 }
480
481 void empty_callback(worker_instance * caller_instance, int caller_workernum, worker_instance * done_instance, void * data)
482 {
483 }
484
485 void os_window::HandleMessage(os::Message * msg)
486 {
487 int returnval;
488 queue_entry entry;
489 datum * params[32];
490 datum * io_list;
491 datum * worker;
492 worker_datum * work;
493 int code = msg->GetCode();
494 DEBUGPRINTF("Message Code: %d\n", code);
495 DEBUGPRINTF("window->wind: %X\n", ((vis_window_shown *)(this->vis_wind->c.generic.data))->wind);
496 DEBUGPRINTF("vis_wind->ref_count: %X\n", this->vis_wind->ref_count);
497 params[0] = add_ref(((vis_window_shown *)(this->vis_wind->c.generic.data))->handler_list);
498 params[1] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, ((vis_window_shown *)(this->vis_wind->c.generic.data))->instance.def->prog);
499 params[1]->c.integers.num_a = code;
500 entry.worker_num = 0;
501 entry.instance = &(((vis_window_shown *)(this->vis_wind->c.generic.data))->instance);
502 vis_list_index(params, &entry);
503 if(params[0] && params[0]->company->type_id == BUILTIN_TYPE_WORKER)
504 {
505 worker = params[0];
506 work = (worker_datum *)(worker->c.generic.data);
507 params[0] = create_list(entry.instance->def->prog);
508 params[1] = add_ref(this->vis_wind);
509 vis_list_append(params, &entry);
510 io_list = params[0];
511 returnval = worker_populate_inputs(worker, io_list, params);
512 if(!returnval)
513 execute_def(work->def, entry, params, empty_callback);
514 }
515 DEBUGPRINTF("window->wind: %X\n", ((vis_window_shown *)(this->vis_wind->c.generic.data))->wind);
516 DEBUGPUTS("End: HandleMessage\n");
517 }
518 /*
519 void os_window::DispatchMessage(os::Message * pcMsg, os::Handler * pcHandler)
520 {
521 os::View * view;
522 os::View * handler_view;
523 //int code = pcMsg->GetCode();
524 pcMsg->FindPointer("_widget", (void **)&view);
525 if(view) {
526 handler_view = _FindHandler(view->m_nToken);
527 if(handler_view != view)
528 printf("DispatchMessage, message view: %X, handler view: %X\n", view, handler_view);
529
530 }
531 os::Window::DispatchMessage(pcMsg, pcHandler);
532 }
533
534 os::View *os_window::SetFocusNoHandler(os::View * new_focus )
535 {
536 ifthis->current_focus)
537 this->current_focus->Activated(false);
538 if(new_focus)
539 new_focus->Activated(true);
540 this->current_focus = new_focus;
541 return new_focus;
542 }*/
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561