package <%= views_package %>; import java.util.List; import <%= gwt_rails_package %>.ColumnDefinition; import <%= gwt_rails_package %>.RestfulActionEnum; import <%= models_package %>.<%= class_name %>; import <%= places_package %>.<%= class_name %>Place; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.EventTarget; import com.google.gwt.dom.client.Node; import com.google.gwt.dom.client.TableCellElement; import com.google.gwt.dom.client.TableElement; import com.google.gwt.dom.client.TableRowElement; import com.google.gwt.dom.client.TableSectionElement; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.uibinder.client.UiTemplate; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Singleton; @Singleton public class <%= class_name %>ViewImpl extends Composite implements <%= class_name %>View { @UiTemplate("<%= class_name %>View.ui.xml") interface <%= class_name %>ViewUiBinder extends UiBinderViewImpl> {} private static <%= class_name %>ViewUiBinder uiBinder = GWT.create(<%= class_name %>ViewUiBinder.class); @UiField Button showButton; // @UiField // TextBox login; @UiField HTML modelsTable; private Presenter presenter; private List>> columnDefinitions = new <%= class_name.pluralize %>ColumnDefinitionsImpl(); private List<<%= class_name %>> models; public <%= class_name %>ViewImpl() { initWidget(uiBinder.createAndBindUi(this)); } @UiHandler("showButton") void onClickEdit(ClickEvent e) { presenter.goTo(new <%= class_name %>Place(RestfulActionEnum.EDIT)); } public void setPresenter(Presenter presenter) { this.presenter = presenter; } public void reset(<%= class_name %> model) { // TODO } public void reset(List<<%= class_name %>> models) { this.models = models; TableElement table = Document.get().createTableElement(); TableSectionElement tbody; table.appendChild(tbody = Document.get().createTBodyElement()); for (int i = 0; i < models.size(); ++i) { TableRowElement row = tbody.insertRow(-1); <%= class_name %> t = models.get(i); for (int j = 0; j < columnDefinitions.size(); ++j) { TableCellElement cell = row.insertCell(-1); StringBuilder sb = new StringBuilder(); columnDefinitions.get(j).render(t, sb); cell.setInnerHTML(sb.toString()); // TODO: Really total hack! There's gotta be a better way... Element child = cell.getFirstChildElement(); if (child != null) { Event.sinkEvents(child, Event.ONFOCUS | Event.ONBLUR); } } } modelsTable.setHTML(table.getInnerHTML()); } private TableCellElement findNearestParentCell(Node node) { while ((node != null)) { if (Element.is(node)) { Element elem = Element.as(node); String tagName = elem.getTagName(); if ("td".equalsIgnoreCase(tagName) || "th".equalsIgnoreCase(tagName)) { return elem.cast(); } } node = node.getParentNode(); } return null; } @UiHandler("modelsTable") void onTableClicked(ClickEvent event) { if (presenter != null) { EventTarget target = event.getNativeEvent().getEventTarget(); Node node = Node.as(target); TableCellElement cell = findNearestParentCell(node); if (cell == null) { return; } TableRowElement tr = TableRowElement.as(cell.getParentElement()); int row = tr.getSectionRowIndex(); if (cell != null) { if (shouldFireClickEvent(cell)) { presenter.onItemClicked(models.get(row)); } } } } private boolean shouldFireClickEvent(TableCellElement cell) { boolean shouldFireClickEvent = false; if (cell != null) { ColumnDefinition<<%= class_name %>> columnDefinition = columnDefinitions.get(cell.getCellIndex()); if (columnDefinition != null) { shouldFireClickEvent = columnDefinition.isClickable(); } } return shouldFireClickEvent; } }