/************************************************************************************************** * 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.renderer; import com.cathive.fx.guice.GuiceFXMLLoader; import com.google.gson.Gson; import com.google.inject.Inject; import com.google.inject.name.Named; import de.chaosfisch.google.account.Account; import de.chaosfisch.uploader.gui.controller.AccountAddDialogController; import de.chaosfisch.uploader.gui.controller.ErrorDialogController; import de.chaosfisch.uploader.gui.controller.InputDialogController; import de.chaosfisch.uploader.gui.controller.ViewController; import de.chaosfisch.uploader.template.ITemplateService; import de.chaosfisch.uploader.template.Template; import javafx.concurrent.Task; import javafx.geometry.Point2D; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.SceneBuilder; import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.ProgressBar; import javafx.scene.control.TooltipBuilder; import javafx.scene.paint.Color; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.StageBuilder; import javafx.stage.StageStyle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.ResourceBundle; public class DialogHelper { @Inject private GuiceFXMLLoader fxmlLoader; @Inject private ITemplateService templateService; @Inject @Named("i18n-resources") private ResourceBundle resources; private static final Logger logger = LoggerFactory.getLogger(DialogHelper.class); private ProgressBar busyProgressBar; private Label busyProgressLabel; public void registerBusyTask(final Task task) { if (null != busyProgressBar) { busyProgressBar.progressProperty().unbind(); busyProgressBar.progressProperty().bind(task.progressProperty()); } if (null != busyProgressLabel) { busyProgressLabel.textProperty().unbind(); busyProgressLabel.textProperty().bind(task.messageProperty()); } } public void showTemplateAddDialog() { showInputDialog("templateDialog.templateTitle", "templateDialog.templateLabel", new Callback() { @Override public void onInput(final InputDialogController controller, final String input) { try { controller.input.getStyleClass().remove("input-invalid"); final Gson gson = new Gson(); final Template template = gson.fromJson(gson.toJson(ViewController.standardTemplate), Template.class); template.setName(input); template.setDefaultdir(new File(template.getDefaultdir().getPath())); templateService.insert(template); controller.closeDialog(null); } catch (final IllegalArgumentException e) { switch (e.getMessage()) { case Template.Validation.NAME: controller.input.getStyleClass().add("input-invalid"); controller.input .setTooltip(TooltipBuilder.create() .autoHide(true) .text(resources.getString("validation.name")) .build()); controller.input .getTooltip() .show(controller.input, getTooltipX(controller.input), getTooltipY(controller.input)); break; } } } }); } public void showPlaylistAddDialog() { try { final GuiceFXMLLoader.Result result = fxmlLoader.load(getClass().getResource( "/de/chaosfisch/uploader/view/PlaylistAddDialog.fxml"), resources); 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.requestFocus(); stage.showAndWait(); } catch (final IOException e) { logger.error("Couldn't load PlaylistAddDialog", e); } } public void showErrorDialog(final String title, final String message) { try { final GuiceFXMLLoader.Result result = fxmlLoader.load(getClass().getResource( "/de/chaosfisch/uploader/view/ErrorDialog.fxml"), resources); final ErrorDialogController controller = result.getController(); controller.setTitle(title); controller.setMessage(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(); } catch (final IOException e) { logger.error("Couldn't load ConfirmDialog", e); } } void showInputDialog(final String title, final String input, final Callback callback) { showInputDialog(title, input, callback, false); } public void showInputDialog(final String title, final String input, final Callback callback, final boolean blocking) { try { final GuiceFXMLLoader.Result result = fxmlLoader.load(getClass().getResource( "/de/chaosfisch/uploader/view/InputDialog.fxml"), resources); final Parent parent = result.getRoot(); final InputDialogController controller = result.getController(); controller.setTitle(resources.containsKey(title) ? resources.getString(title) : title); controller.setInput(resources.containsKey(input) ? resources.getString(input) : input); controller.setCallback(callback); final Scene scene = SceneBuilder.create().fill(Color.TRANSPARENT).root(parent).build(); final Stage stage = StageBuilder.create().scene(scene).build(); stage.initStyle(StageStyle.UNDECORATED); stage.initModality(Modality.APPLICATION_MODAL); if (blocking) { stage.showAndWait(); } else { stage.show(); } stage.requestFocus(); } catch (final IOException e) { logger.error("Couldn't load InputDialog", e); } } public double getTooltipY(final Node node) { final Point2D p = node.localToScene(0.0, 0.0); return p.getY() + node.getScene().getY() + node.getScene().getWindow().getY() + node.getLayoutBounds() .getHeight() - 5; } public double getTooltipX(final Node node) { final Point2D p = node.localToScene(0.0, 0.0); return p.getX() + node.getScene().getX() + node.getScene().getWindow().getX() - 5; } public void resetControlls(final Control[] nodes) { for (final Control node : nodes) { node.getStyleClass().remove("input-invalid"); node.setTooltip(null); } } public void registerBusyControls(final ProgressBar busyProgressBar, final Label busyProgressLabel) { this.busyProgressBar = busyProgressBar; this.busyProgressLabel = busyProgressLabel; } public void showAccountPermissionsDialog() { showAccountPermissionsDialog(null); } public void showAccountPermissionsDialog(final Account account) { try { final GuiceFXMLLoader.Result result = fxmlLoader.load(getClass().getResource( "/de/chaosfisch/uploader/view/AccountAddDialog.fxml"), resources); final Parent parent = result.getRoot(); ((AccountAddDialogController) result.getController()).initAuth(account); final Scene scene = SceneBuilder.create().root(parent).build(); final Stage stage = StageBuilder.create().scene(scene).build(); stage.initStyle(StageStyle.DECORATED); stage.initModality(Modality.APPLICATION_MODAL); stage.setResizable(true); stage.requestFocus(); stage.showAndWait(); } catch (final Exception e) { logger.error("Couldn't load AccountAddDialog", e); } } }