// 8 october 2015
#include "test.h"

static uiArea *area;
static uiCombobox *which;
static uiSpinbox *hamount;
static uiSpinbox *vamount;

struct handler {
	uiAreaHandler ah;
};

static struct handler handler;

static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p)
{
	runDrawTest(uiComboboxSelected(which), p);
}

static uintmax_t handlerHScrollMax(uiAreaHandler *a, uiArea *area)
{
	return uiSpinboxValue(hamount);
}

static uintmax_t handlerVScrollMax(uiAreaHandler *a, uiArea *area)
{
	return uiSpinboxValue(vamount);
}

static int handlerRedrawOnResize(uiAreaHandler *a, uiArea *area)
{
	// TODO make a checkbox
	return uiSpinboxValue(hamount) == 0 && uiSpinboxValue(vamount) == 0;
}

static void handlerMouseEvent(uiAreaHandler *a, uiArea *area, uiAreaMouseEvent *e)
{
	printf("mouse (%d,%d):(%d,%d) down:%d up:%d count:%d mods:%x held:%x\n",
		(int) e->X,
		(int) e->Y,
		(int) e->HScrollPos,
		(int) e->VScrollPos,
		(int) e->Down,
		(int) e->Up,
		(int) e->Count,
		(uint32_t) e->Modifiers,
		e->Held1To64);
}

static void handlerDragBroken(uiAreaHandler *ah, uiArea *a)
{
	printf("drag broken\n");
}

static int handlerKeyEvent(uiAreaHandler *ah, uiArea *a, uiAreaKeyEvent *e)
{
	char k[4];

	k[0] = '\'';
	k[1] = e->Key;
	k[2] = '\'';
	k[3] = '\0';
	if (e->Key == 0) {
		k[0] = '0';
		k[1] = '\0';
	}
	printf("key key:%s extkey:%d mod:%d mods:%d up:%d\n",
		k,
		(int) e->ExtKey,
		(int) e->Modifier,
		(int) e->Modifiers,
		e->Up);
	return 0;
}

static void onAmountChanged(uiSpinbox *s, void *data)
{
	uiAreaUpdateScroll(area);
}

static void shouldntHappen(uiCombobox *c, void *data)
{
	fprintf(stderr, "YOU SHOULD NOT SEE THIS. If you do, uiComboboxSetSelected() is triggering uiComboboxOnSelected(), which it should not.\n");
}

static void redraw(uiCombobox *c, void *data)
{
	uiAreaQueueRedrawAll(area);
}

uiBox *makePage6(void)
{
	uiBox *page6;
	uiBox *hbox;

	handler.ah.Draw = handlerDraw;
	handler.ah.HScrollMax = handlerHScrollMax;
	handler.ah.VScrollMax = handlerVScrollMax;
	handler.ah.RedrawOnResize = handlerRedrawOnResize;
	handler.ah.MouseEvent = handlerMouseEvent;
	handler.ah.DragBroken = handlerDragBroken;
	handler.ah.KeyEvent = handlerKeyEvent;

	page6 = newVerticalBox();

	hbox = newHorizontalBox();
	uiBoxAppend(page6, uiControl(hbox), 0);

	which = uiNewCombobox();
	populateComboboxWithTests(which);
	// this is to make sure that uiComboboxOnSelected() doesn't trigger with uiComboboxSetSelected()
	uiComboboxOnSelected(which, shouldntHappen, NULL);
	uiComboboxSetSelected(which, 0);
	uiComboboxOnSelected(which, redraw, NULL);
	uiBoxAppend(hbox, uiControl(which), 0);

	// make these first in case the area handler calls the information as part of the constructor
	hamount = uiNewSpinbox(0, 100000);
	uiSpinboxOnChanged(hamount, onAmountChanged, NULL);
	vamount = uiNewSpinbox(0, 100000);
	uiSpinboxOnChanged(vamount, onAmountChanged, NULL);

	area = uiNewArea((uiAreaHandler *) (&handler));
	uiBoxAppend(page6, uiControl(area), 1);

	hbox = newHorizontalBox();
	uiBoxAppend(hbox, uiControl(uiNewLabel("H ")), 0);
	uiBoxAppend(hbox, uiControl(hamount), 0);
	uiBoxAppend(hbox, uiControl(uiNewLabel(" V ")), 0);
	uiBoxAppend(hbox, uiControl(vamount), 0);
	uiBoxAppend(page6, uiControl(hbox), 0);

	return page6;
}