From 6264cf1fee815e9078349f82aad10a78559e2a79 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 17 Feb 2015 11:50:44 -0500 Subject: [PATCH] Implemented (most of) get_accState(). --- wintable/accessibility.h | 46 +++++++++++++++++++++++++++++++++++++--- wintable/draw.h | 8 ++++++- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/wintable/accessibility.h b/wintable/accessibility.h index 461c25f..a64bb4a 100644 --- a/wintable/accessibility.h +++ b/wintable/accessibility.h @@ -366,13 +366,53 @@ static HRESULT STDMETHODCALLTYPE tableAccget_accRole(IAccessible *this, VARIANT return S_OK; } +// TODO reason about STATE_SYSTEM_INVISIBLE and STATE_SYSTEM_OFFSCREEN static HRESULT STDMETHODCALLTYPE tableAccget_accState(IAccessible *this, VARIANT varChild, VARIANT *pvarState) { - if (TA->t == NULL || TA->std == NULL) { - // TODO set values on error + HRESULT hr; + tableAccWhat what; + LONG state; + + if (pvarState == NULL) + return E_POINTER; + pvarState->vt = VT_EMPTY; + if (TA->t == NULL || TA->std == NULL) return RPC_E_DISCONNECTED; + what = TA->what; + hr = normalizeWhat(TA, varChild, &what); + if (hr != S_OK) + return hr; + + state = 0; + switch (what.role) { + case ROLE_SYSTEM_TABLE: + hr = IAccessible_get_accState(TA->std, varChild, pvarState); + if (hr != S_OK) + return hr; + // TODO make sure pvarState->vt == VT_I4 (what to return otherwise?) + state |= pvarState->lVal; + break; + case ROLE_SYSTEM_ROW: + state |= STATE_SYSTEM_SELECTABLE; + if (TA->t->selectedRow == what.row) + state |= STATE_SYSTEM_SELECTED; + break; + case ROLE_SYSTEM_CELL: + if (TA->t->columnTypes[what.column] == tableColumnCheckbox) { + // TODO is there no STATE_SYSTEM_CHECKABLE? + if (isCheckboxChecked(TA->t, what.row, what.column)) + state |= STATE_SYSTEM_CHECKED; + } + state |= STATE_SYSTEM_FOCUSABLE; + if (TA->t->selectedRow == what.row && TA->t->selectedColumn == what.column) + state |= STATE_SYSTEM_FOCUSED; + if (TA->t->columnTypes[what.column] != tableColumnCheckbox) + state |= STATE_SYSTEM_READONLY; + break; } - return IAccessible_get_accState(TA->std, varChild, pvarState); + pvarState->vt = VT_I4; + pvarState->lVal = state; + return S_OK; } static HRESULT STDMETHODCALLTYPE tableAccget_accHelp(IAccessible *this, VARIANT varChild, BSTR *pszHelp) diff --git a/wintable/draw.h b/wintable/draw.h index 1b861db..650e3e2 100644 --- a/wintable/draw.h +++ b/wintable/draw.h @@ -1,5 +1,11 @@ // 8 december 2014 +// TODO move to api.h? definitely move somewhere +static int isCheckboxChecked(struct table *t, intptr_t row, intptr_t column) +{ + return notify(t, tableNotificationGetCellData, row, column, 0) != 0; +} + struct drawCellParams { intptr_t row; intptr_t column; @@ -74,7 +80,7 @@ static void drawCheckboxCell(struct table *t, HDC dc, struct drawCellParams *p, toCheckboxRect(t, r, p->xoff); cbState = 0; - if (notify(t, tableNotificationGetCellData, p->row, p->column, 0) != 0) + if (isCheckboxChecked(t, p->row, p->column)) cbState |= checkboxStateChecked; if (t->checkboxMouseDown) if (p->row == t->checkboxMouseDownRow && p->column == t->checkboxMouseDownColumn)