// 17 february 2015

#ifndef __GO_UI_WINTABLE_INCLUDETHIS_H__
#define __GO_UI_WINTABLE_INCLUDETHIS_H__

#define tableWindowClass L"gouitable"

// start at WM_USER + 20 just in case for whatever reason we ever get the various dialog manager messages (see also http://blogs.msdn.com/b/oldnewthing/archive/2003/10/21/55384.aspx)
// each of these returns nothing unless otherwise indicated
enum {
	// wParam - one of the type constants
	// lParam - column name as a Unicode string
	tableAddColumn = WM_USER + 20,
	// wParam - 0
	// lParam - pointer to intptr_t containing new count
	tableSetRowCount,
	// wParam - pointer to intptr_t where selected row will be stored
	// lParam - pointer to intptr_t where selected column will be stored
	// both will be -1 for no selection
	// if either is NULL, that value is not written
	tableGetSelection,
	// wParam - pointer to intptr_t containing selected row
	// lParam - pointer to intptr_t containing selected column
	// if lParam is NULL, do not change selected column (selects column 0 if nothing previously selected; TODO explicitly document this?)
	// TODO allow wParam to be NULL too; should both being NULL select nothing or keep the current selection?
	// this WILL result in a selection changed notification (TODO work into the package ui Table)
	tableSetSelection,
};

enum {
	tableColumnText,
	tableColumnImage,
	tableColumnCheckbox,
	nTableColumnTypes,
};

// notification codes
// note that these are positive; see http://blogs.msdn.com/b/oldnewthing/archive/2009/08/21/9877791.aspx
// each of these is of type tableNM
// all fields except data will always be set
enum {
	// data parameter is always 0
	// for tableColumnText return should be WCHAR *
	// for tableColumnImage return should be HBITMAP
	// for tableColumnCheckbox return is nonzero for checked, zero for unchecked
	tableNotificationGetCellData,
	// data parameter is pointer, same as tableNotificationGetCellData
	// not sent for checkboxes
	// no return
	tableNotificationFinishedWithCellData,
	// data is zero
	// no return
	tableNotificationCellCheckboxToggled,
	// sent even on deselection (in that case, row == -1 and column == -1)
	// data is zero
	// no return
	tableNotificationSelectionChanged,
};

typedef struct tableNM tableNM;

struct tableNM {
	NMHDR nmhdr;
	intptr_t row;
	intptr_t column;
	int columnType;
	uintptr_t data;
};

// TODO have hInstance passed in
extern void initTable(void (*panicfunc)(const char *msg, DWORD lastError), BOOL (*WINAPI tme)(LPTRACKMOUSEEVENT));

#endif