package rtt.ui.views; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.ToolTip; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.ViewPart; import rtt.core.RTTApplication; import rtt.ui.RttPluginUI; import rtt.ui.content.ReloadInfo; import rtt.ui.content.ReloadInfo.Content; import rtt.ui.content.logging.TestrunContent; import rtt.ui.content.main.ProjectContent; import rtt.ui.content.main.TestsuiteDirectory; import rtt.ui.content.testsuite.TestsuiteContent; import rtt.ui.launching.ApplicationRunnable; import rtt.ui.utils.RttLog; import rtt.ui.viewer.RttDoubleClickListener; import rtt.ui.viewer.RttLabelProvider; import rtt.ui.viewer.RttSimpleLabelProvider; import rtt.ui.viewer.RttStructuredContentProvider; import rtt.ui.viewer.RttTreeContentProvider; import rtt.ui.views.utils.AbstractProjectListener; import rtt.ui.views.utils.AbstractTestsuiteListener; import rtt.ui.views.utils.SuiteFilter; public class TestView extends ViewPart implements ISelectionListener { private class ProjectListener extends AbstractProjectListener { @Override public void refresh() { contentViewer.refresh(true); comboViewer.refresh(true); } @Override public void update(ProjectContent content) { boolean hasContent = false; if (content != null && content.getTestsuiteDirectory() != null) { TestsuiteDirectory suiteDirectory = content .getTestsuiteDirectory(); hasContent = !suiteDirectory.isEmpty(); if (hasContent) { comboViewer.setInput(suiteDirectory); contentViewer.setInput(content.getLogDirectory()); } else { Object[] emptyArray = new Object[0]; comboViewer.setInput(emptyArray); contentViewer.setInput(emptyArray); } } else { comboViewer.setInput(null); contentViewer.setInput(null); } comboViewer.getControl().setEnabled(hasContent); contentViewer.getControl().setEnabled(hasContent); generateButton.setEnabled(hasContent); runButton.setEnabled(hasContent); } } private class TestsuiteListener extends AbstractTestsuiteListener { @Override public void refresh() { comboViewer.refresh(true); if (comboViewer.getSelection() != null) { IStructuredSelection ssel = (IStructuredSelection) comboViewer.getSelection(); if (ssel != null && ssel.getFirstElement() != null) { TestsuiteContent content = (TestsuiteContent) ssel.getFirstElement(); if (content != null) { generateButton.setEnabled(content.hasChildren()); runButton.setEnabled(content.hasChildren()); } } } } @Override public void update(TestsuiteContent content) { if (content != null) { generateButton.setEnabled(content.hasChildren()); runButton.setEnabled(content.hasChildren()); comboViewer.setSelection(new StructuredSelection(content)); contentViewer.setFilters(new ViewerFilter[] { new SuiteFilter( content.getText(), content.getProject().getActiveConfiguration()) }); } else { generateButton.setEnabled(false); runButton.setEnabled(false); } } } private static class TestrunComparator extends ViewerComparator { @Override public int compare(Viewer viewer, Object e1, Object e2) { if (e1 instanceof TestrunContent && e2 instanceof TestrunContent) { TestrunContent testrun1 = (TestrunContent) e1; TestrunContent testrun2 = (TestrunContent) e2; return -(testrun1.getCalendar().compareTo(testrun2 .getCalendar())); } return super.compare(viewer, e1, e2); } } public static final String ID = "rtt.ui.views.TestView"; private TreeViewer contentViewer; private ComboViewer comboViewer; private Button generateButton; private Button runButton; private ProjectListener projectListener; private TestsuiteListener suiteListener; public TestView() {} @Override public void createPartControl(Composite parent) { parent.setLayout(new GridLayout(1, false)); Group runGroup = new Group(parent, SWT.NONE); runGroup.setLayoutData(new GridData( SWT.FILL, SWT.FILL, true, false, 1, 1)); runGroup.setText("Testing"); runGroup.setLayout(new GridLayout(2, false)); Label suiteLabel = new Label(runGroup, SWT.NONE); suiteLabel.setText("Test suite:"); comboViewer = new ComboViewer(runGroup, SWT.READ_ONLY); Combo combo = comboViewer.getCombo(); combo.setLayoutData(new GridData( SWT.FILL, SWT.CENTER, true, false, 1, 1)); comboViewer.setLabelProvider(new RttSimpleLabelProvider()); comboViewer.setContentProvider(new RttStructuredContentProvider()); generateButton = new Button(runGroup, SWT.NONE); generateButton.setLayoutData(new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1)); generateButton.setText("Generate Reference Results ..."); generateButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent event) { doButtonClick(new ApplicationRunnable(RTTApplication.GENERATE)); } }); runButton = new Button(runGroup, SWT.NONE); runButton.setLayoutData(new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1)); runButton.setText("Run Tests ..."); runButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent event) { doButtonClick(new ApplicationRunnable(RTTApplication.RUN)); } }); Group historyGroup = new Group(parent, SWT.NONE); historyGroup.setLayout(new GridLayout(1, false)); historyGroup.setLayoutData(new GridData( SWT.FILL, SWT.FILL, true, true, 1, 1)); historyGroup.setText("History"); contentViewer = new TreeViewer(historyGroup, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); contentViewer.setContentProvider(new RttTreeContentProvider()); contentViewer.setLabelProvider(new RttLabelProvider()); ColumnViewerToolTipSupport.enableFor(contentViewer, ToolTip.NO_RECREATE); contentViewer.addDoubleClickListener(new RttDoubleClickListener(getSite().getPage())); Tree tree = contentViewer.getTree(); tree.setLayoutData(new GridData( SWT.FILL, SWT.FILL, true, true, 1, 1)); contentViewer.setComparator(new TestrunComparator()); MenuManager menuManager = new MenuManager(); Menu menu = menuManager.createContextMenu(contentViewer.getControl()); contentViewer.getControl().setMenu(menu); getSite().registerContextMenu(menuManager, contentViewer); getSite().getPage().addSelectionListener(ID, this); getSite().setSelectionProvider(comboViewer); projectListener = new ProjectListener(); suiteListener = new TestsuiteListener(); } @Override public void dispose() { getSite().getPage().removeSelectionListener(ID, this); projectListener.removeListener(); projectListener = null; suiteListener.removeListener(); suiteListener = null; super.dispose(); } protected boolean doButtonClick(ApplicationRunnable runnable) { Shell parentShell = getSite().getShell(); String suiteName = comboViewer.getCombo().getText(); if (suiteName == null || suiteName.equals("")) { MessageDialog.openInformation(parentShell, runnable.getTaskText(), "No test suite selected."); return false; } ProjectContent projectContent = RttPluginUI.getProjectManager().getCurrentContent(); runnable.setProject(projectContent.getProject()); runnable.setSuiteName(suiteName); ProgressMonitorDialog dialog = new ProgressMonitorDialog(parentShell); try { dialog.run(true, true, runnable); } catch (Throwable e) { if (e instanceof InvocationTargetException) { InvocationTargetException inno = (InvocationTargetException) e; e = inno.getCause(); } MessageDialog.openError(parentShell, runnable.getTaskText(), e.getMessage()); RttLog.log(new Status(Status.ERROR, RttPluginUI.PLUGIN_ID, e .getMessage(), e)); return false; } finally { RttPluginUI.getProjectDirectory().reload(new ReloadInfo(Content.PROJECT)); } return true; } @Override public void setFocus() { if (RttPluginUI.getProjectDirectory().hasChanged()) { RttPluginUI.refreshManager(); } contentViewer.getControl().setFocus(); } @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { IStructuredSelection sSelection = (IStructuredSelection) selection; if (sSelection.getFirstElement() instanceof TestsuiteContent) { TestsuiteContent content = (TestsuiteContent) sSelection.getFirstElement(); RttPluginUI.getSuiteManager().setCurrentContent(content); } } }