diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form
index ce8c5f718..59c555ca7 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form
@@ -13,7 +13,7 @@
-
+
@@ -96,7 +96,7 @@
-
+
@@ -169,7 +169,7 @@
-
+
@@ -245,7 +245,7 @@
-
+
@@ -262,7 +262,7 @@
-
+
@@ -395,7 +395,7 @@
-
+
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
index b7f15d9fd..68fa17bc5 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
@@ -39,6 +39,7 @@ import com.jme3.gde.core.scene.SceneListener;
import com.jme3.gde.core.scene.SceneRequest;
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
+import com.jme3.gde.core.sceneexplorer.nodes.JmeTerrainQuad;
import com.jme3.gde.core.sceneexplorer.nodes.NodeUtility;
import com.jme3.gde.core.sceneexplorer.nodes.properties.TexturePropertyEditor;
import com.jme3.gde.core.util.DataObjectSaveNode;
@@ -53,6 +54,9 @@ import com.jme3.texture.Texture;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeListenerProxy;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
@@ -78,6 +82,9 @@ import jme3tools.converters.ImageToAwt;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.progress.ProgressHandleFactory;
import org.openide.loaders.DataObjectNotFoundException;
+import org.openide.nodes.NodeEvent;
+import org.openide.nodes.NodeMemberEvent;
+import org.openide.nodes.NodeReorderEvent;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
@@ -89,6 +96,7 @@ import org.openide.NotifyDescriptor.Confirmation;
import org.openide.WizardDescriptor;
import org.openide.cookies.SaveCookie;
import org.openide.loaders.DataObject;
+import org.openide.nodes.NodeListener;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup.Result;
@@ -117,6 +125,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private CreateTerrainWizardAction terrainWizard;
private SkyboxWizardAction skyboxWizard;
private JmeSpatial selectedSpat;
+ private TerrainNodeListener terrainDeletedNodeListener;
public enum TerrainEditButton {none, raiseTerrain, lowerTerrain, smoothTerrain, levelTerrain, paintTerrain, eraseTerrain};
@@ -761,7 +770,8 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
reinitTextureTable(); // update the UI
refreshSelected();
-
+
+ createTerrainButton.setEnabled(false); // only let the user add one terrain
}
public void generateSkybox(WizardDescriptor wiz) {
@@ -817,9 +827,35 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private void selectSpatial(JmeSpatial spatial) {
selectedSpat = spatial;
+ if (selectedSpat instanceof JmeTerrainQuad) { //TODO shouldn't be terrainQuad, should be a generic JmeTerrain
+ selectedSpat.removeNodeListener(terrainDeletedNodeListener); // remove it if it exists, no way to check if it is there already
+ selectedSpat.addNodeListener(terrainDeletedNodeListener); // add it back
+ }
}
+ /**
+ * When the terrain is deleted, enable the 'add terrain' button again
+ * and reinitialize the texture table
+ */
+ private class TerrainNodeListener implements NodeListener {
+ public void childrenAdded(NodeMemberEvent nme) {
+ }
+
+ public void childrenRemoved(NodeMemberEvent nme) {
+ }
+ public void childrenReordered(NodeReorderEvent nre) {
+ }
+
+ public void nodeDestroyed(NodeEvent ne) {
+ createTerrainButton.setEnabled(true);
+ reinitTextureTable();
+ }
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ }
+
+ }
/*
*
@@ -923,6 +959,8 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
request.setWindowTitle("TerrainEditor - " + manager.getRelativeAssetPath(file.getPrimaryFile().getPath()));
request.setToolNode(new Node("TerrainEditorToolNode"));
SceneApplication.getApplication().requestScene(request);
+
+ terrainDeletedNodeListener = new TerrainNodeListener();
}
// run on GL thread
@@ -955,8 +993,8 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
toolController.cleanup();
}
- for (int i=0; i