/*
* 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.ambience;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import net.miginfocom.swing.MigLayout;
import org.jajuk.base.Genre;
import org.jajuk.events.JajukEvent;
import org.jajuk.events.JajukEvents;
import org.jajuk.events.ObservationManager;
import org.jajuk.services.dj.Ambience;
import org.jajuk.services.dj.AmbienceDigitalDJ;
import org.jajuk.services.dj.AmbienceManager;
import org.jajuk.ui.helpers.FontManager;
import org.jajuk.ui.helpers.FontManager.JajukFont;
import org.jajuk.ui.wizard.GenresSelectionDialog;
import org.jajuk.util.IconLoader;
import org.jajuk.util.JajukIcons;
import org.jajuk.util.Messages;
import org.qdwizard.Screen;
public class AmbienceScreen extends Screen implements ActionListener {
/** Generated serialVersionUID. */
private static final long serialVersionUID = 1L;
/** All dynamic widgets. */
private JComponent[][] widgets;
private JButton jbNew;
private JButton jbDelete;
private JButton jbDefaults;
/** DJ*. */
private AmbienceDigitalDJ dj = null;
/** Selected ambience index. */
private int ambienceIndex = 0;
@Override
public void actionPerformed(final ActionEvent ae) {
if (ae.getSource() == jbNew) {
// create a void ambience
AmbienceWizard.ambiences.add(new Ambience(Long.toString(System.currentTimeMillis()), ""));
Collections.sort(AmbienceWizard.ambiences);
// refresh screen
refreshScreen();
// select new row
final JRadioButton jrb = (JRadioButton) widgets[AmbienceWizard.ambiences.size() - 1][0];
jrb.setSelected(true);
ambienceIndex = AmbienceWizard.ambiences.size() - 1;
setProblem(Messages.getString("DigitalDJWizard.39"));
jbNew.setEnabled(false);
jbDelete.setEnabled(true);
final JTextField jtf = (JTextField) widgets[ambienceIndex][1];
jtf.requestFocusInWindow();
} else if (ae.getSource() == jbDelete) {
final Ambience ambience = AmbienceWizard.ambiences.get(ambienceIndex);
AmbienceWizard.ambiences.remove(ambience);
AmbienceManager.getInstance().removeAmbience(ambience.getID());
if (AmbienceManager.getInstance().getAmbiences().size() == 0) {
jbDelete.setEnabled(false);
}
if (ambienceIndex > 0) {
ambienceIndex--;
final JRadioButton jrb = (JRadioButton) widgets[ambienceIndex][0];
jrb.setSelected(true);
}
// refresh screen
refreshScreen();
} else if (ae.getSource() == jbDefaults) {
AmbienceManager.getInstance().createDefaultAmbiences();
AmbienceWizard.ambiences = new ArrayList<Ambience>(AmbienceManager.getInstance()
.getAmbiences());
Collections.sort(AmbienceWizard.ambiences);
// refresh screen
refreshScreen();
}
// in all cases, notify command panel
ObservationManager.notify(new JajukEvent(JajukEvents.AMBIENCES_CHANGE));
}
/**
* Gets the widget index.
*
* @param widgets
* @param widget
* @return index of a given widget row in the widget table
*/
private int getWidgetIndex(final JComponent[][] widgets, final JComponent widget) {
for (int row = 0; row < widgets.length; row++) {
for (int col = 0; col < widgets[0].length; col++) {
if (widget.equals(widgets[row][col])) {
return row;
}
}
}
return -1;
}
/**
* Add a genre to a proportion.
*
* @param row row
*/
private void addGenre(final int row) {
final Ambience ambience = AmbienceWizard.ambiences.get(row);
// create list of genres used in current selection
final GenresSelectionDialog dialog = new GenresSelectionDialog(null);
dialog.setSelection(ambience.getGenres());
dialog.setVisible(true);
final Set<Genre> genres = dialog.getSelectedGenres();
// check if at least one genre has been selected
if (genres.size() == 0) {
return;
}
StringBuilder sText = new StringBuilder();
// reset old genres
ambience.setGenres(new HashSet<Genre>(10));
for (final Genre genre : genres) {
ambience.addGenre(genre);
sText.append(genre.getName2()).append(',');
}
sText.deleteCharAt(sText.length() - 1);
// Set button text
((JButton) widgets[row][2]).setText(sText.toString());
// if we have ambience name and some genres, register the
// ambience
if ((ambience.getName().length() > 0) && (ambience.getGenres().size() > 0)) {
// no more error message if at least one ambience
setProblem(null);
jbNew.setEnabled(true);
}
}
@Override
public String getDescription() {
return Messages.getString("DigitalDJWizard.47");
}
@Override
public String getName() {
return Messages.getString("DigitalDJWizard.57");
}
/**
* Gets the panel.
*
* @return a panel containing all items
*/
private JScrollPane getPanel() {
widgets = new JComponent[AmbienceWizard.ambiences.size()][3];
final JPanel out = new JPanel();
// Delete|Genre name|genres list
final ButtonGroup group = new ButtonGroup();
// now add all ambiences
for (int index = 0; index < AmbienceWizard.ambiences.size(); index++) {
// Ambience name
final JTextField jtfName = new JTextField();
jtfName.setText(AmbienceWizard.ambiences.get(index).getName());
jtfName.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(final CaretEvent arg0) {
final int index = getWidgetIndex(widgets, (JComponent) arg0.getSource());
final String s = jtfName.getText();
// Check this name is not already token
for (int i = 0; i < widgets.length; i++) {
if (i == index) {
continue;
}
final JTextField jtf = (JTextField) widgets[i][1];
if (jtf.getText().equals(s)) {
setProblem(Messages.getString("DigitalDJWizard.60"));
return;
}
}
// reset previous problems
if ((s.length() == 0) || (((JButton) widgets[index][2]).getText().length() == 0)) {
setProblem(Messages.getString("DigitalDJWizard.39"));
} else {
setProblem(null);
}
final JButton jb = (JButton) widgets[index][2];
final Ambience ambience = AmbienceWizard.ambiences.get(index);
ambience.setName(s);
jb.setEnabled(s.length() > 0);
}
});
jtfName.setToolTipText(Messages.getString("DigitalDJWizard.36"));
widgets[index][1] = jtfName;
// radio button
final JRadioButton jrbAmbience = new JRadioButton();
group.add(jrbAmbience);
jrbAmbience.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
((JTextField) widgets[getWidgetIndex(widgets, jrbAmbience)][1]).getText();
ambienceIndex = getWidgetIndex(widgets, jrbAmbience);
}
});
widgets[index][0] = jrbAmbience;
if (index == ambienceIndex) {
jrbAmbience.setSelected(true);
}
final Ambience ambience = AmbienceWizard.ambiences.get(index);
// genre list
final JButton jbGenre = new JButton(IconLoader.getIcon(JajukIcons.GENRE));
if (ambience.getName().length() == 0) {
jbGenre.setEnabled(false);
}
if ((ambience.getGenres() != null) && (ambience.getGenres().size() > 0)) {
jbGenre.setText(ambience.getGenresDesc());
jbGenre.setToolTipText(ambience.getGenresDesc());
}
jbGenre.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
final int row = getWidgetIndex(widgets, (JComponent) ae.getSource());
addGenre(row);
// refresh ambience (force an action event)
final JRadioButton jrb = (JRadioButton) widgets[row][0];
jrb.doClick();
}
});
jbGenre.setToolTipText(Messages.getString("DigitalDJWizard.27"));
widgets[index][2] = jbGenre;
}
// Create layout
out.setLayout(new MigLayout("insets 5,gapx 5", "[][][grow]"));
// Create header
final JLabel jlHeader1 = new JLabel(Messages.getString("DigitalDJWizard.37"));
jlHeader1.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
final JLabel jlHeader2 = new JLabel(Messages.getString("DigitalDJWizard.27"));
jlHeader2.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
out.add(jlHeader1, "center,span 2");
out.add(jlHeader2, "center,wrap");
// Add widgets
for (int i = 0; i < widgets.length; i++) {
out.add(widgets[i][0], "grow,center,width 25!");
out.add(widgets[i][1], "grow,center,width 120!");
out.add(widgets[i][2], "center,grow,wrap,width 270:270");
}
final JScrollPane jsp = new JScrollPane(out);
// select first ambiance found
if (AmbienceWizard.ambiences.size() > 0) {
final JRadioButton jrb = (JRadioButton) widgets[0][0];
jrb.doClick();
}
return jsp;
}
/**
* Create panel UI.
*/
@Override
public void initUI() {
AmbienceWizard.ambiences = new ArrayList<Ambience>(AmbienceManager.getInstance().getAmbiences());
Collections.sort(AmbienceWizard.ambiences);
setCanFinish(true);
jbNew = new JButton(Messages.getString("DigitalDJWizard.32"),
IconLoader.getIcon(JajukIcons.NEW));
jbNew.addActionListener(this);
jbNew.setToolTipText(Messages.getString("DigitalDJWizard.33"));
jbDelete = new JButton(Messages.getString("DigitalDJWizard.34"),
IconLoader.getIcon(JajukIcons.DELETE));
jbDelete.addActionListener(this);
jbDelete.setToolTipText(Messages.getString("DigitalDJWizard.35"));
jbDefaults = new JButton(Messages.getString("DigitalDJWizard.62"),
IconLoader.getIcon(JajukIcons.DEFAULTS));
jbDefaults.addActionListener(this);
jbDefaults.setToolTipText(Messages.getString("DigitalDJWizard.63"));
// Add items
refreshScreen();
}
/**
* Refresh panel.
*/
private void refreshScreen() {
setLayout(new MigLayout("insets 5,gapy 15", "[center,grow]"));
removeAll();
// refresh panel
add(getPanel(), "grow,wrap");
add(jbNew, "split 3");
add(jbDelete);
add(jbDefaults);
revalidate();
repaint();
}
}