package com.clearlyspam23.GLE;
import java.awt.Frame;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.clearlyspam23.GLE.edit.EditorItems;
import com.clearlyspam23.GLE.level.LayerDefinition;
import com.clearlyspam23.GLE.level.LayerTemplate;
import com.clearlyspam23.GLE.level.Level;
import com.clearlyspam23.GLE.level.LevelData;
import com.clearlyspam23.GLE.template.CompressionFormat;
import com.clearlyspam23.GLE.template.LevelSerializer;
import com.clearlyspam23.GLE.template.serializer.TemplateSerializer;
public class JAnGLEData {
public static final String TEMPLATE_EXTENSION = ".jtmp";
private final PluginManager plugins;
private Level currentLevel;
private List<Level> openLevels = new ArrayList<Level>();
private Template openTemplate;
private Frame frame;
private final TemplateSerializer serializer;
public JAnGLEData(PluginManager manager){
this.plugins = manager;
serializer = new TemplateSerializer(manager);
}
public PluginManager getPlugins() {
return plugins;
}
public Level getCurrentLevel() {
return currentLevel;
}
public void setCurrentLevel(Level currentLevel) {
this.currentLevel = currentLevel;
}
public List<Level> getOpenLevels() {
return openLevels;
}
public void addOpenLevel(Level level){
openLevels.add(level);
}
public void addOpenLevels(List<Level> levels){
openLevels.addAll(levels);
}
public void closeLevel(Level level){
openLevels.remove(level);
}
public void closeAllLevels(){
openLevels.clear();
currentLevel = null;
}
public Template getOpenTemplate() {
return openTemplate;
}
@SuppressWarnings("rawtypes")
public List<EditorItems> setOpenTemplate(Template template) {
if(openTemplate!=null){
Set<LayerDefinition> seen = new HashSet<LayerDefinition>();
for(LayerTemplate t : openTemplate.getLayers()){
if(!seen.contains(t.getDefinition())){
t.getDefinition().onTemplateClose(openTemplate);
seen.add(t.getDefinition());
}
}
}
openTemplate = template;
List<EditorItems> items = new ArrayList<EditorItems>();
if(openTemplate!=null){
Set<LayerDefinition> seen = new HashSet<LayerDefinition>();
for(LayerTemplate t : openTemplate.getLayers()){
if(!seen.contains(t.getDefinition())){
EditorItems i = t.getDefinition().onTemplateOpen(openTemplate);
if(i!=null)
items.add(i);
seen.add(t.getDefinition());
}
}
}
return items;
}
public TemplateSerializer getSerializer() {
return serializer;
}
public Level openLevel(File file) throws IOException{
LevelSerializer serializer = openTemplate.getSerializer();
CompressionFormat format = openTemplate.getCompression();
String output = format.decompress(file);
try {
System.out.println(output);
Level level = new Level(openTemplate);
LevelData l = serializer.deserialize(level, output);
level.setToData(l);
level.setSaveFile(file);
return level;
} catch (Exception e) {
e.printStackTrace();
//TODO something better here
return null;
}
}
public boolean saveTemplate(Template template){
try {
PrintWriter w = new PrintWriter(template.getTemplateFile());
String s = serializer.serialize(template);
w.print(s);
w.close();
return true;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
public boolean saveLevel(Level level){
LevelSerializer serializer = openTemplate.getSerializer();
String s = serializer.serialize(level.generateLevelData());
CompressionFormat format = openTemplate.getCompression();
try {
format.compress(s, level.getSaveFile());
} catch (IOException e) {
return false;
}
level.acknowledgeSave();
return true;
}
public Frame getFrame() {
return frame;
}
public void setFrame(Frame frame) {
this.frame = frame;
}
}