/*
*
*/
package xplayer.presenter;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.logging.Level;
import application.Main;
import application.tools.InfoTool;
import javafx.application.Platform;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import smartcontroller.Genre;
import smartcontroller.SmartController;
import smartcontroller.media.Audio;
/**
* Represents the PlayList of a Specific Player.
*
* @author GOXR3PLUS
*/
public class XPlayerPlaylist extends StackPane {
//----------------------------------------------------------
@FXML
private BorderPane borderPane;
@FXML
private Button play;
@FXML
private Region region;
@FXML
private ProgressIndicator progressSpinner;
@FXML
private HBox horizontalBox;
@FXML
private Button previousButton;
@FXML
private Button stopPlayingList;
@FXML
private Button nextButton;
//--------------------------------------------------------------------------------
/** The controller. */
private SmartController smartController;
/** The play service. */
private PlayListService playService = new PlayListService();;
/** The x player UI. */
XPlayerController xPlayerUI;
/**
* Constructor.
*
* @param maximumItems
* maximumItems allowed to be inserted into the playList
* @param xPlayerUI
* the x player UI
*/
public XPlayerPlaylist(final XPlayerController xPlayerUI) {
this.xPlayerUI = xPlayerUI;
// ------------------------------FXMLLoader-----------------------------
FXMLLoader loader = new FXMLLoader(getClass().getResource(InfoTool.FXMLS + "XPlayerPlaylist.fxml"));
loader.setController(this);
loader.setRoot(this);
try {
loader.load();
} catch (IOException ex) {
Main.logger.log(Level.WARNING, "", ex);
}
}
/** Called as soon as the fxml has been loaded */
@FXML
public void initialize() {
// progressSpinner
region.visibleProperty().bind(progressSpinner.visibleProperty());
// region.visibleProperty().bind(controller.getRegion().visibleProperty());
// progressSpinner.visibleProperty().bind(controller.getRegion().visibleProperty());
// play
//play.setDisable(false);
//play.setOnAction(a -> playService.startService());
// horizontalBox
horizontalBox.visibleProperty().bind(stopPlayingList.visibleProperty());
// stopPlayingList
stopPlayingList.setVisible(false);
stopPlayingList.setOnAction(a -> playService.stopService());
// previousButton
previousButton.visibleProperty().bind(stopPlayingList.visibleProperty());
previousButton.setOnAction(a -> xPlayerUI.getRadialMenu().goPrevious());
previousButton.disableProperty().bind(xPlayerUI.getRadialMenu().previous.disabledProperty());
// nextButton
nextButton.visibleProperty().bind(stopPlayingList.visibleProperty());
nextButton.setOnAction(a -> xPlayerUI.getRadialMenu().goNext());
nextButton.disableProperty().bind(xPlayerUI.getRadialMenu().next.disabledProperty());
// SmartController
smartController = new SmartController(Genre.LIBRARYMEDIA, "XPlayer " + xPlayerUI.getKey() + " PlayList", "XPPL" + xPlayerUI.getKey());
borderPane.setCenter(smartController);
}
/**
* Determines if the user has chosen the play list to be played.
*
* @return true, if is play the list active
*/
public boolean isPlayTheListActive() {
return stopPlayingList.isVisible();
}
/**
* @return the controller
*/
public SmartController getSmartController() {
return smartController;
}
/*-----------------------------------------------------------------------
*
*
* -----------------------------------------------------------------------
*
*
* -----------------------------------------------------------------------
*
*
* PLAY SERVICE
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*/
/**
* This class implements the algorithm of playing the play list. !!!NEEDS TO BE FIXED IT DOESN'T WORK AT ALL!!!
*
* @author GOXR3PLUS
*/
@Deprecated
private class PlayListService extends Service<Void> {
/** The song. */
private Audio song;
/** The counter. */
private int counter;
/**
* Constructor.
*/
public PlayListService() {
setOnSucceeded(s -> done());
setOnFailed(c -> done());
setOnCancelled(c -> done());
}
/**
* Starts the service.
*/
public void startService() {
if (!isRunning() && !getSmartController().getItemsObservableList().isEmpty()) {
stopPlayingList.setVisible(true);
progressSpinner.setVisible(true);
progressSpinner.progressProperty().bind(progressProperty());
xPlayerUI.getRadialMenu().next.setDisable(false);
xPlayerUI.getRadialMenu().previous.setDisable(false);
reset();
start();
}
}
/**
* Stops the service.
*/
public void stopService() {
if (isRunning()) {
cancel();
done();
}
}
/**
* Done.
*/
private void done() {
progressSpinner.progressProperty().unbind();
progressSpinner.setProgress(-1);
progressSpinner.setVisible(false);
stopPlayingList.setVisible(false);
xPlayerUI.getRadialMenu().next.setDisable(true);
xPlayerUI.getRadialMenu().previous.setDisable(true);
song = null;
}
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
counter = 1;
int totalItems = getSmartController().getItemsObservableList().size();
// loop
while (!isCancelled()) {
// Play song
// Synchronize with javaFX thread
song = (Audio) getSmartController().getItemsObservableList().get(counter - 1);
CountDownLatch latch = new CountDownLatch(1);
Platform.runLater(() -> {
// Enable disable next
if (counter == totalItems)
xPlayerUI.getRadialMenu().next.setDisable(true);
else
xPlayerUI.getRadialMenu().next.setDisable(false);
// Enable disable previous
if (counter == 1)
xPlayerUI.getRadialMenu().previous.setDisable(true);
else
xPlayerUI.getRadialMenu().previous.setDisable(false);
// playSong
xPlayerUI.playSong(song.getFilePath());
latch.countDown();
});
latch.await();
// Update the progress
updateProgress(counter, totalItems);
// Check is is playing some song or is paused
while (xPlayerUI.getxPlayer().isPausedOrPlaying() || xPlayerUI.getxPlayer().isSeeking()) {
// Check if nextHasBeenPressed or
// previousHasBeenPressed
if (xPlayerUI.getRadialMenu().nextHasBeenPressed() || xPlayerUI.getRadialMenu().previousHasBeenPressed())
break;
// Get out if cancelled
if (isCancelled())
break;
// Sleep
Thread.sleep(500);
} // --------end of while
// Get out if cancelled
if (isCancelled())
break;
// Check if next has been pressed
if (xPlayerUI.getRadialMenu().nextHasBeenPressed()) {
++counter;
xPlayerUI.getRadialMenu().resetPreviousAndNextIfPressed();
// Check if previous has been pressed
} else if (xPlayerUI.getRadialMenu().previousHasBeenPressed()) {
--counter;
xPlayerUI.getRadialMenu().resetPreviousAndNextIfPressed();
// if counter<listSize
} else if (counter < totalItems) {
++counter;
// else stop Service
} else if (counter == totalItems)
break;
} // -------end of while
return null;
}
};
}
}
}