Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Khouzam2015-03-20 01:10:04 +0000
committerGerrit Code Review @ Eclipse.org2015-04-17 15:24:08 +0000
commitd071e969b73264b7b54242a1c38ee7786453c087 (patch)
treef161daa0e9bca9059a00f80620bae2dcf06a8edd /dsf-gdb
parent0fec0f9cd303f022387510323f11ca7c8c6a311a (diff)
downloadorg.eclipse.cdt-d071e969b73264b7b54242a1c38ee7786453c087.tar.gz
org.eclipse.cdt-d071e969b73264b7b54242a1c38ee7786453c087.tar.xz
org.eclipse.cdt-d071e969b73264b7b54242a1c38ee7786453c087.zip
Bug 462623: Split GdbAdapterFactory to allow overriding
Change-Id: Icb9b8d03c070afa8bdea5218d5d4a1aad5d86ebb Signed-off-by: Marc Khouzam <marc.khouzam@ericsson.com>
Diffstat (limited to 'dsf-gdb')
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF2
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml4
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java319
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbSessionAdapters.java431
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java8
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java7
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java7
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java35
-rw-r--r--dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java420
-rw-r--r--dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedSessionAdapters.java40
-rw-r--r--dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.java27
-rw-r--r--dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.properties13
-rw-r--r--dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/DsfExtendedTerminateCommand.java60
13 files changed, 636 insertions, 737 deletions
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF
index eac0507a9c9..25166f596ad 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF
@@ -29,7 +29,7 @@ Require-Bundle: org.eclipse.ui,
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Export-Package: org.eclipse.cdt.dsf.gdb.internal.ui;x-internal:=true,
- org.eclipse.cdt.dsf.gdb.internal.ui.actions;x-internal:=true,
+ org.eclipse.cdt.dsf.gdb.internal.ui.actions;x-friends:="org.eclipse.cdt.examples.dsf.gdb",
org.eclipse.cdt.dsf.gdb.internal.ui.breakpoints;x-internal:=true,
org.eclipse.cdt.dsf.gdb.internal.ui.commands;x-internal:=true,
org.eclipse.cdt.dsf.gdb.internal.ui.console;x-internal:=true,
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml
index 4472d898748..6a0e766504f 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml
@@ -159,6 +159,10 @@
<adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory"/>
<adapter type="org.eclipse.debug.ui.contexts.ISuspendTrigger"/>
<adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory"/>
+ <adapter type="org.eclipse.debug.core.commands.ITerminateHandler"/>
+ <adapter type="org.eclipse.cdt.debug.core.model.IConnectHandler"/>
+ <adapter type="org.eclipse.debug.core.commands.IDisconnectHandler"/>
+ <adapter type="org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler"/>
</factory>
</extension>
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java
index 03bb6e2823b..5911b0753ed 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2013 Wind River Systems and others.
+ * Copyright (c) 2006, 2015 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,6 +10,7 @@
* Navid Mehregani (TI) - Bug 289526 - Migrate the Restart feature to the new one, as supported by the platform
* Patrick Chuong (Texas Instruments) - Add support for icon overlay in the debug view (Bug 334566)
* Alvaro Sanchez-Leon (Ericsson AB) - Support for Step into selection (bug 244865)
+ * Marc Khouzam (Ericsson) - Extracted GdbSessionAdapters to allow overriding
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui;
@@ -18,79 +19,21 @@ import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
-import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.IConnectHandler;
import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
-import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler;
-import org.eclipse.cdt.debug.core.model.IReverseResumeHandler;
-import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler;
-import org.eclipse.cdt.debug.core.model.IReverseStepOverHandler;
-import org.eclipse.cdt.debug.core.model.IReverseToggleHandler;
-import org.eclipse.cdt.debug.core.model.ISaveTraceDataHandler;
-import org.eclipse.cdt.debug.core.model.IStartTracingHandler;
-import org.eclipse.cdt.debug.core.model.IStepIntoSelectionHandler;
-import org.eclipse.cdt.debug.core.model.ISteppingModeTarget;
-import org.eclipse.cdt.debug.core.model.IStopTracingHandler;
-import org.eclipse.cdt.debug.core.model.IUncallHandler;
-import org.eclipse.cdt.debug.ui.IPinProvider;
-import org.eclipse.cdt.dsf.concurrent.Immutable;
import org.eclipse.cdt.dsf.concurrent.ThreadSafe;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfResumeCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoSelectionCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepOverCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepReturnCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfSuspendCommand;
-import org.eclipse.cdt.dsf.debug.ui.sourcelookup.DsfSourceDisplayAdapter;
-import org.eclipse.cdt.dsf.debug.ui.viewmodel.SteppingController;
-import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.DefaultRefreshAllTarget;
-import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.IRefreshAllTarget;
-import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.DefaultDsfModelSelectionPolicyFactory;
-import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectNextTraceRecordHandler;
-import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectPrevTraceRecordHandler;
-import org.eclipse.cdt.dsf.gdb.internal.ui.actions.DsfTerminateCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbDisconnectCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbDebugNewExecutableCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepOverCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseToggleCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSaveTraceDataCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectNextTraceRecordCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectPrevTraceRecordCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStartTracingCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStopTracingCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbUncallCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.viewmodel.GdbViewModelAdapter;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
-import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate;
import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchesListener2;
import org.eclipse.debug.core.commands.IDisconnectHandler;
-import org.eclipse.debug.core.commands.IRestartHandler;
-import org.eclipse.debug.core.commands.IResumeHandler;
-import org.eclipse.debug.core.commands.IStepIntoHandler;
-import org.eclipse.debug.core.commands.IStepOverHandler;
-import org.eclipse.debug.core.commands.IStepReturnHandler;
-import org.eclipse.debug.core.commands.ISuspendHandler;
import org.eclipse.debug.core.commands.ITerminateHandler;
-import org.eclipse.debug.core.model.IDebugModelProvider;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
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.IModelProxyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
import org.eclipse.debug.ui.contexts.ISuspendTrigger;
-import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
/**
* This implementation of platform adapter factory only retrieves the adapters
@@ -102,216 +45,12 @@ import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
public class GdbAdapterFactory
implements IAdapterFactory, ILaunchesListener2
{
- @Immutable
- class SessionAdapterSet {
- final GdbLaunch fLaunch;
- final GdbViewModelAdapter fViewModelAdapter;
- final DsfSourceDisplayAdapter fSourceDisplayAdapter;
- final DsfStepIntoCommand fStepIntoCommand;
- final DsfStepIntoSelectionCommand fStepIntoSelectionCommand;
- final GdbReverseStepIntoCommand fReverseStepIntoCommand;
- final DsfStepOverCommand fStepOverCommand;
- final GdbReverseStepOverCommand fReverseStepOverCommand;
- final DsfStepReturnCommand fStepReturnCommand;
- final GdbUncallCommand fUncallCommand;
- final DsfSuspendCommand fSuspendCommand;
- final DsfResumeCommand fResumeCommand;
- final GdbReverseResumeCommand fReverseResumeCommand;
- final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand;
- final GdbRestartCommand fRestartCommand;
- final DsfTerminateCommand fTerminateCommand;
- final GdbDebugNewExecutableCommand fDebugNewExecutableCommand;
- final GdbConnectCommand fConnectCommand;
- final GdbDisconnectCommand fDisconnectCommand;
- final IDebugModelProvider fDebugModelProvider;
- final GdbSuspendTrigger fSuspendTrigger;
- final GdbSteppingModeTarget fSteppingModeTarget;
- final IModelSelectionPolicyFactory fModelSelectionPolicyFactory;
- final SteppingController fSteppingController;
- final DefaultRefreshAllTarget fRefreshAllTarget;
- final GdbReverseToggleCommand fReverseToggleTarget;
- final GdbStartTracingCommand fStartTracingTarget;
- final GdbStopTracingCommand fStopTracingTarget;
- final GdbSaveTraceDataCommand fSaveTraceDataTarget;
- final GdbSelectNextTraceRecordCommand fSelectNextRecordTarget;
- final GdbSelectPrevTraceRecordCommand fSelectPrevRecordTarget;
- final GdbDebugTextHover fDebugTextHover;
- final GdbPinProvider fPinProvider;
-
- SessionAdapterSet(GdbLaunch launch) {
- fLaunch = launch;
- DsfSession session = launch.getSession();
-
- // register stepping controller
- fSteppingController = new SteppingController(session);
- session.registerModelAdapter(SteppingController.class, fSteppingController);
-
- fViewModelAdapter = new GdbViewModelAdapter(session, fSteppingController);
- session.registerModelAdapter(IViewerInputProvider.class, fViewModelAdapter);
-
- if (launch.getSourceLocator() instanceof ISourceLookupDirector) {
- fSourceDisplayAdapter = new DsfSourceDisplayAdapter(session, (ISourceLookupDirector)launch.getSourceLocator(), fSteppingController);
- } else {
- fSourceDisplayAdapter = null;
- }
- session.registerModelAdapter(ISourceDisplay.class, fSourceDisplayAdapter);
-
- fSteppingModeTarget = new GdbSteppingModeTarget(session);
- fStepIntoCommand = new DsfStepIntoCommand(session, fSteppingModeTarget);
- fStepIntoSelectionCommand = new DsfStepIntoSelectionCommand(session);
- fReverseStepIntoCommand = new GdbReverseStepIntoCommand(session, fSteppingModeTarget);
- fStepOverCommand = new DsfStepOverCommand(session, fSteppingModeTarget);
- fReverseStepOverCommand = new GdbReverseStepOverCommand(session, fSteppingModeTarget);
- fStepReturnCommand = new DsfStepReturnCommand(session);
- fUncallCommand = new GdbUncallCommand(session, fSteppingModeTarget);
- fSuspendCommand = new DsfSuspendCommand(session);
- fResumeCommand = new DsfResumeCommand(session);
- fReverseResumeCommand = new GdbReverseResumeCommand(session);
- fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session);
- fRestartCommand = new GdbRestartCommand(session, fLaunch);
- fTerminateCommand = new DsfTerminateCommand(session);
- fDebugNewExecutableCommand = new GdbDebugNewExecutableCommand(session, fLaunch);
- fConnectCommand = new GdbConnectCommand(session, fLaunch);
- fDisconnectCommand = new GdbDisconnectCommand(session);
- fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch);
- fModelSelectionPolicyFactory = new DefaultDsfModelSelectionPolicyFactory();
- fRefreshAllTarget = new DefaultRefreshAllTarget();
- fReverseToggleTarget = new GdbReverseToggleCommand(session);
- fStartTracingTarget = new GdbStartTracingCommand(session);
- fStopTracingTarget = new GdbStopTracingCommand(session);
- fSaveTraceDataTarget = new GdbSaveTraceDataCommand(session);
- fSelectNextRecordTarget = new GdbSelectNextTraceRecordCommand(session);
- fSelectPrevRecordTarget = new GdbSelectPrevTraceRecordCommand(session);
- fPinProvider = new GdbPinProvider(session);
-
- session.registerModelAdapter(ISteppingModeTarget.class, fSteppingModeTarget);
- session.registerModelAdapter(IStepIntoHandler.class, fStepIntoCommand);
- session.registerModelAdapter(IStepIntoSelectionHandler.class, fStepIntoSelectionCommand);
- session.registerModelAdapter(IReverseStepIntoHandler.class, fReverseStepIntoCommand);
- session.registerModelAdapter(IStepOverHandler.class, fStepOverCommand);
- session.registerModelAdapter(IReverseStepOverHandler.class, fReverseStepOverCommand);
- session.registerModelAdapter(IStepReturnHandler.class, fStepReturnCommand);
- session.registerModelAdapter(IUncallHandler.class, fUncallCommand);
- session.registerModelAdapter(ISuspendHandler.class, fSuspendCommand);
- session.registerModelAdapter(IResumeHandler.class, fResumeCommand);
- session.registerModelAdapter(IReverseResumeHandler.class, fReverseResumeCommand);
- session.registerModelAdapter(IResumeWithoutSignalHandler.class, fResumeWithoutSignalCommand);
- session.registerModelAdapter(IRestartHandler.class, fRestartCommand);
- session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand);
- session.registerModelAdapter(IConnectHandler.class, fConnectCommand);
- session.registerModelAdapter(IDebugNewExecutableHandler.class, fDebugNewExecutableCommand);
- session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand);
- session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory);
- session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget);
- session.registerModelAdapter(IReverseToggleHandler.class, fReverseToggleTarget);
- session.registerModelAdapter(IStartTracingHandler.class, fStartTracingTarget);
- session.registerModelAdapter(IStopTracingHandler.class, fStopTracingTarget);
- session.registerModelAdapter(ISaveTraceDataHandler.class, fSaveTraceDataTarget);
- session.registerModelAdapter(ISelectNextTraceRecordHandler.class, fSelectNextRecordTarget);
- session.registerModelAdapter(ISelectPrevTraceRecordHandler.class, fSelectPrevRecordTarget);
- session.registerModelAdapter(IPinProvider.class, fPinProvider);
-
- fDebugModelProvider = new IDebugModelProvider() {
- // @see org.eclipse.debug.core.model.IDebugModelProvider#getModelIdentifiers()
- @Override
- public String[] getModelIdentifiers() {
- return new String[] { GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, ICBreakpoint.C_BREAKPOINTS_DEBUG_MODEL_ID, "org.eclipse.cdt.gdb" }; //$NON-NLS-1$
- }
- };
- session.registerModelAdapter(IDebugModelProvider.class, fDebugModelProvider);
-
- /*
- * Registering the launch as an adapter, ensures that this launch,
- * and debug model ID will be associated with all DMContexts from this
- * session.
- */
- session.registerModelAdapter(ILaunch.class, fLaunch);
-
- /*
- * Register debug hover adapter (bug 309001).
- */
- fDebugTextHover = new GdbDebugTextHover();
- session.registerModelAdapter(ICEditorTextHover.class, fDebugTextHover);
- }
-
- void dispose() {
- DsfSession session = fLaunch.getSession();
-
- fViewModelAdapter.dispose();
- session.unregisterModelAdapter(IViewerInputProvider.class);
-
- session.unregisterModelAdapter(ISourceDisplay.class);
- if (fSourceDisplayAdapter != null) fSourceDisplayAdapter.dispose();
-
- session.unregisterModelAdapter(SteppingController.class);
- fSteppingController.dispose();
-
- session.unregisterModelAdapter(ISteppingModeTarget.class);
- session.unregisterModelAdapter(IStepIntoHandler.class);
- session.unregisterModelAdapter(IStepIntoSelectionHandler.class);
- session.unregisterModelAdapter(IReverseStepIntoHandler.class);
- session.unregisterModelAdapter(IStepOverHandler.class);
- session.unregisterModelAdapter(IReverseStepOverHandler.class);
- session.unregisterModelAdapter(IStepReturnHandler.class);
- session.unregisterModelAdapter(IUncallHandler.class);
- session.unregisterModelAdapter(ISuspendHandler.class);
- session.unregisterModelAdapter(IResumeHandler.class);
- session.unregisterModelAdapter(IReverseResumeHandler.class);
- session.unregisterModelAdapter(IResumeWithoutSignalHandler.class);
- session.unregisterModelAdapter(IRestartHandler.class);
- session.unregisterModelAdapter(ITerminateHandler.class);
- session.unregisterModelAdapter(IConnectHandler.class);
- session.unregisterModelAdapter(IDebugNewExecutableHandler.class);
- session.unregisterModelAdapter(IDisconnectHandler.class);
- session.unregisterModelAdapter(IModelSelectionPolicyFactory.class);
- session.unregisterModelAdapter(IRefreshAllTarget.class);
- session.unregisterModelAdapter(IReverseToggleHandler.class);
- session.unregisterModelAdapter(IStartTracingHandler.class);
- session.unregisterModelAdapter(IStopTracingHandler.class);
- session.unregisterModelAdapter(ISaveTraceDataHandler.class);
- session.unregisterModelAdapter(ISelectNextTraceRecordHandler.class);
- session.unregisterModelAdapter(ISelectPrevTraceRecordHandler.class);
- session.unregisterModelAdapter(IPinProvider.class);
-
- session.unregisterModelAdapter(IDebugModelProvider.class);
- session.unregisterModelAdapter(ILaunch.class);
-
- session.unregisterModelAdapter(ICEditorTextHover.class);
-
- fSteppingModeTarget.dispose();
- fStepIntoCommand.dispose();
- fStepIntoSelectionCommand.dispose();
- fReverseStepIntoCommand.dispose();
- fStepOverCommand.dispose();
- fReverseStepOverCommand.dispose();
- fStepReturnCommand.dispose();
- fUncallCommand.dispose();
- fSuspendCommand.dispose();
- fResumeCommand.dispose();
- fReverseResumeCommand.dispose();
- fResumeWithoutSignalCommand.dispose();
- fRestartCommand.dispose();
- fTerminateCommand.dispose();
- fConnectCommand.dispose();
- fDebugNewExecutableCommand.dispose();
- fDisconnectCommand.dispose();
- fSuspendTrigger.dispose();
- fReverseToggleTarget.dispose();
- fStartTracingTarget.dispose();
- fStopTracingTarget.dispose();
- fSaveTraceDataTarget.dispose();
- fSelectNextRecordTarget.dispose();
- fSelectPrevRecordTarget.dispose();
- fPinProvider.dispose();
- }
- }
-
/**
* Active adapter sets. They are accessed using the launch instance
* which owns the debug services session.
*/
- private static Map<GdbLaunch, SessionAdapterSet> fgLaunchAdapterSets =
- Collections.synchronizedMap(new HashMap<GdbLaunch, SessionAdapterSet>());
+ private static Map<GdbLaunch, GdbSessionAdapters> fgLaunchAdapterSets =
+ Collections.synchronizedMap(new HashMap<GdbLaunch, GdbSessionAdapters>());
/**
* Map of launches for which adapter sets have already been disposed.
@@ -325,17 +64,16 @@ public class GdbAdapterFactory
* instance.
* </p>
*/
- private static Map<ILaunch, SessionAdapterSet> fgDisposedLaunchAdapterSets =
- new WeakHashMap<ILaunch, SessionAdapterSet>();
-
- static void disposeAdapterSet(ILaunch launch) {
- synchronized(fgLaunchAdapterSets) {
- if ( fgLaunchAdapterSets.containsKey(launch) ) {
- fgLaunchAdapterSets.remove(launch).dispose();
- fgDisposedLaunchAdapterSets.put(launch, null);
- }
- }
+ private static Map<ILaunch, GdbSessionAdapters> fgDisposedLaunchAdapterSets = new WeakHashMap<>();
+
+ static void disposeAdapterSet(ILaunch launch) {
+ synchronized(fgLaunchAdapterSets) {
+ if ( fgLaunchAdapterSets.containsKey(launch) ) {
+ fgLaunchAdapterSets.remove(launch).dispose();
+ fgDisposedLaunchAdapterSets.put(launch, null);
+ }
}
+ }
public GdbAdapterFactory() {
DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
@@ -344,9 +82,8 @@ public class GdbAdapterFactory
/**
* This method only actually returns adapters for the launch object.
*/
- @SuppressWarnings("rawtypes")
@Override
- public Object getAdapter(Object adaptableObject, Class adapterType) {
+ public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
if (!(adaptableObject instanceof GdbLaunch)) return null;
GdbLaunch launch = (GdbLaunch)adaptableObject;
@@ -362,7 +99,7 @@ public class GdbAdapterFactory
// it means that we have a new launch and new session, and we have to create a
// new set of adapters.
- SessionAdapterSet adapterSet;
+ GdbSessionAdapters adapterSet;
synchronized(fgLaunchAdapterSets) {
// The adapter set for the given launch was already disposed.
// Return a null adapter.
@@ -382,26 +119,27 @@ public class GdbAdapterFactory
if (session.isActive() == false) {
return null;
}
- adapterSet = new SessionAdapterSet(launch);
+ adapterSet = createGdbSessionAdapters(launch, session);
fgLaunchAdapterSets.put(launch, adapterSet);
}
}
// Returns the adapter type for the launch object.
- if (adapterType.equals(IElementContentProvider.class)) return adapterSet.fViewModelAdapter;
- else if (adapterType.equals(IModelProxyFactory.class)) return adapterSet.fViewModelAdapter;
- else if (adapterType.equals(IColumnPresentationFactory.class)) return adapterSet.fViewModelAdapter;
- else if (adapterType.equals(ISuspendTrigger.class)) return adapterSet.fSuspendTrigger;
- else return null;
+ return adapterSet.getLaunchAdapter(adapterType);
}
- @SuppressWarnings("rawtypes")
@Override
- public Class[] getAdapterList() {
- return new Class[] {
- IElementContentProvider.class, IModelProxyFactory.class, ISuspendTrigger.class,
+ public Class<?>[] getAdapterList() {
+ return new Class<?>[] {
+ IElementContentProvider.class,
+ IModelProxyFactory.class,
+ ISuspendTrigger.class,
IColumnPresentationFactory.class,
- };
+ ITerminateHandler.class,
+ IConnectHandler.class,
+ IDisconnectHandler.class,
+ IDebugNewExecutableHandler.class,
+ };
}
@Override
@@ -427,4 +165,7 @@ public class GdbAdapterFactory
public void launchesChanged(ILaunch[] launches) {
}
+ protected GdbSessionAdapters createGdbSessionAdapters(ILaunch launch, DsfSession session) {
+ return new GdbSessionAdapters(launch, session, getAdapterList());
+ }
}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbSessionAdapters.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbSessionAdapters.java
new file mode 100644
index 00000000000..f60b0aa4963
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbSessionAdapters.java
@@ -0,0 +1,431 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Ericsson 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:
+ * Marc Khouzam (Ericsson) - initial API and implementation
+ * Mikhail Khodjaiants (Mentor Graphics) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.internal.ui;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.cdt.debug.core.model.ICBreakpoint;
+import org.eclipse.cdt.debug.core.model.IConnectHandler;
+import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
+import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler;
+import org.eclipse.cdt.debug.core.model.IReverseResumeHandler;
+import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler;
+import org.eclipse.cdt.debug.core.model.IReverseStepOverHandler;
+import org.eclipse.cdt.debug.core.model.IReverseToggleHandler;
+import org.eclipse.cdt.debug.core.model.ISaveTraceDataHandler;
+import org.eclipse.cdt.debug.core.model.IStartTracingHandler;
+import org.eclipse.cdt.debug.core.model.IStepIntoSelectionHandler;
+import org.eclipse.cdt.debug.core.model.ISteppingModeTarget;
+import org.eclipse.cdt.debug.core.model.IStopTracingHandler;
+import org.eclipse.cdt.debug.core.model.IUncallHandler;
+import org.eclipse.cdt.debug.ui.IPinProvider;
+import org.eclipse.cdt.dsf.concurrent.Immutable;
+import org.eclipse.cdt.dsf.debug.ui.actions.DsfResumeCommand;
+import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoCommand;
+import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoSelectionCommand;
+import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepOverCommand;
+import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepReturnCommand;
+import org.eclipse.cdt.dsf.debug.ui.actions.DsfSteppingModeTarget;
+import org.eclipse.cdt.dsf.debug.ui.actions.DsfSuspendCommand;
+import org.eclipse.cdt.dsf.debug.ui.sourcelookup.DsfSourceDisplayAdapter;
+import org.eclipse.cdt.dsf.debug.ui.viewmodel.SteppingController;
+import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.DefaultRefreshAllTarget;
+import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.IRefreshAllTarget;
+import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.DefaultDsfModelSelectionPolicyFactory;
+import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
+import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectNextTraceRecordHandler;
+import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectPrevTraceRecordHandler;
+import org.eclipse.cdt.dsf.gdb.internal.ui.actions.DsfTerminateCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbDisconnectCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbDebugNewExecutableCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepOverCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseToggleCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSaveTraceDataCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectNextTraceRecordCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectPrevTraceRecordCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStartTracingCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStopTracingCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbUncallCommand;
+import org.eclipse.cdt.dsf.gdb.internal.ui.viewmodel.GdbViewModelAdapter;
+import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.cdt.dsf.ui.viewmodel.IVMAdapter;
+import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.commands.IDisconnectHandler;
+import org.eclipse.debug.core.commands.IRestartHandler;
+import org.eclipse.debug.core.commands.IResumeHandler;
+import org.eclipse.debug.core.commands.IStepIntoHandler;
+import org.eclipse.debug.core.commands.IStepOverHandler;
+import org.eclipse.debug.core.commands.IStepReturnHandler;
+import org.eclipse.debug.core.commands.ISuspendHandler;
+import org.eclipse.debug.core.commands.ITerminateHandler;
+import org.eclipse.debug.core.model.IDebugModelProvider;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+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.IModelProxyFactory;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
+import org.eclipse.debug.ui.contexts.ISuspendTrigger;
+import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
+
+/**
+ * This class creates and holds the different adapters registered with the DSF session
+ * as well as the adapters for the launch.
+ */
+@Immutable
+public class GdbSessionAdapters {
+ private final ILaunch fLaunch;
+ private final DsfSession fSession;
+
+ private final Map<Class<?>, Object> fLaunchAdapters = new HashMap<>();
+ private final Class<?>[] fLaunchAdapterTypes;
+
+ public GdbSessionAdapters(ILaunch launch, DsfSession session, Class<?>[] launchAdapterTypes) {
+ fLaunch = launch;
+ fSession = session;
+ fLaunchAdapterTypes = launchAdapterTypes;
+ createAdapters();
+ }
+
+ /**
+ * Creates all model and launch adapters.
+ */
+ protected void createAdapters() {
+ for (Class<?> adapterType : getModelAdapters()) {
+ Object adapter = createModelAdapter(adapterType, getLaunch(), getSession());
+ if (adapter != null) {
+ getSession().registerModelAdapter(adapterType, adapter);
+ }
+ }
+ for (Class<?> adapterType : fLaunchAdapterTypes) {
+ Object adapter = createLaunchAdapter(adapterType, getLaunch(), getSession());
+ if (adapter != null) {
+ fLaunchAdapters.put(adapterType, adapter);
+ }
+ }
+ }
+
+ /**
+ * Returns the adapter object registered with the session for the given adapter type
+ * or null if no adapter is registered.
+ */
+ @SuppressWarnings("unchecked")
+ public <T> T getModelAdapter(Class<T> adapterType) {
+ return (T)fSession.getModelAdapter(adapterType);
+ }
+
+ /**
+ * Returns the adapter object registered with {@link ILaunch} for the given adapter type
+ * or null if no adapter is registered.
+ */
+ @SuppressWarnings("unchecked")
+ public <T> T getLaunchAdapter(Class<T> adapterType) {
+ if (adapterType.equals(ITerminateHandler.class) ||
+ adapterType.equals(IConnectHandler.class) ||
+ adapterType.equals(IDisconnectHandler.class) ||
+ adapterType.equals(IDebugNewExecutableHandler.class)) {
+ // These launch adapters re-use the session adapters.
+ // Return them directly instead of including them
+ // in fLaunchAdapters to avoid trying to dispose of them
+ // twice when dispose() is called.
+ return (T)fSession.getModelAdapter(adapterType);
+ }
+
+ return (T)fLaunchAdapters.get(adapterType);
+ }
+
+ public void dispose() {
+ for (Class<?> adapterType : getModelAdapters()) {
+ Object adapter = getSession().getModelAdapter(adapterType);
+ if (adapter != null) {
+ getSession().unregisterModelAdapter(adapterType);
+ disposeAdapter(adapter);
+ }
+ }
+ for (Class<?> adapterType : fLaunchAdapterTypes) {
+ Object adapter = fLaunchAdapters.remove(adapterType);
+ if (adapter != null) {
+ disposeAdapter(adapter);
+ }
+ }
+ }
+
+ /**
+ * Returns all adapter types registered with the session.
+ * Clients can override this method to add a new adapter type and
+ * then override {@link GdbSessionAdapters.createModelAdapter()}
+ * to provide the adapter object.
+ */
+ protected List<Class<?>> getModelAdapters() {
+ // Return a list to which elements can be added
+ return new ArrayList<>(Arrays.asList(
+ SteppingController.class,
+ IViewerInputProvider.class,
+ ISteppingModeTarget.class,
+ ISourceDisplay.class,
+ IStepIntoHandler.class,
+ IStepIntoSelectionHandler.class,
+ IReverseStepIntoHandler.class,
+ IStepOverHandler.class,
+ IReverseStepOverHandler.class,
+ IStepReturnHandler.class,
+ IUncallHandler.class,
+ ISuspendHandler.class,
+ IResumeHandler.class,
+ IReverseResumeHandler.class,
+ IResumeWithoutSignalHandler.class,
+ IRestartHandler.class,
+ ITerminateHandler.class,
+ IDebugNewExecutableHandler.class,
+ IConnectHandler.class,
+ IDisconnectHandler.class,
+ IModelSelectionPolicyFactory.class,
+ IRefreshAllTarget.class,
+ IReverseToggleHandler.class,
+ IStartTracingHandler.class,
+ IStopTracingHandler.class,
+ ISaveTraceDataHandler.class,
+ ISelectNextTraceRecordHandler.class,
+ ISelectPrevTraceRecordHandler.class,
+ IPinProvider.class,
+ IDebugModelProvider.class,
+ ILaunch.class,
+ ICEditorTextHover.class));
+ }
+
+ /**
+ * Creates the adapter object for the given adapter type to register it with {@link ILaunch}.
+ * Clients can override this method to provide their own adapters.
+ */
+ @SuppressWarnings("unchecked")
+ protected <T> T createLaunchAdapter(Class<T> adapterType, ILaunch launch, DsfSession session) {
+ if (adapterType.equals(IElementContentProvider.class) ||
+ adapterType.equals(IModelProxyFactory.class) ||
+ adapterType.equals(IColumnPresentationFactory.class)) {
+ return (T)getViewModelAdapter();
+ }
+
+ if (adapterType.equals(ISuspendTrigger.class)) {
+ return (T)new GdbSuspendTrigger(session, launch);
+ }
+
+ return null;
+ }
+
+ /**
+ * Creates the adapter object for the given adapter type to register it with the model.
+ * Clients can override this method to provide their own adapters.
+ */
+ @SuppressWarnings("unchecked")
+ protected <T> T createModelAdapter(Class<T> adapterType, ILaunch launch, DsfSession session) {
+ if (SteppingController.class.equals(adapterType)) {
+ return (T)new SteppingController(session);
+ }
+ if (IViewerInputProvider.class.equals(adapterType)) {
+ return (T)new GdbViewModelAdapter(session, getSteppingController());
+ }
+ if (ISteppingModeTarget.class.equals(adapterType)) {
+ return (T)new GdbSteppingModeTarget(session);
+ }
+ if (ISourceDisplay.class.equals(adapterType)) {
+ return launch.getSourceLocator() instanceof ISourceLookupDirector ?
+ (T)new DsfSourceDisplayAdapter(
+ session,
+ (ISourceLookupDirector)launch.getSourceLocator(),
+ getSteppingController()
+ ) : null;
+ }
+ if (IStepIntoHandler.class.equals(adapterType)) {
+ return (T)new DsfStepIntoCommand(session, getSteppingModeTarget());
+ }
+ if (IStepIntoSelectionHandler.class.equals(adapterType)) {
+ return (T)new DsfStepIntoSelectionCommand(session);
+ }
+ if (IReverseStepIntoHandler.class.equals(adapterType)) {
+ return (T)new GdbReverseStepIntoCommand(session, getSteppingModeTarget());
+ }
+ if (IStepOverHandler.class.equals(adapterType)) {
+ return (T)new DsfStepOverCommand(session, getSteppingModeTarget());
+ }
+ if (IReverseStepOverHandler.class.equals(adapterType)) {
+ return (T)new GdbReverseStepOverCommand(session, getSteppingModeTarget());
+ }
+ if (IStepReturnHandler.class.equals(adapterType)) {
+ return (T)new DsfStepReturnCommand(session);
+ }
+ if (IUncallHandler.class.equals(adapterType)) {
+ return (T)new GdbUncallCommand(session, getSteppingModeTarget());
+ }
+ if (ISuspendHandler.class.equals(adapterType)) {
+ return (T)new DsfSuspendCommand(session);
+ }
+ if (IResumeHandler.class.equals(adapterType)) {
+ return (T)new DsfResumeCommand(session);
+ }
+ if (IReverseResumeHandler.class.equals(adapterType)) {
+ return (T)new GdbReverseResumeCommand(session);
+ }
+ if (IResumeWithoutSignalHandler.class.equals(adapterType)) {
+ return (T)new GdbResumeWithoutSignalCommand(session);
+ }
+ if (IRestartHandler.class.equals(adapterType)) {
+ return (T)new GdbRestartCommand(session, getLaunch());
+ }
+ if (ITerminateHandler.class.equals(adapterType)) {
+ return (T)new DsfTerminateCommand(session);
+ }
+ if (IDebugNewExecutableHandler.class.equals(adapterType)) {
+ return (T)new GdbDebugNewExecutableCommand(session, launch);
+ }
+ if (IConnectHandler.class.equals(adapterType)) {
+ return (T)new GdbConnectCommand(session, launch);
+ }
+ if (IDisconnectHandler.class.equals(adapterType)) {
+ return (T)new GdbDisconnectCommand(session);
+ }
+ if (IModelSelectionPolicyFactory.class.equals(adapterType)) {
+ return (T)new DefaultDsfModelSelectionPolicyFactory();
+ }
+ if (IRefreshAllTarget.class.equals(adapterType)) {
+ return (T)new DefaultRefreshAllTarget();
+ }
+ if (IReverseToggleHandler.class.equals(adapterType)) {
+ return (T)new GdbReverseToggleCommand(session);
+ }
+ if (IStartTracingHandler.class.equals(adapterType)) {
+ return (T)new GdbStartTracingCommand(session);
+ }
+ if (IStopTracingHandler.class.equals(adapterType)) {
+ return (T)new GdbStopTracingCommand(session);
+ }
+ if (ISaveTraceDataHandler.class.equals(adapterType)) {
+ return (T)new GdbSaveTraceDataCommand(session);
+ }
+ if (ISelectNextTraceRecordHandler.class.equals(adapterType)) {
+ return (T)new GdbSelectNextTraceRecordCommand(session);
+ }
+ if (ISelectPrevTraceRecordHandler.class.equals(adapterType)) {
+ return (T)new GdbSelectPrevTraceRecordCommand(session);
+ }
+ if (IPinProvider.class.equals(adapterType)) {
+ return (T)new GdbPinProvider(session);
+ }
+ if (IDebugModelProvider.class.equals(adapterType)) {
+ return (T)new IDebugModelProvider() {
+ // @see org.eclipse.debug.core.model.IDebugModelProvider#getModelIdentifiers()
+ @Override
+ public String[] getModelIdentifiers() {
+ return new String[] {
+ GdbLaunchDelegate.GDB_DEBUG_MODEL_ID,
+ ICBreakpoint.C_BREAKPOINTS_DEBUG_MODEL_ID,
+ "org.eclipse.cdt.gdb" //$NON-NLS-1$
+ };
+ }
+ };
+ }
+
+ /*
+ * Registering the launch as an adapter, ensures that this launch,
+ * and debug model ID will be associated with all DMContexts from this
+ * session.
+ */
+ if (ILaunch.class.equals(adapterType)) {
+ return (T)launch;
+ }
+
+ /*
+ * Register debug hover adapter (bug 309001).
+ */
+ if (ICEditorTextHover.class.equals(adapterType)) {
+ return (T)new GdbDebugTextHover();
+ }
+ return null;
+ }
+
+ /**
+ * Returns the method that will be called to dispose the given object.
+ *
+ * @param adapter the object to dispose
+ * @return "dispose()" method or null if the given object doesn't have "dispose()" method
+ *
+ * Clients can override this method to provide dispose methods different than "dispose()"
+ * for specific adapters.
+ */
+ protected Method getDisposeMethod(Object adapter) {
+ if (adapter != null) {
+ try {
+ return adapter.getClass().getMethod("dispose"); //$NON-NLS-1$
+ }
+ catch(NoSuchMethodException | SecurityException e) {
+ // ignore
+ }
+ }
+ return null;
+ }
+
+ protected DsfSession getSession() {
+ return fSession;
+ }
+
+ protected ILaunch getLaunch() {
+ return fLaunch;
+ }
+
+ private void disposeAdapter(Object adapter) {
+ try {
+ Method dispose = getDisposeMethod(adapter);
+ if (dispose != null) {
+ dispose.invoke(adapter);
+ }
+ }
+ catch(SecurityException | IllegalAccessException | IllegalArgumentException e) {
+ // ignore
+ }
+ catch(InvocationTargetException e) {
+ GdbPlugin.log(e.getTargetException());
+ }
+ }
+
+ protected DsfSteppingModeTarget getSteppingModeTarget() {
+ ISteppingModeTarget target = (ISteppingModeTarget)fSession.getModelAdapter(ISteppingModeTarget.class);
+ if (target instanceof DsfSteppingModeTarget) {
+ return (DsfSteppingModeTarget)target;
+ }
+ return null;
+ }
+
+ protected SteppingController getSteppingController() {
+ return (SteppingController)fSession.getModelAdapter(SteppingController.class);
+ }
+
+ protected IVMAdapter getViewModelAdapter() {
+ IViewerInputProvider provider = (IViewerInputProvider)fSession.getModelAdapter(IViewerInputProvider.class);
+ if (provider instanceof IVMAdapter) {
+ return (IVMAdapter)provider;
+ }
+ return null;
+ }
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java
index 176ec5ca105..c4e866cf853 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2011 Wind River Systems and others.
+ * Copyright (c) 2006, 2015 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -20,12 +20,12 @@ import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.ui.actions.DsfCommandRunnable;
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
-import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.gdb.service.IGDBProcesses;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.commands.IDebugCommandRequest;
import org.eclipse.debug.core.commands.IEnabledStateRequest;
import org.eclipse.debug.core.commands.IRestartHandler;
@@ -33,9 +33,9 @@ import org.eclipse.debug.core.commands.IRestartHandler;
public class GdbRestartCommand implements IRestartHandler {
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
- private final GdbLaunch fLaunch;
+ private final ILaunch fLaunch;
- public GdbRestartCommand(DsfSession session, GdbLaunch launch) {
+ public GdbRestartCommand(DsfSession session, ILaunch launch) {
fExecutor = session.getExecutor();
fLaunch = launch;
fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId());
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java
index 53f52f945ee..ac2e2b94558 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2011 Ericsson and others.
+ * Copyright (c) 2008, 2015 Ericsson 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
@@ -60,6 +60,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.IRequest;
import org.eclipse.debug.core.commands.IDebugCommandRequest;
import org.eclipse.debug.core.commands.IEnabledStateRequest;
@@ -71,7 +72,7 @@ import org.eclipse.ui.progress.UIJob;
public class GdbConnectCommand extends RefreshableDebugCommand implements IConnectHandler, IConnect {
- private final GdbLaunch fLaunch;
+ private final ILaunch fLaunch;
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
@@ -85,7 +86,7 @@ public class GdbConnectCommand extends RefreshableDebugCommand implements IConne
// the binary location for a local attach session.
private Map<String, String> fProcessNameToBinaryMap = new HashMap<String, String>();
- public GdbConnectCommand(DsfSession session, GdbLaunch launch) {
+ public GdbConnectCommand(DsfSession session, ILaunch launch) {
fLaunch = launch;
fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId());
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java
index f58000a5e8b..73aa6e8164c 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012 Mentor Graphics and others.
+ * Copyright (c) 2012, 2015 Mentor Graphics 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
@@ -41,6 +41,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.IRequest;
import org.eclipse.debug.core.commands.IEnabledStateRequest;
@@ -81,11 +82,11 @@ public class GdbDebugNewExecutableCommand extends RefreshableDebugCommand implem
}
}
- private final GdbLaunch fLaunch;
+ private final ILaunch fLaunch;
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
- public GdbDebugNewExecutableCommand( DsfSession session, GdbLaunch launch ) {
+ public GdbDebugNewExecutableCommand( DsfSession session, ILaunch launch ) {
super();
fLaunch = launch;
fExecutor = session.getExecutor();
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java
index 540519f07e8..97aba2e4ac1 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java
@@ -19,8 +19,6 @@ import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException;
-import org.eclipse.cdt.debug.core.model.IConnectHandler;
-import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
import org.eclipse.cdt.debug.internal.core.CRequest;
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
import org.eclipse.cdt.dsf.concurrent.DefaultDsfExecutor;
@@ -239,7 +237,7 @@ public class GdbLaunch extends DsfLaunch
// Execute asynchronously to avoid potential deadlocks
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=434645
- ITerminateHandler handler = (ITerminateHandler) getAdapter(ITerminateHandler.class);
+ ITerminateHandler handler = getAdapter(ITerminateHandler.class);
if (handler == null) {
super.terminate();
return;
@@ -266,7 +264,7 @@ public class GdbLaunch extends DsfLaunch
@Override
public void disconnect() throws DebugException {
- IDisconnectHandler handler = (IDisconnectHandler)getAdapter(IDisconnectHandler.class);
+ IDisconnectHandler handler = getAdapter(IDisconnectHandler.class);
if (handler == null) {
super.disconnect();
return;
@@ -363,25 +361,16 @@ public class GdbLaunch extends DsfLaunch
});
}
- @SuppressWarnings("rawtypes")
- @Override
- public Object getAdapter(Class adapter) {
- // We replace the standard terminate handler by DsfTerminateHandler
- // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=377447.
- if (adapter.equals(ITerminateHandler.class))
- return getSession().getModelAdapter(adapter);
- if (adapter.equals(IDisconnectHandler.class))
- return getSession().getModelAdapter(adapter);
-
- // Allow to call the connect handler when the launch is selected
- if (adapter.equals(IConnectHandler.class))
- return getSession().getModelAdapter(adapter);
-
- if (adapter.equals(IDebugNewExecutableHandler.class))
- return getSession().getModelAdapter(adapter);
-
- // Must force adapters to be loaded.
- Platform.getAdapterManager().loadAdapter(this, adapter.getName());
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ if (adapter.equals(ITerminateHandler.class) == false) {
+ // Must force adapters to be loaded.
+ // Except in the case of terminate. Terminate can be used
+ // when running headless (no UI) and therefore we should not
+ // force the loading of UI plugins in this case.
+ // This can happen when running JUnit tests for example.
+ Platform.getAdapterManager().loadAdapter(this, adapter.getName());
+ }
return super.getAdapter(adapter);
}
diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java
index d509ad0704b..7aa3322336e 100644
--- a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java
+++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2014 Ericsson and others.
+ * Copyright (c) 2014, 2015 Ericsson 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
@@ -10,425 +10,17 @@
*******************************************************************************/
package org.eclipse.cdt.examples.dsf.gdb;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-import org.eclipse.cdt.debug.core.model.ICBreakpoint;
-import org.eclipse.cdt.debug.core.model.IConnectHandler;
-import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
-import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler;
-import org.eclipse.cdt.debug.core.model.IReverseResumeHandler;
-import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler;
-import org.eclipse.cdt.debug.core.model.IReverseStepOverHandler;
-import org.eclipse.cdt.debug.core.model.IReverseToggleHandler;
-import org.eclipse.cdt.debug.core.model.ISaveTraceDataHandler;
-import org.eclipse.cdt.debug.core.model.IStartTracingHandler;
-import org.eclipse.cdt.debug.core.model.IStepIntoSelectionHandler;
-import org.eclipse.cdt.debug.core.model.ISteppingModeTarget;
-import org.eclipse.cdt.debug.core.model.IStopTracingHandler;
-import org.eclipse.cdt.debug.core.model.IUncallHandler;
-import org.eclipse.cdt.debug.ui.IPinProvider;
-import org.eclipse.cdt.dsf.concurrent.Immutable;
import org.eclipse.cdt.dsf.concurrent.ThreadSafe;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfResumeCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoSelectionCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepOverCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepReturnCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.DsfSuspendCommand;
-import org.eclipse.cdt.dsf.debug.ui.actions.IDsfStepIntoSelection;
-import org.eclipse.cdt.dsf.debug.ui.sourcelookup.DsfSourceDisplayAdapter;
-import org.eclipse.cdt.dsf.debug.ui.viewmodel.SteppingController;
-import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.DefaultRefreshAllTarget;
-import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.IRefreshAllTarget;
-import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.DefaultDsfModelSelectionPolicyFactory;
-import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectNextTraceRecordHandler;
-import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectPrevTraceRecordHandler;
-import org.eclipse.cdt.dsf.gdb.internal.ui.GdbDebugTextHover;
-import org.eclipse.cdt.dsf.gdb.internal.ui.GdbPinProvider;
-import org.eclipse.cdt.dsf.gdb.internal.ui.GdbSuspendTrigger;
-import org.eclipse.cdt.dsf.gdb.internal.ui.actions.DsfTerminateCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbDisconnectCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbDebugNewExecutableCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepOverCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseToggleCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSaveTraceDataCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectNextTraceRecordCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectPrevTraceRecordCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStartTracingCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStopTracingCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbUncallCommand;
-import org.eclipse.cdt.dsf.gdb.internal.ui.viewmodel.GdbViewModelAdapter;
-import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
-import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate;
+import org.eclipse.cdt.dsf.gdb.internal.ui.GdbAdapterFactory;
+import org.eclipse.cdt.dsf.gdb.internal.ui.GdbSessionAdapters;
import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.cdt.examples.dsf.gdb.viewmodel.GdbExtendedViewModelAdapter;
-import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.core.commands.IDisconnectHandler;
-import org.eclipse.debug.core.commands.IRestartHandler;
-import org.eclipse.debug.core.commands.IResumeHandler;
-import org.eclipse.debug.core.commands.IStepIntoHandler;
-import org.eclipse.debug.core.commands.IStepOverHandler;
-import org.eclipse.debug.core.commands.IStepReturnHandler;
-import org.eclipse.debug.core.commands.ISuspendHandler;
-import org.eclipse.debug.core.commands.ITerminateHandler;
-import org.eclipse.debug.core.model.IDebugModelProvider;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-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.IModelProxyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
-import org.eclipse.debug.ui.contexts.ISuspendTrigger;
-import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
-/**
- * This implementation of platform adapter factory only retrieves the adapters
- * for the launch object. But it also manages the creation and destruction
- * of the session-based adapters which are returned by the
- * IDMContext.getAdapter() methods.
- */
@SuppressWarnings("restriction")
@ThreadSafe
-public class GdbExtendedAdapterFactory
- implements IAdapterFactory, ILaunchesListener2
-{
- @Immutable
- class SessionAdapterSet {
- final GdbLaunch fLaunch;
- final GdbViewModelAdapter fViewModelAdapter;
- final DsfSourceDisplayAdapter fSourceDisplayAdapter;
- final DsfStepIntoCommand fStepIntoCommand;
- final DsfStepIntoSelectionCommand fStepIntoSelectionCommand;
- final GdbReverseStepIntoCommand fReverseStepIntoCommand;
- final DsfStepOverCommand fStepOverCommand;
- final GdbReverseStepOverCommand fReverseStepOverCommand;
- final DsfStepReturnCommand fStepReturnCommand;
- final GdbUncallCommand fUncallCommand;
- final DsfSuspendCommand fSuspendCommand;
- final DsfResumeCommand fResumeCommand;
- final GdbReverseResumeCommand fReverseResumeCommand;
- final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand;
- final GdbRestartCommand fRestartCommand;
- final DsfTerminateCommand fTerminateCommand;
- final GdbDebugNewExecutableCommand fDebugNewExecutableCommand;
- final GdbConnectCommand fConnectCommand;
- final GdbDisconnectCommand fDisconnectCommand;
- final IDebugModelProvider fDebugModelProvider;
- final GdbSuspendTrigger fSuspendTrigger;
- final GdbSteppingModeTarget fSteppingModeTarget;
- final IModelSelectionPolicyFactory fModelSelectionPolicyFactory;
- final SteppingController fSteppingController;
- final DefaultRefreshAllTarget fRefreshAllTarget;
- final GdbReverseToggleCommand fReverseToggleTarget;
- final GdbStartTracingCommand fStartTracingTarget;
- final GdbStopTracingCommand fStopTracingTarget;
- final GdbSaveTraceDataCommand fSaveTraceDataTarget;
- final GdbSelectNextTraceRecordCommand fSelectNextRecordTarget;
- final GdbSelectPrevTraceRecordCommand fSelectPrevRecordTarget;
- final GdbDebugTextHover fDebugTextHover;
- final GdbPinProvider fPinProvider;
-
- SessionAdapterSet(GdbLaunch launch) {
- fLaunch = launch;
- DsfSession session = launch.getSession();
-
- // register stepping controller
- fSteppingController = new SteppingController(session);
- session.registerModelAdapter(SteppingController.class, fSteppingController);
-
- fViewModelAdapter = new GdbExtendedViewModelAdapter(session, fSteppingController);
- session.registerModelAdapter(IViewerInputProvider.class, fViewModelAdapter);
-
- if (launch.getSourceLocator() instanceof ISourceLookupDirector) {
- fSourceDisplayAdapter = new DsfSourceDisplayAdapter(session, (ISourceLookupDirector)launch.getSourceLocator(), fSteppingController);
- } else {
- fSourceDisplayAdapter = null;
- }
- session.registerModelAdapter(ISourceDisplay.class, fSourceDisplayAdapter);
-
- fSteppingModeTarget = new GdbSteppingModeTarget(session);
- fStepIntoCommand = new DsfStepIntoCommand(session, fSteppingModeTarget);
- fStepIntoSelectionCommand = new DsfStepIntoSelectionCommand(session);
- fReverseStepIntoCommand = new GdbReverseStepIntoCommand(session, fSteppingModeTarget);
- fStepOverCommand = new DsfStepOverCommand(session, fSteppingModeTarget);
- fReverseStepOverCommand = new GdbReverseStepOverCommand(session, fSteppingModeTarget);
- fStepReturnCommand = new DsfStepReturnCommand(session);
- fUncallCommand = new GdbUncallCommand(session, fSteppingModeTarget);
- fSuspendCommand = new DsfSuspendCommand(session);
- fResumeCommand = new DsfResumeCommand(session);
- fReverseResumeCommand = new GdbReverseResumeCommand(session);
- fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session);
- fRestartCommand = new GdbRestartCommand(session, fLaunch);
- fTerminateCommand = new DsfTerminateCommand(session);
- fDebugNewExecutableCommand = new GdbDebugNewExecutableCommand(session, fLaunch);
- fConnectCommand = new GdbConnectCommand(session, fLaunch);
- fDisconnectCommand = new GdbDisconnectCommand(session);
- fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch);
- fModelSelectionPolicyFactory = new DefaultDsfModelSelectionPolicyFactory();
- fRefreshAllTarget = new DefaultRefreshAllTarget();
- fReverseToggleTarget = new GdbReverseToggleCommand(session);
- fStartTracingTarget = new GdbStartTracingCommand(session);
- fStopTracingTarget = new GdbStopTracingCommand(session);
- fSaveTraceDataTarget = new GdbSaveTraceDataCommand(session);
- fSelectNextRecordTarget = new GdbSelectNextTraceRecordCommand(session);
- fSelectPrevRecordTarget = new GdbSelectPrevTraceRecordCommand(session);
- fPinProvider = new GdbPinProvider(session);
-
- session.registerModelAdapter(ISteppingModeTarget.class, fSteppingModeTarget);
- session.registerModelAdapter(IStepIntoHandler.class, fStepIntoCommand);
- session.registerModelAdapter(IStepIntoSelectionHandler.class, fStepIntoSelectionCommand);
- session.registerModelAdapter(IReverseStepIntoHandler.class, fReverseStepIntoCommand);
- session.registerModelAdapter(IStepOverHandler.class, fStepOverCommand);
- session.registerModelAdapter(IReverseStepOverHandler.class, fReverseStepOverCommand);
- session.registerModelAdapter(IStepReturnHandler.class, fStepReturnCommand);
- session.registerModelAdapter(IUncallHandler.class, fUncallCommand);
- session.registerModelAdapter(ISuspendHandler.class, fSuspendCommand);
- session.registerModelAdapter(IResumeHandler.class, fResumeCommand);
- session.registerModelAdapter(IReverseResumeHandler.class, fReverseResumeCommand);
- session.registerModelAdapter(IResumeWithoutSignalHandler.class, fResumeWithoutSignalCommand);
- session.registerModelAdapter(IRestartHandler.class, fRestartCommand);
- session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand);
- session.registerModelAdapter(IConnectHandler.class, fConnectCommand);
- session.registerModelAdapter(IDebugNewExecutableHandler.class, fDebugNewExecutableCommand);
- session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand);
- session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory);
- session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget);
- session.registerModelAdapter(IReverseToggleHandler.class, fReverseToggleTarget);
- session.registerModelAdapter(IStartTracingHandler.class, fStartTracingTarget);
- session.registerModelAdapter(IStopTracingHandler.class, fStopTracingTarget);
- session.registerModelAdapter(ISaveTraceDataHandler.class, fSaveTraceDataTarget);
- session.registerModelAdapter(ISelectNextTraceRecordHandler.class, fSelectNextRecordTarget);
- session.registerModelAdapter(ISelectPrevTraceRecordHandler.class, fSelectPrevRecordTarget);
- session.registerModelAdapter(IPinProvider.class, fPinProvider);
- session.registerModelAdapter(IDsfStepIntoSelection.class, fStepIntoSelectionCommand);
-
- fDebugModelProvider = new IDebugModelProvider() {
- // @see org.eclipse.debug.core.model.IDebugModelProvider#getModelIdentifiers()
- @Override
- public String[] getModelIdentifiers() {
- return new String[] { GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, ICBreakpoint.C_BREAKPOINTS_DEBUG_MODEL_ID, "org.eclipse.cdt.gdb" }; //$NON-NLS-1$
- }
- };
- session.registerModelAdapter(IDebugModelProvider.class, fDebugModelProvider);
-
- /*
- * Registering the launch as an adapter, ensures that this launch,
- * and debug model ID will be associated with all DMContexts from this
- * session.
- */
- session.registerModelAdapter(ILaunch.class, fLaunch);
-
- /*
- * Register debug hover adapter (bug 309001).
- */
- fDebugTextHover = new GdbDebugTextHover();
- session.registerModelAdapter(ICEditorTextHover.class, fDebugTextHover);
- }
-
- void dispose() {
- DsfSession session = fLaunch.getSession();
-
- fViewModelAdapter.dispose();
- session.unregisterModelAdapter(IViewerInputProvider.class);
-
- session.unregisterModelAdapter(ISourceDisplay.class);
- if (fSourceDisplayAdapter != null) fSourceDisplayAdapter.dispose();
-
- session.unregisterModelAdapter(SteppingController.class);
- fSteppingController.dispose();
-
- session.unregisterModelAdapter(ISteppingModeTarget.class);
- session.unregisterModelAdapter(IStepIntoHandler.class);
- session.unregisterModelAdapter(IStepIntoSelectionHandler.class);
- session.unregisterModelAdapter(IReverseStepIntoHandler.class);
- session.unregisterModelAdapter(IStepOverHandler.class);
- session.unregisterModelAdapter(IReverseStepOverHandler.class);
- session.unregisterModelAdapter(IStepReturnHandler.class);
- session.unregisterModelAdapter(IUncallHandler.class);
- session.unregisterModelAdapter(ISuspendHandler.class);
- session.unregisterModelAdapter(IResumeHandler.class);
- session.unregisterModelAdapter(IReverseResumeHandler.class);
- session.unregisterModelAdapter(IResumeWithoutSignalHandler.class);
- session.unregisterModelAdapter(IRestartHandler.class);
- session.unregisterModelAdapter(ITerminateHandler.class);
- session.unregisterModelAdapter(IConnectHandler.class);
- session.unregisterModelAdapter(IDebugNewExecutableHandler.class);
- session.unregisterModelAdapter(IDisconnectHandler.class);
- session.unregisterModelAdapter(IModelSelectionPolicyFactory.class);
- session.unregisterModelAdapter(IRefreshAllTarget.class);
- session.unregisterModelAdapter(IReverseToggleHandler.class);
- session.unregisterModelAdapter(IStartTracingHandler.class);
- session.unregisterModelAdapter(IStopTracingHandler.class);
- session.unregisterModelAdapter(ISaveTraceDataHandler.class);
- session.unregisterModelAdapter(ISelectNextTraceRecordHandler.class);
- session.unregisterModelAdapter(ISelectPrevTraceRecordHandler.class);
- session.unregisterModelAdapter(IPinProvider.class);
-
- session.unregisterModelAdapter(IDebugModelProvider.class);
- session.unregisterModelAdapter(ILaunch.class);
-
- session.unregisterModelAdapter(ICEditorTextHover.class);
-
- fSteppingModeTarget.dispose();
- fStepIntoCommand.dispose();
- fStepIntoSelectionCommand.dispose();
- fReverseStepIntoCommand.dispose();
- fStepOverCommand.dispose();
- fReverseStepOverCommand.dispose();
- fStepReturnCommand.dispose();
- fUncallCommand.dispose();
- fSuspendCommand.dispose();
- fResumeCommand.dispose();
- fReverseResumeCommand.dispose();
- fResumeWithoutSignalCommand.dispose();
- fRestartCommand.dispose();
- fTerminateCommand.dispose();
- fConnectCommand.dispose();
- fDebugNewExecutableCommand.dispose();
- fDisconnectCommand.dispose();
- fSuspendTrigger.dispose();
- fReverseToggleTarget.dispose();
- fStartTracingTarget.dispose();
- fStopTracingTarget.dispose();
- fSaveTraceDataTarget.dispose();
- fSelectNextRecordTarget.dispose();
- fSelectPrevRecordTarget.dispose();
- fPinProvider.dispose();
- }
- }
-
- /**
- * Active adapter sets. They are accessed using the launch instance
- * which owns the debug services session.
- */
- private static Map<GdbLaunch, SessionAdapterSet> fgLaunchAdapterSets =
- Collections.synchronizedMap(new HashMap<GdbLaunch, SessionAdapterSet>());
-
- /**
- * Map of launches for which adapter sets have already been disposed.
- * This map (used as a set) is maintained in order to avoid re-creating an
- * adapter set after the launch was removed from the launch manager, but
- * while the launch is still being held by other classes which may
- * request its adapters. A weak map is used to avoid leaking
- * memory once the launches are no longer referenced.
- * <p>
- * Access to this map is synchronized using the fgLaunchAdapterSets
- * instance.
- * </p>
- */
- private static Map<ILaunch, SessionAdapterSet> fgDisposedLaunchAdapterSets =
- new WeakHashMap<ILaunch, SessionAdapterSet>();
-
- static void disposeAdapterSet(ILaunch launch) {
- synchronized(fgLaunchAdapterSets) {
- if ( fgLaunchAdapterSets.containsKey(launch) ) {
- fgLaunchAdapterSets.remove(launch).dispose();
- fgDisposedLaunchAdapterSets.put(launch, null);
- }
- }
- }
-
- public GdbExtendedAdapterFactory() {
- DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
- }
-
- /**
- * This method only actually returns adapters for the launch object.
- */
- @SuppressWarnings("rawtypes")
- @Override
- public Object getAdapter(Object adaptableObject, Class adapterType) {
- if (!(adaptableObject instanceof GdbLaunch)) return null;
-
- GdbLaunch launch = (GdbLaunch)adaptableObject;
-
- // Check for valid session.
- // Note: even if the session is no longer active, the adapter set
- // should still be returned. This is because the view model may still
- // need to show elements representing a terminated process/thread/etc.
- DsfSession session = launch.getSession();
- if (session == null) return null;
-
- // Find the correct set of adapters based on the launch session-ID. If not found
- // it means that we have a new launch and new session, and we have to create a
- // new set of adapters.
-
- SessionAdapterSet adapterSet;
- synchronized(fgLaunchAdapterSets) {
- // The adapter set for the given launch was already disposed.
- // Return a null adapter.
- if (fgDisposedLaunchAdapterSets.containsKey(launch)) {
- return null;
- }
- adapterSet = fgLaunchAdapterSets.get(launch);
- if (adapterSet == null) {
- // If the first time we attempt to create an adapterSet is once the session is
- // already inactive, we should not create it and return null.
- // This can happen, for example, when we run JUnit tests and we don't actually
- // have a need for any adapters until the launch is actually being removed.
- // Note that we must do this here because fgDisposedLaunchAdapterSets
- // may not already know that the launch has been removed because of a race
- // condition with the caller which is also processing a launchRemoved method.
- // Bug 334687
- if (session.isActive() == false) {
- return null;
- }
- adapterSet = new SessionAdapterSet(launch);
- fgLaunchAdapterSets.put(launch, adapterSet);
- }
- }
-
- // Returns the adapter type for the launch object.
- if (adapterType.equals(IElementContentProvider.class)) return adapterSet.fViewModelAdapter;
- else if (adapterType.equals(IModelProxyFactory.class)) return adapterSet.fViewModelAdapter;
- else if (adapterType.equals(IColumnPresentationFactory.class)) return adapterSet.fViewModelAdapter;
- else if (adapterType.equals(ISuspendTrigger.class)) return adapterSet.fSuspendTrigger;
- else return null;
- }
-
- @SuppressWarnings("rawtypes")
- @Override
- public Class[] getAdapterList() {
- return new Class[] {
- IElementContentProvider.class, IModelProxyFactory.class, ISuspendTrigger.class,
- IColumnPresentationFactory.class,
- };
- }
-
- @Override
- public void launchesRemoved(ILaunch[] launches) {
- // Dispose the set of adapters for a launch only after the launch is
- // removed.
- for (ILaunch launch : launches) {
- if (launch instanceof GdbLaunch) {
- disposeAdapterSet(launch);
- }
- }
- }
-
- @Override
- public void launchesTerminated(ILaunch[] launches) {
- }
-
- @Override
- public void launchesAdded(ILaunch[] launches) {
- }
-
+public class GdbExtendedAdapterFactory extends GdbAdapterFactory {
@Override
- public void launchesChanged(ILaunch[] launches) {
+ protected GdbSessionAdapters createGdbSessionAdapters(ILaunch launch, DsfSession session) {
+ return new GdbExtendedSessionAdapters(launch, session, getAdapterList());
}
-
}
diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedSessionAdapters.java b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedSessionAdapters.java
new file mode 100644
index 00000000000..6b3a39e9a8a
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedSessionAdapters.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Ericsson 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:
+ * Marc Khouzam (Ericsson) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.examples.dsf.gdb;
+
+import org.eclipse.cdt.dsf.gdb.internal.ui.GdbSessionAdapters;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.cdt.examples.dsf.gdb.actions.DsfExtendedTerminateCommand;
+import org.eclipse.cdt.examples.dsf.gdb.viewmodel.GdbExtendedViewModelAdapter;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.commands.ITerminateHandler;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
+
+@SuppressWarnings("restriction")
+public class GdbExtendedSessionAdapters extends GdbSessionAdapters {
+
+ public GdbExtendedSessionAdapters(ILaunch launch, DsfSession session, Class<?>[] launchAdapterTypes) {
+ super(launch, session, launchAdapterTypes);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected <T> T createModelAdapter(Class<T> adapterType, ILaunch launch, DsfSession session) {
+ if (ITerminateHandler.class.equals(adapterType)) {
+ return (T)new DsfExtendedTerminateCommand(session);
+ }
+ if (IViewerInputProvider.class.equals(adapterType)) {
+ return (T)new GdbExtendedViewModelAdapter(session, getSteppingController());
+ }
+
+ return super.createModelAdapter(adapterType, launch, session);
+ }
+}
diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.java b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.java
new file mode 100644
index 00000000000..4a609569763
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Mentor Graphics 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:
+ * Mentor Graphics - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.examples.dsf.gdb.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+public class ActionMessages extends NLS {
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(ActionMessages.class.getName(), ActionMessages.class);
+ }
+
+ private ActionMessages() {
+ }
+
+ public static String DsfExtendedTerminateCommand_Confirm_Termination;
+ public static String DsfExtendedTerminateCommand_Terminate_the_session;
+}
diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.properties b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.properties
new file mode 100644
index 00000000000..f251f41b301
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2015 Mentor Graphics 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:
+# Mentor Graphics - Initial API and implementation
+###############################################################################
+
+DsfExtendedTerminateCommand_Confirm_Termination=Confirm Termination
+DsfExtendedTerminateCommand_Terminate_the_session=Terminate the session?
diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/DsfExtendedTerminateCommand.java b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/DsfExtendedTerminateCommand.java
new file mode 100644
index 00000000000..2ca7feb21af
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/DsfExtendedTerminateCommand.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Mentor Graphics 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:
+ * Mentor Graphics - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.examples.dsf.gdb.actions;
+
+import org.eclipse.cdt.dsf.gdb.internal.ui.actions.DsfTerminateCommand;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.debug.core.commands.IDebugCommandRequest;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class extends the existing "Terminate" command by adding a popup
+ * confirmation before terminating the session.
+ */
+public class DsfExtendedTerminateCommand extends DsfTerminateCommand {
+
+ public DsfExtendedTerminateCommand(DsfSession session) {
+ super(session);
+ }
+
+ @Override
+ public boolean execute(final IDebugCommandRequest request) {
+ final Display display = PlatformUI.isWorkbenchRunning() ? PlatformUI.getWorkbench().getDisplay() : null;
+ if (display != null) {
+ // Make sure we run on the UI thread.
+ // We may not already be on the UI thread, for example, when GdbLaunch.terminate() is called
+ // directly when closing a project.
+ display.syncExec(new Runnable() {
+ @Override
+ public void run() {
+ Shell shell = display.getActiveShell();
+ if (shell != null) {
+ boolean confirmed = MessageDialog.openConfirm(
+ shell,
+ ActionMessages.DsfExtendedTerminateCommand_Confirm_Termination,
+ ActionMessages.DsfExtendedTerminateCommand_Terminate_the_session
+ );
+ if (!confirmed) {
+ request.cancel();
+ return;
+ }
+ }
+ DsfExtendedTerminateCommand.super.execute(request);
+ }
+ });
+ }
+ return false;
+ }
+}

Back to the top