From 6290d552759b4feb90f4ce88ef6b5bcfd7725dda Mon Sep 17 00:00:00 2001 From: Randy Rohrbach Date: Mon, 12 May 2008 17:22:01 +0000 Subject: [PATCH] Bugzilla 202852 & 211490. --- .../viewmodel/launch/StackFramesVMNode.java | 111 ++++++++++++++- .../register/RegisterBitFieldVMNode.java | 130 ++++++++++++++++- .../register/RegisterGroupVMNode.java | 131 +++++++++++++++++- .../ui/viewmodel/register/RegisterVMNode.java | 130 ++++++++++++++++- .../ui/viewmodel/variable/VariableVMNode.java | 64 ++++++++- .../ui/viewmodel/launch/PDAProgramVMNode.java | 66 ++++++++- .../dd/examples/pda/service/PDARegisters.java | 16 +-- .../ui/viewmodel/launch/ContainerVMNode.java | 70 +++++++++- .../ui/viewmodel/launch/ThreadVMNode.java | 70 +++++++++- 9 files changed, 763 insertions(+), 25 deletions(-) diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/StackFramesVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/StackFramesVMNode.java index 9e13c8321d9..e3fae8ab7f9 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/StackFramesVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/StackFramesVMNode.java @@ -18,6 +18,7 @@ import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.DMContexts; +import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IStack; import org.eclipse.dd.dsf.debug.service.StepQueueManager; @@ -38,17 +39,21 @@ import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; 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.IViewerUpdate; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.ui.IMemento; @SuppressWarnings("restriction") public class StackFramesVMNode extends AbstractDMVMNode - implements IElementLabelProvider + implements IElementLabelProvider, IElementMementoProvider { public IVMContext[] fCachedOldFrameVMCs; @@ -57,6 +62,10 @@ public class StackFramesVMNode extends AbstractDMVMNode super(provider, session, IStack.IFrameDMContext.class); } + /* + * (non-Javadoc) + * @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#updateHasElementsInSessionThread(org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate) + */ @Override protected void updateHasElementsInSessionThread(IHasChildrenUpdate update) { IRunControl runControl = getServicesTracker().getService(IRunControl.class); @@ -70,6 +79,10 @@ public class StackFramesVMNode extends AbstractDMVMNode update.done(); } + /* + * (non-Javadoc) + * @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#updateElementsInSessionThread(org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate) + */ @Override protected void updateElementsInSessionThread(final IChildrenUpdate update) { @@ -166,7 +179,10 @@ public class StackFramesVMNode extends AbstractDMVMNode } } - + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider#update(org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate[]) + */ public void update(final ILabelUpdate[] updates) { try { getSession().getExecutor().execute(new DsfRunnable() { @@ -180,7 +196,6 @@ public class StackFramesVMNode extends AbstractDMVMNode } } - protected void updateLabelInSessionThread(ILabelUpdate[] updates) { for (final ILabelUpdate update : updates) { final IFrameDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IFrameDMContext.class); @@ -291,6 +306,10 @@ public class StackFramesVMNode extends AbstractDMVMNode update.setLabel(label.toString(), 0); } + /* + * (non-Javadoc) + * @see org.eclipse.dd.dsf.ui.viewmodel.AbstractVMNode#handleFailedUpdate(org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate) + */ @Override protected void handleFailedUpdate(IViewerUpdate update) { if (update instanceof ILabelUpdate) { @@ -302,7 +321,10 @@ public class StackFramesVMNode extends AbstractDMVMNode } } - + /* + * (non-Javadoc) + * @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#getContextsForEvent(org.eclipse.dd.dsf.ui.viewmodel.VMDelta, java.lang.Object, org.eclipse.dd.dsf.concurrent.DataRequestMonitor) + */ @Override public void getContextsForEvent(final VMDelta parentDelta, Object e, final DataRequestMonitor rm) { if (e instanceof ModelProxyInstalledEvent) { @@ -328,6 +350,10 @@ public class StackFramesVMNode extends AbstractDMVMNode super.getContextsForEvent(parentDelta, e, rm); } + /* + * (non-Javadoc) + * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object) + */ public int getDeltaFlags(Object e) { // This node generates delta if the timers have changed, or if the // label has changed. @@ -348,6 +374,10 @@ public class StackFramesVMNode extends AbstractDMVMNode return IModelDelta.NO_CHANGE; } + /* + * (non-Javadoc) + * @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(final Object e, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) { if (e instanceof IContainerSuspendedDMEvent) { IContainerSuspendedDMEvent csEvent = (IContainerSuspendedDMEvent)e; @@ -464,4 +494,77 @@ public class StackFramesVMNode extends AbstractDMVMNode ); } + private String produceFrameElementName( String viewName , IFrameDMContext frame ) { + /* + * We are addressing Bugzilla 211490 which wants the Register View to keep the same expanded + * state for registers for stack frames within the same thread. Different threads could have + * different register sets ( e.g. one thread may have floating point & another may not ). But + * within a thread we are enforcing the assumption that the register sets will be the same. + * So we make a more convenient work flow by keeping the same expansion when selecting amount + * stack frames within the same thread. We accomplish this by only differentiating by adding + * the level for the Expression/Variables view. Otherwise we do not delineate based on which + * view and this captures the Register View in its filter. + */ + if ( viewName.startsWith(IDebugUIConstants.ID_VARIABLE_VIEW) || + viewName.startsWith(IDebugUIConstants.ID_EXPRESSION_VIEW) ) + { + return "Frame." + frame.getLevel() + "." + frame.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + return "Frame" + frame.getSessionId(); //$NON-NLS-1$ + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) + */ + public void compareElements(IElementCompareRequest[] requests) { + + for ( IElementCompareRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + String mementoName = memento.getString("STACK_FRAME_MEMENTO_NAME"); //$NON-NLS-1$ + + if (mementoName != null) { + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IFrameDMContext) { + + String elementName = produceFrameElementName( request.getPresentationContext().getId(), (IFrameDMContext) dmc ); + request.setEqual( elementName.equals( mementoName ) ); + } + } + } + request.done(); + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) + */ + public void encodeElements(IElementMementoRequest[] requests) { + + for ( IElementMementoRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IFrameDMContext) { + + String elementName = produceFrameElementName( request.getPresentationContext().getId(), (IFrameDMContext) dmc ); + memento.putString("STACK_FRAME_MEMENTO_NAME", elementName); //$NON-NLS-1$ + } + } + request.done(); + } + } } 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 668c5426a92..fbde122c836 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 @@ -53,8 +53,11 @@ import org.eclipse.debug.internal.ui.DebugPluginImages; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; 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.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; @@ -68,10 +71,11 @@ import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IMemento; @SuppressWarnings("restriction") public class RegisterBitFieldVMNode extends AbstractExpressionVMNode - implements IElementEditor, IElementLabelProvider + implements IElementEditor, IElementLabelProvider, IElementMementoProvider { protected class BitFieldVMC extends DMVMContext implements IFormattedValueVMContext @@ -796,4 +800,128 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode rm.done(); } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) + */ + public void compareElements(IElementCompareRequest[] requests) { + + for ( final IElementCompareRequest request : requests ) { + + Object element = request.getElement(); + final IMemento memento = request.getMemento(); + final String mementoName = memento.getString("BITFIELD_MEMENTO_NAME"); //$NON-NLS-1$ + + if (mementoName != null) { + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IBitFieldDMContext ) + { + final IBitFieldDMContext bitFieldDmc = (IBitFieldDMContext) dmc; + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + + /* + * Now make sure the register group is the one we want. + */ + + final DataRequestMonitor dataDone = new DataRequestMonitor(regService.getExecutor(), null) { + @Override + protected void handleCompleted() { + if ( getStatus().isOK() ) { + String bitFieldName = "BitField." + getData().getName() + "." + bitFieldDmc.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + request.setEqual( bitFieldName.equals( mementoName ) ); + } + request.done(); + } + }; + + /* + * Now go get the model data for the single register group found. + */ + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + if ( regService != null ) { + regService.getBitFieldData( bitFieldDmc, dataDone ); + } + else { + request.done(); + } + } + }); + } catch (RejectedExecutionException e) { + request.done(); + } + + continue; + } + } + } + request.done(); + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) + */ + public void encodeElements(IElementMementoRequest[] requests) { + + for ( final IElementMementoRequest request : requests ) { + + Object element = request.getElement(); + final IMemento memento = request.getMemento(); + + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IBitFieldDMContext ) + { + final IBitFieldDMContext bitFieldDmc = (IBitFieldDMContext) dmc; + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + + /* + * Now make sure the register group is the one we want. + */ + final DataRequestMonitor dataDone = new DataRequestMonitor(regService.getExecutor(), null) { + @Override + protected void handleCompleted() { + if ( getStatus().isOK() ) { + String bitFieldName = "BitField." + getData().getName() + "." + bitFieldDmc.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + memento.putString("BITFIELD_MEMENTO_NAME", bitFieldName); //$NON-NLS-1$ + } + request.done(); + } + }; + + /* + * Now go get the model data for the single register group found. + */ + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + if ( regService != null ) { + regService.getBitFieldData( bitFieldDmc, dataDone ); + } + else { + request.done(); + } + } + }); + } catch (RejectedExecutionException e) { + request.done(); + } + + continue; + } + } + request.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 55362a57469..c994261b297 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 @@ -41,8 +41,11 @@ import org.eclipse.debug.core.model.IExpression; import org.eclipse.debug.internal.ui.DebugPluginImages; import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; 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.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; @@ -54,10 +57,11 @@ import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IMemento; @SuppressWarnings("restriction") public class RegisterGroupVMNode extends AbstractExpressionVMNode - implements IElementEditor, IElementLabelProvider + implements IElementEditor, IElementLabelProvider, IElementMementoProvider { protected class RegisterGroupVMC extends DMVMContext { @@ -459,4 +463,129 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode public ICellModifier getCellModifier(IPresentationContext context, Object element) { return fWatchExpressionCellModifier; } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) + */ + public void compareElements(IElementCompareRequest[] requests) { + + for ( final IElementCompareRequest request : requests ) { + + Object element = request.getElement(); + final IMemento memento = request.getMemento(); + final String mementoName = memento.getString("GROUP_MEMENTO_NAME"); //$NON-NLS-1$ + + if (mementoName != null) { + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IRegisterGroupDMContext ) + { + final IRegisterGroupDMContext regDmc = (IRegisterGroupDMContext) dmc; + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + + /* + * Now make sure the register group is the one we want. + */ + + final DataRequestMonitor regGroupDataDone = new DataRequestMonitor(regService.getExecutor(), null) { + @Override + protected void handleCompleted() { + if ( getStatus().isOK() ) { + String grpName = "Group." + getData().getName() + "." + regDmc.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + request.setEqual( grpName.equals( mementoName ) ); + } + request.done(); + } + }; + + /* + * Now go get the model data for the single register group found. + */ + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + if ( regService != null ) { + regService.getRegisterGroupData( regDmc, regGroupDataDone ); + } + else { + request.done(); + } + } + }); + } catch (RejectedExecutionException e) { + request.done(); + } + + continue; + } + } + } + request.done(); + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) + */ + public void encodeElements(IElementMementoRequest[] requests) { + + for ( final IElementMementoRequest request : requests ) { + + Object element = request.getElement(); + final IMemento memento = request.getMemento(); + + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IRegisterGroupDMContext ) + { + final IRegisterGroupDMContext regDmc = (IRegisterGroupDMContext) dmc; + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + + /* + * Now make sure the register group is the one we want. + */ + + final DataRequestMonitor regGroupDataDone = new DataRequestMonitor(regService.getExecutor(), null) { + @Override + protected void handleCompleted() { + if ( getStatus().isOK() ) { + String grpName = "Group." + getData().getName() + "." + regDmc.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + memento.putString("GROUP_MEMENTO_NAME", grpName); //$NON-NLS-1$ + } + request.done(); + } + }; + + /* + * Now go get the model data for the single register group found. + */ + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + if ( regService != null ) { + regService.getRegisterGroupData( regDmc, regGroupDataDone ); + } + else { + request.done(); + } + } + }); + } catch (RejectedExecutionException e) { + request.done(); + } + + continue; + } + } + request.done(); + } + } } \ 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/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 766bc11400e..9102c94da9d 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 @@ -48,8 +48,11 @@ import org.eclipse.debug.internal.ui.DebugPluginImages; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; 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.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; @@ -62,10 +65,11 @@ import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IMemento; @SuppressWarnings("restriction") public class RegisterVMNode extends AbstractExpressionVMNode - implements IElementEditor, IElementLabelProvider + implements IElementEditor, IElementLabelProvider, IElementMementoProvider { protected class RegisterVMC extends DMVMContext implements IFormattedValueVMContext @@ -740,4 +744,128 @@ public class RegisterVMNode extends AbstractExpressionVMNode return new RegisterCellModifier( getDMVMProvider(), fFormattedPrefStore, fSyncRegisterDataAccess ); } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) + */ + public void compareElements(IElementCompareRequest[] requests) { + + for ( final IElementCompareRequest request : requests ) { + + Object element = request.getElement(); + final IMemento memento = request.getMemento(); + final String mementoName = memento.getString("REGISTER_MEMENTO_NAME"); //$NON-NLS-1$ + + if (mementoName != null) { + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IRegisterDMContext ) + { + final IRegisterDMContext regDmc = (IRegisterDMContext) dmc; + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + + /* + * Now make sure the register group is the one we want. + */ + + final DataRequestMonitor dataDone = new DataRequestMonitor(regService.getExecutor(), null) { + @Override + protected void handleCompleted() { + if ( getStatus().isOK() ) { + String regName = "Register." + getData().getName() + "." + regDmc.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + request.setEqual( regName.equals( mementoName ) ); + } + request.done(); + } + }; + + /* + * Now go get the model data for the single register group found. + */ + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + IRegisters regService = getServicesTracker().getService(IRegisters.class); + if ( regService != null ) { + regService.getRegisterData( regDmc, dataDone ); + } + else { + request.done(); + } + } + }); + } catch (RejectedExecutionException e) { + request.done(); + } + + continue; + } + } + } + request.done(); + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) + */ + public void encodeElements(IElementMementoRequest[] requests) { + + for ( final IElementMementoRequest request : requests ) { + + Object element = request.getElement(); + final IMemento memento = request.getMemento(); + + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IRegisterDMContext ) + { + final IRegisterDMContext regDmc = (IRegisterDMContext) dmc; + final IRegisters regService = getServicesTracker().getService(IRegisters.class); + + /* + * Now make sure the register group is the one we want. + */ + final DataRequestMonitor dataDone = new DataRequestMonitor(regService.getExecutor(), null) { + @Override + protected void handleCompleted() { + if ( getStatus().isOK() ) { + String regName = "Register." + getData().getName() + "." + regDmc.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + memento.putString("REGISTER_MEMENTO_NAME", regName); + } + request.done(); + } + }; + + /* + * Now go get the model data for the single register group found. + */ + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + IRegisters regService = getServicesTracker().getService(IRegisters.class); + if ( regService != null ) { + regService.getRegisterData( regDmc, dataDone ); + } + else { + request.done(); + } + } + }); + } catch (RejectedExecutionException e) { + request.done(); + } + + continue; + } + } + request.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 928b89f7261..d0c5fd49734 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 @@ -52,8 +52,11 @@ import org.eclipse.debug.core.model.IExpression; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; 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.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; @@ -66,10 +69,11 @@ import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IMemento; @SuppressWarnings({"restriction", "nls"}) public class VariableVMNode extends AbstractExpressionVMNode - implements IElementEditor, IElementLabelProvider + implements IElementEditor, IElementLabelProvider, IElementMementoProvider { //private final static int MAX_STRING_VALUE_LENGTH = 40; @@ -711,4 +715,62 @@ public class VariableVMNode extends AbstractExpressionVMNode stackFrameService.getLocals(frameDmc, rm); } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) + */ + private String produceExpressionElementName( String viewName , IExpressionDMContext expression ) { + + return "variable." + expression.getExpression() + "." + expression.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + } + + public void compareElements(IElementCompareRequest[] requests) { + + for ( IElementCompareRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + String mementoName = memento.getString("VARIABLE_MEMENTO_NAME"); //$NON-NLS-1$ + + if (mementoName != null) { + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IExpressionDMContext) { + + String elementName = produceExpressionElementName( request.getPresentationContext().getId(), (IExpressionDMContext) dmc ); + request.setEqual( elementName.equals( mementoName ) ); + } + } + } + request.done(); + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) + */ + public void encodeElements(IElementMementoRequest[] requests) { + + for ( IElementMementoRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IExpressionDMContext) { + + String elementName = produceExpressionElementName( request.getPresentationContext().getId(), (IExpressionDMContext) dmc ); + memento.putString("VARIABLE_MEMENTO_NAME", elementName); //$NON-NLS-1$ + } + } + request.done(); + } + } } diff --git a/plugins/org.eclipse.dd.examples.pda.ui/src/org/eclipse/dd/examples/pda/ui/viewmodel/launch/PDAProgramVMNode.java b/plugins/org.eclipse.dd.examples.pda.ui/src/org/eclipse/dd/examples/pda/ui/viewmodel/launch/PDAProgramVMNode.java index 6ea9b69cab3..f5c0fbad520 100644 --- a/plugins/org.eclipse.dd.examples.pda.ui/src/org/eclipse/dd/examples/pda/ui/viewmodel/launch/PDAProgramVMNode.java +++ b/plugins/org.eclipse.dd.examples.pda.ui/src/org/eclipse/dd/examples/pda/ui/viewmodel/launch/PDAProgramVMNode.java @@ -18,6 +18,7 @@ import org.eclipse.dd.dsf.concurrent.ConfinedToDsfExecutor; import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.RequestMonitor; +import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.datamodel.IDMEvent; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext; @@ -31,6 +32,7 @@ import org.eclipse.dd.dsf.ui.viewmodel.IVMNode; import org.eclipse.dd.dsf.ui.viewmodel.VMDelta; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider; +import org.eclipse.dd.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.dd.examples.pda.PDAPlugin; import org.eclipse.dd.examples.pda.launch.PDALaunch; import org.eclipse.dd.examples.pda.service.PDACommandControl; @@ -39,7 +41,10 @@ import org.eclipse.dd.examples.pda.service.PDAStartedEvent; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; 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; @@ -47,13 +52,14 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.viewers.TreePath; +import org.eclipse.ui.IMemento; /** * View Model node representing a PDA program. */ @SuppressWarnings("restriction") public class PDAProgramVMNode extends AbstractDMVMNode - implements IElementLabelProvider + implements IElementLabelProvider, IElementMementoProvider { // View model context representing a terminated PDA program. // It's purpose is to show a terminated program in the debug view @@ -286,4 +292,62 @@ public class PDAProgramVMNode extends AbstractDMVMNode } rm.done(); } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) + */ + + private String produceProgramElementName( String viewName , PDAProgramDMContext execCtx ) { + return "PDA." + execCtx.getProgram() + "." + execCtx.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + } + + public void compareElements(IElementCompareRequest[] requests) { + + for ( IElementCompareRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + String mementoName = memento.getString("PDAPROGRAM_MEMENTO_NAME"); //$NON-NLS-1$ + + if (mementoName != null) { + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof PDAProgramDMContext) { + + String elementName = produceProgramElementName( request.getPresentationContext().getId(), (PDAProgramDMContext) dmc ); + request.setEqual( elementName.equals( mementoName ) ); + } + } + } + request.done(); + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) + */ + public void encodeElements(IElementMementoRequest[] requests) { + + for ( IElementMementoRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof PDAProgramDMContext) { + + String elementName = produceProgramElementName( request.getPresentationContext().getId(), (PDAProgramDMContext) dmc ); + memento.putString("PDAPROGRAM_MEMENTO_NAME", elementName); //$NON-NLS-1$ + } + } + request.done(); + } + } } diff --git a/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARegisters.java b/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARegisters.java index 58ab8952edc..df4bb44007e 100644 --- a/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARegisters.java +++ b/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARegisters.java @@ -23,7 +23,6 @@ import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext; -import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext; import org.eclipse.dd.dsf.service.AbstractDsfService; import org.eclipse.dd.dsf.service.DsfServiceEventHandler; import org.eclipse.dd.dsf.service.DsfSession; @@ -102,15 +101,15 @@ public class PDARegisters extends AbstractDsfService implements IRegisters { * @see org.eclipse.dd.dsf.debug.service.IRegisters#getRegisterGroups(org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext, org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext, org.eclipse.dd.dsf.concurrent.DataRequestMonitor) */ public void getRegisterGroups(IDMContext ctx, DataRequestMonitor rm ) { - PDAProgramDMContext frameDmc = DMContexts.getAncestorOfType(ctx, PDAProgramDMContext.class); - if (frameDmc == null) { + PDAProgramDMContext execDmc = DMContexts.getAncestorOfType(ctx, PDAProgramDMContext.class); + if (execDmc == null) { rm.setStatus( new Status( IStatus.ERROR , PDAPlugin.PLUGIN_ID , INVALID_HANDLE , "Container context not found", null ) ) ; //$NON-NLS-1$ rm.done(); return; } - MIRegisterGroupDMC generalGroupDMC = new MIRegisterGroupDMC( this , frameDmc, 0 , "General" ) ; //$NON-NLS-1$ - MIRegisterGroupDMC analysisGroupDMC = new MIRegisterGroupDMC( this , frameDmc, 0 , "Analysis" ) ; //$NON-NLS-1$ + MIRegisterGroupDMC generalGroupDMC = new MIRegisterGroupDMC( this , execDmc, 0 , "General" ) ; //$NON-NLS-1$ + MIRegisterGroupDMC analysisGroupDMC = new MIRegisterGroupDMC( this , execDmc, 0 , "Analysis" ) ; //$NON-NLS-1$ rm.setData( new MIRegisterGroupDMC[] { generalGroupDMC, analysisGroupDMC } ) ; rm.done() ; @@ -128,13 +127,6 @@ public class PDARegisters extends AbstractDsfService implements IRegisters { return; } - final IFrameDMContext containerDmc = DMContexts.getAncestorOfType(dmc, IFrameDMContext.class); - if ( containerDmc == null ) { - rm.setStatus( new Status( IStatus.ERROR , PDAPlugin.PLUGIN_ID , INVALID_HANDLE , "Container context not found" , null ) ) ; //$NON-NLS-1$ - rm.done(); - return; - } - String[] names = null;; if ( groupDmc.getName().equals( "General") ) { diff --git a/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ContainerVMNode.java b/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ContainerVMNode.java index a6cec34506a..3c189ec2dc8 100644 --- a/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ContainerVMNode.java +++ b/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ContainerVMNode.java @@ -17,9 +17,11 @@ import java.util.concurrent.RejectedExecutionException; import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.DMContexts; +import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.datamodel.IDMEvent; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext; +import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext; import org.eclipse.dd.dsf.debug.service.IRunControl.IExitedDMEvent; import org.eclipse.dd.dsf.debug.service.IRunControl.IStartedDMEvent; import org.eclipse.dd.dsf.service.DsfSession; @@ -27,6 +29,7 @@ import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; import org.eclipse.dd.dsf.ui.viewmodel.VMDelta; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider; +import org.eclipse.dd.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.dd.gdb.internal.provisional.service.GDBRunControl; import org.eclipse.dd.gdb.internal.provisional.service.GDBRunControl.GDBProcessData; import org.eclipse.dd.gdb.internal.provisional.service.command.GDBControl; @@ -36,16 +39,20 @@ import org.eclipse.dd.mi.service.command.MIInferiorProcess; import org.eclipse.dd.mi.service.command.MIInferiorProcess.InferiorExitedDMEvent; import org.eclipse.dd.mi.service.command.MIInferiorProcess.InferiorStartedDMEvent; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; 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.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.ui.IMemento; @SuppressWarnings("restriction") public class ContainerVMNode extends AbstractDMVMNode - implements IElementLabelProvider + implements IElementLabelProvider, IElementMementoProvider { @@ -147,8 +154,7 @@ public class ContainerVMNode extends AbstractDMVMNode } else if (e instanceof InferiorStartedDMEvent) { parentDelta.addNode(createVMContext(((IDMEvent)e).getDMContext()), IModelDelta.EXPAND | IModelDelta.SELECT); } else if (e instanceof IStartedDMEvent || e instanceof IExitedDMEvent) { - IContainerDMContext containerCtx = DMContexts.getAncestorOfType( - ((IDMEvent)e).getDMContext(), IContainerDMContext.class); + IContainerDMContext containerCtx = DMContexts.getAncestorOfType(((IDMEvent)e).getDMContext(), IContainerDMContext.class); if (containerCtx != null) { parentDelta.addNode(createVMContext(containerCtx), IModelDelta.CONTENT); } @@ -156,4 +162,62 @@ public class ContainerVMNode extends AbstractDMVMNode requestMonitor.done(); } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) + */ + + private String produceContainerElementName( String viewName , IExecutionDMContext execCtx ) { + return "Container." + execCtx.getSessionId(); //$NON-NLS-1$ + } + + public void compareElements(IElementCompareRequest[] requests) { + + for ( IElementCompareRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + String mementoName = memento.getString("CONTAINER_MEMENTO_NAME"); //$NON-NLS-1$ + + if (mementoName != null) { + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IExecutionDMContext) { + + String elementName = produceContainerElementName( request.getPresentationContext().getId(), (IExecutionDMContext) dmc ); + request.setEqual( elementName.equals( mementoName ) ); + } + } + } + request.done(); + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) + */ + public void encodeElements(IElementMementoRequest[] requests) { + + for ( IElementMementoRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IExecutionDMContext) { + + String elementName = produceContainerElementName( request.getPresentationContext().getId(), (IExecutionDMContext) dmc ); + memento.putString("CONTAINER_MEMENTO_NAME", elementName); //$NON-NLS-1$ + } + } + request.done(); + } + } } diff --git a/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ThreadVMNode.java b/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ThreadVMNode.java index 32ef4a0a5f7..3e3f7337043 100644 --- a/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ThreadVMNode.java +++ b/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ThreadVMNode.java @@ -21,6 +21,7 @@ import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.DMContexts; +import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.datamodel.IDMEvent; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext; @@ -45,16 +46,20 @@ import org.eclipse.dd.gdb.internal.provisional.service.GDBRunControl; import org.eclipse.dd.gdb.internal.provisional.service.GDBRunControl.GDBThreadData; import org.eclipse.dd.mi.service.IMIExecutionDMContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; 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.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.ui.IMemento; @SuppressWarnings("restriction") public class ThreadVMNode extends AbstractDMVMNode - implements IElementLabelProvider + implements IElementLabelProvider, IElementMementoProvider { public ThreadVMNode(AbstractDMVMProvider provider, DsfSession session) { super(provider, session, IExecutionDMContext.class); @@ -317,6 +322,69 @@ public class ThreadVMNode extends AbstractDMVMNode rm.done(); } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) + */ + + public void compareElements(IElementCompareRequest[] requests) { + + for ( IElementCompareRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + String mementoName = memento.getString("THREAD_MEMENTO_NAME"); //$NON-NLS-1$ + + if (mementoName != null) { + if (element instanceof IDMVMContext) { + + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IMIExecutionDMContext) { + + String elementName = "Thread." + ((IMIExecutionDMContext) dmc).getThreadId() + "." + dmc.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + request.setEqual( elementName.equals( mementoName ) ); + } + else if ( dmc instanceof IContainerDMContext) { + + String elementName = "Thread." + dmc.getSessionId(); //$NON-NLS-1$ + request.setEqual( elementName.equals( mementoName ) ); + } + } + } + request.done(); + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) + */ + public void encodeElements(IElementMementoRequest[] requests) { + + for ( IElementMementoRequest request : requests ) { + + Object element = request.getElement(); + IMemento memento = request.getMemento(); + + if (element instanceof IDMVMContext) { + IDMContext dmc = ((IDMVMContext)element).getDMContext(); + + if ( dmc instanceof IMIExecutionDMContext) { + + String elementName = "Thread." + ((IMIExecutionDMContext) dmc).getThreadId() + "." + dmc.getSessionId(); //$NON-NLS-1$ //$NON-NLS-2$ + memento.putString("THREAD_MEMENTO_NAME", elementName); //$NON-NLS-1$ + } + else if ( dmc instanceof IContainerDMContext) { + + String elementName = "Thread." + dmc.getSessionId(); //$NON-NLS-1$ + memento.putString("THREAD_MEMENTO_NAME", elementName); //$NON-NLS-1$ + } + } + request.done(); + } } }