// 28 july 2014

#include "winapi_windows.h"
#include "_cgo_export.h"

#include "wintable/main.h"

// provided for cgo's benefit
LPWSTR xtableWindowClass = tableWindowClass;

void doInitTable(void)
{
	initTable(xpanic, fv__TrackMouseEvent);
}

static LRESULT CALLBACK tableSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR id, DWORD_PTR data)
{
	NMHDR *nmhdr = (NMHDR *) lParam;
	tableNM *tnm = (tableNM *) lParam;
	void *gotable = (void *) data;

	switch (uMsg) {
	case msgNOTIFY:
		switch (nmhdr->code) {
		case tableNotificationGetCellData:
			return tableGetCell(gotable, tnm);
		case tableNotificationFinishedWithCellData:
			tableFreeCellData(gotable, tnm->data);
			return 0;
		case tableNotificationCellCheckboxToggled:
			tableToggled(gotable, tnm->row, tnm->column);
			return 0;
		case tableNotificationSelectionChanged:
			tableSelectionChanged(gotable);
			return 0;
		}
		return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
/* TODO
	// see table.autoresize() in table_windows.go for the column autosize policy
	case WM_NOTIFY:		// from the contained header control
		if (nmhdr->code == HDN_BEGINTRACK)
			tableStopColumnAutosize(t->gotable);
		return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
*/
	case WM_NCDESTROY:
		if ((*fv_RemoveWindowSubclass)(hwnd, tableSubProc, id) == FALSE)
			xpanic("error removing Table subclass (which was for its own event handler)", GetLastError());
		return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
	default:
		return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
	}
	xmissedmsg("Table", "tableSubProc()", uMsg);
	return 0;		// unreached
}

void setTableSubclass(HWND hwnd, void *data)
{
	if ((*fv_SetWindowSubclass)(hwnd, tableSubProc, 0, (DWORD_PTR) data) == FALSE)
		xpanic("error subclassing Table to give it its own event handler", GetLastError());
}

// TODO rename all of these functions to start with gotable, and all the exported ones in Go too
void gotableSetRowCount(HWND hwnd, intptr_t count)
{
	SendMessageW(hwnd, tableSetRowCount, 0, (LPARAM) (&count));
}

void tableAutosizeColumns(HWND hwnd, int nColumns)
{
	int i;

	for (i = 0; i < nColumns; i++)
		if (SendMessageW(hwnd, LVM_SETCOLUMNWIDTH, (WPARAM) i, (LPARAM) LVSCW_AUTOSIZE_USEHEADER) == FALSE)
			xpanic("error resizing columns of results list view", GetLastError());
}

intptr_t tableSelectedItem(HWND hwnd)
{
	intptr_t row;

	SendMessageW(hwnd, tableGetSelection, (WPARAM) (&row), (LPARAM) NULL);
	return row;
}

void tableSelectItem(HWND hwnd, intptr_t index)
{
	SendMessageW(hwnd, tableSetSelection, (WPARAM) (&index), (LPARAM) NULL);
}