/*******************************************************************************
* Copyright (c) 2007, 2009 Wind River Systems 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.cdt.dsf.debug.ui.viewmodel.expression;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.cdt.dsf.ui.concurrent.ViewerDataRequestMonitor;
import org.eclipse.cdt.dsf.ui.viewmodel.DefaultVMContentProviderStrategy;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
/**
* The IElementContentProvider implementation to be used with an expression
* view model provider.
*
* @see ExpressionVMProvider
*/
public class ExpressionVMProviderContentStragegy extends DefaultVMContentProviderStrategy {
public ExpressionVMProviderContentStragegy(ExpressionVMProvider provider) {
super(provider);
}
private ExpressionVMProvider getExpressionVMProvider() {
return (ExpressionVMProvider)getVMProvider();
}
public void update(final IExpressionUpdate update) {
final IExpressionVMNode matchingNode =
getExpressionVMProvider().findNodeToParseExpression(null, update.getExpression());
if (matchingNode != null) {
updateExpressionWithNode(matchingNode, update);
} else {
update.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.REQUEST_FAILED, "Cannot parse expression", null)); //$NON-NLS-1$
update.done();
}
}
private void updateExpressionWithNode(final IExpressionVMNode node, final IExpressionUpdate update) {
// Call the expression node to parse the expression and fill in the value.
node.update(
new VMExpressionUpdate(
update, update.getExpression(),
new ViewerDataRequestMonitor<Object>(getVMProvider().getExecutor(), update) {
@Override
protected void handleSuccess() {
// Check if the evaluated node has child expression nodes.
// If it does, check if any of those nodes can evaluate the given
// expression further. If they can, call the child node to further
// process the expression. Otherwise we found our element and
// we're done.
final IExpressionVMNode matchingNode = getExpressionVMProvider().
findNodeToParseExpression(node, update.getExpression());
if (matchingNode != null && !matchingNode.equals(node)) {
updateExpressionWithNode(
matchingNode,
new VMExpressionUpdate(
update.getElementPath().createChildPath(getData()), update.getViewerInput(),
update.getPresentationContext(), update.getExpression(),
new ViewerDataRequestMonitor<Object>(getVMProvider().getExecutor(), update) {
@Override
protected void handleSuccess() {
update.setExpressionElement(getData());
update.done();
}
})
);
} else {
update.setExpressionElement(getData());
update.done();
}
}
})
);
}
}