diff options
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java')
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java | 77 |
1 files changed, 61 insertions, 16 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java index e8241c054..fb73e6e04 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java @@ -22,7 +22,11 @@ import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchListener; @@ -46,7 +50,54 @@ import com.ibm.icu.text.MessageFormat; */ public class ProcessConsoleManager implements ILaunchListener { - /** + /** + * Crates console for given process + */ + private final class ConsoleCreation extends Job { + private final ILaunch launch; + private final IProcess process; + + ConsoleCreation(ILaunch launch, IProcess process) { + super("Creating console for " + process.getLabel()); //$NON-NLS-1$ + this.launch = launch; + this.process = process; + setSystem(true); + setUser(false); + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + if (monitor.isCanceled() || getConsoleDocument(process) != null) { + return Status.CANCEL_STATUS; + } + IConsoleColorProvider colorProvider = getColorProvider(process.getAttribute(IProcess.ATTR_PROCESS_TYPE)); + String encoding = launch.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING); + ProcessConsole pc = new ProcessConsole(process, colorProvider, encoding); + pc.setAttribute(IDebugUIConstants.ATTR_CONSOLE_PROCESS, process); + + // add new console to console manager. + ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { pc }); + return Status.OK_STATUS; + } + + @Override + public boolean belongsTo(Object family) { + return process == family || ProcessConsoleManager.class == family; + } + + @Override + public boolean shouldSchedule() { + Job[] jobs = Job.getJobManager().find(process); + for (Job job : jobs) { + if (job instanceof ConsoleCreation) { + return false; + } + } + return true; + } + } + + /** * Console document content provider extensions, keyed by extension id */ private Map<String, IConfigurationElement> fColorProviders; @@ -139,21 +190,14 @@ public class ProcessConsoleManager implements ILaunchListener { @Override public void launchChanged(final ILaunch launch) { IProcess[] processes= launch.getProcesses(); - for (int i= 0; i < processes.length; i++) { - if (getConsoleDocument(processes[i]) == null) { - IProcess process = processes[i]; - if (process.getStreamsProxy() == null) { - continue; - } - - //create a new console. - IConsoleColorProvider colorProvider = getColorProvider(process.getAttribute(IProcess.ATTR_PROCESS_TYPE)); - String encoding = launch.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING); - ProcessConsole pc = new ProcessConsole(process, colorProvider, encoding); - pc.setAttribute(IDebugUIConstants.ATTR_CONSOLE_PROCESS, process); - - //add new console to console manager. - ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{pc}); + for (IProcess process : processes) { + if (process.getStreamsProxy() == null) { + continue; + } + if (getConsoleDocument(process) == null) { + // create a new console in a separated thread, see bug 355011. + Job job = new ConsoleCreation(launch, process); + job.schedule(); } } List<IProcess> removed = getRemovedProcesses(launch); @@ -196,6 +240,7 @@ public class ProcessConsoleManager implements ILaunchListener { * launch listener and kills all existing console documents. */ public void shutdown() { + Job.getJobManager().cancel(ProcessConsoleManager.class); ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager(); ILaunch[] launches = launchManager.getLaunches(); for (int i = 0; i < launches.length; i++) { |