|
@@ -1,17 +1,32 @@
|
|
|
package ui.controller;
|
|
|
|
|
|
import java.awt.Color;
|
|
|
+import java.awt.Point;
|
|
|
import java.awt.Toolkit;
|
|
|
import java.awt.datatransfer.Clipboard;
|
|
|
+import java.awt.datatransfer.DataFlavor;
|
|
|
import java.awt.datatransfer.StringSelection;
|
|
|
+import java.awt.datatransfer.Transferable;
|
|
|
+import java.awt.datatransfer.UnsupportedFlavorException;
|
|
|
+import java.io.IOException;
|
|
|
import java.util.ArrayDeque;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
+import java.util.LinkedList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import com.google.gson.Gson;
|
|
|
import com.google.gson.GsonBuilder;
|
|
|
+import com.google.gson.JsonElement;
|
|
|
+import com.google.gson.JsonIOException;
|
|
|
import com.google.gson.JsonObject;
|
|
|
+import com.google.gson.JsonParseException;
|
|
|
+import com.google.gson.JsonParser;
|
|
|
import com.google.gson.JsonPrimitive;
|
|
|
+import com.google.gson.JsonSyntaxException;
|
|
|
+import com.google.gson.stream.JsonReader;
|
|
|
+import com.google.gson.stream.MalformedJsonException;
|
|
|
|
|
|
import TypeAdapter.AbstractCpsObjectAdapter;
|
|
|
import TypeAdapter.ColorAdapter;
|
|
@@ -19,31 +34,48 @@ import TypeAdapter.PositionAdapter;
|
|
|
import classes.AbstractCpsObject;
|
|
|
import classes.CpsEdge;
|
|
|
import classes.CpsUpperNode;
|
|
|
+import classes.HolonElement;
|
|
|
import classes.HolonObject;
|
|
|
import classes.HolonSwitch;
|
|
|
import classes.IdCounter;
|
|
|
+import classes.IdCounterElem;
|
|
|
import classes.Position;
|
|
|
import ui.controller.StoreController.EDGETYPE;
|
|
|
import ui.controller.StoreController.GRAPHTYPE;
|
|
|
import ui.controller.StoreController.NUMTYPE;
|
|
|
import ui.controller.StoreController.TYPE;
|
|
|
import ui.model.Model;
|
|
|
+import ui.view.UpperNodeCanvas;
|
|
|
|
|
|
public class ClipboardController {
|
|
|
|
|
|
private Model model;
|
|
|
private StoreController store;
|
|
|
private LoadController load;
|
|
|
+ private CanvasController cvsC;
|
|
|
+ private ObjectController objC;
|
|
|
+ private NodeController uppC;
|
|
|
+ private MultiPurposeController mpC;
|
|
|
private Gson gson;
|
|
|
+ private JsonParser parser;
|
|
|
+ private Clipboard clipboard;
|
|
|
+ private HashMap<Integer, Integer> idMap;
|
|
|
+ private String sav;
|
|
|
|
|
|
- public ClipboardController(Model model, StoreController store, LoadController load) {
|
|
|
+ public ClipboardController(Model model, StoreController store, LoadController load, CanvasController cvs,
|
|
|
+ ObjectController obj, NodeController uppC, MultiPurposeController mp) {
|
|
|
this.model = model;
|
|
|
this.store = store;
|
|
|
this.load = load;
|
|
|
+ this.cvsC = cvs;
|
|
|
+ this.objC = obj;
|
|
|
+ this.uppC = uppC;
|
|
|
+ this.mpC = mp;
|
|
|
+ this.clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
|
|
|
initGson();
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
* @param upperNode
|
|
@@ -86,24 +118,218 @@ public class ClipboardController {
|
|
|
}
|
|
|
}
|
|
|
if (upperNode == null)
|
|
|
- edgeToJson(EDGETYPE.CANVAS, file, 0, model.getEdgesOnCanvas());
|
|
|
+ edgeToJson(EDGETYPE.LAYER, file, 0, model.getEdgesOnCanvas());
|
|
|
else
|
|
|
- edgeToJson(EDGETYPE.NODE, file, upperNode.getID(), model.getEdgesOnCanvas());
|
|
|
+ edgeToJson(EDGETYPE.LAYER, file, upperNode.getID(), model.getEdgesOnCanvas());
|
|
|
|
|
|
StringSelection selection = new StringSelection(gson.toJson(file));
|
|
|
- Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
|
|
|
clipboard.setContents(selection, selection);
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
* @param upperNode
|
|
|
*/
|
|
|
- public void paste(CpsUpperNode upperNode) {
|
|
|
+ public void paste(CpsUpperNode upperNode, Point point) {
|
|
|
+
|
|
|
+ JsonObject json = new JsonObject();
|
|
|
+ Transferable content = clipboard.getContents(null);
|
|
|
+
|
|
|
+ if (content != null && content.isDataFlavorSupported(DataFlavor.stringFlavor)
|
|
|
+ && !content.isDataFlavorSupported(DataFlavor.allHtmlFlavor))
|
|
|
+ try {
|
|
|
+ String str = (String) content.getTransferData(DataFlavor.stringFlavor);
|
|
|
+
|
|
|
+ if (parser.parse(str).isJsonObject())
|
|
|
+ json = (JsonObject) parser.parse(str);
|
|
|
+ } catch (UnsupportedFlavorException | IOException | JsonParseException e) {
|
|
|
+ // TODO Auto-generated catch block
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ return;
|
|
|
+
|
|
|
+ List<String> keys = load.getKeys(json);
|
|
|
+ List<String> edges = keys.stream().filter(key -> key.contains("EDGE"))
|
|
|
+ .collect(Collectors.toCollection(ArrayList::new));
|
|
|
+
|
|
|
+ HashMap<Integer, AbstractCpsObject> objDispatch = new HashMap<>();
|
|
|
+ HashMap<Integer, HolonElement> eleDispatch = new HashMap<>();
|
|
|
+ idMap = new HashMap<>();
|
|
|
+ sav = json.get("SAV").getAsString();
|
|
|
+
|
|
|
+ objDist(keys, json, objDispatch, eleDispatch, upperNode);
|
|
|
+ edgeDist(edges, json, objDispatch, upperNode);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void edgeDist(List<String> edges, JsonObject json, HashMap<Integer, AbstractCpsObject> objDispatch,
|
|
|
+ CpsUpperNode upperNode) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ List<String> conn = new ArrayList<>();
|
|
|
+
|
|
|
+ for (String edge : edges) {
|
|
|
+ if (edge.contains("LAYEREDGE"))
|
|
|
+ loadEdge(EDGETYPE.LAYER, json.get(edge), objDispatch, upperNode);
|
|
|
+ if (edge.contains("CONNEDGE"))
|
|
|
+ conn.add(edge);
|
|
|
+ if (edge.contains("NODEEDGE"))
|
|
|
+ loadEdge(EDGETYPE.NODE, json.get(edge), objDispatch, null);
|
|
|
+ if (edge.contains("OLDEDGE"))
|
|
|
+ loadEdge(EDGETYPE.OLD, json.get(edge), objDispatch, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (String edge : conn) {
|
|
|
+ loadEdge(EDGETYPE.CONNECTION, json.get(edge), objDispatch, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void objDist(List<String> keys, JsonObject json, HashMap<Integer, AbstractCpsObject> objDispatch,
|
|
|
+ HashMap<Integer, HolonElement> eleDispatch, CpsUpperNode upperNode) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+
|
|
|
+ for (String key : keys) {
|
|
|
+ if (key.contains("CVSOBJECT"))
|
|
|
+ loadCanvasObject(json.get(key), objDispatch, upperNode);
|
|
|
+ if (key.contains("CVSELEMENT"))
|
|
|
+ loadCanvasElements(json.get(key), objDispatch, eleDispatch);
|
|
|
+ if (key.contains("SWUNITGRAPH"))
|
|
|
+ loadUnitGraph(GRAPHTYPE.SWITCH, json.get(key), objDispatch, null);
|
|
|
+ if (key.contains("ELEUNITGRAPH"))
|
|
|
+ loadUnitGraph(GRAPHTYPE.ELEMENT, json.get(key), null, eleDispatch);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void loadCanvasObject(JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
|
|
|
+ CpsUpperNode upperNode) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ AbstractCpsObject temp = gson.fromJson(jsonElement.getAsJsonObject(), AbstractCpsObject.class);
|
|
|
+ load.initObjects(temp);
|
|
|
+ idMapper(temp);
|
|
|
+ if (temp.getSav().equals(sav))
|
|
|
+ updateSav(temp, upperNode);
|
|
|
+
|
|
|
+ // if its stored before on the canvas just put it there
|
|
|
+ if (temp.getSav().equals("CVS")) {
|
|
|
+ cvsC.addObject(temp);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ // else look up the table and put it into the right Uppernode
|
|
|
+ CpsUpperNode temp2 = (CpsUpperNode) objDispatch.get(Integer.parseInt(temp.getSav()));
|
|
|
+ uppC.addObjectInUpperNode(temp, temp2);
|
|
|
+ }
|
|
|
+
|
|
|
+ objDispatch.put(temp.getID(), temp);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void loadEdge(EDGETYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
|
|
|
+ CpsUpperNode upperNode) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ JsonObject object = jsonElement.getAsJsonObject();
|
|
|
+ CpsEdge temp = gson.fromJson(object.get("properties"), CpsEdge.class);
|
|
|
+ load.initCpsEdge(temp);
|
|
|
+ // look for A and B inside the Table
|
|
|
+ temp.setA(objDispatch.get(idMap.get(object.get("A").getAsInt())));
|
|
|
+ temp.setB(objDispatch.get(idMap.get(object.get("B").getAsInt())));
|
|
|
+
|
|
|
+ int sav = 0;
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case LAYER:
|
|
|
+ // if in canvas add it into the canvas but delete connection before
|
|
|
+ if (upperNode == null)
|
|
|
+ model.getEdgesOnCanvas().add(temp);
|
|
|
+ else
|
|
|
+ upperNode.getNodeEdges().add(temp);
|
|
|
+ break;
|
|
|
+ case CONNECTION:
|
|
|
+ // if no duplicates in connection store them into the given A and B
|
|
|
+ if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getA().getConnections()))
|
|
|
+ temp.getA().getConnections().add(temp);
|
|
|
+ if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getB().getConnections()))
|
|
|
+ temp.getB().getConnections().add(temp);
|
|
|
+ break;
|
|
|
+ case NODE:
|
|
|
+ // put it into given nodeofnode
|
|
|
+ sav = idMap.get(object.get("ID").getAsInt());
|
|
|
+ ((CpsUpperNode) objDispatch.get(sav)).getNodeEdges().add(temp);
|
|
|
+ break;
|
|
|
+ case OLD:
|
|
|
+ // same as above
|
|
|
+ sav = idMap.get(object.get("ID").getAsInt());
|
|
|
+ ((CpsUpperNode) objDispatch.get(sav)).getOldEdges().add(temp);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (object.get("connection").getAsBoolean() && !type.equals(EDGETYPE.CONNECTION)) {
|
|
|
+ temp.getA().getConnections().add(temp);
|
|
|
+ temp.getB().getConnections().add(temp);
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ private void loadCanvasElements(JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
|
|
|
+ HashMap<Integer, HolonElement> eleDispatch) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ JsonObject object = jsonElement.getAsJsonObject();
|
|
|
+
|
|
|
+ HolonElement temp = gson.fromJson(object.get("properties"), HolonElement.class);
|
|
|
+ load.initElements(temp);
|
|
|
+ temp.setId(IdCounterElem.nextId());
|
|
|
+ // id which Object it was stored before
|
|
|
+ int stored = idMap.get(object.get("ID").getAsInt());
|
|
|
+ // lookup that object
|
|
|
+ HolonObject temp2 = (HolonObject) objDispatch.get(stored);
|
|
|
+ // add it
|
|
|
+ objC.addElement(temp2, temp);
|
|
|
+ // store element also inside a table
|
|
|
+ eleDispatch.put(temp.getId(), temp);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void loadUnitGraph(GRAPHTYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
|
|
|
+ HashMap<Integer, HolonElement> eleDispatch) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ JsonObject object = jsonElement.getAsJsonObject();
|
|
|
+ List<String> keys = load.getKeys(object);
|
|
|
+ String p = null;
|
|
|
+ int mid, x, y = 0;
|
|
|
+
|
|
|
+ LinkedList<Point> graphpoint = new LinkedList<>();
|
|
|
+ int sav = 0;
|
|
|
+ // foreach Point in the graph restore it
|
|
|
+ for (String k : keys) {
|
|
|
+ if (!k.equals("ID")) {
|
|
|
+ p = object.get(k).getAsString();
|
|
|
+ mid = p.indexOf(':');
|
|
|
+ x = Integer.parseInt(p.substring(0, mid));
|
|
|
+ y = Integer.parseInt(p.substring(mid + 1, p.length()));
|
|
|
+ graphpoint.add(new Point(x, y));
|
|
|
+ } else
|
|
|
+ // else its an ID
|
|
|
+ sav = idMap.get(object.get(k).getAsInt());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case SWITCH:
|
|
|
+ HolonSwitch sw = (HolonSwitch) objDispatch.get(sav);
|
|
|
+ sw.setGraphPoints(graphpoint);
|
|
|
+ break;
|
|
|
+ case ELEMENT:
|
|
|
+ HolonElement ele = eleDispatch.get(sav);
|
|
|
+ ele.setGraphPoints(graphpoint);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
* @param type
|
|
@@ -127,8 +353,9 @@ public class ClipboardController {
|
|
|
|
|
|
// Key and occasionally the id of Uppernode
|
|
|
switch (type) {
|
|
|
- case CANVAS:
|
|
|
- k = "CVSEDGE" + store.getNumerator(NUMTYPE.EDGE);
|
|
|
+ case LAYER:
|
|
|
+ temp.add("ID", new JsonPrimitive(id));
|
|
|
+ k = "LAYEREDGE" + store.getNumerator(NUMTYPE.EDGE);
|
|
|
break;
|
|
|
case CONNECTION:
|
|
|
k = "CONNEDGE" + store.getNumerator(NUMTYPE.CONNECTION);
|
|
@@ -154,7 +381,7 @@ public class ClipboardController {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
@@ -164,7 +391,7 @@ public class ClipboardController {
|
|
|
clipboadDepth(obj);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
* @param obj
|
|
@@ -192,6 +419,21 @@ public class ClipboardController {
|
|
|
builder.registerTypeAdapter(Color.class, new ColorAdapter());
|
|
|
// use the builder and make a instance of the Gson
|
|
|
this.gson = builder.create();
|
|
|
+ this.parser = new JsonParser();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void idMapper(AbstractCpsObject temp) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ int id = temp.getID();
|
|
|
+ temp.setID(IdCounter.nextId());
|
|
|
+ idMap.put(id, temp.getID());
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateSav(AbstractCpsObject temp, CpsUpperNode upperNode) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ String newSav = (upperNode == null ? "CVS" : "" + upperNode.getID());
|
|
|
+ temp.setSav(newSav);
|
|
|
}
|
|
|
|
|
|
}
|