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
1 package net.sourceforge.phpdt.internal.debug.core.watch;
2
3 import java.util.Vector;
4
5 import net.sourceforge.phpdt.internal.debug.core.PHPDBGProxy;
6 import net.sourceforge.phpdt.internal.debug.core.model.PHPDebugTarget;
7 import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame;
8 import net.sourceforge.phpdt.internal.debug.core.model.PHPValue;
9 import net.sourceforge.phpdt.internal.debug.core.model.PHPVariable;
10
11 import org.eclipse.debug.core.model.IDebugElement;
12 import org.eclipse.debug.core.model.IWatchExpressionDelegate;
13 import org.eclipse.debug.core.model.IWatchExpressionListener;
14 import org.eclipse.debug.core.model.IWatchExpressionResult;
15
16 /**
17  * 
18  */
19 public class PHPWatchExpressionDelegate implements IWatchExpressionDelegate {
20
21         public void evaluateExpression(String expression, IDebugElement context,
22                         IWatchExpressionListener listener) {
23                 IWatchExpressionResult x;
24                 PHPDBGProxy dbg;
25                 PHPStackFrame s;
26
27                 if (!(context instanceof PHPStackFrame)) {
28                         x = new PHPWatchExpressionResult(expression, null, null);
29                         listener.watchEvaluationFinished(x);
30                         return;
31                 }
32
33                 dbg = ((PHPDebugTarget) context.getDebugTarget()).getPHPDBGProxy();
34                 s = (PHPStackFrame) context;
35
36                 try {
37                         PHPVariable result[] = dbg.eval(s, expression);
38
39                         if (result.length == 0) {
40                                 x = new PHPWatchExpressionResult(expression, null, null);
41                         } else {
42                                 switch (result[0].getReferenceType()) {
43                                 case PHPValue.PEVT_ARRAY:
44                                 case PHPValue.PEVT_OBJECT:
45                                         result[0].setName(expression);
46                                         reset(result[0]);
47                                         break;
48                                 }
49                                 x = new PHPWatchExpressionResult(expression, result[0]
50                                                 .getValue(), null);
51                         }
52                 } catch (Exception e) {
53                         String[] s1;
54
55                         s1 = new String[1];
56                         s1[0] = e.toString();
57                         x = new PHPWatchExpressionResult(expression, null, s1);
58                 }
59
60                 listener.watchEvaluationFinished(x);
61         }
62
63         private void reset(PHPVariable variable) {
64                 PHPValue value;
65                 Vector variables;
66
67                 switch (variable.getReferenceType()) {
68                 case PHPValue.PEVT_ARRAY:
69                         value = (PHPValue) variable.getValue();
70                         variables = value.getChildVariables();
71                         for (int i = 0; i < variables.size(); i++) {
72                                 PHPVariable var = (PHPVariable) variables.get(i);
73                                 String name = var.getName();
74                                 if (var.getLongName().equals(name)) {
75                                         var.setName(name);
76                                 } else {
77                                         var.setParent(variable);
78                                 }
79                                 reset(var);
80                         }
81                         break;
82                 case PHPValue.PEVT_OBJECT:
83                         value = (PHPValue) variable.getValue();
84                         variables = value.getChildVariables();
85                         for (int i = 0; i < variables.size(); i++) {
86                                 PHPVariable var = (PHPVariable) variables.get(i);
87                                 var.setParent(variable);
88                                 reset(var);
89                         }
90                         break;
91                 }
92         }
93
94 }