package org.jogamp.glg2d.util;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.Timer;
import org.jogamp.glg2d.GLG2DCanvas;
import org.junit.Assert;
@SuppressWarnings("serial")
public class TestWindow extends JFrame implements Tester {
public static final int SAME = 0;
public static final int DIFFERENT = 1;
private CustomPainter painter;
private volatile int result = -1;
public TestWindow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(640, 480);
setLocationRelativeTo(null);
initialize();
setVisible(true);
}
private void initialize() {
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
final JComponent java2d = new JPanel() {
@Override
public void paint(Graphics g) {
super.paint(g);
if (painter != null) {
painter.paint((Graphics2D) g, false);
}
}
};
final JComponent jogl = new JPanel() {
@Override
public void paint(Graphics g) {
super.paint(g);
if (painter != null) {
painter.paint((Graphics2D) g, true);
}
}
};
GLG2DCanvas canvas = new GLG2DCanvas(jogl);
canvas.setGLDrawing(true);
splitPane.setLeftComponent(canvas);
splitPane.setRightComponent(java2d);
splitPane.setResizeWeight(0.5);
JButton sameButton = new JButton("Same");
sameButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
result = SAME;
}
});
JButton differentButton = new JButton("Different");
differentButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
result = DIFFERENT;
}
});
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
buttonPanel.add(sameButton);
buttonPanel.add(differentButton);
setLayout(new BorderLayout());
add(splitPane, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
result = DIFFERENT;
System.exit(-1);
}
});
new Timer(20, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
}).start();
}
@Override
public void setPainter(final Painter painter) {
this.painter = new CustomPainter() {
@Override
public void paint(Graphics2D g2d, boolean jogl) {
painter.paint(g2d);
}
};
}
public void setPainter(CustomPainter painter) {
this.painter = painter;
}
@Override
public void finish() {
setVisible(false);
}
@Override
public void assertSame() throws InterruptedException {
int result = waitForInput();
Assert.assertEquals("User did not consider the two to be the same.", SAME, result);
}
public int waitForInput() throws InterruptedException {
result = -1;
while (result == -1) {
Thread.sleep(100);
}
int value = result;
result = -1;
return value;
}
}