Implementation of github issue 228
@@ -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<ButtonType> choice = confirmDialog.showAndWait();
|
||||
if (choice.get() == ButtonType.OK){
|
||||
vaults.remove(selectedVault.get());
|
||||
if (vaults.isEmpty()) {
|
||||
activeController.set(welcomeController.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
@@ -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; }
|
||||
.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");
|
||||
}
|
||||
@@ -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; }
|
||||
.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");
|
||||
}
|
||||
@@ -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; }
|
||||
.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");
|
||||
}
|
||||
@@ -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...
|
||||
|
||||