summaryrefslogtreecommitdiff
path: root/wintable/new/checkboxes.h
diff options
context:
space:
mode:
Diffstat (limited to 'wintable/new/checkboxes.h')
-rw-r--r--wintable/new/checkboxes.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/wintable/new/checkboxes.h b/wintable/new/checkboxes.h
index 11dea56..4308817 100644
--- a/wintable/new/checkboxes.h
+++ b/wintable/new/checkboxes.h
@@ -176,3 +176,71 @@ HANDLER(checkboxMouseLeaveHandler)
*lResult = 0;
return TRUE;
}
+
+HANDLER(checkboxMouseDownHandler)
+{
+ struct rowcol rc;
+ RECT r;
+ POINT pt;
+
+ rc = lParamToRowColumn(t, lParam);
+ if (rc.row == -1 || rc.column == -1)
+ return FALSE;
+ if (t->columnTypes[rc.column] != tableColumnCheckbox)
+ return FALSE;
+ if (!rowColumnToClientRect(t, rc, &r))
+ return FALSE;
+ toCheckboxRect(t, &r, 0);
+ pt.x = GET_X_LPARAM(lParam);
+ pt.y = GET_Y_LPARAM(lParam);
+ if (PtInRect(&r, pt) == 0)
+ return FALSE;
+ t->checkboxMouseDown = TRUE;
+ t->checkboxMouseDownRow = rc.row;
+ t->checkboxMouseDownColumn = rc.column;
+ // TODO redraw the whole cell?
+ if (InvalidateRect(t->hwnd, &r, TRUE) == 0)
+ panic("error redrawing Table checkbox after mouse down");
+ *lResult = 0;
+ return TRUE;
+}
+
+// TODO get rid of this
+struct rowcol lastCheckbox;
+
+HANDLER(checkboxMouseUpHandler)
+{
+ struct rowcol rc;
+ RECT r;
+ POINT pt;
+
+ if (!t->checkboxMouseDown)
+ return FALSE;
+ // the logic behind goto wrongUp is that the mouse must be released on the same checkbox
+ rc = lParamToRowColumn(t, lParam);
+ if (rc.row == -1 || rc.column == -1)
+ goto wrongUp;
+ if (rc.row != t->checkboxMouseDownRow && rc.column != t->checkboxMouseDownColumn)
+ goto wrongUp;
+ if (t->columnTypes[rc.column] != tableColumnCheckbox)
+ goto wrongUp;
+ if (!rowColumnToClientRect(t, rc, &r))
+ goto wrongUp;
+ toCheckboxRect(t, &r, 0);
+ pt.x = GET_X_LPARAM(lParam);
+ pt.y = GET_Y_LPARAM(lParam);
+ if (PtInRect(&r, pt) == 0)
+ goto wrongUp;
+ // TODO send toggle event
+lastCheckbox = rc;
+ t->checkboxMouseDown = FALSE;
+ // TODO redraw the whole cell?
+ if (InvalidateRect(t->hwnd, &r, TRUE) == 0)
+ panic("error redrawing Table checkbox after mouse up");
+ *lResult = 0;
+ return TRUE;
+wrongUp:
+ // TODO redraw the invalid cell
+ t->checkboxMouseDown = FALSE;
+ return FALSE; // TODO really?
+}