diff options
author | eutarass | 2008-07-10 19:17:06 +0000 |
---|---|---|
committer | eutarass | 2008-07-10 19:17:06 +0000 |
commit | 0910b26b9db91a708798c9078d22dd7ea62a9971 (patch) | |
tree | b9b2ba97da52fa948291281b536fa5a50eea4ac7 /plugins | |
parent | 907f2821b2c9d380b40e2efa506b06b70cfa9d87 (diff) | |
download | org.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')
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; } |