Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Becker2015-07-22 13:04:39 -0400
committerFrank Becker2015-07-30 15:14:01 -0400
commitc3774ec86109fd47097b974ee51f2c0d2538305a (patch)
tree4fb0048151758a951b7cf0ea3ce65cb52e2d19cd
parent283d63e151a54f3834beb6d28e9f61d40890b6ca (diff)
downloadorg.eclipse.mylyn.tasks-c3774ec86109fd47097b974ee51f2c0d2538305a.tar.gz
org.eclipse.mylyn.tasks-c3774ec86109fd47097b974ee51f2c0d2538305a.tar.xz
org.eclipse.mylyn.tasks-c3774ec86109fd47097b974ee51f2c0d2538305a.zip
414360: create schema for QueryPage (provisional version)
Change-Id: I01e4b2f02e3670167aa743c55f5287b07db49442 Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=414360
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/AbstractQueryPageSchema.java406
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/SimpleURLQueryPageSchema.java27
2 files changed, 433 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/AbstractQueryPageSchema.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/AbstractQueryPageSchema.java
new file mode 100644
index 000000000..c548dd647
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/AbstractQueryPageSchema.java
@@ -0,0 +1,406 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Frank Becker 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:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.provisional.tasks.ui.wizards;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.internal.provisional.tasks.ui.wizards.AbstractQueryPageSchema.Flag;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+public class AbstractQueryPageSchema {
+
+ public static class Field {
+
+ private EnumSet<Flag> flags;
+
+ private final String key;
+
+ private final String label;
+
+ private final String type;
+
+ private final String indexKey;
+
+ private final String dependsOn;
+
+ private final Integer layoutPriority;
+
+ protected Field(String key, String label, String type) {
+ this(key, label, type, null, (Flag[]) null);
+ }
+
+ protected Field(String key, String label, String type, Flag... flags) {
+ this(key, label, type, null, flags);
+ }
+
+ /**
+ * @param key
+ * the task attribute key, which may be a common task attribute key defined in defined in
+ * {@link TaskAttribute}
+ * @param label
+ * the user-visible label that is used by the user to identify this field
+ * @param type
+ * the type of the field, should be one of the constants defined in TaskAttribute (
+ * <code>TaskAttribute.TYPE_*</code>)
+ * @param indexKey
+ * the index key, or null if this should not be indexed
+ * @param flags
+ * the flags, or null
+ */
+ public Field(String key, String label, String type, String indexKey, Flag... flags) {
+ this(key, label, type, indexKey, null, null, flags);
+ }
+
+ /**
+ * @param key
+ * the task attribute key, which may be a common task attribute key defined in defined in
+ * {@link TaskAttribute}
+ * @param label
+ * the user-visible label that is used by the user to identify this field
+ * @param type
+ * the type of the field, should be one of the constants defined in TaskAttribute (
+ * <code>TaskAttribute.TYPE_*</code>)
+ * @param indexKey
+ * the index key, or null if this should not be indexed
+ * @param layoutPriority
+ * the layout priority, or null if this should not be used
+ * @param flags
+ * the flags, or null
+ */
+ public Field(String key, String label, String type, String indexKey, Integer layoutPriority, String dependsOn,
+ Flag... flags) {
+ Assert.isNotNull(key);
+ Assert.isNotNull(label);
+ Assert.isNotNull(type);
+ this.key = key;
+ this.label = label;
+ this.type = type;
+ this.indexKey = indexKey;
+ this.layoutPriority = layoutPriority;
+ this.dependsOn = dependsOn;
+ if (flags == null || flags.length == 0) {
+ this.flags = EnumSet.noneOf(Flag.class);
+ } else {
+ this.flags = EnumSet.copyOf(Arrays.asList(flags));
+ }
+ }
+
+ public TaskAttribute createAttribute(TaskAttribute parent) {
+ TaskAttribute attribute = parent.createMappedAttribute(getKey());
+ // meta data
+ TaskAttributeMetaData metaData = attribute.getMetaData();
+ metaData.setLabel(getLabel());
+ metaData.setType(getType());
+ metaData.setReadOnly(isReadOnly());
+ metaData.setKind(getKind());
+ metaData.setRequired(isRequired());
+ if (getLayoutPriority() != null) {
+ metaData.putValue("LayoutPriority", getLayoutPriority().toString());
+ }
+ if (getDependsOn() != null) {
+ metaData.setDependsOn(getDependsOn());
+ }
+ // options
+ Map<String, String> options = getDefaultOptions();
+ if (options != null) {
+ for (Entry<String, String> option : options.entrySet()) {
+ attribute.putOption(option.getKey(), option.getValue());
+ }
+ }
+ return attribute;
+ }
+
+ public Map<String, String> getDefaultOptions() {
+ return Collections.emptyMap();
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ /**
+ * the key to use when indexing this field
+ *
+ * @return the index key, or null if this should not be indexed
+ */
+ public String getIndexKey() {
+ return indexKey;
+ }
+
+ public String getKind() {
+ if (flags.contains(Flag.ATTRIBUTE)) {
+ return TaskAttribute.KIND_DEFAULT;
+ } else if (flags.contains(Flag.PEOPLE)) {
+ return TaskAttribute.KIND_PEOPLE;
+ } else if (flags.contains(Flag.OPERATION)) {
+ return TaskAttribute.KIND_OPERATION;
+ } else if (flags.contains(Flag.DESCRIPTION)) {
+ return TaskAttribute.KIND_DESCRIPTION;
+ }
+ return null;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public boolean isReadOnly() {
+ return flags.contains(Flag.READ_ONLY);
+ }
+
+ @Override
+ public String toString() {
+ return getLabel();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((indexKey == null) ? 0 : indexKey.hashCode());
+ result = prime * result + ((key == null) ? 0 : key.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ Field other = (Field) obj;
+ if (indexKey == null) {
+ if (other.indexKey != null) {
+ return false;
+ }
+ } else if (!indexKey.equals(other.indexKey)) {
+ return false;
+ }
+ if (key == null) {
+ if (other.key != null) {
+ return false;
+ }
+ } else if (!key.equals(other.key)) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean isRequired() {
+ return flags.contains(Flag.REQUIRED);
+ }
+
+ Integer getLayoutPriority() {
+ return layoutPriority;
+ }
+
+ public boolean isQueryRequired() {
+ return flags.contains(Flag.QUERY_REQUIRED);
+ }
+
+ public String getDependsOn() {
+ return dependsOn;
+ }
+
+ }
+
+ public enum Flag {
+ ATTRIBUTE, OPERATION, PEOPLE, READ_ONLY, /**
+ * A flag used to indicate that the field is related to a
+ * description.
+ *
+ * @see TaskAttribute#KIND_DESCRIPTION
+ */
+ DESCRIPTION, /**
+ * A flag used to indicate that the field is required.
+ *
+ * @see TaskAttribute#META_REQUIRED
+ */
+ REQUIRED,
+
+ /**
+ * A flag used to indicate that the field is required in the Query Page.
+ *
+ * @see TaskAttribute#META_QUERY_REQUIRED
+ */
+ QUERY_REQUIRED
+
+ };
+
+ protected class FieldFactory {
+
+ private EnumSet<Flag> flags;
+
+ private String key;
+
+ private String label;
+
+ private String type;
+
+ private Integer layoutPriority;
+
+ private String dependsOn;
+
+ public FieldFactory(Field source) {
+ this.flags = EnumSet.copyOf(source.flags);
+ this.key = source.key;
+ this.label = source.label;
+ this.type = source.type;
+ this.dependsOn = source.dependsOn;
+ }
+
+ public FieldFactory(org.eclipse.mylyn.tasks.core.data.AbstractTaskSchema.Field source) {
+ this.flags = EnumSet.noneOf(Flag.class);
+ this.key = source.getKey();
+ this.label = source.getLabel();
+ this.type = source.getType();
+ this.dependsOn = source.getDependsOn();
+ }
+
+ public FieldFactory addFlags(Flag... flags) {
+ this.flags.addAll(Arrays.asList(flags));
+ return this;
+ }
+
+ public Field create() {
+ return createField(key, label, type, null, layoutPriority, dependsOn,
+ (!flags.isEmpty()) ? flags.toArray(new Flag[0]) : null);
+ }
+
+ public FieldFactory flags(Flag... flags) {
+ this.flags = EnumSet.copyOf(Arrays.asList(flags));
+ return this;
+ }
+
+ public FieldFactory key(String key) {
+ this.key = key;
+ return this;
+ }
+
+ public FieldFactory label(String label) {
+ this.label = label;
+ return this;
+ }
+
+ public FieldFactory removeFlags(Flag... flags) {
+ this.flags.removeAll(Arrays.asList(flags));
+ return this;
+ }
+
+ public FieldFactory type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ public FieldFactory layoutPriority(Integer layoutPriority) {
+ this.layoutPriority = layoutPriority;
+ return this;
+ }
+
+ public FieldFactory dependsOn(String dependsOn) {
+ this.dependsOn = dependsOn;
+ return this;
+ }
+
+ }
+
+ private final Map<String, Field> fieldByKey = new LinkedHashMap<String, Field>();
+
+ /**
+ * Returns the specified field for the given key.
+ */
+ public Field getFieldByKey(String taskKey) {
+ return fieldByKey.get(taskKey);
+ }
+
+ /**
+ * Creates no-value attributes with default options for the supplied task for each schema field.
+ */
+ public void initialize(TaskData taskData) {
+ for (Field field : fieldByKey.values()) {
+ field.createAttribute(taskData.getRoot());
+ }
+ }
+
+ /**
+ * Provides an iterator for all fields within the schema. Subsequent modifications to the returned collection are
+ * not reflected to schema.
+ *
+ * @return all fields within the schema
+ */
+ public Collection<Field> getFields() {
+ return new ArrayList<Field>(fieldByKey.values());
+ }
+
+ protected Field createField(String key, String label, String type) {
+ return createField(key, label, type, null, (Flag[]) null);
+ }
+
+ protected Field createField(String key, String label, String type, Flag... flags) {
+ return createField(key, label, type, null, flags);
+ }
+
+ /**
+ * @see Field#Field(String, String, String, String, Flag...)
+ */
+ protected Field createField(String key, String label, String type, String indexKey, Flag... flags) {
+ return createField(key, label, type, indexKey, null, flags);
+ }
+
+ /**
+ * @see Field#Field(String, String, String, String, Integer, Flag...)
+ */
+ protected Field createField(String key, String label, String type, String indexKey, Integer layoutPriority,
+ Flag... flags) {
+ Field field = new Field(key, label, type, indexKey, layoutPriority, null, flags);
+ fieldByKey.put(key, field);
+ return field;
+ }
+
+ /**
+ * @see Field#Field(String, String, String, String, Integer, Flag...)
+ */
+ protected Field createField(String key, String label, String type, String indexKey, Integer layoutPriority,
+ String dependsOn, Flag... flags) {
+ Field field = new Field(key, label, type, indexKey, layoutPriority, dependsOn, flags);
+ fieldByKey.put(key, field);
+ return field;
+ }
+
+ protected FieldFactory inheritFrom(Field source) {
+ return new FieldFactory(source);
+ }
+
+ protected FieldFactory copyFrom(org.eclipse.mylyn.tasks.core.data.AbstractTaskSchema.Field source) {
+ return new FieldFactory(source);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/SimpleURLQueryPageSchema.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/SimpleURLQueryPageSchema.java
new file mode 100644
index 000000000..e41eeaec9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/SimpleURLQueryPageSchema.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Frank Becker 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:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.provisional.tasks.ui.wizards;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+public class SimpleURLQueryPageSchema extends AbstractQueryPageSchema {
+ private static final SimpleURLQueryPageSchema instance = new SimpleURLQueryPageSchema();
+
+ public SimpleURLQueryPageSchema() {
+ }
+
+ public static SimpleURLQueryPageSchema getInstance() {
+ return instance;
+ }
+
+ public final Field wholeUrl = createField("wholeQueryURL", "URL:", TaskAttribute.TYPE_URL);
+}

Back to the top