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 224477
Collapse All | Expand All

(-)ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java (-12 / +39 lines)
Lines 12-17 Link Here
12
package org.eclipse.debug.internal.ui.views.launch;
12
package org.eclipse.debug.internal.ui.views.launch;
13
13
14
14
15
import java.util.ArrayList;
15
import java.util.Iterator;
16
import java.util.Iterator;
16
17
17
import org.eclipse.core.runtime.IAdaptable;
18
import org.eclipse.core.runtime.IAdaptable;
Lines 75-82 Link Here
75
import org.eclipse.jface.viewers.ISelection;
76
import org.eclipse.jface.viewers.ISelection;
76
import org.eclipse.jface.viewers.ISelectionChangedListener;
77
import org.eclipse.jface.viewers.ISelectionChangedListener;
77
import org.eclipse.jface.viewers.IStructuredSelection;
78
import org.eclipse.jface.viewers.IStructuredSelection;
79
import org.eclipse.jface.viewers.ITreeSelection;
78
import org.eclipse.jface.viewers.SelectionChangedEvent;
80
import org.eclipse.jface.viewers.SelectionChangedEvent;
79
import org.eclipse.jface.viewers.StructuredViewer;
81
import org.eclipse.jface.viewers.StructuredViewer;
82
import org.eclipse.jface.viewers.TreePath;
80
import org.eclipse.jface.viewers.TreeSelection;
83
import org.eclipse.jface.viewers.TreeSelection;
81
import org.eclipse.jface.viewers.Viewer;
84
import org.eclipse.jface.viewers.Viewer;
82
import org.eclipse.swt.SWT;
85
import org.eclipse.swt.SWT;
Lines 155-171 Link Here
155
		
158
		
156
		class Visitor implements IModelDeltaVisitor {
159
		class Visitor implements IModelDeltaVisitor {
157
			public boolean visit(IModelDelta delta, int depth) {
160
			public boolean visit(IModelDelta delta, int depth) {
158
				Object element = delta.getElement();
159
				if ((delta.getFlags() & (IModelDelta.STATE | IModelDelta.CONTENT)) > 0) {
161
				if ((delta.getFlags() & (IModelDelta.STATE | IModelDelta.CONTENT)) > 0) {
160
					// state and/or content change
162
					// state and/or content change
161
					if ((delta.getFlags() & IModelDelta.SELECT) == 0) {
163
					if ((delta.getFlags() & IModelDelta.SELECT) == 0) {
162
						// no select flag
164
						// no select flag
163
						if ((delta.getFlags() & IModelDelta.CONTENT) > 0) {
165
						if ((delta.getFlags() & IModelDelta.CONTENT) > 0) {
164
							// content has changed without select >> possible re-activation
166
							// content has changed without select >> possible re-activation
165
							possibleChange(element, DebugContextEvent.ACTIVATED);
167
							possibleChange(getViewerTreePath(delta), DebugContextEvent.ACTIVATED);
166
						} else if ((delta.getFlags() & IModelDelta.STATE) > 0) {
168
						} else if ((delta.getFlags() & IModelDelta.STATE) > 0) {
167
							// state has changed without select >> possible state change of active context
169
							// state has changed without select >> possible state change of active context
168
							possibleChange(element, DebugContextEvent.STATE);
170
							possibleChange(getViewerTreePath(delta), DebugContextEvent.STATE);
169
						}
171
						}
170
					}
172
					}
171
				}
173
				}
Lines 173-178 Link Here
173
			}	
175
			}	
174
		}
176
		}
175
		
177
		
178
		/**
179
		 * Returns a tree path for the node, *not* including the root element.
180
		 * 
181
		 * @param node
182
		 *            model delta
183
		 * @return corresponding tree path
184
		 */
185
		private TreePath getViewerTreePath(IModelDelta node) {
186
			ArrayList list = new ArrayList();
187
			IModelDelta parentDelta = node.getParentDelta();
188
			while (parentDelta != null) {
189
				list.add(0, node.getElement());
190
				node = parentDelta;
191
				parentDelta = node.getParentDelta();
192
			}
193
			return new TreePath(list.toArray());
194
		}
195
		
176
		public ContextProvider(TreeModelViewer viewer) {
196
		public ContextProvider(TreeModelViewer viewer) {
177
			super(LaunchView.this);
197
			super(LaunchView.this);
178
			fViewer = viewer;
198
			fViewer = viewer;
Lines 198-215 Link Here
198
			fire(new DebugContextEvent(this, selection, DebugContextEvent.ACTIVATED));
218
			fire(new DebugContextEvent(this, selection, DebugContextEvent.ACTIVATED));
199
		}
219
		}
200
		
220
		
201
		protected void possibleChange(Object element, int type) {
221
		protected void possibleChange(TreePath element, int type) {
202
			DebugContextEvent event = null;
222
			DebugContextEvent event = null;
203
			synchronized (this) {
223
			synchronized (this) {
204
				if (fContext instanceof IStructuredSelection) {
224
				if (fContext instanceof ITreeSelection) {
205
					IStructuredSelection ss = (IStructuredSelection) fContext;
225
					ITreeSelection ss = (ITreeSelection) fContext;
206
					if (!(ss.size() == 1 && ss.getFirstElement().equals(element))) {
226
					if (ss.size() == 1) {
207
						return;
227
						TreePath current = ss.getPaths()[0];
228
						if (current.startsWith(element, null)) {
229
							if (type == DebugContextEvent.STATE || current.getSegmentCount() == element.getSegmentCount()) {
230
								// update when a parent of the selected child changes state OR when
231
								// the change is for the current context
232
								event = new DebugContextEvent(this, fContext, type);
233
							}
234
						}
208
					}
235
					}
209
				} else {
236
				} 
210
					return;
237
			}
211
				}
238
			if (event == null) {
212
				event = new DebugContextEvent(this, fContext, type);
239
				return;
213
			}
240
			}
214
			if (getControl().getDisplay().getThread() == Thread.currentThread()) {
241
			if (getControl().getDisplay().getThread() == Thread.currentThread()) {
215
				fire(event);
242
				fire(event);

Return to bug 224477