/******************************************************************************* * Copyright (c) 2005-2008, G. Weirich and Elexis * 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: * G. Weirich - initial implementation * *******************************************************************************/ package ch.rgw.tools; import java.util.Collection; import java.util.Comparator; /** * Ein Tree, der seine Children erst bei Bedarf lädt. Dazu muss ein LazyTreeListener übergeben * werden, der die Children liefern muss. * * @author gerry * */ public class LazyTree<T> extends Tree<T> { LazyTreeListener listen; public LazyTree(Tree<T> p, T elem, LazyTreeListener l, Comparator<T> comp){ super(p, elem, comp); listen = l; } public LazyTree(Tree<T> p, T elem, LazyTreeListener l){ super(p, elem); listen = l; } public LazyTree(Tree<T> p, T elem, IFilter f, LazyTreeListener l){ super(p, elem, f); listen = l; } public Collection<Tree<T>> getChildren(){ loadChildren(); return super.getChildren(); } public boolean hasChildren(){ if (first == null) { return (listen == null ? false : listen.hasChildren(this)); } return true; } public LazyTree<T> add(T elem, LazyTreeListener l){ LazyTree<T> ret = new LazyTree<T>(this, elem, filter, l); return ret; } // Stack Overflow?? //TODO private void loadChildren(){ if ((first == null) && (listen != null)) { listen.fetchChildren(this); } } public Tree<T> getFirstChild(){ loadChildren(); return first; } public interface LazyTreeListener { /** * fetch children of this node. * * @param l * @return true if children were added */ public boolean fetchChildren(LazyTree<?> l); /** * return true if this node has children * * @param l * @return */ public boolean hasChildren(LazyTree<?> l); } @SuppressWarnings("unchecked")//$NON-NLS-1$ @Override public synchronized Tree move(Tree newParent){ if (!(newParent instanceof LazyTree)) { preload(); } return super.move(newParent); } public Tree preload(){ loadChildren(); for (Tree child = first; child != null; child = child.next) { if (child instanceof LazyTree) { ((LazyTree) child).preload(); } } return this; } }