Design Pattern Java

/*
The Design Patterns Java Companion
Copyright (C) 1998, by James W. Cooper
IBM Thomas J. Watson Research Center
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.border.BevelBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
public class EmpTree extends JFrame implements TreeSelectionListener {
  Employee boss, marketVP, prodVP;
  Employee salesMgr, advMgr;
  Employee prodMgr, shipMgr;
  JScrollPane sp;
  JPanel treePanel;
  JTree tree;
  DefaultMutableTreeNode troot;
  JLabel cost;
  public EmpTree() {
    super("Employee tree");
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    makeEmployees();
    setGUI();
  }
  //--------------------------------------
  private void setGUI() {
    treePanel = new JPanel();
    getContentPane().add(treePanel);
    treePanel.setLayout(new BorderLayout());
    sp = new JScrollPane();
    treePanel.add("Center", sp);
    treePanel.add("South", cost = new JLabel("          "));
    treePanel.setBorder(new BevelBorder(BevelBorder.RAISED));
    troot = new DefaultMutableTreeNode(boss.getName());
    tree = new JTree(troot);
    tree.setBackground(Color.lightGray);
    loadTree(boss);
    /* Put the Tree in a scroller. */
    sp.getViewport().add(tree);
    setSize(new Dimension(200, 300));
    setVisible(true);
  }
  //------------------------------------
  public void loadTree(Employee topDog) {
    DefaultMutableTreeNode troot;
    troot = new DefaultMutableTreeNode(topDog.getName());
    treePanel.remove(tree);
    tree = new JTree(troot);
    tree.addTreeSelectionListener(this);
    sp.getViewport().add(tree);
    addNodes(troot, topDog);
    tree.expandRow(0);
    repaint();
  }
  //--------------------------------------
  private void addNodes(DefaultMutableTreeNode pnode, Employee emp) {
    DefaultMutableTreeNode node;
    Enumeration e = emp.elements();
    while (e.hasMoreElements()) {
      Employee newEmp = (Employee) e.nextElement();
      node = new DefaultMutableTreeNode(newEmp.getName());
      pnode.add(node);
      addNodes(node, newEmp);
    }
  }
  //--------------------------------------
  private void makeEmployees() {
    boss = new Employee("CEO", 200000);
    boss.add(marketVP = new Employee("Marketing VP", 100000));
    boss.add(prodVP = new Employee("Production VP", 100000));
    marketVP.add(salesMgr = new Employee("Sales Mgr", 50000));
    marketVP.add(advMgr = new Employee("Advt Mgr", 50000));
    for (int i = 0; i < 5; i++)
      salesMgr.add(new Employee("Sales " + new Integer(i).toString(),
          30000.0F + (float) (Math.random() - 0.5) * 10000));
    advMgr.add(new Employee("Secy", 20000));
    prodVP.add(prodMgr = new Employee("Prod Mgr", 40000));
    prodVP.add(shipMgr = new Employee("Ship Mgr", 35000));
    for (int i = 0; i < 4; i++)
      prodMgr.add(new Employee("Manuf " + new Integer(i).toString(),
          25000.0F + (float) (Math.random() - 0.5) * 5000));
    for (int i = 0; i < 3; i++)
      shipMgr.add(new Employee("ShipClrk " + new Integer(i).toString(),
          20000.0F + (float) (Math.random() - 0.5) * 5000));
  }
  //--------------------------------------
  public void valueChanged(TreeSelectionEvent evt) {
    TreePath path = evt.getPath();
    String selectedTerm = path.getLastPathComponent().toString();
    Employee emp = boss.getChild(selectedTerm);
    if (emp != null)
      cost.setText(new Float(emp.getSalaries()).toString());
  }
  //--------------------------------------
  static public void main(String argv[]) {
    new EmpTree();
  }
}
class Employee {
  String name;
  float salary;
  Vector subordinates;
  boolean isLeaf;
  Employee parent = null;
  //--------------------------------------
  public Employee(String _name, float _salary) {
    name = _name;
    salary = _salary;
    subordinates = new Vector();
    isLeaf = false;
  }
  //--------------------------------------
  public Employee(Employee _parent, String _name, float _salary) {
    name = _name;
    salary = _salary;
    parent = _parent;
    subordinates = new Vector();
    isLeaf = false;
  }
  //--------------------------------------
  public void setLeaf(boolean b) {
    isLeaf = b; //if true, do not allow children
  }
  //--------------------------------------
  public float getSalary() {
    return salary;
  }
  //--------------------------------------
  public String getName() {
    return name;
  }
  //--------------------------------------
  public boolean add(Employee e) {
    if (!isLeaf)
      subordinates.addElement(e);
    return isLeaf; //false if unsuccessful
  }
  //--------------------------------------
  public void remove(Employee e) {
    if (!isLeaf)
      subordinates.removeElement(e);
  }
  //--------------------------------------
  public Enumeration elements() {
    return subordinates.elements();
  }
  //--------------------------------------
  public Employee getChild(String s) {
    Employee newEmp = null;
    if (getName().equals(s))
      return this;
    else {
      boolean found = false;
      Enumeration e = elements();
      while (e.hasMoreElements() && (!found)) {
        newEmp = (Employee) e.nextElement();
        found = newEmp.getName().equals(s);
        if (!found) {
          newEmp = newEmp.getChild(s);
          found = (newEmp != null);
        }
      }
      if (found)
        return newEmp;
      else
        return null;
    }
  }
  //--------------------------------------
  public float getSalaries() {
    float sum = salary;
    for (int i = 0; i < subordinates.size(); i++) {
      sum += ((Employee) subordinates.elementAt(i)).getSalaries();
    }
    return sum;
  }
}