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.MouseAdapter; 009 import java.awt.event.MouseEvent; 010 011 import javax.swing.JButton; 012 import javax.swing.JLabel; 013 import javax.swing.JPanel; 014 import javax.swing.JScrollPane; 015 016 import physics3d.Vect3; 017 018 import components.GameObject; 019 020 public class TargetPanel extends JPanel implements ActionListener { 021 //fields 022 /** the object whose targets we are inspecting **/ 023 private GameObject obj; 024 private MainGUI gui; 025 026 //components 027 JPanel targetList; 028 JButton addTargetButton; 029 JButton clearTargetsButton; 030 031 public TargetPanel(MainGUI gui) { 032 super(); 033 this.gui = gui; 034 035 //title & list of targets 036 JLabel targetLabel = new JLabel(" Targets: "); 037 targetList = new JPanel(new GridLayout(0, 1)); //1 column 038 JScrollPane targetScroll = new JScrollPane(targetList, 039 JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 040 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 041 //targetScroll.setPreferredSize(new Dimension(20, 20)); 042 043 //add/clear buttons 044 addTargetButton = new JButton("Add"); 045 addTargetButton.addActionListener(this); 046 clearTargetsButton = new JButton("Clear"); 047 clearTargetsButton.addActionListener(this); 048 049 //layout 050 JPanel targetButtonPanel = new JPanel(); 051 targetButtonPanel.add(addTargetButton); 052 targetButtonPanel.add(clearTargetsButton); 053 this.setLayout(new BorderLayout()); 054 add(targetLabel, BorderLayout.NORTH); 055 add(targetScroll, BorderLayout.CENTER); 056 add(targetButtonPanel, BorderLayout.SOUTH); 057 } 058 059 /** set the object whose targets we are inspecting **/ 060 public void setObject(GameObject obj) { 061 this.obj = obj; 062 if (obj != null) { 063 updateTargetList(); 064 } else { 065 clearTargetList(); 066 } 067 } 068 069 /** on actionEvent: 070 * if add - set listener on gui for adding 071 * if clear - clear all targets 072 * otherwise - delete only the given target 073 */ 074 public void actionPerformed(ActionEvent e) { 075 if (e.getSource().equals(addTargetButton)) { 076 //System.out.println("clicked add target"); 077 gui.setCurrentListener (new AddTargetListener()); 078 } else if (e.getSource().equals(clearTargetsButton)) { 079 System.err.println("clicked clear targets"); 080 obj.clearTargets(); 081 updateTargetList(); 082 } else { 083 System.err.println("clicked on an x"); 084 TargetButton src = (TargetButton)e.getSource(); 085 obj.removeTarget(src.target()); 086 targetList.remove(src); 087 updateTargetList(); 088 } //else delete the given target 089 } 090 091 /** populate target list with the targets for the current obj **/ 092 private void updateTargetList() { 093 clearTargetList(); 094 for (GameObject tgt : obj.getTargets()) { 095 TargetButton t = new TargetButton(tgt); 096 t.addActionListener(this); 097 targetList.add(t); 098 } 099 targetList.validate(); 100 this.repaint(); 101 } 102 /** clear targetlist panel **/ 103 private void clearTargetList() { 104 targetList.removeAll(); 105 } 106 107 /** add target listener is a mouselister intended to be registerd on the 108 * GLcanvas. the next thing clicked on is added as a target 109 */ 110 private class AddTargetListener extends MouseAdapter { 111 @Override 112 public void mouseClicked(MouseEvent e) { 113 ////System.out.println("adding target"); 114 Vect3 gridLoc = gui.getGridLocation(e.getX(), e.getY()); 115 GameObject tgt = gui.getObjectInGrid(gridLoc); 116 if (tgt != null) { 117 obj.addTarget(tgt); 118 updateTargetList(); 119 gui.getCanvas().removeMouseListener(this); 120 } 121 } 122 } 123 124 public String getName() { return "Targets"; } 125 126 /** TargetButton extends JButton and represents a target ( a GameObject ) **/ 127 private class TargetButton extends JButton { 128 private GameObject target; 129 130 public TargetButton(GameObject tgt) { 131 super(); 132 this.target = tgt; 133 134 this.setText(tgt.getName() + " \u2717"); 135 this.setToolTipText("<"+tgt.getCenter()+">"); 136 } 137 138 /** get the target this button represents **/ 139 public GameObject target() { 140 return target; 141 } 142 } 143 144 145 }