view window.c @ 75:0083b2f7b3c7

Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
author Mike Pavone <pavone@retrodev.com>
date Tue, 06 Jul 2010 07:52:59 -0400
parents 94c885692eb5
children
line wrap: on
line source

#include <stdlib.h>
#include <string.h>
#include "structs.h"
#include "datum.h"
#include "interp.h"
#include "vis_threading.h"
#include "debugmacros.h"

#ifdef SYLLABLE
#include "syl_window.h"
VIS_CRITICAL_SECTION(app_lock);
#else
	#ifdef GTK
#include "gtk_window.h"
VIS_CRITICAL_SECTION(gtk_init_lock);
	#else
		#ifdef WIN32
#include "ms_window.h"
VIS_CRITICAL_SECTION(hwnd_lock);	
		#endif
	#endif
#endif

/*
typedef struct
{
	os::Window * wind;
	int refcount;
	VIS_CRITICAL_SECTION(lock)
} os_window;

typedef struct
{
	os_window * os_wind;
	datum * title;
	double width;
	double height;
	double xpos;
	double ypos;
} vis_window_shown;*/

void vis_window_init()
{
	#ifdef SYLLABLE
		DEBUGPUTS("Initializing app_lock");
		
		VIS_InitializeCriticalSection(app_lock);
	#else
		#ifdef GTK
			VIS_InitializeCriticalSection(gtk_init_lock);
		#else
			#ifdef WIN32
				VIS_InitializeCriticalSection(hwnd_lock);
			#endif
		#endif
	#endif
}

int vis_window_new(datum ** inputlist, queue_entry * worker_entry)
{
	vis_window * window;
	datum * window_datum = new_datum(BUILTIN_TYPE_WINDOW, 1, sizeof(vis_window), worker_entry->instance->def->program);
	window = (vis_window *)(window_datum->c.generic.data);
	window->title = inputlist[0];
	DEBUGPRINTF("Type: %d\n", window->title->company->type_id);
	DEBUGPRINTF("Length: %d\n", window->title->c.generic.len);
	window->width = inputlist[1]->c.real;
	window->height = inputlist[2]->c.real;

	window->widget_dict = create_dict(worker_entry->instance->def->program);
	window->widget_xpos = create_dict(worker_entry->instance->def->program);
	window->widget_ypos = create_dict(worker_entry->instance->def->program);
	window->id_list = create_list(worker_entry->instance->def->program);
	window->menu = NULL;
	release_ref(inputlist[1]);
	release_ref(inputlist[2]);
	inputlist[0] = window_datum;
	return 0;
}

int vis_window_add_widget(datum ** inputlist, queue_entry * worker_entry)
{
	datum * params[3];
	vis_window * window;
	inputlist[0] = copy_datum(inputlist[0], 0);
	window = (vis_window *)(inputlist[0]->c.generic.data);
	DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes);
	params[0] = window->widget_dict;
	params[1] = add_ref(inputlist[1]);
	params[2] = inputlist[2];
	DEBUGPUTS("Adding widget to widget_dict\n");
	DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes);
	DEBUGPRINTF("widget_dict->datas: %X, xpos->datas: %X\n", window->widget_dict->c.generic.data, window->widget_xpos->c.generic.data);
	DEBUGPRINTF("sizeof(dict_data): %d, sizeof(ternary_node), %d\n", sizeof(dict_data), sizeof(ternary_node));
	vis_dict_set(params, NULL);
	DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes);
	window->widget_dict = params[0];
	params[0] = window->widget_xpos;
	params[1] = add_ref(inputlist[1]);
	params[2] = inputlist[3];
	DEBUGPUTS("Adding xpos to xpos_dict\n");
	vis_dict_set(params, NULL);
	window->widget_xpos = params[0];
	params[0] = window->widget_ypos;
	params[1] = add_ref(inputlist[1]);
	params[2] = inputlist[4];
	DEBUGPUTS("Adding ypos to ypos_dict\n");
	vis_dict_set(params, NULL);
	window->widget_ypos = params[0];
	params[0] = window->id_list;
	params[1] = inputlist[1];
	DEBUGPUTS("Adding id to id list\n");
	DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes);
	vis_list_append(params, NULL);
	window->id_list = params[0];
	return 0;
}

int vis_window_wait_close(datum ** inputlist, queue_entry * worker_entry)
{
	vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data);
	VIS_EnterCriticalSection(window->lock);
		if(window->is_open && !window->wait_entry)
		{
			window->wait_entry = (queue_entry *)malloc(sizeof(queue_entry));
			memcpy(window->wait_entry, worker_entry, sizeof(queue_entry));
	VIS_LeaveCriticalSection(window->lock);
			release_ref(inputlist[0]);
			return 1;
		}
		else
		{
	VIS_LeaveCriticalSection(window->lock);
			release_ref(inputlist[0]);
			inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
			datum_set_yesno(inputlist[0], DATUM_NO);
			return 0;
		}
}



void vis_window_closed(datum * window_datum)
{
	datum * params[1];
	queue_entry * temp;
	vis_window_shown * window = (vis_window_shown *)(window_datum->c.generic.data);

	VIS_EnterCriticalSection(window->lock);
		window->is_open = FALSE;
		//window->wind = NULL;
		temp = window->wait_entry;
		window->wait_entry = NULL;
	VIS_LeaveCriticalSection(window->lock);
	release_ref(window_datum);
	if(temp)
	{
		//TODO send YESNO output
		params[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, temp->instance->def->program);
		datum_set_yesno(params[0], DATUM_YES);
		process_outputs(params, temp->worker_num, temp->instance);
		//worker_complete(*temp);
		cleanup_check(*temp);
		free(temp);
	}
	
}

void widget_new(datum ** inputlist, int type, program * prog)
{
	vis_widget * widget;
	datum * output = new_datum(type, 1, sizeof(vis_widget), prog);
	widget = (vis_widget *)(output->c.generic.data);
	widget->label = inputlist[0];
	widget->width = inputlist[1]->c.real;
	release_ref(inputlist[1]);
	widget->height = inputlist[2]->c.real;
	release_ref(inputlist[2]);
	widget->handler_dict = create_dict(prog);
	widget->value = NULL;
	DEBUGPRINTF("widget_new: type = %d, handler_dict = %X\n", type, widget->handler_dict);
	inputlist[0] = output;
}

int vis_button_new(datum ** inputlist, queue_entry * worker_entry)
{
	widget_new(inputlist, BUILTIN_TYPE_BUTTON, worker_entry->instance->def->program);
	return 0;
}

int vis_button_set_handler(datum ** inputlist, queue_entry * workere_entry)
{
	vis_widget * widget;
	datum * params[3];
	inputlist[0] = copy_datum(inputlist[0], 0);
	widget = (vis_widget *)(inputlist[0]->c.generic.data);
	params[0] = widget->handler_dict;
	params[1] = inputlist[1];
	params[2] = inputlist[2];
	//DEBUGPUTS("\n\nvis_button_set_handler vis_dict_set\n");
	vis_dict_set(params, NULL);
	DEBUGPUTS("after vis_dict_set\n\n\n");
	widget->handler_dict = params[0];
	return 0;
}

int vis_inputbox_new(datum ** inputlist, queue_entry * worker_entry)
{
	vis_widget * widget;
	datum * output = new_datum(BUILTIN_TYPE_INPUTBOX, 1, sizeof(vis_widget), worker_entry->instance->def->program);
	widget = (vis_widget *)(output->c.generic.data);
	widget->value = inputlist[0];
	widget->width = inputlist[1]->c.real;
	release_ref(inputlist[1]);
	widget->height = inputlist[2]->c.real;
	release_ref(inputlist[2]);
	widget->label = NULL;
	widget->handler_dict = NULL;
	widget->flags = 0;
	inputlist[0] = output;
	return 0;
}

int vis_inputbox_settype(datum ** inputlist, queue_entry * worker_entry)
{
	vis_widget * widget;
	inputlist[0] = copy_datum(inputlist[0], 0);
	widget = (vis_widget *)(inputlist[0]->c.generic.data);
	if(!strcmp((char *)(inputlist[1]->c.generic.data), "multiline"))
		widget->flags = 1;
	else if(!strcmp((char *)(inputlist[1]->c.generic.data), "numeric"))
		widget->flags = 2;
	else if(!strcmp((char *)(inputlist[1]->c.generic.data), "password"))
		widget->flags = 3;
	else if(!strcmp((char *)(inputlist[1]->c.generic.data), "read only"))
		widget->flags = 4;
	else
		widget->flags = 0;
	return 0;
}

int vis_customwidget_new(datum ** inputlist, queue_entry * worker_entry)
{
	widget_new(inputlist, BUILTIN_TYPE_CUSTOM_WIDGET, worker_entry->instance->def->program);
	return 0;
}


int vis_checkbox_new(datum ** params, queue_entry * entry)
{
	vis_widget * widget;
	widget_new(params, BUILTIN_TYPE_CHECKBOX, entry->instance->def->program);
	widget = params[0]->c.generic.data;
	widget->value = params[3];
	return 0;
}

int vis_dropdown_new(datum ** params, queue_entry * entry)
{
	vis_widget * widget;
	widget_new(params, BUILTIN_TYPE_DROPDOWN, entry->instance->def->program);
	widget = params[0]->c.generic.data;
	widget->selected_index = -1;
	return 0;
}

//Also used for Set Data@Datagrid
int vis_dropdown_settext(datum ** params, queue_entry * entry)
{
	vis_widget * widget;
	params[0] = copy_datum(params[0], 0);
	widget = params[0]->c.generic.data;
	widget->selected_index = -1;
	release_ref(widget->value);
	widget->value = params[1];
	return 0;
}

int vis_dropdown_select(datum ** params, queue_entry * entry)
{
	vis_widget * widget;
	params[0] = copy_datum(params[0], 0);
	widget = params[0]->c.generic.data;
	release_ref(widget->value);
	widget->value = NULL;
	widget->selected_index = params[1]->c.integers.num_a;
	release_ref(params[1]);
	return 0;
}

int vis_datagrid_new(datum ** inputlist, queue_entry * worker_entry)
{
	widget_new(inputlist, BUILTIN_TYPE_DATAGRID, worker_entry->instance->def->program);
	return 0;
}

int vis_menu_new(datum ** inputlist, queue_entry * worker_entry)
{
	vis_menu * menu;
	inputlist[0] = new_datum(BUILTIN_TYPE_MENU, 1, sizeof(vis_menu), worker_entry->instance->def->program);
	menu = inputlist[0]->c.generic.data;
	menu->label_list = create_list(worker_entry->instance->def->program);
	menu->action_list = create_list(worker_entry->instance->def->program);
	return 0;
}

int vis_menu_add_item(datum ** inputlist, queue_entry * worker_entry)
{
	datum * wparams[2];
	vis_menu * menu;
	inputlist[0] = copy_datum(inputlist[0], 0);
	menu = inputlist[0]->c.generic.data;
	wparams[0] = menu->label_list;
	wparams[1] = inputlist[1];
	vis_list_append(wparams, worker_entry);
	menu->label_list = wparams[0];
	wparams[0] = menu->action_list;
	wparams[1] = inputlist[2];
	vis_list_append(wparams, worker_entry);
	menu->action_list = wparams[0];
	return 0;
}

int vis_window_set_menu(datum ** inputlist, queue_entry * worker_entry)
{
	vis_window * window;
	inputlist[0] = copy_datum(inputlist[0], 0);
	window = inputlist[0]->c.generic.data;
	release_ref(window->menu);
	window->menu = inputlist[1];
	return 0;
}