1
/*******************************************************************************
2
* Copyright (c) 2008, 2010 Wind River Systems and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Wind River Systems - initial API and implementation
10
*******************************************************************************/
11
package org.eclipse.cdt.dsf.debug.ui.viewmodel.breakpoints;
13
import java.util.Arrays;
14
import java.util.Comparator;
15
import java.util.List;
17
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
18
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
19
import org.eclipse.cdt.dsf.ui.concurrent.ViewerDataRequestMonitor;
20
import org.eclipse.cdt.dsf.ui.viewmodel.AbstractVMNode;
21
import org.eclipse.cdt.dsf.ui.viewmodel.ModelProxyInstalledEvent;
22
import org.eclipse.cdt.dsf.ui.viewmodel.VMChildrenUpdate;
23
import org.eclipse.cdt.dsf.ui.viewmodel.VMDelta;
24
import org.eclipse.debug.core.DebugPlugin;
25
import org.eclipse.debug.core.model.IBreakpoint;
26
import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointUIConstants;
27
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
28
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
29
import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
30
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
31
import org.eclipse.debug.ui.DebugUITools;
32
import org.eclipse.debug.ui.contexts.DebugContextEvent;
33
import org.eclipse.jface.util.PropertyChangeEvent;
34
import org.eclipse.jface.viewers.ISelection;
35
import org.eclipse.ui.IWorkbenchWindow;
38
* Base class for breakpoint VM Nodes. Concrete implementations must
39
* implement the breakpoint object to be populated into the view.
40
* Also this node only implements the content provider so sub-classes
41
* must also implement a label provider, element editor, etc.
45
public abstract class AbstractBreakpointVMNode extends AbstractVMNode {
47
public AbstractBreakpointVMNode(BreakpointVMProvider provider) {
52
* Class that creates the element object for the corresponding breakpoints.
53
* This element object will be populated in the breakpoitns view to represent
54
* the given breakpoint.
56
abstract protected Object createBreakpiontElement(IBreakpoint bp);
58
public void update(final IHasChildrenUpdate[] updates) {
59
for (final IHasChildrenUpdate update : updates) {
60
if (!checkUpdate(update)) continue;
61
((BreakpointVMProvider)getVMProvider()).getNestingCategoryBreakpoints(
62
update.getElementPath(),
63
new ViewerDataRequestMonitor<IBreakpoint[]>(getExecutor(), update) {
65
protected void handleCompleted() {
67
update.setHasChilren(getData().length != 0);
69
update.setHasChilren(false);
77
public void update(final IChildrenCountUpdate[] updates) {
78
for (final IChildrenCountUpdate update : updates) {
79
if (!checkUpdate(update)) continue;
80
((BreakpointVMProvider)getVMProvider()).getNestingCategoryBreakpoints(
81
update.getElementPath(),
82
new ViewerDataRequestMonitor<IBreakpoint[]>(getExecutor(), update) {
84
protected void handleCompleted() {
86
update.setChildCount(getData().length);
88
update.setChildCount(0);
96
public void update(IChildrenUpdate[] updates) {
97
for (final IChildrenUpdate update : updates) {
98
if (!checkUpdate(update)) continue;
99
((BreakpointVMProvider)getVMProvider()).getNestingCategoryBreakpoints(
100
update.getElementPath(),
101
new ViewerDataRequestMonitor<IBreakpoint[]>(getExecutor(), update) {
103
protected void handleCompleted() {
105
@SuppressWarnings("unchecked")
106
Comparator<Object> comparator =
107
(Comparator<Object>)getVMProvider().getPresentationContext().getProperty(
108
IBreakpointUIConstants.PROP_BREAKPOINTS_ELEMENT_COMPARATOR);
109
if (comparator != null) {
110
Arrays.sort(getData(), comparator);
112
fillUpdateWithBreakpointElements(update, getData());
120
private void fillUpdateWithBreakpointElements(IChildrenUpdate update, IBreakpoint[] bps) {
121
int updateIdx = update.getOffset() != -1 ? update.getOffset() : 0;
122
int endIdx = updateIdx + (update.getLength() != -1 ? update.getLength() : bps.length);
123
while (updateIdx < endIdx && updateIdx < bps.length) {
124
update.setChild(createBreakpiontElement(bps[updateIdx]), updateIdx);
129
public int getDeltaFlags(Object event) {
130
if (event instanceof BreakpointsChangedEvent) {
131
BreakpointsChangedEvent bpChangedEvent = ((BreakpointsChangedEvent)event);
132
if (BreakpointsChangedEvent.Type.ADDED.equals(bpChangedEvent.getType())) {
133
return IModelDelta.CONTENT | IModelDelta.SELECT | IModelDelta.EXPAND;
135
return IModelDelta.CONTENT;
137
else if (BreakpointVMProvider.isPresentationContextEvent(event)) {
138
PropertyChangeEvent propertyEvent = (PropertyChangeEvent)event;
139
if (IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION.equals(propertyEvent.getProperty()) ||
140
IBreakpointUIConstants.PROP_BREAKPOINTS_ELEMENT_COMPARATOR.equals(propertyEvent.getProperty()))
142
return IModelDelta.CONTENT;
143
} else if (IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS.equals(propertyEvent.getProperty())) {
144
return IModelDelta.EXPAND | IModelDelta.CONTENT;
145
} else if (IBreakpointUIConstants.PROP_BREAKPOINTS_TRACK_SELECTION.equals(propertyEvent.getProperty()) &&
146
Boolean.TRUE.equals(propertyEvent.getNewValue()) )
148
return IModelDelta.EXPAND | IModelDelta.SELECT;
151
else if (event instanceof DebugContextEvent && (((DebugContextEvent)event).getFlags() | DebugContextEvent.ACTIVATED) != 0) {
152
int flags = IModelDelta.NO_CHANGE;
153
if ( Boolean.TRUE.equals(getVMProvider().getPresentationContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION)) ) {
154
flags |= IModelDelta.CONTENT;
156
if (Boolean.TRUE.equals(getVMProvider().getPresentationContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_TRACK_SELECTION)) ) {
157
flags |= IModelDelta.EXPAND | IModelDelta.SELECT;
160
} else if (event instanceof ModelProxyInstalledEvent) {
161
// Upon model proxy installed, check whether we need to select a
162
// breakpoint in linking with Debug view
163
if (Boolean.TRUE.equals(getVMProvider().getPresentationContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_TRACK_SELECTION)) ) {
164
return IModelDelta.EXPAND | IModelDelta.SELECT;
170
public void buildDelta(Object event, VMDelta parent, int nodeOffset, RequestMonitor rm) {
171
if (event instanceof BreakpointsChangedEvent) {
172
BreakpointsChangedEvent bpChangedEvent = ((BreakpointsChangedEvent)event);
173
if (BreakpointsChangedEvent.Type.ADDED.equals(bpChangedEvent.getType())) {
174
buildBreakpointAddedDelta(bpChangedEvent, parent, nodeOffset, rm);
175
// Do not call rm.done() in this method!
178
parent.setFlags(parent.getFlags() | IModelDelta.CONTENT);
181
else if (BreakpointVMProvider.isPresentationContextEvent(event)) {
182
PropertyChangeEvent propertyEvent = (PropertyChangeEvent)event;
183
if (IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION.equals(propertyEvent.getProperty()) ||
184
IBreakpointUIConstants.PROP_BREAKPOINTS_ELEMENT_COMPARATOR.equals(propertyEvent.getProperty()))
186
parent.setFlags(parent.getFlags() | IModelDelta.CONTENT);
187
} else if (IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS.equals(propertyEvent.getProperty())) {
188
parent.setFlags(parent.getFlags() | IModelDelta.EXPAND | IModelDelta.CONTENT);
189
} else if (IBreakpointUIConstants.PROP_BREAKPOINTS_TRACK_SELECTION.equals(propertyEvent.getProperty()) &&
190
Boolean.TRUE.equals(propertyEvent.getNewValue()) )
192
IWorkbenchWindow window = getVMProvider().getPresentationContext().getWindow();
193
if (window != null) {
194
ISelection activeContext = DebugUITools.getDebugContextManager().getContextService(window).getActiveContext();
195
buildTrackSelectionDelta(activeContext, parent, nodeOffset, rm);
196
// Do not call rm.done() in this method!
201
else if (event instanceof DebugContextEvent && (((DebugContextEvent)event).getFlags() | DebugContextEvent.ACTIVATED) != 0) {
202
if ( Boolean.TRUE.equals(getVMProvider().getPresentationContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION)) ) {
203
parent.setFlags(parent.getFlags() | IModelDelta.CONTENT);
205
if (Boolean.TRUE.equals(getVMProvider().getPresentationContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_TRACK_SELECTION)) ) {
206
buildTrackSelectionDelta(((DebugContextEvent)event).getContext(), parent, nodeOffset, rm);
207
// Do not call rm.done() in this method!
210
} else if (event instanceof ModelProxyInstalledEvent) {
211
if (Boolean.TRUE.equals(getVMProvider().getPresentationContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_TRACK_SELECTION)) ) {
212
IWorkbenchWindow window = getVMProvider().getPresentationContext().getWindow();
213
if (window != null) {
214
ISelection activeContext = DebugUITools.getDebugContextManager().getContextService(window).getActiveContext();
215
buildTrackSelectionDelta(activeContext, parent, nodeOffset, rm);
224
private void buildBreakpointAddedDelta(final BreakpointsChangedEvent event, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) {
225
getVMProvider().updateNode(this, new VMChildrenUpdate(
226
parent, getVMProvider().getPresentationContext(), -1, -1,
227
new DataRequestMonitor<List<Object>>(getExecutor(), rm) {
229
protected void handleSuccess() {
230
for (int i = 0; i < event.getBreakpoints().length; i++) {
231
IBreakpoint eventBp = event.getBreakpoints()[i];
232
int bpIndex = findBreakpointIndex(eventBp, getData());
234
// Select only the first breakpoint that was added
236
parent.addNode(getData().get(bpIndex), bpIndex, IModelDelta.SELECT);
238
// For all other added breakpoints, expand the parent.
239
parent.setFlags(parent.getFlags() | IModelDelta.CONTENT | IModelDelta.EXPAND);
247
protected void buildTrackSelectionDelta(ISelection debugContext, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) {
248
assert getVMProvider() instanceof BreakpointVMProvider;
250
((BreakpointVMProvider)getVMProvider()).getBreakpointsForDebugContext(
252
new DataRequestMonitor<IBreakpoint[]>(getExecutor(), rm) {
254
protected void handleSuccess() {
255
if (getData().length == 0) {
256
// No breakpoints to select, we're done.
260
final IBreakpoint[] bpsToSelect = getData();
262
getVMProvider().updateNode(AbstractBreakpointVMNode.this, new VMChildrenUpdate(
263
parent, getVMProvider().getPresentationContext(), -1, -1,
264
new DataRequestMonitor<List<Object>>(getExecutor(), rm) {
266
protected void handleSuccess() {
267
for (int i = 0; i < bpsToSelect.length; i++) {
268
int bpIndex = findBreakpointIndex(bpsToSelect[i], getData());
270
// Select only the first breakpoint that was added
272
parent.addNode(getData().get(bpIndex), bpIndex, IModelDelta.SELECT);
274
// For all other added breakpoints, expand the parent.
275
parent.setFlags(parent.getFlags() | IModelDelta.EXPAND);
284
protected void handleErrorOrWarning() {
290
private int findBreakpointIndex(IBreakpoint bp, List<Object> bpElements) {
291
for (int j = 0; j < bpElements.size(); j++) {
292
IBreakpoint elementBp = (IBreakpoint)DebugPlugin.getAdapter(bpElements.get(j), IBreakpoint.class);
293
if (elementBp != null && elementBp.equals(bp)) {