From afc62656bf612b6b6236a8bbebb6e50dc98fb4df Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Sat, 13 Dec 2014 15:08:26 +0100 Subject: [PATCH 1/2] - learning mathematics --- .../ui/src/main/java/org/cryptomator/ui/UnlockedController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/UnlockedController.java b/main/ui/src/main/java/org/cryptomator/ui/UnlockedController.java index d14408bc7..7d7b05452 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/UnlockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/UnlockedController.java @@ -82,7 +82,7 @@ public class UnlockedController implements Initializable { private class IoSamplingAnimationHandler implements EventHandler { - private static final double BYTES_TO_MEGABYTES_FACTOR = IO_SAMPLING_INTERVAL / 1024.0 / 1024.0; + private static final double BYTES_TO_MEGABYTES_FACTOR = 1.0 / IO_SAMPLING_INTERVAL / 1024.0 / 1024.0; private final CryptorIOSampling sampler; private final Series decryptedBytes; private final Series encryptedBytes; From 2fb35c59d49637bd9a94053e84cb6fb28438d6ef Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Sat, 13 Dec 2014 21:24:48 +0100 Subject: [PATCH 2/2] - remove vaults using context menu - locked/unlocked indicator --- .../org/cryptomator/ui/MainController.java | 44 ++++++++++++++----- .../org/cryptomator/ui/UnlockController.java | 2 +- .../cryptomator/ui/UnlockedController.java | 2 +- .../ui/controls/DirectoryListCell.java | 38 +++++++++++++++- .../org/cryptomator/ui/model/Directory.java | 14 ++++-- .../org/cryptomator/ui/settings/Settings.java | 8 ++-- .../main/resources/localization.properties | 5 +++ main/ui/src/main/resources/main.fxml | 16 +++++-- main/ui/src/main/resources/unlocked.fxml | 2 +- 9 files changed, 107 insertions(+), 24 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/MainController.java b/main/ui/src/main/java/org/cryptomator/ui/MainController.java index ebc244700..16b93508b 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/MainController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/MainController.java @@ -16,12 +16,15 @@ import java.util.ResourceBundle; import java.util.stream.Collectors; import javafx.application.Platform; +import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Parent; +import javafx.scene.control.ContextMenu; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.layout.HBox; @@ -44,6 +47,9 @@ public class MainController implements Initializable, InitializationListener, Un private Stage stage; + @FXML + private ContextMenu directoryContextMenu; + @FXML private HBox rootPane; @@ -58,9 +64,11 @@ public class MainController implements Initializable, InitializationListener, Un @Override public void initialize(URL url, ResourceBundle rb) { this.rb = rb; + + final ObservableList items = FXCollections.observableList(Settings.load().getDirectories()); + directoryList.setItems(items); directoryList.setCellFactory(this::createDirecoryListCell); directoryList.getSelectionModel().getSelectedItems().addListener(this::selectedDirectoryDidChange); - directoryList.getItems().addAll(Settings.load().getDirectories()); } @FXML @@ -70,22 +78,38 @@ public class MainController implements Initializable, InitializationListener, Un if (file != null && file.canWrite()) { final Directory dir = new Directory(file.toPath()); directoryList.getItems().add(dir); - Settings.load().getDirectories().clear(); - Settings.load().getDirectories().addAll(directoryList.getItems()); directoryList.getSelectionModel().selectLast(); } } private ListCell createDirecoryListCell(ListView param) { - return new DirectoryListCell(); + final DirectoryListCell cell = new DirectoryListCell(); + cell.setContextMenu(directoryContextMenu); + return cell; } private void selectedDirectoryDidChange(ListChangeListener.Change change) { final Directory selectedDir = directoryList.getSelectionModel().getSelectedItem(); - stage.setTitle(selectedDir.getName()); - showDirectory(selectedDir); + if (selectedDir == null) { + stage.setTitle(rb.getString("app.name")); + showWelcomeView(); + } else { + stage.setTitle(selectedDir.getName()); + showDirectory(selectedDir); + } } + @FXML + private void didClickRemoveSelectedEntry(ActionEvent e) { + final Directory selectedDir = directoryList.getSelectionModel().getSelectedItem(); + directoryList.getItems().remove(selectedDir); + directoryList.getSelectionModel().clearSelection(); + } + + // **************************************** + // Subcontroller for right panel + // **************************************** + private void showDirectory(Directory directory) { try { if (directory.isUnlocked()) { @@ -100,10 +124,6 @@ public class MainController implements Initializable, InitializationListener, Un } } - // **************************************** - // Subcontroller for right panel - // **************************************** - private T showView(String fxml) { try { final FXMLLoader loader = new FXMLLoader(getClass().getResource(fxml), rb); @@ -116,6 +136,10 @@ public class MainController implements Initializable, InitializationListener, Un } } + private void showWelcomeView() { + this.showView("/welcome.fxml"); + } + private void showInitializeView(Directory directory) { final InitializeController ctrl = showView("/initialize.fxml"); ctrl.setDirectory(directory); diff --git a/main/ui/src/main/java/org/cryptomator/ui/UnlockController.java b/main/ui/src/main/java/org/cryptomator/ui/UnlockController.java index b9b8e55f8..43f59b414 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/UnlockController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/UnlockController.java @@ -77,7 +77,7 @@ public class UnlockController implements Initializable { // **************************************** @FXML - protected void didClickUnlockButton(ActionEvent event) { + private void didClickUnlockButton(ActionEvent event) { final String masterKeyFileName = usernameBox.getValue() + Aes256Cryptor.MASTERKEY_FILE_EXT; final Path masterKeyPath = directory.getPath().resolve(masterKeyFileName); final CharSequence password = passwordField.getCharacters(); diff --git a/main/ui/src/main/java/org/cryptomator/ui/UnlockedController.java b/main/ui/src/main/java/org/cryptomator/ui/UnlockedController.java index 7d7b05452..c557ea99c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/UnlockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/UnlockedController.java @@ -52,7 +52,7 @@ public class UnlockedController implements Initializable { } @FXML - protected void closeVault(ActionEvent event) { + private void didClickCloseVault(ActionEvent event) { directory.unmount(); directory.stopServer(); directory.setUnlocked(false); diff --git a/main/ui/src/main/java/org/cryptomator/ui/controls/DirectoryListCell.java b/main/ui/src/main/java/org/cryptomator/ui/controls/DirectoryListCell.java index bed87ef0c..94cbc4f0a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controls/DirectoryListCell.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controls/DirectoryListCell.java @@ -1,19 +1,55 @@ package org.cryptomator.ui.controls; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.scene.control.ContentDisplay; import javafx.scene.control.ListCell; +import javafx.scene.control.Tooltip; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; +import javafx.scene.shape.Circle; import org.cryptomator.ui.model.Directory; -public class DirectoryListCell extends ListCell { +public class DirectoryListCell extends ListCell implements ChangeListener { + + // TODO: fancy graphics instead of circles ;-) + private final Circle statusIndicator = new Circle(3.0); + + public DirectoryListCell() { + setGraphic(statusIndicator); + setGraphicTextGap(12.0); + setContentDisplay(ContentDisplay.LEFT); + } @Override protected void updateItem(Directory item, boolean empty) { + final Directory oldItem = super.getItem(); + if (oldItem != null) { + oldItem.unlockedProperty().removeListener(this); + } super.updateItem(item, empty); if (item == null) { setText(null); + setTooltip(null); + statusIndicator.setVisible(false); } else { setText(item.getName()); + setTooltip(new Tooltip(item.getPath().toString())); + statusIndicator.setVisible(true); + item.unlockedProperty().addListener(this); + updateStatusIndicator(); } } + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + updateStatusIndicator(); + } + + private void updateStatusIndicator() { + final Paint statusColor = getItem().isUnlocked() ? Color.LIME : Color.RED; + statusIndicator.setFill(statusColor); + } + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/Directory.java b/main/ui/src/main/java/org/cryptomator/ui/model/Directory.java index 0364d8022..6a6d5f4a7 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/Directory.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/Directory.java @@ -5,6 +5,9 @@ import java.io.Serializable; import java.nio.file.Files; import java.nio.file.Path; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; + import org.apache.commons.lang3.StringUtils; import org.cryptomator.crypto.Cryptor; import org.cryptomator.crypto.SamplingDecorator; @@ -29,8 +32,9 @@ public class Directory implements Serializable { private final WebDAVServer server = new WebDAVServer(); private final Cryptor cryptor = SamplingDecorator.decorate(new Aes256Cryptor()); + private final ObjectProperty unlocked = new SimpleObjectProperty(this, "unlocked", Boolean.FALSE); private final Path path; - private boolean unlocked; + // private boolean unlocked; private String unmountCommand; private final Runnable shutdownTask = new ShutdownTask(); @@ -103,12 +107,16 @@ public class Directory implements Serializable { return cryptor; } - public boolean isUnlocked() { + public ObjectProperty unlockedProperty() { return unlocked; } + public boolean isUnlocked() { + return unlocked.get(); + } + public void setUnlocked(boolean unlocked) { - this.unlocked = unlocked; + this.unlocked.set(unlocked); } public WebDAVServer getServer() { diff --git a/main/ui/src/main/java/org/cryptomator/ui/settings/Settings.java b/main/ui/src/main/java/org/cryptomator/ui/settings/Settings.java index b4f7a20b9..4314eb553 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/settings/Settings.java +++ b/main/ui/src/main/java/org/cryptomator/ui/settings/Settings.java @@ -18,7 +18,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.ArrayList; -import java.util.Collection; +import java.util.List; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.ui.model.Directory; @@ -54,7 +54,7 @@ public class Settings implements Serializable { } } - private Collection directories; + private List directories; private String username; private Settings() { @@ -96,14 +96,14 @@ public class Settings implements Serializable { /* Getter/Setter */ - public Collection getDirectories() { + public List getDirectories() { if (directories == null) { directories = new ArrayList<>(); } return directories; } - public void setDirectories(Collection directories) { + public void setDirectories(List directories) { this.directories = directories; } diff --git a/main/ui/src/main/resources/localization.properties b/main/ui/src/main/resources/localization.properties index ab0bdb71a..35b4c92bb 100644 --- a/main/ui/src/main/resources/localization.properties +++ b/main/ui/src/main/resources/localization.properties @@ -9,6 +9,11 @@ app.name=Cryptomator +# main.fxml +main.directoryList.contextMenu.remove=Remove from list +main.directoryList.contextMenu.addUser=Add user +main.directoryList.contextMenu.changePassword=Change password + # welcome.fxml welcome.welcomeLabel=Welcome to Cryptomator diff --git a/main/ui/src/main/resources/main.fxml b/main/ui/src/main/resources/main.fxml index 1fea4954e..9eb6ded1e 100644 --- a/main/ui/src/main/resources/main.fxml +++ b/main/ui/src/main/resources/main.fxml @@ -14,13 +14,23 @@ + + - + + + + + + + + + - + @@ -34,7 +44,7 @@ - + diff --git a/main/ui/src/main/resources/unlocked.fxml b/main/ui/src/main/resources/unlocked.fxml index 96ef9ad0a..3a0dba968 100644 --- a/main/ui/src/main/resources/unlocked.fxml +++ b/main/ui/src/main/resources/unlocked.fxml @@ -33,7 +33,7 @@