summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wintable/accessibility.h46
-rw-r--r--wintable/draw.h8
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)