package ddddbb.gui;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.HierarchyBoundsListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import ddddbb.game.Level;
import ddddbb.game.Scene4d;
import ddddbb.game.Settings;
import ddddbb.gen.AChangeListener;
import ddddbb.gen.MyChangeListener;
import ddddbb.math.D2Graphics;
import ddddbb.math.D3Graphics;
import ddddbb.math.D4Graphics;
import ddddbb.math.Point4d;
@SuppressWarnings("serial")
public class ViewScreen extends JPanel implements MyChangeListener, ItemListener {
protected int x0,y0,width=0,height=0;
protected BufferedImage buffImg;
protected Color bColor = Color.BLACK;
protected Composite composite;
Graphics2D g;
D2Graphics g2;
D3Graphics g3;
D4Graphics g4;
private final Level scene;
private final Settings ss;
private final Scene4d goalScene;
public ViewScreen(
final Settings _ss,
final Level _scene,
final Scene4d _goalScene
) {
scene = _scene;
ss = _ss;
goalScene = _goalScene;
scene.addChangeListener(this);
//ss.xdpcm.addChangeListener(this);
//ss.ydpcm.addChangeListener(this);
ss.drawTetrahedral.addChangeListener(this);
//Opt.drawTrihedral.addChangeListener(this);
new AChangeListener() {
public void stateChanged() {
updateAlias();
repaint();
}}.addTo(ss.antiAliased);
new AChangeListener() {
public void stateChanged() {
if (g3==null) { return; }
g3.setBrightness(ss.brightness.getDouble());
repaint();
}}.addTo(ss.brightness);
new AChangeListener() {
public void stateChanged() {
if (g3==null) { return; }
g3 = ss.viewType.sel().getD3Graphics(g2,scene.camera3d);
g4.setGraphics(g3);
repaint();
}}.addTo(ss.viewType);
// setPreferredSize(new Dimension(
// (int)(10.0*Opt.xcm.getDouble()),
// (int)(10.0*Opt.ycm.getDouble()))); // 10x10cm
MouseControl mouseControl = new MouseControl(ss,scene);
addMouseMotionListener(mouseControl);
addMouseListener(mouseControl);
addHierarchyBoundsListener(new HierarchyBoundsListener() {
public void ancestorMoved(HierarchyEvent e) {
}
public void ancestorResized(HierarchyEvent e) {
updateGraphics();
}
});
// addFocusListener(new FocusListener() {
// public void focusGained(FocusEvent e) {
// System.out.println("ViewScreen gained focus");
// }
//
// public void focusLost(FocusEvent e) {
// System.out.println("ViewScreen lost focus");
// }});
}
public synchronized void updateGraphics() {
Dimension size = getSize();
width = size.width;
height = size.height;
if ( width > 0 & height > 0 ) {
x0 = width/2;
y0 = height/2;
// buffImg = (BufferedImage)createImage(width,height);
buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
g = buffImg.createGraphics();
g.setBackground(bColor);
g.setTransform(new AffineTransform());
g.translate(x0,y0);
if ( g2 == null ) {
g2 = new D2Graphics(g,ss.xdpcm.getDouble(),ss.ydpcm.getDouble());
g3 = ss.viewType.sel().getD3Graphics(g2,scene.camera3d);
g4 = new D4Graphics(g3,ss.perspective);
}
else {
g2.setGraphics(g);
g3.setGraphics(g2);
g4.setGraphics(g3);
}
updateAlias();
g3.setBrightness(ss.brightness.getDouble());
}
}
protected void updateAlias() {
if (g==null) { return; }
if (ss.antiAliased.isSelected()) {
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON
);
}
else {
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_OFF
);
}
}
/** double buffered paint */
public void paint(Graphics g0) {
if ( g == null ) { updateGraphics(); }
g.clearRect(-width/2,-height/2,width,height);
if (ss.drawTetrahedral.isSelected()) {
g4.drawTetrahedral();
}
// if (Opt.drawTrihedral.isSelected()) {
// g3.drawTrihedral();
// }
if (ss.showGoal.isSelected()) {
goalScene.paint(g3);
}
else {
scene.paint(g3);
for (int i=0;i<scene.compounds.size();i++) {
Point4d p = (Point4d)scene.compounds.get(i).center();
if (i==scene.compounds.selInt()) {
g4.drawMark(p,0.1);
}
else {
g4.drawString(i+1+"", p);
}
}
}
((Graphics2D)g0).drawImage(buffImg, null, 0, 0);
super.paintChildren(g0);
// super.p
}
// public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
// if (pageIndex > 0) { return Printable.NO_SUCH_PAGE; }
// Color backGround = g.getBackground();
// Color lColor = g3.lColor;
// Color rColor = g3.rColor;
// g.setBackground(Color.WHITE);
// if ( g3 instanceof BarEyeGraphics ) {
// g3.lColor = Color.BLACK;
// g3.rColor = Color.BLACK;
// }
// paint(graphics);
// g3.lColor = lColor;
// g3.rColor = rColor;
// g.setBackground(backGround);
// return Printable.PAGE_EXISTS;
// }
public void stateChanged() {
repaint();
}
public void itemStateChanged(ItemEvent e) {
repaint();
}
}