001 package swingui;
002
003 import java.awt.BorderLayout;
004 import java.awt.Dimension;
005 import java.awt.GridLayout;
006 import java.awt.event.ActionEvent;
007 import java.awt.event.ActionListener;
008 import java.awt.event.KeyEvent;
009
010 import javax.swing.JButton;
011 import javax.swing.JLabel;
012 import javax.swing.JPanel;
013 import javax.swing.JScrollPane;
014
015 import components.GameObject;
016 import components.GameSpace;
017 import components.KeyRegistry;
018
019 public class TriggerPanel extends JPanel implements ActionListener {
020 /** the gamespace whose triggers we are interested in **/
021 private GameSpace gs;
022 /** the object in gamespace whose triggers we are interested in **/
023 private GameObject obj;
024
025 //components
026 private JButton addUpButton;
027 private JButton addDownButton;
028 private JPanel triggerList;
029 private JScrollPane triggerScroll;
030
031 public TriggerPanel() {
032 super();
033
034 //components
035 //TRIGGERS
036 //[box of]
037 //[keys ]
038 //add add
039 //////////////
040
041 //title and display
042 JLabel triggerLabel = new JLabel(" Triggers: ");
043 triggerList = new JPanel(new GridLayout(0, 1)); //one column
044 //triggerList.setPreferredSize(new Dimension(2, 4));
045 triggerScroll = new JScrollPane(triggerList,
046 JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
047 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
048
049 //add/rm buttons
050 addUpButton = new JButton("KeyUp");
051 addUpButton.addActionListener(this);
052 addDownButton = new JButton("KeyDown");
053 addDownButton.addActionListener(this);
054
055 //layout
056 JPanel triggerButtonPanel = new JPanel();
057 triggerButtonPanel.add(addUpButton);
058 triggerButtonPanel.add(addDownButton);
059
060 this.setLayout(new BorderLayout());
061 add(triggerLabel, BorderLayout.NORTH);
062 add(triggerScroll, BorderLayout.CENTER);
063 add(triggerButtonPanel, BorderLayout.SOUTH);
064 }
065
066 /** change the object abotu which we are displaying info **/
067 public void setObject(GameObject obj) {
068 this.obj = obj;
069 if (obj != null) {
070 gs = obj.getGameSpace();
071 updateTriggerList();
072 } else {
073 gs = null;
074 clearTriggerList();
075 }
076 }
077
078 /** pop up a keyselect dialog **/
079 public void actionPerformed(ActionEvent e) {
080 if (e.getSource().equals(addUpButton)) {
081 AddKeyWindow d = new AddKeyWindow(this, gs, obj, false);
082 } else if (e.getSource().equals(addDownButton)) {
083 AddKeyWindow d = new AddKeyWindow(this, gs, obj, true);
084 } else { //delete key
085 KeyTrigger src = (KeyTrigger) e.getSource();
086 gs.getRegistry().remove(src.code(), src.down(), src.target());
087 updateTriggerList();
088 }
089 }
090
091 /** update the triggerlist text area **/
092 public void updateTriggerList() {
093 clearTriggerList();
094 KeyRegistry keyreg = gs.getRegistry();
095 for (Integer key : keyreg.getDowns(obj)) {
096 KeyTrigger k = new KeyTrigger(key, KeyTrigger.DOWN, obj);
097 triggerList.add(k);
098 k.addActionListener(this);
099 }
100 for (Integer key : keyreg.getUps(obj)) {
101 KeyTrigger k = new KeyTrigger(key, KeyTrigger.UP, obj);
102 triggerList.add(k);
103 k.addActionListener(this);
104 }
105 triggerList.validate();
106 this.repaint();
107 }
108
109 /** clear the triggerlist panel **/
110 public void clearTriggerList() {
111 triggerList.removeAll();
112 }
113
114 public String getName() {
115 return "Triggers";
116 }
117
118 /** A KeyTrigger is a JButton that represents a key trigger. The text of the
119 * button is the key + the direction, and the tool tip is the keyCode number.
120 * @author ruthdhan
121 *
122 */
123 private class KeyTrigger extends JButton {
124 /** the target of this KeyTrigger **/
125 private GameObject tgt;
126 /** the direction of this trigger **/
127 private boolean down;
128
129 public static final boolean DOWN = true;
130 public static final boolean UP = false;
131
132 /** construct a keyTrigger button based on the given key/direction/target **/
133 public KeyTrigger(Integer key, boolean down, GameObject tgt) {
134 super();
135 this.down = down;
136 this.tgt = tgt;
137 this.setText(KeyEvent.getKeyText(key) + arrow(down) + " \u2717");
138 this.setToolTipText(key+"");
139 }
140
141 /** get the target of this trigger *
142 * @return tgt - the GameObject targetted by the trigger */
143 public GameObject target() {
144 return tgt;
145 }
146 /** get the keycode of this trigger
147 * @return int - the code **/
148 public int code() {
149 return Integer.valueOf(this.getToolTipText());
150 }
151 /** get the direction of this trigger
152 * @return true if trigger is a key press (false if a key release) **/
153 public boolean down() {
154 return down;
155 }
156
157 /** return an up or down arrow (unicode) **/
158 private String arrow(boolean down) {
159 if (down)
160 return "\u2193";
161 else
162 return "\u2191";
163 }
164 }
165 }