Bug 578301: [NiConsole] Add command and button to relaunch an R session

Change-Id: I976b27dac853eaac86e42d5dc0089d3a896c60d9
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool.png
new file mode 100644
index 0000000..a859fcc
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool@2x.png
new file mode 100644
index 0000000..c31166c
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/plugin.properties b/r/org.eclipse.statet.nico.ui/plugin.properties
index fdc0b5c..13696d0 100644
--- a/r/org.eclipse.statet.nico.ui/plugin.properties
+++ b/r/org.eclipse.statet.nico.ui/plugin.properties
@@ -22,12 +22,14 @@
 commands_CancelCurrentAndPause_name = Cancel and Pause
 commands_CancelAll_name = Cancel All Tasks
 commands_CancelCombi_name = Cancel
-commands_PauseEngine_name = Pause
+commands_PauseTool_name = Pause
 
-commands_DisconnectEngine_name = Disconnect
-commands_DisconnectEngine_description = Disconnects StatET console (client) from external engine (server)
-commands_ReconnectEngine_name = Reconnect
-commands_ReconnectEngine_description = Reconnects StatET console (client) to external engine (server)
+commands_DisconnectTool_name= Disconnect
+commands_DisconnectTool_description= Disconnects StatET console (client) from external tool (server)
+commands_ReconnectTool_name= Reconnect
+commands_ReconnectTool_description= Reconnects StatET console (client) to external tool (server)
+commands_RelaunchTool_name= Relaunch Tool
+commands_RelaunchTool_description= Terminates and relaunches the current tool session
 
 commands_SearchHistoryOlder_name = Search History for Next Older Item
 commands_SearchHistoryOlder_description = Searches through the history for closest older item starting with the text before the cursor.
diff --git a/r/org.eclipse.statet.nico.ui/plugin.xml b/r/org.eclipse.statet.nico.ui/plugin.xml
index 91256fe..822b2df 100644
--- a/r/org.eclipse.statet.nico.ui/plugin.xml
+++ b/r/org.eclipse.statet.nico.ui/plugin.xml
@@ -64,6 +64,30 @@
    <extension
          point="org.eclipse.ui.commands">
       <command
+            id="org.eclipse.statet.nico.commands.DisconnectTool"
+            categoryId="org.eclipse.debug.ui.category.run"
+            name="%commands_DisconnectTool_name"
+            description="%commands_DisconnectTool_description">
+      </command>
+      <command
+            id="org.eclipse.statet.nico.commands.ReconnectTool"
+            categoryId="org.eclipse.debug.ui.category.run"
+            name="%commands_ReconnectTool_name"
+            description="%commands_ReconnectTool_description">
+      </command>
+      <command
+            id="org.eclipse.statet.nico.commands.RelaunchTool"
+            categoryId="org.eclipse.debug.ui.category.run"
+            name="%commands_RelaunchTool_name"
+            description="%commands_RelaunchTool_description">
+      </command>
+      
+      <command
+            id="org.eclipse.statet.nico.commands.PauseTool"
+            categoryId="org.eclipse.debug.ui.category.run"
+            name="%commands_PauseTool_name">
+      </command>
+      <command
             id="org.eclipse.statet.nico.commands.CancelCurrent"
             categoryId="org.eclipse.debug.ui.category.run"
             name="%commands_CancelCurrent_name">
@@ -78,23 +102,6 @@
             categoryId="org.eclipse.debug.ui.category.run"
             name="%commands_CancelAll_name">
       </command>
-      <command
-            id="org.eclipse.statet.nico.commands.PauseEngine"
-            categoryId="org.eclipse.debug.ui.category.run"
-            name="%commands_PauseEngine_name">
-      </command>
-      <command
-            id="org.eclipse.statet.nico.commands.DisconnectEngine"
-            categoryId="org.eclipse.debug.ui.category.run"
-            name="%commands_DisconnectEngine_name"
-            description="%commands_DisconnectEngine_description">
-      </command>
-      <command
-            id="org.eclipse.statet.nico.commands.ReconnectEngine"
-            categoryId="org.eclipse.debug.ui.category.run"
-            name="%commands_ReconnectEngine_name"
-            description="%commands_ReconnectEngine_description">
-      </command>
       
       <command
             id="org.eclipse.statet.nico.commands.SearchHistoryOlder"
@@ -137,8 +144,17 @@
    <extension
          point="org.eclipse.ui.handlers">
       <handler
+            commandId="org.eclipse.statet.nico.commands.RelaunchTool"
+            class="org.eclipse.statet.internal.nico.ui.actions.RelaunchToolHandler$WorkbenchHandler">
+         <enabledWhen>
+            <with
+                  variable="org.eclipse.statet.activeTool">
+            </with>
+         </enabledWhen>
+      </handler>
+      <handler
             commandId="org.eclipse.statet.nico.commands.CancelCurrent"
-            class="org.eclipse.statet.internal.nico.ui.actions.CancelRunnableScopeHandler$WorkbenchHandler">
+            class="org.eclipse.statet.internal.nico.ui.actions.CancelRunnableHandler$WorkbenchHandler">
          <enabledWhen>
             <with
                   variable="org.eclipse.statet.activeTool">
@@ -147,7 +163,7 @@
       </handler>
       <handler
             commandId="org.eclipse.statet.nico.commands.CancelCurrentAndPause"
-            class="org.eclipse.statet.internal.nico.ui.actions.CancelRunnableScopeHandler$WorkbenchHandler">
+            class="org.eclipse.statet.internal.nico.ui.actions.CancelRunnableHandler$WorkbenchHandler">
          <enabledWhen>
             <with
                   variable="org.eclipse.statet.activeTool">
@@ -156,7 +172,7 @@
       </handler>
       <handler
             commandId="org.eclipse.statet.nico.commands.CancelAll"
-            class="org.eclipse.statet.internal.nico.ui.actions.CancelRunnableScopeHandler$WorkbenchHandler">
+            class="org.eclipse.statet.internal.nico.ui.actions.CancelRunnableHandler$WorkbenchHandler">
          <enabledWhen>
             <with
                   variable="org.eclipse.statet.activeTool">
@@ -229,20 +245,20 @@
    <extension
          point="org.eclipse.ui.commandImages">
       <image
+            commandId="org.eclipse.statet.nico.commands.RelaunchTool"
+            icon="icons/tool_16/relaunch_tool.png"/>
+      <image
+            commandId="org.eclipse.statet.nico.commands.PauseTool"
+            icon="icons/loctool_16/pause.png"
+            disabledIcon="icons/loctool_16_d/pause.png"/>
+      <image
             commandId="org.eclipse.statet.nico.commands.CancelCurrent"
             icon="icons/loctool_16/cancel.png"
-            disabledIcon="icons/loctool_16_d/cancel.png">
-      </image>
-      <image
-            commandId="org.eclipse.statet.nico.commands.PauseEngine"
-            icon="icons/loctool_16/pause.png"
-            disabledIcon="icons/loctool_16_d/pause.png">
-      </image>
+            disabledIcon="icons/loctool_16_d/cancel.png"/>
       <image
             commandId="org.eclipse.statet.nico.commands.ClearOutput"
             icon="icons/tool_16/clear_output.gif"
-            disabledIcon="icons/tool_16_d/clear_output.gif">
-      </image>
+            disabledIcon="icons/tool_16_d/clear_output.gif"/>
    </extension>
    <extension
          point="org.eclipse.ui.services">
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/Messages.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/Messages.java
index 6a7e9f7..9723f11 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/Messages.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/Messages.java
@@ -56,6 +56,8 @@
 	public static String TerminatingMonitor_Force_error_message;
 	public static String TerminatingMonitor_WaitButton_label;
 	
+	public static String RelaunchToolAction_tooltip;
+	
 	public static String Tracking_Name_label;
 	public static String Tracking_Name_error_Missing_message;
 	public static String Tracking_Content_label;
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/Messages.properties b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/Messages.properties
index 87c7813..12edf55 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/Messages.properties
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/Messages.properties
@@ -53,6 +53,8 @@
 TerminatingMonitor_Force_error_message = An error occurred when trying to kill the tool process.
 TerminatingMonitor_CancelButton_label = Cancel (quit requests)
 
+RelaunchToolAction_tooltip= Relaunch Tool Session
+
 Tracking_Name_label = Name:
 Tracking_Name_error_Missing_message=Missing configuration name
 Tracking_Content_label = Content
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/CancelRunnableScopeHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/CancelRunnableHandler.java
similarity index 93%
rename from r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/CancelRunnableScopeHandler.java
rename to r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/CancelRunnableHandler.java
index 3cd7b78..19461f1 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/CancelRunnableScopeHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/CancelRunnableHandler.java
@@ -39,7 +39,7 @@
  * Handler to cancel tool tasks.
  */
 @NonNullByDefault
-public class CancelRunnableScopeHandler extends AbstractToolScopeHandler<ToolProcess> {
+public class CancelRunnableHandler extends AbstractToolScopeHandler<ToolProcess> {
 	
 	
 	public static final String MENU_ID= "org.eclipse.statet.nico.menus.Cancel"; //$NON-NLS-1$
@@ -50,7 +50,7 @@
 	private final int options;
 	
 	
-	public CancelRunnableScopeHandler(final Object scope, final String commandId) {
+	public CancelRunnableHandler(final Object scope, final String commandId) {
 		super(scope, commandId);
 		
 		switch (commandId) {
@@ -115,7 +115,7 @@
 		@Override
 		protected AbstractScopeHandler createScopeHandler(final Object scope) {
 			final String commandId= nonNullAssert(getCommandId());
-			return new CancelRunnableScopeHandler(scope, commandId);
+			return new CancelRunnableHandler(scope, commandId);
 		}
 		
 		
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/DisconnectEngineHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/DisconnectEngineHandler.java
index 3d0f313..c78a667 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/DisconnectEngineHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/DisconnectEngineHandler.java
@@ -22,6 +22,7 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.progress.IProgressService;
 import org.eclipse.ui.services.IServiceLocator;
 import org.eclipse.ui.statushandlers.StatusManager;
@@ -47,17 +48,12 @@
 	
 	private static class DisconnectJob extends Job {
 		
-		private static String createLabel(final ToolProcess process) {
-			return "Disconnect " + process.getLabel();
-		}
-		
 		
 		private final ToolController controller;
 		
 		
 		DisconnectJob(final ToolProcess process, final ToolController controller) {
-			super(createLabel(process));
-			
+			super(NLS.bind("Disconnect {0}", process.getLabel(ToolProcess.DEFAULT_LABEL)));
 			setUser(true);
 			setPriority(INTERACTIVE);
 			
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/ReconnectEngineHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/ReconnectEngineHandler.java
index b251eb5..4759919 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/ReconnectEngineHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/ReconnectEngineHandler.java
@@ -91,10 +91,10 @@
 		return new IRunnableWithProgress() {
 			@Override
 			public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				final ILaunch originallaunch= process.getLaunch();
-				ILaunchConfiguration originalConfig= originallaunch.getLaunchConfiguration();
+				final var originalLaunch= process.getLaunch();
+				ILaunchConfiguration originalConfig= originalLaunch.getLaunchConfiguration();
 				if (originalConfig instanceof OverlayLaunchConfiguration) {
-					originalConfig= ((OverlayLaunchConfiguration) originalConfig).getOriginal();
+					originalConfig= ((OverlayLaunchConfiguration)originalConfig).getOriginal();
 				}
 				
 				final Map<String, Object> reconnect= new HashMap<>();
@@ -105,7 +105,7 @@
 				final ILaunchConfiguration reconnectConfig= new OverlayLaunchConfiguration(originalConfig, add);
 				try {
 					final ILaunch reconnectLaunch= reconnectConfig.launch(
-							originallaunch.getLaunchMode(), monitor, false );
+							originalLaunch.getLaunchMode(), monitor, false );
 					
 //					if (dispose != null) {
 //						final ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/RelaunchToolHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/RelaunchToolHandler.java
new file mode 100644
index 0000000..21753f5
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/RelaunchToolHandler.java
@@ -0,0 +1,198 @@
+/*=============================================================================#
+ # Copyright (c) 2022 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.internal.nico.ui.actions;
+
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.expressions.IEvaluationContext;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandImageService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.progress.IProgressConstants;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+import org.eclipse.statet.jcommons.ts.core.Tool;
+
+import org.eclipse.statet.ecommons.debug.core.util.OverlayLaunchConfiguration;
+import org.eclipse.statet.ecommons.ui.actions.AbstractScopeHandler;
+import org.eclipse.statet.ecommons.ui.actions.WorkbenchScopingHandler;
+
+import org.eclipse.statet.nico.core.runtime.ToolProcess;
+import org.eclipse.statet.nico.ui.NicoUI;
+import org.eclipse.statet.nico.ui.actions.AbstractToolScopeHandler;
+
+
+@NonNullByDefault
+public class RelaunchToolHandler extends AbstractToolScopeHandler<ToolProcess> {
+	
+	
+	private static class RelaunchJob extends Job {
+		
+		
+		private final ToolProcess process;
+		
+		
+		public RelaunchJob(final ToolProcess process) {
+			super(NLS.bind("Relaunch {0}", process.getLabel(ToolProcess.DEFAULT_LABEL)));
+			setUser(false);
+			setPriority(SHORT);
+			
+			final var commandImageService= nonNullAssert(PlatformUI.getWorkbench().getService(ICommandImageService.class));
+			final var imageDescriptor= commandImageService.getImageDescriptor(NicoUI.RELAUNCH_TOOL_COMMAND_ID);
+			if (imageDescriptor != null) {
+				setProperty(IProgressConstants.ICON_PROPERTY, imageDescriptor);
+			}
+			
+			this.process= process;
+		}
+		
+		
+		@Override
+		public boolean belongsTo(final Object family) {
+			return (family == RelaunchJob.class);
+		}
+		
+		@Override
+		protected IStatus run(final IProgressMonitor monitor) {
+			final SubMonitor m= SubMonitor.convert(monitor, 3 + 10);
+			try {
+				m.worked(1);
+				
+				if (!this.process.isTerminated()) {
+					m.setBlocked(new Status(IStatus.INFO, NicoUI.BUNDLE_ID,
+							"Waiting for termination..." ));
+					try {
+						while (!this.process.isTerminated()) {
+							try {
+								Thread.sleep(100);
+								
+								if (m.isCanceled()) {
+									return Status.CANCEL_STATUS;
+								}
+							}
+							catch (final InterruptedException e) {
+							}
+						}
+					}
+					finally {
+						m.clearBlocked();
+					}
+				}
+				m.worked(1);
+				
+				final IFileStore workspaceDir= this.process.getWorkspaceData().getWorkspaceDir();
+				
+				final var originalLaunch= this.process.getLaunch();
+				ILaunchConfiguration originalConfig= originalLaunch.getLaunchConfiguration();
+				if (originalConfig instanceof OverlayLaunchConfiguration) {
+					originalConfig= ((OverlayLaunchConfiguration)originalConfig).getOriginal();
+				}
+				
+				final Map<String, Object> add= new HashMap<>();
+				if (workspaceDir != null && workspaceDir.fetchInfo().exists()) {
+					add.put("org.eclipse.statet.r/renv/WorkingDirectory", workspaceDir.toString());
+				}
+				m.worked(1);
+				if (m.isCanceled()) {
+					return Status.CANCEL_STATUS;
+				}
+				
+				final ILaunchConfiguration relaunchConfig= new OverlayLaunchConfiguration(originalConfig, add);
+				@SuppressWarnings("unused")
+				final ILaunch relaunchLaunch= relaunchConfig.launch(
+							originalLaunch.getLaunchMode(), m.newChild(10), false );
+				
+				return Status.OK_STATUS;
+			}
+			catch (final CoreException e) {
+				return e.getStatus();
+			}
+			finally {
+				m.done();
+			}
+		}
+		
+	}
+	
+	
+	public RelaunchToolHandler(final Object scope) {
+		super(scope, NicoUI.RELAUNCH_TOOL_COMMAND_ID);
+	}
+	
+	
+	@Override
+	protected boolean isSupported(final Tool tool) {
+		return (tool instanceof ToolProcess);
+	}
+	
+	
+	@Override
+	public @Nullable Object execute(final ExecutionEvent event,
+			final ToolProcess tool, final IEvaluationContext evalContext)
+			throws ExecutionException {
+		try {
+			tool.terminate();
+			
+			@NonNull Job[] jobs= Job.getJobManager().find(RelaunchJob.class);
+			for (final Job job : jobs) {
+				if (((RelaunchJob)job).process == tool) {
+					return null;
+				}
+			}
+			new RelaunchJob(tool).schedule();
+		}
+		catch (final DebugException e) {
+		}
+		return null;
+	}
+	
+	
+	public static class WorkbenchHandler extends WorkbenchScopingHandler
+			implements IElementUpdater, IExecutableExtension {
+		
+		
+		/** For instantiation via plugin.xml */
+		public WorkbenchHandler() {
+		}
+		
+		
+		@Override
+		protected AbstractScopeHandler createScopeHandler(final Object scope) {
+			return new RelaunchToolHandler(scope);
+		}
+		
+		
+	}
+	
+}
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/NicoUI.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/NicoUI.java
index 894a1a1..81fe4a2 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/NicoUI.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/NicoUI.java
@@ -36,10 +36,12 @@
 	public static final String HISTORY_VIEW_ID= "org.eclipse.statet.nico.views.HistoryView"; //$NON-NLS-1$
 	public static final String QUEUE_VIEW_ID= "org.eclipse.statet.nico.views.QueueView"; //$NON-NLS-1$
 	
-	public static final String DISCONNECT_COMMAND_ID= "org.eclipse.statet.nico.commands.DisconnectEngine"; //$NON-NLS-1$
-	public static final String RECONNECT_COMMAND_ID= "org.eclipse.statet.nico.commands.ReconnectEngine"; //$NON-NLS-1$
+	public static final String DISCONNECT_COMMAND_ID= "org.eclipse.statet.nico.commands.DisconnectTool"; //$NON-NLS-1$
+	public static final String RECONNECT_COMMAND_ID= "org.eclipse.statet.nico.commands.ReconnectTool"; //$NON-NLS-1$
 	
-	public static final String PAUSE_COMMAND_ID= "org.eclipse.statet.nico.commands.PauseEngine"; //$NON-NLS-1$
+	public static final String RELAUNCH_TOOL_COMMAND_ID= "org.eclipse.statet.nico.commands.RelaunchTool"; //$NON-NLS-1$
+	
+	public static final String PAUSE_COMMAND_ID= "org.eclipse.statet.nico.commands.PauseTool"; //$NON-NLS-1$
 	public static final String CANCEL_CURRENT_COMMAND_ID= "org.eclipse.statet.nico.commands.CancelCurrent"; //$NON-NLS-1$
 	public static final String CANCEL_CURRENT_PAUSE_COMMAND_ID= "org.eclipse.statet.nico.commands.CancelCurrentAndPause"; //$NON-NLS-1$
 	public static final String CANCEL_ALL_COMMAND_ID= "org.eclipse.statet.nico.commands.CancelAll"; //$NON-NLS-1$
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/console/NIConsolePage.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/console/NIConsolePage.java
index 6611980..c7a2cfb 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/console/NIConsolePage.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/console/NIConsolePage.java
@@ -23,6 +23,7 @@
 import static org.eclipse.statet.nico.ui.NicoUI.CANCEL_ALL_COMMAND_ID;
 import static org.eclipse.statet.nico.ui.NicoUI.CANCEL_CURRENT_COMMAND_ID;
 import static org.eclipse.statet.nico.ui.NicoUI.CANCEL_CURRENT_PAUSE_COMMAND_ID;
+import static org.eclipse.statet.nico.ui.NicoUI.RELAUNCH_TOOL_COMMAND_ID;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -134,7 +135,8 @@
 import org.eclipse.statet.internal.nico.ui.LocalTaskTransfer;
 import org.eclipse.statet.internal.nico.ui.Messages;
 import org.eclipse.statet.internal.nico.ui.NicoUIPlugin;
-import org.eclipse.statet.internal.nico.ui.actions.CancelRunnableScopeHandler;
+import org.eclipse.statet.internal.nico.ui.actions.CancelRunnableHandler;
+import org.eclipse.statet.internal.nico.ui.actions.RelaunchToolHandler;
 import org.eclipse.statet.internal.nico.ui.console.OutputViewer;
 import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfigurator;
@@ -688,11 +690,13 @@
 		this.removeAllAction= new ConsoleRemoveAllTerminatedAction();
 		this.terminateAction= new TerminateToolAction(this.console.getProcess());
 		this.pageHandlers.addActivate(CANCEL_CURRENT_COMMAND_ID,
-				new CancelRunnableScopeHandler(this, CANCEL_CURRENT_COMMAND_ID) );
+				new CancelRunnableHandler(this, CANCEL_CURRENT_COMMAND_ID) );
 		this.pageHandlers.addActivate(CANCEL_CURRENT_PAUSE_COMMAND_ID,
-				new CancelRunnableScopeHandler(this, CANCEL_CURRENT_PAUSE_COMMAND_ID) );
+				new CancelRunnableHandler(this, CANCEL_CURRENT_PAUSE_COMMAND_ID) );
 		this.pageHandlers.addActivate(CANCEL_ALL_COMMAND_ID,
-				new CancelRunnableScopeHandler(this, CANCEL_ALL_COMMAND_ID) );
+				new CancelRunnableHandler(this, CANCEL_ALL_COMMAND_ID) );
+		this.pageHandlers.addActivate(RELAUNCH_TOOL_COMMAND_ID,
+				new RelaunchToolHandler(this) );
 		
 // Conflict with binding CTRL+Z (in console EOF)
 //		pageKeys.activateContext("org.eclipse.debug.ui.console");  //$NON-NLS-1$
@@ -800,10 +804,10 @@
 		
 		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, new HandlerContributionItem(
 				new CommandContributionItemParameter(serviceLocator,
-						CancelRunnableScopeHandler.MENU_ID, CANCEL_CURRENT_COMMAND_ID, null,
+						CancelRunnableHandler.MENU_ID, CANCEL_CURRENT_COMMAND_ID, null,
 						null, null, null,
 						Messages.CancelAction_name, null, Messages.CancelAction_tooltip,
-						HandlerContributionItem.STYLE_PULLDOWN, null, false),
+						HandlerContributionItem.STYLE_PULLDOWN, null, false ),
 				handlers ) {
 			// Workaround for E-Bug #366528
 			@Override
@@ -836,6 +840,13 @@
 				});
 			}
 		});
+		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, new HandlerContributionItem(
+				new CommandContributionItemParameter(serviceLocator,
+						null, RELAUNCH_TOOL_COMMAND_ID, null,
+						null, null, null,
+						null, null, Messages.RelaunchToolAction_tooltip,
+						HandlerContributionItem.STYLE_PUSH, null, false ),
+				handlers ));
 		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, this.terminateAction);
 		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, this.removeAction);
 		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, this.removeAllAction);