/*******************************************************************************
* Copyright (c) 2011, 2014 Wind River Systems, Inc. and others. All rights reserved.
* This program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.ui.views.scriptpad.actions;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Event;
import org.eclipse.tcf.protocol.IPeer;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.runtime.callback.Callback;
import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
import org.eclipse.tcf.te.runtime.statushandler.StatusHandlerUtil;
import org.eclipse.tcf.te.tcf.core.scripting.interfaces.IScriptLauncherProperties;
import org.eclipse.tcf.te.tcf.core.scripting.launcher.ScriptLauncher;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode;
import org.eclipse.tcf.te.tcf.ui.views.help.IContextHelpIds;
import org.eclipse.tcf.te.tcf.ui.views.nls.Messages;
import org.eclipse.tcf.te.tcf.ui.views.scriptpad.ScriptPad;
import org.eclipse.ui.IActionDelegate2;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPartConstants;
/**
* Play script action implementation.
*/
public class PlayAction extends Action implements IViewActionDelegate, IActionDelegate2 {
// Reference to the action proxy
/* default */ IAction actionProxy;
// Parent view part
/* default */ IViewPart view;
// Reference to the view property listener
private IPropertyListener listener;
// Flag to remember if a script is currently running
/* default */ boolean running;
/**
* Constructor.
*/
public PlayAction() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
*/
@Override
public void init(IViewPart view) {
this.view = view;
if (listener == null) {
listener = new IPropertyListener() {
@Override
public void propertyChanged(Object source, int propId) {
if (IWorkbenchPartConstants.PROP_INPUT == propId && actionProxy != null) {
// Update the action enablement
boolean enabled = false;
if (PlayAction.this.view instanceof ScriptPad) enabled = ((ScriptPad)PlayAction.this.view).getPeerModel() != null;
actionProxy.setEnabled(enabled && !running);
}
}
};
view.addPropertyListener(listener);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
*/
@Override
public void init(IAction action) {
this.actionProxy = action;
if (action != null) {
boolean enabled = false;
if (view instanceof ScriptPad) enabled = ((ScriptPad)view).getPeerModel() != null;
action.setEnabled(enabled && !running);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
String script = null;
IPeerNode peerNode = null;
if (view instanceof ScriptPad && ((ScriptPad)view).getStyledText() != null) {
script = ((ScriptPad)view).getStyledText().getText();
peerNode = ((ScriptPad)view).getPeerModel();
}
if (script != null && !"".equals(script) && peerNode != null) { //$NON-NLS-1$
final ScriptLauncher launcher = new ScriptLauncher();
IPropertiesContainer properties = new PropertiesContainer();
properties.setProperty(IScriptLauncherProperties.PROP_SCRIPT, script);
final AtomicReference<IPeer> peer = new AtomicReference<IPeer>();
final IPeerNode finPeerModel = peerNode;
Runnable runnable = new Runnable() {
@Override
public void run() {
peer.set(finPeerModel.getPeer());
}
};
if (Protocol.isDispatchThread()) runnable.run();
else Protocol.invokeAndWait(runnable);
running = true;
launcher.launch(peer.get(), properties, new Callback() {
@Override
protected void internalDone(Object caller, IStatus status) {
running = false;
launcher.dispose();
boolean enabled = false;
if (PlayAction.this.view instanceof ScriptPad) enabled = ((ScriptPad)PlayAction.this.view).getPeerModel() != null;
actionProxy.setEnabled(enabled && !running);
if (status != null && (status.getSeverity() == IStatus.ERROR || status.getSeverity() == IStatus.WARNING)) {
StatusHandlerUtil.handleStatus(status, view, null,
Messages.ScriptPad_error_title, IContextHelpIds.SCRIPT_PAD_ERROR_PLAY_FAILED, this, null);
}
}
});
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
@Override
public void run(IAction action) {
run();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
*/
@Override
public void runWithEvent(IAction action, Event event) {
runWithEvent(event);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate2#dispose()
*/
@Override
public void dispose() {
if (listener != null) view.removePropertyListener(listener);
}
}