001 package net.sf.tacos.components.scriptaculous;
002
003 import java.util.HashMap;
004 import java.util.List;
005 import java.util.Map;
006
007 import org.apache.tapestry.AbstractComponent;
008 import org.apache.tapestry.IMarkupWriter;
009 import org.apache.tapestry.IRequestCycle;
010 import org.apache.tapestry.IScript;
011 import org.apache.tapestry.TapestryUtils;
012 import org.apache.tapestry.json.JSONObject;
013
014 /**
015 * Implementation of the <a href="http://wiki.script.aculo.us/scriptaculous/show/Draggables">Draggables</a>.
016 * <p>
017 * This component makes html elements draggable. Draggables can be dragged and dropped into Droppables.
018 * </p>
019 *
020 * <p>Example:
021 * <pre><div jwcid="@tacos:Draggable" draggables="ognl:{'id1', 'id2', 'id3'}" /></pre>
022 * </p>
023 * @author Igor Drobiazko
024 * @since 4.1
025 * @see Droppable
026 */
027 public abstract class Draggable extends AbstractComponent {
028
029 /**
030 * {@inheritDoc}
031 */
032 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {
033 renderBody(writer, cycle);
034
035 JSONObject json = new JSONObject();
036 json.put("revert", new Boolean(isRevert()));
037 json.put("ghosting", new Boolean(isGhosting()));
038
039 Map parms = new HashMap();
040 parms.put("props", json.toString());
041 parms.put("draggables", getDraggables());
042
043 getScript().execute(this, cycle, TapestryUtils.getPageRenderSupport(cycle, this), parms);
044 }
045
046 /**
047 * Returns {@link String[]} or {@link Collection} of element ids to make draggable.
048 */
049 public abstract List getDraggables();
050
051 /**
052 * If set to <code>true</code>, clones the element and drags the clone,
053 * leaving the original in place until the clone is dropped.
054 */
055 public abstract boolean isGhosting();
056
057 /**
058 * If set to <code>true</code>, the element returns to its original position when the drags ends.
059 */
060 public abstract boolean isRevert();
061
062 /** Injected {@link IScript}. */
063 public abstract IScript getScript();
064 }