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    }