package com.twasyl.slideshowfx.controllers;
import com.twasyl.slideshowfx.global.configuration.GlobalConfiguration;
import com.twasyl.slideshowfx.hosting.connector.IHostingConnector;
import com.twasyl.slideshowfx.osgi.OSGiManager;
import com.twasyl.slideshowfx.services.AutoSavingService;
import com.twasyl.slideshowfx.snippet.executor.ISnippetExecutor;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.VBox;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* This class is the controller for the view {@code OptionsView.fxml}.
*
* @author Thierry Wasylczenko
* @version 1.1
* @since SlideshowFX 1.0
*/
public class OptionsViewController implements Initializable {
private static final Logger LOGGER = Logger.getLogger(OptionsViewController.class.getName());
@FXML private VBox snippetExecutorContainer;
@FXML private VBox hostingConnectorContainer;
@FXML private CheckBox enableAutoSaving;
@FXML private TextField autoSavingInterval;
@FXML private CheckBox enableTemporaryFilesDeletion;
@FXML private TextField temporaryFilesMaxAge;
/**
* This methods saves the options displayed in the view and make them persistent.
*/
public void saveOptions() {
final OSGiManager manager = OSGiManager.getInstance();
manager.getInstalledServices(ISnippetExecutor.class)
.forEach(ISnippetExecutor::saveNewOptions);
manager.getInstalledServices(IHostingConnector.class)
.forEach(IHostingConnector::saveNewOptions);
this.saveAutoSavingOptions();
this.saveTemporaryFilesDeletion();
}
/**
* Saves the options regarding the auto saving configuration.
*/
private void saveAutoSavingOptions() {
GlobalConfiguration.enableAutoSaving(this.enableAutoSaving.isSelected());
if(!this.enableAutoSaving.isSelected()) {
AutoSavingService.cancelAll();
} else {
AutoSavingService.resumeAll();
}
final String autoSavingInterval = this.autoSavingInterval.getText();
if(autoSavingInterval != null) {
try {
final Long newAutoSavingInterval = Long.valueOf(autoSavingInterval);
GlobalConfiguration.setAutoSavingInterval(newAutoSavingInterval);
AutoSavingService.setDelayForAllServices(newAutoSavingInterval);
} catch(NumberFormatException ex) {
LOGGER.log(Level.WARNING, "Invalid auto saving interval", ex);
GlobalConfiguration.removeAutoSavingInterval();
}
} else {
GlobalConfiguration.removeAutoSavingInterval();
}
}
/**
* Saves the options regarding the temporary files deletion configuration.
*/
private void saveTemporaryFilesDeletion() {
GlobalConfiguration.enableTemporaryFilesDeletionOnExit(this.enableTemporaryFilesDeletion.isSelected());
final String temporaryFilesMaxAge = this.temporaryFilesMaxAge.getText();
if(temporaryFilesMaxAge != null) {
try {
GlobalConfiguration.setTemporaryFilesMaxAge(Long.parseLong(temporaryFilesMaxAge));
} catch(NumberFormatException ex) {
LOGGER.log(Level.WARNING, "Invalid temporary files max age", ex);
GlobalConfiguration.removeTemporaryFilesMaxAge();
}
} else {
GlobalConfiguration.removeTemporaryFilesMaxAge();
}
}
/**
* Display the configuration UI for each {@link ISnippetExecutor}.
*/
private void initializeSnippetExecutorUI() {
OSGiManager.getInstance().getInstalledServices(ISnippetExecutor.class)
.forEach(snippet -> {
final Node configurationUI = snippet.getConfigurationUI();
if(configurationUI != null) this.snippetExecutorContainer.getChildren().add(configurationUI);
});
}
/**
* Displays the configuration UI for each {@link IHostingConnector}
*/
private void initializeHostingConnectorUI() {
OSGiManager.getInstance().getInstalledServices(IHostingConnector.class)
.forEach(hostingConnector -> {
final Node configurationUI = hostingConnector.getConfigurationUI();
if(configurationUI != null) {
final TitledPane pane = new TitledPane(hostingConnector.getName(), configurationUI);
pane.setCollapsible(true);
pane.setExpanded(false);
this.hostingConnectorContainer.getChildren().add(pane);
}
});
}
/**
* Initialize the UI for elements addressing the temporary file deletions.
*/
private void initializeTemporaryFilesDeletionUI() {
final Long maxAge = GlobalConfiguration.getTemporaryFilesMaxAge();
this.temporaryFilesMaxAge.setText(maxAge == null ? "" : String.valueOf(maxAge));
this.temporaryFilesMaxAge.disableProperty().bind(this.enableTemporaryFilesDeletion.selectedProperty().not());
this.enableTemporaryFilesDeletion.setSelected(GlobalConfiguration.isTemporaryFilesDeletionOnExitEnabled());
}
/**
* Initialize the UI for elements addressing the auto save files.
*/
private void initializeAutoSaveUI() {
final Long interval = GlobalConfiguration.getAutoSavingInterval();
this.autoSavingInterval.setText(interval == null ? "" : String.valueOf(interval));
this.autoSavingInterval.disableProperty().bind(this.enableAutoSaving.selectedProperty().not());
this.enableAutoSaving.setSelected(GlobalConfiguration.isAutoSavingEnabled());
}
@Override
public void initialize(URL location, ResourceBundle resources) {
this.initializeAutoSaveUI();
this.initializeTemporaryFilesDeletionUI();
this.initializeSnippetExecutorUI();
this.initializeHostingConnectorUI();
}
}