001    package net.sf.tacos.components;
002    
003    import java.util.HashMap;
004    import java.util.Map;
005    
006    import org.apache.tapestry.BaseComponent;
007    import org.apache.tapestry.IMarkupWriter;
008    import org.apache.tapestry.IRequestCycle;
009    import org.apache.tapestry.IScript;
010    import org.apache.tapestry.TapestryUtils;
011    import org.apache.tapestry.form.IFormComponent;
012    
013    /**
014     * Provides a hint for a form field to guide the user on how to fill it.
015     * The box with the helper text appears when the field is focused and disappears when the focus is lost.
016     * 
017     * @author Igor Drobiazko
018     */
019    public abstract class FieldHint extends BaseComponent {
020            /**
021         * {@inheritDoc}
022         */
023            protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {
024                    writer.begin("span");
025            renderIdAttribute(writer, cycle);
026            writer.appendAttribute("class", "hint");
027            renderBody(writer, cycle);
028            super.renderComponent(writer, cycle);
029            writer.end();
030            
031            if (!cycle.isRewinding()) {
032                Map parms = new HashMap();
033                parms.put("component", this);
034                parms.put("startEvent", getStartEvent());
035                parms.put("endEvent", getEndEvent());
036    
037                getScript().execute(this, cycle, TapestryUtils.getPageRenderSupport(cycle, this), parms);
038                }
039            }
040            
041        /** Injected {@link IScript}. */
042        public abstract IScript getScript();
043        
044        /** Field parameter. */
045        public abstract IFormComponent getField();
046        
047        /** The js event of the form component that should make the hint visible. */
048        public abstract String getStartEvent();
049        
050        /** The js event of the form component that should make the hint hidden. */
051        public abstract String getEndEvent();    
052    }