package org.phoenicis.javafx.views.mainwindow.settings;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.Text;
import org.phoenicis.apps.RepositoryManager;
import org.phoenicis.javafx.views.common.TextWithStyle;
import org.phoenicis.settings.SettingsManager;
import java.util.Optional;
import static org.phoenicis.configuration.localisation.Localisation.translate;
/**
* This class represents the "Repositories" settings category
*
* @author marc
* @since 23.04.17
*/
public class RepositoriesPanel extends VBox {
private SettingsManager settingsManager;
private RepositoryManager repositoryManager;
private Text title;
private GridPane repositoryGrid;
private Text repositoryText;
private VBox repositoryLayout;
private ListView<String> repositoryListView;
private HBox repositoryButtonLayout;
private Button addButton;
private Button removeButton;
private Label priorityHint;
private GridPane refreshLayout;
private Label refreshRepositoriesLabel;
private Button refreshRepositoriesButton;
private ObservableList<String> repositories;
/**
* Constructor
*
* @param settingsManager The settings manager
* @param repositoryManager The repository manager
*/
public RepositoriesPanel(SettingsManager settingsManager, RepositoryManager repositoryManager) {
super();
this.settingsManager = settingsManager;
this.repositoryManager = repositoryManager;
this.repositories = FXCollections.observableArrayList(settingsManager.getRepository().split(";"));
this.getStyleClass().add("containerConfigurationPane");
this.populateRepositoryGrid();
this.populateRepositoryLegend();
this.populateRepositoryRefresh();
this.initializeRefreshCallback();
this.getChildren().setAll(title, repositoryGrid, priorityHint, refreshLayout);
VBox.setVgrow(repositoryGrid, Priority.ALWAYS);
}
private void initializeRefreshCallback() {
repositoryManager.addCallbacks(categories -> {
Platform.runLater(() -> {
refreshRepositoriesButton.getStyleClass().remove("refreshIcon");
refreshRepositoriesButton.setDisable(false);
});
}, error -> {
});
}
private void populateRepositoryGrid() {
this.title = new TextWithStyle(translate("Repositories Settings"), "title");
this.repositoryGrid = new GridPane();
this.repositoryGrid.getStyleClass().add("grid");
this.repositoryText = new TextWithStyle(translate("Repository:"), "captionTitle");
this.repositoryLayout = new VBox();
this.repositoryLayout.setSpacing(5);
this.repositoryListView = new ListView<>(repositories);
this.repositoryListView.setPrefHeight(0);
this.repositoryListView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
this.repositoryListView.setEditable(true);
this.repositoryListView.setCellFactory(param -> new DragableRepositoryListCell((repositoryUrl, toIndex) -> {
this.repositoryManager.moveRepository(repositoryUrl, toIndex.intValue());
this.save();
}));
this.repositoryButtonLayout = new HBox();
this.repositoryButtonLayout.setSpacing(5);
this.addButton = new Button();
this.addButton.setText("Add");
this.addButton.setOnAction((ActionEvent event) -> {
TextInputDialog dialog = new TextInputDialog();
dialog.initOwner(getScene().getWindow());
dialog.setTitle("Add repository");
dialog.setHeaderText("Add repository");
dialog.setContentText("Please add the new repository:");
Optional<String> result = dialog.showAndWait();
result.ifPresent(newRepository -> {
repositories.add(0, newRepository);
this.save();
repositoryManager.addRepositories(0, newRepository);
});
});
this.removeButton = new Button();
this.removeButton.setText("Remove");
this.removeButton.setOnAction((ActionEvent event) -> {
String[] toRemove = repositoryListView.getSelectionModel().getSelectedItems().toArray(new String[0]);
repositories.removeAll(toRemove);
this.save();
repositoryManager.removeRepositories(toRemove);
});
this.repositoryButtonLayout.getChildren().addAll(addButton, removeButton);
this.repositoryLayout.getChildren().addAll(repositoryListView, repositoryButtonLayout);
VBox.setVgrow(repositoryListView, Priority.ALWAYS);
this.repositoryGrid.add(repositoryText, 0, 0);
this.repositoryGrid.add(repositoryLayout, 1, 0);
GridPane.setHgrow(repositoryLayout, Priority.ALWAYS);
GridPane.setVgrow(repositoryLayout, Priority.ALWAYS);
GridPane.setValignment(repositoryText, VPos.TOP);
}
private void populateRepositoryLegend() {
this.priorityHint = new Label(translate(
"The value in front of each repository is its priority. The higher the priority is, the more important the scripts inside the repository are."));
this.priorityHint.setWrapText(true);
this.priorityHint.setPadding(new Insets(10));
}
private void populateRepositoryRefresh() {
// Refresh Repositories
this.refreshLayout = new GridPane();
this.refreshLayout.setHgap(20);
this.refreshLayout.setVgap(10);
this.refreshRepositoriesLabel = new Label(
translate("Fetch updates for the repositories to retrieve the newest script versions"));
this.refreshRepositoriesLabel.setWrapText(true);
this.refreshRepositoriesButton = new Button("Refresh Repositories");
this.refreshRepositoriesButton.getStyleClass().add("buttonWithIcon");
this.refreshRepositoriesButton.setOnAction(event -> {
refreshRepositoriesButton.getStyleClass().add("refreshIcon");
refreshRepositoriesButton.setDisable(true);
repositoryManager.triggerRepositoryChange();
});
this.refreshLayout.add(refreshRepositoriesLabel, 0, 0);
this.refreshLayout.add(refreshRepositoriesButton, 1, 0);
GridPane.setHgrow(refreshRepositoriesLabel, Priority.ALWAYS);
}
private void save() {
StringBuilder stringBuilder = new StringBuilder();
for (String repository : repositories) {
stringBuilder.append(repository).append(";");
}
settingsManager.setRepository(stringBuilder.toString());
settingsManager.save();
}
}