11/*
2- * Copyright (c) 2009-2010 jMonkeyEngine
2+ * Copyright (c) 2009-2024 jMonkeyEngine
33 * All rights reserved.
44 *
55 * Redistribution and use in source and binary forms, with or without
3131 */
3232package com .jme3 .gde .core .sceneexplorer ;
3333
34+ import com .jme3 .gde .core .assets .RefreshJmeSpatial ;
3435import com .jme3 .gde .core .icons .IconList ;
3536import com .jme3 .gde .core .scene .PreviewRequest ;
3637import com .jme3 .gde .core .scene .SceneApplication ;
4849import java .util .Map ;
4950import java .util .logging .Level ;
5051import java .util .logging .Logger ;
52+ import javax .swing .SwingUtilities ;
5153import org .netbeans .api .settings .ConvertAsProperties ;
5254import org .openide .actions .CopyAction ;
5355import org .openide .actions .CutAction ;
@@ -80,8 +82,9 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
8082// private final Result<AbstractSceneExplorerNode> nodeSelectionResult;
8183 private AbstractSceneExplorerNode selectedSpatial ;
8284 private AbstractSceneExplorerNode lastSelected ;
83- private Map <String , MaterialChangeProvider > materialChangeProviders = new HashMap <String , MaterialChangeProvider >();
84- private Map <String , List <MaterialChangeListener >> materialChangeListeners = new HashMap <String , List <MaterialChangeListener >>();
85+ private final Map <String , MaterialChangeProvider > materialChangeProviders = new HashMap <>();
86+ private final Map <String , List <MaterialChangeListener >> materialChangeListeners = new HashMap <>();
87+ private transient ExplorerManager explorerManager = new ExplorerManager ();
8588
8689 public SceneExplorerTopComponent () {
8790 initComponents ();
@@ -90,8 +93,6 @@ public SceneExplorerTopComponent() {
9093 setToolTipText (NbBundle .getMessage (SceneExplorerTopComponent .class , "HINT_SceneExplorerTopComponent" ));
9194 setIcon (IconList .jmeLogo .getImage ());
9295 associateLookup (ExplorerUtils .createLookup (explorerManager , getActionMap ()));
93- // nodeSelectionResult = Utilities.actionsGlobalContext().lookupResult(AbstractSceneExplorerNode.class);
94- // nodeSelectionResult.addLookupListener(this);
9596 }
9697
9798 private void initActions () {
@@ -151,7 +152,15 @@ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRS
151152 if (selectedSpatial == null ) {
152153 return ;
153154 }
154- selectedSpatial .refresh (false );
155+ SwingUtilities .invokeLater (() -> {
156+ Node rootNode = SceneExplorerTopComponent .findInstance ().getExplorerManager ().getRootContext ();
157+ if (rootNode instanceof JmeNode jmeNode ) {
158+ SceneApplication .getApplication ().enqueue (new RefreshJmeSpatial (jmeNode , selectedSpatial .getName ()));
159+ } else {
160+ selectedSpatial .refresh (false );
161+ }
162+ });
163+
155164 }//GEN-LAST:event_jButton1ActionPerformed
156165 // Variables declaration - do not modify//GEN-BEGIN:variables
157166 private javax .swing .JScrollPane explorerScrollPane ;
@@ -164,6 +173,7 @@ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRS
164173 * only, i.e. deserialization routines; otherwise you could get a
165174 * non-deserialized instance. To obtain the singleton instance, use
166175 * {@link #findInstance}.
176+ * @return
167177 */
168178 public static synchronized SceneExplorerTopComponent getDefault () {
169179 if (instance == null ) {
@@ -175,6 +185,7 @@ public static synchronized SceneExplorerTopComponent getDefault() {
175185 /**
176186 * Obtain the SceneExplorerTopComponent instance. Never call
177187 * {@link #getDefault} directly!
188+ * @return
178189 */
179190 public static synchronized SceneExplorerTopComponent findInstance () {
180191 TopComponent win = WindowManager .getDefault ().findTopComponent (PREFERRED_ID );
@@ -183,8 +194,8 @@ public static synchronized SceneExplorerTopComponent findInstance() {
183194 "Cannot find " + PREFERRED_ID + " component. It will not be located properly in the window system." );
184195 return getDefault ();
185196 }
186- if (win instanceof SceneExplorerTopComponent ) {
187- return ( SceneExplorerTopComponent ) win ;
197+ if (win instanceof SceneExplorerTopComponent sceneExplorerTopComponent ) {
198+ return sceneExplorerTopComponent ;
188199 }
189200 logger .warning (
190201 "There seem to be multiple components with the '" + PREFERRED_ID
@@ -233,8 +244,8 @@ Object readProperties(java.util.Properties p) {
233244 }
234245
235246 private void readPropertiesImpl (java .util .Properties p ) {
236- String version = p .getProperty ("version" );
237247 // TODO read your settings according to their version
248+
238249 }
239250
240251 @ Override
@@ -246,7 +257,6 @@ protected String preferredID() {
246257 public UndoRedo getUndoRedo () {
247258 return Lookup .getDefault ().lookup (UndoRedo .class );
248259 }
249- private transient ExplorerManager explorerManager = new ExplorerManager ();
250260
251261 @ Override
252262 public ExplorerManager getExplorerManager () {
@@ -266,26 +276,15 @@ public void setSelectedNode(AbstractSceneExplorerNode node) {
266276 explorerManager .setSelectedNodes (new Node []{});
267277// setActivatedNodes(new Node[]{});
268278 }
269- } catch (Exception ex ) {
279+ } catch (PropertyVetoException ex ) {
270280 Exceptions .printStackTrace (ex );
271281 }
272282 }
273283
274- // public void resultChanged(LookupEvent ev) {
275- // Collection collection = nodeSelectionResult.allInstances();
276- // for (Iterator it = collection.iterator(); it.hasNext();) {
277- // Object object = it.next();
278- // if (object instanceof AbstractSceneExplorerNode) {
279- // return;
280- // }
281- // }
282- // selectedSpatial = null;
283- // }
284284 @ Override
285285 public void sceneOpened (SceneRequest request ) {
286286 final JmeNode node = request .getJmeNode ();
287- for (Iterator it = materialChangeProviders .values ().iterator (); it .hasNext ();) {
288- MaterialChangeProvider provider = (MaterialChangeProvider ) it .next ();
287+ for (MaterialChangeProvider provider : materialChangeProviders .values ()) {
289288 provider .clearMaterialChangeListeners ();
290289 }
291290 if (node != null ) {
@@ -339,7 +338,7 @@ public void addMaterialChangeListener(MaterialChangeListener listener) {
339338 logger .log (Level .FINE , "New material listener for : {0}" , listener .getKey ());
340339 List <MaterialChangeListener > listeners = materialChangeListeners .get (listener .getKey ());
341340 if (listeners == null ) {
342- listeners = new ArrayList <MaterialChangeListener >();
341+ listeners = new ArrayList <>();
343342 materialChangeListeners .put (listener .getKey (), listeners );
344343 }
345344 listeners .add (listener );
@@ -383,7 +382,7 @@ public void swapMaterialChangeListener(MaterialChangeListener listener, String o
383382 // assert newKey.equals(listener.getKey());
384383 List <MaterialChangeListener > listeners = materialChangeListeners .get (newKey );
385384 if (listeners == null ) {
386- listeners = new ArrayList <MaterialChangeListener >();
385+ listeners = new ArrayList <>();
387386 materialChangeListeners .put (newKey , listeners );
388387 }
389388 listeners .add (listener );
@@ -397,6 +396,7 @@ public void swapMaterialChangeListener(MaterialChangeListener listener, String o
397396
398397 /**
399398 * Terrain has a LOD control that requires the camera to function.
399+ * @param jmeRootNode
400400 */
401401 protected void setTerrainLodCamera (JmeNode jmeRootNode ) {
402402 Camera camera = SceneApplication .getApplication ().getCamera ();
0 commit comments