234445: [upstream] show descriptions for keywords for the REST Connector 

Change-Id: Id2db8d3af57b89c34840e86f11316e454b0dcbb4
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=234445
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData.txt b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData.txt
index 889e2e6..1821128 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData.txt
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData.txt
@@ -19,7 +19,7 @@
  TaskAttribute[id=task.common.operation,values=[],options=null,metaData={task.meta.label=Operation, task.meta.type=operation, task.meta.readOnly=false, task.meta.required=false}]
  TaskAttribute[id=depends_on,values=[],options=null,metaData={task.meta.label=Depends on:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=blocks,values=[],options=null,metaData={task.meta.label=Blocks:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
- TaskAttribute[id=keywords,values=[],options={Keyword1=Keyword1, Keyword2=Keyword2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
+ TaskAttribute[id=keywords,values=[],options={Keyword1=1, Keyword2=2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=cf_bugid,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=integer, task.meta.required=false, task.meta.label=bug id custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_datetime,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=dateTime, task.meta.required=false, task.meta.label=date time custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_dropdown,values=[],options={---=---, one=one, three=three, two=two},metaData={task.meta.readOnly=false, task.meta.type=singleSelect, task.meta.required=true, task.meta.label=drop down custom field, task.meta.attributeKind=task.common.kind.default}]
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData1.txt b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData1.txt
index a396ee7..f13175e 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData1.txt
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData1.txt
@@ -19,7 +19,7 @@
  TaskAttribute[id=task.common.operation,values=[],options=null,metaData={task.meta.label=Operation, task.meta.type=operation, task.meta.readOnly=false, task.meta.required=false}]
  TaskAttribute[id=depends_on,values=[],options=null,metaData={task.meta.label=Depends on:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=blocks,values=[],options=null,metaData={task.meta.label=Blocks:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
- TaskAttribute[id=keywords,values=[],options={Keyword1=Keyword1, Keyword2=Keyword2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
+ TaskAttribute[id=keywords,values=[],options={Keyword1=1, Keyword2=2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=cf_bugid,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=integer, task.meta.required=false, task.meta.label=bug id custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_datetime,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=dateTime, task.meta.required=false, task.meta.label=date time custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_dropdown,values=[],options={---=---, one=one, three=three, two=two},metaData={task.meta.readOnly=false, task.meta.type=singleSelect, task.meta.required=true, task.meta.label=drop down custom field, task.meta.attributeKind=task.common.kind.default}]
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData2.txt b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData2.txt
index e3ab9ec..e82df73 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData2.txt
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version1/taskData2.txt
@@ -19,7 +19,7 @@
  TaskAttribute[id=task.common.operation,values=[],options=null,metaData={task.meta.label=Operation, task.meta.type=operation, task.meta.readOnly=false, task.meta.required=false}]
  TaskAttribute[id=depends_on,values=[],options=null,metaData={task.meta.label=Depends on:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=blocks,values=[],options=null,metaData={task.meta.label=Blocks:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
- TaskAttribute[id=keywords,values=[],options={Keyword1=Keyword1, Keyword2=Keyword2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
+ TaskAttribute[id=keywords,values=[],options={Keyword1=1, Keyword2=2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=cf_bugid,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=integer, task.meta.required=false, task.meta.label=bug id custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_datetime,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=dateTime, task.meta.required=false, task.meta.label=date time custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_dropdown,values=[],options={---=---, one=one, three=three, two=two},metaData={task.meta.readOnly=false, task.meta.type=singleSelect, task.meta.required=true, task.meta.label=drop down custom field, task.meta.attributeKind=task.common.kind.default}]
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData.txt b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData.txt
index 889e2e6..1821128 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData.txt
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData.txt
@@ -19,7 +19,7 @@
  TaskAttribute[id=task.common.operation,values=[],options=null,metaData={task.meta.label=Operation, task.meta.type=operation, task.meta.readOnly=false, task.meta.required=false}]
  TaskAttribute[id=depends_on,values=[],options=null,metaData={task.meta.label=Depends on:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=blocks,values=[],options=null,metaData={task.meta.label=Blocks:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
- TaskAttribute[id=keywords,values=[],options={Keyword1=Keyword1, Keyword2=Keyword2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
+ TaskAttribute[id=keywords,values=[],options={Keyword1=1, Keyword2=2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=cf_bugid,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=integer, task.meta.required=false, task.meta.label=bug id custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_datetime,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=dateTime, task.meta.required=false, task.meta.label=date time custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_dropdown,values=[],options={---=---, one=one, three=three, two=two},metaData={task.meta.readOnly=false, task.meta.type=singleSelect, task.meta.required=true, task.meta.label=drop down custom field, task.meta.attributeKind=task.common.kind.default}]
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData1.txt b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData1.txt
index a396ee7..f13175e 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData1.txt
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData1.txt
@@ -19,7 +19,7 @@
  TaskAttribute[id=task.common.operation,values=[],options=null,metaData={task.meta.label=Operation, task.meta.type=operation, task.meta.readOnly=false, task.meta.required=false}]
  TaskAttribute[id=depends_on,values=[],options=null,metaData={task.meta.label=Depends on:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=blocks,values=[],options=null,metaData={task.meta.label=Blocks:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
- TaskAttribute[id=keywords,values=[],options={Keyword1=Keyword1, Keyword2=Keyword2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
+ TaskAttribute[id=keywords,values=[],options={Keyword1=1, Keyword2=2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=cf_bugid,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=integer, task.meta.required=false, task.meta.label=bug id custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_datetime,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=dateTime, task.meta.required=false, task.meta.label=date time custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_dropdown,values=[],options={---=---, one=one, three=three, two=two},metaData={task.meta.readOnly=false, task.meta.type=singleSelect, task.meta.required=true, task.meta.label=drop down custom field, task.meta.attributeKind=task.common.kind.default}]
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData2.txt b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData2.txt
index e3ab9ec..e82df73 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData2.txt
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core.tests/testdata/Version2/taskData2.txt
@@ -19,7 +19,7 @@
  TaskAttribute[id=task.common.operation,values=[],options=null,metaData={task.meta.label=Operation, task.meta.type=operation, task.meta.readOnly=false, task.meta.required=false}]
  TaskAttribute[id=depends_on,values=[],options=null,metaData={task.meta.label=Depends on:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=blocks,values=[],options=null,metaData={task.meta.label=Blocks:, task.meta.type=taskDepenedency, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
- TaskAttribute[id=keywords,values=[],options={Keyword1=Keyword1, Keyword2=Keyword2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
+ TaskAttribute[id=keywords,values=[],options={Keyword1=1, Keyword2=2},metaData={task.meta.label=Keywords, task.meta.type=bugzilla.editor.keyword, task.meta.readOnly=false, task.meta.attributeKind=task.common.kind.default, task.meta.required=false}]
  TaskAttribute[id=cf_bugid,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=integer, task.meta.required=false, task.meta.label=bug id custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_datetime,values=[],options=null,metaData={task.meta.readOnly=false, task.meta.type=dateTime, task.meta.required=false, task.meta.label=date time custom field, task.meta.attributeKind=task.common.kind.default}]
  TaskAttribute[id=cf_dropdown,values=[],options={---=---, one=one, three=three, two=two},metaData={task.meta.readOnly=false, task.meta.type=singleSelect, task.meta.required=true, task.meta.label=drop down custom field, task.meta.attributeKind=task.common.kind.default}]
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core/src/org/eclipse/mylyn/internal/bugzilla/rest/core/BugzillaRestClient.java b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core/src/org/eclipse/mylyn/internal/bugzilla/rest/core/BugzillaRestClient.java
index a3fc737..4e11faa 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core/src/org/eclipse/mylyn/internal/bugzilla/rest/core/BugzillaRestClient.java
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core/src/org/eclipse/mylyn/internal/bugzilla/rest/core/BugzillaRestClient.java
@@ -200,6 +200,7 @@
 					config.updateProductOptions(taskData);
 					config.addValidOperations(taskData);
 					config.updateFlags(taskData);
+					config.updateKeyword(taskData);
 					collector.accept(taskData);
 				}
 			} catch (RuntimeException e) {
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core/src/org/eclipse/mylyn/internal/bugzilla/rest/core/BugzillaRestConfiguration.java b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core/src/org/eclipse/mylyn/internal/bugzilla/rest/core/BugzillaRestConfiguration.java
index 8515643..35a8bd5 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core/src/org/eclipse/mylyn/internal/bugzilla/rest/core/BugzillaRestConfiguration.java
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.core/src/org/eclipse/mylyn/internal/bugzilla/rest/core/BugzillaRestConfiguration.java
@@ -191,6 +191,7 @@
 				}
 			}
 		}
+		updateKeyword(data);
 	}
 
 	private String getValueFromParameter(String attributeId) {
@@ -409,9 +410,8 @@
 							.createAttribute(TaskAttribute.PREFIX_OPERATION + statusTransition.name);
 					TaskOperation.applyTo(attribute, statusTransition.name, statusTransition.name);
 					if (statusTransition.name != null && statusTransition.name.equals("RESOLVED")) {
-						TaskAttribute attrResolvedInput = attribute.getTaskData()
-								.getRoot()
-								.createAttribute("resolutionInput");
+						TaskAttribute attrResolvedInput = attribute.getTaskData().getRoot().createAttribute(
+								"resolutionInput");
 						attrResolvedInput.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
 						attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, "resolutionInput");
 						Field resolution = getFieldWithName("resolution");
@@ -426,13 +426,11 @@
 		}
 		attribute = bugReport.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + "duplicate");
 		TaskOperation.applyTo(attribute, "duplicate", "Mark as Duplicate");
-		TaskAttribute attrResolvedInput = attribute.getTaskData()
-				.getRoot()
-				.getAttribute(BugzillaRestTaskSchema.getDefault().DUPE_OF.getKey());
+		TaskAttribute attrResolvedInput = attribute.getTaskData().getRoot().getAttribute(
+				BugzillaRestTaskSchema.getDefault().DUPE_OF.getKey());
 		if (attrResolvedInput == null) {
-			attrResolvedInput = attribute.getTaskData()
-					.getRoot()
-					.createAttribute(BugzillaRestTaskSchema.getDefault().DUPE_OF.getKey());
+			attrResolvedInput = attribute.getTaskData().getRoot().createAttribute(
+					BugzillaRestTaskSchema.getDefault().DUPE_OF.getKey());
 		}
 		attrResolvedInput.getMetaData().setType(TaskAttribute.TYPE_TASK_DEPENDENCY);
 		attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, attrResolvedInput.getId());
@@ -551,4 +549,14 @@
 		addMissingFlagsInternal(attribute, flagTypes.getAttachment(), existingAttachmentFlags);
 	}
 
+	public void updateKeyword(TaskData taskData) {
+		TaskAttribute attributeKeywords = taskData.getRoot().getMappedAttribute(SCHEMA.KEYWORDS.getKey());
+		Field keywords = getFieldWithName("keywords");
+		FieldValues[] keywordList = keywords.getValues();
+		attributeKeywords.clearOptions();
+		for (FieldValues fieldValues : keywordList) {
+			attributeKeywords.putOption(fieldValues.getName(), fieldValues.getDescription());
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/BugzillaKeywordAttributeEditor.java b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/BugzillaKeywordAttributeEditor.java
index fb0d37d..7938dc0 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/BugzillaKeywordAttributeEditor.java
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/BugzillaKeywordAttributeEditor.java
@@ -13,11 +13,16 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.eclipse.mylyn.commons.workbench.InPlaceCheckBoxTreeDialog;
+import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
 import org.eclipse.mylyn.internal.tasks.ui.editors.CheckboxMultiSelectAttributeEditor;
 import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
 import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.osgi.util.NLS;
 
 /**
  * @author Rob Elves
@@ -26,7 +31,6 @@
 
 	public BugzillaKeywordAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
 		super(manager, taskAttribute);
-
 	}
 
 	@Override
@@ -44,4 +48,27 @@
 		attributeChanged();
 	}
 
+	@Override
+	protected List<String> getValueList() {
+		return getValues();
+	}
+
+	@Override
+	public List<String> getValuesLabels() {
+		List<String> tmp = getTaskAttribute().getValues();
+		List<String> newStrs = new ArrayList<>(tmp);
+		return newStrs;
+	}
+
+	@Override
+	protected InPlaceCheckBoxTreeDialog createInPlaceCheckBoxTreeDialog(List<String> values) {
+		Map<String, String> validDescriptions = getTaskAttribute().getOptions();
+		LinkedHashMap<String, String> validValues = new LinkedHashMap<String, String>(validDescriptions.size());
+		for (String value : validDescriptions.keySet()) {
+			validValues.put(value, value);
+		}
+		return new InPlaceCheckBoxTreeDialog(WorkbenchUtil.getShell(), getButton(), values, validValues,
+				NLS.bind(Messages.BugzillaKeywordAttributeEditor_Select_X, getLabel()), validDescriptions);
+	}
+
 }
\ No newline at end of file
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/Messages.java b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/Messages.java
index 893caaf..7c390a7 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/Messages.java
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/Messages.java
@@ -16,6 +16,8 @@
 public class Messages extends NLS {
 	private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.bugzilla.rest.ui.messages"; //$NON-NLS-1$
 
+	public static String BugzillaKeywordAttributeEditor_Select_X;
+
 	public static String BugzillaRestRepositorySettingsPage_api_key;
 
 	public static String BugzillaRestRepositorySettingsPage_Please_create_or_copy_the_API_Key_from;
diff --git a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/messages.properties b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/messages.properties
index 96ec9ad..fc03f92 100644
--- a/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/messages.properties
+++ b/connector-bugzilla-rest/org.eclipse.mylyn.bugzilla.rest.ui/src/org/eclipse/mylyn/internal/bugzilla/rest/ui/messages.properties
@@ -1,3 +1,4 @@
+BugzillaKeywordAttributeEditor_Select_X=Select {0}
 BugzillaRestRepositorySettingsPage_api_key=API Key
 BugzillaRestRepositorySettingsPage_Please_create_or_copy_the_API_Key_from=Please create or copy the API Key from\n {0}
 BugzillaRestRepositorySettingsPage_RestRepositorySetting=Bugzilla REST Repository Settings
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CheckboxMultiSelectAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CheckboxMultiSelectAttributeEditor.java
index eadfe71..b4f2e50 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CheckboxMultiSelectAttributeEditor.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CheckboxMultiSelectAttributeEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2011 Tasktop Technologies and others. 
+ * Copyright (c) 2011 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
@@ -35,6 +35,7 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.layout.GridLayout;
@@ -97,51 +98,68 @@
 
 			button = toolkit.createButton(composite, "", SWT.ARROW | SWT.DOWN); //$NON-NLS-1$
 			GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.TOP).applyTo(button);
-			button.addSelectionListener(new SelectionAdapter() {
-				@Override
-				public void widgetSelected(SelectionEvent e) {
-					final List<String> values = getValues();
-					Map<String, String> validValues = getAttributeMapper().getOptions(getTaskAttribute());
-
-					final InPlaceCheckBoxTreeDialog selectionDialog = new InPlaceCheckBoxTreeDialog(
-							WorkbenchUtil.getShell(), button, values, validValues, NLS.bind(
-									Messages.CheckboxMultiSelectAttributeEditor_Select_X, getLabel()));
-
-					selectionDialog.addEventListener(new IInPlaceDialogListener() {
-
-						public void buttonPressed(InPlaceDialogEvent event) {
-							suppressRefresh = true;
-							try {
-								if (event.getReturnCode() == Window.OK) {
-									Set<String> newValues = selectionDialog.getSelectedValues();
-									if (!new HashSet<String>(values).equals(newValues)) {
-										setValues(new ArrayList<String>(newValues));
-										refresh();
-									}
-								} else if (event.getReturnCode() == AbstractInPlaceDialog.ID_CLEAR) {
-									Set<String> newValues = new HashSet<String>();
-									if (!new HashSet<String>(values).equals(newValues)) {
-										setValues(new ArrayList<String>(newValues));
-										refresh();
-									}
-								}
-							} finally {
-								suppressRefresh = false;
-							}
-						}
-					});
-					selectionDialog.open();
-				}
-			});
+			button.addSelectionListener(createSelectionListener());
 			toolkit.adapt(valueText, false, false);
 			refresh();
 			setControl(composite);
 		}
 	}
 
+	protected SelectionListener createSelectionListener() {
+		return new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				final List<String> values = getValueList();
+				final InPlaceCheckBoxTreeDialog selectionDialog = createInPlaceCheckBoxTreeDialog(values);
+				addEventListener(values, selectionDialog);
+				selectionDialog.open();
+			}
+
+		};
+	}
+
+	protected List<String> getValueList() {
+		final List<String> values = getValues();
+		return values;
+	}
+
+	protected InPlaceCheckBoxTreeDialog createInPlaceCheckBoxTreeDialog(List<String> values) {
+		Map<String, String> validValues = getAttributeMapper().getOptions(getTaskAttribute());
+		final InPlaceCheckBoxTreeDialog selectionDialog = new InPlaceCheckBoxTreeDialog(WorkbenchUtil.getShell(),
+				button, values, validValues,
+				NLS.bind(Messages.CheckboxMultiSelectAttributeEditor_Select_X, getLabel()));
+		return selectionDialog;
+	}
+
+	private void addEventListener(final List<String> values, final InPlaceCheckBoxTreeDialog selectionDialog) {
+		selectionDialog.addEventListener(new IInPlaceDialogListener() {
+
+			public void buttonPressed(InPlaceDialogEvent event) {
+				suppressRefresh = true;
+				try {
+					if (event.getReturnCode() == Window.OK) {
+						Set<String> newValues = selectionDialog.getSelectedValues();
+						if (!new HashSet<String>(values).equals(newValues)) {
+							setValues(new ArrayList<String>(newValues));
+							refresh();
+						}
+					} else if (event.getReturnCode() == AbstractInPlaceDialog.ID_CLEAR) {
+						Set<String> newValues = new HashSet<String>();
+						if (!new HashSet<String>(values).equals(newValues)) {
+							setValues(new ArrayList<String>(newValues));
+							refresh();
+						}
+					}
+				} finally {
+					suppressRefresh = false;
+				}
+			}
+		});
+	}
+
 	/**
 	 * Update scroll bars of the enclosing form.
-	 * 
+	 *
 	 * @see Section#reflow()
 	 */
 	private void reflow() {
@@ -212,7 +230,8 @@
 			}
 		}
 		valueText.setText(valueString.toString());
-		if (valueText != null && parent != null && parent.getParent() != null && parent.getParent().getParent() != null) {
+		if (valueText != null && parent != null && parent.getParent() != null
+				&& parent.getParent().getParent() != null) {
 			Point size = valueText.getSize();
 			// subtract 1 from size for border
 			Point newSize = valueText.computeSize(size.x - 1, SWT.DEFAULT);
@@ -226,4 +245,9 @@
 	public boolean shouldAutoRefresh() {
 		return !suppressRefresh;
 	}
+
+	protected Button getButton() {
+		return button;
+	}
+
 }