Contributors:
IBM Corporation - Initial implementation
Vicente Fernando - www.alfersoft.com.ar
+ Christian Perkonig - cperkonig@gmx.at
**********************************************************************/
package net.sourceforge.phpdt.internal.debug.core.model;
+
+import java.util.Iterator;
+import java.util.Vector;
+
import org.eclipse.debug.core.DebugException;
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;
+
/**
- * @author Administrator
+ * PHPValue object belongs to a PHPVariable (is a member of PHPVariable).
+ * A PHPValue itself can have PHPVariables as children.
*
- * To change this generated comment edit the template variable "typecomment":
- * Window>Preferences>Java>Templates.
- * To enable and disable the creation of type comments go to
- * Window>Preferences>Java>Code Generation.
*/
public class PHPValue implements IValue {
- private String valueString ;
- private String referenceTypeName ;
- private boolean hasChildren= false ;
- private PHPVariable owner ;
- private PHPVariable[] variables ;
-
- public PHPValue(PHPVariable owner) {
- this(owner, "nil", null, false) ;
- }
-
- public PHPValue(PHPVariable owner, String valueString, String type, boolean hasChildren) {
- this.valueString = valueString ;
- this.owner = owner ;
- this.hasChildren = hasChildren ;
- this.referenceTypeName = type ;
- }
-
+ final static String[] PEV_NAMES = {"undefined", // 0
+ "long", // 1
+ "double", // 2
+ "string", // 3
+ "array", // 4
+ "object", // 5
+ "boolean", // 6
+ "resource", // 7
+ "reference", // 8
+ "soft reference"}; // 9
+ final static int PEVT_UNKNOWN = 0;
+ final static int PEVT_LONG = 1;
+ final static int PEVT_DOUBLE = 2;
+ final static int PEVT_STRING = 3;
+ final static int PEVT_ARRAY = 4;
+ final static int PEVT_OBJECT = 5;
+ final static int PEVT_BOOLEAN = 6;
+ final static int PEVT_RESOURCE = 7;
+ final static int PEVT_REF = 8;
+ final static int PEVT_SOFTREF = 9;
+
+ private int fValueType; // The type of this value (see the PEVT_... values)
+ private boolean hasChildren; // This value (variable) has children (more variables)
+ private String fValueString; // The value of this variable as text
+ private Vector fVariables; // The children of this variable (other variables) if any
+ private PHPStackFrame fStackFrame; // The stackframe this value (variable) belongs to
+ private boolean fHasChanged; // The value has changed between two suspends
+ // This variable was moved from PHPVariable due to the fact,
+ // that two PHPVariables can reference the same PHPValue,
+ // so only the first PHPVariable would win, when we check the variable tree
+ // for changed values.
+
+ /**
+ *
+ */
+ PHPValue () {
+ this (null, "", PEVT_UNKNOWN, null); // Creates an empty value
+ }
+
+ /**
+ *
+ * @param frame The stackframe this value (and variable) belongs to.
+ * @param value The value of this value.
+ * @param fValueType The type of this value (see the PEVT_... values).
+ * @param subitems This value has subitems.
+ */
+ PHPValue (PHPStackFrame frame, String value, int fValueType, Vector subitems)
+ {
+ this.fValueType = fValueType;
+ this.fValueString = value;
+ this.fStackFrame = frame;
+ this.fHasChanged = false;
+
+ if (subitems != null) { // If there are children for this value (variable)
+ this.fVariables = new Vector (subitems); // Then add the children to this value (variable)
+ }
+ else {
+ this.fVariables = new Vector (); // Create an empty vector
+ }
+ }
+
+ /**
+ *
+ * @param item
+ */
+ Vector addVariable (Vector item)
+ {
+ if (item != null) { // If there is something we want to add
+ this.fVariables.addAll (item); //
+ }
+
+ return this.fVariables;
+ }
+
+ /**
+ *
+ * @param parent
+ */
+ public void setParent (PHPVariable parent) {
+ if (!fVariables.isEmpty ()) { // If we have child variables
+ Iterator iter = fVariables.iterator (); // Create an iterator for the children
+
+ while (iter.hasNext ()) { // As long as we have children
+ ((PHPVariable) iter.next ()).setParent (parent); // Set all child's parent
+ }
+ }
+ }
/**
* @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
*/
- public String getReferenceTypeName() {
- return this.referenceTypeName;
+ public String getReferenceTypeName(){
+ return PEV_NAMES[fValueType];
}
/**
- * @see org.eclipse.debug.core.model.IValue#getValueString()
+ *
+ */
+ public int getReferenceType(){
+ return fValueType;
+ }
+
+ /**
+ * @param type Set the reference type (see the PEVT_... values).
+ */
+ public int setReferenceType (int type) {
+ return fValueType = type;
+ }
+
+ /**
+ * This method is called whenever this value (variable) is changed.
+ *
+ * @param value The changed value for this variable.
+ */
+ public void setValueString (String value) {
+ fValueString = value;
+ }
+
+ /**
+ * @see org.eclipse.debug.core.model.IValue#getfValueString()
*/
public String getValueString() {
- return valueString;
+ return fValueString;
}
/**
/**
* @see org.eclipse.debug.core.model.IValue#getVariables()
+ *
+ * @return The array of child variable for this value (variable).
*/
- public IVariable[] getVariables() throws DebugException {
- if (!hasChildren) {
- return new PHPVariable[0] ;
- }
- if (variables == null) {
- variables = ((PHPDebugTarget) this.getDebugTarget()).getPHPDBGProxy().readInstanceVariables(owner);
- }
- return variables;
+ public IVariable[] getVariables() {
+ return (PHPVariable[]) fVariables.toArray (new PHPVariable[fVariables.size ()]);
+// return (IVariable[])fVariables.toArray();
+ }
+
+ /**
+ *
+ */
+ public Vector getChildVariables () {
+ return (fVariables);
}
/**
* @see org.eclipse.debug.core.model.IValue#hasVariables()
+ *
+ * @return
+ * <ul>
+ * <li> <code>true</code> if this value (variable) has child variables
+ * <li> <code>false</code> if no child variable available
+ * </ul>
*/
public boolean hasVariables() throws DebugException {
- return hasChildren;
+ // return (!fVariables.isEmpty ());
+ return (fVariables.size () != 0);
}
/**
* @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
*/
public String getModelIdentifier() {
- return owner.getModelIdentifier();
+ // TODO Auto-generated method stub
+ return null;
}
/**
* @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
*/
public IDebugTarget getDebugTarget() {
- return owner.getDebugTarget();
+ return fStackFrame.getDebugTarget();
}
/**
* @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
*/
public ILaunch getLaunch() {
- return this.getDebugTarget().getLaunch();
+ return getDebugTarget().getLaunch();
}
/**
- * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
return null;
}
-
- public String toString() {
- if (this.getReferenceTypeName() == null) {
- return this.getValueString() ;
- }
- return this.getValueString() ;
+
+ public boolean hasValueChanged () throws DebugException {
+ return fHasChanged;
+ }
+
+ public void setValueChanged (boolean changed) {
+ fHasChanged = changed;
}
+
}