X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/model/PHPValue.java b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/model/PHPValue.java index beca6a3..18b11b2 100644 --- a/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/model/PHPValue.java +++ b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/model/PHPValue.java @@ -1,16 +1,21 @@ /********************************************************************** -Copyright (c) 2000, 2002 IBM Corp. and others. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Common Public License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/legal/cpl-v10.html - -Contributors: - IBM Corporation - Initial implementation - Vicente Fernando - www.alfersoft.com.ar -**********************************************************************/ + Copyright (c) 2000, 2002 IBM Corp. and others. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Common Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/cpl-v10.html + + 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.Collections; +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; @@ -18,45 +23,137 @@ 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 + + public final static int PEVT_UNKNOWN = 0; + public final static int PEVT_LONG = 1; + public final static int PEVT_DOUBLE = 2; + public final static int PEVT_STRING = 3; + public final static int PEVT_ARRAY = 4; + public final static int PEVT_OBJECT = 5; + public final static int PEVT_BOOLEAN = 6; + public final static int PEVT_RESOURCE = 7; + public final static int PEVT_REF = 8; + public 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. + private boolean fSorted; + + /** + * + */ + 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. + */ + public PHPValue (PHPStackFrame frame, String value, int fValueType, Vector subitems) { + this.fValueType = fValueType; + this.fValueString = value; + this.fStackFrame = frame; + this.fHasChanged = false; + this.fSorted = 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 + */ + public Vector addVariable(Vector item) { + if (item != null) { // If there is something we want to add + this.fVariables.addAll(item); + this.fSorted = false; + } + + 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]; + } + + /** + * + */ + 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#getValueString() + * @see org.eclipse.debug.core.model.IValue#getfValueString() */ public String getValueString() { - return valueString; + return fValueString; } /** @@ -68,57 +165,98 @@ public class PHPValue implements IValue { /** * @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); + public IVariable[] getVariables() { + return (PHPVariable[]) getChildVariables().toArray( + new PHPVariable[fVariables.size()]); + } + + /** + * + */ + public Vector getChildVariables() { + if (!fSorted) { + Collections.sort(fVariables, new PHPVariableComparator()); + fSorted = true; } - return variables; + + return fVariables; } /** * @see org.eclipse.debug.core.model.IValue#hasVariables() + * + * @return + * */ 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; + } + + /* + * ONLY FOR net.sourceforge.phpdt.internal.debug.core.model.PHPDBGEvalString#copyItems(PHPVariable, PHPValue) + */ + protected void setVariables(Vector variables) { + fVariables = variables; + } + + /* + * ONLY FOR net.sourceforge.phpdt.internal.debug.core.model.PHPDBGEvalString#copyItems(PHPVariable, PHPValue) + */ + protected Object clone() throws CloneNotSupportedException { + PHPValue val = new PHPValue(); + + val.fValueType = fValueType; + val.fValueString = fValueString; + val.fVariables = fVariables; + val.fStackFrame = fStackFrame; + val.fHasChanged = fHasChanged; + val.fSorted = fSorted; + + return val; } }