package net.krazyweb.starmodmanager.view;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.Set;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import net.krazyweb.helpers.FileHelper;
import net.krazyweb.starmodmanager.ModManager;
import net.krazyweb.starmodmanager.data.LocalizerFactory;
import net.krazyweb.starmodmanager.data.LocalizerModelInterface;
import net.krazyweb.starmodmanager.data.LocalizerModelInterface.Language;
import net.krazyweb.starmodmanager.data.SettingsFactory;
import net.krazyweb.starmodmanager.data.SettingsModelInterface;
import net.krazyweb.starmodmanager.dialogue.MessageDialogue;
import net.krazyweb.starmodmanager.dialogue.MessageDialogue.MessageType;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SettingsViewController {
private static final Logger log = LogManager.getLogger(SettingsViewController.class);
private SettingsView view;
private SettingsModelInterface settings;
protected SettingsViewController(final SettingsView view) {
this.view = view;
this.view.build();
settings = new SettingsFactory().getInstance();
/*
* The following essentially pre-renders the view,
* preventing delay when adding it to the main window
* for the first time. I haven't found a better way
* around this problem yet. If this isn't done, it
* takes a noticeable amount of time to load the view
* on the first click, which is jarring and should be
* avoided.
*/
Stage stage = new Stage();
Scene scene = new Scene((VBox) this.view.getContent());
stage.setScene(scene);
stage.setOpacity(0);
stage.initStyle(StageStyle.UTILITY);
stage.show();
ModManager.getPrimaryStage().toFront();
stage.close();
}
protected void openFileBrowser(final TextField target) {
DirectoryChooser chooser = new DirectoryChooser();
chooser.setInitialDirectory(Paths.get(target.textProperty().get()).toFile());
File output = chooser.showDialog(new Stage());
if (output != null) {
target.setText(Paths.get(output.getAbsolutePath()).toAbsolutePath().toString());
target.requestFocus();
target.getParent().requestFocus();
}
}
protected void gamePathChanged(final String path) {
settings.setProperty("starboundpath", path);
//TODO Validate the path
log.debug(path);
//TODO copy installed mods to new folder
}
protected void modsPathChanged(final String path) {
Set<Path> paths = new HashSet<>();
FileHelper.listFiles(settings.getPropertyPath("modsdir"), paths);
Path oldPath = settings.getPropertyPath("modsdir");
Path newPath = Paths.get("").toAbsolutePath().relativize(Paths.get(path));
try {
Files.createDirectories(newPath);
} catch (final IOException e) {
log.error("", e);
}
settings.setProperty("modsdir", newPath);
//TODO Validate the path
log.debug(newPath);
for (Path p : paths) {
FileHelper.copyFile(p, settings.getPropertyPath("modsdir").resolve(p.getFileName()));
try {
FileHelper.deleteFile(p);
} catch (final IOException e) {
log.error("", e);
}
}
Set<Path> filesLeftInOldPath = new HashSet<>();
FileHelper.listFiles(oldPath, filesLeftInOldPath);
Set<Path> toRemove = new HashSet<>();
for (Path p : filesLeftInOldPath) {
log.trace("Checking path {} against {}", p, newPath);
try {
if (Files.isSameFile(p, newPath)) {
log.debug("Old path contains new path, will not delete.");
return;
}
} catch (final IOException e) {
log.error("", e);
}
}
for (Path p : filesLeftInOldPath) {
if (Files.isDirectory(p)) {
toRemove.add(p);
}
}
filesLeftInOldPath.removeAll(toRemove);
for (Path p : filesLeftInOldPath) {
log.debug("File left in old path: {}", p);
}
if (filesLeftInOldPath.size() == 0) {
try {
if (Files.exists(oldPath)) {
FileHelper.deleteFile(oldPath);
}
} catch (final IOException e) {
log.error("", e);
}
} else {
log.debug("Files are present in the old path. Will not delete.");
}
}
protected void languageChanged(final Language language) {
settings.setProperty("locale", language.getLocale());
}
protected void loggerLevelChanged(final Level level) {
settings.setProperty("loggerlevel", level);
settings.setLoggerLevel(level);
}
protected void checkVersionChanged(final boolean checked) {
settings.setProperty("checkversiononlaunch", checked);
}
protected void backupSavesOnLaunchChanged(final boolean checked) {
settings.setProperty("backuponlaunch", checked);
}
protected void confirmButtonDelayChanged(final String value) {
settings.setProperty("confirmdelay", value);
}
protected void openLog() {
LocalizerModelInterface localizer = new LocalizerFactory().getInstance();
log.info("Opening log file.");
try {
Desktop.getDesktop().open(settings.getPropertyPath("logpath").toFile());
} catch (final IOException e) {
log.error("", e);
MessageDialogue dialogue = new MessageDialogue(localizer.getMessage("settingsviewcontroller.logerror"), localizer.getMessage("settingsviewcontroller.logerror.title"), MessageType.ERROR, new LocalizerFactory());
dialogue.getResult();
}
}
}