Browse Source

Merge pull request #149 from davidB/sdk_scene_addprimitives

SDK: scene add primitives
normen 11 years ago
parent
commit
4d39fc86aa

+ 44 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/NewGeometryAction.java

@@ -0,0 +1,44 @@
+/*
+ *  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.sceneexplorer.nodes.JmeNode;
+import javax.swing.Action;
+import org.openide.loaders.DataObject;
+
+/**
+ *
+ * @author david.bernard.31
+ */
+public interface NewGeometryAction {
+    public Action getAction(JmeNode rootNode, DataObject dataObject);
+}

+ 8 - 1
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/NewSpatialPopup.java

@@ -79,8 +79,15 @@ public class NewSpatialPopup extends AbstractAction implements Presenter.Popup {
         result.add(new JMenuItem(new AddEmitterAction()));
         result.add(new JMenuItem(new AddEmitterAction()));
         result.add(new JMenuItem(new AddAudioNodeAction()));
         result.add(new JMenuItem(new AddAudioNodeAction()));
         for (NewSpatialAction di : Lookup.getDefault().lookupAll(NewSpatialAction.class)) {
         for (NewSpatialAction di : Lookup.getDefault().lookupAll(NewSpatialAction.class)) {
-            result.add(new JMenuItem(di.getAction(jmeNode, dataObject)));
+            if (!(di instanceof NewGeometryAction)) {
+                result.add(new JMenuItem(di.getAction(jmeNode, dataObject)));
+            }
+        }
+        JMenu geometries = new JMenu("Primitives");
+        for (NewGeometryAction di : Lookup.getDefault().lookupAll(NewGeometryAction.class)) {
+            geometries.add(new JMenuItem(di.getAction(jmeNode, dataObject)));
         }
         }
+        result.add(geometries);
         return result;
         return result;
     }
     }
 
 

+ 20 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties

@@ -38,3 +38,23 @@ GenerateLODVisualPanel1.estLabel9.text=
 GenerateLODVisualPanel1.estLabel10.text=
 GenerateLODVisualPanel1.estLabel10.text=
 GenerateLODVisualPanel1.estLabel5.text=
 GenerateLODVisualPanel1.estLabel5.text=
 GenerateLODVisualPanel1.estLabel3.text=
 GenerateLODVisualPanel1.estLabel3.text=
+NewGeometrySettingsTopComponent.boxXLabel.text=x
+NewGeometrySettingsTopComponent.boxYLabel.text=y
+NewGeometrySettingsTopComponent.boxZLabel.text=z
+NewGeometrySettingsTopComponent.sphereRadialSamplesLabel.text=radialSamples
+NewGeometrySettingsTopComponent.sphereUseEvenSlicesLabel.text=useEvenSlices
+NewGeometrySettingsTopComponent.sphereUseEvenSlicesCheckBox.text=
+NewGeometrySettingsTopComponent.sphereZSamplesLabel.text=zSamples
+NewGeometrySettingsTopComponent.sphereInteriorLabel.text=interior
+NewGeometrySettingsTopComponent.sphereRadiusLabel.text=radius
+NewGeometrySettingsTopComponent.sphereInteriorCheckBox.text=
+NewGeometrySettingsTopComponent.boxPanel.TabConstraints.tabTitle=Box
+NewGeometrySettingsTopComponent.spherePanel.TabConstraints.tabTitle=Sphere
+NewGeometrySettingsTopComponent.quadPanel.TabConstraints.tabTitle=Quad
+NewGeometrySettingsTopComponent.quadWidthLabel.text=width
+NewGeometrySettingsTopComponent.quadHeightLabel.text=height
+NewGeometrySettingsTopComponent.quadFlipCoordLabel.text=flip Coords
+NewGeometrySettingsTopComponent.quadFlipCoordCheckBox.text=
+NewGeometrySettingsTopComponent.linePanel.TabConstraints.tabTitle=Line
+NewGeometrySettingsTopComponent.lineStartLabel.text=start
+NewGeometrySettingsTopComponent.lineEndLabel.text=end

+ 77 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/ConverterVector3f_String.java

@@ -0,0 +1,77 @@
+/*
+ *  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.impl;
+
+import com.jme3.math.Vector3f;
+import org.jdesktop.beansbinding.Converter;
+
+/**
+ *
+ * @author david.bernard.31
+ */
+
+public class ConverterVector3f_String extends Converter<Vector3f, String> {
+    
+    public static void parseInto(String text, Vector3f res) throws IllegalArgumentException {
+        text = text.replace('[', ' ');
+        text = text.replace(']', ' ').trim();
+        String[] a = text.split("\\s*(,|\\s)\\s*");
+
+        if (a.length == 1) {
+            if(text.trim().toLowerCase().equals("nan")) {
+                res.set(Vector3f.NAN);
+                return;
+            }
+            float f = Float.parseFloat(text);           
+            res.set(f, f, f);
+            return;
+        }
+
+        if (a.length == 3) {
+            res.set(Float.parseFloat(a[0]), Float.parseFloat(a[1]), Float.parseFloat(a[2]));
+            return;
+        }
+        throw new IllegalArgumentException("String not correct");
+    }
+    
+    @Override
+    public String convertForward(Vector3f vector) {
+        return "[" + vector.x + ", " + vector.y + ", " + vector.z + "]";
+    }
+
+    @Override
+    public Vector3f convertReverse(String text) {
+        Vector3f vector = new Vector3f();
+        parseInto(text, vector);
+        return vector;
+    }
+}

+ 112 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewGeometry.java

@@ -0,0 +1,112 @@
+/*
+ *  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.impl;
+
+import com.jme3.asset.AssetManager;
+import com.jme3.material.Material;
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Quaternion;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.shape.Box;
+import com.jme3.scene.shape.Line;
+import com.jme3.scene.shape.Quad;
+import com.jme3.scene.shape.Sphere;
+
+/**
+ *
+ * @author david.bernard.31
+ */
+public class NewGeometry {
+
+    public static Material material(AssetManager assetManaget, NewGeometrySettings cfg) {
+        Material mat = new Material(assetManaget, "Common/MatDefs/Misc/Unshaded.j3md");
+        ColorRGBA  c = cfg.getMatRandom() ?ColorRGBA.randomColor() : cfg.getMatColor();
+        mat.setColor("Color", c);
+        return mat;
+    }
+        
+    public static Geometry box(AssetManager assetManager) {
+        NewGeometrySettings cfg = new NewGeometrySettings();
+        Box b = new Box(cfg.getBoxX(), cfg.getBoxY(), cfg.getBoxZ());
+        b.setMode(cfg.getBoxMode());
+        Geometry geom = new Geometry(cfg.getBoxName(), b);
+        geom.setMaterial(material(assetManager, cfg));
+        return geom;
+    }
+    
+    public static Geometry sphere(AssetManager assetManager) {
+        NewGeometrySettings cfg = new NewGeometrySettings();
+        Sphere b = new Sphere(
+            cfg.getSphereZSamples()
+            , cfg.getSpherRadialSamples()
+            , cfg.getSphereRadius()
+            , cfg.getSphereUseEvenSlices()
+            , cfg.getSphereInterior()
+        );
+        b.setMode(cfg.getSphereMode());
+        Geometry geom = new Geometry(cfg.getSphereName(), b);
+        geom.setMaterial(material(assetManager, cfg));        
+        return geom;
+    }
+    
+    public static Geometry line(AssetManager assetManager) {
+        NewGeometrySettings cfg = new NewGeometrySettings();
+        Line b = new Line(cfg.getLineStart(), cfg.getLineEnd());
+        b.setMode(cfg.getLineMode());
+        Geometry geom = new Geometry(cfg.getLineName(), b);
+        geom.setMaterial(material(assetManager, cfg));        
+        return geom;
+    }
+
+    public static Geometry quad(AssetManager assetManager) {
+        NewGeometrySettings cfg = new NewGeometrySettings();
+        Quad b = new Quad(cfg.getQuadWidth(), cfg.getQuadHeight(), cfg.getQuadFlipCoords());
+        b.setMode(cfg.getQuadMode());
+        Geometry geom = new Geometry(cfg.getQuadName(), b);
+        switch(cfg.getQuadPlan()) {
+            case XZ: {
+                Quaternion q = new Quaternion();
+                q.fromAngles((float)Math.PI/-2f, 0.0f, 0.0f);
+                geom.setLocalRotation(q);
+                break;
+            }
+            case YZ: {
+                Quaternion q = new Quaternion();
+                q.fromAngles(0.0f, (float)Math.PI/-2f, 0.0f);
+                geom.setLocalRotation(q);
+                break;
+            }
+        }
+        geom.setMaterial(material(assetManager, cfg));        
+        return geom;
+    }
+}

+ 57 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewGeometryBoxAction.java

@@ -0,0 +1,57 @@
+/*
+ *  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.impl;
+
+import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractNewSpatialAction;
+import com.jme3.gde.core.sceneexplorer.nodes.actions.NewGeometryAction;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+
+/**
+ *
+ * @author david.bernard.31
+ */
[email protected](service = NewGeometryAction.class)
+public class NewGeometryBoxAction extends AbstractNewSpatialAction implements NewGeometryAction {
+
+    public NewGeometryBoxAction() {
+        name = "Box";
+    }
+
+    @Override
+    protected Spatial doCreateSpatial(Node parent) {
+        Geometry geom = NewGeometry.box(pm);
+        parent.attachChild(geom);
+        return geom;
+    }
+}

+ 57 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewGeometryLineAction.java

@@ -0,0 +1,57 @@
+/*
+ *  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.impl;
+
+import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractNewSpatialAction;
+import com.jme3.gde.core.sceneexplorer.nodes.actions.NewGeometryAction;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+
+/**
+ *
+ * @author david.bernard.31
+ */
[email protected](service = NewGeometryAction.class)
+public class NewGeometryLineAction extends AbstractNewSpatialAction implements NewGeometryAction {
+
+    public NewGeometryLineAction() {
+        name = "Line";
+    }
+
+    @Override
+    protected Spatial doCreateSpatial(Node parent) {
+        Geometry geom = NewGeometry.line(pm);
+        parent.attachChild(geom);
+        return geom;
+    }
+}

+ 57 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewGeometryQuadAction.java

@@ -0,0 +1,57 @@
+/*
+ *  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.impl;
+
+import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractNewSpatialAction;
+import com.jme3.gde.core.sceneexplorer.nodes.actions.NewGeometryAction;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+
+/**
+ *
+ * @author david.bernard.31
+ */
[email protected](service = NewGeometryAction.class)
+public class NewGeometryQuadAction extends AbstractNewSpatialAction implements NewGeometryAction {
+
+    public NewGeometryQuadAction() {
+        name = "Quad";
+    }
+
+    @Override
+    protected Spatial doCreateSpatial(Node parent) {
+        Geometry geom = NewGeometry.quad(pm);
+        parent.attachChild(geom);
+        return geom;
+    }
+}

+ 373 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewGeometrySettings.java

@@ -0,0 +1,373 @@
+/*
+ *  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.impl;
+
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Vector3f;
+import com.jme3.scene.Mesh.Mode;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+import java.util.prefs.PreferenceChangeEvent;
+import java.util.prefs.PreferenceChangeListener;
+import java.util.prefs.Preferences;
+import org.openide.util.NbPreferences;
+
+/**
+ *
+ * @author david.bernard.31
+ */
+
+
+public class NewGeometrySettings implements Serializable, PreferenceChangeListener {
+    public static enum Plan {
+        XY, XZ, YZ
+    }
+    
+    private transient final PropertyChangeSupport propertySupport;
+    private transient final Preferences pref;
+    
+    public NewGeometrySettings() {
+        propertySupport = new PropertyChangeSupport(this);
+        pref = NbPreferences.forModule(NewGeometrySettings.class);
+    }
+
+    // -- Listeners management
+
+    public void open() {
+        pref.addPreferenceChangeListener(this);
+    }
+
+    public void close() {
+        pref.removePreferenceChangeListener(this);
+    }
+
+    public void preferenceChange(PreferenceChangeEvent evt) {
+        propertySupport.firePropertyChange(evt.getKey(), null, evt.getNewValue());
+    }
+    
+    public void addPropertyChangeListener(final PropertyChangeListener listener) {
+        propertySupport.addPropertyChangeListener(listener);
+    }
+    
+    public void removePropertyChangeListener(PropertyChangeListener listener) {
+        propertySupport.removePropertyChangeListener(listener);
+    }
+
+    //-- Material info
+
+    public static final String PROP_MatRandom = "MatRandom";
+
+    public boolean getMatRandom() {
+        return pref.getBoolean(PROP_MatRandom, true);
+    }
+
+    public void setMatRandom(boolean value) {
+        pref.putBoolean(PROP_MatRandom, value);
+    }
+
+    public static final String PROP_MatColor = "MatColor";
+
+    public ColorRGBA getMatColor() {
+        ColorRGBA b = new ColorRGBA();
+        b.fromIntRGBA(pref.getInt(PROP_MatColor, ColorRGBA.Orange.asIntRGBA()));
+        return b;
+    }
+
+    public void setMatColor(ColorRGBA value) {
+        pref.putInt(PROP_MatColor, value.asIntRGBA());
+    }
+    
+
+
+    //-- Box
+
+    public static final String PROP_BoxName = "BoxName";
+
+    public String getBoxName() {
+        return pref.get(PROP_BoxName, "Box");
+    }
+
+    public void setBoxName(String value) {
+        pref.put(PROP_BoxName, value);
+    }
+
+    public static final String PROP_BoxMode = "BoxMode";
+
+    public Mode getBoxMode() {
+        return getMode(PROP_BoxMode);
+    }
+
+    public void setBoxMode(Mode value) {
+        putMode(PROP_BoxMode, value);
+    }
+
+    public static final String PROP_BoxX = "BoxX";
+
+    public float getBoxX() {
+        return pref.getFloat(PROP_BoxX, 1.0f);
+    }
+
+    public void setBoxX(float value) {
+        pref.putFloat(PROP_BoxX, value);
+    }
+
+    public static final String PROP_BoxY = "BoxY";
+
+    public float getBoxY() {
+        return pref.getFloat(PROP_BoxY, 1.0f);
+    }
+
+    public void setBoxY(float value) {
+        pref.putFloat(PROP_BoxY, value);
+    }
+
+    public static final String PROP_BoxZ = "BoxZ";
+
+    public float getBoxZ() {
+        return pref.getFloat(PROP_BoxZ, 1.0f);
+    }
+
+    public void setBoxZ(float value) {
+        pref.putFloat(PROP_BoxZ, value);
+    }
+
+    //-- Sphere
+    
+    public static final String PROP_SphereName = "SphereName";
+
+    public String getSphereName() {
+        return pref.get(PROP_SphereName, "Sphere");
+    }
+
+    public void setSphereName(String value) {
+        pref.put(PROP_SphereName, value);
+    }
+
+    public static final String PROP_SphereMode = "SphereMode";
+
+    public Mode getSphereMode() {
+        return getMode(PROP_SphereMode);
+    }
+
+    public void setSphereMode(Mode value) {
+        putMode(PROP_SphereMode, value);
+    }
+
+    public static final String PROP_SphereZSamples = "SphereZSamples";
+
+    public int getSphereZSamples() {
+        return pref.getInt(PROP_SphereZSamples, 10);
+    }
+
+    public void setSphereZSamples(int value) {
+        pref.putInt(PROP_SphereZSamples, value);
+    }
+    
+    public static final String PROP_SpherRadialSamples = "SpherRadialSamples";
+
+    public int getSpherRadialSamples() {
+        return pref.getInt(PROP_SpherRadialSamples, 10);
+    }
+
+    public void setSpherRadialSamples(int value) {
+        pref.putInt(PROP_SpherRadialSamples, value);
+    }
+    
+    public static final String PROP_SphereRadius = "SphereRadius";
+
+    public float getSphereRadius() {
+        return pref.getFloat(PROP_SphereRadius, 1.0f);
+    }
+
+    public void setSphereRadius(float value) {
+        pref.putFloat(PROP_SphereRadius, value);
+    }
+    
+    public static final String PROP_SphereUseEvenSlices = "SphereUseEvenSlices";
+
+    public boolean getSphereUseEvenSlices() {
+        return pref.getBoolean(PROP_SphereUseEvenSlices, false);
+    }
+
+    public void setSphereUseEvenSlices(boolean value) {
+        pref.putBoolean(PROP_SphereUseEvenSlices, value);
+    }
+    
+    public static final String PROP_SphereInterior = "SphereInterior";
+
+    public boolean getSphereInterior() {
+        return pref.getBoolean(PROP_SphereInterior, false);
+    }
+
+    public void setSphereInterior(boolean value) {
+        pref.putBoolean(PROP_SphereInterior, value);
+    }
+
+    //-- Line
+    public static final String PROP_LineName = "LineName";
+
+    public String getLineName() {
+        return pref.get(PROP_LineName, "Line");
+    }
+
+    public void setLineName(String value) {
+        pref.put(PROP_LineName, value);
+    }
+        
+    public static final String PROP_LineMode = "LineMode";
+
+    public Mode getLineMode() {
+        return getMode(PROP_LineMode);
+    }
+
+    public void setLineMode(Mode value) {
+        putMode(PROP_LineMode, value);
+    }
+
+    public static final String PROP_LineStart = "LineStart";
+
+    public Vector3f getLineStart() {
+        return getVector3f(PROP_LineStart, new Vector3f(0,0,0));
+    }
+
+    public void setLineStart(Vector3f value) {
+        putVector3f(PROP_LineStart, value);
+    }
+
+    public static final String PROP_LineEnd = "LineEnd";
+
+    public Vector3f getLineEnd() {
+        return getVector3f(PROP_LineEnd, new Vector3f(2f,0,2f));
+    }
+
+    public void setLineEnd(Vector3f value) {
+        putVector3f(PROP_LineEnd, value);
+    }
+
+    //-- Quad
+    public static final String PROP_QuadName = "QuadName";
+
+    public String getQuadName() {
+        return pref.get(PROP_QuadName, "Quad");
+    }
+
+    public void setQuadName(String value) {
+        pref.put(PROP_QuadName, value);
+    }
+
+    public static final String PROP_QuadMode = "QuadMode";
+
+    public Mode getQuadMode() {
+        return getMode(PROP_QuadMode);
+    }
+
+    public void setQuadMode(Mode value) {
+        putMode(PROP_QuadMode, value);
+    }
+
+    public static final String PROP_QuadWidth = "QuadWidth";
+
+    public float getQuadWidth() {
+        return pref.getFloat(PROP_QuadWidth, 1.0f);
+    }
+
+    public void setQuadWidth(float value) {
+        pref.putFloat(PROP_QuadWidth, value);
+    }
+
+    public static final String PROP_QuadHeight = "QuadHeight";
+
+    public float getQuadHeight() {
+        return pref.getFloat(PROP_QuadHeight, 1.0f);
+    }
+
+    public void setQuadHeight(float value) {
+        pref.putFloat(PROP_QuadHeight, value);
+    }
+
+    public static final String PROP_QuadFlipCoords = "QuadFlipCoords";
+
+    public boolean getQuadFlipCoords() {
+        return pref.getBoolean(PROP_QuadFlipCoords, false);
+    }
+
+    public void setQuadFlipCoords(boolean value) {
+        pref.putBoolean(PROP_QuadFlipCoords, value);
+    }
+
+    public static final String PROP_QuadPlan = "QuadPlan";
+
+    public Plan getQuadPlan() {
+        return Plan.values()[pref.getInt(PROP_QuadPlan, Plan.XZ.ordinal())];
+    }
+
+    public void setQuadPlan(Plan value) {
+        pref.putInt(PROP_QuadPlan, value.ordinal());
+    }
+
+    //-- Tools
+        
+    protected Vector3f getVector3f(String baseName, Vector3f def) {
+        return new Vector3f(
+            pref.getFloat(baseName + "X", def.x)
+            ,pref.getFloat(baseName + "Y", def.y)
+            ,pref.getFloat(baseName + "Z", def.z)
+        );
+        
+    }
+
+    protected void putVector3f(String baseName, Vector3f value) {
+        pref.putFloat(baseName + "X", value.x);
+        pref.putFloat(baseName + "Y", value.y);
+        pref.putFloat(baseName + "Z", value.z);
+    }
+
+    protected Mode getMode(String baseName) {
+        return Mode.values()[pref.getInt(baseName, Mode.Lines.ordinal())];
+    }
+
+    public void putMode(String baseName, Mode value) {
+        pref.putInt(baseName, value.ordinal());
+    }
+    
+    public List<Mode> getModes() {
+        return Arrays.asList(Mode.values());
+    }
+    
+    public List<Plan> getPlans() {
+        return Arrays.asList(Plan.values());
+    }
+    
+}

+ 626 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewGeometrySettingsTopComponent.form

@@ -0,0 +1,626 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Component class="com.jme3.gde.core.sceneexplorer.nodes.actions.impl.NewGeometrySettings" name="newGeometrySettings">
+    </Component>
+    <Component class="com.jme3.gde.core.sceneexplorer.nodes.actions.impl.ConverterVector3f_String" name="converterVector3f_String">
+    </Component>
+  </NonVisualComponents>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Component id="jTabbedPane1" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Component id="jTabbedPane1" alignment="1" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JTabbedPane" name="jTabbedPane1">
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
+      <SubComponents>
+        <Container class="javax.swing.JPanel" name="boxPanel">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
+              <JTabbedPaneConstraints tabName="Box">
+                <Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.boxPanel.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </JTabbedPaneConstraints>
+            </Constraint>
+          </Constraints>
+
+          <Layout>
+            <DimensionLayout dim="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Group type="102" attributes="0">
+                              <Component id="boxXLabel" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="boxXSpinner" min="-2" pref="62" max="-2" attributes="0"/>
+                              <EmptySpace min="-2" pref="26" max="-2" attributes="0"/>
+                              <Component id="boxYLabel" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="boxYSpinner" min="-2" pref="62" max="-2" attributes="0"/>
+                              <EmptySpace min="-2" pref="28" max="-2" attributes="0"/>
+                              <Component id="boxZLabel" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="boxZSpinner" min="-2" pref="62" max="-2" attributes="0"/>
+                          </Group>
+                          <Group type="102" attributes="0">
+                              <Component id="boxNameTextField" pref="426" max="32767" attributes="0"/>
+                              <EmptySpace min="-2" max="-2" attributes="0"/>
+                              <Component id="boxModeComboBox" pref="133" max="32767" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <EmptySpace min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+            <DimensionLayout dim="1">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="1" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="2" attributes="0">
+                          <Component id="boxNameTextField" alignment="2" min="-2" max="-2" attributes="0"/>
+                          <Component id="boxModeComboBox" alignment="2" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="3" attributes="0">
+                          <Component id="boxXSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="boxXLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="boxYLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="boxYSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="boxZSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="boxZLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace pref="197" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+          </Layout>
+          <SubComponents>
+            <Component class="javax.swing.JTextField" name="boxNameTextField">
+              <BindingProperties>
+                <BindingProperty name="text" source="newGeometrySettings" sourcePath="${boxName}" target="boxNameTextField" targetPath="text" updateStrategy="0" immediately="false">
+                  <BindingParameter name="javax.swing.binding.ParameterKeys.TEXT_CHANGE_STRATEGY" value="javax.swing.binding.TextChangeStrategy.ON_TYPE"/>
+                </BindingProperty>
+              </BindingProperties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="boxNameTextFieldActionPerformed"/>
+              </Events>
+            </Component>
+            <Component class="javax.swing.JLabel" name="boxXLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.boxXLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JSpinner" name="boxXSpinner">
+              <Properties>
+                <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+                  <SpinnerModel initial="1.0" numberType="java.lang.Float" stepSize="0.5" type="number"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="value" source="newGeometrySettings" sourcePath="${boxX}" target="boxXSpinner" targetPath="value" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="boxYLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.boxYLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JSpinner" name="boxYSpinner">
+              <Properties>
+                <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+                  <SpinnerModel initial="1.0" minimum="0.0" numberType="java.lang.Float" stepSize="0.5" type="number"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="value" source="newGeometrySettings" sourcePath="${boxY}" target="boxYSpinner" targetPath="value" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="boxZLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.boxZLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JSpinner" name="boxZSpinner">
+              <Properties>
+                <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+                  <SpinnerModel initial="1.0" minimum="0.0" numberType="java.lang.Float" stepSize="0.5" type="number"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="value" source="newGeometrySettings" sourcePath="${boxZ}" target="boxZSpinner" targetPath="value" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="boxModeComboBox">
+              <BindingProperties>
+                <BindingProperty name="elements" source="newGeometrySettings" sourcePath="${modes}" target="boxModeComboBox" targetPath="elements" updateStrategy="0" immediately="false"/>
+                <BindingProperty name="selectedItem" source="newGeometrySettings" sourcePath="${boxMode}" target="boxModeComboBox" targetPath="selectedItem" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="boxModeComboBoxActionPerformed"/>
+              </Events>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Container class="javax.swing.JPanel" name="spherePanel">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
+              <JTabbedPaneConstraints tabName="Sphere">
+                <Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.spherePanel.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </JTabbedPaneConstraints>
+            </Constraint>
+          </Constraints>
+
+          <Layout>
+            <DimensionLayout dim="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Group type="102" attributes="0">
+                              <Component id="sphereNameTextField" max="32767" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="sphereModeComboBox" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <Group type="102" attributes="0">
+                              <Group type="103" groupAlignment="0" attributes="0">
+                                  <Component id="sphereZSamplesLabel" min="-2" max="-2" attributes="0"/>
+                                  <Group type="102" alignment="0" attributes="0">
+                                      <Group type="103" groupAlignment="0" attributes="0">
+                                          <Component id="sphereRadialSamplesLabel" min="-2" max="-2" attributes="0"/>
+                                          <Component id="sphereRadiusLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+                                      </Group>
+                                      <EmptySpace max="-2" attributes="0"/>
+                                      <Group type="103" groupAlignment="0" attributes="0">
+                                          <Component id="sphereRadiusSpinner" alignment="0" min="-2" pref="62" max="-2" attributes="0"/>
+                                          <Group type="102" alignment="0" attributes="0">
+                                              <Group type="103" groupAlignment="1" max="-2" attributes="0">
+                                                  <Group type="102" attributes="0">
+                                                      <Component id="sphereRadialSamplesSpinner" min="-2" pref="62" max="-2" attributes="0"/>
+                                                      <EmptySpace max="32767" attributes="0"/>
+                                                      <Component id="sphereUseEvenSlicesLabel" min="-2" max="-2" attributes="0"/>
+                                                  </Group>
+                                                  <Group type="102" alignment="0" attributes="0">
+                                                      <Component id="sphereZSamplesSpinner" min="-2" pref="62" max="-2" attributes="0"/>
+                                                      <EmptySpace min="-2" pref="144" max="-2" attributes="0"/>
+                                                      <Component id="sphereInteriorLabel" min="-2" max="-2" attributes="0"/>
+                                                  </Group>
+                                              </Group>
+                                              <EmptySpace max="-2" attributes="0"/>
+                                              <Group type="103" groupAlignment="0" attributes="0">
+                                                  <Component id="sphereInteriorCheckBox" min="-2" max="-2" attributes="0"/>
+                                                  <Component id="sphereUseEvenSlicesCheckBox" min="-2" max="-2" attributes="0"/>
+                                              </Group>
+                                          </Group>
+                                      </Group>
+                                  </Group>
+                              </Group>
+                              <EmptySpace min="0" pref="164" max="32767" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+            <DimensionLayout dim="1">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace type="separate" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="1" attributes="0">
+                          <Group type="102" attributes="0">
+                              <Group type="103" groupAlignment="3" attributes="0">
+                                  <Component id="sphereNameTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+                                  <Component id="sphereModeComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                              <EmptySpace min="-2" pref="4" max="-2" attributes="0"/>
+                              <Group type="103" groupAlignment="3" attributes="0">
+                                  <Component id="sphereRadialSamplesLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                                  <Component id="sphereRadialSamplesSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                                  <Component id="sphereUseEvenSlicesLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <Component id="sphereUseEvenSlicesCheckBox" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="sphereZSamplesLabel" alignment="1" min="-2" max="-2" attributes="0"/>
+                          <Component id="sphereZSamplesSpinner" alignment="1" min="-2" max="-2" attributes="0"/>
+                          <Component id="sphereInteriorLabel" alignment="1" min="-2" max="-2" attributes="0"/>
+                          <Component id="sphereInteriorCheckBox" alignment="1" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="3" attributes="0">
+                          <Component id="sphereRadiusSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="sphereRadiusLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace pref="147" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+          </Layout>
+          <SubComponents>
+            <Component class="javax.swing.JLabel" name="sphereZSamplesLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.sphereZSamplesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JSpinner" name="sphereZSamplesSpinner">
+              <BindingProperties>
+                <BindingProperty name="value" source="newGeometrySettings" sourcePath="${spherRadialSamples}" target="sphereZSamplesSpinner" targetPath="value" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="sphereRadialSamplesLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.sphereRadialSamplesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JSpinner" name="sphereRadialSamplesSpinner">
+              <Properties>
+                <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+                  <SpinnerModel initial="10" minimum="1" numberType="java.lang.Integer" stepSize="1" type="number"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="value" source="newGeometrySettings" sourcePath="${sphereZSamples}" target="sphereRadialSamplesSpinner" targetPath="value" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="sphereUseEvenSlicesLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.sphereUseEvenSlicesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JCheckBox" name="sphereUseEvenSlicesCheckBox">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.sphereUseEvenSlicesCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="selected" source="newGeometrySettings" sourcePath="${sphereUseEvenSlices}" target="sphereUseEvenSlicesCheckBox" targetPath="selected" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JCheckBox" name="sphereInteriorCheckBox">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.sphereInteriorCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="selected" source="newGeometrySettings" sourcePath="${sphereInterior}" target="sphereInteriorCheckBox" targetPath="selected" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="sphereInteriorLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.sphereInteriorLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JSpinner" name="sphereRadiusSpinner">
+              <Properties>
+                <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+                  <SpinnerModel initial="1.0" minimum="0.0" numberType="java.lang.Float" stepSize="0.1" type="number"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="value" source="newGeometrySettings" sourcePath="${sphereRadius}" target="sphereRadiusSpinner" targetPath="value" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="sphereRadiusLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.sphereRadiusLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JTextField" name="sphereNameTextField">
+              <BindingProperties>
+                <BindingProperty name="text" source="newGeometrySettings" sourcePath="${sphereName}" target="sphereNameTextField" targetPath="text" updateStrategy="0" immediately="false">
+                  <BindingParameter name="javax.swing.binding.ParameterKeys.TEXT_CHANGE_STRATEGY" value="javax.swing.binding.TextChangeStrategy.ON_TYPE"/>
+                </BindingProperty>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="sphereModeComboBox">
+              <BindingProperties>
+                <BindingProperty name="elements" source="newGeometrySettings" sourcePath="${modes}" target="sphereModeComboBox" targetPath="elements" updateStrategy="0" immediately="false"/>
+                <BindingProperty name="selectedItem" source="newGeometrySettings" sourcePath="${sphereMode}" target="sphereModeComboBox" targetPath="selectedItem" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Container class="javax.swing.JPanel" name="quadPanel">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
+              <JTabbedPaneConstraints tabName="Quad">
+                <Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.quadPanel.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </JTabbedPaneConstraints>
+            </Constraint>
+          </Constraints>
+
+          <Layout>
+            <DimensionLayout dim="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Group type="102" alignment="0" attributes="0">
+                              <Component id="quadNameTextField" max="32767" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="quadModeComboBox" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <Group type="102" attributes="0">
+                              <Group type="103" groupAlignment="0" attributes="0">
+                                  <Component id="quadFlipCoordLabel" min="-2" max="-2" attributes="0"/>
+                                  <Group type="102" alignment="0" attributes="0">
+                                      <Component id="jComboBox2" min="-2" max="-2" attributes="0"/>
+                                      <EmptySpace max="-2" attributes="0"/>
+                                      <Component id="quadWidthLabel" min="-2" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Group type="103" groupAlignment="0" attributes="0">
+                                  <Component id="quadFlipCoordCheckBox" alignment="0" min="-2" pref="101" max="-2" attributes="0"/>
+                                  <Group type="102" alignment="0" attributes="0">
+                                      <Component id="quadWidthSpinner" min="-2" pref="101" max="-2" attributes="0"/>
+                                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                                      <Component id="quadHeightLabel" min="-2" max="-2" attributes="0"/>
+                                      <EmptySpace max="-2" attributes="0"/>
+                                      <Component id="quadHeightSpinner" min="-2" pref="101" max="-2" attributes="0"/>
+                                  </Group>
+                              </Group>
+                              <EmptySpace min="0" pref="176" max="32767" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+            <DimensionLayout dim="1">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="3" attributes="0">
+                          <Component id="quadNameTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="quadModeComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="3" attributes="0">
+                          <Component id="quadWidthLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="quadWidthSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="quadHeightLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="quadHeightSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="jComboBox2" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="quadFlipCoordLabel" min="-2" max="-2" attributes="0"/>
+                          <Component id="quadFlipCoordCheckBox" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace pref="166" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+          </Layout>
+          <SubComponents>
+            <Component class="javax.swing.JTextField" name="quadNameTextField">
+              <BindingProperties>
+                <BindingProperty name="text" source="newGeometrySettings" sourcePath="${quadName}" target="quadNameTextField" targetPath="text" updateStrategy="0" immediately="false">
+                  <BindingParameter name="javax.swing.binding.ParameterKeys.TEXT_CHANGE_STRATEGY" value="javax.swing.binding.TextChangeStrategy.ON_TYPE"/>
+                </BindingProperty>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="quadWidthLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.quadWidthLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="quadHeightLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.quadHeightLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JSpinner" name="quadWidthSpinner">
+              <Properties>
+                <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+                  <SpinnerModel initial="0.0" minimum="0.0" numberType="java.lang.Float" stepSize="0.5" type="number"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="value" source="newGeometrySettings" sourcePath="${quadWidth}" target="quadWidthSpinner" targetPath="value" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JSpinner" name="quadHeightSpinner">
+              <Properties>
+                <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+                  <SpinnerModel initial="0.0" minimum="0.0" numberType="java.lang.Float" stepSize="0.5" type="number"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="value" source="newGeometrySettings" sourcePath="${quadHeight}" target="quadHeightSpinner" targetPath="value" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="quadFlipCoordLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.quadFlipCoordLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JCheckBox" name="quadFlipCoordCheckBox">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.quadFlipCoordCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+              <BindingProperties>
+                <BindingProperty name="selected" source="newGeometrySettings" sourcePath="${quadFlipCoords}" target="quadFlipCoordCheckBox" targetPath="selected" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="quadModeComboBox">
+              <BindingProperties>
+                <BindingProperty name="elements" source="newGeometrySettings" sourcePath="${modes}" target="quadModeComboBox" targetPath="elements" updateStrategy="0" immediately="false"/>
+                <BindingProperty name="selectedItem" source="newGeometrySettings" sourcePath="${quadMode}" target="quadModeComboBox" targetPath="selectedItem" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="jComboBox2">
+              <BindingProperties>
+                <BindingProperty name="elements" source="newGeometrySettings" sourcePath="${plans}" target="jComboBox2" targetPath="elements" updateStrategy="0" immediately="false"/>
+                <BindingProperty name="selectedItem" source="newGeometrySettings" sourcePath="${quadPlan}" target="jComboBox2" targetPath="selectedItem" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Container class="javax.swing.JPanel" name="linePanel">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
+              <JTabbedPaneConstraints tabName="Line">
+                <Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.linePanel.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </JTabbedPaneConstraints>
+            </Constraint>
+          </Constraints>
+
+          <Layout>
+            <DimensionLayout dim="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Group type="102" alignment="0" attributes="0">
+                              <Component id="lineNameTextField" max="32767" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="jComboBox1" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <Group type="102" alignment="0" attributes="0">
+                              <Component id="lineStartLabel" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="lineStartTextField" min="-2" pref="109" max="-2" attributes="0"/>
+                              <EmptySpace min="-2" pref="78" max="-2" attributes="0"/>
+                              <Component id="lineEndLabel" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="lineEndTextField" min="-2" pref="123" max="-2" attributes="0"/>
+                              <EmptySpace min="0" pref="169" max="32767" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+            <DimensionLayout dim="1">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="3" attributes="0">
+                          <Component id="lineNameTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="jComboBox1" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace min="-2" pref="1" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="3" attributes="0">
+                          <Component id="lineStartLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="lineStartTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="lineEndLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="lineEndTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace pref="203" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+            </DimensionLayout>
+          </Layout>
+          <SubComponents>
+            <Component class="javax.swing.JTextField" name="lineNameTextField">
+              <BindingProperties>
+                <BindingProperty name="text" source="newGeometrySettings" sourcePath="${lineName}" target="lineNameTextField" targetPath="text" updateStrategy="0" immediately="false">
+                  <BindingParameter name="javax.swing.binding.ParameterKeys.TEXT_CHANGE_STRATEGY" value="javax.swing.binding.TextChangeStrategy.ON_TYPE"/>
+                </BindingProperty>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="lineStartLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.lineStartLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JTextField" name="lineStartTextField">
+              <BindingProperties>
+                <BindingProperty name="text" source="newGeometrySettings" sourcePath="${lineStart}" target="lineStartTextField" targetPath="text" updateStrategy="0" immediately="false">
+                  <BindingParameter name="javax.swing.binding.ParameterKeys.TEXT_CHANGE_STRATEGY" value="javax.swing.binding.TextChangeStrategy.ON_ACTION_OR_FOCUS_LOST"/>
+                  <Property name="converter" type="org.jdesktop.beansbinding.Converter" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+                    <Connection component="converterVector3f_String" type="bean"/>
+                  </Property>
+                </BindingProperty>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JLabel" name="lineEndLabel">
+              <Properties>
+                <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+                  <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/impl/Bundle.properties" key="NewGeometrySettingsTopComponent.lineEndLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+                </Property>
+              </Properties>
+            </Component>
+            <Component class="javax.swing.JTextField" name="lineEndTextField">
+              <BindingProperties>
+                <BindingProperty name="text" source="newGeometrySettings" sourcePath="${lineEnd}" target="lineEndTextField" targetPath="text" updateStrategy="0" immediately="false">
+                  <BindingParameter name="javax.swing.binding.ParameterKeys.TEXT_CHANGE_STRATEGY" value="javax.swing.binding.TextChangeStrategy.ON_ACTION_OR_FOCUS_LOST"/>
+                  <Property name="converter" type="org.jdesktop.beansbinding.Converter" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+                    <Connection component="converterVector3f_String" type="bean"/>
+                  </Property>
+                </BindingProperty>
+              </BindingProperties>
+            </Component>
+            <Component class="javax.swing.JComboBox" name="jComboBox1">
+              <BindingProperties>
+                <BindingProperty name="elements" source="newGeometrySettings" sourcePath="${modes}" target="jComboBox1" targetPath="elements" updateStrategy="0" immediately="false"/>
+                <BindingProperty name="selectedItem" source="newGeometrySettings" sourcePath="${lineMode}" target="jComboBox1" targetPath="selectedItem" updateStrategy="0" immediately="false"/>
+              </BindingProperties>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>

+ 565 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewGeometrySettingsTopComponent.java

@@ -0,0 +1,565 @@
+/*
+ *  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.impl;
+
+import org.netbeans.api.settings.ConvertAsProperties;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.util.NbBundle.Messages;
+import org.openide.windows.TopComponent;
+
+/**
+ * Top component which displays NewGeometryAction' Settings.
+ * 
+ * @author david.bernard.31
+ */
+
+
+@ConvertAsProperties(
+        dtd = "-//com.jme3.gde.core.sceneexplorer.nodes.actions.impl//NewGeometrySettings//EN",
+        autostore = true
+)
[email protected](
+        preferredID = "NewGeometrySettingsTopComponent",
+        //iconBase="SET/PATH/TO/ICON/HERE", 
+        persistenceType = TopComponent.PERSISTENCE_ALWAYS
+)
[email protected](mode = "output", openAtStartup = false)
+@ActionID(category = "Window", id = "com.jme3.gde.core.sceneexplorer.nodes.actions.impl.NewGeometrySettingsTopComponent")
+@ActionReference(path = "Menu/Window" /*, position = 333 */)
[email protected](
+        displayName = "#CTL_NewGeometrySettingsAction",
+        preferredID = "NewGeometrySettingsTopComponent"
+)
+@Messages({
+    "CTL_NewGeometrySettingsAction=NewGeometrySettings",
+    "CTL_NewGeometrySettingsTopComponent=NewGeometrySettings Window",
+    "HINT_NewGeometrySettingsTopComponent=This is a NewGeometrySettings window"
+})
+public final class NewGeometrySettingsTopComponent extends TopComponent {
+
+    public NewGeometrySettingsTopComponent() {
+        initComponents();
+        setName(Bundle.CTL_NewGeometrySettingsTopComponent());
+        setToolTipText(Bundle.HINT_NewGeometrySettingsTopComponent());
+
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();
+
+        newGeometrySettings = new com.jme3.gde.core.sceneexplorer.nodes.actions.impl.NewGeometrySettings();
+        converterVector3f_String = new com.jme3.gde.core.sceneexplorer.nodes.actions.impl.ConverterVector3f_String();
+        jTabbedPane1 = new javax.swing.JTabbedPane();
+        boxPanel = new javax.swing.JPanel();
+        boxNameTextField = new javax.swing.JTextField();
+        boxXLabel = new javax.swing.JLabel();
+        boxXSpinner = new javax.swing.JSpinner();
+        boxYLabel = new javax.swing.JLabel();
+        boxYSpinner = new javax.swing.JSpinner();
+        boxZLabel = new javax.swing.JLabel();
+        boxZSpinner = new javax.swing.JSpinner();
+        boxModeComboBox = new javax.swing.JComboBox();
+        spherePanel = new javax.swing.JPanel();
+        sphereZSamplesLabel = new javax.swing.JLabel();
+        sphereZSamplesSpinner = new javax.swing.JSpinner();
+        sphereRadialSamplesLabel = new javax.swing.JLabel();
+        sphereRadialSamplesSpinner = new javax.swing.JSpinner();
+        sphereUseEvenSlicesLabel = new javax.swing.JLabel();
+        sphereUseEvenSlicesCheckBox = new javax.swing.JCheckBox();
+        sphereInteriorCheckBox = new javax.swing.JCheckBox();
+        sphereInteriorLabel = new javax.swing.JLabel();
+        sphereRadiusSpinner = new javax.swing.JSpinner();
+        sphereRadiusLabel = new javax.swing.JLabel();
+        sphereNameTextField = new javax.swing.JTextField();
+        sphereModeComboBox = new javax.swing.JComboBox();
+        quadPanel = new javax.swing.JPanel();
+        quadNameTextField = new javax.swing.JTextField();
+        quadWidthLabel = new javax.swing.JLabel();
+        quadHeightLabel = new javax.swing.JLabel();
+        quadWidthSpinner = new javax.swing.JSpinner();
+        quadHeightSpinner = new javax.swing.JSpinner();
+        quadFlipCoordLabel = new javax.swing.JLabel();
+        quadFlipCoordCheckBox = new javax.swing.JCheckBox();
+        quadModeComboBox = new javax.swing.JComboBox();
+        jComboBox2 = new javax.swing.JComboBox();
+        linePanel = new javax.swing.JPanel();
+        lineNameTextField = new javax.swing.JTextField();
+        lineStartLabel = new javax.swing.JLabel();
+        lineStartTextField = new javax.swing.JTextField();
+        lineEndLabel = new javax.swing.JLabel();
+        lineEndTextField = new javax.swing.JTextField();
+        jComboBox1 = new javax.swing.JComboBox();
+
+        org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${boxName}"), boxNameTextField, org.jdesktop.beansbinding.BeanProperty.create("text"));
+        bindingGroup.addBinding(binding);
+
+        boxNameTextField.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                boxNameTextFieldActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(boxXLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.boxXLabel.text")); // NOI18N
+
+        boxXSpinner.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(1.0f), null, null, Float.valueOf(0.5f)));
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${boxX}"), boxXSpinner, org.jdesktop.beansbinding.BeanProperty.create("value"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(boxYLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.boxYLabel.text")); // NOI18N
+
+        boxYSpinner.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(1.0f), Float.valueOf(0.0f), null, Float.valueOf(0.5f)));
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${boxY}"), boxYSpinner, org.jdesktop.beansbinding.BeanProperty.create("value"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(boxZLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.boxZLabel.text")); // NOI18N
+
+        boxZSpinner.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(1.0f), Float.valueOf(0.0f), null, Float.valueOf(0.5f)));
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${boxZ}"), boxZSpinner, org.jdesktop.beansbinding.BeanProperty.create("value"));
+        bindingGroup.addBinding(binding);
+
+        org.jdesktop.beansbinding.ELProperty eLProperty = org.jdesktop.beansbinding.ELProperty.create("${modes}");
+        org.jdesktop.swingbinding.JComboBoxBinding jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, eLProperty, boxModeComboBox);
+        bindingGroup.addBinding(jComboBoxBinding);
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${boxMode}"), boxModeComboBox, org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
+        bindingGroup.addBinding(binding);
+
+        boxModeComboBox.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                boxModeComboBoxActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout boxPanelLayout = new javax.swing.GroupLayout(boxPanel);
+        boxPanel.setLayout(boxPanelLayout);
+        boxPanelLayout.setHorizontalGroup(
+            boxPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(boxPanelLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(boxPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(boxPanelLayout.createSequentialGroup()
+                        .addComponent(boxXLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(boxXSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(26, 26, 26)
+                        .addComponent(boxYLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(boxYSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(28, 28, 28)
+                        .addComponent(boxZLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(boxZSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addGroup(boxPanelLayout.createSequentialGroup()
+                        .addComponent(boxNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 426, Short.MAX_VALUE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(boxModeComboBox, 0, 133, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+        boxPanelLayout.setVerticalGroup(
+            boxPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, boxPanelLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(boxPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
+                    .addComponent(boxNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(boxModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(boxPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(boxXSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(boxXLabel)
+                    .addComponent(boxYLabel)
+                    .addComponent(boxYSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(boxZSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(boxZLabel))
+                .addContainerGap(197, Short.MAX_VALUE))
+        );
+
+        jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.boxPanel.TabConstraints.tabTitle"), boxPanel); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(sphereZSamplesLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.sphereZSamplesLabel.text")); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${spherRadialSamples}"), sphereZSamplesSpinner, org.jdesktop.beansbinding.BeanProperty.create("value"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(sphereRadialSamplesLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.sphereRadialSamplesLabel.text")); // NOI18N
+
+        sphereRadialSamplesSpinner.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(10), Integer.valueOf(1), null, Integer.valueOf(1)));
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${sphereZSamples}"), sphereRadialSamplesSpinner, org.jdesktop.beansbinding.BeanProperty.create("value"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(sphereUseEvenSlicesLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.sphereUseEvenSlicesLabel.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(sphereUseEvenSlicesCheckBox, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.sphereUseEvenSlicesCheckBox.text")); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${sphereUseEvenSlices}"), sphereUseEvenSlicesCheckBox, org.jdesktop.beansbinding.BeanProperty.create("selected"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(sphereInteriorCheckBox, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.sphereInteriorCheckBox.text")); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${sphereInterior}"), sphereInteriorCheckBox, org.jdesktop.beansbinding.BeanProperty.create("selected"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(sphereInteriorLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.sphereInteriorLabel.text")); // NOI18N
+
+        sphereRadiusSpinner.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(1.0f), Float.valueOf(0.0f), null, Float.valueOf(0.1f)));
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${sphereRadius}"), sphereRadiusSpinner, org.jdesktop.beansbinding.BeanProperty.create("value"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(sphereRadiusLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.sphereRadiusLabel.text")); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${sphereName}"), sphereNameTextField, org.jdesktop.beansbinding.BeanProperty.create("text"));
+        bindingGroup.addBinding(binding);
+
+        eLProperty = org.jdesktop.beansbinding.ELProperty.create("${modes}");
+        jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, eLProperty, sphereModeComboBox);
+        bindingGroup.addBinding(jComboBoxBinding);
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${sphereMode}"), sphereModeComboBox, org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
+        bindingGroup.addBinding(binding);
+
+        javax.swing.GroupLayout spherePanelLayout = new javax.swing.GroupLayout(spherePanel);
+        spherePanel.setLayout(spherePanelLayout);
+        spherePanelLayout.setHorizontalGroup(
+            spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(spherePanelLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(spherePanelLayout.createSequentialGroup()
+                        .addComponent(sphereNameTextField)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(sphereModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addGroup(spherePanelLayout.createSequentialGroup()
+                        .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(sphereZSamplesLabel)
+                            .addGroup(spherePanelLayout.createSequentialGroup()
+                                .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                                    .addComponent(sphereRadialSamplesLabel)
+                                    .addComponent(sphereRadiusLabel))
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                                    .addComponent(sphereRadiusSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                    .addGroup(spherePanelLayout.createSequentialGroup()
+                                        .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+                                            .addGroup(spherePanelLayout.createSequentialGroup()
+                                                .addComponent(sphereRadialSamplesSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                                                .addComponent(sphereUseEvenSlicesLabel))
+                                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, spherePanelLayout.createSequentialGroup()
+                                                .addComponent(sphereZSamplesSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                                .addGap(144, 144, 144)
+                                                .addComponent(sphereInteriorLabel)))
+                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                        .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                                            .addComponent(sphereInteriorCheckBox)
+                                            .addComponent(sphereUseEvenSlicesCheckBox))))))
+                        .addGap(0, 164, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+        spherePanelLayout.setVerticalGroup(
+            spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(spherePanelLayout.createSequentialGroup()
+                .addGap(18, 18, 18)
+                .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addGroup(spherePanelLayout.createSequentialGroup()
+                        .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                            .addComponent(sphereNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addComponent(sphereModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                        .addGap(4, 4, 4)
+                        .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                            .addComponent(sphereRadialSamplesLabel)
+                            .addComponent(sphereRadialSamplesSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addComponent(sphereUseEvenSlicesLabel)))
+                    .addComponent(sphereUseEvenSlicesCheckBox))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(sphereZSamplesLabel, javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(sphereZSamplesSpinner, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(sphereInteriorLabel, javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(sphereInteriorCheckBox, javax.swing.GroupLayout.Alignment.TRAILING))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(spherePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(sphereRadiusSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(sphereRadiusLabel))
+                .addContainerGap(147, Short.MAX_VALUE))
+        );
+
+        jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.spherePanel.TabConstraints.tabTitle"), spherePanel); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${quadName}"), quadNameTextField, org.jdesktop.beansbinding.BeanProperty.create("text"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(quadWidthLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.quadWidthLabel.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(quadHeightLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.quadHeightLabel.text")); // NOI18N
+
+        quadWidthSpinner.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), Float.valueOf(0.0f), null, Float.valueOf(0.5f)));
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${quadWidth}"), quadWidthSpinner, org.jdesktop.beansbinding.BeanProperty.create("value"));
+        bindingGroup.addBinding(binding);
+
+        quadHeightSpinner.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), Float.valueOf(0.0f), null, Float.valueOf(0.5f)));
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${quadHeight}"), quadHeightSpinner, org.jdesktop.beansbinding.BeanProperty.create("value"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(quadFlipCoordLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.quadFlipCoordLabel.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(quadFlipCoordCheckBox, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.quadFlipCoordCheckBox.text")); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${quadFlipCoords}"), quadFlipCoordCheckBox, org.jdesktop.beansbinding.BeanProperty.create("selected"));
+        bindingGroup.addBinding(binding);
+
+        eLProperty = org.jdesktop.beansbinding.ELProperty.create("${modes}");
+        jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, eLProperty, quadModeComboBox);
+        bindingGroup.addBinding(jComboBoxBinding);
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${quadMode}"), quadModeComboBox, org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
+        bindingGroup.addBinding(binding);
+
+        eLProperty = org.jdesktop.beansbinding.ELProperty.create("${plans}");
+        jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, eLProperty, jComboBox2);
+        bindingGroup.addBinding(jComboBoxBinding);
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${quadPlan}"), jComboBox2, org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
+        bindingGroup.addBinding(binding);
+
+        javax.swing.GroupLayout quadPanelLayout = new javax.swing.GroupLayout(quadPanel);
+        quadPanel.setLayout(quadPanelLayout);
+        quadPanelLayout.setHorizontalGroup(
+            quadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(quadPanelLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(quadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(quadPanelLayout.createSequentialGroup()
+                        .addComponent(quadNameTextField)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(quadModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addGroup(quadPanelLayout.createSequentialGroup()
+                        .addGroup(quadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(quadFlipCoordLabel)
+                            .addGroup(quadPanelLayout.createSequentialGroup()
+                                .addComponent(jComboBox2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addComponent(quadWidthLabel)))
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addGroup(quadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(quadFlipCoordCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addGroup(quadPanelLayout.createSequentialGroup()
+                                .addComponent(quadWidthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                                .addComponent(quadHeightLabel)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addComponent(quadHeightSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                        .addGap(0, 176, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+        quadPanelLayout.setVerticalGroup(
+            quadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(quadPanelLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(quadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(quadNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(quadModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(quadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(quadWidthLabel)
+                    .addComponent(quadWidthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(quadHeightLabel)
+                    .addComponent(quadHeightSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jComboBox2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(quadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(quadFlipCoordLabel)
+                    .addComponent(quadFlipCoordCheckBox))
+                .addContainerGap(166, Short.MAX_VALUE))
+        );
+
+        jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.quadPanel.TabConstraints.tabTitle"), quadPanel); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${lineName}"), lineNameTextField, org.jdesktop.beansbinding.BeanProperty.create("text"));
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(lineStartLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.lineStartLabel.text")); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${lineStart}"), lineStartTextField, org.jdesktop.beansbinding.BeanProperty.create("text_ON_ACTION_OR_FOCUS_LOST"));
+        binding.setConverter(converterVector3f_String);
+        bindingGroup.addBinding(binding);
+
+        org.openide.awt.Mnemonics.setLocalizedText(lineEndLabel, org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.lineEndLabel.text")); // NOI18N
+
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${lineEnd}"), lineEndTextField, org.jdesktop.beansbinding.BeanProperty.create("text_ON_ACTION_OR_FOCUS_LOST"));
+        binding.setConverter(converterVector3f_String);
+        bindingGroup.addBinding(binding);
+
+        eLProperty = org.jdesktop.beansbinding.ELProperty.create("${modes}");
+        jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, eLProperty, jComboBox1);
+        bindingGroup.addBinding(jComboBoxBinding);
+        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, newGeometrySettings, org.jdesktop.beansbinding.ELProperty.create("${lineMode}"), jComboBox1, org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
+        bindingGroup.addBinding(binding);
+
+        javax.swing.GroupLayout linePanelLayout = new javax.swing.GroupLayout(linePanel);
+        linePanel.setLayout(linePanelLayout);
+        linePanelLayout.setHorizontalGroup(
+            linePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(linePanelLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(linePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(linePanelLayout.createSequentialGroup()
+                        .addComponent(lineNameTextField)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addGroup(linePanelLayout.createSequentialGroup()
+                        .addComponent(lineStartLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(lineStartTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(78, 78, 78)
+                        .addComponent(lineEndLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(lineEndTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addGap(0, 169, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+        linePanelLayout.setVerticalGroup(
+            linePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(linePanelLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(linePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(lineNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addGap(1, 1, 1)
+                .addGroup(linePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(lineStartLabel)
+                    .addComponent(lineStartTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(lineEndLabel)
+                    .addComponent(lineEndTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap(203, Short.MAX_VALUE))
+        );
+
+        jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NewGeometrySettingsTopComponent.class, "NewGeometrySettingsTopComponent.linePanel.TabConstraints.tabTitle"), linePanel); // NOI18N
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addComponent(jTabbedPane1)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addComponent(jTabbedPane1, javax.swing.GroupLayout.Alignment.TRAILING)
+        );
+
+        bindingGroup.bind();
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void boxNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_boxNameTextFieldActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_boxNameTextFieldActionPerformed
+
+    private void boxModeComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_boxModeComboBoxActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_boxModeComboBoxActionPerformed
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JComboBox boxModeComboBox;
+    private javax.swing.JTextField boxNameTextField;
+    private javax.swing.JPanel boxPanel;
+    private javax.swing.JLabel boxXLabel;
+    private javax.swing.JSpinner boxXSpinner;
+    private javax.swing.JLabel boxYLabel;
+    private javax.swing.JSpinner boxYSpinner;
+    private javax.swing.JLabel boxZLabel;
+    private javax.swing.JSpinner boxZSpinner;
+    private com.jme3.gde.core.sceneexplorer.nodes.actions.impl.ConverterVector3f_String converterVector3f_String;
+    private javax.swing.JComboBox jComboBox1;
+    private javax.swing.JComboBox jComboBox2;
+    private javax.swing.JTabbedPane jTabbedPane1;
+    private javax.swing.JLabel lineEndLabel;
+    private javax.swing.JTextField lineEndTextField;
+    private javax.swing.JTextField lineNameTextField;
+    private javax.swing.JPanel linePanel;
+    private javax.swing.JLabel lineStartLabel;
+    private javax.swing.JTextField lineStartTextField;
+    private com.jme3.gde.core.sceneexplorer.nodes.actions.impl.NewGeometrySettings newGeometrySettings;
+    private javax.swing.JCheckBox quadFlipCoordCheckBox;
+    private javax.swing.JLabel quadFlipCoordLabel;
+    private javax.swing.JLabel quadHeightLabel;
+    private javax.swing.JSpinner quadHeightSpinner;
+    private javax.swing.JComboBox quadModeComboBox;
+    private javax.swing.JTextField quadNameTextField;
+    private javax.swing.JPanel quadPanel;
+    private javax.swing.JLabel quadWidthLabel;
+    private javax.swing.JSpinner quadWidthSpinner;
+    private javax.swing.JCheckBox sphereInteriorCheckBox;
+    private javax.swing.JLabel sphereInteriorLabel;
+    private javax.swing.JComboBox sphereModeComboBox;
+    private javax.swing.JTextField sphereNameTextField;
+    private javax.swing.JPanel spherePanel;
+    private javax.swing.JLabel sphereRadialSamplesLabel;
+    private javax.swing.JSpinner sphereRadialSamplesSpinner;
+    private javax.swing.JLabel sphereRadiusLabel;
+    private javax.swing.JSpinner sphereRadiusSpinner;
+    private javax.swing.JCheckBox sphereUseEvenSlicesCheckBox;
+    private javax.swing.JLabel sphereUseEvenSlicesLabel;
+    private javax.swing.JLabel sphereZSamplesLabel;
+    private javax.swing.JSpinner sphereZSamplesSpinner;
+    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
+    // End of variables declaration//GEN-END:variables
+    @Override
+    public void componentOpened() { // TODO add custom code on component opening
+        newGeometrySettings.open();
+    }
+
+    @Override
+    public void componentClosed() {
+        newGeometrySettings.close();
+    }
+
+    void writeProperties(java.util.Properties p) {
+        // better to version settings since initial version as advocated at
+        // http://wiki.apidesign.org/wiki/PropertyFiles
+        p.setProperty("version", "1.0");
+        // TODO store your settings
+    }
+
+    void readProperties(java.util.Properties p) {
+        String version = p.getProperty("version");
+        // TODO read your settings according to their version
+    }
+    
+}

+ 57 - 0
sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewGeometrySphereAction.java

@@ -0,0 +1,57 @@
+/*
+ *  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.impl;
+
+import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractNewSpatialAction;
+import com.jme3.gde.core.sceneexplorer.nodes.actions.NewGeometryAction;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+
+/**
+ *
+ * @author david.bernard.31
+ */
[email protected](service = NewGeometryAction.class)
+public class NewGeometrySphereAction extends AbstractNewSpatialAction implements NewGeometryAction {
+
+    public NewGeometrySphereAction() {
+        name = "Sphere";
+    }
+
+    @Override
+    protected Spatial doCreateSpatial(Node parent) {
+        Geometry geom = NewGeometry.sphere(pm);
+        parent.attachChild(geom);
+        return geom;
+    }
+}