001 package org.hackystat.projectbrowser.page.dailyprojectdata.inputpanel; 002 003 import org.apache.wicket.extensions.markup.html.form.DateTextField; 004 import org.apache.wicket.extensions.yui.calendar.DatePicker; 005 import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice; 006 import org.apache.wicket.markup.html.form.DropDownChoice; 007 import org.apache.wicket.markup.html.form.Form; 008 import org.apache.wicket.model.PropertyModel; 009 import org.hackystat.projectbrowser.ProjectBrowserSession; 010 import org.hackystat.projectbrowser.ProjectChoiceRenderer; 011 import org.hackystat.projectbrowser.page.ProjectBrowserBasePage; 012 import org.hackystat.projectbrowser.page.contextsensitive.ContextSensitivePanel; 013 import org.hackystat.projectbrowser.page.dailyprojectdata.DailyProjectDataSession; 014 import org.hackystat.projectbrowser.page.validator.ProjectDateValidator; 015 import org.apache.wicket.ajax.AjaxRequestTarget; 016 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; 017 018 /** 019 * Provides the form for use in specifying DPD analyses. This form allows the user to select 020 * a data and a set of Projects and an analysis. Depending upon the analysis that is selected, 021 * one or more form fields could be displayed. 022 * @author Philip Johnson 023 */ 024 public class DpdInputForm extends Form { 025 026 /** Support serialization. */ 027 public static final long serialVersionUID = 1L; 028 029 /** The page containing this form. */ 030 ProjectBrowserBasePage page = null; 031 032 /** 033 * Create this form, supplying the wicket:id. 034 * 035 * @param id The wicket:id. 036 * @param page the page this page is attached to. 037 */ 038 public DpdInputForm(final String id, ProjectBrowserBasePage page) { 039 super(id); 040 this.page = page; 041 DailyProjectDataSession session = ProjectBrowserSession.get().getDailyProjectDataSession(); 042 043 // [1] Create the Date field, always visible, always required. 044 DateTextField dateTextField = 045 new DateTextField("dateTextField", new PropertyModel(session, "date"), 046 ProjectBrowserBasePage.DATA_FORMAT); 047 dateTextField.add(new DatePicker()); 048 dateTextField.setRequired(true); 049 add(dateTextField); 050 051 // [2] Create the multi-choice menu for projects, always visible, always required. 052 CheckBoxMultipleChoice projectMenu = 053 new CheckBoxMultipleChoice ("projectMenu", 054 new PropertyModel(session, "selectedProjects"), 055 new PropertyModel(ProjectBrowserSession.get(), "projectList"), 056 new ProjectChoiceRenderer()) ; 057 projectMenu.setRequired(true); 058 add(projectMenu); 059 060 // Add a validator that makes sure the date is within the project interval. 061 add(new ProjectDateValidator(projectMenu, dateTextField)); 062 063 //set Project to Default if null 064 if (session.getSelectedProjects().size() <= 0) { 065 session.getSelectedProjects().add(ProjectBrowserSession.get().getDefaultProject()); 066 } 067 068 // [3] Create the drop-down list for Analyses, always visible, always required. 069 DropDownChoice analysisMenu = 070 new DropDownChoice ("analysisMenu", 071 new PropertyModel(session, "analysis"), 072 new PropertyModel(session, "analysisList")); 073 analysisMenu.setRequired(true); 074 add(analysisMenu); 075 076 // [4] Create the ContextSensitivePanel containing analysis-specific menus. 077 ContextSensitivePanel csPanel = new ContextSensitivePanel("dpdContextSensitivePanel", 078 session.getContextSensitiveMenus()); 079 session.setContextSensitivePanel(csPanel); 080 add(csPanel); 081 082 // [5] Add the Ajax behavior to the analysis menu that will make the appropriate 083 // context-sensitive menus visible depending upon the selected analysis. 084 analysisMenu.add(new AjaxFormComponentUpdatingBehavior("onchange") { 085 /** Support serialization. */ 086 public static final long serialVersionUID = 1L; 087 088 /** 089 * When the user changes the Analysis menu selection, we want to set the visibility of 090 * all context sensitive menus appropriately. 091 */ 092 @Override 093 protected void onUpdate(AjaxRequestTarget target) { 094 String values = "Values"; 095 DailyProjectDataSession session = ProjectBrowserSession.get().getDailyProjectDataSession(); 096 // Make the appropriate context-sensitive menus visible, depending upon the analysis. 097 if ("Coverage".equals(session.getAnalysis())) { 098 session.getContextSensitivePanel().setVisible(target, values, "Coverage Type"); 099 } 100 else if ("Coupling".equals(session.getAnalysis())) { 101 session.getContextSensitivePanel().setVisible(target, values, "Coupling Type"); 102 } 103 else if ("Complexity".equals(session.getAnalysis())) { 104 session.getContextSensitivePanel().setVisible(target, values); 105 } 106 else if ("UnitTest".equals(session.getAnalysis())) { 107 session.getContextSensitivePanel().setVisible(target, values); 108 } 109 else if ("Build".equals(session.getAnalysis())) { 110 session.getContextSensitivePanel().setVisible(target, values); 111 } 112 else { 113 // Make all context-sensitive menus not visible. 114 session.getContextSensitivePanel().setVisible(target); 115 } 116 } 117 } 118 ); 119 } 120 121 122 /** 123 * Process the user action after submitting a project and date. 124 */ 125 @Override 126 public void onSubmit() { 127 page.onProjectDateSubmit(); 128 } 129 }