Swing JFC Java

/*
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002. All rights
 * reserved. Software written by Ian F. Darwin and others. $Id: LICENSE,v 1.8
 * 2004/02/09 03:33:38 ian Exp $
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer. 2. Redistributions in
 * binary form must reproduce the above copyright notice, this list of
 * conditions and the following disclaimer in the documentation and/or other
 * materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee cup"
 * logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,
 * pioneering role in inventing and promulgating (and standardizing) the Java
 * language and environment is gratefully acknowledged.
 * 
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
 * inventing predecessor languages C and C++ is also gratefully acknowledged.
 */
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
class AliasBean extends JPanel {
  protected Vector aliVector;
  protected JList aliJList;
  private JTextField nameTF, addrTF;
  public AliasBean() {
    aliVector = new Vector();
    aliJList = new JList();
    // XXX MUST FIX THIS
    // aliJList.setSelectionMode(JList.SINGLE_SELECTION);
    aliJList.addListSelectionListener(new ListSelectionListener() {
      public void valueChanged(ListSelectionEvent evt) {
        int i = aliJList.getSelectedIndex();
        if (i < 0)
          return;
        Alias al = (Alias) aliVector.get(i);
        nameTF.setText(al.getName());
        addrTF.setText(al.getAddress());
      }
    });
    setLayout(new BorderLayout());
    add(BorderLayout.WEST, new JScrollPane(aliJList));
    JPanel rightPanel = new JPanel();
    add(BorderLayout.EAST, rightPanel);
    rightPanel.setLayout(new GridLayout(0, 1));
    JPanel buttons = new JPanel();
    rightPanel.add(buttons);
    buttons.setLayout(new GridLayout(0, 1, 15, 15));
    JButton b;
    buttons.add(b = new JButton("Set"));
    b.setToolTipText("Add or Change an alias");
    b.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        int i = aliJList.getSelectedIndex();
        if (i < 0) {
          // XXX error dialog??
          return;
        }
        setAlias(i, nameTF.getText(), addrTF.getText());
      }
    });
    buttons.add(b = new JButton("Delete"));
    b.setToolTipText("Delete the selected alias");
    b.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        int i = aliJList.getSelectedIndex();
        if (i < 0) {
          return;
        }
        deleteAlias(i);
      }
    });
    buttons.add(b = new JButton("Apply"));
    b.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        System.err.println("NOT WRITTEN YET");
      }
    });
    JPanel fields = new JPanel();
    rightPanel.add(fields);
    fields.setLayout(new GridLayout(2, 2));
    fields.add(new JLabel("Name"));
    fields.add(nameTF = new JTextField(10));
    fields.add(new JLabel("Address"));
    fields.add(addrTF = new JTextField(20));
  }
  public String expandAlias(String ali) {
    Alias a = findAlias(ali);
    if (a == null)
      return null;
    return a.getAddress();
  }
  public Alias findAlias(String ali) {
    for (int i = 0; i < aliVector.size(); i++) {
      Alias a = (Alias) aliVector.get(i);
      if (a.getName().equals(ali))
        return a;
    }
    return null; // not found
  }
  /** Add an Alias */
  public void addAlias(Alias a) {
    Alias al = findAlias(a.getName());
    if (al == null) {
      aliVector.addElement(a);
    } else {
      // aliVector.setElement(a); // XXX fuzzy
    }
    aliJList.setListData(aliVector);
  }
  /** Add an alias, by its constituent parts */
  public void addAlias(String nn, String addr) {
    addAlias(new Alias(nn, addr));
  }
  /** Replace an Alias */
  public void setAlias(int n, String nam, String addr) {
    // TODO find it, replace it, or add it.
    aliVector.setElementAt(new Alias(nam, addr), n);
    aliJList.setListData(aliVector);
  }
  public void deleteAlias(int i) {
    aliVector.removeElementAt(i);
    aliJList.setListData(aliVector);
  }
}
class Alias {
  /** The name for the alias */
  protected String name;
  /** The email address for this alias */
  protected String address;
  public Alias(String n, String addr) {
    name = n;
    address = addr;
  }
  public String toString() {
    return name + " = " + address;
  }
  /** Get name */
  public String getName() {
    return name;
  }
  /** Set name */
  public void setName(String name) {
    this.name = name;
  }
  /** Get address */
  public String getAddress() {
    return address;
  }
  /** Set address */
  public void setAddress(String address) {
    this.address = address;
  }
}
/**
 * Test for AliasBean.
 * 
 * @version $Id: AliasBeanTest.java,v 1.3 2004/02/09 03:33:48 ian Exp $
 */
public class AliasBeanTest extends JFrame {
  JButton quitButton;
  /** "main program" method - construct and show */
  public static void main(String[] av) {
    // create a JFrameDemo object, tell it to show up
    new AliasBeanTest().setVisible(true);
  }
  /** Construct the object including its GUI */
  public AliasBeanTest() {
    super("AliasBeanTest");
    Container cp = getContentPane();
    AliasBean ab = new AliasBean();
    cp.add(BorderLayout.CENTER, ab);
    ab.addAlias("ian-cvs", "ian@openbsd.org");
    ab.addAlias("ian-dos", "http://www.darwinsys.com/");
    cp.add(BorderLayout.SOUTH, quitButton = new JButton("Exit"));
    quitButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        setVisible(false);
        dispose();
        System.exit(0);
      }
    });
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        setVisible(false);
        dispose();
        System.exit(0);
      }
    });
    pack();
  }
}