330 lines
15 KiB
HTML
330 lines
15 KiB
HTML
<html>
|
|
<head>
|
|
<script type="text/javascript">
|
|
var sap = {ui:{keycodes:{SPACE:32,
|
|
ENTER:13,
|
|
PAGE_UP : 33,
|
|
PAGE_DOWN : 34,
|
|
END : 35,
|
|
HOME : 36,
|
|
ARROW_LEFT : 37,
|
|
ARROW_UP : 38,
|
|
ARROW_RIGHT : 39,
|
|
ARROW_DOWN : 40,
|
|
TAB : 9
|
|
}}};
|
|
var grids = [];
|
|
function getGrid(id) {
|
|
if (!grids[id]) {
|
|
var grid = {};
|
|
grid.focusedRow = 1;
|
|
grid.focusedCol = 0;
|
|
grid.table = document.getElementById(id);
|
|
grids[id] = grid;
|
|
}
|
|
return grids[id];
|
|
}
|
|
function handleFocus(id, evt) {
|
|
var grid = getGrid(id);
|
|
if (grid) {
|
|
if (!grid.focusedCell) {
|
|
grid.focusedCell = {row:1,col:0};
|
|
} else {
|
|
blurCell(grid.focusedCell,grid);
|
|
}
|
|
focusCell(grid.focusedCell,grid);
|
|
grid.table.tabIndex = "-1";
|
|
|
|
}
|
|
}
|
|
function handleClick(id, evt) {
|
|
var grid = getGrid(id);
|
|
if (grid) {
|
|
var clickedCell = evt.target?evt.target:evt.srcElement;
|
|
if (clickedCell.tagName=="TD") {
|
|
row = grid.table.rows[clickedCell.parentNode.rowIndex];
|
|
toggleItem(row,grid)
|
|
}
|
|
}
|
|
}
|
|
function toggleItem(row,grid) {
|
|
var expand;
|
|
if (row && row.getAttribute("ca")=="to") {
|
|
expand = grid.table.rows[row.rowIndex+1];
|
|
while (expand && expand.getAttribute("ca")=="ti") {
|
|
if (row.getAttribute("aria-expanded")=="false") {
|
|
expandRow(expand);
|
|
row.setAttribute("aria-expanded","true");
|
|
row.getElementsByTagName("SPAN")[0].innerHTML="-";
|
|
} else {
|
|
collapseRow(expand);
|
|
row.setAttribute("aria-expanded","false");
|
|
row.getElementsByTagName("SPAN")[0].innerHTML="+";
|
|
}
|
|
expand = grid.table.rows[expand.rowIndex+1];
|
|
}
|
|
}
|
|
}
|
|
function expandRow(row) {
|
|
row.style.display = "";
|
|
row.setAttribute("aria-hidden","false");
|
|
}
|
|
function collapseRow(row) {
|
|
row.style.display = "none";
|
|
row.setAttribute("aria-hidden","true");
|
|
}
|
|
|
|
function blurCell(cell,grid) {
|
|
var td = grid.table.rows[cell.row].cells[cell.col];
|
|
if (td.getAttribute("editable")=="true") return
|
|
td.tabIndex = "-1";
|
|
}
|
|
function focusCell(cell,grid) {
|
|
var tr = grid.table.rows[cell.row];
|
|
var td = tr.cells[cell.col];
|
|
td.tabIndex = "0";
|
|
td.focus();
|
|
}
|
|
function focusNextRow(grid) {
|
|
row = grid.table.rows[grid.focusedRow];
|
|
expand = grid.table.rows[row.rowIndex+1];
|
|
if (row && row.getAttribute("role")=="row") {
|
|
row.cells[0].tabIndex = "-1";
|
|
expand = grid.table.rows[row.rowIndex+1];
|
|
if (row.getAttribute("aria-expanded")=="false") {
|
|
while (expand && expand.getAttribute("ca")=="ti") {
|
|
expand = grid.table.rows[expand.rowIndex+1];
|
|
}
|
|
}
|
|
} else {
|
|
row.cells[grid.focusedCol].tabIndex = "-1";
|
|
}
|
|
if (expand && expand.getAttribute("ca")=="ti") {
|
|
expand.cells[0].tabIndex ="0";
|
|
expand.cells[0].focus();
|
|
grid.focusedRow = expand.rowIndex;
|
|
} else if (expand) {
|
|
expand.cells[grid.focusedCol].tabIndex ="0";
|
|
expand.cells[grid.focusedCol].focus();
|
|
grid.focusedRow = expand.rowIndex;
|
|
}
|
|
}
|
|
|
|
function focusPreviousRow(grid) {
|
|
row = grid.table.rows[grid.focusedRow];
|
|
expand = grid.table.rows[row.rowIndex-1];
|
|
if (row) {
|
|
row.cells[0].tabIndex = "-1";
|
|
expand = grid.table.rows[row.rowIndex-1];
|
|
while (expand && expand.style.display=="none") {
|
|
expand = grid.table.rows[expand.rowIndex-1];
|
|
}
|
|
} else {
|
|
row.cells[grid.focusedCol].tabIndex = "-1";
|
|
}
|
|
if (expand && expand.getAttribute("ca")=="ti") {
|
|
expand.cells[0].tabIndex ="0";
|
|
expand.cells[0].focus();
|
|
grid.focusedRow = expand.rowIndex;
|
|
} else if (expand){
|
|
expand.cells[grid.focusedCol].tabIndex ="0";
|
|
expand.cells[grid.focusedCol].focus();
|
|
grid.focusedRow = expand.rowIndex;
|
|
}
|
|
}
|
|
function focusNextCell(grid) {
|
|
var row = grid.table.rows[grid.focusedRow];
|
|
if (row.cells.length>1) {
|
|
if (grid.focusedCol<row.cells.length-1) {
|
|
var cell=row.cells[grid.focusedCol];
|
|
cell.tabIndex="-1";
|
|
grid.focusedCol++;
|
|
var cell=row.cells[grid.focusedCol];
|
|
cell.tabIndex="0";
|
|
cell.focus();
|
|
}
|
|
}
|
|
}
|
|
|
|
function focusPreviousCell(grid) {
|
|
var row = grid.table.rows[grid.focusedRow];
|
|
if (row.cells.length>1) {
|
|
if (grid.focusedCol>0) {
|
|
var cell=row.cells[grid.focusedCol];
|
|
cell.tabIndex="-1";
|
|
grid.focusedCol--;
|
|
var cell=row.cells[grid.focusedCol];
|
|
cell.tabIndex="0";
|
|
cell.focus();
|
|
}
|
|
}
|
|
}
|
|
|
|
function handleKeyDown(id, evt) {
|
|
var grid = getGrid(id);
|
|
keyCode = evt.keyCode,
|
|
evtTarget = evt.target ? evt.target : evt.srcElement;
|
|
if (keyCode == sap.ui.keycodes.ARROW_LEFT) {
|
|
focusPreviousCell(grid);
|
|
} else if (keyCode == sap.ui.keycodes.ARROW_RIGHT) {
|
|
focusNextCell(grid);
|
|
} else if (keyCode == sap.ui.keycodes.ARROW_UP) {
|
|
focusPreviousRow(grid);
|
|
} else if (keyCode == sap.ui.keycodes.ARROW_DOWN) {
|
|
focusNextRow(grid);
|
|
} else if (keyCode == sap.ui.keycodes.HOME && evt.ctrlKey) {
|
|
|
|
} else if (keyCode == sap.ui.keycodes.END && evt.ctrlKey) {
|
|
|
|
} else if (keyCode == sap.ui.keycodes.HOME) {
|
|
|
|
} else if (keyCode == sap.ui.keycodes.END) {
|
|
|
|
} else if (keyCode == sap.ui.keycodes.SPACE) {
|
|
row = grid.table.rows[grid.focusedRow];
|
|
toggleItem(row,grid);
|
|
}
|
|
if (keyCode != sap.ui.keycodes.TAB){
|
|
evt.cancelBubble = true;
|
|
if (evt.preventDefault)
|
|
evt.preventDefault();
|
|
if (evt.stopPropagation) {
|
|
evt.stopPropagation();
|
|
} else {
|
|
evt.cancelBubble = true;
|
|
evt.returnValue = false;
|
|
}
|
|
} else {
|
|
grid.table.tabIndex = "0";
|
|
blurCell(grid.focusedCell,grid);
|
|
|
|
}
|
|
}
|
|
</script>
|
|
|
|
</head>
|
|
<body>
|
|
<h3 id="foo">Title</h3>
|
|
<table aria-labelledby="foo" id="grid-1" border="1" tabindex="0" onfocus="handleFocus('grid-1',event);" onclick="handleClick('grid-1',event);" onkeydown="handleKeyDown('grid-1',event);" role="treegrid" style="width:450;">
|
|
<colgroup><col style="width:150">
|
|
<col style="width:150">
|
|
<col style="width:150">
|
|
</colgroup><thead>
|
|
<tr role="row">
|
|
<th id="grid-1-isbn_id">ISBN</th><th id="grid-1-author_id">Author</th><th id="grid-1-price_id">Price</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="grid-1-title_id" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span><strong>A Question of Love</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
978-3-453-40540-0</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Nora Roberts</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$ 9.99</td>
|
|
</tr>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="grid-1-title_id" role="gridcell" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span> <strong>Piece of Peace</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
978-3-453-477740-0</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Gunther Poison</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$ 13.95</td>
|
|
</tr>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="name_id" role="gridcell" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span> <strong>International Law</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
029-11-131978-07-0</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Daniela Hunter</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$ 11.95</td>
|
|
</tr>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="name_id" role="gridcell" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span> <strong>My Name is Benny</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
007-01-206603-00</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Benjamin Schutz</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$ 12.50</td>
|
|
</tr>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="name_id" role="gridcell" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span> <strong>The Charming Butler</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
007-02-206983-77</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Naomi Jackson</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$ 14.50</td>
|
|
</tr>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="name_id" role="gridcell" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span> <strong>Lofts</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
010-12-656922-70</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Bud Atkinson</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$ 22.99</td>
|
|
</tr>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="name_id" role="gridcell" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span> <strong>DOM Objects</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
234-12-081733-67</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Nurdogan Ghant</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$ 29.10</td>
|
|
</tr>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="name_id" role="gridcell" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span> <strong>One Man Show</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
282-02-1839812-72</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Rose Wood</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$9.30</td>
|
|
</tr>
|
|
<tr ca="to" role="row" aria-expanded="false" aria-level="1">
|
|
<td headers="name_id" role="gridcell" colspan="3" aria-labelledby="grid-1-title_id">
|
|
<span>+</span> <strong>Sugar Fly</strong></td>
|
|
</tr>
|
|
<tr ca="ti" role="row" style="display:none" aria-hidden="true" aria-level="2">
|
|
<td headers="grid-1-isbn_id" role="gridcell" aria-labelledby="grid-1-isbn_id">
|
|
081-01-123093-02</td>
|
|
<td headers="grid-1-author_id" role="gridcell" aria-labelledby="grid-1-author_id">
|
|
Naomi Jackson</td>
|
|
<td headers="grid-1-price_id" role="gridcell" aria-labelledby="grid-1-price_id">
|
|
$ 20.50</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</body>
|
|
</html>
|