summaryrefslogtreecommitdiff
path: root/prev/wintable/api.h
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2015-12-11 20:37:59 -0500
committerPietro Gagliardi <[email protected]>2015-12-11 20:37:59 -0500
commitf8e3f12ab02b528f2a05a4f713d7af7ea8e44b42 (patch)
tree82dedf4d37f0f6d31e88ebb2ca1ce6499dead261 /prev/wintable/api.h
parente34c561ed5bedeb180437ec165882b98d70d38c1 (diff)
LET'S GET THIS FINAL REWRITE EVER STARTED
Diffstat (limited to 'prev/wintable/api.h')
-rw-r--r--prev/wintable/api.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/prev/wintable/api.h b/prev/wintable/api.h
new file mode 100644
index 0000000..09552e5
--- /dev/null
+++ b/prev/wintable/api.h
@@ -0,0 +1,110 @@
+// 8 december 2014
+
+static void addColumn(struct table *t, WPARAM wParam, LPARAM lParam)
+{
+ t->nColumns++;
+ t->columnTypes = (int *) tableRealloc(t->columnTypes, t->nColumns * sizeof (int), "adding the new column type to the current Table's list of column types");
+ t->columnTypes[t->nColumns - 1] = (int) wParam;
+ // TODO make a panicNoErrCode() or panicArg() for this
+ if (t->columnTypes[t->nColumns - 1] >= nTableColumnTypes)
+ panic("invalid column type passed to tableAddColumn");
+ headerAddColumn(t, (WCHAR *) lParam);
+ update(t, TRUE);
+ // TODO only redraw the part of the client area where the new client went, if any
+ // (TODO when — if — adding autoresize, figure this one out)
+
+ // TODO send a notification for all rows?
+}
+
+// TODO what happens if the currently selected row is lost?
+static void setRowCount(struct table *t, intptr_t rc)
+{
+ intptr_t old, i;
+
+ old = t->count;
+ t->count = rc;
+ // we DO redraw everything because we don't want any rows that should no longer be there to remain on screen!
+ updateAll(t); // DONE
+ // TODO reset checkbox and selection logic if the current row for both no longer exists
+ // TODO really send all these notifications?
+ if (old < t->count) // rows added
+ for (i = old; i < t->count; i++)
+ NotifyWinEvent(EVENT_OBJECT_CREATE, t->hwnd, OBJID_CLIENT, i);
+ else if (old > t->count) // rows removed
+ for (i = old; i > t->count; i++)
+ NotifyWinEvent(EVENT_OBJECT_DESTROY, t->hwnd, OBJID_CLIENT, i);
+ // TODO update existing rows?
+}
+
+HANDLER(apiHandlers)
+{
+ intptr_t *rcp;
+ intptr_t row;
+
+ switch (uMsg) {
+ case WM_SETFONT:
+ // don't free the old font; see http://blogs.msdn.com/b/oldnewthing/archive/2008/09/12/8945692.aspx
+ t->font = (HFONT) wParam;
+ SendMessageW(t->header, WM_SETFONT, wParam, lParam);
+ // if we redraw, we have to redraw ALL of it; after all, the font changed!
+ if (LOWORD(lParam) != FALSE)
+ updateAll(t); // DONE
+ else
+ update(t, FALSE); // DONE
+ *lResult = 0;
+ return TRUE;
+ case WM_GETFONT:
+ *lResult = (LRESULT) (t->font);
+ return TRUE;
+ case tableAddColumn:
+ addColumn(t, wParam, lParam);
+ *lResult = 0;
+ return TRUE;
+ case tableSetRowCount:
+ rcp = (intptr_t *) lParam;
+ setRowCount(t, *rcp);
+ *lResult = 0;
+ return TRUE;
+ case tableGetSelection:
+ rcp = (intptr_t *) wParam;
+ if (rcp != NULL)
+ *rcp = t->selectedRow;
+ rcp = (intptr_t *) lParam;
+ if (rcp != NULL)
+ *rcp = t->selectedColumn;
+ *lResult = 0;
+ return TRUE;
+ case tableSetSelection:
+ // TODO does doselect() do validation?
+ rcp = (intptr_t *) wParam;
+ row = *rcp;
+ rcp = (intptr_t *) lParam;
+ if (rcp == NULL)
+ if (row == -1)
+ doselect(t, -1, -1);
+ else // select column 0, just like keyboard selections; TODO what if there aren't any columns?
+ doselect(t, row, 0);
+ else
+ doselect(t, row, *rcp);
+ *lResult = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static LRESULT notify(struct table *t, UINT code, intptr_t row, intptr_t column, uintptr_t data)
+{
+ tableNM nm;
+
+ ZeroMemory(&nm, sizeof (tableNM));
+ nm.nmhdr.hwndFrom = t->hwnd;
+ // TODO check for error from here? 0 is a valid ID (IDCANCEL)
+ nm.nmhdr.idFrom = GetDlgCtrlID(t->hwnd);
+ nm.nmhdr.code = code;
+ nm.row = row;
+ nm.column = column;
+ nm.columnType = t->columnTypes[nm.column];
+ nm.data = data;
+ // TODO check for error from GetParent()?
+ return SendMessageW(GetParent(t->hwnd), WM_NOTIFY, (WPARAM) (nm.nmhdr.idFrom), (LPARAM) (&nm));
+}