|
@@ -46,16 +46,21 @@ import com.jme3.gde.core.sceneexplorer.nodes.actions.impl.tracks.EffectTrackWiza
|
|
|
import java.awt.Image;
|
|
|
import java.awt.event.ActionEvent;
|
|
|
import java.awt.event.ActionListener;
|
|
|
+import java.beans.PropertyChangeEvent;
|
|
|
import java.io.IOException;
|
|
|
import java.util.concurrent.Callable;
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
import javax.swing.Action;
|
|
|
import javax.swing.JOptionPane;
|
|
|
+import org.openide.actions.DeleteAction;
|
|
|
+import org.openide.actions.RenameAction;
|
|
|
import org.openide.awt.Actions;
|
|
|
import org.openide.loaders.DataObject;
|
|
|
import org.openide.nodes.Node;
|
|
|
+import org.openide.nodes.NodeAdapter;
|
|
|
import org.openide.nodes.Sheet;
|
|
|
import org.openide.util.Exceptions;
|
|
|
+import org.openide.util.actions.SystemAction;
|
|
|
|
|
|
/**
|
|
|
*
|
|
@@ -88,8 +93,18 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
|
|
|
children.setAnimControl(jmeControl);
|
|
|
icon = IconList.animation.getImage();
|
|
|
|
|
|
+ addNodeListener(new NodeAdapter(){
|
|
|
+ @Override
|
|
|
+ public void propertyChange(PropertyChangeEvent evt) {
|
|
|
+ if(evt.getPropertyName().equalsIgnoreCase("name")){
|
|
|
+ doRenameAnimation((String) evt.getOldValue(),(String)evt.getNewValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+
|
|
|
@Override
|
|
|
public Image getIcon(int type) {
|
|
|
return icon;
|
|
@@ -151,6 +166,8 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
|
|
|
|
|
|
return new Action[]{Actions.alwaysEnabled(new PlayAction(), playing ? "Stop" : "Play", "", false),
|
|
|
Actions.alwaysEnabled(new PlayBackParamsAction(), "Playback parameters", "", false),
|
|
|
+ SystemAction.get(RenameAction.class),
|
|
|
+ SystemAction.get(DeleteAction.class),
|
|
|
Actions.alwaysEnabled(new EffectTrackWizardAction(jmeControl.getLookup().lookup(AnimControl.class).getSpatial(), this), "Add Effect Track", "", false),
|
|
|
Actions.alwaysEnabled(new AudioTrackWizardAction(jmeControl.getLookup().lookup(AnimControl.class).getSpatial(), this), "Add Audio Track", "", false),
|
|
|
Actions.alwaysEnabled(new ExtractAnimationAction(), "Extract sub-animation", "", true)
|
|
@@ -159,7 +176,7 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
|
|
|
|
|
|
@Override
|
|
|
public boolean canDestroy() {
|
|
|
- return false;
|
|
|
+ return !jmeControl.readOnly;
|
|
|
}
|
|
|
|
|
|
public void stop() {
|
|
@@ -169,22 +186,25 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
|
|
|
|
|
|
@Override
|
|
|
public void destroy() throws IOException {
|
|
|
-// super.destroy();
|
|
|
-// final Spatial spat = getParentNode().getLookup().lookup(Spatial.class);
|
|
|
-// try {
|
|
|
-// SceneApplication.getApplication().enqueue(new Callable<Void>() {
|
|
|
-//
|
|
|
-// public Void call() throws Exception {
|
|
|
-// spat.removeControl(skeletonControl);
|
|
|
-// return null;
|
|
|
-// }
|
|
|
-// }).get();
|
|
|
-// ((AbstractSceneExplorerNode) getParentNode()).refresh(true);
|
|
|
-// } catch (InterruptedException ex) {
|
|
|
-// Exceptions.printStackTrace(ex);
|
|
|
-// } catch (ExecutionException ex) {
|
|
|
-// Exceptions.printStackTrace(ex);
|
|
|
-// }
|
|
|
+ super.destroy();
|
|
|
+ final AnimControl control = jmeControl.getLookup().lookup(AnimControl.class);
|
|
|
+ try {
|
|
|
+ lookupContents.remove(JmeAnimation.this.animation);
|
|
|
+ lookupContents.remove(this);
|
|
|
+ SceneApplication.getApplication().enqueue(new Callable<Void>() {
|
|
|
+ public Void call() throws Exception {
|
|
|
+ control.removeAnim(JmeAnimation.this.animation);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }).get();
|
|
|
+ jmeControl.refreshChildren();
|
|
|
+ setChanged();
|
|
|
+ } catch (InterruptedException ex) {
|
|
|
+ Exceptions.printStackTrace(ex);
|
|
|
+ } catch (ExecutionException ex) {
|
|
|
+ Exceptions.printStackTrace(ex);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -405,4 +425,40 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
|
|
|
// ((JmeTrackChildren) getChildren()).refreshChildren(false);
|
|
|
// }
|
|
|
// }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean canRename() {
|
|
|
+ return !jmeControl.readOnly;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * renames the animation in the opengl thread.
|
|
|
+ * Note that renaming an animation mean to delete the old one and create a
|
|
|
+ * new anim with the new name and the old data
|
|
|
+ * @param evt
|
|
|
+ */
|
|
|
+ protected void doRenameAnimation(final String oldName,final String newName) {
|
|
|
+ final AnimControl control = jmeControl.getLookup().lookup(AnimControl.class);
|
|
|
+ try {
|
|
|
+ lookupContents.remove(JmeAnimation.this.animation);
|
|
|
+ JmeAnimation.this.animation = SceneApplication.getApplication().enqueue(new Callable<Animation>() {
|
|
|
+ public Animation call() throws Exception {
|
|
|
+
|
|
|
+ Animation anim = control.getAnim(oldName);
|
|
|
+ Animation newAnim = new Animation(newName, anim.getLength());
|
|
|
+ newAnim.setTracks(anim.getTracks());
|
|
|
+ control.removeAnim(anim);
|
|
|
+ control.addAnim(newAnim);
|
|
|
+ return newAnim;
|
|
|
+ }
|
|
|
+ }).get();
|
|
|
+ lookupContents.add(JmeAnimation.this.animation);
|
|
|
+ setChanged();
|
|
|
+ } catch (InterruptedException ex) {
|
|
|
+ Exceptions.printStackTrace(ex);
|
|
|
+ } catch (ExecutionException ex) {
|
|
|
+ Exceptions.printStackTrace(ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|