From f9a7d7cf7dbb20f274ade6baf258472ebb29aa57 Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Thu, 9 Oct 2008 05:09:42 +0000 Subject: [PATCH] [250227] - [expressions] Removing an expression in expressions view can collapse other expanded expressions. --- .../expression/ExpressionVMProvider.java | 36 +++-------- .../ExpressionsBreakpointHitUpdatePolicy.java | 29 +++++++++ .../expression/ExpressionsChangedEvent.java | 38 +++++++++++ .../ExpressionsChangedUpdateTester.java | 64 +++++++++++++++++++ .../ExpressionsManualUpdatePolicy.java | 29 +++++++++ .../update/BreakpointHitUpdatePolicy.java | 2 +- .../viewmodel/update/MessagesForVMUpdate.java | 27 ++++++++ .../ui/viewmodel/update/messages.properties | 12 ++++ .../DefaultVMModelProxyStrategy.java | 2 +- 9 files changed, 210 insertions(+), 29 deletions(-) create mode 100644 plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsBreakpointHitUpdatePolicy.java create mode 100644 plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsChangedEvent.java create mode 100644 plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsChangedUpdateTester.java create mode 100644 plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsManualUpdatePolicy.java create mode 100644 plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/MessagesForVMUpdate.java create mode 100644 plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/messages.properties diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProvider.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProvider.java index d631e22d9b8..cd508738061 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProvider.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProvider.java @@ -10,7 +10,6 @@ *******************************************************************************/ package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.concurrent.RejectedExecutionException; @@ -23,7 +22,6 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.Regis import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.RegisterGroupVMNode; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.RegisterVMNode; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.SyncRegisterDataAccess; -import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.BreakpointHitUpdatePolicy; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.variable.SyncVariableDataAccess; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.variable.VariableVMNode; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; @@ -45,8 +43,6 @@ import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.RootDMVMNode; import org.eclipse.dd.dsf.ui.viewmodel.update.AutomaticUpdatePolicy; import org.eclipse.dd.dsf.ui.viewmodel.update.IVMUpdatePolicy; -import org.eclipse.dd.dsf.ui.viewmodel.update.ManualUpdatePolicy; -import org.eclipse.dd.dsf.ui.viewmodel.update.UserEditEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.model.IExpression; import org.eclipse.debug.internal.core.IExpressionsListener2; @@ -73,19 +69,6 @@ import org.eclipse.jface.viewers.TreePath; public class ExpressionVMProvider extends AbstractDMVMProvider implements IPropertyChangeListener, IExpressionsListener2 { - /** - * Object representing a change in configured expressions. This event is - * object is used when generating a model delta. - */ - public static class ExpressionsChangedEvent extends UserEditEvent { - enum Type {ADDED, CHANGED, REMOVED, MOVED, INSERTED} - public final Type fType; - public ExpressionsChangedEvent(Type type, Set elements) { - super(elements); - fType = type; - } - } - private IExpressionVMNode[] fExpressionNodes; public ExpressionVMProvider(AbstractVMAdapter adapter, IPresentationContext context, DsfSession session) { @@ -319,7 +302,8 @@ public class ExpressionVMProvider extends AbstractDMVMProvider @Override protected IVMUpdatePolicy[] createUpdateModes() { - return new IVMUpdatePolicy[] { new AutomaticUpdatePolicy(), new ManualUpdatePolicy(), new BreakpointHitUpdatePolicy() }; + return new IVMUpdatePolicy[] { new AutomaticUpdatePolicy(), new ExpressionsManualUpdatePolicy(), + new ExpressionsBreakpointHitUpdatePolicy() }; } public void propertyChange(PropertyChangeEvent event) { @@ -327,33 +311,31 @@ public class ExpressionVMProvider extends AbstractDMVMProvider } public void expressionsAdded(IExpression[] expressions) { - expressionsListChanged(ExpressionsChangedEvent.Type.ADDED); + expressionsListChanged(ExpressionsChangedEvent.Type.ADDED, expressions, -1); } public void expressionsRemoved(IExpression[] expressions) { - expressionsListChanged(ExpressionsChangedEvent.Type.REMOVED); + expressionsListChanged(ExpressionsChangedEvent.Type.REMOVED, expressions, -1); } public void expressionsInserted(IExpression[] expressions, int index) { - expressionsListChanged(ExpressionsChangedEvent.Type.INSERTED); + expressionsListChanged(ExpressionsChangedEvent.Type.INSERTED, expressions, index); } public void expressionsMoved(IExpression[] expressions, int index) { - expressionsListChanged(ExpressionsChangedEvent.Type.MOVED); + expressionsListChanged(ExpressionsChangedEvent.Type.MOVED, expressions, index); } public void expressionsChanged(IExpression[] expressions) { - Set expressionsSet = new HashSet(); - expressionsSet.addAll(Arrays.asList(expressions)); - handleEvent(new ExpressionsChangedEvent(ExpressionsChangedEvent.Type.CHANGED, expressionsSet)); + expressionsListChanged(ExpressionsChangedEvent.Type.CHANGED, expressions, -1); } - private void expressionsListChanged(ExpressionsChangedEvent.Type type) { + private void expressionsListChanged(ExpressionsChangedEvent.Type type, IExpression[] expressions, int index) { Set rootElements = new HashSet(); for (IVMModelProxy proxy : getActiveModelProxies()) { rootElements.add(proxy.getRootElement()); } - handleEvent(new ExpressionsChangedEvent(type, rootElements)); + handleEvent(new ExpressionsChangedEvent(type, rootElements, expressions, index)); } @Override diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsBreakpointHitUpdatePolicy.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsBreakpointHitUpdatePolicy.java new file mode 100644 index 00000000000..982413a34e4 --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsBreakpointHitUpdatePolicy.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression; + +import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.BreakpointHitUpdatePolicy; +import org.eclipse.dd.dsf.ui.viewmodel.update.IElementUpdateTester; + +/** + * Manual update policy which selectively clears the cache when the expressions + * in the expression manager are modified. + */ +public class ExpressionsBreakpointHitUpdatePolicy extends BreakpointHitUpdatePolicy { + + @Override + public IElementUpdateTester getElementUpdateTester(Object event) { + if (event instanceof ExpressionsChangedEvent) { + return new ExpressionsChangedUpdateTester((ExpressionsChangedEvent)event); + } + return super.getElementUpdateTester(event); + } +} diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsChangedEvent.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsChangedEvent.java new file mode 100644 index 00000000000..4ba8299d2a6 --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsChangedEvent.java @@ -0,0 +1,38 @@ +package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression; + +import java.util.Arrays; +import java.util.Set; + +import org.eclipse.debug.core.model.IExpression; + +/** + * Object representing a change in configured expressions. This event is + * object is used when generating a model delta. + */ +public class ExpressionsChangedEvent { + enum Type {ADDED, CHANGED, REMOVED, MOVED, INSERTED} + + private final Set fExpressionManagerElements; + private final ExpressionsChangedEvent.Type fType; + private final IExpression[] fExpressions; + private final int fIndex; + + public ExpressionsChangedEvent(ExpressionsChangedEvent.Type type, Set expressionManagerElements, + IExpression[] expressions, int index) + { + fExpressionManagerElements = expressionManagerElements; + fType = type; + fExpressions = expressions; + fIndex = index; + } + + public Set getExpressionManagerElements() { return fExpressionManagerElements; } + public ExpressionsChangedEvent.Type getType() { return fType; } + public IExpression[] getExpressions() { return fExpressions; } + public int getIndex() { return fIndex; } + + @Override + public String toString() { + return Arrays.asList(fExpressions).toString() + " " + fType + "@" + fIndex; //$NON-NLS-1$ //$NON-NLS-2$ + } +} \ No newline at end of file diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsChangedUpdateTester.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsChangedUpdateTester.java new file mode 100644 index 00000000000..7e71828a5c0 --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsChangedUpdateTester.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression; + +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.dd.dsf.ui.viewmodel.update.IElementUpdateTester; +import org.eclipse.debug.core.model.IExpression; +import org.eclipse.jface.viewers.TreePath; + +class ExpressionsChangedUpdateTester implements IElementUpdateTester { + + private final ExpressionsChangedEvent fEvent; + + public ExpressionsChangedUpdateTester(ExpressionsChangedEvent event) { + fEvent = event; + } + + public int getUpdateFlags(Object viewerInput, TreePath path) { + // Check whether the element in the cache matches the expression manager element. + Object element = path.getSegmentCount() == 0 ? viewerInput : path.getLastSegment(); + if (fEvent.getExpressionManagerElements().contains(element)) { + return ExpressionsManualUpdatePolicy.FLUSH; + } + + // Check whether the element path contains one of the changed expressions. + for (int i = 0; i < path.getSegmentCount(); i++) { + if (eventContainsElement(path.getSegment(i))) { + return ExpressionsManualUpdatePolicy.FLUSH; + } + } + return 0; + } + + private boolean eventContainsElement(Object element) { + if (element instanceof IAdaptable) { + IExpression expression = (IExpression)((IAdaptable)element).getAdapter(IExpression.class); + if (expression != null) { + for (int i = 0; i < fEvent.getExpressions().length; i++) { + if (expression.equals(fEvent.getExpressions()[i])) { + return true; + } + } + } + } + return false; + } + + public boolean includes(IElementUpdateTester tester) { + return tester instanceof ExpressionsChangedUpdateTester; + } + + @Override + public String toString() { + return "(" + fEvent + ") update tester"; //$NON-NLS-1$ //$NON-NLS-2$ + } +} \ No newline at end of file diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsManualUpdatePolicy.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsManualUpdatePolicy.java new file mode 100644 index 00000000000..6fdc4a4f0db --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionsManualUpdatePolicy.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression; + +import org.eclipse.dd.dsf.ui.viewmodel.update.IElementUpdateTester; +import org.eclipse.dd.dsf.ui.viewmodel.update.ManualUpdatePolicy; + +/** + * Manual update policy which selectively clears the cache when the expressions + * in the expression manager are modified. + */ +public class ExpressionsManualUpdatePolicy extends ManualUpdatePolicy { + + @Override + public IElementUpdateTester getElementUpdateTester(Object event) { + if (event instanceof ExpressionsChangedEvent) { + return new ExpressionsChangedUpdateTester((ExpressionsChangedEvent)event); + } + return super.getElementUpdateTester(event); + } +} diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/BreakpointHitUpdatePolicy.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/BreakpointHitUpdatePolicy.java index 44973244855..8684d6433bf 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/BreakpointHitUpdatePolicy.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/BreakpointHitUpdatePolicy.java @@ -29,7 +29,7 @@ public class BreakpointHitUpdatePolicy extends ManualUpdatePolicy { @Override public String getName() { - return "Breakpoint Hit"; //$NON-NLS-1$ + return MessagesForVMUpdate.BreakpointHitUpdatePolicy_name; } @Override diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/MessagesForVMUpdate.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/MessagesForVMUpdate.java new file mode 100644 index 00000000000..a4fe824fc04 --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/MessagesForVMUpdate.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update; + +import org.eclipse.osgi.util.NLS; + +public class MessagesForVMUpdate extends NLS { + private static final String BUNDLE_NAME = "org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.messages"; //$NON-NLS-1$ + + public static String BreakpointHitUpdatePolicy_name; + + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, MessagesForVMUpdate.class); + } + + private MessagesForVMUpdate() { + } +} diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/messages.properties b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/messages.properties new file mode 100644 index 00000000000..98e6fad25fd --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/update/messages.properties @@ -0,0 +1,12 @@ +############################################################################### +# Copyright (c) 2007, 2008 Wind River Systems 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: +# Wind River Systems - initial API and implementation +############################################################################### + +BreakpointHitUpdatePolicy_name=Breakpoint Hit diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMModelProxyStrategy.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMModelProxyStrategy.java index c8c3f4044bd..91c3d9d2384 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMModelProxyStrategy.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/DefaultVMModelProxyStrategy.java @@ -545,7 +545,7 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy, IVMModelProxy // VMC. boolean calculateOffsets = false; for (int childDelta : childNodes.values()) { - if ( (childDelta & (IModelDelta.SELECT | IModelDelta.EXPAND)) != 0 ) { + if ( (childDelta & (IModelDelta.SELECT | IModelDelta.EXPAND | IModelDelta.INSERTED | IModelDelta.REMOVED)) != 0 ) { calculateOffsets = true; break; }