diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java
index 6116e505173..3a92a9b4be6 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java
@@ -15,11 +15,13 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterDescriptor;
import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterGroup;
+import org.eclipse.cdt.debug.core.model.ICStackFrame;
import org.eclipse.cdt.debug.core.model.IPersistableRegisterGroup;
import org.eclipse.cdt.debug.core.model.IRegisterDescriptor;
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
@@ -102,16 +104,23 @@ public class CRegisterManager {
return fRegisterDescriptors;
}
- public IRegisterGroup[] getRegisterGroups( CStackFrame frame ) throws DebugException {
- IRegisterGroup[] groups = (IRegisterGroup[])fRegisterGroups.toArray( new IRegisterGroup[fRegisterGroups.size()] );
- if ( getCurrentFrame() != frame ) {
- for ( int i = 0; i < groups.length; ++i ) {
- ((CRegisterGroup)groups[i]).resetRegisterValues();
- }
- setCurrentFrame( frame );
- }
- return groups;
- }
+ public IRegisterGroup[] getRegisterGroups() {
+ return (IRegisterGroup[])fRegisterGroups.toArray( new IRegisterGroup[fRegisterGroups.size()] );
+ }
+
+ public IRegisterGroup[] getRegisterGroups( CStackFrame frame ) throws DebugException {
+ setCurrentFrame( frame );
+ return getRegisterGroups();
+ }
+
+ public void setCurrentFrame( ICStackFrame frame ) throws DebugException {
+ if ( frame != null && !frame.equals( getCurrentFrame() ) ) {
+ for ( IRegisterGroup group : getRegisterGroups() ) {
+ ((CRegisterGroup)group).resetRegisterValues();
+ }
+ setCurrentFrame0( (CStackFrame)frame );
+ }
+ }
public void initialize() {
ICDIRegisterGroup[] groups = new ICDIRegisterGroup[0];
@@ -218,7 +227,7 @@ public class CRegisterManager {
}
}
- protected CDebugTarget getDebugTarget() {
+ public CDebugTarget getDebugTarget() {
return fDebugTarget;
}
@@ -342,7 +351,7 @@ public class CRegisterManager {
return fCurrentFrame;
}
- private void setCurrentFrame( CStackFrame currentFrame ) {
+ private void setCurrentFrame0( CStackFrame currentFrame ) {
fCurrentFrame = currentFrame;
}
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java
index 6f8416b1f95..8318656bfbe 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java
@@ -223,7 +223,10 @@ public class CRegister extends CVariable implements ICRegister {
}
public synchronized ICValue getValue() throws DebugException {
- if ( fValue.equals( CValueFactory.NULL_VALUE ) ) {
+ CStackFrame frame = getCurrentStackFrame();
+ if ( frame == null || frame.isDisposed() )
+ fValue = CValueFactory.NULL_VALUE;
+ else if ( fValue.equals( CValueFactory.NULL_VALUE ) ) {
ICDIRegister reg = getCDIRegister();
if ( reg != null ) {
try {
diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.xml b/debug/org.eclipse.cdt.debug.ui/plugin.xml
index 01b56c0cee7..13e20328df5 100644
--- a/debug/org.eclipse.cdt.debug.ui/plugin.xml
+++ b/debug/org.eclipse.cdt.debug.ui/plugin.xml
@@ -1339,6 +1339,9 @@
class="org.eclipse.cdt.debug.internal.ui.elements.adapters.CDebugElementAdapterFactory">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CRegisterManagerProxies.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CRegisterManagerProxies.java
new file mode 100644
index 00000000000..e746c9bf6cd
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CRegisterManagerProxies.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.debug.core.model.ICDebugElement;
+import org.eclipse.cdt.debug.core.model.ICDebugTarget;
+import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
+import org.eclipse.cdt.debug.internal.ui.elements.adapters.CRegisterManagerProxy;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.contexts.IDebugContextManager;
+import org.eclipse.debug.ui.contexts.IDebugContextService;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbenchWindow;
+
+/**
+ * Singleton that keeps track of CRegisterManagerProxy
objects
+ */
+public class CRegisterManagerProxies {
+
+ private static CRegisterManagerProxies fgInstance = new CRegisterManagerProxies();
+
+ private Map fMap;
+
+ public static CRegisterManagerProxies getInstance() {
+ return fgInstance;
+ }
+
+ public CRegisterManagerProxies() {
+ super();
+ fMap = new HashMap();
+ }
+
+ public void dispose() {
+ for ( CRegisterManagerProxy proxy : fMap.values() ) {
+ DebugPlugin.getDefault().removeDebugEventListener( proxy );
+ proxy.dispose();
+ }
+ fMap.clear();
+ }
+
+ public CRegisterManagerProxy getRegisterManagerProxy( ICDebugTarget target ) {
+ CRegisterManagerProxy proxy = fMap.get( target );
+ if ( proxy == null ) {
+ synchronized( this ) {
+ proxy = fMap.get( target );
+ if ( proxy == null ) {
+ proxy = new CRegisterManagerProxy( ((CDebugTarget)target).getRegisterManager() );
+ DebugPlugin.getDefault().addDebugEventListener( proxy );
+ IDebugContextService service = getContextService();
+ if ( service != null ) {
+ ISelection s = service.getActiveContext();
+ if ( s instanceof IStructuredSelection && ((IStructuredSelection)s).size() == 1 ) {
+ Object context = ((IStructuredSelection)s).getFirstElement();
+ proxy.setContext( ( context instanceof ICDebugElement ) ? (ICDebugElement)context : target );
+ }
+ service.addDebugContextListener( proxy );
+ }
+ fMap.put( target, proxy );
+ }
+ }
+ }
+ return proxy;
+ }
+
+ private IDebugContextService getContextService() {
+ IWorkbenchWindow window = SelectedResourceManager.getDefault().getActiveWindow();
+ if ( window != null ) {
+ IDebugContextManager manager = DebugUITools.getDebugContextManager();
+ return manager.getContextService( window );
+ }
+ return null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementAdapterFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementAdapterFactory.java
index 4aa9052aa0e..3ed5be35441 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementAdapterFactory.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementAdapterFactory.java
@@ -31,9 +31,11 @@ import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentProvider;
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelProvider;
import org.eclipse.cdt.debug.ui.disassembly.IElementToggleBreakpointAdapter;
import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
public class CDebugElementAdapterFactory implements IAdapterFactory {
@@ -42,6 +44,7 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
private static IElementContentProvider fgThreadContentProvider = new CThreadContentProvider();
private static IElementContentProvider fgStackFrameContentProvider = new CStackFrameContentProvider();
private static IElementContentProvider fgModuleContentProvider = new ModuleContentProvider();
+ private static IElementContentProvider fgCRegisterManagerContentProvider = new CRegisterManagerContentProvider();
private static IModelProxyFactory fgDebugElementProxyFactory = new CDebugElementProxyFactory();
@@ -53,11 +56,16 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
private static IDocumentElementLabelProvider fgDisassemblyLabelProvider = new DisassemblyElementLabelProvider();
private static IElementToggleBreakpointAdapter fgDisassemblyToggleBreakpointAdapter = new DisassemblyToggleBreakpointAdapter();
private static ISourceDisplay fgSourceDisplayAdapter = new SourceDisplayAdapter();
+
+ private static IViewerInputProvider fgViewerInputProvider = new CViewerInputProvider();
+ private static IColumnPresentationFactory fgRegistersViewColumnPresentationFactory = new RegistersViewColumnPresentationFactory();
+ private static IElementMementoProvider fgRegisterManagerProxyMementoProvider = new CRegisterManagerProxyMementoProvider();
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
*/
- public Object getAdapter( Object adaptableObject, Class adapterType ) {
+ @SuppressWarnings( "rawtypes" )
+ public Object getAdapter( Object adaptableObject, Class adapterType ) {
if ( adapterType.isInstance( adaptableObject ) ) {
return adaptableObject;
}
@@ -71,10 +79,13 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
if ( adaptableObject instanceof ICStackFrame ) {
return fgStackFrameContentProvider;
}
- if ( adaptableObject instanceof ICModule ||
- adaptableObject instanceof ICElement ) {
- return fgModuleContentProvider;
- }
+ if ( adaptableObject instanceof CRegisterManagerProxy ) {
+ return fgCRegisterManagerContentProvider;
+ }
+ if ( adaptableObject instanceof ICModule ||
+ adaptableObject instanceof ICElement ) {
+ return fgModuleContentProvider;
+ }
}
if ( adapterType.equals( IModelProxyFactory.class ) ) {
if ( adaptableObject instanceof ICDebugTarget ) {
@@ -91,19 +102,24 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
}
if ( adaptableObject instanceof DisassemblyRetrieval ) {
return fgDebugElementProxyFactory;
+ }
+ if ( adaptableObject instanceof CRegisterManagerProxy ) {
+ return fgDebugElementProxyFactory;
}
}
if ( adapterType.equals( IElementMementoProvider.class ) ) {
if ( adaptableObject instanceof ICStackFrame ) {
return fgStackFrameMementoProvider;
}
- if ( adaptableObject instanceof IModuleRetrieval ||
- adaptableObject instanceof ICThread ||
- adaptableObject instanceof ICModule ||
- adaptableObject instanceof ICElement)
- {
+ if ( adaptableObject instanceof IModuleRetrieval
+ || adaptableObject instanceof ICThread
+ || adaptableObject instanceof ICModule
+ || adaptableObject instanceof ICElement ) {
return fgModuleMementoProvider;
}
+ if ( adaptableObject instanceof CRegisterManagerProxy ) {
+ return fgRegisterManagerProxyMementoProvider;
+ }
}
if ( adapterType.equals( IDisassemblyContextProvider.class ) ) {
if ( adaptableObject instanceof ICStackFrame ) {
@@ -130,13 +146,26 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
return fgSourceDisplayAdapter;
}
}
+ if ( adapterType.equals( IViewerInputProvider.class ) ) {
+ if ( adaptableObject instanceof ICDebugTarget
+ || adaptableObject instanceof ICThread
+ || adaptableObject instanceof ICStackFrame ) {
+ return fgViewerInputProvider;
+ }
+ }
+ if ( adapterType.equals( IColumnPresentationFactory.class ) ) {
+ if ( adaptableObject instanceof CRegisterManagerProxy ) {
+ return fgRegistersViewColumnPresentationFactory;
+ }
+ }
return null;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
*/
- public Class[] getAdapterList() {
+ @SuppressWarnings( "rawtypes" )
+ public Class[] getAdapterList() {
return new Class[] {
IElementContentProvider.class,
IModelProxyFactory.class,
@@ -147,6 +176,7 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
IDocumentElementAnnotationProvider.class,
IElementToggleBreakpointAdapter.class,
ISourceDisplay.class,
+ IViewerInputProvider.class,
};
}
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementProxyFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementProxyFactory.java
index 11f9bcf5216..42542d5068c 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementProxyFactory.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementProxyFactory.java
@@ -40,6 +40,11 @@ public class CDebugElementProxyFactory extends DefaultModelProxyFactory {
return new ModulesViewModelProxy( mr );
}
}
+ else if ( IDebugUIConstants.ID_REGISTER_VIEW.equals( context.getId() ) ) {
+ if ( element instanceof CRegisterManagerProxy ) {
+ return new CRegisterManagerModelProxy( (CRegisterManagerProxy)element );
+ }
+ }
else if ( ICDebugUIConstants.ID_DEFAULT_DISASSEMBLY_EDITOR.equals( context.getId() ) ) {
if ( element instanceof DisassemblyRetrieval ) {
return new DisassemblyElementProxy( (DisassemblyRetrieval)element );
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerContentProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerContentProvider.java
new file mode 100644
index 00000000000..4c80af8dcde
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerContentProvider.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.model.IRegisterGroup;
+import org.eclipse.debug.internal.ui.model.elements.ElementContentProvider;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
+import org.eclipse.debug.ui.IDebugUIConstants;
+
+public class CRegisterManagerContentProvider extends ElementContentProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
+ */
+ @Override
+ protected Object[] getChildren( Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor ) throws CoreException {
+ return getElements( getRegisterGroups( (CRegisterManagerProxy)parent ), index, length );
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
+ */
+ @Override
+ protected int getChildCount( Object element, IPresentationContext context, IViewerUpdate monitor ) throws CoreException {
+ return getRegisterGroups( (CRegisterManagerProxy)element ).length;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#supportsContextId(java.lang.String)
+ */
+ @Override
+ protected boolean supportsContextId( String id ) {
+ return IDebugUIConstants.ID_REGISTER_VIEW.equals( id );
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
+ */
+ @Override
+ protected boolean hasChildren( Object element, IPresentationContext context, IViewerUpdate monitor ) throws CoreException {
+ return getRegisterGroups( (CRegisterManagerProxy)element ).length > 0;
+ }
+
+ private IRegisterGroup[] getRegisterGroups( CRegisterManagerProxy rmp ) {
+ return rmp.getRegisterGroups();
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerModelProxy.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerModelProxy.java
new file mode 100644
index 00000000000..88aaa6cd47b
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerModelProxy.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
+import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
+import org.eclipse.jface.viewers.Viewer;
+
+public class CRegisterManagerModelProxy extends AbstractModelProxy {
+
+ private CRegisterManagerProxy fRegisterManagerProxy;
+
+ public CRegisterManagerModelProxy( CRegisterManagerProxy rmp ) {
+ super();
+ fRegisterManagerProxy = rmp;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy#installed(org.eclipse.jface.viewers.Viewer)
+ */
+ @Override
+ public void installed( Viewer viewer ) {
+ fRegisterManagerProxy.setModelProxy( this );
+ super.installed( viewer );
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#dispose()
+ */
+ @Override
+ public synchronized void dispose() {
+ fRegisterManagerProxy.setModelProxy( null );
+ fRegisterManagerProxy = null;
+ super.dispose();
+ }
+
+ public void update() {
+ ModelDelta delta = new ModelDelta( fRegisterManagerProxy, IModelDelta.CONTENT );
+ fireModelChanged( delta );
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerProxy.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerProxy.java
new file mode 100644
index 00000000000..2725e4885dc
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerProxy.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+
+import org.eclipse.cdt.debug.core.model.ICDebugElement;
+import org.eclipse.cdt.debug.core.model.ICDebugTarget;
+import org.eclipse.cdt.debug.core.model.ICStackFrame;
+import org.eclipse.cdt.debug.core.model.ICThread;
+import org.eclipse.cdt.debug.internal.core.CRegisterManager;
+import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.IDebugEventSetListener;
+import org.eclipse.debug.core.model.IRegisterGroup;
+import org.eclipse.debug.ui.contexts.DebugContextEvent;
+import org.eclipse.debug.ui.contexts.IDebugContextListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * Acts as a viewer input for the Registers view
+ */
+public class CRegisterManagerProxy implements IDebugEventSetListener, IDebugContextListener {
+
+ private CRegisterManager fRegisterManager;
+ private ICDebugElement fContext;
+ private CRegisterManagerModelProxy fModelProxy;
+
+ public CRegisterManagerProxy( CRegisterManager registerManager ) {
+ super();
+ fRegisterManager = registerManager;
+ }
+
+ public void dispose() {
+ fRegisterManager = null;
+ fContext = null;
+ fModelProxy = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.ui.contexts.IDebugContextListener#debugContextChanged(org.eclipse.debug.ui.contexts.DebugContextEvent)
+ */
+ public void debugContextChanged( DebugContextEvent event ) {
+ ICDebugElement context = null;
+ ISelection s = event.getContext();
+ if ( s instanceof IStructuredSelection ) {
+ IStructuredSelection selection = (IStructuredSelection)s;
+ context =
+ ( selection.size() == 1 ) ?
+ ( selection.getFirstElement() instanceof ICDebugElement ) ?
+ (ICDebugElement)selection.getFirstElement() : null
+ : null;
+ }
+ setContext( context );
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
+ */
+ public void handleDebugEvents( DebugEvent[] events ) {
+ CRegisterManagerModelProxy modelProxy = getModelProxy();
+ for( int i = 0; i < events.length; i++ ) {
+ DebugEvent event = events[i];
+ Object source = event.getSource();
+ if ( source instanceof ICDebugTarget
+ && fRegisterManager.getDebugTarget().equals( source )
+ && (( event.getKind() == DebugEvent.SUSPEND ) || event.getKind() == DebugEvent.TERMINATE ) ) {
+ if ( modelProxy != null )
+ modelProxy.update();
+ }
+ else if ( source instanceof ICThread
+ && fRegisterManager.getDebugTarget().equals( ((ICThread)source).getDebugTarget() )
+ && event.getKind() == DebugEvent.SUSPEND ) {
+ if ( modelProxy != null )
+ modelProxy.update();
+ }
+ }
+ }
+
+ public IRegisterGroup[] getRegisterGroups() {
+ return fRegisterManager.getRegisterGroups();
+ }
+
+ public void setModelProxy( CRegisterManagerModelProxy modelProxy ) {
+ fModelProxy = modelProxy;
+ }
+
+ public CRegisterManagerModelProxy getModelProxy() {
+ return fModelProxy;
+ }
+
+ public String getModelIdentifier() {
+ return fRegisterManager.getDebugTarget().getModelIdentifier();
+ }
+
+ public void setContext( ICDebugElement context ) {
+ if ( fContext == null || !fContext.equals( context ) ) {
+ fContext = context;
+ try {
+ fRegisterManager.setCurrentFrame( ( fContext instanceof ICStackFrame ) ? (ICStackFrame)context : null );
+ }
+ catch( DebugException e ) {
+ // TODO: should we pass the error up?
+ }
+ CRegisterManagerModelProxy modelProxy = getModelProxy();
+ if ( modelProxy != null )
+ modelProxy.update();
+ }
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerProxyMementoProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerProxyMementoProvider.java
new file mode 100644
index 00000000000..e14f096be76
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CRegisterManagerProxyMementoProvider.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.internal.ui.model.elements.DebugElementMementoProvider;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.debug.ui.IDebugUIConstants;
+
+public class CRegisterManagerProxyMementoProvider extends DebugElementMementoProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.model.elements.DebugElementMementoProvider#getElementName(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext)
+ */
+ @Override
+ protected String getElementName( Object element, IPresentationContext context ) throws CoreException {
+ if ( element instanceof CRegisterManagerProxy ) {
+ if ( IDebugUIConstants.ID_REGISTER_VIEW.equals( context.getId() ) ) {
+ return ((CRegisterManagerProxy)element).getModelIdentifier();
+ }
+ }
+ return null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CViewerInputProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CViewerInputProvider.java
new file mode 100644
index 00000000000..3abd97e7ac6
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CViewerInputProvider.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+
+import org.eclipse.cdt.debug.core.model.ICDebugElement;
+import org.eclipse.cdt.debug.core.model.ICDebugTarget;
+import org.eclipse.cdt.debug.internal.ui.CRegisterManagerProxies;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.internal.ui.model.elements.ViewerInputProvider;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
+import org.eclipse.debug.ui.IDebugUIConstants;
+
+public class CViewerInputProvider extends ViewerInputProvider implements IViewerInputProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.model.elements.ViewerInputProvider#getViewerInput(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
+ */
+ @Override
+ protected Object getViewerInput( Object source, IPresentationContext context, IViewerUpdate update ) throws CoreException {
+ if ( IDebugUIConstants.ID_REGISTER_VIEW.equals( context.getId() ) && source instanceof ICDebugElement ) {
+ ICDebugTarget target = (ICDebugTarget)((ICDebugElement)source).getDebugTarget();
+ return CRegisterManagerProxies.getInstance().getRegisterManagerProxy( target );
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.model.elements.ViewerInputProvider#supportsContextId(java.lang.String)
+ */
+ @Override
+ protected boolean supportsContextId( String id ) {
+ return IDebugUIConstants.ID_REGISTER_VIEW.equals( id );
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/ElementAdapterMessages.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/ElementAdapterMessages.java
new file mode 100644
index 00000000000..fd05d3c98d6
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/ElementAdapterMessages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+
+import org.eclipse.osgi.util.NLS;
+
+public class ElementAdapterMessages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.internal.ui.elements.adapters.ElementAdapterMessages"; //$NON-NLS-1$
+
+ public static String RegistersViewColumnPresentation_0;
+
+ public static String RegistersViewColumnPresentation_1;
+
+ public static String RegistersViewColumnPresentation_2;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages( BUNDLE_NAME, ElementAdapterMessages.class );
+ }
+
+ private ElementAdapterMessages() {
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/ElementAdapterMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/ElementAdapterMessages.properties
new file mode 100644
index 00000000000..8e50d47cabb
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/ElementAdapterMessages.properties
@@ -0,0 +1,3 @@
+RegistersViewColumnPresentation_0=Type
+RegistersViewColumnPresentation_1=Name
+RegistersViewColumnPresentation_2=Value
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/RegistersViewColumnPresentation.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/RegistersViewColumnPresentation.java
new file mode 100644
index 00000000000..38888e35cb3
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/RegistersViewColumnPresentation.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.debug.internal.ui.elements.adapters.VariableColumnPresentation;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * Registers View columns
+ */
+public class RegistersViewColumnPresentation implements IColumnPresentation {
+
+ private static final String PREFIX = CDebugUIPlugin.PLUGIN_ID + "."; //$NON-NLS-1$
+
+ public static final String ID = PREFIX + "registersViewColumnPresentationId"; //$NON-NLS-1$
+
+ private static final String COLUMN_ID_NAME = VariableColumnPresentation.COLUMN_VARIABLE_NAME;
+ private static final String COLUMN_ID_TYPE = VariableColumnPresentation.COLUMN_VARIABLE_TYPE;
+ private static final String COLUMN_ID_VALUE = VariableColumnPresentation.COLUMN_VARIABLE_VALUE;
+
+ private static final String[] ALL_COLUMNS = new String[] {
+ COLUMN_ID_NAME,
+ COLUMN_ID_TYPE,
+ COLUMN_ID_VALUE
+ };
+
+ private static final String[] INITIAL_COLUMNS = new String[] {
+ COLUMN_ID_NAME,
+ COLUMN_ID_VALUE
+ };
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation#init(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext)
+ */
+ public void init( IPresentationContext context ) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation#dispose()
+ */
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation#getAvailableColumns()
+ */
+ public String[] getAvailableColumns() {
+ return ALL_COLUMNS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation#getInitialColumns()
+ */
+ public String[] getInitialColumns() {
+ return INITIAL_COLUMNS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation#getHeader(java.lang.String)
+ */
+ public String getHeader( String id ) {
+ if ( COLUMN_ID_TYPE.equals( id ) ) {
+ return ElementAdapterMessages.RegistersViewColumnPresentation_0;
+ }
+ if ( COLUMN_ID_NAME.equals( id ) ) {
+ return ElementAdapterMessages.RegistersViewColumnPresentation_1;
+ }
+ if ( COLUMN_ID_VALUE.equals( id ) ) {
+ return ElementAdapterMessages.RegistersViewColumnPresentation_2;
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation#getImageDescriptor(java.lang.String)
+ */
+ public ImageDescriptor getImageDescriptor( String id ) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation#getId()
+ */
+ public String getId() {
+ return ID;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation#isOptional()
+ */
+ public boolean isOptional() {
+ return true;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/RegistersViewColumnPresentationFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/RegistersViewColumnPresentationFactory.java
new file mode 100644
index 00000000000..eefcf7f67a7
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/RegistersViewColumnPresentationFactory.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2010 CodeSourcery 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:
+ * CodeSourcery - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.debug.ui.IDebugUIConstants;
+
+public class RegistersViewColumnPresentationFactory implements IColumnPresentationFactory {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory#createColumnPresentation(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.Object)
+ */
+ public IColumnPresentation createColumnPresentation( IPresentationContext context, Object element ) {
+ if ( context.getId().equals( IDebugUIConstants.ID_REGISTER_VIEW ) )
+ return new RegistersViewColumnPresentation();
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory#getColumnPresentationId(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.Object)
+ */
+ public String getColumnPresentationId( IPresentationContext context, Object element ) {
+ if ( context.getId().equals( IDebugUIConstants.ID_REGISTER_VIEW ) )
+ return RegistersViewColumnPresentation.ID;
+ return null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
index 05803dab60a..dbfb7c92ee5 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
@@ -21,6 +21,7 @@ import org.eclipse.cdt.debug.internal.ui.CBreakpointUpdater;
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
import org.eclipse.cdt.debug.internal.ui.CDebugModelPresentation;
import org.eclipse.cdt.debug.internal.ui.CDebuggerPageAdapter;
+import org.eclipse.cdt.debug.internal.ui.CRegisterManagerProxies;
import org.eclipse.cdt.debug.internal.ui.ColorManager;
import org.eclipse.cdt.debug.internal.ui.EvaluationContextManager;
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
@@ -331,6 +332,7 @@ public class CDebugUIPlugin extends AbstractUIPlugin {
@Override
public void stop( BundleContext context ) throws Exception {
CDebugCorePlugin.getDefault().removeCBreakpointListener( CBreakpointUpdater.getInstance() );
+ CRegisterManagerProxies.getInstance().dispose();
fDisassemblyEditorManager.dispose();
if ( fImageDescriptorRegistry != null ) {
fImageDescriptorRegistry.dispose();