/**
* Copyright 2015 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of JogAmp Community.
*/
package com.jogamp.opengl.test.junit.jogl.acore;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Window;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import javax.swing.AbstractButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import org.junit.Assert;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import com.jogamp.common.os.Platform;
import com.jogamp.common.util.InterruptSource;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLCapabilitiesImmutable;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.test.junit.util.AWTRobotUtil;
import com.jogamp.opengl.test.junit.util.DumpGLInfo;
import com.jogamp.opengl.test.junit.util.GLClearColor;
import com.jogamp.opengl.test.junit.util.GLEventListenerCounter;
import com.jogamp.opengl.test.junit.util.UITestCase;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestBug1146GLContextDialogToolTipAWT extends UITestCase {
static final int NB_TEST = 5;
static final int ACTION_DELAY = 500;
static final int MOVE_DELAY = 2;
static final int MOVE_ITER = 100;
static final int TOOLTIP_WAIT = 3*1000; // 5s
static AbstractButton findButton(final int depth, final Container c, final String buttonText) {
AbstractButton res = null;
final int cc = c.getComponentCount();
for(int i=0; null==res && i<cc; i++) {
final Component e = c.getComponent(i);
// System.err.println("["+depth+"]["+i+"]: "+e.getClass().getSimpleName()+": "+e);
if( e instanceof AbstractButton ) {
final AbstractButton b = (AbstractButton) e;
final String bT = b.getText();
if( buttonText.equals(bT) ) {
res = b;
}
} else if( e instanceof Container ) {
res = findButton(depth+1, (Container)e, buttonText);
}
}
return res;
}
private void oneTest(final GLCapabilitiesImmutable caps) {
// base dialog
final JDialog dialog = new JDialog((Window) null);
dialog.setMinimumSize(new Dimension(500, 300));
dialog.setPreferredSize(new Dimension(500, 300));
dialog.setModal(false);
// build accessory
final GLEventListenerCounter glelc1 = new GLEventListenerCounter();
final GLCanvas canvas1 = new GLCanvas(caps);
canvas1.addGLEventListener(new DumpGLInfo(Platform.getNewline()+Platform.getNewline()+"Pre-ToolTip", false, false, false));
canvas1.addGLEventListener(new GLClearColor(1f, 0f, 0f, 1f));
canvas1.addGLEventListener(glelc1);
final JPanel panel1 = new JPanel(new BorderLayout());
panel1.add(canvas1, BorderLayout.CENTER);
panel1.setPreferredSize(new Dimension(300, 300));
final GLEventListenerCounter glelc2 = new GLEventListenerCounter();
final GLCanvas canvas2 = new GLCanvas(caps);
canvas2.addGLEventListener(new DumpGLInfo(Platform.getNewline()+Platform.getNewline()+"Post-ToolTip", false, false, false));
canvas2.addGLEventListener(new GLClearColor(0f, 0f, 1f, 1f));
canvas2.addGLEventListener(glelc2);
final JPanel panel2 = new JPanel(new BorderLayout());
panel2.add(canvas2, BorderLayout.CENTER);
panel2.setPreferredSize(new Dimension(300, 300));
// create file chooser with accessory
final JFileChooser fileChooser = new JFileChooser();
final String approveButtonText = "Approved";
fileChooser.setApproveButtonText(approveButtonText);
fileChooser.setApproveButtonToolTipText("Tool-Tip for Approved");
fileChooser.setAccessory(panel1);
final Locale l = fileChooser.getLocale();
final String cancelButtonText = UIManager.getString("FileChooser.cancelButtonText",l);
// launch robot action ..
new InterruptSource.Thread()
{
public void run()
{
try {
Assert.assertEquals(true, AWTRobotUtil.waitForVisible(fileChooser, true));
Assert.assertEquals(true, AWTRobotUtil.waitForRealized(canvas1, true));
final Point approveButtonPos;
final AbstractButton approveButton = findButton(0, fileChooser, approveButtonText);
if( null != approveButton ) {
approveButtonPos = approveButton.getLocationOnScreen();
final Dimension approveButtonSize = approveButton.getSize();
approveButtonPos.translate(approveButtonSize.width/2, approveButtonSize.height/2);
System.err.println("OK Button: "+approveButton.getClass().getSimpleName()+"; "+approveButton+", "+approveButtonPos);
} else {
System.err.println("OK Button: NULL");
approveButtonPos = null;
}
final Point cancelButtonPos;
final AbstractButton cancelButton = findButton(0, fileChooser, cancelButtonText);
if( null != approveButton ) {
cancelButtonPos = cancelButton.getLocationOnScreen();
final Dimension cancelButtonSize = cancelButton.getSize();
cancelButtonPos.translate(cancelButtonSize.width/2, cancelButtonSize.height/2);
System.err.println("CANCEL Button: "+cancelButton.getClass().getSimpleName()+"; "+cancelButton+", "+cancelButtonPos);
} else {
cancelButtonPos = null;
System.err.println("CANCEL Button: NULL");
}
final Robot robot = new Robot();
// hover to 'approve' -> tool tip
if( null != approveButtonPos ) {
AWTRobotUtil.mouseMove(robot, approveButtonPos, MOVE_ITER, MOVE_DELAY);
java.lang.Thread.sleep(TOOLTIP_WAIT);
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
fileChooser.setAccessory(panel2);
fileChooser.validate();
} } ) ;
} catch (final InterruptedException e) {
e.printStackTrace();
} catch (final InvocationTargetException e) {
e.printStackTrace();
}
Assert.assertEquals(true, AWTRobotUtil.waitForRealized(canvas2, true));
}
if( null != cancelButtonPos ) {
AWTRobotUtil.mouseClick(robot, cancelButtonPos, MOVE_ITER, MOVE_DELAY, ACTION_DELAY);
} else {
// oops ..
fileChooser.cancelSelection();
}
} catch (final AWTException e1) {
e1.printStackTrace();
} catch (final InterruptedException e2) {
e2.printStackTrace();
}
}
}.start();
// show file chooser dialog
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
dialog.setVisible(true);
fileChooser.showOpenDialog(dialog);
} } ) ;
} catch (final InterruptedException e) {
e.printStackTrace();
} catch (final InvocationTargetException e) {
e.printStackTrace();
}
// dispose of resources
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
canvas1.destroy();
canvas2.destroy();
dialog.setVisible(false);
dialog.dispose();
} } ) ;
} catch (final InterruptedException e) {
e.printStackTrace();
} catch (final InvocationTargetException e) {
e.printStackTrace();
}
Assert.assertEquals(1, glelc1.initCount);
Assert.assertEquals(1, glelc2.initCount);
}
@Test(timeout=180000) // TO 3 min
public void test01() {
final GLCapabilities caps = new GLCapabilities(GLProfile.getDefault());
for (int i = 0; i < NB_TEST; i++) {
System.out.println("Iteration " + i + " / " + NB_TEST);
oneTest(caps);
}
}
public static void main(final String[] pArgs)
{
org.junit.runner.JUnitCore.main(TestBug1146GLContextDialogToolTipAWT.class.getName());
}
}