From 362b05d78f641aba36619e9efc3e6c82ed409ddb Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Fri, 20 Sep 2002 15:12:53 +0000 Subject: [PATCH] Added functionality to control thread and frame selection changes. --- .../cdt/debug/core/ISwitchToFrame.java | 20 +++++ .../cdt/debug/core/ISwitchToThread.java | 20 +++++ .../internal/core/model/CDebugTarget.java | 13 ++++ .../debug/internal/core/model/CThread.java | 9 +++ .../eclipse/cdt/debug/ui/CDebugUIPlugin.java | 75 ++++++++++++++++++- 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ISwitchToFrame.java create mode 100644 debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ISwitchToThread.java diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ISwitchToFrame.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ISwitchToFrame.java new file mode 100644 index 00000000000..536b71fe263 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ISwitchToFrame.java @@ -0,0 +1,20 @@ +/* + *(c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ +package org.eclipse.cdt.debug.core; + +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.IStackFrame; + +/** + * + * Enter type comment. + * + * @since Sep 20, 2002 + */ +public interface ISwitchToFrame +{ + void switchToFrame( IStackFrame frame ) throws DebugException; +} diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ISwitchToThread.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ISwitchToThread.java new file mode 100644 index 00000000000..606a76c2c18 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ISwitchToThread.java @@ -0,0 +1,20 @@ +/* + *(c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ +package org.eclipse.cdt.debug.core; + +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.IThread; + +/** + * + * Enter type comment. + * + * @since Sep 20, 2002 + */ +public interface ISwitchToThread +{ + void setCurrentThread( IThread thread ) throws DebugException; +} diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java index ddbcd8856af..dcd362c49a2 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.debug.core.IFormattedMemoryRetrieval; import org.eclipse.cdt.debug.core.IRestart; import org.eclipse.cdt.debug.core.IRunToLine; import org.eclipse.cdt.debug.core.IState; +import org.eclipse.cdt.debug.core.ISwitchToThread; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointHit; import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointManager; @@ -88,6 +89,7 @@ public class CDebugTarget extends CDebugElement IFormattedMemoryRetrieval, IState, ILaunchListener, + ISwitchToThread, IExpressionListener, ICExpressionEvaluator { @@ -1814,4 +1816,15 @@ public class CDebugTarget extends CDebugElement setInternalTemporaryBreakpoint( getCDISession().getBreakpointManager().createLocation( resource.getLocation().lastSegment(), null, lineNumber ) ); resume(); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.ISwitchToThread#setCurrentThread(IThread) + */ + public void setCurrentThread( IThread thread ) throws DebugException + { + if ( !isAvailable() ) + { + return; + } + } } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java index 2a5f6bedceb..72c539940b7 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.IInstructionStep; import org.eclipse.cdt.debug.core.IRestart; import org.eclipse.cdt.debug.core.IState; +import org.eclipse.cdt.debug.core.ISwitchToFrame; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.ICDIConfiguration; import org.eclipse.cdt.debug.core.cdi.ICDIEndSteppingRange; @@ -51,6 +52,7 @@ public class CThread extends CDebugElement IState, IRestart, IInstructionStep, + ISwitchToFrame, ICDIEventListener { /** @@ -955,4 +957,11 @@ public class CThread extends CDebugElement { fIsCurrent = current; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.ISwitchToFrame#switchToFrame(IStackFrame) + */ + public void switchToFrame( IStackFrame frame ) throws DebugException + { + } } 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 5031cf5e28e..2db67993f07 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 @@ -7,8 +7,11 @@ import java.util.ResourceBundle; import org.eclipse.cdt.debug.core.IFormattedMemoryBlock; import org.eclipse.cdt.debug.core.IFormattedMemoryRetrieval; +import org.eclipse.cdt.debug.core.ISwitchToFrame; +import org.eclipse.cdt.debug.core.ISwitchToThread; import org.eclipse.cdt.debug.internal.ui.CDTDebugModelPresentation; import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry; +import org.eclipse.cdt.debug.internal.ui.CDebugUIUtils; import org.eclipse.cdt.debug.internal.ui.ColorManager; import org.eclipse.cdt.debug.internal.ui.preferences.MemoryViewPreferencePage; import org.eclipse.cdt.debug.internal.ui.preferences.RegistersViewPreferencePage; @@ -20,21 +23,31 @@ import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IPluginDescriptor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.IDebugElement; +import org.eclipse.debug.core.model.IStackFrame; +import org.eclipse.debug.core.model.IThread; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.ILaunchConfigurationTab; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.plugin.AbstractUIPlugin; /** * The main plugin class to be used in the desktop. */ -public class CDebugUIPlugin extends AbstractUIPlugin +public class CDebugUIPlugin extends AbstractUIPlugin implements ISelectionListener { //The shared instance. private static CDebugUIPlugin plugin; @@ -300,10 +313,70 @@ public class CDebugUIPlugin extends AbstractUIPlugin */ public void shutdown() throws CoreException { + IWorkbenchWindow ww = getActiveWorkbenchWindow(); + if ( ww != null ) + { + ww.getSelectionService().removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this ); + } if ( fImageDescriptorRegistry != null ) { fImageDescriptorRegistry.dispose(); } super.shutdown(); } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.Plugin#startup() + */ + public void startup() throws CoreException + { + super.startup(); + IWorkbenchWindow ww = getActiveWorkbenchWindow(); + if ( ww != null ) + { + ww.getSelectionService().addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this ); + } + } + + /* (non-Javadoc) + * @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart, ISelection) + */ + public void selectionChanged( IWorkbenchPart part, ISelection selection ) + { + if ( selection != null && selection instanceof IStructuredSelection ) + { + if ( ((IStructuredSelection)selection).size() == 1 ) + { + Object element = ((IStructuredSelection)selection).getFirstElement(); + if ( element != null && element instanceof IThread ) + { + if ( ((IThread)element).getDebugTarget() instanceof ISwitchToThread ) + { + try + { + ((ISwitchToThread)((IThread)element).getDebugTarget()).setCurrentThread( (IThread)element ); + } + catch( DebugException e ) + { + errorDialog( e.getMessage(), e ); + } + } + } + else if ( element != null && element instanceof IStackFrame ) + { + if ( ((IStackFrame)element).getThread() instanceof ISwitchToFrame ) + { + try + { + ((ISwitchToFrame)((IStackFrame)element).getThread()).switchToFrame( (IStackFrame)element ); + } + catch( DebugException e ) + { + errorDialog( e.getMessage(), e ); + } + } + } + } + } + } }