psmith 2003/09/01 15:34:13 Modified: src/java/org/apache/log4j/chainsaw LogPanelLoggerTreeModel.java Log: Ensured that all Child nodes appear in case insensitive sorted order. Revision Changes Path 1.4 +64 -68 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanelLoggerTreeModel.java Index: LogPanelLoggerTreeModel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanelLoggerTreeModel.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- LogPanelLoggerTreeModel.java 1 Sep 2003 03:57:33 -0000 1.3 +++ LogPanelLoggerTreeModel.java 1 Sep 2003 22:34:13 -0000 1.4 @@ -54,6 +54,8 @@ import java.awt.Container; import java.awt.Dimension; +import java.util.Collections; +import java.util.Comparator; import java.util.Enumeration; import java.util.StringTokenizer; @@ -62,7 +64,9 @@ import javax.swing.SwingUtilities; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; +import javax.swing.tree.MutableTreeNode; + +import org.apache.log4j.helpers.LogLog; /** @@ -73,15 +77,23 @@ */ class LogPanelLoggerTreeModel extends DefaultTreeModel implements LoggerNameListener { - LogPanelLoggerTreeModel() { - super(new DefaultMutableTreeNode("Root Logger")); + super(new LogPanelTreeNode("Root Logger")); } /* (non-Javadoc) * @see org.apache.log4j.chainsaw.LoggerNameListener#loggerNameAdded(java.lang.String) */ - public void loggerNameAdded(String loggerName) { + public void loggerNameAdded(final String loggerName) { + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + addLoggerNameInDispatchThread(loggerName); + } + }); + } + + private void addLoggerNameInDispatchThread(final String loggerName) { String[] packages = tokenize(loggerName); /** @@ -91,31 +103,33 @@ */ DefaultMutableTreeNode current = (DefaultMutableTreeNode) getRoot(); + /** * This label is used to break out when descending the * current tree hierachy, and it has matched a package name * with an already existing TreeNode. */ -outerFor: for (int i = 0; i < packages.length; i++) { +outerFor: + for (int i = 0; i < packages.length; i++) { String packageName = packages[i]; Enumeration enum = current.children(); + while (enum.hasMoreElements()) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) enum.nextElement(); String childName = child.getUserObject().toString(); if (childName.equals(packageName)) { - /** * This the current known branch to descend */ current = child; + /** * we've found it, so break back to the outer * for loop to continue processing further * down the tree */ - continue outerFor; } } @@ -124,30 +138,31 @@ * So we haven't found this index in the current children, * better create the child */ - DefaultMutableTreeNode newChild = - new DefaultMutableTreeNode(packageName); - current.add(newChild); - - final TreeNode changedNode = current; - final int[] changedIndices = new int[]{current.getIndex(newChild)}; - SwingUtilities.invokeLater(new Runnable(){ - - public void run() - { - nodesWereInserted(changedNode, changedIndices); - - }}); + final LogPanelTreeNode newChild = new LogPanelTreeNode(packageName); + + final DefaultMutableTreeNode changedNode = current; + + changedNode.add(newChild); + + final int[] changedIndices = new int[changedNode.getChildCount()]; + + for (int j = 0; j < changedIndices.length; j++) { + changedIndices[j] = j; + } + + nodesWereInserted(changedNode, new int[]{changedNode.getIndex(newChild)}); + nodesChanged(changedNode, changedIndices); current = newChild; } } /** - * Takes the loggerName and tokenizes it into it's - * package name lements returning the elements - * via the Stirng[] - * @param loggerName - * @return array of strings representing the package hierarchy - */ + * Takes the loggerName and tokenizes it into it's + * package name lements returning the elements + * via the Stirng[] + * @param loggerName + * @return array of strings representing the package hierarchy + */ private String[] tokenize(String loggerName) { StringTokenizer tok = new StringTokenizer(loggerName, "."); @@ -162,48 +177,29 @@ return tokens; } - public static void main(String[] args) { - try { - JFrame frame = new JFrame("TestBed"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - Container container = frame.getContentPane(); - - final LogPanelLoggerTreeModel model = new LogPanelLoggerTreeModel(); - JTree tree = new JTree(model); - - container.add(tree); - - frame.pack(); - frame.setSize(new Dimension(640,480)); - frame.setVisible(true); - - Thread.sleep(2000); - - final String[] packageNames = - new String[] { - "org.apache.log4j.chainsaw", - "org.apache.log4j", - "au.com.lawlex", - "org", - "org.apache.log4j.chainsaw.prefs", - "com.mycompany", - "org.apache.joran", - }; - - final int delay = 500; - - for (int i = 0; i < packageNames.length; i++) { - final int index = i; - SwingUtilities.invokeLater( - new Runnable() { - public void run() { - model.loggerNameAdded(packageNames[index]); - } - }); - } - } catch (Exception e) { - e.printStackTrace(); + private static class LogPanelTreeNode extends DefaultMutableTreeNode { + protected static Comparator nodeComparator = + new Comparator() { + public int compare(Object o1, Object o2) { + return o1.toString().compareToIgnoreCase(o2.toString()); + } + + public boolean equals(Object obj) { + return false; + } + }; + + private LogPanelTreeNode(String logName) { + super(logName); + } + + public void insert(MutableTreeNode newChild, int childIndex) { +// LogLog.debug("[" + this.getUserObject() + "] inserting child " + newChild + " @ index " + childIndex); +// LogLog.debug("Children now: " + this.children); + super.insert(newChild, childIndex); +// LogLog.debug("Children after insert: " + this.children); + Collections.sort(this.children, nodeComparator); +// LogLog.debug("Children after sort: " + this.children); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]