inline int updateTableCounts(IAccessibleTableCell* tableCell, VBufStorage_buffer_t* tableBuffer) { IUnknown* unk = NULL; if (tableCell->get_table(&unk) != S_OK || !unk) return 0; IAccessible2* acc = NULL; HRESULT res; res = unk->QueryInterface(IID_IAccessible2, (void**)&acc); unk->Release(); if (res != S_OK || !acc) return 0; int docHandle, id; if (acc->get_windowHandle((HWND*)&docHandle) != S_OK || acc->get_uniqueID((long*)&id) != S_OK) { acc->Release(); return 0; } VBufStorage_controlFieldNode_t* node = tableBuffer->getControlFieldNodeWithIdentifier(docHandle, id); if (!node) { acc->Release(); return 0; } IAccessibleTable2* table = NULL; if (acc->QueryInterface(IID_IAccessibleTable2, (void**)&table) != S_OK || !table) { acc->Release(); return 0; } fillTableCounts<IAccessibleTable2>(node, acc, table); table->Release(); acc->Release(); return id; }
inline int getTableIDFromCell(IAccessibleTableCell* tableCell) { IUnknown* unk = NULL; if (tableCell->get_table(&unk) != S_OK || !unk) return 0; IAccessible2* acc = NULL; HRESULT res; res = unk->QueryInterface(IID_IAccessible2, (void**)&acc); unk->Release(); if (res != S_OK || !acc) return 0; int id=0; acc->get_uniqueID((long*)&id); acc->Release(); return id; }
bool isLabelVisible(IAccessible2* acc) { VARIANT child, target; child.vt = VT_I4; child.lVal = 0; if (acc->accNavigate(NAVRELATION_LABELLED_BY, child, &target) != S_OK) return false; IAccessible2* targetAcc; HRESULT res; res = target.pdispVal->QueryInterface(IID_IAccessible2, (void**)&targetAcc); VariantClear(&target); if (res != S_OK) return false; VARIANT state; res = targetAcc->get_accState(child, &state); targetAcc->Release(); if (res != S_OK) return false; if (state.lVal & STATE_SYSTEM_INVISIBLE) return false; return true; }
inline void fillTableHeaders(VBufStorage_controlFieldNode_t* node, IAccessibleTableCell* paccTableCell, const IATableCellGetHeaderCellsFunc getHeaderCells, const wstring& attribName) { wostringstream s; IUnknown** headerCells; long nHeaderCells; IAccessible2* headerCellPacc = NULL; int headerCellDocHandle, headerCellID; if ((paccTableCell->*getHeaderCells)(&headerCells, &nHeaderCells) == S_OK && headerCells) { for (int hci = 0; hci < nHeaderCells; hci++) { if (headerCells[hci]->QueryInterface(IID_IAccessible2, (void**)&headerCellPacc) != S_OK) { headerCells[hci]->Release(); continue; } headerCells[hci]->Release(); if (headerCellPacc->get_windowHandle((HWND*)&headerCellDocHandle) != S_OK) { headerCellPacc->Release(); continue; } headerCellDocHandle = (int)findRealMozillaWindow((HWND)headerCellDocHandle); if (headerCellPacc->get_uniqueID((long*)&headerCellID) != S_OK) { headerCellPacc->Release(); continue; } s << headerCellDocHandle << L"," << headerCellID << L";"; headerCellPacc->Release(); } if (!s.str().empty()) node->addAttribute(attribName, s.str()); CoTaskMemFree(headerCells); } }