// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.debug.ui.actions; import org.chromium.debug.core.model.ConnectedTargetData; import org.chromium.debug.core.model.DebugTargetImpl; import org.chromium.debug.core.model.Value; import org.chromium.debug.core.model.Variable; import org.eclipse.debug.core.model.IDebugElement; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IWatchExpression; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IActionDelegate2; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; /** * Base implementation for generic actions for Variables and Expressions views. * Its inner state is {@link Runnable} value: on selection change runnable is calculated, * if it's null action is disabled; if it's not-null action is enabled and can be * executed. */ public abstract class VariableBasedAction implements IObjectActionDelegate, IActionDelegate2 { public interface VariableWrapper { Variable getVariable(); Value getValue(); IDebugElement getDebugElement(); ConnectedTargetData getConnectedTargetData(); } private final ElementHandler elementHandler; private Runnable currentRunnable = null; protected VariableBasedAction(ElementHandler elementHandler) { this.elementHandler = elementHandler; } public void setActivePart(IAction action, IWorkbenchPart targetPart) { } public void run(IAction action) { if (currentRunnable == null) { return; } currentRunnable.run(); } public void dispose() { currentRunnable = null; } public void init(IAction action) { } public void runWithEvent(IAction action, Event event) { if (currentRunnable == null) { return; } currentRunnable.run(); } public void selectionChanged(IAction action, ISelection selection) { VariableWrapper wrapper = getElementFromSelection(selection, elementHandler); currentRunnable = createRunnable(wrapper); action.setEnabled(currentRunnable != null); } protected abstract Runnable createRunnable(VariableWrapper wrapper); static VariableWrapper getElementFromSelection(ISelection selection, ElementHandler elementHandler) { if (selection instanceof IStructuredSelection == false) { return null; } IStructuredSelection structuredSelection = (IStructuredSelection) selection; if (structuredSelection.size() != 1) { // We do not support multiple selection. return null; } Object element = structuredSelection.getFirstElement(); return elementHandler.castElement(element); } public static abstract class ElementHandler { public abstract VariableWrapper castElement(Object element); } public static final ElementHandler VARIABLE_VIEW_ELEMENT_HANDLER = new ElementHandler() { @Override public VariableWrapper castElement(Object element) { if (element instanceof Variable == false) { return null; } final Variable variable = (Variable) element; return new VariableWrapper() { @Override public Value getValue() { return variable.getValue().asRealValue(); } @Override public Variable getVariable() { return variable; } @Override public IDebugElement getDebugElement() { return variable; } @Override public ConnectedTargetData getConnectedTargetData() { return variable.getConnectedData(); } }; } }; public static final ElementHandler EXPRESSION_VIEW_ELEMENT_HANDLER = new ElementHandler() { @Override public VariableWrapper castElement(Object element) { if (element instanceof IWatchExpression == false) { return null; } final IWatchExpression watchExpression = (IWatchExpression) element; return new VariableWrapper() { @Override public Value getValue() { IValue value = watchExpression.getValue(); if (value instanceof Value == false) { return null; } Value chromiumValue = (Value) value; return chromiumValue; } @Override public Variable getVariable() { return null; } @Override public IDebugElement getDebugElement() { return watchExpression; } @Override public ConnectedTargetData getConnectedTargetData() { IDebugTarget debugTarget = watchExpression.getDebugTarget(); if (debugTarget instanceof DebugTargetImpl == false) { return null; } DebugTargetImpl debugTargetImpl = (DebugTargetImpl) debugTarget; return debugTargetImpl.getConnectedOrNull(); } }; } }; }