package org.erlide.cover.ui.launch; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.dialogs.SelectionDialog; import org.eclipse.ui.ide.IDE; import org.erlide.cover.runtime.launch.FrameworkType; import org.erlide.cover.runtime.launch.ICoverAttributes; import org.erlide.cover.runtime.launch.LaunchType; import org.erlide.cover.ui.launch.helpers.ProjectElement; import org.erlide.cover.ui.launch.helpers.ProjectLabelProvider; import org.erlide.engine.ErlangEngine; import org.erlide.engine.model.ErlModelException; import org.erlide.engine.model.root.IErlModule; import org.erlide.engine.model.root.IErlProject; import org.erlide.ui.editors.erl.outline.ErlangElementImageProvider; import org.erlide.util.ErlLogger; /** * Main panel of EUnit run configuration * * @author Aleksandra Lipiec <aleksandra.lipiec@erlang.solutions.com> * */ public class CoverMainTab extends AbstractLaunchConfigurationTab { private ItemBrowser projectMBr; // projects browser private ItemBrowser moduleBr; // module browser private ItemBrowser fileBr; // file/directory browser private Button singleRadio; // radio button for single module private Button allRadio; // radio button for running all tests private Combo testCombo; // framework private ElementListSelectionDialog moduleDialog; @Override public void createControl(final Composite parent) { final ScrolledComposite scrolled = new ScrolledComposite(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); final Composite comp = new Composite(scrolled, SWT.NONE); scrolled.setContent(comp); scrolled.setExpandVertical(true); scrolled.setExpandHorizontal(true); scrolled.setMinSize(760, 300); setControl(scrolled); final GridLayout mainLayout = new GridLayout(); mainLayout.numColumns = 3; mainLayout.verticalSpacing = 15; mainLayout.horizontalSpacing = 20; mainLayout.marginHeight = 15; mainLayout.marginHeight = 15; comp.setLayout(mainLayout); final GridData gData = new GridData(); gData.horizontalAlignment = GridData.FILL; gData.horizontalSpan = 3; singleRadio = new Button(comp, SWT.RADIO); singleRadio.setText("Run tests for a single module"); singleRadio.setLayoutData(gData); singleRadio.addSelectionListener(radioSelectionListener); createModuleGroup(comp); allRadio = new Button(comp, SWT.RADIO); allRadio.setText("Run all tests in specific project"); allRadio.setLayoutData(gData); allRadio.addSelectionListener(radioSelectionListener); createAllTestsGroup(comp); final Label testLabel = new Label(comp, SWT.NONE); testLabel.setText("Testing framework: "); testCombo = new Combo(comp, SWT.NONE); testCombo.setItems(new String[] { FrameworkType.EUNIT.getRepr() }); testCombo.addModifyListener(basicModifyListener); Collection<IErlProject> projects; try { projects = ErlangEngine.getInstance().getModel().getErlangProjects(); final List<String> ps = new ArrayList<>(); for (final IErlProject p : projects) { ps.add(p.getName()); } } catch (final ErlModelException e) { ErlLogger.warn(e); } } @Override public void setDefaults(final ILaunchConfigurationWorkingCopy config) { config.setAttribute(ICoverAttributes.PROJECT, ""); config.setAttribute(ICoverAttributes.MODULE, ""); config.setAttribute(ICoverAttributes.FILE, ""); config.setAttribute(ICoverAttributes.APPLICATION, ""); config.setAttribute(ICoverAttributes.TYPE, LaunchType.MODULE.toString()); config.setAttribute(ICoverAttributes.COMBO, "0"); } @Override public void initializeFrom(final ILaunchConfiguration config) { try { final String projectName = config.getAttribute(ICoverAttributes.PROJECT, ""); projectMBr.setText(projectName); if (projectName != null && projectName.length() > 0) { final IErlProject p = ErlangEngine.getInstance().getModel() .getErlangProject(ResourcesPlugin.getWorkspace().getRoot() .getProject(projectName)); if (p != null) { moduleDialog.setElements(createModuleArray(p)); } } } catch (final CoreException e) { projectMBr.setText(""); } try { moduleBr.setText(config.getAttribute(ICoverAttributes.MODULE, "")); } catch (final CoreException e) { moduleBr.setText(""); } try { fileBr.setText(config.getAttribute(ICoverAttributes.FILE, "")); } catch (final CoreException e) { fileBr.setText(""); } try { final String type = config.getAttribute(ICoverAttributes.TYPE, LaunchType.MODULE.toString()); final LaunchType typeT = LaunchType.valueOf(type); switch (typeT) { case MODULE: singleRadio.setSelection(true); projectMBr.setEnabled(true); moduleBr.setEnabled(true); fileBr.setEnabled(false); break; case ALL: allRadio.setSelection(true); projectMBr.setEnabled(false); moduleBr.setEnabled(false); fileBr.setEnabled(true); break; default: singleRadio.setSelection(true); projectMBr.setEnabled(true); moduleBr.setEnabled(true); fileBr.setEnabled(false); break; } } catch (final CoreException e) { singleRadio.setSelection(true); } String combo; try { combo = config.getAttribute(ICoverAttributes.COMBO, FrameworkType.EUNIT.getRepr()); final int idx = testCombo.indexOf(combo); testCombo.select(idx); } catch (final CoreException e) { testCombo.select(0); } } @Override public void performApply(final ILaunchConfigurationWorkingCopy config) { LaunchType type; if (allRadio.getSelection()) { type = LaunchType.ALL; } else { type = LaunchType.MODULE; } config.setAttribute(ICoverAttributes.PROJECT, projectMBr.getText()); config.setAttribute(ICoverAttributes.MODULE, moduleBr.getText()); config.setAttribute(ICoverAttributes.FILE, fileBr.getText()); config.setAttribute(ICoverAttributes.TYPE, type.toString()); config.setAttribute(ICoverAttributes.COMBO, testCombo.getText()); } @Override public String getName() { return "Cover"; } private void createModuleGroup(final Composite comp) { final ElementListSelectionDialog projectDialog = new ElementListSelectionDialog( getShell(), new ProjectLabelProvider()); final Object[] elements = createProjectArray(); projectDialog.setElements(elements); projectDialog.setTitle("Select project"); projectDialog.setMessage("Select Erlang project: "); moduleDialog = new ElementListSelectionDialog(getShell(), new ProjectLabelProvider()); moduleDialog.setElements(new Object[0]); moduleDialog.setTitle("Select module"); moduleDialog.setMessage("Select Erlang module: "); projectMBr = browserWithLabel(comp, "Project:", projectDialog); projectMBr.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent e) { updateLaunchConfigurationDialog(); final String projectName = projectMBr.getText(); if (projectName != null && projectName.length() > 0) { final IErlProject p = ErlangEngine.getInstance().getModel() .getErlangProject(ResourcesPlugin.getWorkspace().getRoot() .getProject(projectName)); if (p != null) { moduleDialog.setElements(createModuleArray(p)); } } } }); moduleBr = browserWithLabel(comp, "Module:", moduleDialog); moduleBr.addModifyListener(basicModifyListener); } private Object[] createProjectArray() { Object[] array; try { final List<ProjectElement> res = new LinkedList<>(); final Collection<IErlProject> projects = ErlangEngine.getInstance().getModel() .getErlangProjects(); for (final IErlProject p : projects) { final ProjectElement elem = new ProjectElement(p.getName(), PlatformUI.getWorkbench().getSharedImages() .getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT) .createImage()); res.add(elem); } array = res.toArray(); } catch (final ErlModelException e) { array = new Object[0]; ErlLogger.error(e); } return array; } private Object[] createModuleArray(final IErlProject p) { Object[] array; try { final List<ProjectElement> res = new LinkedList<>(); final Collection<IErlModule> modules = p.getModules(); for (final IErlModule m : modules) { final ProjectElement elem = new ProjectElement(m.getName(), ErlangElementImageProvider .getErlImageDescriptor(m, ErlangElementImageProvider.SMALL_ICONS) .createImage()); res.add(elem); } array = res.toArray(); } catch (final ErlModelException e) { array = new Object[0]; ErlLogger.error(e); } return array; } private void createAllTestsGroup(final Composite comp) { final ElementListSelectionDialog projectDialog = new ElementListSelectionDialog( getShell(), new ProjectLabelProvider()); final Object[] elements = createProjectArray(); projectDialog.setElements(elements); projectDialog.setTitle("Select project"); projectDialog.setMessage("Select Erlang project: "); fileBr = new ItemBrowser(comp, SWT.SINGLE | SWT.BORDER, projectDialog); fileBr.setFiledLength(600); fileBr.getTextGridData().horizontalSpan = 2; fileBr.addModifyListener(basicModifyListener); } private ItemBrowser browserWithLabel(final Composite comp, final String text, final SelectionDialog dialog) { final GridData gData = new GridData(); final Label label = new Label(comp, SWT.NONE); label.setLayoutData(gData); label.setText(text); final ItemBrowser browser = new ItemBrowser(comp, SWT.SINGLE | SWT.BORDER, dialog); return browser; } private final ModifyListener basicModifyListener = new ModifyListener() { @Override @SuppressWarnings("synthetic-access") public void modifyText(final ModifyEvent evt) { updateLaunchConfigurationDialog(); } }; private final SelectionListener radioSelectionListener = new SelectionListener() { @Override public void widgetSelected(final SelectionEvent e) { updateLaunchConfigurationDialog(); if (e.widget.equals(singleRadio)) { projectMBr.setEnabled(true); moduleBr.setEnabled(true); fileBr.setEnabled(false); } else if (e.widget.equals(allRadio)) { projectMBr.setEnabled(false); moduleBr.setEnabled(false); fileBr.setEnabled(true); } } @Override public void widgetDefaultSelected(final SelectionEvent e) { } }; }