/*******************************************************************************
 * Copyright (c) 2007, 2009 Wind River Systems and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Wind River Systems - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.dsf.debug.ui.viewmodel.expression;

import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.ui.viewmodel.IVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.VMDelta;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.jface.viewers.TreePath;

/**
 * Interface for view model nodes that can be used within the expression view.
 * The methods of this interface allow the {@link ExpressionManagerVMNode}
 * to use this node to delegate expression parsing to this node, and to
 * generate deltas for expressions that are owned by this node.
 */
public interface IExpressionVMNode extends IVMNode {

	/**
	 * Returns whether the given expression node recognizes and can parse the given
	 * expression.
	 * @param expression Expression that needs to be parsed.
	 * @return true if expression can be parsed
	 */
	public boolean canParseExpression(IExpression expression);

	/**
	 * Asynchronously fills in the given expression update.
	 * @param update Update to complete.
	 */
	public void update(IExpressionUpdate update);

	/**
	 * Returns the flags that this node can generate for the given expression and
	 * event.
	 */
	public int getDeltaFlagsForExpression(IExpression expression, Object event);

	/**
	 * Adds delta flags to the given parent delta based on the expression
	 * object given.  The nodes add flags to the expression view's root
	 * delta using this method, regardless of whether the node is directly
	 * below the expression manager or not.
	 *
	 */
	public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta,
			TreePath path, RequestMonitor rm);

	/**
	 * Adds delta to the given parent delta based on the given element that
	 * was created base on an expression parsed by this node.  The VM nodes can
	 * add a new delta node to the parentDela by implementing this method.
	 */
	public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta,
			final RequestMonitor rm);
}
