/*******************************************************************************
 * Copyright (c) 2004, 2006 QNX Software 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:
 * QNX Software Systems - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.debug.internal.ui; 

import org.eclipse.cdt.debug.core.model.ICStackFrame;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IWatchExpressionDelegate;
import org.eclipse.debug.core.model.IWatchExpressionListener;
import org.eclipse.debug.core.model.IWatchExpressionResult;
 
public class CWatchExpressionDelegate implements IWatchExpressionDelegate {

	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IWatchExpressionDelegate#evaluateExpression(java.lang.String, org.eclipse.debug.core.model.IDebugElement, org.eclipse.debug.core.model.IWatchExpressionListener)
	 */
	@Override
	public void evaluateExpression( final String expression, IDebugElement context, final IWatchExpressionListener listener ) {
		if ( !(context instanceof ICStackFrame) ) {
			listener.watchEvaluationFinished( null );
			return;
		}
		final ICStackFrame frame = (ICStackFrame)context;
		Runnable runnable = new Runnable() {
			@Override
			public void run() {
				IValue value = null;
				DebugException de = null;
				try {
					value = frame.evaluateExpression( expression );
				}
				catch( DebugException e ) {
					de = e;
				}
				IWatchExpressionResult result = evaluationComplete( expression, value, de );
				listener.watchEvaluationFinished( result );
			}
		};
		DebugPlugin.getDefault().asyncExec( runnable );
	}

	protected IWatchExpressionResult evaluationComplete( final String expression, final IValue value, final DebugException de ) {
		return new IWatchExpressionResult() {
			
			@Override
			public IValue getValue() {
				return value;
			}
			
			@Override
			public boolean hasErrors() {
				return ( de != null );
			}
			
			@Override
			public String getExpressionText() {
				return expression;
			}
			
			/* (non-Javadoc)
			 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getException()
			 */
			@Override
			public DebugException getException() {
				return de;
			}

			@Override
			public String[] getErrorMessages() {
				return ( de != null ) ? new String[] { de.getMessage() } : new String[0];
			}
		};
	}
}
