package com.mxgraph.examples.swing.editor;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JViewport;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.util.mxPoint;
import com.mxgraph.util.mxUtils;
import com.mxgraph.view.mxCellState;
import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxGraphView;
public class SchemaGraphComponent extends mxGraphComponent
{
/**
*
*/
private static final long serialVersionUID = -1152655782652932774L;
/**
*
* @param graph
*/
public SchemaGraphComponent(mxGraph graph)
{
super(graph);
mxGraphView graphView = new mxGraphView(graph)
{
/**
*
*/
public void updateFloatingTerminalPoint(mxCellState edge,
mxCellState start, mxCellState end, boolean isSource)
{
int col = getColumn(edge, isSource);
if (col >= 0)
{
double y = getColumnLocation(edge, start, col);
boolean left = start.getX() > end.getX();
if (isSource)
{
double diff = Math.abs(start.getCenterX()
- end.getCenterX())
- start.getWidth() / 2 - end.getWidth() / 2;
if (diff < 40)
{
left = !left;
}
}
double x = (left) ? start.getX() : start.getX()
+ start.getWidth();
double x2 = (left) ? start.getX() - 20 : start.getX()
+ start.getWidth() + 20;
int index2 = (isSource) ? 1
: edge.getAbsolutePointCount() - 1;
edge.getAbsolutePoints().add(index2, new mxPoint(x2, y));
int index = (isSource) ? 0
: edge.getAbsolutePointCount() - 1;
edge.setAbsolutePoint(index, new mxPoint(x, y));
}
else
{
super.updateFloatingTerminalPoint(edge, start, end,
isSource);
}
}
};
graph.setView(graphView);
}
/**
*
* @param edge
* @param isSource
* @return the column number the edge is attached to
*/
public int getColumn(mxCellState state, boolean isSource)
{
if (state != null)
{
if (isSource)
{
return mxUtils.getInt(state.getStyle(), "sourceRow", -1);
}
else
{
return mxUtils.getInt(state.getStyle(), "targetRow", -1);
}
}
return -1;
}
/**
*
*/
public int getColumnLocation(mxCellState edge, mxCellState terminal,
int column)
{
Component[] c = components.get(terminal.getCell());
int y = 0;
if (c != null)
{
for (int i = 0; i < c.length; i++)
{
if (c[i] instanceof JTableRenderer)
{
JTableRenderer vertex = (JTableRenderer) c[i];
JTable table = vertex.table;
JViewport viewport = (JViewport) table.getParent();
double dy = -viewport.getViewPosition().getY();
y = (int) Math.max(terminal.getY() + 22, terminal.getY()
+ Math.min(terminal.getHeight() - 20, 30 + dy
+ column * 16));
}
}
}
return y;
}
/**
*
*/
public Component[] createComponents(mxCellState state)
{
if (getGraph().getModel().isVertex(state.getCell()))
{
return new Component[] { new JTableRenderer(state.getCell(), this) };
}
return null;
}
}