X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugVariable.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugVariable.java index 969c718..58bb38f 100644 --- a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugVariable.java +++ b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugVariable.java @@ -7,8 +7,9 @@ package net.sourceforge.phpeclipse.xdebug.php.model; import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils; + +import org.eclipse.core.runtime.Platform; 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; @@ -19,163 +20,165 @@ import org.w3c.dom.Node; * 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; +public class XDebugVariable extends XDebugElement implements IVariable { + private String fName; + private String fNameFull; + private XDebugStackFrame fFrame; private XDebugAbstractValue fValue; - private String fEncoding; - private int fNumChildren; - + private String fFacet; + private XDebugVariable fParent; // The parent variable (a back link) + private String fTypeName; + + /** * 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) { + public XDebugVariable(XDebugStackFrame frame, Node property, XDebugVariable parent) throws DebugException { super((XDebugTarget) frame.getDebugTarget()); - fFrame = frame; - init(property); + + this.fParent = parent; + + if (frame != null ) { + fFrame = frame; + } + + String name = PHPDebugUtils.getAttributeValue (property, "name"); // Get the name of the variable (XDebug submits the name without the '$' prefix) + + if (fParent == null) { + fName = "$" + name; // Prepend the variable 'short' name with the php variable prefix '$' + } + else { + if (fParent.isArray ()) { + fName = "['" + name + "']"; + } + else if (fParent.isObject ()) { + fName = name; + } + else { + fName = name; // If this is the root variable don't prepend prefix '$' + } + } + + fNameFull = PHPDebugUtils.getAttributeValue(property,"fullname"); // The fullname has the '$' prepended, but it is the fully qualified name + // e.g. $myvar->child->a_variable. The fullname would be suitable to take for + // the setting a watch expression + + if ("".equals(fName)) { + fName = PHPDebugUtils.getAttributeValue (property, "address"); + } + + fFacet = PHPDebugUtils.getAttributeValue (property, "facet"); + fTypeName = PHPDebugUtils.getAttributeValue (property, "type"); + + if (fTypeName.equals ("int")) { + fValue = new XDebugIntValue (frame, property); + } + else if (fTypeName.equals ("float")) { + fValue = new XDebugFloatValue (frame, property); + } + else if (fTypeName.equals ("bool")) { + fValue = new XDebugBooleanValue (frame, property); + } + else if (fTypeName.equals ("string")) { + fValue = new XDebugStringValue (frame, property); + } + else if (fTypeName.equals ("array")) { + fValue = new XDebugArrayValue (frame, property, this); + } + else if (fTypeName.equals ("object")) { + fValue = new XDebugObjectValue (frame, property, this); + } + else if (fTypeName.equals ("resource")) { + fValue = new XDebugResourceValue (frame, property); + } + else { + fValue = new XDebugValue (frame, 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); + + public boolean isArray () { + return fTypeName.equals ("array"); } - - 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"); + public boolean isObject () { + return fTypeName.equals ("object"); + } + + /** + * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) + */ + public Object getAdapter(Class adapter) { + if (adapter.getName ().equals ("org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapter")) { + return new XDebugWatchExpressionFactoryAdapter (); + } + + return Platform.getAdapterManager().getAdapter (this, adapter); + } -// 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 { + public IValue getValue() { 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; + public String getName () { + return fName; } - + + /* + * @return The fully qualified name of the variable + */ + public String getNameFull () { + return fNameFull; + } + /* (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); + if (fFrame.setVariableValue(this, expression)) { + fValue.setValue(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); + fValue = (XDebugAbstractValue) value; + } + + /** + * + * @param changed This method is called after a suspend when the list of + * variables is updated, to mark that this variable has a changed + * value. The variable view will show this variable in + * a different color. + */ + public void setValueChanged(boolean changed) { + fValue.setChanged(changed); } /* (non-Javadoc) @@ -189,7 +192,7 @@ public class XDebugVariable extends XDebugElement implements IVariable { * @see org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang.String) */ public boolean verifyValue(String expression) throws DebugException { - return fValue.verifyValue(expression); + /*return true; */return fValue.verifyValue(expression); } /* (non-Javadoc) @@ -198,115 +201,26 @@ public class XDebugVariable extends XDebugElement implements IVariable { 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 String getVisibility() { + return fFacet; } - 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 XDebugVariable getParent() { + return fParent; } - - 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); - } - } + /** + * + */ + public void setParent(XDebugVariable parent) { + this.fParent = parent; } - -} \ No newline at end of file +}