blob: a3ada9523252882657d160b68953238c24ea83d5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 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.mylyn.internal.tasks.ui.editors;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
import org.eclipse.mylyn.tasks.core.ITaskComment;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;
/**
* 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;
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 {
String label = taskAttribute.getTaskData().getAttributeMapper().getValueLabel(taskAttribute);
return new TaskEditorOutlineNode(label, taskAttribute);
}
return null;
}
public static TaskEditorOutlineNode parse(TaskData taskData) {
TaskEditorOutlineNode rootNode = createNode(taskData, TaskAttribute.SUMMARY, null);
if (rootNode == null) {
rootNode = new TaskEditorOutlineNode(Messages.TaskEditorOutlineNode_Task_ + taskData.getTaskId());
}
addNode(rootNode, taskData, TaskAttribute.DESCRIPTION, LABEL_DESCRIPTION);
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;
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);
}
/**
* @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();
}
}