|
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); |