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;
|
||||
|
||||
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<Object> 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<Object> expressionsSet = new HashSet<Object>();
|
||||
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<Object> rootElements = new HashSet<Object>();
|
||||
for (IVMModelProxy proxy : getActiveModelProxies()) {
|
||||
rootElements.add(proxy.getRootElement());
|
||||
}
|
||||
handleEvent(new ExpressionsChangedEvent(type, rootElements));
|
||||
handleEvent(new ExpressionsChangedEvent(type, rootElements, expressions, index));
|
||||
}
|
||||
|
||||
@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
|
||||
public String getName() {
|
||||
return "Breakpoint Hit"; //$NON-NLS-1$
|
||||
return MessagesForVMUpdate.BreakpointHitUpdatePolicy_name;
|
||||
}
|
||||
|
||||
@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.
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue