/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.rubypeople.rdt.internal.testunit.ui;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.rubypeople.rdt.testunit.ITestRunListener;
/**
* A tab presenting the failed tests in a table.
*/
public class FailureTab extends TestRunTab implements IMenuListener {
private Table fTable;
private TestUnitView fRunnerViewPart;
private boolean fMoveSelection = false;
private final Image fErrorIcon = TestUnitView.createImage("obj16/testerr.gif"); //$NON-NLS-1$
private final Image fFailureIcon = TestUnitView.createImage("obj16/testfail.gif"); //$NON-NLS-1$
private final Image fFailureTabIcon = TestUnitView.createImage("obj16/failures.gif"); //$NON-NLS-1$
public FailureTab() {}
public void createTabControl(CTabFolder tabFolder, Clipboard clipboard, TestUnitView runner) {
fRunnerViewPart = runner;
CTabItem failureTab = new CTabItem(tabFolder, SWT.NONE);
failureTab.setText(getName());
failureTab.setImage(fFailureTabIcon);
Composite composite = new Composite(tabFolder, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
composite.setLayout(gridLayout);
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
composite.setLayoutData(gridData);
fTable = new Table(composite, SWT.NONE);
gridLayout = new GridLayout();
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
fTable.setLayout(gridLayout);
gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
fTable.setLayoutData(gridData);
failureTab.setControl(composite);
failureTab.setToolTipText(TestUnitMessages.FailureRunView_tab_tooltip);
initMenu();
addListeners();
}
private void disposeIcons() {
fErrorIcon.dispose();
fFailureIcon.dispose();
fFailureTabIcon.dispose();
}
private void initMenu() {
MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(this);
Menu menu = menuMgr.createContextMenu(fTable);
fTable.setMenu(menu);
}
public String getName() {
return TestUnitMessages.FailureRunView_tab_title;
}
public String getSelectedTestId() {
int index = fTable.getSelectionIndex();
if (index == -1) return null;
return getTestInfo(fTable.getItem(index)).getTestId();
}
public String getAllFailedTestNames() {
StringBuffer trace = new StringBuffer();
String lineDelim = System.getProperty("line.separator", "\n"); //$NON-NLS-1$//$NON-NLS-2$
for (int i = 0; i < fTable.getItemCount(); i++) {
TestRunInfo testInfo = getTestInfo(fTable.getItem(i));
trace.append(testInfo.getTestName()).append(lineDelim);
String failureTrace = testInfo.getTrace();
if (failureTrace != null) {
StringReader stringReader = new StringReader(failureTrace);
BufferedReader bufferedReader = new BufferedReader(stringReader);
String line;
try {
while ((line = bufferedReader.readLine()) != null)
trace.append(line + lineDelim);
} catch (IOException e) {
trace.append(lineDelim);
}
}
}
return trace.toString();
}
private String getClassName() {
TableItem item = getSelectedItem();
TestRunInfo info = getTestInfo(item);
return info.getClassName();
}
private String getMethodName() {
TableItem item = getSelectedItem();
TestRunInfo info = getTestInfo(item);
return info.getTestMethodName();
}
public void menuAboutToShow(IMenuManager manager) {
if (fTable.getSelectionCount() > 0) {
String className = getClassName();
String methodName = getMethodName();
if (className != null) {
manager.add(new OpenTestAction(fRunnerViewPart, className, methodName, true));
manager.add(new Separator());
manager.add(new RerunAction(fRunnerViewPart, getSelectedTestId(),
className, methodName, ILaunchManager.RUN_MODE));
manager.add(new RerunAction(fRunnerViewPart, getSelectedTestId(),
className, methodName, ILaunchManager.DEBUG_MODE));
manager.add(new Separator());
// TODO Add back the actions!
// manager.add(new CopyFailureListAction(fRunnerViewPart,
// FailureTab.this, fClipboard));
}
}
}
private TableItem getSelectedItem() {
int index = fTable.getSelectionIndex();
if (index == -1) return null;
return fTable.getItem(index);
}
public void setSelectedTest(String testId) {
TableItem[] items = fTable.getItems();
for (int i = 0; i < items.length; i++) {
TableItem tableItem = items[i];
TestRunInfo info = getTestInfo(tableItem);
if (info.getTestId().equals(testId)) {
fTable.setSelection(new TableItem[] { tableItem});
fTable.showItem(tableItem);
return;
}
}
}
private TestRunInfo getTestInfo(TableItem item) {
return (TestRunInfo) item.getData();
}
public void setFocus() {
fTable.setFocus();
}
public void endTest(String testId) {
TestRunInfo testInfo = fRunnerViewPart.getTestInfo(testId);
if (testInfo == null || testInfo.getStatus() == ITestRunListener.STATUS_OK) return;
TableItem tableItem = new TableItem(fTable, SWT.NONE);
updateTableItem(testInfo, tableItem);
fTable.showItem(tableItem);
}
private void updateTableItem(TestRunInfo testInfo, TableItem tableItem) {
String label = TestUnitMessages.getFormattedString(TestUnitMessages.FailureRunView_labelfmt, new String[] { testInfo.getTestMethodName(), testInfo.getClassName()});
tableItem.setText(label);
if (testInfo.getStatus() == ITestRunListener.STATUS_FAILURE)
tableItem.setImage(fFailureIcon);
else
tableItem.setImage(fErrorIcon);
tableItem.setData(testInfo);
}
private TableItem findItem(String testId) {
TableItem[] items = fTable.getItems();
for (int i = 0; i < items.length; i++) {
TestRunInfo info = getTestInfo(items[i]);
if (info.getTestId().equals(testId)) return items[i];
}
return null;
}
public void activate() {
fMoveSelection = false;
testSelected();
}
public void aboutToStart() {
fMoveSelection = false;
fTable.removeAll();
}
private void testSelected() {
fRunnerViewPart.handleTestSelected(getSelectedTestId());
}
private void addListeners() {
fTable.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
activate();
}
public void widgetDefaultSelected(SelectionEvent e) {
activate();
}
});
fTable.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
disposeIcons();
}
});
fTable.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent e) {
handleDoubleClick(e);
}
public void mouseDown(MouseEvent e) {
activate();
}
public void mouseUp(MouseEvent e) {
activate();
}
});
}
void handleDoubleClick(MouseEvent e) {
if (fTable.getSelectionCount() > 0)
new OpenTestAction(fRunnerViewPart, getClassName(), getMethodName(), true).run();
}
/*
* @see ITestRunView#testStatusChanged(TestRunInfo)
*/
public void testStatusChanged(TestRunInfo info) {
TableItem item = findItem(info.getTestId());
if (item != null) {
if (info.getStatus() == ITestRunListener.STATUS_OK) {
item.dispose();
return;
}
updateTableItem(info, item);
}
if (item == null && info.getStatus() != ITestRunListener.STATUS_OK) {
item = new TableItem(fTable, SWT.NONE);
updateTableItem(info, item);
}
if (item != null) fTable.showItem(item);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.internal.junit.ui.ITestRunView#selectNext()
*/
public void selectNext() {
if (fTable.getItemCount() == 0) return;
int index = fTable.getSelectionIndex();
if (index == -1) index = 0;
if (fMoveSelection)
index = Math.min(fTable.getItemCount() - 1, index + 1);
else
fMoveSelection = true;
selectTest(index);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.internal.junit.ui.ITestRunView#selectPrevious()
*/
public void selectPrevious() {
if (fTable.getItemCount() == 0) return;
int index = fTable.getSelectionIndex();
if (index == -1) index = fTable.getItemCount() - 1;
if (fMoveSelection)
index = Math.max(0, index - 1);
else
fMoveSelection = true;
selectTest(index);
}
private void selectTest(int index) {
TableItem item = fTable.getItem(index);
TestRunInfo info = getTestInfo(item);
fRunnerViewPart.showTest(info);
}
}