mirror of
https://github.com/OMGeeky/ATCS.git
synced 2025-12-26 23:57:25 +01:00
main changes are: - Modified marker (* character before name) goes up the project tree by marking all parents of a modified object as modified. - Impact management when changing an object's ID. Allows for some refactoring to occur, while marking the impacted elements as modified, or aven creating "altered" versions if imapcted element was only in game source.
295 lines
8.6 KiB
Java
295 lines
8.6 KiB
Java
package com.gpl.rpg.atcontentstudio.model;
|
|
|
|
import java.awt.Image;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.IOException;
|
|
import java.io.Serializable;
|
|
import java.util.ArrayList;
|
|
import java.util.Enumeration;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import javax.swing.tree.TreeNode;
|
|
import javax.xml.parsers.DocumentBuilder;
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
|
import javax.xml.parsers.ParserConfigurationException;
|
|
|
|
import org.w3c.dom.Document;
|
|
import org.w3c.dom.Element;
|
|
import org.w3c.dom.NodeList;
|
|
import org.xml.sax.InputSource;
|
|
import org.xml.sax.SAXException;
|
|
|
|
import com.gpl.rpg.atcontentstudio.model.Project.ResourceSet;
|
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
|
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
|
import com.gpl.rpg.atcontentstudio.model.maps.Worldmap;
|
|
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
|
import com.gpl.rpg.atcontentstudio.model.sprites.SpriteSheetSet;
|
|
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
|
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeDataSet;
|
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
|
|
|
public class GameSource implements ProjectTreeNode, Serializable {
|
|
|
|
private static final long serialVersionUID = -1512979360971918158L;
|
|
|
|
public static final String DEFAULT_REL_PATH_FOR_GAME_RESOURCE = "res"+File.separator+"values"+File.separator+"loadresources.xml";
|
|
public static final String DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE = "res"+File.separator+"values"+File.separator+"loadresources_debug.xml";
|
|
|
|
public transient GameDataSet gameData;
|
|
public transient TMXMapSet gameMaps;
|
|
public transient SpriteSheetSet gameSprites;
|
|
public transient Worldmap worldmap;
|
|
public transient WriterModeDataSet writerModeDataSet;
|
|
private transient SavedSlotCollection v;
|
|
|
|
public static enum Type {
|
|
source,
|
|
referenced,
|
|
altered,
|
|
created
|
|
}
|
|
|
|
public File baseFolder;
|
|
public Type type;
|
|
|
|
public transient Project parent = null;
|
|
|
|
public transient Map<String, List<String>> referencedSourceFiles = null;
|
|
|
|
public GameSource(File folder, Project parent) {
|
|
this.parent = parent;
|
|
this.baseFolder = folder;
|
|
this.type = Type.source;
|
|
initData();
|
|
}
|
|
|
|
public GameSource(Project parent, Type type) {
|
|
this.parent = parent;
|
|
this.baseFolder = new File(parent.baseFolder, type.toString());
|
|
this.type = type;
|
|
initData();
|
|
}
|
|
|
|
public void refreshTransients(Project p) {
|
|
parent = p;
|
|
initData();
|
|
}
|
|
|
|
public void initData() {
|
|
if (type == Type.source) {
|
|
if (parent.sourceSetToUse == ResourceSet.gameData || parent.sourceSetToUse == ResourceSet.debugData) {
|
|
referencedSourceFiles = new LinkedHashMap<String, List<String>>();
|
|
readResourceList();
|
|
}
|
|
}
|
|
if (type == Type.created) {
|
|
this.writerModeDataSet = new WriterModeDataSet(this);
|
|
}
|
|
this.gameData = new GameDataSet(this);
|
|
this.gameMaps = new TMXMapSet(this);
|
|
this.gameSprites = new SpriteSheetSet(this);
|
|
this.worldmap = new Worldmap(this);
|
|
v = new SavedSlotCollection();
|
|
v.add(gameData);
|
|
v.add(gameMaps);
|
|
v.add(gameSprites);
|
|
v.add(worldmap);
|
|
if (type == Type.created) {
|
|
v.add(writerModeDataSet);
|
|
}
|
|
}
|
|
|
|
public void readResourceList() {
|
|
File xmlFile = null;
|
|
if (parent.sourceSetToUse == ResourceSet.gameData) {
|
|
xmlFile = new File(baseFolder, DEFAULT_REL_PATH_FOR_GAME_RESOURCE);
|
|
} else if (parent.sourceSetToUse == ResourceSet.debugData) {
|
|
xmlFile = new File(baseFolder, DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if (!xmlFile.exists()) return;
|
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
|
Document doc;
|
|
try {
|
|
factory.setIgnoringComments(true);
|
|
factory.setIgnoringElementContentWhitespace(true);
|
|
factory.setExpandEntityReferences(false);
|
|
DocumentBuilder builder = factory.newDocumentBuilder();
|
|
InputSource insrc = new InputSource(new FileInputStream(xmlFile));
|
|
// insrc.setSystemId("http://worldmap/");
|
|
insrc.setEncoding("UTF-8");
|
|
doc = builder.parse(insrc);
|
|
|
|
Element root = (Element) doc.getElementsByTagName("resources").item(0);
|
|
if (root != null) {
|
|
NodeList arraysList = root.getElementsByTagName("array");
|
|
if (arraysList != null) {
|
|
for (int i = 0; i < arraysList.getLength(); i++) {
|
|
Element arrayNode = (Element) arraysList.item(i);
|
|
String name = arrayNode.getAttribute("name");
|
|
List<String> arrayContents = new ArrayList<String>();
|
|
NodeList arrayItems = arrayNode.getElementsByTagName("item");
|
|
if (arrayItems != null) {
|
|
for (int j = 0; j < arrayItems.getLength(); j++) {
|
|
arrayContents.add(((Element)arrayItems.item(j)).getTextContent());
|
|
}
|
|
referencedSourceFiles.put(name, arrayContents);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} catch (SAXException e) {
|
|
e.printStackTrace();
|
|
} catch (FileNotFoundException e) {
|
|
e.printStackTrace();
|
|
} catch (ParserConfigurationException e) {
|
|
e.printStackTrace();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Enumeration<ProjectTreeNode> children() {
|
|
return v.getNonEmptyElements();
|
|
}
|
|
@Override
|
|
public boolean getAllowsChildren() {
|
|
return true;
|
|
}
|
|
@Override
|
|
public TreeNode getChildAt(int arg0) {
|
|
return v.getNonEmptyElementAt(arg0);
|
|
}
|
|
@Override
|
|
public int getChildCount() {
|
|
return v.getNonEmptySize();
|
|
}
|
|
@Override
|
|
public int getIndex(TreeNode arg0) {
|
|
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
|
}
|
|
@Override
|
|
public TreeNode getParent() {
|
|
return parent;
|
|
}
|
|
@Override
|
|
public boolean isLeaf() {
|
|
return false;
|
|
}
|
|
@Override
|
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
|
path.add(0, this);
|
|
parent.childrenAdded(path);
|
|
}
|
|
@Override
|
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
|
path.add(0, this);
|
|
parent.childrenChanged(path);
|
|
}
|
|
@Override
|
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
|
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
|
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
|
} else {
|
|
path.add(0, this);
|
|
parent.childrenRemoved(path);
|
|
}
|
|
}
|
|
@Override
|
|
public void notifyCreated() {
|
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
|
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
|
node.notifyCreated();
|
|
}
|
|
}
|
|
@Override
|
|
public String getDesc() {
|
|
switch(type) {
|
|
case altered: return (needsSaving() ? "*" : "")+"Altered data";
|
|
case created: return (needsSaving() ? "*" : "")+"Created data";
|
|
case referenced: return (needsSaving() ? "*" : "")+"Referenced data";
|
|
case source: return (needsSaving() ? "*" : "")+"AT Source"; //The fact that it is from "source" is already mentionned by its parent.
|
|
default: return (needsSaving() ? "*" : "")+"Game data";
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
public Project getProject() {
|
|
return parent == null ? null : parent.getProject();
|
|
}
|
|
|
|
public Image getIcon(String iconId) {
|
|
String[] data = iconId.split(":");
|
|
for (Spritesheet sheet : gameSprites.spritesheets) {
|
|
if (sheet.id.equals(data[0])) {
|
|
return sheet.getIcon(Integer.parseInt(data[1]));
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public Image getImage(String iconId) {
|
|
String[] data = iconId.split(":");
|
|
for (Spritesheet sheet : gameSprites.spritesheets) {
|
|
if (sheet.id.equals(data[0])) {
|
|
return sheet.getImage(Integer.parseInt(data[1]));
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
@Override
|
|
public Image getIcon() {
|
|
return getOpenIcon();
|
|
}
|
|
@Override
|
|
public Image getClosedIcon() {
|
|
return DefaultIcons.getATClosedIcon();
|
|
}
|
|
@Override
|
|
public Image getLeafIcon() {
|
|
return DefaultIcons.getATClosedIcon();
|
|
}
|
|
@Override
|
|
public Image getOpenIcon() {
|
|
return DefaultIcons.getATOpenIcon();
|
|
}
|
|
@Override
|
|
public GameDataSet getDataSet() {
|
|
return null;
|
|
}
|
|
|
|
|
|
@Override
|
|
public Type getDataType() {
|
|
return type;
|
|
}
|
|
|
|
@Override
|
|
public boolean isEmpty() {
|
|
return v.isEmpty();
|
|
}
|
|
|
|
public WorldmapSegment getWorldmapSegment(String id) {
|
|
return worldmap.getWorldmapSegment(id);
|
|
}
|
|
|
|
@Override
|
|
public boolean needsSaving() {
|
|
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
|
if (node.needsSaving()) return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|