|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright (c) 2009-2010 jMonkeyEngine
|
|
|
+ * Copyright (c) 2009-2024 jMonkeyEngine
|
|
|
* All rights reserved.
|
|
|
*
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
@@ -31,6 +31,7 @@
|
|
|
*/
|
|
|
package com.jme3.gde.core.sceneexplorer;
|
|
|
|
|
|
+import com.jme3.gde.core.assets.RefreshJmeSpatial;
|
|
|
import com.jme3.gde.core.icons.IconList;
|
|
|
import com.jme3.gde.core.scene.PreviewRequest;
|
|
|
import com.jme3.gde.core.scene.SceneApplication;
|
|
@@ -48,6 +49,7 @@ import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.logging.Level;
|
|
|
import java.util.logging.Logger;
|
|
|
+import javax.swing.SwingUtilities;
|
|
|
import org.netbeans.api.settings.ConvertAsProperties;
|
|
|
import org.openide.actions.CopyAction;
|
|
|
import org.openide.actions.CutAction;
|
|
@@ -80,8 +82,9 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
// private final Result<AbstractSceneExplorerNode> nodeSelectionResult;
|
|
|
private AbstractSceneExplorerNode selectedSpatial;
|
|
|
private AbstractSceneExplorerNode lastSelected;
|
|
|
- private Map<String, MaterialChangeProvider> materialChangeProviders = new HashMap<String, MaterialChangeProvider>();
|
|
|
- private Map<String, List<MaterialChangeListener>> materialChangeListeners = new HashMap<String, List<MaterialChangeListener>>();
|
|
|
+ private final Map<String, MaterialChangeProvider> materialChangeProviders = new HashMap<>();
|
|
|
+ private final Map<String, List<MaterialChangeListener>> materialChangeListeners = new HashMap<>();
|
|
|
+ private transient ExplorerManager explorerManager = new ExplorerManager();
|
|
|
|
|
|
public SceneExplorerTopComponent() {
|
|
|
initComponents();
|
|
@@ -90,8 +93,6 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
setToolTipText(NbBundle.getMessage(SceneExplorerTopComponent.class, "HINT_SceneExplorerTopComponent"));
|
|
|
setIcon(IconList.jmeLogo.getImage());
|
|
|
associateLookup(ExplorerUtils.createLookup(explorerManager, getActionMap()));
|
|
|
-// nodeSelectionResult = Utilities.actionsGlobalContext().lookupResult(AbstractSceneExplorerNode.class);
|
|
|
-// nodeSelectionResult.addLookupListener(this);
|
|
|
}
|
|
|
|
|
|
private void initActions() {
|
|
@@ -151,7 +152,15 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
if (selectedSpatial == null) {
|
|
|
return;
|
|
|
}
|
|
|
- selectedSpatial.refresh(false);
|
|
|
+ SwingUtilities.invokeLater(() -> {
|
|
|
+ Node rootNode = SceneExplorerTopComponent.findInstance().getExplorerManager().getRootContext();
|
|
|
+ if (rootNode instanceof JmeNode jmeNode) {
|
|
|
+ SceneApplication.getApplication().enqueue(new RefreshJmeSpatial(jmeNode, selectedSpatial.getName()));
|
|
|
+ } else {
|
|
|
+ selectedSpatial.refresh(false);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
}//GEN-LAST:event_jButton1ActionPerformed
|
|
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
|
private javax.swing.JScrollPane explorerScrollPane;
|
|
@@ -164,6 +173,7 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
* only, i.e. deserialization routines; otherwise you could get a
|
|
|
* non-deserialized instance. To obtain the singleton instance, use
|
|
|
* {@link #findInstance}.
|
|
|
+ * @return
|
|
|
*/
|
|
|
public static synchronized SceneExplorerTopComponent getDefault() {
|
|
|
if (instance == null) {
|
|
@@ -175,6 +185,7 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
/**
|
|
|
* Obtain the SceneExplorerTopComponent instance. Never call
|
|
|
* {@link #getDefault} directly!
|
|
|
+ * @return
|
|
|
*/
|
|
|
public static synchronized SceneExplorerTopComponent findInstance() {
|
|
|
TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
|
|
@@ -183,8 +194,8 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
"Cannot find " + PREFERRED_ID + " component. It will not be located properly in the window system.");
|
|
|
return getDefault();
|
|
|
}
|
|
|
- if (win instanceof SceneExplorerTopComponent) {
|
|
|
- return (SceneExplorerTopComponent) win;
|
|
|
+ if (win instanceof SceneExplorerTopComponent sceneExplorerTopComponent) {
|
|
|
+ return sceneExplorerTopComponent;
|
|
|
}
|
|
|
logger.warning(
|
|
|
"There seem to be multiple components with the '" + PREFERRED_ID
|
|
@@ -233,8 +244,8 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
}
|
|
|
|
|
|
private void readPropertiesImpl(java.util.Properties p) {
|
|
|
- String version = p.getProperty("version");
|
|
|
// TODO read your settings according to their version
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -246,7 +257,6 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
public UndoRedo getUndoRedo() {
|
|
|
return Lookup.getDefault().lookup(UndoRedo.class);
|
|
|
}
|
|
|
- private transient ExplorerManager explorerManager = new ExplorerManager();
|
|
|
|
|
|
@Override
|
|
|
public ExplorerManager getExplorerManager() {
|
|
@@ -266,26 +276,15 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
explorerManager.setSelectedNodes(new Node[]{});
|
|
|
// setActivatedNodes(new Node[]{});
|
|
|
}
|
|
|
- } catch (Exception ex) {
|
|
|
+ } catch (PropertyVetoException ex) {
|
|
|
Exceptions.printStackTrace(ex);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// public void resultChanged(LookupEvent ev) {
|
|
|
-// Collection collection = nodeSelectionResult.allInstances();
|
|
|
-// for (Iterator it = collection.iterator(); it.hasNext();) {
|
|
|
-// Object object = it.next();
|
|
|
-// if (object instanceof AbstractSceneExplorerNode) {
|
|
|
-// return;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// selectedSpatial = null;
|
|
|
-// }
|
|
|
@Override
|
|
|
public void sceneOpened(SceneRequest request) {
|
|
|
final JmeNode node = request.getJmeNode();
|
|
|
- for (Iterator it = materialChangeProviders.values().iterator(); it.hasNext();) {
|
|
|
- MaterialChangeProvider provider = (MaterialChangeProvider) it.next();
|
|
|
+ for (MaterialChangeProvider provider : materialChangeProviders.values()) {
|
|
|
provider.clearMaterialChangeListeners();
|
|
|
}
|
|
|
if (node != null) {
|
|
@@ -339,7 +338,7 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
logger.log(Level.FINE, "New material listener for : {0}", listener.getKey());
|
|
|
List<MaterialChangeListener> listeners = materialChangeListeners.get(listener.getKey());
|
|
|
if (listeners == null) {
|
|
|
- listeners = new ArrayList<MaterialChangeListener>();
|
|
|
+ listeners = new ArrayList<>();
|
|
|
materialChangeListeners.put(listener.getKey(), listeners);
|
|
|
}
|
|
|
listeners.add(listener);
|
|
@@ -383,7 +382,7 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
// assert newKey.equals(listener.getKey());
|
|
|
List<MaterialChangeListener> listeners = materialChangeListeners.get(newKey);
|
|
|
if (listeners == null) {
|
|
|
- listeners = new ArrayList<MaterialChangeListener>();
|
|
|
+ listeners = new ArrayList<>();
|
|
|
materialChangeListeners.put(newKey, listeners);
|
|
|
}
|
|
|
listeners.add(listener);
|
|
@@ -397,6 +396,7 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|
|
|
|
|
/**
|
|
|
* Terrain has a LOD control that requires the camera to function.
|
|
|
+ * @param jmeRootNode
|
|
|
*/
|
|
|
protected void setTerrainLodCamera(JmeNode jmeRootNode) {
|
|
|
Camera camera = SceneApplication.getApplication().getCamera();
|