/*
*
*/
package smartcontroller;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import application.Main;
import application.tools.ActionTool;
import application.tools.InfoTool;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.util.Duration;
import smartcontroller.media.Audio;
import smartcontroller.media.Media;
/**
* The default context menu for song items of application.
*
* @author GOXR3PLUS
*/
public class MediaContextMenu extends ContextMenu {
private final Image soundWave = InfoTool.getImageFromResourcesFolder("Audio Wave Filled-24.png");
/**
* The node based on which the Rename or Star Window will be position
*/
private Node node;
/** The media. */
private Media media;
/** The controller. */
private SmartController controller;
/** The players. */
Menu startPlayer = new Menu("Play on", InfoTool.getImageViewFromResourcesFolder("circledPlay24.png"));
/** The player 0. */
MenuItem player0 = new MenuItem("xPlayer ~0", new ImageView(soundWave));
/** The player 1. */
MenuItem player1 = new MenuItem("xPlayer ~1", new ImageView(soundWave));
/** The player 2. */
MenuItem player2 = new MenuItem("xPlayer ~2", new ImageView(soundWave));
/** The players. */
Menu stopPlayer = new Menu("Stop Player", InfoTool.getImageViewFromResourcesFolder("Stop Sign-24.png"));
/** The player 0. */
MenuItem splayer0 = new MenuItem("xPlayer ~0", new ImageView(soundWave));
/** The player 1. */
MenuItem splayer1 = new MenuItem("xPlayer ~1", new ImageView(soundWave));
/** The player 2. */
MenuItem splayer2 = new MenuItem("xPlayer ~2", new ImageView(soundWave));
//Start:--Search on Web
Menu searchOnWeb = new Menu("Search on Web..", InfoTool.getImageViewFromResourcesFolder("searchWeb24.png"));
MenuItem soundCloud = new MenuItem("SoundCloud", InfoTool.getImageViewFromResourcesFolder("soundcloud24.png"));
MenuItem jamendo = new MenuItem("Jamendo", InfoTool.getImageViewFromResourcesFolder("jamendo24.png"));
MenuItem tunein = new MenuItem("tunein", InfoTool.getImageViewFromResourcesFolder("tunein24.png"));
MenuItem amazon = new MenuItem("amazon", InfoTool.getImageViewFromResourcesFolder("amazon24.png"));
MenuItem lastfm = new MenuItem("Last.fm", InfoTool.getImageViewFromResourcesFolder("lastfm24.png"));
MenuItem librefm = new MenuItem("Libre.fm", InfoTool.getImageViewFromResourcesFolder("librefm24.png"));
MenuItem youtube = new MenuItem("Youtube", InfoTool.getImageViewFromResourcesFolder("youtube24.png"));
MenuItem vimeo = new MenuItem("Vimeo", InfoTool.getImageViewFromResourcesFolder("vimeo24.png"));
MenuItem google = new MenuItem("Google", InfoTool.getImageViewFromResourcesFolder("google24.png"));
MenuItem duckduckgo = new MenuItem("DuckDuckgo", InfoTool.getImageViewFromResourcesFolder("duckduckgo24.png"));
MenuItem bing = new MenuItem("Bing", InfoTool.getImageViewFromResourcesFolder("bing24.png"));
MenuItem yahoo = new MenuItem("Yahoo", InfoTool.getImageViewFromResourcesFolder("yahoo24.png"));
//END:--Search on Web
/** The add on. */
Menu addOn = new Menu("Add on");
/** The x player 0. */
MenuItem xPlayer0 = new MenuItem("xPlayer ~0 PlayList");
/** The x player 1. */
MenuItem xPlayer1 = new MenuItem("xPlayer ~1 PlayList");
/** The x player 2. */
MenuItem xPlayer2 = new MenuItem("xPlayer ~2 PlayList");
/** The more. */
//Menu more = new Menu("More...", InfoTool.getImageViewFromDocuments("more.png"))
//--------------------------------
/** The information. */
//MenuItem information = new MenuItem("Information (I)", InfoTool.getImageViewFromDocuments("tag.png"))
/** The stars. (S) */
MenuItem stars = new MenuItem("Stars ", InfoTool.getImageViewFromResourcesFolder("smallStar.png"));
/** Show File (P) */
MenuItem showFile = new MenuItem("Show File ", InfoTool.getImageViewFromResourcesFolder("path.png"));
/** Find Lyrics (L) */
Menu findLyrics = new Menu("Find Lyrics", InfoTool.getImageViewFromResourcesFolder("Lyrics-24.png"));
MenuItem lyricFinderOrg = new MenuItem("LyricFinder.org", InfoTool.getImageViewFromResourcesFolder("Lyrics-24.png"));
MenuItem lyricsCom = new MenuItem("Lyrics.com", InfoTool.getImageViewFromResourcesFolder("Lyrics-24.png"));
/** Search by country */
Menu searchByCountry = new Menu("Search by country[Coming...]", InfoTool.getImageViewFromResourcesFolder("flag 24.png"));
/** Show Info (I) */
MenuItem showInfo = new MenuItem("Show Info[Coming..]", InfoTool.getImageViewFromResourcesFolder("tag.png"));
//--------------------------------
/** The copy. (C/M) */
MenuItem copy = new MenuItem("copy/move ", InfoTool.getImageViewFromResourcesFolder("copyFile.png"));
/** The move. */
//MenuItem move = new MenuItem("moveTo(M)")
/** The rename. (R) */
MenuItem rename = new MenuItem("Rename ", InfoTool.getImageViewFromResourcesFolder("rename.png"));
/** The simple delete. */
MenuItem simpleDelete = new MenuItem("Delete (Delete)", InfoTool.getImageViewFromResourcesFolder("delete2.png"));
/** The storage delete. */
MenuItem storageDelete = new MenuItem("Delete (Shift+Delete)", InfoTool.getImageViewFromResourcesFolder("delete.png"));
/** The separator 1. */
SeparatorMenuItem separator1 = new SeparatorMenuItem();
/** The separator 2. */
SeparatorMenuItem separator2 = new SeparatorMenuItem();
/** The previous genre. */
Genre previousGenre = Genre.UNKNOWN;
/**
* Constructor.
*/
public MediaContextMenu() {
//Add all the items
searchByCountry.setDisable(true);
showInfo.setDisable(true);
getItems().addAll(new TitleMenuItem("Basic"), startPlayer, stopPlayer, new TitleMenuItem("Search"), searchOnWeb, findLyrics, searchByCountry,
new TitleMenuItem("More"), stars, showFile, showInfo, new TitleMenuItem("File Edit"), rename, simpleDelete, storageDelete,
new TitleMenuItem("Organize"), copy);
//---play
startPlayer.getItems().addAll(player0, player1, player2);
startPlayer.getItems().forEach(item -> item.setOnAction(this::onAction));
//--stop
stopPlayer.getItems().addAll(splayer0, splayer1, splayer2);
stopPlayer.getItems().forEach(item -> item.setOnAction(this::onAction));
//---searchOnWeb
getItems().addAll();
//Start:--Search on Web
searchOnWeb.getItems().addAll(new TitleMenuItem("Popular"), soundCloud, jamendo, tunein, new TitleMenuItem("Shop"), amazon,
new TitleMenuItem("Radios"), librefm, lastfm, new TitleMenuItem("Video Sites"), youtube, vimeo, new TitleMenuItem("Search Engines"),
google, duckduckgo, bing, yahoo);
searchOnWeb.getItems().forEach(item -> item.setOnAction(this::onAction2));
//---findLyrics
findLyrics.getItems().addAll(new TitleMenuItem("Popular"), lyricFinderOrg, lyricsCom);
findLyrics.getItems().forEach(item -> item.setOnAction(this::onAction2));
//END:--Search on Web
// add on deck play list 0,1,2
addOn.setDisable(true);
addOn.getItems().addAll(xPlayer0, xPlayer1, xPlayer2);
addOn.getItems().forEach(item -> item.setOnAction(this::onAction));
// More
//more.getItems().addAll(stars, showFile)
//more.getItems().forEach(item -> item.setOnAction(this::onAction))
stars.setOnAction(this::onAction);
showFile.setOnAction(this::onAction);
copy.setOnAction(this::onAction);
//move.setOnAction(this::onAction)
simpleDelete.setOnAction(this::onAction);
storageDelete.setOnAction(this::onAction);
rename.setOnAction(this::onAction);
}
/**
* Shows the context menu based on the variables below.
*
* @param media1
* the media
* @param genre
* the genre
* @param x
* the d
* @param y
* the e
* @param controller1
* the controller
* @param node
*/
public void showContextMenu(Media media1 , Genre genre , double x , double y , SmartController controller1 , Node node) {
// Don't waste resources
if (previousGenre != genre)
if (media1.getGenre() == Genre.LIBRARYMEDIA)
getItems().forEach(item -> item.setVisible(true));
else if (media1.getGenre() == Genre.SEARCHWINDOW)
simpleDelete.setVisible(false);
//Determine the image
for (int i = 0; i <= 2; i++) {
boolean playerEnergized = Main.xPlayersList.getXPlayer(i).isOpened() || Main.xPlayersList.getXPlayer(i).isPausedOrPlaying()
|| Main.xPlayersList.getXPlayer(i).isSeeking();
( (ImageView) startPlayer.getItems().get(i).getGraphic() ).setImage(!playerEnergized ? null : soundWave);
( (ImageView) stopPlayer.getItems().get(i).getGraphic() ).setImage(!playerEnergized ? null : soundWave);
}
this.node = node;
this.media = media1;
this.controller = controller1;
// Show it
show(genre != Genre.SEARCHWINDOW ? Main.window : Main.searchWindow.getWindow(), x - super.getWidth(), y - 1);
previousGenre = genre;
//Y axis
double yIni = y - 50;
double yEnd = super.getY();
super.setY(yIni);
final DoubleProperty yProperty = new SimpleDoubleProperty(yIni);
yProperty.addListener((ob , n , n1) -> super.setY(n1.doubleValue()));
//X axis
// double xIni = screenX - super.getWidth() + super.getWidth() * 14 / 100 + 30;
// double xEnd = screenX - super.getWidth() + super.getWidth() * 14 / 100;
// super.setX(xIni);
// final DoubleProperty xProperty = new SimpleDoubleProperty(xIni);
// xProperty.addListener((ob, n, n1) -> super.setY(n1.doubleValue()));
//Timeline
Timeline timeIn = new Timeline();
timeIn.getKeyFrames().addAll(new KeyFrame(Duration.seconds(0.35), new KeyValue(yProperty, yEnd, Interpolator.EASE_BOTH)));
//new KeyFrame(Duration.seconds(0.5), new KeyValue(xProperty, xEnd, Interpolator.EASE_BOTH)))
timeIn.play();
}
/**
* Shows a popOver with informations for this Song.
*
* @param x
* the x
* @param y
* the y
*/
public void showPopOver(double x , double y) {
// this.media = media
// pop.show(media)
}
/**
* On action.
*
* @param e
* the a [[SuppressWarningsSpartan]]
*/
public void onAction(ActionEvent e) {
// --------------------play on deck 0
if (e.getSource() == player0) {
( (Audio) media ).playOnDeck(0, controller);
// play on deck 1
} else if (e.getSource() == player1) {
( (Audio) media ).playOnDeck(1, controller);
// play on deck 2
} else if (e.getSource() == player2) {
( (Audio) media ).playOnDeck(2, controller);
// ------------------stop deck 0
} else if (e.getSource() == splayer0) {
Main.xPlayersList.getXPlayer(0).stop();
// stop deck 1
} else if (e.getSource() == splayer1) {
Main.xPlayersList.getXPlayer(1).stop();
// stop deck 2
} else if (e.getSource() == splayer2) {
Main.xPlayersList.getXPlayer(2).stop();
}
// add on xPlayList 0
// } else if (a.getSource() == xPlayer0)
// Main.xPlayersList.getXPlayerUI(0).xPlayList.addItem(media.getSongPath(),
// true, true);
//
// // add on xPlayList 1
// else if (a.getSource() == xPlayer1)
// Main.xPlayersList.getXPlayerUI(1).xPlayList.addItem(media.getSongPath(),
// true, true);
//
// // add on xPlayList 2
// else if (a.getSource() == xPlayer2)
// Main.xPlayersList.getXPlayerUI(2).xPlayList.addItem(media.getSongPath(),
// true, true);
// delete from list
else if (e.getSource() == simpleDelete)
controller.prepareDelete(false);
// delete from Storage medium
else if (e.getSource() == storageDelete)
controller.prepareDelete(true);
// rename
else if (e.getSource() == rename) {
media.rename(controller, node);
//else if (e.getSource() == information) { // information
// showPopOver(media);
} else if (e.getSource() == stars)
media.updateStars(controller, node);
else if (e.getSource() == showFile) // File path
ActionTool.openFileLocation(media.getFilePath());
else if (e.getSource() == copy) // copyTo
Main.exportWindow.show(controller);
}
/**
* It is used for action events
*
* @param action
*/
public void onAction2(ActionEvent action) {
Object source = action.getSource();
String encoding = "UTF-8";
//media!=null [warning]
if (media != null) {
try {
//---------------------SEARCH ON WEB--------------------------------------------
//Music Sites
if (source == soundCloud)
ActionTool.openWebSite("https://soundcloud.com/search?q=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == jamendo)
ActionTool.openWebSite("https://www.jamendo.com/search?q=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == tunein)
ActionTool.openWebSite("http://tunein.com/search/?query=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == amazon)
ActionTool.openWebSite("https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Dpopular&field-keywords="
+ URLEncoder.encode(media.getTitle(), encoding));
else if (source == lastfm)
ActionTool.openWebSite("https://www.last.fm/search?q=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == librefm)
ActionTool.openWebSite(
"https://libre.fm/search.php?search_term=" + URLEncoder.encode(media.getTitle(), encoding) + "&search_type=artist");
//Video WebSites
else if (source == youtube)
ActionTool.openWebSite("https://www.youtube.com/results?search_query=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == vimeo)
ActionTool.openWebSite("https://vimeo.com/search?q=" + URLEncoder.encode(media.getTitle(), encoding));
//Search-Engines
else if (source == google)
ActionTool.openWebSite("https://www.google.com/search?q=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == duckduckgo)
ActionTool.openWebSite("https://duckduckgo.com/?q=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == bing)
ActionTool.openWebSite("http://www.bing.com/search?q=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == yahoo)
ActionTool.openWebSite("https://search.yahoo.com/search?p=" + URLEncoder.encode(media.getTitle(), encoding));
//-----------------------FIND LYRICS------------------------------------------------
else if (source == lyricFinderOrg)
ActionTool.openWebSite("http://search.lyricfinder.org/?query=" + URLEncoder.encode(media.getTitle(), encoding));
else if (source == lyricsCom)
ActionTool.openWebSite("http://www.lyrics.com/lyrics/" + URLEncoder.encode(media.getTitle(), encoding));
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
}
}
}