1
0
Fork 0
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:
Pawel Piech 2008-10-09 05:09:42 +00:00
parent 568c4e705a
commit f9a7d7cf7d
9 changed files with 210 additions and 29 deletions

View file

@ -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

View file

@ -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);
}
}

View file

@ -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$
}
}

View file

@ -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$
}
}

View file

@ -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);
}
}

View file

@ -29,7 +29,7 @@ public class BreakpointHitUpdatePolicy extends ManualUpdatePolicy {
@Override
public String getName() {
return "Breakpoint Hit"; //$NON-NLS-1$
return MessagesForVMUpdate.BreakpointHitUpdatePolicy_name;
}
@Override

View file

@ -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() {
}
}

View file

@ -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

View file

@ -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;
}