/*
* Copyright 2016 JBoss, by Red Hat, 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.uberfire.ext.widgets.table.client;
import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent;
import com.google.gwt.user.cellview.client.ColumnSortList;
import com.google.gwt.user.cellview.client.RowStyles;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.CellPreviewEvent;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.Range;
import com.google.gwt.view.client.RangeChangeEvent;
import com.google.gwt.view.client.RowCountChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.Label;
import org.uberfire.client.views.pfly.sys.PatternFlyBootstrapper;
import org.uberfire.ext.widgets.table.client.resources.UFTableResources;
/**
* A composite Widget that shows rows of data (not-paged) and a "column picker"
* to allow columns to be hidden from view. Columns can also be sorted.
*/
public class UberfireSimpleTable<T>
extends Composite
implements HasData<T> {
private static Binder uiBinder = GWT.create(Binder.class);
@UiField(provided = true)
public Button columnPickerButton;
@UiField(provided = true)
public DataGrid<T> dataGrid;
@UiField
public HorizontalPanel toolbarContainer;
@UiField
public HorizontalPanel rightToolbar;
@UiField
public FlowPanel rightActionsToolbar;
@UiField
public FlowPanel leftToolbar;
@UiField
public FlowPanel centerToolbar;
protected UberfireColumnPicker<T> columnPicker;
private String emptyTableCaption;
public UberfireSimpleTable() {
setupDataGrid(null);
setupGridTable();
}
public UberfireSimpleTable(final ProvidesKey<T> providesKey) {
setupDataGrid(providesKey);
setupGridTable();
}
protected static native void addDataGridStyles(final JavaScriptObject grid,
final String header,
final String content)/*-{
$wnd.jQuery(grid).find('table:first').addClass(header);
$wnd.jQuery(grid).find('table:last').addClass(content);
}-*/;
protected void setupGridTable() {
setupDataGrid();
setEmptyTableWidget();
setupColumnPicker();
columnPickerButton = getColumnPicker().createToggleButton();
initWidget(makeWidget());
}
protected void setupColumnPicker() {
setColumnPicker(new UberfireColumnPicker<>(dataGrid));
}
protected UberfireColumnPicker<T> getColumnPicker() {
return columnPicker;
}
protected void setColumnPicker(UberfireColumnPicker<T> columnPicker) {
this.columnPicker = columnPicker;
}
protected void setupDataGrid(ProvidesKey<T> providesKey) {
if (providesKey != null) {
dataGrid = new DataGrid<T>(providesKey);
} else {
dataGrid = new DataGrid<T>();
}
}
public void setEmptyTableCaption(final String emptyTableCaption) {
this.emptyTableCaption = emptyTableCaption;
setEmptyTableWidget();
}
protected void setupDataGrid() {
PatternFlyBootstrapper.ensurejQueryIsAvailable();
dataGrid.setSkipRowHoverCheck(false);
dataGrid.setSkipRowHoverStyleUpdate(false);
dataGrid.addStyleName(UFTableResources.INSTANCE.CSS().dataGridMain());
dataGrid.addStyleName(UFTableResources.INSTANCE.CSS().dataGrid());
dataGrid.setRowStyles((row, rowIndex) -> UFTableResources.INSTANCE.CSS().dataGridRow());
addDataGridStyles(dataGrid.getElement(),
UFTableResources.INSTANCE.CSS().dataGridHeader(),
UFTableResources.INSTANCE.CSS().dataGridContent());
}
protected void setEmptyTableWidget() {
String caption = "-----";
if (!emptyCaptionIsDefined()) {
caption = emptyTableCaption;
}
dataGrid.setEmptyTableWidget(new Label(caption));
}
private boolean emptyCaptionIsDefined() {
return emptyTableCaption == null || emptyTableCaption.trim().isEmpty();
}
protected Widget makeWidget() {
return uiBinder.createAndBindUi(this);
}
public void redraw() {
dataGrid.redraw();
dataGrid.flush();
}
public void refresh() {
dataGrid.setVisibleRangeAndClearData(dataGrid.getVisibleRange(),
true);
}
@Override
public HandlerRegistration addCellPreviewHandler(final CellPreviewEvent.Handler<T> handler) {
return dataGrid.addCellPreviewHandler(handler);
}
@Override
public HandlerRegistration addRangeChangeHandler(final RangeChangeEvent.Handler handler) {
return dataGrid.addRangeChangeHandler(handler);
}
@Override
public HandlerRegistration addRowCountChangeHandler(final RowCountChangeEvent.Handler handler) {
return dataGrid.addRowCountChangeHandler(handler);
}
public int getColumnIndex(final Column<T, ?> column) {
return dataGrid.getColumnIndex(column);
}
public HandlerRegistration addColumnSortHandler(final ColumnSortEvent.Handler handler) {
return this.dataGrid.addColumnSortHandler(handler);
}
@Override
public int getRowCount() {
return dataGrid.getRowCount();
}
@Override
public void setRowCount(final int count) {
dataGrid.setRowCount(count);
}
@Override
public Range getVisibleRange() {
return dataGrid.getVisibleRange();
}
@Override
public void setVisibleRange(final Range range) {
dataGrid.setVisibleRange(range);
}
@Override
public boolean isRowCountExact() {
return dataGrid.isRowCountExact();
}
@Override
public void setRowCount(final int count,
final boolean isExact) {
dataGrid.setRowCount(count,
isExact);
}
@Override
public void setVisibleRange(final int start,
final int length) {
dataGrid.setVisibleRange(start,
length);
}
@Override
public SelectionModel<? super T> getSelectionModel() {
return dataGrid.getSelectionModel();
}
@Override
public void setSelectionModel(final SelectionModel<? super T> selectionModel) {
dataGrid.setSelectionModel(selectionModel);
}
@Override
public T getVisibleItem(final int indexOnPage) {
return dataGrid.getVisibleItem(indexOnPage);
}
@Override
public int getVisibleItemCount() {
return dataGrid.getVisibleItemCount();
}
@Override
public Iterable<T> getVisibleItems() {
return dataGrid.getVisibleItems();
}
@Override
public void setRowData(final int start,
final List<? extends T> values) {
dataGrid.setRowData(start,
values);
redraw();
}
public void setRowData(final List<? extends T> values) {
dataGrid.setRowData(values);
redraw();
}
public void setSelectionModel(final SelectionModel<? super T> selectionModel,
final CellPreviewEvent.Handler<T> selectionEventManager) {
dataGrid.setSelectionModel(selectionModel,
selectionEventManager);
}
@Override
public void setVisibleRangeAndClearData(final Range range,
final boolean forceRangeChangeEvent) {
dataGrid.setVisibleRangeAndClearData(range,
forceRangeChangeEvent);
}
@Override
public void setHeight(final String height) {
dataGrid.setHeight(height);
}
@Override
public void setPixelSize(final int width,
final int height) {
dataGrid.setPixelSize(width,
height);
}
@Override
public void setSize(final String width,
final String height) {
dataGrid.setSize(width,
height);
}
@Override
public void setWidth(final String width) {
dataGrid.setWidth(width);
}
public void setColumnWidth(final Column<T, ?> column,
final double width,
final Style.Unit unit) {
dataGrid.setColumnWidth(column,
width,
unit);
getColumnPicker().adjustColumnWidths();
}
public void setToolBarVisible(final boolean visible) {
toolbarContainer.setVisible(visible);
}
public ColumnSortList getColumnSortList() {
return dataGrid.getColumnSortList();
}
public HasWidgets getToolbar() {
return toolbarContainer;
}
public HasWidgets getRightToolbar() {
return rightToolbar;
}
public HasWidgets getRightActionsToolbar() {
return rightActionsToolbar;
}
public HasWidgets getLeftToolbar() {
return leftToolbar;
}
public HasWidgets getCenterToolbar() {
return centerToolbar;
}
public void setRowStyles(final RowStyles<T> styles) {
dataGrid.setRowStyles(styles);
}
public void addTableTitle(String tableTitle) {
getLeftToolbar().add(new HTML("<h4>" + tableTitle + "</h4>"));
}
public void setAlwaysShowScrollBars(boolean alwaysShowScrollBars) {
dataGrid.setAlwaysShowScrollBars(alwaysShowScrollBars);
}
public void addColumn(final Column<T, ?> column,
final String caption) {
addColumn(column,
caption,
true);
}
public void addColumn(final Column<T, ?> column,
final String caption,
final boolean visible) {
ColumnMeta<T> columnMeta = new ColumnMeta<T>(column,
caption,
visible);
addColumn(columnMeta);
}
public void addColumns(final List<ColumnMeta<T>> columnMetas) {
for (ColumnMeta columnMeta : columnMetas) {
if (columnMeta.getHeader() == null) {
columnMeta.setHeader(getColumnHeader(columnMeta.getCaption(),
columnMeta.getColumn()));
}
}
getColumnPicker().addColumns(columnMetas);
}
protected void addColumn(final ColumnMeta<T> columnMeta) {
if (columnMeta.getHeader() == null) {
columnMeta.setHeader(getColumnHeader(columnMeta.getCaption(),
columnMeta.getColumn()));
}
getColumnPicker().addColumn(columnMeta);
}
protected ResizableMovableHeader<T> getColumnHeader(final String caption,
final Column column) {
final ResizableMovableHeader header = new ResizableMovableHeader<T>(caption,
dataGrid,
columnPicker,
column) {
@Override
protected int getTableBodyHeight() {
return dataGrid.getOffsetHeight();
}
};
header.addColumnChangedHandler(new ColumnChangedHandler() {
@Override
public void afterColumnChanged() {
afterColumnChangedHandler();
}
@Override
public void beforeColumnChanged() {
}
});
return header;
}
public void setColumnPickerButtonVisible(final boolean show) {
columnPickerButton.setVisible(show);
}
protected void afterColumnChangedHandler() {
}
interface Binder
extends
UiBinder<Widget, UberfireSimpleTable> {
}
}