All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mxgraph.io.mxGdCodec Maven / Gradle / Ivy

Go to download

JGraphX Swing Component - Java Graph Visualization Library This is a binary & source redistribution of the original, unmodified JGraphX library originating from: "http://downloads.jgraph.com/downloads/jgraphx/archive/jgraphx-2_0_0_1.zip". The purpose of this redistribution is to make the library available to other Maven projects.

There is a newer version: 3.4.1.3
Show newest version
/**
 * $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.
* 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 cellsMap = new HashMap(); /** * 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 styleMap, String asig) { String style = ""; Iterator it = styleMap.values().iterator(); Iterator 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 styleMap = new Hashtable(); //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 nodes = document.getNodes(); for (mxGdNode node : nodes) { addNode(graph, parent, node); } //Add Edges. List 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 GDedges = document.getEdges(); GDedges = encodeEdges(GDedges, parent, graph); document.setEdges(GDedges); for (Object vertex : vertexes) { List 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 encodeEdges(List 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; } }