From 79d0f9a45d36656051a77a7b0837aa0318f81ee5 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 09 Jun 2019 11:23:18 -0400
Subject: [PATCH] Undo/redo

---
 ObjEditor.java   |  103 ++++++++++++++++++++++++++++++++++
 GroupEditor.java |   32 ++++++++--
 2 files changed, 129 insertions(+), 6 deletions(-)

diff --git a/GroupEditor.java b/GroupEditor.java
index acdf1fc..5d4b4bf 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -154,6 +154,11 @@
 		oe.menuBar.add(menu = new Menu("Edit"));
 		//editItem = menu.add(new MenuItem("Edit"));
 		//editItem.addActionListener(this);
+		undoItem = menu.add(new MenuItem("Undo"));
+		undoItem.addActionListener(this);
+		redoItem = menu.add(new MenuItem("Redo"));
+		redoItem.addActionListener(this);
+		menu.add("-");
 		duplicateItem = menu.add(new MenuItem("Duplicate"));
 		duplicateItem.addActionListener(this);
 		cloneItem = menu.add(new MenuItem("Clone"));
@@ -197,7 +202,7 @@
         //zBufferItem.addActionListener(this);
         //cameraMenu.add(normalLensItem = new MenuItem("Normal Lens"));
         //normalLensItem.addActionListener(this);
-        cameraMenu.add(revertCameraItem = new MenuItem("Revert Camera"));
+        cameraMenu.add(revertCameraItem = new MenuItem("Restore Camera"));
         revertCameraItem.addActionListener(this);
         
         cameraMenu.add(toggleFullScreenItem = new CheckboxMenuItem("Full Screen"));
@@ -261,7 +266,7 @@
 //		animationItem.addItemListener(this);
 //                    animationItem.setState(CameraPane.ANIMATION);
         cameraMenu.add("-");
-        cameraMenu.add(editCameraItem = new MenuItem("Freeze Camera"));
+        cameraMenu.add(editCameraItem = new MenuItem("Save Camera"));
         editCameraItem.addActionListener(this);
         
         if (Globals.ADVANCED)
@@ -2004,6 +2009,14 @@
 		if (source == cutItem || source == clearButton)
 		{
 			loadClipboard(true);
+		} else
+		if (source == undoItem)
+		{
+			Undo();
+		} else
+		if (source == redoItem)
+		{
+			Redo();
 		} else
 		if (source == duplicateItem)
 		{
@@ -4297,14 +4310,19 @@
 			
                         objEditor.SetText(); // jan 2014
                         
-			if (flashIt && !Globals.isLIVE() && tps != null && tps.length > 0 && !(((Object3D) tps[0].getLastPathComponent()) instanceof Camera))
+                        Object3D object = (Object3D) tps[0].getLastPathComponent();
+                        
+			if (flashIt && !Globals.isLIVE() && tps != null && tps.length > 0 && !(object instanceof Camera))
 				CameraPane.flash = true;
                         
-			if (tps != null && tps.length > 0 && ((Object3D) tps[0].getLastPathComponent()) instanceof Camera)
+			if (tps != null && tps.length > 0 && object instanceof Camera)
                             // a camera
                         {
-                            CameraPane.camerachangeframe = 0; // don't refuse it
-                            Globals.theRenderer.SetCamera((Camera) tps[0].getLastPathComponent());
+                            if (object != Globals.theRenderer.LightCamera())
+                            {
+                                CameraPane.camerachangeframe = 0; // don't refuse it
+                                Globals.theRenderer.SetCamera((Camera) tps[0].getLastPathComponent());
+                            }
                          //   Globals.theRenderer.renderCamera = Globals.theRenderer.manipCamera;
                          //   Globals.theRenderer.eyeCamera = Globals.theRenderer.manipCamera;
                         }
@@ -5145,6 +5163,8 @@
 	private MenuItem lookFromItem;
 	private MenuItem switchItem;
 	private MenuItem cutItem;
+	private MenuItem undoItem;
+	private MenuItem redoItem;
 	private MenuItem duplicateItem;
 	private MenuItem cloneItem;
 	private MenuItem cloneSupportItem;
diff --git a/ObjEditor.java b/ObjEditor.java
index 1edfe37..05b548c 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -3207,10 +3207,112 @@
         {
             copy.remove(1);
         }
+        
         ResetModel();
         objEditor.refreshContents();
     }
     
+    Object3D graphs[] = new Object3D[10000];
+    int undoindex = 0;
+    
+    static public Object clone(Object o)
+    {
+        try
+        {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ObjectOutputStream out = new ObjectOutputStream(baos);
+
+            out.writeObject(o);
+
+            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(bais);
+            Object obj = in.readObject();
+            in.close();
+            out.close();
+            return obj;
+        } catch (Exception e)
+        {
+            System.err.println(e);
+            return null;
+        }
+    }
+
+    public void Save()
+    {
+        if (true) return;
+        
+        //EditorFrame.m_MainFrame.requestFocusInWindow();
+        graphs[undoindex++] = (Object3D)clone(copy);
+
+        for (int i = undoindex; i < graphs.length; i++)
+        {
+            graphs[i] = null;
+        }
+
+        // test save
+        if (false)
+        {
+            try
+            {
+                FileOutputStream ostream = new FileOutputStream("save" + undoindex);
+                ObjectOutputStream p = new ObjectOutputStream(ostream);
+
+                p.writeObject(copy);
+                
+                p.flush();
+
+                ostream.close();
+            } catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public void Undo()
+    {
+        if (undoindex == 0)
+        {
+            java.awt.Toolkit.getDefaultToolkit().beep();
+            return;
+        }
+
+        if (graphs[undoindex] == null)
+        {
+            Save();
+            undoindex -= 1;
+        }
+
+        undoindex -= 1;
+
+        copy = graphs[undoindex];
+        
+        cameraView.object = copy;
+        copy.Touch();
+        
+        ResetModel();
+        refreshContents();
+    }
+
+    public void Redo()
+    {
+        if (graphs[undoindex + 1] == null)
+        {
+            java.awt.Toolkit.getDefaultToolkit().beep();
+            return;
+        }
+
+        undoindex += 1;
+
+        copy = graphs[undoindex];
+
+        cameraView.object = copy;
+        copy.Touch();
+        
+        ResetModel();
+        refreshContents();
+    }
+
         void ImportGFD()
         {
             FileDialog browser = new FileDialog(objEditor.frame, "Import GrafreeD", FileDialog.LOAD);
@@ -3855,6 +3957,7 @@
 
     void makeSomething(Object3D thing, boolean resetmodel) // deselect)
     {
+        Save();
         //Tween.set(thing, 0).target(1).start(tweenManager);
         //Tween.to(thing, 0, 0.5f).target(0).start(tweenManager);
 //            if (thing instanceof GenericJointDemo)

--
Gitblit v1.6.2