388776: abort build using context menu in Builds View

Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=388776

Change-Id: Id1c11c81e6fba20f2924850c4305d5042c18b3c9
Signed-off-by: Jomar Santos <jomaroliversantos@gmail.com>
diff --git a/org.eclipse.mylyn.builds.ui/plugin.xml b/org.eclipse.mylyn.builds.ui/plugin.xml
index 041ee39..8320152 100644
--- a/org.eclipse.mylyn.builds.ui/plugin.xml
+++ b/org.eclipse.mylyn.builds.ui/plugin.xml
@@ -138,6 +138,12 @@
     </command>
     <command
           categoryId="org.eclipse.mylyn.builds.ui.category.Commands"
+          defaultHandler="org.eclipse.mylyn.internal.builds.ui.commands.AbortBuildHandler"
+          id="org.eclipse.mylyn.builds.ui.command.AbortBuild"
+          name="Abort Build">
+    </command>
+    <command
+          categoryId="org.eclipse.mylyn.builds.ui.category.Commands"
           defaultHandler="org.eclipse.mylyn.internal.builds.ui.commands.ShowBuildOutputHandler"
           id="org.eclipse.mylyn.builds.ui.command.ShowBuildOutput"
           name="Show Build Output">
@@ -199,6 +205,11 @@
           icon="icons/etool16/run_exc.gif">
     </image>
     <image
+          commandId="org.eclipse.mylyn.builds.ui.command.AbortBuild"
+          disabledIcon="platform:/plugin/org.eclipse.ui/icons/full/dlcl16/stop.png"
+          icon="platform:/plugin/org.eclipse.ui/icons/full/elcl16/stop.png">
+    </image>
+    <image
           commandId="org.eclipse.mylyn.builds.ui.command.NewTaskFromBuild"
           icon="icons/etool16/task-new.gif">
     </image>
@@ -532,6 +543,26 @@
           </visibleWhen>
        </command>
        <command
+             commandId="org.eclipse.mylyn.builds.ui.command.AbortBuild"
+             label="Abort Build"
+             style="push">
+          <visibleWhen
+                checkEnabled="false">
+             <iterate
+                ifEmpty="false"
+                   operator="and">
+                <instanceof
+                      value="org.eclipse.mylyn.builds.core.IBuildPlan">
+                </instanceof>
+                <adapt type="org.eclipse.mylyn.builds.core.IBuildPlan">
+                   <test
+                         property="org.eclipse.mylyn.builds.ui.test.plan.isLastBuildRunning">
+                   </test>
+                </adapt>
+             </iterate>
+          </visibleWhen>
+       </command>
+       <command
              commandId="org.eclipse.ui.navigate.showIn"
              label="History"
              style="push">
@@ -805,7 +836,7 @@
           class="org.eclipse.mylyn.internal.builds.ui.BuildPlanPropertyTester"
           id="org.eclipse.mylyn.builds.ui.propertyTester.BuildPlan"
           namespace="org.eclipse.mylyn.builds.ui.test.plan"
-          properties="hasBuild"
+          properties="hasBuild,isLastBuildRunning"
           type="org.eclipse.mylyn.builds.core.IBuildPlan">
     </propertyTester>
     <propertyTester
diff --git a/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/internal/builds/ui/BuildPlanPropertyTester.java b/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/internal/builds/ui/BuildPlanPropertyTester.java
index 2e1d0cf..d341c90 100644
--- a/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/internal/builds/ui/BuildPlanPropertyTester.java
+++ b/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/internal/builds/ui/BuildPlanPropertyTester.java
@@ -12,6 +12,7 @@
 package org.eclipse.mylyn.internal.builds.ui;
 
 import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.mylyn.builds.core.BuildState;
 import org.eclipse.mylyn.builds.core.IBuildPlan;
 import org.eclipse.mylyn.commons.core.CoreUtil;
 
@@ -30,6 +31,9 @@
 			if ("hasBuild".equals(property)) {
 				return CoreUtil.propertyEquals(plan.getLastBuild() != null, expectedValue);
 			}
+			if ("isLastBuildRunning".equals(property)) {
+				return CoreUtil.propertyEquals(plan.getLastBuild().getState() == BuildState.RUNNING, expectedValue);
+			}
 		}
 		return false;
 	}
diff --git a/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/internal/builds/ui/commands/AbortBuildHandler.java b/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/internal/builds/ui/commands/AbortBuildHandler.java
new file mode 100644
index 0000000..8333b1f
--- /dev/null
+++ b/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/internal/builds/ui/commands/AbortBuildHandler.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Tasktop Technologies 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:
+ *     Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.builds.ui.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.builds.core.IBuildPlan;
+import org.eclipse.mylyn.internal.builds.ui.actions.AbortBuildAction;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class AbortBuildHandler extends AbstractHandler {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			Object item = ((IStructuredSelection) selection).getFirstElement();
+			if (item instanceof IBuildPlan) {
+				IBuildPlan plan = (IBuildPlan) item;
+				AbortBuildAction.abortBuild(plan.getLastBuild());
+			}
+		}
+		return null;
+	}
+}