diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java index 5c262f6de..789dc8a6c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java @@ -5,33 +5,10 @@ * * Contributors: * Sebastian Stenzel - initial API and implementation + * Jean-Noël Charon - confirmation dialog on vault removal ******************************************************************************/ package org.cryptomator.ui.controllers; -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Provider; -import javax.inject.Singleton; - -import org.cryptomator.ui.controls.DirectoryListCell; -import org.cryptomator.ui.model.Vault; -import org.cryptomator.ui.model.VaultFactory; -import org.cryptomator.ui.settings.Localization; -import org.cryptomator.ui.settings.Settings; -import org.fxmisc.easybind.EasyBind; -import org.fxmisc.easybind.monadic.MonadicBinding; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import dagger.Lazy; import javafx.application.Platform; import javafx.beans.binding.Binding; @@ -45,15 +22,35 @@ import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.geometry.Side; import javafx.scene.Parent; -import javafx.scene.control.Button; -import javafx.scene.control.ContextMenu; -import javafx.scene.control.ListCell; -import javafx.scene.control.ListView; -import javafx.scene.control.ToggleButton; +import javafx.scene.control.*; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.stage.FileChooser; import javafx.stage.Stage; +import org.cryptomator.ui.controls.DirectoryListCell; +import org.cryptomator.ui.model.Vault; +import org.cryptomator.ui.model.VaultFactory; +import org.cryptomator.ui.settings.Localization; +import org.cryptomator.ui.settings.Settings; +import org.cryptomator.ui.util.DialogBuilderUtil; +import org.fxmisc.easybind.EasyBind; +import org.fxmisc.easybind.monadic.MonadicBinding; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; @Singleton public class MainController extends LocalizedFXMLViewController { @@ -224,9 +221,17 @@ public class MainController extends LocalizedFXMLViewController { @FXML private void didClickRemoveSelectedEntry(ActionEvent e) { - vaults.remove(selectedVault.get()); - if (vaults.isEmpty()) { - activeController.set(welcomeController.get()); + Dialog confirmDialog = DialogBuilderUtil.buildConfirmationDialog( + localization.getString("main.directoryList.remove.confirmation.title"), + localization.getString("main.directoryList.remove.confirmation.header"), + localization.getString("main.directoryList.remove.confirmation.content") + ); + Optional choice = confirmDialog.showAndWait(); + if (choice.get() == ButtonType.OK){ + vaults.remove(selectedVault.get()); + if (vaults.isEmpty()) { + activeController.set(welcomeController.get()); + } } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/DialogBuilderUtil.java b/main/ui/src/main/java/org/cryptomator/ui/util/DialogBuilderUtil.java new file mode 100644 index 000000000..a5b6dd64b --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/util/DialogBuilderUtil.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2016 Sebastian Stenzel and others. + * This file is licensed under the terms of the MIT license. + * See the LICENSE.txt file for more info. + * + * Contributors: + * Jean-Noël Charon - initial API and implementation + *******************************************************************************/ +package org.cryptomator.ui.util; + +import javafx.scene.control.Alert; + +public class DialogBuilderUtil { + + public DialogBuilderUtil() {} + + public static Alert buildInformationDialog(String title, String header, String content) { + return buildDialog(title, header, content,Alert.AlertType.INFORMATION); + } + + public static Alert buildWarningDialog(String title, String header, String content) { + return buildDialog(title, header, content,Alert.AlertType.WARNING); + } + + public static Alert buildErrorDialog(String title, String header, String content) { + return buildDialog(title, header, content,Alert.AlertType.ERROR); + } + + public static Alert buildConfirmationDialog(String title, String header, String content) { + return buildDialog(title, header, content,Alert.AlertType.CONFIRMATION); + } + + private static Alert buildDialog(String title, String header, String content, Alert.AlertType type) { + Alert alert = new Alert(type); + alert.setTitle(title); + alert.setHeaderText(header); + alert.setContentText(content); + return alert; + } +} diff --git a/main/ui/src/main/resources/css/dialog-confirm.png b/main/ui/src/main/resources/css/dialog-confirm.png new file mode 100644 index 000000000..3c86ba7d4 Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-confirm.png differ diff --git a/main/ui/src/main/resources/css/dialog-confirm@2x.png b/main/ui/src/main/resources/css/dialog-confirm@2x.png new file mode 100644 index 000000000..189be79e4 Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-confirm@2x.png differ diff --git a/main/ui/src/main/resources/css/dialog-error.png b/main/ui/src/main/resources/css/dialog-error.png new file mode 100644 index 000000000..002e0563e Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-error.png differ diff --git a/main/ui/src/main/resources/css/dialog-error@2x.png b/main/ui/src/main/resources/css/dialog-error@2x.png new file mode 100644 index 000000000..ae098b9df Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-error@2x.png differ diff --git a/main/ui/src/main/resources/css/dialog-fewer-details.png b/main/ui/src/main/resources/css/dialog-fewer-details.png new file mode 100644 index 000000000..9ee1c3fb2 Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-fewer-details.png differ diff --git a/main/ui/src/main/resources/css/dialog-fewer-details@2x.png b/main/ui/src/main/resources/css/dialog-fewer-details@2x.png new file mode 100644 index 000000000..e00e1f982 Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-fewer-details@2x.png differ diff --git a/main/ui/src/main/resources/css/dialog-information.png b/main/ui/src/main/resources/css/dialog-information.png new file mode 100644 index 000000000..7d972640a Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-information.png differ diff --git a/main/ui/src/main/resources/css/dialog-information@2x.png b/main/ui/src/main/resources/css/dialog-information@2x.png new file mode 100644 index 000000000..110d63b22 Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-information@2x.png differ diff --git a/main/ui/src/main/resources/css/dialog-more-details.png b/main/ui/src/main/resources/css/dialog-more-details.png new file mode 100644 index 000000000..ec2a7f367 Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-more-details.png differ diff --git a/main/ui/src/main/resources/css/dialog-more-details@2x.png b/main/ui/src/main/resources/css/dialog-more-details@2x.png new file mode 100644 index 000000000..5348a8606 Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-more-details@2x.png differ diff --git a/main/ui/src/main/resources/css/dialog-warning.png b/main/ui/src/main/resources/css/dialog-warning.png new file mode 100644 index 000000000..4ac083c51 Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-warning.png differ diff --git a/main/ui/src/main/resources/css/dialog-warning@2x.png b/main/ui/src/main/resources/css/dialog-warning@2x.png new file mode 100644 index 000000000..9abe4465b Binary files /dev/null and b/main/ui/src/main/resources/css/dialog-warning@2x.png differ diff --git a/main/ui/src/main/resources/css/linux_theme.css b/main/ui/src/main/resources/css/linux_theme.css index 4beabf9e8..277bc2440 100644 --- a/main/ui/src/main/resources/css/linux_theme.css +++ b/main/ui/src/main/resources/css/linux_theme.css @@ -5,6 +5,7 @@ * * Contributors: * Sebastian Stenzel - initial API and implementation + * Jean-Noël Charon - implementation of the dialog css * */ @@ -440,4 +441,89 @@ -fx-stroke-width: 2px; } .default-color0.chart-series-line { -fx-stroke: COLOR_CHART_GREEN; } -.default-color1.chart-series-line { -fx-stroke: COLOR_CHART_RED; } \ No newline at end of file +.default-color1.chart-series-line { -fx-stroke: COLOR_CHART_RED; } + +/******************************************************************************* + * * + * Dialog * + * * + ******************************************************************************/ + +.dialog-pane { + -fx-background-color: -fx-background; + -fx-padding: 0; +} + +.dialog-pane > .expandable-content { + -fx-padding: 0.666em; /* 8px */ +} + +.dialog-pane > .button-bar > .container { + -fx-padding: 0.833em; /* 10px */ +} + +.dialog-pane > .content.label { + -fx-alignment: top-left; + -fx-padding: 1.333em 0.833em 0 0.833em; /* 16px 10px 0px 10px */ +} + +.dialog-pane > .content { + -fx-padding: 0.833em; /* 10 */ +} + +.dialog-pane:no-header .graphic-container { + -fx-padding: 0.833em 0 0 0.833em; /* 10px 0px 0px 10px */ +} + +.dialog-pane:header .header-panel { + /*-fx-padding: 0.833em 1.166em 0.833em 1.166em; *//* 10px 14px 10px 14px */ + -fx-padding: 0.833em; /* 10px */ + -fx-background-color: -fx-box-border, linear-gradient(-fx-background, derive(-fx-background, 30%)); + -fx-background-insets: 0, 0 0 1 0; +} + +.dialog-pane:header .header-panel .label { + -fx-font-size: 1.167em; /* 14px */ + -fx-wrap-text: true; +} + +.dialog-pane:header .header-panel .graphic-container { + /* This prevents the text in the header running directly into the graphic */ + -fx-padding: 0 0 0 0.833em; /* 0px 0px 0px 10px */ +} + +.dialog-pane > .button-bar > .container > .details-button { + -fx-alignment: baseline-left; + -fx-focus-traversable: false; + -fx-padding: 0.416em; /* 5px */ +} + +.dialog-pane > .button-bar > .container > .details-button.more { + -fx-graphic: url("dialog-more-details.png"); +} + +.dialog-pane > .button-bar > .container > .details-button.less { + -fx-graphic: url("dialog-fewer-details.png"); +} + +.dialog-pane > .button-bar > .container > .details-button:hover { + -fx-underline: true; +} + +.alert.confirmation.dialog-pane, +.text-input-dialog.dialog-pane, +.choice-dialog.dialog-pane { + -fx-graphic: url("dialog-confirm.png"); +} + +.alert.information.dialog-pane { + -fx-graphic: url("dialog-information.png"); +} + +.alert.error.dialog-pane { + -fx-graphic: url("dialog-error.png"); +} + +.alert.warning.dialog-pane { + -fx-graphic: url("dialog-warning.png"); +} \ No newline at end of file diff --git a/main/ui/src/main/resources/css/mac_theme.css b/main/ui/src/main/resources/css/mac_theme.css index bac4a985d..5d8034550 100644 --- a/main/ui/src/main/resources/css/mac_theme.css +++ b/main/ui/src/main/resources/css/mac_theme.css @@ -5,6 +5,7 @@ * * Contributors: * Sebastian Stenzel - initial API and implementation + * Jean-Noël Charon - implementation of the dialog css * */ @@ -530,4 +531,89 @@ -fx-stroke-width: 2px; } .default-color0.chart-series-line { -fx-stroke: COLOR_CHART_GREEN; } -.default-color1.chart-series-line { -fx-stroke: COLOR_CHART_RED; } \ No newline at end of file +.default-color1.chart-series-line { -fx-stroke: COLOR_CHART_RED; } + +/******************************************************************************* + * * + * Dialog * + * * + ******************************************************************************/ + +.dialog-pane { + -fx-background-color: -fx-background; + -fx-padding: 0; +} + +.dialog-pane > .expandable-content { + -fx-padding: 0.666em; /* 8px */ +} + +.dialog-pane > .button-bar > .container { + -fx-padding: 0.833em; /* 10px */ +} + +.dialog-pane > .content.label { + -fx-alignment: top-left; + -fx-padding: 1.333em 0.833em 0 0.833em; /* 16px 10px 0px 10px */ +} + +.dialog-pane > .content { + -fx-padding: 0.833em; /* 10 */ +} + +.dialog-pane:no-header .graphic-container { + -fx-padding: 0.833em 0 0 0.833em; /* 10px 0px 0px 10px */ +} + +.dialog-pane:header .header-panel { + /*-fx-padding: 0.833em 1.166em 0.833em 1.166em; *//* 10px 14px 10px 14px */ + -fx-padding: 0.833em; /* 10px */ + -fx-background-color: -fx-box-border, linear-gradient(-fx-background, derive(-fx-background, 30%)); + -fx-background-insets: 0, 0 0 1 0; +} + +.dialog-pane:header .header-panel .label { + -fx-font-size: 1.167em; /* 14px */ + -fx-wrap-text: true; +} + +.dialog-pane:header .header-panel .graphic-container { + /* This prevents the text in the header running directly into the graphic */ + -fx-padding: 0 0 0 0.833em; /* 0px 0px 0px 10px */ +} + +.dialog-pane > .button-bar > .container > .details-button { + -fx-alignment: baseline-left; + -fx-focus-traversable: false; + -fx-padding: 0.416em; /* 5px */ +} + +.dialog-pane > .button-bar > .container > .details-button.more { + -fx-graphic: url("dialog-more-details.png"); +} + +.dialog-pane > .button-bar > .container > .details-button.less { + -fx-graphic: url("dialog-fewer-details.png"); +} + +.dialog-pane > .button-bar > .container > .details-button:hover { + -fx-underline: true; +} + +.alert.confirmation.dialog-pane, +.text-input-dialog.dialog-pane, +.choice-dialog.dialog-pane { + -fx-graphic: url("dialog-confirm.png"); +} + +.alert.information.dialog-pane { + -fx-graphic: url("dialog-information.png"); +} + +.alert.error.dialog-pane { + -fx-graphic: url("dialog-error.png"); +} + +.alert.warning.dialog-pane { + -fx-graphic: url("dialog-warning.png"); +} \ No newline at end of file diff --git a/main/ui/src/main/resources/css/win_theme.css b/main/ui/src/main/resources/css/win_theme.css index f0109b004..7a222ce85 100644 --- a/main/ui/src/main/resources/css/win_theme.css +++ b/main/ui/src/main/resources/css/win_theme.css @@ -5,6 +5,7 @@ * * Contributors: * Sebastian Stenzel - initial API and implementation + * Jean-Noël Charon - implementation of the dialog css * */ @@ -512,4 +513,89 @@ -fx-stroke-width: 2px; } .default-color0.chart-series-line { -fx-stroke: COLOR_CHART_GREEN; } -.default-color1.chart-series-line { -fx-stroke: COLOR_CHART_RED; } \ No newline at end of file +.default-color1.chart-series-line { -fx-stroke: COLOR_CHART_RED; } + +/******************************************************************************* + * * + * Dialog * + * * + ******************************************************************************/ + +.dialog-pane { + -fx-background-color: -fx-background; + -fx-padding: 0; +} + +.dialog-pane > .expandable-content { + -fx-padding: 0.666em; /* 8px */ +} + +.dialog-pane > .button-bar > .container { + -fx-padding: 0.833em; /* 10px */ +} + +.dialog-pane > .content.label { + -fx-alignment: top-left; + -fx-padding: 1.333em 0.833em 0 0.833em; /* 16px 10px 0px 10px */ +} + +.dialog-pane > .content { + -fx-padding: 0.833em; /* 10 */ +} + +.dialog-pane:no-header .graphic-container { + -fx-padding: 0.833em 0 0 0.833em; /* 10px 0px 0px 10px */ +} + +.dialog-pane:header .header-panel { + /*-fx-padding: 0.833em 1.166em 0.833em 1.166em; *//* 10px 14px 10px 14px */ + -fx-padding: 0.833em; /* 10px */ + -fx-background-color: -fx-box-border, linear-gradient(-fx-background, derive(-fx-background, 30%)); + -fx-background-insets: 0, 0 0 1 0; +} + +.dialog-pane:header .header-panel .label { + -fx-font-size: 1.167em; /* 14px */ + -fx-wrap-text: true; +} + +.dialog-pane:header .header-panel .graphic-container { + /* This prevents the text in the header running directly into the graphic */ + -fx-padding: 0 0 0 0.833em; /* 0px 0px 0px 10px */ +} + +.dialog-pane > .button-bar > .container > .details-button { + -fx-alignment: baseline-left; + -fx-focus-traversable: false; + -fx-padding: 0.416em; /* 5px */ +} + +.dialog-pane > .button-bar > .container > .details-button.more { + -fx-graphic: url("dialog-more-details.png"); +} + +.dialog-pane > .button-bar > .container > .details-button.less { + -fx-graphic: url("dialog-fewer-details.png"); +} + +.dialog-pane > .button-bar > .container > .details-button:hover { + -fx-underline: true; +} + +.alert.confirmation.dialog-pane, +.text-input-dialog.dialog-pane, +.choice-dialog.dialog-pane { + -fx-graphic: url("dialog-confirm.png"); +} + +.alert.information.dialog-pane { + -fx-graphic: url("dialog-information.png"); +} + +.alert.error.dialog-pane { + -fx-graphic: url("dialog-error.png"); +} + +.alert.warning.dialog-pane { + -fx-graphic: url("dialog-warning.png"); +} \ No newline at end of file diff --git a/main/ui/src/main/resources/localization.properties b/main/ui/src/main/resources/localization.properties index fec481349..2cd432e99 100644 --- a/main/ui/src/main/resources/localization.properties +++ b/main/ui/src/main/resources/localization.properties @@ -13,6 +13,9 @@ main.directoryList.contextMenu.remove=Remove from list main.directoryList.contextMenu.changePassword=Change password main.addDirectory.contextMenu.new=Create new vault main.addDirectory.contextMenu.open=Open existing vault +main.directoryList.remove.confirmation.title=Vault removal +main.directoryList.remove.confirmation.header=Do you really want to remove this vault ? +main.directoryList.remove.confirmation.content=Every data it contains will be lost. # welcome.fxml welcome.checkForUpdates.label.currentlyChecking=Checking for Updates...