diff options
Diffstat (limited to 'wintable/new/hscroll.h')
| -rw-r--r-- | wintable/new/hscroll.h | 98 |
1 files changed, 22 insertions, 76 deletions
diff --git a/wintable/new/hscroll.h b/wintable/new/hscroll.h index 7c08656..a2534b5 100644 --- a/wintable/new/hscroll.h +++ b/wintable/new/hscroll.h @@ -3,93 +3,41 @@ // forward declaration needed here static void repositionHeader(struct table *); -static void hscrollto(struct table *t, intptr_t pos) +static struct scrollParams hscrollParams(struct table *t) { - RECT scrollArea; - SCROLLINFO si; - - if (pos < 0) - pos = 0; - if (pos > t->width - t->hpagesize) - pos = t->width - t->hpagesize; - - // we don't want to scroll the header - if (GetClientRect(t->hwnd, &scrollArea) == 0) - panic("error getting Table client rect for hscrollto()"); - scrollArea.top += t->headerHeight; + struct scrollParams p; - // negative because ScrollWindowEx() is "backwards" - if (ScrollWindowEx(t->hwnd, -(pos - t->hscrollpos), 0, - &scrollArea, &scrollArea, NULL, NULL, - SW_ERASE | SW_INVALIDATE) == ERROR) -;// TODO failure case ignored for now; see https://bugs.winehq.org/show_bug.cgi?id=37706 -// panic("error horizontally scrolling Table"); - // TODO call UpdateWindow()? - - t->hscrollpos = pos; + ZeroMemory(&p, sizeof (struct scrollParams)); + p.pos = &(t->hscrollpos); + p.pagesize = t->hpagesize; + p.length = t->width; + p.scale = 1; + p.post = repositionHeader; + return p; +} - // now commit our new scrollbar setup... - ZeroMemory(&si, sizeof (SCROLLINFO)); - si.cbSize = sizeof (SCROLLINFO); - si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; - si.nPage = t->hpagesize; - si.nMin = 0; - si.nMax = t->width - 1; // endpoint inclusive - si.nPos = t->hscrollpos; - SetScrollInfo(t->hwnd, SB_HORZ, &si, TRUE); +static void hscrollto(struct table *t, intptr_t pos) +{ + struct scrollParams p; - // and finally move the header - repositionHeader(t); + p = hscrollParams(t); + scrollto(t, SB_HORZ, &p, pos); } static void hscrollby(struct table *t, intptr_t delta) { - hscrollto(t, t->hscrollpos + delta); + struct scrollParams p; + + p = hscrollParams(t); + scrollby(t, SB_HORZ, &p, delta); } static void hscroll(struct table *t, WPARAM wParam, LPARAM lParam) { - intptr_t pos; - SCROLLINFO si; + struct scrollParams p; - pos = t->hscrollpos; - switch (LOWORD(wParam)) { - case SB_LEFT: - pos = 0; - break; - case SB_RIGHT: - pos = t->width - t->hpagesize; - break; - case SB_LINELEFT: - pos--; - break; - case SB_LINERIGHT: - pos++; - break; - case SB_PAGELEFT: - pos -= t->hpagesize; - break; - case SB_PAGERIGHT: - pos += t->hpagesize; - break; - case SB_THUMBPOSITION: - ZeroMemory(&si, sizeof (SCROLLINFO)); - si.cbSize = sizeof (SCROLLINFO); - si.fMask = SIF_POS; - if (GetScrollInfo(t->hwnd, SB_HORZ, &si) == 0) - panic("error getting thumb position for WM_HSCROLL in Table"); - pos = si.nPos; - break; - case SB_THUMBTRACK: - ZeroMemory(&si, sizeof (SCROLLINFO)); - si.cbSize = sizeof (SCROLLINFO); - si.fMask = SIF_TRACKPOS; - if (GetScrollInfo(t->hwnd, SB_HORZ, &si) == 0) - panic("error getting thumb track position for WM_HSCROLL in Table"); - pos = si.nTrackPos; - break; - } - hscrollto(t, pos); + p = hscrollParams(t); + scroll(t, SB_HORZ, &p, wParam, lParam); } // TODO find out if we can indicriminately check for WM_WHEELHSCROLL @@ -101,5 +49,3 @@ HANDLER(hscrollHandler) *lResult = 0; return TRUE; } - -// TODO when we write vscroll.h, see just /what/ is common so we can isolate it |
