package tk.captainsplexx.JavaFX;
import java.io.File;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.HashMap;
import javafx.scene.control.TreeItem;
import javafx.scene.image.ImageView;
import tk.captainsplexx.Entity.Entity;
import tk.captainsplexx.Entity.LayerEntity;
import tk.captainsplexx.Entity.Layer.EntityLayer;
import tk.captainsplexx.Game.Core;
import tk.captainsplexx.JavaFX.Windows.MainWindow.EntryType;
import tk.captainsplexx.Mod.ModTools;
import tk.captainsplexx.Mod.Package;
import tk.captainsplexx.Mod.PackageEntry;
import tk.captainsplexx.Resource.FileHandler;
import tk.captainsplexx.Resource.EBX.EBXComplex;
import tk.captainsplexx.Resource.EBX.EBXComplexDescriptor;
import tk.captainsplexx.Resource.EBX.EBXField;
import tk.captainsplexx.Resource.EBX.EBXFieldDescriptor;
import tk.captainsplexx.Resource.EBX.EBXFile;
import tk.captainsplexx.Resource.EBX.EBXHandler.FieldValueType;
import tk.captainsplexx.Resource.EBX.EBXInstance;
import tk.captainsplexx.Resource.TOC.ConvertedSBpart;
import tk.captainsplexx.Resource.TOC.ConvertedTocFile;
import tk.captainsplexx.Resource.TOC.ResourceLink;
import tk.captainsplexx.Resource.TOC.TocEntry;
import tk.captainsplexx.Resource.TOC.TocField;
import tk.captainsplexx.Resource.TOC.TocFile;
import tk.captainsplexx.Resource.TOC.TocManager.TocEntryType;
import tk.captainsplexx.Resource.TOC.TocManager.TocFieldType;
import tk.captainsplexx.Resource.TOC.TocManager.TocFileType;
import tk.captainsplexx.Resource.TOC.TocSBLink;
public class TreeViewConverter {
/*FROM TOC*/
public static TreeItem<TreeViewEntry> getTreeView(TocFile tocFile){
TreeItem<TreeViewEntry> root = new TreeItem<TreeViewEntry>(new TreeViewEntry("TocFile", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (TocEntry e : tocFile.getEntries()){
TreeItem<TreeViewEntry> entry = readEntry(e);
if (entry != null){
root.getChildren().add(entry);
}
}
return root;
}
static TreeItem<TreeViewEntry> readEntry(TocEntry tocEntry){
if (tocEntry != null){
TreeItem<TreeViewEntry> entry = new TreeItem<TreeViewEntry>(new TreeViewEntry("TocEntry", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (TocField f : tocEntry.getFields()){
entry.getChildren().add(readField(f));
}
return entry;
}else{
return null;
}
}
@SuppressWarnings({ "unchecked", "incomplete-switch" })
static TreeItem<TreeViewEntry> readField(TocField tocField){
TreeViewEntry entry = null;
switch(tocField.getType()){
case BOOL:
entry = new TreeViewEntry(tocField.getName(), new ImageView(JavaFXHandler.boolIcon), tocField.getObj(), EntryType.BOOL);
break;
case GUID:
entry = new TreeViewEntry(tocField.getName(), null, tocField.getObj(), EntryType.GUID);
break;
case INTEGER:
entry = new TreeViewEntry(tocField.getName(), new ImageView(JavaFXHandler.integerIcon), tocField.getObj(), EntryType.INTEGER);
break;
case LIST:
entry = new TreeViewEntry(tocField.getName(), new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST);
TreeItem<TreeViewEntry> field = new TreeItem<TreeViewEntry>(entry);
for (TocEntry tocE : (ArrayList<TocEntry>) tocField.getObj()){
field.getChildren().add(readEntry(tocE));
}
return field;
case LONG:
entry = new TreeViewEntry(tocField.getName(), new ImageView(JavaFXHandler.longIcon), tocField.getObj(), EntryType.LONG);
break;
case SHA1:
entry = new TreeViewEntry(tocField.getName(), new ImageView(JavaFXHandler.hashIcon), tocField.getObj(), EntryType.SHA1);
break;
case STRING:
entry = new TreeViewEntry(tocField.getName(), new ImageView(JavaFXHandler.textIcon), tocField.getObj(), EntryType.STRING);
break;
case RAW:
entry = new TreeViewEntry(tocField.getName(), new ImageView(JavaFXHandler.rawIcon), tocField.getObj(), EntryType.RAW);
break;
case RAW2:
entry = new TreeViewEntry(tocField.getName(), new ImageView(JavaFXHandler.rawIcon), tocField.getObj(), EntryType.RAW2);
break;
}
TreeItem<TreeViewEntry> field = new TreeItem<TreeViewEntry>(entry);
return field;
}
/*END OF TOC*/
/*FROM EBX*/
public static TreeItem<TreeViewEntry> getTreeView(EBXFile ebx){
TreeItem<TreeViewEntry> root = new TreeItem<TreeViewEntry>(new TreeViewEntry(ebx.getTruePath(), new ImageView(JavaFXHandler.documentIcon), ebx.getGuid(), EntryType.LIST));
for (EBXInstance instance : ebx.getInstances()){
root.getChildren().add(readInstance(instance));
}
return root;
}
static TreeItem<TreeViewEntry> readInstance(EBXInstance instance){
TreeItem<TreeViewEntry> iList = new TreeItem<TreeViewEntry>(new TreeViewEntry(instance.getComplex().getComplexDescriptor().getName()+" "+instance.getGuid().toUpperCase(), new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for(EBXField field : instance.getComplex().getFields()){
iList.getChildren().add(readField(field));
}
return iList;
}
static TreeItem<TreeViewEntry> readField(EBXField ebxField){
TreeViewEntry entry = null;
if (ebxField != null){
try{
switch(ebxField.getType()){
case ArrayComplex:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.arrayIcon), null, EntryType.ARRAY);
entry.setEBXType((short) (ebxField.getFieldDescritor().getType()&0xFFFF));
if (ebxField.getValue() instanceof String){
entry.setValue("*nullArray*");
TreeItem<TreeViewEntry> field = new TreeItem<TreeViewEntry>(entry);
return field;
}else{
TreeItem<TreeViewEntry> fieldArray = new TreeItem<TreeViewEntry>(entry);
for (EBXField eF : ebxField.getValueAsComplex().getFields()){
fieldArray.getChildren().add(readField(eF));
}
return fieldArray;
}
//array in array does not work right ?
case Bool:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.boolIcon), (Boolean)ebxField.getValue(), EntryType.BOOL); //0x01 == TRUE
break;
case Byte:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.byteIcon), (Byte)ebxField.getValue(), EntryType.BYTE);
break;
case Complex:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName()+"::"+ebxField.getValueAsComplex().getComplexDescriptor().getName(), new ImageView(JavaFXHandler.instanceIcon), null, EntryType.LIST);
entry.setEBXType((short) (ebxField.getFieldDescritor().getType()&0xFFFF));
TreeItem<TreeViewEntry> complexFields = new TreeItem<TreeViewEntry>(entry);
for (EBXField eF : ebxField.getValueAsComplex().getFields()){
complexFields.getChildren().add(readField(eF));
}
return complexFields;
case Enum:
// if (ebxField.getValue() instanceof EBXFieldDescriptor){
// entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.enumIcon), ((EBXFieldDescriptor)ebxField.getValue()).getName(), EntryType.ENUM);
// }else{
// entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.enumIcon), (String)ebxField.getValue(), EntryType.ENUM);
// }
if (ebxField.getValue() instanceof HashMap<?,?>){
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.enumIcon), (HashMap<EBXFieldDescriptor, Boolean>)ebxField.getValue(), EntryType.ENUM);
}else{
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.enumIcon), (String)ebxField.getValue(), EntryType.ENUM);
}
break;
case Float:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.floatIcon), (Float)ebxField.getValue(), EntryType.FLOAT);
break;
case ChunkGuid:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), null, (String)ebxField.getValue(), EntryType.CHUNKGUID);
break;
case Guid:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.internalIcon), (String)ebxField.getValue(), EntryType.GUID);
break;
case ExternalGuid:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.structureIcon), (String)ebxField.getValue(), EntryType.GUID);
break;
case Hex8:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), null, (String)ebxField.getValue(), EntryType.HEX8);
break;
case Integer:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.integerIcon), (Integer)ebxField.getValue(), EntryType.INTEGER);
break;
case Short:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.shortIcon), (Short)ebxField.getValue(), EntryType.SHORT);
break;
case String:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.textIcon), (String)ebxField.getValue(), EntryType.STRING);
break;
case UInteger:
entry = new TreeViewEntry(ebxField.getFieldDescritor().getName(), new ImageView(JavaFXHandler.uintegerIcon), (Long)ebxField.getValue(), EntryType.UINTEGER);
break;
case Unknown:
break;
default:
break;
}
if (entry != null){
entry.setEBXType((short) (ebxField.getFieldDescritor().getType()&0xFFFF));
entry.setOffset(ebxField.getOffset());
}
TreeItem<TreeViewEntry> field = new TreeItem<TreeViewEntry>(entry);
return field;
}catch (Exception e){
if (ebxField.getType() == null && ebxField.getFieldDescritor() != null){
System.out.println(ebxField.getFieldDescritor().getName());
System.err.println("EBXFile to TreeView: Field does not have a type defined.");
}else{
e.printStackTrace();
System.err.println("Error while converting EBXFile to TreeView.");
}
return null;
}
}else{
return null;
}
}
/*END OF EBX*/
/*ENCODE TO EBX*/
public static EBXFile getEBXFile(TreeItem<TreeViewEntry> rootEntry){
try{
ArrayList<EBXInstance> instances = new ArrayList<>();
for (TreeItem<TreeViewEntry> instance : rootEntry.getChildren()){
EBXInstance ebxInstance = getEBXInstance(instance);
if (ebxInstance != null){
instances.add(ebxInstance);
}
}
EBXFile file = new EBXFile(rootEntry.getValue().getName(), instances, (String) rootEntry.getValue().getValue(), null);
return file;
}catch (Exception e){
e.printStackTrace();
System.err.println("Error while converting TreeViewStructure to EBXFile.");
}
return null;
}
static EBXInstance getEBXInstance(TreeItem<TreeViewEntry> childEntry){
try{
EBXComplex complex = getEBXComplex(childEntry);
EBXInstance ebxInstance = new EBXInstance(childEntry.getValue().getName().split(" ")[1], complex);
return ebxInstance;
}catch (Exception e){
e.printStackTrace();
System.out.println("Error while converting TreeViewStructure to EBXInstance.");
return null;
}
}
static EBXComplex getEBXComplex(TreeItem<TreeViewEntry> complexEntry){
try{
EBXComplexDescriptor complexDescriptor = null;
String name = complexEntry.getValue().getName();
String[] split = name.split("::");
String[] splitInstanceComplex = complexEntry.getValue().getName().split(" ");
if (split.length==2 && splitInstanceComplex.length==1){ //if it has ::
complexDescriptor = new EBXComplexDescriptor(split[1]);//GET RIGHT PART AS COMPLEX NAME
}else if (splitInstanceComplex.length == 2 && split.length == 1){//if it is a instanceComplex
complexDescriptor = new EBXComplexDescriptor(splitInstanceComplex[0]); //First part is -> ReferencedObjectData //Second is Guid -> 00000001
}else{
complexDescriptor = new EBXComplexDescriptor(split[0]);//GET LEFT PART AS COMPLEX NAME
}
complexDescriptor.setType(complexEntry.getValue().getEBXType());
//complexDescriptor.setType(type);
EBXComplex complex = new EBXComplex(complexDescriptor);
complex.setFields(new EBXField[complexEntry.getChildren().size()]);
EBXField[] fields = complex.getFields();
int index = 0;
for (TreeItem<TreeViewEntry> twField : complexEntry.getChildren()){
EBXField ebxField = getEBXField(twField);
if (ebxField!=null){
fields[index] = ebxField;
}else{
System.err.println("Error while converting TreeViewStructure to EBXComplex. 'null'.");
}
index++;
}
return complex;
}catch (Exception e){
e.printStackTrace();
System.out.println("Error while converting TreeViewStructure to EBXComplex.");
return null;
}
}
static EBXField getEBXField(TreeItem<TreeViewEntry> fieldEntry){
TreeViewEntry entry = fieldEntry.getValue();
EBXFieldDescriptor desc = new EBXFieldDescriptor(entry.getName(), (short) 0, (short) 0, 0, 0);
EBXField field = new EBXField(desc, 0);
switch (fieldEntry.getValue().getType()) {
case ARRAY:
if (fieldEntry.getValue().getValue() instanceof String){
field.setValue("*nullArray*", FieldValueType.ArrayComplex);
desc.setType(entry.getEBXType());
break;
}else{
EBXComplex complex0 = getEBXComplex(fieldEntry);
field.setValue(complex0, FieldValueType.ArrayComplex);
desc.setType(entry.getEBXType());
break;
}
case BOOL:
field.setValue(entry.getValue(), FieldValueType.Bool);
desc.setType(entry.getEBXType());
break;
case BYTE:
field.setValue(entry.getValue(), FieldValueType.Byte);
desc.setType(entry.getEBXType());
break;
case CHUNKGUID:
field.setValue(entry.getValue(), FieldValueType.ChunkGuid);
desc.setType(entry.getEBXType());
break;
case ENUM:
field.setValue(entry.getValue(), FieldValueType.Enum);//value is string(if null) or hashmap.
desc.setType(entry.getEBXType());
break;
case FLOAT:
field.setValue(entry.getValue(), FieldValueType.Float);
desc.setType(entry.getEBXType());
break;
case GUID:
field.setValue(entry.getValue(), FieldValueType.Guid);
desc.setType(entry.getEBXType());
break;
case HEX8:
field.setValue(entry.getValue(), FieldValueType.Hex8);
desc.setType(entry.getEBXType());
break;
case INTEGER:
field.setValue(entry.getValue(), FieldValueType.Integer);
desc.setType(entry.getEBXType());
break;
case LIST:
EBXComplex complex1 = getEBXComplex(fieldEntry);
/*IF FIELD AS PARENT: CHANGE DESCRIPTOR NAME!*/
desc.setName(desc.getName().split("::")[0]);
field.setValue(complex1, FieldValueType.Complex);
desc.setType(entry.getEBXType());
break;
case SHORT:
field.setValue(entry.getValue(), FieldValueType.Short);
desc.setType(entry.getEBXType());
break;
case STRING:
field.setValue(entry.getValue(), FieldValueType.String);
desc.setType(entry.getEBXType());
return field;
case UINTEGER:
field.setValue(entry.getValue(), FieldValueType.UInteger);
desc.setType(entry.getEBXType());
return field;
default:
System.err.println("Error while converting TreeViewStructure to EBXField.");
break;
}
return field;
}
/*END OF ENCODE TO EBX*/
/*ENCODE TO TOC*/
public static TocFile getTocFile(TreeItem<TreeViewEntry> rootEntry, TocFileType type){
TocFile file = new TocFile(type);
ArrayList<TocEntry> entries = new ArrayList<TocEntry>();
for (TreeItem<TreeViewEntry> child : rootEntry.getChildren()){
entries.add(getTocEntry(child, TocEntryType.ORDINARY));
}
file.getEntries().addAll(entries);
return file;
}
static TocEntry getTocEntry(TreeItem<TreeViewEntry> entry, TocEntryType type){
TocEntry tocEntry = new TocEntry(type);
ArrayList<TocField> fields = new ArrayList<TocField>();
for (TreeItem<TreeViewEntry> child : entry.getChildren()){
fields.add(getTocField(child));
}
tocEntry.getFields().addAll(fields);
return tocEntry;
}
@SuppressWarnings("incomplete-switch") //Toc files only handle these fields.
static TocField getTocField(TreeItem<TreeViewEntry> field){
TocField tf = null;
switch(field.getValue().getType()){
case BOOL:
tf = new TocField(field.getValue().getValue(), TocFieldType.BOOL, field.getValue().getName());
break;
case GUID:
tf = new TocField(field.getValue().getValue(), TocFieldType.GUID, field.getValue().getName());
break;
case INTEGER:
tf = new TocField(field.getValue().getValue(), TocFieldType.INTEGER, field.getValue().getName());
break;
case LIST:
ArrayList<TocEntry> tocEntries = new ArrayList<TocEntry>();
for (TreeItem<TreeViewEntry> item : field.getChildren()){
tocEntries.add(getTocEntry(item, TocEntryType.ORDINARY));
}
tf = new TocField(tocEntries, TocFieldType.LIST, field.getValue().getName());
break;
case LONG:
tf = new TocField(field.getValue().getValue(), TocFieldType.LONG, field.getValue().getName());
break;
case SHA1:
tf = new TocField(field.getValue().getValue(), TocFieldType.SHA1, field.getValue().getName());
break;
case STRING:
tf = new TocField(field.getValue().getValue(), TocFieldType.STRING, field.getValue().getName());
break;
case RAW:
tf = new TocField(field.getValue().getValue(), TocFieldType.RAW, field.getValue().getName());
break;
}
return tf;
}
/*END OF TO TOC*/
/*START OF CONVERTED TOC*/
public static TreeItem<TreeViewEntry> getTreeView(ConvertedTocFile cTocF){
TreeItem<TreeViewEntry> rootnode = new TreeItem<TreeViewEntry>(new TreeViewEntry(cTocF.getName(), new ImageView(JavaFXHandler.documentIcon), null, EntryType.LIST));
/*BUNDLES*/
TreeItem<TreeViewEntry> bundles = new TreeItem<TreeViewEntry>(new TreeViewEntry("bundles - "+cTocF.getBundles().size()+" Children", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (TocSBLink link : cTocF.getBundles()){
String[] name = null;
if (!link.getID().equals("")){
name = link.getID().split("/");
}
if (!link.getGuid().equals("")){
name = link.getGuid().split("/");
}
TreeViewEntry childEntry = new TreeViewEntry(name[name.length-1], new ImageView(JavaFXHandler.instanceIcon), link, EntryType.STRING);
TreeItem<TreeViewEntry> child = new TreeItem<TreeViewEntry>(childEntry);
childEntry.setTooltip("Offset: 0x"+FileHandler.bytesToHex(FileHandler.toBytes(link.getOffset(), ByteOrder.BIG_ENDIAN))+
" Size: 0x"+FileHandler.bytesToHex(FileHandler.toBytes(link.getSize(), ByteOrder.BIG_ENDIAN)));
pathToTree(bundles, link.getID(), child);
}
rootnode.getChildren().add(bundles);
/*CHUNKS*/
TreeItem<TreeViewEntry> chunks = new TreeItem<TreeViewEntry>(new TreeViewEntry("chunks - "+cTocF.getChunks().size()+" Children", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (TocSBLink link : cTocF.getChunks()){
String name = "";
if (!link.getID().equals("")){
name = link.getID();
}
if (!link.getGuid().equals("")){
name = link.getGuid();
}
chunks.getChildren().add(new TreeItem<TreeViewEntry>(new TreeViewEntry(name, new ImageView(JavaFXHandler.instanceIcon), link, EntryType.STRING)));
}
rootnode.getChildren().add(chunks);
return rootnode;
}
/*END OF CONVERTED TOC*/
/*START OF CONVERTED TOCSBPart*/
public static TreeItem<TreeViewEntry> getTreeView(ConvertedSBpart part){
TreeItem<TreeViewEntry> rootnode = new TreeItem<TreeViewEntry>(new TreeViewEntry(part.getPath(), new ImageView(JavaFXHandler.documentIcon), null, EntryType.LIST));
File modFilePack = new File(FileHandler.normalizePath(
Core.getGame().getCurrentMod().getPath()+ModTools.PACKAGEFOLDER+
Core.getGame().getCurrentFile().replace(Core.gamePath, "")+ModTools.PACKTYPE)
);
Package modPackage = null;
if (modFilePack.exists()){
modPackage = Core.getModTools().readPackageInfo(modFilePack);
}
/*EBX*/
TreeItem<TreeViewEntry> ebx = new TreeItem<TreeViewEntry>(new TreeViewEntry("ebx - "+part.getEbx().size()+" Children", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (ResourceLink link : part.getEbx()){
if (modPackage!=null){
for (PackageEntry entry : modPackage.getEntries()){
if (entry.getSubPackage().equalsIgnoreCase(part.getPath())&&//mp_playground/content
entry.getResourcePath().equalsIgnoreCase(link.getName()+".ebx")//levels/mp_playground/content/layer2_buildings.ebx
){
link.setHasModFile(true);
break;
}
}
//has NO mod file
}
String[] name = link.getName().split("/");
TreeViewEntry childEntry = new TreeViewEntry(name[name.length-1]+" ("+link.getSha1()+")", new ImageView(JavaFXHandler.structureIcon), link, EntryType.STRING);
if (link.getCasPatchType()!=0){
childEntry.setName(childEntry.getName()+"_(Patched: "+link.getCasPatchType()+")");
}
String isReferenced = " ref. needs work treeviewconverter";
/*if (Core.getGame().getEBXFileGUIDs().get(link.getEbxFileGUID().toUpperCase()) != null){
isReferenced += " (referenced) ";
}*/
childEntry.setTooltip("GUID: "+link.getEbxFileGUID()+isReferenced);
TreeItem<TreeViewEntry> child = new TreeItem<TreeViewEntry>(childEntry);
pathToTree(ebx, link.getName(), child);
}
rootnode.getChildren().add(ebx);
/*DBX*/
TreeItem<TreeViewEntry> dbx = new TreeItem<TreeViewEntry>(new TreeViewEntry("dbx - "+part.getDbx().size()+" Children", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (ResourceLink link : part.getDbx()){
String[] name = link.getName().split("/");
TreeViewEntry childEntry = new TreeViewEntry(name[name.length-1]+" ("+link.getSha1()+")", new ImageView(JavaFXHandler.structureIcon), link, EntryType.STRING);
TreeItem<TreeViewEntry> child = new TreeItem<TreeViewEntry>(childEntry);
pathToTree(dbx, link.getName(), child);
}
rootnode.getChildren().add(dbx);
/*RES*/
TreeItem<TreeViewEntry> res = new TreeItem<TreeViewEntry>(new TreeViewEntry("res - "+part.getRes().size()+" Children", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (ResourceLink link : part.getRes()){
/*//TODO Res has mod file's too!
if (modPackage!=null){
for (PackageEntry entry : modPackage.getEntries()){
if (entry.getSubPackage().equalsIgnoreCase(part.getPath())&&//mp_playground/uiloading_sp
entry.getResourcePath().startsWith(link.getName())//levels/mp_playground/uiloading/cuteKitties.itexture
){
link.setHasModFile(true);
break;
}
}
//has NO mod file
}*/
String[] name = link.getName().split("/");
TreeViewEntry childEntry = new TreeViewEntry(name[name.length-1]+" ("+link.getSha1()+", "+link.getType()+")", null, link, EntryType.STRING);
ImageView graphic = null;
switch (link.getType()) {
case CHUNK:
graphic = new ImageView(JavaFXHandler.rawIcon);
break;
case ITEXTURE:
graphic = new ImageView(JavaFXHandler.imageIcon);
break;
case LUAC:
graphic = new ImageView(JavaFXHandler.luaIcon);
break;
case OCCLUSIONMESH:
graphic = new ImageView(JavaFXHandler.geometry2Icon);
break;
case MESH:
graphic = new ImageView(JavaFXHandler.geometryIcon);
break;
default:
graphic = new ImageView(JavaFXHandler.resourceIcon);
break;
}
childEntry.setGraphic(graphic);
TreeItem<TreeViewEntry> child = new TreeItem<TreeViewEntry>(childEntry);
pathToTree(res, link.getName(), child);
}
rootnode.getChildren().add(res);
/*CHUNKS*/
TreeItem<TreeViewEntry> chunks = new TreeItem<TreeViewEntry>(new TreeViewEntry("chunks - "+part.getChunks().size()+" Children", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (ResourceLink link : part.getChunks()){
chunks.getChildren().add(new TreeItem<TreeViewEntry>(
new TreeViewEntry(link.getId()+" SHA1: "+link.getSha1()+" (offset: 0x"+FileHandler.toHexInteger(link.getLogicalOffset())+" , size: 0x"+FileHandler.toHexInteger(link.getLogicalSize())+")",
new ImageView(JavaFXHandler.instanceIcon), link, EntryType.STRING)));
}
rootnode.getChildren().add(chunks);
/*CHUNKMETA*/
TreeItem<TreeViewEntry> chunkmeta = new TreeItem<TreeViewEntry>(new TreeViewEntry("chunkmeta - "+part.getChunkMeta().size()+" Children", new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
for (ResourceLink link : part.getChunkMeta()){
chunkmeta.getChildren().add(new TreeItem<TreeViewEntry>(new TreeViewEntry(link.getH32()+"", new ImageView(JavaFXHandler.rawIcon), link, EntryType.RAW)));
}
rootnode.getChildren().add(chunkmeta);
return rootnode;
}
/*END OF CONVERTED TOCSBPart*/
public static void pathToTree(TreeItem<TreeViewEntry> root, String path, TreeItem<TreeViewEntry> child){
String[] splittedPart = path.split("/");
TreeItem<TreeViewEntry> parentNode = null;
int counter = 1;
for (String part : splittedPart){
if (part.equals("")){
break; //DONE
}
if (parentNode == null){ //FIRST RUN
for (TreeItem<TreeViewEntry> rootChildren : root.getChildren()){
if (rootChildren.getValue().getName().equals(part) && rootChildren.getValue().getType() == EntryType.LIST){
parentNode = rootChildren;
break;
}
}
if (parentNode == null){
//NO PARENT EXISTS :(
TreeItem<TreeViewEntry> newNode = null;
if (counter>=splittedPart.length){
newNode = child;
}else{
newNode = new TreeItem<TreeViewEntry>(new TreeViewEntry(part, new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
}
root.getChildren().add(newNode);
parentNode = newNode;
}
}else{//PARENT DOES EXIST.
boolean found = false;
for (TreeItem<TreeViewEntry> parentChild : parentNode.getChildren()){//DOES IT HAS A EXISTING CHILD ALREADY ?
if (parentChild.getValue().getName().equals(part) && parentChild.getValue().getType() == EntryType.LIST){
parentNode = parentChild;
found = true;
break;
}
}
if (found == false){
//CHILD DOES NOT EXIST ALREADY, SO CREATE IT!
TreeItem<TreeViewEntry> newNode = null;
if (counter>=splittedPart.length){
newNode = child;
}else{
newNode = new TreeItem<TreeViewEntry>(new TreeViewEntry(part, new ImageView(JavaFXHandler.listIcon), null, EntryType.LIST));
}
parentNode.getChildren().add(newNode);
parentNode = newNode;
}
}
counter++;
}
}
public static TreeItem<Entity> getTreeView(ArrayList<EntityLayer> layers){
TreeItem<Entity> root = new TreeItem<Entity>(null);
for (EntityLayer eL : layers){
TreeItem<Entity> et = getTreeView(eL);
if (et!=null){
root.getChildren().add(et);
}
}
return root;
}
public static TreeItem<Entity> getTreeView(EntityLayer layer){
TreeItem<Entity> layerRoot = new TreeItem<Entity>(new LayerEntity(layer.getName()));
layerRoot.setGraphic(new ImageView(JavaFXHandler.structureIcon));
for (Entity e : layer.getEntities()){
TreeItem<Entity> et = getTreeView(e);
if (et!=null){
layerRoot.getChildren().add(et);
}
}
return layerRoot;
}
private static TreeItem<Entity> getTreeView(Entity entity){
TreeItem<Entity> ent = new TreeItem<Entity>(entity);
switch(entity.getType()){
case Light:
ent.setGraphic(new ImageView(JavaFXHandler.asteriskYellow));
break;
case Object:
ent.setGraphic(new ImageView(JavaFXHandler.instanceIcon/*box.png*/));
break;
}
for (Entity child : entity.getChildrens()){
TreeItem<Entity> childEnt = getTreeView(child);
if (childEnt!=null){
ent.getChildren().add(childEnt);
}
}
return ent;
}
}