tree.py

#!/usr/bin/jython
# tree.py -- demo of JTree in Jython

import java.lang
import javax.swing
import javax.swing.tree
import javax.swing.event
import java.util
import java.awt
import java.awt.event

def makeSampleTree():
    """Create some data for our tree."""
    data = \
        ["World",
            [ "Canada",
                [ "Ontario", 
                    [ "London", ],],
                [ "Quebec", 
                    [ "Montreal", ],],
                [ "Newfoundland",],
                [ "Labrador",],
                [ "Nova Scotia", 
                    [ "Halifax", ],],
                [ "Saskatchewan",],
                [ "British Columbia",],
                [ "Manitoba",],
                [ "Yukon",], ],
            [ "USA",
                [ "Delaware", 
                    [ "Wilmington", ],
                    [ "Newark", ],
                    [ "Dover", ],
                    [ "Georgetown", ], ],
                [ "Maryland", 
                    [ "Annapolis", ],
                    [ "Baltimore", ],
                    [ "Frederick", ],
                    [ "Havre de Grace", ],
                    [ "Elkton", ], ],
                [ "Virginia",
                    [ "Richmond", ],
                    [ "Roanoke", ], ],
                [ "Pennsylvania",
                    [ "Pittsburgh", ],
                    [ "Harrisburg", ],
                    [ "Philadelphia", ], ],
                [ "New Jersey",
                    [ "Trenton", ],
                    [ "Cherry Hill", ],
                    [ "Newark", ],
                    [ "Piscataway", ],
                    [ "New Brunswick", ], ],
                [ "Maine", 
                    [ "Portland", ], 
                    [ "Kennebunkport", ], ],
                [ "Connecticut", 
                    [ "Hartford", ], ],
                [ "Idaho", 
                    [ "Sandpoint", ],
                    [ "Idaho Falls", ],
                    [ "Coeur d'Alene", ], ], 
                [ "Washington",
                    [ "Seattle", ],
                    [ "Spokane", ], ],
                [ "Colorado",
                    [ "Denver", ],
                    [ "Breckenridge", ],
                    [ "Vail", ],
                    [ "Boulder", ],
                    [ "Fort Collins", ],
                    [ "Colorado Springs", ], ],
                [ "Montana", ],
                [ "Nevada", ],
                [ "Hawaii", ], ], 
            [ "Germany",
                [ "Schleswig-Holstein", [ "Kiel", ], ], ], ]
    tfunc = javax.swing.tree.DefaultMutableTreeNode
    root = tfunc(data[0])
    root.setAllowsChildren(1)
    for crec in data[1:]:
        country = tfunc(crec[0])
        root.add(country)
        country.setAllowsChildren(1)
        for srec in crec[1:]:
            state = tfunc(srec[0])
            country.add(state)
            state.setAllowsChildren(1)
            for lrec in srec[1:]:
                city = tfunc(lrec[0])
                state.add(city)
                city.setAllowsChildren(0)
    return root


def exit(event):
    """Exit the JVM."""
    java.lang.System.exit(0)

def delAction(e):
    global model,mytree
    selNode = mytree.getLastSelectedPathComponent()
    if selNode is None or selNode.getParent() is None:
        return
    model.removeNodeFromParent(selNode)

def enumAction(e):
    global model,mytree
    selNode = mytree.getLastSelectedPathComponent()
    if selNode is None:
        return
    print "\nEnumerating..."
    x = model.getPathToRoot(selNode)
    level = len(x)
    pot = selNode.preorderEnumeration()
    while pot.hasMoreElements():
        tn = pot.nextElement()
        x = model.getPathToRoot(tn)
        blanks = " "*40
        print blanks[:3*(len(x)-level)],tn

def vchange(e):
    global model,mytree
    tp = mytree.getSelectionPaths()
    if tp is None:
        return
    print "\nTree selections(s):"
    for path in tp:
        print "   ",path

# ----------------------------------------------------------------------

win = javax.swing.JFrame("Tree demo", \
    size=(200,500),windowClosing=exit)

root = makeSampleTree()
model = javax.swing.tree.DefaultTreeModel(root)
model.setAsksAllowsChildren(1);
mytree = javax.swing.JTree(model,valueChanged=vchange)
s = javax.swing.JScrollPane(mytree)
win.contentPane.add(s,java.awt.BorderLayout.CENTER)

panel2 = javax.swing.JPanel()
enumButton = javax.swing.JButton("Enumerate",actionPerformed=enumAction)
delButton = javax.swing.JButton("Delete",actionPerformed=delAction)
exitButton = javax.swing.JButton("Exit",actionPerformed=exit)
panel2.add(enumButton)
panel2.add(delButton)
panel2.add(exitButton)
win.contentPane.add(panel2,java.awt.BorderLayout.SOUTH)

win.pack()
win.show()