/******************************************************************************* * Copyright (c) 2005 Vlad Dumitrescu and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Vlad Dumitrescu *******************************************************************************/ package org.erlide.ui.launch; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectNature; import org.eclipse.core.resources.IWorkspaceRoot; 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.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Image; 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.Table; import org.eclipse.swt.widgets.Text; import org.erlide.backend.api.ErlRuntimeAttributes; import org.erlide.core.ErlangCore; import org.erlide.engine.ErlangEngine; import org.erlide.engine.model.ErlModelException; import org.erlide.engine.model.root.IErlProject; import org.erlide.runtime.api.ErlDebugFlags; import org.erlide.ui.util.SWTUtil; import org.erlide.util.ErlLogger; public class ErlangMainTab extends AbstractLaunchConfigurationTab { private CheckboxTableViewer projectsTable; private Text moduleText; private Text funcText; private Text argsText; /** * @wbp.parser.entryPoint */ @Override public void createControl(final Composite parent) { final Composite comp = new Composite(parent, SWT.NONE); setControl(comp); final GridLayout topLayout = new GridLayout(); comp.setLayout(topLayout); createProjectsGroup(comp); createStartGroup(comp); 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); } } /** * @param comp */ private void createProjectsGroup(final Composite comp) { final Group projectsGroup = SWTUtil.createGroup(comp, "Projects", 2, GridData.FILL_HORIZONTAL); projectsTable = CheckboxTableViewer.newCheckList(projectsGroup, SWT.HIDE_SELECTION | SWT.BORDER); projectsTable.setLabelProvider(new ProjectsLabelProvider()); projectsTable.setContentProvider(new ProjectsContentProvider()); final Table table_1 = projectsTable.getTable(); final GridData gd_table_1 = new GridData(SWT.LEFT, SWT.FILL, true, true); gd_table_1.widthHint = 287; gd_table_1.heightHint = 126; gd_table_1.minimumHeight = 108; gd_table_1.minimumWidth = 256; table_1.setLayoutData(gd_table_1); projectsTable.addCheckStateListener(new ICheckStateListener() { @Override @SuppressWarnings("synthetic-access") public void checkStateChanged(final CheckStateChangedEvent event) { updateLaunchConfigurationDialog(); } }); } /** * @param comp */ private void createStartGroup(final Composite comp) { final Group startGroup = new Group(comp, SWT.NONE); startGroup.setText("Start"); final GridData gd_startGroup = new GridData(SWT.FILL, SWT.CENTER, false, false); startGroup.setLayoutData(gd_startGroup); final GridLayout gridLayout_1 = new GridLayout(); gridLayout_1.numColumns = 4; startGroup.setLayout(gridLayout_1); moduleText = textWithLabel(startGroup, "Module", 114, fBasicModifyListener); funcText = textWithLabel(startGroup, "Function", 107, fBasicModifyListener); argsText = textWithLabel(startGroup, "Arguments", 3, fBasicModifyListener); new Label(startGroup, SWT.NONE); final Label infoLabel = new Label(startGroup, SWT.NONE); final GridData gd_infoLabel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1); infoLabel.setLayoutData(gd_infoLabel); infoLabel.setText("Start function takes no arguments or a single string.\n" + "It's similar to using '-s mod fun args' on the command line.\n" + "Use it for system initialization/startup."); } private Text textWithLabel(final Group startGroup, final String labelText, final int textWidthHint, final ModifyListener modifyListener) { final Label label = new Label(startGroup, SWT.NONE); label.setLayoutData(new GridData()); label.setText(labelText); final Text text = new Text(startGroup, SWT.SINGLE | SWT.BORDER); final GridData gd; if (textWidthHint < 10) { gd = new GridData(SWT.FILL, SWT.CENTER, false, false, textWidthHint, 1); } else { gd = new GridData(SWT.FILL, SWT.CENTER, false, false); gd.widthHint = textWidthHint; } text.setLayoutData(gd); text.addModifyListener(modifyListener); return text; } /** * Content provider for the projects table */ static class ProjectsContentProvider implements IStructuredContentProvider { @Override public Object[] getElements(final Object inputElement) { final java.util.List<String> ps = new ArrayList<>(); final IProject[] projects = ResourcesPlugin.getWorkspace().getRoot() .getProjects(); for (final IProject p : projects) { if (p.isAccessible()) { IProjectNature n = null; try { n = p.getNature(ErlangCore.NATURE_ID); if (n != null) { ps.add(p.getName()); } } catch (final CoreException e) { } } } return ps.toArray(new String[ps.size()]); } @Override public void dispose() { } @Override public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { } } /** * Provides the labels for the projects table * */ static class ProjectsLabelProvider implements ITableLabelProvider { @Override public Image getColumnImage(final Object element, final int columnIndex) { return null; } @Override public String getColumnText(final Object element, final int columnIndex) { if (element instanceof String) { return (String) element; } return "?" + element; } @Override public void addListener(final ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(final Object element, final String property) { return false; } @Override public void removeListener(final ILabelProviderListener listener) { } } @Override public void setDefaults(final ILaunchConfigurationWorkingCopy config) { config.setAttribute(ErlRuntimeAttributes.PROJECTS, ""); config.setAttribute(ErlRuntimeAttributes.MODULE, ""); config.setAttribute(ErlRuntimeAttributes.FUNCTION, ""); config.setAttribute(ErlRuntimeAttributes.ARGUMENTS, ""); config.setAttribute(ErlRuntimeAttributes.DEBUG_FLAGS, ErlDebugFlags.getFlag(ErlDebugFlags.DEFAULT_DEBUG_FLAGS)); } @Override public void initializeFrom(final ILaunchConfiguration config) { projectsTable.setInput(config); String projs; try { projs = config.getAttribute(ErlRuntimeAttributes.PROJECTS, ""); } catch (final CoreException e1) { projs = ""; } final String[] projectNames = projs.split(";"); projectsTable.setAllChecked(false); for (final String p : projectNames) { projectsTable.setChecked(p, true); } // final Set<IProject> projects = new HashSet<IProject>(); // ErlangLaunchConfigurationDelegate.addBreakpointProjectsAndModules( // projects, new HashSet<String>()); // for (final IProject p : projects) { // projectsTable.setChecked(p.getName(), true); // } final int itemCount = projectsTable.getTable().getItemCount(); if (itemCount == 1) { projectsTable.setChecked(projectsTable.getTable().getItem(0), true); } try { final String attribute = config.getAttribute(ErlRuntimeAttributes.MODULE, ""); moduleText.setText(attribute); } catch (final CoreException e) { moduleText.setText(""); } try { final String attribute = config.getAttribute(ErlRuntimeAttributes.FUNCTION, ""); funcText.setText(attribute); } catch (final CoreException e) { funcText.setText(""); } try { final String attribute = config.getAttribute(ErlRuntimeAttributes.ARGUMENTS, ""); argsText.setText(attribute); } catch (final CoreException e) { argsText.setText(""); } updateLaunchConfigurationDialog(); } @Override public void performApply(final ILaunchConfigurationWorkingCopy config) { final List<IProject> projects = getSelectedProjects(); final StringBuilder projectNames = new StringBuilder(); for (final IProject p : projects) { projectNames.append(p.getName()).append(';'); } if (projectNames.length() > 0) { projectNames.setLength(projectNames.length() - 1); } config.setAttribute(ErlRuntimeAttributes.PROJECTS, projectNames.toString()); config.setAttribute(ErlRuntimeAttributes.MODULE, moduleText.getText()); config.setAttribute(ErlRuntimeAttributes.FUNCTION, funcText.getText()); config.setAttribute(ErlRuntimeAttributes.ARGUMENTS, argsText.getText()); } public List<IProject> getSelectedProjects() { final Object[] sel = projectsTable.getCheckedElements(); final List<IProject> result = new ArrayList<>(); final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); for (final Object o : sel) { final String p = (String) o; result.add(root.getProject(p)); } return result; } @Override public String getName() { return "Erlang"; } @Override public boolean isValid(final ILaunchConfiguration launchConfig) { if (projectsTable.getCheckedElements().length == 0) { return false; } return true; } private final ModifyListener fBasicModifyListener = new ModifyListener() { @Override @SuppressWarnings("synthetic-access") public void modifyText(final ModifyEvent evt) { updateLaunchConfigurationDialog(); } }; }