diff --git a/src/main/java/org/cryptomator/ui/decryptname/DecryptFileNamesViewController.java b/src/main/java/org/cryptomator/ui/decryptname/DecryptFileNamesViewController.java index 5450e1d48..b7c14199f 100644 --- a/src/main/java/org/cryptomator/ui/decryptname/DecryptFileNamesViewController.java +++ b/src/main/java/org/cryptomator/ui/decryptname/DecryptFileNamesViewController.java @@ -58,8 +58,6 @@ public class DecryptFileNamesViewController implements FxController { private final Stage window; private final Vault vault; private final ResourceBundle resourceBundle; - private final List initialList; - @FXML public TableColumn ciphertextColumn; @FXML @@ -68,12 +66,11 @@ public class DecryptFileNamesViewController implements FxController { public TableView cipherToCleartextTable; @Inject - public DecryptFileNamesViewController(@DecryptNameWindow Stage window, @DecryptNameWindow Vault vault, @DecryptNameWindow List pathsToDecrypt, ResourceBundle resourceBundle) { + public DecryptFileNamesViewController(@DecryptNameWindow Stage window, @DecryptNameWindow Vault vault, ResourceBundle resourceBundle) { this.window = window; this.vault = vault; this.resourceBundle = resourceBundle; this.mapping = new SimpleListProperty<>(FXCollections.observableArrayList()); - this.initialList = pathsToDecrypt; } @FXML @@ -97,8 +94,7 @@ public class DecryptFileNamesViewController implements FxController { }); cipherToCleartextTable.setOnDragDropped(event -> { if (event.getGestureSource() == null && event.getDragboard().hasFiles()) { - checkAndDecrypt(event.getDragboard().getFiles().stream().map(File::toPath).toList()); - cipherToCleartextTable.setItems(mapping); + decrypt(event.getDragboard().getFiles().stream().map(File::toPath).toList()); } }); cipherToCleartextTable.setOnDragExited(_ -> cipherToCleartextTable.setItems(mapping)); @@ -124,9 +120,7 @@ public class DecryptFileNamesViewController implements FxController { }); } }); - if (!initialList.isEmpty()) { - checkAndDecrypt(initialList); - } + window.setOnHidden(_ -> mapping.clear()); } private void copySingleCelltoClipboard() { @@ -149,10 +143,18 @@ public class DecryptFileNamesViewController implements FxController { fileChooser.setInitialDirectory(vault.getPath().toFile()); var ciphertextNodes = fileChooser.showOpenMultipleDialog(window); if (ciphertextNodes != null) { - checkAndDecrypt(ciphertextNodes.stream().map(File::toPath).toList()); + decrypt(ciphertextNodes.stream().map(File::toPath).toList()); } } + public void decrypt(List pathsToDecrypt) { + if (pathsToDecrypt.isEmpty()) { + return; + } + checkAndDecrypt(pathsToDecrypt); + cipherToCleartextTable.setItems(mapping); + } + private void checkAndDecrypt(List pathsToDecrypt) { mapping.clear(); //Assumption: All files are in the same directory diff --git a/src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java index 7684d4286..4abf7ee3f 100644 --- a/src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java +++ b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java @@ -28,23 +28,28 @@ public interface DecryptNameComponent { @FxmlScene(FxmlFile.DECRYPTNAMES) Lazy decryptNamesView(); + DecryptFileNamesViewController controller(); + @DecryptNameWindow Vault vault(); - default void showDecryptFileNameWindow() { + default void showDecryptFileNameWindow(List pathsToDecrypt) { Stage s = window(); s.setScene(decryptNamesView().get()); s.sizeToScene(); if (vault().isUnlocked()) { + controller().decrypt(pathsToDecrypt); s.show(); + s.requestFocus(); } else { LOG.error("Aborted showing DecryptFileName window: vault state is not {}, but {}.", VaultState.Value.UNLOCKED, vault().getState()); + s.close(); } } @Subcomponent.Factory interface Factory { - DecryptNameComponent create(@BindsInstance @DecryptNameWindow Vault vault, @BindsInstance @Named("windowOwner") Stage owner, @BindsInstance @DecryptNameWindow List pathsToDecrypt); + DecryptNameComponent create(@BindsInstance @DecryptNameWindow Vault vault, @BindsInstance @Named("windowOwner") Stage owner); } } diff --git a/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java b/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java index 742e3baaa..92c2596f3 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java @@ -58,6 +58,7 @@ public class VaultDetailUnlockedController implements FxController { private final DecryptNameComponent.Factory decryptNameWindowFactory; private final ResourceBundle resourceBundle; private final LoadingCache vaultStats; + private final LoadingCache decryptNameWindows; private final VaultStatisticsComponent.Builder vaultStatsBuilder; private final ObservableValue accessibleViaPath; private final ObservableValue accessibleViaUri; @@ -90,6 +91,7 @@ public class VaultDetailUnlockedController implements FxController { this.decryptNameWindowFactory = decryptNameWindowFactory; this.resourceBundle = resourceBundle; this.vaultStats = CacheBuilder.newBuilder().weakValues().build(CacheLoader.from(this::buildVaultStats)); + this.decryptNameWindows = CacheBuilder.newBuilder().weakValues().build(CacheLoader.from(this::buildDecryptNameWindow)); this.vaultStatsBuilder = vaultStatsBuilder; var mp = vault.flatMap(Vault::mountPointProperty); this.accessibleViaPath = mp.map(m -> m instanceof Mountpoint.WithPath).orElse(false); @@ -161,7 +163,7 @@ public class VaultDetailUnlockedController implements FxController { } private void showDecryptNameWindow(List pathsToDecrypt) { - decryptNameWindowFactory.create(vault.get(), mainWindow, pathsToDecrypt).showDecryptFileNameWindow(); + decryptNameWindows.getUnchecked(vault.get()).showDecryptFileNameWindow(pathsToDecrypt); } private boolean startsWithVaultAccessPoint(Path path) { @@ -198,6 +200,10 @@ public class VaultDetailUnlockedController implements FxController { return vaultStatsBuilder.vault(vault).build(); } + private DecryptNameComponent buildDecryptNameWindow(Vault vault) { + return decryptNameWindowFactory.create(vault, mainWindow); + } + @FXML public void revealAccessLocation() { vaultService.reveal(vault.get());