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    }