package org.testng.eclipse.wizards; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.Signature; 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.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.testng.eclipse.util.ResourceUtil; import org.testng.eclipse.util.Utils.JavaElement; /** * A wizard page that displays the list of public methods on the currently selected class * so that the user can select or deselect them before creating a new test class. * * @author Cedric Beust <cedric@beust.com> */ public class TestNGMethodWizardPage extends WizardPage { private List<IMethod> m_elements = new ArrayList<>(); private Table m_table; protected TestNGMethodWizardPage(List<JavaElement> elements) { super(ResourceUtil.getString("NewTestNGClassWizardPage.title")); setTitle(ResourceUtil.getString("NewTestNGClassWizardPage.title")); setDescription(ResourceUtil.getString("TestNGMethodWizardPage.description")); for (JavaElement je : elements) { if (je.compilationUnit != null) { try { for (IType type : je.compilationUnit.getTypes()) { for (IMethod method : type.getMethods()) { m_elements.add(method); } } } catch(JavaModelException ex) { // ignore } } } Collections.sort(m_elements, new Comparator<IMethod>() { public int compare(IMethod o1, IMethod o2) { return o1.getElementName().compareTo(o2.getElementName()); } }); } private String toSignature(IMethod method) { StringBuilder result = new StringBuilder(method.getElementName()); String[] types = method.getParameterTypes(); try { String[] names = method.getParameterNames(); result.append("("); for (int i = 0; i < types.length; i++) { if (i > 0) result.append(", "); result.append(Signature.toString(types[i]) + " " + names[i]); } result.append(")"); } catch(JavaModelException ex) { // ignore } return result.toString(); } public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); { GridLayout layout = new GridLayout(); layout.numColumns = 2; container.setLayout(layout); } { m_table = new Table(container, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); for (IMethod element : m_elements) { TableItem item = new TableItem(m_table, SWT.NONE); item.setText(toSignature(element)); item.setData(element); } GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.verticalSpan = 2; m_table.setLayoutData(gd); } { Composite cb = new Composite(container, SWT.NULL); GridLayout layout = new GridLayout(); // cb.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_BLUE)); cb.setLayout(layout); Button selectAll = new Button(cb, SWT.NONE); selectAll.setText("Select all"); selectAll.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true)); selectAll.addSelectionListener(new Listener(true /* select */)); Button deselectAll = new Button(cb, SWT.NONE); deselectAll.setText("Deselect all"); deselectAll.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true)); deselectAll.addSelectionListener(new Listener(false /* deselect */)); } setControl(container); } class Listener implements SelectionListener { private boolean m_select; public Listener(boolean select) { m_select = select; } public void widgetSelected(SelectionEvent e) { selectAll(m_select); } public void widgetDefaultSelected(SelectionEvent e) { } } private void selectAll(boolean select) { for (TableItem ti : m_table.getItems()) { ti.setChecked(select); } } public List<IMethod> getSelectedMethods() { List<IMethod> result = new ArrayList<>(); for (TableItem ti : m_table.getItems()) { if (ti.getChecked()) { result.add((IMethod) ti.getData()); } } return result; } }