/* * 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.PHPDebugUtils; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IVariable; import org.w3c.dom.Node; /** * @author Axel * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class XDebugVariable extends XDebugElement implements IVariable { public static final int VARTYPE_UNKNOWN = -1; public static final int VARTYPE_UNINITIALIZED = 0; public static final int VARTYPE_STRING = 1; public static final int VARTYPE_INT = 2; public static final int VARTYPE_FLOAT = 3; public static final int VARTYPE_ARRAY = 8; public static final int VARTYPE_HASH = 9; public static final int VARTYPE_OBJECT = 10; public static final int VARTYPE_RESOURCE = 11; // name & stack frmae private String fName; private XDebugStackFrame fFrame; private String fFullName; private XDebugAbstractValue fValue; private String fEncoding; private int fNumChildren; /** * Constructs a variable contained in the given stack frame * with the given name. * * @param frame owning stack frame * @param name variable name */ public XDebugVariable( String typeName, String fullname ) { fFullName = fullname; fName = fullname; if (typeName.equals("int") ) fValue= new XDebugIntValue(this,typeName); else if (typeName.equals("float") ) fValue= new XDebugFloatValue(this,typeName); else if (typeName.equals("bool") ) fValue= new XDebugBooleanValue(this,typeName); else if (typeName.equals("string") ) fValue= new XDebugStringValue(this,typeName); else if (typeName.equals("array") ) fValue= new XDebugArrayValue(this,typeName); else if (typeName.equals("hash") ) fValue= new XDebugArrayValue(this,typeName); else if (typeName.equals("object") ) fValue= new XDebugArrayValue(this,typeName); else if (typeName.equals("resource") ) fValue= new XDebugResourceValue(this,typeName); else fValue= new XDebugValue(this,typeName); } public XDebugVariable(XDebugStackFrame frame, Node property) { super((XDebugTarget) frame.getDebugTarget()); fFrame = frame; init(property); } public XDebugVariable(XDebugStackFrame frame, String fullname, String name, String typeName) { super((XDebugTarget) frame.getDebugTarget()); fFrame = frame; fFullName = fullname; fName = name; if (typeName.equals("int") ) fValue= new XDebugIntValue(this,typeName); else if (typeName.equals("float") ) fValue= new XDebugFloatValue(this,typeName); else if (typeName.equals("bool") ) fValue= new XDebugBooleanValue(this,typeName); else if (typeName.equals("string") ) fValue= new XDebugStringValue(this,typeName); else if (typeName.equals("array") ) fValue= new XDebugArrayValue(this,typeName); else if (typeName.equals("hash") ) fValue= new XDebugArrayValue(this,typeName); else if (typeName.equals("object") ) fValue= new XDebugArrayValue(this,typeName); else if (typeName.equals("resource") ) fValue= new XDebugResourceValue(this,typeName); else fValue= new XDebugValue(this,typeName); } private void init(Node property) { fFullName=PHPDebugUtils.getAttributeValue(property,"fullname"); fName=PHPDebugUtils.getAttributeValue(property,"name"); fEncoding=PHPDebugUtils.getAttributeValue(property,"encoding"); if (PHPDebugUtils.getAttributeValue(property,"numchildren").equals("")) fNumChildren = 0; else fNumChildren=Integer.parseInt(PHPDebugUtils.getAttributeValue(property,"numchildren")); String typeName=PHPDebugUtils.getAttributeValue(property,"type"); // if (typeName.equals("uninitialized") ) // fValue= new XDebugValue(this,property,typeName); if (typeName.equals("int") ) fValue= new XDebugIntValue(this,property,typeName); else if (typeName.equals("float") ) fValue= new XDebugFloatValue(this,property,typeName); else if (typeName.equals("bool") ) fValue= new XDebugBooleanValue(this,property,typeName); else if (typeName.equals("string") ) fValue= new XDebugStringValue(this,property,typeName); else if (typeName.equals("array") ) fValue= new XDebugArrayValue(this,property,typeName); else if (typeName.equals("hash") ) fValue= new XDebugArrayValue(this,property,typeName); else if (typeName.equals("object") ) fValue= new XDebugArrayValue(this,property,typeName); else fValue= new XDebugValue(this,property,typeName); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IVariable#getValue() */ public IValue getValue() throws DebugException { return fValue; // return ((XDebugTarget)getDebugTarget()).getVariableValue(this); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IVariable#getName() */ public String getName() throws DebugException { if (fFullName.endsWith("]")) return fFullName.substring(fFullName.lastIndexOf('[')); else return fName; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName() */ public String getReferenceTypeName() throws DebugException { return fValue.getReferenceTypeName(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IVariable#hasValueChanged() */ public boolean hasValueChanged() throws DebugException { return fValue.hasChanged(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String) */ public void setValue(String expression) throws DebugException { if(fValue.setValue(expression)) fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CONTENT)); //fValue.setValueA(expression); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse.debug.core.model.IValue) */ public void setValue(IValue value) throws DebugException { fValue.setValueB(value); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IValueModification#supportsValueModification() */ public boolean supportsValueModification() { return fValue.supportsValueModification(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang.String) */ public boolean verifyValue(String expression) throws DebugException { return fValue.verifyValue(expression); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse.debug.core.model.IValue) */ public boolean verifyValue(IValue value) throws DebugException { return false; } /** * Returns the stack frame owning this variable. * * @return the stack frame owning this variable */ protected XDebugStackFrame getStackFrame() { return fFrame; } public void setStackFrame(XDebugStackFrame frame) { fFrame=frame; super.setDebugTarget((XDebugTarget)frame.getDebugTarget()); } // public int getType() { // return fType; // } public String getValueString() throws DebugException { return fValue.getValueString(); } /*public setValueString(String newValueStrig) throws DebugException { fValue.setValueString getValueString(); }*/ public boolean hasChildren() { return (fNumChildren > 0); } public boolean isArray() { return (fValue.isArray()); } public String getEncoding() { return fEncoding; } public void setEncoding(String encoding) { fEncoding = encoding; } public String toString() { return fValue.toString(); } public String getFullName() { return fFullName; } public int getNumChildren() { return fNumChildren; } public void setNumChildren(int numChildren) { fNumChildren = numChildren; } public void setChange(IVariable oldVariable) throws DebugException { XDebugAbstractValue oldValue = null; IVariable[] newVariable = null; IVariable[] oldVariable1 = null; try { oldValue = (XDebugAbstractValue) oldVariable.getValue(); } catch (DebugException e) { } try { oldVariable1 = ((XDebugVariable)oldVariable).getValue().getVariables(); newVariable = fValue.getVariables(); } catch (DebugException e) { } if(((XDebugVariable) oldVariable).getNumChildren() > 0) { if ( this.getNumChildren() == 0) { try { if (!fValue.getValueString().equals(((XDebugAbstractValue)oldValue).getValueString())) { fValue.sethasChanged(true); } else { fValue.sethasChanged(false); } } catch (DebugException e) { } } else { for(int i = 0; i < newVariable.length; i++) { ((XDebugVariable)newVariable[i]).setChange(((XDebugVariable)oldVariable1[i])); } } } else { if ( this.getNumChildren() == 0) { // controllare anche il tipo (unknow) //if (!fValue.getValueString().equals("uninitialized")) { if (!fValue.getValueString().equals(oldValue.getValueString())) { fValue.sethasChanged(true); } else { fValue.sethasChanged(false); } } else { IVariable dummy = new XDebugVariable("UNKNOWN", ""); dummy.setValue("uninitialized"); for(int i = 0; i < newVariable.length; i++) { ((XDebugVariable)newVariable[i]).setChange(dummy); } fValue.sethasChanged(true); } } } }