/*=============================================================================#
# Copyright (c) 2009-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.statet.nico.internal.ui.actions;
import java.util.Map;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.menus.UIElement;
import org.eclipse.ui.services.IServiceLocator;
import de.walware.statet.nico.core.runtime.Queue;
import de.walware.statet.nico.core.runtime.ToolProcess;
import de.walware.statet.nico.core.util.IToolProvider;
import de.walware.statet.nico.ui.NicoUI;
import de.walware.statet.nico.ui.actions.ToolRetargetableHandler;
/**
* Handler to toggle pause state of engine
*/
public class PauseHandler extends ToolRetargetableHandler implements IElementUpdater,
IDebugEventSetListener {
private boolean fIsChecked;
private final ElementUpdater fUpdater = new ElementUpdater(NicoUI.PAUSE_COMMAND_ID);
public PauseHandler(final IToolProvider toolProvider, final IServiceLocator serviceLocator) {
super(toolProvider, serviceLocator);
init();
}
@Override
protected void init() {
DebugPlugin.getDefault().addDebugEventListener(this);
super.init();
}
@Override
public void dispose() {
final DebugPlugin debugManager = DebugPlugin.getDefault();
if (debugManager != null) {
debugManager.removeDebugEventListener(this);
}
super.dispose();
}
@Override
protected void doRefresh() {
if (getState() == S_ONAIR) {
fUpdater.schedule();
}
}
@Override
public void updateElement(final UIElement element, final Map parameters) {
element.setChecked(fIsChecked);
}
@Override
public boolean handleToolChanged() {
final ToolProcess tool = getTool();
final boolean wasChecked = fIsChecked;
fIsChecked = (tool != null) ?
tool.getQueue().isRequested(Queue.PAUSED_STATE) :
false;
setBaseEnabled(evaluateEnabled());
return (wasChecked != fIsChecked);
}
@Override
public void handleDebugEvents(final DebugEvent[] events) {
if (getState() != S_ONAIR) {
return;
}
boolean update = false;
final ToolProcess tool = getTool();
if (tool == null) {
return;
}
ITER_EVENTS: for (final DebugEvent event : events) {
if (event.getSource() == tool) {
if (event.getKind() == DebugEvent.TERMINATE) {
synchronized (this) {
if (getTool() != tool) {
return;
}
setBaseEnabled(false);
}
break;
}
continue ITER_EVENTS;
}
if (event.getSource() == tool.getQueue()) {
Boolean checked= null;
if (Queue.isStateRequest(event)) {
final Queue.StateDelta delta= (Queue.StateDelta) event.getData();
if (delta.newState == Queue.PAUSED_STATE) {
checked= Boolean.TRUE;
}
else {
checked= Boolean.FALSE;
}
}
else if (Queue.isStateChange(event)) {
final Queue.StateDelta delta= (Queue.StateDelta) event.getData();
if (delta.newState == Queue.PAUSED_STATE) {
checked= Boolean.TRUE;
}
}
if (checked != null) {
synchronized (this) {
if (getState() != S_ONAIR || getTool() != tool) {
return;
}
final boolean wasChecked = fIsChecked;
fIsChecked = checked;
update = (wasChecked != fIsChecked);
}
}
continue ITER_EVENTS;
}
}
if (update) {
doRefresh();
}
}
@Override
protected Object doExecute(final ExecutionEvent event) {
boolean update = false;
synchronized (this) {
final ToolProcess tool = getCheckedTool();
final boolean wasChecked= fIsChecked;
if (tool != null) {
final boolean success= (!wasChecked) ?
tool.getQueue().pause() : tool.getQueue().resume();
if (success) {
fIsChecked= !wasChecked;
}
}
else {
fIsChecked= false;
}
update = (wasChecked != fIsChecked);
}
if (update) {
doRefresh();
}
return null;
}
}