mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
[250227] - [expressions] Removing an expression in expressions view can collapse other expanded expressions.
This commit is contained in:
parent
568c4e705a
commit
f9a7d7cf7d
9 changed files with 210 additions and 29 deletions
|
@ -10,7 +10,6 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression;
|
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.RejectedExecutionException;
|
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.RegisterGroupVMNode;
|
||||||
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.RegisterVMNode;
|
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.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.SyncVariableDataAccess;
|
||||||
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.variable.VariableVMNode;
|
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.variable.VariableVMNode;
|
||||||
import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
|
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.datamodel.RootDMVMNode;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.update.AutomaticUpdatePolicy;
|
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.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.DebugPlugin;
|
||||||
import org.eclipse.debug.core.model.IExpression;
|
import org.eclipse.debug.core.model.IExpression;
|
||||||
import org.eclipse.debug.internal.core.IExpressionsListener2;
|
import org.eclipse.debug.internal.core.IExpressionsListener2;
|
||||||
|
@ -73,19 +69,6 @@ import org.eclipse.jface.viewers.TreePath;
|
||||||
public class ExpressionVMProvider extends AbstractDMVMProvider
|
public class ExpressionVMProvider extends AbstractDMVMProvider
|
||||||
implements IPropertyChangeListener, IExpressionsListener2
|
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<Object> elements) {
|
|
||||||
super(elements);
|
|
||||||
fType = type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private IExpressionVMNode[] fExpressionNodes;
|
private IExpressionVMNode[] fExpressionNodes;
|
||||||
|
|
||||||
public ExpressionVMProvider(AbstractVMAdapter adapter, IPresentationContext context, DsfSession session) {
|
public ExpressionVMProvider(AbstractVMAdapter adapter, IPresentationContext context, DsfSession session) {
|
||||||
|
@ -319,7 +302,8 @@ public class ExpressionVMProvider extends AbstractDMVMProvider
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected IVMUpdatePolicy[] createUpdateModes() {
|
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) {
|
public void propertyChange(PropertyChangeEvent event) {
|
||||||
|
@ -327,33 +311,31 @@ public class ExpressionVMProvider extends AbstractDMVMProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expressionsAdded(IExpression[] expressions) {
|
public void expressionsAdded(IExpression[] expressions) {
|
||||||
expressionsListChanged(ExpressionsChangedEvent.Type.ADDED);
|
expressionsListChanged(ExpressionsChangedEvent.Type.ADDED, expressions, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expressionsRemoved(IExpression[] expressions) {
|
public void expressionsRemoved(IExpression[] expressions) {
|
||||||
expressionsListChanged(ExpressionsChangedEvent.Type.REMOVED);
|
expressionsListChanged(ExpressionsChangedEvent.Type.REMOVED, expressions, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expressionsInserted(IExpression[] expressions, int index) {
|
public void expressionsInserted(IExpression[] expressions, int index) {
|
||||||
expressionsListChanged(ExpressionsChangedEvent.Type.INSERTED);
|
expressionsListChanged(ExpressionsChangedEvent.Type.INSERTED, expressions, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expressionsMoved(IExpression[] expressions, int index) {
|
public void expressionsMoved(IExpression[] expressions, int index) {
|
||||||
expressionsListChanged(ExpressionsChangedEvent.Type.MOVED);
|
expressionsListChanged(ExpressionsChangedEvent.Type.MOVED, expressions, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expressionsChanged(IExpression[] expressions) {
|
public void expressionsChanged(IExpression[] expressions) {
|
||||||
Set<Object> expressionsSet = new HashSet<Object>();
|
expressionsListChanged(ExpressionsChangedEvent.Type.CHANGED, expressions, -1);
|
||||||
expressionsSet.addAll(Arrays.asList(expressions));
|
|
||||||
handleEvent(new ExpressionsChangedEvent(ExpressionsChangedEvent.Type.CHANGED, expressionsSet));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void expressionsListChanged(ExpressionsChangedEvent.Type type) {
|
private void expressionsListChanged(ExpressionsChangedEvent.Type type, IExpression[] expressions, int index) {
|
||||||
Set<Object> rootElements = new HashSet<Object>();
|
Set<Object> rootElements = new HashSet<Object>();
|
||||||
for (IVMModelProxy proxy : getActiveModelProxies()) {
|
for (IVMModelProxy proxy : getActiveModelProxies()) {
|
||||||
rootElements.add(proxy.getRootElement());
|
rootElements.add(proxy.getRootElement());
|
||||||
}
|
}
|
||||||
handleEvent(new ExpressionsChangedEvent(type, rootElements));
|
handleEvent(new ExpressionsChangedEvent(type, rootElements, expressions, index));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<Object> fExpressionManagerElements;
|
||||||
|
private final ExpressionsChangedEvent.Type fType;
|
||||||
|
private final IExpression[] fExpressions;
|
||||||
|
private final int fIndex;
|
||||||
|
|
||||||
|
public ExpressionsChangedEvent(ExpressionsChangedEvent.Type type, Set<Object> expressionManagerElements,
|
||||||
|
IExpression[] expressions, int index)
|
||||||
|
{
|
||||||
|
fExpressionManagerElements = expressionManagerElements;
|
||||||
|
fType = type;
|
||||||
|
fExpressions = expressions;
|
||||||
|
fIndex = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Object> 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$
|
||||||
|
}
|
||||||
|
}
|
|
@ -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$
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,7 +29,7 @@ public class BreakpointHitUpdatePolicy extends ManualUpdatePolicy {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "Breakpoint Hit"; //$NON-NLS-1$
|
return MessagesForVMUpdate.BreakpointHitUpdatePolicy_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -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() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -545,7 +545,7 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy, IVMModelProxy
|
||||||
// VMC.
|
// VMC.
|
||||||
boolean calculateOffsets = false;
|
boolean calculateOffsets = false;
|
||||||
for (int childDelta : childNodes.values()) {
|
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;
|
calculateOffsets = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue