package shipmaker; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import javax.swing.JFileChooser; import javax.swing.JFrame; import render.BlueprintPrefs; import render.RenderNode; import render.RenderPreferences; import render.SpaceViewPanel; import render.XYTRenderNode; import shipmaker.catalog.PowerGrid; import shipmaker.render.Button; import shipmaker.render.CatalogSelector; import shipmaker.render.ShipContents; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import dcpu.WorldPauseHandler; import env.Entity; import env.Space; import equipment.StructureNode; public class Editor { Space s; EditorShip es; SpaceViewPanel svp; RenderNode selector, contents; public Editor(EditorShip pes) { this.es = pes; s = new Space(); svp = new SpaceViewPanel(s); this.setShip(pes); svp.prefs = new BlueprintPrefs(); s.start(); addSaveLoadUI(); } private void addSaveLoadUI() { svp.overlays().topCenter().addChild(new Button(-10, 20, "Test Ship", new Runnable() { public void run() { demo.Main.main(es.makeShip()); } })); svp.overlays().topCenter().addChild(new Button(-100, 20, "Save Ship", new Runnable() { public void run() { GsonBuilder gb = new GsonBuilder(); gb.excludeFieldsWithoutExposeAnnotation(); Gson g = gb.create(); String content = g.toJson(es); JFileChooser jfc = new JFileChooser(new File(".")); jfc.showSaveDialog(null); if (jfc.getSelectedFile()!=null) { try { PrintWriter pw = new PrintWriter(jfc.getSelectedFile()); pw.write(content); pw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } } })); svp.overlays().topCenter().addChild(new Button(-100, 54, "Load Ship", new Runnable() { public void run() { JFileChooser jfc = new JFileChooser(new File(".")); jfc.showOpenDialog(null); if (jfc.getSelectedFile()!=null) { try { String json = ""; Reader r = new InputStreamReader(new FileInputStream(jfc.getSelectedFile())); char[] buffer = new char[1000]; int read = 0; while ((read = r.read(buffer)) > 0) { json += String.valueOf(buffer, 0, read); } setShip(EditorShip.fromJson(json)); r.close(); } catch (IOException e) { e.printStackTrace(); } } } })); svp.overlays().topCenter().addChild(new Button(-10, 54, "Structure Mode", new Runnable() { public void run() { es.editingStructure = !es.editingStructure; } })); } public SpaceViewPanel panel() { return svp; } public void setShip(EditorShip pes) { s.clearEntities(); svp.overlays().clear(); this.es = pes; selector = new CatalogSelector(svp.overlays(), pes); contents = new ShipContents(pes, s, svp.overlays()); svp.overlays().topRight().addChild(contents); svp.overlays().bottomLeft().addChild(selector); svp.overlays().bottomRight().addChild(new XYTRenderNode(-200, -50, 0) { public void draw(Graphics2D g, RenderPreferences prefs) { g.setFont(new Font("SansSerif", Font.BOLD, 14)); g.drawString("Mass:"+es.massTotal(), 10, 20); g.drawString("Rot Inertia:"+es.riTotal(), 10, 40); } }); s.addEntity(new Entity() { private RenderNode vis; public void tickPhysics(int msPerTick, WorldPauseHandler handler) { } public void tickInternals(int msPerTick, WorldPauseHandler handler) { } public RenderNode getVisuals() { if (vis == null) { vis = new XYTRenderNode(0,0,0) { public void draw(Graphics2D g, RenderPreferences prefs) { g.setColor(new Color(255,255,255, 40)); g.setStroke(new BasicStroke(1)); g.drawLine(-40, 0, 40, 0); g.drawLine(0, -40, 0, 40); g.drawArc(-20, -20, 40, 40, 0, 360); } }; } return vis; } }); addSaveLoadUI(); } public static void main(String[] args) { final EditorShip es = new EditorShip(); es.addPart(new PowerGrid()); es.structLocations().add(new StructureNode()); Editor e = new Editor(es); JFrame jf = new JFrame(); jf.add(e.panel()); jf.setSize(800, 600); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }