I have a fairly large tree in the database, loading all items and adding them to a HierarchicalContainer on startup performs poorly.
Instead I want to load the children of tree items on click.
Well actually a bit earlier, since I don't want areChildrenAllowed() or hasChildren() to return the wrong value.
I hoped to find something like in JFace TreeViewer is used ITreeContentProvider.
Is there any example or best practice description of this topic?
This is what I got so far:
public class OutputNodeContainer extends HierarchicalContainer {
/** the view service */
private IViewService service = CommonPlugin.getService(IViewService.class);
private List<Object> childrenRead = new ArrayList<>();
@Override
public boolean areChildrenAllowed(Object itemId) {
if (!childrenRead.contains(itemId)) {
OutputNode node = (OutputNode) itemId;
List<OutputNode> children = service.getChildren(node.getNodeId(), false);
for (OutputNode child : children) {
addItem(child);
setParent(child, itemId);
}
childrenRead.add(itemId);
return !children.isEmpty();
}
return super.areChildrenAllowed(itemId);
}
}
But on addItem(child); I run into this exception:
java.lang.IllegalStateException: A connector should not be marked as dirty while a response is being written.
at com.vaadin.ui.ConnectorTracker.markDirty(ConnectorTracker.java:489)
at com.vaadin.server.AbstractClientConnector.markAsDirty(AbstractClientConnector.java:143)
at com.vaadin.ui.Tree.markAsDirty(Tree.java:348)
at com.vaadin.ui.AbstractSelect.fireItemSetChange(AbstractSelect.java:1746)
at com.vaadin.ui.AbstractSelect.containerItemSetChange(AbstractSelect.java:1713)
at com.vaadin.ui.Tree.containerItemSetChange(Tree.java:992)
at com.vaadin.data.util.AbstractContainer.fireItemSetChange(AbstractContainer.java:246)
at com.vaadin.data.util.HierarchicalContainer.fireItemSetChange(HierarchicalContainer.java:436)
at com.vaadin.data.util.IndexedContainer.fireItemSetChange(IndexedContainer.java:640)
at com.vaadin.data.util.HierarchicalContainer.enableAndFireContentsChangeEvents(HierarchicalContainer.java:460)
at com.vaadin.data.util.HierarchicalContainer.addItem(HierarchicalContainer.java:489)
at ch.scodi.vaadin.viewer.OutputNodeContainer.areChildrenAllowed(OutputNodeContainer.java:78)
at com.vaadin.ui.Tree.areChildrenAllowed(Tree.java:864)
at com.vaadin.ui.Tree.paintContent(Tree.java:732)
at com.vaadin.server.LegacyPaint.paint(LegacyPaint.java:65)
at com.vaadin.server.communication.LegacyUidlWriter.write(LegacyUidlWriter.java:82)
at com.vaadin.server.communication.UidlWriter.write(UidlWriter.java:143)
at com.vaadin.server.communication.UIInitHandler.getInitialUidl(UIInitHandler.java:284)
at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:80)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1422)
... 63 common frames omitted