package io.neocdtv.simpleplayer.ui;
import io.neocdtv.simpleplayer.player.PlayerException;
import io.neocdtv.simpleplayer.player.PlayerFactory;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.StringReader;
import java.security.GeneralSecurityException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.TitledBorder;
import org.apache.commons.io.IOUtils;
public class PlayerUI {
private final static Logger LOGGER = Logger.getLogger(PlaylistUI.class.getName());
private final PlaylistUI playList = PlaylistUI.getInstance();
private static final String PLAYER_TITLE = "Chromecast Player";
public PlayerUI() throws IOException, GeneralSecurityException {
JFrame frame = new JFrame();
frame.setTitle(PLAYER_TITLE);
defineBehaviourOnWindowClose(frame);
final Container contentPane = frame.getContentPane();
contentPane.add(buildDevicePanel(), BorderLayout.NORTH);
contentPane.add(buildPlaylist(), BorderLayout.CENTER);
contentPane.add(buildBottomPanel(), BorderLayout.SOUTH);
frame.setSize(400, 400);
frame.setResizable(true);
frame.setVisible(true);
}
private JPanel buildDevicePanel() {
JPanel devicePanel = new JPanel(new GridLayout(1, 1));
JComboBox<CombolistEntry> comboBox = new JComboBox<>(ComboBoxFactory.instance());
devicePanel.add(comboBox);
return devicePanel;
}
private JPanel buildBottomPanel() {
JPanel panel = new JPanel(new GridLayout(2, 1));
panel.add(buildButtonPanel());
panel.add(PlayerStateFieldFactory.instance());
return panel;
}
private JPanel buildButtonPanel() {
JPanel buttonPanel = new JPanel(new GridLayout(1, 6));
buttonPanel.add(ButtonsFactory.playButtonIntance());
buttonPanel.add(ButtonsFactory.pauseButtonInstance());
buttonPanel.add(ButtonsFactory.nextButtonInstance());
buttonPanel.add(ButtonsFactory.volumeDownButtonInstance());
buttonPanel.add(ButtonsFactory.volumeUpButtonInstance());
return buttonPanel;
}
private JScrollPane buildPlaylist() {
JScrollPane scrollPane = new JScrollPane();
scrollPane.setPreferredSize(new Dimension(300, 400));
scrollPane.setViewportView(playList);
playList.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
LOGGER.log(Level.INFO, "keyTyped: {0}:", e.getKeyCode());
}
@Override
public void keyPressed(KeyEvent e) {
LOGGER.log(Level.INFO, "keyPressed: {0}:", e.getKeyCode());
if ((e.getKeyCode()
== KeyEvent.VK_V) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
try {
final StringReader valueFromClipboardReader = getValueFromClipboard(DataFlavor.plainTextFlavor);
final String valueFromString = IOUtils.toString(valueFromClipboardReader);
LOGGER.log(Level.INFO, "fromClipBoard: {0}:", valueFromString);
playList.addElement(valueFromString);
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
}
if ((e.getKeyCode()
== KeyEvent.VK_A) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
playList.selectAll();
}
if (e.getKeyCode()
== KeyEvent.VK_DELETE) {
playList.removeSelected();
}
}
@Override
public void keyReleased(KeyEvent e) {
LOGGER.log(Level.INFO, "keyReleased: {0}:", e.getKeyCode());
}
});
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
final TitledBorder createTitledBorder = BorderFactory.createTitledBorder("Playlist");
createTitledBorder.setTitleJustification(TitledBorder.CENTER);
scrollPane.setBorder(createTitledBorder);
return scrollPane;
}
private <T> T getValueFromClipboard(final DataFlavor flavor) {
T valueFromClipboard = null;
try {
valueFromClipboard = (T) Toolkit.getDefaultToolkit().getSystemClipboard().getData(flavor);
} catch (UnsupportedFlavorException | IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
return valueFromClipboard;
}
private void defineBehaviourOnWindowClose(JFrame frame) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
PlayerFactory.getCurrentPlayer().shutdown();
e.getWindow().dispose();
} catch (PlayerException ex) {
Logger.getLogger(PlayerUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
}