package LinGUIne.parts.basic; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Text; import LinGUIne.extensions.IAnalysisPlugin; import LinGUIne.extensions.IVisualization; import LinGUIne.model.IProjectData; import LinGUIne.model.Project; import LinGUIne.model.ProjectManager; import LinGUIne.model.SoftwareModuleManager; import LinGUIne.model.VisualizationPluginManager; import LinGUIne.wizards.AnalysisData; import LinGUIne.wizards.VisualizationData; /** * Creates the Basic Perspectice of LinGUIne. Currently Incomplete * * */ public class BasicMainPart { private final String PROJECT_TAB = "Select Project "; private final String FILE_TAB = "- Select File"; private final String ANALYSIS_TAB = "- Select Analysis"; private final String VISUAL_TAB = "- Select Visualization"; private CTabItem projectTab; private CTabItem fileTab; private CTabItem analysisTab; private CTabItem visualTab; private CTabFolder tabFolder; private Label lblProjects; private List lstProjects; private List lstFiles; private HashMap<String,String> softModMap; private AnalysisData analysisData; private VisualizationData visualizationData; private Label lblAnalyses; private Button analysisButton; private Button visButton; @Inject private ProjectManager projectMan; @Inject private SoftwareModuleManager softwareModuleMan; @Inject private VisualizationPluginManager visualizationPluginMan; /** * Creates the CTabFolder for the basic perspective and populates the project selection tab. * @param parent - The parent composite */ @PostConstruct public void createComposite(Composite parent){ projectMan.loadProjects(); tabFolder = new CTabFolder(parent,SWT.NONE); tabFolder.setData("org.eclipse.e4.ui.css.id", "basicFolder"); tabFolder.addSelectionListener(new SelectionListener(){ @Override public void widgetSelected(SelectionEvent e){ if(tabFolder.getSelectionIndex() >= 0){ tabSelectionChanged(tabFolder.getSelection().getText()); } } @Override public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); //Create new data objects analysisData = new AnalysisData(); visualizationData = new VisualizationData(); CTabItem projTabItem = new CTabItem(tabFolder, SWT.NONE); projTabItem.setText(PROJECT_TAB); FontData[] fD = projTabItem.getFont().getFontData(); fD[0].setHeight(14); projTabItem.setFont( new Font(getDisplay(),fD[0])); Composite tabComp = new Composite(tabFolder,SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginTop = 15; tabComp.setLayout(layout); //Group for the tab Group grpProjects = new Group(tabComp, SWT.NONE); grpProjects.setLayout(new GridLayout(1, false)); GridData gData = new GridData(400, 400); gData.horizontalSpan = 2; grpProjects.setLayoutData(gData); lblProjects = new Label(grpProjects, SWT.NONE); lblProjects.setText("Select a Project:"); FontData[] fDProject = lblProjects.getFont().getFontData(); fDProject[0].setHeight(14); lblProjects.setFont( new Font(getDisplay(),fDProject[0])); //Create the list of projects lstProjects = new List(grpProjects, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI); lstProjects.setLayoutData(new GridData(370,370)); lstProjects.setEnabled(true); for(Project project: projectMan.getProjects()){ lstProjects.add(project.getName()); } lstProjects.addSelectionListener(new SelectionListener(){ /** * Sets which Project Data are currently selected. */ @Override public void widgetSelected(SelectionEvent e) { if(lstProjects.getSelectionCount() > 0){ Project selectedProject = projectMan.getProject(lstProjects.getSelection()[0]); analysisData.setChosenProject(selectedProject); } } @Override public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); final Button nButton = new Button(tabComp, SWT.NONE); nButton.setText("Next"); nButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if(analysisData.getChosenProject() != null){ openSelectFileTab(); } } }); projTabItem.setControl(tabComp); projectTab = projTabItem; tabFolder.setSelection(projectTab); } @Focus public void onFocus(){ } /** * Populates the file selection tab of the basic perspective */ public void openSelectFileTab(){ if(fileTab == null){ Label lblFiles; CTabItem selectFileTab = new CTabItem(tabFolder, SWT.NONE); selectFileTab.setText(FILE_TAB); Composite container = new Composite(tabFolder, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 15; container.setLayout(layout); Group grpFiles = new Group(container, SWT.NONE); grpFiles.setLayout(new GridLayout(1, false)); GridData gData = new GridData(400,400); gData.horizontalSpan = 2; grpFiles.setLayoutData(gData); grpFiles.setText("Files"); lblFiles = new Label(grpFiles, SWT.NONE); FontData[] fD = lblFiles.getFont().getFontData(); fD[0].setHeight(14); lblFiles.setFont( new Font(getDisplay(),fD[0])); lblFiles.setText("Select the Files on which to run the Analysis:"); //Create the list of files lstFiles = new List(grpFiles, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI); lstFiles.setLayoutData(new GridData(370,370)); lstFiles.setEnabled(true); lstFiles.addSelectionListener(new SelectionListener(){ /** * Sets which Project Data are currently selected. */ @Override public void widgetSelected(SelectionEvent e) { LinkedList<IProjectData> selectedProjectData = new LinkedList<IProjectData>(); for(String dataName: lstFiles.getSelection()){ selectedProjectData.add(analysisData.getChosenProject().getProjectData(dataName)); } } @Override public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); updateFileList(); selectFileTab.setControl(container); Button bButtonFile = new Button(container, SWT.NONE); bButtonFile.setText("Back"); Button nButtonFile = new Button(container, SWT.NONE); nButtonFile.setText("Next"); nButtonFile.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { openAnalysisTab(); } }); bButtonFile.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ tabFolder.setSelection(projectTab); tabSelectionChanged(tabFolder.getSelection().getText()); } }); fileTab = selectFileTab; } tabFolder.setSelection(fileTab); } /** * Populates the Analysis tab. */ public void openAnalysisTab(){ if(analysisTab == null){ ArrayList<String> softwareModuleList = new ArrayList<String>(); softModMap = new HashMap<String,String>(); softwareModuleList.addAll(softwareModuleMan.getSoftwareModuleNames()); CTabItem analysisTabItem = new CTabItem(tabFolder, SWT.NONE); analysisTabItem.setText(ANALYSIS_TAB); Composite container = new Composite(tabFolder, SWT.SCROLLBAR_OVERLAY); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginTop = 15; layout.makeColumnsEqualWidth = false; container.setLayout(layout); Group grpBasicAnalyses = new Group(container, SWT.NONE); grpBasicAnalyses.setLayout(new GridLayout(2, false)); GridData gData = new GridData(500,500); gData.horizontalSpan = 2; grpBasicAnalyses.setLayoutData(gData); grpBasicAnalyses.setText("Analyses"); lblAnalyses = new Label(grpBasicAnalyses, SWT.NONE); lblAnalyses.setText("Select an Analysis to use:"); FontData[] fdLbl = lblAnalyses.getFont().getFontData(); fdLbl[0].setHeight(14); lblAnalyses.setFont( new Font(getDisplay(),fdLbl[0])); gData = new GridData(210,100); gData.horizontalSpan = 2; lblAnalyses.setLayoutData(gData); GridData descData = new GridData(300,100); descData.horizontalSpan = 2; descData.horizontalAlignment = SWT.FILL; for( String name : softwareModuleMan.getSoftwareModuleNames()){ for( IAnalysisPlugin plug : softwareModuleMan.getAnalyses(name)){ softModMap.put(plug.getName(), name); Button button = new Button(grpBasicAnalyses, SWT.TOGGLE | SWT.WRAP); button.setText(plug.getName() +"\n" + plug.getAnalysisDescription()); FontData[] fdButton = button.getFont().getFontData(); fdButton[0].setHeight(14); button.setFont( new Font(getDisplay(),fdButton[0])); GridData buttonsGridData = new GridData(235,150); button.setLayoutData(buttonsGridData); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ if(analysisButton !=null && !analysisButton.equals(e.widget)){ analysisButton.setSelection(false); } analysisButton = (Button) e.widget; IAnalysisPlugin plug = softwareModuleMan.getAnalysisByName(softModMap.get(analysisButton.getText()), analysisButton.getText()); analysisData.setChosenAnalysis(plug); } }); } } Button analysisBButton = new Button(container, SWT.NONE); analysisBButton.setText("Back"); Button analysisNButton = new Button(container, SWT.NONE); analysisNButton.setText("Next"); analysisNButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { openVisualizationTab(); } }); analysisBButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ tabFolder.setSelection(fileTab); tabSelectionChanged(tabFolder.getSelection().getText()); } }); analysisTabItem.setControl(container); analysisTab = analysisTabItem; } tabFolder.setSelection(analysisTab); } /** * Populates the VisualizationTab. This tab isn't complete, requires * a button handler to end the basic perspectives use flow and run analyses/generate visuals * */ public void openVisualizationTab(){ if(visualTab == null){ CTabItem visualizationTabItem = new CTabItem(tabFolder, SWT.NONE); visualizationTabItem.setText(VISUAL_TAB); Composite container = new Composite(tabFolder, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 15; container.setLayout(layout); Group grpVisualizations = new Group(container, SWT.NONE); grpVisualizations.setLayout(new GridLayout(2, false)); GridData vData = new GridData(500,500); vData.horizontalSpan = 2; grpVisualizations.setLayoutData(vData); grpVisualizations.setText("Visualizations"); Label lblVisualizations = new Label(grpVisualizations, SWT.NONE); lblVisualizations.setText("Select a Visualization for your data:"); FontData[] fdLbl = lblVisualizations.getFont().getFontData(); fdLbl[0].setHeight(14); lblVisualizations.setFont( new Font(getDisplay(),fdLbl[0])); GridData lblVisData = new GridData(210,100); lblVisData.horizontalSpan = 2; lblVisualizations.setLayoutData(lblVisData); for( String visualization : visualizationPluginMan.getVisualizationNames()){ Button button = new Button(grpVisualizations, SWT.TOGGLE); button.setText(visualization); FontData[] fdButton = button.getFont().getFontData(); fdButton[0].setHeight(14); button.setFont( new Font(getDisplay(),fdButton[0])); GridData buttonsGridData = new GridData(235,150); button.setLayoutData(buttonsGridData); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ if(visButton !=null && !visButton.equals(e.widget)){ visButton.setSelection(false); } visButton = (Button) e.widget; visualizationData.setChosenVisualization(visualizationPluginMan.getVisualizationByName(visButton.getText())); } }); } visualizationPluginMan.getVisualizationNames(); Button bButton = new Button(container, SWT.NONE); //This button needs a listener! Button fButton = new Button(container, SWT.NONE); bButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ tabFolder.setSelection(analysisTab); tabSelectionChanged(tabFolder.getSelection().getText()); } }); fButton.setText("Generate Visual"); bButton.setText("Back"); visualizationTabItem.setControl(container); visualTab = visualizationTabItem; } tabFolder.setSelection(visualTab); } /** * Updates the contents of lstFiles with the data from the currently selected project. */ private void updateFileList(){ lstFiles.deselectAll(); lstFiles.removeAll(); for(IProjectData projData: analysisData.getChosenProject().getOriginalData()){ lstFiles.add(projData.getName()); } lstFiles.update(); } /** * Case selection statement for tab selection. Properly opens the selected tab * and disposes of any open tabs that come after it. * @param selectedTab */ private void tabSelectionChanged(String selectedTab){ if(selectedTab.equals(PROJECT_TAB)){ if(fileTab != null){fileTab.dispose();} fileTab = null; if(analysisTab != null){analysisTab.dispose();} analysisTab = null; if(visualTab != null){visualTab.dispose();} visualTab = null; } else if(selectedTab.equals(FILE_TAB)){ if(analysisTab != null){analysisTab.dispose();} analysisTab = null; if(visualTab != null){visualTab.dispose();} visualTab = null; } else if(selectedTab.equals(ANALYSIS_TAB)){ if(visualTab != null){visualTab.dispose();} visualTab = null; } } /** * Helper method to grab the current Display instance * @return The current Display instance */ public static Display getDisplay() { Display display = Display.getCurrent(); //may be null if outside the UI thread if (display == null) display = Display.getDefault(); return display; } }