Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 389197 | Differences between
and this patch

Collapse All | Expand All

(-)a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFModel.java (-8 / +9 lines)
Lines 40-46 import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension; Link Here
40
import org.eclipse.debug.core.model.ISourceLocator;
40
import org.eclipse.debug.core.model.ISourceLocator;
41
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
41
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
42
import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant;
42
import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant;
43
import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer;
44
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
43
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
45
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
44
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
46
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
45
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
Lines 58-63 import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactor Link Here
58
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy;
57
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy;
59
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
58
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
60
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
59
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
60
import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer;
61
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
61
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
62
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate;
62
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate;
63
import org.eclipse.debug.ui.DebugUITools;
63
import org.eclipse.debug.ui.DebugUITools;
Lines 86-93 import org.eclipse.swt.widgets.MessageBox; Link Here
86
import org.eclipse.swt.widgets.Shell;
86
import org.eclipse.swt.widgets.Shell;
87
import org.eclipse.tcf.core.Command;
87
import org.eclipse.tcf.core.Command;
88
import org.eclipse.tcf.debug.ui.ITCFModel;
88
import org.eclipse.tcf.debug.ui.ITCFModel;
89
import org.eclipse.tcf.debug.ui.ITCFSourceDisplay;
90
import org.eclipse.tcf.debug.ui.ITCFPresentationProvider;
89
import org.eclipse.tcf.debug.ui.ITCFPresentationProvider;
90
import org.eclipse.tcf.debug.ui.ITCFSourceDisplay;
91
import org.eclipse.tcf.internal.debug.actions.TCFAction;
91
import org.eclipse.tcf.internal.debug.actions.TCFAction;
92
import org.eclipse.tcf.internal.debug.launch.TCFSourceLookupDirector;
92
import org.eclipse.tcf.internal.debug.launch.TCFSourceLookupDirector;
93
import org.eclipse.tcf.internal.debug.launch.TCFSourceLookupParticipant;
93
import org.eclipse.tcf.internal.debug.launch.TCFSourceLookupParticipant;
Lines 158-164 public class TCFModel implements ITCFModel, IElementContentProvider, IElementLab Link Here
158
        UPDATE_POLICY_MANUAL     = 1,
158
        UPDATE_POLICY_MANUAL     = 1,
159
        UPDATE_POLICY_BREAKPOINT = 2;
159
        UPDATE_POLICY_BREAKPOINT = 2;
160
160
161
    /**
161
   /**
162
     * A dummy editor input to open the disassembly view as editor.
162
     * A dummy editor input to open the disassembly view as editor.
163
     */
163
     */
164
    public static class DisassemblyEditorInput implements IEditorInput {
164
    public static class DisassemblyEditorInput implements IEditorInput {
Lines 295-302 public class TCFModel implements ITCFModel, IElementContentProvider, IElementLab Link Here
295
295
296
    private final Map<String,Object> context_map = new HashMap<String,Object>();
296
    private final Map<String,Object> context_map = new HashMap<String,Object>();
297
297
298
    private final Set<String> expanded_nodes = new HashSet<String>();
299
300
    private final Map<IWorkbenchPart,TCFNode> pins = new HashMap<IWorkbenchPart,TCFNode>();
298
    private final Map<IWorkbenchPart,TCFNode> pins = new HashMap<IWorkbenchPart,TCFNode>();
301
    private final Map<IWorkbenchPart,TCFSnapshot> locks = new HashMap<IWorkbenchPart,TCFSnapshot>();
299
    private final Map<IWorkbenchPart,TCFSnapshot> locks = new HashMap<IWorkbenchPart,TCFSnapshot>();
302
    private final Map<IWorkbenchPart,Integer> lock_policy = new HashMap<IWorkbenchPart,Integer>();
300
    private final Map<IWorkbenchPart,Integer> lock_policy = new HashMap<IWorkbenchPart,Integer>();
Lines 914-920 public class TCFModel implements ITCFModel, IElementContentProvider, IElementLab Link Here
914
            action_results.remove(id);
912
            action_results.remove(id);
915
            Object o = context_map.remove(id);
913
            Object o = context_map.remove(id);
916
            if (o instanceof CreateNodeRunnable) ((CreateNodeRunnable)o).onContextRemoved();
914
            if (o instanceof CreateNodeRunnable) ((CreateNodeRunnable)o).onContextRemoved();
917
            expanded_nodes.remove(id);
915
            for (TCFModelProxy proxy : model_proxies.values()) {
916
                proxy.clearAutoExpandStack(id);
917
            }
918
            
918
            if (mem_blocks_update != null) mem_blocks_update.changeset.remove(id);
919
            if (mem_blocks_update != null) mem_blocks_update.changeset.remove(id);
919
        }
920
        }
920
921
Lines 1529-1542 public class TCFModel implements ITCFModel, IElementContentProvider, IElementLab Link Here
1529
        if (node.isDisposed()) return;
1530
        if (node.isDisposed()) return;
1530
        runSuspendTrigger(node);
1531
        runSuspendTrigger(node);
1531
        if (reason == null) return;
1532
        if (reason == null) return;
1532
        if (reason.equals(IRunControl.REASON_USER_REQUEST)) return;
1533
        for (TCFModelProxy proxy : model_proxies.values()) {
1533
        for (TCFModelProxy proxy : model_proxies.values()) {
1534
            if (proxy.getPresentationContext().getId().equals(IDebugUIConstants.ID_DEBUG_VIEW)) {
1534
            if (proxy.getPresentationContext().getId().equals(IDebugUIConstants.ID_DEBUG_VIEW)) {
1535
                if (proxy.getAutoExpandStack(node.id)) proxy.expand(node);
1536
                if (reason.equals(IRunControl.REASON_USER_REQUEST)) continue;
1535
                proxy.setSelection(node);
1537
                proxy.setSelection(node);
1536
                if (reason.equals(IRunControl.REASON_STEP)) continue;
1538
                if (reason.equals(IRunControl.REASON_STEP)) continue;
1537
                if (reason.equals(IRunControl.REASON_CONTAINER)) continue;
1539
                if (reason.equals(IRunControl.REASON_CONTAINER)) continue;
1538
                if (delay_stack_update_until_last_step && launch.getContextActionsCount(node.id) != 0) continue;
1540
                if (delay_stack_update_until_last_step && launch.getContextActionsCount(node.id) != 0) continue;
1539
                if (expanded_nodes.add(node.id)) proxy.expand(node);
1540
            }
1541
            }
1541
            if (reason.equals(IRunControl.REASON_BREAKPOINT)) {
1542
            if (reason.equals(IRunControl.REASON_BREAKPOINT)) {
1542
                IWorkbenchPart part = proxy.getPresentationContext().getPart();
1543
                IWorkbenchPart part = proxy.getPresentationContext().getPart();
(-)a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFModelProxy.java (-12 / +63 lines)
Lines 17-26 import java.util.HashSet; Link Here
17
import java.util.LinkedList;
17
import java.util.LinkedList;
18
import java.util.Map;
18
import java.util.Map;
19
import java.util.Set;
19
import java.util.Set;
20
import java.util.TreeMap;
20
21
21
import org.eclipse.core.runtime.IStatus;
22
import org.eclipse.core.runtime.IStatus;
22
import org.eclipse.debug.internal.ui.viewers.model.InternalTreeModelViewer;
23
import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer;
23
import org.eclipse.debug.internal.ui.viewers.model.InternalVirtualTreeModelViewer;
24
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
24
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
25
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
25
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
26
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
26
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
Lines 32-38 import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateList Link Here
32
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
32
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
33
import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
33
import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
34
import org.eclipse.debug.ui.IDebugUIConstants;
34
import org.eclipse.debug.ui.IDebugUIConstants;
35
import org.eclipse.jface.viewers.ITreeViewerListener;
36
import org.eclipse.jface.viewers.TreeExpansionEvent;
35
import org.eclipse.jface.viewers.TreePath;
37
import org.eclipse.jface.viewers.TreePath;
38
import org.eclipse.jface.viewers.TreeViewer;
36
import org.eclipse.swt.graphics.Device;
39
import org.eclipse.swt.graphics.Device;
37
import org.eclipse.swt.widgets.Display;
40
import org.eclipse.swt.widgets.Display;
38
import org.eclipse.tcf.internal.debug.model.TCFLaunch;
41
import org.eclipse.tcf.internal.debug.model.TCFLaunch;
Lines 44-50 import org.eclipse.tcf.protocol.Protocol; Link Here
44
 * Model proxy listeners are debuggers views.
47
 * Model proxy listeners are debuggers views.
45
 */
48
 */
46
@SuppressWarnings("restriction")
49
@SuppressWarnings("restriction")
47
public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Runnable {
50
public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Runnable, ITreeViewerListener {
48
51
49
    private static final TCFNode[] EMPTY_NODE_ARRAY = new TCFNode[0];
52
    private static final TCFNode[] EMPTY_NODE_ARRAY = new TCFNode[0];
50
53
Lines 67-72 public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru Link Here
67
    private boolean enable_auto_expand;
70
    private boolean enable_auto_expand;
68
    private Set<TCFNode> auto_expand_removed_nodes;
71
    private Set<TCFNode> auto_expand_removed_nodes;
69
    private Set<TCFNode> auto_expand_created_nodes;
72
    private Set<TCFNode> auto_expand_created_nodes;
73
    private Map<String, Boolean> auto_expand_user_nodes = new TreeMap<String, Boolean>();
70
74
71
    private final Runnable timer = new Runnable() {
75
    private final Runnable timer = new Runnable() {
72
76
Lines 200-207 public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru Link Here
200
        super.initialize(viewer);
204
        super.initialize(viewer);
201
        enable_auto_expand =
205
        enable_auto_expand =
202
                IDebugUIConstants.ID_DEBUG_VIEW.equals(getPresentationContext().getId()) &&
206
                IDebugUIConstants.ID_DEBUG_VIEW.equals(getPresentationContext().getId()) &&
203
                viewer instanceof InternalTreeModelViewer;
207
                viewer instanceof IInternalTreeModelViewer;
204
        viewer.addViewerUpdateListener(update_listener);
208
        viewer.addViewerUpdateListener(update_listener);
209
        if (viewer instanceof TreeViewer) {
210
            ((TreeViewer)viewer).addTreeListener(this);
211
        }
205
        Protocol.invokeAndWait(new Runnable() {
212
        Protocol.invokeAndWait(new Runnable() {
206
            public void run() {
213
            public void run() {
207
                assert !installed;
214
                assert !installed;
Lines 226-231 public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru Link Here
226
            }
233
            }
227
        });
234
        });
228
        viewer.removeViewerUpdateListener(update_listener);
235
        viewer.removeViewerUpdateListener(update_listener);
236
        if (viewer instanceof TreeViewer) {
237
            ((TreeViewer)viewer).removeTreeListener(this);
238
        }
229
        super.dispose();
239
        super.dispose();
230
    }
240
    }
231
241
Lines 281-286 public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru Link Here
281
    }
291
    }
282
292
283
    /**
293
    /**
294
     * Returns true if stack trace should be expanded upon a suspended event.
295
     */
296
    boolean getAutoExpandStack(String id) {
297
        Boolean expand = auto_expand_user_nodes.get(id);
298
        if (expand == null) {
299
            expand = Boolean.TRUE;
300
            auto_expand_user_nodes.put(id, expand);
301
        }
302
        return expand;
303
    }
304
    
305
    /**
306
     * Returns true if stack trace should be expanded upon a suspended event.
307
     */
308
    void clearAutoExpandStack(String id) {
309
        auto_expand_user_nodes.remove(id) ;
310
    }
311
    
312
    /**
284
     * Get current value of the view input.
313
     * Get current value of the view input.
285
     * @return view input object.
314
     * @return view input object.
286
     */
315
     */
Lines 438-445 public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru Link Here
438
            asyncExec(new Runnable() {
467
            asyncExec(new Runnable() {
439
                public void run() {
468
                public void run() {
440
                    if (save_expand_state != null && save_expand_state.size() > 0) {
469
                    if (save_expand_state != null && save_expand_state.size() > 0) {
441
                        if (viewer instanceof InternalTreeModelViewer) {
470
                        if (viewer instanceof IInternalTreeModelViewer) {
442
                            InternalTreeModelViewer tree_viwer = (InternalTreeModelViewer)viewer;
471
                            IInternalTreeModelViewer tree_viwer = (IInternalTreeModelViewer)viewer;
443
                            final Set<String> expanded = new HashSet<String>();
472
                            final Set<String> expanded = new HashSet<String>();
444
                            for (TCFNode node : save_expand_state) {
473
                            for (TCFNode node : save_expand_state) {
445
                                if (tree_viwer.getExpandedState(node)) expanded.add(node.id);
474
                                if (tree_viwer.getExpandedState(node)) expanded.add(node.id);
Lines 471-481 public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru Link Here
471
                asyncExec(new Runnable() {
500
                asyncExec(new Runnable() {
472
                    boolean found;
501
                    boolean found;
473
                    public void run() {
502
                    public void run() {
474
                        if (viewer instanceof InternalTreeModelViewer) {
503
                        if (viewer instanceof IInternalTreeModelViewer) {
475
                            found = ((InternalTreeModelViewer)viewer).findElementIndex(TreePath.EMPTY, launch) >= 0;
504
                            found = ((IInternalTreeModelViewer)viewer).findElementIndex(TreePath.EMPTY, launch) >= 0;
476
                        }
477
                        else if (viewer instanceof InternalVirtualTreeModelViewer) {
478
                            found = ((InternalVirtualTreeModelViewer)viewer).findElementIndex(TreePath.EMPTY, launch) >= 0;
479
                        }
505
                        }
480
                        Protocol.invokeLater(new Runnable() {
506
                        Protocol.invokeLater(new Runnable() {
481
                            public void run() {
507
                            public void run() {
Lines 566-569 public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru Link Here
566
            launch.removePendingClient(this);
592
            launch.removePendingClient(this);
567
        }
593
        }
568
    }
594
    }
595
    
596
    @Override
597
    public void treeCollapsed(TreeExpansionEvent event) {
598
        updateExpandStack(event, false);
599
    }
600
    
601
    @Override
602
    public void treeExpanded(TreeExpansionEvent event) {
603
        updateExpandStack(event, true);
604
    }
605
    
606
    private void updateExpandStack(TreeExpansionEvent event, final boolean expand) {
607
        if (event.getElement() instanceof TCFNodeExecContext) {
608
            final TCFNodeExecContext node = (TCFNodeExecContext)event.getElement();
609
            if ( !model.equals(node.getModel()) ) return;
610
            Protocol.invokeLater(new Runnable() {
611
                @Override
612
                public void run() {
613
                    Boolean hasStack = node.getStackTrace().checkHasChildren(this);
614
                    if (Boolean.TRUE.equals(hasStack)) {
615
                        auto_expand_user_nodes.put(node.id, expand);
616
                    }
617
                }
618
            });
619
        }
620
    }
569
}
621
}
570
- 

Return to bug 389197