Added cell focusing to the new Windows Table. Checkbox columns need keyboard accessibility too. For now, focus is only applied with a mouse click.

This commit is contained in:
Pietro Gagliardi 2014-11-12 21:58:21 -05:00
parent 7409ce424e
commit 8f0f1ad3b5
1 changed files with 30 additions and 0 deletions

View File

@ -76,6 +76,7 @@ struct table {
HIMAGELIST checkboxes;
HTHEME theme;
int *columnTypes;
intptr_t focusedColumn;
};
static LONG rowHeight(struct table *t)
@ -141,6 +142,25 @@ static void repositionHeader(struct table *t)
t->headerHeight = headerpos.cy;
}
static intptr_t hitTestColumn(struct table *t, int x)
{
HDITEMW item;
intptr_t i;
// TODO count dividers
for (i = 0; i < t->nColumns; i++) {
ZeroMemory(&item, sizeof (HDITEMW));
item.mask = HDI_WIDTH;
if (SendMessageW(t->header, HDM_GETITEM, (WPARAM) i, (LPARAM) (&item)) == FALSE)
abort();
if (x < item.cxy)
return i;
x -= item.cxy; // not yet
}
// no column
return -1;
}
static void addColumn(struct table *t, WPARAM wParam, LPARAM lParam)
{
HDITEMW item;
@ -334,6 +354,7 @@ static void selectItem(struct table *t, WPARAM wParam, LPARAM lParam)
t->selected = y;
if (t->selected >= t->count)
t->selected = -1;
t->focusedColumn = hitTestColumn(t, x);
finishSelect(t);
}
@ -534,6 +555,14 @@ static void drawItem(struct table *t, HDC dc, intptr_t i, LONG y, LONG height, R
case tableColumnCheckbox:
;// TODO
}
if (t->selected == i && t->focusedColumn == j) {
rsel.left = headeritem.left;
rsel.top = y;
rsel.right = headeritem.right;
rsel.bottom = y + height;
if (DrawFocusRect(dc, &rsel) == 0)
abort();
}
}
}
@ -633,6 +662,7 @@ if (ImageList_GetIconSize(t->imagelist, &unused, &(t->imagelistHeight)) == 0)abo
}
}
t->checkboxes = makeCheckboxImageList(t->hwnd, &(t->theme));
t->focusedColumn = -1;
SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR) t);
}
// even if we did the above, fall through