package jas2.util.tree;
import java.util.*;
/**
* An OrderedNode is a node which may order its children by something
* other than natural order, using a Comparator. An OrderedNode uses the
* same ordering as its parent, unless it has an explicit comparator set.
*/
public class OrderedNode extends SimpleNode
{
public OrderedNode()
{
super();
}
public OrderedNode(String name, String type, int flags, Object object)
{
super(name,type,flags,object);
}
public OrderedNode(SimpleNode parent, String name, String type, int flags, Object object)
{
super(parent,name,type,flags,object);
}
protected SimpleNode createNode(SimpleNode parent, String name, String type, int flags, Object object)
{
return new OrderedNode(parent,name,type,flags,object);
}
protected void addChild(SimpleNode child)
{
if (getEffectiveOrder() != null)
{
if (orderedList == null) orderedList = createOrderedList(Collections.singleton(child));
else
{
int ip = Collections.binarySearch(orderedList,child,getEffectiveOrder());
System.out.println("ip="+ip);
if (ip < 0) ip = -ip - 1;
orderedList.add(ip,child);
}
}
// Must go after orderedList is updated, since may trigger tree redraw
super.addChild(child);
}
protected void removeChild(SimpleNode child)
{
super.removeChild(child);
if (orderedList != null) orderedList.remove(child);
}
public SimpleNode getChild(int index)
{
if (orderedList != null) return (SimpleNode) orderedList.get(index);
return super.getChild(index);
}
public int getIndexOfChild(Object child)
{
if (orderedList != null) return Collections.binarySearch(orderedList,child,getEffectiveOrder());
return super.getIndexOfChild(child);
}
public int getNaturalIndex()
{
return getParent().children.indexOf(this);
}
/**
* Override to use a different List implementation for the ordered list
*/
protected List createOrderedList(Collection c)
{
return new ArrayList(c);
}
/**
* Set a specific ordering, or null to use the parents ordering, or
* DEFAULT_ORDER to use the default ordering.
*/
public void setOrder(Comparator comp)
{
if (this.comp != comp)
{
this.comp = comp;
notifyOrderChanged();
}
}
public void clearOrder()
{
setOrder(null);
}
private void notifyOrderChanged()
{
orderChanged();
treeChanged(SimpleNodeListener.STRUCTURE_CHANGED);
}
private void orderChanged()
{
Comparator comp = getEffectiveOrder();
if (comp == null) orderedList = null;
else
{
orderedList = createOrderedList(children == null ? Collections.EMPTY_LIST : children.elements());
Collections.sort(orderedList,comp);
}
// Tell any children that are OrderedNodes and which dont have their own explicit
// ordering that the order has changed
if (children != null)
{
Iterator iter = children.elements().iterator();
while (iter.hasNext())
{
Object o = iter.next();
if (o instanceof OrderedNode)
{
OrderedNode on = (OrderedNode) o;
if (on.comp == null) on.orderChanged();
}
}
}
}
public Comparator getOrder()
{
return comp;
}
private Comparator getEffectiveOrder()
{
if (comp != null) return comp;
if (comp == DEFAULT_ORDER) return null;
SimpleNode parent = getParent();
if (parent instanceof OrderedNode) return ((OrderedNode) parent).getEffectiveOrder();
return null;
}
private List orderedList;
private Comparator comp;
public static final Comparator DEFAULT_ORDER = new Comparator()
{
public boolean equals() { return false; }
public int compare(Object o1, Object o2) { return 0; }
};
}
Ads help maintain this website.