Browse Source

Adds Load&Save of HolonStructure

+ Delete a Holon Object updates the Holon Structure too.
Tom Troppmann 2 years ago
parent
commit
d3afb444ee

+ 21 - 0
src/classes/Holon.java

@@ -21,6 +21,7 @@ public class Holon {
 	}
 	public Holon(HolonObject object) {
 		holonObject = object;
+		object.holon = this;
 		name = object.getName();
 		elements.addAll(object.getElements());
 		for(HolonElement ele : elements) {
@@ -70,6 +71,11 @@ public class Holon {
 	public Holon getParent() {
 		return parent;
 	}
+	public HolonObject getHolonObject() {
+		return holonObject;
+	}
+	
+	
 	
 	public List<Holon> getChildView(){
 		return Collections.unmodifiableList(childHolons);
@@ -84,6 +90,20 @@ public class Holon {
 		return name;
 	}
 
+	public void reassignAllChildren(Holon other) {
+		for(Holon child: this.childHolons) {
+			other.addChild(child);
+		}
+	}
+	
+	
+	public void removeAllRefrences() {
+		parent = null;
+		this.childHolons.clear();
+		this.elements.clear();
+		holonObject = null;
+	}
+	
 	
 	
 	public int getLayer() {
@@ -91,6 +111,7 @@ public class Holon {
 	}
 	
 	
+	
 	public Holon cloneWithoutParent() {
 		Holon cloned = new Holon(this.name);
 		cloned.childHolons = this.childHolons;

+ 1 - 1
src/classes/HolonObject.java

@@ -17,7 +17,7 @@ import java.util.ArrayList;
 public class HolonObject extends AbstractCanvasObject { 
     /* Array of all consumers */
     private ArrayList<HolonElement> elements = new ArrayList<HolonElement>();
-    
+    public Holon holon;
     
     
     

+ 16 - 1
src/ui/controller/CanvasController.java

@@ -52,8 +52,8 @@ public class CanvasController {
 		if(object instanceof HolonObject) {
 			Holon holon = new Holon((HolonObject)object);
 			model.getStateHolon().addChild(holon);
-			//model.getStateHolon().addHolonObject(((HolonObject) object));
 		}
+		
 		/**
 		 * check if we should drag & drop replace
 		 */
@@ -143,8 +143,23 @@ public class CanvasController {
 		mpC.decIdx(obj.getId(), model.getCvsObjIdx());
 		model.getCvsObjIdx().remove(obj.getId());
 		model.getObjectsOnCanvas().remove(obj);
+		if(obj instanceof HolonObject) {
+			HolonObject holonObject  = (HolonObject) obj;
+			removeHolon(holonObject.holon);
+			holonObject.holon = null;
+		}
+		
 		notifyObjListeners();
 	}
+	
+	public void removeHolon(Holon holon) {
+		if(holon == null) {
+			return;
+		}
+		holon.removeFromParent();
+		holon.reassignAllChildren(model.getStateHolon());
+		holon.removeAllRefrences();
+	}
 
 	/**
      * Replaces {@code toBeReplaced} by {@code by} on the canvas

+ 1 - 1
src/ui/controller/Control.java

@@ -296,7 +296,7 @@ public class Control {
      * @param obj  AbstractCpsObject
      * @param save
      */
-    public void delCanvasObject(AbstractCanvasObject obj, boolean save) {
+    public void deleteCanvasObject(AbstractCanvasObject obj, boolean save) {
         canvasController.deleteObjectOnCanvas(obj);
         if (obj instanceof GroupNode) {
         	canvasController.bfsNodeCleaner((GroupNode) obj);        	

+ 44 - 8
src/ui/controller/LoadController.java

@@ -2,6 +2,7 @@ package ui.controller;
 
 import classes.*;
 
+import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
@@ -158,25 +159,60 @@ public class LoadController {
         for (String key : keys) {
             if (key.contains("CATEGORY"))
                 loadCategory(json.get(key));
-            if (key.contains("CGOBJECT"))
+            else if (key.contains("CGOBJECT"))
                 loadCategoryObject(json.get(key));
-            if (key.contains("CGELEMENT"))
+            else if (key.contains("CGELEMENT"))
                 loadCategoryElements(json.get(key), eleDispatch);//TODO
-            if (key.contains("CVSOBJECT"))
+            else if (key.contains("CVSOBJECT"))
                 loadCanvasObject(json.get(key), objDispatch);
-            if (key.contains("CVSELEMENT"))
+            else if (key.contains("CVSELEMENT"))
                 loadCanvasElements(json.get(key), objDispatch, eleDispatch);
-            if (key.contains("SWUNITGRAPH"))
+            else if (key.contains("SWUNITGRAPH"))
                 loadUnitGraph(GRAPHTYPE.SWITCH, json.get(key), objDispatch, null);
-            if (key.contains("ELEUNITGRAPH"))
+            else if (key.contains("ELEUNITGRAPH"))
                 loadUnitGraph(GRAPHTYPE.ELEMENT, json.get(key), null, eleDispatch);
-            if (key.contains("ELETESTUNITGRAPH"))
+            else if (key.contains("ELETESTUNITGRAPH"))
                 loadUnitGraph(GRAPHTYPE.TESTELEMENT, json.get(key), null, eleDispatch);
+            else if (key.contains("HolonStructure")) {
+            	laodHolonStructure(json.get(key), objDispatch);
+            }
         }
 
     }
 
-    /**
+    private void laodHolonStructure(JsonElement jsonElement, HashMap<Integer, AbstractCanvasObject> objDispatch) {
+		JsonObject holonStructure = jsonElement.getAsJsonObject();
+		model.getStateHolon().removeAllRefrences();
+		JsonArray array = holonStructure.get("ChildHolons").getAsJsonArray();
+		for(JsonElement ele : array) {
+			deserializeHolon(model.getStateHolon(), ele.getAsJsonObject() , objDispatch);
+		}
+		
+	}
+
+    
+    
+    
+	private void deserializeHolon(Holon parent, JsonObject holonJson,
+			HashMap<Integer, AbstractCanvasObject> objDispatch) {
+		int objId = holonJson.get("HolonObjectID").getAsInt();
+		String name = holonJson.get("Name").getAsString();
+		Holon created;
+		if(objId != -1) {
+			HolonObject holonObject = (HolonObject) objDispatch.get(objId);
+			created = new Holon(holonObject);
+			created.name = name;
+		}else {
+			created = new Holon(name);
+		}
+		JsonArray array = holonJson.get("ChildHolons").getAsJsonArray();
+		for(JsonElement ele : array) {
+			deserializeHolon(created, ele.getAsJsonObject() , objDispatch);
+		}
+		parent.addChild(created);
+	}
+
+	/**
      * Init the Global Parameters
      */
     private void initialize(JsonObject json) {

+ 18 - 3
src/ui/controller/SaveController.java

@@ -1,6 +1,8 @@
 package ui.controller;
 
 import classes.*;
+
+import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.reflect.TypeToken;
@@ -203,8 +205,6 @@ public class SaveController {
             // add currentnode into jsontree
             String key = "CVSOBJECT" + getNumerator(NUMTYPE.OBJECT);
             file.add(key, model.getGson().toJsonTree(u, AbstractCanvasObject.class));
-            // and its connections too
-            edgeToJson(EDGETYPE.CONNECTION, file, u.getId(), u.getConnections());
             // if holonobject elements too
             if (u instanceof HolonObject)
                 elementsToJson(TYPE.CANVAS, file, u);
@@ -222,8 +222,23 @@ public class SaveController {
         }
         // lastly add canvasedges into json
         edgeToJson(EDGETYPE.CANVAS, file, 0, model.getEdgesOnCanvas());
-
+        file.add("HolonStructure", serializeHolon(model.getStateHolon()));
+    }
+    
+    private JsonObject serializeHolon(Holon holon) {
+    	JsonObject temp = new JsonObject();
+    	temp.add("Name", new JsonPrimitive(holon.name));
+    	temp.add("HolonObjectID", new JsonPrimitive(holon.getHolonObject() != null ? holon.getHolonObject().getId(): -1));
+    	JsonArray childArray = new JsonArray();
+        for (Holon child: holon.getChildView()) {
+              JsonObject succJsonObj = serializeHolon(child);
+              childArray.add(succJsonObj);
+        }
+        temp.add("ChildHolons", childArray);
+        return temp;
     }
+    
+    
 
     /**
      * Save wanted Data

+ 1 - 1
src/ui/view/GUI.java

@@ -525,7 +525,7 @@ public class GUI{
 								.get(j);
 						if (j < model.getSelectedCpsObjects().size() - 1)
 							save = true;
-						controller.delCanvasObject(cps, save);
+						controller.deleteCanvasObject(cps, save);
 						canvas.setToolTip(false);
 
 						// remove UpperNodeTab if UpperNode deleted

+ 1 - 1
src/ui/view/GroupNodeCanvas.java

@@ -1123,7 +1123,7 @@ public class GroupNodeCanvas extends AbstractCanvas implements MouseListener, Mo
 
         // Wenn ein Node ohne Connections da ist
         if (deleteNode) {
-            controller.delCanvasObject(tempCps, true);
+            controller.deleteCanvasObject(tempCps, true);
             tempCps = null;
         }
     }

+ 4 - 4
src/ui/view/MyCanvas.java

@@ -216,10 +216,10 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 					controller.removeEdgesOnCanvas(edgeHighlight);
 					//Look for a CPSNode with no Connections and delete them
 					if(edgeHighlight.getA().getClass() == Node.class && edgeHighlight.getA().getConnections().size() == 0){ 
-						controller.delCanvasObject(edgeHighlight.getA(), false);	
+						controller.deleteCanvasObject(edgeHighlight.getA(), false);	
 					}
 					if(edgeHighlight.getB().getClass() == Node.class && edgeHighlight.getB().getConnections().size() == 0){ //Look on the other end of the cable
-						controller.delCanvasObject(edgeHighlight.getB(), false);
+						controller.deleteCanvasObject(edgeHighlight.getB(), false);
 					}
 					edgeHighlight = null;
 				}
@@ -229,7 +229,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 							.get(j);
 					if (j == model.getSelectedCpsObjects().size() - 1)
 						save = true;
-					controller.delCanvasObject(cps, save);
+					controller.deleteCanvasObject(cps, save);
 					// Remove UpperNodeTab if UpperNode deleted
 				if (cps instanceof GroupNode) {
 					JTabbedPane tabbedPane = (JTabbedPane)getParent().getParent()
@@ -997,7 +997,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 
 			// Wenn ein Node ohne Connections da ist
 			if (deleteNode) {
-				controller.delCanvasObject(tempCps, true);
+				controller.deleteCanvasObject(tempCps, true);
 				tempCps = null;
 			}
 		}

+ 20 - 2
src/ui/view/outliner/HolonView.java

@@ -33,6 +33,7 @@ import javax.swing.tree.TreeSelectionModel;
 
 import classes.Holon;
 import classes.HolonElement;
+import classes.HolonObject;
 import ui.controller.Control;
 import utility.ImageImport;
 /**
@@ -201,8 +202,9 @@ public class HolonView extends JPanel{
 		
 		JPopupMenu menu = new JPopupMenu ();
 		JCheckBoxMenuItem showElements = new JCheckBoxMenuItem("Show Elements"); 
-		JMenuItem newHolonAsParentItem = new JMenuItem("Create new Holon as Parent.");
- 	    JMenuItem newHolonAsChildItem = new JMenuItem("Create new Holon as Child.");
+		JMenuItem newHolonAsParentItem = new JMenuItem("Create new Holon as Parent");
+ 	    JMenuItem newHolonAsChildItem = new JMenuItem("Create new Holon as Child");
+ 	    JMenuItem deleteThisHolon = new JMenuItem("Delete this Holon");
 		
 		public HolonMouseListener() {
 			//Initialize MenuItems
@@ -231,6 +233,20 @@ public class HolonView extends JPanel{
     	    	info.holon.addChild(new Holon("New Holon"));
     	    	updateTreeStructure();
 	    	});
+     	  deleteThisHolon.addActionListener(clicked -> {
+  	    	TreePath path = holonTree.getSelectionPath();
+  	    	HolonInfo info = getInfoFromPath(path);
+  	    	if(info == null) return;
+  	    	HolonObject obj = info.holon.getHolonObject();
+  	    	if(obj != null) {
+  	    		control.deleteCanvasObject(obj, true);
+  	    	}else {
+  	    		info.holon.reassignAllChildren(control.getModel().getStateHolon());
+  	  	    	info.holon.removeFromParent();
+  	  	    	info.holon.removeAllRefrences();
+  	    	}
+  	    	updateTreeStructure();
+	    	});
      	    
      	    
      	    //CreateMenu
@@ -238,6 +254,7 @@ public class HolonView extends JPanel{
      	    menu.addSeparator();
      	    menu.add(newHolonAsParentItem);
      	    menu.add(newHolonAsChildItem);
+     	    menu.add(deleteThisHolon);
 		}
 		
 		public void mousePressed ( MouseEvent e )
@@ -250,6 +267,7 @@ public class HolonView extends JPanel{
             boolean pathIsViable = (path != null);
             newHolonAsParentItem.setVisible(pathIsViable);
             newHolonAsChildItem.setVisible(pathIsViable);
+            deleteThisHolon.setVisible(pathIsViable);
         	menu.show(holonTree, e.getX(), e.getY());
         }