OSDN Git Service

gecko_ia2 vbuf backend: The code to fetch row and column header cells is identical...
authorJames Teh <jamie@jantrid.net>
Tue, 14 Sep 2010 08:09:07 +0000 (18:09 +1000)
committerJames Teh <jamie@jantrid.net>
Tue, 14 Sep 2010 08:09:07 +0000 (18:09 +1000)
source/NVDAHelper/vbufBackends/gecko_ia2/gecko_ia2.cpp

index 23ea737..2f58a94 100755 (executable)
@@ -141,57 +141,32 @@ inline void fillTableCellInfo_IATable(VBufStorage_controlFieldNode_t* node, IAcc
                DEBUG_MSG(L"IAccessibleTable::get_rowColumnExtentsAtIndex failed, result " << res);\r
 }\r
 \r
-inline void GeckoVBufBackend_t::fillTableCellInfo_IATable2(VBufStorage_controlFieldNode_t* node, IAccessibleTableCell* paccTableCell) {\r
+typedef HRESULT(STDMETHODCALLTYPE IAccessibleTableCell::*IATableCellGetHeaderCellsFunc)(IUnknown***, long*);\r
+inline void fillTableHeaders(VBufStorage_controlFieldNode_t* node, IAccessibleTableCell* paccTableCell, const IATableCellGetHeaderCellsFunc getHeaderCells, const wstring& attribName) {\r
        int res;\r
        wostringstream s;\r
-\r
-       long row, column, rowExtents, columnExtents;\r
-       boolean isSelected;\r
-       if ((res = paccTableCell->get_rowColumnExtents(&row, &column, &rowExtents, &columnExtents, &isSelected)) == S_OK) {\r
-               DEBUG_MSG(L"IAccessibleTableCell::get_rowColumnExtents succeeded, adding attributes");\r
-               s << row + 1;\r
-               node->addAttribute(L"table-rownumber", s.str());\r
-               s.str(L"");\r
-               s << column + 1;\r
-               node->addAttribute(L"table-columnnumber", s.str());\r
-               if (columnExtents > 1) {\r
-                       s.str(L"");\r
-                       s << columnExtents;\r
-                       node->addAttribute(L"table-columnsspanned", s.str());\r
-               }\r
-               if (rowExtents > 1) {\r
-                       s.str(L"");\r
-                       s << rowExtents;\r
-                       node->addAttribute(L"table-rowsspanned", s.str());\r
-               }\r
-       }\r
-\r
-       if (this->shouldDisableTableHeaders)\r
-               return;\r
-\r
        IUnknown** headerCells;\r
        long nHeaderCells;\r
        IAccessible2* headerCellPacc = NULL;\r
        int headerCellDocHandle, headerCellID;\r
 \r
-       if ((res = paccTableCell->get_columnHeaderCells(&headerCells, &nHeaderCells)) == S_OK) {\r
-               DEBUG_MSG(L"IAccessibleTableCell::get_columnHeaderCells succeeded, adding header IDs");\r
-               s.str(L"");\r
+       if ((paccTableCell->*getHeaderCells)(&headerCells, &nHeaderCells) == S_OK) {\r
+               DEBUG_MSG(L"Get header cells succeeded, adding header IDs");\r
                for (int hci = 0; hci < nHeaderCells; hci++) {\r
                        if ((res = headerCells[hci]->QueryInterface(IID_IAccessible2, (void**)(&headerCellPacc))) != S_OK) {\r
-                               DEBUG_MSG(L"QueryInterface column header cell " << hci << " to IAccessible2 failed with " << res);\r
+                               DEBUG_MSG(L"QueryInterface header cell " << hci << " to IAccessible2 failed with " << res);\r
                                headerCells[hci]->Release();\r
                                continue;\r
                        }\r
                        headerCells[hci]->Release();\r
                        if ((res = headerCellPacc->get_windowHandle((HWND*)&headerCellDocHandle)) != S_OK) {\r
-                               DEBUG_MSG("IAccessible2::get_windowHandle on column header cell " << hci << " failed with " << res);\r
+                               DEBUG_MSG("IAccessible2::get_windowHandle on header cell " << hci << " failed with " << res);\r
                                headerCellPacc->Release();\r
                                continue;\r
                        }\r
                        headerCellDocHandle = (int)findRealMozillaWindow((HWND)headerCellDocHandle);\r
                        if ((res = headerCellPacc->get_uniqueID((long*)&headerCellID)) != S_OK) {\r
-                               DEBUG_MSG("IAccessible2::get_uniqueID on column header cell " << hci << " failed with " << res);\r
+                               DEBUG_MSG("IAccessible2::get_uniqueID on header cell " << hci << " failed with " << res);\r
                                headerCellPacc->Release();\r
                                continue;\r
                        }\r
@@ -199,36 +174,39 @@ inline void GeckoVBufBackend_t::fillTableCellInfo_IATable2(VBufStorage_controlFi
                        headerCellPacc->Release();\r
                }\r
                if (!s.str().empty())\r
-                       node->addAttribute(L"table-columnheadercells", s.str());\r
+                       node->addAttribute(attribName, s.str());\r
        }\r
+}\r
+\r
+inline void GeckoVBufBackend_t::fillTableCellInfo_IATable2(VBufStorage_controlFieldNode_t* node, IAccessibleTableCell* paccTableCell) {\r
+       wostringstream s;\r
 \r
-       if ((res = paccTableCell->get_rowHeaderCells(&headerCells, &nHeaderCells)) == S_OK) {\r
-               DEBUG_MSG(L"IAccessibleTableCell::get_rowHeaderCells succeeded, adding header IDs");\r
+       long row, column, rowExtents, columnExtents;\r
+       boolean isSelected;\r
+       if (paccTableCell->get_rowColumnExtents(&row, &column, &rowExtents, &columnExtents, &isSelected) == S_OK) {\r
+               DEBUG_MSG(L"IAccessibleTableCell::get_rowColumnExtents succeeded, adding attributes");\r
+               s << row + 1;\r
+               node->addAttribute(L"table-rownumber", s.str());\r
                s.str(L"");\r
-               for (int hci = 0; hci < nHeaderCells; hci++) {\r
-                       if ((res = headerCells[hci]->QueryInterface(IID_IAccessible2, (void**)(&headerCellPacc))) != S_OK) {\r
-                               DEBUG_MSG(L"QueryInterface row header cell " << hci << " to IAccessible2 failed with " << res);\r
-                               headerCells[hci]->Release();\r
-                               continue;\r
-                       }\r
-                       headerCells[hci]->Release();\r
-                       if ((res = headerCellPacc->get_windowHandle((HWND*)&headerCellDocHandle)) != S_OK) {\r
-                               DEBUG_MSG("IAccessible2::get_windowHandle on row header cell " << hci << " failed with " << res);\r
-                               headerCellPacc->Release();\r
-                               continue;\r
-                       }\r
-                       headerCellDocHandle = (int)findRealMozillaWindow((HWND)headerCellDocHandle);\r
-                       if ((res = headerCellPacc->get_uniqueID((long*)&headerCellID)) != S_OK) {\r
-                               DEBUG_MSG("IAccessible2::get_uniqueID on row header cell " << hci << " failed with " << res);\r
-                               headerCellPacc->Release();\r
-                               continue;\r
-                       }\r
-                       s << headerCellDocHandle << L"," << headerCellID << L";";\r
-                       headerCellPacc->Release();\r
+               s << column + 1;\r
+               node->addAttribute(L"table-columnnumber", s.str());\r
+               if (columnExtents > 1) {\r
+                       s.str(L"");\r
+                       s << columnExtents;\r
+                       node->addAttribute(L"table-columnsspanned", s.str());\r
+               }\r
+               if (rowExtents > 1) {\r
+                       s.str(L"");\r
+                       s << rowExtents;\r
+                       node->addAttribute(L"table-rowsspanned", s.str());\r
                }\r
-               if (!s.str().empty())\r
-                       node->addAttribute(L"table-rowheadercells", s.str());\r
        }\r
+\r
+       if (this->shouldDisableTableHeaders)\r
+               return;\r
+\r
+       fillTableHeaders(node, paccTableCell, &IAccessibleTableCell::get_columnHeaderCells, L"table-columnheadercells");\r
+       fillTableHeaders(node, paccTableCell, &IAccessibleTableCell::get_rowHeaderCells, L"table-rowheadercells");\r
 }\r
 \r
 void GeckoVBufBackend_t::versionSpecificInit(IAccessible2* pacc) {\r