package com.quiltplayer.controller;
import java.awt.Component;
import java.awt.event.ActionEvent;
import javax.swing.SwingUtilities;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.quiltplayer.core.player.PlayerFactory;
import com.quiltplayer.core.playlist.PlayList;
import com.quiltplayer.model.Album;
import com.quiltplayer.model.Song;
import com.quiltplayer.view.swing.SongStatus;
import com.quiltplayer.view.swing.buttons.QSongButton;
import com.quiltplayer.view.swing.frame.QuiltPlayerFrame;
import com.quiltplayer.view.swing.panels.UtilityPanel;
import com.quiltplayer.view.swing.panels.controlpanels.ControlPanel;
import com.quiltplayer.view.swing.panels.controlpanels.PlayerControlPanel;
/**
* Controller regarding the player.
*
* @author Vlado Palczynski
*/
@Controller
public class PlayerController implements PlayerListener {
private Logger log = Logger.getLogger(PlayerController.class);
public enum PlayEvents {
CHANGE, STOP, PAUSE, PLAY, FINISH, PREVIOUS, NEXT, SEEK
}
public enum PlayerEvents {
CHANGED, STOPPED, PAUSEED, PLAYING, FINISHED, PREVIOUS, NEXT, SEEKED, PROGRESSED, PROGRESSES_BYTES, RESUMED
};
private Runnable invoker;
@Autowired
private PlayerFactory playerFactory;
@Autowired
private PlayList playList;
@Autowired
private UtilityPanel playlistPanel;
@Autowired
private ControlPanel controlPanel;
@Autowired
private PlayerControlPanel playerControlPanel;
@Autowired
private QuiltPlayerFrame frame;
// private SongStatus songStatus = new SongStatus();
public PlayerController() {
invoker = new Runnable() {
public void run() {
playerControlPanel.setProgress(playerFactory.getElapsedTime());
}
};
}
/*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public final void actionPerformed(final ActionEvent e) {
final String cmd = e.getActionCommand();
if (PlayerEvents.PROGRESSED.toString() == cmd) {
SwingUtilities.invokeLater(invoker);
}
else if (PlayerEvents.STOPPED.toString() == cmd) {
log.debug("Player stopped.");
if (playlistPanel.getCurrentSongLabel() != null)
playlistPanel.getCurrentSongLabel().setInactive();
controlPanel.getPlayerControlPanel().setStopped();
}
else if (PlayerEvents.PAUSEED.toString() == cmd) {
log.debug("Player paused.");
controlPanel.getPlayerControlPanel().setPaused();
}
else if (PlayerEvents.RESUMED.toString() == cmd) {
log.debug("Player resumed.");
controlPanel.getPlayerControlPanel().setPlaying();
}
else if (PlayerEvents.PLAYING.toString() == cmd) {
log.debug("Player playing.");
Song song = (Song) e.getSource();
Component[] components = playlistPanel.getSongLabels();
for (int i = 0; i < components.length; i++) {
QSongButton songLabel = (QSongButton) components[i];
if (songLabel.getSong().equals(song)) {
songLabel.setActive();
playlistPanel.setCurrentSongLabel(songLabel);
frame.repaintUi();
break;
}
}
controlPanel.getPlayerControlPanel().setPlaying();
playerControlPanel.changeSong(song);
}
/* Play events, from UI */
else if (PlayEvents.STOP.toString() == cmd) {
log.debug("Stop requested...");
playerFactory.stop();
}
else if (PlayEvents.PAUSE.toString().equals(cmd)) {
log.debug("Pause requested...");
playerFactory.pause();
}
else if (PlayEvents.PLAY.toString() == cmd) {
log.debug("Play requested...");
playerFactory.play(playList.getCurrentSong());
}
else if (PlayEvents.SEEK.toString() == cmd) {
log.debug("Seek requested...");
final int i = (Integer) e.getSource();
playerFactory.seek(i);
}
else if (PlayEvents.CHANGE.toString() == cmd) {
playlistPanel.inactivateCurrentSongLabel();
playList.jumpToSong((Song) e.getSource());
playerFactory.play(playList.getCurrentSong());
}
else if (PlayEvents.NEXT.toString() == cmd) {
log.debug("Next requested...");
playlistPanel.inactivateCurrentSongLabel();
playList.nextSong();
playerFactory.play(playList.getCurrentSong());
}
else if (PlayEvents.PREVIOUS.toString() == cmd) {
log.debug("Previous requested...");
playlistPanel.inactivateCurrentSongLabel();
playList.prevSong();
playerFactory.play(playList.getCurrentSong());
}
else if (PlayEvents.FINISH.toString() == cmd) {
playlistPanel.inactivateCurrentSongLabel();
playList.nextSong();
playerFactory.play(playList.getCurrentSong());
}
}
/**
* Denna metoden finns i PlayerListener
*/
public void newAlbum(final Album a) {
// frame.getPlayListPane().setAlbum(a);
}
public void newSong(final Song s) {
// frame.getPlaylistPanel().setCurrentSong(s);
}
public void songStatus(final SongStatus ss) {
// songStatus.setElapsed(ss.getElapsed());
// SwingUtilities.invokeLater(invoker);
}
}