/* * 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.core.runtime.Platform; 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; /** * @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 { private String fName; private String fNameFull; private XDebugStackFrame fFrame; private XDebugAbstractValue fValue; 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(XDebugStackFrame frame, Node property, XDebugVariable parent) throws DebugException { super((XDebugTarget) frame.getDebugTarget()); 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 boolean isArray () { return fTypeName.equals ("array"); } 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); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IVariable#getValue() */ public IValue getValue() { return fValue; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IVariable#getName() */ 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 (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 = (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) * @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 true; */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; } public String getValueString() throws DebugException { return fValue.getValueString(); } public String getVisibility() { return fFacet; } /** * */ public XDebugVariable getParent() { return fParent; } /** * */ public void setParent(XDebugVariable parent) { this.fParent = parent; } }