// 18 october 2015
#include "uipriv_unix.h"

struct uiTable {
	uiUnixControl c;
	GtkWidget *widget;
	GtkContainer *scontainer;
	GtkScrolledWindow *sw;
	GtkWidget *treeWidget;
	GtkTreeView *treeview;
	GtkTreeSelection *selection;
	uiTableModel *model;
};

uiUnixDefineControl(
	uiTable,								// type name
	uiTableType							// type function
)

void uiTableSetModel(uiTable *t, uiTableModel *m)
{
	t->model = m;
	gtk_tree_view_set_model(t->treeview, GTK_TREE_MODEL(t->model));
}

void uiTableAppendColumn(uiTable *t, uiTableColumnParams *p)
{
	GtkTreeViewColumn *col;
	GtkCellRenderer *r;
	const char *attribute;
	const char *mutableAttr;
	gboolean mutable;

	switch (p->Type) {
	case uiTableColumnText:
		r = gtk_cell_renderer_text_new();
		attribute = "text";
		mutableAttr = "editable";
		break;
//TODO	case uiTableColumnImage:
		// TODO
	case uiTableColumnCheckbox:
		r = gtk_cell_renderer_toggle_new();
		attribute = "active";
		mutableAttr = "activatable";
		break;
	default:
		complain("unknown table column type %d in uiTableAppendColumn()", p->Type);
	}
	mutable = FALSE;
	if (p->Mutable)
		mutable = TRUE;
	g_object_set(r,
		mutableAttr, mutable,
		NULL);
	col = gtk_tree_view_column_new_with_attributes(p->Name, r,
		attribute, p->ValueColumn,
		NULL);
	// allow columns to be resized
	gtk_tree_view_column_set_resizable(col, TRUE);
	gtk_tree_view_append_column(t->treeview, col);
}

uiTable *uiNewTable(void)
{
	uiTable *t;

	t = (uiTable *) uiNewControl(uiTableType());

	t->widget = gtk_scrolled_window_new(NULL, NULL);
	t->scontainer = GTK_CONTAINER(t->widget);
	t->sw = GTK_SCROLLED_WINDOW(t->widget);

	t->treeWidget = gtk_tree_view_new();
	t->treeview = GTK_TREE_VIEW(t->treeWidget);

	t->selection = gtk_tree_view_get_selection(t->treeview);

	// give a border and add the table
	gtk_scrolled_window_set_shadow_type(t->sw, GTK_SHADOW_IN);
	gtk_container_add(t->scontainer, t->treeWidget);
	// and make the table visible; only the scrolled window's visibility is controlled by libui
	gtk_widget_show(t->treeWidget);

	uiUnixFinishNewControl(t, uiTable);

	return t;
}
