001 package net.sf.tacos.components; 002 003 import java.util.HashMap; 004 import java.util.Map; 005 006 import org.apache.tapestry.AbstractComponent; 007 import org.apache.tapestry.IActionListener; 008 import org.apache.tapestry.IDirect; 009 import org.apache.tapestry.IMarkupWriter; 010 import org.apache.tapestry.IRequestCycle; 011 import org.apache.tapestry.IScript; 012 import org.apache.tapestry.Tapestry; 013 import org.apache.tapestry.TapestryUtils; 014 import org.apache.tapestry.engine.DirectServiceParameter; 015 import org.apache.tapestry.engine.IEngineService; 016 import org.apache.tapestry.engine.ILink; 017 import org.apache.tapestry.listener.ListenerInvoker; 018 019 /** 020 * A component for creating a javascript function whose body 021 * is a call of an url definied by the direct service. This component is similar to 022 * <a href="http://tapestry.apache.org/tapestry4.1/components/link/directlink.html">DirectLink</a> 023 * component but allows you to call listener methods from javascript code without to click on any link or button. 024 * <p>The required parameters are: a listener method and the name of the function to generate.</p> 025 * <pre> 026 *<span jwcid="@tacos:ClientLink" listener="listener:onClick" function="myFunction"/> 027 *</pre> 028 *<p>The generated function can be used like this:</p> 029 *<pre> 030 *function test(){ 031 * ... 032 * myFunction(); 033 *} 034 *</pre> 035 * 036 * @author Igor Drobiazko 037 * 038 */ 039 public abstract class ClientLink extends AbstractComponent implements IDirect{ 040 /** 041 * {@inheritDoc} 042 */ 043 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) { 044 renderBody(writer, cycle); 045 046 if (!cycle.isRewinding()) { 047 Map params = new HashMap(); 048 params.put("url", getLink().getURL()); 049 params.put("function", getFunction()); 050 getScript().execute(this, cycle, TapestryUtils.getPageRenderSupport(cycle, this), params); 051 } 052 } 053 054 /** 055 * {@inheritDoc} 056 */ 057 public void trigger(IRequestCycle cycle) { 058 IActionListener listener = getListener(); 059 if (listener == null) 060 throw Tapestry.createRequiredParameterException(this, "listener"); 061 062 getListenerInvoker().invokeListener(listener, this, cycle); 063 } 064 065 /**Returns a link*/ 066 private ILink getLink(){ 067 DirectServiceParameter dsp = new DirectServiceParameter(this); 068 return getEngine().getLink(isStateful(), dsp); 069 } 070 071 /** The required listener parameter. */ 072 public abstract IActionListener getListener(); 073 /** Name of the javascript function to generate. */ 074 public abstract String getFunction(); 075 076 /** Injected script. */ 077 public abstract IScript getScript(); 078 /** Injected listener invoker. */ 079 public abstract ListenerInvoker getListenerInvoker(); 080 /** Injected engine service . */ 081 public abstract IEngineService getEngine(); 082 }