/*
* Copyright (c) 2014-2016 Jan Strauß <jan[at]over9000.eu>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package eu.over9000.skadi.ui.dialogs;
import de.jensd.fx.glyphs.GlyphsDude;
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon;
import eu.over9000.skadi.service.DownloadService;
import eu.over9000.skadi.service.helper.RemoteVersionResult;
import javafx.beans.binding.Bindings;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.stage.FileChooser;
import org.apache.commons.lang3.SystemUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.nio.file.Paths;
public class PerformUpdateDialog extends Dialog<File> {
private static final Logger LOGGER = LoggerFactory.getLogger(PerformUpdateDialog.class);
private final ObjectProperty<File> chosen;
private DownloadService downloadService;
public PerformUpdateDialog(final RemoteVersionResult newVersion) {
chosen = new SimpleObjectProperty<>(Paths.get(SystemUtils.USER_HOME, newVersion.getVersion() + ".jar").toFile());
setHeaderText("Updating to " + newVersion.getVersion());
setTitle("Skadi Updater");
getDialogPane().getStyleClass().add("alert");
getDialogPane().getStyleClass().add("information");
final ButtonType restartButtonType = new ButtonType("Start New Version", ButtonBar.ButtonData.OK_DONE);
getDialogPane().getButtonTypes().addAll(restartButtonType, ButtonType.CANCEL);
final Node btn = getDialogPane().lookupButton(restartButtonType);
btn.setDisable(true);
final Label lbPath = new Label("Save as");
final TextField tfPath = new TextField();
tfPath.textProperty().bind(Bindings.createStringBinding(() -> chosen.get().getAbsolutePath(), chosen));
tfPath.setPrefColumnCount(40);
tfPath.setEditable(false);
final Button btChangePath = GlyphsDude.createIconButton(FontAwesomeIcon.FOLDER_OPEN, "Browse...");
btChangePath.setOnAction(event -> {
final FileChooser fc = new FileChooser();
fc.setTitle("Save downloaded jar..");
fc.setInitialFileName(chosen.getValue().getName());
fc.getExtensionFilters().add(new FileChooser.ExtensionFilter("Jar File", ".jar"));
fc.setInitialDirectory(chosen.getValue().getParentFile());
final File selected = fc.showSaveDialog(getOwner());
if (selected != null) {
chosen.set(selected);
}
});
final ProgressBar pbDownload = new ProgressBar(0);
pbDownload.setDisable(true);
pbDownload.setMaxWidth(Double.MAX_VALUE);
final Label lbDownload = new Label("Download");
final Label lbDownloadValue = new Label();
final Button btDownload = GlyphsDude.createIconButton(FontAwesomeIcon.DOWNLOAD, "Start");
btDownload.setMaxWidth(Double.MAX_VALUE);
btDownload.setOnAction(event -> {
btChangePath.setDisable(true);
btDownload.setDisable(true);
downloadService = new DownloadService(newVersion.getDownloadURL(), chosen.getValue());
lbDownloadValue.textProperty().bind(downloadService.messageProperty());
pbDownload.progressProperty().bind(downloadService.progressProperty());
downloadService.setOnSucceeded(dlEvent -> btn.setDisable(false));
downloadService.setOnFailed(dlFailed -> {
LOGGER.error("new version download failed", dlFailed.getSource().getException());
lbDownloadValue.textProperty().unbind();
lbDownloadValue.setText("Download failed, check log file for details.");
});
downloadService.start();
});
final GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.add(lbPath, 0, 0);
grid.add(tfPath, 1, 0);
grid.add(btChangePath, 2, 0);
grid.add(new Separator(), 0, 1, 3, 1);
grid.add(lbDownload, 0, 2);
grid.add(pbDownload, 1, 2);
grid.add(btDownload, 2, 2);
grid.add(lbDownloadValue, 1, 3);
getDialogPane().setContent(grid);
setResultConverter(btnType -> {
if (btnType == restartButtonType) {
return chosen.getValue();
}
if (btnType == ButtonType.CANCEL) {
if (downloadService.isRunning()) {
downloadService.cancel();
}
}
return null;
});
}
}