package com.googlecode.tawus.components; import java.util.List; import org.apache.tapestry5.BindingConstants; import org.apache.tapestry5.ClientElement; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.Link; import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.Import; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.json.JSONObject; import org.apache.tapestry5.services.PageRenderLinkSource; import org.apache.tapestry5.services.javascript.JavaScriptSupport; @Import(library = "button.js") public class Button implements ClientElement { @Inject private ComponentResources resources; @Inject private PageRenderLinkSource pageRenderLinkSource; public static final String CANCEL_TYPE = "cancel"; public static final String BUTTON_TYPE = "button"; public static final String PAGE_TYPE = "page"; public static final String SUBMIT_TYPE = "submit"; @Parameter(value = "prop:componentResources.id", defaultPrefix = BindingConstants.LITERAL) private String clientId; private String assignedClientId; @Parameter(value = "false", defaultPrefix = BindingConstants.LITERAL, allowNull = false) private boolean disabled; @Parameter(defaultPrefix = BindingConstants.LITERAL, required = true, allowNull = false) private String type; @Parameter(defaultPrefix = BindingConstants.LITERAL, allowNull = false, value = "click") private String event; @Parameter private List<?> context; @Parameter(required = false, defaultPrefix = BindingConstants.LITERAL) private String pageName; @Parameter(defaultPrefix = BindingConstants.LITERAL) private String zone; private Object[] contextArray; @Environmental private JavaScriptSupport javaScriptSupport; @Parameter(defaultPrefix = BindingConstants.LITERAL, value = "click") private Object clientEvent; public String getClientId() { return assignedClientId; } void setupRender() { assignedClientId = javaScriptSupport.allocateClientId(clientId); contextArray = context == null ? new Object[0] : context.toArray(); } void beginRender(MarkupWriter writer) { writer.element("button", "type", type, "id", getClientId()); resources.renderInformalParameters(writer); } void afterRender(MarkupWriter writer) { if (!disabled && (PAGE_TYPE.equalsIgnoreCase(type) || BUTTON_TYPE .equalsIgnoreCase(type))) { Link link; if (PAGE_TYPE.equalsIgnoreCase(type)) { if (pageName == null) { throw new RuntimeException("pageName is required if type is " + PAGE_TYPE); } link = pageRenderLinkSource.createPageRenderLinkWithContext( pageName, resources.isBound("context"), contextArray); } else { link = resources.createEventLink(event, contextArray); } final JSONObject spec = new JSONObject(); spec.put("url", link.toAbsoluteURI()); spec.put("id", getClientId()); spec.put("zone", zone); spec.put("event", clientEvent); javaScriptSupport.addInitializerCall("ButtonEvent", spec); } writer.end();// button } }