package <%= views_package %>;
<% if !options || attributes.detect { |a| a.type == :belongs_to} -%> import java.util.List;
<% end -%> <% unless options -%> import javax.inject.Inject; <% end -%>
import <%= editors_package %>.<%= class_name %>Editor; <% for attribute in attributes -%> <% if attribute.type == :belongs_to -%> import <%= models_package %>.<%= attribute.name.classify %>; <% end -%> <% end -%> <% unless options -%> <% unless class_name == ‘User’ -%> import <%= models_package %>.User; <% end -%> <% end -%> import <%= models_package %>.<%= class_name %>; import <%= places_package %>.<%= class_name %>Place;
import com.google.gwt.core.client.GWT; import com.google.gwt.editor.client.SimpleBeanEditorDriver; import com.google.gwt.event.dom.client.ClickEvent; <% unless options -%> import com.google.gwt.event.dom.client.ClickHandler; <% end -%> import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; <% unless options -%> import com.google.gwt.uibinder.client.UiHandler; <% end -%> import com.google.gwt.uibinder.client.UiTemplate; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; <% unless options -%> import com.google.gwt.user.client.ui.FlexTable; <% end -%> import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Singleton;
import <%= gwt_rails_package %>.places.RestfulAction; import <%= gwt_rails_package %>.places.RestfulActionEnum; import static <%= gwt_rails_package %>.places.RestfulActionEnum.*; <% unless options -%> import <%= gwt_rails_package %>.session.SessionManager; <% end -%> <% unless options -%> import <%= gwt_rails_package %>.views.ModelButton; <% end -%>
@Singleton public class <%= class_name %>ViewImpl extends Composite implements <%= class_name %>View {
@UiTemplate("<%= class_name %>View.ui.xml") interface Binder extends UiBinder<Widget, <%= class_name %>ViewImpl> {} private static Binder BINDER = GWT.create(Binder.class); interface EditorDriver extends SimpleBeanEditorDriver<<%= class_name %>, <%= class_name %>Editor> {} private final EditorDriver editorDriver = GWT.create(EditorDriver.class);
<% unless options -%> <% unless options -%>
@UiField Button newButton;
<% end -%>
@UiField Button editButton; @UiField Button showButton;
<% unless options -%>
@UiField Button createButton;
<% end -%>
@UiField Button saveButton;
<% unless options -%>
@UiField Button deleteButton;
<% end -%> <% end -%>
@UiField Panel model;
<% unless options -%>
@UiField FlexTable list;
<% end -%>
@UiField <%= class_name %>Editor editor; private Presenter presenter;
<% unless options -%>
private final SessionManager<User> session;
<% end -%>
public <%= class_name %>ViewImpl() {
<% unless options -%>
this(null); } @Inject public <%= class_name %>ViewImpl(SessionManager<User> session) {
<% end -%>
initWidget(BINDER.createAndBindUi(this)); editorDriver.initialize(editor);
<% unless options -%>
this.session = session;
<% end -%>
}
<% unless options -%>
private boolean isAllowed(RestfulActionEnum action){ return session == null || session.isAllowed(<%= class_name %>Place.NAME, action); }
<% end -%> <% unless options -%> <% unless options -%>
@UiHandler("newButton") void onClickNew(ClickEvent e) { presenter.goTo(new <%= class_name %>Place(RestfulActionEnum.NEW)); }
<% end -%>
@UiHandler("showButton") void onClickShow(ClickEvent e) { presenter.goTo(new <%= class_name %>Place(<% unless options[:singleton] -%>editor.id.getValue(), <% end -%>RestfulActionEnum.SHOW)); } @UiHandler("editButton") void onClickEdit(ClickEvent e) { presenter.goTo(new <%= class_name %>Place(<% unless options[:singleton] -%>editor.id.getValue(), <% end -%>RestfulActionEnum.EDIT)); }
<% unless options -%>
@UiHandler("createButton") void onClickCreate(ClickEvent e) { presenter.create(); }
<% end -%>
@UiHandler("saveButton") void onClickSave(ClickEvent e) { presenter.save(); }
<% unless options -%>
@UiHandler("deleteButton") void onClickDelete(ClickEvent e) { presenter.delete(flush()); }
<% end -%> <% end -%>
public void setup(Presenter presenter, RestfulAction a) { RestfulActionEnum action = RestfulActionEnum.valueOf(a); this.presenter = presenter;
<% if options -%>
editButton.setVisible((action == SHOW || action == INDEX) && isAllowed(EDIT)); saveButton.setVisible(action == EDIT); showButton.setVisible(action == EDIT); editor.setEnabled(!action.viewOnly());
<% else -%> <% unless options -%>
newButton.setVisible(action != NEW && isAllowed(NEW));
<% end -%>
if(action == INDEX){
<% unless options -%>
editButton.setVisible(false); showButton.setVisible(false);
<% end -%>
list.setVisible(true); model.setVisible(false); } else {
<% unless options -%>
createButton.setVisible(action == NEW); editButton.setVisible(action == SHOW && isAllowed(EDIT)); showButton.setVisible(action == EDIT); saveButton.setVisible(action == EDIT); deleteButton.setVisible(action == EDIT && isAllowed(DESTROY));
<% end -%>
list.setVisible(false); model.setVisible(true); } editor.setEnabled(!action.viewOnly());
<% end -%>
} public void edit(<%= class_name %> model) { this.editorDriver.edit(model); this.editor.resetVisibility(); } public <%= class_name %> flush() { return editorDriver.flush(); }
<% unless options -%>
private final ClickHandler clickHandler = new ClickHandler() { @SuppressWarnings("unchecked") public void onClick(ClickEvent event) { ModelButton<<%= class_name %>> button = (ModelButton<<%= class_name %>>)event.getSource(); switch(button.action){
<% unless options -%>
case DESTROY: presenter.delete(button.model); break;
<% end -%>
default: presenter.goTo(new <%= class_name %>Place(button.model, button.action)); } } }; private Button newButton(RestfulActionEnum action, <%= class_name %> model){ ModelButton<<%= class_name %>> button = new ModelButton<<%= class_name %>>(action, model); button.addClickHandler(clickHandler); return button; } public void reset(List<<%= class_name %>> models) { list.removeAllRows(); list.setText(0, 0, "Id");
<% index = 0 -%> <% attributes.each do |attribute| -%> <% if !(attribute.type == :text && options) -%> <% index = index + 1 -%>
list.setText(0, <%= index %>, "<%= attribute.name.humanize -%>");
<% end -%> <% end -%>
list.getRowFormatter().addStyleName(0, "gwt-rails-model-list-header"); int row = 1; for(<%= class_name %> model: models){ setRow(row, model); row++; } } private void setRow(int row, <%= class_name %> model) { list.setText(row, 0, model.getId() + "");
<% index = 0 -%> <% attributes.each do |attribute| -%> <% if attribute.type != :has_one && attribute.type != :has_many -%> <% name = attribute.name.camelcase.sub(/^(.)/){ $1.downcase } -%> <% if !(attribute.type == :text && options) -%> <% index = index + 1 -%>
list.setText(row, <%= index %>, model.get<%= name.camelcase %>()<%= attribute.type == :has_one || attribute.type == :belongs_to ? ' == null ? "-" : model.get' + name.camelcase + '().toDisplay()' : ' + ""' %>);
<% end -%> <% end -%> <% end -%>
list.setWidget(row, <%= index + 1 %>, newButton(RestfulActionEnum.SHOW, model));
<% unless options -%>
list.setWidget(row, <%= index + 2 %>, newButton(RestfulActionEnum.EDIT, model)); list.setWidget(row, <%= index + 3 %>, newButton(RestfulActionEnum.DESTROY, model));
<% end -%>
}
<% unless options -%>
public void removeFromList(<%= class_name %> model) { String id = model.getId() + ""; for(int i = 0; i < list.getRowCount(); i++){ if(list.getText(i, 0).equals(id)){ list.removeRow(i); return; } } }
<% end -%> <% end -%> <% for attribute in attributes -%> <% if attribute.type == :belongs_to -%> <% clazz = attribute.name.classify -%>
public void reset<%= clazz.to_s.pluralize %>(List<<%= clazz %>> list){ editor.reset<%= clazz.to_s.pluralize %>(list); }
<% end -%> <% end -%> }