Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 87124 Details for
Bug 210801
[api] provide access to parent queries from AbststractTask via AbstractTaskContainer.getParentContainers()
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
multi parented tasks patch v1
multipleParents2.patch (text/plain), 42.00 KB, created by
Robert Elves
on 2008-01-16 21:37:07 EST
(
hide
)
Description:
multi parented tasks patch v1
Filename:
MIME Type:
Creator:
Robert Elves
Created:
2008-01-16 21:37:07 EST
Size:
42.00 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.mylyn.tasks.core >Index: src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java,v >retrieving revision 1.63 >diff -u -r1.63 AbstractRepositoryConnector.java >--- src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java 13 Jan 2008 11:23:24 -0000 1.63 >+++ src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java 17 Jan 2008 02:34:05 -0000 >@@ -334,6 +334,9 @@ > this.userManaged = userManaged; > } > >+ /** >+ * If false, user is unable to manipulate (i.e. rename/delete), no preferences are available. >+ */ > public boolean isUserManaged() { > return userManaged; > } >Index: src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java,v >retrieving revision 1.31 >diff -u -r1.31 AbstractTaskContainer.java >--- src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java 13 Dec 2007 00:28:51 -0000 1.31 >+++ src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java 17 Jan 2008 02:34:05 -0000 >@@ -53,6 +53,7 @@ > } > > /** >+ * Remove all children held by this container > * Does not delete tasks from TaskList > */ > public void clear() { >@@ -179,4 +180,13 @@ > public int compareTo(AbstractTaskContainer taskListElement) { > return getHandleIdentifier().compareTo(taskListElement.getHandleIdentifier()); > } >+ >+ /** >+ * If false, user is unable to manipulate (i.e. rename/delete), no preferences are available. >+ * @since 2.3 >+ */ >+ public boolean isUserManaged() { >+ return true; >+ } >+ > } >Index: src/org/eclipse/mylyn/tasks/core/AbstractTaskCategory.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskCategory.java,v >retrieving revision 1.7 >diff -u -r1.7 AbstractTaskCategory.java >--- src/org/eclipse/mylyn/tasks/core/AbstractTaskCategory.java 13 Dec 2007 00:28:51 -0000 1.7 >+++ src/org/eclipse/mylyn/tasks/core/AbstractTaskCategory.java 17 Jan 2008 02:34:05 -0000 >@@ -9,7 +9,8 @@ > package org.eclipse.mylyn.tasks.core; > > /** >- * A container that stores tasks from any repository. >+ * A container that stores tasks from any repository. A task can only have a single >+ * AbstractTaskCategory parent (only be in one category at a time). > * > * @author Mik Kersten > * @since 2.0 >@@ -23,18 +24,9 @@ > /** > * Override to return true for categories that the user creates, deletes, and renames. Return false for categories > * that are managed >- * >- * @API-3.0: Move up into AbstractTaskContainer >+ * @deprecated >+ * @API-3.0: Use AbstractTaskContainer.isUserManaged > */ > public abstract boolean isUserDefined(); > >- @Override >- public boolean equals(Object object) { >- return super.equals(object); >- } >- >- @Override >- public int hashCode() { >- return super.hashCode(); >- } > } >Index: src/org/eclipse/mylyn/tasks/core/AbstractTask.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTask.java,v >retrieving revision 1.18 >diff -u -r1.18 AbstractTask.java >--- src/org/eclipse/mylyn/tasks/core/AbstractTask.java 15 Nov 2007 22:04:38 -0000 1.18 >+++ src/org/eclipse/mylyn/tasks/core/AbstractTask.java 17 Jan 2008 02:34:05 -0000 >@@ -340,19 +340,21 @@ > } > > /** >- * Limitation: can currently only add one container. >+ * @API 3.0: Rename to internalAddParentContainer > */ > public void addParentContainer(AbstractTaskContainer container) { >- containers.clear(); > containers.add(container); > } > >+ /** >+ * @API 3.0: Rename to internalremoveParentContainer >+ */ > public void removeParentContainer(AbstractTaskContainer container) { > containers.remove(container); > } > > public Set<AbstractTaskContainer> getParentContainers() { >- return containers; >+ return new HashSet<AbstractTaskContainer>(containers); > } > > @Override >@@ -454,14 +456,14 @@ > } > > /** >- * deprecated >+ * @API 3.0: deprecate? > */ > public String getCategoryHandle() { > return categoryHandle; > } > > /** >- * deprecated >+ * @API 3.0: deprecate? > */ > public void setCategoryHandle(String categoryHandle) { > this.categoryHandle = categoryHandle; >Index: src/org/eclipse/mylyn/tasks/core/TaskList.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskList.java,v >retrieving revision 1.75 >diff -u -r1.75 TaskList.java >--- src/org/eclipse/mylyn/tasks/core/TaskList.java 15 Jan 2008 23:49:35 -0000 1.75 >+++ src/org/eclipse/mylyn/tasks/core/TaskList.java 17 Jan 2008 02:34:05 -0000 >@@ -70,8 +70,7 @@ > * @since 2.2 > */ > private void addOrphan(AbstractTask task, Set<TaskContainerDelta> delta, int depth) { >- if (/*task.getLastReadTimeStamp() == null ||*/!getQueriesForHandle(task.getHandleIdentifier()).isEmpty() >- || getCategoryForHandle(task.getHandleIdentifier()) != null) { >+ if (!task.getParentContainers().isEmpty()) { > // Current policy is not to archive/orphan if the task exists in some other container > return; > } >@@ -260,16 +259,18 @@ > // Ensure the parent task exists in the task list > tasks.put(parentContainer.getHandleIdentifier(), (AbstractTask) parentContainer); > addOrphan((AbstractTask) parentContainer, null); >- // TODO: will need to update map of children to parents here > } > >+ if(parentContainer instanceof AbstractTaskCategory) { >+ removeFromCategory(TaskCategory.getParentTaskCategory(newTask), newTask); >+ } > removeOrphan(newTask, null); >- >+ newTask.addParentContainer(parentContainer); > parentContainer.internalAddChild(newTask); > >- if (!(parentContainer instanceof AbstractTask) && !(parentContainer instanceof AbstractRepositoryQuery)) { >- newTask.addParentContainer(parentContainer); >- } >+// if (!(parentContainer instanceof AbstractTask) && !(parentContainer instanceof AbstractRepositoryQuery)) { >+// newTask.addParentContainer(parentContainer); >+// } > } else { > // TODO: if the task has a parent task which isn't orphaned than the current task isn't orphaned > // check map of children to parents first >@@ -287,15 +288,11 @@ > Set<TaskContainerDelta> delta = new HashSet<TaskContainerDelta>(); > delta.add(new TaskContainerDelta(container, TaskContainerDelta.Kind.CHANGED)); > >- Set<AbstractTaskContainer> currentContainers = task.getParentContainers(); >- for (AbstractTaskContainer taskContainer : currentContainers) { >- if (taskContainer instanceof AbstractTaskCategory) { >- if (!(taskContainer instanceof OrphanedTasksContainer)) { >- taskContainer.internalRemoveChild(task); >- } >- task.removeParentContainer(taskContainer); >- delta.add(new TaskContainerDelta(taskContainer, TaskContainerDelta.Kind.CHANGED)); >- } >+ AbstractTaskCategory category = TaskCategory.getParentTaskCategory(task); >+ if(category != null) { >+ task.removeParentContainer(category); >+ category.internalRemoveChild(task); >+ delta.add(new TaskContainerDelta(category, TaskContainerDelta.Kind.CHANGED)); > } > if (container != null) { > addTask(task, container); >@@ -314,7 +311,7 @@ > } > > /** >- * @deprecated >+ * @deprecated use moveTask > */ > public void moveToContainer(AbstractTask task, AbstractTaskCategory container) { > if (!tasks.containsKey(task.getHandleIdentifier())) { >@@ -360,7 +357,6 @@ > tasks.remove(task.getHandleIdentifier()); > task.setRepositoryUrl(newRepositoryUrl); > tasks.put(task.getHandleIdentifier(), task); >- > String taskUrl = task.getUrl(); > if (taskUrl != null && taskUrl.startsWith(oldRepositoryUrl)) { > task.setUrl(newRepositoryUrl + taskUrl.substring(oldRepositoryUrl.length())); >@@ -406,11 +402,27 @@ > } > > public void removeFromCategory(TaskCategory category, AbstractTask task) { >+ removeFromCategory((AbstractTaskCategory)category, task); >+// Set<TaskContainerDelta> delta = new HashSet<TaskContainerDelta>(); >+// category.internalRemoveChild(task); >+// task.removeParentContainer(category); >+// addOrphan(task, delta); >+// delta.add(new TaskContainerDelta(category, TaskContainerDelta.Kind.ADDED)); >+// for (ITaskListChangeListener listener : changeListeners) { >+// listener.containersChanged(delta); >+// } >+ } >+ >+ /** >+ * @Since 2.3 >+ */ >+ public void removeFromCategory(AbstractTaskCategory category, AbstractTask task) { >+ if(category == null || task == null) return; > Set<TaskContainerDelta> delta = new HashSet<TaskContainerDelta>(); > category.internalRemoveChild(task); > task.removeParentContainer(category); > addOrphan(task, delta); >- delta.add(new TaskContainerDelta(category, TaskContainerDelta.Kind.ADDED)); >+ delta.add(new TaskContainerDelta(category, TaskContainerDelta.Kind.CHANGED)); > for (ITaskListChangeListener listener : changeListeners) { > listener.containersChanged(delta); > } >@@ -427,6 +439,7 @@ > delta.add(new TaskContainerDelta(task, TaskContainerDelta.Kind.CHANGED)); > > query.internalRemoveChild(task); >+ task.removeParentContainer(query); > addOrphan(task, delta); > > // for (ITaskListChangeListener listener : changeListeners) { >@@ -494,20 +507,30 @@ > /** > * TODO: refactor around querying containers for their tasks > * >- * Task is removed from all containers: root, archive, category, and tasks catchall (Currently no support for >- * deletion of subtasks) >+ * Task is removed from all containers: root, archive, category, and orphan bin >+ * >+ * Currently subtasks are not deleted but rather are rather potentially orphaned > */ > public void deleteTask(AbstractTask task) { >- defaultCategory.internalRemoveChild(task); >- >+ //defaultCategory.internalRemoveChild(task); >+ Set<TaskContainerDelta> delta = new HashSet<TaskContainerDelta>(); >+ // Remove task from all parent containers > for (AbstractTaskContainer container : task.getParentContainers()) { > container.internalRemoveChild(task); > task.removeParentContainer(container); > } >- tasks.remove(task.getHandleIdentifier()); >- >- Set<TaskContainerDelta> delta = new HashSet<TaskContainerDelta>(); >+ >+ // Remove this task as a parent for all subtasks >+ // moving to orphanage as necessary >+ for (AbstractTask child : task.getChildren()) { >+ child.removeParentContainer(task); >+ if(child.getParentContainers().isEmpty()) { >+ addOrphan(child, delta); >+ } >+ } >+ task.clear(); > removeOrphan(task, delta); >+ tasks.remove(task.getHandleIdentifier()); > delta.add(new TaskContainerDelta(task, TaskContainerDelta.Kind.REMOVED)); > for (ITaskListChangeListener listener : changeListeners) { > listener.containersChanged(delta); >@@ -519,6 +542,7 @@ > > categories.remove(category.getHandleIdentifier()); > for (AbstractTask task : category.getChildren()) { >+ task.removeParentContainer(category); > addOrphan(task, delta); > } > >@@ -651,6 +675,10 @@ > return Collections.unmodifiableSet(new HashSet<AbstractTaskCategory>(categories.values())); > } > >+ /** >+ * @deprecated >+ * @API 3.0: remove >+ */ > public List<AbstractTaskCategory> getUserCategories() { > List<AbstractTaskCategory> included = new ArrayList<AbstractTaskCategory>(); > for (AbstractTaskCategory category : categories.values()) { >@@ -690,6 +718,9 @@ > return containers; > } > >+ /** >+ * API 3.0: remove >+ */ > public AbstractRepositoryQuery getQueryForHandle(String handle) { > if (handle == null) { > return null; >@@ -702,18 +733,6 @@ > return null; > } > >- private AbstractTaskCategory getCategoryForHandle(String handle) { >- if (handle == null) { >- return null; >- } >- for (AbstractTaskCategory category : categories.values()) { >- if (!(category instanceof OrphanedTasksContainer) && category.contains(handle)) { >- return category; >- } >- } >- return null; >- } >- > public boolean isEmpty() { > boolean isEmpty = getCategories().size() == 1 && getCategories().contains(defaultCategory) /*&& archiveContainer.getChildren().isEmpty()*/; > return getAllTasks().size() == 0 && isEmpty && getQueries().size() == 0; >@@ -794,23 +813,40 @@ > } > > /** >+ * @API 3.0: remove > * @deprecated > */ > public TaskArchive getArchiveContainer() { > return archiveContainer; > } > >- /** if handle == null or no queries found an empty set is returned * */ >+ /** >+ * @ >+ */ >+ public Set<AbstractRepositoryQuery> getParentQueries(AbstractTask task) { >+ Set<AbstractRepositoryQuery> parentQueries = new HashSet<AbstractRepositoryQuery>(); >+ for (AbstractTaskContainer container : task.getParentContainers()) { >+ if(container instanceof AbstractRepositoryQuery) { >+ parentQueries.add((AbstractRepositoryQuery)container); >+ } >+ } >+ return parentQueries; >+ } >+ >+ /** >+ * if handle == null or no queries found an empty set is returned >+ * @API 3.0: remove >+ */ > public Set<AbstractRepositoryQuery> getQueriesForHandle(String handle) { > if (handle == null) { > return Collections.emptySet(); > } > Set<AbstractRepositoryQuery> queriesForHandle = new HashSet<AbstractRepositoryQuery>(); >- for (AbstractRepositoryQuery query : queries.values()) { >- if (query.contains(handle)) { >- queriesForHandle.add(query); >- } >+ AbstractTask tempTask = tasks.get(handle); >+ if(tempTask != null) { >+ queriesForHandle = getParentQueries(tempTask); > } >+ > return queriesForHandle; > } > >Index: src/org/eclipse/mylyn/internal/tasks/core/OrphanedTasksContainer.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/OrphanedTasksContainer.java,v >retrieving revision 1.2 >diff -u -r1.2 OrphanedTasksContainer.java >--- src/org/eclipse/mylyn/internal/tasks/core/OrphanedTasksContainer.java 18 Dec 2007 22:46:14 -0000 1.2 >+++ src/org/eclipse/mylyn/internal/tasks/core/OrphanedTasksContainer.java 17 Jan 2008 02:34:05 -0000 >@@ -44,7 +44,7 @@ > } > > @Override >- public boolean isUserDefined() { >+ public boolean isUserManaged() { > return false; > } > >@@ -73,4 +73,10 @@ > } > return false; > } >+ >+ @Override >+ @Deprecated >+ public boolean isUserDefined() { >+ return isUserManaged(); >+ } > } >Index: src/org/eclipse/mylyn/internal/tasks/core/ScheduledTaskContainer.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ScheduledTaskContainer.java,v >retrieving revision 1.14 >diff -u -r1.14 ScheduledTaskContainer.java >--- src/org/eclipse/mylyn/internal/tasks/core/ScheduledTaskContainer.java 13 Dec 2007 02:42:59 -0000 1.14 >+++ src/org/eclipse/mylyn/internal/tasks/core/ScheduledTaskContainer.java 17 Jan 2008 02:34:05 -0000 >@@ -15,14 +15,13 @@ > import java.util.Set; > > import org.eclipse.mylyn.tasks.core.AbstractTask; >-import org.eclipse.mylyn.tasks.core.AbstractTaskCategory; > import org.eclipse.mylyn.tasks.core.AbstractTaskContainer; > > /** > * @author Rob Elves > * @author Mik Kersten > */ >-public class ScheduledTaskContainer extends AbstractTaskCategory { >+public class ScheduledTaskContainer extends AbstractTaskContainer { > > private Set<ScheduledTaskDelegate> dateRangeDelegates = new HashSet<ScheduledTaskDelegate>(); > >@@ -161,7 +160,7 @@ > } > > @Override >- public boolean isUserDefined() { >+ public boolean isUserManaged() { > return false; > } > >Index: src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java,v >retrieving revision 1.3 >diff -u -r1.3 TaskGroup.java >--- src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java 8 Sep 2007 00:36:57 -0000 1.3 >+++ src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java 17 Jan 2008 02:34:05 -0000 >@@ -7,7 +7,7 @@ > *******************************************************************************/ > package org.eclipse.mylyn.internal.tasks.core; > >-import org.eclipse.mylyn.tasks.core.AbstractTaskCategory; >+import org.eclipse.mylyn.tasks.core.AbstractTaskContainer; > > /** > * NOTE: this class is likely to change or become API for 3.0 >@@ -15,7 +15,7 @@ > * @author Eugene Kuleshov > * @since 2.1 > */ >-public class TaskGroup extends AbstractTaskCategory { >+public class TaskGroup extends AbstractTaskContainer { > > private final String summary; > >@@ -31,8 +31,9 @@ > public String getSummary() { > return summary; > } >- >- public boolean isUserDefined() { >+ >+ @Override >+ public boolean isUserManaged() { > return false; > } > >Index: src/org/eclipse/mylyn/internal/tasks/core/UnfiledCategory.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UnfiledCategory.java,v >retrieving revision 1.6 >diff -u -r1.6 UnfiledCategory.java >--- src/org/eclipse/mylyn/internal/tasks/core/UnfiledCategory.java 26 Jun 2007 22:56:51 -0000 1.6 >+++ src/org/eclipse/mylyn/internal/tasks/core/UnfiledCategory.java 17 Jan 2008 02:34:05 -0000 >@@ -42,8 +42,13 @@ > } > > @Override >- public boolean isUserDefined() { >- // ignore >+ public boolean isUserManaged() { > return false; > } >+ >+ @Override >+ @Deprecated >+ public boolean isUserDefined() { >+ return isUserManaged(); >+ } > } >Index: src/org/eclipse/mylyn/internal/tasks/core/TaskCategory.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskCategory.java,v >retrieving revision 1.4 >diff -u -r1.4 TaskCategory.java >--- src/org/eclipse/mylyn/internal/tasks/core/TaskCategory.java 28 Aug 2007 02:53:02 -0000 1.4 >+++ src/org/eclipse/mylyn/internal/tasks/core/TaskCategory.java 17 Jan 2008 02:34:05 -0000 >@@ -10,7 +10,9 @@ > */ > package org.eclipse.mylyn.internal.tasks.core; > >+import org.eclipse.mylyn.tasks.core.AbstractTask; > import org.eclipse.mylyn.tasks.core.AbstractTaskCategory; >+import org.eclipse.mylyn.tasks.core.AbstractTaskContainer; > > /** > * NOTE: this class is likely to change or become API for 3.0 >@@ -27,4 +29,19 @@ > public boolean isUserDefined() { > return true; > } >+ >+ /** >+ * null if no parent category >+ */ >+ public static AbstractTaskCategory getParentTaskCategory(AbstractTask task) { >+ AbstractTaskCategory category = null; >+ if(task != null) { >+ for (AbstractTaskContainer container: task.getParentContainers()) { >+ if(container instanceof AbstractTaskCategory) { >+ category = (AbstractTaskCategory)container; >+ } >+ } >+ } >+ return category; >+ } > } >#P org.eclipse.mylyn.tasks.tests >Index: src/org/eclipse/mylyn/tasks/tests/TaskListTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListTest.java,v >retrieving revision 1.10 >diff -u -r1.10 TaskListTest.java >--- src/org/eclipse/mylyn/tasks/tests/TaskListTest.java 13 Dec 2007 00:28:44 -0000 1.10 >+++ src/org/eclipse/mylyn/tasks/tests/TaskListTest.java 17 Jan 2008 02:34:07 -0000 >@@ -19,10 +19,10 @@ > */ > public class TaskListTest extends TestCase { > >- public void testGetUserCategories() { >+ public void testGetCategories() { > TaskList taskList = new TaskList(); > taskList.addCategory(new TaskCategory("a")); >- assertEquals(2, taskList.getUserCategories().size()); >+ assertEquals(2, taskList.getCategories().size()); > } > > } >Index: src/org/eclipse/mylyn/tasks/tests/OrphanedTasksTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/OrphanedTasksTest.java,v >retrieving revision 1.2 >diff -u -r1.2 OrphanedTasksTest.java >--- src/org/eclipse/mylyn/tasks/tests/OrphanedTasksTest.java 15 Jan 2008 23:49:36 -0000 1.2 >+++ src/org/eclipse/mylyn/tasks/tests/OrphanedTasksTest.java 17 Jan 2008 02:34:07 -0000 >@@ -68,10 +68,7 @@ > assertFalse(category.contains(newTask.getHandleIdentifier())); > assertTrue(taskList.getDefaultCategory().contains(newTask.getHandleIdentifier())); > assertEquals(1, newTask.getParentContainers().size()); >- assertEquals(taskList.getDefaultCategory().getHandleIdentifier(), newTask.getParentContainers() >- .iterator() >- .next() >- .getHandleIdentifier()); >+ assertEquals(taskList.getDefaultCategory(), TaskCategory.getParentTaskCategory(newTask)); > } > > /** >@@ -222,8 +219,7 @@ > Set<AbstractTask> tasks = TasksUiPlugin.getTaskListManager().getTaskList().getRepositoryTasks( > MockRepositoryConnector.REPOSITORY_URL); > assertFalse(tasks.isEmpty()); >- AbstractRepositoryQuery query = TasksUiPlugin.getTaskListManager().getTaskList().getQueryForHandle( >- mockTask.getHandleIdentifier()); >+ AbstractRepositoryQuery query = TasksUiPlugin.getTaskListManager().getTaskList().getParentQueries(mockTask).iterator().next(); > assertEquals(mockQuery, query); > assertFalse(query.isEmpty()); > assertTrue(TasksUiPlugin.getTaskListManager().getTaskList().getOrphanContainer( >@@ -287,8 +283,7 @@ > taskList.removeFromQuery(mockQuery, mockTask); > assertTrue(taskList.getOrphanContainer(MockRepositoryConnector.REPOSITORY_URL).contains( > mockTask.getHandleIdentifier())); >- assertTrue(taskList.getOrphanContainer(MockRepositoryConnector.REPOSITORY_URL).contains( >- mockTask2.getHandleIdentifier())); >+ assertTrue(mockTask.contains(mockTask2.getHandleIdentifier())); > taskList.deleteTask(mockTask); > assertFalse(taskList.getOrphanContainer(MockRepositoryConnector.REPOSITORY_URL).contains( > mockTask.getHandleIdentifier())); >@@ -321,13 +316,15 @@ > taskList.removeFromQuery(mockQuery, mockTask); > assertTrue(taskList.getOrphanContainer(MockRepositoryConnector.REPOSITORY_URL).contains( > mockTask.getHandleIdentifier())); >+ assertTrue(mockTask.contains(mockTask2.getHandleIdentifier())); > assertFalse(taskList.getOrphanContainer(MockRepositoryConnector.REPOSITORY_URL).contains( > mockTask2.getHandleIdentifier())); > > taskList.removeFromQuery(mockQuery, mockTask3); > assertTrue(taskList.getOrphanContainer(MockRepositoryConnector.REPOSITORY_URL).contains( > mockTask3.getHandleIdentifier())); >- assertTrue(taskList.getOrphanContainer(MockRepositoryConnector.REPOSITORY_URL).contains( >+ assertTrue(mockTask3.contains(mockTask2.getHandleIdentifier())); >+ assertFalse(taskList.getOrphanContainer(MockRepositoryConnector.REPOSITORY_URL).contains( > mockTask2.getHandleIdentifier())); > > } >Index: src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java,v >retrieving revision 1.80 >diff -u -r1.80 TaskListManagerTest.java >--- src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java 13 Dec 2007 18:15:31 -0000 1.80 >+++ src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java 17 Jan 2008 02:34:07 -0000 >@@ -412,20 +412,20 @@ > manager.getTaskList().moveTask(task1, > manager.getTaskList().getOrphanContainer(LocalRepositoryConnector.REPOSITORY_URL)); > assertEquals(1, manager.getTaskList().getDefaultCategory().getChildren().size()); >- assertEquals(manager.getTaskList().getDefaultCategory(), task1.getParentContainers().iterator().next()); >+ assertEquals(manager.getTaskList().getDefaultCategory(), TaskCategory.getParentTaskCategory(task1)); > > TaskCategory cat1 = new TaskCategory("c1"); > manager.getTaskList().addCategory(cat1); > > manager.getTaskList().moveTask(task1, cat1); > assertEquals(0, manager.getTaskList().getDefaultCategory().getChildren().size()); >- assertEquals(cat1, task1.getParentContainers().iterator().next()); >+ assertEquals(cat1, TaskCategory.getParentTaskCategory(task1)); > > manager.getTaskList().moveTask(task1, > manager.getTaskList().getOrphanContainer(LocalRepositoryConnector.REPOSITORY_URL)); > assertEquals(1, manager.getTaskList().getDefaultCategory().getChildren().size()); > assertEquals(0, cat1.getChildren().size()); >- assertEquals(manager.getTaskList().getDefaultCategory(), task1.getParentContainers().iterator().next()); >+ assertEquals(manager.getTaskList().getDefaultCategory(), TaskCategory.getParentTaskCategory(task1)); > } > > public void testEmpty() { >@@ -618,7 +618,7 @@ > > MockRepositoryTask reportInCat1 = new MockRepositoryTask("123"); > manager.getTaskList().moveTask(reportInCat1, cat1); >- assertEquals(cat1, reportInCat1.getParentContainers().iterator().next()); >+ assertEquals(cat1, TaskCategory.getParentTaskCategory(reportInCat1)); > > manager.saveTaskList(); > assertNotNull(manager.getTaskList()); >@@ -715,7 +715,7 @@ > AbstractTask task3 = manager.createNewLocalTask("task 3"); > manager.getTaskList().moveTask(task3, cat1); > cat1Contents.add(task3); >- assertEquals(cat1, task3.getParentContainers().iterator().next()); >+ assertEquals(cat1, TaskCategory.getParentTaskCategory(task3)); > AbstractTask sub2 = manager.createNewLocalTask("sub 2"); > manager.getTaskList().addTask(sub2, task3); > //manager.getTaskList().moveToContainer(sub2, manager.getTaskList().getArchiveContainer()); >@@ -726,7 +726,7 @@ > > MockRepositoryTask reportInCat1 = new MockRepositoryTask("123"); > manager.getTaskList().moveTask(reportInCat1, cat1); >- assertEquals(cat1, reportInCat1.getParentContainers().iterator().next()); >+ assertEquals(cat1, TaskCategory.getParentTaskCategory(reportInCat1)); > cat1Contents.add(reportInCat1); > > // MockRepositoryTask reportInRoot = new MockRepositoryTask("124"); >@@ -840,8 +840,7 @@ > > assertEquals(3, query2.getChildren().size()); > >- Set<AbstractRepositoryQuery> queriesReturned = taskList.getQueriesForHandle(RepositoryTaskHandleUtil.getHandle( >- MockRepositoryConnector.REPOSITORY_URL, "1")); >+ Set<AbstractRepositoryQuery> queriesReturned = taskList.getParentQueries(hit1); > assertNotNull(queriesReturned); > assertEquals(2, queriesReturned.size()); > assertTrue(queriesReturned.contains(query1)); >#P org.eclipse.mylyn.tasks.ui >Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java,v >retrieving revision 1.57 >diff -u -r1.57 TaskListContentProvider.java >--- src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java 19 Dec 2007 03:14:21 -0000 1.57 >+++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java 17 Jan 2008 02:34:09 -0000 >@@ -17,9 +17,11 @@ > import org.eclipse.core.runtime.IAdaptable; > import org.eclipse.jface.viewers.Viewer; > import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer; >+import org.eclipse.mylyn.internal.tasks.core.TaskCategory; > import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter; > import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; > import org.eclipse.mylyn.tasks.core.AbstractTask; >+import org.eclipse.mylyn.tasks.core.AbstractTaskCategory; > import org.eclipse.mylyn.tasks.core.AbstractTaskContainer; > import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; > import org.eclipse.ui.IWorkingSet; >@@ -59,9 +61,12 @@ > public Object getParent(Object child) { > // Return first parent found, first search within queries then categories. > if (child instanceof AbstractTask) { >+ AbstractTaskCategory category = TaskCategory.getParentTaskCategory((AbstractTask)child); >+ if(category != null) return category; >+ > Set<AbstractRepositoryQuery> queries = TasksUiPlugin.getTaskListManager() > .getTaskList() >- .getQueriesForHandle(((AbstractTask) child).getHandleIdentifier()); >+ .getParentQueries(((AbstractTask) child)); > if (queries.size() > 0) { > return queries.toArray()[0]; > } >Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListDropAdapter.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListDropAdapter.java,v >retrieving revision 1.48 >diff -u -r1.48 TaskListDropAdapter.java >--- src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListDropAdapter.java 13 Dec 2007 00:28:46 -0000 1.48 >+++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListDropAdapter.java 17 Jan 2008 02:34:09 -0000 >@@ -174,15 +174,13 @@ > } else if (currentTarget instanceof AbstractTask) { > AbstractTask targetTask = (AbstractTask) currentTarget; > AbstractTaskCategory targetCategory = null; >- // TODO: just look for categories? >- if (targetTask.getParentContainers().size() > 0) { >- AbstractTaskContainer container = targetTask.getParentContainers().iterator().next(); >- if (container instanceof TaskCategory || container instanceof UnfiledCategory) { >+ // TODO: TaskCategory only used what about AbstractTaskCategory descendants? >+ AbstractTaskContainer container = TaskCategory.getParentTaskCategory(targetTask); >+ if (container instanceof TaskCategory || container instanceof UnfiledCategory) { >+ targetCategory = (AbstractTaskCategory) container; >+ } else if (container instanceof OrphanedTasksContainer) { >+ if (((OrphanedTasksContainer) container).getRepositoryUrl().equals(task.getRepositoryUrl())) { > targetCategory = (AbstractTaskCategory) container; >- } else if (container instanceof OrphanedTasksContainer) { >- if (((OrphanedTasksContainer) container).getRepositoryUrl().equals(task.getRepositoryUrl())) { >- targetCategory = (AbstractTaskCategory) container; >- } > } > } > if (targetCategory != null) { >Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java,v >retrieving revision 1.224 >diff -u -r1.224 TaskListView.java >--- src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java 20 Dec 2007 21:55:36 -0000 1.224 >+++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java 17 Jan 2008 02:34:10 -0000 >@@ -1298,7 +1298,7 @@ > } else if (action instanceof RenameAction) { > if (element instanceof AbstractTaskCategory) { > AbstractTaskCategory container = (AbstractTaskCategory) element; >- action.setEnabled(container.isUserDefined()); >+ action.setEnabled(container.isUserManaged()); > } else if (element instanceof AbstractRepositoryQuery) { > action.setEnabled(true); > } >@@ -1702,7 +1702,7 @@ > // TODO: move logic into deltas > refreshJob.refreshTask(task); > Set<AbstractTaskContainer> containers = new HashSet<AbstractTaskContainer>( >- TasksUiPlugin.getTaskListManager().getTaskList().getQueriesForHandle(task.getHandleIdentifier())); >+ TasksUiPlugin.getTaskListManager().getTaskList().getParentQueries(task)); > containers.addAll(task.getParentContainers()); > containers.add(TasksUiPlugin.getTaskListManager().getTaskList().getOrphanContainer(task.getRepositoryUrl())); > // containers.add(TasksUiPlugin.getTaskListManager().getTaskList().getArchiveContainer()); >Index: src/org/eclipse/mylyn/internal/tasks/ui/planner/TaskActivityWizardPage.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/planner/TaskActivityWizardPage.java,v >retrieving revision 1.18 >diff -u -r1.18 TaskActivityWizardPage.java >--- src/org/eclipse/mylyn/internal/tasks/ui/planner/TaskActivityWizardPage.java 13 Dec 2007 01:37:55 -0000 1.18 >+++ src/org/eclipse/mylyn/internal/tasks/ui/planner/TaskActivityWizardPage.java 17 Jan 2008 02:34:09 -0000 >@@ -215,7 +215,7 @@ > } > > List<AbstractTaskContainer> containers = new ArrayList<AbstractTaskContainer>(); >- containers.addAll(manager.getTaskList().getUserCategories()); >+ containers.addAll(manager.getTaskList().getCategories()); > containers.addAll(manager.getTaskList().getQueries()); > //containers.add(manager.getTaskList().getArchiveContainer()); > Collections.sort(containers, new Comparator<AbstractTaskContainer>() { >Index: src/org/eclipse/mylyn/internal/tasks/ui/actions/RemoveFromCategoryAction.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RemoveFromCategoryAction.java,v >retrieving revision 1.19 >diff -u -r1.19 RemoveFromCategoryAction.java >--- src/org/eclipse/mylyn/internal/tasks/ui/actions/RemoveFromCategoryAction.java 13 Dec 2007 20:03:19 -0000 1.19 >+++ src/org/eclipse/mylyn/internal/tasks/ui/actions/RemoveFromCategoryAction.java 17 Jan 2008 02:34:08 -0000 >@@ -66,9 +66,9 @@ > } > // TasksUiPlugin.getTaskListManager().getTaskList().moveToContainer(task, > // TasksUiPlugin.getTaskListManager().getTaskList().getDefaultCategory()); >- else if (!parentContainers.isEmpty() && parentContainers.iterator().next() instanceof TaskCategory) { >+ else if (!parentContainers.isEmpty() && TaskCategory.getParentTaskCategory(task) != null) { > TasksUiPlugin.getTaskListManager().getTaskList().removeFromCategory( >- (TaskCategory) parentContainers.iterator().next(), task); >+ TaskCategory.getParentTaskCategory(task), task); > //TasksUiPlugin.getTaskListManager().getTaskList().moveToContainer(task, null); > } else if (!task.isLocal()) { > TasksUiPlugin.getTaskListManager().getTaskList().moveTask(task, null); >Index: src/org/eclipse/mylyn/internal/tasks/ui/actions/RenameAction.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RenameAction.java,v >retrieving revision 1.8 >diff -u -r1.8 RenameAction.java >--- src/org/eclipse/mylyn/internal/tasks/ui/actions/RenameAction.java 24 Aug 2007 00:35:00 -0000 1.8 >+++ src/org/eclipse/mylyn/internal/tasks/ui/actions/RenameAction.java 17 Jan 2008 02:34:08 -0000 >@@ -50,7 +50,7 @@ > Object selectedObject = selection.getFirstElement(); > if (selectedObject instanceof AbstractTaskCategory) { > AbstractTaskCategory container = (AbstractTaskCategory) selectedObject; >- return container.isUserDefined(); >+ return container.isUserManaged(); > } else if (selectedObject instanceof AbstractRepositoryQuery) { > return true; > } >Index: src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java,v >retrieving revision 1.55 >diff -u -r1.55 AbstractNewRepositoryTaskEditor.java >--- src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java 13 Dec 2007 01:37:55 -0000 1.55 >+++ src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java 17 Jan 2008 02:34:10 -0000 >@@ -7,6 +7,7 @@ > *******************************************************************************/ > package org.eclipse.mylyn.tasks.ui.editors; > >+import java.util.ArrayList; > import java.util.Calendar; > import java.util.Collections; > import java.util.Comparator; >@@ -361,7 +362,7 @@ > getManagedForm().getToolkit().adapt(categoryChooser, true, true); > categoryChooser.setFont(TEXT_FONT); > TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList(); >- List<AbstractTaskCategory> categories = taskList.getUserCategories(); >+ List<AbstractTaskCategory> categories = new ArrayList<AbstractTaskCategory>(taskList.getCategories()); > Collections.sort(categories, new Comparator<AbstractTaskContainer>() { > > public int compare(AbstractTaskContainer c1, AbstractTaskContainer c2) { >Index: src/org/eclipse/mylyn/internal/tasks/ui/util/DelegatingTaskExternalizer.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/DelegatingTaskExternalizer.java,v >retrieving revision 1.14 >diff -u -r1.14 DelegatingTaskExternalizer.java >--- src/org/eclipse/mylyn/internal/tasks/ui/util/DelegatingTaskExternalizer.java 18 Dec 2007 04:27:00 -0000 1.14 >+++ src/org/eclipse/mylyn/internal/tasks/ui/util/DelegatingTaskExternalizer.java 17 Jan 2008 02:34:09 -0000 >@@ -168,11 +168,8 @@ > node.setAttribute(KEY_HANDLE, task.getHandleIdentifier()); > node.setAttribute(KEY_REPOSITORY_URL, task.getRepositoryUrl()); > >- AbstractTaskContainer container = null; >+ AbstractTaskContainer container = TaskCategory.getParentTaskCategory(task); > >- if (task.getParentContainers().size() > 0) { >- container = task.getParentContainers().iterator().next(); >- } > if (container != null) { > if (container.getHandleIdentifier().equals(UnfiledCategory.HANDLE)) { > node.setAttribute(KEY_CATEGORY, VAL_ROOT); >Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionPart.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionPart.java,v >retrieving revision 1.2 >diff -u -r1.2 TaskEditorActionPart.java >--- src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionPart.java 15 Jan 2008 09:32:08 -0000 1.2 >+++ src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionPart.java 17 Jan 2008 02:34:09 -0000 >@@ -8,6 +8,7 @@ > > package org.eclipse.mylyn.internal.tasks.ui.editors; > >+import java.util.ArrayList; > import java.util.Arrays; > import java.util.Collections; > import java.util.Comparator; >@@ -199,7 +200,7 @@ > toolkit.adapt(categoryChooser, true, true); > categoryChooser.setFont(TEXT_FONT); > TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList(); >- List<AbstractTaskCategory> categories = taskList.getUserCategories(); >+ List<AbstractTaskCategory> categories = new ArrayList<AbstractTaskCategory>(taskList.getCategories()); > Collections.sort(categories, new Comparator<AbstractTaskContainer>() { > > public int compare(AbstractTaskContainer c1, AbstractTaskContainer c2) { >Index: src/org/eclipse/mylyn/tasks/ui/TaskListManager.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskListManager.java,v >retrieving revision 1.119 >diff -u -r1.119 TaskListManager.java >--- src/org/eclipse/mylyn/tasks/ui/TaskListManager.java 11 Jan 2008 21:20:25 -0000 1.119 >+++ src/org/eclipse/mylyn/tasks/ui/TaskListManager.java 17 Jan 2008 02:34:10 -0000 >@@ -541,10 +541,8 @@ > } else if (selectedObject instanceof AbstractTask) { > AbstractTask task = (AbstractTask) selectedObject; > >- AbstractTaskContainer container = null; >- if (task.getChildren().size() > 0 && task.getParentContainers().iterator().hasNext()) { >- container = task.getParentContainers().iterator().next(); >- } >+ AbstractTaskContainer container = TaskCategory.getParentTaskCategory(task); >+ > if (container instanceof TaskCategory) { > taskList.addTask(newTask, container); > } else if (view != null && view.getDrilledIntoCategory() instanceof TaskCategory) { >Index: src/org/eclipse/mylyn/internal/tasks/ui/commands/RemoteTaskSelectionDialog.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/RemoteTaskSelectionDialog.java,v >retrieving revision 1.32 >diff -u -r1.32 RemoteTaskSelectionDialog.java >--- src/org/eclipse/mylyn/internal/tasks/ui/commands/RemoteTaskSelectionDialog.java 13 Dec 2007 01:37:55 -0000 1.32 >+++ src/org/eclipse/mylyn/internal/tasks/ui/commands/RemoteTaskSelectionDialog.java 17 Jan 2008 02:34:09 -0000 >@@ -220,7 +220,7 @@ > categoryViewer.setContentProvider(new ArrayContentProvider()); > TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList(); > LinkedList<AbstractTaskContainer> categories = new LinkedList<AbstractTaskContainer>( >- taskList.getUserCategories()); >+ taskList.getCategories()); > categories.addFirst(taskList.getDefaultCategory()); > categoryViewer.setInput(categories); > categoryViewer.setLabelProvider(new LabelProvider() { >Index: src/org/eclipse/mylyn/internal/tasks/ui/TaskWorkingSetFilter.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskWorkingSetFilter.java,v >retrieving revision 1.23 >diff -u -r1.23 TaskWorkingSetFilter.java >--- src/org/eclipse/mylyn/internal/tasks/ui/TaskWorkingSetFilter.java 19 Dec 2007 01:18:01 -0000 1.23 >+++ src/org/eclipse/mylyn/internal/tasks/ui/TaskWorkingSetFilter.java 17 Jan 2008 02:34:08 -0000 >@@ -56,7 +56,7 @@ > } > } > if (parent instanceof ScheduledTaskContainer && element instanceof AbstractTask) { >- Set<AbstractRepositoryQuery> queries = taskList.getQueriesForHandle(((AbstractTask) element).getHandleIdentifier()); >+ Set<AbstractRepositoryQuery> queries = taskList.getParentQueries(((AbstractTask) element)); > if (!queries.isEmpty()) { > for (AbstractRepositoryQuery query : queries) { > if (isContainedInWorkingSet(query)) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 210801
:
83717
| 87124