001 package swingui;
002
003 import java.awt.event.ActionEvent;
004 import java.awt.event.ActionListener;
005 import java.util.HashMap;
006 import java.util.Map;
007
008 import javax.swing.JButton;
009 import javax.swing.JLabel;
010 import javax.swing.JPanel;
011
012 import physics3d.Vect3;
013
014 import components.Absorber;
015 import components.Ball;
016 import components.GameObject;
017
018 /** AbsorberPanel is a mutable class that extends JPanel and contains the GUI tools for
019 * adding/removing balls from an absorber.
020 */
021 public class AbsorberPanel extends JPanel implements ActionListener {
022 /** the absorber we're interested in **/
023 private Absorber abs;
024
025 //fields
026 private JButton addButton;
027
028 /** create a new absorber panel. is initially empty. **/
029 public AbsorberPanel() {
030 addButton = new JButton("Add Ball");
031 addButton.addActionListener(this);
032 //don't add to gui -- will be added in update()
033 }
034
035 /** set the object (absorber) for this panel
036 * @modifies this.abs
037 * @throws IllegalArgumentException if obj is not an Absorber **/
038 public void setObject(GameObject obj) {
039 if (obj instanceof Absorber) {
040 this.abs = (Absorber)obj;
041 updatePanel();
042 }
043 else
044 throw new IllegalArgumentException("obj for AbsorberPanel must be an Absorber");
045 }
046
047 /** update button/label on panel
048 * @effects changes the panel to either display what is currently held or
049 * a button to add a ball into the absorber **/
050 private void updatePanel() {
051 clearPanel();
052 if (abs.isFull()) {
053 add(new JLabel("Holding: "));
054 BallButton ball = new BallButton((Ball)abs.getObject());
055 ball.addActionListener(this);
056 add(ball);
057 } else {
058 add(new JLabel("Empty: "));
059 add(addButton);
060 }
061 this.validate();
062 this.repaint();
063 }
064
065 /** clear the panel
066 * @effects removes all components from panel **/
067 private void clearPanel() {
068 this.removeAll();
069 }
070
071 /** either adds a ball or deletes the currently held one
072 * @effects abs **/
073 public void actionPerformed(ActionEvent e) {
074 if (e.getSource() == addButton) {
075 //make a new ball
076 Map<String, String> props = new HashMap<String, String>();
077 GameObject.putInVect3(Vect3.ZERO, props, "", false); //dummy loc
078 props.put("name", AddPanel.randomName());
079 Ball ball = new Ball(props, abs.getGameSpace());
080 abs.getGameSpace().add(ball);
081
082 //add it to absorber
083 abs.hold(ball);
084 updatePanel();
085 } else { //remove the ball
086 BallButton b = (BallButton)e.getSource();
087 abs.clearObject();
088 updatePanel();
089 }
090 }
091
092 /** name of this panel **/
093 public String getName() { return "Contains"; }
094
095 /** a button that represents a ball **/
096 private class BallButton extends JButton {
097 private Ball ball;
098
099 public BallButton(Ball ball) {
100 this.ball = ball;
101 //set text
102 this.setText(ball.getName() + " \u2717");
103 }
104
105 public Ball getBall() {
106 return ball;
107 }
108 }
109 }