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;
- private String fName;
- private PHPStackFrame fStackFrame;
- private PHPVariable fParent;
- private String fLongName;
-
- PHPVariable(){
- this(null,"",null,"",PHPValue.PEVT_UNKNOWN,null);
- }
-
- 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;
+ 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?)
+ }
+
+ /**
+ *
+ * @param frame The stackframe this variable belongs to
+ * @param name The name for this variable
+ * @param parent The parent variable if this is not the root
+ * @param value The value of this variable which is a simple value or again a variable
+ * @param valueType The type of the value (e.g. int, double, string etc.) @see PHPValue
+ * @param 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;
+
setName(name);
}
-
- private void setName(String name) {
- if ((fParent==null) || (fParent.getName()=="")) {
- fLongName=name;
- fName=name;
+
+ /**
+ *
+ * @param 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()) {
- case PHPValue.PEVT_ARRAY :
- fName="['"+name+"']";
- fLongName=fParent.getLongName()+fName;
+
+ 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 :
- fName=name;
- fLongName=fParent.getLongName()+"."+fName;
+
+ 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;
- fLongName=name;
+
+ default:
+ fName = name; // Set the name to name
+ fLongName = name; // Set the Longname to name
break;
}
}
+
/**
* @see org.eclipse.debug.core.model.IVariable#getValue()
*/
/**
* @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;
+ }
}
-
+
+ /**
+ *
+ */
public String getLongName() {
return fLongName;
}
public String getReferenceTypeName() {
return fValue.getReferenceTypeName();
}
-
+
+ /**
+ *
+ */
public int getReferenceType() {
return fValue.getReferenceType();
}
-
+
+ /**
+ *
+ */
public int setReferenceType(int type) {
return ((PHPValue) getValue()).setReferenceType(type);
}
* @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
*/
public boolean hasValueChanged() throws DebugException {
- // TODO Auto-generated method stub
- return false;
+ return fValue.hasValueChanged();
}
-
- /**
- * @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();
- }
+ /**
+ *
+ * @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.setValueChanged(changed);
+ }
- /**
- * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
- */
- public ILaunch getLaunch() {
- return getDebugTarget().getLaunch();
- }
+ /**
+ * @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.IValueModification#setValue(java.lang.String)
*/
public void setValue(String expression) throws DebugException {
String evalString;
- if(fValue.getReferenceType()==PHPValue.PEVT_STRING)
- evalString=fLongName+"=\""+expression+"\"";
+ if (fValue.getReferenceType() == PHPValue.PEVT_STRING)
+ evalString = fLongName + "=\"" + expression + "\"";
else
- evalString=fLongName+"="+expression;
- PHPVariable[] vars=fStackFrame.getPHPDBGProxy().eval(fStackFrame,evalString);
- setValue(vars[0].fValue);
+ 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;
+
+ // set parent if new value has children
+ if (fValue.hasVariables()) {
+ Vector variables = fValue.getChildVariables();
+ for (int i = 0; i < variables.size(); i++) {
+ PHPVariable var = (PHPVariable) variables.get(i);
+ var.setParent(this);
+ // adjust name if value type is array
+ // (still bare name. make "['name']")
+ if (fValue.getReferenceType() == PHPValue.PEVT_ARRAY) {
+ var.setName(var.getName());
+ }
+ }
+ }
+
+ 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;
}
/**
return false;
}
- /**
- * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
- */
- public Object getAdapter(Class adapter) {
- return Platform.getAdapterManager().getAdapter(this, adapter);
- }
-
- public String toString() {
- int type=-1;
- String str="";
-
- switch (getReferenceType())
- {
- case PHPValue.PEVT_ARRAY :
- int elements=fValue.getVariables().length;
- switch (elements) {
- case 0:
- str= this.getName() + " [no elements]";
- break;
- case 1:
- str= this.getName() + " [1 element]";
- break;
- default:
- str= this.getName() + " [" + elements + " elements]";
- break;
- }
- break;
- case PHPValue.PEVT_OBJECT :
- str =this.getName() + " [class: " + fValue.getValueString() + "]";
- break;
- case PHPValue.PEVT_STRING :
- str =this.getName() + " = \"" + fValue.getValueString() +"\"" ;
+ /**
+ * @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.
+ */
+ 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 PHPValue.PEVT_SOFTREF :
- default :
- str =this.getName() + " = " + fValue.getValueString();
- 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"'
+ 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;
+ }
+
}