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 2c3964d..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;
@@ -10,29 +13,82 @@ import org.eclipse.debug.core.model.IWatchExpressionDelegate;
 import org.eclipse.debug.core.model.IWatchExpressionListener;
 import org.eclipse.debug.core.model.IWatchExpressionResult;
 
+/**
+ * 
+ */
 public class PHPWatchExpressionDelegate implements IWatchExpressionDelegate {
 
-       public void evaluateExpression(String expression, IDebugElement context,
-                       IWatchExpressionListener listener) {
-               IWatchExpressionResult x;
-               PHPDBGProxy dbg=((PHPDebugTarget)context.getDebugTarget()).getPHPDBGProxy();
-               PHPStackFrame s=null;
-               if(context instanceof PHPStackFrame)
-                       s=(PHPStackFrame)context;
-               try{
-               PHPVariable result[]=dbg.eval(s,expression);
-               if(result.length==0)
-                       x=new PHPWatchExpressionResult(expression,null,null);
-               else
-                       x=new PHPWatchExpressionResult(expression,result[0].getValue(),null);
-               }
-               catch(Exception e)
-               {
-                       String[] s1=new String[1];
-                       s1[0]=e.toString();
-               x=new PHPWatchExpressionResult(expression,null,s1);
-               }
-               listener.watchEvaluationFinished(x);
-       }
-
-}
\ No newline at end of file
+       public void evaluateExpression(String expression, IDebugElement context,
+                       IWatchExpressionListener listener) {
+               IWatchExpressionResult x;
+               PHPDBGProxy dbg;
+               PHPStackFrame s;
+
+               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);
+                       }
+               } catch (Exception e) {
+                       String[] s1;
+
+                       s1 = new String[1];
+                       s1[0] = e.toString();
+                       x = new PHPWatchExpressionResult(expression, null, s1);
+               }
+
+               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;
+               }
+       }
+
+}