/*
 * Demonstration of a bug in JOGL2 (rc11)
 * running under Java 1.7.0_21 on Mac OS X 10.8.3
 * 
 * Description:
 * 
 * When using a CardLayout LayoutManager to switch between a
 * swing component and a GLCanvas, once the GLCanvas has been
 * displayed it remains visible after being switched out.
 * 
 * Edge artifacts of the red square while resizing the frame
 * when switched out shows that the GLCanvas bitmap is being
 * rescaled and redrawn rather than it's display method
 * being invoked.
 * 
 * This was not a problem with JOGL 1.1.1.
 */

package jogl2_cardlayout_test;

import java.awt.*;
import java.awt.event.ActionEvent;

import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.*;

class Listener implements GLEventListener {
	public void init(final GLAutoDrawable drawable) {
		final GL2 gl2 = drawable.getGL().getGL2();
		
		gl2.glClearColor(1, 1, 1, 1);
		
		gl2.glColor3f(1, 0, 0);
		
		gl2.glRotatef(5, 0, 0, 1);
		
		gl2.glScalef(0.5f, 0.5f, 0.5f);
	}

	public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {
	}
	
	public void display(final GLAutoDrawable drawable) {
		final GL2 gl2 = drawable.getGL().getGL2();
		
		gl2.glClear(GL2.GL_COLOR_BUFFER_BIT);

		gl2.glBegin(GL2.GL_POLYGON);
		gl2.glVertex2i(-1, -1);
		gl2.glVertex2i(1, -1);
		gl2.glVertex2i(1, 1);
		gl2.glVertex2i(-1, 1);
		gl2.glEnd();
	}

	public void dispose(final GLAutoDrawable drawable) {
	}
}

class CardLayoutPanel extends JPanel {
	private final CardLayout cardLayout;
	
	private final String[] cardTitles;
	
	private int cardIndex;
	
	final String cardTitle() {
		return cardTitles[cardIndex];
	}
	
	final void nextCard() {
		cardIndex = (cardIndex + 1) % cardTitles.length;
		cardLayout.show(this, cardTitles[cardIndex]);
	}
	
	CardLayoutPanel() {
		final Listener listener = new Listener();
		
		final GLCanvas canvas = new GLCanvas();
		
		canvas.addGLEventListener(listener);
		
		cardLayout = new CardLayout();
		
		setLayout(cardLayout);
		
		cardTitles = new String[] {
			"Label",
			"Canvas"
		};
		
		add(new JLabel("Label Card", SwingConstants.CENTER), cardTitles[0]);
		
		add(canvas, cardTitles[1]);
		
		setPreferredSize(new Dimension(400, 400));
	}
}

class BorderLayoutPanel extends JPanel {
	private final JLabel cardLabel;
	
	BorderLayoutPanel() {
		super(new BorderLayout());
		
		final CardLayoutPanel cardLayoutPanel = new CardLayoutPanel();
		
		cardLabel = new JLabel(cardLayoutPanel.cardTitle(), SwingConstants.CENTER);
		
		final JButton cardButton = new JButton(new AbstractAction("Next Card") {
			@Override
			public final void actionPerformed(final ActionEvent event) {
				cardLayoutPanel.nextCard();
				cardLabel.setText(cardLayoutPanel.cardTitle());
			}
		});
		
		add(cardLabel, BorderLayout.NORTH);
		add(cardLayoutPanel, BorderLayout.CENTER);
		add(cardButton, BorderLayout.SOUTH);
	}
}

public class JOGL2_CardLayout_Test {
	public static void main(String[] args) {
		final JFrame frame = new JFrame();
		
		frame.getContentPane().add(new BorderLayoutPanel());

		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				frame.pack();
				frame.setVisible(true);
			}
		});
	}
}
