 /* Created on 23.11.2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package net.sourceforge.phpeclipse.xdebug.php.model;

import net.sourceforge.phpeclipse.xdebug.core.Base64;
import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils;

import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * @author Axel
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

public abstract class XDebugAbstractValue  extends XDebugElement implements IValue {
	private IVariable[] fVariables;
	protected String fValueString;
	/*protected*/private String fTypeName;
	private boolean fhasChanged;

	public XDebugAbstractValue(XDebugStackFrame frame, Node varNode) throws DebugException  {
		super((XDebugTarget) frame.getDebugTarget());

		fTypeName = PHPDebugUtils.getAttributeValue(varNode,"type");

		int NumChildren = 0;
		if (!PHPDebugUtils.getAttributeValue(varNode,"numchildren").equals("")) {
			NumChildren = Integer.parseInt(PHPDebugUtils.getAttributeValue(varNode, "numchildren"));
		}		

		if (NumChildren > 0) {
			NodeList property = varNode.getChildNodes();
			renderValueString(""+property.getLength());
			fVariables = new IVariable[property.getLength()];
			for (int i = 0; i<property.getLength(); i++) {
				Node propertyNode = property.item(i);
				fVariables[i] = new XDebugVariable(frame, propertyNode);
			}
		}else {
			fVariables = new IVariable[0];
			String str="";
			try {
				str=varNode.getFirstChild().getNodeValue();
			} catch (NullPointerException e) {
				str="";
			}

			String Encoding = PHPDebugUtils.getAttributeValue(varNode,"encoding");
			
			if (Encoding.equals("base64")) {
				if (str.length()!=0)
					str=new String(Base64.decode(str));
				else
					str="";
			}
			renderValueString(str);
		}
		String className=PHPDebugUtils.getAttributeValue(varNode,"classname");
		if(!"".equals(className))
			renderValueString(className);
	}
	
	public boolean hasChanged() {
		return fhasChanged;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
	 */
	public String getReferenceTypeName() throws DebugException {
		return fTypeName;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IValue#getValueString()
	 */
	public String getValueString() throws DebugException {
		return fValueString;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
	 */
	public boolean isAllocated() throws DebugException {
		return true;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IValue#getVariables()
	 */
	public IVariable[] getVariables() throws DebugException {
		return fVariables;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IValue#hasVariables()
	 */
	public boolean hasVariables() throws DebugException {
		return (fVariables.length > 0);
	}
	
	public abstract void renderValueString(String data) throws DebugException;

	public abstract boolean verifyValue(String expression);
	
	public boolean setValue(String expression) throws DebugException {
		if (!verifyValue(expression)) {
			return false;
		}
		
		renderValueString(expression);
		fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CONTENT));
        
		return true;
	}
	
	public boolean supportsValueModification() {
		return false;
	}
}