001    package edu.nrao.sss.webapp.faces.component;
002    
003    import edu.nrao.sss.measure.TimeOfDayInterval;
004    import edu.nrao.sss.measure.TimeOfDay;
005    import javax.faces.component.UIInput;
006    import javax.faces.context.FacesContext;
007    import javax.faces.context.ResponseWriter;
008    import javax.faces.el.ValueBinding;
009    
010    import java.io.IOException;
011    import java.util.Map;
012    
013    import org.apache.log4j.Logger;
014    
015    /**
016     * <p>Renders a TimeOfDayInterval as a series of 4 input fields roughly like
017     * so:</p>
018     *
019     * &lt;start hour&gt; : &lt;start minute&gt; - &lt;end hour&gt; : &lt;end minute&gt;
020     */
021    public class TimeOfDayIntervalUIComponent extends UIInput
022    {
023      private static final Logger log = Logger.getLogger(TimeOfDayIntervalUIComponent.class);
024    
025            private Boolean enabled = null;
026    
027            public void encodeBegin(FacesContext context)
028                    throws IOException
029            {
030                    boolean enabled = isEnabled();
031    
032                    Map attrs = getAttributes();
033                    String disabledTimeStyleClass = (String)attrs.get("disabledTimeStyleClass");
034                    String timeStyleClass = (String)attrs.get("timeStyleClass");
035                    String timeFieldStyleClass = (String)attrs.get("timeFieldStyleClass");
036    
037                    ResponseWriter writer = context.getResponseWriter();
038                    
039                    String id = getClientId(context);
040                    String sHourId = id + ":shour";
041                    String sMinuteId = id + ":sminute";
042                    String eHourId = id + ":ehour";
043                    String eMinuteId = id + ":eminute";
044    
045                    TimeOfDayInterval todi = (TimeOfDayInterval)getValue();
046    
047        TimeOfDay start = todi.getStart();
048        TimeOfDay end = todi.getEnd();
049                    
050        int n = start.getHourOfDay();
051        String sHour = ((n >= 10)? "" : "0") + n;
052                    
053        n = start.getMinuteOfHour();
054        String sMin = ((n >= 10)? "" : "0") + n;
055                    
056        n = end.getHourOfDay();
057        String eHour = ((n >= 10)? "" : "0") + n;
058                    
059        n = end.getMinuteOfHour();
060        String eMin = ((n >= 10)? "" : "0") + n;
061    
062                    //We render one wrapper span around the start and end.
063                    writer.startElement("span", this);
064        writer.writeAttribute("id", id, null);
065                    
066                    //Now 4 input fields with 3 separators.
067                    if (enabled)
068                    {
069                            if (timeStyleClass != null && timeStyleClass.length() > 0)
070                                    writer.writeAttribute("class", timeStyleClass, null);
071    
072                            writer.startElement("input", this);
073                            writer.writeAttribute("type", "text", null);
074                            writer.writeAttribute("id", sHourId, null);
075                            writer.writeAttribute("name", sHourId, null);
076                            writer.writeAttribute("value", sHour, null);
077                            writer.writeAttribute("size", 2, null);
078                            writer.writeAttribute("maxlength", 2, null);
079                            if (timeFieldStyleClass != null && timeFieldStyleClass.length() > 0)
080                                    writer.writeAttribute("class", timeFieldStyleClass, null);
081                            writer.writeAttribute("onblur", "iceSubmitPartial(form, this, event); return false;", null);
082                            writer.endElement("input");
083    
084                            writer.write(":");
085    
086                            writer.startElement("input", this);
087                            writer.writeAttribute("type", "text", null);
088                            writer.writeAttribute("id", sMinuteId, null);
089                            writer.writeAttribute("name", sMinuteId, null);
090                            writer.writeAttribute("value", sMin, null);
091                            writer.writeAttribute("size", 2, null);
092                            writer.writeAttribute("maxlength", 2, null);
093                            if (timeFieldStyleClass != null && timeFieldStyleClass.length() > 0)
094                                    writer.writeAttribute("class", timeFieldStyleClass, null);
095                            writer.writeAttribute("onblur", "iceSubmitPartial(form, this, event); return false;", null);
096                            writer.endElement("input");
097    
098                            writer.write("-");
099    
100                            writer.startElement("input", this);
101                            writer.writeAttribute("type", "text", null);
102                            writer.writeAttribute("id", eHourId, null);
103                            writer.writeAttribute("name", eHourId, null);
104                            writer.writeAttribute("value", eHour, null);
105                            writer.writeAttribute("size", 2, null);
106                            writer.writeAttribute("maxlength", 2, null);
107                            if (timeFieldStyleClass != null && timeFieldStyleClass.length() > 0)
108                                    writer.writeAttribute("class", timeFieldStyleClass, null);
109                            writer.writeAttribute("onblur", "iceSubmitPartial(form, this, event); return false;", null);
110                            writer.endElement("input");
111    
112                            writer.write(":");
113    
114                            writer.startElement("input", this);
115                            writer.writeAttribute("type", "text", null);
116                            writer.writeAttribute("id", eMinuteId, null);
117                            writer.writeAttribute("name", eMinuteId, null);
118                            writer.writeAttribute("value", eMin, null);
119                            writer.writeAttribute("size", 2, null);
120                            writer.writeAttribute("maxlength", 2, null);
121                            if (timeFieldStyleClass != null && timeFieldStyleClass.length() > 0)
122                                    writer.writeAttribute("class", timeFieldStyleClass, null);
123                            writer.writeAttribute("onblur", "iceSubmitPartial(form, this, event); return false;", null);
124                            writer.endElement("input");
125                    }
126    
127                    else
128                    {
129                            if (disabledTimeStyleClass != null && disabledTimeStyleClass.length() > 0)
130                                    writer.writeAttribute("class", disabledTimeStyleClass, null);
131    
132                            writer.startElement("span", this);
133                            if (timeFieldStyleClass != null && timeFieldStyleClass.length() > 0)
134                                    writer.writeAttribute("class", timeFieldStyleClass, null);
135                            writer.write(sHour);
136                            writer.endElement("span");
137    
138          writer.write(":");
139    
140                            writer.startElement("span", this);
141                            if (timeFieldStyleClass != null && timeFieldStyleClass.length() > 0)
142                                    writer.writeAttribute("class", timeFieldStyleClass, null);
143                            writer.write(sMin);
144                            writer.endElement("span");
145    
146          writer.write("-");
147    
148                            writer.startElement("span", this);
149                            if (timeFieldStyleClass != null && timeFieldStyleClass.length() > 0)
150                                    writer.writeAttribute("class", timeFieldStyleClass, null);
151                            writer.write(eHour);
152                            writer.endElement("span");
153    
154          writer.write(":");
155    
156                            writer.startElement("span", this);
157                            if (timeFieldStyleClass != null && timeFieldStyleClass.length() > 0)
158                                    writer.writeAttribute("class", timeFieldStyleClass, null);
159                            writer.write(eMin);
160                            writer.endElement("span");
161                    }
162    
163                    writer.endElement("span");
164            }
165    
166            public void decode(FacesContext context)
167            {
168                    String id = getClientId(context);
169                    String sHourId = id + ":shour";
170                    String sMinuteId = id + ":sminute";
171                    String eHourId = id + ":ehour";
172                    String eMinuteId = id + ":eminute";
173    
174                    Map parms = context.getExternalContext().getRequestParameterMap();
175    
176                    String sHour = (String)parms.get(sHourId);
177                    String sMin = (String)parms.get(sMinuteId);
178                    String eHour = (String)parms.get(eHourId);
179                    String eMin = (String)parms.get(eMinuteId);
180    
181                    
182        if (sHour == null || sMin == null || eHour == null || eMin == null)
183        {
184          log.warn("Someone's param was null!\n" +
185            "sHour '" + sHour + "'\n" + 
186            "sMin '" + sMin + "'\n" + 
187            "eHour '" + eHour + "'\n" + 
188            "eMin '" + eMin + "'"
189          );
190                            setSubmittedValue(null);
191        }
192                    
193                    else
194                    {
195                            StringBuilder todi = new StringBuilder(sHour);
196                            todi.append(":");
197                            todi.append(sMin);
198                            todi.append("-");
199                            todi.append(eHour);
200                            todi.append(":");
201                            todi.append(eMin);
202    
203          setValid(true);
204                            setSubmittedValue(todi.toString());
205                    }
206            }
207    
208            public Object saveState(FacesContext context)
209            {
210                    Object[] state = new Object[2];
211                    state[0] = super.saveState(context);
212                    state[1] = this.enabled;
213                    
214                    return state;
215            }
216            
217            public void restoreState(FacesContext context, Object state)
218            {
219                    Object[] myState = (Object[])state;
220                    super.restoreState(context, myState[0]);
221                    setEnabled((Boolean)myState[1]);
222            }
223            
224            public Boolean isEnabled()
225            {
226                    if (this.enabled != null)
227                            return this.enabled;
228                    
229                    ValueBinding vb = getValueBinding("enabled");
230                    if (vb != null)
231                    {
232                            Object val = vb.getValue(getFacesContext());
233                            
234                            if (val instanceof Boolean && val != null)
235                                    return (Boolean)val;
236                    }
237                    
238                    //else
239                    return Boolean.TRUE;
240            }
241            
242            public void setEnabled(Boolean e)
243            {
244                    this.enabled = e;
245            }
246            
247    
248            /** Overridden to be empty. */
249            public void encodeEnd(FacesContext context) throws IOException {}
250            
251            /** Overridden to be empty. */
252            public void encodeChildren(FacesContext context) throws IOException {}
253    }