package org.radrails.server.internal.ui.console; import java.util.Observable; import java.util.Observer; 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.model.IProcess; import org.eclipse.jface.action.Action; import org.eclipse.ui.progress.UIJob; import org.radrails.rails.ui.browser.BrowserUtil; import org.radrails.server.core.IServerConstants; import org.radrails.server.core.Server; import org.radrails.server.core.ServerManager; import org.radrails.server.internal.ui.ActionUtil; import org.radrails.server.internal.ui.ServerUIPlugin; public class LaunchBrowserAction extends Action implements Observer { private IProcess process; private Server server; /** * Constructor. Initializes action with icon and tooltip. * * @param process */ public LaunchBrowserAction(IProcess process) { this.process = process; ServerManager.getInstance().addServerObserver(this); ActionUtil.initAction(this, "browser.gif", "Launch Browser"); Server server = getServer(); if (server != null && server.isStarted()) { setEnablement(server); } else { setEnabled(false); } } private Server getServer() { if (this.server != null) return this.server; Server server = ServerManager.getInstance().findByProcess(process); if (server != null) this.server = server; return server; } /* * (non-Javadoc) * * @see org.eclipse.jface.action.IAction#run() */ public void run() { UIJob job = new UIJob("Opening browser") { @Override public IStatus runInUIThread(IProgressMonitor monitor) { try { Server s = getServer(); if (s == null) return Status.CANCEL_STATUS; String port = String.valueOf(s.getPort()); BrowserUtil.openBrowser("http://" + s.getBrowserHost() + ":" + port); } catch (Exception e) { return new Status(Status.ERROR, ServerUIPlugin.getUniqueIdentifier(), -1, e.getMessage(), e); } return Status.OK_STATUS; } }; job.schedule(); } /* * (non-Javadoc) * * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ public void update(Observable o, Object arg) { if (getServer() == null) { setEnabled(false); return; } String action = (String) arg; if (action.equals(IServerConstants.UPDATE)) { Server s = (Server) o; if (!s.equals(getServer())) return; setEnablement(s); } } private void setEnablement(Server s) { if (s == null) { setEnabled(false); return; } if (s.isStopped() || s.isStopping()) { setEnabled(false); final Observer self = this; Job job = new Job("Remove server observer"){ @Override protected IStatus run(IProgressMonitor monitor) { ServerManager.getInstance().deleteServerObserver(self); return Status.OK_STATUS; } }; job.setSystem(true); job.schedule(); } else { setEnabled(true); } } }