package gsingh.learnkirtan.ui; import gsingh.learnkirtan.listener.FileEventListener; import gsingh.learnkirtan.listener.PlayEventListener; import gsingh.learnkirtan.player.ShabadPlayer; import gsingh.learnkirtan.ui.shabadeditor.SwingShabadEditor; import gsingh.learnkirtan.ui.shabadeditor.tableeditor.TableShabadEditor; import gsingh.learnkirtan.utility.DialogUtility; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.text.DecimalFormat; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; @SuppressWarnings("serial") public class ControlPanel extends JPanel implements ActionListener, ItemListener, FileEventListener, PlayEventListener { /** * A spinner controlling tempo. It is set to 1.0 by default, has an * increment of 0.1, and has a range from .1 to 2. The shabad plays at this * multiplier times the default speed (in the implementation, the length of * each keypress is divided by this value to have the same effect). It * cannot be changed while playing. */ private JSpinner tempoControl; /** * If checked, the selected playback lines will repeat when finished */ private JCheckBox repeat; JButton playButton = new JButton("Play"); JButton pauseButton = new JButton("Pause"); JButton stopButton = new JButton("Stop"); private ShabadPlayer shabadPlayer; private SwingShabadEditor shabadEditor; private JButton addRowButton; private JButton deleteRowButton; private JComboBox taalComboBox; public ControlPanel(ShabadPlayer shabadPlayer, final SwingShabadEditor shabadEditor) { this.shabadPlayer = shabadPlayer; this.shabadEditor = shabadEditor; this.shabadPlayer.addPlayEventListener(this); playButton.addActionListener(this); playButton.setActionCommand("play"); pauseButton.addActionListener(this); pauseButton.setActionCommand("pause"); pauseButton.setEnabled(false); stopButton.addActionListener(this); stopButton.setActionCommand("stop"); stopButton.setEnabled(false); JLabel tempoLabel = new JLabel("Tempo:"); SpinnerNumberModel model = new SpinnerNumberModel(1, .1, 2, .1); tempoControl = new JSpinner(model); JSpinner.NumberEditor editor = (JSpinner.NumberEditor) tempoControl .getEditor(); DecimalFormat format = editor.getFormat(); format.setMinimumFractionDigits(1); Dimension d = tempoControl.getPreferredSize(); d.width = 40; tempoControl.setPreferredSize(d); repeat = new JCheckBox("Repeat"); repeat.addItemListener(this); setLayout(new WrapLayout(FlowLayout.LEFT)); add(playButton); add(pauseButton); add(stopButton); add(tempoLabel); add(tempoControl); add(repeat); // Uncomment the following line if control panel overflows // Dimension size = getPreferredSize(); if (shabadEditor instanceof TableShabadEditor) { addRowButton = new JButton("+"); addRowButton.setToolTipText("Adds a row group"); addRowButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TableShabadEditor editor = (TableShabadEditor) shabadEditor; int row = editor.getSelectedRow(); if (row != -1) { editor.addRowAbove(row); } } }); deleteRowButton = new JButton("-"); deleteRowButton.setToolTipText("Deletes a row group"); deleteRowButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TableShabadEditor editor = (TableShabadEditor) shabadEditor; int row = editor.getSelectedRow(); if (row != -1) { editor.deleteRow(row); } } }); JLabel taalLabel = new JLabel("Taal (Beat):"); String[] taalNames = new String[] { "Dadra (6 Beats)", "Roopak (7 Beats)", "Keherva (8 Beats)", "Jap Taal (10 Beats)", "Ek Taal (12 Beats)", "Deepchandi (14 Beats)", "Teen Taal (16 Beats)" }; taalComboBox = new JComboBox(taalNames); taalComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String taal = (String) taalComboBox.getSelectedItem(); } }); // TODO Comment the following two lines in once we have support for // change the number of columns // add(taalLabel); // add(taalComboBox); add(addRowButton); add(deleteRowButton); } // Uncomment the following line if control panel overflows // setSize(size); } @Override public void itemStateChanged(ItemEvent e) { shabadEditor.setRepeating(e.getStateChange() == ItemEvent.SELECTED); } @Override public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if (command.equals("play")) { if (shabadPlayer.isPaused()) { shabadPlayer.unpause(); } else { new Thread(new Runnable() { @Override public void run() { if (shabadEditor.isValidShabad()) { shabadPlayer.play(shabadEditor.getShabad(), (Double) tempoControl.getValue(), shabadEditor.getRepeating()); } else { DialogUtility.showInvalidShabadDialog(); } } }).start(); } } else if (command.equals("pause")) { shabadPlayer.pause(); } else if (command.equals("stop")) { shabadPlayer.stop(); } } @Override public void onPlayEvent(PlayEvent e) { if (e == PlayEvent.PLAY) { playButton.setEnabled(false); pauseButton.setEnabled(true); stopButton.setEnabled(true); tempoControl.setEnabled(false); repeat.setEnabled(false); shabadEditor.setEnabled(false); addRowButton.setEnabled(false); deleteRowButton.setEnabled(false); taalComboBox.setEnabled(false); } else if (e == PlayEvent.PAUSE) { playButton.setEnabled(true); pauseButton.setEnabled(false); stopButton.setEnabled(true); tempoControl.setEnabled(false); repeat.setEnabled(false); shabadEditor.setEnabled(false); addRowButton.setEnabled(false); deleteRowButton.setEnabled(false); taalComboBox.setEnabled(false); } else if (e == PlayEvent.STOP) { playButton.setEnabled(true); pauseButton.setEnabled(false); stopButton.setEnabled(false); tempoControl.setEnabled(true); repeat.setEnabled(true); shabadEditor.setEnabled(true); addRowButton.setEnabled(true); deleteRowButton.setEnabled(true); taalComboBox.setEnabled(true); } } @Override public void onFileEvent(FileEvent e) { // Nothing to be done yet } }