package net.krazyweb.starmodmanager.view;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import javafx.concurrent.Task;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.stage.WindowEvent;
import net.krazyweb.helpers.FileHelper;
import net.krazyweb.starmodmanager.data.DatabaseFactory;
import net.krazyweb.starmodmanager.data.DatabaseModelInterface;
import net.krazyweb.starmodmanager.data.LocalizerFactory;
import net.krazyweb.starmodmanager.data.LocalizerModelInterface;
import net.krazyweb.starmodmanager.data.ModList;
import net.krazyweb.starmodmanager.data.SettingsFactory;
import net.krazyweb.starmodmanager.data.SettingsModelInterface;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MainViewController extends Observable {
private static final Logger log = LogManager.getLogger(MainViewController.class);
private MainView view;
private ModListView modListView;
private BackupListView backupListView;
private SettingsView settingsView;
private AboutView aboutView;
private ModList modList;
private boolean dragOver = false;
private SettingsModelInterface settings;
private DatabaseModelInterface database;
private LocalizerModelInterface localizer;
protected MainViewController(final ModList modList) {
view = new MainView(this);
view.build();
settings = new SettingsFactory().getInstance();
database = new DatabaseFactory().getInstance();
localizer = new LocalizerFactory().getInstance();
view.updateLockButton(settings.getPropertyBoolean("modlistlocked"));
view.updateExpandButton(settings.getPropertyBoolean("modviewexpanded"));
modListView = new ModListView(modList);
settingsView = new SettingsView();
aboutView = new AboutView();
backupListView = new BackupListView();
modTabClicked();
view.show();
this.modList = modList;
}
protected void modTabClicked() {
view.setContent(modListView.getContent());
}
protected void backupsTabClicked() {
view.setContent(backupListView.getContent());
}
protected void settingsTabClicked() {
view.setContent(settingsView.getContent());
}
protected void aboutTabClicked() {
view.setContent(aboutView.getContent());
}
protected void backupButtonClicked() {
}
protected void addModsButtonClicked() {
modListView.searchForMods();
}
protected void lockButtonClicked() {
modListView.toggleLock();
view.updateLockButton(settings.getPropertyBoolean("modlistlocked"));
}
protected void refreshButtonClicked() {
view.updateRefreshButton();
modListView.getNewMods();
}
protected void expandButtonClicked() {
modListView.toggleExpansion();
view.updateExpandButton(settings.getPropertyBoolean("modviewexpanded"));
}
protected void filesDraggedOver(final DragEvent event) {
Dragboard db = event.getDragboard();
if (db.hasFiles()) {
boolean filesAccepted = false;
String fileName = "";
for (File file : db.getFiles()) {
if (FileHelper.isSupported(Paths.get(file.getPath()), dragOver)) {
filesAccepted = true;
fileName += localizer.formatMessage(dragOver, "inquotes", file.getName()) + "\n";
}
}
if (filesAccepted) {
event.acceptTransferModes(TransferMode.COPY);
if (!dragOver) {
view.showOverlay(localizer.formatMessage("mainview.addmods", db.getFiles().size()), fileName);
dragOver = true;
}
} else {
event.consume();
}
} else {
event.consume();
}
}
protected void filesDropped(final DragEvent event) {
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasFiles()) {
success = true;
List<Path> toAdd = new ArrayList<>();
for (File file : db.getFiles()) {
toAdd.add(file.toPath());
log.debug("File '{}' dropped on Mod Manager.", file.toPath());
}
modList.addMods(toAdd);
}
event.setDropCompleted(success);
event.consume();
view.hideOverlay();
}
protected void dragExited() {
dragOver = false;
view.hideOverlay();
}
protected void closeRequested(final WindowEvent event) {
settings.setProperty("windowwidth", view.getScene().getWidth());
settings.setProperty("windowheight", view.getScene().getHeight());
Task<Void> task = database.getCloseTask();
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.setName("Database Closing Thread");
thread.start();
}
}