// Import the java classes used in applets
import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JTree;
import javax.swing.JApplet;
import javax.swing.event.*;
import javax.swing.tree.*;
import javax.swing.JScrollPane;

public class TreeApplet extends JApplet
{
  DefaultMutableTreeNode fahrzeug = new DefaultMutableTreeNode("Fahrzeug");
  DefaultMutableTreeNode auto = new DefaultMutableTreeNode("Auto");
  DefaultMutableTreeNode boot = new DefaultMutableTreeNode("Boot");
  DefaultMutableTreeNode fahrrad = new DefaultMutableTreeNode("Fahrrad");
  DefaultMutableTreeNode opel = new DefaultMutableTreeNode("Opel");
  DefaultMutableTreeNode mercedes = new DefaultMutableTreeNode("Mercedes");
  DefaultMutableTreeNode kalkhof = new DefaultMutableTreeNode("Kalkhof");

  // The button to push for executing the query
  Button b1 = new Button ("Neu: Thesaurusbegriff");
  Button b2 = new Button ("Löschen: Thesaurusbegriff");
  Box box = Box.createVerticalBox();

  DefaultMutableTreeNode root = createThesaurus();
  // Hierarchical display of the thesaurus
  final JTree tree = new JTree (root);
  DefaultTreeModel thesaurus = (DefaultTreeModel) tree.getModel();
  DefaultMutableTreeNode selectedTreeNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); 
  // Create the User Interface
  public void init ()
  {
    getContentPane().setLayout(new GridLayout());
    
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.addTreeSelectionListener(new TreeSelectionListener() {
          public void valueChanged(TreeSelectionEvent e) {
              selectedTreeNode = (DefaultMutableTreeNode)
                                 tree.getLastSelectedPathComponent();
              if (selectedTreeNode == null) return;
              Object nodeInfo = selectedTreeNode.getUserObject();
          }
    });

    JScrollPane treeView = new JScrollPane(tree);
    Dimension minimumSize = new Dimension(100, 50);
    treeView.setMinimumSize(minimumSize);

    box.add(b1); box.add(Box.createGlue());
    box.add(b2); box.add(Box.createGlue());
    
    getContentPane().add("West", treeView);
    getContentPane().add("East", box);
    setVisible(true);

    b1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        new_action(e);
      }
    });
    b2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        del_action(e);
      }
    });

  }
  public DefaultMutableTreeNode createThesaurus () {
    // Model
    fahrzeug.add(auto);
    fahrzeug.add(boot);
    fahrzeug.add(fahrrad);
    auto.add(opel);
    auto.add(mercedes);
    fahrrad.add(kalkhof);
    return fahrzeug;
  }
  // Do the work: Actions
  void new_action(ActionEvent e) {
    final JFrame frame = new JFrame("Neu: Thesaurusbegriff");
    final Panel p = new Panel();
    final TextArea t = new TextArea("", 1, 30);
    final JButton b3 = new JButton("OK");
    final JButton b4 = new JButton("Cancel");
    b3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        if (selectedTreeNode != null) {
          String newThesEntry = t.getText();
          DefaultMutableTreeNode newNode = 
                 new DefaultMutableTreeNode(newThesEntry);
          thesaurus.insertNodeInto(newNode, selectedTreeNode, 0);
          frame.dispose();
        }
      }
    });
    b4.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
      frame.dispose(); 
      }
    });

    p.add("Center", t);
    frame.getContentPane().setLayout(new GridLayout());
    frame.getContentPane().add("North", p);
    Box box = Box.createHorizontalBox();
    box.add(b3); box.add(Box.createGlue());
    box.add(b4); box.add(Box.createGlue());
    frame.getContentPane().add("South", box);
    frame.setSize(400, 100);
    frame.show();
  }
  void del_action(ActionEvent e) {
    if (selectedTreeNode != null) {
      DefaultMutableTreeNode parent = 
           (DefaultMutableTreeNode)(selectedTreeNode.getParent());
      if (parent != null) {
        thesaurus.removeNodeFromParent(selectedTreeNode);
      }
    }
  }
}
