package com.jogamp.opengl.test.junit.jogl.awt;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Rectangle;
import java.awt.ScrollPane;
import java.awt.Shape;
import java.io.IOException;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;
import com.jogamp.common.util.ReflectionUtil;
import com.jogamp.opengl.test.junit.jogl.demos.es2.GearsES2;
import com.jogamp.opengl.test.junit.util.MiscUtils;
import com.jogamp.opengl.test.junit.util.UITestCase;
import com.jogamp.opengl.util.Animator;
/**
* Documenting Bug 586
*
* <p>
* JScrollPane cannot mix hw/lw components, only if setting property '-Dsun.awt.disableMixing=true'.
* </p>
* <p>
* You can use ScrollPane, or maybe a slider and fwd the panning to the GLCanvas,
* which could change it's GL viewport accordingly.
* </p>
* See git commit '8df12ca151dfc577c90b485d4ebfe491b88e55aa'.
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestJScrollPaneMixHwLw01AWT extends UITestCase {
static long durationPerTest = 500;
static {
// too late: use at cmd-line '-Dsun.awt.disableMixing=true' works
// System.setProperty("sun.awt.disableMixing", "true");
}
/**
* Doesn't work either ..
*/
@SuppressWarnings("serial")
public static class TransparentJScrollPane extends JScrollPane {
public TransparentJScrollPane(final Component view) {
super(view);
setOpaque(false);
try {
ReflectionUtil.callStaticMethod(
"com.sun.awt.AWTUtilities", "setComponentMixingCutoutShape",
new Class<?>[] { Component.class, Shape.class },
new Object[] { this, new Rectangle() } ,
GraphicsConfiguration.class.getClassLoader());
System.err.println("com.sun.awt.AWTUtilities.setComponentMixingCutoutShape(..) passed");
} catch (final RuntimeException re) {
System.err.println("com.sun.awt.AWTUtilities.setComponentMixingCutoutShape(..) failed: "+re.getMessage());
}
}
@Override
public void setOpaque(final boolean isOpaque) {
}
}
protected void runTestGL(final GLCapabilities caps, final boolean useJScroll) throws InterruptedException {
final String typeS = useJScroll ? "LW" : "HW";
final JFrame frame = new JFrame("Mix Hw/Lw Swing - ScrollPane "+typeS);
Assert.assertNotNull(frame);
final Dimension f_sz = new Dimension(600,400);
final Dimension glc_sz = new Dimension(500,600);
final GLCanvas glCanvas = new GLCanvas(caps);
Assert.assertNotNull(glCanvas);
glCanvas.addGLEventListener(new GearsES2());
glCanvas.setPreferredSize(glc_sz);
final JPanel panel = new JPanel(new BorderLayout());
panel.setOpaque(false);
if(useJScroll) {
final JScrollPane scrollPane = new TransparentJScrollPane(glCanvas);
panel.add(scrollPane, BorderLayout.CENTER);
} else {
final ScrollPane scrollPane = new ScrollPane();
scrollPane.add(glCanvas);
panel.add(scrollPane, BorderLayout.CENTER);
}
final JTextArea textArea = new JTextArea();
textArea.setText("Test\nTest\nTest\nTest\n");
panel.add(textArea, BorderLayout.NORTH);
frame.add(panel);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
try {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
frame.setLocationRelativeTo(null);
frame.setTitle("GLCanvas in JScrollPane example");
frame.setSize(f_sz);
frame.setVisible(true);
}});
} catch (final Throwable t) {
t.printStackTrace();
Assume.assumeNoException(t);
}
final Animator animator = new Animator(glCanvas);
animator.start();
Thread.sleep(durationPerTest);
animator.stop();
try {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
frame.setVisible(false);
frame.dispose();
}});
} catch (final Throwable t) {
t.printStackTrace();
Assume.assumeNoException(t);
}
}
// @Test doesn't work
public void test01JScrollPane() throws InterruptedException {
final GLProfile glp = GLProfile.getGL2ES2();
final GLCapabilities caps = new GLCapabilities(glp);
runTestGL(caps, true);
}
@Test
public void test01ScrollPane() throws InterruptedException {
final GLProfile glp = GLProfile.getGL2ES2();
final GLCapabilities caps = new GLCapabilities(glp);
runTestGL(caps, false);
}
public static void main(final String args[]) throws IOException {
for(int i=0; i<args.length; i++) {
if(args[i].equals("-time")) {
durationPerTest = MiscUtils.atol(args[++i], durationPerTest);
}
}
/**
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.err.println("Press enter to continue");
System.err.println(stdin.readLine());
*/
System.out.println("durationPerTest: "+durationPerTest);
final String tstname = TestJScrollPaneMixHwLw01AWT.class.getName();
org.junit.runner.JUnitCore.main(tstname);
}
}