Browse Source

draft

Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
Armin Schrenk 2 months ago
parent
commit
db92fbeff5

+ 110 - 40
src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java

@@ -13,6 +13,8 @@ import org.cryptomator.integrations.revealpath.RevealFailedException;
 import org.cryptomator.integrations.revealpath.RevealPathService;
 import org.cryptomator.integrations.revealpath.RevealPathService;
 import org.cryptomator.ui.common.FxController;
 import org.cryptomator.ui.common.FxController;
 import org.cryptomator.ui.common.VaultService;
 import org.cryptomator.ui.common.VaultService;
+import org.cryptomator.ui.controls.FontAwesome5Icon;
+import org.cryptomator.ui.controls.FontAwesome5IconView;
 import org.cryptomator.ui.fxapp.FxApplicationWindows;
 import org.cryptomator.ui.fxapp.FxApplicationWindows;
 import org.cryptomator.ui.stats.VaultStatisticsComponent;
 import org.cryptomator.ui.stats.VaultStatisticsComponent;
 import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent;
 import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent;
@@ -21,18 +23,29 @@ import org.slf4j.LoggerFactory;
 
 
 import javax.inject.Inject;
 import javax.inject.Inject;
 import javafx.application.Platform;
 import javafx.application.Platform;
+import javafx.beans.binding.ListExpression;
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.BooleanProperty;
+import javafx.beans.property.ListProperty;
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.property.ReadOnlyObjectProperty;
 import javafx.beans.property.ReadOnlyObjectProperty;
 import javafx.beans.property.SimpleBooleanProperty;
 import javafx.beans.property.SimpleBooleanProperty;
+import javafx.beans.property.SimpleListProperty;
 import javafx.beans.value.ObservableValue;
 import javafx.beans.value.ObservableValue;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
 import javafx.fxml.FXML;
 import javafx.fxml.FXML;
+import javafx.geometry.Insets;
 import javafx.scene.control.Button;
 import javafx.scene.control.Button;
+import javafx.scene.control.ContentDisplay;
+import javafx.scene.control.Label;
+import javafx.scene.control.ListCell;
+import javafx.scene.control.ListView;
 import javafx.scene.input.Clipboard;
 import javafx.scene.input.Clipboard;
 import javafx.scene.input.ClipboardContent;
 import javafx.scene.input.ClipboardContent;
 import javafx.scene.input.DataFormat;
 import javafx.scene.input.DataFormat;
 import javafx.scene.input.DragEvent;
 import javafx.scene.input.DragEvent;
 import javafx.scene.input.TransferMode;
 import javafx.scene.input.TransferMode;
+import javafx.scene.layout.HBox;
 import javafx.stage.FileChooser;
 import javafx.stage.FileChooser;
 import javafx.stage.Stage;
 import javafx.stage.Stage;
 import java.io.File;
 import java.io.File;
@@ -47,7 +60,6 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Function;
-import java.util.stream.Collectors;
 
 
 @MainWindowScoped
 @MainWindowScoped
 public class VaultDetailUnlockedController implements FxController {
 public class VaultDetailUnlockedController implements FxController {
@@ -70,7 +82,8 @@ public class VaultDetailUnlockedController implements FxController {
 	private final BooleanProperty draggingOverLocateEncrypted = new SimpleBooleanProperty();
 	private final BooleanProperty draggingOverLocateEncrypted = new SimpleBooleanProperty();
 	private final BooleanProperty draggingOverDecryptName = new SimpleBooleanProperty();
 	private final BooleanProperty draggingOverDecryptName = new SimpleBooleanProperty();
 	private final BooleanProperty ciphertextPathsCopied = new SimpleBooleanProperty();
 	private final BooleanProperty ciphertextPathsCopied = new SimpleBooleanProperty();
-	private final BooleanProperty cleartextNamesCopied = new SimpleBooleanProperty();
+	private final BooleanProperty decryptNameViewShowing = new SimpleBooleanProperty();
+	private final ListProperty<Path> pathsToDecrypt = new SimpleListProperty<>(FXCollections.observableArrayList());
 
 
 	@FXML
 	@FXML
 	public Button revealEncryptedDropZone;
 	public Button revealEncryptedDropZone;
@@ -106,13 +119,18 @@ public class VaultDetailUnlockedController implements FxController {
 		revealEncryptedDropZone.setOnDragExited(_ -> draggingOverLocateEncrypted.setValue(false));
 		revealEncryptedDropZone.setOnDragExited(_ -> draggingOverLocateEncrypted.setValue(false));
 
 
 		decryptNameDropZone.setOnDragOver(e -> handleDragOver(e, draggingOverDecryptName));
 		decryptNameDropZone.setOnDragOver(e -> handleDragOver(e, draggingOverDecryptName));
-		decryptNameDropZone.setOnDragDropped(e -> handleDragDropped(e, this::getCleartextName, this::copyDecryptedNamesToClipboard));
+		decryptNameDropZone.setOnDragDropped(e -> {
+			decryptNameViewShowing.set(true);
+			pathsToDecrypt.addAll(e.getDragboard().getFiles().stream().map(File::toPath).toList());
+		});
 		decryptNameDropZone.setOnDragExited(_ -> draggingOverDecryptName.setValue(false));
 		decryptNameDropZone.setOnDragExited(_ -> draggingOverDecryptName.setValue(false));
+		initDecryptNameFeature();
 
 
 		EasyBind.includeWhen(revealEncryptedDropZone.getStyleClass(), ACTIVE_CLASS, draggingOverLocateEncrypted);
 		EasyBind.includeWhen(revealEncryptedDropZone.getStyleClass(), ACTIVE_CLASS, draggingOverLocateEncrypted);
 		EasyBind.includeWhen(decryptNameDropZone.getStyleClass(), ACTIVE_CLASS, draggingOverDecryptName);
 		EasyBind.includeWhen(decryptNameDropZone.getStyleClass(), ACTIVE_CLASS, draggingOverDecryptName);
 	}
 	}
 
 
+
 	private void handleDragOver(DragEvent event, BooleanProperty prop) {
 	private void handleDragOver(DragEvent event, BooleanProperty prop) {
 		if (event.getGestureSource() == null && event.getDragboard().hasFiles()) {
 		if (event.getGestureSource() == null && event.getDragboard().hasFiles()) {
 			if (SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC) {
 			if (SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC) {
@@ -153,39 +171,8 @@ public class VaultDetailUnlockedController implements FxController {
 	}
 	}
 
 
 	@FXML
 	@FXML
-	public void chooseEncryptedFileAndCopyNames() {
-		var fileChooser = new FileChooser();
-		fileChooser.setTitle(resourceBundle.getString("main.vaultDetail.decryptName.filePickerTitle"));
-
-		fileChooser.setInitialDirectory(vault.getValue().getPath().toFile());
-		var ciphertextNode = fileChooser.showOpenDialog(mainWindow);
-		if (ciphertextNode != null) {
-			var nodeName = getCleartextName(ciphertextNode.toPath());
-			copyDecryptedNamesToClipboard(List.of(nodeName));
-		}
-	}
-
-	private void copyDecryptedNamesToClipboard(List<CipherToCleartext> mapping) {
-		if (mapping.size() == 1) {
-			Clipboard.getSystemClipboard().setContent(Map.of(DataFormat.PLAIN_TEXT, mapping.getFirst().cleartext));
-		} else {
-			var content = mapping.stream().map(CipherToCleartext::toString).collect(Collectors.joining("\n"));
-			Clipboard.getSystemClipboard().setContent(Map.of(DataFormat.PLAIN_TEXT, content));
-		}
-		cleartextNamesCopied.setValue(true);
-		CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS, Platform::runLater).execute(() -> {
-			cleartextNamesCopied.set(false);
-		});
-	}
-
-	@Nullable
-	private CipherToCleartext getCleartextName(Path ciphertextNode) {
-		try {
-			return new CipherToCleartext(ciphertextNode.getFileName().toString(), vault.get().getCleartextName(ciphertextNode));
-		} catch (IOException e) {
-			LOG.warn("Failed to decrypt filename for {}", ciphertextNode, e);
-			return null;
-		}
+	public void showDecryptNameView() {
+		decryptNameViewShowing.set(true);
 	}
 	}
 
 
 	private boolean startsWithVaultAccessPoint(Path path) {
 	private boolean startsWithVaultAccessPoint(Path path) {
@@ -310,11 +297,94 @@ public class VaultDetailUnlockedController implements FxController {
 		return ciphertextPathsCopied.get();
 		return ciphertextPathsCopied.get();
 	}
 	}
 
 
-	public BooleanProperty cleartextNamesCopiedProperty() {
-		return cleartextNamesCopied;
+	public BooleanProperty decryptNameViewShowingProperty() {
+		return decryptNameViewShowing;
+	}
+
+	public boolean isDecryptNameViewShowing() {
+		return decryptNameViewShowing.get();
+	}
+
+	@FXML
+	public void closeDecryptNameView() {
+		decryptNameViewShowing.set(false);
+	}
+
+	//new stuff
+
+	@FXML
+	public void selectAndDecrypt() {
+		var fileChooser = new FileChooser();
+		fileChooser.setTitle(resourceBundle.getString("main.vaultDetail.decryptName.filePickerTitle"));
+
+		fileChooser.setInitialDirectory(vault.getValue().getPath().toFile());
+		var ciphertextNodes = fileChooser.showOpenMultipleDialog(mainWindow);
+		if (ciphertextNodes != null) {
+			pathsToDecrypt.clear();
+			pathsToDecrypt.addAll(ciphertextNodes.stream().map(File::toPath).toList());
+		}
+	}
+
+	@Nullable
+	private CipherToCleartext getCleartextName(Path ciphertextNode) {
+		try {
+			return new CipherToCleartext(ciphertextNode.getFileName().toString(), vault.get().getCleartextName(ciphertextNode));
+		} catch (IOException e) {
+			LOG.warn("Failed to decrypt filename for {}", ciphertextNode, e);
+			return null;
+		}
+	}
+
+	public ListView<Path> decryptedNamesView;
+
+	public ObservableValue<Boolean> decryptedPathsListEmptyProperty() {
+		return pathsToDecrypt.emptyProperty();
+	}
+
+	public boolean isDecryptedPathsListEmpty() {
+		return pathsToDecrypt.isEmpty();
 	}
 	}
 
 
-	public boolean isCleartextNamesCopied() {
-		return cleartextNamesCopied.get();
+	private void initDecryptNameFeature() {
+		decryptNameViewShowing.addListener((_,_,isShowing) -> {
+			if(!isShowing) {
+				pathsToDecrypt.clear();
+			}
+		});
+		decryptedNamesView.setItems(pathsToDecrypt);
+		decryptedNamesView.setCellFactory(this::createListCell);
 	}
 	}
+
+	private ListCell<Path> createListCell(ListView<Path> pathListView) {
+		return new ListCell<Path>() {
+			private final HBox root;
+			private final FontAwesome5IconView icon;
+			private final Label encryptedName;
+
+			{
+				setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
+				encryptedName = new Label();
+				icon = new FontAwesome5IconView();
+				root = new HBox(icon, encryptedName);
+				root.setSpacing(6.0);
+				root.setPadding(new Insets(6));
+			}
+
+			@Override
+			protected void updateItem(Path item, boolean empty) {
+				super.updateItem(item, empty);
+
+				if (item == null || empty) {
+					setGraphic(null);
+				} else {
+					encryptedName.setText(item.toString());
+					icon.setGlyph(FontAwesome5Icon.LOCK);
+					setGraphic(root);
+					getStyleClass().add("test-list-cell");
+				}
+			}
+		};
+	}
+
 }
 }
+

+ 58 - 0
src/main/resources/css/dark_theme.css

@@ -972,4 +972,62 @@
 	-fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL;
 	-fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL;
 	-fx-background-insets: 0, 1px;
 	-fx-background-insets: 0, 1px;
 	-fx-background-radius: 4px;
 	-fx-background-radius: 4px;
+}
+
+.test-style {
+	/*-fx-background-color: rgba(88,94,98,0.7), rgba(53,57,59,0.7) ;*/
+	-fx-background-color: CONTROL_BORDER_NORMAL, MAIN_BG;
+	-fx-background-insets: 0, 1px;
+	-fx-background-radius: 4px;
+}
+
+.test-style2 {
+	/*-fx-background-color: rgba(88,94,98,0.7), rgba(53,57,59,0.7) ;*/
+	-fx-background-color: CONTROL_BG_NORMAL;
+	-fx-background-insets: 1px;
+	-fx-background-radius: 4px;
+	-fx-border-width: 4px;
+	-fx-border-style: dashed inside;
+	-fx-border-color: CONTROL_BORDER_NORMAL;
+	-fx-border-radius: 4px;
+}
+
+.test-style2:hover {
+	/*-fx-background-color: rgba(88,94,98,0.7), rgba(53,57,59,0.7) ;*/
+	-fx-background-color: CONTROL_BG_HOVER;
+}
+
+.test-list-view {
+	-fx-background-color: CONTROL_BG_NORMAL;
+}
+
+.test-list-view:focused .list-cell:selected {
+	-fx-background-color: PRIMARY, CONTROL_BG_SELECTED;
+	-fx-background-insets: 0, 0 0 0 3px;
+}
+
+.test-list-cell:selected {
+	-fx-background-color: CONTROL_BG_SELECTED;
+}
+
+.test-list-cell .glyph-icon {
+	-fx-fill: TEXT_FILL_MUTED;
+}
+
+.test-list-cell .header-label {
+	-fx-font-family: 'Open Sans SemiBold';
+	-fx-font-size: 1.0em;
+}
+
+.test-list-cell .detail-label {
+	-fx-text-fill: TEXT_FILL_MUTED;
+	-fx-font-size: 0.8em;
+}
+
+.test-list-cell:selected .glyph-icon {
+	-fx-fill: PRIMARY;
+}
+
+.test-list-cell:selected .header-label {
+	-fx-text-fill: TEXT_FILL_HIGHLIGHTED;
 }
 }

+ 101 - 85
src/main/resources/fxml/vault_detail_unlocked.fxml

@@ -9,96 +9,112 @@
 <?import javafx.scene.layout.StackPane?>
 <?import javafx.scene.layout.StackPane?>
 <?import javafx.scene.layout.VBox?>
 <?import javafx.scene.layout.VBox?>
 <?import javafx.scene.text.Text?>
 <?import javafx.scene.text.Text?>
-<VBox xmlns:fx="http://javafx.com/fxml"
-	  xmlns="http://javafx.com/javafx"
-	  fx:controller="org.cryptomator.ui.mainwindow.VaultDetailUnlockedController"
-	  alignment="TOP_CENTER"
-	  spacing="9">
-	<Label text="%main.vaultDetail.accessLocation"/>
-	<Button styleClass="button-large" contentDisplay="GRAPHIC_ONLY" minWidth="120" onAction="#revealAccessLocation" defaultButton="${controller.accessibleViaPath}" visible="${controller.accessibleViaPath}" managed="${controller.accessibleViaPath}">
-		<graphic>
-			<HBox spacing="12" alignment="CENTER">
-				<FontAwesome5IconView glyph="HDD" glyphSize="24"/>
-				<VBox spacing="4" alignment="CENTER_LEFT">
-					<Label text="%main.vaultDetail.revealBtn"/>
-					<Label styleClass="label-extra-small" text="${controller.mountPoint}" textOverrun="CENTER_ELLIPSIS"/>
-				</VBox>
-			</HBox>
-		</graphic>
-	</Button>
-	<Button styleClass="button-large" contentDisplay="GRAPHIC_ONLY" minWidth="120" onAction="#copyMountUri" defaultButton="${controller.accessibleViaUri}" visible="${controller.accessibleViaUri}" managed="${controller.accessibleViaUri}">
-		<graphic>
-			<HBox spacing="12" alignment="CENTER">
-				<FontAwesome5IconView glyph="LINK" glyphSize="24"/>
-				<VBox spacing="4" alignment="CENTER_LEFT">
-					<Label text="%main.vaultDetail.copyUri"/>
-					<Label styleClass="label-extra-small" text="${controller.mountPoint}" textOverrun="CENTER_ELLIPSIS"/>
-				</VBox>
-			</HBox>
-		</graphic>
-	</Button>
-	<Button text="%main.vaultDetail.lockBtn" minWidth="120" onAction="#lock">
-		<graphic>
-			<FontAwesome5IconView glyph="KEY"/>
-		</graphic>
-	</Button>
+<?import javafx.scene.control.ListView?>
+<StackPane xmlns:fx="http://javafx.com/fxml"
+		   xmlns="http://javafx.com/javafx"
+		   fx:controller="org.cryptomator.ui.mainwindow.VaultDetailUnlockedController"
+		   >
+	<VBox spacing="9" alignment="TOP_CENTER">
+		<Label text="%main.vaultDetail.accessLocation"/>
+		<Button styleClass="button-large" contentDisplay="GRAPHIC_ONLY" minWidth="120" onAction="#revealAccessLocation" defaultButton="${controller.accessibleViaPath}" visible="${controller.accessibleViaPath}" managed="${controller.accessibleViaPath}">
+			<graphic>
+				<HBox spacing="12" alignment="CENTER">
+					<FontAwesome5IconView glyph="HDD" glyphSize="24"/>
+					<VBox spacing="4" alignment="CENTER_LEFT">
+						<Label text="%main.vaultDetail.revealBtn"/>
+						<Label styleClass="label-extra-small" text="${controller.mountPoint}" textOverrun="CENTER_ELLIPSIS"/>
+					</VBox>
+				</HBox>
+			</graphic>
+		</Button>
+		<Button styleClass="button-large" contentDisplay="GRAPHIC_ONLY" minWidth="120" onAction="#copyMountUri" defaultButton="${controller.accessibleViaUri}" visible="${controller.accessibleViaUri}" managed="${controller.accessibleViaUri}">
+			<graphic>
+				<HBox spacing="12" alignment="CENTER">
+					<FontAwesome5IconView glyph="LINK" glyphSize="24"/>
+					<VBox spacing="4" alignment="CENTER_LEFT">
+						<Label text="%main.vaultDetail.copyUri"/>
+						<Label styleClass="label-extra-small" text="${controller.mountPoint}" textOverrun="CENTER_ELLIPSIS"/>
+					</VBox>
+				</HBox>
+			</graphic>
+		</Button>
+		<Button text="%main.vaultDetail.lockBtn" minWidth="120" onAction="#lock">
+			<graphic>
+				<FontAwesome5IconView glyph="KEY"/>
+			</graphic>
+		</Button>
 
 
-	<Region VBox.vgrow="ALWAYS"/>
+		<Region VBox.vgrow="ALWAYS"/>
 
 
-	<HBox alignment="BOTTOM_CENTER">
-		<StackPane visible="${controller.accessibleViaPath}" managed="${controller.accessibleViaPath}">
-			<padding>
-				<Insets topRightBottomLeft="0"/>
-			</padding>
-			<Button fx:id="revealEncryptedDropZone" styleClass="drag-n-drop" text="%main.vaultDetail.locateEncryptedFileBtn" minWidth="120" maxWidth="180" prefHeight="72" wrapText="true" textAlignment="CENTER" onAction="#chooseDecryptedFileAndReveal" contentDisplay="TOP" visible="${!controller.ciphertextPathsCopied}" managed="${!controller.ciphertextPathsCopied}">
-				<graphic>
-					<Text styleClass="cryptic-text" text="abc → 101010"/>
-				</graphic>
-				<tooltip>
-					<Tooltip text="%main.vaultDetail.locateEncryptedFileBtn.tooltip"/>
-				</tooltip>
-			</Button>
-			<Button styleClass="drag-n-drop" text="%main.vaultDetail.encryptedPathsCopied" minWidth="120" maxWidth="180" prefHeight="72" wrapText="true" textAlignment="CENTER" onAction="#chooseDecryptedFileAndReveal" contentDisplay="TOP" visible="${controller.ciphertextPathsCopied}" managed="${controller.ciphertextPathsCopied}">
+		<HBox alignment="BOTTOM_CENTER">
+			<StackPane visible="${controller.accessibleViaPath}" managed="${controller.accessibleViaPath}">
+				<padding>
+					<Insets topRightBottomLeft="0"/>
+				</padding>
+				<Button fx:id="revealEncryptedDropZone" styleClass="drag-n-drop" text="%main.vaultDetail.locateEncryptedFileBtn" minWidth="120" maxWidth="180" prefHeight="72" wrapText="true" textAlignment="CENTER" onAction="#chooseDecryptedFileAndReveal" contentDisplay="TOP" visible="${!controller.ciphertextPathsCopied}" managed="${!controller.ciphertextPathsCopied}">
+					<graphic>
+						<Text styleClass="cryptic-text" text="abc → 101010"/>
+					</graphic>
+					<tooltip>
+						<Tooltip text="%main.vaultDetail.locateEncryptedFileBtn.tooltip"/>
+					</tooltip>
+				</Button>
+			</StackPane>
+			<!-- decrypt file name -->
+			<StackPane>
+				<padding>
+					<Insets topRightBottomLeft="0"/>
+				</padding>
+				<Button fx:id="decryptNameDropZone" styleClass="drag-n-drop" text="%main.vaultDetail.decryptName.buttonLabel" minWidth="120" maxWidth="180" prefHeight="72" wrapText="true" textAlignment="CENTER" onAction="#showDecryptNameView" contentDisplay="TOP">
+					<graphic>
+						<Text styleClass="cryptic-text" text="101010 → abc"/>
+					</graphic>
+					<tooltip>
+						<Tooltip text="%main.vaultDetail.decryptName.tooltip"/>
+					</tooltip>
+				</Button>
+			</StackPane>
+
+			<Region HBox.hgrow="ALWAYS"/>
+
+			<Button text="%main.vaultDetail.stats" minWidth="120" onAction="#showVaultStatistics" contentDisplay="BOTTOM" prefHeight="72">
 				<graphic>
 				<graphic>
-					<FontAwesome5IconView glyph="CHECK" glyphSize="15"/>
+					<VBox spacing="6">
+						<HBox alignment="CENTER_RIGHT" spacing="6">
+							<Label styleClass="label-small,label-muted" text="%main.vaultDetail.bytesPerSecondRead"/>
+							<ThroughputLabel styleClass="label-small,label-muted" alignment="CENTER_RIGHT" minWidth="60" idleFormat="%main.vaultDetail.throughput.idle" kibsFormat="%main.vaultDetail.throughput.kbps" mibsFormat="%main.vaultDetail.throughput.mbps" bytesPerSecond="${controller.vault.stats.bytesPerSecondRead}"/>
+						</HBox>
+						<HBox alignment="CENTER_RIGHT" spacing="6">
+							<Label styleClass="label-small,label-muted" text="%main.vaultDetail.bytesPerSecondWritten"/>
+							<ThroughputLabel styleClass="label-small,label-muted" alignment="CENTER_RIGHT" minWidth="60" idleFormat="%main.vaultDetail.throughput.idle" kibsFormat="%main.vaultDetail.throughput.kbps" mibsFormat="%main.vaultDetail.throughput.mbps" bytesPerSecond="${controller.vault.stats.bytesPerSecondWritten}"/>
+						</HBox>
+					</VBox>
 				</graphic>
 				</graphic>
 			</Button>
 			</Button>
-		</StackPane>
-		<!-- decrypt file name -->
+		</HBox>
+	</VBox>
+	<VBox visible="${controller.decryptNameViewShowing}" mouseTransparent="${!controller.decryptNameViewShowing}" styleClass="test-style" alignment="TOP_CENTER" spacing="6">
+		<padding>
+			<Insets topRightBottomLeft="24"/>
+		</padding>
 		<StackPane>
 		<StackPane>
-			<padding>
-				<Insets topRightBottomLeft="0"/>
-			</padding>
-			<Button fx:id="decryptNameDropZone" styleClass="drag-n-drop" text="%main.vaultDetail.decryptName.buttonLabel" minWidth="120" maxWidth="180" prefHeight="72" wrapText="true" textAlignment="CENTER" onAction="#chooseEncryptedFileAndCopyNames" contentDisplay="TOP" visible="${!controller.cleartextNamesCopied}" managed="${!controller.cleartextNamesCopied}">
-				<graphic>
-					<Text styleClass="cryptic-text" text="101010 → abc"/>
-				</graphic>
-				<tooltip>
-					<Tooltip text="%main.vaultDetail.decryptName.tooltip"/>
-				</tooltip>
-			</Button>
-			<Button styleClass="drag-n-drop" text="%main.vaultDetail.decryptName.copied" minWidth="120" maxWidth="180" prefHeight="72" wrapText="true" textAlignment="CENTER" onAction="#chooseEncryptedFileAndCopyNames" contentDisplay="TOP" visible="${controller.cleartextNamesCopied}" managed="${controller.cleartextNamesCopied}">
+			<Label text="Decrypt File Name" styleClass="label-large"/>
+			<HBox>
+				<Region HBox.hgrow="ALWAYS"/>
+				<Button onAction="#closeDecryptNameView" contentDisplay="GRAPHIC_ONLY">
+					<graphic>
+						<FontAwesome5IconView glyph="TIMES" glyphSize="16" />
+					</graphic>
+				</Button>
+			</HBox>
+		</StackPane>
+		<VBox alignment="CENTER" VBox.vgrow="ALWAYS" styleClass="test-style2" visible="${controller.decryptedPathsListEmpty}" managed="${controller.decryptedPathsListEmpty}" onMouseClicked="#selectAndDecrypt">
+			<Label fx:id="dropZoneText" text="Drop or click to decrypt names of files" contentDisplay="TOP">
 				<graphic>
 				<graphic>
-					<FontAwesome5IconView glyph="CHECK" glyphSize="15"/>
+					<FontAwesome5IconView fx:id="dropZoneId" glyph="FILE_IMPORT" glyphSize="16"/>
 				</graphic>
 				</graphic>
-			</Button>
-		</StackPane>
-
-		<Region HBox.hgrow="ALWAYS"/>
-
-		<Button text="%main.vaultDetail.stats" minWidth="120" onAction="#showVaultStatistics" contentDisplay="BOTTOM" prefHeight="72">
-			<graphic>
-				<VBox spacing="6">
-					<HBox alignment="CENTER_RIGHT" spacing="6">
-						<Label styleClass="label-small,label-muted" text="%main.vaultDetail.bytesPerSecondRead"/>
-						<ThroughputLabel styleClass="label-small,label-muted" alignment="CENTER_RIGHT" minWidth="60" idleFormat="%main.vaultDetail.throughput.idle" kibsFormat="%main.vaultDetail.throughput.kbps" mibsFormat="%main.vaultDetail.throughput.mbps" bytesPerSecond="${controller.vault.stats.bytesPerSecondRead}"/>
-					</HBox>
-					<HBox alignment="CENTER_RIGHT" spacing="6">
-						<Label styleClass="label-small,label-muted" text="%main.vaultDetail.bytesPerSecondWritten"/>
-						<ThroughputLabel styleClass="label-small,label-muted" alignment="CENTER_RIGHT" minWidth="60" idleFormat="%main.vaultDetail.throughput.idle" kibsFormat="%main.vaultDetail.throughput.kbps" mibsFormat="%main.vaultDetail.throughput.mbps" bytesPerSecond="${controller.vault.stats.bytesPerSecondWritten}"/>
-					</HBox>
-				</VBox>
-			</graphic>
-		</Button>
-	</HBox>
-</VBox>
+			</Label>
+		</VBox>
+		<ListView fx:id="decryptedNamesView" styleClass="test-list-view" VBox.vgrow="ALWAYS" visible="${!controller.decryptedPathsListEmpty}" managed="${!controller.decryptedPathsListEmpty}"/>
+	</VBox>
+</StackPane>