Fixed: 1775382 - Cannot change value in Expressions View
[phpeclipse.git] / net.sourceforge.phpeclipse.debug.core / src / net / sourceforge / phpdt / internal / debug / core / watch / PHPWatchExpressionDelegate.java
index 1f38d53..3d2df36 100644 (file)
@@ -1,8 +1,11 @@
 package net.sourceforge.phpdt.internal.debug.core.watch;
 
+import java.util.Vector;
+
 import net.sourceforge.phpdt.internal.debug.core.PHPDBGProxy;
 import net.sourceforge.phpdt.internal.debug.core.model.PHPDebugTarget;
 import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame;
+import net.sourceforge.phpdt.internal.debug.core.model.PHPValue;
 import net.sourceforge.phpdt.internal.debug.core.model.PHPVariable;
 
 import org.eclipse.debug.core.model.IDebugElement;
@@ -21,19 +24,28 @@ public class PHPWatchExpressionDelegate implements IWatchExpressionDelegate {
                PHPDBGProxy dbg;
                PHPStackFrame s;
 
-               dbg = ((PHPDebugTarget) context.getDebugTarget()).getPHPDBGProxy();
-               s = null;
-
-               if (context instanceof PHPStackFrame) {
-                       s = (PHPStackFrame) context;
+               if (!(context instanceof PHPStackFrame)) {
+                       x = new PHPWatchExpressionResult(expression, null, null);
+                       listener.watchEvaluationFinished(x);
+                       return;
                }
 
+               dbg = ((PHPDebugTarget) context.getDebugTarget()).getPHPDBGProxy();
+               s = (PHPStackFrame) context;
+
                try {
                        PHPVariable result[] = dbg.eval(s, expression);
 
                        if (result.length == 0) {
                                x = new PHPWatchExpressionResult(expression, null, null);
                        } else {
+                               switch (result[0].getReferenceType()) {
+                               case PHPValue.PEVT_ARRAY:
+                               case PHPValue.PEVT_OBJECT:
+                                       result[0].setName(expression);
+                                       reset(result[0]);
+                                       break;
+                               }
                                x = new PHPWatchExpressionResult(expression, result[0]
                                                .getValue(), null);
                        }
@@ -47,4 +59,36 @@ public class PHPWatchExpressionDelegate implements IWatchExpressionDelegate {
 
                listener.watchEvaluationFinished(x);
        }
+
+       private void reset(PHPVariable variable) {
+               PHPValue value;
+               Vector variables;
+
+               switch (variable.getReferenceType()) {
+               case PHPValue.PEVT_ARRAY:
+                       value = (PHPValue) variable.getValue();
+                       variables = value.getChildVariables();
+                       for (int i = 0; i < variables.size(); i++) {
+                               PHPVariable var = (PHPVariable) variables.get(i);
+                               String name = var.getName();
+                               if (var.getLongName().equals(name)) {
+                                       var.setName(name);
+                               } else {
+                                       var.setParent(variable);
+                               }
+                               reset(var);
+                       }
+                       break;
+               case PHPValue.PEVT_OBJECT:
+                       value = (PHPValue) variable.getValue();
+                       variables = value.getChildVariables();
+                       for (int i = 0; i < variables.size(); i++) {
+                               PHPVariable var = (PHPVariable) variables.get(i);
+                               var.setParent(variable);
+                               reset(var);
+                       }
+                       break;
+               }
+       }
+
 }