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 * <start hour> : <start minute> - <end hour> : <end minute> 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 }