diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/IExpressionVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/IExpressionVMNode.java index 18a9939cca3..44c09ad8470 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/IExpressionVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/IExpressionVMNode.java @@ -45,15 +45,19 @@ public interface IExpressionVMNode extends IVMNode { public int getDeltaFlagsForExpression(IExpression expression, Object event); /** - * Adds delta flags to the given parent delta based on the expression object - * given. + * Adds delta flags to the given parent delta based on the expression + * object given. The nodes add flags to the expression view's root + * delta using this method, regardless of whether the node is directly + * below the expression manager or not. + * */ public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta, TreePath path, RequestMonitor rm); /** - * Adds delta to the given parent delta based on the given element which was created base on - * an expression parsed by this node. + * Adds delta to the given parent delta based on the given element that + * was created base on an expression parsed by this node. The VM nodes can + * add a new delta node to the parentDela by implementing this method. */ public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm); } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterBitFieldVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterBitFieldVMNode.java index 85b227099ad..bf13c1bac02 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterBitFieldVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterBitFieldVMNode.java @@ -29,15 +29,15 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.I import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.RegisterBitFieldCellModifier.BitFieldEditorStyle; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.service.IFormattedValues; -import org.eclipse.dd.dsf.debug.service.IMemory; import org.eclipse.dd.dsf.debug.service.IRegisters; -import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; +import org.eclipse.dd.dsf.debug.service.IMemory.IMemoryChangedEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IMnemonic; +import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; @@ -154,7 +154,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode private final IFormattedValuePreferenceStore fFormattedPrefStore; public RegisterBitFieldVMNode(IFormattedValuePreferenceStore prefStore, AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess access) { - super(provider, session, IRegisters.IBitFieldDMContext.class); + super(provider, session, IBitFieldDMContext.class); fSyncRegisterDataAccess = access; fFormattedPrefStore = prefStore; } @@ -324,7 +324,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode continue; } - final IBitFieldDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IRegisters.IBitFieldDMContext.class); + final IBitFieldDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IBitFieldDMContext.class); getDMVMProvider().getModelData( this, @@ -507,24 +507,19 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object) */ public int getDeltaFlags(Object e) { - if (e instanceof IRunControl.ISuspendedDMEvent) { + if ( e instanceof ISuspendedDMEvent || + e instanceof IMemoryChangedEvent || + e instanceof IRegisterChangedDMEvent || + (e instanceof PropertyChangeEvent && + ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) + { return IModelDelta.CONTENT; - } - - if (e instanceof IRegisters.IBitFieldChangedDMEvent) { + } + + if (e instanceof IBitFieldChangedDMEvent) { return IModelDelta.STATE; } - if (e instanceof IMemory.IMemoryChangedEvent) { - return IModelDelta.CONTENT; - } - - if (e instanceof PropertyChangeEvent && - ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) - { - return IModelDelta.CONTENT; - } - return IModelDelta.NO_CHANGE; } @@ -533,28 +528,22 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor) */ public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) { - if (e instanceof IRunControl.ISuspendedDMEvent) { - // Create a delta that the whole register group has changed. - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - - if (e instanceof IRegisters.IBitFieldChangedDMEvent) { - /* - * Create a delta indicating the bit field has changed. - */ - parentDelta.addNode( createVMContext(((IRegisters.IBitFieldChangedDMEvent)e).getDMContext()), IModelDelta.STATE ); - } - - if (e instanceof IMemory.IMemoryChangedEvent) { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - - if (e instanceof PropertyChangeEvent && - ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) + // The following events can affect any bit field's values, + // refresh the contents of the parent element (i.e. all the registers). + if ( e instanceof ISuspendedDMEvent || + e instanceof IMemoryChangedEvent || + e instanceof IRegisterChangedDMEvent || + (e instanceof PropertyChangeEvent && + ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) { parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - + } + + if (e instanceof IBitFieldChangedDMEvent) { + // Create a delta indicating that the value of bit field has changed. + parentDelta.addNode( createVMContext(((IBitFieldChangedDMEvent)e).getDMContext()), IModelDelta.STATE ); + } + rm.done(); } @@ -761,7 +750,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object) */ public int getDeltaFlagsForExpression(IExpression expression, Object event) { - if (event instanceof IRunControl.ISuspendedDMEvent) { + if (event instanceof ISuspendedDMEvent) { return IModelDelta.CONTENT; } @@ -770,7 +759,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode return IModelDelta.CONTENT; } - if (event instanceof IMemory.IMemoryChangedEvent) { + if (event instanceof IMemoryChangedEvent) { return IModelDelta.CONTENT; } @@ -783,16 +772,11 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode */ public void buildDeltaForExpression(final IExpression expression, final int elementIdx, final Object event, final VMDelta parentDelta, final TreePath path, final RequestMonitor rm) { + // Always refresh the contents of the view upon suspended event. if (event instanceof ISuspendedDMEvent) { - // Mark the parent delta indicating that elements were added and/or removed. parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - else if (event instanceof IRegisters.IRegisterChangedDMEvent) { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - else if (event instanceof IMemory.IMemoryChangedEvent) { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } + } + rm.done(); } @@ -802,19 +786,15 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode */ public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm) { - if (event instanceof IMemory.IMemoryChangedEvent) { - parentDelta.addNode(element, IModelDelta.STATE); - } - - if (event instanceof IBitFieldChangedDMEvent) { + // The following events can affect register values, refresh the state + // of the expression. + if ( event instanceof IRegisterChangedDMEvent || + event instanceof IMemoryChangedEvent || + (event instanceof PropertyChangeEvent && + ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) + { parentDelta.addNode(element, IModelDelta.STATE); } - - if (event instanceof PropertyChangeEvent && - ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) - { - parentDelta.addNode(element, IModelDelta.CONTENT); - } rm.done(); } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterGroupVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterGroupVMNode.java index 733ceb0cb0e..52c67ab59d1 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterGroupVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterGroupVMNode.java @@ -27,10 +27,11 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.Abs import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.WatchExpressionCellModifier; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.service.IRegisters; -import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IRegisters.IGroupChangedDMEvent; +import org.eclipse.dd.dsf.debug.service.IRegisters.IGroupsChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; +import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; import org.eclipse.dd.dsf.ui.viewmodel.IVMContext; @@ -130,7 +131,7 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode private WatchExpressionCellModifier fWatchExpressionCellModifier = new WatchExpressionCellModifier(); public RegisterGroupVMNode(AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess syncDataAccess) { - super(provider, session, IRegisters.IRegisterGroupDMContext.class); + super(provider, session, IRegisterGroupDMContext.class); fSyncRegisterDataAccess = syncDataAccess; } @@ -303,13 +304,13 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object) */ public int getDeltaFlags(Object e) { - if (e instanceof IRunControl.ISuspendedDMEvent) { + if (e instanceof ISuspendedDMEvent) { return IModelDelta.CONTENT; } - else if (e instanceof IRegisters.IGroupsChangedDMEvent) { + else if (e instanceof IGroupsChangedDMEvent) { return IModelDelta.CONTENT; } - else if (e instanceof IRegisters.IGroupChangedDMEvent) { + else if (e instanceof IGroupChangedDMEvent) { return IModelDelta.STATE; } return IModelDelta.NO_CHANGE; @@ -320,15 +321,18 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor) */ public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) { - if (e instanceof IRunControl.ISuspendedDMEvent) { + // Although the register groups themselves are not affected by the + // suspended event, typically all the registers are. Add a CONTENT changed + // flag to the parent to repaint all the groups and their registers. + if (e instanceof ISuspendedDMEvent) { // Create a delta that indicates all groups have changed parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); } - else if (e instanceof IRegisters.IGroupsChangedDMEvent) { + else if (e instanceof IGroupsChangedDMEvent) { // Create a delta that indicates all groups have changed parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); } - else if (e instanceof IRegisters.IGroupChangedDMEvent) { + else if (e instanceof IGroupChangedDMEvent) { // Create a delta that indicates that specific group changed parentDelta.addNode( createVMContext(((IGroupChangedDMEvent)e).getDMContext()), IModelDelta.STATE ); } @@ -365,10 +369,17 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object) */ public int getDeltaFlagsForExpression(IExpression expression, Object event) { - if (event instanceof IRunControl.ISuspendedDMEvent) { + + if (event instanceof ISuspendedDMEvent || + event instanceof IGroupsChangedDMEvent) + { return IModelDelta.CONTENT; } + if (event instanceof IGroupChangedDMEvent) { + return IModelDelta.STATE; + } + return IModelDelta.NO_CHANGE; } @@ -379,10 +390,19 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta, TreePath path, RequestMonitor rm) { - if (event instanceof IRunControl.ISuspendedDMEvent) { + if (event instanceof ISuspendedDMEvent) { // Mark the parent delta indicating that elements were added and/or removed. parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); } + + // If the group definitions have changed, refresh the whole expressions + // view contents since previously invalid expressions may now evaluate + // to valid groups + if (event instanceof IGroupsChangedDMEvent) { + parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); + } + + rm.done(); } @@ -392,10 +412,7 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode */ public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm) { - if (event instanceof IRegisters.IGroupsChangedDMEvent) { - parentDelta.addNode(element, IModelDelta.CONTENT); - } - if (event instanceof IRegisters.IGroupChangedDMEvent) { + if (event instanceof IGroupChangedDMEvent) { parentDelta.addNode(element, IModelDelta.STATE); } rm.done(); diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterVMNode.java index 28a93b721de..e24e5320e40 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterVMNode.java @@ -28,15 +28,16 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.I import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.IFormattedValueVMContext; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.service.IFormattedValues; -import org.eclipse.dd.dsf.debug.service.IMemory; import org.eclipse.dd.dsf.debug.service.IRegisters; -import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; +import org.eclipse.dd.dsf.debug.service.IMemory.IMemoryChangedEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; +import org.eclipse.dd.dsf.debug.service.IRegisters.IRegistersChangedDMEvent; +import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; import org.eclipse.dd.dsf.ui.viewmodel.IVMContext; @@ -53,6 +54,7 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; @@ -146,7 +148,7 @@ public class RegisterVMNode extends AbstractExpressionVMNode private final IFormattedValuePreferenceStore fFormattedPrefStore; public RegisterVMNode(IFormattedValuePreferenceStore prefStore, AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess syncDataAccess) { - super(provider, session, IRegisters.IRegisterDMContext.class); + super(provider, session, IRegisterDMContext.class); fSyncRegisterDataAccess = syncDataAccess; fFormattedPrefStore = prefStore; } @@ -306,7 +308,7 @@ public class RegisterVMNode extends AbstractExpressionVMNode protected void updateLabelInSessionThread(ILabelUpdate[] updates) { for (final ILabelUpdate update : updates) { - final IRegisterDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IRegisters.IRegisterDMContext.class); + final IRegisterDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IRegisterDMContext.class); if ( dmc == null ) { handleFailedUpdate(update); continue; @@ -455,6 +457,16 @@ public class RegisterVMNode extends AbstractExpressionVMNode } } + @Override + public void update(IHasChildrenUpdate[] updates) { + // As an optimization, always indicate that register groups have + // children. + for (IHasChildrenUpdate update : updates) { + update.setHasChilren(true); + update.done(); + } + } + /* * (non-Javadoc) * @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#updateElementsInSessionThread(org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate) @@ -498,32 +510,19 @@ public class RegisterVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object) */ public int getDeltaFlags(Object e) { - if (e instanceof IRunControl.ISuspendedDMEvent) { - return IModelDelta.CONTENT; - } - - if (e instanceof IRegisters.IRegistersChangedDMEvent) { - return IModelDelta.CONTENT; - } - - if (e instanceof IMemory.IMemoryChangedEvent) { - return IModelDelta.CONTENT; - } - - if (e instanceof IRegisters.IRegisterChangedDMEvent) { - /* - * Logically one would think that STATE should be specified here. But we specify CONTENT - * as well so that if there are sub-registers ( BIT FIELDS ) they will be forced to update - * and show new values when the total register changes. - */ - return IModelDelta.CONTENT; - } - - if (e instanceof PropertyChangeEvent && - ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) + if ( e instanceof ISuspendedDMEvent || + e instanceof IMemoryChangedEvent || + e instanceof IRegistersChangedDMEvent || + (e instanceof PropertyChangeEvent && + ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) { - return IModelDelta.CONTENT; + return IModelDelta.CONTENT; + } + + if (e instanceof IRegisterChangedDMEvent) { + return IModelDelta.STATE; } + return IModelDelta.NO_CHANGE; } @@ -532,30 +531,22 @@ public class RegisterVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor) */ public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) { - if (e instanceof IRunControl.ISuspendedDMEvent) { + // The following events can affect any register's values, + // refresh the contents of the parent element (i.e. all the registers). + if ( e instanceof ISuspendedDMEvent || + e instanceof IMemoryChangedEvent || + e instanceof IRegistersChangedDMEvent || + (e instanceof PropertyChangeEvent && + ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) + { // Create a delta that the whole register group has changed. parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); } - if (e instanceof IRegisters.IRegistersChangedDMEvent) { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);; + if (e instanceof IRegisterChangedDMEvent) { + parentDelta.addNode( createVMContext(((IRegisterChangedDMEvent)e).getDMContext()), IModelDelta.STATE ); } - if (e instanceof IMemory.IMemoryChangedEvent) { - // Mark the parent delta indicating that elements were added and/or removed. - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - - if (e instanceof IRegisters.IRegisterChangedDMEvent) { - parentDelta.addNode( createVMContext(((IRegisterChangedDMEvent)e).getDMContext()), IModelDelta.CONTENT | IModelDelta.STATE ); - } - - if (e instanceof PropertyChangeEvent && - ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) - { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - rm.done(); } @@ -563,7 +554,6 @@ public class RegisterVMNode extends AbstractExpressionVMNode * Expected format: GRP( GroupName ).REG( RegisterName ) * or: $RegisterName */ - public boolean canParseExpression(IExpression expression) { return parseExpressionForRegisterName(expression.getExpressionText()) != null; } @@ -670,19 +660,20 @@ public class RegisterVMNode extends AbstractExpressionVMNode * @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object) */ public int getDeltaFlagsForExpression(IExpression expression, Object event) { - if (event instanceof IRunControl.ISuspendedDMEvent) { - return IModelDelta.CONTENT; - } - if (event instanceof PropertyChangeEvent && - ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) + if ( event instanceof IRegisterChangedDMEvent || + event instanceof IMemoryChangedEvent || + (event instanceof PropertyChangeEvent && + ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) { - return IModelDelta.CONTENT; - } - - if (event instanceof IMemory.IMemoryChangedEvent) { - return IModelDelta.CONTENT; + return IModelDelta.STATE; } + if (event instanceof IRegistersChangedDMEvent || + event instanceof ISuspendedDMEvent) + { + return IModelDelta.CONTENT; + } + return IModelDelta.NO_CHANGE; } @@ -693,15 +684,19 @@ public class RegisterVMNode extends AbstractExpressionVMNode public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta, TreePath path, RequestMonitor rm) { - if (event instanceof IRunControl.ISuspendedDMEvent) { - // Mark the parent delta indicating that elements were added and/or removed. - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - - if (event instanceof IMemory.IMemoryChangedEvent) { + // If the register definition has changed, refresh all the + // expressions in the expression manager. This is because some + // expressions that were previously invalid, may now represent new + // registers. + if (event instanceof IRegistersChangedDMEvent) { parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); } - + + // Always refresh the contents of the view upon suspended event. + if (event instanceof ISuspendedDMEvent) { + parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); + } + rm.done(); } @@ -711,23 +706,15 @@ public class RegisterVMNode extends AbstractExpressionVMNode */ public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm) { - if (event instanceof IRegisters.IRegisterChangedDMEvent) { - parentDelta.addNode(element, IModelDelta.STATE); - } - - if (event instanceof IRegisters.IRegistersChangedDMEvent) { - parentDelta.addNode(element, IModelDelta.STATE); - } - - if (event instanceof IMemory.IMemoryChangedEvent) { - parentDelta.addNode(element, IModelDelta.CONTENT); - } - - if (event instanceof PropertyChangeEvent && - ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) + // The following events can affect register values, refresh the state + // of the expression. + if ( event instanceof IRegisterChangedDMEvent || + event instanceof IMemoryChangedEvent || + (event instanceof PropertyChangeEvent && + ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) { - parentDelta.addNode(element, IModelDelta.CONTENT); - } + parentDelta.addNode(element, IModelDelta.STATE); + } rm.done(); } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/variable/VariableVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/variable/VariableVMNode.java index 1669574eb9a..c91a18d2074 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/variable/VariableVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/variable/VariableVMNode.java @@ -34,13 +34,14 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.I import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.service.IExpressions; import org.eclipse.dd.dsf.debug.service.IFormattedValues; -import org.eclipse.dd.dsf.debug.service.IMemory; -import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IStack; +import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMContext; import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMData; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; +import org.eclipse.dd.dsf.debug.service.IMemory.IMemoryChangedEvent; +import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext; import org.eclipse.dd.dsf.debug.service.IStack.IVariableDMContext; import org.eclipse.dd.dsf.debug.service.IStack.IVariableDMData; @@ -78,49 +79,6 @@ public class VariableVMNode extends AbstractExpressionVMNode implements IElementEditor, IElementLabelProvider, IElementMementoProvider { - //private final static int MAX_STRING_VALUE_LENGTH = 40; - - public int getDeltaFlags(Object e) { - /* - * @see buildDelta() - */ - - // When an expression changes or memory, we must do a full refresh - // see Bug 213061 and Bug 214550 - if (e instanceof IRunControl.ISuspendedDMEvent || - e instanceof IExpressions.IExpressionChangedDMEvent || - e instanceof IMemory.IMemoryChangedEvent) { - return IModelDelta.CONTENT; - } - - if (e instanceof PropertyChangeEvent && - ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) - { - return IModelDelta.CONTENT; - } - - return IModelDelta.NO_CHANGE; - } - - public void buildDelta(final Object event, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) { - - // When an expression changes or memory, we must do a full refresh - // see Bug 213061 and Bug 214550 - if (event instanceof IRunControl.ISuspendedDMEvent || - event instanceof IExpressions.IExpressionChangedDMEvent || - event instanceof IMemory.IMemoryChangedEvent) { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - - if (event instanceof PropertyChangeEvent && - ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) - { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - - requestMonitor.done(); - } - private final IFormattedValuePreferenceStore fFormattedPrefStore; private final SyncVariableDataAccess fSyncVariableDataAccess; @@ -519,49 +477,6 @@ public class VariableVMNode extends AbstractExpressionVMNode } } - public int getDeltaFlagsForExpression(IExpression expression, Object event) { - // When an expression changes or memory, we must do a full refresh - // see Bug 213061 and Bug 214550 - if (event instanceof IRunControl.ISuspendedDMEvent || - event instanceof IExpressions.IExpressionChangedDMEvent || - event instanceof IMemory.IMemoryChangedEvent) { - return IModelDelta.CONTENT; - } - - if (event instanceof PropertyChangeEvent && - ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) - { - return IModelDelta.CONTENT; - } - return IModelDelta.NO_CHANGE; - } - - public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta, - TreePath path, RequestMonitor rm) - { - rm.done(); - } - - public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, - RequestMonitor rm) - { - // When an expression changes or memory, we must do a full refresh - // see Bug 213061 and Bug 214550 - if (event instanceof IRunControl.ISuspendedDMEvent || - event instanceof IExpressions.IExpressionChangedDMEvent || - event instanceof IMemory.IMemoryChangedEvent) { - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } - - if (event instanceof PropertyChangeEvent && - ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) - { - parentDelta.addNode(element, IModelDelta.CONTENT); - } - - rm.done(); - } - @Override protected void updateElementsInSessionThread(final IChildrenUpdate update) { // Get the data model context object for the current node in the hierarchy. @@ -730,6 +645,85 @@ public class VariableVMNode extends AbstractExpressionVMNode stackFrameService.getLocals(frameDmc, rm); } + //private final static int MAX_STRING_VALUE_LENGTH = 40; + + public int getDeltaFlags(Object e) { + if ( e instanceof ISuspendedDMEvent || + e instanceof IMemoryChangedEvent || + e instanceof IExpressionChangedDMEvent || + (e instanceof PropertyChangeEvent && + ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) + { + // Create a delta that the whole register group has changed. + return IModelDelta.CONTENT; + } + + return IModelDelta.NO_CHANGE; + } + + public void buildDelta(final Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) { + + // The following events can affect any expression's values, + // refresh the contents of the parent element (i.e. all the expressions). + if ( e instanceof ISuspendedDMEvent || + e instanceof IMemoryChangedEvent || + e instanceof IExpressionChangedDMEvent || + (e instanceof PropertyChangeEvent && + ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) + { + // Create a delta that the whole register group has changed. + parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); + } + + requestMonitor.done(); + } + + public int getDeltaFlagsForExpression(IExpression expression, Object event) { + if ( event instanceof IExpressionChangedDMEvent || + event instanceof IMemoryChangedEvent || + (event instanceof PropertyChangeEvent && + ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) + { + return IModelDelta.STATE; + } + + if (event instanceof ISuspendedDMEvent) + { + return IModelDelta.CONTENT; + } + + return IModelDelta.NO_CHANGE; + } + + public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta, + TreePath path, RequestMonitor rm) + { + // Always refresh the contents of the view upon suspended event. + if (event instanceof ISuspendedDMEvent) { + parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); + } + + rm.done(); + } + + public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, + RequestMonitor rm) + { + // The following events can affect expression values, refresh the state + // of the expression. + if ( event instanceof IExpressionChangedDMEvent || + event instanceof IMemoryChangedEvent || + (event instanceof PropertyChangeEvent && + ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) ) + { + parentDelta.addNode(element, IModelDelta.STATE); + } + + rm.done(); + } + + + /* * (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) diff --git a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IFormattedValues.java b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IFormattedValues.java index 191438a62ad..b98be352193 100644 --- a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IFormattedValues.java +++ b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IFormattedValues.java @@ -97,7 +97,7 @@ public interface IFormattedValues extends IDMService { @Override public String toString() { - return super.toString() + ".format(" + getFormatID() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ + return baseToString() + ".format(" + getFormatID() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } } @@ -112,5 +112,7 @@ public interface IFormattedValues extends IDMService { public String getFormattedValue() { return fValue; } + + } } \ No newline at end of file