Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » JFace » ILazyTreeContentProvider: AssertionFailedException after changing model
ILazyTreeContentProvider: AssertionFailedException after changing model [message #631139] Wed, 06 October 2010 10:18
Yury Chernikov is currently offline Yury ChernikovFriend
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.
Previous Topic:Data getting truncated in TableViewer
Next Topic:packing a dialog to the correct size
Goto Forum:
  


Current Time: Tue Apr 23 15:49:59 GMT 2024

Powered by FUDForum. Page generated in 0.02832 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top