From d14b56e1cbdcebfabc4ad0136f4f2c2e561d6c50 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 15 Feb 2015 03:37:00 -0500 Subject: [PATCH] Kinda sorta implemented Table accHitTest(). --- wintable/accessibility.h | 47 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/wintable/accessibility.h b/wintable/accessibility.h index 787c2bb..d65f410 100644 --- a/wintable/accessibility.h +++ b/wintable/accessibility.h @@ -351,11 +351,52 @@ static HRESULT STDMETHODCALLTYPE tableAccaccNavigate(IAccessible *this, long nav static HRESULT STDMETHODCALLTYPE tableAccaccHitTest(IAccessible *this, long xLeft, long yTop, VARIANT *pvarChild) { - if (TA->t == NULL || TA->std == NULL) { - // TODO set values on error + POINT pt; + struct rowcol rc; + RECT r; + + if (pvarChild == NULL) + return E_POINTER; + if (TA->t == NULL || TA->std == NULL) return RPC_E_DISCONNECTED; + + pt.x = xLeft; + pt.y = yTop; + if (ScreenToClient(TA->t->hwnd, &pt) == 0) + return GetLastError(); // TODO + + switch (TA->what.role) { + case ROLE_SYSTEM_TABLE: + if (GetClientRect(TA->t->hwnd, &r) == 0) + return GetLastError(); // TODO + r.top += TA->t->headerHeight; + break; + case ROLE_SYSTEM_ROW: + // TODO do we extend the row to the last cell or to the edge of the client rect? + return E_FAIL; + case ROLE_SYSTEM_CELL: + // TODO could probably be its own code path + return E_FAIL; } - return IAccessible_accHitTest(TA->std, xLeft, yTop, pvarChild); + if (PtInRect(&r, pt) == 0) { + pvarChild->vt = VT_EMPTY; + return S_FALSE; + } + + // TODO adjust the rest of this function to account for rows and cells + + // TODO also handle GetLastError() here + rc = clientCoordToRowColumn(TA->t, pt); + // in the table itself? + if (rc.row == -1 || rc.column == -1) { + pvarChild->vt = VT_I4; + pvarChild->lVal = CHILDID_SELF; + return S_OK; + } + // nope, on a cell + pvarChild->vt = VT_DISPATCH; + pvarChild->pdispVal = (IDispatch *) newTableAcc(TA->t, ROLE_SYSTEM_CELL, rc.row, rc.column); + return S_OK; } static HRESULT STDMETHODCALLTYPE tableAccaccDoDefaultAction(IAccessible *this, VARIANT varChild)