/*
* 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.digital_dj;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout;
import org.jajuk.services.dj.DigitalDJ;
import org.jajuk.services.dj.DigitalDJManager;
import org.jajuk.ui.helpers.DefaultMouseWheelListener;
import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
import org.jajuk.util.Messages;
import org.qdwizard.Screen;
/**
* General options panel.
*/
public class GeneralOptionsScreen extends Screen implements ActionListener, CaretListener,
ChangeListener {
/** The Constant NO_MAX_TRACKS. */
private static final String NO_MAX_TRACKS = " ";
/** Generated serialVersionUID. */
private static final long serialVersionUID = 1L;
JLabel jlName;
JTextField jtfName;
JLabel jlRatingLevel;
JSlider jsRatingLevel;
JLabel jlFadeDuration;
JSlider jsFadeDuration;
JCheckBox jcbMaxTracks;
JSlider jsMaxTracks;
JLabel jnMaxTracks;
JCheckBox jcbUnicity;
@Override
public String getDescription() {
return Messages.getString("DigitalDJWizard.49");
}
@Override
public String getName() {
return Messages.getString("DigitalDJWizard.48");
}
/**
* Create panel UI.
*/
@Override
public void initUI() {
if (ActionSelectionScreen.ACTION_CREATION.equals(data.get(Variable.ACTION))) {
// default values
data.put(Variable.FADE_DURATION, 10);
data.put(Variable.RATINGS_LEVEL, 0); // all tracks by default
data.put(Variable.UNICITY, false);
data.put(Variable.MAX_TRACKS, -1);
} else if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))) {
// keep existing DJ values
DigitalDJ dj = (DigitalDJ) data.get(Variable.CHANGE);
data.put(Variable.FADE_DURATION, dj.getFadingDuration());
data.put(Variable.RATINGS_LEVEL, dj.getRatingLevel());
data.put(Variable.UNICITY, dj.isTrackUnicity());
data.put(Variable.MAX_TRACKS, dj.getMaxTracks());
}
jlName = new JLabel(Messages.getString("DigitalDJWizard.6"));
jtfName = new JTextField();
jtfName.setToolTipText(Messages.getString("DigitalDJWizard.6"));
jtfName.addCaretListener(this);
jtfName.requestFocusInWindow();
jlRatingLevel = new JLabel(Messages.getString("DigitalDJWizard.8"));
jlRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
jsRatingLevel = new JSlider(0, 4, (Integer) data.get(Variable.RATINGS_LEVEL));
jsRatingLevel.setMajorTickSpacing(1);
jsRatingLevel.setMinorTickSpacing(1);
jsRatingLevel.setPaintTicks(true);
jsRatingLevel.setSnapToTicks(true);
jsRatingLevel.setPaintLabels(true);
jsRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
jsRatingLevel.addMouseWheelListener(new DefaultMouseWheelListener(jsRatingLevel));
jsRatingLevel.addChangeListener(this);
jlFadeDuration = new JLabel(Messages.getString("DigitalDJWizard.9"));
jlFadeDuration.setToolTipText(Messages.getString("DigitalDJWizard.54"));
jsFadeDuration = new JSlider(0, 30, (Integer) data.get(Variable.FADE_DURATION));
jsFadeDuration.addMouseWheelListener(new DefaultMouseWheelListener(jsFadeDuration));
jsFadeDuration.addChangeListener(this);
jsFadeDuration.setMajorTickSpacing(10);
jsFadeDuration.setMinorTickSpacing(1);
jsFadeDuration.setPaintTicks(true);
jsFadeDuration.setPaintLabels(true);
jsFadeDuration.setToolTipText(Messages.getString("DigitalDJWizard.54"));
// CheckBox for enabling/disabling slider, jsMaxTrack
int nMaxTracks = (Integer) data.get(Variable.MAX_TRACKS);
jcbMaxTracks = new JCheckBox(Messages.getString("DigitalDJWizard.67"), nMaxTracks != -1);
jcbMaxTracks.setToolTipText(Messages.getString("DigitalDJWizard.68"));
// initialize the slider based if max track is enabled or not
if (nMaxTracks != -1) {
jsMaxTracks = new JSlider(0, 5000, nMaxTracks);
jsMaxTracks.setEnabled(true);
jnMaxTracks = new JLabel(Integer.toString(nMaxTracks));
} else {
jsMaxTracks = new JSlider(0, 5000, 100);
jsMaxTracks.setEnabled(false);
jnMaxTracks = new JLabel(NO_MAX_TRACKS);
}
jnMaxTracks.setBorder(new BevelBorder(BevelBorder.LOWERED));
jsMaxTracks.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxTracks));
jsMaxTracks.addChangeListener(this);
jsMaxTracks.setMajorTickSpacing(100);
jsMaxTracks.setMinorTickSpacing(10);
jsMaxTracks.setPaintTicks(false);
jsMaxTracks.setPaintLabels(false);
jsMaxTracks.setToolTipText(Messages.getString("DigitalDJWizard.68"));
// enable/disable slider depending on checkbox
jcbMaxTracks.addActionListener(this);
jcbUnicity = new JCheckBox(Messages.getString("DigitalDJWizard.10"),
(Boolean) data.get(Variable.UNICITY));
jcbUnicity.setToolTipText(Messages.getString("DigitalDJWizard.55"));
jcbUnicity.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
data.put(Variable.UNICITY, jcbUnicity.isSelected());
}
});
// DJ change, set default values
if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))) {
DigitalDJ dj = (DigitalDJ) data.get(Variable.CHANGE);
jtfName.setText(dj.getName());
jsFadeDuration.setValue((Integer) data.get(Variable.FADE_DURATION));
jsRatingLevel.setValue((Integer) data.get(Variable.RATINGS_LEVEL));
jcbUnicity.setSelected((Boolean) data.get(Variable.UNICITY));
if (((Integer) data.get(Variable.MAX_TRACKS)) != -1) {
jsMaxTracks.setValue((Integer) data.get(Variable.MAX_TRACKS));
} else {
jsMaxTracks.setValue(100);
}
} else { // new dj, dj name is required
setProblem(Messages.getString("DigitalDJWizard.41"));
}
setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
add(jlName);
add(jtfName, "grow,wrap");
add(jlRatingLevel);
add(jsRatingLevel, "grow,wrap");
add(jlFadeDuration);
add(jsFadeDuration, "grow,wrap");
add(jcbMaxTracks);
{
JPanel panel = new JPanel();
panel.setLayout(new MigLayout("", "[grow][]"));
panel.add(jsMaxTracks, "grow");
panel.add(jnMaxTracks);
add(panel, "grow,wrap");
}
add(jcbUnicity, "wrap");
}
@Override
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == jcbUnicity) {
data.put(Variable.UNICITY, jcbUnicity.isSelected());
} else if (ae.getSource() == jcbMaxTracks) {
jsMaxTracks.setEnabled(jcbMaxTracks.isSelected());
updateMaxTracks();
}
}
@Override
public void caretUpdate(CaretEvent ce) {
if (ce.getSource() == jtfName) {
data.put(Variable.DJ_NAME, jtfName.getText());
String sName = jtfName.getText();
// string length = 0
if (sName.length() == 0) {
setProblem(Messages.getString("DigitalDJWizard.41"));
}
// display an error message if the dj already exists and not in
// "change" mode
else if (DigitalDJManager.getInstance().getDJNames().contains(sName)) {
// if we are in change mode and the name is still the
// same, no error
if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))
&& ((DigitalDJ) data.get(Variable.CHANGE)).getName().equals(sName)) {
setProblem(null);
return;
}
setProblem(Messages.getString("DigitalDJWizard.42"));
} else {
setProblem(null); // no more problem
}
}
}
@Override
public void stateChanged(ChangeEvent ie) {
if (ie.getSource() == jsFadeDuration && !jsFadeDuration.getValueIsAdjusting()) {
data.put(Variable.FADE_DURATION, jsFadeDuration.getValue());
} else if (ie.getSource() == jsRatingLevel && !jsRatingLevel.getValueIsAdjusting()) {
data.put(Variable.RATINGS_LEVEL, jsRatingLevel.getValue());
} else if (ie.getSource() == jsMaxTracks) {
updateMaxTracks();
}
}
/**
* Update all items related to the Max Track feature.
*/
private void updateMaxTracks() {
// store -1 if checkbox is not enabled and update the label accordingly
if (jcbMaxTracks.isSelected()) {
if (!jsMaxTracks.getValueIsAdjusting()) {
data.put(Variable.MAX_TRACKS, jsMaxTracks.getValue());
}
jnMaxTracks.setText(Integer.toString(jsMaxTracks.getValue()));
} else {
if (!jsMaxTracks.getValueIsAdjusting()) {
data.put(Variable.MAX_TRACKS, -1);
}
jnMaxTracks.setText(NO_MAX_TRACKS);
}
}
}