Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkersten2008-05-13 20:00:00 +0000
committermkersten2008-05-13 20:00:00 +0000
commit9c6676134f26744994e9f787b971b315257f0135 (patch)
treed50a994f0f25d275e5c8a8926e211edff00bbd4d /org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal
parent9f4e8f03e5a90a7972076ba4826f63f3a0f904a8 (diff)
downloadorg.eclipse.mylyn.tasks-9c6676134f26744994e9f787b971b315257f0135.tar.gz
org.eclipse.mylyn.tasks-9c6676134f26744994e9f787b971b315257f0135.tar.xz
org.eclipse.mylyn.tasks-9c6676134f26744994e9f787b971b315257f0135.zip
NEW - bug 209846: workbench UI locked for couple minutes by FocusedViewerManager.refreshViewer() call in the UI thread
https://bugs.eclipse.org/bugs/show_bug.cgi?id=209846
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal')
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TreeWalker.java185
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/DelayedRefreshJob.java142
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java55
3 files changed, 41 insertions, 341 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TreeWalker.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TreeWalker.java
deleted file mode 100644
index 8b8866255..000000000
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TreeWalker.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers 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
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.tasks.ui.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * @author Steffen Pingel
- */
-public class TreeWalker {
-
- public enum Direction {
- UP, DOWN
- };
-
- public static abstract class TreeVisitor {
-
- public abstract boolean visit(Object object);
-
- }
-
- private Direction direction = Direction.DOWN;
-
- private final TreeViewer treeViewer;
-
- private final Tree tree;
-
- private boolean expandNodes;
-
- public TreeWalker(TreeViewer treeViewer) {
- this.treeViewer = treeViewer;
- this.tree = treeViewer.getTree();
- }
-
- public Direction getDirection() {
- return direction;
- }
-
- public boolean getExpandNodes() {
- return expandNodes;
- }
-
- private TreePath getTreePath(TreeItem item) {
- List<Object> path = new ArrayList<Object>();
- do {
- path.add(0, item.getData());
- item = item.getParentItem();
- } while (item != null);
- return new TreePath(path.toArray());
- }
-
- public void setDirection(Direction direction) {
- this.direction = direction;
- }
-
- public void setExpandNodes(boolean expandNodes) {
- this.expandNodes = expandNodes;
- }
-
- private TreePath visitChildren(TreeViewer viewer, TreePath itemPath, TreeItem item, TreeVisitor visitor) {
- boolean restoreCollapsedState = false;
- // expand item
- try {
- if (getExpandNodes()) {
- boolean expandedState = item.getExpanded();
- if (!expandedState) {
- restoreCollapsedState = true;
- viewer.setExpandedState(itemPath, true);
- }
- }
-
- TreeItem[] children = item.getItems();
- if (children.length > 0 && children[0].getData() != null) {
- TreePath childPath = visitItems(viewer, itemPath, children, null, visitor);
- if (childPath != null) {
- return childPath;
- }
- }
-
- } finally {
- if (restoreCollapsedState) {
- // restore item state
- viewer.setExpandedState(itemPath, false);
- }
- }
-
- return null;
- }
-
- private TreePath visitItems(TreeViewer viewer, TreePath parentPath, TreeItem[] items, TreeItem visitedItem,
- TreeVisitor visitor) {
- if (direction == Direction.UP) {
- Collections.reverse(Arrays.asList(items));
- }
-
- boolean found = (visitedItem == null);
- for (TreeItem item : items) {
- if (!found) {
- if (item == visitedItem) {
- found = true;
- }
- } else {
- TreePath itemPath = parentPath.createChildPath(item.getData());
-
- if (direction == Direction.DOWN) {
- if (visitor.visit(item.getData())) {
- return itemPath;
- }
- }
-
- TreePath childPath = visitChildren(viewer, itemPath, item, visitor);
- if (childPath != null) {
- return childPath;
- }
-
- if (direction == Direction.UP) {
- if (visitor.visit(item.getData())) {
- return itemPath;
- }
- }
- }
- }
-
- // visit parent siblings
- if (visitedItem != null) {
- TreeItem parent = visitedItem.getParentItem();
- if (parent != null) {
- if (direction == Direction.UP) {
- if (visitor.visit(parent.getData())) {
- return parentPath;
- }
- }
-
- return visitSiblings(viewer, parent, visitor);
- }
- }
-
- return null;
- }
-
- private TreePath visitSiblings(TreeViewer viewer, TreeItem item, TreeVisitor visitor) {
- TreeItem[] siblings;
- TreePath path;
- TreeItem parent = item.getParentItem();
- if (parent != null) {
- siblings = parent.getItems();
- path = getTreePath(parent);
- } else {
- siblings = viewer.getTree().getItems();
- path = TreePath.EMPTY;
- }
- return visitItems(viewer, path, siblings, item, visitor);
- }
-
- public TreePath walk(TreeVisitor visitor, TreeItem startItem) {
- TreePath path = null;
- if (startItem != null) {
- if (direction == Direction.DOWN) {
- path = visitChildren(treeViewer, getTreePath(startItem), startItem, visitor);
- }
- if (path == null) {
- path = visitSiblings(treeViewer, startItem, visitor);
- }
- } else {
- path = visitItems(treeViewer, TreePath.EMPTY, tree.getItems(), null, visitor);
- }
-
- return path;
- }
-
-}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/DelayedRefreshJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/DelayedRefreshJob.java
deleted file mode 100644
index 6c066561f..000000000
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/DelayedRefreshJob.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers 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
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.tasks.ui.views;
-
-import java.util.LinkedHashSet;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker;
-import org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker.TreeVisitor;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * @author Steffen Pingel
- */
-abstract class DelayedRefreshJob extends WorkbenchJob {
-
- static final long REFRESH_DELAY_DEFAULT = 200;
-
- static final long REFRESH_DELAY_MAX = 500;
-
- private final TreeViewer treeViewer;
-
- private static final int NOT_SCHEDULED = -1;
-
- private final LinkedHashSet<Object> queue = new LinkedHashSet<Object>();
-
- private long scheduleTime = NOT_SCHEDULED;
-
- public DelayedRefreshJob(TreeViewer treeViewer, String name) {
- super(name);
- this.treeViewer = treeViewer;
- setSystem(true);
- }
-
- public void forceRefresh() {
- queue.add(null);
- runInUIThread(new NullProgressMonitor());
- }
-
- public synchronized void refresh() {
- refreshTask(null);
- }
-
- public synchronized void refreshTask(Object element) {
- queue.add(element);
-
- if (scheduleTime == NOT_SCHEDULED) {
- scheduleTime = System.currentTimeMillis();
- schedule(REFRESH_DELAY_DEFAULT);
- } else if (System.currentTimeMillis() - scheduleTime < REFRESH_DELAY_MAX - REFRESH_DELAY_DEFAULT) {
- // reschedule to aggregate more refreshes
- cancel();
- schedule(REFRESH_DELAY_DEFAULT);
- }
- }
-
- @Override
- public IStatus runInUIThread(IProgressMonitor monitor) {
- if (treeViewer.getControl() == null || treeViewer.getControl().isDisposed()) {
- return Status.CANCEL_STATUS;
- }
-
- final Object[] items;
- synchronized (this) {
- if (queue.contains(null)) {
- items = null;
- } else {
- items = queue.toArray(new Object[0]);
- }
- queue.clear();
-
- scheduleTime = NOT_SCHEDULED;
- }
-
- // in case the refresh removes the currently selected item,
- // remember the next item in the tree to restore the selection
- TreeItem[] selection = treeViewer.getTree().getSelection();
- TreePath treePath = null;
- if (selection.length > 0) {
- TreeWalker treeWalker = new TreeWalker(treeViewer);
- treePath = treeWalker.walk(new TreeVisitor() {
- @Override
- public boolean visit(Object object) {
- return true;
- }
- }, selection[selection.length - 1]);
- }
-
- refresh(items);
-
- if (treePath != null) {
- ISelection newSelection = treeViewer.getSelection();
- if (newSelection == null || newSelection.isEmpty()) {
- treeViewer.setSelection(new TreeSelection(treePath), true);
- }
- }
-
- return Status.OK_STATUS;
- }
-
- protected void refresh(final Object[] items) {
- if (items == null) {
- treeViewer.refresh(true);
- } else if (items.length > 0) {
- try {
- for (Object item : items) {
- if (item instanceof ITask) {
- ITask task = (ITask) item;
- treeViewer.refresh(task, true);
- } else {
- treeViewer.refresh(item, true);
- }
- updateExpansionState(item);
- }
- } catch (SWTException e) {
- StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to refresh viewer: "
- + treeViewer, e));
- }
- }
- }
-
- protected abstract void updateExpansionState(Object item);
-
-} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java
index 7ddd43c52..a39358d37 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java
@@ -53,6 +53,7 @@ import org.eclipse.jface.window.Window;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
@@ -110,6 +111,7 @@ import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.RTFTransfer;
@@ -173,6 +175,44 @@ import org.eclipse.ui.themes.IThemeManager;
*/
public class TaskListView extends ViewPart implements IPropertyChangeListener {
+ private final class TaskListRefreshJob extends DelayedRefreshJob {
+
+ private TaskListRefreshJob(TreeViewer treeViewer, String name) {
+ super(treeViewer, name);
+ }
+
+ @Override
+ protected void refresh(Object[] items) {
+ if (items == null) {
+ treeViewer.refresh(true);
+ } else if (items.length > 0) {
+ try {
+ for (Object item : items) {
+ if (item instanceof ITask) {
+ ITask task = (ITask) item;
+ treeViewer.refresh(task, true);
+ } else {
+ treeViewer.refresh(item, true);
+ }
+ updateExpansionState(item);
+ }
+ } catch (SWTException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to refresh viewer: "
+ + treeViewer, e));
+ }
+ }
+
+ updateToolTip(false);
+ }
+
+ @Override
+ protected void updateExpansionState(Object item) {
+ if (TaskListView.this.isFocusedMode()) {
+ TaskListView.this.getViewer().expandToLevel(item, 3);
+ }
+ }
+ }
+
public static final String ID = "org.eclipse.mylyn.tasks.ui.views.tasks";
public static final String LABEL_VIEW = "Tasks";
@@ -763,20 +803,7 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener {
getViewer().getTree().setHeaderVisible(false);
getViewer().setUseHashlookup(true);
- refreshJob = new DelayedRefreshJob(getViewer(), "Task List Refresh") {
- @Override
- protected void refresh(Object[] items) {
- super.refresh(items);
- updateToolTip(false);
- }
-
- @Override
- protected void updateExpansionState(Object item) {
- if (TaskListView.this.isFocusedMode()) {
- TaskListView.this.getViewer().expandToLevel(item, 3);
- }
- }
- };
+ refreshJob = new TaskListRefreshJob(getViewer(), "Task List Refresh");
configureColumns(columnNames, columnWidths);

Back to the top