/** * $Id: mxGdCodec.java,v 1.1 2010-08-25 08:36:59 gaudenz Exp $ * Copyright (c) 2010, Gaudenz Alder, David Benson */ package com.mxgraph.io; import com.mxgraph.io.gd.mxGdDocument; import com.mxgraph.io.gd.mxGdEdge; import com.mxgraph.io.gd.mxGdNode; import com.mxgraph.model.mxCell; import com.mxgraph.model.mxGeometry; import com.mxgraph.util.mxConstants; import com.mxgraph.util.mxPoint; import com.mxgraph.view.mxGraph; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Parses a GD .txt file and imports it in the given graph.<br/> * This class depends from the classes contained in * com.mxgraph.io.gd. */ public class mxGdCodec { /** * Map with the vertex cells added in the addNode method. */ private static HashMap<String, Object> cellsMap = new HashMap<String, Object>(); /** * Returns the coordinates of the left top corner of the node. * @param node Node * @return mxPoint that represent the coordinates. */ private static mxPoint getOriginPoint(mxGdNode node) { mxPoint coord = node.getCoordinates(); mxPoint dim = node.getDimentions(); double x = coord.getX() - dim.getX() / 2; double y = coord.getY() - dim.getY() / 2; return new mxPoint(x, y); } /** * Adds a new vertex to the graph. * @param graph Graph where the vertex is added. * @param parent Parent of the vertex to add. * @param node Node * @return Returns the vertex added. */ private static mxCell addNode(mxGraph graph, Object parent, mxGdNode node) { mxPoint cordenates = getOriginPoint(node); mxPoint dimentions = node.getDimentions(); //Set the node name as label. String label = node.getName(); //Set the node name as ID. String id = node.getName(); //Insert a new vertex in the graph mxCell v1 = (mxCell) graph.insertVertex(parent, id, label, cordenates.getX(), cordenates.getY(), dimentions.getX(), dimentions.getY()); cellsMap.put(node.getName(), v1); return v1; } /** * Returns the string that represents the content of a given style map. * @param styleMap Map with the styles values * @return string that represents the style. */ private static String getStyleString(Map<String, Object> styleMap, String asig) { String style = ""; Iterator<Object> it = styleMap.values().iterator(); Iterator<String> kit = styleMap.keySet().iterator(); while (kit.hasNext()) { String key = kit.next(); Object value = it.next(); style = style + key + asig + value + ";"; } return style; } /** * Analizes a edge shape and returns a string with the style. * @return style read from the edge shape. */ private static String getEdgeStyle() { Hashtable<String, Object> styleMap = new Hashtable<String, Object>(); //Defines Edge Style //Defines if line is rounding styleMap.put(mxConstants.STYLE_ROUNDED, false); return getStyleString(styleMap, "="); } /** * Adds a new edge to the graph. * @param graph Graph where the edge is added. * @param parent Parent of the edge to add. * @param node Node * @return Returns the edge added. */ private static mxCell addEdge(mxGraph graph, Object parent, mxGdEdge edge) { //Get source and target vertex Object source = cellsMap.get(edge.getSourceName()); Object target = cellsMap.get(edge.getTargetName()); //Defines style of the edge. String style = getEdgeStyle(); //Insert new edge and set constraints. mxCell e = (mxCell) graph.insertEdge(parent, null, "", source, target, style); return e; } /** * Recieves a mxGDDocument document and parses it generating a new graph that is inserted in graph. * @param document GD to be parsed * @param graph Graph where the parsed graph is included. */ public static void decode(mxGdDocument document, mxGraph graph) { Object parent = graph.getDefaultParent(); graph.getModel().beginUpdate(); //Add nodes. List<mxGdNode> nodes = document.getNodes(); for (mxGdNode node : nodes) { addNode(graph, parent, node); } //Add Edges. List<mxGdEdge> edges = document.getEdges(); for (mxGdEdge edge : edges) { addEdge(graph, parent, edge); } graph.getModel().endUpdate(); } /** * Returns a GD document with the data of the vertexes and edges in the graph. * @param document GD document where the elements are put. * @param parent Parent cell of the vertexes and edges to be added. * @param graph Graph that contains the vertexes and edges. * @return Returns the document with the elements added. */ private static mxGdDocument encodeNodesAndEdges(mxGdDocument document, Object parent, mxGraph graph, mxPoint parentCoord) { Object[] vertexes = graph.getChildVertices(parent); List<mxGdEdge> GDedges = document.getEdges(); GDedges = encodeEdges(GDedges, parent, graph); document.setEdges(GDedges); for (Object vertex : vertexes) { List<mxGdNode> GDnodes = document.getNodes(); mxCell v = (mxCell) vertex; mxGeometry geom = v.getGeometry(); String id = v.getId(); mxPoint coord = new mxPoint(parentCoord.getX() + geom.getCenterX(), parentCoord.getY() + geom.getCenterY()); mxPoint dim = new mxPoint(geom.getWidth(), geom.getHeight()); mxPoint cornerCoord = new mxPoint(parentCoord.getX() + geom.getX(), parentCoord.getY() + geom.getY()); mxGdNode GDnode = new mxGdNode(id, coord, dim); GDnodes.add(GDnode); document.setNodes(GDnodes); document = encodeNodesAndEdges(document, vertex, graph, cornerCoord); } return document; } /** * Returns a list of mxGDEdge with the data of the edges in the graph. * @param GDedges List where the elements are put. * @param parent Parent cell of the edges to be added. * @param graph Graph that contains the edges. * @return Returns the list GDedges with the elements added. */ private static List<mxGdEdge> encodeEdges(List<mxGdEdge> GDedges, Object parent, mxGraph graph) { Object[] edges = graph.getChildEdges(parent); for (Object edge : edges) { mxCell e = (mxCell) edge; mxCell source = (mxCell) e.getSource(); mxCell target = (mxCell) e.getTarget(); String sourceName = ""; String targetName = ""; sourceName = source.getId(); targetName = target.getId(); mxGdEdge GDedge = new mxGdEdge(sourceName, targetName); GDedges.add(GDedge); } return GDedges; } /** * Generates a GD document with the cells in the graph. * The actual implementation only uses the cells located in the first level. * @param graph Graph with the cells. * @return The GD document generated. */ public static mxGdDocument encode(mxGraph graph) { Object parent = graph.getDefaultParent(); mxGdDocument document = new mxGdDocument(); //Adds Nodes and Edges. document = encodeNodesAndEdges(document, parent, graph, new mxPoint(0, 0)); return document; } }