package org.lysty.ui;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
import org.lysty.core.AppSettingsManager;
import org.lysty.util.Utils;
/**
* The application level settings window
*
* @author NuwanSam
*
*/
public class AppSettingsWindow extends LFrame {
private static AppSettingsWindow self = null;
JTabbedPane tabs;
JCheckBox chkPlayNextOnSongLoad;
private JButton btnOk;
private boolean playNextWhenLoadOnCurrentPlay;
private JButton btnCancel;
private JPanel controlPanel;
private JCheckBox chkRemAutoGensOnManualAdd;
protected boolean remAutoGensOnManualAdd;
private JTextField txtInfiniPlayLastNtoCheck;
private JTextField txtGenListLength;
public static AppSettingsWindow getInstance() {
if (self == null) {
self = new AppSettingsWindow("");
}
return self;
}
private AppSettingsWindow(String title) {
super("Settings");
}
public void init(Component parent) {
createUI();
layoutUI();
loadValues();
setVisible(true);
setLocationRelativeTo(parent);
}
private void loadValues() {
// playback settings
playNextWhenLoadOnCurrentPlay = AppSettingsManager
.getPropertyAsBoolean(AppSettingsManager.PLAY_NEXT_WHEN_LOAD_ON_CURRENT_PLAY);
chkPlayNextOnSongLoad.setSelected(playNextWhenLoadOnCurrentPlay);
remAutoGensOnManualAdd = AppSettingsManager
.getPropertyAsBoolean(AppSettingsManager.REM_UNPLAYED_AUTOGENS_ON_MANUAL_ADD);
chkRemAutoGensOnManualAdd.setSelected(remAutoGensOnManualAdd);
// infini play settings
txtGenListLength.setText(AppSettingsManager
.getProperty(AppSettingsManager.INFINIPLAY_GENLIST_SIZE));
txtInfiniPlayLastNtoCheck.setText(AppSettingsManager
.getProperty(AppSettingsManager.INFINIPLAY_LAST_N_TO_CHECK));
}
private void layoutUI() {
// TODO Auto-generated method stub
JPanel contentPane = new JPanel(new MigLayout());
contentPane.add(tabs, "span");
contentPane.add(controlPanel);
setContentPane(contentPane);
setSize(500, 500);
pack();
}
private void createUI() {
tabs = new JTabbedPane();
createPlaybackTab();
createInfiniPlayTab();
createControlPanel();
}
private void createInfiniPlayTab() {
JPanel panel = new JPanel(new MigLayout());
txtInfiniPlayLastNtoCheck = new JTextField();
JLabel lblLastN = new JLabel("Consider the Last ");
JLabel lblLastN2 = new JLabel(" songs played for Infini play");
JPanel pnlLastN = new JPanel();
pnlLastN.add(lblLastN);
pnlLastN.add(txtInfiniPlayLastNtoCheck);
pnlLastN.add(lblLastN2);
txtGenListLength = new JTextField();
JLabel lblGenLength = new JLabel("Generate list length");
JPanel pnlGenLength = new JPanel();
pnlGenLength.add(lblGenLength);
pnlGenLength.add(txtGenListLength);
panel.add(pnlLastN, "wrap");
panel.add(pnlGenLength);
tabs.add("Infini Play", panel);
}
private void createControlPanel() {
btnOk = new JButton(new AbstractAction("Ok") {
@Override
public void actionPerformed(ActionEvent e) {
if (validateSettings()) {
AppSettingsManager.updateAppSettings(getSettings());
AppSettingsWindow.this.setVisible(false);
} else {
JOptionPane.showMessageDialog(AppSettingsWindow.this,
"Incorrect settings");
}
}
});
btnCancel = new JButton(new AbstractAction("Cancel") {
@Override
public void actionPerformed(ActionEvent e) {
AppSettingsWindow.this.setVisible(false);
}
});
controlPanel = new JPanel(new MigLayout());
controlPanel.add(btnOk);
controlPanel.add(btnCancel);
}
protected boolean validateSettings() {
String str = txtGenListLength.getText();
if (!Utils.isNumber(str)) {
return false;
}
str = txtInfiniPlayLastNtoCheck.getText();
if (!Utils.isNumber(str)) {
return false;
}
return true;
}
protected Map<String, String> getSettings() {
Map<String, String> map = new HashMap<String, String>();
map.put(AppSettingsManager.PLAY_NEXT_WHEN_LOAD_ON_CURRENT_PLAY,
playNextWhenLoadOnCurrentPlay ? "true" : "false");
map.put(AppSettingsManager.REM_UNPLAYED_AUTOGENS_ON_MANUAL_ADD,
remAutoGensOnManualAdd ? "true" : "false");
map.put(AppSettingsManager.INFINIPLAY_GENLIST_SIZE,
txtGenListLength.getText());
map.put(AppSettingsManager.INFINIPLAY_LAST_N_TO_CHECK,
txtInfiniPlayLastNtoCheck.getText());
return map;
}
private void createPlaybackTab() {
JPanel pnlPlayback = new JPanel(new MigLayout());
chkPlayNextOnSongLoad = new JCheckBox(
new AbstractAction(
"Do not stop current playing song when another song file is clicked") {
@Override
public void actionPerformed(ActionEvent e) {
playNextWhenLoadOnCurrentPlay = chkPlayNextOnSongLoad
.isSelected();
}
});
chkRemAutoGensOnManualAdd = new JCheckBox(
new AbstractAction(
"Remove unplayed autogenerated songs when a song is manually added to the playlist") {
@Override
public void actionPerformed(ActionEvent e) {
remAutoGensOnManualAdd = chkRemAutoGensOnManualAdd
.isSelected();
}
});
pnlPlayback.add(chkPlayNextOnSongLoad, "wrap");
pnlPlayback.add(chkRemAutoGensOnManualAdd);
tabs.add("Playback", pnlPlayback);
}
}