package org.guvnor.messageconsole.client.console.widget;
import java.util.List;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.cellview.client.Column;
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.HasWidgets;
import com.google.gwt.view.client.AbstractDataProvider;
import com.google.gwt.view.client.CellPreviewEvent;
import com.google.gwt.view.client.HasData;
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.guvnor.common.services.shared.message.Level;
import org.guvnor.messageconsole.client.console.resources.MessageConsoleResources;
import org.gwtbootstrap3.client.ui.html.Span;
import org.uberfire.client.views.pfly.icon.PatternFlyIconType;
import org.uberfire.ext.widgets.common.client.tables.PagedTable;
import org.uberfire.ext.widgets.common.client.tables.SimpleTable;
public class MessageTableWidget<T> extends Composite implements HasData<T> {
public static final int DEFAULT_PAGE_SIZE = 5;
SimpleTable<T> dataGrid;
public enum Mode {
SIMPLE, PAGED
}
public interface ColumnExtractor<V> {
V getValue( Object row );
}
public MessageTableWidget() {
dataGrid = new SimpleTable<T>();
initWidget( dataGrid );
}
public MessageTableWidget( final Mode mode ) {
if ( mode == Mode.SIMPLE ) {
dataGrid = new SimpleTable<T>();
} else if ( mode == Mode.PAGED ) {
dataGrid = new PagedTable<T>( DEFAULT_PAGE_SIZE );
dataGrid.setHeight( "165px" );
dataGrid.setAlwaysShowScrollBars( false );
}
initWidget( dataGrid );
}
public MessageTableWidget( final SimpleTable dataGrid ) {
this.dataGrid = dataGrid;
initWidget( dataGrid );
}
public void addLevelColumn( final int px,
final ColumnExtractor<Level> extractor ) {
final Column<T, ?> column = new Column<T, Level>( new IconCell() ) {
@Override
public Level getValue( final T row ) {
return extractor.getValue( row );
}
@Override
public void render( Cell.Context context,
T row,
SafeHtmlBuilder sb ) {
String title = getLevelTitle( extractor.getValue( row ) );
sb.append( createDivStart( title, "", "text-center" ) );
super.render( context, row, sb );
sb.append( createDivEnd() );
}
};
dataGrid.addColumn( column,
MessageConsoleResources.CONSTANTS.Level() );
dataGrid.setColumnWidth( column,
px,
Style.Unit.PX );
}
public void addTextColumn( final int pct,
final ColumnExtractor<String> extractor ) {
Column<T, ?> column = new Column<T, String>( new TextCell() ) {
@Override
public String getValue( T row ) {
return extractor.getValue( row );
}
@Override
public void render( Cell.Context context,
T row,
SafeHtmlBuilder sb ) {
String title = extractor.getValue( row );
sb.append( createDivStart( title ) );
super.render( context, row, sb );
sb.append( createDivEnd() );
}
};
dataGrid.addColumn( column,
MessageConsoleResources.CONSTANTS.Text() );
dataGrid.setColumnWidth( column,
pct,
Style.Unit.PCT );
}
private String getLevelTitle( Level level ) {
switch ( level ) {
case ERROR:
return MessageConsoleResources.CONSTANTS.ErrorLevelTitle();
case WARNING:
return MessageConsoleResources.CONSTANTS.WarningLevelTitle();
case INFO:
default:
return MessageConsoleResources.CONSTANTS.InfoLevelTitle();
}
}
public SafeHtml createDivStart( String title ) {
return createDivStart( title, "" );
}
public SafeHtml createDivStart( String title,
String defaultValue ) {
return createDivStart(title, defaultValue, null );
}
public SafeHtml createDivStart( String title,
String defaultValue,
String cssClasses ) {
if ( title == null || "".equals( title ) ) {
title = defaultValue;
}
final String css = cssClasses == null ? "" : "class=\"" + cssClasses + "\"";
return SafeHtmlUtils.fromTrustedString( "<div title=\"" + SafeHtmlUtils.htmlEscape( title.trim() ) + "\" "+ css + " >" );
}
public SafeHtml createDivEnd() {
return SafeHtmlUtils.fromTrustedString( "</div>" );
}
private class IconCell extends AbstractCell<Level> {
@Override
public void render( Context context,
Level level,
SafeHtmlBuilder sb ) {
final Span icon = GWT.create( Span.class );
icon.addStyleName( "glyphicon" );
icon.addStyleName( getIconClass( level ) );
sb.appendHtmlConstant( icon.getElement().getString() );
}
private String getIconClass( final Level level ) {
switch ( level ) {
case ERROR:
return PatternFlyIconType.ERROR_CIRCLE_O.getCssName();
case WARNING:
return PatternFlyIconType.WARNING_TRIANGLE_O.getCssName();
case INFO:
default:
return PatternFlyIconType.INFO.getCssName();
}
}
}
public void setDataProvider( final AbstractDataProvider<T> dataProvider ) {
if ( dataGrid instanceof PagedTable ) {
( (PagedTable<T>) dataGrid ).setDataProvider( dataProvider );
}
}
public final AbstractDataProvider<T> getDataProvider() {
if ( dataGrid instanceof PagedTable ) {
return ( (PagedTable<T>) dataGrid ).getDataProvider();
}
return null;
}
public void setToolBarVisible( final boolean visible ) {
dataGrid.setToolBarVisible( visible );
}
public ColumnSortList getColumnSortList() {
return dataGrid.getColumnSortList();
}
public HasWidgets getToolbar() {
return dataGrid.getToolbar();
}
public HasWidgets getRightToolbar() {
return dataGrid.getRightToolbar();
}
public HasWidgets getRightActionsToolbar() {
return dataGrid.getRightActionsToolbar();
}
public HasWidgets getLeftToolbar() {
return dataGrid.getLeftToolbar();
}
public HasWidgets getCenterToolbar() {
return dataGrid.getCenterToolbar();
}
public void setRowStyles( final RowStyles<T> styles ) {
dataGrid.setRowStyles( styles );
}
public void setColumnPickerButtonVisible( final boolean show ) {
dataGrid.setColumnPickerButtonVisible( show );
}
public void addColumn( final Column<T, ?> lineColumn,
final String line ) {
dataGrid.addColumn( lineColumn, line );
}
public void setColumnWidth( final Column<T, ?> lineColumn,
final int i,
final Style.Unit pct ) {
dataGrid.setColumnWidth( lineColumn, i, pct );
}
@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 );
}
@Override
public SelectionModel<? super T> getSelectionModel() {
return dataGrid.getSelectionModel();
}
@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 );
}
public void setRowData( final List<? extends T> values ) {
dataGrid.setRowData( values );
}
public void redraw() {
dataGrid.redraw();
}
@Override
public void setSelectionModel( final SelectionModel<? super T> selectionModel ) {
dataGrid.setSelectionModel( selectionModel );
}
@Override
public void setVisibleRangeAndClearData( final Range range,
final boolean forceRangeChangeEvent ) {
dataGrid.setVisibleRangeAndClearData( range, forceRangeChangeEvent );
}
@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 );
}
@Override
public int getRowCount() {
return dataGrid.getRowCount();
}
@Override
public Range getVisibleRange() {
return dataGrid.getVisibleRange();
}
@Override
public boolean isRowCountExact() {
return dataGrid.isRowCountExact();
}
@Override
public void setRowCount( final int count ) {
dataGrid.setRowCount( count );
}
@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( length, length );
}
@Override
public void setVisibleRange( final Range range ) {
dataGrid.setVisibleRange( range );
}
}