package application.gui;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import objects.Edge;
import objects.Graph;
import objects.Node;
public class View extends JFrame {
private static final long serialVersionUID = 7094413965996596889L;
private JFrame frame;
private JPanel contentPane;
private final Graph graph;
private int currentX = 50;
private int currentY = 50;
private int stepX = 150;
private int stepY = 20;
private ArrayList<NodeData> nodeData; //hier sind Knoten+Position drin gespeichert
public View(final Graph graph) {
this.graph = graph;
frame = new JFrame();
frame.setBounds(100, 100, 1155, 403);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Graphen");
Container container = new Container();
container.setLayout(null);
//hier steht alles zum Menü, habe ich erstmal rausgenommen...
frame.setJMenuBar(menuBar);
contentPane = new JPanel();
contentPane.setPreferredSize(new Dimension(frame.getWidth(), 400));
contentPane.setBackground(Color.white);
contentPane.setLayout(null);
container.add(contentPane);
frame.add(container);
frame.setContentPane(contentPane);
frame.setVisible(true);
}
public void drawGraph() {
nodeData = new ArrayList<NodeData>();
HashSet<Edge> edges = graph.getEdges();
HashSet<Node> nodes = graph.getNodes();
drawNodes(nodes);
drawEdges(edges);
repaint();
}
public void addEdge(String start, String end) {
graph.insertEdge(start, end);
drawGraph();
}
private void drawNodes(HashSet<Node> nodes) {
Iterator<Node> i = nodes.iterator();
while (i.hasNext()) {
drawNode(i.next());
}
}
private void drawEdges(HashSet<Edge> edges) {
Iterator<Edge> i = edges.iterator();
Edge tmpEdge;
while (i.hasNext()) {
tmpEdge = i.next();
drawEdge(tmpEdge);
}
}
private void drawEdge(Edge edge) {
Graphics g = contentPane.getGraphics();
NodeData predecessor = null;
NodeData successor = null;
for (int i=0; i<nodeData.size(); i++) {
if (nodeData.get(i).getNode().equals(edge.getPredecessor())) {
predecessor = nodeData.get(i);
}
if (nodeData.get(i).getNode().equals(edge.getSuccessor())) {
successor = nodeData.get(i);
}
}
g.drawLine(predecessor.getX() + 15, predecessor.getY() +15, successor.getX() + 15, successor.getY() + 15);
}
private void drawNode(Node node) {
Graphics g = contentPane.getGraphics();
g.setColor(Color.green); //Knoten
g.fillOval(currentX, currentY, 50, 50);
g.setColor(Color.black); //Beschriftung der Knoten
g.setFont(new Font("Serif",Font.BOLD,30));
g.drawString(new String(node.getValue()).toString(), currentX + 15, currentY + 36);
nodeData.add(new NodeData(node, currentX, currentY));
currentX += stepX; // muss geändert werden!
currentY += stepY;
}
private boolean isGraphNameOk(String name) {
if (name.length() > 2 || name.equals("")) {
return false;
}
else {
return true;
}
}
public void startAddEdgeView() {
AddEdgeView addEdgeView = new AddEdgeView(this);
addEdgeView.setVisible(true);
repaint();
}
public void paint(Graphics a) {
//drawGraph();
//repaint();
}
}
//Hier die Klassse NodeData:
package application.gui;
import objects.Node;
public class NodeData {
private Node node;
private int x;
private int y;
public NodeData(Node node, int x, int y) {
this.node = node;
this.x = x;
this.y = y;
}
public Node getNode() {
return node;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}