浏览代码

- Create "New Control" and "New Spatial" abstract classes that allow showing a Wizard before creation
- Fix freeze of Add Skybox.. in Terrain Editor

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7138 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

nor..67 14 年之前
父节点
当前提交
a808f18bfe

+ 119 - 0
jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/AbstractNewControlWizardAction.java

@@ -0,0 +1,119 @@
+/*
+ *  Copyright (c) 2009-2010 jMonkeyEngine
+ *  All rights reserved.
+ * 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ * 
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ *  * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.core.sceneexplorer.nodes.actions;
+
+import com.jme3.gde.core.scene.SceneApplication;
+import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
+import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit;
+import com.jme3.gde.core.undoredo.SceneUndoRedoManager;
+import com.jme3.scene.Spatial;
+import com.jme3.scene.control.Control;
+import java.awt.event.ActionEvent;
+import java.util.concurrent.Callable;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import org.openide.loaders.DataObject;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author normenhansen
+ */
+public abstract class AbstractNewControlWizardAction implements NewControlAction {
+
+    protected String name = "*";
+
+    protected abstract Object showWizard(Spatial spatial);
+
+    protected abstract Control doCreateControl(Spatial spatial, Object configuration);
+
+    protected Action makeAction(final JmeSpatial rootNode, final DataObject dataObject) {
+        final Spatial spatial = rootNode.getLookup().lookup(Spatial.class);
+        return new AbstractAction(name) {
+
+            public void actionPerformed(ActionEvent e) {
+                final Object obj=showWizard(spatial);
+                SceneApplication.getApplication().enqueue(new Callable<Void>() {
+
+                    public Void call() throws Exception {
+                        final Control attachControl = doCreateControl(spatial, obj);
+                        if (spatial != null && attachControl != null) {
+                            spatial.addControl(attachControl);
+                            Lookup.getDefault().lookup(SceneUndoRedoManager.class).addEdit(this, new AbstractUndoableSceneEdit() {
+
+                                @Override
+                                public void sceneUndo() throws CannotUndoException {
+                                    spatial.removeControl(attachControl);
+                                }
+
+                                @Override
+                                public void sceneRedo() throws CannotRedoException {
+                                    spatial.addControl(attachControl);
+                                }
+
+                                @Override
+                                public void awtRedo() {
+                                    dataObject.setModified(true);
+                                    rootNode.refresh(true);
+                                }
+
+                                @Override
+                                public void awtUndo() {
+                                    dataObject.setModified(true);
+                                    rootNode.refresh(true);
+                                }
+                            });
+                            setModified();
+                        }
+                        return null;
+                    }
+                });
+            }
+
+            protected void setModified() {
+                java.awt.EventQueue.invokeLater(new Runnable() {
+
+                    public void run() {
+                        dataObject.setModified(true);
+                        rootNode.refresh(true);
+                    }
+                });
+            }
+        };
+    }
+
+    public Action getAction(JmeSpatial rootNode, DataObject dataObject) {
+        return makeAction(rootNode, dataObject);
+    }
+}

+ 119 - 0
jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/AbstractNewSpatialWizardAction.java

@@ -0,0 +1,119 @@
+/*
+ *  Copyright (c) 2009-2010 jMonkeyEngine
+ *  All rights reserved.
+ * 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ * 
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ *  * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.core.sceneexplorer.nodes.actions;
+
+import com.jme3.gde.core.scene.SceneApplication;
+import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
+import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit;
+import com.jme3.gde.core.undoredo.SceneUndoRedoManager;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+import java.awt.event.ActionEvent;
+import java.util.concurrent.Callable;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import org.openide.loaders.DataObject;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author normenhansen
+ */
+public abstract class AbstractNewSpatialWizardAction implements NewSpatialAction {
+
+    protected String name = "*";
+
+    protected abstract Object showWizard(Spatial spatial);
+
+    protected abstract Spatial doCreateSpatial(Node parent, Object configuration);
+
+    protected Action makeAction(final JmeNode rootNode, final DataObject dataObject) {
+        final Node node = rootNode.getLookup().lookup(Node.class);
+        return new AbstractAction(name) {
+
+            public void actionPerformed(ActionEvent e) {
+                final Object obj=showWizard(node);
+                SceneApplication.getApplication().enqueue(new Callable<Void>() {
+
+                    public Void call() throws Exception {
+                        final Spatial attachSpatial = doCreateSpatial(node, obj);
+                        if (node != null && attachSpatial != null) {
+                            node.attachChild(attachSpatial);
+                            Lookup.getDefault().lookup(SceneUndoRedoManager.class).addEdit(this, new AbstractUndoableSceneEdit() {
+
+                                @Override
+                                public void sceneUndo() throws CannotUndoException {
+                                    attachSpatial.removeFromParent();
+                                }
+
+                                @Override
+                                public void sceneRedo() throws CannotRedoException {
+                                    node.attachChild(attachSpatial);
+                                }
+
+                                @Override
+                                public void awtRedo() {
+                                    dataObject.setModified(true);
+                                    rootNode.refresh(true);
+                                }
+
+                                @Override
+                                public void awtUndo() {
+                                    dataObject.setModified(true);
+                                    rootNode.refresh(true);
+                                }
+                            });
+                            setModified();
+                        }
+                        return null;
+                    }
+                });
+            }
+
+            protected void setModified() {
+                java.awt.EventQueue.invokeLater(new Runnable() {
+
+                    public void run() {
+                        dataObject.setModified(true);
+                        rootNode.refresh(true);
+                    }
+                });
+            }
+        };
+    }
+
+    public Action getAction(JmeNode rootNode, DataObject dataObject) {
+        return makeAction(rootNode, dataObject);
+    }
+}

+ 19 - 23
jme3-terrain-editor/src/com/jme3/gde/terraineditor/sky/AddSkyboxAction.java

@@ -6,7 +6,7 @@ package com.jme3.gde.terraineditor.sky;
 
 import com.jme3.asset.AssetManager;
 import com.jme3.gde.core.scene.SceneApplication;
-import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractNewSpatialAction;
+import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractNewSpatialWizardAction;
 import com.jme3.gde.core.sceneexplorer.nodes.actions.NewSpatialAction;
 import com.jme3.math.Vector3f;
 import com.jme3.scene.Node;
@@ -27,7 +27,7 @@ import org.openide.util.Exceptions;
  * @author normenhansen
  */
 @org.openide.util.lookup.ServiceProvider(service = NewSpatialAction.class)
-public class AddSkyboxAction extends AbstractNewSpatialAction {
+public class AddSkyboxAction extends AbstractNewSpatialWizardAction {
 
     private WizardDescriptor.Panel[] panels;
 
@@ -36,28 +36,24 @@ public class AddSkyboxAction extends AbstractNewSpatialAction {
     }
 
     @Override
-    protected Spatial doCreateSpatial(Node parent) {
-        try {
-            final WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
-            java.awt.EventQueue.invokeAndWait(new Runnable() {
+    protected Object showWizard(Spatial spatial) {
+        WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
+        wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
+        wizardDescriptor.setTitle("Skybox Wizard");
+        Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
+        dialog.setVisible(true);
+        dialog.toFront();
+        boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
+        if (!cancelled) {
+            return wizardDescriptor;
+        }
+        return null;
+    }
 
-                public void run() {
-                    // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
-                    wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
-                    wizardDescriptor.setTitle("Skybox Wizard");
-                    Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
-                    dialog.setVisible(true);
-                    dialog.toFront();
-                }
-            });
-            boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
-            if (!cancelled) {
-                return generateSkybox(wizardDescriptor);
-            }
-        } catch (InterruptedException ex) {
-            Exceptions.printStackTrace(ex);
-        } catch (InvocationTargetException ex) {
-            Exceptions.printStackTrace(ex);
+    @Override
+    protected Spatial doCreateSpatial(Node parent, Object properties) {
+        if (properties != null) {
+            return generateSkybox((WizardDescriptor) properties);
         }
         return null;
     }