package com.kodcu.config; //import com.dooapp.fxform.annotation.Accessor; import com.dooapp.fxform.FXForm; import com.dooapp.fxform.builder.FXFormBuilder; import com.dooapp.fxform.handler.NamedFieldHandler; import com.dooapp.fxform.view.factory.DefaultFactoryProvider; import com.kodcu.config.factory.FileChooserEditableFactory; import com.kodcu.config.factory.FileChooserFactory; import com.kodcu.controller.ApplicationController; import com.kodcu.other.IOHelper; import com.kodcu.service.ThreadService; import com.kodcu.service.ui.TabService; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonReader; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; import java.util.ResourceBundle; /** * Created by usta on 17.07.2015. */ @Component public class LocationConfigBean extends ConfigurationBase { private Logger logger = LoggerFactory.getLogger(LocationConfigBean.class); private ObjectProperty<String> stylesheetDefault = new SimpleObjectProperty<>(); private ObjectProperty<String> stylesheetOverrides = new SimpleObjectProperty<>(); private ObjectProperty<String> mathjax = new SimpleObjectProperty<>(); private ObjectProperty<String> kindlegen = new SimpleObjectProperty<>(); public String getStylesheetDefault() { return stylesheetDefault.get(); } public ObjectProperty<String> stylesheetDefaultProperty() { return stylesheetDefault; } public void setStylesheetDefault(String stylesheetDefault) { this.stylesheetDefault.set(stylesheetDefault); } public String getStylesheetOverrides() { return stylesheetOverrides.get(); } public ObjectProperty<String> stylesheetOverridesProperty() { return stylesheetOverrides; } public void setStylesheetOverrides(String stylesheetOverrides) { this.stylesheetOverrides.set(stylesheetOverrides); } public String getMathjax() { return mathjax.get(); } public ObjectProperty<String> mathjaxProperty() { return mathjax; } public void setMathjax(String mathjax) { this.mathjax.set(mathjax); } public String getKindlegen() { return kindlegen.get(); } public ObjectProperty<String> kindlegenProperty() { return kindlegen; } public void setKindlegen(String kindlegen) { this.kindlegen.set(kindlegen); } private final ApplicationController controller; private final ThreadService threadService; private final TabService tabService; private final Button saveButton = new Button("Save"); private final Button loadButton = new Button("Load"); private final Label infoLabel = new Label(); @Autowired public LocationConfigBean(ApplicationController controller, ThreadService threadService, TabService tabService) { super(controller, threadService); this.controller = controller; this.threadService = threadService; this.tabService = tabService; } @Override public String formName() { return "Location Settings"; } @Override public VBox createForm() { FXForm locationConfigForm = new FXFormBuilder<>() .resourceBundle(ResourceBundle.getBundle("locationConfig")) .includeAndReorder("stylesheetDefault", "stylesheetOverrides", "mathjax", "kindlegen") .build(); DefaultFactoryProvider locationConfigFormProvider = new DefaultFactoryProvider(); locationConfigFormProvider.addFactory(new NamedFieldHandler("kindlegen"), new FileChooserFactory("Enter kindlegen path", controller::openInDesktop)); locationConfigFormProvider.addFactory(new NamedFieldHandler("mathjax"), new FileChooserFactory(controller::openInDesktop)); locationConfigFormProvider.addFactory(new NamedFieldHandler("stylesheetDefault"), new FileChooserEditableFactory(tabService::addTab, controller::openInDesktop)); locationConfigFormProvider.addFactory(new NamedFieldHandler("stylesheetOverrides"), new FileChooserEditableFactory(tabService::addTab, controller::openInDesktop)); locationConfigForm.setEditorFactoryProvider(locationConfigFormProvider); locationConfigForm.setSource(this); VBox vBox = new VBox(); vBox.getChildren().add(locationConfigForm); saveButton.setOnAction(this::save); loadButton.setOnAction(this::load); HBox box = new HBox(5, saveButton, loadButton, infoLabel); box.setPadding(new Insets(0, 0, 15, 5)); vBox.getChildren().add(box); return vBox; } @Override public Path getConfigPath() { return super.resolveConfigPath("location_config.json"); } @Override public void load(ActionEvent... actionEvent) { fadeOut(infoLabel, "Loading..."); loadPathDefaults(); Reader fileReader = IOHelper.fileReader(getConfigPath()); JsonReader jsonReader = Json.createReader(fileReader); JsonObject jsonObject = jsonReader.readObject(); String stylesheetDefault = jsonObject.getString("stylesheetDefault", null); String stylesheetOverrides = jsonObject.getString("stylesheetOverrides", null); String mathjax = jsonObject.getString("mathjax", null); String kindlegen = jsonObject.getString("kindlegen", null); IOHelper.close(jsonReader, fileReader); threadService.runActionLater(() -> { if (Objects.nonNull(stylesheetDefault)) { this.setStylesheetDefault(stylesheetDefault); } if (Objects.nonNull(stylesheetOverrides)) { this.setStylesheetOverrides(stylesheetOverrides); } if (Objects.nonNull(mathjax)) { this.setMathjax(mathjax); } if (Objects.nonNull(kindlegen)) { this.setKindlegen(kindlegen); } fadeOut(infoLabel, "Loaded..."); }); } private void loadPathDefaults() { Path configPath = controller.getConfigPath(); // installed /conf dir Path rootLocation = getConfigRootLocation(); // user.home root Path targetCssPath = rootLocation.resolve("css"); Path backupCssPath = configPath.resolve("public/css"); IOHelper.createDirectories(targetCssPath); if (Files.notExists(targetCssPath.resolve("asciidoctor-default.css"))) { IOHelper.copy(backupCssPath .resolve("asciidoctor-default.css"), targetCssPath.resolve("asciidoctor-default.css")); } if (Files.notExists(targetCssPath.resolve("asciidoctor-default-overrides.css"))) { IOHelper.copy(backupCssPath .resolve("asciidoctor-default-overrides.css"), targetCssPath.resolve("asciidoctor-default-overrides.css")); } this.setStylesheetDefault(targetCssPath.resolve("asciidoctor-default.css").toString()); this.setStylesheetOverrides(targetCssPath.resolve("asciidoctor-default-overrides.css").toString()); this.setMathjax(configPath .resolve("public/mathjax/MathJax.js").toString()); } @Override public void save(ActionEvent... actionEvent) { infoLabel.setText("Saving..."); saveJson(getJSON()); fadeOut(infoLabel, "Saved..."); } @Override public JsonObject getJSON() { JsonObjectBuilder objectBuilder = Json.createObjectBuilder(); if (Objects.nonNull(getStylesheetDefault())) { objectBuilder.add("stylesheetDefault", getStylesheetDefault()); } if (Objects.nonNull(getStylesheetOverrides())) { objectBuilder.add("stylesheetOverrides", getStylesheetOverrides()); } if (Objects.nonNull(getMathjax())) { objectBuilder.add("mathjax", getMathjax()); } if (Objects.nonNull(getKindlegen())) { objectBuilder.add("kindlegen", getKindlegen()); } return objectBuilder.build(); } }