001 package org.hackystat.projectbrowser.page.telemetry.inputpanel; 002 003 import org.apache.wicket.Component; 004 import org.apache.wicket.extensions.markup.html.form.DateTextField; 005 import org.apache.wicket.extensions.yui.calendar.DatePicker; 006 import org.apache.wicket.markup.ComponentTag; 007 import org.apache.wicket.markup.html.basic.Label; 008 import org.apache.wicket.markup.html.form.Button; 009 import org.apache.wicket.markup.html.form.CheckBox; 010 import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice; 011 import org.apache.wicket.markup.html.form.DropDownChoice; 012 import org.apache.wicket.markup.html.form.Form; 013 import org.apache.wicket.markup.html.form.TextField; 014 import org.apache.wicket.markup.html.list.ListItem; 015 import org.apache.wicket.markup.html.list.ListView; 016 import org.apache.wicket.model.Model; 017 import org.apache.wicket.model.PropertyModel; 018 import org.hackystat.projectbrowser.ProjectBrowserSession; 019 import org.hackystat.projectbrowser.ProjectChoiceRenderer; 020 import org.hackystat.projectbrowser.page.ProjectBrowserBasePage; 021 import org.hackystat.projectbrowser.page.popupwindow.PopupWindowPanel; 022 import org.hackystat.projectbrowser.page.telemetry.TelemetrySession; 023 import org.hackystat.projectbrowser.page.validator.ProjectDateValidator; 024 import org.hackystat.telemetry.service.resource.chart.jaxb.ParameterDefinition; 025 import org.hackystat.telemetry.service.resource.chart.jaxb.Type; 026 027 /** 028 * Input panel for telemetry viewer. 029 * Including telemetry name, start/end date, project, granularity and parameters. 030 * @author Shaoxuan Zhang 031 */ 032 public class TelemetryInputForm extends Form { 033 034 /** Support serialization. */ 035 public static final long serialVersionUID = 1L; 036 /** The page containing this form. */ 037 private ProjectBrowserBasePage page = null; 038 /** TelemetrySession that holds page state for telemetry. */ 039 private TelemetrySession session = ProjectBrowserSession.get().getTelemetrySession(); 040 /** 041 * Create this form, supplying the wicket:id. 042 * 043 * @param id The wicket:id. 044 * @param p the page this page is attached to. 045 */ 046 public TelemetryInputForm(String id, ProjectBrowserBasePage p) { 047 super(id); 048 this.page = p; 049 050 // Create the drop-down menu for telemetry. 051 DropDownChoice telemetryMenu = 052 new DropDownChoice ("telemetryMenu", new PropertyModel(session, "telemetryName"), 053 new PropertyModel(session, "telemetryList")) { 054 /** Support serialization. */ 055 private static final long serialVersionUID = 1L; 056 @Override 057 protected boolean wantOnSelectionChangedNotifications() { 058 return true; 059 } 060 @Override 061 protected void onSelectionChanged(java.lang.Object newSelection) { 062 session.getParameters().clear(); 063 } 064 @Override 065 public boolean isEnabled() { 066 return getIsEnable(); 067 } 068 }; 069 telemetryMenu.setRequired(true); 070 add(telemetryMenu); 071 //select the first chart as the default choice. 072 if (session.getTelemetryName() == null && !session.getTelemetryList().isEmpty()) { 073 session.setTelemetryName(session.getTelemetryList().get(0)); 074 } 075 //add the popup window 076 PopupWindowPanel telemetryPopup = 077 new PopupWindowPanel("chartDefPopup", "Telemetry Descriptions"); 078 telemetryPopup.getModalWindow().setContent( 079 new TelemetryDescriptionPanel(telemetryPopup.getModalWindow().getContentId())); 080 add(telemetryPopup); 081 082 //StartDateTextField 083 DateTextField startDateTextField = 084 new DateTextField("startDateTextField", new PropertyModel(session, "startDate"), 085 ProjectBrowserBasePage.DATA_FORMAT) { 086 /** Support serialization. */ 087 public static final long serialVersionUID = 1L; 088 @Override 089 public boolean isEnabled() { 090 return getIsEnable(); 091 } 092 }; 093 startDateTextField.add(new DatePicker()); 094 startDateTextField.setRequired(true); 095 add(startDateTextField); 096 097 //EndDateTextField 098 DateTextField endDateTextField = 099 new DateTextField("endDateTextField", new PropertyModel(session, "endDate"), 100 ProjectBrowserBasePage.DATA_FORMAT) { 101 /** Support serialization. */ 102 public static final long serialVersionUID = 1L; 103 @Override 104 public boolean isEnabled() { 105 return getIsEnable(); 106 } 107 }; 108 endDateTextField.add(new DatePicker()); 109 endDateTextField.setRequired(true); 110 add(endDateTextField); 111 112 //granularity 113 add(new DropDownChoice("granularity", 114 new PropertyModel(session, "granularity"), 115 session.getGranularityList()) { 116 /** Support serialization. */ 117 public static final long serialVersionUID = 1L; 118 @Override 119 public boolean isEnabled() { 120 return getIsEnable(); 121 } 122 }); 123 124 //set Project to Default if null 125 if (session.getSelectedProjects().isEmpty()) { 126 session.getSelectedProjects().add(ProjectBrowserSession.get().getDefaultProject()); 127 } 128 129 // Now create the drop-down menu for projects. 130 CheckBoxMultipleChoice projectMenu = 131 new CheckBoxMultipleChoice ("projectMenu", 132 new PropertyModel(session, "selectedProjects"), 133 new PropertyModel(ProjectBrowserSession.get(), "projectList"), 134 new ProjectChoiceRenderer()) { 135 /** Support serialization. */ 136 public static final long serialVersionUID = 1L; 137 @Override 138 public boolean isEnabled() { 139 return getIsEnable(); 140 } 141 }; 142 projectMenu.setRequired(true); 143 add(projectMenu); 144 145 // Add a validator that makes sure the date interval is within all project intervals. 146 add(new ProjectDateValidator(projectMenu, startDateTextField, endDateTextField)); 147 148 149 // Add parameter List 150 ListView parameterList = 151 new ListView("parameterList", new PropertyModel(session, "parameterList")) { 152 /** Support serialization. */ 153 public static final long serialVersionUID = 1L; 154 @Override 155 protected void populateItem(ListItem item) { 156 ParameterDefinition paramDef = (ParameterDefinition)item.getModelObject(); 157 item.add(new Label("name", paramDef.getName())); 158 Component component = getComponent("field", paramDef.getType()); 159 if (item.getIndex() >= session.getParameters().size() && component.getModel() != null) { 160 session.getParameters().add(component.getModel()); 161 } 162 else { 163 component.setModel(session.getParameters().get(item.getIndex())); 164 } 165 item.add(component); 166 PopupWindowPanel parameterPopup = 167 new PopupWindowPanel("parameterPopup", paramDef.getName()); 168 parameterPopup.getModalWindow().setContent( 169 new Label(parameterPopup.getModalWindow().getContentId(), 170 paramDef.getDescription())); 171 item.add(parameterPopup); 172 } 173 174 @Override 175 public boolean isVisible() { 176 return getIsEnable(); 177 } 178 }; 179 add(parameterList); 180 181 Button submitButton = new Button("submit") { 182 /** Support serialization. */ 183 public static final long serialVersionUID = 1L; 184 @Override 185 public void onSubmit() { 186 ProjectBrowserSession.get().getTelemetrySession().updateDataModel(); 187 page.onProjectDateSubmit(); 188 } 189 @Override 190 public boolean isEnabled() { 191 return getIsEnable(); 192 } 193 }; 194 add(submitButton); 195 196 } 197 198 /** 199 * Disable the whole form when data loading in process. 200 * @return true if the form is enabled. 201 */ 202 @Override 203 public boolean isEnabled() { 204 return getIsEnable(); 205 } 206 207 /** 208 * @return true if the form is enabled. 209 */ 210 protected boolean getIsEnable() { 211 return !ProjectBrowserSession.get().getTelemetrySession().getDataModel().isInProcess(); 212 } 213 214 /** 215 * Return a FormComponent according to the parameter type. 216 * DropDownChoice for Enumerated. 217 * CheckBox for Boolean. 218 * TextField for Text and Integer. 219 * @param id the wicket component id. 220 * @param type the parameter type. 221 * @return a FormComponent. 222 */ 223 public static final Component getComponent(String id, Type type) { 224 Component component; 225 if ("Enumerated".equals(type.getName())) { 226 DropDownChoice choice = 227 new DropDownChoice(id, new Model(type.getDefault()), type.getValue()) { 228 /** Support serialization. */ 229 public static final long serialVersionUID = 1L; 230 /** 231 * Called any time a component that has this behavior registered is rendering the 232 * component tag. 233 * @param tag the tag that is rendered 234 */ 235 @Override 236 protected void onComponentTag(ComponentTag tag) { 237 tag.setName("select"); 238 super.onComponentTag(tag); 239 } 240 }; 241 //choice.setPersistent(true); 242 component = choice; 243 } 244 else if ("Boolean".equals(type.getName())) { 245 CheckBox checkBox = new CheckBox(id, new Model(type.getDefault())) { 246 /** Support serialization. */ 247 public static final long serialVersionUID = 1L; 248 @Override 249 protected void onComponentTag(ComponentTag tag) { 250 tag.setName("input"); 251 tag.put("type", "checkbox"); 252 tag.remove("style"); //need for firefox on mac. 253 super.onComponentTag(tag); 254 } 255 }; 256 //checkBox.setPersistent(true); 257 component = checkBox; 258 } 259 else if ("Text".equals(type.getName()) || "Integer".equals(type.getName())) { 260 TextField textField = new TextField(id, new Model(type.getDefault())) { 261 /** Support serialization. */ 262 public static final long serialVersionUID = 1L; 263 @Override 264 protected void onComponentTag(ComponentTag tag) { 265 tag.setName("input"); 266 tag.put("type", "text"); 267 super.onComponentTag(tag); 268 } 269 }; 270 //textField.setPersistent(true); 271 component = textField; 272 } 273 else { 274 component = new Label(id, new Model("Parameter Type " + type.getName() + " not recognized.")); 275 } 276 return component; 277 } 278 }