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

Reply via email to