package org.radrails.rails.internal.ui;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleListener;
import org.eclipse.ui.progress.UIJob;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.radrails.rails.core.IRailsConstants;
import org.radrails.rails.internal.core.RailsPlugin;
import org.radrails.rails.internal.ui.console.RailsShell;
import org.radrails.rails.ui.RailsUI;
public class RailsShellOpenJob extends UIJob
{
private BundleContext context;
public RailsShellOpenJob(BundleContext context)
{
super("Open Rails Shell");
this.context = context;
}
@Override
public boolean shouldSchedule()
{
return Platform.getPreferencesService().getBoolean(RailsPlugin.PLUGIN_ID,
IRailsConstants.AUTO_OPEN_RAILS_SHELL, true, null);
}
@Override
public IStatus runInUIThread(IProgressMonitor monitor)
{
final IWorkbenchWindow dw = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (dw == null)
return Status.CANCEL_STATUS;
IWorkbenchPage page = dw.getActivePage();
if (page == null)
return Status.CANCEL_STATUS;
IPerspectiveDescriptor desc = page.getPerspective();
if (desc == null || desc.getId() == null)
return Status.CANCEL_STATUS;
if (!desc.getId().equals(RailsUI.ID_PERSPECTIVE))
return Status.CANCEL_STATUS;
final RailsShell shell = RailsShell.open();
if (javascriptConsoleWillAppear())
{
IConsoleListener listener = new IConsoleListener()
{
public void consolesRemoved(IConsole[] consoles)
{
}
public void consolesAdded(IConsole[] consoles)
{
boolean addedJSConsole = false;
for (int i = 0; i < consoles.length; i++)
{
if (isJavascriptConsole(consoles[i]))
{
addedJSConsole = true;
break;
}
}
if (!addedJSConsole)
return;
final IConsoleListener self = this;
Job job = new UIJob("")
{
@Override
public IStatus runInUIThread(IProgressMonitor monitor)
{
// Force Rails Shell over top of JS Console
ConsolePlugin.getDefault().getConsoleManager().showConsoleView(shell);
ConsolePlugin.getDefault().getConsoleManager().removeConsoleListener(self);
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
}
};
ConsolePlugin.getDefault().getConsoleManager().addConsoleListener(listener);
}
return Status.OK_STATUS;
}
private boolean javascriptConsoleWillAppear()
{
if (javascriptConsoleAlreadyOpen())
return false;
return javascriptConsoleBundleInstalled();
}
private boolean javascriptConsoleBundleInstalled()
{
Bundle[] bundles = context.getBundles();
for (int i = 0; i < bundles.length; i++)
{
String name = bundles[i].getSymbolicName();
if (name.equals("org.eclipse.eclipsemonkey.lang.javascript"))
{
return true;
}
}
return false;
}
private boolean javascriptConsoleAlreadyOpen()
{
IConsole[] consoles = ConsolePlugin.getDefault().getConsoleManager().getConsoles();
for (int i = 0; i < consoles.length; i++)
{
if (isJavascriptConsole(consoles[i]))
return true;
}
return false;
}
private boolean isJavascriptConsole(IConsole console)
{
String classname = console.getClass().getName();
return classname.contains("JavaScriptConsole");
}
}