package ch.hsr.ifs.pasta.tree;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JPanel;
import ch.hsr.ifs.pasta.tree.JBaum;
import ch.hsr.ifs.pasta.tree.Node;
import ch.hsr.ifs.pasta.tree.NodeVisitor;
public class JBaumDebugView extends JPanel {
private static final long serialVersionUID = -1390313572685631394L;
private final int xOffset = 20;
private final int yOffset = 20;
private final int nodeWidth = 20;
private final Node<String> root;
public JBaumDebugView(final Node<String> root) {
super();
this.root = root;
}
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
this.removeAll();
root.visit(new NodeVisitor<String>() {
@Override
public AfterVisitBehaviour visit(Node<String> node) {
if (node.parent() != null) {
drawLineToParent(node, g);
}
drawNode(node, g);
return AfterVisitBehaviour.Continue;
}
});
}
private int getYCoord(Node<?> node) {
return (int) (node.y() * nodeWidth) + yOffset;
}
private int getXCoord(Node<?> node) {
return (int) (node.x() * nodeWidth) + xOffset;
}
private void drawLineToParent(Node<?> node, Graphics g) {
g.setColor(Color.GRAY);
int relativeOffsetX = (int) (node.width() * nodeWidth) / 2;
int relativeOffsetXParent = (int) (node.parent().width() * nodeWidth) / 2;
int relativeOffsetY = nodeWidth / 2;
int sourceX = getXCoord(node) + relativeOffsetX;
int sourceY = getYCoord(node) + relativeOffsetY;
int targetX = getXCoord(node.parent()) + relativeOffsetXParent;
int targetY = getYCoord(node.parent()) + relativeOffsetY;
g.drawLine(sourceX, sourceY, targetX, targetY);
}
private void drawNode(final Node<String> node, Graphics g) {
g.setColor(Color.ORANGE);
JButton button = new JButton();
button.setEnabled(false);
button.setText("w:" + node.width() + " x:" + node.x());
button.setBounds(getXCoord(node), getYCoord(node), (int) node.width()
* nodeWidth, nodeWidth);
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
addChild(node);
}
}
});
this.add(button);
}
private void addChild(final Node<String> node) {
Node<String> child = new Node<String>("child " + (node.children().size() + 1));
child.setWidth(new Random(System.currentTimeMillis()).nextInt(5) + 1);
node.addChild(child);
JBaum.reset(root);
root.adjust();
repaint();
}
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
}