package tk.captainsplexx.JavaFX.Windows;
import java.io.File;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.scene.control.TreeItem;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import tk.captainsplexx.Entity.Entity;
import tk.captainsplexx.Entity.Layer.EntityLayer;
import tk.captainsplexx.Game.Core;
import tk.captainsplexx.JavaFX.TreeViewConverter;
import tk.captainsplexx.JavaFX.TreeViewEntry;
import tk.captainsplexx.Mod.Mod;
import tk.captainsplexx.Resource.EBX.EBXFile;
import tk.captainsplexx.Resource.EBX.Structure.EBXStructureFile;
import tk.captainsplexx.Resource.TOC.ResourceLink;
public class MainWindow extends Application{
public static enum EntryType{
//General
STRING, INTEGER, LONG, BOOL, FLOAT, DOUBLE, UINTEGER,
LIST, BYTE, NULL, SHORT,
//Frostite specific.
ARRAY, SHA1, GUID, ENUM, HEX8, RAW, CHUNKGUID, RAW2,
//Layer Specific.
EntityLayer, ObjectEntity, LightEntity,
};
public static enum WorkDropType { DROP_INTO, REORDER };
private ArrayList<EBXWindow> ebxWindows;
private ArrayList<ImagePreviewWindow> imagePreviewWindows;
private ModLoaderWindow modLoaderWindow = null;
private ToolsWindow toolsWindow;
/*---------START--------------*/
public void runApplication(){
new Thread(new Runnable() {
@Override
public void run() {
launchApplication();
}
}).start();
}
void launchApplication(){
launch();
System.err.println("JavaFX Application closed.");
}
@Override
public void start(Stage stageLeft) {
ebxWindows = new ArrayList<>();
imagePreviewWindows = new ArrayList<>();
modLoaderWindow = new ModLoaderWindow();
toolsWindow = new ToolsWindow();
Core.getJavaFXHandler().setMainWindow(this);
}
public boolean createEBXWindow(EBXFile ebxFile, String resName, boolean isOriginal){
try{
Platform.runLater(new Runnable() {
public void run() {
EBXWindow window = new EBXWindow(ebxFile, resName, isOriginal);
ebxWindows.add(window);
}
});
}catch(Exception e){
e.printStackTrace();
System.err.println("EBXWindow creation failed");
return false;
}
return true;
}
public boolean destroyEBXWindow(Stage stage){
try{Platform.runLater(new Runnable() {
@Override
public void run() {
for (EBXWindow window : ebxWindows){
if (window.getStage()==stage){
stage.close();
ebxWindows.remove(window);
break;
}
}
}
});
}catch(Exception e){
e.printStackTrace();
System.err.println("EBXWindow could not get destroyed!");
return false;
}
return true;
}
public void destroyEBXWindows(){
for (EBXWindow window : ebxWindows){
destroyEBXWindow(window.getStage());
}
}
public boolean createImagePreviewWindow(File file, File ddsFile, ResourceLink resourceLink, String title){
try{
Platform.runLater(new Runnable() {
public void run() {
ImagePreviewWindow ipw = new ImagePreviewWindow(file, ddsFile, resourceLink, title);
ipw.getController().setParentStage(ipw.getStage());
imagePreviewWindows.add(ipw);
}
});
}catch(Exception e){
e.printStackTrace();
System.err.println("EBX Window could not get created!");
return false;
}
return true;
}
public boolean destroyImagePreviewWindow(Stage stage){
try{Platform.runLater(new Runnable() {
@Override
public void run() {
for (ImagePreviewWindow window : imagePreviewWindows){
if (window.getStage()==stage){
stage.close();
imagePreviewWindows.remove(window);
break;
}
}
System.err.println("ImagePreviewWindow's stage not found!");
}
});
}catch(Exception e){
e.printStackTrace();
System.err.println("ImagePreviewWindow could not get destroyed!");
return false;
}
return true;
}
/*UPDATE METHODS*/
public void setPackageExplorer(TreeItem<TreeViewEntry> treeview){
Platform.runLater(new Runnable() {
@Override
public void run() {
toolsWindow.getController().getExplorer().setRoot(treeview);
toolsWindow.getController().getExplorer().scrollTo(0);
if (toolsWindow.getController().getExplorer().getRoot() != null){
toolsWindow.getController().getExplorer().getRoot().setExpanded(true);
}
}
});
}
public void updateModsList(){
Platform.runLater(new Runnable() {
@Override
public void run() {
ObservableList<Mod> mods = modLoaderWindow.getController().getList().getItems();
mods.clear();
mods.addAll(Core.getModTools().getMods());
}
});
}
public void setPackageExplorer1(TreeItem<TreeViewEntry> treeview, String filterStr){
Platform.runLater(new Runnable() {
@Override
public void run() {
toolsWindow.setExplorer1(treeview, filterStr);
/*
toolsWindow.getController().getExplorer1().setRoot(treeview);
if (toolsWindow.getController().getExplorer1().getRoot() != null){
toolsWindow.getController().getExplorer1().getRoot().setExpanded(true);
}*/
}
});
}
public void setLayerTreeView(TreeItem<Entity> treeview){
Platform.runLater(new Runnable() {
@Override
public void run() {
toolsWindow.getController().getLayerTreeView().setRoot(treeview);
if (treeview!=null){
if (treeview.getChildren().size()>=1){
treeview.setExpanded(true);
}
}
}
});
}
public void toggleLeftVisibility(){
Platform.runLater(new Runnable() {
@Override
public void run() {
Stage tools = toolsWindow.getStage();
if (tools.isShowing()){
tools.hide();
}else{
tools.show();
}
}
});
}
public void toggleModLoaderVisibility(){
Platform.runLater(new Runnable() {
@Override
public void run() {
Stage modLoaderStage = modLoaderWindow.getStage();
if (modLoaderStage.isShowing()){
modLoaderStage.hide();
}else{
modLoaderStage.show();
}
}
});
}
/*END OF UPDATE METHODS*/
public void selectGamePath(){
try{
Platform.runLater(new Runnable() {
@Override
public void run() {
final DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setTitle("Select a game root directory!");
final File selectedDirectory = directoryChooser.showDialog(new Stage());
if (selectedDirectory != null) {
String path = selectedDirectory.getAbsolutePath().replace('\\', '/');
System.out.println("Selected '"+path+"' as gamepath.");
Core.gamePath = path;
}else{
Core.gamePath = "emty";
Core.keepAlive = false;
}
}
});
}catch(IllegalStateException e){
System.out.println("Waiting for Toolkit...");
//JavaFX is threaded and may take a while to work.
//java.lang.IllegalStateException: Toolkit not initialized
selectGamePath();
}
}
public void updateLayers(ArrayList<EntityLayer> layers){
Platform.runLater(new Runnable() {
@Override
public void run() {
ObservableList<String> list = toolsWindow.getController().getLayer().getItems();
list.clear();
for (EntityLayer layer : layers){
list.add(layer.getName());
}
toolsWindow.getController().getDestroyLayerButton().setDisable(layers.isEmpty());
/*TreeViewLayers*/
TreeItem<Entity> layerTree = TreeViewConverter.getTreeView(layers);
setLayerTreeView(layerTree);
System.out.println("TreeView for Layers updated!");
}
});
}
public void updateMeshvariationDatabaseComboBox(ArrayList<EBXStructureFile> databases){
Platform.runLater(new Runnable() {
@Override
public void run() {
ObservableList<String> list = toolsWindow.getController().getVariationDatabase().getItems();
list.clear();
list.add("NULL");
for (EBXStructureFile db : databases){
list.add(db.getStructureName()+" "+db.getEBXGUID());
}
}
});
}
public ModLoaderWindow getModLoaderWindow() {
return modLoaderWindow;
}
public ArrayList<ImagePreviewWindow> getImagePreviewWindows() {
return imagePreviewWindows;
}
public ArrayList<EBXWindow> getEBXWindows() {
return ebxWindows;
}
}