@Override
    protected void setKeyboardSelected(int index, boolean selected, boolean stealFocus) {
        if (KeyboardSelectionPolicy.DISABLED == getKeyboardSelectionPolicy()
            || !isRowWithinBounds(index)) {
            return;
        }

        // If deselecting, we deselect the previous subrow.
        int subrow = lastKeyboardSelectedSubrow;
        if (selected) {
            subrow = keyboardSelectedSubrow;
            lastKeyboardSelectedSubrow = keyboardSelectedSubrow;
        }

        // Deselect the row.
        TableRowElement tr = getSubRowElement(index + getPageStart(), subrow);
        if (tr == null) {
            // The row does not exist.
            return;
        }
        String cellStyle = style.keyboardSelectedCell();
        boolean updatedSelection = !selected || isFocused || stealFocus;
        setRowStyleName(tr, style.keyboardSelectedRow(), style.keyboardSelectedRowCell(), selected);
        NodeList<TableCellElement> cells = tr.getCells();
        int keyboardColumn = Math.min(getKeyboardSelectedColumn(), cells.getLength() - 1);
        for (int i = 0; i < cells.getLength(); i++) {
            TableCellElement td = cells.getItem(i);
            boolean isKeyboardSelected = (i == keyboardColumn);

            // Update the selected style.
            setStyleName(td, cellStyle, updatedSelection && selected && isKeyboardSelected);

            // Mark as focusable.
            final Element focusable = getKeyboardSelectedElement(td);
            setFocusable(focusable, selected && isKeyboardSelected);

            // Move focus to the cell.
            if (selected && stealFocus && !cellIsEditing && isKeyboardSelected) {
                CellBasedWidgetImpl.get().resetFocus(new Scheduler.ScheduledCommand() {
                    @Override
                    public void execute() {
                        FocusUtil.focusRow(focusable);
                    }
                });
            }
        }
    }
Render all row values into the specified {@link SafeHtmlBuilder}.

<p>
This method is here for legacy reasons, to support subclasses that call
{@link #renderRowValues(SafeHtmlBuilder, List, int, SelectionModel)}.
</p>

@param sb             the {@link SafeHtmlBuilder} to render into
@param values         the row values
@param start          the absolute start index of the values
@param selectionModel the {@link SelectionModel}
@deprecated as of GWT 2.5, use a {@link CellTableBuilder} to customize the
table structure instead
stroom-core-client-widget/src/main/java/com/google/gwt/user/cellview/client/AbstractCellTable.java