package org.newdawn.slick.tools.peditor;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.newdawn.slick.particles.ConfigurableEmitter;
/**
* A visual list of the emitter being editing
*
* @author kevin
*/
public class EmitterList extends JPanel {
/** The actual list of emitters */
private DefaultListModel emitters = new DefaultListModel();
/** The visual list of controllable emitters */
private JList list = new JList(emitters);
/** Button to add an emitter to the list */
private JButton add = new JButton("Add");
/** Button to remove an emitter from the list */
private JButton remove = new JButton("Remove");
/** The map from emitter to JCheckBox in the list */
private HashMap checks = new HashMap();
/** The last selected emitter (index into the list) */
private int lastSelect = -1;
/**
* Create a new visual list of emitters
*
* @param editor The editor to report updates to
*/
public EmitterList(final ParticleEditor editor) {
setLayout(null);
JScrollPane scroll = new JScrollPane(list);
scroll.setBounds(5,25,285,100);
scroll.setBorder(BorderFactory.createEtchedBorder());
add.setBounds(150,125,60,20);
remove.setBounds(209,125,80,20);
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
editor.addEmitter(new ConfigurableEmitter("NewEmitter_"+System.currentTimeMillis()));
}
});
remove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ConfigurableEmitter emitter = (ConfigurableEmitter) list.getSelectedValue();
if (emitter != null) {
editor.removeEmitter(emitter);
}
}
});
list.setCellRenderer(new Renderer());
list.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
int index = list.locationToIndex(e.getPoint());
if (index != -1) {
if (list.getCellBounds(index, index).contains(e.getPoint())) {
if (lastSelect == list.getSelectedIndex()) {
ConfigurableEmitter emitter = (ConfigurableEmitter) list.getModel().getElementAt(index);
JCheckBox box = (JCheckBox) checks.get(emitter);
emitter.setEnabled(!emitter.isEnabled());
box.setSelected(emitter.isEnabled());
repaint();
} else {
lastSelect = list.getSelectedIndex();
}
}
}
}
});
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
editor.setCurrentEmitter((ConfigurableEmitter) list.getSelectedValue());
}
});
add(scroll);
add(add);
add(remove);
}
/**
* Set the currently selected emitter
*
* @param emitter The emitter to be selected
*/
public void setSelected(ConfigurableEmitter emitter) {
list.setSelectedValue(emitter, true);
}
/**
* Set the currently selected index in the list
*
* @param index The index to be selected
*/
public void setSelected(int index) {
if (index < emitters.size()) {
list.setSelectedIndex(index);
}
}
/**
* Update the visual state of the specified emitter in the list
*
* @param emitter The emitter to be updated
*/
public void update(ConfigurableEmitter emitter) {
emitters.set(emitters.indexOf(emitter), emitter);
}
/**
* Remove all emitters from the list
*
*/
public void clear() {
emitters.clear();
}
/**
* Add an emitter to the list
*
* @param emitter The emitter to add
*/
public void add(ConfigurableEmitter emitter) {
emitters.addElement(emitter);
}
/**
* Remove an emitter from the list
*
* @param emitter The emitter to remove
*/
public void remove(ConfigurableEmitter emitter) {
emitters.removeElement(emitter);
}
/**
* Renderer for the emitter list, shows check boxes
*
* @author kevin
*/
public class Renderer extends DefaultListCellRenderer {
/**
* @see javax.swing.DefaultListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
public Component getListCellRendererComponent(JList list, final Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);
final JCheckBox box = new JCheckBox(label.getText());
box.setBackground(label.getBackground());
box.setSelected(((ConfigurableEmitter) value).isEnabled());
checks.put(value, box);
return box;
}
}
}