// 17 january 2017
#include "drawtext.h"

static uiWindow *mainwin;
static uiBox *box;
static uiCombobox *exampleList;
static uiArea *area;
static uiAreaHandler handler;

#define nExamples 20
static struct example *examples[nExamples];
static int curExample = 0;

static void onExampleChanged(uiCombobox *c, void *data)
{
	uiControlHide(examples[curExample]->panel);
	curExample = uiComboboxSelected(exampleList);
	uiControlShow(examples[curExample]->panel);
	redraw();
}

void redraw(void)
{
	uiAreaQueueRedrawAll(area);
}

static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p)
{
	examples[curExample]->draw(p);
}

static void handlerMouseEvent(uiAreaHandler *a, uiArea *area, uiAreaMouseEvent *e)
{
	if (examples[curExample]->mouse != NULL)
		examples[curExample]->mouse(e);
}

static void handlerMouseCrossed(uiAreaHandler *ah, uiArea *a, int left)
{
	// do nothing
}

static void handlerDragBroken(uiAreaHandler *ah, uiArea *a)
{
	// do nothing
}

static int handlerKeyEvent(uiAreaHandler *ah, uiArea *a, uiAreaKeyEvent *e)
{
	if (examples[curExample]->key != NULL)
		return examples[curExample]->key(e);
	return 0;
}

static int onClosing(uiWindow *w, void *data)
{
	uiControlDestroy(uiControl(mainwin));
	uiQuit();
	return 0;
}

static int shouldQuit(void *data)
{
	uiControlDestroy(uiControl(mainwin));
	return 1;
}

int main(void)
{
	uiInitOptions o;
	const char *err;
	int n;

	handler.Draw = handlerDraw;
	handler.MouseEvent = handlerMouseEvent;
	handler.MouseCrossed = handlerMouseCrossed;
	handler.DragBroken = handlerDragBroken;
	handler.KeyEvent = handlerKeyEvent;

	memset(&o, 0, sizeof (uiInitOptions));
	err = uiInit(&o);
	if (err != NULL) {
		fprintf(stderr, "error initializing ui: %s\n", err);
		uiFreeInitError(err);
		return 1;
	}

	uiOnShouldQuit(shouldQuit, NULL);

	mainwin = uiNewWindow("libui Text-Drawing Example", 640, 480, 1);
	uiWindowOnClosing(mainwin, onClosing, NULL);

	box = uiNewVerticalBox();
	uiWindowSetChild(mainwin, uiControl(box));

	exampleList = uiNewCombobox();
	uiBoxAppend(box, uiControl(exampleList), 0);

	area = uiNewArea(&handler);
	uiBoxAppend(box, uiControl(area), 1);

	n = 0;
	examples[n] = mkBasicExample();
	uiComboboxAppend(exampleList, examples[n]->name);
	uiControlHide(examples[n]->panel);
	uiBoxAppend(box, examples[n]->panel, 0);
	n++;
	examples[n] = mkHitTestExample();
	uiComboboxAppend(exampleList, examples[n]->name);
	uiControlHide(examples[n]->panel);
	uiBoxAppend(box, examples[n]->panel, 0);
	n++;
	examples[n] = mkAttributesExample();
	uiComboboxAppend(exampleList, examples[n]->name);
	uiControlHide(examples[n]->panel);
	uiBoxAppend(box, examples[n]->panel, 0);
	n++;
	examples[n] = mkEmptyStringExample();
	uiComboboxAppend(exampleList, examples[n]->name);
	uiControlHide(examples[n]->panel);
	uiBoxAppend(box, examples[n]->panel, 0);
	n++;
	// and set things up for the initial state
	uiComboboxSetSelected(exampleList, 0);
	uiComboboxOnSelected(exampleList, onExampleChanged, NULL);
	// and set up the first one
	onExampleChanged(NULL, NULL);

	uiControlShow(uiControl(mainwin));
	uiMain();

	// TODO free examples

	uiUninit();
	return 0;
}