package org.jactr.eclipse.runtime.ui.misc;
/*
* default logging
*/
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.jactr.eclipse.runtime.RuntimePlugin;
import org.jactr.eclipse.runtime.session.ISession;
import org.jactr.eclipse.runtime.session.control.ISessionController;
import org.jactr.eclipse.runtime.session.control.ISessionController2;
import org.jactr.eclipse.ui.images.JACTRImages;
/**
* general action that handles most cases for the play/pause session control.
* When using this, you either provide it with the selection provider that will
* propogate session selection events, or you must call setCurrentSession when
* the session selection changes.
*
* @author harrison
*/
public class PlayPauseAction extends Action implements
ISessionSelectionListener
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(PlayPauseAction.class);
static private final IMenuCreator EMPTY_MENU = new IMenuCreator() {
public void dispose()
{
// do nothing
}
public Menu getMenu(
Control parent)
{
// do nothing
return null;
}
public Menu getMenu(
Menu parent)
{
// do nothing
return null;
}
};
private ISession _currentSession;
private RunContentMenuCreator _menuCreator;
public PlayPauseAction()
{
super("", AS_DROP_DOWN_MENU);
mark(false, "Play/Pause",
JACTRImages.getImageDescriptor(JACTRImages.RESUME));
}
public void refresh()
{
updateStateAndIcons();
}
public void sessionSelected(ISession selectedSession)
{
if (_currentSession != null && !_currentSession.equals(selectedSession))
detachSession(_currentSession);
if (_currentSession != selectedSession) attachSession(selectedSession);
updateStateAndIcons();
}
protected void detachSession(ISession session)
{
if (session == _currentSession) _currentSession = null;
}
protected void attachSession(ISession session)
{
_currentSession = session;
ISessionController2 controller2 = null;
if (session != null)
{
ISessionController controller = session.getController();
if (controller instanceof ISessionController2)
controller2 = (ISessionController2) controller;
}
if (controller2 == null)
{
setMenuCreator(null);
_menuCreator = null;
}
else
{
if (_menuCreator != null) _menuCreator.dispose();
_menuCreator = new RunContentMenuCreator(controller2,
new RunLabelProvider());
setMenuCreator(_menuCreator);
}
}
public ISession getCurrentSession()
{
return _currentSession;
}
protected void markInactive()
{
mark(false, "Runtime inactive",
JACTRImages.getImageDescriptor(JACTRImages.RESUME));
}
protected void mark(boolean enabled, String toolTip, ImageDescriptor img)
{
setEnabled(enabled);
setToolTipText(toolTip);
setImageDescriptor(img);
}
protected void updateStateAndIcons()
{
ISession session = getCurrentSession();
ISessionController controller = session == null ? null : session
.getController();
if (session == null || controller == null)
{
markInactive();
return;
}
if (_menuCreator != null) _menuCreator.refresh();
if (controller.isTerminated() || !session.isOpen()) markInactive();
if (controller.canSuspend())
{
mark(true, "Suspend", JACTRImages.getImageDescriptor(JACTRImages.SUSPEND));
setMenuCreator(null);
}
if (controller.canResume())
{
IAction last = getLastRunForAction();
mark(true, last == null ? "Resume" : last.getText(),
JACTRImages.getImageDescriptor(JACTRImages.RESUME));
}
}
@Override
public void run()
{
ISession session = getCurrentSession();
if (session == null) return;
ISessionController controller = session.getController();
if (controller == null) return;
if (!controller.isRunning()) return;
IAction lastRunForAction = getLastRunForAction();
if (lastRunForAction != null)
{
lastRunForAction.run();
return;
}
if (controller.isSuspended() && controller.canResume())
{
if (LOGGER.isDebugEnabled())
LOGGER.debug(String.format("resuming %s", session));
try
{
controller.resume();
}
catch (Exception e)
{
RuntimePlugin.error("Failed to resume", e);
}
}
else if (!controller.isSuspended() && controller.canSuspend())
{
if (LOGGER.isDebugEnabled())
LOGGER.debug(String.format("suspending %s", session));
try
{
controller.suspend();
}
catch (Exception e)
{
RuntimePlugin.error("Failed to suspend ", e);
}
}
}
private IAction getLastRunForAction()
{
if (_menuCreator != null)
{
IAction lastAction = _menuCreator.getLastRun();
if (lastAction != null) return lastAction;
}
return null;
}
}