import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.util.GregorianCalendar;
/**
*
Überschrift: Eventer</p>
*
*
Beschreibung: Datebankapplikation für Eventmanagement</p>
*
*
Copyright: Copyright (c) 2005</p>
*
*
Organisation: KSF Engineering</p>
*
* @author Christian Schmitz
* @version 0.2
*/
public class GUIPanelGraf extends JPanel {
private GUIEventProgrammController controller;
private GregorianCalendar calStart = new GregorianCalendar();
private GregorianCalendar calEnd = new GregorianCalendar();
Graphics2D g;
//Eckpunkte der Grafik
private int nOriginX = 0;
private int nOriginY = 0;
private int nSizeX = getSize().width;
private int nSizeY = getSize().height;
//Zeitlinie Startpunkt x
private int nStartTimeLineX;
private final int nFooterSizeY = 30;
private final int nTimeFieldMinimalSizeY = 30;
private EventProgramm[] aEventProgramm = null;
private int[] aRowGroups = null;
private double nTimeScreenFaktor;
public GUIPanelGraf(Event objEvent) {
this.calStart = objEvent.getEventDatumStart();
this.calEnd = objEvent.getEventDatumEnde();
this.aEventProgramm = objEvent.getEventProgramm();
//hier habe ich eine methode dem objekt event angefügt, welches warsch. nur einmal gebraucht wird.. -> sinnvoll???
this.aRowGroups = objEvent.getActsWithTermin();
//Size muss später noch angepasst werden (100 = dynamisch auf minimum!!)
if (aRowGroups == null){
this.setPreferredSize(new Dimension(this.getSize().width,nFooterSizeY + nTimeFieldMinimalSizeY));
} else {
this.setPreferredSize(new Dimension(this.getSize().width,nFooterSizeY + (nTimeFieldMinimalSizeY * aRowGroups.length)));
}
}
public void initialize(GUIEventProgrammController controller) {
this.controller = controller;
}
public void paint(Graphics ga) {
g = (Graphics2D) ga;
this.nOriginX = 0;
this.nOriginY = 0;
this.nSizeX = getSize().width;
this.nSizeY = getSize().height;
g.setColor(Color.blue);
g.drawRoundRect(nOriginX, nOriginY, nSizeX - 1, nSizeY - 1, 16, 16);
g.setColor(Color.black);
FontMetrics fm = g.getFontMetrics(g.getFont());
String s = "" + nSizeX + " x " + nSizeY + " Pixel";
g.drawString(s, (nSizeX - fm.stringWidth(s)) / 2, (nSizeY - fm
.getHeight())
/ 2 + fm.getAscent());
drawTimeLine();
drawTimeFields();
}
private void drawTimeLine() {
nStartTimeLineX = nOriginX + 10;
int nStartY = nSizeY - nFooterSizeY;
int nEndX = nSizeX - 10;
int nEndY = nStartY;
int nRasterHöhePrimär = nStartY - 10;
int nRasterTiefePrimär = 5;
int nRasterHöheSekundär = 3;
int nRasterTiefeSekundär = 5;
String sTimeLineTextStart = "Event Start";
String sTimeLineTextEnd = "Event Ende";
//Zeitlinie zeichnen
Line2D lTimeLine = new Line2D.Double(nStartTimeLineX, nStartY, nEndX, nEndY);
g.draw(lTimeLine);
//Zeitlinienbeschriftung unterhalb
g.setColor(Color.gray);
FontMetrics fm = g.getFontMetrics(g.getFont());
g.drawString(sTimeLineTextStart, nStartTimeLineX, nStartY + nRasterTiefePrimär + 2 + fm.getHeight());
g.drawString(sTimeLineTextEnd, nEndX - fm.stringWidth(sTimeLineTextEnd), nStartY + nRasterTiefePrimär + 2 + fm.getHeight());
//Raster setzten
int nTimeLineWidth = (int) (lTimeLine.getX2() - lTimeLine.getX1());
long nTimeLineRange = calEnd.getTimeInMillis() - calStart.getTimeInMillis();
nTimeScreenFaktor = (double)nTimeLineWidth / nTimeLineRange;
GregorianCalendar calTemp = new GregorianCalendar(calStart.get(GregorianCalendar.YEAR),calStart.get(GregorianCalendar.MONTH),calStart.get(GregorianCalendar.DAY_OF_MONTH),0,0,0);
//Raster zeichnen (Tagesgrenzen)
while (calEnd.after(calTemp)) {
calTemp.add(GregorianCalendar.DAY_OF_MONTH,1);
int nTempX = (int) ((calTemp.getTimeInMillis() - calStart.getTimeInMillis()) * nTimeScreenFaktor) + nStartTimeLineX;
g.draw(new Line2D.Double(nTempX, nStartY - nRasterHöhePrimär, nTempX, nEndY + nRasterTiefePrimär));
//Datum hinzufügen falls platz
if (nStartTimeLineX + fm.stringWidth(sTimeLineTextStart) < nTempX & nTempX + fm.stringWidth(calTemp.get(calTemp.DAY_OF_MONTH) + "." + (calTemp.get(calTemp.MONTH) + 1)) < nTimeLineWidth - fm.stringWidth(sTimeLineTextEnd)) {
g.drawString(calTemp.get(calTemp.DAY_OF_MONTH) + "." + (calTemp.get(calTemp.MONTH) + 1), nTempX, nStartY + nRasterTiefePrimär + 2 + fm.getHeight());
}
}
}
private void drawTimeFields() {
if (aRowGroups == null)
return;
int nTimeFieldSizeY = (nSizeY - nFooterSizeY - 10) / (aRowGroups.length + 1);
if (nTimeFieldSizeY < nTimeFieldMinimalSizeY)
nTimeFieldSizeY = nTimeFieldMinimalSizeY;
for (int i = 0; i < aRowGroups.length; i++) {
for (int j = 0; j < aEventProgramm.length; j++){
if (aRowGroups[i] == aEventProgramm[j].getActID()) {
System.out.println("zeichne: " + aEventProgramm[j].getEventProgrammText());
int nTempX1 = (int) ((aEventProgramm[j].getEventProgrammDatumStart().getTimeInMillis() - calStart.getTimeInMillis()) * nTimeScreenFaktor) + nStartTimeLineX;
int nTempX2 = (int) ((aEventProgramm[j].getEventProgrammDatumEnde().getTimeInMillis() - calStart.getTimeInMillis()) * nTimeScreenFaktor) + nStartTimeLineX;
Rectangle2D r = new Rectangle2D.Double(nTempX1,nOriginY+20+(i*nTimeFieldSizeY),nTempX2-nTempX1,nTimeFieldSizeY-10);
g.setPaint(Color.blue);
g.fill(r);
//JPanelTimeField p = new JPanelTimeField(nTempX1,nOriginY+20+(i*nTimeFieldSizeY),nTempX2-nTempX1,nTimeFieldSizeY-10);
//this.add(p);
//p.repaint();
//System.out.println("x: " + nTempX1 + "\ny: " + (nOriginY+20+(i*nTimeFieldSizeY)) + "\nxw: " + (nTempX2-nTempX1) + "\nyw: " + nTimeFieldSizeY);
}
}
}
}
}
class JPanelTimeField extends JPanel {
Graphics2D g;
public JPanelTimeField(int nX, int nY, int nXWidth, int nYHeight) {
this.setBounds(nX,nY,nXWidth,nYHeight);
}
public void paint(Graphics ga) {
g = (Graphics2D) ga;
Rectangle2D r = new Rectangle2D.Double(this.getX(),this.getY(),this.getSize().width,this.getSize().height);
System.out.println("x: " + this.getX() + "\ny: " + this.getY() + "\nxw: " + this.getSize().width + "\nyw: " + this.getSize().height);
g.setPaint(Color.WHITE);
g.fill(r);
g.setPaint(Color.GRAY);
g.drawRect(this.getX(),this.getY(),this.getSize().width,this.getSize().height);
}
}