package org.testng.eclipse.launch; import org.testng.eclipse.TestNGPlugin; import org.testng.eclipse.launch.components.Filters; import org.testng.eclipse.launch.components.ProjectBrowserComposite; import org.testng.eclipse.launch.components.SelectionTableComposite; import org.testng.eclipse.launch.components.SelectionTableComposite.AbstractSelectionTableProvider; import org.testng.eclipse.runner.RemoteTestNG; import org.testng.eclipse.ui.util.ProjectChooserDialog; import org.testng.eclipse.util.JDTUtil; import org.testng.eclipse.util.ResourceUtil; import org.testng.eclipse.util.SWTUtil; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; 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.debug.ui.ILaunchConfigurationTab; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; 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.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; 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.Group; import org.eclipse.swt.widgets.Text; public class AlternateLaunchConfigurationTab extends AbstractLaunchConfigurationTab implements ILaunchConfigurationTab { protected ScrolledComposite m_scrolledComposite; protected Composite m_parent; protected Text m_projectNameText; protected Button m_useSourceDirsRadio; protected ProjectBrowserComposite m_testProjectBrowser; protected SelectionTableComposite m_testComposite; protected ProjectBrowserComposite m_sourceProjectBrowser; protected SelectionTableComposite m_sourceComposite; protected IJavaProject m_workingProject; /** * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { ppp(".createControl"); parent.setLayout(new FillLayout()); m_scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL); Composite m_parent = new Composite(m_scrolledComposite, SWT.NONE); m_parent.setLayout(new GridLayout(3, false)); createProjectGroup(m_parent); Composite selectionComposite = new Composite(m_parent, SWT.NONE); selectionComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); selectionComposite.setLayout(new FillLayout(SWT.VERTICAL)); createTestGroup(selectionComposite); createSourceSelectionGroup(selectionComposite); // Set the child as the scrolled content of the ScrolledComposite m_scrolledComposite.setContent(m_parent); // Set the minimum size m_scrolledComposite.setMinSize(400, 400); // Expand both horizontally and vertically m_scrolledComposite.setExpandVertical(true); m_scrolledComposite.setExpandHorizontal(true); setControl(m_scrolledComposite); } protected void createProjectGroup(Composite parent) { Group projectGroup = createGroup(parent, ResourceUtil.getString("AlternateLaunchConfigurationTab.project")); //$NON-NLS-1$ GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; m_projectNameText = new Text(projectGroup, SWT.SINGLE | SWT.BORDER); m_projectNameText.setLayoutData(gd); m_projectNameText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent evt) { updateLaunchConfigurationDialog(); } }); Button projectSearchButton = new Button(projectGroup, SWT.PUSH); projectSearchButton.setText(ResourceUtil.getString("TestNGMainTab.label.browse")); //$NON-NLS-1$ projectSearchButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { handleProjectButtonSelected(); } }); SWTUtil.setButtonGridData(projectSearchButton); /*Group projectGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); projectGroup.setText(ResourceUtil.getString("AlternateLaunchConfigurationTab.project")); //$NON-NLS-1$ GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; projectGroup.setLayoutData(gd); projectGroup.setLayout(new FillLayout()); m_projectNameText= new Text(projectGroup, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); IJavaProject selectedProject = JDTUtil.getJavaProjectContext(); if(null != selectedProject) { m_projectNameText.setText(selectedProject.getElementName()); }*/ } protected void handleProjectButtonSelected() { IJavaProject project = ProjectChooserDialog.getSelectedProject(getShell()); if (project == null) { return; } m_workingProject = project; m_projectNameText.setText(project.getElementName()); m_testProjectBrowser.setInput(m_workingProject); m_sourceProjectBrowser.setInput(m_workingProject); } protected void createTestGroup(Composite parent) { Group group = createGroup(parent, ResourceUtil.getString("AlternateLaunchConfigurationTab.testSelectionGroup")); //$NON-NLS-1$ m_testProjectBrowser = new ProjectBrowserComposite(group); GridData gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.verticalAlignment = GridData.FILL; m_testProjectBrowser.getTree().setLayoutData(gd); // IJavaProject projectSelection = JDTUtil.getJavaProjectContext(); // if(null != projectSelection) { // m_testProjectBrowser.setInput(projectSelection.getProject().getParent()); // } m_testProjectBrowser.addViewerFilter(Filters.TEST_FILTER); Composite buttonsComposite = new Composite(group, SWT.NONE); buttonsComposite.setLayout(new GridLayout(1, true)); buttonsComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL)); Button btnUpdate = new Button(buttonsComposite, SWT.PUSH | SWT.BORDER); btnUpdate.setText("Update"); SWTUtil.setButtonGridData(btnUpdate); btnUpdate.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleUpdateAction(m_testComposite, m_testProjectBrowser.getCheckedElements()); } }); Button btnSearchTests = new Button(buttonsComposite, SWT.PUSH | SWT.BORDER); btnSearchTests.setText("Tests"); btnSearchTests.setEnabled(false); SWTUtil.setButtonGridData(btnSearchTests); Button btnSearchSuites = new Button(buttonsComposite, SWT.PUSH | SWT.BORDER); btnSearchSuites.setText("Suites"); btnSearchSuites.setEnabled(false); SWTUtil.setButtonGridData(btnSearchSuites); m_testComposite = new SelectionTableComposite(group, new String[] {"T", "Name", "Path"}, new boolean[] {true, true, false}, new SelectionTableComposite.AbstractSelectionTableProvider() { public String getColumnText(Object element, int columnIndex) { IResource ires = (IResource) element; switch(columnIndex) { case 0: return getResourceType(ires); case 1: return ires.getName(); case 2: return ires.getFullPath().toOSString(); } return ""; //$NON-NLS-1$ } } ); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.verticalAlignment = GridData.FILL; m_testComposite.getTable().setLayoutData(gd); } private void handleUpdateAction(final SelectionTableComposite selectionComposite, final Object[] elements) { selectionComposite.setInput(new StructuredSelection(elements)); if(selectionComposite == m_testComposite) { if(null != elements && elements.length > 0) { setErrorMessage(null); } else { setErrorMessage("No tests selected"); } } updateLaunchConfigurationDialog(); } protected void createSourceSelectionGroup(final Composite parent) { Group group = createGroup(parent, ResourceUtil.getString("AlternateLaunchConfigurationTab.jdk14.sourcedir")); //$NON-NLS-1$ GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; m_useSourceDirsRadio = new Button(group, SWT.CHECK); m_useSourceDirsRadio.setText(ResourceUtil.getString("AlternateLaunchConfigurationTab.jdk14.selection")); //$NON-NLS-1$ m_useSourceDirsRadio.setLayoutData(gd); m_useSourceDirsRadio.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { boolean enabled = m_useSourceDirsRadio.getSelection(); } }); m_sourceProjectBrowser = new ProjectBrowserComposite(group); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.verticalAlignment = GridData.FILL; m_sourceProjectBrowser.getTree().setLayoutData(gd); // IJavaProject projectSelection = JDTUtil.getJavaProjectContext(); // if(null != projectSelection) { // m_sourceProjectBrowser.setInput(projectSelection.getProject().getParent()); // } m_sourceProjectBrowser.addViewerFilter(Filters.SOURCE_DIRECTORY_FILTER); Button btnUpdate = new Button(group, SWT.PUSH | SWT.BORDER); btnUpdate.setText(ResourceUtil.getString("AlternateLaunchConfigurationTab.label.update")); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; btnUpdate.setLayoutData(gd); SWTUtil.setButtonDimensionHint(btnUpdate); btnUpdate.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleUpdateAction(m_sourceComposite, m_sourceProjectBrowser.getCheckedElements()); } }); m_sourceComposite = new SelectionTableComposite(group, new String[] {"Path"}, new boolean[] {false}, new SelectionTableComposite.AbstractSelectionTableProvider() { public String getColumnText(Object element, int columnIndex) { return ((IResource) element).getFullPath().toOSString(); } } ); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.verticalAlignment = GridData.FILL; m_sourceComposite.getTable().setLayoutData(gd); } /** * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { ppp(".setDefaults"); if(null == m_workingProject) { m_workingProject = JDTUtil.getJavaProjectContext(); } String projectName = m_workingProject == null ? "" : m_workingProject.getElementName(); configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName); configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, RemoteTestNG.class.getName()); } /** * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ public void initializeFrom(ILaunchConfiguration configuration) { ppp(".initializeFrom"); try { IJavaProject ijp = LaunchConfigurationHelper.getProject(configuration); IResource[] initialSelection = LaunchConfigurationHelper.findTestResources(configuration); IResource[] sourceDirSelection = null; /*LaunchConfigurationHelper.findResources(configuration, TestNGLaunchConfigurationConstants.SOURCE_DIR_LIST);*/ m_workingProject = ijp; updateUI(ijp, initialSelection, sourceDirSelection); } catch(CoreException ce) { TestNGPlugin.log(ce); } } private void updateUI(IJavaProject ijp, IResource[] testSelection, IResource[] sourceSelection) { if(!validateForm()) { return; } setErrorMessage(null); setMessage(null); m_projectNameText.setText(ijp.getElementName()); m_testProjectBrowser.setInput(ijp); m_testProjectBrowser.setSelection(testSelection); handleUpdateAction(m_testComposite, testSelection); m_sourceProjectBrowser.setInput(ijp); if(sourceSelection.length > 0) { m_useSourceDirsRadio.setSelection(true); m_sourceProjectBrowser.setSelection(sourceSelection); handleUpdateAction(m_sourceComposite, sourceSelection); } } /** * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void performApply(ILaunchConfigurationWorkingCopy configuration) { ppp(".performApply"); if(!validateForm()) { return; } configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, m_workingProject.getElementName()); configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, RemoteTestNG.class.getName()); Object[] checkedElements = m_testComposite.getCheckedElements(); configuration.setAttribute(TestNGLaunchConfigurationConstants.DIRECTORY_TEST_LIST, extractResources(checkedElements, JDTUtil.DIRECTORY_TYPE)); configuration.setAttribute(TestNGLaunchConfigurationConstants.CLASS_TEST_LIST, extractResources(checkedElements, JDTUtil.CLASS_TYPE)); configuration.setAttribute(TestNGLaunchConfigurationConstants.SOURCE_TEST_LIST, extractResources(checkedElements, JDTUtil.SOURCE_TYPE)); configuration.setAttribute(TestNGLaunchConfigurationConstants.SUITE_TEST_LIST, extractResources(checkedElements, JDTUtil.SUITE_TYPE)); } protected boolean validateForm() { if(null == m_workingProject) { setErrorMessage("No project selected"); //$NON-NLS-1$ } return m_workingProject != null; } public boolean isValid(ILaunchConfiguration launchConfig) { return getErrorMessage() == null; } /** * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() */ public String getName() { return ResourceUtil.getString("AlternateLaunchConfigurationTab.name"); } protected List extractResources(Object[] elements, final String type) { List result = new ArrayList(); for(int i = 0; i < elements.length; i++) { IResource iresource = (IResource) elements[i]; if(type.equals(JDTUtil.getResourceType(iresource))) { result.add(iresource.getFullPath().toOSString()); } } return result; } protected Group createGroup(Composite parent, String groupTitle) { Group group = new Group(parent, SWT.SHADOW_ETCHED_IN); group.setText(groupTitle); GridData gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.horizontalSpan = 3; gd.horizontalIndent = 0; group.setLayoutData(gd); group.setLayout(new GridLayout(3, false)); return group; } private static void ppp(final Object msg) { System.out.println("[AlternateLaunchConfigurationTab]: " + msg); } }