Bug 569135 - "Toggle Tracepoint" should be in editor ruler and have
distinct icon

Change-Id: I0155e296fd8f5da90510d6f03b6bfe8408fffefb
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/org.eclipse.jdt.debug.ui/plugin.properties b/org.eclipse.jdt.debug.ui/plugin.properties
index db85c36..513fdd6 100644
--- a/org.eclipse.jdt.debug.ui/plugin.properties
+++ b/org.eclipse.jdt.debug.ui/plugin.properties
@@ -17,6 +17,7 @@
 vmInstallPage=VM Install Page
 vmCapabilitiesPageName=VM Capabilities
 AddBreakpoint.label=Toggle &Breakpoint
+AddTracepoint.label=Toggle &Tracepoint
 
 addTypeStepFilterAction.label=&Filter Type
 addTypeStepFilterAction.tooltip=Filter the selected type(s)
diff --git a/org.eclipse.jdt.debug.ui/plugin.xml b/org.eclipse.jdt.debug.ui/plugin.xml
index 287975f..877e24c 100644
--- a/org.eclipse.jdt.debug.ui/plugin.xml
+++ b/org.eclipse.jdt.debug.ui/plugin.xml
@@ -152,8 +152,8 @@
          <action
                definitionId="org.eclipse.jdt.debug.ui.commands.ToggleTracepoint"
                label="%ToggleTracepointAction.label"
-               icon="$nl$/icons/full/obj16/brkp_obj.png"
-               disabledIcon="$nl$/icons/full/obj16/brkpd_obj.png"
+               icon="platform:/plugin/org.eclipse.debug.ui/icons/full/obj16/read_obj.png"
+               disabledIcon="platform:/plugin/org.eclipse.debug.ui/icons/full/obj16/read_obj_disabled.png"
                helpContextId="toggle_tracepoint_action_context"
                class="org.eclipse.jdt.internal.debug.ui.actions.RetargetToggleTracepointAction"
                menubarPath="org.eclipse.ui.run/lineBreakpointBeforeGroup"
@@ -972,6 +972,15 @@
                 menubarPath="debug">
          </action>
          <action
+               class="org.eclipse.jdt.internal.debug.ui.actions.RulerToggleTracepointActionDelegate"
+               helpContextId="manage_breakpoint_action_context"
+               icon="platform:/plugin/org.eclipse.debug.ui/icons/full/obj16/read_obj.png"
+               id="org.eclipse.jdt.debug.ui.actions.RulerToggleTracepointAction"
+               definitionId="org.eclipse.jdt.debug.ui.commands.ToggleTracepoint"
+               label="%AddTracepoint.label"
+               menubarPath="debug">
+         </action>
+         <action
                label="%EnableBreakpoint.label"
                helpContextId="enable_disable_breakpoint_action_context"
                class="org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
@@ -1007,6 +1016,15 @@
                 menubarPath="debug">
          </action>
          <action
+               class="org.eclipse.jdt.internal.debug.ui.actions.RulerToggleTracepointActionDelegate"
+               helpContextId="toggle_tracepoint_action_context"
+               icon="platform:/plugin/org.eclipse.debug.ui/icons/full/obj16/read_obj.png"
+               id="org.eclipse.jdt.debug.ui.actions.RulerToggleTracepointAction"
+               definitionId="org.eclipse.jdt.debug.ui.commands.ToggleTracepoint"
+               label="%AddTracepoint.label"
+               menubarPath="debug">
+         </action>
+         <action
                label="%EnableBreakpoint.label"
                helpContextId="enable_disable_breakpoint_action_context"
                class="org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RulerToggleTracepointActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RulerToggleTracepointActionDelegate.java
new file mode 100644
index 0000000..6edd6a7
--- /dev/null
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RulerToggleTracepointActionDelegate.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2020, Andrey Loskutov <loskutov@gmx.de> and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Andrey Loskutov <loskutov@gmx.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.debug.ui.actions;
+
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.NotEnabledException;
+import org.eclipse.core.commands.NotHandledException;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class RulerToggleTracepointActionDelegate extends AbstractRulerActionDelegate implements IActionDelegate2 {
+
+	private static final String TOGGLE_TRACEPOINT_COMMAND = "org.eclipse.jdt.debug.ui.commands.ToggleTracepoint"; //$NON-NLS-1$
+	private IEditorPart currentEditor;
+	private IAction dummyAction;
+
+	@Override
+	protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
+		dummyAction = new Action() {
+			// empty implementation to make compiler happy
+		};
+		return dummyAction;
+	}
+
+	@Override
+	public void setActiveEditor(IAction callerAction, IEditorPart targetEditor) {
+		currentEditor = targetEditor;
+	}
+
+	@Override
+	public void init(IAction action) {
+	}
+
+	@Override
+	public void dispose() {
+		currentEditor = null;
+		dummyAction = null;
+		super.dispose();
+	}
+
+	@Override
+	public void runWithEvent(IAction action, Event event) {
+		if (currentEditor == null) {
+			return;
+		}
+		IWorkbenchPartSite partSite = currentEditor.getSite();
+		IHandlerService hservice = partSite.getService(IHandlerService.class);
+		ICommandService cservice = partSite.getService(ICommandService.class);
+		try {
+			Command command = cservice.getCommand(TOGGLE_TRACEPOINT_COMMAND);
+			ExecutionEvent exevent = hservice.createExecutionEvent(command, event);
+			command.executeWithChecks(exevent);
+		} catch (ExecutionException | NotDefinedException | NotEnabledException | NotHandledException e) {
+			DebugUIPlugin.log(e);
+		}
+	}
+
+}