package org.testng.eclipse.ui; import java.text.DateFormat; import java.util.Date; import java.util.LinkedList; import org.eclipse.debug.core.ILaunch; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IMenuCreator; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.testng.eclipse.TestNGPlugin; /** * Action that displays the test run history. It can: * <ul> * <li>open up a menu showing all the test runs with an icon displaying their * result</li> * <li>show the test run for which results are displayed</li> * <li>allow to select one test run to display its results</li> * </ul> */ public class RunHistoryAction extends Action implements IMenuCreator { private TestRunnerViewPart testRunnerViewPart; private Menu fMenu; private LinkedList<SuiteRunInfo> runs = new LinkedList<SuiteRunInfo>(); private SuiteRunInfo currentlyDisplayedRun; public RunHistoryAction(TestRunnerViewPart testRunnerViewPart) { this.testRunnerViewPart = testRunnerViewPart; setToolTipText("Test Run History..."); setImageDescriptor(TestNGPlugin.getImageDescriptor("elcl16/history_list.gif")); //$NON-NLS-1$ setMenuCreator(this); } public void dispose() { if (fMenu != null) { fMenu.dispose(); fMenu = null; } } public Menu getMenu(Menu parent) { return null; } public Menu getMenu(Control parent) { if (fMenu != null) { fMenu.dispose(); } fMenu = new Menu(parent); for (final SuiteRunInfo run : runs) { Action filterAction = new Action(getText(run)) { @Override public void run() { currentlyDisplayedRun = run; testRunnerViewPart.reset(run); } }; addActionToMenu(fMenu, filterAction, ImagesUtil.getImage(run.getStatus())); } new MenuItem(fMenu, SWT.SEPARATOR); addActionToMenu(fMenu, new Action("Clear History") { @Override public void run() { runs.clear(); currentlyDisplayedRun = null; testRunnerViewPart.reset(); } }, null); return fMenu; } private String getText(SuiteRunInfo run) { String prefix = ""; if (this.currentlyDisplayedRun == run) { prefix = "\u26ab "; // put a bullet in front } final Date date = new Date(run.getStartTime()); final String dateStr = DateFormat.getDateTimeInstance().format(date); final ILaunch launch = run.getLaunch(); if (launch != null) { return prefix + launch.getLaunchConfiguration().getName() + " (" + dateStr + ")"; } return prefix + "(" + dateStr + ")"; } protected void addActionToMenu(Menu parent, Action action, Image image) { final ActionContributionItem item = new ActionContributionItem(action); item.fill(parent, -1); final MenuItem menuItem = (MenuItem) item.getWidget(); if (image != null) { menuItem.setImage(image); } } public void add(SuiteRunInfo run) { this.runs.addFirst(run); // limit the number of displayed runs if (this.runs.size() > 20) { this.runs.removeLast(); } this.currentlyDisplayedRun = run; } }