package thaw.plugins.indexWebGrapher;
import javax.swing.JComponent;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Iterator;
import thaw.plugins.IndexWebGrapher;
public class GraphPanel extends JComponent implements MouseListener {
private static final long serialVersionUID = 5478870004197620690L;
public final static int BORDER = 50;
private Hashtable nodeHashtable;
private Vector nodeList;
private int lastId;
private double zoom;
private IndexWebGrapher plugin;
private Node lastSelectedNode;
public GraphPanel(IndexWebGrapher plugin) {
super();
this.plugin = plugin;
nodeHashtable = null;
nodeList = null;
lastId = 0;
setPreferredSize(new Dimension(10, 10));
this.addMouseListener(this);
}
public void reinit() {
lastSelectedNode = null;
nodeHashtable = new Hashtable();
nodeList = new Vector();
lastId = 0;
}
public void registerNode(Node node) {
nodeHashtable.put(node.getIndexKey().substring(4, 40),
node);
nodeList.add(node);
if (node.getId() > lastId)
lastId = node.getId();
}
public Node getNode(String key) {
return (Node)nodeHashtable.get(key.substring(4, 40));
}
public Vector getNodeList() {
return nodeList;
}
public int getLastUsedId() {
return lastId;
}
public void setZoom(double zoom) {
this.zoom = zoom;
}
private double minX = 0;
private double maxX = 0;
private double minY = 0;
private double maxY = 0;
public void recomputeMinMax() {
minX = 0;
maxX = 0;
minY = 0;
maxY = 0;
for (Iterator it = nodeList.iterator();
it.hasNext();) {
Node node = (Node)it.next();
if (node.getX() < minX) minX = node.getX();
if (node.getX() > maxX) maxX = node.getX();
if (node.getY() < minY) minY = node.getY();
if (node.getY() > maxY) maxY = node.getY();
}
}
public void guessZoom() {
recomputeMinMax();
Dimension size = plugin.getScrollPane().getSize();
double zoomX = (size.getWidth()-(2*BORDER)) / (maxX - minX);
double zoomY = (size.getHeight()-(2*BORDER)) / (maxY - minY);
zoom = ((zoomX > zoomY) ? zoomY : zoomX);
}
public void zoomIn() {
zoom = zoom * 2.0;
refresh();
}
public void zoomOut() {
zoom = zoom / 2.0;
refresh();
}
public void refresh() {
Dimension dim = new Dimension((int)((maxX - minX) * zoom) + (2*BORDER),
(int)((maxY - minY) * zoom) + (2*BORDER));
this.setPreferredSize(dim);
this.setSize((int)((maxX - minX) * zoom) + (2*BORDER),
(int)((maxY - minY) * zoom) + (2*BORDER));
plugin.getScrollPane().revalidate();
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension d = getSize();
g.setColor(java.awt.Color.WHITE);
g.fillRect(0, 0, (int)d.getWidth(), (int)d.getHeight());
if (nodeList == null)
return;
int zeroX = (-1 * (int)(minX * zoom)) + BORDER;
int zeroY = (-1 * (int)(minY * zoom)) + BORDER;
g.setColor(java.awt.Color.GRAY);
g.drawLine(zeroX, 0, zeroX, (int)d.getHeight());
g.drawLine(0, zeroY, (int)d.getWidth(), zeroY);
for (Iterator it = nodeList.iterator();
it.hasNext();) {
((Node)it.next()).paintTaNodeFaceDeNoeud(g, zoom, zeroX, zeroY);
}
}
public void clicked(int x, int y) {
int zeroX = (-1 * (int)(minX * zoom)) + BORDER;
int zeroY = (-1 * (int)(minY * zoom)) + BORDER;
if (lastSelectedNode != null)
lastSelectedNode.setSelected(false);
Node bestPlaced = null;
double bestDist = 0.0;
for (Iterator it = nodeList.iterator();
it.hasNext();) {
Node node = (Node)it.next();
if (bestPlaced == null) {
bestPlaced = node;
double diffBestX = Math.abs(bestPlaced.getXPixel(zoom, zeroX)-x);
double diffBestY = Math.abs(bestPlaced.getYPixel(zoom, zeroY)-y);
bestDist = Math.sqrt(Math.pow(diffBestX, 2)+Math.pow(diffBestY, 2));
} else {
double diffNodeX = Math.abs(node.getXPixel(zoom, zeroX)-x);
double diffNodeY = Math.abs(node.getYPixel(zoom, zeroY)-y);
double distNode = Math.sqrt(Math.pow(diffNodeX, 2) + Math.pow(diffNodeY, 2));
if (distNode < bestDist) {
bestPlaced = node;
bestDist = distNode;
}
}
}
if (bestPlaced != null) {
bestPlaced.setSelected(true);
lastSelectedNode = bestPlaced;
}
repaint();
}
public void mouseClicked(final MouseEvent e) {
clicked(e.getX(), e.getY());
}
public void mouseEntered(final MouseEvent e) { }
public void mouseExited(final MouseEvent e) { }
public void mousePressed(final MouseEvent e) {
clicked(e.getX(), e.getY());
}
public void mouseReleased(final MouseEvent e) {
clicked(e.getX(), e.getY());
}
}