diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/listener/PadNewContentListener.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/listener/PadNewContentListener.java index 4f3477f2f5e9ffda660f9c3e066524d148e5e5d3..a4f8d15c21f8b8a2fe047bdb6447ca7e80de4cee 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/listener/PadNewContentListener.java +++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/listener/PadNewContentListener.java @@ -19,7 +19,6 @@ import java.io.File; import java.nio.file.Path; import java.util.Collections; import java.util.List; -import java.util.Set; public class PadNewContentListener { @@ -63,7 +62,7 @@ public class PadNewContentListener { if (files != null) { final Path path = files.get(0).toPath(); - final Set<PadContentFactory> connects = registry.getPadContentConnectsForFile(path); + final List<PadContentFactory> connects = registry.getPadContentConnectsForFile(path); if (!connects.isEmpty()) { if (connects.size() > 1) { // Multiple content types possible padContentTypeChooser.showOptions(connects, padContent -> diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java index 86b126b0ab85bd7df370c4bbc36de56112877d8f..4c4487aad5502668f8eae1825f6597ea7a00a354 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java +++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java @@ -5,6 +5,7 @@ import de.tobias.playpad.layout.desktop.DesktopEditMode; import de.tobias.playpad.layout.desktop.DesktopMainLayoutFactory; import de.tobias.playpad.pad.Pad; import de.tobias.playpad.pad.PadStatus; +import de.tobias.playpad.pad.content.PadContentFactory; import de.tobias.playpad.pad.content.PadContentRegistry; import de.tobias.playpad.pad.content.Playlistable; import de.tobias.playpad.pad.drag.ContentDragOption; @@ -28,9 +29,11 @@ import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import java.io.File; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; public class DesktopPadDragListener implements EventHandler<DragEvent> { @@ -90,23 +93,30 @@ public class DesktopPadDragListener implements EventHandler<DragEvent> { event.consume(); } + @SuppressWarnings("java:S1066") private void handleFileDropOver(DragEvent event) { final File file = event.getDragboard().getFiles().get(0); if (file.isFile()) { + final List<Path> paths = event.getDragboard().getFiles().stream().map(File::toPath).collect(Collectors.toList()); + // built-in file support - PadContentRegistry registry = PlayPadPlugin.getRegistries().getPadContents(); - List<ContentDragOption> connects = new ArrayList<>(registry.getPadContentConnectsForFile(file.toPath())); + final PadContentRegistry registry = PlayPadPlugin.getRegistries().getPadContents(); + final List<PadContentFactory> supportedContentTypes = registry.getPadContentConnectsForFiles(paths); + + final List<ContentDragOption> contentDragOptions = new ArrayList<>(supportedContentTypes); if (currentPad.getContent() instanceof Playlistable) { - connects.add(new PlaylistDragOption()); + if (supportedContentTypes.stream().anyMatch(factory -> factory.getType().equals(currentPad.getContent().getType()))) { + contentDragOptions.add(new PlaylistDragOption()); + } } - if (!connects.isEmpty()) { + if (!contentDragOptions.isEmpty()) { if (fileHud == null) { fileHud = new FileDragOptionView(padViewNode); } - fileHud.showOptions(connects); + fileHud.showOptions(contentDragOptions); event.acceptTransferModes(TransferMode.LINK); } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PadContentRegistry.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PadContentRegistry.java index 20e7f45d2ef3f798555acda8d0062c9cad47c5f5..a2614a95f34e7f86294ff57beb87777c818e8bcb 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PadContentRegistry.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PadContentRegistry.java @@ -12,17 +12,30 @@ public class PadContentRegistry extends ComponentRegistry<PadContentFactory> { super(name); } - public Set<PadContentFactory> getPadContentConnectsForFile(Path path) throws NoSuchComponentException { - Set<PadContentFactory> connects = new HashSet<>(); + public List<PadContentFactory> getPadContentConnectsForFile(Path paths) throws NoSuchComponentException { + return getPadContentConnectsForFiles(Collections.singletonList(paths)); + } + + public List<PadContentFactory> getPadContentConnectsForFiles(List<Path> paths) throws NoSuchComponentException { + final Set<PadContentFactory> connects = new HashSet<>(); for (String type : getTypes()) { PadContentFactory connect = getFactory(type); for (String extension : connect.getSupportedTypes()) { - if (path.getFileName().toString().toLowerCase().matches("." + extension)) { + if (isExtensionMatchingAllFiles(extension, paths)) { connects.add(connect); } } } - return connects; + return new ArrayList<>(connects); + } + + private boolean isExtensionMatchingAllFiles(String extension, List<Path> paths) { + for (Path path : paths) { + if (!path.getFileName().toString().toLowerCase().matches("." + extension)) { + return false; + } + } + return true; } public String[] getSupportedFileTypes() throws NoSuchComponentException {