From 45384522053a56f7ff568933e2392443923df360 Mon Sep 17 00:00:00 2001 From: tobias <thinkdifferent055@gmail.com> Date: Mon, 30 Nov 2020 19:44:09 +0100 Subject: [PATCH] Check all file types in drag and drop for content replace and playlist append --- .../listener/PadNewContentListener.java | 3 +-- .../desktop/pad/DesktopPadDragListener.java | 20 +++++++++++++----- .../pad/content/PadContentRegistry.java | 21 +++++++++++++++---- 3 files changed, 33 insertions(+), 11 deletions(-) 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 4f3477f2..a4f8d15c 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 86b126b0..4c4487aa 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 20e7f45d..a2614a95 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 { -- GitLab