430227: disable refresh and validate buttons if the Server url is not
provided or is invalid

refresh and validate buttons are disabled until valid http(s)
is followed by a server url

Change-Id: I49545c0579e5dc3b8de1a99b9aa58696ac745138
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=430227
Signed-off-by: Natasha Carson <natasha.carson@tasktop.com>
diff --git a/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/builds/ui/spi/BuildServerPart.java b/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/builds/ui/spi/BuildServerPart.java
index e69db36..49b9d1f 100644
--- a/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/builds/ui/spi/BuildServerPart.java
+++ b/org.eclipse.mylyn.builds.ui/src/org/eclipse/mylyn/builds/ui/spi/BuildServerPart.java
@@ -17,6 +17,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.eclipse.core.databinding.UpdateValueStrategy;
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -71,6 +72,26 @@
  */
 public class BuildServerPart extends RepositoryLocationPart {
 
+	private boolean urlValid = false;
+
+	private Button refreshButton = null;
+
+	public class BuildServerPartUrlValidator extends UrlValidator {
+		public IStatus validate(Object value) {
+			IStatus validationStatus = super.validate(value);
+			urlValid = validationStatus == Status.OK_STATUS;
+			if (refreshButton != null) {
+				refreshButton.setEnabled(urlValid);
+			}
+			return validationStatus;
+		}
+	}
+
+	@Override
+	protected UpdateValueStrategy getUrlUpdateValueStrategy() {
+		return new UpdateValueStrategy().setAfterConvertValidator(new BuildServerPartUrlValidator());
+	}
+
 	private class CheckboxFilteredTree extends FilteredTree {
 
 		public CheckboxFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
@@ -121,8 +142,8 @@
 				}
 				return result;
 			} catch (CoreException e) {
-				return new Status(IStatus.ERROR, BuildsUiPlugin.ID_PLUGIN, NLS.bind("Server validation failed: {0}",
-						e.getMessage()), e);
+				return new Status(IStatus.ERROR, BuildsUiPlugin.ID_PLUGIN,
+						NLS.bind("Server validation failed: {0}", e.getMessage()), e);
 			}
 		}
 
@@ -167,11 +188,11 @@
 
 	@Override
 	public boolean canValidate() {
-		return true;
+		return super.canValidate() && urlValid;
 	}
 
 	private void createButtons(Composite section) {
-		Button refreshButton = new Button(section, SWT.PUSH);
+		refreshButton = new Button(section, SWT.PUSH);
 		GridDataFactory.fillDefaults().grab(true, false).applyTo(refreshButton);
 		refreshButton.setText("&Refresh");
 		refreshButton.addSelectionListener(new SelectionAdapter() {
@@ -180,6 +201,7 @@
 				validate();
 			}
 		});
+		refreshButton.setEnabled(urlValid);
 
 		Button selectAllButton = new Button(section, SWT.PUSH);
 		GridDataFactory.fillDefaults().grab(true, false).applyTo(selectAllButton);