package com.kodcu.config; //import com.dooapp.fxform.annotation.Accessor; 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.BooleanProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ListView; 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.nio.file.Paths; import java.util.Collections; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; /** * Created by usta on 17.07.2015. */ @Component public class SpellcheckConfigBean extends ConfigurationBase { private Logger logger = LoggerFactory.getLogger(SpellcheckConfigBean.class); private final ObjectProperty<ObservableList<Path>> languages = new SimpleObjectProperty<>(FXCollections.observableArrayList()); private final ObjectProperty<Path> defaultLanguage = new SimpleObjectProperty<>(); private final BooleanProperty disableSpellCheck = new SimpleBooleanProperty(false); private final ListView<Path> languagePathList = new ListView<>(); 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 SpellcheckConfigBean(ApplicationController controller, ThreadService threadService, TabService tabService) { super(controller, threadService); this.controller = controller; this.threadService = threadService; this.tabService = tabService; } public Path getDefaultLanguage() { if (Objects.isNull(defaultLanguage.get())) { Optional.ofNullable(getLanguages()) .filter(langs -> !langs.isEmpty()) .ifPresent(langs -> { setDefaultLanguage(langs.get(0)); }); } return defaultLanguage.get(); } public ObjectProperty<Path> defaultLanguageProperty() { return defaultLanguage; } public void setDefaultLanguage(Path defaultLanguage) { this.defaultLanguage.set(defaultLanguage); } public ObservableList<Path> getLanguages() { return languages.get(); } public ObjectProperty<ObservableList<Path>> languagesProperty() { return languages; } public void setLanguages(ObservableList<Path> languages) { this.languages.set(languages); } public ListView<Path> getLanguagePathList() { return languagePathList; } public boolean getDisableSpellCheck() { return disableSpellCheck.get(); } public BooleanProperty disableSpellCheckProperty() { return disableSpellCheck; } public void setDisableSpellCheck(boolean disableSpellCheck) { this.disableSpellCheck.set(disableSpellCheck); } @Override public String formName() { return "SpellCheck Settings"; } @Override public VBox createForm() { return null; // FXForm spellCheckConfigForm = new FXFormBuilder<>() // .resourceBundle(ResourceBundle.getBundle("spellcheck")) // .includeAndReorder("disableSpellCheck", "languages") // .build(); // // DefaultFactoryProvider spellCheckConfigFormProvider = new DefaultFactoryProvider(); // // spellCheckConfigFormProvider.addFactory(new NamedFieldHandler("languages"), new DefaultSpellCheckLanguageFactory(this)); // spellCheckConfigForm.setEditorFactoryProvider(spellCheckConfigFormProvider); // // spellCheckConfigForm.setSource(this); // // VBox vBox = new VBox(); // vBox.getChildren().add(spellCheckConfigForm); // // 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("spellcheck_config.json"); } @Override public void load(ActionEvent... actionEvent) { fadeOut(infoLabel, "Loading..."); loadFoundDictionaries(); Reader fileReader = IOHelper.fileReader(getConfigPath()); JsonReader jsonReader = Json.createReader(fileReader); JsonObject jsonObject = jsonReader.readObject(); final String defaultLanguage = jsonObject.getString("defaultLanguage", null); final boolean disableSpellCheck = jsonObject.getBoolean("disableSpellCheck", false); IOHelper.close(jsonReader, fileReader); final Optional<Path> defaultLanguagePath = Optional.ofNullable(defaultLanguage) .map(Paths::get) .filter(Files::exists); threadService.runActionLater(() -> { this.setDisableSpellCheck(disableSpellCheck); languagePathList.itemsProperty().addListener((observable, oldValue, newValue) -> { defaultLanguagePath .ifPresent(languagePathList.getSelectionModel()::select); }); defaultLanguageProperty().addListener((observable, oldValue, newValue) -> { Optional.ofNullable(newValue) .ifPresent(languagePathList.getSelectionModel()::select); }); defaultLanguagePath .ifPresent(this::setDefaultLanguage); fadeOut(infoLabel, "Loaded..."); }); } private void loadFoundDictionaries() { Path configPath = controller.getConfigPath(); // installed /conf dir Path rootLocation = getConfigRootLocation(); // user.home root final Path localLanguages = configPath.resolve("spellcheck"); final Path addedLanguages = rootLocation.resolve("spellcheck"); IOHelper.createDirectories(addedLanguages); final String extension = ".dict"; final Stream<Path> localDictStream = IOHelper.find(localLanguages, Integer.MAX_VALUE, (path, attrs) -> path.toString().endsWith(extension)); final Stream<Path> addedDictStream = IOHelper.find(addedLanguages, Integer.MAX_VALUE, (path, attrs) -> path.toString().endsWith(extension)); final Stream<Path> dictStream = Stream.concat(localDictStream, addedDictStream); languages.set(FXCollections.observableArrayList(dictStream.sorted(Collections.reverseOrder()).collect(Collectors.toList()))); } @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(getDefaultLanguage())) { objectBuilder.add("defaultLanguage", getDefaultLanguage().toString()); } objectBuilder.add("disableSpellCheck", getDisableSpellCheck()); return objectBuilder.build(); } }