diff options
author | Darin Wright | 2002-09-30 14:23:08 +0000 |
---|---|---|
committer | Darin Wright | 2002-09-30 14:23:08 +0000 |
commit | 454ea9b35b41b78a7dbae6cc24853ab3ea46000f (patch) | |
tree | 2addd3919beae6fb6e8b1182458be63a5cbf83d0 /org.eclipse.debug.core/core/org/eclipse | |
parent | 043d7c3ceb4c1c63bdb8869a27e7b144be6bc3ba (diff) | |
download | eclipse.platform.debug-454ea9b35b41b78a7dbae6cc24853ab3ea46000f.tar.gz eclipse.platform.debug-454ea9b35b41b78a7dbae6cc24853ab3ea46000f.tar.xz eclipse.platform.debug-454ea9b35b41b78a7dbae6cc24853ab3ea46000f.zip |
bug 1576
Diffstat (limited to 'org.eclipse.debug.core/core/org/eclipse')
3 files changed, 218 insertions, 55 deletions
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionManager.java index 55443ac86..8c32599a0 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionManager.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionManager.java @@ -1,9 +1,11 @@ package org.eclipse.debug.core; -/* - * (c) Copyright IBM Corp. 2000, 2001. - * All Rights Reserved. - */ +/********************************************************************** +Copyright (c) 2000, 2002 IBM Corp. All rights reserved. +This file is made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html +**********************************************************************/ import org.eclipse.debug.core.model.IExpression; @@ -15,13 +17,14 @@ import org.eclipse.debug.core.model.IExpression; * <p> * Clients interested in expression change notification may * register with the expression manager - see - * <code>IExpressionListener</code>. + * <code>IExpressionListener</code> and <code>IExpressionsListener</code>. * </p> * <p> * This interface is not intended to be implemented by clients. * </p> - * @see IExpression - * @see IExpressionListener + * @see org.eclipse.debug.core.model.IExpression + * @see org.eclipse.debug.core.IExpressionListener + * @see org.eclipse.debug.core.IExpressionsListener * @since 2.0 */ public interface IExpressionManager { @@ -33,6 +36,16 @@ public interface IExpressionManager { * @param expression the expression to add */ public void addExpression(IExpression expression); + + /** + * Adds the given expressions to the collection of registered expressions + * in the workspace and notifies all registered listeners. Has no effect + * on expressions already registered. + * + * @param expressions the expressions to add + * @since 2.1 + */ + public void addExpressions(IExpression[] expressions); /** * Returns a collection of all registered expressions, @@ -66,6 +79,16 @@ public interface IExpressionManager { * @param expression the expression to remove */ public void removeExpression(IExpression expression); + + /** + * Removes the given expressions from the collection of registered expressions + * in the workspace and notifies all registered listeners. Has no effect + * on expressions not already registered. + * + * @param expressions the expressions to remove + * @since 2.1 + */ + public void removeExpressions(IExpression[] expressions); /** * Adds the given listener to the collection of registered expression listeners. @@ -83,6 +106,24 @@ public interface IExpressionManager { */ public void removeExpressionListener(IExpressionListener listener); + /** + * Adds the given listener to the collection of registered expression listeners. + * Has no effect if an identical listener is already registered. + * + * @param listener the listener to add + * @since 2.1 + */ + public void addExpressionListener(IExpressionsListener listener); + + /** + * Removes the given listener from the collection of registered expression listeners. + * Has no effect if an identical listener is not already registered. + * + * @param listener the listener to remove + * @since 2.1 + */ + public void removeExpressionListener(IExpressionsListener listener); + } diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionsListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionsListener.java new file mode 100644 index 000000000..5a8ab2090 --- /dev/null +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionsListener.java @@ -0,0 +1,52 @@ +package org.eclipse.debug.core; + +/********************************************************************** +Copyright (c) 2000, 2002 IBM Corp. All rights reserved. +This file is made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html +**********************************************************************/ + +import org.eclipse.debug.core.model.IExpression; + +/** + * An expression listener is notified of expression additions, + * removals, and changes. Listeners register and deregister with the + * expression manager. + * <p> + * This interface is analagous to <code>IExpressionListener</code>, except + * notifications are batched for more than when expression when possible. + * </p> + * <p> + * Clients may implement this interface. + * </p> + * @see IExpressionManager + * @since 2.1 + */ + +public interface IExpressionsListener { + + /** + * Notifies this listener that the given expressions have been added + * to the expression manager. + * + * @param expressions the added expressions + */ + public void expressionsAdded(IExpression[] expressions); + /** + * Notifies this listener that the given expressions has been removed + * from the expression manager. + * + * @param expressions the removed expressions + */ + public void expressionsRemoved(IExpression[] expressions); + + /** + * Notifies this listener that the given expressions have + * changed. + * + * @param expressions the changed expressions + */ + public void expressionsChanged(IExpression[] expressions); + +}
\ No newline at end of file diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ExpressionManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ExpressionManager.java index 711d65dde..7b57c83f0 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ExpressionManager.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ExpressionManager.java @@ -1,12 +1,15 @@ package org.eclipse.debug.internal.core; -/* - * (c) Copyright IBM Corp. 2000, 2001. - * All Rights Reserved. - */ +/********************************************************************** +Copyright (c) 2000, 2002 IBM Corp. All rights reserved. +This file is made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html +**********************************************************************/ import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Vector; import org.eclipse.debug.core.DebugEvent; @@ -14,6 +17,7 @@ import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.IExpressionListener; import org.eclipse.debug.core.IExpressionManager; +import org.eclipse.debug.core.IExpressionsListener; import org.eclipse.debug.core.model.IExpression; /** @@ -38,14 +42,38 @@ public class ExpressionManager implements IExpressionManager, IDebugEventSetList private ListenerList fListeners = new ListenerList(2); /** - * @see IExpressionManager#addExpression(IExpression, String) + * List of (multi) expressions listeners + */ + private ListenerList fExpressionsListeners = new ListenerList(2); + + // Constants for add/remove/change notification + private static final int ADDED = 1; + private static final int CHANGED = 2; + private static final int REMOVED = 3; + + /** + * @see IExpressionManager#addExpression(IExpression) */ public void addExpression(IExpression expression) { - if (getExpressions0().indexOf(expression) == -1) { - getExpressions0().add(expression); - fireExpressionAdded(expression); - } + addExpressions(new IExpression[]{expression}); } + + /** + * @see IExpressionManager#addExpressions(IExpression[]) + */ + public void addExpressions(IExpression[] expressions) { + List added = new ArrayList(expressions.length); + for (int i = 0; i < expressions.length; i++) { + IExpression expression = expressions[i]; + if (getExpressions0().indexOf(expression) == -1) { + added.add(expression); + getExpressions0().add(expression); + } + } + if (!added.isEmpty()) { + fireUpdate((IExpression[])added.toArray(new IExpression[added.size()]), ADDED); + } + } /** * @see IExpressionManager#getExpressions() @@ -78,14 +106,26 @@ public class ExpressionManager implements IExpressionManager, IDebugEventSetList * @see IExpressionManager#removeExpression(IExpression) */ public void removeExpression(IExpression expression) { - if (getExpressions0().indexOf(expression) >= 0) { - getExpressions0().remove(expression); - expression.dispose(); - fireExpressionRemoved(expression); - } + removeExpressions(new IExpression[] {expression}); } /** + * @see IExpressionManager#removeExpressions(IExpression[]) + */ + public void removeExpressions(IExpression[] expressions) { + List removed = new ArrayList(expressions.length); + for (int i = 0; i < expressions.length; i++) { + IExpression expression = expressions[i]; + if (getExpressions0().remove(expression)) { + removed.add(expression); + } + } + if (!removed.isEmpty()) { + fireUpdate((IExpression[])removed.toArray(new IExpression[removed.size()]), REMOVED); + } + } + + /** * @see IExpressionManager#addExpressionListener(IExpressionListener) */ public void addExpressionListener(IExpressionListener listener) { @@ -128,56 +168,72 @@ public class ExpressionManager implements IExpressionManager, IDebugEventSetList */ public void handleDebugEvents(DebugEvent[] events) { for (int i = 0; i < events.length; i++) { + List changed = null; DebugEvent event = events[i]; if (event.getSource() instanceof IExpression) { switch (event.getKind()) { case DebugEvent.CHANGE: - fireExpressionChanged((IExpression)event.getSource()); + if (changed == null) { + changed = new ArrayList(1); + } + changed.add(event.getSource()); break; default: break; } } + if (changed != null) { + IExpression[] array = (IExpression[])changed.toArray(new IExpression[changed.size()]); + fireUpdate(array, CHANGED); + } } } - - /** - * Notifies listeners that the given expression has been - * added. - * - * @param expression the newly added expression - */ - protected void fireExpressionAdded(IExpression expression) { - Object[] listeners = fListeners.getListeners(); - for (int i = 0; i < listeners.length; i++) { - ((IExpressionListener)listeners[i]).expressionAdded(expression); - } - } - + /** - * Notifies listeners that the given expression has been - * removed. + * Notifies listeners of the adds/removes/changes * - * @param expression the removed expression + * @param breakpoints associated breakpoints + * @param deltas or <code>null</code> + * @param update type of change */ - protected void fireExpressionRemoved(IExpression expression) { - Object[] listeners = fListeners.getListeners(); - for (int i = 0; i < listeners.length; i++) { - ((IExpressionListener)listeners[i]).expressionRemoved(expression); + private void fireUpdate(IExpression[] expressions, int update) { + // single listeners + Object[] copiedListeners= fListeners.getListeners(); + for (int i= 0; i < copiedListeners.length; i++) { + IExpressionListener listener = (IExpressionListener)copiedListeners[i]; + for (int j = 0; j < expressions.length; j++) { + IExpression expression = expressions[j]; + switch (update) { + case ADDED: + listener.expressionAdded(expression); + break; + case REMOVED: + listener.expressionRemoved(expression); + break; + case CHANGED: + listener.expressionChanged(expression); + break; + } + } } + + // multi listeners + copiedListeners = fExpressionsListeners.getListeners(); + for (int i= 0; i < copiedListeners.length; i++) { + IExpressionsListener listener = (IExpressionsListener)copiedListeners[i]; + switch (update) { + case ADDED: + listener.expressionsAdded(expressions); + break; + case REMOVED: + listener.expressionsRemoved(expressions); + break; + case CHANGED: + listener.expressionsChanged(expressions); + break; + } + } } - - /** - * Notifies listeners that the given expression has changed. - * - * @param expression the changed expression - */ - protected void fireExpressionChanged(IExpression expression) { - Object[] listeners = fListeners.getListeners(); - for (int i = 0; i < listeners.length; i++) { - ((IExpressionListener)listeners[i]).expressionChanged(expression); - } - } /** * @see IExpressionManager#hasExpressions() @@ -186,4 +242,18 @@ public class ExpressionManager implements IExpressionManager, IDebugEventSetList return !getExpressions0().isEmpty(); } + /** + * @see org.eclipse.debug.core.IExpressionManager#addExpressionListener(org.eclipse.debug.core.IExpressionsListener) + */ + public void addExpressionListener(IExpressionsListener listener) { + fExpressionsListeners.add(listener); + } + + /** + * @see org.eclipse.debug.core.IExpressionManager#removeExpressionListener(org.eclipse.debug.core.IExpressionsListener) + */ + public void removeExpressionListener(IExpressionsListener listener) { + fExpressionsListeners.remove(listener); + } + } |