/**
|
* $Id: mxGdCodec.java,v 1.1 2012/11/15 13:26:47 gaudenz Exp $
|
* Copyright (c) 2010-2012, JGraph Ltd
|
*/
|
package com.mxgraph.io;
|
|
import com.mxgraph.model.mxGraphModel;
|
import com.mxgraph.view.mxGraph;
|
|
import java.io.BufferedReader;
|
import java.io.StringReader;
|
import java.util.HashMap;
|
|
/**
|
* 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
|
{
|
/**
|
* Represents the different states in the parse of a file.
|
*/
|
public enum mxGDParseState
|
{
|
START, NUM_NODES, PARSING_NODES, PARSING_EDGES
|
}
|
|
/**
|
* Map with the vertex cells added in the addNode method.
|
*/
|
protected static HashMap<String, Object> cellsMap = new HashMap<String, Object>();
|
|
/**
|
* Parses simple GD format and populate the specified graph
|
* @param input GD file to be parsed
|
* @param graph Graph where the parsed graph is included.
|
*/
|
public static void decode(String input, mxGraph graph)
|
{
|
BufferedReader br = new BufferedReader(new StringReader(input));
|
mxGDParseState state = mxGDParseState.START;
|
Object parent = graph.getDefaultParent();
|
|
graph.getModel().beginUpdate();
|
|
try
|
{
|
String line = br.readLine().trim();
|
while (line != null)
|
{
|
switch (state)
|
{
|
case START:
|
{
|
if (!line.startsWith("#"))
|
{
|
state = mxGDParseState.NUM_NODES;
|
}
|
else
|
{
|
break;
|
}
|
}
|
case NUM_NODES:
|
{
|
if (!line.startsWith("#"))
|
{
|
int numVertices = Integer.valueOf(line);
|
|
for (int i = 0; i < numVertices; i++)
|
{
|
String label = String.valueOf(i);
|
Object vertex = graph.insertVertex(parent, label, label,
|
0, 0, 10, 10);
|
|
cellsMap.put(label, vertex);
|
}
|
}
|
else
|
{
|
state = mxGDParseState.PARSING_EDGES;
|
}
|
|
break;
|
}
|
case PARSING_NODES:
|
{
|
if (line.startsWith("# Edges"))
|
{
|
state = mxGDParseState.PARSING_EDGES;
|
}
|
else if (!line.equals(""))
|
{
|
String[] items = line.split(",");
|
if (items.length != 5)
|
{
|
throw new Exception("Error in parsing");
|
}
|
else
|
{
|
double x = Double.valueOf(items[1]);
|
double y = Double.valueOf(items[2]);
|
double width = Double.valueOf(items[3]);
|
double height = Double.valueOf(items[4]);
|
|
|
//Set the node name as label.
|
String label = items[0];
|
|
//Insert a new vertex in the graph
|
Object vertex = graph.insertVertex(parent, label, label,
|
x - width / 2.0, y - height / 2.0, width,
|
height);
|
|
cellsMap.put(label, vertex);
|
}
|
}
|
break;
|
}
|
case PARSING_EDGES:
|
{
|
if (!line.equals(""))
|
{
|
String[] items = line.split(" ");
|
if (items.length != 2)
|
{
|
throw new Exception("Error in parsing");
|
}
|
else
|
{
|
Object source = cellsMap.get(items[0]);
|
Object target = cellsMap.get(items[1]);
|
|
graph.insertEdge(parent, null, "", source, target);
|
}
|
}
|
break;
|
}
|
}
|
|
line = br.readLine();
|
}
|
}
|
|
catch (Exception e)
|
{
|
e.printStackTrace();
|
}
|
finally
|
{
|
graph.getModel().endUpdate();
|
}
|
}
|
|
/**
|
* Generates a GD text output with the cells in the graph.
|
* The implementation only uses the cells located in the default parent.
|
* @param graph Graph with the cells.
|
* @return The GD document generated.
|
*/
|
public static String encode(mxGraph graph)
|
{
|
StringBuilder builder = new StringBuilder();
|
|
Object parent = graph.getDefaultParent();
|
Object[] vertices = mxGraphModel.getChildCells(graph.getModel(), parent, true, false);
|
|
builder.append("# Number of Nodes (0-" + String.valueOf(vertices.length - 1) + ")");
|
builder.append(String.valueOf(vertices.length));
|
|
// TODO
|
|
return builder.toString();
|
}
|
}
|