diff --git a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java index 21d27ac7b..15b1718e1 100644 --- a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java +++ b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java @@ -8,6 +8,8 @@ public enum FontAwesome5Icon { ARROW_UP("\uF062"), // BAN("\uF05E"), // BUG("\uF188"), // + CARET_DOWN("\uF0D7"), // + CARET_RIGHT("\uF0Da"), // CHECK("\uF00C"), // CLOCK("\uF017"), // COG("\uF013"), // diff --git a/src/main/java/org/cryptomator/ui/health/StartFailController.java b/src/main/java/org/cryptomator/ui/health/StartFailController.java index 7142bd2f5..953b7c830 100644 --- a/src/main/java/org/cryptomator/ui/health/StartFailController.java +++ b/src/main/java/org/cryptomator/ui/health/StartFailController.java @@ -1,18 +1,24 @@ package org.cryptomator.ui.health; import com.google.common.base.Preconditions; +import com.tobiasdiez.easybind.EasyBind; import org.cryptomator.cryptofs.VaultConfigLoadException; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.controls.FontAwesome5Icon; import javax.inject.Inject; +import javafx.beans.binding.Binding; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanBinding; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; +import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; +import javafx.scene.control.TitledPane; import javafx.stage.Stage; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; @HealthCheckScoped public class StartFailController implements FxController { @@ -22,10 +28,25 @@ public class StartFailController implements FxController { Preconditions.checkNotNull(configLoadResult.error()); this.window = window; this.loadError = new SimpleObjectProperty<>(configLoadResult.error()); - this.localizedErrorMessage = new SimpleStringProperty(configLoadResult.error().getLocalizedMessage()); - this.typeParseException = Bindings.createBooleanBinding(() -> loadError.get() instanceof VaultConfigLoadException); - this.typeIOException = typeParseException.not(); + this.localizedErrorMessage = EasyBind.map(loadError, Throwable::getLocalizedMessage); + this.parseException = Bindings.createBooleanBinding(() -> loadError.get() instanceof VaultConfigLoadException); + this.ioException = parseException.not(); + this.stackTrace = EasyBind.map(loadError, this::createPrintableStacktrace); + this.moreInfoIcon = new SimpleObjectProperty<>(FontAwesome5Icon.CARET_RIGHT); + } + public void initialize() { + moreInfoPane.expandedProperty().addListener(this::setMoreInfoIcon); + } + + private void setMoreInfoIcon(ObservableValue observable, boolean wasExpanded, boolean willExpand) { + moreInfoIcon.set(willExpand ? FontAwesome5Icon.CARET_DOWN : FontAwesome5Icon.CARET_RIGHT); + } + + private String createPrintableStacktrace(Throwable t) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + t.printStackTrace(new PrintStream(baos)); + return baos.toString(StandardCharsets.UTF_8); } @FXML @@ -33,10 +54,55 @@ public class StartFailController implements FxController { window.close(); } + public Binding stackTraceProperty() { + return stackTrace; + } + + public String getStackTrace() { + return stackTrace.getValue(); + } + + public Binding localizedErrorMessageProperty() { + return localizedErrorMessage; + } + + public String getLocalizedErrorMessage() { + return localizedErrorMessage.getValue(); + } + + public BooleanBinding parseExceptionProperty() { + return parseException; + } + + public boolean isParseException() { + return parseException.getValue(); + } + + public BooleanBinding ioExceptionProperty() { + return ioException; + } + + public boolean isIoException() { + return ioException.getValue(); + } + + public ObjectProperty moreInfoIconProperty() { + return moreInfoIcon; + } + + public FontAwesome5Icon getMoreInfoIcon() { + return moreInfoIcon.getValue(); + } + private final Stage window; private final ObjectProperty loadError; - private final StringProperty localizedErrorMessage; - private final BooleanBinding typeIOException; - private final BooleanBinding typeParseException; + private final Binding stackTrace; + private final Binding localizedErrorMessage; + private final BooleanBinding ioException; + private final BooleanBinding parseException; + private final ObjectProperty moreInfoIcon; + + /* FXML */ + public TitledPane moreInfoPane; } diff --git a/src/main/resources/fxml/health_start_fail.fxml b/src/main/resources/fxml/health_start_fail.fxml index 520f894a7..15b32bd92 100644 --- a/src/main/resources/fxml/health_start_fail.fxml +++ b/src/main/resources/fxml/health_start_fail.fxml @@ -2,14 +2,33 @@ + + + + + + - + + +