mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
[179096] Added suspend trigger to open debug perspective on suspend.
This commit is contained in:
parent
cedbca9401
commit
91e43c46ad
2 changed files with 124 additions and 0 deletions
|
@ -23,6 +23,7 @@ Eclipse-LazyStart: true
|
|||
Export-Package:
|
||||
org.eclipse.dd.dsf.debug.ui,
|
||||
org.eclipse.dd.dsf.debug.ui.actions,
|
||||
org.eclipse.dd.dsf.debug.ui.contexts,
|
||||
org.eclipse.dd.dsf.debug.ui.sourcelookup,
|
||||
org.eclipse.dd.dsf.debug.ui.viewmodel,
|
||||
org.eclipse.dd.dsf.debug.ui.viewmodel.expression,
|
||||
|
@ -30,5 +31,7 @@ Export-Package:
|
|||
org.eclipse.dd.dsf.debug.ui.viewmodel.modules,
|
||||
org.eclipse.dd.dsf.debug.ui.viewmodel.numberformat,
|
||||
org.eclipse.dd.dsf.debug.ui.viewmodel.register,
|
||||
org.eclipse.dd.dsf.debug.ui.viewmodel.update,
|
||||
org.eclipse.dd.dsf.debug.ui.viewmodel.update.actions,
|
||||
org.eclipse.dd.dsf.debug.ui.viewmodel.variable
|
||||
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008 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
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* Wind River Systems - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.dd.dsf.debug.ui.contexts;
|
||||
|
||||
import java.util.concurrent.RejectedExecutionException;
|
||||
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.core.runtime.ISafeRunnable;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.ListenerList;
|
||||
import org.eclipse.core.runtime.MultiStatus;
|
||||
import org.eclipse.core.runtime.SafeRunner;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
import org.eclipse.core.runtime.jobs.Job;
|
||||
import org.eclipse.dd.dsf.concurrent.ConfinedToDsfExecutor;
|
||||
import org.eclipse.dd.dsf.concurrent.DsfRunnable;
|
||||
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
|
||||
import org.eclipse.dd.dsf.debug.service.IRunControl;
|
||||
import org.eclipse.dd.dsf.debug.ui.DsfDebugUIPlugin;
|
||||
import org.eclipse.dd.dsf.service.DsfServiceEventHandler;
|
||||
import org.eclipse.dd.dsf.service.DsfSession;
|
||||
import org.eclipse.debug.core.ILaunch;
|
||||
import org.eclipse.debug.ui.contexts.ISuspendTrigger;
|
||||
import org.eclipse.debug.ui.contexts.ISuspendTriggerListener;
|
||||
|
||||
/**
|
||||
* DSF implementation of the ISuspendTrigger interface. The suspend trigger
|
||||
* is used by the IDE to trigger activation of the debug perspective when
|
||||
* the debugger suspends.
|
||||
*
|
||||
* @see ISuspendTrigger
|
||||
*/
|
||||
@ConfinedToDsfExecutor("fSession.getExecutor()")
|
||||
public class DsfSuspendTrigger implements ISuspendTrigger {
|
||||
|
||||
private final DsfSession fSession;
|
||||
private final ILaunch fLaunch;
|
||||
private boolean fDisposed = false;
|
||||
private boolean fEventListenerRegisterd = false;
|
||||
|
||||
@ThreadSafe
|
||||
private final ListenerList fListeners = new ListenerList();
|
||||
|
||||
@ThreadSafe
|
||||
public DsfSuspendTrigger(DsfSession session, ILaunch launch) {
|
||||
fSession = session;
|
||||
fLaunch = launch;
|
||||
try {
|
||||
fSession.getExecutor().execute(new DsfRunnable() {
|
||||
public void run() {
|
||||
if (!fDisposed) {
|
||||
fSession.addServiceEventListener(DsfSuspendTrigger.this, null);
|
||||
fEventListenerRegisterd = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch(RejectedExecutionException e) {}
|
||||
}
|
||||
|
||||
@ThreadSafe
|
||||
public void addSuspendTriggerListener(ISuspendTriggerListener listener) {
|
||||
if (fListeners != null) {
|
||||
fListeners.add(listener);
|
||||
}
|
||||
}
|
||||
|
||||
@ThreadSafe
|
||||
public void removeSuspendTriggerListener(ISuspendTriggerListener listener) {
|
||||
if (fListeners != null) {
|
||||
fListeners.remove(listener);
|
||||
}
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
if (fEventListenerRegisterd) {
|
||||
fSession.removeServiceEventListener(this);
|
||||
}
|
||||
fDisposed = true;
|
||||
}
|
||||
|
||||
@DsfServiceEventHandler
|
||||
public void eventDispatched(IRunControl.ISuspendedDMEvent e) {
|
||||
final Object[] listeners = fListeners.getListeners();
|
||||
if (listeners.length != 0) {
|
||||
new Job("DSF Suspend Trigger Notify") { //$NON-NLS-1$
|
||||
{
|
||||
setSystem(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IStatus run(IProgressMonitor monitor) {
|
||||
final MultiStatus status = new MultiStatus(DsfDebugUIPlugin.PLUGIN_ID, 0, "DSF Suspend Trigger Notify Job Status", null); //$NON-NLS-1$
|
||||
for (int i = 0; i < listeners.length; i++) {
|
||||
final ISuspendTriggerListener listener = (ISuspendTriggerListener) listeners[i];
|
||||
SafeRunner.run(new ISafeRunnable() {
|
||||
public void run() throws Exception {
|
||||
listener.suspended(fLaunch, null);
|
||||
}
|
||||
|
||||
public void handleException(Throwable exception) {
|
||||
status.add(new Status(
|
||||
IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, "Exception while calling suspend trigger listeners", exception)); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
return status;
|
||||
}
|
||||
}.schedule();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue