package com.quiltplayer.view.swing.window; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.annotation.PostConstruct; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.quiltplayer.controller.ControlPanelController; import com.quiltplayer.view.swing.FontFactory; import com.quiltplayer.view.swing.listeners.ControlPanelListener; import com.quiltplayer.view.swing.panels.controlpanels.ControlPanel; /** * * Keyboard emulator component. * * @author Vlado Palczynski * */ @Component public class Keyboard extends JPanel { private static final long serialVersionUID = 1L; private static final String CAPS_LOCK = "Caps Lock"; private static final String ERASE = "<--"; private static final String CLEAR = "Clear"; private static final String CLOSE = "Exit"; private boolean toggler = true; @Autowired private ControlPanel controlPanel; @Autowired private ControlPanelListener controlPanelListener; private JTextField textField; String[][] noCaps = new String[][] { { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" }, { "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", }, { CAPS_LOCK, "A", "S", "D", "F", "G", "H", "J", "K", "L" }, { "Z", "X", "C", "V", "B", "N", "M" }, { CLEAR, " ", CLOSE } }; String[][] caps = new String[][] { { "!", "\"", "#", "ยค", "%", "&", "/", "(", ")", "=", ERASE }, { "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", }, { CAPS_LOCK, "a", "s", "d", "f", "g", "h", "j", "k", "l" }, { "z", "x", "c", "v", "b", "n", "m" }, { CLEAR, " ", CLOSE } }; public Keyboard() { setLayout(new MigLayout("insets 25, center")); setLocation(Toolkit.getDefaultToolkit().getScreenSize().width / 2 - ((int) this.getWidth() / 2), Toolkit .getDefaultToolkit().getScreenSize().height / 2 - ((int) this.getHeight() / 2)); setOpaque(false); } @PostConstruct public void init() { setup(toggler); setVisible(false); } private void setup(final boolean capsLock) { removeAll(); final String layout = "w 1.2cm, h 1.2cm"; final String[][] sds; if (capsLock) sds = caps; else sds = noCaps; for (String[] s : sds) { final JPanel panel = new JPanel(new MigLayout("insets 0")); panel.setOpaque(false); for (String label : s) { final JButton button = new JButton(label) { private static final long serialVersionUID = 1L; /* * (non-Javadoc) * * @see javax.swing.JComponent#paintComponent(java.awt.Graphics) */ @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setPaint(new Color(25, 25, 25)); g2d.fillRect(0, 0, getWidth(), getHeight()); super.paintComponent(g2d); } }; button.setOpaque(false); button.setHorizontalTextPosition(SwingConstants.RIGHT); button.setVerticalAlignment(SwingConstants.BOTTOM); button.setForeground(Color.WHITE); if (label == CAPS_LOCK) setupCapsLockButton(button); else if (label == ERASE) setupEraseButton(button); else if (label == CLEAR) setupClearButton(button); else if (label == CLOSE) setupCloseButton(button); else { setupButton(button); } if (button.getText().equals(" ")) panel.add(button, layout + ", w 5cm"); else panel.add(button, layout); } add(panel, "center, newline"); } updateUI(); } private void setupEraseButton(final JButton button) { button.addActionListener(new ActionListener() { /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event. ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { if (textField.getText().length() > 0) textField.setText(textField.getText().substring(0, textField.getText().length() - 1)); } }); } private void setupCloseButton(final JButton button) { button.addActionListener(controlPanelListener); button.setActionCommand(ControlPanelController.EVENT_VIEW_KEYBOARD); } private void setupClearButton(final JButton button) { button.addActionListener(new ActionListener() { /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event. ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { textField.setText(""); } }); } private JButton setupCapsLockButton(final JButton button) { button.addActionListener(new ActionListener() { /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event. ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { toggler = !toggler; setup(toggler); } }); return button; } private void setupButton(final JButton button) { button.setFont(FontFactory.getFont(16f).deriveFont(Font.ITALIC)); button.addActionListener(new ActionListener() { /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event. ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { if (textField != null) textField.setText(new StringBuilder(textField.getText()).insert(textField.getCaretPosition(), button.getText()).toString()); // TODO Focus is probably lost as this does not work. // textField.setCaretPosition(textField.getCaretPosition() + 1); } }); } public void setTextField(final JTextField textField) { this.textField = textField; controlPanel.flashKeyboard(); } /* * (non-Javadoc) * * @see javax.swing.JComponent#paintComponent(java.awt.Graphics) */ @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.75f)); g2d.setPaint(new Color(50, 50, 50)); g2d.fillRect(0, 0, getWidth(), getHeight()); } }