package tk.captainsplexx.JavaFX.CellFactories;
import java.io.File;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tooltip;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import tk.captainsplexx.Game.Core;
import tk.captainsplexx.Game.Game;
import tk.captainsplexx.JavaFX.JavaFXHandler;
import tk.captainsplexx.JavaFX.TreeViewConverter;
import tk.captainsplexx.JavaFX.TreeViewEntry;
import tk.captainsplexx.JavaFX.Windows.MainWindow.EntryType;
import tk.captainsplexx.Mod.ModTools;
import tk.captainsplexx.Resource.FileHandler;
import tk.captainsplexx.Resource.ResourceHandler;
import tk.captainsplexx.Resource.ResourceHandler.ResourceType;
import tk.captainsplexx.Resource.CAS.CasDataReader;
import tk.captainsplexx.Resource.EBX.EBXFile;
import tk.captainsplexx.Resource.ITEXTURE.ITexture;
import tk.captainsplexx.Resource.ITEXTURE.ITextureHandler;
import tk.captainsplexx.Resource.ITEXTURE.ImageConverter;
import tk.captainsplexx.Resource.ITEXTURE.ImageConverter.ImageType;
import tk.captainsplexx.Resource.MESH.MeshConverter;
import tk.captainsplexx.Resource.TOC.ResourceLink;
import tk.captainsplexx.Resource.TOC.TocConverter.ResourceBundleType;
public class JavaFXexplorer1TCF extends TreeCell<TreeViewEntry> {
private ContextMenu contextMenu = new ContextMenu();
private MenuItem restore, remove, rename;
public JavaFXexplorer1TCF() {
restore = new MenuItem("Restore Orignal File");
restore.setGraphic(new ImageView(JavaFXHandler.clipboardPasteIcon));
restore.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
byte[] data = null;
ResourceLink link = (ResourceLink) getTreeItem().getValue().getValue();
if (link!=null){
data = CasDataReader.readCas(link.getBaseSha1(), link.getDeltaSha1(), link.getSha1(), link.getCasPatchType());
if (data!=null){
File target = new File(Core.getGame().getCurrentMod().getPath()+ModTools.RESOURCEFOLDER+link.getName()+"."+link.getBundleType().toString().toLowerCase());
if (target.exists()){
File backup = new File(target.getAbsoluteFile()+".bak");
if (backup.exists()){
backup.delete();
}
target.renameTo(backup);
}
if (!FileHandler.writeFile(target.getAbsolutePath(), data)){
System.err.println("Could not write data to file. Check permissions!");
}
}else{
System.err.println("Could not fetch original data.");
}
}
}
});
remove = new MenuItem("Remove");
remove.setGraphic(new ImageView(JavaFXHandler.removeIcon));
remove.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
System.err.println("TODO REMOVE");
}
});
remove.setDisable(true);
rename = new MenuItem("Rename");
rename.setGraphic(new ImageView(JavaFXHandler.textIcon));
rename.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
System.err.println("TODO RENAME");
}
});
rename.setDisable(true);
setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
TreeItem<TreeViewEntry> i = getTreeItem();
if (i != null){
if (i.getParent()!=null){
if (i.getValue().getValue() != null){
if (event.getButton() == MouseButton.PRIMARY){
boolean loadOriginal = false;
Game game = Core.getGame();
ResourceHandler rs = game.getResourceHandler();
ResourceLink link = (ResourceLink) i.getValue().getValue();
byte[] data = rs.readResourceLink(link, loadOriginal);
if (Core.isDEBUG&&data!=null){
FileHandler.writeFile("output/debug/targetData_TCF1", data);
}
if (link.getBundleType() == ResourceBundleType.EBX){
if (data != null){
EBXFile ebxFile = game.getResourceHandler().getEBXHandler().loadFile(data);
if (ebxFile!=null){
TreeItem<TreeViewEntry> ebx = TreeViewConverter.getTreeView(ebxFile);
Core.getJavaFXHandler().getMainWindow().createEBXWindow(ebxFile, link.getName(), loadOriginal);
}
}else{
System.err.println("Could not build EBX Explorer because of missing data.");
}
}else if (link.getBundleType() == ResourceBundleType.RES){
if (data != null){
if (link.getType() == ResourceType.ITEXTURE){
byte[] ddsBytes = ITextureHandler.getDSS(data);
if (ddsBytes!=null){
File ddsFile = new File("temp/images/"+link.getName().replace('/', '_')+".dds");
FileHandler.writeFile(ddsFile.getAbsolutePath(), ddsBytes);
File pngFile = null;
ITexture itexture = new ITexture(data, null);
if (itexture.getPixelFormat()==ITexture.TF_NormalDXN){
//Convert using Nvidia
File tga = ImageConverter.convertToTGA(ddsFile);
pngFile = ImageConverter.convert(tga, ImageType.PNG, true);
}else{
//Convert using ImageMagick
pngFile = ImageConverter.convert(ddsFile, ImageType.PNG, true);
}
if (pngFile!=null){
Core.getJavaFXHandler().getMainWindow().createImagePreviewWindow(pngFile, ddsFile, link, link.getName());
}
}
}else if (link.getType() == ResourceType.MESH){
byte[] obj = MeshConverter.getAsOBJ(data, game.getCurrentSB());
FileHandler.writeFile("output/"+link.getName().replace('/', '_')+".obj", obj);
}else{
System.err.println("Type not supported yet.");
FileHandler.writeFile("output/"+link.getName().replace('/', '_')+"."+link.getType(), data);
}
}else{
System.err.println("Could not find data.");
}
}else if (i.getParent().getValue().getType() == EntryType.LIST){
System.out.println(((ResourceLink)i.getValue().getValue()).getBundleType()+" is currently not supported.");
}
}
}
}
}
}
});
}
@Override
public void updateItem(TreeViewEntry item, boolean empty) {
super.updateItem(item, empty);
contextMenu.getItems().clear();
if (empty) {
setText(null);
setGraphic(null);
setUnderline(false);
}else if (item.getType() == EntryType.LIST){
setText(item.getName());
setGraphic(item.getGraphic());
setUnderline(false);
setContextMenu(contextMenu);
}else {
setUnderline(false);
setText(item.getName());
setGraphic(item.getGraphic());
String tooltip = item.getTooltip();
if (tooltip != null){
setTooltip(new Tooltip(tooltip));
}
setContextMenu(contextMenu);
if (item.getValue()!=null&&item.getValue() instanceof ResourceLink){
ResourceLink link = (ResourceLink) item.getValue();
if (link.isHasModFile()){
setUnderline(true);
contextMenu.getItems().addAll(restore);
}else{
contextMenu.getItems().addAll(rename, remove);
}
}
}
}
}