package com.soundlooper.system; import java.util.List; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.scene.control.ListView; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.stage.Stage; import javafx.stage.WindowEvent; import javafx.util.Callback; import com.soundlooper.exception.SoundLooperException; import com.soundlooper.model.SoundLooperPlayer; import com.soundlooper.model.song.Song; import com.soundlooper.model.tag.Tag; import com.soundlooper.service.entite.song.SongService; import com.soundlooper.system.util.MessagingUtil; public class ManageFavoriteController { public final static String DRAG_TYPE_TAG = "TAG"; public final static String DRAG_TYPE_SONG = "SONG"; @FXML private TreeView<Tag> treeView; @FXML private ListView<Song> songListView; @FXML private ListView<Tag> tagListView; private TreeItem<Tag> rootTreeItem; private Tag root; public void initialize(Stage stage) { stage.getScene().addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent e) { if (e.getCode() == KeyCode.ESCAPE) { stage.close(); } } }); root = Tag.getRoot(); rootTreeItem = new TreeItem<>(root); createLevel(root, rootTreeItem); treeView.setRoot(rootTreeItem); treeView.setCellFactory(new Callback<TreeView<Tag>, TreeCell<Tag>>() { @Override public TreeCell<Tag> call(TreeView<Tag> p) { return new ManageFavoriteTreeCellImpl(); } }); sort(treeView); rootTreeItem.setExpanded(true); songListView.setItems(SongService.getInstance().getSortedByNameFavoriteSongList()); songListView.setCellFactory(c -> new SongListCell()); ChangeListener<Song> changeSongListener = new ChangeListener<Song>() { @Override public void changed(ObservableValue<? extends Song> observable, Song oldValue, Song newValue) { if (newValue != null) { tagListView.setItems(newValue.tagListProperty()); } else { tagListView.setItems(null); } } }; songListView.getSelectionModel().selectedItemProperty().addListener(changeSongListener); tagListView.setCellFactory(c -> new SongTagListCell(this)); stage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent event) { songListView.getSelectionModel().selectedItemProperty().removeListener(changeSongListener); } }); } private void createLevel(Tag tag, TreeItem<Tag> treeItem) { List<Tag> listChildrenCopy = tag.getListChildrenCopy(); for (Tag children : listChildrenCopy) { TreeItem<Tag> childTreeItem = new TreeItem<>(children); treeItem.getChildren().add(childTreeItem); createLevel(children, childTreeItem); } } @FXML public void deleteFavorite() { Song song = songListView.getSelectionModel().getSelectedItem(); song.setFavorite(false); } @FXML public void deleteTag() { try { TreeItem<Tag> treeItem = treeView.getSelectionModel().getSelectedItem(); SoundLooperPlayer.getInstance().deleteTag(treeItem.getValue()); treeItem.getParent().getChildren().remove(treeItem); } catch (SoundLooperException e) { MessagingUtil.displayError("Impossible de supprimer le tag", e); } } @FXML public void addTag() { Tag newTag; try { TreeItem<Tag> parentTreeItem = treeView.getSelectionModel().getSelectedItem(); if (parentTreeItem == null) { parentTreeItem = treeView.getRoot(); } newTag = SoundLooperPlayer.getInstance().createTag( MessageReader.getInstance().getMessage("tag.defaultName"), parentTreeItem.getValue()); TreeItem<Tag> treeItem = new TreeItem<Tag>(newTag); parentTreeItem.getChildren().add(treeItem); sort(parentTreeItem); parentTreeItem.setExpanded(true); } catch (SoundLooperException e) { MessagingUtil.displayError("Impossible d'ajouter le tag", e); } } public static void addTag(TreeItem<Tag> parentTreeItem, Tag parentTag) throws SoundLooperException { Tag newTag = SoundLooperPlayer.getInstance().createTag( MessageReader.getInstance().getMessage("tag.defaultName"), parentTag); TreeItem<Tag> newTagTreeItem = new TreeItem<Tag>(newTag); parentTreeItem.getChildren().add(newTagTreeItem); sort(parentTreeItem); parentTreeItem.setExpanded(true); } public static void sort(TreeView<Tag> tree) { sort(tree.getRoot()); } public static void sort(TreeItem<Tag> item) { if (item == null || item.isLeaf()) { return; } FXCollections.sort(item.getChildren(), new ManageFavoriteTreeComparator()); for (TreeItem<Tag> childItem : item.getChildren()) { sort(childItem); } } public ListView<Song> getSongListView() { return songListView; } }