package org.erikaredmark.monkeyshines.editor.dialog; import java.awt.Canvas; import java.awt.FlowLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.List; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import org.erikaredmark.monkeyshines.Sprite; import org.erikaredmark.monkeyshines.bounds.IPoint2D; import org.erikaredmark.monkeyshines.resource.WorldResource; import com.google.common.base.Optional; public final class SpriteChooserDialog extends JDialog { private static final long serialVersionUID = 1L; private Optional<Sprite> selectedSprite = Optional.absent(); public SpriteChooserDialog(List<Sprite> sprites, WorldResource rsrc) { getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT) ); for (Sprite s : sprites) { JPanel spriteSelector = new JPanel(); spriteSelector.setLayout(new FlowLayout() ); spriteSelector.addMouseListener(new SetSpriteMouseListener(s) ); Canvas c = new SpriteAnimationCanvas(s.getId(), s.getAnimationType(), s.getAnimationSpeed(), rsrc); // Both have mouse listeners; for some reason the canvas steals the general JPanel click. c.addMouseListener(new SetSpriteMouseListener(s) ); spriteSelector.add(c); IPoint2D loc = s.getCurrentBounds().getLocation(); JLabel location = new JLabel(loc.x() + ", " + loc.y() ); spriteSelector.add(location); getContentPane().add(spriteSelector); } } /** Sets dialog to have the given selection as the model, and quits the dialog. */ private void selectAndQuit(Optional<Sprite> selection) { this.selectedSprite = selection; setVisible(false); } public static Optional<Sprite> launch(JComponent parent, List<Sprite> spriteChoices, WorldResource rsrc) { SpriteChooserDialog dialog = new SpriteChooserDialog(spriteChoices, rsrc); dialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE); dialog.setModal(true); dialog.setSize(240, 200); dialog.setLocationRelativeTo(null); dialog.setVisible(true); // Dialog is over at this point. Set model based on how it was exited to tell client. return dialog.selectedSprite; } private final class SetSpriteMouseListener implements MouseListener { private final Sprite sprite; public SetSpriteMouseListener(final Sprite s) { this.sprite = s; } @Override public void mouseClicked(MouseEvent e) { selectAndQuit(Optional.of(sprite) ); } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } } }