From fa408d21d567f11a0b90d35a0d54525edbc9eca7 Mon Sep 17 00:00:00 2001 From: David McKnight Date: Thu, 1 Feb 2007 17:30:41 +0000 Subject: [PATCH] [172492] patch from Uwe to make tree viewer safe --- .../rse/internal/ui/view/SystemView.java | 3 +- .../org/eclipse/rse/ui/view/SystemView.java | 3 +- .../rse/ui/view/SystemViewSafeTreeViewer.java | 151 ++++++++++++++++++ 3 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemViewSafeTreeViewer.java diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemView.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemView.java index 5088b022503..106ee1c985a 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemView.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemView.java @@ -51,7 +51,6 @@ import org.eclipse.jface.viewers.ITreeViewerListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeExpansionEvent; -import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.SameShellProvider; import org.eclipse.rse.core.SystemAdapterHelpers; @@ -149,7 +148,7 @@ import org.eclipse.ui.views.framelist.GoIntoAction; /* * At one time implemented the following as well: MenuListener, IDoubleClickListener, ArmListener, IWireEventTarget */ -public class SystemView extends TreeViewer implements ISystemTree, ISystemResourceChangeListener, ISystemRemoteChangeListener, IMenuListener, +public class SystemView extends SystemViewSafeTreeViewer implements ISystemTree, ISystemResourceChangeListener, ISystemRemoteChangeListener, IMenuListener, ISelectionChangedListener, ISelectionProvider, ITreeViewerListener, ISystemResourceChangeEvents, ISystemDeleteTarget, ISystemRenameTarget, ISystemSelectAllTarget { diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemView.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemView.java index 5088b022503..106ee1c985a 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemView.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemView.java @@ -51,7 +51,6 @@ import org.eclipse.jface.viewers.ITreeViewerListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeExpansionEvent; -import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.SameShellProvider; import org.eclipse.rse.core.SystemAdapterHelpers; @@ -149,7 +148,7 @@ import org.eclipse.ui.views.framelist.GoIntoAction; /* * At one time implemented the following as well: MenuListener, IDoubleClickListener, ArmListener, IWireEventTarget */ -public class SystemView extends TreeViewer implements ISystemTree, ISystemResourceChangeListener, ISystemRemoteChangeListener, IMenuListener, +public class SystemView extends SystemViewSafeTreeViewer implements ISystemTree, ISystemResourceChangeListener, ISystemRemoteChangeListener, IMenuListener, ISelectionChangedListener, ISelectionProvider, ITreeViewerListener, ISystemResourceChangeEvents, ISystemDeleteTarget, ISystemRenameTarget, ISystemSelectAllTarget { diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemViewSafeTreeViewer.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemViewSafeTreeViewer.java new file mode 100644 index 00000000000..b37b908659f --- /dev/null +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemViewSafeTreeViewer.java @@ -0,0 +1,151 @@ +/******************************************************************************** + * Copyright (c) 2007 Wind River Systems, Inc. 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: + * Uwe Stieber (Wind River) - initial API and implementation. + ********************************************************************************/ +package org.eclipse.rse.ui.view; + +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Item; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.Widget; + +/** + * Delayed label provider can trigger tree item updates called in the + * viewer after the tree item itself got disposed. This happens especially + * if items appear and disappear very fast within the tree which then will + * lead to nasty SWT Widget already disposed exceptions. + */ +public class SystemViewSafeTreeViewer extends TreeViewer { + + /** + * Constructor. + * + * @param parent The parant control. + */ + public SystemViewSafeTreeViewer(Composite parent) { + super(parent); + } + + /** + * Constructor. + * + * @param tree The tree control. + */ + public SystemViewSafeTreeViewer(Tree tree) { + super(tree); + } + + /** + * Constructor. + * + * @param parent The parent control. + * @param style The SWT style bits passed to the tree creation. + */ + public SystemViewSafeTreeViewer(Composite parent, int style) { + super(parent, style); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#doUpdateItem(org.eclipse.swt.widgets.Item, java.lang.Object) + */ + protected void doUpdateItem(Item item, Object element) { + if (item != null && item.isDisposed()) return; + super.doUpdateItem(item, element); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.AbstractTreeViewer#doUpdateItem(org.eclipse.swt.widgets.Widget, java.lang.Object, boolean) + */ + protected void doUpdateItem(Widget widget, Object element, boolean fullMap) { + if (widget != null && widget.isDisposed()) return; + super.doUpdateItem(widget, element, fullMap); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#getItemCount(org.eclipse.swt.widgets.Control) + */ + protected int getItemCount(Control widget) { + if (widget != null && widget.isDisposed()) return 0; + return super.getItemCount(widget); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#getItemCount(org.eclipse.swt.widgets.Item) + */ + protected int getItemCount(Item item) { + if (item != null && item.isDisposed()) return 0; + return super.getItemCount(item); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#showItem(org.eclipse.swt.widgets.Item) + */ + protected void showItem(Item item) { + if (item != null && item.isDisposed()) return; + super.showItem(item); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#updatePlus(org.eclipse.swt.widgets.Item, java.lang.Object) + */ + protected void updatePlus(Item item, Object element) { + if (item != null && item.isDisposed()) return; + super.updatePlus(item, element); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#createChildren(org.eclipse.swt.widgets.Widget) + */ + protected void createChildren(Widget widget) { + if (widget != null && widget.isDisposed()) return; + super.createChildren(widget); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#getChild(org.eclipse.swt.widgets.Widget, int) + */ + protected Item getChild(Widget widget, int index) { + if (widget != null && widget.isDisposed()) return null; + return super.getChild(widget, index); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#getChildren(org.eclipse.swt.widgets.Widget) + */ + protected Item[] getChildren(Widget widget) { + if (widget != null && widget.isDisposed()) return new Item[0]; + return super.getChildren(widget); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#getExpanded(org.eclipse.swt.widgets.Item) + */ + protected boolean getExpanded(Item item) { + if (item != null && item.isDisposed()) return false; + return super.getExpanded(item); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#getItems(org.eclipse.swt.widgets.Item) + */ + protected Item[] getItems(Item item) { + if (item != null && item.isDisposed()) return new Item[0]; + return super.getItems(item); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#getParentItem(org.eclipse.swt.widgets.Item) + */ + protected Item getParentItem(Item item) { + if (item != null && item.isDisposed()) return null; + return super.getParentItem(item); + } +}