/* * Copyright (c) 2014 Dennis Fischer. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0+ * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: Dennis Fischer */ package de.chaosfisch.uploader.gui; import com.cathive.fx.guice.GuiceApplication; import com.cathive.fx.guice.GuiceFXMLLoader; import com.google.common.base.Strings; import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.name.Named; import com.sun.javafx.css.StyleManager; import de.chaosfisch.google.account.Account; import de.chaosfisch.google.account.IAccountService; import de.chaosfisch.google.youtube.upload.IUploadService; import de.chaosfisch.uploader.UploaderModule; import de.chaosfisch.uploader.gui.controller.ConfirmDialogController; import de.chaosfisch.uploader.gui.controller.InputDialogController; import de.chaosfisch.uploader.gui.renderer.Callback; import de.chaosfisch.uploader.gui.renderer.DialogHelper; import de.chaosfisch.uploader.persistence.dao.IPersistenceService; import javafx.application.Platform; import javafx.event.EventHandler; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.SceneBuilder; import javafx.scene.image.Image; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.stage.*; import org.apache.commons.configuration.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; import java.util.ResourceBundle; @SuppressWarnings("WeakerAccess") public class GUIUploader extends GuiceApplication { private static final int MIN_HEIGHT = 640; private static final int MIN_WIDTH = 1000; private static final Logger LOGGER = LoggerFactory.getLogger(GUIUploader.class); @Inject private GuiceFXMLLoader fxmlLoader; @Inject private DialogHelper dialogHelper; @Inject private IPersistenceService persistenceService; @Inject private IUploadService uploadService; @Inject private IAccountService accountService; @Inject private Configuration configuration; @Inject @Named("i18n-resources") private ResourceBundle resources; private double initX; private double initY; @Override public void start(final Stage primaryStage) { StyleManager.getInstance() .addUserAgentStylesheet(getClass().getResource("/de/chaosfisch/uploader/resources/style.css") .toExternalForm()); final boolean useMasterPassword = configuration.getBoolean(IPersistenceService.MASTER_PASSWORD, false); if (useMasterPassword) { dialogHelper.showInputDialog("Masterpasswort", "Masterpasswort:", new Callback() { @Override public void onInput(final InputDialogController controller, final String input) { if (Strings.isNullOrEmpty(input)) { controller.input.getStyleClass().add("input-invalid"); } else { persistenceService.generateBackup(); persistenceService.setMasterPassword(input); controller.closeDialog(null); } } }, true); } if (!persistenceService.loadFromStorage()) { if (useMasterPassword) { dialogHelper.showErrorDialog("Closing..", "Invalid password."); } else { dialogHelper.showErrorDialog("Closing..", "Unknown error occured."); } Platform.exit(); } else { persistenceService.cleanStorage(); Platform.setImplicitExit(false); initApplication(primaryStage); uploadService.resetUnfinishedUploads(); uploadService.startStarttimeCheck(); LOGGER.info("Verifying accounts"); final List<Account> accounts = accountService.getAll(); for (final Account account : accounts) { if (!accountService.verifyAccount(account)) { LOGGER.warn("Account is invalid: {}", account.getName()); dialogHelper.showAccountPermissionsDialog(account); } } } } @Override public void init(final List<Module> modules) throws Exception { modules.addAll(Arrays.asList(new UploaderModule(), new GUIModule())); } private void initApplication(final Stage primaryStage) { try { final Parent parent = fxmlLoader.load(getClass().getResource("/de/chaosfisch/uploader/view/SimpleJavaYoutubeUploader.fxml"), resources) .getRoot(); final Scene scene = SceneBuilder.create().root(parent).fill(Color.TRANSPARENT).build(); try (InputStream iconInputStream = getClass().getResourceAsStream("/de/chaosfisch/uploader/resources/images/film.png")) { StageBuilder.create() .icons(new Image(iconInputStream)) .minHeight(MIN_HEIGHT) .height(MIN_HEIGHT) .minWidth(MIN_WIDTH) .width(MIN_WIDTH) .scene(scene) .resizable(true) .onCloseRequest(new ApplicationClosePromptDialog()) .applyTo(primaryStage); } parent.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(final MouseEvent me) { primaryStage.setX(me.getScreenX() - initX); primaryStage.setY(me.getScreenY() - initY); } }); parent.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(final MouseEvent me) { initX = me.getScreenX() - primaryStage.getX(); initY = me.getScreenY() - primaryStage.getY(); } }); primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.show(); } catch (final IOException e) { LOGGER.error("FXML Load error", e); throw new RuntimeException(e); } } @Override public void stop() throws Exception { uploadService.stopStarttimeCheck(); } public static void initialize(final String[] args) { launch(args); } private final class ApplicationClosePromptDialog implements EventHandler<WindowEvent> { @Override public void handle(final WindowEvent event) { try { final GuiceFXMLLoader.Result result = fxmlLoader.load(getClass().getResource("/de/chaosfisch/uploader/view/ConfirmDialog.fxml"), resources); final ConfirmDialogController controller = result.getController(); controller.setTitle(resources.getString("dialog.exitapplication.title")); controller.setMessage(resources.getString("dialog.exitapplication.message")); final Parent parent = result.getRoot(); final Scene scene = SceneBuilder.create().root(parent).build(); final Stage stage = StageBuilder.create().scene(scene).build(); stage.initStyle(StageStyle.UNDECORATED); stage.initModality(Modality.APPLICATION_MODAL); stage.showAndWait(); stage.requestFocus(); if (!controller.ask()) { event.consume(); } else { Platform.exit(); } } catch (final IOException e) { LOGGER.error("Couldn't load ConfirmDialog", e); } } } }