package util; import java.util.Comparator; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; public class SortTreeModel extends DefaultTreeModel { private static final long serialVersionUID = 4158144157825991735L; private Comparator<DefaultMutableTreeNode> comparator; public SortTreeModel( DefaultMutableTreeNode node, Comparator<DefaultMutableTreeNode> c ) { super( node ); comparator = c; } public SortTreeModel( DefaultMutableTreeNode node, boolean asksAllowsChildren, Comparator<DefaultMutableTreeNode> c ) { super( node, asksAllowsChildren ); comparator = c; } public void insertNodeInto( DefaultMutableTreeNode child, DefaultMutableTreeNode parent ) { int index = findIndexFor( child, parent ); super.insertNodeInto( child, parent, index ); } private int findIndexFor( DefaultMutableTreeNode child, DefaultMutableTreeNode parent ) { int cc = parent.getChildCount(); if ( cc == 0 ) { return 0; } if ( cc == 1 ) { return comparator.compare( child, (DefaultMutableTreeNode) parent.getChildAt( 0 ) ) <= 0 ? 0 : 1; } return findIndexFor( child, parent, 0, cc - 1 ); } private int findIndexFor( DefaultMutableTreeNode child, DefaultMutableTreeNode parent, int i1, int i2 ) { if ( i1 == i2 ) { return comparator.compare( child, (DefaultMutableTreeNode) parent.getChildAt( i1 ) ) <= 0 ? i1 : i1 + 1; } int half = ( i1 + i2 ) / 2; if ( comparator.compare( child, (DefaultMutableTreeNode) parent.getChildAt( half ) ) <= 0 ) { return findIndexFor( child, parent, i1, half ); } return findIndexFor( child, parent, half + 1, i2 ); } }