diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syl_window.cpp	Tue Apr 28 23:06:07 2009 +0000
@@ -0,0 +1,561 @@
+#include <util/application.h>
+#include <util/message.h>
+#include <gui/button.h>
+#include <gui/textview.h>
+#include <gui/control.h>
+#include <gui/checkbox.h>
+#include <gui/dropdownmenu.h>
+#include <atheos/threads.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include "syl_window.h"
+#include "structs.h"
+#include "debugmacros.h"
+#include "syl_generic.h"
+
+os::Application *app;
+
+extern "C" {
+
+
+void app_thread(void * param)
+{
+	DEBUGPUTS("Before app->Run()\n");
+	app->Run();
+	DEBUGPUTS("After app->Run()\n");
+}
+
+//VIS_CRITICAL_SECTION_EXTERN(app_lock)
+extern short app_lock;
+
+void check_create_app()
+{
+	VIS_EnterCriticalSection(app_lock);
+		if(!app)
+		{
+			
+			app = new os::Application("mime type goes here");
+			resume_thread(spawn_thread("vis_app", (void *)app_thread, 1, 0, NULL));
+			DEBUGPUTS("Created application object\n");
+		}
+	VIS_LeaveCriticalSection(app_lock);
+}
+
+int vis_window_get_value(datum ** inputlist, queue_entry * worker_entry)
+{
+	datum * output = NULL, *name;
+	os::String val;
+	os::Control * control = NULL;
+	os::DropdownMenu * drop;
+	vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data);
+	name = add_ref(inputlist[1]);
+	inputlist[2] = inputlist[1];
+	
+	DEBUGPUTS("Entering window lock\n");
+	VIS_EnterCriticalSection(window->lock);
+		inputlist[1] = add_ref(window->widget_types);
+		vis_dict_index(inputlist+1, worker_entry);
+		if(inputlist[1])
+		{
+			switch(inputlist[1]->c.integers.num_a)
+			{
+			case BUILTIN_TYPE_INPUTBOX:
+				control = (os::Control *)(window->wind->FindView((char *)(name->c.generic.data)));
+				if(control)
+				{
+					DEBUGPUTS("Before GetValue\n");
+					val = control->GetValue().AsString();
+					output = make_string(val.c_str(), val.CountChars(), worker_entry->instance->def->prog);
+				}
+				break;
+			case BUILTIN_TYPE_CHECKBOX:
+				control = (os::Control *)(window->wind->FindView((char *)(name->c.generic.data)));
+				if(control)
+				{
+					output = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->prog);
+					output->c.integers.num_a = control->GetValue().AsBool();
+				}
+				break;
+			case BUILTIN_TYPE_DROPDOWN:
+				drop = (os::DropdownMenu *)(window->wind->FindView((char *)(name->c.generic.data)));
+				if(drop)
+				{
+					val = drop->GetCurrentString();
+					output = make_string(val.c_str(), val.CountChars(), worker_entry->instance->def->prog);
+				}
+				break;
+			default:
+				printf("Unsupported widget type %d for Get Value\n", inputlist[1]->c.integers.num_a);
+				break;
+			}
+		}
+				
+	VIS_LeaveCriticalSection(window->lock);
+	DEBUGPUTS("Leaving window lock\n");
+	DEBUGPRINTF("window->wind: %X\n", window->wind);
+	DEBUGPRINTF("window->title: %X\n", window->title);
+	release_ref(inputlist[0]);
+	release_ref(inputlist[1]);
+	release_ref(name);
+	inputlist[0] = output;
+	return 0;
+}
+
+int vis_window_set_value(datum ** inputlist, queue_entry * worker_entry)
+{
+	datum *name, *value;
+	worker_def * converter;
+	os::String val;
+	os::Control * control = NULL;
+	os::DropdownMenu * drop;
+	vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data);
+	name = add_ref(inputlist[1]);
+	value = inputlist[2];
+	inputlist[2] = inputlist[1];
+	
+	DEBUGPUTS("Entering window lock\n");
+	VIS_EnterCriticalSection(window->lock);
+		inputlist[1] = add_ref(window->widget_types);
+		vis_dict_index(inputlist+1, worker_entry);
+		if(inputlist[1])
+		{
+			switch(inputlist[1]->c.integers.num_a)
+			{
+			case BUILTIN_TYPE_INPUTBOX:
+				control = (os::Control *)(window->wind->FindView((char *)(name->c.generic.data)));
+				if(control)
+				{
+					if(value->company->type_id != BUILTIN_TYPE_STRING)
+					{
+						converter = find_converter_method(BUILTIN_TYPE_STRING, value->company->type_id, worker_entry->instance->def->prog);
+						if(!converter)
+						{
+							if(worker_entry->instance) {
+								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);
+							} else {
+								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");
+							}
+							execute_active = FALSE;
+							VIS_PROFILE_END(PROF_PROCESS_WORKER);
+							return -3;
+						}
+						((worker_impl)(converter->implement_func))(&value, worker_entry);
+					}
+					control->SetValue(os::String((char *)(value->c.generic.data)), false);
+				}
+				break;
+			case BUILTIN_TYPE_CHECKBOX:
+				control = (os::Control *)(window->wind->FindView((char *)(name->c.generic.data)));
+				if(control)
+				{
+					if(value->company->type_id != BUILTIN_TYPE_YESNO)
+					{
+						converter = find_converter_method(BUILTIN_TYPE_YESNO, value->company->type_id, worker_entry->instance->def->prog);
+						if(!converter)
+						{
+							if(worker_entry->instance) {
+								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);
+							} else {
+								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");
+							}
+							execute_active = FALSE;
+							VIS_PROFILE_END(PROF_PROCESS_WORKER);
+							return -3;
+						}
+						((worker_impl)(converter->implement_func))(&value, worker_entry);
+					}
+					control->SetValue((bool)(value->c.integers.num_a), false);
+				}
+				break;
+			case BUILTIN_TYPE_DROPDOWN:
+				drop = (os::DropdownMenu *)(window->wind->FindView((char *)(name->c.generic.data)));
+				if(drop)
+				{
+					if(value->company->type_id != BUILTIN_TYPE_STRING)
+					{
+						converter = find_converter_method(BUILTIN_TYPE_STRING, value->company->type_id, worker_entry->instance->def->prog);
+						if(!converter)
+						{
+							if(worker_entry->instance) {
+								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);
+							} else {
+								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");
+							}
+							execute_active = FALSE;
+							VIS_PROFILE_END(PROF_PROCESS_WORKER);
+							return -3;
+						}
+						((worker_impl)(converter->implement_func))(&value, worker_entry);
+					}
+					drop->SetCurrentString(os::String((char *)(value->c.generic.data)));
+				}
+				break;
+			default:
+				printf("Unsupported widget type %d for Get Value\n", inputlist[1]->c.integers.num_a);
+				break;
+			}
+		}
+				
+	VIS_LeaveCriticalSection(window->lock);
+
+	release_ref(inputlist[1]);
+	release_ref(value);
+	return 0;
+}
+
+os::Message * handler_widget_to_window(vis_widget * widget, vis_window_shown * window_show, char * handler_name, queue_entry * entry, bool make_message)
+{
+	datum * params[3];
+	params[0] = add_ref(widget->handler_dict);
+	params[1] = make_string(handler_name, -1, entry->instance->def->prog);
+	DEBUGPUTS("Looking up click handler\n");
+	vis_dict_index(params, entry);
+	//if no handler is found, make sure to release output 2
+	if(params[1])
+		release_ref(params[1]);
+	if(params[0] || !make_message)
+	{
+		DEBUGPRINTF("Appending %X to handler list\n", params[0]);
+		params[1] = params[0];
+		params[0] = window_show->handler_list;
+		vis_list_append(params, NULL);
+		window_show->handler_list = params[0];
+		if(make_message)
+			return new os::Message(window_show->next_msg_code++);
+	}
+	return NULL;
+}
+
+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)
+{
+	datum * index;
+	os::View * widget_view;
+	os::TextView * text_view;
+	os::DropdownMenu * drop_view;
+	os::Message * msg;
+	vis_widget * widget;
+	datum * params[3];
+	params[0] = window_show->widget_types;
+	params[1] = make_string(name, -1, worker_entry->instance->def->prog);
+	params[2] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->prog);
+	params[2]->c.integers.num_a = widget_datum->company->type_id;
+	vis_dict_set(params, worker_entry);
+	window_show->widget_types = params[0];
+	widget = (vis_widget *)(widget_datum->c.generic.data);
+		DEBUGPUTS("Instantiating OS native widget object\n");
+		switch(widget_datum->company->type_id)
+		{
+			case BUILTIN_TYPE_BUTTON:
+				DEBUGPUTS("new os::Button()\n");
+				widget_view = new os::Button(
+					os::Rect(
+						xpos, ypos, 
+						xpos+widget->width, ypos+widget->height
+					), 
+					name, 
+					(char *)(widget->label->c.generic.data), 
+					new os::Message(window_show->next_msg_code++)
+				);
+				/*params[0] = add_ref(widget->handler_dict);
+				params[1] = new_datum(BUILTIN_TYPE_STRING, 1, 6, worker_entry->instance->def->prog);//click
+				strcpy((char *)(params[1]->c.generic.data), "click");
+				DEBUGPUTS("Looking up click handler\n");
+				vis_dict_index(params, worker_entry);
+				if(params[1])
+					release_ref(params[1]);
+				DEBUGPRINTF("Appending %X to handler list\n", params[0]);
+				params[1] = params[0];
+				params[0] = window_show->handler_list;
+				vis_list_append(params, worker_entry);
+				window_show->handler_list = params[0];*/
+				handler_widget_to_window(widget, window_show, "click", worker_entry, false);
+				break;
+			case BUILTIN_TYPE_INPUTBOX:
+				text_view = new os::TextView(
+					os::Rect(
+						xpos, ypos, 
+						xpos+widget->width, ypos+widget->height
+					),
+					name, 
+					(char *)(widget->value->c.generic.data)
+				);
+				switch(widget->flags)
+				{
+				case 1:
+					text_view->SetMultiLine();
+					break;
+				case 2:
+					text_view->SetNumeric(true);
+					break;
+				case 3:
+					text_view->SetPasswordMode();
+					break;
+				case 4:
+					text_view->SetReadOnly();
+					break;
+				default:
+					break;
+				}
+				widget_view = text_view;
+				break;
+			case BUILTIN_TYPE_CUSTOM_WIDGET:
+				DEBUGPUTS("Creating custom widget\n");
+				widget_view = new GenericView(
+					os::Rect(
+						xpos, ypos, 
+						xpos+widget->width, ypos+widget->height
+					),
+					name,
+					add_ref(widget_datum),
+					&(window_show->instance));
+				DEBUGPRINTF("Widget view: %X\n", widget_view);
+				break;
+			case BUILTIN_TYPE_CHECKBOX:
+				widget_view = new os::CheckBox(
+					os::Rect(
+						xpos, ypos,
+						xpos+widget->width, ypos+widget->height
+					),
+					name,
+					(char *)(widget->label->c.generic.data),
+					new os::Message(window_show->next_msg_code++)
+				);
+				handler_widget_to_window(widget, window_show, "click", worker_entry, false);
+				break;
+			case BUILTIN_TYPE_DROPDOWN:
+				drop_view = new os::DropdownMenu(
+					os::Rect(
+						xpos, ypos,
+						xpos+widget->width, ypos+widget->height
+					),
+					name
+				);
+				params[0] = add_ref(widget->label);
+				vis_list_first(params, worker_entry);
+				index = params[0];
+				while(index)
+				{
+					params[1] = add_ref(index);
+					params[0] = add_ref(widget->label);
+					vis_list_index(params, worker_entry);
+					if(params[0] && params[0]->company->type_id == BUILTIN_TYPE_STRING)
+						drop_view->AppendItem((char *)(params[0]->c.generic.data));
+					params[1] = index;
+					params[0] = add_ref(widget->label);
+					vis_list_next(params, worker_entry);
+					index = params[0];
+				}
+				release_ref(params[1]);
+				if(widget->selected_index >= 0)
+					drop_view->SetSelection(widget->selected_index, false);
+				else if(widget->value && widget->value->company->type_id == BUILTIN_TYPE_STRING)
+					drop_view->SetCurrentString((char *)(widget->value->c.generic.data));
+				drop_view->SetSendIntermediateMsg(true);
+				msg = handler_widget_to_window(widget, window_show, "change", worker_entry, true);
+				if(msg)
+					drop_view->SetEditMessage(msg);
+				msg = handler_widget_to_window(widget, window_show, "select", worker_entry, true);
+				if(msg)
+					drop_view->SetSelectionMessage(msg);
+				drop_view->SetTarget(window_show->wind);
+				widget_view = drop_view;
+				break;
+			default:
+				//Do error crap here
+				break;
+		}
+		if(parent_view) {
+			//widget_view->SetFlags(widget_view->GetFlags() | os::WID_TRANSPARENT);
+			parent_view->AddChild(widget_view);
+		} else {
+			DEBUGPUTS("Adding OS native object to window\n");
+			window_show->wind->AddChild(widget_view);
+		}
+	
+}
+
+int vis_window_shown_addwidget(datum ** inputlist, queue_entry * worker_entry)
+{
+	vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data);
+	window->wind->Lock();
+	add_widget_shared(window, inputlist[2], (char *)(inputlist[1]->c.generic.data), inputlist[3]->c.real, inputlist[4]->c.real, worker_entry, NULL);
+	window->wind->Unlock();
+	release_ref(inputlist[1]);
+	release_ref(inputlist[2]);
+	release_ref(inputlist[3]);
+	release_ref(inputlist[4]);
+	return 0;
+}
+
+int vis_window_show(datum ** inputlist, queue_entry * worker_entry)
+{
+	vis_window * window = (vis_window *)(inputlist[0]->c.generic.data);
+	vis_window_shown * window_show;
+	list_data * list;
+	int i;
+	datum * params[2];
+	double xpos, ypos;
+	datum * widget_datum;
+	vis_widget * widget;
+	datum * show_datum = new_datum(BUILTIN_TYPE_WINDOW_SHOWN, 1, sizeof(vis_window_shown), worker_entry->instance->def->prog);
+	window_show = (vis_window_shown *)(show_datum->c.generic.data);
+	window_show->title = add_ref(window->title);
+	window_show->width = window->width;
+	window_show->height = window->height;
+	window_show->xpos = inputlist[1]->c.real;
+	release_ref(inputlist[1]);
+	window_show->ypos = inputlist[2]->c.real;
+	release_ref(inputlist[2]);
+	window_show->is_open = TRUE;
+	window_show->wait_entry = NULL;
+	window_show->next_msg_code = 0;
+	window_show->instance.def = worker_entry->instance->def;
+	window_show->widget_types = create_dict(worker_entry->instance->def->prog);
+	
+	check_create_app();
+	VIS_InitializeCriticalSection(window_show->lock);
+	window_show->wind = new os_window(add_ref(show_datum));
+	
+	window_show->handler_list = create_list(worker_entry->instance->def->prog);
+	list = (list_data *)(window->id_list->c.generic.data);
+	for(i = 0; i < list->num_entries; ++i)
+	{
+		DEBUGPRINTF("Retrieving widget %d\n", i);
+		params[0] = add_ref(window->widget_dict);
+		params[1] = add_ref(list->entries[i]);
+		vis_dict_index(params, NULL);
+		widget_datum = params[0];
+		DEBUGPRINTF("Retrieving xpos for widget: %d\n", i);
+		params[0] = add_ref(window->widget_xpos);
+		params[1] = add_ref(list->entries[i]);
+		DEBUGPUTS("Calling vis_dict_index(params, NULL) for xpos\n");
+		vis_dict_index(params, NULL);
+		DEBUGPUTS("After vis_dict_index\n");
+		xpos = params[0]->c.real;
+		DEBUGPUTS("Releasing xpos datum\n");
+		release_ref(params[0]);
+		DEBUGPRINTF("Retrieving ypos for widget: %d\n", i);
+		params[0] = add_ref(window->widget_ypos);
+		params[1] = add_ref(list->entries[i]);
+		DEBUGPUTS("Calling vis_dict_index(params, NULL) for ypos\n");
+		vis_dict_index(params, NULL);
+		DEBUGPUTS("After vis_dict_index\n");
+		ypos = params[0]->c.real;
+		DEBUGPUTS("Releasing ypos datum\n");
+		release_ref(params[0]);
+		add_widget_shared(window_show, widget_datum, (char *)(list->entries[i]->c.generic.data), xpos, ypos, worker_entry, NULL);
+	}
+
+	DEBUGPUTS("Showing window\n");
+	window_show->wind->MakeFocus();
+	window_show->wind->Show();
+	//resume_thread(spawn_thread("vis_mem_check", (void *)vis_mem_check, 1, 0, (void *)window_show));
+	//sleep(5);
+	release_ref(inputlist[0]);
+	inputlist[0] = show_datum;
+	return 0;
+}
+
+
+}
+
+os_window::os_window(datum * vis_wind) : os::Window(
+											os::Rect(
+												((vis_window_shown *)(vis_wind->c.generic.data))->xpos, 
+												((vis_window_shown *)(vis_wind->c.generic.data))->ypos, 
+												((vis_window_shown *)(vis_wind->c.generic.data))->xpos+((vis_window_shown *)(vis_wind->c.generic.data))->width,
+												((vis_window_shown *)(vis_wind->c.generic.data))->ypos+((vis_window_shown *)(vis_wind->c.generic.data))->height), 
+											"vis_wnd", 
+											(char *)(((vis_window_shown *)(vis_wind->c.generic.data))->title->c.generic.data))
+{
+	//DEBUGPRINTF("vis_wind lock: %d\n", ((vis_window_shown *)(vis_wind->c.generic.data))->lock);
+	this->vis_wind = vis_wind;
+//	this->current_focus = NULL;
+}
+os_window::~os_window()
+{
+	vis_window_closed(this->vis_wind);
+}
+
+void empty_callback(worker_instance * caller_instance, int caller_workernum, worker_instance * done_instance, void * data)
+{
+}
+
+void os_window::HandleMessage(os::Message * msg)
+{
+	int returnval;
+	queue_entry entry;
+	datum * params[32];
+	datum * io_list;
+	datum * worker;
+	worker_datum * work;
+	int code = msg->GetCode();
+	DEBUGPRINTF("Message Code: %d\n", code);
+	DEBUGPRINTF("window->wind: %X\n", ((vis_window_shown *)(this->vis_wind->c.generic.data))->wind);
+	DEBUGPRINTF("vis_wind->ref_count: %X\n", this->vis_wind->ref_count);
+	params[0] = add_ref(((vis_window_shown *)(this->vis_wind->c.generic.data))->handler_list);
+	params[1] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, ((vis_window_shown *)(this->vis_wind->c.generic.data))->instance.def->prog);
+	params[1]->c.integers.num_a = code;
+	entry.worker_num = 0;
+		entry.instance = &(((vis_window_shown *)(this->vis_wind->c.generic.data))->instance);
+	vis_list_index(params, &entry);
+	if(params[0] && params[0]->company->type_id == BUILTIN_TYPE_WORKER)
+	{
+		worker = params[0];
+		work = (worker_datum *)(worker->c.generic.data);
+		params[0] = create_list(entry.instance->def->prog);
+		params[1] = add_ref(this->vis_wind);
+		vis_list_append(params, &entry);
+		io_list = params[0];
+		returnval = worker_populate_inputs(worker, io_list, params);
+		if(!returnval)
+			execute_def(work->def, entry, params, empty_callback);
+	}
+	DEBUGPRINTF("window->wind: %X\n", ((vis_window_shown *)(this->vis_wind->c.generic.data))->wind);
+	DEBUGPUTS("End: HandleMessage\n");
+}
+/*
+void os_window::DispatchMessage(os::Message * pcMsg, os::Handler * pcHandler)
+{
+	os::View * view;
+	os::View * handler_view;
+	//int code = pcMsg->GetCode();
+	pcMsg->FindPointer("_widget", (void **)&view);
+	if(view) {
+		handler_view = _FindHandler(view->m_nToken);
+		if(handler_view != view)
+			printf("DispatchMessage, message view: %X, handler view: %X\n", view, handler_view);
+		
+	}
+	os::Window::DispatchMessage(pcMsg, pcHandler);
+}
+
+os::View *os_window::SetFocusNoHandler(os::View * new_focus )
+{
+	ifthis->current_focus)
+		this->current_focus->Activated(false);
+	if(new_focus)
+		new_focus->Activated(true);
+	this->current_focus = new_focus;
+	return new_focus;
+}*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+