/*
* 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.widgets;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
import org.jajuk.base.File;
import org.jajuk.base.Track;
import org.jajuk.events.JajukEvent;
import org.jajuk.events.JajukEvents;
import org.jajuk.events.ObservationManager;
import org.jajuk.events.Observer;
import org.jajuk.services.players.QueueModel;
import org.jajuk.ui.actions.ActionManager;
import org.jajuk.ui.actions.JajukActions;
import org.jajuk.util.Const;
import org.jajuk.util.IconLoader;
import org.jajuk.util.JajukIcons;
import org.jajuk.util.Messages;
/**
* The evaluation toolbar is displayed in command panel and slimbar
* <p>
* It contains the ban button to ban the current track<br>
* and an evaluation combo box to evaluate current track
* </p>.
*/
public class PreferenceToolbar extends JajukJToolbar implements Observer {
/** Generated serialVersionUID. */
private static final long serialVersionUID = 3869208492725759632L;
JajukButton jbBan;
JComboBox jcbPreference;
ActionListener listener;
/**
* Instantiates a new preference toolbar.
*/
public PreferenceToolbar() {
super();
jbBan = new JajukButton(ActionManager.getAction(JajukActions.BAN));
// Preference combo:
/*
* track preference (from -3 to 3: -3: hate, -2=dislike, -1=ok, +1=like,
* +2=love +3=crazy). The preference is a factor given by the user to
* increase or decrease a track rate.
*/
jcbPreference = new JComboBox();
// Add tooltips on combo items
jcbPreference.setRenderer(new ComboBoxRenderer());
jcbPreference.setMinimumSize(new Dimension(45, 0));
jcbPreference.setPreferredSize(new Dimension(45, 0));
jcbPreference.setToolTipText(Messages.getString("Preference.0"));
jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_ADORE));
jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_LOVE));
jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_LIKE));
jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_UNSET));
jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_AVERAGE));
jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_POOR));
jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_HATE));
// Set default to unset preference if not playing and to current track value
// if playing
if (!QueueModel.isStopped() && QueueModel.getPlayingFile() != null) {
setPreference(QueueModel.getPlayingFile().getTrack().getLongValue(Const.XML_TRACK_PREFERENCE));
} else {
jcbPreference.setSelectedIndex(3);
}
listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
File file = QueueModel.getPlayingFile();
if (file != null) {
Track track = file.getTrack();
track.setPreference(3 - jcbPreference.getSelectedIndex());
}
// Force immediate rating refresh (without using the rating manager)
ObservationManager.notify(new JajukEvent(JajukEvents.RATE_CHANGED));
}
};
jcbPreference.addActionListener(listener);
add(jbBan);
add(jcbPreference);
ObservationManager.register(this);
// Force initial update
if (QueueModel.isPlayingTrack()) {
update(new JajukEvent(JajukEvents.FILE_LAUNCHED));
}
}
/* (non-Javadoc)
* @see org.jajuk.events.Observer#getRegistrationKeys()
*/
@Override
public Set<JajukEvents> getRegistrationKeys() {
Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
eventSubjectSet.add(JajukEvents.RATE_CHANGED);
eventSubjectSet.add(JajukEvents.FILE_LAUNCHED);
eventSubjectSet.add(JajukEvents.ZERO);
eventSubjectSet.add(JajukEvents.PLAYER_STOP);
eventSubjectSet.add(JajukEvents.BANNED);
eventSubjectSet.add(JajukEvents.WEBRADIO_LAUNCHED);
return eventSubjectSet;
}
/**
* Set right combo selection for given selection.
*
* @param preference
*/
public final void setPreference(long preference) {
jcbPreference.removeActionListener(listener);
jcbPreference.setSelectedIndex(-1 * (int) preference + 3);
jcbPreference.addActionListener(listener);
}
/*
* (non-Javadoc)
*
* @see org.jajuk.ui.Observer#update(java.lang.String)
*/
@Override
public final void update(final JajukEvent event) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// current is null when stopped or when playing web radios, disable the
// preference controls
if (!QueueModel.isPlayingTrack()) {
jbBan.setEnabled(false);
jcbPreference.setEnabled(false);
return;
}
File current = QueueModel.getPlayingFile();
if (current != null && JajukEvents.RATE_CHANGED.equals(event.getSubject())) {
setPreference(current.getTrack().getLongValue(Const.XML_TRACK_PREFERENCE));
} else if (JajukEvents.FILE_LAUNCHED.equals(event.getSubject())) {
// Update evaluation toolbar
jcbPreference.setEnabled(true);
jbBan.setEnabled(true);
updateBanIcon();
File file = QueueModel.getPlayingFile();
if (file != null) {
setPreference(file.getTrack().getLongValue(Const.XML_TRACK_PREFERENCE));
}
} else if (JajukEvents.ZERO.equals(event.getSubject())
|| JajukEvents.PLAYER_STOP.equals(event.getSubject())) {
jcbPreference.setEnabled(false);
jbBan.setEnabled(false);
setPreference(0);
} else if (JajukEvents.BANNED.equals(event.getSubject())) {
updateBanIcon();
}
}
});
}
/**
* Update ban icon state according to current track.
*/
private void updateBanIcon() {
if (QueueModel.getPlayingFile() == null || QueueModel.isStopped()) {
jbBan.setIcon(IconLoader.getIcon(JajukIcons.BAN));
jbBan.setToolTipText(Messages.getString("BanSelectionAction.1"));
} else {
Track current = QueueModel.getPlayingFile().getTrack();
if (current.getBooleanValue(Const.XML_TRACK_BANNED)) {
jbBan.setIcon(IconLoader.getIcon(JajukIcons.UNBAN));
jbBan.setToolTipText(Messages.getString("UnBanSelectionAction.1"));
} else {
jbBan.setIcon(IconLoader.getIcon(JajukIcons.BAN));
jbBan.setToolTipText(Messages.getString("BanSelectionAction.1"));
}
}
}
/**
* .
*/
private class ComboBoxRenderer extends BasicComboBoxRenderer {
/** Generated serialVersionUID. */
private static final long serialVersionUID = -6943363556191659895L;
/* (non-Javadoc)
* @see javax.swing.plaf.basic.BasicComboBoxRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
@Override
public Component getListCellRendererComponent(final JList list, final Object value,
final int index, final boolean isSelected, final boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
switch (index) {
case 0:
setToolTipText(Messages.getString("Preference.6"));
break;
case 1:
setToolTipText(Messages.getString("Preference.5"));
break;
case 2:
setToolTipText(Messages.getString("Preference.4"));
break;
case 3:
setToolTipText(Messages.getString("Preference.8"));
break;
case 4:
setToolTipText(Messages.getString("Preference.3"));
break;
case 5:
setToolTipText(Messages.getString("Preference.2"));
break;
case 6:
setToolTipText(Messages.getString("Preference.1"));
break;
}
setBorder(new EmptyBorder(0, 3, 0, 3));
return this;
}
}
}