blob: 0724bcb5b42a7a6f944387e41708b8351f22d9aa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.editors;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.internal.tasks.core.TaskList;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskAttachment;
import org.eclipse.mylyn.tasks.core.ITaskComment;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskRelation;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.osgi.util.NLS;
/**
* A node for the tree in {@link TaskEditorOutlinePage}.
*
* @author Steffen Pingel
*/
public class TaskEditorOutlineNode {
public static final String LABEL_COMMENTS = Messages.TaskEditorOutlineNode_Comments;
public static final String LABEL_DESCRIPTION = Messages.TaskEditorOutlineNode_Description;
public static final String LABEL_NEW_COMMENT = Messages.TaskEditorOutlineNode_New_Comment;
public static final String LABEL_ATTACHMENTS = Messages.TaskEditorOutlineNode_Attachments;
public static final String LABEL_ATTRIBUTES = Messages.TaskEditorOutlineNode_Attributes;
public static final String LABEL_RELATED_TASKS = Messages.TaskEditorOutlineNode_Related_Tasks;
private static TaskEditorOutlineNode createNode(TaskData taskData, String attributeId, String label) {
TaskAttribute taskAttribute = taskData.getRoot().getMappedAttribute(attributeId);
if (taskAttribute != null) {
if (label == null) {
label = taskAttribute.getValue();
}
return new TaskEditorOutlineNode(label, taskAttribute);
}
return null;
}
private static TaskEditorOutlineNode createNode(TaskAttribute taskAttribute) {
String type = taskAttribute.getMetaData().getType();
if (TaskAttribute.TYPE_COMMENT.equals(type)) {
ITaskComment taskComment = TasksUiPlugin.getRepositoryModel().createTaskComment(taskAttribute);
if (taskComment != null) {
taskAttribute.getTaskData().getAttributeMapper().updateTaskComment(taskComment, taskAttribute);
StringBuilder sb = new StringBuilder();
sb.append(taskComment.getNumber());
sb.append(": "); //$NON-NLS-1$
IRepositoryPerson author = taskComment.getAuthor();
if (author != null) {
sb.append(author.toString());
}
Date creationDate = taskComment.getCreationDate();
if (creationDate != null) {
sb.append(" ("); //$NON-NLS-1$
sb.append(EditorUtil.formatDateTime(creationDate));
sb.append(")"); //$NON-NLS-1$
}
TaskEditorOutlineNode node = new TaskEditorOutlineNode(sb.toString(), taskAttribute);
node.setTaskComment(taskComment);
return node;
}
} else if (TaskAttribute.TYPE_ATTACHMENT.equals(type)) {
ITaskAttachment taskAttachment = TasksUiPlugin.getRepositoryModel().createTaskAttachment(taskAttribute);
if (taskAttachment != null) {
taskAttribute.getTaskData().getAttributeMapper().updateTaskAttachment(taskAttachment, taskAttribute);
StringBuilder sb = new StringBuilder();
sb.append(taskAttribute.getTaskData().getAttributeMapper().getValueLabel(taskAttribute));
sb.append(": "); //$NON-NLS-1$
if (AttachmentUtil.isContext(taskAttachment)) {
sb.append(Messages.AttachmentTableLabelProvider_Task_Context);
} else if (taskAttachment.isPatch()) {
sb.append(Messages.AttachmentTableLabelProvider_Patch);
} else {
sb.append(taskAttachment.getFileName());
}
TaskEditorOutlineNode node = new TaskEditorOutlineNode(sb.toString(), taskAttribute);
node.setTaskAttachment(taskAttachment);
return node;
}
} else {
String label = taskAttribute.getTaskData().getAttributeMapper().getLabel(taskAttribute);
if (label.endsWith(":")) { //$NON-NLS-1$
label = label.substring(0, label.length() - 1);
}
return new TaskEditorOutlineNode(label, taskAttribute);
}
return null;
}
public static TaskEditorOutlineNode parse(TaskData taskData, boolean includeAttributes) {
TaskEditorOutlineNode rootNode = createNode(taskData, TaskAttribute.SUMMARY, null);
if (rootNode == null) {
rootNode = new TaskEditorOutlineNode(Messages.TaskEditorOutlineNode_Task_ + taskData.getTaskId());
}
if (includeAttributes) {
final TaskList taskList = TasksUiPlugin.getTaskList();
TaskEditorOutlineNode relatedTasksNode = new TaskEditorOutlineNode(LABEL_RELATED_TASKS);
rootNode.addChild(relatedTasksNode);
AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(taskData.getConnectorKind());
Collection<TaskRelation> relations = connector.getTaskRelations(taskData);
TaskRepositoryManager manager = TasksUiPlugin.getRepositoryManager();
TaskRepository taskRepository = manager.getRepository(taskData.getConnectorKind(),
taskData.getRepositoryUrl());
if (relations != null) {
for (TaskRelation taskRelation : relations) {
ITask task = taskList.getTask(taskData.getRepositoryUrl(), taskRelation.getTaskId());
String label;
if (task != null) {
if (task.getTaskKey() != null) {
label = NLS.bind(Messages.TaskEditorOutlineNode_TaskRelation_Label,
new Object[] { task.getTaskKey(), task.getSummary() });
} else {
label = task.getSummary();
}
} else {
label = NLS.bind(Messages.TaskEditorOutlineNode_TaskRelation_Label,
new Object[] { taskRelation.getTaskId(), Messages.TaskEditorOutlineNode_unknown_Label });
}
TaskEditorOutlineNode childNode = new TaskEditorOutlineNode(label);
childNode.setTaskRelation(taskRelation);
childNode.setTaskRepository(taskRepository);
relatedTasksNode.addChild(childNode);
}
}
TaskEditorOutlineNode attributesNode = new TaskEditorOutlineNode(LABEL_ATTRIBUTES);
rootNode.addChild(attributesNode);
Map<String, TaskAttribute> attributes = taskData.getRoot().getAttributes();
for (TaskAttribute attribute : attributes.values()) {
if (TaskAttribute.KIND_DEFAULT.equals(attribute.getMetaData().getKind())) {
TaskEditorOutlineNode node = createNode(attribute);
if (node != null) {
attributesNode.addChild(node);
}
}
}
}
addNode(rootNode, taskData, TaskAttribute.DESCRIPTION, LABEL_DESCRIPTION);
List<TaskAttribute> attachments = taskData.getAttributeMapper().getAttributesByType(taskData,
TaskAttribute.TYPE_ATTACHMENT);
if (attachments.size() > 0) {
TaskEditorOutlineNode attachmentNode = new TaskEditorOutlineNode(LABEL_ATTACHMENTS);
rootNode.addChild(attachmentNode);
for (TaskAttribute attachmentAttribute : attachments) {
TaskEditorOutlineNode node = createNode(attachmentAttribute);
if (node != null) {
attachmentNode.addChild(node);
}
}
}
List<TaskAttribute> comments = taskData.getAttributeMapper().getAttributesByType(taskData,
TaskAttribute.TYPE_COMMENT);
if (comments.size() > 0) {
TaskEditorOutlineNode commentsNode = new TaskEditorOutlineNode(LABEL_COMMENTS);
rootNode.addChild(commentsNode);
for (TaskAttribute commentAttribute : comments) {
TaskEditorOutlineNode node = createNode(commentAttribute);
if (node != null) {
commentsNode.addChild(node);
}
}
}
addNode(rootNode, taskData, TaskAttribute.COMMENT_NEW, LABEL_NEW_COMMENT);
return rootNode;
}
private static TaskEditorOutlineNode addNode(TaskEditorOutlineNode parentNode, TaskData taskData,
String attributeId, String label) {
TaskEditorOutlineNode node = createNode(taskData, attributeId, label);
if (node != null) {
parentNode.addChild(node);
}
return node;
}
private List<TaskEditorOutlineNode> children;
private final String label;
/** The parent of this node or null if it is the bug report */
private TaskEditorOutlineNode parent;
private final TaskAttribute taskAttribute;
private ITaskComment taskComment;
private ITaskAttachment taskAttachment;
private TaskRelation taskRelation;
private TaskRepository taskRepository;
public TaskEditorOutlineNode(String label) {
this(label, null);
}
public TaskEditorOutlineNode(String label, TaskAttribute taskAttribute) {
this.label = label;
this.taskAttribute = taskAttribute;
}
public void addChild(TaskEditorOutlineNode node) {
Assert.isNotNull(node);
if (children == null) {
children = new ArrayList<TaskEditorOutlineNode>();
}
node.parent = this;
children.add(node);
}
public TaskEditorOutlineNode getChild(String label) {
if (children != null) {
for (TaskEditorOutlineNode child : children) {
if (child.getLabel().equals(label)) {
return child;
}
}
}
return null;
}
/**
* @return <code>true</code> if the given object is another node representing the same piece of data in the editor.
*/
@Override
public boolean equals(Object o) {
if (o instanceof TaskEditorOutlineNode) {
TaskEditorOutlineNode node = (TaskEditorOutlineNode) o;
return getLabel().equals(node.getLabel());
}
return false;
}
public TaskEditorOutlineNode[] getChildren() {
return (children == null)
? new TaskEditorOutlineNode[0]
: children.toArray(new TaskEditorOutlineNode[children.size()]);
}
public ITaskComment getTaskComment() {
return taskComment;
}
public void setTaskComment(ITaskComment taskComment) {
this.taskComment = taskComment;
}
public TaskAttribute getData() {
return taskAttribute;
}
public String getLabel() {
return label;
}
public TaskEditorOutlineNode getParent() {
return parent;
}
@Override
public int hashCode() {
return getLabel().hashCode();
}
@Override
public String toString() {
return getLabel();
}
public ITaskAttachment getTaskAttachment() {
return taskAttachment;
}
public void setTaskAttachment(ITaskAttachment taskAttachment) {
this.taskAttachment = taskAttachment;
}
public TaskRelation getTaskRelation() {
return taskRelation;
}
public void setTaskRelation(TaskRelation taskRelation) {
this.taskRelation = taskRelation;
}
public TaskRepository getTaskRepository() {
return taskRepository;
}
public void setTaskRepository(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
}