/*******************************************************************************
* Copyright (c) 2006 RadRails.org 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/epl-v10.html
*******************************************************************************/
package org.radrails.rails.internal.ui.actions;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2;
import org.eclipse.ui.PlatformUI;
import org.radrails.rails.internal.ui.RailsUIMessages;
import org.radrails.rails.ui.RailsUIPlugin;
import org.radrails.rails.ui.test.TestLauncher;
public class RunTestsPulldownDelegate implements IWorkbenchWindowPulldownDelegate2
{
private IWorkbenchWindow fWindow;
private Menu fMenu;
public Menu getMenu(Control parent)
{
setMenu(new Menu(parent));
fillMenu(fMenu);
return fMenu;
}
public Menu getMenu(Menu parent)
{
setMenu(new Menu(parent));
fillMenu(fMenu);
return fMenu;
}
private void fillMenu(Menu m)
{
createUnitMenu(m);
createFunctionalMenu(m);
createIntegrationMenu(m);
}
/**
* Sets this action's drop-down menu, disposing the previous menu.
*
* @param menu the new menu
*/
private void setMenu(Menu menu) {
if (fMenu != null) {
fMenu.dispose();
}
fMenu = menu;
}
public void dispose()
{
}
public void init(IWorkbenchWindow window)
{
fWindow = window;
}
public void run(IAction action)
{
runTests("all", "run_tests.rb");
}
public void selectionChanged(IAction action, ISelection selection)
{
}
private void createUnitMenu(Menu parent)
{
MenuItem unit = new MenuItem(parent, SWT.PUSH);
unit.setText("Run Unit Tests");
unit.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
runTests("unit", "run_unit.rb");
}
});
final Image uImage = RailsUIPlugin.getImageDescriptor("icons/testrununit.gif").createImage();
unit.setImage(uImage);
unit.addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
uImage.dispose();
}
});
}
private void createFunctionalMenu(Menu parent)
{
MenuItem func = new MenuItem(parent, SWT.PUSH);
func.setText("Run Functional Tests");
func.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
runTests("functional", "run_functional.rb");
}
});
final Image fImage = RailsUIPlugin.getImageDescriptor("icons/testrunfunctional.gif").createImage();
func.setImage(fImage);
func.addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
fImage.dispose();
}
});
}
private void createIntegrationMenu(Menu parent)
{
MenuItem integ = new MenuItem(parent, SWT.PUSH);
integ.setText("Run Integration Tests");
integ.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
runTests("integration", "run_integration.rb");
}
});
final Image iImage = RailsUIPlugin.getImageDescriptor("icons/testrunintegration.gif").createImage();
integ.setImage(iImage);
integ.addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
iImage.dispose();
}
});
}
private void runTests(final String type, final String file)
{
// Create a new job
final IProject project = RailsUIPlugin.getSelectedOrOnlyRailsProject();
if (project == null)
{
openErrorDialog(RailsUIMessages.SelectRailsProject_message);
return;
}
Job j = new Job(type + " tests")
{
@Override
public IStatus run(IProgressMonitor monitor)
{
monitor.beginTask("Running " + type + " tests", 6);
TestLauncher t = new TestLauncher(monitor);
t.goLaunch(project, ILaunchManager.RUN_MODE, file);
monitor.worked(1);
monitor.done();
return Status.OK_STATUS;
}
};
j.setUser(true);
j.schedule();
}
private void openErrorDialog(final String message)
{
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable()
{
public void run()
{
MessageDialog.openError(fWindow.getShell(), "Error running tests", message);
}
});
}
}