Patches from Robert Kraske (robekras):
[phpeclipse.git] / net.sourceforge.phpeclipse.debug.core / src / net / sourceforge / phpdt / internal / debug / core / model / PHPValue.java
index beca6a3..bf97de2 100644 (file)
@@ -8,55 +8,146 @@ 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.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
+                                                                                                                                       //
+
+       /**
+        *
+        */
+       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;
+
+               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];
+       }
+
+       /**
+        *
+        */
+       public int getReferenceType(){
+               return fValueType;
+       }
+
+       /**
+        * @param type Set the reference type (see the PEVT_... values).
+        */
+       public int setReferenceType (int type) {
+               return fValueType = type;
        }
 
        /**
-        * @see org.eclipse.debug.core.model.IValue#getValueString()
+        * 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;
        }
 
        /**
@@ -68,57 +159,62 @@ 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);
-               }
-               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() ;
-       }
 
 }