diff options
author | mkersten | 2008-05-13 20:00:00 +0000 |
---|---|---|
committer | mkersten | 2008-05-13 20:00:00 +0000 |
commit | 9c6676134f26744994e9f787b971b315257f0135 (patch) | |
tree | d50a994f0f25d275e5c8a8926e211edff00bbd4d /org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn | |
parent | 9f4e8f03e5a90a7972076ba4826f63f3a0f904a8 (diff) | |
download | org.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')
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); |