/*
* Copyright 2014-2015 CyberVision, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kaaproject.avro.ui.gwt.client.widget.grid;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.dom.client.TableRowElement;
import com.google.gwt.dom.client.TableSectionElement;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.cellview.client.Header;
import com.google.gwt.user.client.Event;
import com.google.gwt.view.client.ProvidesKey;
public class AvroUiDataGrid<T> extends DataGrid<T>{
public static AvroUiGridResources gridResources = GWT.create(AvroUiGridResources.class);
public static AvroUiGridResourcesSmall gridResourcesSmall = GWT.create(AvroUiGridResourcesSmall.class);
private final AvroUiGridResources.AvroUiGridStyle style;
private int filterFocusedCellColumn = -1;
private int filterFocusedCellRow = -1;
public AvroUiDataGrid(int pageSize, ProvidesKey<T> keyProvider, AvroUiGridResources resources) {
super(pageSize, resources, keyProvider);
style = resources.dataGridStyle();
}
public AvroUiDataGrid(int pageSize, ProvidesKey<T> keyProvider, boolean embedded) {
super(pageSize, embedded ? gridResourcesSmall : gridResources, keyProvider);
style = embedded ? gridResourcesSmall.dataGridStyle() : gridResources.dataGridStyle();
}
@Override
public void removeColumn(int index) {
super.removeColumn(index);
if (isChrome()) {
addColumnStyleName(index, style.dataGridColumnInvisible());
}
}
@Override
public void insertColumn(int beforeIndex, Column<T, ?> col, Header<?> header, Header<?> footer) {
super.insertColumn(beforeIndex, col, header, footer);
if (isChrome()) {
removeColumnStyleName(beforeIndex, style.dataGridColumnInvisible());
}
}
@Override
protected void onBrowserEvent2(Event event) {
if (hasFilterHeaders()) {
EventTarget eventTarget = event.getEventTarget();
if (!Element.is(eventTarget)) {
return;
}
final Element target = event.getEventTarget().cast();
TableSectionElement thead = getTableHeadElement();
TableSectionElement targetTableSection = null;
TableCellElement targetTableCell = null;
Element headerParent = null;
Element maybeTableCell = null;
Element cur = target;
while (cur != null && targetTableSection == null) {
if (cur == thead) {
targetTableSection = cur.cast();
if (maybeTableCell != null) {
targetTableCell = maybeTableCell.cast();
break;
}
}
String tagName = cur.getTagName();
if (TableCellElement.TAG_TD.equalsIgnoreCase(tagName)
|| TableCellElement.TAG_TH.equalsIgnoreCase(tagName)) {
maybeTableCell = cur;
}
if (headerParent == null && getHeaderBuilder().isHeader(cur)) {
headerParent = cur;
}
cur = cur.getParentElement();
}
if (targetTableCell != null) {
String eventType = event.getType();
TableRowElement targetTableRow = targetTableCell.getParentElement().cast();
int col = targetTableCell.getCellIndex();
if (targetTableSection == thead) {
if (headerParent != null) {
Header<?> header =
getHeaderBuilder().getHeader(headerParent);
if (header != null) {
int headerIndex = getHeaderBuilder().getRowIndex(targetTableRow);
if (header instanceof StringFilterHeader) {
if (StringFilterHeader.isFilterFocusEvent(eventType)) {
filterFocusedCellColumn = col;
filterFocusedCellRow = headerIndex;
} else {
filterFocusedCellColumn = -1;
filterFocusedCellRow = -1;
}
}
}
}
}
}
}
super.onBrowserEvent2(event);
}
private boolean hasFilterHeaders() {
return getHeaderBuilder() instanceof StringFilterHeaderBuilder;
}
@Override
protected boolean resetFocusOnCell() {
boolean focused = false;
if (hasFilterHeaders() && filterFocusedCellColumn > -1 && filterFocusedCellRow > -1) {
TableSectionElement thead = getTableHeadElement();
NodeList<TableRowElement> rows = thead.getRows();
if (filterFocusedCellRow < rows.getLength()) {
TableRowElement row = rows.getItem(filterFocusedCellRow);
NodeList<TableCellElement> cells = row.getCells();
if (filterFocusedCellColumn < cells.getLength()) {
TableCellElement cell = cells.getItem(filterFocusedCellColumn);
if (getHeaderBuilder().isHeader(cell)) {
Header<?> header = getHeaderBuilder().getHeader(cell);
Context context = new Context(0, 0, header.getKey());
focused = resetFocusOnFilterCellImpl(context, header, cell);
}
}
}
}
if (!focused) {
focused = super.resetFocusOnCell();
}
return focused;
}
private <C> boolean resetFocusOnFilterCellImpl(Context context, Header<C> header,
Element cellParent) {
C headerValue = header.getValue();
Cell<C> cell = header.getCell();
return cell.resetFocus(context, cellParent, headerValue);
}
private static native boolean isChrome() /*-{
return navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
}-*/;
}