54 lines
2.2 KiB
C
54 lines
2.2 KiB
C
// 8 january 2015
|
|
|
|
// Whenever a number of things in the Table changes, the update() function needs to be called to update any metrics and scrolling positions.
|
|
// The control font changing is the big one, as that comes with a flag that decides whether or not to redraw everything. We'll need to respect that here.
|
|
|
|
// For my personal convenience, each invocation of update() and updateAll() will be suffixed with a DONE comment once I have reasoned that the chosen function is correct and that no additional redrawing is necessary.
|
|
|
|
// TODO actually use redraw here
|
|
static void update(struct table *t, BOOL redraw)
|
|
{
|
|
RECT client;
|
|
intptr_t i;
|
|
intptr_t height;
|
|
|
|
// before we do anything we need the client rect
|
|
if (GetClientRect(t->hwnd, &client) == 0)
|
|
panic("error getting Table client rect in update()");
|
|
|
|
// the first step is to figure out how wide the whole table is
|
|
// TODO count dividers?
|
|
t->width = 0;
|
|
for (i = 0; i < t->nColumns; i++)
|
|
t->width += columnWidth(t, i);
|
|
|
|
// now we need to figure out how much of the width of the table can be seen at once
|
|
t->hpagesize = client.right - client.left;
|
|
// this part is critical: if we resize the columns to less than the client area width, then the following hscrollby() will make t->hscrollpos negative, which does very bad things
|
|
// we do this regardless of which of the two has changed, just to be safe
|
|
if (t->hpagesize > t->width)
|
|
t->hpagesize = t->width;
|
|
|
|
// now we do a dummy horizontal scroll to apply the new width and horizontal page size
|
|
// this will also reposition and resize the header (the latter in case the font changed), which will be important for the next step
|
|
hscrollby(t, 0);
|
|
|
|
// now that we have the new height of the header, we can fix up vertical scrolling
|
|
// so let's take the header height away from the client area
|
|
client.top += t->headerHeight;
|
|
// and update our page size appropriately
|
|
height = client.bottom - client.top;
|
|
t->vpagesize = height / rowht(t);
|
|
// and do a dummy vertical scroll to apply that
|
|
vscrollby(t, 0);
|
|
}
|
|
|
|
// this is the same as update(), but also redraws /everything/
|
|
// as such, redraw is TRUE
|
|
static void updateAll(struct table *t)
|
|
{
|
|
update(t, TRUE);
|
|
if (InvalidateRect(t->hwnd, NULL, TRUE) == 0)
|
|
panic("error queueing all of Table for redraw in updateAll()");
|
|
}
|