package local.gui;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Iterator;
import javax.swing.JPanel;
import local.persistance.mapLoader.TileMap;
/**
*
* @author
* Daniel Lüers
*/
@SuppressWarnings("serial")
public class DrawPanel extends JPanel {
private boolean mouseEvent;
private boolean mapLoaded;
private int x;
private int y;
private Font wpOuterFont;
private Font wpInnerFont;
private Font cFont;
private Color wpInnerFontColor;
private Color wpOuterFontColor;
private Color waypointColor;
private Color connectionColor;
private TileMap tileMap;
private WPEditorController wpController;
public DrawPanel(final WPEditorController wpController){
this.wpController = wpController;
this.wpOuterFont = new Font("SansSerif", Font.BOLD, 15);
this.wpInnerFont = new Font("SansSerif", Font.TYPE1_FONT, 12);
this.cFont = new Font("SansSerif", Font.PLAIN, 9);
this.waypointColor = new Color(51,102,153);
this.connectionColor = new Color(51,102,153);
this.wpInnerFontColor = new Color(255, 255, 255);
this.wpOuterFontColor = new Color(0,0,0);
this.mouseEvent = false;
this.mapLoaded = false;
this.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent event){
x = event.getX();
y = event.getY();
mouseEvent = true;
wpController.doLogic(x, y);
}
});
this.addMouseMotionListener(new MouseMotionListener(){
public void mouseDragged(MouseEvent event) {
Waypoint selectedWaypoint = wpController.getWaypointByPosition(event.getX(), event.getY());
if(selectedWaypoint != null){
wpController.moveWaypoint(selectedWaypoint.getWaypointID(), event.getX(), event.getY());
}
}
public void mouseMoved(MouseEvent arg0) {}
});
}
public void updateUserInterface(){
Graphics g = getGraphics();
if (g != null)
redrawGraphics(g);
}
public void updateUserInterface(boolean clearScreen){
Graphics g = getGraphics();
if (g != null)
redrawGraphics(g, clearScreen);
}
public void paintComponent(Graphics g){
redrawGraphics(g);
}
private void redrawGraphics(Graphics g, boolean clearScreen){
Graphics2D g2 = (Graphics2D) g;
//Screen erneuern
g2.setColor(Color.gray);
g2.fillRect(0,0,getWidth(), getHeight());
}
private void redrawGraphics(Graphics g){
//initialize Antialiasing
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if(!mouseEvent){
//Screen erneuern
if(!mapLoaded){
g2.setColor(Color.gray);
g2.fillRect(0,0,getWidth(), getHeight());
}
//Map neu zeichnen
if(mapLoaded){
tileMap.draw(g2);
if(wpController.getShowWireFrame()){
createWireFrame(wpController.getDrawPanelDimension().width,
wpController.getDrawPanelDimension().height, wpController.getWireFramesize(), g2);
}
}
}
Iterator<Connection> cIter = wpController.getCList().values().iterator();
while(cIter.hasNext()){
Connection c = cIter.next();
g2.setColor(connectionColor);
g2.setStroke(new BasicStroke(4.0f));
g2.drawLine(c.getStartX(), c.getStartY(), c.getEndX(), c.getEndY());
int middleX = calculateMiddlePointX(c.getStartX(), c.getEndX());
int middleY = calculateMiddlePointY(c.getStartY(), c.getEndY());
g2.setColor(connectionColor);
g2.fillOval(middleX-5, middleY-15, 30, 40);
g2.setColor(Color.white);
g2.setFont(cFont);
g2.drawString(""+c.getConnectionID(), middleX+6, middleY);
g2.drawString(""+c.getWeight(), middleX+2, middleY+17);
}
Iterator<Waypoint> wIter = wpController.getWpList().values().iterator();
while(wIter.hasNext()){
Waypoint wp = wIter.next();
int xcoord = wp.getXPos();
int ycoord = wp.getYPos();
g2.setColor(waypointColor);
g2.setStroke(new BasicStroke(4.0f));
g2.fillOval(xcoord-25, ycoord-25, 50, 50);
if(wp.getWaypointID()<10){
g2.setFont(wpInnerFont);
g2.setColor(wpInnerFontColor);
g2.drawString(""+wp.getWaypointID(), xcoord-2, ycoord+5);
g2.setFont(wpOuterFont);
g2.setColor(wpOuterFontColor);
g2.drawString(wp.getName(), xcoord-30, ycoord-25);
} else {
g2.setFont(wpInnerFont);
g2.setColor(wpInnerFontColor);
g2.drawString(""+wp.getWaypointID(), xcoord-6, ycoord+5);
g2.setFont(wpOuterFont);
g2.setColor(wpOuterFontColor);
g2.drawString(wp.getName(), xcoord-30, ycoord-30);
}
}
mouseEvent = false;
}
public void createWireFrame(int width, int height, int size, Graphics2D g2){
//senkrechten linien zeichnen
for(int w=0; w<width; w+=size){
g2.drawLine(w, 0, w, height);
}
//horizontale Linien zeichnen
for(int h=0; h<height; h+=size){
g2.drawLine(0, h, width, h);
}
}
public int calculateMiddlePointX(int startX, int endX){
return (startX+endX)/2;
}
public int calculateMiddlePointY(int startY, int endY){
return (startY+endY)/2;
}
/*
* SETTER
*/
public void setTileMap(TileMap map){
this.tileMap = map;
}
public void setMapLoaded(boolean loaded){
this.mapLoaded = loaded;
}
}