package com.mxgraph.examples.swing;
import java.util.EventObject;
import javax.swing.JFrame;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.mxgraph.model.mxCell;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.util.mxUtils;
import com.mxgraph.view.mxGraph;
public class UserObject extends JFrame
{
/**
*
*/
private static final long serialVersionUID = -708317745824467773L;
public UserObject()
{
super("Hello, World!");
// Defines the user objects, which are preferrably XML nodes that allow
// storage of complex values as child nodes and string, number or
// boolean properties as attributes.
//
// When using Java objects as user objects, make sure to add the
// package name containg the class and register a codec for the user
// object class as follows:
//
// mxCodecRegistry.addPackage("com.example");
// mxCodecRegistry.register(new mxObjectCodec(
// new com.example.CustomUserObject()));
//
// Note that the object must have an empty constructor and a setter and
// getter for each property to be persisted.
//
Document doc = mxUtils.createDocument();
Element person1 = doc.createElement("Person");
person1.setAttribute("firstName", "Daffy");
person1.setAttribute("lastName", "Duck");
Element person2 = doc.createElement("Person");
person2.setAttribute("firstName", "Bugs");
person2.setAttribute("lastName", "Bunny");
Element relation = doc.createElement("Knows");
relation.setAttribute("since", "1985");
mxGraph graph = new mxGraph()
{
// Overrides method to disallow edge label editing
public boolean isCellEditable(Object cell)
{
return !getModel().isEdge(cell);
}
// Overrides method to provide a cell label in the display
public String convertValueToString(Object cell)
{
if (cell instanceof mxCell)
{
Object value = ((mxCell) cell).getValue();
if (value instanceof Element)
{
Element elt = (Element) value;
if (elt.getTagName().equalsIgnoreCase("person"))
{
String firstName = elt.getAttribute("firstName");
String lastName = elt.getAttribute("lastName");
if (lastName != null && lastName.length() > 0)
{
return lastName + ", " + firstName;
}
return firstName;
}
else if (elt.getTagName().equalsIgnoreCase("knows"))
{
return elt.getTagName() + " (Since "
+ elt.getAttribute("since") + ")";
}
}
}
return super.convertValueToString(cell);
}
// Overrides method to store a cell label in the model
public void cellLabelChanged(Object cell, Object newValue,
boolean autoSize)
{
if (cell instanceof mxCell && newValue != null)
{
Object value = ((mxCell) cell).getValue();
if (value instanceof Node)
{
String label = newValue.toString();
Element elt = (Element) value;
if (elt.getTagName().equalsIgnoreCase("person"))
{
int pos = label.indexOf(' ');
String firstName = (pos > 0) ? label.substring(0,
pos).trim() : label;
String lastName = (pos > 0) ? label.substring(
pos + 1, label.length()).trim() : "";
// Clones the value for correct undo/redo
elt = (Element) elt.cloneNode(true);
elt.setAttribute("firstName", firstName);
elt.setAttribute("lastName", lastName);
newValue = elt;
}
}
}
super.cellLabelChanged(cell, newValue, autoSize);
}
};
Object parent = graph.getDefaultParent();
graph.getModel().beginUpdate();
try
{
Object v1 = graph.insertVertex(parent, null, person1, 20, 20, 80,
30);
Object v2 = graph.insertVertex(parent, null, person2, 240, 150, 80,
30);
graph.insertEdge(parent, null, relation, v1, v2);
}
finally
{
graph.getModel().endUpdate();
}
// Overrides method to create the editing value
mxGraphComponent graphComponent = new mxGraphComponent(graph)
{
/**
*
*/
private static final long serialVersionUID = 6824440535661529806L;
public String getEditingValue(Object cell, EventObject trigger)
{
if (cell instanceof mxCell)
{
Object value = ((mxCell) cell).getValue();
if (value instanceof Element)
{
Element elt = (Element) value;
if (elt.getTagName().equalsIgnoreCase("person"))
{
String firstName = elt.getAttribute("firstName");
String lastName = elt.getAttribute("lastName");
return firstName + " " + lastName;
}
}
}
return super.getEditingValue(cell, trigger);
};
};
getContentPane().add(graphComponent);
// Stops editing after enter has been pressed instead
// of adding a newline to the current editing value
graphComponent.setEnterStopsCellEditing(true);
}
public static void main(String[] args)
{
UserObject frame = new UserObject();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 320);
frame.setVisible(true);
}
}