package com.narrowtux.fmm.gui;
import com.narrowtux.fmm.model.Mod;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Dialog;
import javafx.scene.control.SplitMenuButton;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.layout.VBox;
import javafx.util.Callback;
import java.io.IOException;
import java.net.URL;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Set;
public class DependencyResolveDialog extends Dialog<Set<Mod>> implements Initializable {
public static final Set<Mod> CANCELLED = Collections.emptySet();
public DependencyResolveDialog(List<Set<Mod>> availableSolutions) throws IOException {
this.availableSolutions = availableSolutions;
load();
}
private void load() throws IOException {
FXMLLoader loader = new FXMLLoader();
loader.setControllerFactory(clazz -> this);
loader.setLocation(getClass().getResource("/dependencydialog.fxml"));
loader.load();
}
private List<Set<Mod>> availableSolutions;
private BooleanProperty remember = new SimpleBooleanProperty(false);
@FXML
private TreeTableView solutions;
@FXML
private TreeTableColumn modColumn;
@FXML
private TreeTableColumn versionColumn;
@FXML
private CheckBox rememberCheck;
@FXML
private VBox root;
@FXML
private Button useButton;
private TreeItem rootItem = new TreeItem(null);
public boolean getRemember() {
return remember.get();
}
public BooleanProperty rememberProperty() {
return remember;
}
public void setRemember(boolean remember) {
this.remember.set(remember);
}
public void onUse(ActionEvent actionEvent) {
if (updateResult()) {
close();
}
}
private boolean updateResult() {
TreeItem item = solutions.getSelectionModel().getModelItem(solutions.getSelectionModel().getSelectedIndex());
if (!(item instanceof ModSetTreeItem)) {
item = item.getParent();
}
if (item instanceof ModSetTreeItem) {
setResult(((ModSetTreeItem) item).getSolution());
return true;
}
return false;
}
public void onCancel(ActionEvent actionEvent) {
try {
setResult(CANCELLED);
close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static class ModSetTreeItem extends TreeItem {
public ModSetTreeItem(Object o, Set<Mod> solution) {
super(o);
this.solution = solution;
}
Set<Mod> solution;
public Set<Mod> getSolution() {
return solution;
}
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
getDialogPane().setContent(root);
solutions.setRoot(rootItem);
useButton.disableProperty().bind(solutions.getSelectionModel().selectedItemProperty().isNull());
remember.bind(rememberCheck.selectedProperty());
int i = 1;
for (Set<Mod> solution : availableSolutions) {
ModSetTreeItem solutionItem = new ModSetTreeItem("Solution " + i, solution);
rootItem.getChildren().add(solutionItem);
for (Mod mod : solution) {
TreeItem modItem = new TreeItem(mod);
solutionItem.getChildren().add(modItem);
}
solutionItem.setExpanded(true);
i++;
}
rootItem.setExpanded(true);
modColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures, ObservableValue>() {
@Override
public ObservableValue call(TreeTableColumn.CellDataFeatures features) {
Object value = features.getValue().getValue();
if (value instanceof String) {
return new SimpleStringProperty((String) value);
}
if (value instanceof Mod) {
return ((Mod) value).nameProperty();
}
return null;
}
});
versionColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures, ObservableValue>() {
@Override
public ObservableValue call(TreeTableColumn.CellDataFeatures features) {
Object value = features.getValue().getValue();
if (value instanceof Mod) {
return ((Mod) value).versionProperty().asString();
}
return null;
}
});
}
}