Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreutarass2008-07-10 19:17:06 +0000
committereutarass2008-07-10 19:17:06 +0000
commit0910b26b9db91a708798c9078d22dd7ea62a9971 (patch)
treeb9b2ba97da52fa948291281b536fa5a50eea4ac7 /plugins
parent907f2821b2c9d380b40e2efa506b06b70cfa9d87 (diff)
downloadorg.eclipse.tcf-0910b26b9db91a708798c9078d22dd7ea62a9971.tar.gz
org.eclipse.tcf-0910b26b9db91a708798c9078d22dd7ea62a9971.tar.xz
org.eclipse.tcf-0910b26b9db91a708798c9078d22dd7ea62a9971.zip
TCF debugger UI prototype: improved handling of model deltas
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFChildrenExecContext.java4
-rw-r--r--plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java21
-rw-r--r--plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModelProxy.java76
-rw-r--r--plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNode.java2
-rw-r--r--plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeExecContext.java17
-rw-r--r--plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeRegister.java2
6 files changed, 46 insertions, 76 deletions
diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFChildrenExecContext.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFChildrenExecContext.java
index 17cb419e1..aea997bb5 100644
--- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFChildrenExecContext.java
+++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFChildrenExecContext.java
@@ -126,7 +126,7 @@ public class TCFChildrenExecContext extends TCFChildren {
TCFNodeExecContext n = (TCFNodeExecContext)node.model.getNode(id);
if (n == null) {
n = new TCFNodeExecContext(node, id);
- node.addModelDelta(IModelDelta.CONTENT);
+ n.addModelDelta(IModelDelta.ADDED);
}
else {
n.addModelDelta(IModelDelta.STATE);
@@ -142,7 +142,7 @@ public class TCFChildrenExecContext extends TCFChildren {
TCFNodeExecContext n = (TCFNodeExecContext)node.model.getNode(id);
if (n == null) {
n = new TCFNodeExecContext(node, id);
- node.addModelDelta(IModelDelta.CONTENT);
+ n.addModelDelta(IModelDelta.ADDED);
}
else {
n.addModelDelta(IModelDelta.STATE);
diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java
index d3fb608f2..e390d533e 100644
--- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java
+++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java
@@ -47,8 +47,6 @@ import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tm.internal.tcf.debug.model.TCFLaunch;
@@ -496,7 +494,7 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
final IDebugView view = (IDebugView)window.getActivePage().findView(IDebugUIConstants.ID_DEBUG_VIEW);
if (view == null) return;
if (!((AbstractDebugView)view).isAvailable()) return;
- Protocol.invokeLater(300, new Runnable() {
+ Protocol.invokeLater(100, new Runnable() {
public void run() {
TCFNode node = getNode(node_id);
if (node == null) return;
@@ -511,19 +509,12 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
}
final TreeModelViewer viewer = (TreeModelViewer)view.getViewer();
for (TCFModelProxy proxy : model_proxies.values()) {
- if (proxy.getProxyViewer() == viewer && !proxy.validateViewer(this)) return;
- }
- final TCFNode element = node;
- display.asyncExec(new Runnable() {
- public void run() {
- if (cnt != debug_view_selection_cnt) return;
- if (element.parent != null && !viewer.getExpandedState(element.parent)) {
- viewer.setExpandedState(element.parent, true);
- }
- ISelection selection = new StructuredSelection(element);
- viewer.setSelection(selection);
+ if (proxy.getProxyViewer() == viewer) {
+ proxy.fireModelChanged();
+ proxy.addDelta(node, IModelDelta.SELECT | IModelDelta.REVEAL);
+ proxy.fireModelChanged();
}
- });
+ }
}
});
}
diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModelProxy.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModelProxy.java
index 3c2a19199..e81b7e15c 100644
--- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModelProxy.java
+++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModelProxy.java
@@ -10,7 +10,6 @@
*******************************************************************************/
package org.eclipse.tm.internal.tcf.debug.ui.model;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -18,48 +17,20 @@ import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.tm.tcf.protocol.Protocol;
public class TCFModelProxy extends AbstractModelProxy implements IModelProxy {
+
+ private static final int CONTENT_FLAGS =
+ IModelDelta.ADDED | IModelDelta.REMOVED |
+ IModelDelta.REPLACED | IModelDelta.INSERTED |
+ IModelDelta.CONTENT | IModelDelta.STATE;
private final TCFModel model;
private final Map<TCFNode,Integer> deltas = new HashMap<TCFNode,Integer>();
- private final ArrayList<Runnable> wait_list = new ArrayList<Runnable>();
- private boolean pending_deltas;
- private boolean updating;
-
- private final IViewerUpdateListener update_listener = new IViewerUpdateListener() {
- public void viewerUpdatesComplete() {
- Protocol.invokeLater(new Runnable() {
- public void run() {
- pending_deltas = false;
- updating = false;
- if (wait_list.isEmpty()) return;
- Runnable[] arr = wait_list.toArray(new Runnable[wait_list.size()]);
- for (Runnable r : arr) r.run();
- wait_list.clear();
- }
- });
- }
- public void viewerUpdatesBegin() {
- Protocol.invokeLater(new Runnable() {
- public void run() {
- updating = true;
- }
- });
- }
- public void updateStarted(IViewerUpdate update) {
- }
- public void updateComplete(IViewerUpdate update) {
- }
- };
-
TCFModelProxy(TCFModel model) {
this.model = model;
}
@@ -67,22 +38,22 @@ public class TCFModelProxy extends AbstractModelProxy implements IModelProxy {
public void installed(Viewer viewer) {
super.installed(viewer);
model.onProxyInstalled(this);
- ((TreeModelViewer)viewer).addViewerUpdateListener(update_listener);
}
public void dispose() {
- ((TreeModelViewer)getViewer()).removeViewerUpdateListener(update_listener);
model.onProxyDisposed(this);
super.dispose();
}
void addDelta(TCFNode node, int flags) {
- Integer delta = deltas.get(node);
- if (delta != null) {
- deltas.put(node, Integer.valueOf(delta.intValue() | flags));
- }
- else {
- deltas.put(node, Integer.valueOf(flags));
+ if (flags != 0) {
+ Integer delta = deltas.get(node);
+ if (delta != null) {
+ deltas.put(node, Integer.valueOf(delta.intValue() | flags));
+ }
+ else {
+ deltas.put(node, Integer.valueOf(flags));
+ }
}
}
@@ -90,26 +61,21 @@ public class TCFModelProxy extends AbstractModelProxy implements IModelProxy {
return getViewer();
}
- boolean validateViewer(Runnable done) {
- assert Protocol.isDispatchThread();
- if (pending_deltas || updating) {
- wait_list.add(done);
- return false;
- }
- return true;
- }
-
private ModelDelta makeDelta(ModelDelta root, Map<TCFNode,ModelDelta> map, TCFNode node, int flags) {
+ boolean content_only = (flags & ~CONTENT_FLAGS) == 0;
ModelDelta delta = map.get(node);
if (delta == null) {
if (node.parent == null) {
+ if (content_only && (root.getFlags() & IModelDelta.CONTENT) != 0) return null;
delta = root.addNode(model.getLaunch(), flags);
- map.put(node, delta);
}
else {
- delta = makeDelta(root, map, node.parent, 0).addNode(node, flags);
- map.put(node, delta);
+ ModelDelta parent = makeDelta(root, map, node.parent, 0);
+ if (parent == null) return null;
+ if (content_only && (parent.getFlags() & IModelDelta.CONTENT) != 0) return null;
+ delta = parent.addNode(node, flags);
}
+ map.put(node, delta);
}
else if (flags != 0) {
delta.setFlags(delta.getFlags() | flags);
@@ -123,12 +89,10 @@ public class TCFModelProxy extends AbstractModelProxy implements IModelProxy {
ModelDelta root = new ModelDelta(DebugPlugin.getDefault().getLaunchManager(), IModelDelta.NO_CHANGE);
Map<TCFNode,ModelDelta> map = new HashMap<TCFNode,ModelDelta>();
for (TCFNode node : deltas.keySet()) {
- if (node.disposed) continue;
makeDelta(root, map, node, deltas.get(node).intValue());
}
deltas.clear();
if (map.isEmpty()) return;
fireModelChanged(root);
- pending_deltas = true;
}
}
diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNode.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNode.java
index e9125e834..fe4855b5d 100644
--- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNode.java
+++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNode.java
@@ -298,7 +298,7 @@ public abstract class TCFNode extends PlatformObject implements Comparable<TCFNo
* @return bit set of model delta flags
*/
int getRelevantModelDeltaFlags(IPresentationContext p) {
- return IModelDelta.CONTENT | IModelDelta.STATE;
+ return IModelDelta.CONTENT | IModelDelta.STATE | IModelDelta.ADDED | IModelDelta.REMOVED;
}
/*--------------------------------------------------------------------------------------*/
diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeExecContext.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeExecContext.java
index 503db2851..0381cdbfb 100644
--- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeExecContext.java
+++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeExecContext.java
@@ -36,6 +36,8 @@ import org.eclipse.tm.tcf.util.TCFDataCache;
@SuppressWarnings("serial")
public class TCFNodeExecContext extends TCFNode {
+ private final int seq_no;
+
private final TCFChildrenExecContext children_exec;
private final TCFChildrenStackTrace children_stack;
private final TCFChildrenRegisters children_regs;
@@ -47,9 +49,12 @@ public class TCFNodeExecContext extends TCFNode {
private final Map<BigInteger,TCFSourceRef> line_info_cache;
private int resumed_cnt;
+
+ private static int seq_cnt;
TCFNodeExecContext(TCFNode parent, final String id) {
super(parent, id);
+ seq_no = seq_cnt++;
children_exec = new TCFChildrenExecContext(this);
children_stack = new TCFChildrenStackTrace(this);
children_regs = new TCFChildrenRegisters(this);
@@ -329,7 +334,7 @@ public class TCFNodeExecContext extends TCFNode {
assert !disposed;
resumed_cnt++;
dispose();
- parent.addModelDelta(IModelDelta.CONTENT);
+ addModelDelta(IModelDelta.REMOVED);
}
void onContainerSuspended() {
@@ -522,4 +527,14 @@ public class TCFNodeExecContext extends TCFNode {
}
return super.getImageName();
}
+
+ @Override
+ public int compareTo(TCFNode n) {
+ if (n instanceof TCFNodeExecContext) {
+ TCFNodeExecContext f = (TCFNodeExecContext)n;
+ if (seq_no < f.seq_no) return -1;
+ if (seq_no > f.seq_no) return +1;
+ }
+ return id.compareTo(n.id);
+ }
}
diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeRegister.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeRegister.java
index 9b98d772b..a9ee3691e 100644
--- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeRegister.java
+++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFNodeRegister.java
@@ -186,7 +186,7 @@ public class TCFNodeRegister extends TCFNode {
int getRelevantModelDeltaFlags(IPresentationContext p) {
if (IDebugUIConstants.ID_REGISTER_VIEW.equals(p.getId())) {
- return IModelDelta.CONTENT | IModelDelta.STATE;
+ return super.getRelevantModelDeltaFlags(p);
}
return 0;
}

Back to the top