I have created my own Widget, a TableWidget. It fires a custom event,
TableEvent. I can't seem to get UiBinder, however, to play nice with
@UiHandler methods for TableEvents. Here is some code:
public class TableWidget<T> extends ResizeComposite implements
HasTableHandlers<T> {
private List<Column<T>> columns = Collections.emptyList();
private Grid grid;
public TableWidget(List<Column<T>> columns) {
this.columns = columns;
this.grid = new Grid();
this.grid.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Cell cell =
TableWidget.this.grid.getCellForEvent(event);
int row = cell.getRowIndex() - 1;
int col = cell.getCellIndex();
Column<T> definition =
TableWidget.this.columns.get(col);
fireEvent(new TableEvent<T>(row, col, definition));
}
});
clear();
initWidget(this.grid);
}
@Override
public HandlerRegistration addTableHandler(TableHandler<T>
handler) {
return addHandler(handler, TableEvent.TYPE);
}
public void clear() {
this.grid.clear();
this.grid.resizeRows(1);
for (int i = 0; i < this.columns.size(); i++) {
Column<T> col = this.columns.get(i);
this.grid.setText(0, i, col.getHeader());
}
}
public void setData(List<T> data) {
this.grid.resizeRows(data.size() + 1);
for (int row = 1; row <= data.size(); row++) {
T datum = data.get(row - 1);
for (int col = 0; col < this.columns.size(); col++) {
Column<T> column = this.columns.get(col);
this.grid.setText(row, col, column.render(datum));
}
}
}
}
public class TableEvent<T> extends GwtEvent<TableHandler<T>> {
public static Type<TableHandler<?>> TYPE;
static {
TYPE = new Type<TableHandler<?>>();
}
private int row;
private int col;
private Column<T> definition;
public TableEvent(int row, int column, Column<T> definition) {
this.row = row;
this.col = column;
this.definition = definition;
}
@SuppressWarnings("unchecked")
@Override
public Type<TableHandler<T>> getAssociatedType() {
return (Type) TYPE;
}
public int getColumn() {
return this.col;
}
public Column<T> getColumnDefinition() {
return this.definition;
}
public int getRow() {
return this.row;
}
@Override
protected void dispatch(TableHandler<T> handler) {
handler.onEvent(this);
}
}
public interface TableHandler<T> extends EventHandler {
void onEvent(TableEvent<T> event);
}
public interface HasTableHandlers<T> extends HasHandlers {
HandlerRegistration addTableHandler(TableHandler<T> handler);
}
In my UI, I have something like this:
<g:DockLayoutPanel unit="PX">
<g:center>
<g:ScrollPanel>
<misc:TableWidget ui:field="table" />
</g:ScrollPanel>
</g:center>
<g:south size="30">
<g:Button ui:field="create">(+) Add</g:Button>
</g:south>
</g:DockLayoutPanel>
Unfortunately, UiBinder blows up with the following error:
00:00:13.805 [ERROR] Field 'table' does not have an 'addTableHandler'
method associated.
Any ideas on why UiBinder can't see the 'addTableHandler' method that
is obviously there?
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors