1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| package listfile;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.ListCell;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
public class BirdCell extends ListCell<File> {
private static final Map<File, Image> IMAGE_CACHE_MAP = new WeakHashMap<>();
private final ImageView imageView = new ImageView();
private File file;
public BirdCell() {
imageView.setFitWidth(100);
imageView.setFitHeight(100);
imageView.setPreserveRatio(true);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setAlignment(Pos.CENTER);
setOnDragDetected(event -> {
if (getItem() == null) {
return;
}
Dragboard dragboard = startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putFiles(Arrays.asList(getItem()));
final Image source = IMAGE_CACHE_MAP.get(getItem());
// content.putImage(source);
if (source != null) {
final ImageView thumbnail = new ImageView(source);
thumbnail.setFitWidth(75);
thumbnail.setFitHeight(75);
thumbnail.setPreserveRatio(true);
final Image preview = thumbnail.snapshot(null, null);
dragboard.setDragView(preview);
}
dragboard.setContent(content);
event.consume();
});
setOnDragOver(event -> {
if (event.getGestureSource() != BirdCell.this && event.getDragboard().hasFiles()) {
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});
setOnDragEntered(event -> {
if (event.getGestureSource() != BirdCell.this && event.getDragboard().hasFiles()) {
setOpacity(0.3);
}
});
setOnDragExited(event -> {
if (event.getGestureSource() != BirdCell.this && event.getDragboard().hasFiles()) {
setOpacity(1);
}
});
setOnDragDropped(event -> {
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasFiles()) {
if (!isEmpty()) {
ObservableList<File> items = getListView().getItems();
int draggedIdx = items.indexOf(db.getFiles().get(0));
int thisIdx = items.indexOf(getItem());
List<File> itemscopy = new ArrayList<>(getListView().getItems());
itemscopy.set(draggedIdx, items.get(thisIdx));
itemscopy.set(thisIdx, items.get(draggedIdx));
getListView().getItems().setAll(itemscopy);
success = true;
} else {
// Permet de rajouter des fichiers dans la partie vide de la liste.
db.getFiles().stream()
.filter(file -> !getListView().getItems().contains(file))
.forEach(getListView().getItems()::add);
}
}
event.setDropCompleted(success);
event.consume();
});
setOnDragDone(DragEvent::consume);
}
@Override
protected void updateItem(File item, boolean empty) {
super.updateItem(item, empty);
imageView.setImage(null);
String text = null;
Node graphic = null;
if (!empty && item != null) {
text = item.getAbsolutePath();
try {
Image image = IMAGE_CACHE_MAP.get(item);
if (image == null) {
image = new Image(item.toURI().toURL().toExternalForm());
IMAGE_CACHE_MAP.put(item, image);
}
imageView.setImage(image);
graphic = imageView;
} catch (Exception ex) {
Logger.getLogger(BirdCell.class.getName()).log(Level.WARNING, null, ex);
}
}
setText(text);
setGraphic(graphic);
}
} |
Partager