From 160821f07742fd3325a5903892f30354ea9d0dd2 Mon Sep 17 00:00:00 2001 From: Brendan Robert Date: Thu, 3 Apr 2014 23:19:59 -0500 Subject: [PATCH 1/3] Additional working fixes to blockly integration, the marshalling/unmarshalling of blockly script code is starting to function! --- .../badvision/outlaweditor/MythosEditor.java | 59 +++++++++++++------ .../MythosScriptEditorController.java | 27 +++++++++ .../org/badvision/outlaweditor/UIAction.java | 6 ++ .../outlaweditor/data/TileUtils.java | 28 +++++---- .../src/main/resources/ApplicationUI.fxml | 26 ++++---- .../main/resources/MythosScriptEditor.fxml | 17 +++--- .../jaxb/OutlawSchema/OutlawSchema.xsd | 14 ++--- .../mythos/mythos-editor/html/editor.html | 2 +- .../main/resources/testData/blocklytest1.xml | 4 +- .../main/resources/testData/blocklytest2.xml | 23 +++++++- .../outlaweditor/test/TestMythosEditor.java | 10 ++-- 11 files changed, 144 insertions(+), 72 deletions(-) diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosEditor.java index 421ead44..24d1388c 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosEditor.java @@ -1,7 +1,6 @@ package org.badvision.outlaweditor; -import java.io.BufferedOutputStream; -import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; @@ -14,22 +13,34 @@ import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.badvision.outlaweditor.data.xml.Block; import org.badvision.outlaweditor.data.xml.Script; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; /** * Mythos Scripting Editor + * * @author blurry */ public class MythosEditor { + Script script; Stage primaryStage; MythosScriptEditorController controller; + public static final String XML_HEADER = "\n"; + public MythosEditor(Script theScript) { script = theScript; } - + public void show() { primaryStage = new Stage(); javafx.application.Platform.setImplicitExit(true); @@ -45,7 +56,7 @@ public class MythosEditor { } catch (IOException exception) { throw new RuntimeException(exception); } - + primaryStage.setOnCloseRequest(new EventHandler() { @Override public void handle(final WindowEvent t) { @@ -53,9 +64,14 @@ public class MythosEditor { } }); primaryStage.show(); - loadScript(); + controller.onLoad(new Runnable() { + @Override + public void run() { + loadScript(); + } + }); } - + public void close() { primaryStage.close(); } @@ -63,15 +79,21 @@ public class MythosEditor { public void applyChanges() { try { String xml = String.valueOf(controller.editorView.getEngine().executeScript("Blockly.Xml.workspaceToDom(Blockly.mainWorkspace).outerHTML")); - JAXBContext context = JAXBContext.newInstance(Block.class); - Block scriptBlock = (Block) context.createUnmarshaller().unmarshal(new StringReader(xml)); - script.setBlock(scriptBlock); - } catch (JAXBException ex) { + xml = xml.replace("", ""); + xml = xml.replace("", ""); + JAXBContext context = JAXBContext.newInstance("org.badvision.outlaweditor.data.xml"); + Unmarshaller unmarshaller = context.createUnmarshaller(); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(new ByteArrayInputStream(xml.getBytes("UTF-8"))); + JAXBElement b = unmarshaller.unmarshal(doc, Block.class); + script.setBlock(b.getValue()); + } catch (JAXBException | ParserConfigurationException | SAXException | IOException ex) { Logger.getLogger(MythosEditor.class.getName()).log(Level.SEVERE, null, ex); } - } - + public void loadScript() { if (script == null || script.getBlock() == null) { loadScript(createDefaultScript()); @@ -87,15 +109,16 @@ public class MythosEditor { Logger.getLogger(MythosEditor.class.getName()).log(Level.SEVERE, null, ex); } } - + public void loadScript(String xml) { - xml = xml.replaceAll("\"","\\\""); - String loadScript = "var xml = Blockly.Xml.textToDom("+xml+");"; - loadScript += "Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, xml);"; - controller.editorView.getEngine().executeScript(loadScript); + xml = XML_HEADER + xml; + xml = xml.replaceAll("'", "\\'"); + xml = xml.replaceAll("\n", ""); + String loadScript = "Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, Blockly.Xml.textToDom('" + xml + "'));"; + controller.editorView.getEngine().executeScript(loadScript); } private String createDefaultScript() { - return ""; + return "New function"; } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosScriptEditorController.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosScriptEditorController.java index f9fc711e..3111692d 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosScriptEditorController.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosScriptEditorController.java @@ -1,7 +1,12 @@ package org.badvision.outlaweditor; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import java.util.ResourceBundle; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.concurrent.Worker.State; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; @@ -13,6 +18,15 @@ public class MythosScriptEditorController implements Initializable { public static final String MYTHOS_EDITOR = "/mythos/mythos-editor/html/editor.html"; + private final List onLoadEvents = new ArrayList<>(); + boolean loaded = false; + public synchronized void onLoad(Runnable runnable) { + if (loaded) { + runnable.run(); + } else { + onLoadEvents.add(runnable); + } + } @FXML // fx:id="editorView" WebView editorView; // Value injected by FXMLLoader @@ -73,6 +87,19 @@ public class MythosScriptEditorController @Override // This method is called by the FXMLLoader when initialization is complete public void initialize(URL fxmlFileLocation, ResourceBundle resources) { + editorView.getEngine().getLoadWorker().stateProperty().addListener( + new ChangeListener() { + public void changed(ObservableValue ov, State oldState, State newState) { + if (newState == State.SUCCEEDED) { + loaded = true; + for (Runnable r : onLoadEvents) { + r.run(); + } + onLoadEvents.clear(); + } + } + }); + assert editorView != null : "fx:id=\"editorView\" was not injected: check your FXML file 'MythosScriptEditor.fxml'."; assert menuItemAbortChanges != null : "fx:id=\"menuItemAbortChanges\" was not injected: check your FXML file 'MythosScriptEditor.fxml'."; assert menuItemAboutBlockly != null : "fx:id=\"menuItemAboutBlockly\" was not injected: check your FXML file 'MythosScriptEditor.fxml'."; diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/UIAction.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/UIAction.java index 716a20f4..f17ea9ef 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/UIAction.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/UIAction.java @@ -31,6 +31,8 @@ import javax.swing.JOptionPane; import javax.xml.bind.JAXB; import org.badvision.outlaweditor.data.TilesetUtils; import org.badvision.outlaweditor.data.xml.GameData; +import org.badvision.outlaweditor.data.xml.IntervalScript; +import org.badvision.outlaweditor.data.xml.Map; import org.badvision.outlaweditor.data.xml.Script; /** @@ -203,6 +205,10 @@ public class UIAction { script.setName("New Script"); MythosEditor editor = new MythosEditor(script); editor.show(); + if (Application.instance.controller.currentMap.getScripts() == null) { + Application.instance.controller.currentMap.setScripts(new Map.Scripts()); + } + Application.instance.controller.currentMap.getScripts().getScript().add(script); return script; } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileUtils.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileUtils.java index 4cd868ff..799048b2 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileUtils.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileUtils.java @@ -12,15 +12,17 @@ import org.badvision.outlaweditor.data.xml.*; * @author brobert */ public class TileUtils { + static Map> display; + static { clear(); } - + public static void clear() { - display = new ConcurrentHashMap<>(); + display = new ConcurrentHashMap<>(); } - + public static Tile newTile() { Tile t = new Tile(); t.setObstruction(false); @@ -40,18 +42,24 @@ public class TileUtils { } return t.getId(); } - + public static Map getDisplay(Tile t) { if (display.get(getId(t)) == null) { display.put(getId(t), new EnumMap(Platform.class)); } return display.get(getId(t)); } - + public static void redrawTile(Tile t) { Map displays = getDisplay(t); for (PlatformData d : t.getDisplayData()) { - Platform p = Platform.valueOf(d.getPlatform()); + Platform p; + try { + p = Platform.valueOf(d.getPlatform()); + } catch (IllegalArgumentException e) { + System.err.println("Unable to find any platform support for '" + d.getPlatform() + "'"); + continue; + } displays.put(p, p.tileRenderer.redrawSprite(d.getValue(), displays.get(p))); } DataProducer.notifyObservers(t); @@ -63,17 +71,17 @@ public class TileUtils { return d.getValue(); } } - byte[] out = new byte[p.dataHeight*p.dataWidth]; + byte[] out = new byte[p.dataHeight * p.dataWidth]; setPlatformData(t, p, out); return out; } - + public static WritableImage getImage(Tile t, Platform p) { Map displays = getDisplay(t); byte[] data = getPlatformData(t, p); return displays.put(p, p.tileRenderer.redrawSprite(data, displays.get(p))); } - + public static void setImage(Tile t, Platform p, WritableImage img) { Map displays = getDisplay(t); displays.put(p, img); @@ -91,4 +99,4 @@ public class TileUtils { d.setValue(b); t.getDisplayData().add(d); } -} \ No newline at end of file +} diff --git a/OutlawEditor/src/main/resources/ApplicationUI.fxml b/OutlawEditor/src/main/resources/ApplicationUI.fxml index 3b892329..2a337ed0 100644 --- a/OutlawEditor/src/main/resources/ApplicationUI.fxml +++ b/OutlawEditor/src/main/resources/ApplicationUI.fxml @@ -2,15 +2,11 @@ - - - - - + @@ -73,7 +69,7 @@