package LinGUIne.wizards; import java.util.Collection; import java.util.HashMap; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import LinGUIne.extensions.IAnalysisPlugin; import LinGUIne.model.IProjectData; import LinGUIne.model.Project; import LinGUIne.model.Result; import LinGUIne.model.SoftwareModuleManager; /** * Analysis Page object; this is the GUI components * for the second step in the Analysis Wizard. The user * will select the analyses he or she wishes to run. * * @author Matthew Talbot * @author Kyle Mullins */ public class AnalysisWizardSelectAnalysisPage extends WizardPage { private SoftwareModuleManager softwareModuleMan; private AnalysisData wizardData; private Label lblSoftwareModules; private List lstSoftwareModules; private Label lblAnalyses; private List lstAnalyses; private Label lblDescription; private HashMap<String, String> errorMessages; public AnalysisWizardSelectAnalysisPage(AnalysisData data, SoftwareModuleManager softwareModules) { super("Analysis Wizard"); setTitle("Analysis Wizard - Step 2"); setDescription("Select the analyses you wish to run."); wizardData = data; softwareModuleMan = softwareModules; } @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; container.setLayout(layout); Group grpSoftwareModules = new Group(container, SWT.NONE); grpSoftwareModules.setLayout(new GridLayout(1, false)); grpSoftwareModules.setLayoutData(new GridData(GridData.FILL_BOTH)); grpSoftwareModules.setText("Software Modules"); lblSoftwareModules = new Label(grpSoftwareModules, SWT.NONE); lblSoftwareModules.setText("Select a Software Module to use:"); lstSoftwareModules = new List(grpSoftwareModules, SWT.BORDER | SWT.V_SCROLL); lstSoftwareModules.setLayoutData(new GridData(GridData.FILL_BOTH)); for(String moduleName : softwareModuleMan.getSoftwareModuleNames()){ lstSoftwareModules.add(moduleName); } lstSoftwareModules.addSelectionListener(new SelectionListener(){ @Override public void widgetSelected(SelectionEvent e) { if(lstSoftwareModules.getSelectionCount() > 0){ String selectedModule = lstSoftwareModules.getSelection()[0]; wizardData.setChosenAnalysis(null); updateAnalysisList(selectedModule); lstAnalyses.setEnabled(true); lblDescription.setText(""); lblDescription.update(); setPageComplete(false); } } @Override public void widgetDefaultSelected(SelectionEvent e) {} }); Group grpAnalyses = new Group(container, SWT.NONE); grpAnalyses.setLayout(new GridLayout(1, false)); grpAnalyses.setLayoutData(new GridData(GridData.FILL_BOTH)); grpAnalyses.setText("Analyses"); lblAnalyses = new Label(grpAnalyses, SWT.NONE); lblAnalyses.setText("Select an Analysis to use:"); lstAnalyses = new List(grpAnalyses, SWT.BORDER | SWT.V_SCROLL); lstAnalyses.setLayoutData(new GridData(GridData.FILL_BOTH)); lstAnalyses.setEnabled(false); lstAnalyses.addSelectionListener(new SelectionListener(){ @Override public void widgetSelected(SelectionEvent e) { if(lstAnalyses.getSelectionCount() > 0){ String analysisName = lstAnalyses.getSelection()[0]; String selectedModule = lstSoftwareModules.getSelection()[0]; updateErrorMessage(errorMessages.get(analysisName)); IAnalysisPlugin analysis = softwareModuleMan.getAnalysisByName( selectedModule, analysisName); if(analysis != null){ wizardData.setChosenAnalysis(analysis); lblDescription.setText(analysis.getAnalysisDescription()); lblDescription.update(); setPageComplete(true); } } } @Override public void widgetDefaultSelected(SelectionEvent e) {} }); GridData layoutData = new GridData(GridData.FILL_BOTH); layoutData.horizontalSpan = 2; lblDescription = new Label(container, SWT.WRAP); lblDescription.setLayoutData(layoutData); lblDescription.setText(""); setControl(container); setPageComplete(false); } private void updateAnalysisList(String selectedSoftwareModule){ errorMessages = new HashMap<String, String>(); lstAnalyses.removeAll(); for(IAnalysisPlugin analysis: softwareModuleMan.getAnalyses( selectedSoftwareModule)){ lstAnalyses.add(analysis.getName()); Project chosenProject = wizardData.getChosenProject(); Collection<IProjectData> selectedProjectData = wizardData.getChosenProjectData(); Collection<Class<? extends IProjectData>> supportedSourceDataTypes = analysis.getSupportedSourceDataTypes(); Collection<Class<? extends Result>> requiredResultTypes = analysis.getRequiredResultTypes(); boolean hasError = false; //Check if all of this ProjectData has the proper Results //And is of the proper type for the chosen analysis for(IProjectData projData: selectedProjectData){ if(hasError){ break; } else if(supportedSourceDataTypes.contains(projData.getClass())){ for(Class<? extends Result> resultType: requiredResultTypes){ if(!chosenProject.hasResultType(projData, resultType)){ //TODO: Determine what analyses should be run errorMessages.put(analysis.getName(), "Cannot run this Analysis: missing required" + " result type."); hasError = true; break; } } } else{ errorMessages.put(analysis.getName(), "Cannot run this " + "Analysis: incorrect type of input data chosen."); hasError = true; } } } lstAnalyses.update(); } private void updateErrorMessage(String errorMsg){ setErrorMessage(errorMsg); setPageComplete(isPageComplete() && errorMsg != null); } }