Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Johnston2017-11-29 18:36:56 +0000
committerJeff Johnston2017-11-29 21:56:06 +0000
commit2b0a45b6c15ede61a69c5b829419831517c56002 (patch)
tree822cf3188eeebf6590128d6b72a17c29b3e8e4aa
parent1435e3954884bf60bfa844e634f6f421dd7086f9 (diff)
downloadorg.eclipse.linuxtools-2b0a45b6c15ede61a69c5b829419831517c56002.tar.gz
org.eclipse.linuxtools-2b0a45b6c15ede61a69c5b829419831517c56002.tar.xz
org.eclipse.linuxtools-2b0a45b6c15ede61a69c5b829419831517c56002.zip
OSIO Mylyn improvements
- fix regression for New Task caused by looking for space id in OSIORestClient postTaskData which doesn't exist for a new task - fix UI look and feel for the Repository query page by adding our own RepositoryQueryAttributeEditor class - add token fetch support to OSIORestRequest which will try to get the token provider extension before attempting to use the user-provided token - remove Activity section from the Task editor - fix ordering of work item types by using a TreeMap in Space class - put repository under Tasks category instead of Bugs which doesn't apply here - add org.eclipse.core.resources as dependency to core plug-in Change-Id: I7155e4c152607894c52db0e9d210b3cc8e600390 Reviewed-on: https://git.eclipse.org/r/112588 Tested-by: Hudson CI Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/META-INF/MANIFEST.MF3
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestClient.java12
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestCreateTaskSchema.java2
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestMessages.properties2
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestRequest.java77
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/response/data/Space.java5
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestRepositorySettingsPage.java3
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestTaskEditorPage.java1
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQueryAttributeEditor.java174
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQueryAttributeEditorFactory.java35
-rw-r--r--mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQuerySchemaPage.java16
11 files changed, 267 insertions, 63 deletions
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/META-INF/MANIFEST.MF b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/META-INF/MANIFEST.MF
index d354c78c94..7b5d8fb277 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/META-INF/MANIFEST.MF
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/META-INF/MANIFEST.MF
@@ -15,7 +15,8 @@ Require-Bundle: org.eclipse.core.runtime,
com.google.guava;bundle-version="21.0.0",
org.apache.httpcomponents.httpclient;bundle-version="4.5.2",
org.apache.httpcomponents.httpcore;bundle-version="4.4.6",
- com.google.gson;bundle-version="2.7.0"
+ com.google.gson;bundle-version="2.7.0",
+ org.eclipse.core.resources
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.jdt.annotation
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestClient.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestClient.java
index 674920e95f..a9935e8b11 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestClient.java
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestClient.java
@@ -304,17 +304,11 @@ public class OSIORestClient {
public RepositoryResponse postTaskData(TaskData taskData, Set<TaskAttribute> oldAttributes,
TaskRepository repository, IOperationMonitor monitor) throws OSIORestException {
- TaskAttribute spaceIdAttribute = taskData.getRoot().getAttribute(OSIORestTaskSchema.getDefault().SPACE_ID.getKey());
- String spaceId = spaceIdAttribute.getValue();
Space space = null;
if (taskData.isNew()) {
+ TaskAttribute spaceAttribute = taskData.getRoot().getAttribute(OSIORestTaskSchema.getDefault().SPACE.getKey());
Map<String, Space> spaces = getCachedSpaces(new NullOperationMonitor());
- for (Space s : spaces.values()) {
- if (s.getId().equals(spaceId)) {
- space = s;
- break;
- }
- }
+ space = spaces.get(spaceAttribute.getValue());
String id = null;
try {
id = new OSIORestPostNewTask(client, taskData, space, connector, repository).run(monitor);
@@ -323,6 +317,8 @@ public class OSIORestClient {
}
return new RepositoryResponse(ResponseKind.TASK_CREATED, id);
} else {
+ TaskAttribute spaceIdAttribute = taskData.getRoot().getAttribute(OSIORestTaskSchema.getDefault().SPACE_ID.getKey());
+ String spaceId = spaceIdAttribute.getValue();
OSIORestConfiguration config;
try {
config = connector.getRepositoryConfiguration(repository);
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestCreateTaskSchema.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestCreateTaskSchema.java
index fb04049197..0af33fffe4 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestCreateTaskSchema.java
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestCreateTaskSchema.java
@@ -36,4 +36,4 @@ public class OSIORestCreateTaskSchema extends AbstractTaskSchema {
public final Field TITLE = inheritFrom(parent.SUMMARY).addFlags(Flag.REQUIRED).create();
-}
+}
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestMessages.properties b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestMessages.properties
index c230c306e7..52ea493180 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestMessages.properties
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestMessages.properties
@@ -36,6 +36,8 @@ SchemaLinks.label=Links\n(Select to remove)
SchemaRemoveLinks.label=Remove Link
SchemaNumber.label=#
+TokenProviderFetchError.msg=Error fetching OpenShift.io token provider
+
UnknownAssignee.msg=Assignee: {0} not valid for space
UnknownLabel.msg=Label: {0} not valid for space
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestRequest.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestRequest.java
index 219784f825..90f92a1fec 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestRequest.java
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/OSIORestRequest.java
@@ -18,14 +18,20 @@ import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.util.function.Function;
-import org.apache.commons.httpclient.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpRequestBase;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
import org.eclipse.linuxtools.internal.mylyn.osio.rest.core.response.data.ErrorResponse;
+import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.core.operations.IOperationMonitor;
-import org.eclipse.mylyn.commons.repositories.core.RepositoryLocation;
import org.eclipse.mylyn.commons.repositories.core.auth.AuthenticationException;
import org.eclipse.mylyn.commons.repositories.core.auth.AuthenticationRequest;
import org.eclipse.mylyn.commons.repositories.core.auth.AuthenticationType;
@@ -38,7 +44,6 @@ import org.eclipse.osgi.util.NLS;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
-import com.google.gson.stream.JsonWriter;
public abstract class OSIORestRequest<T> extends CommonHttpOperation<T> {
protected static final String ACCEPT = "Accept"; //$NON-NLS-1$
@@ -102,47 +107,35 @@ public abstract class OSIORestRequest<T> extends CommonHttpOperation<T> {
String urlSuffix = getUrlSuffix();
return baseUrl() + urlSuffix;
}
-
+
+ private Function<IResource, String> getProvider() {
+ IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.jboss.tools.openshift.io.core.tokenProvider"); //$NON-NLS-1$
+ for(IConfigurationElement element : elements) {
+ try {
+ return (Function<IResource, String>) element.createExecutableExtension("class"); //$NON-NLS-1$
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, OSIORestCore.ID_PLUGIN,
+ OSIORestMessages.getString("TokenProviderFetchError.msg"), //$NON-NLS-1$
+ e));
+ }
+ }
+ return null;
+ }
+
private String getToken() {
- String auth_token = getClient().getLocation().getProperty(IOSIORestConstants.REPOSITORY_AUTH_TOKEN);
+ String auth_token = null;
+ Function<IResource, String> provider = getProvider();
+ if (provider != null) {
+ auth_token = (String) provider.apply(null);
+ }
+ if (auth_token != null) {
+ return auth_token;
+ }
+ auth_token = getClient().getLocation().getProperty(IOSIORestConstants.REPOSITORY_AUTH_TOKEN);
if (auth_token != null) {
return auth_token;
}
- // TODO: remove below when authorization UI is working
- return "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIwb"
- + "EwwdlhzOVlSVnFaTW93eXc4dU5MUl95cjBpRmFvemR"
- + "RazlyenEyT1ZVIn0.eyJqdGkiOiI5YTlmMTk3Yi1iY"
- + "2I4LTRmY2QtYjM2OC04ZDg5MDRjYmRiYWIiLCJleHA"
- + "iOjE1MDgzODgwNjgsIm5iZiI6MCwiaWF0IjoxNTA1N"
- + "zk2MDY4LCJpc3MiOiJodHRwczovL3Nzby5vcGVuc2h"
- + "pZnQuaW8vYXV0aC9yZWFsbXMvZmFicmljOCIsImF1Z"
- + "CI6ImZhYnJpYzgtb25saW5lLXBsYXRmb3JtIiwic3V"
- + "iIjoiZTkwMjRmODQtODQ1My00YTgwLWFjZWMtOThhM"
- + "jc2ODZlYzI0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjo"
- + "iZmFicmljOC1vbmxpbmUtcGxhdGZvcm0iLCJhdXRoX"
- + "3RpbWUiOjE1MDU0OTA4MjUsInNlc3Npb25fc3RhdGU"
- + "iOiI5MTFlZWE0Ny01NjcyLTRkNGItYWZiMi1mOTFjM"
- + "TQ2NGE1MTciLCJhY3IiOiIwIiwiYWxsb3dlZC1vcml"
- + "naW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvb"
- + "GVzIjpbInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXN"
- + "vdXJjZV9hY2Nlc3MiOnsiYnJva2VyIjp7InJvbGVzI"
- + "jpbInJlYWQtdG9rZW4iXX0sImFjY291bnQiOnsicm9"
- + "sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtY"
- + "WNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0"
- + "sImFwcHJvdmVkIjp0cnVlLCJuYW1lIjoiSmVmZiBKb"
- + "2huc3RvbiIsImNvbXBhbnkiOiJSZWQgSGF0IiwicHJ"
- + "lZmVycmVkX3VzZXJuYW1lIjoiampvaG5zdG4iLCJna"
- + "XZlbl9uYW1lIjoiSmVmZiIsImZhbWlseV9uYW1lIjo"
- + "iSm9obnN0b24iLCJlbWFpbCI6Impqb2huc3RuQHJlZ"
- + "GhhdC5jb20ifQ.VMe9GfHxG51BkH5YPXyfcLsZgIi9"
- + "-ui0gXzco3t7AKLhIsHKUYiInurwxYJVT2ToHffMwN"
- + "rrfUbm0eGAkLbR_A_04vvYzi7keBMep0XjuZW6lM3v"
- + "xb-93NxITQcHCNMFvLxvm1wrN5ui29X5x4NIcIcU0K"
- + "ye2qsDKn_d-UxQXDgxavqrc_a5d0RYb-WImPej2ZDe"
- + "po8IU16Ev-wPWLLN91KnqLBSyVCB2MxFkkdNOE284n"
- + "I5p2yzCX_QbVMKdbuY0S8Hyu8Bs-A1LMBAB2xuecSu"
- + "u4Glykw9KNNOV8KqNSAoDwm_KIw7SG2kcv_d8Z4oap"
- + "HlrNg4u9_2rsPzEKotnw";
+ return ""; //$NON-NLS-1$
}
private String getBearer() {
@@ -168,7 +161,7 @@ public abstract class OSIORestRequest<T> extends CommonHttpOperation<T> {
throws IOException, OSIORestException {
try (BufferedInputStream is = new BufferedInputStream(response.getResponseEntityAsStream())) {
InputStreamReader in = new InputStreamReader(is);
- throwExeptionIfRestError(is, in);
+ throwExceptionIfRestError(is, in);
return parseFromJson(in);
}
}
@@ -235,7 +228,7 @@ public abstract class OSIORestRequest<T> extends CommonHttpOperation<T> {
return new Gson().fromJson(in, a.getType());
}
- protected void throwExeptionIfRestError(InputStream is, InputStreamReader in)
+ protected void throwExceptionIfRestError(InputStream is, InputStreamReader in)
throws IOException, OSIORestException {
try {
is.mark(18);
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/response/data/Space.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/response/data/Space.java
index eb7ee24e0d..91d7781884 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/response/data/Space.java
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.core/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/core/response/data/Space.java
@@ -12,6 +12,7 @@ package org.eclipse.linuxtools.internal.mylyn.osio.rest.core.response.data;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.TreeMap;
import java.util.stream.Collectors;
public class Space implements IdNamed {
@@ -93,8 +94,8 @@ public class Space implements IdNamed {
public void setWorkItemTypes(Map<String, WorkItemTypeData> workItemTypes) {
this.workItemTypes = workItemTypes;
- this.workItemTypesIdNamed = workItemTypes.entrySet().stream()
- .collect(Collectors.toMap(Map.Entry::getKey, e -> (IdNamed)e.getValue()));
+ this.workItemTypesIdNamed = new TreeMap<>(workItemTypes.entrySet().stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, e -> (IdNamed)e.getValue())));
}
public Map<String, WorkItemTypeData> getWorkItemTypes() {
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestRepositorySettingsPage.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestRepositorySettingsPage.java
index 49c34ab16a..2e3284f3d4 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestRepositorySettingsPage.java
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestRepositorySettingsPage.java
@@ -75,7 +75,7 @@ public class OSIORestRepositorySettingsPage extends AbstractRepositorySettingsPa
authTokenLabel = new Label(authTokenContainer, SWT.NONE);
authTokenLabel.setText(Messages.OSIORestRepositorySettingsPage_auth_token);
- authToken = new StyledText(authTokenContainer, SWT.BORDER | SWT.WRAP);
+ authToken = new StyledText(authTokenContainer, SWT.BORDER | SWT.WRAP | SWT.PASSWORD);
authToken.setEnabled(true);
GridDataFactory.fillDefaults()
.grab(true, true)
@@ -117,6 +117,7 @@ public class OSIORestRepositorySettingsPage extends AbstractRepositorySettingsPa
public void applyTo(TaskRepository repository) {
repository.setProperty(IOSIORestConstants.REPOSITORY_AUTH_TOKEN, authToken.getText());
repository.setProperty(IOSIORestConstants.REPOSITORY_AUTH_ID, userId.getText());
+ repository.setCategory(TaskRepository.CATEGORY_TASKS);
super.applyTo(repository);
}
}
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestTaskEditorPage.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestTaskEditorPage.java
index ed367bc72a..80cd191649 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestTaskEditorPage.java
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/OSIORestTaskEditorPage.java
@@ -89,6 +89,7 @@ public class OSIORestTaskEditorPage extends AbstractTaskEditorPage {
ArrayList<TaskEditorPartDescriptor> descriptorsToRemove = new ArrayList<TaskEditorPartDescriptor>(2);
for (TaskEditorPartDescriptor taskEditorPartDescriptor : descriptors) {
if (taskEditorPartDescriptor.getId().equals(ID_PART_PEOPLE) ||
+ taskEditorPartDescriptor.getId().equals("org.eclipse.mylyn.tasks.activity.ui.viewer.ActivityPart") || //$NON-NLS-1$
taskEditorPartDescriptor.getId().equals(ID_PART_ATTRIBUTES)) {
descriptorsToRemove.add(taskEditorPartDescriptor);
continue;
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQueryAttributeEditor.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQueryAttributeEditor.java
new file mode 100644
index 0000000000..5e44ae2e06
--- /dev/null
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQueryAttributeEditor.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.mylyn.osio.rest.ui.provisional;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RepositoryQueryAttributeEditor extends AbstractAttributeEditor {
+
+ private String[] allValues;
+
+ private Text text;
+
+ private List list;
+
+ protected boolean suppressRefresh;
+
+ public RepositoryQueryAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ if (isReadOnly()) {
+ setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.SINGLE));
+ } else {
+ setLayoutHint(new LayoutHint(RowSpan.MULTIPLE, ColumnSpan.SINGLE));
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ if (isReadOnly()) {
+ text = new Text(parent, SWT.FLAT | SWT.READ_ONLY | SWT.WRAP);
+ text.setFont(JFaceResources.getDefaultFont());
+ toolkit.adapt(text, false, false);
+ text.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ select(getValues(), getValuesLabels());
+ text.setToolTipText(getDescription());
+ setControl(text);
+ } else {
+ list = new List(parent, SWT.FLAT | SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ toolkit.adapt(list, false, false);
+ list.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ list.setFont(JFaceResources.getDefaultFont());
+ list.setToolTipText(getDescription());
+
+ updateListWithOptions();
+
+ select(getValues(), getValuesLabels());
+
+ if (allValues != null) {
+ list.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Assert.isNotNull(allValues);
+ int[] indices = list.getSelectionIndices();
+ String[] selectedValues = new String[indices.length];
+ for (int i = 0; i < indices.length; i++) {
+ int index = indices[i];
+ Assert.isLegal(index >= 0 && index <= allValues.length - 1);
+ selectedValues[i] = allValues[index];
+ }
+ try {
+ suppressRefresh = true;
+ setValues(selectedValues);
+ } finally {
+ suppressRefresh = false;
+ }
+ }
+ });
+ list.showSelection();
+ }
+
+ setControl(list);
+ }
+ }
+
+ private void updateListWithOptions() {
+ if (list != null && !list.isDisposed()) {
+ Map<String, String> labelByValue = getAttributeMapper().getOptions(getTaskAttribute());
+ if (labelByValue != null) {
+ int topIndex = list.getTopIndex();
+ list.removeAll();
+ allValues = labelByValue.keySet().toArray(new String[0]);
+ for (String value : allValues) {
+ list.add(labelByValue.get(value));
+ }
+ if (topIndex > 0) {
+ list.setTopIndex(topIndex);
+ }
+ }
+ }
+ }
+
+ public String[] getValues() {
+ return getAttributeMapper().getValues(getTaskAttribute()).toArray(new String[0]);
+ }
+
+ public String[] getValuesLabels() {
+ return getAttributeMapper().getValueLabels(getTaskAttribute()).toArray(new String[0]);
+ }
+
+ private void select(String[] values, String[] labels) {
+ if (text != null && !text.isDisposed()) {
+ StringBuilder valueString = new StringBuilder();
+ if (labels != null) {
+ for (int i = 0; i < labels.length; i++) {
+ valueString.append(labels[i]);
+ if (i != labels.length - 1) {
+ valueString.append(", "); //$NON-NLS-1$
+ }
+ }
+ }
+ text.setText(valueString.toString());
+
+ } else if (list != null && !list.isDisposed()) {
+ if (values != null) {
+ list.deselectAll();
+ Set<String> selectedValues = new HashSet<String>(Arrays.asList(values));
+ for (int i = 0; i < allValues.length; i++) {
+ if (selectedValues.contains(allValues[i])) {
+ list.select(i);
+ }
+ }
+ } else {
+ list.setItems(labels);
+ list.setSelection(labels);
+ }
+ }
+ }
+
+ public void setValues(String[] values) {
+ getAttributeMapper().setValues(getTaskAttribute(), Arrays.asList(values));
+ attributeChanged();
+ }
+
+ @Override
+ public void refresh() {
+ updateListWithOptions();
+ select(getValues(), getValuesLabels());
+ }
+
+ @Override
+ public boolean shouldAutoRefresh() {
+ return !suppressRefresh;
+ }
+}
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQueryAttributeEditorFactory.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQueryAttributeEditorFactory.java
new file mode 100644
index 0000000000..c561aa1a0d
--- /dev/null
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQueryAttributeEditorFactory.java
@@ -0,0 +1,35 @@
+package org.eclipse.linuxtools.internal.mylyn.osio.rest.ui.provisional;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorFactory;
+import org.eclipse.ui.services.IServiceLocator;
+
+public class RepositoryQueryAttributeEditorFactory extends AttributeEditorFactory {
+
+ private final TaskDataModel taskModel;
+
+ public RepositoryQueryAttributeEditorFactory(@NonNull TaskDataModel model, @NonNull TaskRepository taskRepository) {
+ super(model, taskRepository);
+ this.taskModel = model;
+ }
+
+ public RepositoryQueryAttributeEditorFactory(@NonNull TaskDataModel model, @NonNull TaskRepository taskRepository,
+ @Nullable IServiceLocator serviceLocator) {
+ super(model, taskRepository, serviceLocator);
+ this.taskModel = model;
+ }
+
+ @NonNull
+ public AbstractAttributeEditor createEditor(@NonNull String type, @NonNull TaskAttribute taskAttribute) {
+ if (TaskAttribute.TYPE_MULTI_SELECT.equals(type)) {
+ return new RepositoryQueryAttributeEditor(taskModel, taskAttribute);
+ }
+ return super.createEditor(type, taskAttribute);
+ }
+
+}
diff --git a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQuerySchemaPage.java b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQuerySchemaPage.java
index ef2c012fd5..4ede5405dc 100644
--- a/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQuerySchemaPage.java
+++ b/mylyn/org.eclipse.linuxtools.mylyn.osio.rest.ui/src/org/eclipse/linuxtools/internal/mylyn/osio/rest/ui/provisional/RepositoryQuerySchemaPage.java
@@ -50,15 +50,15 @@ import org.eclipse.ui.forms.widgets.FormToolkit;
@SuppressWarnings("nls")
public class RepositoryQuerySchemaPage extends AbstractRepositoryQueryPage2 {
- private static final int LABEL_WIDTH = 110;
+ private static final int LABEL_WIDTH = 100;
- private static final int COLUMN_WIDTH = 140;
+ private static final int COLUMN_WIDTH = 160;
private static final int COLUMN_GAP = 20;
private static final int MULTI_COLUMN_WIDTH = COLUMN_WIDTH + 5 + COLUMN_GAP + LABEL_WIDTH + 5 + COLUMN_WIDTH;
- private static final int MULTI_ROW_HEIGHT = 55;
+ private static final int MULTI_ROW_HEIGHT = 80;
protected final AbstractQueryPageSchema schema;
@@ -103,7 +103,7 @@ public class RepositoryQuerySchemaPage extends AbstractRepositoryQueryPage2 {
layout.marginHeight = 0;
layout.marginWidth = 10;
layout.horizontalSpacing = 0;
- layout.verticalSpacing = 0;
+ layout.verticalSpacing = 10;
scrolledBodyComposite.setLayout(layout);
Composite attributesComposite = new Composite(scrolledBodyComposite, SWT.NONE);
@@ -113,11 +113,11 @@ public class RepositoryQuerySchemaPage extends AbstractRepositoryQueryPage2 {
.span(2, 1)
.applyTo(attributesComposite);
layout = new GridLayout(6, false);
- layout.marginHeight = 0;
- layout.marginWidth = 0;
+ layout.marginHeight = 20;
+ layout.marginWidth = 10;
attributesComposite.setLayout(layout);
GridData g = new GridData(GridData.FILL, GridData.FILL, true, true);
- g.widthHint = 400;
+ g.widthHint = 600;
attributesComposite.setLayoutData(g);
attributesComposite.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
FormToolkit toolkit = new FormToolkit(parent.getDisplay());
@@ -127,7 +127,7 @@ public class RepositoryQuerySchemaPage extends AbstractRepositoryQueryPage2 {
ITaskDataWorkingCopy workingCopy = TasksUi.getTaskDataManager().createWorkingCopy(nTask, data);
final TaskDataModel model = new TaskDataModel(repository, nTask, workingCopy);
- factory = new AttributeEditorFactory(model, repository);
+ factory = new RepositoryQueryAttributeEditorFactory(model, repository);
model.addModelListener(new TaskDataModelListener() {
@Override

Back to the top