Browse Source

Added proper undo/redo support in the shader editor

Nehon 10 years ago
parent
commit
4b0c6191d3

+ 2 - 5
jme3-materialeditor/src/com/jme3/gde/materialdefinition/MatDefDataObject.java

@@ -37,7 +37,6 @@ import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
 import java.io.IOException;
 import javax.swing.JEditorPane;
-import javax.swing.text.EditorKit;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.core.spi.multiview.MultiViewElement;
@@ -54,7 +53,6 @@ import org.openide.loaders.DataObject;
 import org.openide.loaders.DataObjectExistsException;
 import org.openide.loaders.MultiDataObject;
 import org.openide.loaders.MultiFileLoader;
-import org.openide.text.CloneableEditorSupport;
 import org.openide.util.Lookup;
 import org.openide.util.NbBundle.Messages;
 import org.openide.util.lookup.AbstractLookup;
@@ -225,7 +223,7 @@ public class MatDefDataObject extends MultiDataObject {
             @Override
             public void componentActivated() {
                 super.componentActivated();
-                getEditorPane().addKeyListener(listener);
+                getEditorPane().addKeyListener(listener);                
             }
 
             @Override
@@ -243,8 +241,7 @@ public class MatDefDataObject extends MultiDataObject {
                 obj.unload();
             }
         };
-
-
+        obj.getLookupContents().add(ed);
         return ed;
     }
 

+ 3 - 2
jme3-materialeditor/src/com/jme3/gde/materialdefinition/editor/MatDefEditorlElement.java

@@ -69,6 +69,7 @@ import javax.swing.JToolBar;
 import org.netbeans.core.spi.multiview.CloseOperationState;
 import org.netbeans.core.spi.multiview.MultiViewElement;
 import org.netbeans.core.spi.multiview.MultiViewElementCallback;
+import org.netbeans.core.spi.multiview.text.MultiViewEditorElement;
 import org.openide.awt.UndoRedo;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
@@ -99,7 +100,7 @@ public final class MatDefEditorlElement extends JPanel implements MultiViewEleme
     InstanceContent content;
     Selectable prevNode;
     MatDefMetaData metaData;
-
+    
     public MatDefEditorlElement(final Lookup lkp) {
         initComponents();
         obj = lkp.lookup(MatDefDataObject.class);
@@ -433,7 +434,7 @@ public final class MatDefEditorlElement extends JPanel implements MultiViewEleme
 
     @Override
     public UndoRedo getUndoRedo() {
-        return UndoRedo.NONE;
+        return obj.getLookup().lookup(MultiViewEditorElement.class).getUndoRedo();
     }
 
     @Override

+ 13 - 6
jme3-materialeditor/src/com/jme3/gde/materialdefinition/editor/ShaderEditPanel.java

@@ -16,6 +16,7 @@ import java.util.List;
 import javax.swing.JPanel;
 import javax.swing.JToggleButton;
 import javax.swing.text.EditorKit;
+import org.openide.awt.UndoRedo;
 import org.openide.cookies.EditorCookie;
 import org.openide.filesystems.FileLock;
 import org.openide.filesystems.FileObject;
@@ -32,6 +33,7 @@ public class ShaderEditPanel extends JPanel {
 
     private DataObject currentDataObject = null;
     private MatDefEditorlElement parent = null;
+    private UndoRedo.Manager undoRedoManager;
 
     /**
      * Creates new form ShaderEditPanel
@@ -48,9 +50,9 @@ public class ShaderEditPanel extends JPanel {
             public void keyTyped(KeyEvent e) {
             }
 
-            public void keyPressed(KeyEvent e) {                
+            public void keyPressed(KeyEvent e) {                               
                 if ((e.getKeyCode() == KeyEvent.VK_S) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
-                    saveCurrent();
+                    saveCurrent();                    
                 }
             }
 
@@ -61,6 +63,7 @@ public class ShaderEditPanel extends JPanel {
 
     public void setParent(MatDefEditorlElement parent) {
         this.parent = parent;
+        undoRedoManager = (UndoRedo.Manager)parent.getUndoRedo();
     }
 
     public void setFiles(String title, NodePanel.NodeType type, List<FileObject> fos) {
@@ -72,7 +75,7 @@ public class ShaderEditPanel extends JPanel {
             buttonGroup1.remove((JToggleButton) component);
         }
         buttonPanel.removeAll();
-        buttonPanel.repaint();
+        buttonPanel.repaint();        
 
         for (FileObject fo : fos) {
             final Tab b = new Tab();
@@ -83,8 +86,10 @@ public class ShaderEditPanel extends JPanel {
                 b.addActionListener(new ActionListener() {
                     public void actionPerformed(ActionEvent e) {
                         saveCurrent();
-                        try {
-                            shaderEditorPane.setDocument(b.dataObject.getLookup().lookup(EditorCookie.class).openDocument());                    
+                        try {                            
+                            shaderEditorPane.setDocument(b.dataObject.getLookup().lookup(EditorCookie.class).openDocument());   
+                            undoRedoManager.discardAllEdits();
+                            shaderEditorPane.getDocument().addUndoableEditListener(undoRedoManager);
                         } catch (IOException ex) {
                             Exceptions.printStackTrace(ex);
                         }
@@ -94,6 +99,8 @@ public class ShaderEditPanel extends JPanel {
                 });
                 if (firstItem) {
                     shaderEditorPane.setDocument(b.dataObject.getLookup().lookup(EditorCookie.class).openDocument());                    
+                    undoRedoManager.discardAllEdits();
+                    shaderEditorPane.getDocument().addUndoableEditListener(undoRedoManager);                    
                     currentDataObject = b.dataObject;
                     b.setSelected(true);
                     firstItem = false;                    
@@ -224,7 +231,7 @@ public class ShaderEditPanel extends JPanel {
 
     private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed
         setVisible(false);
-
+        shaderEditorPane.getDocument().removeUndoableEditListener(undoRedoManager);
         saveCurrent();