package net.krazyweb.starmodmanager.view;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import net.krazyweb.helpers.CSSHelper;
import net.krazyweb.helpers.FXHelper;
import net.krazyweb.jfx.controls.NumericTextField;
import net.krazyweb.starmodmanager.data.Localizer;
import net.krazyweb.starmodmanager.data.LocalizerFactory;
import net.krazyweb.starmodmanager.data.LocalizerModelInterface;
import net.krazyweb.starmodmanager.data.LocalizerModelInterface.Language;
import net.krazyweb.starmodmanager.data.Observable;
import net.krazyweb.starmodmanager.data.Observer;
import net.krazyweb.starmodmanager.data.SettingsFactory;
import net.krazyweb.starmodmanager.data.SettingsModelInterface;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SettingsView implements Observer {
@SuppressWarnings("unused")
private static final Logger log = LogManager.getLogger(SettingsView.class);
private VBox root;
private Label gamePathTitle;
private TextField gamePathField;
private Button gamePathButton;
private Label modsPathTitle;
private TextField modsPathField;
private Button modsPathButton;
private ComboBox<Language> languageSelector;
private Text checkVersionTitle;
private CheckBox checkVersionBox;
private Text backupSavesOnLaunchTitle;
private CheckBox backupSavesOnLaunchBox;
private Label confirmButtonDelayTitle;
private NumericTextField confirmButtonDelayField;
private ComboBox<Level> loggerLevelSelector;
private Label loggerLevelTitle;
private Button openLogButton;
private SettingsViewController controller;
private SettingsModelInterface settings;
private LocalizerModelInterface localizer;
protected SettingsView() {
settings = new SettingsFactory().getInstance();
localizer = new LocalizerFactory().getInstance();
localizer.addObserver(this);
controller = new SettingsViewController(this);
}
protected void build() {
root = new VBox();
root.setSpacing(15);
gamePathTitle = new Label();
gamePathTitle.setId("settings-view-text-large");
gamePathTitle.setTranslateX(10);
gamePathTitle.setAlignment(Pos.TOP_LEFT);
gamePathTitle.setPrefHeight(25);
gamePathField = new TextField();
gamePathField.setPrefHeight(37);
gamePathField.prefWidthProperty().bind(root.widthProperty().subtract(56));
gamePathButton = new Button();
gamePathButton.setId("settings-path-button");
gamePathButton.setPrefHeight(37);
gamePathButton.setPrefWidth(36);
gamePathButton.setGraphic(new ImageView(new Image(SettingsView.class.getClassLoader().getResourceAsStream("folder-icon.png"))));
GridPane gamePathContainer = new GridPane();
gamePathContainer.add(gamePathTitle, 1, 1);
gamePathContainer.add(gamePathField, 1, 2);
gamePathContainer.add(gamePathButton, 2, 2);
modsPathTitle = new Label();
modsPathTitle.setId("settings-view-text-large");
modsPathTitle.setTranslateX(10);
modsPathTitle.setAlignment(Pos.TOP_LEFT);
modsPathTitle.setPrefHeight(25);
modsPathField = new TextField();
modsPathField.setPrefHeight(37);
modsPathField.prefWidthProperty().bind(root.widthProperty().subtract(56));
modsPathButton = new Button();
modsPathButton.setId("settings-path-button");
modsPathButton.setPrefHeight(37);
modsPathButton.setPrefWidth(36);
modsPathButton.setGraphic(new ImageView(new Image(SettingsView.class.getClassLoader().getResourceAsStream("folder-icon.png"))));
GridPane modInstallPathContainer = new GridPane();
modInstallPathContainer.add(modsPathTitle, 1, 1);
modInstallPathContainer.add(modsPathField, 1, 2);
modInstallPathContainer.add(modsPathButton, 2, 2);
ObservableList<Language> languageOptions = FXCollections.observableArrayList(localizer.getLanguages());
languageSelector = new ComboBox<>(languageOptions);
languageSelector.setValue(localizer.getCurrentLanguage());
languageSelector.setFocusTraversable(false);
languageSelector.setPrefWidth(300);
languageSelector.setPrefHeight(37);
openLogButton = new Button();
openLogButton.setId("settings-standalone-button");
openLogButton.setGraphic(new ImageView(new Image(SettingsView.class.getClassLoader().getResourceAsStream("log-icon.png"))));
openLogButton.setPrefHeight(37);
openLogButton.setGraphicTextGap(10);
openLogButton.setAlignment(Pos.CENTER);
ObservableList<Level> loggerLevelOptions = FXCollections.observableArrayList(
Level.OFF,
Level.FATAL,
Level.ERROR,
Level.WARN,
Level.INFO,
Level.DEBUG,
Level.TRACE
);
HBox loggerLevelContainer = new HBox();
loggerLevelContainer.setAlignment(Pos.CENTER_LEFT);
loggerLevelContainer.setSpacing(15);
loggerLevelSelector = new ComboBox<>(loggerLevelOptions);
loggerLevelSelector.setValue(settings.getPropertyLevel("loggerlevel"));
loggerLevelSelector.setPrefWidth(183);
loggerLevelSelector.setPrefHeight(37);
loggerLevelSelector.setFocusTraversable(false);
loggerLevelTitle = new Label();
loggerLevelTitle.setId("settings-view-text-large");
loggerLevelContainer.getChildren().addAll(loggerLevelTitle, loggerLevelSelector, openLogButton);
HBox checkVersionContainer = new HBox();
checkVersionBox = new CheckBox();
checkVersionTitle = new Text();
checkVersionContainer.getChildren().addAll(checkVersionBox, checkVersionTitle);
HBox backupSavesOnLaunchContainer = new HBox();
backupSavesOnLaunchBox = new CheckBox();
backupSavesOnLaunchTitle = new Text();
backupSavesOnLaunchContainer.getChildren().addAll(backupSavesOnLaunchBox, backupSavesOnLaunchTitle);
HBox confirmButtonDelayContainer = new HBox();
confirmButtonDelayContainer.setAlignment(Pos.CENTER_LEFT);
confirmButtonDelayContainer.setSpacing(15);
confirmButtonDelayField = new NumericTextField();
confirmButtonDelayField.setId("fully-rounded-input");
confirmButtonDelayField.setPrefHeight(37);
confirmButtonDelayField.setPrefWidth(43);
confirmButtonDelayTitle = new Label();
confirmButtonDelayTitle.setId("settings-view-text-large");
confirmButtonDelayContainer.getChildren().addAll(confirmButtonDelayField, confirmButtonDelayTitle);
root.getChildren().addAll(
gamePathContainer,
modInstallPathContainer,
languageSelector,
loggerLevelContainer,
//checkVersionContainer,
//backupSavesOnLaunchContainer,
confirmButtonDelayContainer
);
createListeners();
updateStrings();
updateColors();
}
private void createListeners() {
gamePathField.setText(settings.getPropertyPath("starboundpath").toAbsolutePath().toString());
gamePathField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean oldValue, Boolean newValue) {
if (!newValue) {
controller.gamePathChanged(gamePathField.getText());
}
}
});
gamePathButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent event) {
controller.openFileBrowser(gamePathField);
}
});
modsPathField.setText(settings.getPropertyPath("modsdir").toAbsolutePath().toString());
modsPathField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean oldValue, Boolean newValue) {
if (!newValue) {
controller.modsPathChanged(modsPathField.getText());
}
}
});
modsPathButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent event) {
controller.openFileBrowser(modsPathField);
}
});
languageSelector.valueProperty().addListener(new ChangeListener<Language>() {
@Override
public void changed(ObservableValue<? extends Language> ov, Language oldValue, Language newValue) {
controller.languageChanged(newValue);
}
});
loggerLevelSelector.valueProperty().addListener(new ChangeListener<Level>() {
@Override
public void changed(ObservableValue<? extends Level> ov, Level oldValue, Level newValue) {
controller.loggerLevelChanged(newValue);
}
});
openLogButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent e) {
controller.openLog();
}
});
checkVersionBox.selectedProperty().setValue(settings.getPropertyBoolean("checkversiononlaunch"));
checkVersionBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean oldValue, Boolean newValue) {
controller.checkVersionChanged(newValue);
}
});
backupSavesOnLaunchBox.selectedProperty().setValue(settings.getPropertyBoolean("backuponlaunch"));
backupSavesOnLaunchBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean oldValue, Boolean newValue) {
controller.backupSavesOnLaunchChanged(newValue);
}
});
confirmButtonDelayField.setMinValue(0);
confirmButtonDelayField.setMaxValue(10);
confirmButtonDelayField.setDefaultValue(0);
confirmButtonDelayField.setText(settings.getPropertyString("confirmdelay"));
confirmButtonDelayField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean oldValue, Boolean newValue) {
if (!newValue) {
controller.confirmButtonDelayChanged(confirmButtonDelayField.getText());
}
}
});
}
protected Node getContent() {
return root;
}
private void updateStrings() {
gamePathTitle.setText(localizer.getMessage("settings.starboundpath"));
modsPathTitle.setText(localizer.getMessage("settings.modspath"));
loggerLevelTitle.setText(localizer.getMessage("settings.loggerlevel"));
openLogButton.setText(localizer.getMessage("settings.openlog"));
checkVersionTitle.setText(localizer.getMessage("settings.checkversion"));
backupSavesOnLaunchTitle.setText(localizer.getMessage("settings.backuponlaunch"));
confirmButtonDelayTitle.setText(localizer.getMessage("settings.confirmdelay"));
//TODO Move this to a utility class
Text test = new Text();
test.setFont(Font.loadFont(ModView.class.getClassLoader().getResourceAsStream("Lato-Medium.ttf"), 12));
test.setId("settings-standalone-button");
VBox t = new VBox();
t.getChildren().add(test);
Stage s = new Stage();
s.setOpacity(0);
s.setScene(new Scene(t, 500, 500));
s.show();
test.setText(localizer.getMessage("settings.openlog"));
int width = (int) (test.getLayoutBounds().getWidth() + 64);
openLogButton.setPrefWidth(width);
openLogButton.setMinWidth(width);
s.close();
}
private void updateColors() {
Color color = CSSHelper.getColor("file-browser-icon-color", settings.getPropertyString("theme"));
FXHelper.setColor(gamePathButton.getGraphic(), color);
FXHelper.setColor(modsPathButton.getGraphic(), color);
color = CSSHelper.getColor("log-icon-color", settings.getPropertyString("theme"));
FXHelper.setColor(openLogButton.getGraphic(), color);
}
@Override
public void update(final Observable observable, final Object message) {
if (observable instanceof Localizer && message.equals("localechanged")) {
updateStrings();
}
}
}