001 package net.sf.tacos.components.dojo;
002
003 import java.util.Collection;
004 import java.util.HashMap;
005 import java.util.Map;
006
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.dojo.AbstractWidget;
015 import org.apache.tapestry.engine.DirectServiceParameter;
016 import org.apache.tapestry.engine.IEngineService;
017 import org.apache.tapestry.engine.ILink;
018 import org.apache.tapestry.listener.ListenerInvoker;
019
020 public abstract class DropTarget extends AbstractWidget implements IDirect{
021 /**
022 * Name of the {@link IRequestCycle} parameter whose value is the
023 * identifier of the dropped draggable source
024 * @see {@link IRequestCycle#getParameter(String)}
025 */
026 public static final String DRAG_SOURCE_PARAMETER = "dragSourceId";
027
028 /**
029 * {@inheritDoc}
030 */
031 public void renderWidget(IMarkupWriter writer, IRequestCycle cycle) {
032 writer.begin(getTemplateTagName());
033 renderIdAttribute(writer, cycle);
034 renderInformalParameters(writer, cycle);
035 renderBody(writer, cycle);
036 writer.end();
037
038 if (!cycle.isRewinding()) {
039 Map params = new HashMap();
040 params.put("component", this);
041 params.put("dragSource", getDragSource());
042 params.put("dragSourceElement", getDragSourceElement());
043 params.put("dragSourceTag", getDragSourceTag());
044 params.put("acceptedTypes", getAcceptedTypes());
045 params.put("insertDragSource", new Boolean(isInsertDragSource()));
046 params.put("onDrop", getOnDrop());
047 if (getListener()!=null)
048 params.put("url", getLink().getURL());
049
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 /** Reference to js function - called when a drop event is generated.*/
072 public abstract String getOnDrop();
073 /** List item source parameter */
074 public abstract Object getDragSource();
075 /** Drag source element */
076 public abstract String getDragSourceElement();
077 /** Drag source tag */
078 public abstract String getDragSourceTag();
079 /** Type of tags target accepts */
080 public abstract Collection getAcceptedTypes();
081 /** Whether or not to allow insertion of source element */
082 public abstract boolean isInsertDragSource();
083 /** Injected listener parameter, may be null. */
084 public abstract IActionListener getListener();
085 /** Injected script. */
086 public abstract IScript getScript();
087 /** Injected listener invoker. */
088 public abstract ListenerInvoker getListenerInvoker();
089 /** Injected engine service . */
090 public abstract IEngineService getEngine();
091
092 }