/*
* Copyright 2011 Red Hat, Inc. and/or its affiliates.
*
* 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.kie.workbench.common.widgets.client.tables;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;
import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.view.client.AsyncDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.ProvidesKey;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.constants.ButtonSize;
import org.gwtbootstrap3.client.ui.constants.IconType;
import org.gwtbootstrap3.client.ui.gwt.ButtonCell;
import org.jboss.errai.ioc.client.container.IOC;
import org.uberfire.backend.vfs.Path;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.ext.widgets.common.client.resources.i18n.CommonConstants;
import org.uberfire.ext.widgets.common.client.tables.PagedTable;
import org.uberfire.paging.AbstractPathPageRow;
/**
* Widget that shows rows of paged data where columns "uuid", "name" and
* "format" are common. A "checkbox" and "open" button column are added by
* default. Additional columns can be inserted inbetween these columns by
* overriding <code>addAncillaryColumns()</code>. A "RSS Feed" button can also
* be included if required.
* <p/>
* Based upon work by Geoffrey de Smet.
*/
public abstract class AbstractPathPagedTable<T extends AbstractPathPageRow> extends Composite {
protected MultiSelectionModel<T> selectionModel;
protected final PagedTable dataGrid;
private final ProvidesKey<T> providesKey = new ProvidesKey<T>() {
public Object getKey( T row ) {
return row.getPath();
}
};
public AbstractPathPagedTable( final int pageSize ) {
dataGrid = new PagedTable( pageSize,
providesKey );
selectionModel = new MultiSelectionModel<T>( providesKey );
dataGrid.setSelectionModel( selectionModel );
Column<T, Boolean> selectionColumn = new Column<T, Boolean>( new CheckboxCell( true,
true ) ) {
@Override
public Boolean getValue( T object ) {
return dataGrid.getSelectionModel().isSelected( object );
}
};
selectionColumn.setFieldUpdater( new FieldUpdater<T, Boolean>() {
public void update( int index,
T object,
Boolean value ) {
dataGrid.getSelectionModel().setSelected( object,
value );
}
} );
dataGrid.addColumn( selectionColumn,
"" );
addAncillaryColumns();
final TextColumn<T> uriColumn = new TextColumn<T>() {
public String getValue( T row ) {
return row.getPath().toURI();
}
};
dataGrid.addColumn( uriColumn,
CommonConstants.INSTANCE.AbstractTableFileURI(),
false );
// Add "Open" button column
Column<T, String> openColumn = new Column<T, String>( new ButtonCell( ButtonSize.SMALL ) ) {
public String getValue( T row ) {
return CommonConstants.INSTANCE.AbstractTableOpen();
}
};
openColumn.setFieldUpdater( new FieldUpdater<T, String>() {
public void update( int index,
T row,
String value ) {
getPlaceManager().goTo( row.getPath() );
}
} );
dataGrid.addColumn( openColumn,
CommonConstants.INSTANCE.AbstractTableOpen() );
final Button refreshButton = new Button();
refreshButton.setIcon( IconType.REFRESH );
refreshButton.setTitle( CommonConstants.INSTANCE.Refresh() );
refreshButton.addClickHandler( new ClickHandler() {
@Override
public void onClick( ClickEvent event ) {
dataGrid.refresh();
}
} );
dataGrid.getToolbar().add( refreshButton );
final Button openSelectedButton = new Button( CommonConstants.INSTANCE.AbstractTableOpenSelected() );
openSelectedButton.addClickHandler( new ClickHandler() {
@Override
public void onClick( ClickEvent event ) {
final Set<T> selectedSet = selectionModel.getSelectedSet();
for ( T selected : selectedSet ) {
getPlaceManager().goTo( selected.getPath() );
}
}
} );
dataGrid.getToolbar().add( openSelectedButton );
initWidget( dataGrid );
}
protected abstract void addAncillaryColumns();
/**
* Return an array of selected Paths. API is maintained for backwards
* compatibility of legacy code with AssetItemGrid's implementation
* @return
*/
public Collection<Path> getSelectedRowPaths() {
Set<T> selectedRows = selectionModel.getSelectedSet();
// Compatibility with existing API
if ( selectedRows.size() == 0 ) {
return null;
}
// Create the array of Paths
final Collection<Path> paths = new ArrayList<Path>( selectedRows.size() );
for ( T row : selectedRows ) {
paths.add( row.getPath() );
}
return paths;
}
/**
* Refresh table programmatically
*/
public void refresh() {
selectionModel.clear();
dataGrid.setVisibleRangeAndClearData( dataGrid.getVisibleRange(), true );
}
/**
* Link a data provider to the table
* @param dataProvider
*/
public void setDataProvider( final AsyncDataProvider<T> dataProvider ) {
dataProvider.addDataDisplay( dataGrid );
}
private PlaceManager getPlaceManager() {
return IOC.getBeanManager().lookupBean( PlaceManager.class ).getInstance();
}
}