X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/model/PHPVariable.java b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/model/PHPVariable.java index 0cdad2a..8bd7406 100644 --- a/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/model/PHPVariable.java +++ b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/model/PHPVariable.java @@ -14,31 +14,35 @@ package net.sourceforge.phpdt.internal.debug.core.model; import java.util.Vector; +import net.sourceforge.phpdt.internal.debug.core.PHPDebugCorePlugin; + import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IVariable; - /** * */ public class PHPVariable implements IVariable { - private PHPValue fValue; // The value of this variable - private String fName; // The name of the variable - private PHPStackFrame fStackFrame; // The stackframe this variable belongs to - private PHPVariable fParent; // The parent variable (a back link) - private String fLongName; // ??? - private boolean fHasChanged; // + private PHPValue fValue; // The value of this variable + private String fName; // The name of the variable + private PHPStackFrame fStackFrame; // The stackframe this variable belongs to + private PHPVariable fParent; // The parent variable (a back link) + private String fLongName; // The qualified name + private boolean fModifiable = true; /** * */ - PHPVariable () { - this (null, "", null, "", PHPValue.PEVT_UNKNOWN, null); // create an empty variable (a simple dummy node?) + PHPVariable() { + this(null, "", null, "", PHPValue.PEVT_UNKNOWN, null); // create an empty variable (a simple dummy node?) } /** @@ -50,12 +54,11 @@ public class PHPVariable implements IVariable { * @param valueType The type of the value (e.g. int, double, string etc.) @see PHPValue * @param subitems */ - PHPVariable (PHPStackFrame frame, String name, PHPVariable parent, String value, int valueType, Vector subitems) - { + public PHPVariable (PHPStackFrame frame, String name, PHPVariable parent, + String value, int valueType, Vector subitems) { this.fStackFrame = frame; - this.fValue = new PHPValue (frame, value, valueType, subitems); - this.fParent = parent; - this.fHasChanged = false; + this.fValue = new PHPValue(frame, value, valueType, subitems); + this.fParent = parent; setName (name); } @@ -64,29 +67,29 @@ public class PHPVariable implements IVariable { * * @param name */ - private void setName (String name) { - if ((fParent == null) || // If we have no parent for this variable - (fParent.getName () == "")) { // or we have a parent which is just a simple node ??? - fLongName = name; // Set the long name - fName = name; // and set the name + public void setName(String name) { + if ((fParent == null) || // If we have no parent for this variable + (fParent.getName() == "")) { // or we have a parent which is just a simple node ??? + fLongName = name; // Set the long name + fName = name; // and set the name return; } - switch (fParent.getReferenceType ()) { // Get the type of the parent variable - case PHPValue.PEVT_ARRAY : // It's an array - fName = "['" + name + "']"; // So set the variable name as [name] - fLongName = fParent.getLongName () + fName; // Set the longname to parentVariableLongname[name] + switch (fParent.getReferenceType()) { // Get the type of the parent variable + case PHPValue.PEVT_ARRAY: // It's an array + fName = "['" + name + "']"; // So set the variable name as [name] + fLongName = fParent.getLongName() + fName; // Set the longname to parentVariableLongname[name] break; - case PHPValue.PEVT_OBJECT : // It's an object - fName = name; // Set the name to name - fLongName = fParent.getLongName () + "." + fName; // Set the longname to parentVariableLongname.name + case PHPValue.PEVT_OBJECT: // It's an object + fName = name; // Set the name to name + fLongName = fParent.getLongName() + "->" + fName;// Set the longname to parentVariableLongname.name break; - default : - fName = name; // Set the name to name - fLongName = name; // Set the Longname to name + default: + fName = name; // Set the name to name + fLongName = name; // Set the Longname to name break; } } @@ -101,25 +104,36 @@ public class PHPVariable implements IVariable { /** * @see org.eclipse.debug.core.model.IVariable#getfName() */ - public String getName() { + public String getName() { return fName; } /** * */ - public PHPVariable getParent() - { + public PHPVariable getParent() { return fParent; } /** * */ - public void setParent(PHPVariable parent) - { - this.fParent=parent; - fLongName=parent.getLongName()+fName; + public void setParent(PHPVariable parent) { + this.fParent = parent; + + switch (fParent.getReferenceType ()) { + case PHPValue.PEVT_ARRAY: + fLongName = fParent.getLongName() + fName; + break; + + case PHPValue.PEVT_OBJECT: + fLongName = fParent.getLongName() + "->" + fName; + break; + + default: + fLongName = fName; + break; + } } /** @@ -154,9 +168,7 @@ public class PHPVariable implements IVariable { * @see org.eclipse.debug.core.model.IVariable#hasValueChanged() */ public boolean hasValueChanged() throws DebugException { - // TODO Auto-generated method stub - // return false; - return fHasChanged; + return fValue.hasValueChanged(); } /** @@ -166,57 +178,101 @@ public class PHPVariable implements IVariable { * value. The variable view will show this variable in * a different color. */ - public void setValueChanged (boolean changed) { - fHasChanged = changed; + public void setValueChanged(boolean changed) { + fValue.setValueChanged(changed); + } + + /** + * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier() + */ + public String getModelIdentifier() { + return getDebugTarget().getModelIdentifier(); + } + + /** + * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget() + */ + public IDebugTarget getDebugTarget() { + return fStackFrame.getDebugTarget(); } - /** - * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier() - */ - public String getModelIdentifier() { - return getDebugTarget().getModelIdentifier(); - } - - /** - * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget() - */ - public IDebugTarget getDebugTarget() { - return fStackFrame.getDebugTarget(); - } - - /** - * @see org.eclipse.debug.core.model.IDebugElement#getLaunch() - */ - public ILaunch getLaunch() { - return getDebugTarget().getLaunch(); - } + /** + * @see org.eclipse.debug.core.model.IDebugElement#getLaunch() + */ + public ILaunch getLaunch() { + return getDebugTarget().getLaunch(); + } /** * @see org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String) */ - public void setValue(String expression) throws DebugException { + public void setValue (String expression) throws DebugException { String evalString; - if(fValue.getReferenceType()==PHPValue.PEVT_STRING) - evalString=fLongName+"=\""+expression+"\""; - else - evalString=fLongName+"="+expression; - PHPVariable[] vars=fStackFrame.getPHPDBGProxy().eval(fStackFrame,evalString); - setValue(vars[0].fValue); + + if (fValue.getReferenceType () == PHPValue.PEVT_STRING) { + evalString = fLongName + "=\"" + expression + "\""; + } + else { + evalString = fLongName + "=" + expression; + } + + PHPVariable[] vars = fStackFrame.getPHPDBGProxy ().eval (fStackFrame, evalString); +///* + if (vars == null || vars.length == 0) { + vars = fStackFrame.getPHPDBGProxy ().eval (fStackFrame, fLongName); + + if (vars == null || vars.length == 0) { + int code = 0; + String msg = "Could not set " + expression + " to " + fLongName; + Status status = new Status (Status.ERROR, PHPDebugCorePlugin.PLUGIN_ID, code, msg, null); + PHPDebugCorePlugin.log (status); + + throw new DebugException (status); + } + } +//*/ + fValue = vars[0].fValue; +///* + if (fValue.hasVariables ()) { // set parent if new value has children + Vector variables = fValue.getChildVariables (); + + for (int i = 0; i < variables.size (); i++) { + PHPVariable var = (PHPVariable) variables.get (i); + + var.setParent (this); + + if (fValue.getReferenceType() == PHPValue.PEVT_ARRAY) { // adjust name if value type is array + var.setName (var.getName ()); // (still bare name. make "['name']") + } + } + } + + DebugPlugin.getDefault().fireDebugEventSet (new DebugEvent[] { + new DebugEvent (this, DebugEvent.CHANGE, DebugEvent.CONTENT) }); +//*/ } /** * @see org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse.debug.core.model.IValue) */ public void setValue(IValue value) throws DebugException { - // TODO Auto-generated method stub - this.fValue=(PHPValue)value; + this.fValue = (PHPValue) value; } /** * @see org.eclipse.debug.core.model.IValueModification#supportsValueModification() */ public boolean supportsValueModification() { - return true; + return fModifiable; + } + + /** + * Set whether this variable can be modified (default is true) + * + * for Global Variables root element only + */ + public void setModifiable(boolean modifiable) { + fModifiable = modifiable; } /** @@ -235,55 +291,70 @@ public class PHPVariable implements IVariable { return false; } - /** - * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) - */ - public Object getAdapter(Class adapter) { - return Platform.getAdapterManager().getAdapter(this, adapter); - } + /** + * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) + */ + public Object getAdapter(Class adapter) { + return Platform.getAdapterManager().getAdapter(this, adapter); + } /** - * This method is called from variable view and denominates the variables with - * a type specific explanation. - * + * This method is called from variable view and denominates the variables + * with a type specific explanation. */ - public String toString () { - int type = -1; - String str = ""; - - switch (getReferenceType ()) { - case PHPValue.PEVT_ARRAY : // Variable is an array - int elements = fValue.getVariables ().length; // Get the number of child elements - - switch (elements) { // Switch for the number of child elements - case 0: // We have no child element - str = this.getName () + " [no elements]"; // string => 'varname [no elements]' - break; - - case 1: // We have exactly one child element - str = this.getName () + " [1 element]"; // string => 'varname [1 element]' - break; - - default: // We have more than one element - str = this.getName () + " [" + elements + " elements]"; // string => 'varname [x elements]' - break; - } - break; - - case PHPValue.PEVT_OBJECT : // Variable is an object - str = this.getName () + " [class: " + fValue.getValueString() + "]"; // string => 'varname [class: varvalue]' - break; - - case PHPValue.PEVT_STRING : // Variable is a string - str = this.getName () + " = \"" + fValue.getValueString() +"\"" ; // string => 'varname = "varvalue"' + public String toString() { + String str = ""; + + switch (getReferenceType()) { + case PHPValue.PEVT_ARRAY: // Variable is an array + int elements = fValue.getVariables().length; // Get the number of child elements + + switch (elements) { // Switch for the number of child elements + case 0: // We have no child element + str = this.getName() + " [no elements]"; // string => 'varname [no elements]' + break; + + case 1: // We have exactly one child element + str = this.getName() + " [1 element]"; // string => 'varname [1 element]' break; - case PHPValue.PEVT_SOFTREF : // Variable is a soft reference - default : // or anything else - str = this.getName () + " = " + fValue.getValueString(); // string => 'varname = varvalue' - break; + default: // We have more than one element + str = this.getName() + " [" + elements + " elements]"; // string => 'varname [x elements]' + break; + } + break; + + case PHPValue.PEVT_OBJECT: // Variable is an object + str = this.getName() + " [class: " + fValue.getValueString() + "]"; // string => 'varname [class: varvalue]' + break; + + case PHPValue.PEVT_STRING: // Variable is a string + str = this.getName() + " = \"" + fValue.getValueString() + "\""; // string => 'varname = "varvalue"' + break; + + case PHPValue.PEVT_SOFTREF: // Variable is a soft reference + default: // or anything else + str = this.getName() + " = " + fValue.getValueString(); // string => 'varname = varvalue' + break; } return str; - } + } + + /* + * ONLY FOR net.sourceforge.phpdt.internal.debug.core.model.PHPDBGEvalString#copyItems(PHPVariable, PHPValue) + */ + protected Object clone() throws CloneNotSupportedException { + PHPVariable var = new PHPVariable(); + + var.fValue = fValue; + var.fName = fName; + var.fStackFrame = fStackFrame; + var.fParent = fParent; + var.fLongName = fLongName; + var.fModifiable = fModifiable; + + return var; + } + }