package magic.ui.widget.duel.animation; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.AbstractAction; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; @SuppressWarnings("serial") public class AnimationPanel extends JPanel { private MagicAnimation animation = null; public AnimationPanel() { assert SwingUtilities.isEventDispatchThread(); setOpaque(false); setLayout(null); setVisible(false); setCancelPreviewOnLeftClick(); setCancelAnimationOnSpaceOrEscape(); setCancelOnResize(); } private void setCancelOnResize() { addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { if (animation != null) { animation.cancel(); } } }); } private void setCancelPreviewOnLeftClick() { addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { animation.doCancelAction(); } } }); } private void setCancelAnimationOnSpaceOrEscape() { getActionMap().put("CancelAction", getCancelAction()); getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "CancelAction"); getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CancelAction"); } private AbstractAction getCancelAction() { return new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { animation.doCancelAction(); } }; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); animation.render(g); } public void playAnimation(MagicAnimation animation) { assert SwingUtilities.isEventDispatchThread(); this.animation = animation; animation.setCanvas(this); animation.play(); setVisible(true); // IMPORTANT do not remove - SPACE key action will not work otherwise. requestFocusInWindow(); } }