From 32b9577e203148752d8931e1fe907352fa22be5b Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Fri, 31 Jan 2014 23:22:02 +0400 Subject: [PATCH] JavaFX Scene Builder integration --- .../javaFX/FxBuilderEmbedder/lib/embedder.jar | Bin 5136 -> 6496 bytes .../javaFX/sceneBuilder/SceneBuilderImpl.java | 33 +++++++++++-- .../sceneBuilder/SceneBuilderKitWrapper.java | 4 +- .../javaFX/sceneBuilder/EditorCallback.java | 10 ++++ .../javaFX/sceneBuilder/ErrorHandler.java | 8 ---- .../ErrorSceneBuilderCreator.java | 2 +- .../javaFX/sceneBuilder/SceneBuilder.java | 2 + .../sceneBuilder/SceneBuilderCreator.java | 2 +- .../sceneBuilder/SceneBuilderCreatorImpl.java | 4 +- .../sceneBuilder/SceneBuilderEditor.java | 45 ++++++++++++++++-- 10 files changed, 87 insertions(+), 23 deletions(-) create mode 100644 plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/EditorCallback.java delete mode 100644 plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/ErrorHandler.java diff --git a/plugins/javaFX/FxBuilderEmbedder/lib/embedder.jar b/plugins/javaFX/FxBuilderEmbedder/lib/embedder.jar index ec19b110af5852ef4a1ecf4f53e24cb3ff65252d..1ddf9204cf68e922e3a4bc2705c45391a107b99b 100644 GIT binary patch literal 6496 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 yemA4+-+#Z~N7RpMw}bG5ZS;0 delta 4016 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 u-&O!K myListener; - public SceneBuilderImpl(URL url, ErrorHandler errorHandler) { + public SceneBuilderImpl(URL url, EditorCallback editorCallback) { myFileURL = url; - myErrorHandler = errorHandler; + myEditorCallback = editorCallback; Platform.runLater(new Runnable() { @Override @@ -45,6 +48,7 @@ public class SceneBuilderImpl implements SceneBuilder { LibraryPanelController palette = new LibraryPanelController(myEditorController); loadFile(); + startChangeListener(); SplitPane leftPane = new SplitPane(); leftPane.setOrientation(Orientation.VERTICAL); @@ -73,19 +77,38 @@ public class SceneBuilderImpl implements SceneBuilder { Platform.runLater(new Runnable() { @Override public void run() { - create(); + // TODO: restore state + loadFile(); } }); } } + private void startChangeListener() { + myListener = new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, Number newValue) { + myEditorCallback.saveChanges(myEditorController.getFxmlText()); + } + }; + + myEditorController.getJobManager().revisionProperty().addListener(myListener); + } + + @Override + public void close() { + if (myEditorController != null) { + myEditorController.getJobManager().revisionProperty().removeListener(myListener); + } + } + private void loadFile() { try { String fxmlText = FXOMDocument.readContentFromURL(myFileURL); myEditorController.setFxmlTextAndLocation(fxmlText, myFileURL); } catch (Throwable e) { - myErrorHandler.handle(e); + myEditorCallback.handleError(e); } } } \ No newline at end of file diff --git a/plugins/javaFX/FxBuilderEmbedder/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderKitWrapper.java b/plugins/javaFX/FxBuilderEmbedder/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderKitWrapper.java index 5515be078451..592401c7b96f 100644 --- a/plugins/javaFX/FxBuilderEmbedder/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderKitWrapper.java +++ b/plugins/javaFX/FxBuilderEmbedder/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderKitWrapper.java @@ -14,7 +14,7 @@ import java.util.HashSet; * @author Alexander Lobas */ public class SceneBuilderKitWrapper { - public static SceneBuilder create(URL url, ErrorHandler errorHandler) throws Exception { + public static SceneBuilder create(URL url, EditorCallback editorCallback) throws Exception { // JavaFX -> Swing drag&drop fix Field identifier = DataFormat.class.getDeclaredField("identifier"); identifier.setAccessible(true); @@ -24,6 +24,6 @@ public class SceneBuilderKitWrapper { // JavaFX class loading fix FXMLLoader.setDefaultClassLoader(SceneBuilderKitWrapper.class.getClassLoader()); - return new SceneBuilderImpl(url, errorHandler); + return new SceneBuilderImpl(url, editorCallback); } } \ No newline at end of file diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/EditorCallback.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/EditorCallback.java new file mode 100644 index 000000000000..8d019dcf29ee --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/EditorCallback.java @@ -0,0 +1,10 @@ +package org.jetbrains.plugins.javaFX.sceneBuilder; + +/** + * @author Alexander Lobas + */ +public interface EditorCallback { + void saveChanges(String content); + + void handleError(Throwable e); +} \ No newline at end of file diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/ErrorHandler.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/ErrorHandler.java deleted file mode 100644 index 09858623aec8..000000000000 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/ErrorHandler.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.jetbrains.plugins.javaFX.sceneBuilder; - -/** - * @author Alexander Lobas - */ -public interface ErrorHandler { - void handle(Throwable e); -} \ No newline at end of file diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/ErrorSceneBuilderCreator.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/ErrorSceneBuilderCreator.java index ea5e7a1ccc13..e1f989df9c7e 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/ErrorSceneBuilderCreator.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/ErrorSceneBuilderCreator.java @@ -18,7 +18,7 @@ public class ErrorSceneBuilderCreator implements SceneBuilderCreator { } @Override - public SceneBuilder create(URL url, ErrorHandler errorHandler) throws Exception { + public SceneBuilder create(URL url, EditorCallback editorCallback) throws Exception { throw new UnsupportedOperationException(); } } \ No newline at end of file diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilder.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilder.java index 23406c4f3e5c..4891d6bd4ac7 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilder.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilder.java @@ -9,4 +9,6 @@ public interface SceneBuilder { JComponent getPanel(); void reloadFile(); + + void close(); } \ No newline at end of file diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderCreator.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderCreator.java index 7ab9cf3ab513..4a81bac001aa 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderCreator.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderCreator.java @@ -8,5 +8,5 @@ import java.net.URL; public interface SceneBuilderCreator { State getState(); - SceneBuilder create(URL url, ErrorHandler errorHandler) throws Exception; + SceneBuilder create(URL url, EditorCallback editorCallback) throws Exception; } \ No newline at end of file diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderCreatorImpl.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderCreatorImpl.java index 326f770279fc..97832c4888f7 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderCreatorImpl.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderCreatorImpl.java @@ -30,9 +30,9 @@ public class SceneBuilderCreatorImpl implements SceneBuilderCreator { } @Override - public SceneBuilder create(URL url, ErrorHandler errorHandler) throws Exception { + public SceneBuilder create(URL url, EditorCallback editorCallback) throws Exception { Class wrapperClass = Class.forName("org.jetbrains.plugins.javaFX.sceneBuilder.SceneBuilderKitWrapper", false, myClassLoader); - return (SceneBuilder)wrapperClass.getMethod("create", URL.class, ErrorHandler.class).invoke(null, url, errorHandler); + return (SceneBuilder)wrapperClass.getMethod("create", URL.class, EditorCallback.class).invoke(null, url, editorCallback); } @Override diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditor.java index fd8271ba20e8..d102654d5a6d 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditor.java @@ -2,6 +2,8 @@ package org.jetbrains.plugins.javaFX.sceneBuilder; import com.intellij.codeHighlighting.BackgroundEditorHighlighter; import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.event.DocumentAdapter; @@ -27,7 +29,7 @@ import java.net.URL; /** * @author Alexander Lobas */ -public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor, ErrorHandler { +public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor, EditorCallback { private static final Logger LOG = Logger.getInstance("#org.jetbrains.plugins.javaFX.sceneBuilder.SceneBuilderEditor"); private final static String SCENE_CARD = "scene_builder"; @@ -43,6 +45,7 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor private final JPanel myErrorPanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 10, 5, true, false)); private final HyperlinkLabel myErrorLabel = new HyperlinkLabel(); + private final Document myDocument; private final ExternalChangeListener myChangeListener; private SceneBuilderCreator myBuilderCreator; @@ -54,6 +57,7 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor myFile = file; myCreatorProvider = creatorProvider; + myDocument = FileDocumentManager.getInstance().getDocument(file); myChangeListener = new ExternalChangeListener(); createErrorPage(); @@ -101,7 +105,37 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor } @Override - public void handle(Throwable e) { + public void saveChanges(final String content) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + public void run() { + if (mySceneBuilder != null) { + try { + myChangeListener.setRunState(false); + + // XXX: strange behavior with undo/redo + + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { + @Override + public void run() { + myDocument.setText(content); + } + }, "JavaFX Scene Builder edit operation", null); + } + }); + } + finally { + myChangeListener.setRunState(true); + } + } + } + }); + } + + @Override + public void handleError(Throwable e) { showErrorPage(null, e); } @@ -163,6 +197,7 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor if (mySceneBuilder != null) { myPanel.remove(mySceneBuilder.getPanel()); + mySceneBuilder.close(); mySceneBuilder = null; } } @@ -248,12 +283,10 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor } private class ExternalChangeListener extends DocumentAdapter { - private final Document myDocument; private volatile boolean myRunState; private String myContent; public ExternalChangeListener() { - myDocument = FileDocumentManager.getInstance().getDocument(myFile); myDocument.addDocumentListener(this); } @@ -271,6 +304,10 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor } } + public void setRunState(boolean state) { + myRunState = state; + } + public void dispose() { myDocument.removeDocumentListener(this); }