/*
* Copyright 2012 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.decoratedgrid.client.widget;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import org.kie.workbench.common.widgets.decoratedgrid.client.widget.data.DynamicDataRow;
/**
* A representation of a column in a table. The column may maintain view data
* for each cell on demand. New view data, if needed, is created by the cell's
* onBrowserEvent method, stored in the Column, and passed to future calls to
* Cell's {@link Cell#onBrowserEvent} and {@link Cell#render} methods.
* <p/>
* Forked GWT2.1.1's Column<T, C> class to make Cell<C> non-final.
*/
public abstract class DynamicBaseColumn
implements
HasCell<DynamicDataRow, CellValue<? extends Comparable<?>>> {
/**
* The {@link Cell} responsible for rendering items in the column.
*/
protected DecoratedGridCellValueAdaptor<? extends Comparable<?>> cell;
/**
* The {@link FieldUpdater} used for updating values in the column.
*/
protected FieldUpdater<DynamicDataRow, CellValue<? extends Comparable<?>>> fieldUpdater;
/**
* Construct a new Column with a given {@link Cell}.
* @param cell the Cell used by this Column
*/
public DynamicBaseColumn( DecoratedGridCellValueAdaptor<? extends Comparable<?>> cell ) {
if ( cell == null ) {
throw new IllegalArgumentException( "cell cannot be null" );
}
this.cell = cell;
}
/**
* Returns the {@link Cell} responsible for rendering items in the column.
* @return a Cell
*/
public DecoratedGridCellValueAdaptor<? extends Comparable<?>> getCell() {
return cell;
}
/**
* Returns the {@link FieldUpdater} used for updating values in the column.
* @return an instance of FieldUpdater<T, C>
* @see #setFieldUpdater(FieldUpdater)
*/
public FieldUpdater<DynamicDataRow, CellValue<? extends Comparable<?>>> getFieldUpdater() {
return fieldUpdater;
}
/**
* Returns the column value from within the underlying data object.
*/
public abstract CellValue<? extends Comparable<?>> getValue( DynamicDataRow object );
/**
* Handle a browser event that took place within the column.
* @param context the cell context
* @param elem the parent Element
* @param object the base object to be updated
* @param event the native browser event
*/
public void onBrowserEvent( Context context,
Element elem,
final DynamicDataRow object,
NativeEvent event ) {
final int index = context.getIndex();
ValueUpdater<CellValue<? extends Comparable<?>>> valueUpdater = ( fieldUpdater == null ) ? null
: new ValueUpdater<CellValue<? extends Comparable<?>>>() {
public void update( CellValue<? extends Comparable<?>> value ) {
fieldUpdater.update( index,
object,
value );
}
};
cell.onBrowserEvent( context,
elem,
getValue( object ),
event,
valueUpdater );
}
/**
* Render the object into the cell.
* @param context the cell context
* @param object the object to render
* @param sb the buffer to render into
*/
public void render( Context context,
DynamicDataRow object,
SafeHtmlBuilder sb ) {
cell.render( context,
getValue( object ),
sb );
}
/**
* Set the cell used to render the column
* @param cell
*/
public void setCell( DecoratedGridCellValueAdaptor<? extends Comparable<?>> cell ) {
if ( cell == null ) {
throw new IllegalArgumentException( "cell cannot be null" );
}
this.cell = cell;
}
/**
* Set the {@link FieldUpdater} used for updating values in the column.
* @param fieldUpdater the field updater
* @see #getFieldUpdater()
*/
public void setFieldUpdater( FieldUpdater<DynamicDataRow, CellValue<? extends Comparable<?>>> fieldUpdater ) {
if ( fieldUpdater == null ) {
throw new IllegalArgumentException( "fieldUpdater cannot be null" );
}
this.fieldUpdater = fieldUpdater;
}
}