001 package net.sf.tacos.components;
002
003 import java.util.HashMap;
004 import java.util.Map;
005
006 import org.apache.tapestry.IMarkupWriter;
007 import org.apache.tapestry.IRequestCycle;
008 import org.apache.tapestry.IScript;
009 import org.apache.tapestry.TapestryUtils;
010 import org.apache.tapestry.AbstractComponent;
011 import org.apache.tapestry.IActionListener;
012 import org.apache.tapestry.IForm;
013 import org.apache.tapestry.IComponent;
014 import org.apache.tapestry.pageload.IComponentVisitor;
015 import org.apache.tapestry.internal.event.EventBoundListener;
016 import org.apache.tapestry.internal.event.IComponentEventInvoker;
017 import org.apache.tapestry.internal.Component;
018 import org.apache.tapestry.form.IFormComponent;
019
020 /**
021 * A component that acts like the EventListener annotation.
022 *
023 * @author Andreas Andreou
024 */
025 public abstract class EventListener extends AbstractComponent {
026
027
028 /**
029 * Whether or not to perform form validation.
030 * Default is false.
031 *
032 * @return Whether or not to validate the form.
033 */
034 public abstract boolean isValidateForm();
035
036 /**
037 * Will either submit the form normally or asynchronously. Default is asyncrhonous.
038 *
039 * @return True if form should be submitted asynchronously, false otherwise.
040 */
041 public abstract boolean isAsync();
042
043 /**
044 * The list of events that should cause this listener to invoke. Ie
045 * <code>events = {"onClick", "onOptionSelect"}</code> etc..
046 */
047 public abstract String[] getEvents();
048
049 /**
050 * The unique {@link org.apache.tapestry.IComponent} ids of the targeted sources that this listener will be
051 * listening to events on.
052 */
053 public abstract String[] getTargets();
054
055 /** The required listener parameter. */
056 public abstract IActionListener getListener();
057
058 /** The required listener parameter. */
059 public abstract AbstractComponent getComponent();
060
061 /** Injected. */
062 public abstract IScript getScript();
063
064 public abstract IComponentEventInvoker getEventInvoker();
065 public abstract IComponentVisitor getEventConnectionVisitor();
066
067 /**
068 * {@inheritDoc}
069 */
070 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {
071 if (cycle.isRewinding())
072 return;
073 AbstractComponent comp = getComponent();
074 comp.setHasEvents(true);
075 String peekId = comp.peekClientId();
076 System.out.println(peekId);
077 getContainer().getSpecification().addEventListener(
078 peekId,//comp.getId(),
079 getEvents(),
080 getListener().getMethodName(),
081 getForm().getClientId(),
082 isValidateForm(),
083 isAsync(),
084 false,
085 true);
086
087 getEventConnectionVisitor().visitComponent(getContainer());
088 /*String idPath = comp.getExtendedId();
089
090 getContainer().getSpecification().rewireComponentId(compId, idPath);
091 getEventInvoker().addEventListener();*/
092
093 /*Map parms = new HashMap();
094 parms.put("component", this);
095
096 getScript().execute(this, cycle, TapestryUtils.getPageRenderSupport(cycle, this), parms);*/
097
098 }
099
100 /**
101 * Finds the form that encloses this component.
102 * @return
103 */
104 public IForm getForm() {
105 return TapestryUtils.getForm(getPage().getRequestCycle(), this);
106 }
107
108 }