/*
* Jajuk
* Copyright (C) The Jajuk Team
* http://jajuk.info
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package org.jajuk.ui.wizard;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Calendar;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import net.miginfocom.swing.MigLayout;
import org.jajuk.base.File;
import org.jajuk.base.FileManager;
import org.jajuk.base.SearchResult;
import org.jajuk.base.SearchResult.SearchResultType;
import org.jajuk.events.JajukEvent;
import org.jajuk.events.JajukEvents;
import org.jajuk.events.ObservationManager;
import org.jajuk.services.alarm.AlarmManager;
import org.jajuk.services.webradio.WebRadio;
import org.jajuk.services.webradio.WebRadioManager;
import org.jajuk.ui.widgets.JajukJDialog;
import org.jajuk.ui.widgets.OKCancelPanel;
import org.jajuk.ui.widgets.SearchBox;
import org.jajuk.ui.windows.JajukMainWindow;
import org.jajuk.util.Conf;
import org.jajuk.util.Const;
import org.jajuk.util.Messages;
import org.jajuk.util.log.Log;
/**
* Alarm Clock Dialog window.
*
* TODO : add validation on fields
*/
public class AlarmClockDialog extends JajukJDialog implements ActionListener, ItemListener, Const {
/** Constant for MigLayout hint. */
private static final String LEFT_WRAP = "left,wrap";
/** Generated serialVersionUID. */
private static final long serialVersionUID = 1L;
private final JLabel jlChoice;
private final JCheckBox jcbTime;
private final JRadioButton jrbShuffle;
private final JRadioButton jrbBestof;
private final JRadioButton jrbNovelties;
private final JRadioButton jrbFile;
private final JTextField jtfHour;
private final JTextField jtfMinutes;
private final JTextField jtfSeconds;
private final JComboBox jcbAlarmAction;
private final SearchBox sbSearch;
private SearchResult sr;
private OKCancelPanel okCancelPanel;
/**
* Instantiates a new alarm clock dialog.
*/
public AlarmClockDialog() {
super(JajukMainWindow.getInstance(), true);
jcbTime = new JCheckBox(Messages.getString("AlarmDialog.0"));
jcbTime.addActionListener(this);
jtfHour = new JTextField(2);
jtfHour.setToolTipText(Messages.getString("AlarmDialog.1"));
jtfMinutes = new JTextField(2);
jtfMinutes.setToolTipText(Messages.getString("AlarmDialog.2"));
jtfSeconds = new JTextField(2);
jtfSeconds.setToolTipText(Messages.getString("AlarmDialog.3"));
final JLabel jlAlarmAction = new JLabel(Messages.getString("AlarmDialog.4"));
jcbAlarmAction = new JComboBox();
jcbAlarmAction.addItem(Const.ALARM_START_ACTION);
jcbAlarmAction.addItem(Const.ALARM_STOP_ACTION);
jcbAlarmAction.setToolTipText(Messages.getString("AlarmDialog.5"));
jcbAlarmAction.addActionListener(this);
jlChoice = new JLabel(Messages.getString("ParameterView.9"));
jrbShuffle = new JRadioButton(Messages.getString("ParameterView.14"));
jrbShuffle.setToolTipText(Messages.getString("ParameterView.15"));
jrbShuffle.addItemListener(this);
jrbBestof = new JRadioButton(Messages.getString("ParameterView.131"));
jrbBestof.setToolTipText(Messages.getString("ParameterView.132"));
jrbBestof.addItemListener(this);
jrbNovelties = new JRadioButton(Messages.getString("ParameterView.133"));
jrbNovelties.setToolTipText(Messages.getString("ParameterView.134"));
jrbNovelties.addItemListener(this);
jrbFile = new JRadioButton(Messages.getString("ParameterView.16"));
jrbFile.setToolTipText(Messages.getString("ParameterView.17"));
jrbFile.addItemListener(this);
sbSearch = new SearchBox() {
private static final long serialVersionUID = 1L;
@Override
public void valueChanged(final ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
sr = sbSearch.getResult();
if (sr.getType() == SearchResultType.FILE) {
sbSearch.setText(sr.getFile().getTrack().getName());
} else if (sr.getType() == SearchResultType.WEBRADIO) {
sbSearch.setText(sr.getWebradio().getName());
}
sbSearch.hidePopup();
sr = sbSearch.getResult();
}
}
};
// disabled by default, is enabled only if jrbFile is enabled
sbSearch.setEnabled(false);
sbSearch.setToolTipText(Messages.getString("ParameterView.18"));
final ButtonGroup bgChoices = new ButtonGroup();
bgChoices.add(jrbShuffle);
bgChoices.add(jrbBestof);
bgChoices.add(jrbNovelties);
bgChoices.add(jrbFile);
jrbShuffle.setSelected(true);
okCancelPanel = new OKCancelPanel(this);
setLayout(new MigLayout("insets 5,gapy 15", "[grow][grow]"));
add(jcbTime, "right");
add(jtfHour, "left,split 5,width 30!");
add(new JLabel(":"));
add(jtfMinutes, "width 30!");
add(new JLabel(":"));
add(jtfSeconds, "width 30!,wrap");
add(jlAlarmAction, "center");
add(jcbAlarmAction, LEFT_WRAP);
add(jlChoice, LEFT_WRAP);
add(jrbShuffle, LEFT_WRAP);
add(jrbBestof, LEFT_WRAP);
add(jrbNovelties, LEFT_WRAP);
add(jrbFile, "left");
add(sbSearch, "left,wrap,grow");
add(okCancelPanel, "right,span");
// Reload on GUI saved values
loadValues();
setTitle(Messages.getString("AlarmClock.0"));
setMinimumSize(new Dimension(250, 100));
pack();
setLocationRelativeTo(JajukMainWindow.getInstance());
setVisible(true);
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public final void actionPerformed(final ActionEvent e) {
boolean playAction = (jcbAlarmAction.getSelectedIndex() == 0);
if (e.getSource() == jcbAlarmAction) {
handleAction(playAction);
} else if (e.getSource() == okCancelPanel.getOKButton()) {
saveValues();
} else if (e.getSource() == okCancelPanel.getCancelButton()) {
dispose();
} else if (e.getSource() == jcbTime) {
handleTimeCheckbox(playAction);
}
}
/**
* Handle action.
*
* @param playAction
*/
private void handleAction(boolean playAction) {
jlChoice.setEnabled(playAction);
jrbShuffle.setEnabled(playAction);
jrbBestof.setEnabled(playAction);
jrbNovelties.setEnabled(playAction);
jrbFile.setEnabled(playAction);
sbSearch.setEnabled(playAction);
}
/**
* Handle time checkbox.
*
* @param playAction
*/
private void handleTimeCheckbox(boolean playAction) {
// Enable/ disable all widgets if user enables or disables the entire
// alarm
boolean enabled = jcbTime.isSelected();
jtfHour.setEnabled(enabled);
jtfMinutes.setEnabled(enabled);
jtfSeconds.setEnabled(enabled);
jcbAlarmAction.setEnabled(enabled);
jlChoice.setEnabled(enabled && playAction);
jrbShuffle.setEnabled(enabled && playAction);
jrbBestof.setEnabled(enabled && playAction);
jrbNovelties.setEnabled(enabled && playAction);
jrbFile.setEnabled(enabled && playAction);
sbSearch.setEnabled(enabled && playAction);
}
/* (non-Javadoc)
* @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
*/
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getSource() == jrbFile) {
sr = sbSearch.getResult();
sbSearch.setEnabled(jrbFile.isSelected());
}
}
/**
* Store GUI values to persisted values.
*/
private void saveValues() {
// Parse the final alarm value
Calendar cal = Calendar.getInstance();
try {
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(jtfHour.getText()));
cal.set(Calendar.MINUTE, Integer.parseInt(jtfMinutes.getText()));
cal.set(Calendar.SECOND, Integer.parseInt(jtfSeconds.getText()));
} catch (Exception e) {
Log.error(e);
Messages.showErrorMessage(177);
return;
}
// Store values
Conf.setProperty(Const.CONF_ALARM_ENABLED, ((Boolean) jcbTime.isSelected()).toString());
Conf.setProperty(Const.CONF_ALARM_ACTION, jcbAlarmAction.getSelectedItem().toString());
Conf.setProperty(CONF_ALARM_TIME_HOUR, jtfHour.getText());
Conf.setProperty(CONF_ALARM_TIME_MINUTES, jtfMinutes.getText());
Conf.setProperty(CONF_ALARM_TIME_SECONDS, jtfSeconds.getText());
if (jrbShuffle.isSelected()) {
Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_SHUFFLE);
} else if (jrbFile.isSelected()) {
Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_ITEM);
// sr = null means none search occurred in this session
if (sr != null) {
sr = sbSearch.getResult();
if (sr.getType() == SearchResultType.FILE) {
Conf.setProperty(Const.CONF_ALARM_FILE, SearchResultType.FILE.name() + '/'
+ sr.getFile().getID());
} else if (sr.getType() == SearchResultType.WEBRADIO) {
Conf.setProperty(Const.CONF_ALARM_FILE, SearchResultType.WEBRADIO.name() + '/'
+ sr.getWebradio().getName());
}
}
} else if (jrbBestof.isSelected()) {
Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_BESTOF);
} else if (jrbNovelties.isSelected()) {
Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_NOVELTIES);
}
// Close the window
dispose();
// Notify the Alarm manager
ObservationManager.notify(new JajukEvent(JajukEvents.ALARMS_CHANGE));
// Display a message
Messages.showInfoMessage(Messages.getString("Success"));
// Start manager up
AlarmManager.getInstance();
}
/**
* Load persisted values to GUI.
*/
private final void loadValues() {
jcbTime.setSelected(Conf.getBoolean(CONF_ALARM_ENABLED));
jtfHour.setText(Conf.getString(CONF_ALARM_TIME_HOUR));
jtfMinutes.setText(Conf.getString(CONF_ALARM_TIME_MINUTES));
jtfSeconds.setText(Conf.getString(CONF_ALARM_TIME_SECONDS));
// Alarm mode (play/stop)
if (ALARM_START_ACTION.equals(Conf.getString(CONF_ALARM_ACTION))) {
jcbAlarmAction.setSelectedIndex(0);
} else if (ALARM_STOP_ACTION.equals(Conf.getString(CONF_ALARM_ACTION))) {
jcbAlarmAction.setSelectedIndex(1);
}
// Alarm action
if (Const.STARTUP_MODE_BESTOF.equals(Conf.getString(CONF_ALARM_MODE))) {
jrbBestof.setSelected(true);
} else if (Const.STARTUP_MODE_NOVELTIES.equals(Conf.getString(CONF_ALARM_MODE))) {
jrbNovelties.setSelected(true);
} else if (Const.STARTUP_MODE_ITEM.equals(Conf.getString(CONF_ALARM_MODE))) {
jrbFile.setSelected(true);
String conf = Conf.getString(Const.CONF_ALARM_FILE);
String item = conf.substring(conf.indexOf('/') + 1, conf.length());
if (conf.matches(SearchResultType.FILE.name() + ".*")) {
File file = FileManager.getInstance().getFileByID(item);
if (file != null) {
sbSearch.setText(file.getTrack().getName());
}
} else if (conf.matches(SearchResultType.WEBRADIO.name() + ".*")) {
WebRadio radio = WebRadioManager.getInstance().getWebRadioByName(item);
if (radio != null) {
sbSearch.setText(radio.getName());
}
}
} else if (Const.STARTUP_MODE_SHUFFLE.equals(Conf.getString(CONF_ALARM_MODE))) {
jrbShuffle.setSelected(true);
}
// Force an action event to update enable state of widgets
actionPerformed(new ActionEvent(jcbTime, 0, null));
}
/* (non-Javadoc)
* @see java.awt.Window#dispose()
*/
@Override
public void dispose() {
// there are some resources to close in the Search-Box that I could not get rid of with any of the default dispose-methods in Swing...
sbSearch.close();
super.dispose();
}
}