Bug 539029: [NiConsole] Update icons of commands
  - Add high dpi and disabled versions
  - Convert Terminate Tool action to command handler

Rendering-Pipe: G-2.1/I-1.1.1

Change-Id: Id1e9d3acf5a36e15b8b5e6653435dc4f8bdb7e03
diff --git a/r/org.eclipse.statet.nico.ui/icons/loctool_16/cancel.png b/r/org.eclipse.statet.nico.ui/icons/loctool_16/cancel.png
deleted file mode 100644
index 797b129..0000000
--- a/r/org.eclipse.statet.nico.ui/icons/loctool_16/cancel.png
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/loctool_16/pause.png b/r/org.eclipse.statet.nico.ui/icons/loctool_16/pause.png
deleted file mode 100644
index 86b1386..0000000
--- a/r/org.eclipse.statet.nico.ui/icons/loctool_16/pause.png
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/loctool_16/terminate.png b/r/org.eclipse.statet.nico.ui/icons/loctool_16/terminate.png
deleted file mode 100644
index f242a8d..0000000
--- a/r/org.eclipse.statet.nico.ui/icons/loctool_16/terminate.png
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/cancel.png b/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/cancel.png
deleted file mode 100644
index a60736b..0000000
--- a/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/cancel.png
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/pause.png b/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/pause.png
deleted file mode 100644
index c2a61a9..0000000
--- a/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/pause.png
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/terminate.png b/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/terminate.png
deleted file mode 100644
index b0520ef..0000000
--- a/r/org.eclipse.statet.nico.ui/icons/loctool_16_d/terminate.png
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel$d.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel$d.png
new file mode 100644
index 0000000..27c786d
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel$d.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel$d@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel$d@2x.png
new file mode 100644
index 0000000..0bd2842
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel$d@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel.png
new file mode 100644
index 0000000..a3e9c04
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel@2x.png
new file mode 100644
index 0000000..3523457
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/cancel@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output$d.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output$d.png
new file mode 100644
index 0000000..906ec17
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output$d.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output$d@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output$d@2x.png
new file mode 100644
index 0000000..2a27c13
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output$d@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output.gif b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output.gif
deleted file mode 100644
index af30a42..0000000
--- a/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output.gif
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output.png
new file mode 100644
index 0000000..7425f91
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output@2x.png
new file mode 100644
index 0000000..d7775b6
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/clear_output@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/pause$d.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/pause$d.png
new file mode 100644
index 0000000..79041ff
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/pause$d.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/pause$d@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/pause$d@2x.png
new file mode 100644
index 0000000..41c9746
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/pause$d@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/pause.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/pause.png
new file mode 100644
index 0000000..ebf7561
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/pause.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/pause@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/pause@2x.png
new file mode 100644
index 0000000..ced8101
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/pause@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool$d.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool$d.png
new file mode 100644
index 0000000..00de1d5
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool$d.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool$d@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool$d@2x.png
new file mode 100644
index 0000000..f5d4726
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/relaunch_tool$d@2x.png
Binary files differ
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
index a859fcc..071c862 100644
--- 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
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
index c31166c..10f4b11 100644
--- 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
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo$d.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo$d.png
new file mode 100644
index 0000000..fbdf308
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo$d.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo$d@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo$d@2x.png
new file mode 100644
index 0000000..5937220
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo$d@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo.png
new file mode 100644
index 0000000..801e9fd
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo@2x.png b/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo@2x.png
new file mode 100644
index 0000000..a94be4a
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/icons/tool_16_d/clear_output.gif b/r/org.eclipse.statet.nico.ui/icons/tool_16_d/clear_output.gif
deleted file mode 100644
index 6775edf..0000000
--- a/r/org.eclipse.statet.nico.ui/icons/tool_16_d/clear_output.gif
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.nico.ui/plugin.xml b/r/org.eclipse.statet.nico.ui/plugin.xml
index 7fff8cb..3890efb 100644
--- a/r/org.eclipse.statet.nico.ui/plugin.xml
+++ b/r/org.eclipse.statet.nico.ui/plugin.xml
@@ -246,19 +246,20 @@
          point="org.eclipse.ui.commandImages">
       <image
             commandId="org.eclipse.statet.nico.commands.RelaunchTool"
-            icon="icons/tool_16/relaunch_tool.png"/>
+            icon="icons/tool_16/relaunch_tool.png"
+            disabledIcon="icons/tool_16/relaunch_tool$d.png"/>
       <image
             commandId="org.eclipse.statet.nico.commands.PauseTool"
-            icon="icons/loctool_16/pause.png"
-            disabledIcon="icons/loctool_16_d/pause.png"/>
+            icon="icons/tool_16/pause.png"
+            disabledIcon="icons/tool_16/pause$d.png"/>
       <image
             commandId="org.eclipse.statet.nico.commands.CancelCurrent"
-            icon="icons/loctool_16/cancel.png"
-            disabledIcon="icons/loctool_16_d/cancel.png"/>
+            icon="icons/tool_16/cancel.png"
+            disabledIcon="icons/tool_16/cancel$d.png"/>
       <image
             commandId="org.eclipse.statet.nico.commands.ClearOutput"
-            icon="icons/tool_16/clear_output.gif"
-            disabledIcon="icons/tool_16_d/clear_output.gif"/>
+            icon="icons/tool_16/clear_output.png"
+            disabledIcon="icons/tool_16/clear_output$d.png"/>
    </extension>
    <extension
          point="org.eclipse.ui.services">
@@ -304,7 +305,7 @@
       </runnable>
       <runnable
             typeId="common/quit"
-            icon="icons/loctool_16/terminate.png">
+            icon="platform:/plugin/org.eclipse.statet.ecommons.debug.ui/icons/tool_16/terminate.png">
       </runnable>
    </extension>
    
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 d614045..2c785e5 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,7 @@
 	public static String TerminatingMonitor_Force_error_message;
 	public static String TerminatingMonitor_WaitButton_label;
 	
+	public static String TerminateToolAction_tooltip;
 	public static String RelaunchToolAction_tooltip;
 	
 	public static String Tracking_Name_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 ffd681c..c850b4c 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,7 @@
 TerminatingMonitor_Force_error_message = An error occurred when trying to kill the tool process.
 TerminatingMonitor_CancelButton_label = Cancel (quit requests)
 
+TerminateToolAction_tooltip= Terminate Tool
 RelaunchToolAction_tooltip= Relaunch Tool Session
 
 Tracking_Name_label = Name:
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/NicoUIPlugin.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/NicoUIPlugin.java
index 109515b..e5366c4 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/NicoUIPlugin.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/NicoUIPlugin.java
@@ -22,6 +22,9 @@
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.ui.statushandlers.StatusManager;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.ts.ui.workbench.WorkbenchToolRegistryListener;
 import org.eclipse.statet.ecommons.ts.ui.workbench.WorkbenchToolSessionData;
 import org.eclipse.statet.ecommons.ui.actions.WindowContributionsProvider;
@@ -35,6 +38,7 @@
 /**
  * The activator class controls the plug-in life cycle
  */
+@NonNullByDefault
 public final class NicoUIPlugin extends AbstractUIPlugin {
 	
 	
@@ -58,10 +62,10 @@
 	}
 	
 	
-	private ToolRegistry fToolRegistry;
+	private ToolRegistry toolRegistry;
 	private WindowContributionsProvider fContributionProvider;
 	
-	private DecoratorsRegistry fUIDecoratorsRegistry;
+	private @Nullable DecoratorsRegistry uiDecoratorsRegistry;
 	
 	
 	/**
@@ -76,15 +80,16 @@
 	public void start(final BundleContext context) throws Exception {
 		super.start(context);
 		
-		fToolRegistry = new ToolRegistry();
-		fToolRegistry.addListener(new WorkbenchToolRegistryListener() {
+		this.toolRegistry= new ToolRegistry();
+		
+		this.toolRegistry.addListener(new WorkbenchToolRegistryListener() {
 			@Override
 			public void toolSessionActivated(final WorkbenchToolSessionData sessionData) {
 				if (sessionData.getTool() != null) {
-					fToolRegistry.removeListener(this);
+					NicoUIPlugin.this.toolRegistry.removeListener(this);
 					
-					if (fContributionProvider == null) {
-						fContributionProvider = new NicoWindowContributions();
+					if (NicoUIPlugin.this.fContributionProvider == null) {
+						NicoUIPlugin.this.fContributionProvider= new NicoWindowContributions();
 					}
 				}
 			}
@@ -97,16 +102,16 @@
 	@Override
 	public void stop(final BundleContext context) throws Exception {
 		try {
-			if (fToolRegistry != null) {
-				fToolRegistry.dispose();
-				fToolRegistry = null;
+			if (this.toolRegistry != null) {
+				this.toolRegistry.dispose();
+				this.toolRegistry= null;
 			}
-			if (fContributionProvider != null) {
-				fContributionProvider.dispose();
-				fContributionProvider = null;
+			if (this.fContributionProvider != null) {
+				this.fContributionProvider.dispose();
+				this.fContributionProvider = null;
 			}
-			if (fUIDecoratorsRegistry != null) {
-				fUIDecoratorsRegistry = null;
+			if (this.uiDecoratorsRegistry != null) {
+				this.uiDecoratorsRegistry= null;
 			}
 		}
 		finally {
@@ -120,27 +125,22 @@
 	protected void initializeImageRegistry(final ImageRegistry reg) {
 		final ImageRegistryUtil util = new ImageRegistryUtil(this);
 		
-		util.register(NicoUIResources.LOCTOOL_CANCEL_IMAGE_ID, ImageRegistryUtil.T_LOCTOOL, "cancel.png"); //$NON-NLS-1$
-		util.register(NicoUIResources.LOCTOOLD_CANCEL_IMAGE_ID, ImageRegistryUtil.T_LOCTOOL_D, "cancel.png"); //$NON-NLS-1$
-		util.register(NicoUIResources.LOCTOOL_PAUSE_IMAGE_ID, ImageRegistryUtil.T_LOCTOOL, "pause.png"); //$NON-NLS-1$
-		util.register(NicoUIResources.LOCTOOLD_PAUSE_IMAGE_ID, ImageRegistryUtil.T_LOCTOOL_D, "pause.png"); //$NON-NLS-1$
-		util.register(NicoUIResources.LOCTOOL_TERMINATE_IMAGE_ID, ImageRegistryUtil.T_LOCTOOL, "terminate.png"); //$NON-NLS-1$
-		util.register(NicoUIResources.LOCTOOLD_TERMINATE_IMAGE_ID, ImageRegistryUtil.T_LOCTOOL_D, "terminate.png"); //$NON-NLS-1$
-		
 		util.register(NicoUIResources.OBJ_TASK_CONSOLECOMMAND_IMAGE_ID, ImageRegistryUtil.T_OBJ, "task-consolecommand.png"); //$NON-NLS-1$
 		util.register(NicoUIResources.OBJ_TASK_DUMMY_IMAGE_ID, ImageRegistryUtil.T_OBJ, "task-dummy.png"); //$NON-NLS-1$
 		util.register(NicoUIResources.OBJ_CONSOLECOMMAND_IMAGE_ID, ImageRegistryUtil.T_OBJ, "consolecommand.png"); //$NON-NLS-1$
 	}
 	
 	public ToolRegistry getToolRegistry() {
-		return fToolRegistry;
+		return this.toolRegistry;
 	}
 	
 	public synchronized DecoratorsRegistry getUIDecoratorsRegistry() {
-		if (fUIDecoratorsRegistry == null) {
-			fUIDecoratorsRegistry = new DecoratorsRegistry();
+		var registry= this.uiDecoratorsRegistry;
+		if (registry == null) {
+			registry= new DecoratorsRegistry();
+			this.uiDecoratorsRegistry= registry;
 		}
-		return fUIDecoratorsRegistry;
+		return registry;
 	}
 	
 }
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/TerminateToolHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/TerminateToolHandler.java
new file mode 100644
index 0000000..e2f25b7
--- /dev/null
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/actions/TerminateToolHandler.java
@@ -0,0 +1,106 @@
+/*=============================================================================#
+ # 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 org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.expressions.IEvaluationContext;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.statushandlers.StatusManager;
+
+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.ui.ECommonsDebugUI;
+import org.eclipse.statet.ecommons.ui.actions.AbstractScopeHandler;
+import org.eclipse.statet.ecommons.ui.actions.WorkbenchScopingHandler;
+import org.eclipse.statet.ecommons.ui.util.UIAccess;
+
+import org.eclipse.statet.internal.nico.ui.Messages;
+import org.eclipse.statet.nico.core.runtime.ToolProcess;
+import org.eclipse.statet.nico.ui.NicoUI;
+import org.eclipse.statet.nico.ui.NicoUITools;
+import org.eclipse.statet.nico.ui.actions.AbstractToolScopeHandler;
+import org.eclipse.statet.nico.ui.console.NIConsole;
+
+
+@NonNullByDefault
+public class TerminateToolHandler extends AbstractToolScopeHandler<ToolProcess> {
+	
+	
+	public TerminateToolHandler(final Object scope) {
+		super(scope, ECommonsDebugUI.TERMINATE_COMMAND_ID);
+	}
+	
+	
+	@Override
+	protected boolean isSupported(final Tool tool) {
+		return (tool instanceof ToolProcess);
+	}
+	
+	@Override
+	protected boolean evaluateIsEnabled(final ToolProcess tool) {
+		return (tool.canTerminate());
+	}
+	
+	
+	@Override
+	public @Nullable Object execute(final ExecutionEvent event,
+			final ToolProcess tool, final IEvaluationContext evalContext)
+			throws ExecutionException {
+		try {
+			tool.terminate();
+			
+			final IWorkbenchPage page= UIAccess.getActiveWorkbenchPage(false);
+			final IConsole console= DebugUITools.getConsole(tool);
+			if (console instanceof NIConsole) {
+				NicoUITools.showConsole((NIConsole)console, page, true);
+			}
+		}
+		catch (final DebugException e) {
+			final int severity= e.getStatus().getSeverity();
+			StatusManager.getManager().handle(new Status(severity, NicoUI.BUNDLE_ID, -1, Messages.TerminateToolAction_error_message, e),
+					(severity >= IStatus.ERROR) ? StatusManager.LOG | StatusManager.SHOW : StatusManager.LOG);
+		}
+		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 TerminateToolHandler(scope);
+		}
+		
+		
+	}
+	
+}
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/NicoUIResources.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/NicoUIResources.java
index d2b92e4..9a095d6 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/NicoUIResources.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/NicoUIResources.java
@@ -28,19 +28,10 @@
 	private static final String NS= "org.eclipse.statet.nico"; //$NON-NLS-1$
 	
 	
-	public static final String LOCTOOL_CANCEL_IMAGE_ID= NS + "/image/loctool/cancel";  //$NON-NLS-1$
-	public static final String LOCTOOLD_CANCEL_IMAGE_ID= NS + "/image/loctoold/cancel";  //$NON-NLS-1$
+	public static final String OBJ_TASK_CONSOLECOMMAND_IMAGE_ID= NS + "/images/obj/task.consolecommand"; //$NON-NLS-1$
+	public static final String OBJ_TASK_DUMMY_IMAGE_ID= NS + "/images/obj/task.commanddummy"; //$NON-NLS-1$
 	
-	public static final String LOCTOOL_PAUSE_IMAGE_ID= NS + "/image/loctool/pause"; //$NON-NLS-1$
-	public static final String LOCTOOLD_PAUSE_IMAGE_ID= NS + "/image/loctoold/pause"; //$NON-NLS-1$
-	
-	public static final String LOCTOOL_TERMINATE_IMAGE_ID= NS + "/image/loctool/terminate"; //$NON-NLS-1$
-	public static final String LOCTOOLD_TERMINATE_IMAGE_ID= NS + "/image/loctoold/terminate"; //$NON-NLS-1$
-	
-	public static final String OBJ_TASK_CONSOLECOMMAND_IMAGE_ID= NS + "/image/obj/task.consolecommand"; //$NON-NLS-1$
-	public static final String OBJ_TASK_DUMMY_IMAGE_ID= NS + "/image/obj/task.commanddummy"; //$NON-NLS-1$
-	
-	public static final String OBJ_CONSOLECOMMAND_IMAGE_ID= NS + "/image/obj/consolecommand"; //$NON-NLS-1$
+	public static final String OBJ_CONSOLECOMMAND_IMAGE_ID= NS + "/images/obj/consolecommand"; //$NON-NLS-1$
 	
 	
 	static final NicoUIResources INSTANCE= new NicoUIResources();
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 8dec567..498c3ee 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
@@ -16,6 +16,7 @@
 
 import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
 
+import static org.eclipse.statet.ecommons.debug.ui.ECommonsDebugUI.TERMINATE_COMMAND_ID;
 import static org.eclipse.statet.ecommons.ui.SharedUIResources.FIND_NEXT_COMMAND_ID;
 import static org.eclipse.statet.ecommons.ui.SharedUIResources.FIND_PREVIOUS_COMMAND_ID;
 import static org.eclipse.statet.ecommons.ui.actions.UIActions.ADDITIONS_GROUP_ID;
@@ -137,6 +138,7 @@
 import org.eclipse.statet.internal.nico.ui.NicoUIPlugin;
 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.actions.TerminateToolHandler;
 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;
@@ -454,7 +456,6 @@
 	private StatusListener debugListener;
 	private ConsoleRemoveLaunchAction removeAction;
 	private ConsoleRemoveAllTerminatedAction removeAllAction;
-	private TerminateToolAction terminateAction;
 	
 	private ContextHandlers pageHandlers;
 	private ContextHandlers inputHandlers;
@@ -688,7 +689,8 @@
 		
 		this.removeAction= new ConsoleRemoveLaunchAction(this.console.getProcess().getLaunch());
 		this.removeAllAction= new ConsoleRemoveAllTerminatedAction();
-		this.terminateAction= new TerminateToolAction(this.console.getProcess());
+		this.pageHandlers.addActivate(TERMINATE_COMMAND_ID,
+				new TerminateToolHandler(this) );
 		this.pageHandlers.addActivate(CANCEL_CURRENT_COMMAND_ID,
 				new CancelRunnableHandler(this, CANCEL_CURRENT_COMMAND_ID) );
 		this.pageHandlers.addActivate(CANCEL_CURRENT_PAUSE_COMMAND_ID,
@@ -847,7 +849,13 @@
 						null, null, Messages.RelaunchToolAction_tooltip,
 						HandlerContributionItem.STYLE_PUSH, null, false ),
 				handlers ));
-		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, this.terminateAction);
+		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, new HandlerContributionItem(
+				new CommandContributionItemParameter(serviceLocator,
+						null, TERMINATE_COMMAND_ID, null,
+						null, null, null,
+						null, null, Messages.TerminateToolAction_tooltip,
+						HandlerContributionItem.STYLE_PUSH, null, false ),
+				handlers ));
 		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, this.removeAction);
 		toolBarManager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, this.removeAllAction);
 		
@@ -985,8 +993,6 @@
 			this.removeAction= null;
 			this.removeAllAction.dispose();
 			this.removeAllAction= null;
-			this.terminateAction.dispose();
-			this.terminateAction= null;
 			
 			this.outputViewer= null;
 		}
@@ -1131,7 +1137,6 @@
 	
 	protected void onToolTerminated() {
 		if (this.isCreated) {
-			this.terminateAction.update();
 			final ActiveToolEvent event= new ActiveToolEvent(ActiveToolEvent.TOOL_TERMINATED, getTool());
 			for (final ActiveToolListener listener : this.toolListeners) {
 				listener.onToolChanged(event);
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/console/TerminateToolAction.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/console/TerminateToolAction.java
deleted file mode 100644
index 0e823cf..0000000
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/console/TerminateToolAction.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2000, 2022 IBM Corporation 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.
- # 
- # SPDX-License-Identifier: EPL-2.0
- # 
- # Contributors:
- #     IBM Corporation - org.eclipse.ui.console: initial API and implementation
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.nico.ui.console;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.views.console.ConsoleMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.texteditor.IUpdate;
-
-import org.eclipse.statet.ecommons.ui.util.UIAccess;
-
-import org.eclipse.statet.internal.nico.ui.Messages;
-import org.eclipse.statet.internal.nico.ui.NicoUIPlugin;
-import org.eclipse.statet.nico.ui.NicoUI;
-import org.eclipse.statet.nico.ui.NicoUIResources;
-import org.eclipse.statet.nico.ui.NicoUITools;
-
-
-public class TerminateToolAction extends Action implements IUpdate {
-	
-	
-	private IProcess process;
-	
-	
-	/**
-	 * Creates a terminate action for the console
-	 */
-	public TerminateToolAction(final IProcess process) {
-		super(ConsoleMessages.ConsoleTerminateAction_0);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.CONSOLE_TERMINATE_ACTION);
-		this.process= process;
-		setToolTipText(ConsoleMessages.ConsoleTerminateAction_1);
-		final ImageRegistry registry= NicoUIPlugin.getInstance().getImageRegistry();
-		setImageDescriptor(registry.getDescriptor(NicoUIResources.LOCTOOL_TERMINATE_IMAGE_ID));
-		setDisabledImageDescriptor(registry.getDescriptor(NicoUIResources.LOCTOOLD_TERMINATE_IMAGE_ID));
-		update();
-	}
-	
-	
-	@Override
-	public void update() {
-		setEnabled(this.process.canTerminate());
-	}
-	
-	@Override
-	public void run() {
-		try {
-//			killTargets(fProcess);
-			this.process.terminate();
-			
-			final IWorkbenchPage page= UIAccess.getActiveWorkbenchPage(false);
-			final IConsole console= DebugUITools.getConsole(this.process);
-			if (console instanceof NIConsole) {
-				NicoUITools.showConsole((NIConsole) console, page, true);
-			}
-		} catch (final DebugException e) {
-			final int severity= e.getStatus().getSeverity();
-			StatusManager.getManager().handle(new Status(severity, NicoUI.BUNDLE_ID, -1, Messages.TerminateToolAction_error_message, e),
-					(severity >= IStatus.ERROR) ? StatusManager.LOG | StatusManager.SHOW : StatusManager.LOG);
-		}
-	}
-	
-	private void killTargets(final IProcess process) throws DebugException {
-		final ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-		final ILaunch[] launches= launchManager.getLaunches();
-		
-		for (int i= 0; i < launches.length; i++) {
-			final ILaunch launch= launches[i];
-			final IProcess[] processes= launch.getProcesses();
-			for (int j= 0; j < processes.length; j++) {
-				final IProcess process2= processes[j];
-				if (process2.equals(process)) {
-					final IDebugTarget[] debugTargets= launch.getDebugTargets();
-					for (int k= 0; k < debugTargets.length; k++) {
-						final IDebugTarget target= debugTargets[k];
-						if (target.canTerminate()) {
-							target.terminate();
-						}
-					}
-					return; // all possible targets have been terminated for the launch.
-				}
-			}
-		}
-	}
-	
-	public void dispose() {
-		this.process= null;
-	}
-	
-}
diff --git a/r/org.eclipse.statet.r.doc/icons/loctool/cancel.png b/r/org.eclipse.statet.r.doc/icons/loctool/cancel.png
deleted file mode 100644
index 797b129..0000000
--- a/r/org.eclipse.statet.r.doc/icons/loctool/cancel.png
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/icons/loctool/clear_output.gif b/r/org.eclipse.statet.r.doc/icons/loctool/clear_output.gif
deleted file mode 100644
index af30a42..0000000
--- a/r/org.eclipse.statet.r.doc/icons/loctool/clear_output.gif
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/icons/loctool/terminate.gif b/r/org.eclipse.statet.r.doc/icons/loctool/terminate.gif
deleted file mode 100644
index dc47edf..0000000
--- a/r/org.eclipse.statet.r.doc/icons/loctool/terminate.gif
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/icons/tool/cancel.png b/r/org.eclipse.statet.r.doc/icons/tool/cancel.png
new file mode 100644
index 0000000..a3e9c04
--- /dev/null
+++ b/r/org.eclipse.statet.r.doc/icons/tool/cancel.png
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/icons/tool/cancel@2x.png b/r/org.eclipse.statet.r.doc/icons/tool/cancel@2x.png
new file mode 100644
index 0000000..3523457
--- /dev/null
+++ b/r/org.eclipse.statet.r.doc/icons/tool/cancel@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/icons/tool/clear_output.png b/r/org.eclipse.statet.r.doc/icons/tool/clear_output.png
new file mode 100644
index 0000000..a422818
--- /dev/null
+++ b/r/org.eclipse.statet.r.doc/icons/tool/clear_output.png
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/icons/tool/clear_output@2x.png b/r/org.eclipse.statet.r.doc/icons/tool/clear_output@2x.png
new file mode 100644
index 0000000..59618a1
--- /dev/null
+++ b/r/org.eclipse.statet.r.doc/icons/tool/clear_output@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/icons/tool/terminate.png b/r/org.eclipse.statet.r.doc/icons/tool/terminate.png
new file mode 100644
index 0000000..45fa44b
--- /dev/null
+++ b/r/org.eclipse.statet.r.doc/icons/tool/terminate.png
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/icons/tool/terminate@2x.png b/r/org.eclipse.statet.r.doc/icons/tool/terminate@2x.png
new file mode 100644
index 0000000..7decbf2
--- /dev/null
+++ b/r/org.eclipse.statet.r.doc/icons/tool/terminate@2x.png
Binary files differ
diff --git a/r/org.eclipse.statet.r.doc/reference/r_console-page.xhtml b/r/org.eclipse.statet.r.doc/reference/r_console-page.xhtml
index a51a510..57b4014 100644
--- a/r/org.eclipse.statet.r.doc/reference/r_console-page.xhtml
+++ b/r/org.eclipse.statet.r.doc/reference/r_console-page.xhtml
@@ -119,7 +119,7 @@
 	<th>Availability</th>
 </tr></thead>
 <tr>
-	<td><img alt="Icon" src="../icons/loctool/cancel.png" style="vertical-align: text-top"/></td>
+	<td><img alt="Icon" src="../icons/tool/cancel.png" style="vertical-align: text-top"/></td>
 	<td><span class="uilabel">Cancel Task</span></td>
 	<td><p>Cancel Tasks is a menu that allows to cancel the execution of the currently running 
 		R task. This can be useful e.g. when one launches an intensive simulation, but discovers 
@@ -135,7 +135,7 @@
 		<kbd>Break</kbd></td>
 </tr>
 <tr>
-	<td><img alt="Icon" src="../icons/loctool/terminate.gif" style="vertical-align: text-top"/></td>
+	<td><img alt="Icon" src="../icons/tool/terminate.png" style="vertical-align: text-top"/></td>
 	<td><span class="uilabel">Terminate</span></td>
 	<td><p>The Stop Console button allows to quit a given R. On pressing this button, the user will 
 		be prompted to save the workspace or not (can be disabled by launch arguments).</p>
@@ -166,7 +166,7 @@
 </tr>
 <tr><th colspan="4">Output</th></tr>
 <tr>
-	<td><img alt="Icon" src="../icons/loctool/clear_output.gif" style="vertical-align: text-top"/></td>
+	<td><img alt="Icon" src="../icons/tool/clear_output.png" style="vertical-align: text-top"/></td>
 	<td><span class="uilabel">Clear Console</span> /<br/>
 		<span class="uilabel">Clear Console Output</span></td>
 	<td><p>The Clear command will clean the output window of the console.  After clearing the 
diff --git a/r/org.eclipse.statet.r.doc/reference/r_debug-execution_control.xhtml b/r/org.eclipse.statet.r.doc/reference/r_debug-execution_control.xhtml
index b31fe17..d51f467 100644
--- a/r/org.eclipse.statet.r.doc/reference/r_debug-execution_control.xhtml
+++ b/r/org.eclipse.statet.r.doc/reference/r_debug-execution_control.xhtml
@@ -94,7 +94,7 @@
 		<kbd>F7</kbd></td>
 </tr>
 <tr>
-	<td><img alt="Icon" src="../icons/loctool/terminate.gif" style="vertical-align: text-top"/></td>
+	<td><img alt="Icon" src="../icons/tool/terminate.png" style="vertical-align: text-top"/></td>
 	<td><span class="uilabel">Terminate</span></td>
 	<td><p>Terminates the selected element (debug target/R engine, process, ...).</p>
 		<p>If the R thread is suspend, the terminate action for the R engine/R thread exits the
diff --git a/r/org.eclipse.statet.r.ui/icons/tool_16/echo.png b/r/org.eclipse.statet.r.ui/icons/tool_16/echo.png
deleted file mode 100644
index 5494287..0000000
--- a/r/org.eclipse.statet.r.ui/icons/tool_16/echo.png
+++ /dev/null
Binary files differ
diff --git a/r/org.eclipse.statet.r.ui/plugin.xml b/r/org.eclipse.statet.r.ui/plugin.xml
index 097da19..bb84f4b 100644
--- a/r/org.eclipse.statet.r.ui/plugin.xml
+++ b/r/org.eclipse.statet.r.ui/plugin.xml
@@ -1733,7 +1733,8 @@
       </image>
       <image
             commandId="org.eclipse.statet.r.commands.ToggleRunEcho"
-            icon="icons/tool_16/echo.png">
+            icon="platform:/plugin/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo.png"
+            disabledIcon="platform:/plugin/org.eclipse.statet.nico.ui/icons/tool_16/toggle_echo$d.png">
       </image>
    </extension>
    <extension