blob: e1490e6dffaa8cbe254392826b6f5ea53fe9eae0 [file] [log] [blame]
/*
* Copyright 2010 Google 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 com.google.gwt.user.cellview.client;
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 com.google.gwt.user.client.ui.HasAlignment;
/**
* 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.
*
* @param <T> the row type
* @param <C> the column type
*/
public abstract class Column<T, C> implements HasCell<T, C>, HasAlignment {
/**
* The {@link Cell} responsible for rendering items in the column.
*/
private final Cell<C> cell;
private String cellStyleNames = null;
/**
* The {@link FieldUpdater} used for updating values in the column.
*/
private FieldUpdater<T, C> fieldUpdater;
private boolean isSortable = false;
private HorizontalAlignmentConstant hAlign = null;
private VerticalAlignmentConstant vAlign = null;
/**
* Construct a new Column with a given {@link Cell}.
*
* @param cell the Cell used by this Column
*/
public Column(Cell<C> cell) {
this.cell = cell;
}
/**
* Returns the {@link Cell} responsible for rendering items in the column.
*
* @return a Cell
*/
@Override
public Cell<C> getCell() {
return cell;
}
/**
* Get extra style names that should be applied to a cell in this column.
*
* @param context the cell context
* @param object the base object to be updated, or null if the row is empty
* @return the extra styles of the given row in a space-separated list, or
* {@code null} if there are no extra styles for the cells in this
* column
*/
public String getCellStyleNames(Context context, T object) {
return cellStyleNames;
}
/**
* Returns the {@link FieldUpdater} used for updating values in the column.
*
* @return an instance of FieldUpdater<T, C>
* @see #setFieldUpdater(FieldUpdater)
*/
@Override
public FieldUpdater<T, C> getFieldUpdater() {
return fieldUpdater;
}
@Override
public HorizontalAlignmentConstant getHorizontalAlignment() {
return hAlign;
}
/**
* Returns the column value from within the underlying data object.
*/
@Override
public abstract C getValue(T object);
@Override
public VerticalAlignmentConstant getVerticalAlignment() {
return vAlign;
}
/**
* Check if the column is sortable.
*
* @return true if sortable, false if not
*/
public boolean isSortable() {
return isSortable;
}
/**
* 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 T object, NativeEvent event) {
final int index = context.getIndex();
ValueUpdater<C> valueUpdater = (fieldUpdater == null) ? null : new ValueUpdater<C>() {
@Override
public void update(C 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, T object, SafeHtmlBuilder sb) {
cell.render(context, getValue(object), sb);
}
/**
* Set extra style names that should be applied to every cell.
*
* <p>
* If you want to apply style names based on the row or cell value, override
* {@link #getCellStyleNames(Context, Object)} directly.
* </p>
*
* @param styleNames the extra style names to applyin a space-separated list,
* or {@code null} if there are no extra styles for this cell
*/
public void setCellStyleNames(String styleNames) {
this.cellStyleNames = styleNames;
}
/**
* Set the {@link FieldUpdater} used for updating values in the column.
*
* @param fieldUpdater the field updater
* @see #getFieldUpdater()
*/
public void setFieldUpdater(FieldUpdater<T, C> fieldUpdater) {
this.fieldUpdater = fieldUpdater;
}
/**
* {@inheritDoc}
*
* <p>
* The new horizontal alignment will apply the next time the table is
* rendered.
* </p>
*/
@Override
public void setHorizontalAlignment(HorizontalAlignmentConstant align) {
this.hAlign = align;
}
/**
* Set whether or not the column can be sorted. The change will take effect
* the next time the table is redrawn.
*
* @param sortable true to make sortable, false to make unsortable
*/
public void setSortable(boolean sortable) {
this.isSortable = sortable;
}
/**
* {@inheritDoc}
*
* <p>
* The new vertical alignment will apply the next time the table is rendered.
* </p>
*/
@Override
public void setVerticalAlignment(VerticalAlignmentConstant align) {
this.vAlign = align;
}
}