package org.tynamo.mixins;
/**
* From jumpstart:
* A simple mixin for attaching javascript that updates a zone on any client-side event.
* Based on http://tinybits.blogspot.com/2010/03/new-and-better-zoneupdater.html
*/
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.ClientElement;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.InjectContainer;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.json.JSONObject;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
//This annotation tells Tapestry to declare the js file in the page so that the browser will pull it in.
@Import(library = "ZoneUpdater.js")
public class ZoneUpdater {
// Parameters
/**
* The event to listen for on the client. If not specified, zone update can only be triggered manually through
* calling updateZone on the JS object.
*/
@Parameter(name = "clientEvent", defaultPrefix = BindingConstants.LITERAL)
private String clientEvent;
/**
* The event to listen for in your component class
*/
@Parameter(name = "event", defaultPrefix = BindingConstants.LITERAL, required = true)
private String event;
@Parameter(name = "prefix", defaultPrefix = BindingConstants.LITERAL, value = "default")
private String prefix;
@Parameter(name = "context")
private Object[] context;
/**
* The zone to be updated by us.
*/
@Parameter(name = "zone", defaultPrefix = BindingConstants.LITERAL, required = true)
private String zone;
/**
* Set secure to true if https is being used, else set to false.
*/
@Parameter(name = "secure", defaultPrefix = BindingConstants.LITERAL, value = "false")
private boolean secure;
// Useful bits and pieces
@Inject
private ComponentResources componentResources;
@Environmental
private JavaScriptSupport javaScriptSupport;
/**
* The element we attach ourselves to
*/
@InjectContainer
private ClientElement clientElement;
// The code
void afterRender() {
String listenerURI = componentResources.createEventLink(event, context).toAbsoluteURI(secure);
// Add some JavaScript to the page to instantiate a ZoneUpdater. It will run when the DOM has been fully loaded.
JSONObject spec = new JSONObject();
spec.put("elementId", clientElement.getClientId());
spec.put("clientEvent", clientEvent);
spec.put("listenerURI", listenerURI);
spec.put("zoneId", zone);
javaScriptSupport.addScript("%sZoneUpdater = new ZoneUpdater(%s)", prefix, spec.toString());
}
}