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 65145 Details for
Bug 154571
[Viewers] Protect against label providers that spin the event loop
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.
[patch]
patch
patch-154571c.txt (text/plain), 25.75 KB, created by
Boris Bokowski
on 2007-04-27 00:06:09 EDT
(
hide
)
Description:
patch
Filename:
MIME Type:
Creator:
Boris Bokowski
Created:
2007-04-27 00:06:09 EDT
Size:
25.75 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jface >Index: src/org/eclipse/jface/viewers/TableViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewer.java,v >retrieving revision 1.82 >diff -u -r1.82 TableViewer.java >--- src/org/eclipse/jface/viewers/TableViewer.java 23 Apr 2007 19:11:49 -0000 1.82 >+++ src/org/eclipse/jface/viewers/TableViewer.java 27 Apr 2007 04:06:25 -0000 >@@ -17,7 +17,6 @@ > > import org.eclipse.core.runtime.Assert; > import org.eclipse.swt.SWT; >-import org.eclipse.swt.graphics.Image; > import org.eclipse.swt.graphics.Point; > import org.eclipse.swt.widgets.Composite; > import org.eclipse.swt.widgets.Control; >@@ -232,8 +231,10 @@ > int columnCount = Math.max(1, table.getColumnCount()); > for (int i = 0; i < columnCount; i++) { > tableItem.setText(i, ""); //$NON-NLS-1$ >+ if (tableItem.getImage(i) != null) { >+ tableItem.setImage(i, null); >+ } > } >- tableItem.setImage(new Image[columnCount]);// Clear all images > } > > protected void doRemove(int start, int end) { >@@ -311,6 +312,8 @@ > */ > public void refresh(final Object element, final boolean updateLabels, > boolean reveal) { >+ if (isBusy()) >+ return; > preservingSelection(new Runnable() { > public void run() { > internalRefresh(element, updateLabels); >Index: src/org/eclipse/jface/viewers/AbstractTreeViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java,v >retrieving revision 1.121 >diff -u -r1.121 AbstractTreeViewer.java >--- src/org/eclipse/jface/viewers/AbstractTreeViewer.java 23 Apr 2007 19:11:49 -0000 1.121 >+++ src/org/eclipse/jface/viewers/AbstractTreeViewer.java 27 Apr 2007 04:06:23 -0000 >@@ -127,7 +127,8 @@ > public void add(Object parentElementOrTreePath, Object[] childElements) { > Assert.isNotNull(parentElementOrTreePath); > assertElementsNotNull(childElements); >- >+ if (isBusy()) >+ return; > Widget[] widgets = internalFindItems(parentElementOrTreePath); > // If parent hasn't been realized yet, just ignore the add. > if (widgets.length == 0) { >@@ -334,7 +335,7 @@ > int index; > if (comparator == null) { > if (itemExists(items, element)) { >- refresh(element); >+ internalRefresh(element); > newItem = false; > } > index = -1; >@@ -355,7 +356,7 @@ > // any) > if (items[lastInsertion].getData().equals(element)) { > // refresh the element in case it has new children >- refresh(element); >+ internalRefresh(element); > newItem = false; > } > lastInsertion++;// We had an insertion so increment >@@ -740,46 +741,52 @@ > * the widget > */ > protected void createChildren(final Widget widget) { >- final Item[] tis = getChildren(widget); >- if (tis != null && tis.length > 0) { >- Object data = tis[0].getData(); >- if (data != null) { >- return; // children already there! >+ boolean oldBusy = busy; >+ busy = true; >+ try { >+ final Item[] tis = getChildren(widget); >+ if (tis != null && tis.length > 0) { >+ Object data = tis[0].getData(); >+ if (data != null) { >+ return; // children already there! >+ } > } >- } >- >- BusyIndicator.showWhile(widget.getDisplay(), new Runnable() { >- public void run() { >- // fix for PR 1FW89L7: >- // don't complain and remove all "dummies" ... >- if (tis != null) { >- for (int i = 0; i < tis.length; i++) { >- if (tis[i].getData() != null) { >- disassociate(tis[i]); >- Assert.isTrue(tis[i].getData() == null, >- "Second or later child is non -null");//$NON-NLS-1$ >- >+ >+ BusyIndicator.showWhile(widget.getDisplay(), new Runnable() { >+ public void run() { >+ // fix for PR 1FW89L7: >+ // don't complain and remove all "dummies" ... >+ if (tis != null) { >+ for (int i = 0; i < tis.length; i++) { >+ if (tis[i].getData() != null) { >+ disassociate(tis[i]); >+ Assert.isTrue(tis[i].getData() == null, >+ "Second or later child is non -null");//$NON-NLS-1$ >+ >+ } >+ tis[i].dispose(); > } >- tis[i].dispose(); > } >- } >- Object d = widget.getData(); >- if (d != null) { >- Object parentElement = d; >- Object[] children; >- if (isTreePathContentProvider() && widget instanceof Item) { >- TreePath path = getTreePathFromItem((Item) widget); >- children = getSortedChildren(path); >- } else { >- children = getSortedChildren(parentElement); >- } >- for (int i = 0; i < children.length; i++) { >- createTreeItem(widget, children[i], -1); >+ Object d = widget.getData(); >+ if (d != null) { >+ Object parentElement = d; >+ Object[] children; >+ if (isTreePathContentProvider() && widget instanceof Item) { >+ TreePath path = getTreePathFromItem((Item) widget); >+ children = getSortedChildren(path); >+ } else { >+ children = getSortedChildren(parentElement); >+ } >+ for (int i = 0; i < children.length; i++) { >+ createTreeItem(widget, children[i], -1); >+ } > } > } >- } >- >- }); >+ >+ }); >+ } finally { >+ busy = oldBusy; >+ } > } > > /** >@@ -944,23 +951,29 @@ > > /* (non-Javadoc) Method declared on StructuredViewer. */ > protected void doUpdateItem(Widget widget, Object element, boolean fullMap) { >- if (widget instanceof Item) { >- Item item = (Item) widget; >- >- // ensure that back pointer is correct >- if (fullMap) { >- associate(element, item); >- } else { >- Object data = item.getData(); >- if (data != null) { >- unmapElement(data, item); >+ boolean oldBusy = busy; >+ busy = true; >+ try { >+ if (widget instanceof Item) { >+ Item item = (Item) widget; >+ >+ // ensure that back pointer is correct >+ if (fullMap) { >+ associate(element, item); >+ } else { >+ Object data = item.getData(); >+ if (data != null) { >+ unmapElement(data, item); >+ } >+ item.setData(element); >+ mapElement(element, item); > } >- item.setData(element); >- mapElement(element, item); >+ >+ // update icon and label >+ SafeRunnable.run(new UpdateItemSafeRunnable(item, element)); > } >- >- // update icon and label >- SafeRunnable.run(new UpdateItemSafeRunnable(item, element)); >+ } finally { >+ busy = oldBusy; > } > } > >@@ -995,6 +1008,8 @@ > * levels of the tree > */ > public void expandToLevel(Object elementOrTreePath, int level) { >+ if (isBusy()) >+ return; > Widget w = internalExpand(elementOrTreePath, true); > if (w != null) { > internalExpandToLevel(w, level); >@@ -1248,46 +1263,52 @@ > > /* (non-Javadoc) Method declared on StructuredViewer. */ > protected Object[] getRawChildren(Object parentElementOrTreePath) { >- Object parent; >- TreePath path; >- if (parentElementOrTreePath instanceof TreePath) { >- path = (TreePath) parentElementOrTreePath; >- parent = path.getLastSegment(); >- } else { >- parent = parentElementOrTreePath; >- path = null; >- } >- if (parent != null) { >- if (equals(parent, getRoot())) { >- return super.getRawChildren(parent); >- } >- IContentProvider cp = getContentProvider(); >- if (cp instanceof ITreePathContentProvider) { >- ITreePathContentProvider tpcp = (ITreePathContentProvider) cp; >- if (path == null) { >- // A path was not provided so try and find one >- Widget w = findItem(parent); >- if (w instanceof Item) { >- Item item = (Item) w; >- path = getTreePathFromItem(item); >- } >+ boolean oldBusy = busy; >+ busy = true; >+ try { >+ Object parent; >+ TreePath path; >+ if (parentElementOrTreePath instanceof TreePath) { >+ path = (TreePath) parentElementOrTreePath; >+ parent = path.getLastSegment(); >+ } else { >+ parent = parentElementOrTreePath; >+ path = null; >+ } >+ if (parent != null) { >+ if (equals(parent, getRoot())) { >+ return super.getRawChildren(parent); >+ } >+ IContentProvider cp = getContentProvider(); >+ if (cp instanceof ITreePathContentProvider) { >+ ITreePathContentProvider tpcp = (ITreePathContentProvider) cp; > if (path == null) { >- path = new TreePath(new Object[] { parent }); >+ // A path was not provided so try and find one >+ Widget w = findItem(parent); >+ if (w instanceof Item) { >+ Item item = (Item) w; >+ path = getTreePathFromItem(item); >+ } >+ if (path == null) { >+ path = new TreePath(new Object[] { parent }); >+ } >+ } >+ Object[] result = tpcp.getChildren(path); >+ if (result != null) { >+ return result; >+ } >+ } else if (cp instanceof ITreeContentProvider) { >+ ITreeContentProvider tcp = (ITreeContentProvider) cp; >+ Object[] result = tcp.getChildren(parent); >+ if (result != null) { >+ return result; > } >- } >- Object[] result = tpcp.getChildren(path); >- if (result != null) { >- return result; >- } >- } else if (cp instanceof ITreeContentProvider) { >- ITreeContentProvider tcp = (ITreeContentProvider) cp; >- Object[] result = tcp.getChildren(parent); >- if (result != null) { >- return result; > } > } >+ return new Object[0]; >+ } finally { >+ busy = oldBusy; > } >- return new Object[0]; > } > > /** >@@ -2045,6 +2066,8 @@ > if (elementsOrTreePaths.length == 0) { > return; > } >+ if (isBusy()) >+ return; > preservingSelection(new Runnable() { > public void run() { > internalRemove(elementsOrTreePaths); >@@ -2075,6 +2098,8 @@ > if (elements.length == 0) { > return; > } >+ if (isBusy()) >+ return; > preservingSelection(new Runnable() { > public void run() { > internalRemove(parent, elements); >@@ -2227,6 +2252,9 @@ > */ > public void setExpandedElements(Object[] elements) { > assertElementsNotNull(elements); >+ if (isBusy()) { >+ return; >+ } > CustomHashtable expandedElements = newHashtable(elements.length * 2 + 1); > for (int i = 0; i < elements.length; ++i) { > Object element = elements[i]; >@@ -2261,6 +2289,8 @@ > */ > public void setExpandedTreePaths(TreePath[] treePaths) { > assertElementsNotNull(treePaths); >+ if (isBusy()) >+ return; > final IElementComparer comparer = getComparer(); > IElementComparer treePathComparer = new IElementComparer() { > >@@ -2303,6 +2333,8 @@ > */ > public void setExpandedState(Object elementOrTreePath, boolean expanded) { > Assert.isNotNull(elementOrTreePath); >+ if (isBusy()) >+ return; > Widget item = internalExpand(elementOrTreePath, false); > if (item instanceof Item) { > if (expanded) { >@@ -2787,7 +2819,8 @@ > int position) { > Assert.isNotNull(parentElementOrTreePath); > Assert.isNotNull(element); >- >+ if (isBusy()) >+ return; > if (getComparator() != null || hasFilters()) { > add(parentElementOrTreePath, new Object[] { element }); > return; >Index: src/org/eclipse/jface/viewers/TreeViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java,v >retrieving revision 1.86 >diff -u -r1.86 TreeViewer.java >--- src/org/eclipse/jface/viewers/TreeViewer.java 20 Apr 2007 20:07:17 -0000 1.86 >+++ src/org/eclipse/jface/viewers/TreeViewer.java 27 Apr 2007 04:06:26 -0000 >@@ -393,6 +393,8 @@ > * @since 3.2 > */ > public void setChildCount(final Object elementOrTreePath, final int count) { >+ if (isBusy()) >+ return; > preservingSelection(new Runnable() { > public void run() { > if (internalIsInputOrEmptyPath(elementOrTreePath)) { >@@ -434,6 +436,8 @@ > */ > public void replace(final Object parentElementOrTreePath, final int index, > final Object element) { >+ if (isBusy()) >+ return; > preservingSelection(new Runnable() { > public void run() { > Widget[] itemsToDisassociate; >@@ -508,19 +512,25 @@ > } > > protected Object getParentElement(Object element) { >- if (contentProviderIsLazy && !contentProviderIsTreeBased && !(element instanceof TreePath)) { >- ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider(); >- return lazyTreeContentProvider.getParent(element); >- } >- if (contentProviderIsLazy && contentProviderIsTreeBased && !(element instanceof TreePath)) { >- ILazyTreePathContentProvider lazyTreePathContentProvider = (ILazyTreePathContentProvider) getContentProvider(); >- TreePath[] parents = lazyTreePathContentProvider >- .getParents(element); >- if (parents != null && parents.length > 0) { >- return parents[0]; >- } >+ boolean oldBusy = busy; >+ busy = true; >+ try { >+ if (contentProviderIsLazy && !contentProviderIsTreeBased && !(element instanceof TreePath)) { >+ ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider(); >+ return lazyTreeContentProvider.getParent(element); >+ } >+ if (contentProviderIsLazy && contentProviderIsTreeBased && !(element instanceof TreePath)) { >+ ILazyTreePathContentProvider lazyTreePathContentProvider = (ILazyTreePathContentProvider) getContentProvider(); >+ TreePath[] parents = lazyTreePathContentProvider >+ .getParents(element); >+ if (parents != null && parents.length > 0) { >+ return parents[0]; >+ } >+ } >+ return super.getParentElement(element); >+ } finally { >+ busy = oldBusy; > } >- return super.getParentElement(element); > } > > protected void createChildren(Widget widget) { >@@ -770,6 +780,8 @@ > * @since 3.3 > */ > public void remove(final Object parentOrTreePath, final int index) { >+ if (isBusy()) >+ return; > final List oldSelection = new LinkedList(Arrays > .asList(((TreeSelection) getSelection()).getPaths())); > preservingSelection(new Runnable() { >@@ -864,6 +876,8 @@ > * @since 3.3 > */ > public void setHasChildren(final Object elementOrTreePath, final boolean hasChildren) { >+ if (isBusy()) >+ return; > preservingSelection(new Runnable() { > public void run() { > if (internalIsInputOrEmptyPath(elementOrTreePath)) { >@@ -903,27 +917,33 @@ > * @param index > */ > private void virtualLazyUpdateWidget(Widget widget, int index) { >- if (contentProviderIsTreeBased) { >- TreePath treePath; >- if (widget instanceof Item) { >- if (widget.getData() == null) { >- // we need to materialize the parent first >- // see bug 167668 >- // however, that would be too risky >- // see bug 182782 and bug 182598 >- // so we just ignore this call altogether >- // and don't do this: virtualMaterializeItem((TreeItem) widget); >- return; >+ boolean oldBusy = busy; >+ busy = false; >+ try { >+ if (contentProviderIsTreeBased) { >+ TreePath treePath; >+ if (widget instanceof Item) { >+ if (widget.getData() == null) { >+ // we need to materialize the parent first >+ // see bug 167668 >+ // however, that would be too risky >+ // see bug 182782 and bug 182598 >+ // so we just ignore this call altogether >+ // and don't do this: virtualMaterializeItem((TreeItem) widget); >+ return; >+ } >+ treePath = getTreePathFromItem((Item) widget); >+ } else { >+ treePath = TreePath.EMPTY; > } >- treePath = getTreePathFromItem((Item) widget); >+ ((ILazyTreePathContentProvider) getContentProvider()) >+ .updateElement(treePath, index); > } else { >- treePath = TreePath.EMPTY; >+ ((ILazyTreeContentProvider) getContentProvider()).updateElement( >+ widget.getData(), index); > } >- ((ILazyTreePathContentProvider) getContentProvider()) >- .updateElement(treePath, index); >- } else { >- ((ILazyTreeContentProvider) getContentProvider()).updateElement( >- widget.getData(), index); >+ } finally { >+ busy = oldBusy; > } > } > >@@ -933,17 +953,23 @@ > * @param currentChildCount > */ > private void virtualLazyUpdateChildCount(Widget widget, int currentChildCount) { >- if (contentProviderIsTreeBased) { >- TreePath treePath; >- if (widget instanceof Item) { >- treePath = getTreePathFromItem((Item) widget); >+ boolean oldBusy = busy; >+ busy = false; >+ try { >+ if (contentProviderIsTreeBased) { >+ TreePath treePath; >+ if (widget instanceof Item) { >+ treePath = getTreePathFromItem((Item) widget); >+ } else { >+ treePath = TreePath.EMPTY; >+ } >+ ((ILazyTreePathContentProvider) getContentProvider()) >+ .updateChildCount(treePath, currentChildCount); > } else { >- treePath = TreePath.EMPTY; >+ ((ILazyTreeContentProvider) getContentProvider()).updateChildCount(widget.getData(), currentChildCount); > } >- ((ILazyTreePathContentProvider) getContentProvider()) >- .updateChildCount(treePath, currentChildCount); >- } else { >- ((ILazyTreeContentProvider) getContentProvider()).updateChildCount(widget.getData(), currentChildCount); >+ } finally { >+ busy = oldBusy; > } > } > >@@ -953,19 +979,25 @@ > * @param currentChildCount > */ > private void virtualLazyUpdateHasChildren(Item item, int currentChildCount) { >- if (contentProviderIsTreeBased) { >- TreePath treePath; >- treePath = getTreePathFromItem(item); >- if (currentChildCount == 0) { >- // item is not expanded (but may have a plus currently) >- ((ILazyTreePathContentProvider) getContentProvider()) >- .updateHasChildren(treePath); >+ boolean oldBusy = busy; >+ busy = false; >+ try { >+ if (contentProviderIsTreeBased) { >+ TreePath treePath; >+ treePath = getTreePathFromItem(item); >+ if (currentChildCount == 0) { >+ // item is not expanded (but may have a plus currently) >+ ((ILazyTreePathContentProvider) getContentProvider()) >+ .updateHasChildren(treePath); >+ } else { >+ ((ILazyTreePathContentProvider) getContentProvider()) >+ .updateChildCount(treePath, currentChildCount); >+ } > } else { >- ((ILazyTreePathContentProvider) getContentProvider()) >- .updateChildCount(treePath, currentChildCount); >+ ((ILazyTreeContentProvider) getContentProvider()).updateChildCount(item.getData(), currentChildCount); > } >- } else { >- ((ILazyTreeContentProvider) getContentProvider()).updateChildCount(item.getData(), currentChildCount); >+ } finally { >+ busy = oldBusy; > } > } > >Index: src/org/eclipse/jface/viewers/AbstractTableViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java,v >retrieving revision 1.17 >diff -u -r1.17 AbstractTableViewer.java >--- src/org/eclipse/jface/viewers/AbstractTableViewer.java 26 Apr 2007 17:18:09 -0000 1.17 >+++ src/org/eclipse/jface/viewers/AbstractTableViewer.java 27 Apr 2007 04:06:21 -0000 >@@ -240,8 +240,10 @@ > */ > public void add(Object[] elements) { > assertElementsNotNull(elements); >+ if (isBusy()) >+ return; > Object[] filtered = filter(elements); >- >+ > for (int i = 0; i < filtered.length; i++) { > Object element = filtered[i]; > int index = indexForElement(element); >@@ -338,42 +340,48 @@ > * java.lang.Object, boolean) > */ > protected void doUpdateItem(Widget widget, Object element, boolean fullMap) { >- if (widget instanceof Item) { >- final Item item = (Item) widget; >- >- // remember element we are showing >- if (fullMap) { >- associate(element, item); >- } else { >- Object data = item.getData(); >- if (data != null) { >- unmapElement(data, item); >+ boolean oldBusy = busy; >+ busy = true; >+ try { >+ if (widget instanceof Item) { >+ final Item item = (Item) widget; >+ >+ // remember element we are showing >+ if (fullMap) { >+ associate(element, item); >+ } else { >+ Object data = item.getData(); >+ if (data != null) { >+ unmapElement(data, item); >+ } >+ item.setData(element); >+ mapElement(element, item); > } >- item.setData(element); >- mapElement(element, item); >- } >- >- int columnCount = doGetColumnCount(); >- if (columnCount == 0) >- columnCount = 1;// If there are no columns do the first one >- >- ViewerRow viewerRowFromItem = getViewerRowFromItem(item); >- // Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT - >- // TableViewer with 0 columns does not work >- for (int column = 0; column < columnCount || column == 0; column++) { >- ViewerColumn columnViewer = getViewerColumn(column); >- columnViewer.refresh(updateCell(viewerRowFromItem, >- column, element)); >- >- // As it is possible for user code to run the event >- // loop check here. >- if (item.isDisposed()) { >- unmapElement(element, item); >- return; >+ >+ int columnCount = doGetColumnCount(); >+ if (columnCount == 0) >+ columnCount = 1;// If there are no columns do the first one >+ >+ ViewerRow viewerRowFromItem = getViewerRowFromItem(item); >+ // Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT - >+ // TableViewer with 0 columns does not work >+ for (int column = 0; column < columnCount || column == 0; column++) { >+ ViewerColumn columnViewer = getViewerColumn(column); >+ columnViewer.refresh(updateCell(viewerRowFromItem, >+ column, element)); >+ >+ // As it is possible for user code to run the event >+ // loop check here. >+ if (item.isDisposed()) { >+ unmapElement(element, item); >+ return; >+ } >+ > } >- >+ > } >- >+ } finally { >+ busy = oldBusy; > } > } > >@@ -545,8 +553,11 @@ > protected void inputChanged(Object input, Object oldInput) { > getControl().setRedraw(false); > try { >- // refresh() attempts to preserve selection, which we want here >- refresh(); >+ preservingSelection(new Runnable() { >+ public void run() { >+ internalRefresh(getRoot()); >+ } >+ }); > } finally { > getControl().setRedraw(true); > } >@@ -577,7 +588,8 @@ > if (position == -1) { > position = doGetItemCount(); > } >- >+ if (isBusy()) >+ return; > createItem(element, position); > } > >@@ -722,7 +734,13 @@ > Object input = getInput(); > for (int i = 0; i < elements.length; ++i) { > if (equals(elements[i], input)) { >- setInput(null); >+ boolean oldBusy = busy; >+ busy = false; >+ try { >+ setInput(null); >+ } finally { >+ busy = oldBusy; >+ } > return; > } > } >@@ -772,6 +790,8 @@ > */ > public void remove(final Object[] elements) { > assertElementsNotNull(elements); >+ if (isBusy()) >+ return; > if (elements.length == 0) { > return; > } >@@ -965,6 +985,8 @@ > * @since 3.1 > */ > public void setItemCount(int count) { >+ if (isBusy()) >+ return; > int oldCount = doGetItemCount(); > if (count < oldCount) { > // need to disassociate elements that are being disposed >@@ -995,6 +1017,8 @@ > * @since 3.1 > */ > public void replace(Object element, int index) { >+ if (isBusy()) >+ return; > Item item = doGetItem(index); > refreshItem(item, element); > } >Index: src/org/eclipse/jface/viewers/ColumnViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java,v >retrieving revision 1.34 >diff -u -r1.34 ColumnViewer.java >--- src/org/eclipse/jface/viewers/ColumnViewer.java 4 Apr 2007 20:53:13 -0000 1.34 >+++ src/org/eclipse/jface/viewers/ColumnViewer.java 27 Apr 2007 04:06:24 -0000 >@@ -16,6 +16,9 @@ > > > import org.eclipse.core.runtime.Assert; >+import org.eclipse.core.runtime.IStatus; >+import org.eclipse.core.runtime.Status; >+import org.eclipse.jface.util.Policy; > import org.eclipse.swt.events.MouseAdapter; > import org.eclipse.swt.events.MouseEvent; > import org.eclipse.swt.graphics.Point; >@@ -48,6 +51,8 @@ > private ViewerCell cell = new ViewerCell(null, 0, null); > > private ColumnViewerEditor viewerEditor; >+ >+ /* package */ boolean busy; > > /** > * Create a new instance of the receiver. >@@ -56,6 +61,18 @@ > > } > >+ /* package */ boolean isBusy() { >+ if (busy) { >+ Policy.getLog().log( >+ new Status( >+ IStatus.WARNING, >+ Policy.JFACE, >+ "Ignoring reentrant call while viewer is busy", new RuntimeException())); //$NON-NLS-1$ >+ return true; >+ } >+ return false; >+ } >+ > protected void hookControl(Control control) { > super.hookControl(control); > viewerEditor = createViewerEditor(); >@@ -457,6 +474,24 @@ > } > return false; > } >+ >+ public void refresh(Object element) { >+ if (isBusy()) >+ return; >+ super.refresh(element); >+ } >+ >+ public void refresh(Object element, boolean updateLabels) { >+ if (isBusy()) >+ return; >+ super.refresh(element, updateLabels); >+ } >+ >+ public void update(Object element, String[] properties) { >+ if (isBusy()) >+ return; >+ super.update(element, properties); >+ } > > /** > * Sets the cell editors of this column viewer. If editing is not supported >@@ -590,4 +625,14 @@ > public ColumnViewerEditor getColumnViewerEditor() { > return viewerEditor; > } >+ >+ protected Object[] getRawChildren(Object parent) { >+ boolean oldBusy = busy; >+ busy = true; >+ try { >+ return super.getRawChildren(parent); >+ } finally { >+ busy = oldBusy; >+ } >+ } > } >Index: src/org/eclipse/jface/viewers/StructuredViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredViewer.java,v >retrieving revision 1.65 >diff -u -r1.65 StructuredViewer.java >--- src/org/eclipse/jface/viewers/StructuredViewer.java 23 Apr 2007 19:50:28 -0000 1.65 >+++ src/org/eclipse/jface/viewers/StructuredViewer.java 27 Apr 2007 04:06:25 -0000 >@@ -1976,7 +1976,11 @@ > } > } > if (needsRefilter) { >- refresh(); >+ preservingSelection(new Runnable() { >+ public void run() { >+ internalRefresh(getRoot()); >+ } >+ }); > return; > } >
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 Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 154571
:
62175
|
62287
| 65145