Merged fix for bug 295771 from HEAD.
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java index 1d0816d..9c37e61 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java
@@ -68,6 +68,7 @@ fViewer.removeLabelUpdateListener(fListener); fViewer.removeViewerUpdateListener(fListener); fViewer.removeModelChangedListener(fListener); + fViewer.getPresentationContext().dispose(); // Close the shell and exit. fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java index b5eb53f..339a319 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java
@@ -65,6 +65,7 @@ fViewer.removeLabelUpdateListener(fListener); fViewer.removeViewerUpdateListener(fListener); fViewer.removeModelChangedListener(fListener); + fViewer.getPresentationContext().dispose(); // Close the shell and exit. fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java index 5f68862..887a1ff 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java
@@ -71,6 +71,7 @@ fViewer.removeLabelUpdateListener(fListener); fViewer.removeViewerUpdateListener(fListener); fViewer.removeModelChangedListener(fListener); + fViewer.getPresentationContext().dispose(); // Close the shell and exit. fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java index f4c0786..9da1d4b 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java
@@ -66,6 +66,7 @@ fViewer.removeLabelUpdateListener(fListener); fViewer.removeViewerUpdateListener(fListener); fViewer.removeModelChangedListener(fListener); + fViewer.getPresentationContext().dispose(); // Close the shell and exit. fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PresentationContextTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PresentationContextTests.java index 8e50289..7e4d2d2 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PresentationContextTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PresentationContextTests.java
@@ -48,6 +48,7 @@ assertEquals("Wrong value restored", new Integer(1), context.getProperty("integer")); assertEquals("Wrong value restored", new Boolean(true), context.getProperty("boolean")); assertEquals("Wrong value restored", ResourcesPlugin.getWorkspace().getRoot(), context.getProperty("persistable")); + context.dispose(); } }
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java index aa11554..b6f725b 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java
@@ -69,6 +69,7 @@ fViewer.removeLabelUpdateListener(fListener); fViewer.removeViewerUpdateListener(fListener); fViewer.removeModelChangedListener(fListener); + fViewer.getPresentationContext().dispose(); // Close the shell and exit. fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java index 0044ac1..159327e 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java
@@ -71,6 +71,7 @@ fViewer.removeViewerUpdateListener(fListener); fViewer.removeModelChangedListener(fListener); fViewer.addStateUpdateListener(fListener); + fViewer.getPresentationContext().dispose(); // Close the shell and exit. fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java index eff52f4..7b981af 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java
@@ -66,6 +66,7 @@ fViewer.removeLabelUpdateListener(fListener); fViewer.removeViewerUpdateListener(fListener); fViewer.removeModelChangedListener(fListener); + fViewer.getPresentationContext().dispose(); // Close the shell and exit. fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java index 6afa8f6..93ec934 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java
@@ -68,6 +68,7 @@ fViewer.removeLabelUpdateListener(fListener); fViewer.removeViewerUpdateListener(fListener); fViewer.removeModelChangedListener(fListener); + fViewer.getPresentationContext().dispose(); // Close the shell and exit. fShell.close();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java index e031944..4262489 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java
@@ -11,10 +11,17 @@ *******************************************************************************/ package org.eclipse.debug.internal.ui.actions.breakpoints; +import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +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.VirtualTreeModelViewer; import org.eclipse.debug.ui.AbstractDebugView; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.TreePath; +import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IViewActionDelegate; import org.eclipse.ui.IViewPart; @@ -24,6 +31,8 @@ public class BreakpointsExpandAllAction implements IViewActionDelegate { private AbstractDebugView fView; + + private boolean fFinishedExpanding; /* (non-Javadoc) * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart) @@ -36,7 +45,34 @@ * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) */ public void run(IAction action) { - ((TreeViewer) fView.getViewer()).expandAll(); + Display display = fView.getSite().getShell().getDisplay(); + + VirtualTreeModelViewer virtualViewer = new VirtualTreeModelViewer( + display, 0, ((ITreeModelViewer)fView.getViewer()).getPresentationContext()); + + fFinishedExpanding = false; + virtualViewer.setAutoExpandLevel(-1); + virtualViewer.addViewerUpdateListener(new IViewerUpdateListener() { + public void viewerUpdatesComplete() { + fFinishedExpanding = true; + } + + public void viewerUpdatesBegin() {} + public void updateStarted(IViewerUpdate update) {} + public void updateComplete(IViewerUpdate update) {} + }); + + virtualViewer.setInput(fView.getViewer().getInput()); + + while (!fFinishedExpanding) { + if (!display.readAndDispatch ()) display.sleep (); + } + + ModelDelta stateDelta = new ModelDelta(virtualViewer.getInput(), IModelDelta.NO_CHANGE); + virtualViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.EXPAND); + ((ITreeModelViewer) fView.getViewer()).updateViewer(stateDelta); + + virtualViewer.dispose(); } /* (non-Javadoc)
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AbstractBreakpointManagerInput.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AbstractBreakpointManagerInput.java index c178e78..148a03b 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AbstractBreakpointManagerInput.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AbstractBreakpointManagerInput.java
@@ -23,7 +23,7 @@ /** * The presentation context of the breakpoints view. */ - final protected IPresentationContext fContext; + final private IPresentationContext fContext; /** * Constructor.
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultBreakpointManagerInput.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultBreakpointManagerInput.java index ee19e43..ae0ab52 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultBreakpointManagerInput.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultBreakpointManagerInput.java
@@ -34,8 +34,8 @@ * @see java.lang.Object#hashCode() */ public int hashCode() { - if (fContext != null) { - return fContext.hashCode(); + if (getContext() != null) { + return getContext().hashCode(); } else { return 1; } @@ -48,9 +48,9 @@ public boolean equals(Object arg0) { if ( (arg0 != null) && arg0.getClass().equals(this.getClass()) ) { - IPresentationContext context = ((DefaultBreakpointManagerInput) arg0).fContext; - if (fContext != null && context != null) - return fContext.equals(context); + IPresentationContext context = ((DefaultBreakpointManagerInput) arg0).getContext(); + if (getContext() != null && context != null) + return getContext().equals(context); } return super.equals(arg0);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java index cacf33d..b37edca 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java
@@ -1875,6 +1875,10 @@ fTableViewer.dispose(); } + if (fPresentationContext != null) { + fPresentationContext.dispose(); + } + if (!fToolTipShell.isDisposed()) { fToolTipShell.dispose();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/AbstractBreakpointManagerContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/AbstractBreakpointManagerContentProvider.java index f761227..dbfeb3a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/AbstractBreakpointManagerContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/AbstractBreakpointManagerContentProvider.java
@@ -12,15 +12,16 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IMarkerDelta; -import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.debug.core.DebugPlugin; @@ -29,6 +30,7 @@ import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer; +import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointUIConstants; import org.eclipse.debug.internal.ui.elements.adapters.AbstractBreakpointManagerInput; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; @@ -37,9 +39,9 @@ import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy; import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer; import org.eclipse.debug.internal.ui.views.breakpoints.ElementComparator; -import org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointFilterListener; -import org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizerListener; import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.IStructuredSelection; /** @@ -48,43 +50,36 @@ * @since 3.6 */ public abstract class AbstractBreakpointManagerContentProvider extends ElementContentProvider - implements IBreakpointFilterListener, IBreakpointOrganizerListener, IBreakpointsListener { + implements IBreakpointsListener { /** * Breakpoint input data. Contains all input specific data. * * @since 3.6 */ - protected class InputData { + private class InputData { /** * Breakpoint manager input */ - AbstractBreakpointManagerInput fInput; + private AbstractBreakpointManagerInput fInput; /** * Model proxy of the input */ - AbstractModelProxy fProxy; - - /** - * Selection filter, will be use to provide debug context filtering - */ - IStructuredSelection fSelectionFilter; + private List/*<AbstractModelProxy>*/ fProxies = new ArrayList(1); /** * Element comparator, use to compare the ordering of elements for the model + * <br/> Note: We assume that the comparator does not change. */ - ElementComparator fComparator; + private ElementComparator fComparator; /** - * A list of breakpoint organizers + * The breakpoint root container.<br/> + * Note: The final qualifier guarantees that fContainer will be + * initialized before the class is accessed on other threads. */ - IBreakpointOrganizer[] fOrganizers; - - /** - * The breakpoint root container - */ - BreakpointContainer fContainer; + final private BreakpointContainer fContainer; /** * Constructor @@ -94,58 +89,172 @@ * @param filter the debug context selection * @param comparator the element comparator */ - InputData(AbstractBreakpointManagerInput input, AbstractModelProxy proxy, IStructuredSelection filter, ElementComparator comparator) { + InputData(AbstractBreakpointManagerInput input) { fInput = input; - fProxy = proxy; - fSelectionFilter = filter; - fComparator = comparator; + fProxies = new ArrayList(1); + fComparator = (ElementComparator) + input.getContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ELEMENT_COMPARATOR); + + IBreakpointOrganizer[] organizers = (IBreakpointOrganizer[]) + input.getContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS); + + // Create the initial container. + ModelDelta initialDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1); + fContainer = createRootContainer(initialDelta, fInput, organizers, fBpManager); } + synchronized void proxyInstalled(AbstractModelProxy proxy) { + fProxies.add(proxy); + + // Generate an install delta + + ModelDelta rootDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1); + buildInstallDelta(rootDelta, fContainer); + proxy.fireModelChanged(rootDelta); + } + + synchronized void proxyDisposed(AbstractModelProxy proxy) { + fProxies.remove(proxy); + } + /** * Change the breakpoint organizers for the root container. * * @param organizers the new organizers. */ synchronized void setOrganizers(IBreakpointOrganizer[] organizers) { - fOrganizers = organizers; - - if (fContainer == null) { - ModelDelta initialDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1); - fContainer = createRootContainer(initialDelta, fInput, fOrganizers, fBpManager); - initialDelta.setChildCount(fContainer.getChildren().length); - - // select the first breakpoint - IBreakpoint[] breakpoints = fContainer.getBreakpoints(); - if (breakpoints.length > 0) - appendModelDeltaToElement(initialDelta, breakpoints[0], IModelDelta.SELECT); - - fireModelChanged(fInput, initialDelta, "Organizer Changed - Initial Container."); //$NON-NLS-1$ - } else { - // create a reference container, use for deleting elements and adding elements - ModelDelta dummyDelta = new ModelDelta(null, IModelDelta.NO_CHANGE); - BreakpointContainer refContainer = createRootContainer(dummyDelta, fInput, organizers, fBpManager); + // create a reference container, use for deleting elements and adding elements + ModelDelta dummyDelta = new ModelDelta(null, IModelDelta.NO_CHANGE); + BreakpointContainer refContainer = createRootContainer(dummyDelta, fInput, organizers, fBpManager); - // delete the removed elements - ModelDelta deletedDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - deleteRemovedElements(fContainer, refContainer, deletedDelta); - fireModelChanged(fInput, deletedDelta, "setOrganizers - Delete removed elements"); //$NON-NLS-1$ - - // adjust the old organizer with the reference organizer - BreakpointContainer.copyOrganizers(fContainer, refContainer); - - // insert the added elements - ModelDelta addedDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1); - IBreakpoint newBreakpoint = insertAddedElements(fContainer, refContainer, addedDelta); - addedDelta.setChildCount(fContainer.getChildren().length); - - // select the new breakpoint - if (newBreakpoint != null) - appendModelDeltaToElement(addedDelta, newBreakpoint, IModelDelta.SELECT); - - fireModelChanged(fInput, addedDelta, "setOrganizers - Insert added elements"); //$NON-NLS-1$ - } + // delete the removed elements + ModelDelta deletedDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + deleteRemovedElements(fContainer, refContainer, deletedDelta); + fireModelChanged(fInput, deletedDelta, "setOrganizers - Delete removed elements"); //$NON-NLS-1$ + + // adjust the old organizer with the reference organizer + BreakpointContainer.copyOrganizers(fContainer, refContainer); + + // insert the added elements + ModelDelta addedDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1); + IBreakpoint newBreakpoint = insertAddedElements(fContainer, refContainer, addedDelta); + addedDelta.setChildCount(fContainer.getChildren().length); + + // select the new breakpoint + if (newBreakpoint != null) + appendModelDeltaToElement(addedDelta, newBreakpoint, IModelDelta.SELECT); + + fireModelChanged(fInput, addedDelta, "setOrganizers - Insert added elements"); //$NON-NLS-1$ } + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.actions.breakpoints.IBreakpointFilterContentProvider#setFilterSelection(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.jface.viewers.IStructuredSelection) + */ + synchronized public void setFilterSelection(IStructuredSelection ss) { + ModelDelta delta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + + Set existingBreakpoints = new HashSet(Arrays.asList(fContainer.getBreakpoints())); + IBreakpoint[] allBreakpoints = fBpManager.getBreakpoints(); + + for (int i = 0; i < allBreakpoints.length; ++i) { + boolean supported = supportsBreakpoint(ss, allBreakpoints[i]); + boolean contain = existingBreakpoints.contains(allBreakpoints[i]); + + if (supported) { + if (!contain) + fContainer.addBreakpoint(allBreakpoints[i], delta); + } else { + if (contain) + fContainer.removeBreakpoint(allBreakpoints[i], delta); + } + + } + + fireModelChanged(fInput, delta, "setFilterSelection"); //$NON-NLS-1$ + } + + /** + * Helper method to add breakpoints to the given input. + * + * @param data the input to add the breakpoints + * @param breakpoints the breakpoints + */ + synchronized void breakpointsAdded(IBreakpoint[] breakpoints) { + IBreakpoint[] filteredBreakpoints = filterBreakpoints(fInput, breakpoints); + ModelDelta delta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1); + for (int i = 0; i < filteredBreakpoints.length; ++i) { + fContainer.addBreakpoint(filteredBreakpoints[i], delta); + } + delta.setChildCount(fContainer.getChildren().length); + + // select the breakpoint + if (filteredBreakpoints.length > 0) { + appendModelDeltaToElement(delta, filteredBreakpoints[0], IModelDelta.SELECT); + } + + fireModelChanged(fInput, delta, "breakpointsAddedInput"); //$NON-NLS-1$ + } + + /** + * Helper method to remove breakpoints from a given input. + * + * @param data the input to add the breakpoints + * @param breakpoints the breakpoints + */ + synchronized void breakpointsRemoved(IBreakpoint[] breakpoints) { + IBreakpoint[] filteredBreakpoints = filterBreakpoints(fInput, breakpoints); + ModelDelta delta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + for (int i = 0; i < filteredBreakpoints.length; ++i) { + fContainer.removeBreakpoint(filteredBreakpoints[i], delta); + } + fireModelChanged(fInput, delta, "breakpointsRemovedInput"); //$NON-NLS-1$ + } + + synchronized void breakpointsChanged(IBreakpoint[] breakpoints) { + IBreakpoint[] filteredBreakpoints = filterBreakpoints(fInput, breakpoints); + + // If the change caused a breakpoint to be added (installed) or remove (un-installed) update accordingly. + List removed = new ArrayList(); + List added = new ArrayList(); + List filteredAsList = Arrays.asList(filteredBreakpoints); + for (int i = 0; i < breakpoints.length; i++) { + IBreakpoint bp = breakpoints[i]; + boolean oldContainedBp = fContainer.contains(bp); + boolean newContained = filteredAsList.contains(bp); + if (oldContainedBp && !newContained) { + removed.add(bp); + } else if (!oldContainedBp && newContained) { + added.add(bp); + } + } + if (!added.isEmpty()) { + breakpointsAdded((IBreakpoint[]) added.toArray(new IBreakpoint[added.size()])); + } + if (!removed.isEmpty()) { + breakpointsRemoved((IBreakpoint[]) removed.toArray(new IBreakpoint[removed.size()])); + } + + ModelDelta delta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + for (int i = 0; i < filteredBreakpoints.length; ++i) + appendModelDelta(fContainer, delta, IModelDelta.STATE, filteredBreakpoints[i]); + fireModelChanged(fInput, delta, "breakpointsChanged"); //$NON-NLS-1$ + } + + + private void buildInstallDelta(ModelDelta delta, BreakpointContainer container) { + Object[] children = container.getChildren(); + delta.setChildCount(children.length); + for (int i = 0; i < children.length; i++) { + ModelDelta childDelta = delta.addNode(children[i], i, IModelDelta.NO_CHANGE); + if (children[i] instanceof BreakpointContainer) { + buildInstallDelta(childDelta, (BreakpointContainer)children[i]); + } else if (children[i] instanceof IBreakpoint) { + childDelta.setFlags(IModelDelta.INSTALL); + } + } + } + /** * Insert elements from the reference container to an existing container. * @@ -263,6 +372,32 @@ } } + private class InputDataMap extends LinkedHashMap { + private static final long serialVersionUID = 1L; + + public InputDataMap() { + super(1, (float)0.75, true); + } + + protected boolean removeEldestEntry(java.util.Map.Entry arg0) { + InputData data = (InputData)arg0.getValue(); + return size() > getMaxInputsCache() && data.fProxies.isEmpty(); + } + } + + private class PresentationContextListener implements IPropertyChangeListener { + final private IPresentationContext fContext; + + PresentationContextListener(IPresentationContext context) { + fContext = context; + fContext.addPropertyChangeListener(this); + } + + public void propertyChange(PropertyChangeEvent event) { + contextPropertyChanged(fContext, event); + } + } + // debug flags public static boolean DEBUG_BREAKPOINT_DELTAS = false; @@ -274,18 +409,22 @@ /** * A map of input to info data cache */ - protected Map fInputToData; + final private Map fInputToData = Collections.synchronizedMap(new InputDataMap()); + + /** + * A map of presetnation context listeners. + */ + final private Map fContextListeners = Collections.synchronizedMap(new HashMap()); /** * The breakpoint manager. */ - protected IBreakpointManager fBpManager = null; + final private IBreakpointManager fBpManager; /** * Constructor. */ protected AbstractBreakpointManagerContentProvider() { - fInputToData = new HashMap(); fBpManager = DebugPlugin.getDefault().getBreakpointManager(); } @@ -308,6 +447,78 @@ protected abstract boolean supportsBreakpoint(IStructuredSelection ss, IBreakpoint breakpoint); /** + * Maximum number of breakpoint manager input objects that this provider + * will cache data for. This method is called once upon class creation + * when setting up the data cache. Sub-classes may override to provide + * a custom setting. + * + * @return Maximum data cache size + */ + protected int getMaxInputsCache() { + return 2; + } + + /** + * Handles the propety changed events in presentation contexts. + * Sub-classes may override to perform additional handling. + * + * @param context Presetnation context that was disposed. + */ + protected void contextPropertyChanged(IPresentationContext context, PropertyChangeEvent event) { + if (IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS.equals(event.getProperty())) { + IBreakpointOrganizer[] organizers = (IBreakpointOrganizer[])event.getNewValue(); + InputData[] contextDatas = getContextInputDatas(context); + for (int i = 0; i < contextDatas.length; i++) { + contextDatas[i].setOrganizers(organizers); + } + } + else if (IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION.equals(event.getProperty())) { + IStructuredSelection selection = (IStructuredSelection)event.getNewValue(); + InputData[] contextDatas = getContextInputDatas(context); + for (int i = 0; i < contextDatas.length; i++) { + contextDatas[i].setFilterSelection(selection); + } + } + } + + private InputData[] getContextInputDatas(IPresentationContext context) { + List list = new ArrayList(fInputToData.size()); + synchronized (fInputToData) { + for (Iterator itr = fInputToData.values().iterator(); itr.hasNext();) { + InputData data = (InputData)itr.next(); + if (context.equals( data.fInput.getContext() )) { + list.add(data); + } + } + } + return (InputData[]) list.toArray(new InputData[list.size()]); + } + + /** + * Handles the event when a presentation context is dispoed. + * Sub-classes may override to perform additional cleanup. + * + * @param context Presetnation context that was disposed. + */ + protected void contextDisposed(IPresentationContext context) { + synchronized (fInputToData) { + for (Iterator itr = fInputToData.entrySet().iterator(); itr.hasNext();) { + Map.Entry entry = (Map.Entry)itr.next(); + IPresentationContext entryContext = ((AbstractBreakpointManagerInput)entry.getKey()).getContext(); + if (context.equals(entryContext)) { + itr.remove(); + } + } + } + + // Remove the context listener. + PresentationContextListener listener = (PresentationContextListener)fContextListeners.remove(context); + if (listener != null) { + context.removePropertyChangeListener(listener); + } + } + + /** * Register the breakpoint manager input with this content provider. * * @param input the breakpoint manager input to register. @@ -316,18 +527,12 @@ * @param selectionFilter the selection filter, can be <code>null</code>. * @param comparator the element comparator. */ - public void registerModelProxy(AbstractBreakpointManagerInput input, AbstractModelProxy proxy, - IBreakpointOrganizer[] organizers, IStructuredSelection selectionFilter, ElementComparator comparator) { - - if (fInputToData.size() == 0) + public void registerModelProxy(AbstractBreakpointManagerInput input, AbstractModelProxy proxy) { + if (fInputToData.isEmpty()) { fBpManager.addBreakpointListener(this); + } - InputData data = new InputData(input, proxy, selectionFilter, comparator); - - // cache the input and it's data - fInputToData.put(input, data); - - data.setOrganizers(organizers); + getInputData(input).proxyInstalled(proxy); } /** @@ -335,23 +540,35 @@ * * @param input the breakpoint manager input to unregister. */ - public void unregisterModelProxy(AbstractBreakpointManagerInput input) { - InputData data = (InputData) fInputToData.remove(input); - Assert.isNotNull(data); + public void unregisterModelProxy(AbstractBreakpointManagerInput input, AbstractModelProxy proxy) { + getInputData(input).proxyDisposed(proxy); - if (fInputToData.size() == 0) + if (fInputToData.isEmpty()) { fBpManager.removeBreakpointListener(this); + } } - - /** - * Returns the input data from the cache. - * - * @param input the input. - * @return the input data cache, can be <code>null</code>. - */ - protected InputData getInputData(Object input) { - return (InputData) fInputToData.get(input); + private InputData getInputData(AbstractBreakpointManagerInput input) { + InputData data = null; + synchronized (fInputToData) { + data = (InputData)fInputToData.get(input); + if (data == null) { + data = new InputData(input); + fInputToData.put(input, data); + } + } + + // Also make sure that we're listening to the presentation context properties + synchronized (fContextListeners) { + IPresentationContext context = input.getContext(); + if ( !Boolean.TRUE.equals(context.getProperty(IPresentationContext.PROPERTY_DISPOSED)) && + !fContextListeners.containsKey(context) ) + { + fContextListeners.put(context, new PresentationContextListener(context)); + } + } + + return data; } /** @@ -360,43 +577,21 @@ * @param input the input. * @return the model proxy. */ - public AbstractModelProxy getModelProxy(Object input) { + private List getModelProxies(AbstractBreakpointManagerInput input) { InputData data = getInputData(input); - return data != null ? data.fProxy : null; + return data != null ? data.fProxies : null; } -// /** -// * Returns the root breakpoint container for the input. -// * -// * @param input the input. -// * @return the breakpoint container. -// */ -// public BreakpointContainer getBreakpointContainer(Object input) { -// InputData data = getInputData(input); -// return data != null ? data.fContainer : null; -// } -// -// /** -// * Sets the breakpoint input root container. -// * -// * @param input the input. -// * @param container the breakpoint container. -// */ -// public void setBreakpointContainer(Object input, BreakpointContainer container) { -// InputData data = getInputData(input); -// if (data != null) { -// data.fContainer = container; -// } -// } - /** * Returns the selection filter for the input. * * @param input the selection. */ - public IStructuredSelection getSelectionFilter(Object input) { - InputData data = getInputData(input); - return data != null ? data.fSelectionFilter : null; + protected IStructuredSelection getSelectionFilter(Object input) { + if (input instanceof AbstractBreakpointManagerInput) { + return (IStructuredSelection) ((AbstractBreakpointManagerInput)input).getContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION); + } + return null; } /** @@ -406,13 +601,15 @@ * @param delta the model delta. * @param debugReason the debug string. */ - public void fireModelChanged(Object input, IModelDelta delta, String debugReason) { - AbstractModelProxy proxy = getModelProxy(input); - if (proxy != null) { - if (DEBUG_BREAKPOINT_DELTAS) - System.out.println("FIRE BREAKPOINT DELTA (" + debugReason + ")\n" + delta.toString()); //$NON-NLS-1$ //$NON-NLS-2$ - - proxy.fireModelChanged(delta); + protected void fireModelChanged(AbstractBreakpointManagerInput input, IModelDelta delta, String debugReason) { + List proxies = getModelProxies(input); + + if (DEBUG_BREAKPOINT_DELTAS && proxies.size() > 0) { + System.out.println("FIRE BREAKPOINT DELTA (" + debugReason + ")\n" + delta.toString()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + for (int i = 0; i < proxies.size(); i++) { + ((AbstractModelProxy)proxies.get(i)).fireModelChanged(delta); } } @@ -427,10 +624,11 @@ * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate) */ protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException { - InputData data = getInputData(element); - if (data != null && data.fContainer != null) - return data.fContainer.getChildren().length; - + Object input = monitor.getViewerInput(); + if (input instanceof AbstractBreakpointManagerInput) { + AbstractBreakpointManagerInput bpManagerInput = (AbstractBreakpointManagerInput)input; + return getInputData(bpManagerInput).fContainer.getChildren().length; + } return 0; } @@ -438,166 +636,47 @@ * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate) */ protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException { - InputData data = getInputData(parent); - if (data != null && data.fContainer != null) - return getElements(data.fContainer.getChildren(), index, length); + Object input = monitor.getViewerInput(); + if (input instanceof AbstractBreakpointManagerInput) { + AbstractBreakpointManagerInput bpManagerInput = (AbstractBreakpointManagerInput)input; + Object[] children = getInputData(bpManagerInput).fContainer.getChildren(); + return getElements(children, index, length); + } return EMPTY; } /* * (non-Javadoc) - * @see org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizerListener#setOrganizers(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizer[]) - */ - synchronized public void setOrganizers(Object input, IPresentationContext context, IBreakpointOrganizer[] organizers) { - InputData data = getInputData(input); - if (data != null) - data.setOrganizers(organizers); - } - - /* - * (non-Javadoc) - * @see org.eclipse.debug.internal.ui.actions.breakpoints.IBreakpointFilterContentProvider#setFilterSelection(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.jface.viewers.IStructuredSelection) - */ - synchronized public void setFilterSelection(Object input, IPresentationContext context, IStructuredSelection ss) { - InputData data = getInputData(input); - if (data == null) return; - - data.fSelectionFilter = ss; - - BreakpointContainer container = data.fContainer; - if (container != null) { - ModelDelta delta = new ModelDelta(input, IModelDelta.NO_CHANGE); - - Set existingBreakpoints = new HashSet(Arrays.asList(container.getBreakpoints())); - IBreakpoint[] allBreakpoints = fBpManager.getBreakpoints(); - - for (int i = 0; i < allBreakpoints.length; ++i) { - boolean supported = supportsBreakpoint(ss, allBreakpoints[i]); - boolean contain = existingBreakpoints.contains(allBreakpoints[i]); - - if (supported) { - if (!contain) - container.addBreakpoint(allBreakpoints[i], delta); - } else { - if (contain) - container.removeBreakpoint(allBreakpoints[i], delta); - } - - } - - fireModelChanged(input, delta, "setFilterSelection"); //$NON-NLS-1$ - } - } - - /** - * Helper method to add breakpoints to the given input. - * - * @param data the input to add the breakpoints - * @param breakpoints the breakpoints - */ - private void breakpointsAddedInput(InputData data, IBreakpoint[] breakpoints) { - if (data == null || data.fContainer == null) { - return; - } - IBreakpoint[] filteredBreakpoints = filterBreakpoints(data.fInput, breakpoints); - ModelDelta delta = new ModelDelta(data.fInput, 0, IModelDelta.NO_CHANGE, -1); - for (int i = 0; i < filteredBreakpoints.length; ++i) { - data.fContainer.addBreakpoint(filteredBreakpoints[i], delta); - } - delta.setChildCount(data.fContainer.getChildren().length); - - // select the breakpoint - if (filteredBreakpoints.length > 0) { - appendModelDeltaToElement(delta, filteredBreakpoints[0], IModelDelta.SELECT); - } - - fireModelChanged(data.fInput, delta, "breakpointsAddedInput"); //$NON-NLS-1$ - } - /* - * (non-Javadoc) * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[]) */ - synchronized public void breakpointsAdded(IBreakpoint[] breakpoints) { - Iterator it = fInputToData.keySet().iterator(); - while (it.hasNext()) { - AbstractBreakpointManagerInput input = (AbstractBreakpointManagerInput) it.next(); - InputData data = getInputData(input); - breakpointsAddedInput(data, breakpoints); + public void breakpointsAdded(IBreakpoint[] breakpoints) { + InputData[] datas = (InputData[])fInputToData.values().toArray(new InputData[0]); + for (int i = 0; i < datas.length; i++) { + datas[i].breakpointsAdded(breakpoints); } } - /** - * Helper method to remove breakpoints from a given input. - * - * @param data the input to add the breakpoints - * @param breakpoints the breakpoints - */ - private void breakpointsRemovedInput(InputData data, IBreakpoint[] breakpoints) { - if (data == null || data.fContainer == null) { - return; - } - - IBreakpoint[] filteredBreakpoints = filterBreakpoints(data.fInput, breakpoints); - ModelDelta delta = new ModelDelta(data.fInput, IModelDelta.NO_CHANGE); - for (int i = 0; i < filteredBreakpoints.length; ++i) { - data.fContainer.removeBreakpoint(filteredBreakpoints[i], delta); - } - fireModelChanged(data.fInput, delta, "breakpointsRemovedInput"); //$NON-NLS-1$ - - } /* * (non-Javadoc) * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsRemoved(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[]) */ - synchronized public void breakpointsRemoved(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) { - Iterator it = fInputToData.keySet().iterator(); - while (it.hasNext()) { - AbstractBreakpointManagerInput input = (AbstractBreakpointManagerInput) it.next(); - InputData data = getInputData(input); - breakpointsRemovedInput(data, breakpoints); - } + public void breakpointsRemoved(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) { + InputData[] datas = (InputData[])fInputToData.values().toArray(new InputData[0]); + for (int i = 0; i < datas.length; i++) { + datas[i].breakpointsRemoved(breakpoints); + } } /* * (non-Javadoc) * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[]) */ - synchronized public void breakpointsChanged(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) { - Iterator it = fInputToData.keySet().iterator(); - while (it.hasNext()) { - AbstractBreakpointManagerInput input = (AbstractBreakpointManagerInput) it.next(); - InputData data = getInputData(input); - if (data == null || data.fContainer == null) continue; - - IBreakpoint[] filteredBreakpoints = filterBreakpoints(input, breakpoints); - - // If the change caused a breakpoint to be added (installed) or remove (un-installed) update accordingly. - List removed = new ArrayList(); - List added = new ArrayList(); - List filteredAsList = Arrays.asList(filteredBreakpoints); - for (int i = 0; i < breakpoints.length; i++) { - IBreakpoint bp = breakpoints[i]; - boolean oldContainedBp = data.fContainer.contains(bp); - boolean newContained = filteredAsList.contains(bp); - if (oldContainedBp && !newContained) { - removed.add(bp); - } else if (!oldContainedBp && newContained) { - added.add(bp); - } - } - if (!added.isEmpty()) { - breakpointsAddedInput(data, (IBreakpoint[]) added.toArray(new IBreakpoint[added.size()])); - } - if (!removed.isEmpty()) { - breakpointsRemovedInput(data, (IBreakpoint[]) removed.toArray(new IBreakpoint[removed.size()])); - } - - ModelDelta delta = new ModelDelta(input, IModelDelta.NO_CHANGE); - for (int i = 0; i < filteredBreakpoints.length; ++i) - appendModelDelta(data.fContainer, delta, IModelDelta.STATE, filteredBreakpoints[i]); - fireModelChanged(input, delta, "breakpointsChanged"); //$NON-NLS-1$ - } + public void breakpointsChanged(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) { + InputData[] datas = (InputData[])fInputToData.values().toArray(new InputData[0]); + for (int i = 0; i < datas.length; i++) { + datas[i].breakpointsChanged(breakpoints); + } } /** * Appends the model delta flags to child containers that contains the breakpoint.
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java index d4e94bb..d734653 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java
@@ -165,16 +165,6 @@ private boolean fNotifyUnmap = true; /** - * Flag indicating whether the viewer is a pop-up viewer. A pop-up viewer - * is transient and does not automatically expand and select elements up - * when requested by the model. It also does not dispose the presentation - * context when its control is disposed. - * - * @since 3.5 - */ - private boolean fIsPopup; - - /** * Persist column sizes when they change. * * @since 3.2 @@ -1019,8 +1009,9 @@ setContentProvider(createContentProvider()); setLabelProvider(createLabelProvider()); - fIsPopup = (style & SWT.POP_UP) != 0; - if (fIsPopup) { + // A pop-up viewer is transient and does not automatically expand + // and select elements up when requested by the model + if ((style & SWT.POP_UP) != 0) { ((ITreeModelContentProvider)getContentProvider()).setModelDeltaMask( ~ITreeModelContentProvider.ALL_MODEL_DELTA_FLAGS & ~ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS); } @@ -1146,9 +1137,6 @@ } fCellModifier.dispose(); - if (!fIsPopup) { - fContext.dispose(); - } super.handleDispose(event); }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java index c0c229b..8dfc928 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java
@@ -951,7 +951,6 @@ if (fColumnPresentation != null) { fColumnPresentation.dispose(); } - fContext.dispose(); if (fContentProvider != null) { fContentProvider.dispose();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java index 780d18a..f8ef910 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java
@@ -22,13 +22,23 @@ * @since 3.2 */ public interface IPresentationContext { - + /** * Property name used for property change notification when the columns * in a presentation context change. */ public static final String PROPERTY_COLUMNS = "PROPERTY_COLUMNS"; //$NON-NLS-1$ - + + /** + * Property indicating whether the presentation context is disposed. + * It is set to <code>Boolean.TRUE</code> after the presentation context + * is disposed. This property may be <code>null</code>, which indicates + * that context is not yet disposed. + * + * @since 3.6 + */ + public static final String PROPERTY_DISPOSED = "PROPERTY_DISPOSED"; //$NON-NLS-1$ + /** * Returns identifiers of the visible columns in the order * labels should be provided, or <code>null</code> if columns
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java index 22c7524..b79b678 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java
@@ -98,8 +98,9 @@ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext#dispose() */ public void dispose() { + fProperties.clear(); + setProperty(PROPERTY_DISPOSED, Boolean.TRUE); fListeners.clear(); - fProperties.clear(); } /* (non-Javadoc)
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/BreakpointManagerProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/BreakpointManagerProxy.java index d926571..29a7254 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/BreakpointManagerProxy.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/BreakpointManagerProxy.java
@@ -10,16 +10,12 @@ *****************************************************************/ package org.eclipse.debug.internal.ui.viewers.update; -import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer; -import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointUIConstants; import org.eclipse.debug.internal.ui.elements.adapters.AbstractBreakpointManagerInput; import org.eclipse.debug.internal.ui.model.elements.AbstractBreakpointManagerContentProvider; import org.eclipse.debug.internal.ui.viewers.model.ViewerAdapterService; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy; -import org.eclipse.debug.internal.ui.views.breakpoints.ElementComparator; -import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; /** @@ -39,21 +35,6 @@ protected AbstractBreakpointManagerInput fInput; /** - * The root breakpoint organizer for this model proxy - */ - protected IBreakpointOrganizer[] fOrganizers; - - /** - * The element comparator for this model proxy - */ - protected ElementComparator fComparator; - - /** - * The initial selection for this model proxy - */ - protected IStructuredSelection fSelection; - - /** * Constructor. * * @param input the breakpoint manager input @@ -69,9 +50,6 @@ IElementContentProvider provider = ViewerAdapterService.getContentProvider(input); if (provider instanceof AbstractBreakpointManagerContentProvider) { fProvider = (AbstractBreakpointManagerContentProvider) provider; - fOrganizers = (IBreakpointOrganizer[]) context.getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS); - fSelection = (IStructuredSelection) context.getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION); - fComparator = (ElementComparator) context.getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ELEMENT_COMPARATOR); } } } @@ -83,7 +61,7 @@ public void installed(Viewer viewer) { super.installed(viewer); if (fProvider != null) { - fProvider.registerModelProxy(fInput, this, fOrganizers, fSelection, fComparator); + fProvider.registerModelProxy(fInput, this); } } @@ -93,7 +71,7 @@ */ public synchronized void dispose() { if (fProvider != null) { - fProvider.unregisterModelProxy(fInput); + fProvider.unregisterModelProxy(fInput, this); } super.dispose(); }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java index 9d61e00..a032a73 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
@@ -36,8 +36,6 @@ import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointUIConstants; import org.eclipse.debug.internal.ui.elements.adapters.DefaultBreakpointManagerInput; import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants; -import org.eclipse.debug.internal.ui.viewers.model.ViewerAdapterService; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; @@ -542,13 +540,6 @@ if (viewer != null) { // update the presentation context organizer viewer.getPresentationContext().setProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS, fOrganizers); - - // notify input the organizer has changed - Object input = viewer.getInput(); - IElementContentProvider provider = ViewerAdapterService.getContentProvider(input); - if (provider instanceof IBreakpointOrganizerListener) { - ((IBreakpointOrganizerListener) provider).setOrganizers(input, viewer.getPresentationContext(), organizers); - } } } @@ -564,13 +555,6 @@ if (viewer != null) { // update the presentation context filter viewer.getPresentationContext().setProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION, fFilterSelection); - - // notify input the filter has changed - Object input = viewer.getInput(); - IElementContentProvider provider = ViewerAdapterService.getContentProvider(input); - if (provider instanceof IBreakpointFilterListener) { - ((IBreakpointFilterListener) provider).setFilterSelection(input, viewer.getPresentationContext(), ss); - } } }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointFilterListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointFilterListener.java deleted file mode 100644 index b9a509a..0000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointFilterListener.java +++ /dev/null
@@ -1,32 +0,0 @@ -/***************************************************************** - * Copyright (c) 2009 Texas Instruments and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Patrick Chuong (Texas Instruments) - Initial API and implementation (Bug 238956) - *****************************************************************/ -package org.eclipse.debug.internal.ui.views.breakpoints; - -import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; -import org.eclipse.jface.viewers.IStructuredSelection; - -/** - * This interface can be implemented by a breakpoint manager content provider to provides filtering support. - * - * @since 3.6 - */ -public interface IBreakpointFilterListener { - - /** - * Sets the filter selection for the given input, the selection is the new selection of the debug view. - * - * @param input the view input. - * @param context the presentation context. - * @param ss the selection. - */ - void setFilterSelection(Object input, IPresentationContext context, IStructuredSelection ss); - -}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizerListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizerListener.java deleted file mode 100644 index 189a580..0000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizerListener.java +++ /dev/null
@@ -1,31 +0,0 @@ -/***************************************************************** - * Copyright (c) 2009 Texas Instruments and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Patrick Chuong (Texas Instruments) - Initial API and implementation (Bug 238956) - *****************************************************************/ -package org.eclipse.debug.internal.ui.views.breakpoints; - -import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; - -/** - * This interface can be implements by a breakpoint manager provider. - * - * @since 3.6 - */ -public interface IBreakpointOrganizerListener { - - /** - * Set the breakpoint organizers for the given input. - * - * @param input the view input. - * @param context the presentation context. - * @param organizers the new organizers, can be <code>null</code>. - */ - void setOrganizers(Object input, IPresentationContext context, IBreakpointOrganizer[] organizers); -}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java index 99293d4..5b3c899 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java
@@ -133,5 +133,9 @@ private boolean isDefault() { return fWorkingSet.equals(BreakpointSetOrganizer.getDefaultWorkingSet()); } + + public String toString() { + return fWorkingSet.getName(); + } }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java index 327dfc8..b175757 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
@@ -63,6 +63,7 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; 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.TreeModelViewer; @@ -173,6 +174,8 @@ */ private IDebugModelPresentation fPresentation = null; + private IPresentationContext fPresentationContext; + private EditLaunchConfigurationAction fEditConfigAction = null; private AddToFavoritesAction fAddToFavoritesAction = null; private EditSourceLookupPathAction fEditSourceAction = null; @@ -771,9 +774,10 @@ */ protected Viewer createViewer(Composite parent) { fPresentation = new DelegatingModelPresentation(); + fPresentationContext = new DebugModelPresentationContext(IDebugUIConstants.ID_DEBUG_VIEW, fPresentation); TreeModelViewer viewer = new TreeModelViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL, - new DebugModelPresentationContext(IDebugUIConstants.ID_DEBUG_VIEW, fPresentation)); + fPresentationContext); viewer.addSelectionChangedListener(fTreeViewerSelectionChangedListener); viewer.getControl().addKeyListener(new KeyAdapter() { @@ -992,6 +996,9 @@ viewer.removeSelectionChangedListener(fTreeViewerSelectionChangedListener); ((TreeModelViewer)viewer).removeViewerUpdateListener(this); } + if (fPresentationContext != null) { + fPresentationContext.dispose(); + } IWorkbenchPage page = getSite().getPage(); page.removePartListener((IPartListener2) this); IWorkbenchWindow window = getSite().getWorkbenchWindow();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java index 4862fde..a54b692 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
@@ -32,6 +32,7 @@ import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.contexts.DebugContextEvent; @@ -74,6 +75,7 @@ public static final String PANE_ID = DebugUIPlugin.getUniqueIdentifier() + ".MemoryView.MemoryBlocksTreeViewPane"; //$NON-NLS-1$ private IViewPart fParent; + private IPresentationContext fPresentationContext; private MemoryViewTreeViewer fTreeViewer; protected IMemoryBlockRetrieval fRetrieval; private ViewPaneSelectionProvider fSelectionProvider; @@ -291,8 +293,8 @@ fLabel = label; IMemoryRenderingSite site = getMemoryRenderingSite(); - MemoryViewPresentationContext presentationContext = new MemoryViewPresentationContext(site, this, null); - fTreeViewer = new MemoryViewTreeViewer(parent, style, presentationContext); + fPresentationContext = new MemoryViewPresentationContext(site, this, null); + fTreeViewer = new MemoryViewTreeViewer(parent, style, fPresentationContext); IAdaptable context = DebugUITools.getDebugContext(); IMemoryBlockRetrieval retrieval = MemoryViewUtil.getMemoryBlockRetrieval(context); @@ -367,6 +369,7 @@ fAddMemoryBlockAction.dispose(); DebugUITools.getDebugContextManager().getContextService(fParent.getSite().getWorkbenchWindow()).removeDebugContextListener(fDebugContextListener); fEvtHandler.dispose(); + fPresentationContext.dispose(); } /* (non-Javadoc)
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java index b44d3ca..d43f4c7 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
@@ -358,6 +358,11 @@ private SelectionProviderWrapper fSelectionProvider; /** + * Presentation context for this view. + */ + private IPresentationContext fPresentationContext; + + /** * Remove myself as a selection listener * and preference change listener. * @@ -374,6 +379,10 @@ viewer.removeModelChangedListener(this); viewer.removeViewerUpdateListener(this); } + if (fPresentationContext != null) { + fPresentationContext.dispose(); + fPresentationContext = null; + } if (fDetailPane != null) fDetailPane.dispose(); fInputService.dispose(); fSelectionProvider.dispose(); @@ -581,8 +590,8 @@ protected TreeModelViewer createTreeViewer(Composite parent) { int style = getViewerStyle(); - final TreeModelViewer variablesViewer = new TreeModelViewer(parent, style, - new DebugModelPresentationContext(getPresentationContextId(), getModelPresentation())); + fPresentationContext = new DebugModelPresentationContext(getPresentationContextId(), fModelPresentation); + final TreeModelViewer variablesViewer = new TreeModelViewer(parent, style, fPresentationContext); variablesViewer.getControl().addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java index 2144d26..3c1eaa5 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java
@@ -64,6 +64,7 @@ private static final int MIN_WIDTH = 300; private static final int MIN_HEIGHT = 250; + private IPresentationContext fContext; private TreeModelViewer fViewer; private SashForm fSashForm; private Composite fDetailPaneComposite; @@ -100,17 +101,17 @@ fSashForm.setLayoutData(new GridData(GridData.FILL_BOTH)); VariablesView view = getViewToEmulate(); - IPresentationContext context = new PresentationContext(IDebugUIConstants.ID_VARIABLE_VIEW); + fContext = new PresentationContext(IDebugUIConstants.ID_VARIABLE_VIEW); if (view != null) { // copy over properties IPresentationContext copy = ((TreeModelViewer)view.getViewer()).getPresentationContext(); String[] properties = copy.getProperties(); for (int i = 0; i < properties.length; i++) { String key = properties[i]; - context.setProperty(key, copy.getProperty(key)); + fContext.setProperty(key, copy.getProperty(key)); } } - fViewer = new TreeModelViewer(fSashForm, SWT.NO_TRIM | SWT.MULTI | SWT.VIRTUAL, context); + fViewer = new TreeModelViewer(fSashForm, SWT.NO_TRIM | SWT.MULTI | SWT.VIRTUAL, fContext); fViewer.setAutoExpandLevel(1); fDetailPaneComposite = SWTFactory.createComposite(fSashForm, 1, 1, GridData.FILL_BOTH); @@ -253,6 +254,7 @@ fExpression.dispose(); } fDetailPane.dispose(); + fContext.dispose(); return super.close(); }