From fead9a48ebf3518e52e873fe653644e5b72ec6f6 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 29 Jul 2019 16:07:34 +0200 Subject: [PATCH] Reuse existing Stages and Scenes --- .../ui/addvaultwizard/AddVaultModule.java | 17 ++++++++++ .../AddVaultWelcomeController.java | 14 +++++--- .../AddVaultWizardComponent.java | 12 +++++-- .../ChooseExistingVaultController.java | 13 +++++--- .../ui/common/FXMLLoaderFactory.java | 11 +++---- .../org/cryptomator/ui/common/FxmlFile.java | 16 ++++++++++ .../org/cryptomator/ui/common/FxmlScene.java | 16 ++++++++++ .../cryptomator/ui/fxapp/FxApplication.java | 21 +++++------- .../ui/fxapp/FxApplicationModule.java | 12 +++++++ .../ui/mainwindow/MainWindowComponent.java | 18 ++++++----- .../ui/mainwindow/MainWindowModule.java | 10 ++++++ .../ui/preferences/PreferencesComponent.java | 10 ++++-- .../ui/preferences/PreferencesModule.java | 10 ++++++ .../ui/traymenu/FxApplicationStarter.java | 6 ++++ .../ui/traymenu/TrayMenuController.java | 32 ++++++++++++------- .../ui/unlock/UnlockComponent.java | 10 ++++-- .../cryptomator/ui/unlock/UnlockModule.java | 10 ++++++ 17 files changed, 182 insertions(+), 56 deletions(-) create mode 100644 main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/common/FxmlScene.java diff --git a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultModule.java b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultModule.java index 51c99c6e0..8c65b84e3 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultModule.java @@ -6,12 +6,15 @@ import dagger.Provides; import dagger.multibindings.IntoMap; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.StageStyle; import org.cryptomator.ui.common.FXMLLoaderFactory; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.mainwindow.MainWindow; import javax.inject.Provider; @@ -48,6 +51,20 @@ public abstract class AddVaultModule { return new SimpleObjectProperty<>(); } + @Provides + @FxmlScene(FxmlFile.ADDVAULT_WELCOME) + @AddVaultWizardScoped + static Scene provideWelcomeScene(@AddVaultWizard FXMLLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene("/fxml/addvault_welcome.fxml"); + } + + @Provides + @FxmlScene(FxmlFile.ADDVAULT_EXISTING) + @AddVaultWizardScoped + static Scene provideChooseExistingVaultScene(@AddVaultWizard FXMLLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene("/fxml/addvault_existing.fxml"); + } + // ------------------ @Binds diff --git a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWelcomeController.java b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWelcomeController.java index 31f8d7661..341727886 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWelcomeController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWelcomeController.java @@ -1,24 +1,28 @@ package org.cryptomator.ui.addvaultwizard; +import dagger.Lazy; +import javafx.scene.Scene; import javafx.stage.Stage; -import org.cryptomator.ui.common.FXMLLoaderFactory; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; +import javax.inject.Named; @AddVaultWizardScoped public class AddVaultWelcomeController implements FxController { private static final Logger LOG = LoggerFactory.getLogger(AddVaultWelcomeController.class); private final Stage window; - private final FXMLLoaderFactory fxmlLoaders; + private final Lazy chooseExistingVaultScene; @Inject - AddVaultWelcomeController(@AddVaultWizard Stage window, @AddVaultWizard FXMLLoaderFactory fxmlLoaders) { + AddVaultWelcomeController(@AddVaultWizard Stage window, @FxmlScene(FxmlFile.ADDVAULT_EXISTING) Lazy chooseExistingVaultScene) { this.window = window; - this.fxmlLoaders = fxmlLoaders; + this.chooseExistingVaultScene = chooseExistingVaultScene; } public void createNewVault() { @@ -28,6 +32,6 @@ public class AddVaultWelcomeController implements FxController { public void chooseExistingVault() { LOG.debug("AddVaultWelcomeController.chooseExistingVault()"); - fxmlLoaders.setScene("/fxml/addvault_existing.fxml", window); + window.setScene(chooseExistingVaultScene.get()); } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardComponent.java b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardComponent.java index dbb31d5f6..18a787894 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardComponent.java @@ -5,9 +5,15 @@ *******************************************************************************/ package org.cryptomator.ui.addvaultwizard; +import dagger.Lazy; import dagger.Subcomponent; +import javafx.scene.Scene; import javafx.stage.Stage; import org.cryptomator.ui.common.FXMLLoaderFactory; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; + +import javax.inject.Named; @AddVaultWizardScoped @Subcomponent(modules = {AddVaultModule.class}) @@ -16,12 +22,12 @@ public interface AddVaultWizardComponent { @AddVaultWizard Stage window(); - @AddVaultWizard - FXMLLoaderFactory fxmlLoaders(); + @FxmlScene(FxmlFile.ADDVAULT_WELCOME) + Lazy scene(); default void showAddVaultWizard() { Stage stage = window(); - fxmlLoaders().setScene("/fxml/addvault_welcome.fxml", stage); + stage.setScene(scene().get()); stage.sizeToScene(); stage.show(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java index c4ab87ab2..2b21a02c6 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java @@ -1,17 +1,22 @@ package org.cryptomator.ui.addvaultwizard; +import dagger.Lazy; import javafx.beans.property.ObjectProperty; import javafx.collections.ObservableList; import javafx.fxml.FXML; +import javafx.scene.Scene; import javafx.stage.FileChooser; import javafx.stage.Stage; import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.ui.common.FXMLLoaderFactory; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.model.Vault; import org.cryptomator.ui.model.VaultFactory; import javax.inject.Inject; +import javax.inject.Named; import java.io.File; import java.nio.file.Path; import java.util.ResourceBundle; @@ -20,16 +25,16 @@ import java.util.ResourceBundle; public class ChooseExistingVaultController implements FxController { private final Stage window; - private final FXMLLoaderFactory fxmlLoaders; + private final Lazy welcomeScene; private final ObjectProperty vaultPath; private final ObservableList vaults; private final VaultFactory vaultFactory; private final ResourceBundle resourceBundle; @Inject - ChooseExistingVaultController(@AddVaultWizard Stage window, @AddVaultWizard FXMLLoaderFactory fxmlLoaders, ObjectProperty vaultPath, ObservableList vaults, VaultFactory vaultFactory, ResourceBundle resourceBundle) { + ChooseExistingVaultController(@AddVaultWizard Stage window, @FxmlScene(FxmlFile.ADDVAULT_WELCOME) Lazy welcomeScene, ObjectProperty vaultPath, ObservableList vaults, VaultFactory vaultFactory, ResourceBundle resourceBundle) { this.window = window; - this.fxmlLoaders = fxmlLoaders; + this.welcomeScene = welcomeScene; this.vaultPath = vaultPath; this.vaults = vaults; this.vaultFactory = vaultFactory; @@ -49,7 +54,7 @@ public class ChooseExistingVaultController implements FxController { @FXML public void back() { - fxmlLoaders.setScene("/fxml/addvault_welcome.fxml", window); + window.setScene(welcomeScene.get()); } @FXML diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/FXMLLoaderFactory.java b/main/ui/src/main/java/org/cryptomator/ui/common/FXMLLoaderFactory.java index e4c7c5799..dcd0072b2 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/common/FXMLLoaderFactory.java +++ b/main/ui/src/main/java/org/cryptomator/ui/common/FXMLLoaderFactory.java @@ -47,20 +47,19 @@ public class FXMLLoaderFactory { } /** - * {@link #load(String) Loads} the FXML file and sets the given stage's scene to a new Scene containing the loaded ui. + * {@link #load(String) Loads} the FXML file and creates a new Scene containing the loaded ui. * @param fxmlResourceName Name of the resource (as in {@link Class#getResource(String)}). - * @param stage The stage which should get a new scene * @throws UncheckedIOException wrapping any IOException thrown by {@link #load(String)). */ - public void setScene(String fxmlResourceName, Stage stage) throws UncheckedIOException { + public Scene createScene(String fxmlResourceName) { final FXMLLoader loader; try { loader = load(fxmlResourceName); } catch (IOException e) { throw new UncheckedIOException("Failed to load " + fxmlResourceName, e); - } Parent root = loader.getRoot(); - Scene scene = new Scene(root); - stage.setScene(scene); + } + Parent root = loader.getRoot(); + return new Scene(root); } private FxController constructController(Class aClass) { diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java new file mode 100644 index 000000000..2e5cd3bf5 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -0,0 +1,16 @@ +package org.cryptomator.ui.common; + +public enum FxmlFile { + MAIN_WINDOW("/fxml/main_window.fxml"), // + ADDVAULT_WELCOME("/fxml/addvault_welcome.fxml"), // + ADDVAULT_EXISTING("/fxml/addvault_existing.fxml"), // + PREFERENCES("/fxml/preferences.fxml"), // + UNLOCK("/fxml/unlock2.fxml"), // TODO rename + ; + + private final String filename; + + FxmlFile(String filename) { + this.filename = filename; + } +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlScene.java b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlScene.java new file mode 100644 index 000000000..6f7215a37 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlScene.java @@ -0,0 +1,16 @@ +package org.cryptomator.ui.common; + +import javax.inject.Qualifier; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier +@Documented +@Retention(RUNTIME) +public @interface FxmlScene { + + FxmlFile value(); + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index d9b136774..c75aeea8d 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -1,5 +1,6 @@ package org.cryptomator.ui.fxapp; +import dagger.Lazy; import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ObservableValue; @@ -24,12 +25,12 @@ public class FxApplication extends Application { private static final Logger LOG = LoggerFactory.getLogger(FxApplication.class); private final Settings settings; - private final MainWindowComponent.Builder mainWindow; - private final PreferencesComponent.Builder preferencesWindow; + private final Lazy mainWindow; + private final Lazy preferencesWindow; private final Optional macFunctions; @Inject - FxApplication(Settings settings, MainWindowComponent.Builder mainWindow, PreferencesComponent.Builder preferencesWindow, Optional macFunctions) { + FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Optional macFunctions) { this.settings = settings; this.mainWindow = mainWindow; this.preferencesWindow = preferencesWindow; @@ -42,10 +43,6 @@ public class FxApplication extends Application { settings.theme().addListener(this::themeChanged); loadSelectedStyleSheet(settings.theme().get()); - - if (Desktop.getDesktop().isSupported(Desktop.Action.APP_PREFERENCES)) { - Desktop.getDesktop().setPreferencesHandler(this::handlePreferences); - } } @Override @@ -53,19 +50,17 @@ public class FxApplication extends Application { throw new UnsupportedOperationException("Use start() instead."); } - private void handlePreferences(PreferencesEvent preferencesEvent) { - showPreferencesWindow(); - } - public void showPreferencesWindow() { Platform.runLater(() -> { - preferencesWindow.build().showPreferencesWindow(); + preferencesWindow.get().showPreferencesWindow(); + LOG.debug("Showing Preferences"); }); } public void showMainWindow() { Platform.runLater(() -> { - mainWindow.build().showMainWindow(); + mainWindow.get().showMainWindow(); + LOG.debug("Showing MainWindow"); }); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java index dad95aaa4..ffd771a73 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java @@ -6,6 +6,7 @@ package org.cryptomator.ui.fxapp; import dagger.Binds; +import dagger.Lazy; import dagger.Module; import dagger.Provides; import javafx.application.Application; @@ -27,6 +28,7 @@ abstract class FxApplicationModule { @FxApplicationScoped abstract Application provideApplication(FxApplication application); + // TODO move to commons... @Binds abstract ObservableList bindVaultList(VaultList vaultList); @@ -41,5 +43,15 @@ abstract class FxApplicationModule { static ResourceBundle provideLocalization() { return ResourceBundle.getBundle("i18n.strings"); } + + @Provides + static MainWindowComponent provideMainWindowComponent(MainWindowComponent.Builder builder) { + return builder.build(); + } + + @Provides + static PreferencesComponent providePreferencesComponent(PreferencesComponent.Builder builder) { + return builder.build(); + } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowComponent.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowComponent.java index 1455bd173..131faaeb0 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowComponent.java @@ -5,30 +5,32 @@ *******************************************************************************/ package org.cryptomator.ui.mainwindow; +import dagger.Lazy; import dagger.Subcomponent; +import javafx.scene.Scene; import javafx.stage.Stage; -import org.cryptomator.ui.common.FXMLLoaderFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; @MainWindowScoped @Subcomponent(modules = {MainWindowModule.class}) public interface MainWindowComponent { - + @MainWindow Stage window(); - @MainWindow - FXMLLoaderFactory fxmlLoaders(); - + @FxmlScene(FxmlFile.MAIN_WINDOW) + Lazy scene(); + default void showMainWindow() { Stage stage = window(); - fxmlLoaders().setScene("/fxml/main_window.fxml", stage); + stage.setScene(scene().get()); stage.show(); } @Subcomponent.Builder interface Builder { + MainWindowComponent build(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index db25681c9..12b1bb62e 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -4,12 +4,15 @@ import dagger.Binds; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoMap; +import javafx.scene.Scene; import javafx.stage.Stage; import javafx.stage.StageStyle; import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent; import org.cryptomator.ui.common.FXMLLoaderFactory; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.unlock.UnlockComponent; import javax.inject.Provider; @@ -40,6 +43,13 @@ abstract class MainWindowModule { return stage; } + @Provides + @FxmlScene(FxmlFile.MAIN_WINDOW) + @MainWindowScoped + static Scene provideMainScene(@MainWindow FXMLLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene("/fxml/main_window.fxml"); + } + // ------------------ @Binds diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesComponent.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesComponent.java index d7002b067..73c3010da 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesComponent.java @@ -5,9 +5,13 @@ *******************************************************************************/ package org.cryptomator.ui.preferences; +import dagger.Lazy; import dagger.Subcomponent; +import javafx.scene.Scene; import javafx.stage.Stage; import org.cryptomator.ui.common.FXMLLoaderFactory; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; @PreferencesScoped @Subcomponent(modules = {PreferencesModule.class}) @@ -16,12 +20,12 @@ public interface PreferencesComponent { @PreferencesWindow Stage window(); - @PreferencesWindow - FXMLLoaderFactory fxmlLoaders(); + @FxmlScene(FxmlFile.PREFERENCES) + Lazy scene(); default void showPreferencesWindow() { Stage stage = window(); - fxmlLoaders().setScene("/fxml/preferences.fxml", stage); + stage.setScene(scene().get()); stage.show(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java index 2854190f3..d6d78a31c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java @@ -4,11 +4,14 @@ import dagger.Binds; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoMap; +import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; import org.cryptomator.ui.common.FXMLLoaderFactory; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; import javax.inject.Provider; import java.util.Map; @@ -36,6 +39,13 @@ abstract class PreferencesModule { return stage; } + @Provides + @FxmlScene(FxmlFile.PREFERENCES) + @PreferencesScoped + static Scene providePreferencesScene(@PreferencesWindow FXMLLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene("/fxml/preferences.fxml"); + } + // ------------------ @Binds diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/FxApplicationStarter.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/FxApplicationStarter.java index 1f30e89d4..da3363e2a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/FxApplicationStarter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/FxApplicationStarter.java @@ -3,6 +3,8 @@ package org.cryptomator.ui.traymenu; import javafx.application.Platform; import org.cryptomator.ui.fxapp.FxApplication; import org.cryptomator.ui.fxapp.FxApplicationComponent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.inject.Inject; import java.util.concurrent.CompletableFuture; @@ -10,6 +12,8 @@ import java.util.concurrent.ExecutionException; @TrayMenuScoped public class FxApplicationStarter { + + private static final Logger LOG = LoggerFactory.getLogger(FxApplicationStarter.class); private final CompletableFuture future; private final FxApplicationComponent.Builder fxAppComponent; @@ -35,8 +39,10 @@ public class FxApplicationStarter { } private void start() { + LOG.debug("Starting JavaFX runtime..."); Platform.startup(() -> { assert Platform.isFxApplicationThread(); + LOG.debug("JavaFX Runtime started."); FxApplication app = fxAppComponent.build().application(); app.start(); future.complete(app); diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java index a0253a13b..64266d74f 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java @@ -1,19 +1,16 @@ package org.cryptomator.ui.traymenu; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import javax.inject.Inject; import javax.inject.Named; +import java.awt.Desktop; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.event.ActionEvent; +import java.util.EventObject; import java.util.concurrent.CountDownLatch; @TrayMenuScoped -public class TrayMenuController { - - private static final Logger LOG = LoggerFactory.getLogger(TrayMenuController.class); +class TrayMenuController { private final FxApplicationStarter fxApplicationStarter; private final CountDownLatch shutdownLatch; @@ -25,7 +22,7 @@ public class TrayMenuController { this.shutdownLatch = shutdownLatch; this.menu = new PopupMenu(); } - + public PopupMenu getMenu() { return menu; } @@ -33,27 +30,40 @@ public class TrayMenuController { public void initTrayMenu() { // TODO add listeners rebuildMenu(); + + // register preferences shortcut + if (Desktop.getDesktop().isSupported(Desktop.Action.APP_PREFERENCES)) { + Desktop.getDesktop().setPreferencesHandler(this::showPreferencesWindow); + } } - + private void rebuildMenu() { MenuItem showMainWindowItem = new MenuItem("TODO show"); showMainWindowItem.addActionListener(this::showMainWindow); menu.add(showMainWindowItem); - + + MenuItem showPreferencesItem = new MenuItem("TODO preferences"); + showPreferencesItem.addActionListener(this::showPreferencesWindow); + menu.add(showPreferencesItem); + menu.addSeparator(); // foreach vault: add submenu menu.addSeparator(); - + MenuItem quitApplicationItem = new MenuItem("TODO quit"); quitApplicationItem.addActionListener(this::quitApplication); menu.add(quitApplicationItem); - + } private void showMainWindow(ActionEvent actionEvent) { fxApplicationStarter.get().showMainWindow(); } + private void showPreferencesWindow(EventObject actionEvent) { + fxApplicationStarter.get().showPreferencesWindow(); + } + private void quitApplication(ActionEvent actionEvent) { shutdownLatch.countDown(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockComponent.java b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockComponent.java index eb8255216..52e1a0c46 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockComponent.java @@ -6,9 +6,13 @@ package org.cryptomator.ui.unlock; import dagger.BindsInstance; +import dagger.Lazy; import dagger.Subcomponent; +import javafx.scene.Scene; import javafx.stage.Stage; import org.cryptomator.ui.common.FXMLLoaderFactory; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.model.Vault; @UnlockScoped @@ -18,12 +22,12 @@ public interface UnlockComponent { @UnlockWindow Stage window(); - @UnlockWindow - FXMLLoaderFactory fxmlLoaders(); + @FxmlScene(FxmlFile.UNLOCK) + Lazy scene(); default void showUnlockWindow() { Stage stage = window(); - fxmlLoaders().setScene("/fxml/unlock2.fxml", stage); // TODO rename fxml file + stage.setScene(scene().get()); stage.show(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java index 77ae2ab7c..473023940 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java @@ -4,11 +4,14 @@ import dagger.Binds; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoMap; +import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; import org.cryptomator.ui.common.FXMLLoaderFactory; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; import javax.inject.Provider; import java.util.Map; @@ -34,6 +37,13 @@ abstract class UnlockModule { stage.initModality(Modality.APPLICATION_MODAL); return stage; } + + @Provides + @FxmlScene(FxmlFile.UNLOCK) + @UnlockScoped + static Scene provideUnlockScene(@UnlockWindow FXMLLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene("/fxml/unlock2.fxml"); // TODO rename fxml file + } // ------------------