PageRenderTime 34ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/rabbit.ui.mylyn/src/rabbit/ui/internal/treebuilders/TaskDataTreeBuilder.java

https://code.google.com/
Java | 128 lines | 85 code | 18 blank | 25 comment | 11 complexity | 8e031f26e4fbd8e7e33aacc418063ea6 MD5 | raw file
  1. /*
  2. * Copyright 2010 The Rabbit Eclipse Plug-in Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package rabbit.ui.internal.treebuilders;
  17. import rabbit.data.TasksContract;
  18. import rabbit.data.access.model.ITaskData;
  19. import rabbit.data.common.TaskId;
  20. import rabbit.ui.IProvider;
  21. import rabbit.ui.internal.pages.Category;
  22. import rabbit.ui.internal.util.ICategory;
  23. import rabbit.ui.internal.util.ICategoryProvider;
  24. import rabbit.ui.internal.util.UnrecognizedTask;
  25. import rabbit.ui.internal.viewers.ITreePathBuilder;
  26. import static com.google.common.base.Preconditions.checkNotNull;
  27. import static com.google.common.collect.Lists.newArrayList;
  28. import com.google.common.base.Objects;
  29. import org.eclipse.core.resources.IContainer;
  30. import org.eclipse.core.resources.IFile;
  31. import org.eclipse.jface.viewers.TreePath;
  32. import org.eclipse.mylyn.tasks.core.IRepositoryModel;
  33. import org.eclipse.mylyn.tasks.core.ITask;
  34. import org.eclipse.mylyn.tasks.ui.TasksUi;
  35. import org.joda.time.Duration;
  36. import static java.util.Collections.emptyList;
  37. import java.util.Collection;
  38. import java.util.List;
  39. /**
  40. * A {@link TaskDataTreeBuilder} takes input as {@link ITaskDataProvider} and
  41. * builds tree leaves based on the order of the categories provided by the
  42. * {@link ICategoryProvider}, the last segment of every path will be the
  43. * {@link Duration} data node of each {@link ITaskData} provided by the
  44. * provider.
  45. */
  46. public final class TaskDataTreeBuilder implements ITreePathBuilder {
  47. /**
  48. * Provides {@link ITaskData}.
  49. */
  50. public static interface ITaskDataProvider extends IProvider<ITaskData> {}
  51. private final ICategoryProvider provider;
  52. public TaskDataTreeBuilder(ICategoryProvider provider) {
  53. this.provider = checkNotNull(provider);
  54. }
  55. @Override
  56. public List<TreePath> build(Object input) {
  57. if (!(input instanceof ITaskDataProvider)) {
  58. return emptyList();
  59. }
  60. Collection<ITaskData> dataCol = ((ITaskDataProvider) input).get();
  61. if (dataCol == null) {
  62. return emptyList();
  63. }
  64. List<TreePath> result = newArrayList();
  65. IRepositoryModel repository = TasksUi.getRepositoryModel();
  66. for (ITaskData data : dataCol) {
  67. IFile file = data.get(ITaskData.FILE);
  68. List<Object> segments = newArrayList();
  69. for (ICategory c : provider.getSelected()) {
  70. if (!(c instanceof Category)) {
  71. continue;
  72. }
  73. switch ((Category) c) {
  74. case WORKSPACE:
  75. segments.add(data.get(ITaskData.WORKSPACE));
  76. break;
  77. case DATE:
  78. segments.add(data.get(ITaskData.DATE));
  79. break;
  80. case TASK:
  81. TaskId id = data.get(ITaskData.TASK_ID);
  82. ITask task = repository.getTask(id.getHandleIdentifier());
  83. if (task == null
  84. || !Objects.equal(id.getCreationDate(), TasksContract.getCreationDate(task))) {
  85. task = new UnrecognizedTask(id);
  86. }
  87. segments.add(task);
  88. break;
  89. case PROJECT:
  90. segments.add(file.getProject());
  91. break;
  92. case FOLDER:
  93. IContainer parent = file.getParent();
  94. if (!file.getProject().equals(parent)) {
  95. segments.add(parent);
  96. }
  97. break;
  98. case FILE:
  99. segments.add(file);
  100. break;
  101. default:
  102. break;
  103. }
  104. }
  105. segments.add(data.get(ITaskData.DURATION));
  106. result.add(new TreePath(segments.toArray()));
  107. }
  108. return result;
  109. }
  110. }