ILazyTreeContentProvider: AssertionFailedException after changing model [message #631139] |
Wed, 06 October 2010 10:18 |
Yury Chernikov Messages: 9 Registered: July 2009 |
Junior Member |
|
|
Hi,
I implement ILazyTreeContentProvider,
after some user actions I update a tree model, but if user have selected an element from the tree, AssertionFailedException occurs,
below I write simple snippet that reproduce the problem.
Test case:
Run snippet, select 'Leaf 20', click to 'Update' button.
Original model is:
Root
Top level 0
Top level 1
Top level 2
Leaf 20
Leaf 21
Leaf 22
Top level 3
Leaf 30
Leaf 31
Leaf 32
Top level 4
Leaf 40
Leaf 41
Leaf 42
updated model is:
Root
Top level 2
Leaf 20
Top level 3
Leaf 30
Top level 4
Leaf 40
the exception is:
Exception in thread "main" org.eclipse.core.runtime.AssertionFailedException: null argument:
at org.eclipse.core.runtime.Assert.isNotNull(Assert.java:85)
at org.eclipse.core.runtime.Assert.isNotNull(Assert.java:73)
at org.eclipse.jface.viewers.AbstractTreeViewer.getTreePathFrom Item(AbstractTreeViewer.java:2694)
at org.eclipse.jface.viewers.AbstractTreeViewer.getSelection(Ab stractTreeViewer.java:2716)
at org.eclipse.jface.viewers.TreeViewer.replace(TreeViewer.java :468)
at TreeSnippet$MyContentProvider.updateElement(TreeSnippet.java :99)
at org.eclipse.jface.viewers.TreeViewer.virtualLazyUpdateWidget (TreeViewer.java:1050)
at org.eclipse.jface.viewers.TreeViewer.access$2(TreeViewer.jav a:1027)
at org.eclipse.jface.viewers.TreeViewer$2.handleEvent(TreeViewe r.java:291)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java :84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
at org.eclipse.swt.widgets.Tree.checkData(Tree.java:1641)
at org.eclipse.swt.widgets.Tree.checkData(Tree.java:1620)
at org.eclipse.swt.widgets.TreeItem.getItems(TreeItem.java:786)
at org.eclipse.jface.viewers.TreeViewer.getChildren(TreeViewer. java:168)
at org.eclipse.jface.viewers.AbstractTreeViewer.internalFindIte m(AbstractTreeViewer.java:1666)
at org.eclipse.jface.viewers.AbstractTreeViewer.doFindItem(Abst ractTreeViewer.java:830)
at org.eclipse.jface.viewers.StructuredViewer.findItems(Structu redViewer.java:804)
at org.eclipse.jface.viewers.AbstractTreeViewer.internalGetWidg etToSelect(AbstractTreeViewer.java:1579)
at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand( AbstractTreeViewer.java:1485)
at org.eclipse.jface.viewers.AbstractTreeViewer.setSelectionToW idget(AbstractTreeViewer.java:2299)
at org.eclipse.jface.viewers.AbstractTreeViewer.setSelectionToW idget(AbstractTreeViewer.java:2725)
at org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1429)
at org.eclipse.jface.viewers.TreeViewer.preservingSelection(Tre eViewer.java:403)
at org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1383)
at org.eclipse.jface.viewers.StructuredViewer.refresh(Structure dViewer.java:1485)
at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer. java:537)
at org.eclipse.jface.viewers.StructuredViewer.refresh(Structure dViewer.java:1444)
at TreeSnippet$1.widgetSelected(TreeSnippet.java:37)
Snippet code is:
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ILazyTreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class TreeSnippet {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
GridLayoutFactory.fillDefaults().applyTo(shell);
Button b1 = new Button(shell, SWT.PUSH);
GridDataFactory.fillDefaults().applyTo(b1);
b1.setText("Update");
final TreeViewer treeViewer = new TreeViewer(shell, SWT.VIRTUAL | SWT.BORDER | SWT.MULTI);
GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getControl());
treeViewer.setContentProvider(new MyContentProvider());
treeViewer.setLabelProvider(new LabelProvider());
b1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateModel((TreeNode) treeViewer.getInput());
treeViewer.refresh();
}
});
treeViewer.setInput(getInitialModel());
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
/*
* defines initial version of the model
*/
private static TreeNode getInitialModel() {
TreeNode result = new TreeNode(null, "Root");
new TreeNode(result, "Top level " + 0);
new TreeNode(result, "Top level " + 1);
for (int i = 2; i < 5; i++) {
TreeNode tl = new TreeNode(result, "Top level " + i);
for (int j = 0; j < 3; j++) {
new TreeNode(tl, "Leaf " + i + "" + j);
}
}
return result;
}
/*
* changes the model
*/
private static void updateModel(TreeNode model) {
for (int j = 2; j < 5; j++) {
for (int i = 2; i > 0; i--) {
model.children.get(j).children.remove(i);
}
}
model.children.remove(0);
model.children.remove(0);
}
private static final class MyContentProvider implements ILazyTreeContentProvider {
private TreeViewer treeViewer;
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
treeViewer = (TreeViewer) viewer;
treeViewer.refresh();
}
@Override
public void updateElement(Object parent, int index) {
TreeNode node = (TreeNode) parent;
if (index < node.children.size()) {
TreeNode element = node.children.get(index);
treeViewer.replace(parent, index, element);
updateChildCount(element, -1);
}
}
@Override
public void updateChildCount(Object element, int currentChildCount) {
TreeNode node = (TreeNode) element;
int size = node.children.size();
treeViewer.setChildCount(element, size);
}
@Override
public Object getParent(Object element) {
return ((TreeNode) element).parent;
}
}
/**
* Model for the viewer.
*/
private static class TreeNode {
private String value;
private final List<TreeNode> children = new ArrayList<TreeSnippet.TreeNode>();
private final TreeNode parent;
public TreeNode(TreeNode parent, String value) {
this.parent = parent;
this.value = value;
if (parent != null) {
parent.children.add(this);
}
}
@Override
public String toString() {
return value;
}
}
}
It looks like after disassociation of the parent element ('Top level 2') getSelection() method try to calculate path of the selected child element ('Leaf 20') and in this case we see the exception.
Could you help me avoid this problem?
Thanks.
|
|
|
Powered by
FUDForum. Page generated in 0.02832 seconds