Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2012-04-06 01:05:12 +0000
committerEugene Tarassov2012-04-06 01:05:12 +0000
commit609d920d0cc1dfa4184e45db06965a057f0e6cfc (patch)
tree20f82c0dd1bacc328ccf00aee8e73437fff1ad0a /plugins/org.eclipse.tcf.debug.ui
parentdb4911829bf7aa3d03f79da958fd4311709d5d39 (diff)
downloadorg.eclipse.tcf-609d920d0cc1dfa4184e45db06965a057f0e6cfc.tar.gz
org.eclipse.tcf-609d920d0cc1dfa4184e45db06965a057f0e6cfc.tar.xz
org.eclipse.tcf-609d920d0cc1dfa4184e45db06965a057f0e6cfc.zip
TCF Debugger: added "Add new expression" line in the Expressions view
Diffstat (limited to 'plugins/org.eclipse.tcf.debug.ui')
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/ImageCache.java2
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/CastToTypeCommand.java6
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/WatchInExpressionsCommand.java9
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenExpressions.java12
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java67
5 files changed, 86 insertions, 10 deletions
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/ImageCache.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/ImageCache.java
index e3ba034d2..c16467746 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/ImageCache.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/ImageCache.java
@@ -52,6 +52,8 @@ public class ImageCache {
IMG_VARIABLE_POINTER = "icons/var_pointer.gif",
IMG_VARIABLE_AGGREGATE = "icons/var_aggr.gif",
+ IMG_NEW_EXPRESSION = "icons/full/elcl16/monitorexpression_tsk.gif",
+
IMG_SIGNALS = "icons/signals.gif",
IMG_MEMORY_MAP = "icons/memory-map.gif",
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/CastToTypeCommand.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/CastToTypeCommand.java
index 8bd017f18..51e62444a 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/CastToTypeCommand.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/CastToTypeCommand.java
@@ -18,6 +18,7 @@ import org.eclipse.tcf.internal.debug.ui.Activator;
import org.eclipse.tcf.internal.debug.ui.ImageCache;
import org.eclipse.tcf.internal.debug.ui.model.ICastToType;
import org.eclipse.tcf.internal.debug.ui.model.TCFNode;
+import org.eclipse.tcf.internal.debug.ui.model.TCFNodeExpression;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.ui.IWorkbenchWindow;
@@ -70,7 +71,10 @@ public class CastToTypeCommand extends AbstractActionDelegate {
private TCFNode getCastToTypeNode() {
TCFNode node = getSelectedNode();
- if (node instanceof ICastToType) return node;
+ if (node instanceof ICastToType) {
+ if (node instanceof TCFNodeExpression && ((TCFNodeExpression)node).isEmpty()) return null;
+ return node;
+ }
return null;
}
}
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/WatchInExpressionsCommand.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/WatchInExpressionsCommand.java
index a5adf7052..ceb15383f 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/WatchInExpressionsCommand.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/commands/WatchInExpressionsCommand.java
@@ -16,6 +16,9 @@ import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.tcf.internal.debug.ui.Activator;
import org.eclipse.tcf.internal.debug.ui.model.IWatchInExpressions;
import org.eclipse.tcf.internal.debug.ui.model.TCFNode;
+import org.eclipse.tcf.internal.debug.ui.model.TCFNodeExecContext;
+import org.eclipse.tcf.internal.debug.ui.model.TCFNodeExpression;
+import org.eclipse.tcf.internal.debug.ui.model.TCFNodeStackFrame;
import org.eclipse.tcf.util.TCFDataCache;
import org.eclipse.tcf.util.TCFTask;
import org.eclipse.ui.IWorkbenchPage;
@@ -70,6 +73,12 @@ public class WatchInExpressionsCommand extends AbstractActionDelegate {
private TCFNode[] getNodes() {
TCFNode[] arr = getSelectedNodes();
for (TCFNode n : arr) {
+ if (n instanceof TCFNodeExpression) {
+ if (((TCFNodeExpression)n).isEmpty()) return new TCFNode[0];
+ if (IDebugUIConstants.ID_EXPRESSION_VIEW.equals(getView().getViewSite().getId()) &&
+ (n.getParent() instanceof TCFNodeExecContext || n.getParent() instanceof TCFNodeStackFrame))
+ return new TCFNode[0];
+ }
if (n instanceof IWatchInExpressions) continue;
return new TCFNode[0];
}
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenExpressions.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenExpressions.java
index 77d4dd0f0..3fba28117 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenExpressions.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenExpressions.java
@@ -45,6 +45,14 @@ public class TCFChildrenExpressions extends TCFChildren {
return null;
}
+ private TCFNodeExpression findEmpty() {
+ for (TCFNode n : getNodes()) {
+ TCFNodeExpression e = (TCFNodeExpression)n;
+ if (e.isEmpty()) return e;
+ }
+ return null;
+ }
+
@Override
protected boolean startDataRetrieval() {
int cnt = 0;
@@ -57,6 +65,10 @@ public class TCFChildrenExpressions extends TCFChildren {
if (e instanceof IWatchExpression) n.setEnabled(((IWatchExpression)e).isEnabled());
data.put(n.id, n);
}
+ TCFNodeExpression n = findEmpty();
+ if (n == null) add(n = new TCFNodeExpression(node, null, null, null, null, -1, false));
+ n.setSortPosition(cnt++);
+ data.put(n.id, n);
set(null, null, data);
return true;
}
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java
index 98aad110c..aa3544bec 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java
@@ -14,8 +14,11 @@ import java.math.BigInteger;
import java.util.LinkedList;
import java.util.Map;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IExpressionManager;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.core.model.IWatchExpression;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
@@ -25,11 +28,14 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdat
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.tcf.internal.debug.model.TCFContextState;
@@ -66,6 +72,7 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
private final TCFData<String> string;
private final TCFData<String> expression_text;
private final TCFChildrenSubExpressions children;
+ private final boolean is_empty;
private int sort_pos;
private boolean enabled = true;
private IExpressions.Value prev_value;
@@ -109,12 +116,12 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
final String field_id, final String var_id, final String reg_id,
final int index, final boolean deref) {
super(parent, var_id != null ? var_id : "Expr" + expr_cnt++);
- assert script != null || field_id != null || var_id != null || reg_id != null || index >= 0;
this.script = script;
this.field_id = field_id;
this.reg_id = reg_id;
this.index = index;
this.deref = deref;
+ is_empty = script == null && var_id == null && field_id == null && reg_id == null && index < 0;
var_expression = new TCFData<IExpressions.Expression>(channel) {
@Override
protected boolean startDataRetrieval() {
@@ -136,6 +143,10 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
protected boolean startDataRetrieval() {
/* Compute expression script, not including type cast */
parent_value = null;
+ if (is_empty) {
+ set(null, null, null);
+ return true;
+ }
if (script != null) {
set(null, null, script);
return true;
@@ -670,6 +681,10 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
postAllChangedDelta();
}
+ public boolean isEmpty() {
+ return is_empty;
+ }
+
public String getScript() {
return script;
}
@@ -1000,7 +1015,14 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
@Override
protected boolean getData(ILabelUpdate result, Runnable done) {
- if (enabled || script == null) {
+ if (is_empty) {
+ FontData font_data = JFaceResources.getFontDescriptor(IDebugUIConstants.PREF_VARIABLE_TEXT_FONT).getFontData()[0];
+ font_data.setStyle(SWT.ITALIC);
+ result.setFontData(font_data, 0);
+ result.setLabel("Add new expression", 0);
+ result.setImageDescriptor(ImageCache.getImageDescriptor(ImageCache.IMG_NEW_EXPRESSION), 0);
+ }
+ else if (enabled || script == null) {
TCFDataCache<ISymbols.Symbol> field = model.getSymbolInfoCache(field_id);
TCFDataCache<?> pending = null;
if (field != null && !field.validate()) pending = field;
@@ -1402,6 +1424,7 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
}
public boolean getDetailText(StyledStringBuffer bf, Runnable done) {
+ if (is_empty) return true;
if (!enabled) {
bf.append("Disabled");
return true;
@@ -1470,7 +1493,7 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
@Override
protected boolean getData(IChildrenCountUpdate result, Runnable done) {
- if (enabled) {
+ if (!is_empty && enabled) {
if (!children.validate(done)) return false;
result.setChildCount(children.size());
}
@@ -1482,13 +1505,13 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
@Override
protected boolean getData(IChildrenUpdate result, Runnable done) {
- if (!enabled) return true;
+ if (is_empty || !enabled) return true;
return children.getData(result, done);
}
@Override
protected boolean getData(IHasChildrenUpdate result, Runnable done) {
- if (enabled) {
+ if (!is_empty && enabled) {
if (!children.validate(done)) return false;
result.setHasChilren(children.size() > 0);
}
@@ -1508,7 +1531,7 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
public CellEditor getCellEditor(IPresentationContext context, String column_id, Object element, Composite parent) {
assert element == this;
- if (TCFColumnPresentationExpression.COL_NAME.equals(column_id) && script != null) {
+ if (TCFColumnPresentationExpression.COL_NAME.equals(column_id)) {
return new TextCellEditor(parent);
}
if (TCFColumnPresentationExpression.COL_HEX_VALUE.equals(column_id)) {
@@ -1527,10 +1550,10 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
return new TCFTask<Boolean>() {
public void run() {
if (TCFColumnPresentationExpression.COL_NAME.equals(property)) {
- done(node.script != null);
+ done(node.is_empty || node.script != null);
return;
}
- if (node.enabled) {
+ if (!node.is_empty && node.enabled) {
if (!node.expression.validate(this)) return;
if (node.expression.getData() != null && node.expression.getData().expression.canAssign()) {
if (!node.value.validate(this)) return;
@@ -1554,6 +1577,10 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
final TCFNodeExpression node = (TCFNodeExpression)element;
return new TCFTask<String>() {
public void run() {
+ if (node.is_empty) {
+ done("");
+ return;
+ }
if (TCFColumnPresentationExpression.COL_NAME.equals(property)) {
done(node.script);
return;
@@ -1581,7 +1608,29 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
public void run() {
try {
if (TCFColumnPresentationExpression.COL_NAME.equals(property)) {
- if (!node.script.equals(value)) {
+ if (node.is_empty) {
+ if (value instanceof String) {
+ final String s = ((String)value).trim();
+ if (s.length() > 0) {
+ node.model.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ IWatchExpression expression = DebugPlugin.getDefault().getExpressionManager().newWatchExpression(s);
+ DebugPlugin.getDefault().getExpressionManager().addExpression(expression);
+ IAdaptable object = DebugUITools.getDebugContext();
+ IDebugElement context = null;
+ if (object instanceof IDebugElement) {
+ context = (IDebugElement)object;
+ }
+ else if (object instanceof ILaunch) {
+ context = ((ILaunch)object).getDebugTarget();
+ }
+ expression.setExpressionContext(context);
+ }
+ });
+ }
+ }
+ }
+ else if (!node.script.equals(value)) {
IExpressionManager m = DebugPlugin.getDefault().getExpressionManager();
for (final IExpression e : m.getExpressions()) {
if (node.script.equals(e.getExpressionText())) m.removeExpression(e);

Back to the top