浏览代码

clipboard paste almost finished. NOLIFE! 2am lol

Teh-Hai Julian Zheng 8 年之前
父节点
当前提交
a3749833c5

+ 1 - 1
src/classes/HolonElement.java

@@ -313,7 +313,7 @@ public class HolonElement {
 	 * @param id
 	 *            the id
 	 */
-	private void setId(int id) {
+	public void setId(int id) {
 		this.id = id;
 	}
 

+ 1 - 1
src/tests/PraktikumHolonsTestCanvasController.java

@@ -191,7 +191,7 @@ public class PraktikumHolonsTestCanvasController {
 		model.getSelectedCpsObjects().add(a);
 		model.getSelectedCpsObjects().add(b);
 		model.getSelectedCpsObjects().add(c);
-		controller.copyObjects();
+		//controller.copyObjects();
 		assertTrue("Clipboard empty", !model.getClipboradObjects().isEmpty());
 	
 		assertTrue("Clipboard empty", !model.getClipboradObjects().isEmpty());

+ 0 - 8
src/ui/controller/CanvasController.java

@@ -129,14 +129,6 @@ public class CanvasController {
 			handleUpperNodes(edge);
 	}
 
-	/**
-	 * Copy all Selected Objects.
-	 */
-	@SuppressWarnings("unchecked")
-	public void copyObjects() {
-		model.setClipboradObjects((ArrayList<AbstractCpsObject>) model.getSelectedCpsObjects().clone());
-	}
-
 	/**
 	 * Paste all Selected Objects.
 	 * 

+ 254 - 12
src/ui/controller/ClipboardController.java

@@ -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);
 	}
 
 }

+ 5 - 14
src/ui/controller/Control.java

@@ -67,7 +67,8 @@ public class Control {
 		this.autoSaveController = new AutoSaveController(model);
 		this.consoleController = new ConsoleController(model);
 		this.statsController = new StatsController(model);
-		this.clipboardController = new ClipboardController(model, storeController, loadController);
+		this.clipboardController = new ClipboardController(model, storeController, loadController, canvasController,
+				objectController, nodeController, multiPurposeController);
 
 		autoPath = System.getProperty("user.home") + "/HolonGUI/Autosave/";
 		File dest = new File(autoPath);
@@ -402,16 +403,6 @@ public class Control {
 		objectController.deleteElement(obj, ele);
 	}
 
-	/**
-	 * Sets the ClipboardObjects.
-	 * 
-	 * @param list
-	 *            Array of Objects
-	 */
-	public void setClipboardObjects(ArrayList<AbstractCpsObject> list) {
-		model.setClipboradObjects(list);
-	}
-
 	/* Global Operations */
 
 	/**
@@ -575,7 +566,7 @@ public class Control {
 	 *            the mouse Position
 	 */
 	public void pasteObjects(Point point) {
-		canvasController.pasteObjects(point);
+		clipboardController.paste(null, point);
 		try {
 			autoSave();
 		} catch (IOException e) {
@@ -870,14 +861,14 @@ public class Control {
 	public void addSelectedHolonBody(int i) {
 		objectController.addSelectedHolonBody(i);
 	}
-	
+
 	/**
 	 * Copy all Selected Objects.
 	 */
 	public void copy(CpsUpperNode upperNode) {
 		clipboardController.copy(upperNode);
 	}
-	
+
 	public void getObjectsInDepth() {
 		clipboardController.getObjectsInDepth();
 	}

+ 6 - 4
src/ui/controller/LoadController.java

@@ -26,6 +26,7 @@ import classes.HolonElement;
 import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.IdCounter;
+import classes.IdCounterElem;
 import classes.Position;
 import ui.model.Model;
 
@@ -196,6 +197,7 @@ public class LoadController {
 			break;
 		}
 		IdCounter.setCounter(json.get("IDCOUNTER").getAsInt());
+		IdCounterElem.setCounter(json.get("IDCOUNTERELEMENT").getAsInt());
 	}
 
 	/**
@@ -401,7 +403,7 @@ public class LoadController {
 	 * 
 	 * @param obj
 	 */
-	private void initObjects(AbstractCpsObject obj) {
+	public void initObjects(AbstractCpsObject obj) {
 
 		obj.setConnections(new ArrayList<CpsEdge>());
 		obj.setTags(new ArrayList<Integer>());
@@ -433,7 +435,7 @@ public class LoadController {
 	 * 
 	 * @param ele
 	 */
-	private void initElements(HolonElement ele) {
+	public void initElements(HolonElement ele) {
 
 		ele.setEnergyAt(ele.getEnergy());
 		ele.setGraphPoints(new LinkedList<Point>());
@@ -444,7 +446,7 @@ public class LoadController {
 	 * 
 	 * @param edge
 	 */
-	private void initCpsEdge(CpsEdge edge) {
+	public void initCpsEdge(CpsEdge edge) {
 		edge.setTags(new ArrayList<Integer>());
 		edge.setPseudoTag(new ArrayList<Integer>());
 		edge.setA(null);
@@ -457,7 +459,7 @@ public class LoadController {
 	 * @param json
 	 * @return
 	 */
-	private List<String> getKeys(JsonObject json) {
+	public List<String> getKeys(JsonObject json) {
 		return json.entrySet().stream().map(i -> i.getKey()).collect(Collectors.toCollection(ArrayList::new));
 	}
 

+ 0 - 10
src/ui/controller/ObjectController.java

@@ -213,16 +213,6 @@ public class ObjectController {
 		model.setSelectedObjectID(id);
 	}
 
-	/**
-	 * sets clipBoardObjects.
-	 * 
-	 * @param list
-	 *            of CpsObjects
-	 */
-	public void setClipboardObjects(ArrayList<AbstractCpsObject> list) {
-		model.setClipboradObjects(list);
-	}
-
 	/**
 	 * Get the number of HolonObjects in the given List
 	 * 

+ 4 - 1
src/ui/controller/StoreController.java

@@ -23,6 +23,7 @@ import classes.HolonElement;
 import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.IdCounter;
+import classes.IdCounterElem;
 import classes.Position;
 import ui.model.Model;
 
@@ -42,7 +43,7 @@ public class StoreController {
 	}
 
 	public enum EDGETYPE {
-		CANVAS, CONNECTION, NODE, OLD
+		CANVAS, CONNECTION, NODE, OLD, LAYER
 	}
 
 	public enum NUMTYPE {
@@ -128,12 +129,14 @@ public class StoreController {
 		case COMPLETE:
 			file.add("MODE", new JsonPrimitive(mode.name()));
 			file.add("IDCOUNTER", new JsonPrimitive(IdCounter.getCounter()));
+			file.add("IDCOUNTERELEMENT", new JsonPrimitive(IdCounterElem.getCounter()));
 			file.add("CANVAS_SIZE_X", new JsonPrimitive(model.getCanvasX()));
 			file.add("CANVAS_SIZE_Y", new JsonPrimitive(model.getCanvasY()));
 			break;
 		case PARTIAL:
 			file.add("MODE", new JsonPrimitive(mode.name()));
 			file.add("IDCOUNTER", new JsonPrimitive(IdCounter.getCounter()));
+			file.add("IDCOUNTERELEMENT", new JsonPrimitive(IdCounterElem.getCounter()));
 			break;
 
 		default: